DIR : /home/kozerus/public_html/ko0.php

/home/kozerus/public_html

<?php
/**
	ko.php		v0.94	20230220_1600 contacts leds
	ko.php		v0.94	20230219_1414 leds_flds leds_vals


	ko.php		v0.94	20230217_0300 ?lists=items contacts letter leds monkeytraps turtleposts floods coffee()
	ko.php		v0.93	20230128_2033 gd txt2imgs()
	ko.php		v0.93	20230128_2033 gd txt2img()
	ko.php		v0.93	20230127_0127 sophia renee=imgs 
	ko.php		v0.93	20230126_1430 todo=imgs 
	ko.php		v0.92	20221129_0030 22316 
	ko.php		v0.92	20221121_1630 22305 stripe syntax error
	ko.php		v0.92	20221112_1500 pt btc btctxt eth ethtxt
	ko.php		v0.91	20221031_2200 shopify
	ko.php		v0.91	20221031_2100 bitcoin
	ko.php		v0.91	20221031_1830 stripe spotify squareup

	ko.php		v0.90	20221030_0730 sql3 ko_coffeeshop rm vm li dr dm gp js wm zh
	ko.php		v0.90	20221030_0730 sql3 ko_coffeeshop rm vm li dr dm gp js wm zh
	ko.php		v0.90	20221020_0130 ko_coffeeshop htmtbls main coffee media smedia contacts 
	ko.php		v0.90	20221019_2100 ko_coffeeshop add gab tr
	ko.php		v0.90	/ko.php?todo=sql3_ko_coffeeshop
	ko.php		v0.90	/ko.php?todo=sql3_ko_coffeeshop
	ko.php		v0.90	/ko.php?todo=cat_ko_coffeeshop_psv
	ko.php		v0.90	/ko.php?todo=cat_ko_coffeeshop_csv
	ko.php		v0.90	/ko.php?todo=ko_coffeeshop_sql3
	ko.php		v0.90	/ko.php?todo=ko_coffeeshop_psv
	ko.php		v0.90	/ko.php?todo=ko_coffeeshop_csv

	ko.php		v0.80	20210124_0630	todos=ko_coffeeshop
	ko.php		v0.80	20210124_0630	todos=ko_media ko_coffee 
	ko.php		v0.80	20210124_0630	todos=jsons txts
	ko.php		v0.80	20211208_1700	<link href="favicon_ko64.ico"
	ko.php		v0.80	20211208_1530	todo=ko
	ko.php		v0.80	20211207_1530	todo=todi&fmt=json
	ko.php		v0.80	20211203_1730	todo=kogo	
	ko.php		v0.80	20211202_1200	
	ko.php		v0.75	202111130_0845	debug file=<h1 target=_blank> 
	ko.php		v0.75	202111119_1400	s/findid/todo
	ko.php		v0.75	202111119_1400	findid fbd_filter
	ko.php		v0.75	202111118_2300	?findid=
	ko.php		v0.75	202111118_2300	?ls=
	ko.php		v0.75	202111118_1730	?find= new parsing
	ko.php		v0.74	202111117_1730	ls
	ko.php		v0.72	20211109_1930	jqgrid
	ko.php		v0.72	kolog
	ko.php		v0.71	$htmout=read_htmlfile($htmlfile);
	ko.php		v0.70	bookmarksusb

	ko.php		v0.66	0.66_20200429_2200 dirlist 
	ko.php		v0.65	0.64_20200225_1212 
	ka1.php		v0.64	0.64_20180708_0000 json chat
	ka1.php		v0.64	0.64_20180704_0000

	ka1.php		v0.64	0.64_20121210_0500 leds_dragdrop
	ka1.php		v0.64	0.64_20121207_1500 ko_ajax
	ka1.php		v0.64	0.64_20121207_1500 ko_dragdrop
	ka1.php		v0.64	0.64_20121207_1500 ko_im
	ka1.php		v0.64	0.64_20121202_0930 reports/rpts img if cab cab1 cab2 item 
	ka1.php		v0.64	0.64_20121202_0930 leds/set/ledcode/r b g 0 1 5 9/cab1 cab2 cab/id
	ka1.php		v0.64	0.64_20121202_0930 ip_dttm reqform
	ka1.php		v0.63	0.63_20121202_0330 reports/sql 
	ka1.php		v0.62	0.61_20121202_2300 reports/sql 
	ka1.php		v0.61	0.61_20121109_0315 defrag/report
	ka1.php		v0.60	0.60_20121027_2015 passthru()
	ka1.php		v0.59	0.59_20121027_2015 hostos win logic
	ka1.php		v0.57	0.56_20120927_1145 gui mods/allow
	ka1.php		v0.57	0.56_20120927_1145 gui mods/allow
	ka1.php		v0.56	0.56_20120926_1000 (datacall) 
	ka1.php		v0.55	0.55_20120918_1100 ka1_hosts.db3 (datacall)
	ka1.php		v0.54	0.53_20120918_1100 ka1_cons.db3
	ka1.php		v0.53	0.53_20120829_1015 new /pat url
	ka1.php		v0.53	0.53_20120829_1015 /nap
	ka1.php		v0.52	0.52_20120829_1015 ?q=kb/rpts/rpt_id&fmt=xml &fmt=csv
	ka1.php		v0.51	0.51_20120828_1410 rptsxml
	ka1.php		v0.50	0.50_20120828_1145 jqgrid-4.4.0
	ka1.php		v0.49	0.49_20120824_1130 errtxt, fixtxt to files and fmt4search
	ka1.php		v0.48	0.48_20120824_1000 ka1.db3 nodes tables & reports
	ka1.php		v0.47	0.47_20120823_1340 ka1_certs
	ka1.php		v0.46	0.46_20120823_1000 kb upload size increase
	ka1.php		v0.45	0.45_20120822_1330 ka1d rpts view grids
	ka1.php		v0.44	0.44_20120822_1130 mod views
	ka1.php		v0.43	0.43_20120817_1000 mod views
	ka1.php		v0.42	0.42_20120816_1400 now logins for led tweets
	ka1.php		v0.41	0.40_20120816_1230 ?q=certs/rpts 
	ka1.php		v0.40	0.40_20120816_1030 ?q=kb/rpts 
	ka1.php		v0.39	0.39_20120814_1330 ?ka1 ka1e mn page org
	ka1.php		v0.38	0.38_20120813_0940 ?q=kb/view kb/mod  dbgrid links for kb certs
	ka1.php		v0.37	0.37_20120809_1511 links reorg + certs
	ka1.php		v0.36	0.33_20120809_1511 ?q=kb 
	ka1.php		v0.35	0.33_20120809_1150 itil to links
	ka1.php		v0.35	0.33_20120808_1305 ka1_certs.dbe
	ka1.php		v0.34	0.33_20120803_1200 dyn pchart example link & debug
	ka1.php		v0.33	0.33_20120801_1000 pchart link
	ka1.php		v0.32	0.32_20120730_0945 pdo_cr_kb, pdo_cr_flds, new/add mod/upd view
	ka1.php		v0.31	0.31_20120730_0945 pdo_cr_kb, pdo_cr_flds
	ka1.php		v0.30	0.30_20120727_1300 pdo_cr_kb
	ka1.php		v0.29	0.29_20120727_1100 newpass1 newpass2
	ka1.php		v0.28	0.28_20120727_1000 user=hosts.allow[2]
	ka1.php		v0.27		q=sql/cr/kb
	ka1.php		v0.26		newpass1 newpass2
	ka1.php		v0.25				user info from hosts.allow
	ka1.php		v0.24	 0.22_20120720_1201 if(( isset($_SESSION['role'] )) && ( ! $_SESSION['role'] == "" )) {
	ka1.php		v0.23	 0.22_20120720_1201 es/hs,vg,bp/ ... 
	ka1.php		v0.22	 0.22_20120720_1200 es/us/koSYS_us.php ka1/us/koSYS_us.php 
	ka1.php		v0.21	 0.21_20120627_1130 rename scrub update to scrub
	ka1.php		v0.20    0.19_20120619_1630 korhe_us.db3 
	ka1.php		v0.19    0.19_20120619_1000 koaix_us.db3 
	ka1.php		v0.18    0.18_20120618_1140 add kb, bp tables 
	ka1.php		v0.17    0.17_20120608_1140 add kb, bp tables 
	ka1.php		v0.16    0.16_20120605_0920 add ka1 tables 
	ka1.php		v0.15    0.15_20120601_0920 add hs tables
	ka1.php		v0.14    0.14_20120531_1330 add grid tables users us
	ka1.php		v0.13    0.13_20120531_1320 $files=getfilka1( $path, $mask );
	ka1.php		v0.12    0.12_20120531_1038 gunzip scrubfile accomodation
	ka1.php		v0.11    0.11_20120531_1030 add serena link
	ka1.php		v0.10    0.10_20120516_1400 refresh to kohpx_vg.php kohpx_us.php kohpx_sw.php
	ka1.php		v0.09    0.05_20120425_1011 db3 grid from /home/ko/vg/kohpx_vg.db3 /var/www/html/ka1/db3
	ka1.php		v0.08    0.05_20120313_1311 q=links
	ka1.php		v0.08    0.05_20120313_1311 sw reports pending
	ka1.php		v0.07    0.05_20120313_1311 btn_footers
	ka1.php		v0.06    0.05_20120313_1311 q=scrub consolodate upload exampls
	ka1.php		v0.05    0.04_20120216_1530 ko_upload scrub2 ...:
	ka1.php		v0.04    0.04_20120216_1530 ko_upload scrub ...:
	ka1.php		v0.03    0.03_20120207_1400
	ka1.php		v0.02    0.02_20120207 
	ka1.php		v0.01    0.01_20120205 
 */

$whitespace = ' \t\n\r\v\f';
$ascii_lowercase = 'abcdefghijklmnopqrstuvwxyz';
$ascii_uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$ascii_letters = $ascii_lowercase . $ascii_uppercase;
$digits = '0123456789';
$hexdigits = $digits . 'abcdef' . 'ABCDEF';
$octdigits = '01234567';
# $punctuation = '!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~';
$punctuation = "!\"#$%&'()*+,-./:;<=>?@[\]^_`{|}~";
$printable = $digits . $ascii_letters . $punctuation . $whitespace;

# print( "MSG_100 whitespace=$whitespace<br>\n");
# print( "MSG_100 ascii_lowercase=$ascii_lowercase<br>\n");
# print( "MSG_100 ascii_uppercase=$ascii_uppercase<br>\n");
# print( "MSG_100 ascii_letters=$ascii_letters<br>\n");
# print( "MSG_100 digits=$digits<br>\n");
# print( "MSG_100 hexdigits=$hexdigits<br>\n");
# print( "MSG_100 octdigits=$octdigits<br>\n");
# print( "MSG_100 punctuation=$punctuation<br>\n");
# print( "MSG_100 printable=$printable<br>\n");
# print( "MSG_100 &copy &trade &reg &amp &quot &apos  <br>\n");
# print( "MSG_101 asterisk &#42<br>\n");
# print( "MSG_102 percent &#37<br>\n");
# print( "MSG_103 left curly_brace &#123 &#125<br>\n");
# print( "MSG_104 square_bracket &#91 &#93<br>\n");
# print( "MSG_105 parenthesis &#40 &#41<br>\n");
# print( "MSG_106 ltgt &lt &gt  &#40 &#41<br>\n");
# # preg_replace();
# $stringWithoutNonLetterCharacters = preg_replace("/[\/\&%#\$]/", "_", $yourString);
# $stringWithQuotesReplacedWithSpaces = preg_replace("/[\"\']/", " ", $stringWithoutNonLetterCharacters);
#  $res = str_replace( array( '\'', '"', ',' , ';', '<', '>' ), ' ', $str);

// https://generatedata.com
// https://news.json-generate.com

//	$fileSize = $_FILES['myFile']['size'];
//	$tmpFile = $_FILES['myFile']['tmp_name'];
//	$fileName = $_FILES['myFile']['name'];
//	$contentType = $_FILES['myFile']['type'];
//	$user = $_GET['user'];

/*
// .jpg image/jpeg`
// .gif image/gif
// .png image/png
// .wbmp image/vnd.wap.wbmp
// .txt text/plain
*/
#	if( !empty($_REQUEST['a'])) { $a=$_REQUEST['a']; } 
#	<script>location.href='https://www.attacker.com'</script>
# 	$username = trim(htmlspecialchars($_POST['username']));
#	$email = trim(htmlspecialchars($_POST['email']));
#	$email = filter_var($email, FILTER_VALIDATE_EMAIL );
#	$number = filter_var($number, FILTER_VALIDATE_INT );
#	$number = filter_var($number, FILTER_VALIDATE_FLOAT );
#	if (!filter_var($ip, FILTER_VALIDATE_IP) === false) { echo("MSG_100 VALID ip=$ip"); }

#	Input::$error = false;
#	Input::check(['email', 'password'], $_REQUEST);
# validate an integer
#	$number = Input::int($_POST['number']);
# validate a string
#	$name = Input::str($_POST['name']);
# convert to boolean
#	$bool = Input::bool($_POST['boolean']);
# validate an email
#	$email = Input::email($_POST['email']);
# validate a URL
#	$url = Input::url($_POST['url']);

#
#	$website = input($_POST["site"]);
#	if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) { $websiteErr = "Invalid URL"; }

include( '../safer/ko_startup.php' );
#	$server="localhost"; $dbname="dgs"; $user="dgsmstr"; $pass="=dgsmstr=

	$http_host="ko2.us";
	if( isset( $_SERVER['HTTP_HOST'] )) { $http_host = $_SERVER['HTTP_HOST']; }
	$server=kocfg($http_host,'server');
	$dbname=kocfg($http_host,'dbname');
	$tbl=kocfg($http_host,'tbl');
	$sql=kocfg($http_host,'sql');
	$user=kocfg($http_host,'user');
	$pass=kocfg($http_host,'pass');

	
	$db2=db2conn($server,$dbname,$user,$pass );
	$progid="ko"; $db2id="ko";
	if ($db2 ) {
#		print( "MSG_172 DB2CONN_DONE http_host=$http_host progid=$progid server=$server dbname=$dbname user=$user");
#		print( "MSG_172 DB2CONN_DONE http_host=$http_host progid=$progid db2id=$db2id");
		}
	else {
#		$dbname_short=explode("_",$dbname)[1];
#		print( "ERR_173 DB2CONN_FAIL http_host=$http_host progid=$progid server=$server dbname=$dbname user=$user");
#		print( "ERR_173 DB2CONN_FAIL http_host=$http_host progid=$progid server=$server dbname=$dbname");
#		print( "ERR_173 DB2CONN_FAIL http_host=$http_host progid=$progid db2id=$db2id");
#		print( "ERR_173 DB2CONN_FAIL http_host=$http_host progid=$progid server=$server dbname=$dbname_short" );
		}


	$a=""; if( isset( $_REQUEST['a'])) { $a=trim(htmlspecialchars($_REQUEST['a'])); }
	$a=""; if( isset( $_REQUEST['a'])) { $a=trim(htmlspecialchars($_REQUEST['a'])); }
	$b=""; if( isset( $_REQUEST['b'])) { $b=trim(htmlspecialchars($_REQUEST['b'])); }
	$c=""; if( isset( $_REQUEST['c'])) { $c=trim(htmlspecialchars($_REQUEST['c'])); }
	$d=""; if( isset( $_REQUEST['d'])) { $d=trim(htmlspecialchars($_REQUEST['d'])); }
	$e=""; if( isset( $_REQUEST['e'])) { $e=trim(htmlspecialchars($_REQUEST['e'])); }
	$f=""; if( isset( $_REQUEST['f'])) { $f=trim(htmlspecialchars($_REQUEST['f'])); }
	$g=""; if( isset( $_REQUEST['g'])) { $g=trim(htmlspecialchars($_REQUEST['g'])); }
	$h=""; if( isset( $_REQUEST['h'])) { $h=trim(htmlspecialchars($_REQUEST['h'])); }
	$i=""; if( isset( $_REQUEST['i'])) { $i=trim(htmlspecialchars($_REQUEST['i'])); }
	$j=""; if( isset( $_REQUEST['j'])) { $j=trim(htmlspecialchars($_REQUEST['j'])); }
	$k=""; if( isset( $_REQUEST['k'])) { $k=trim(htmlspecialchars($_REQUEST['k'])); }
	$l=""; if( isset( $_REQUEST['l'])) { $l=trim(htmlspecialchars($_REQUEST['l'])); }
	$m=""; if( isset( $_REQUEST['m'])) { $m=trim(htmlspecialchars($_REQUEST['m'])); }
	$n=""; if( isset( $_REQUEST['n'])) { $n=trim(htmlspecialchars($_REQUEST['n'])); }
	$o=""; if( isset( $_REQUEST['o'])) { $o=trim(htmlspecialchars($_REQUEST['o'])); }
	$p=""; if( isset( $_REQUEST['p'])) { $p=trim(htmlspecialchars($_REQUEST['p'])); }
	$q=""; if( isset( $_REQUEST['q'])) { $q=trim(htmlspecialchars($_REQUEST['q'])); }
	$r=""; if( isset( $_REQUEST['r'])) { $r=trim(htmlspecialchars($_REQUEST['r'])); }
	$s=""; if( isset( $_REQUEST['s'])) { $s=trim(htmlspecialchars($_REQUEST['s'])); }
	$t=""; if( isset( $_REQUEST['t'])) { $t=trim(htmlspecialchars($_REQUEST['t'])); }
	$u=""; if( isset( $_REQUEST['u'])) { $u=trim(htmlspecialchars($_REQUEST['u'])); }
	$v=""; if( isset( $_REQUEST['v'])) { $v=trim(htmlspecialchars($_REQUEST['v'])); }
	$w=""; if( isset( $_REQUEST['w'])) { $w=trim(htmlspecialchars($_REQUEST['w'])); }
	$x=""; if( isset( $_REQUEST['x'])) { $x=trim(htmlspecialchars($_REQUEST['x'])); }
	$y=""; if( isset( $_REQUEST['y'])) { $y=trim(htmlspecialchars($_REQUEST['y'])); }
	$z=""; if( isset( $_REQUEST['z'])) { $z=trim(htmlspecialchars($_REQUEST['z'])); }
	$db3=""; if( isset( $_REQUEST['db3'])) { $db3=trim(htmlspecialchars($_REQUEST['db3'])); }
	$tbl=""; if( isset( $_REQUEST['tbl'])) { $tbl=trim(htmlspecialchars($_REQUEST['tbl'])); }
	$sel=""; if( isset( $_REQUEST['sel'])) { $sel=trim(htmlspecialchars($_REQUEST['sel'])); }
	$fld=""; if( isset( $_REQUEST['fld'])) { $fld=trim(htmlspecialchars($_REQUEST['fld'])); }
	$val=""; if( isset( $_REQUEST['val'])) { $val=trim(htmlspecialchars($_REQUEST['val'])); }
	$fmt=""; if( isset( $_REQUEST['fmt'])) { $fmt=trim(htmlspecialchars($_REQUEST['fmt'])); }
	$lim=""; if( isset( $_REQUEST['lim'])) { $lim=trim(htmlspecialchars($_REQUEST['lim'])); }
	$matches="";
	$matches2="";



	main();


function main() {
#	phpinfo();
$progid="ko";
$dttm=date('Ymd_His');


#	$img="/fb/pages/zn/zn_1.jpg";
#	$img="/fb/byrdbellvjk/pages/zn/zn_1.jpg";
#	$dr=$_SERVER['DOCUMENT_ROOT'];
#	$drimg = $dr.$img;
#	$htmout="";
#	$w=100; $h=150;
#	$tn=img2tn($drimg,$w,$h);
#	$htmout .= "img=$img<br>\n";
#	$htmout .= "drimg=$drimg<br>\n";
#	$htmout .= "<a href=$img target=_blank>";
#	$htmout .= "	<img src=$img height=$h border=0>";
#	$htmout .= "	</a>\n";
#	print( $htmout );
#	exit;

#	if( isset($_REQUEST['kups'])) {
#		$kups=$_REQUEST['kups'];
#		$htmout = kups($kups);
#		printf( $htmout );
#		exit;
#		}

	if( isset($_REQUEST['plupload'])) {
//		printf( "BUGS_305 PLUPLOAD<br>\n" );
		$args="args";
		$htmout=plupload($args);
		printf( $htmout );
		exit;
		}

	if( isset($_REQUEST['contacts'])) {
		$htmout="";
		$htmout=contacts('');
#		printf($htmout);
		exit;
		}

	if( isset($_REQUEST['kov'])) {
		$htmout="";
		$htmout=kov('');
#		printf($htmout);
		exit;
		}

	if( isset($_REQUEST['leds'])) {
		$htmout=leds('');
		printf( $htmout );
		exit;
		}

	if( isset($_REQUEST['lists'])) {
		$file=""; $dr=""; $j=0; $k=0; $htmout=""; $db3="ko.db3"; $tbl="items";
		$lists=$_REQUEST['lists'];
		$tbl=$lists;
		if($_SERVER['DOCUMENT_ROOT']) { $dr=$_SERVER['DOCUMENT_ROOT']; }
		$drfile="$dr$file";
		$drdb3="$dr$db3";

		if( isset($_REQUEST['db3'])) {
			$htmout=""; $j=0; $k=0;
			$db3=$_REQUEST['db3'];
			$db3fil="$dr/$db3";
			$sql="select * from $tbl";
			$fld="";
			if( ! is_file($db3fil)) {
				printf( "BUGS_313 NOTFOUND db3fil=$db3fil<br>\n" );
				exit;
				}
//			$htmout .= sqlq( $db3fil, $sql, $fld );

	        	$pdo = newpdo($db3fil);
			if( $tbl == "letter" ) {
				$sql="select rowid,text,desc from $tbl";
				$psv="rowid|text|desc\n";
				$sql="select rowid,text,desc from $tbl";
				foreach( $pdo->query($sql) as $row ) {
					$rowid=$row['rowid'];
					$text=$row['text'];
					$desc=$row['desc'];
					$psv.="$rowid|$text|$desc\n";
					}
				printf( $htmout."\n".$psv );
				exit;
				}
			if( $tbl == "contacts" ) {
				$sql="select rowid,* from $tbl";
				$psv="rowid|id|name|phn|firm|url|email|note|action\n";
				$sql="select rowid,* from $tbl";
				foreach( $pdo->query($sql) as $row ) {
					$rowid=$row['rowid'];
					$id=$row['id'];
					$name=$row['name'];
					$phn=$row['phn'];
					$firm=$row['firm'];
					$url=$row['url'];
					$email=$row['email'];
					$note=$row['note'];
					$action=$row['action'];
					$psv.="$rowid|$id|$name|$phn|$firm|$url|$email|$note|$action\n";
					}
				printf( $htmout."\n".$psv );
				exit;
				}

			if( $tbl == "leds" ) {
				$sql="select rowid,* from $tbl";

				$psv="ROWID|led_id|led_status|led_code|led_name|led_dttm|led_color|led_speed|led_type|led_date|led_cmd|led_cmdout|led_desc|led_misc|led_city|led_bldg|led_loc_code|led_floor|led_group|led_orgs|led_title|led_published|led_width|led_height|led_comment|led_filename|led_user|led_user_ip|led_referer|led_remote_port|led_viewrole|led_user_agent|led_unique_id|led_err|led_fix|led_os";

				$sql="select * from $tbl";
				$rowid="";
				$j=0;
				foreach( $pdo->query($sql) as $row ) {
					$j=$j+1;
//					$rowid=$row['rowid'];
					$led_id=$row['led_id'];
					$led_status=$row['led_status'];
					$led_code=$row['led_code'];
					$led_name=$row['led_name'];
					$led_dttm=$row['led_dttm'];
					$led_color=$row['led_color'];
					$led_speed=$row['led_speed'];
//					printf( "BUGS_370 LEDS led_id=$led_id led_code=$led_code  led_name=$led_name $led_color $led_speed\n" );
					$led_type=$row['led_type'];
					$led_date=$row['led_date'];
					$led_cmd=$row['led_cmd'];
					$led_cmdout=$row['led_cmdout'];
					$led_desc=$row['led_desc'];
					$led_misc=$row['led_misc'];
					$led_city=$row['led_city'];
					$led_bldg=$row['led_bldg'];
					$led_loc_code=$row['led_loc_code'];
					$led_floor=$row['led_floor'];
					$led_group=$row['led_group'];
					$led_orgs=$row['led_orgs'];
					$led_title=$row['led_title'];
					$led_published=$row['led_published'];
					$led_width=$row['led_width'];
					$led_height=$row['led_height'];
					$led_comment=$row['led_comment'];
					$led_filename=$row['led_filename'];
					$led_user=$row['led_user'];
					$led_user_ip=$row['led_user_ip'];
					$led_referer=$row['led_referer'];
					$led_remote_port=$row['led_remote_port'];
					$led_viewrole=$row['led_viewrole'];
					$led_user_agent=$row['led_user_agent'];
					$led_unique_id=$row['led_unique_id'];
					$led_err=$row['led_err'];
					$led_fix=$row['led_fix'];
					$led_os=$row['led_os'];
					$psv.="$rowid|$led_id|$led_status|$led_code|$led_name|$led_dttm|$led_color|$led_speed|$led_type|$led_date|$led_cmd|$led_cmdout|$led_desc|$led_misc|$led_city|$led_bldg|$led_loc_code|$led_floor|$led_group|$led_orgs|$led_title|$led_published|$led_width|$led_height|$led_comment|$led_filename|$led_user|$led_user_ip|$led_referer|$led_remote_port|$led_viewrole|$led_user_agent|$led_unique_id|$led_err|$led_fix|$led_os<br>\n";

//					printf( "BUGS_400 j=$j psv=$psv\n" );
					}
				printf( $psv );
				exit;
				}


			$psv="rowid|pathfile|path|file|base|ext|dttm|exif_dt|exif_tm|desc|\n";
			$sql="select rowid,pathfile,path,file,base,ext,dttm,exif_dt,exif_tm,desc from $tbl";
			foreach( $pdo->query($sql) as $row ) {
				$rowid=$row['rowid'];
				$pathfile=$row['pathfile'];
				$path=$row['path'];
				$file=$row['file'];
				$base=$row['base'];
				$ext=$row['ext'];
				$exif_dt=$row['exif_dt'];
				$exif_tm=$row['exif_tm'];
				$desc=$row['desc'];
				$psv.="$rowid|$pathfile|$path|$file|$base|$ext|$dttm|$exif_dt|$exif_tm|$desc|\n";
				}

			printf( $htmout."\n".$psv );
			exit;
			}
			

		if( $lists == "items" ) { $file="/ko/lists_items.txt";  }
		if( $lists == "contacts" ) { $file="/ko/lists_contacts.txt"; }
		if( $lists == "letter" ) { $file="/ko/lists_letter.txt"; }
		if( $lists == "monkeytraps" ) { $file="/ko/lists_monkeytraps.txt"; }
		if( $lists == "floods" ) { $file="/ko/lists_floods.txt"; }
		if( $lists == "postturtles" ) { $file="/lists_postturtles.txt"; }
		if( $lists == "coffee" ) { $file="/lists_coffee.txt"; }
		$drfile="$dr$file";
		if( is_file($drfile)) {
//			printf( "BUGS_313 ___FOUND lists=$lists dr=$dr file=$file drfile=$drfile\n" );
			$htmout=htmout_load($drfile);
			}
		else {
			printf( "BUGS_313 NOTFOUND lists=$lists dr=$dr file=$file drfile=$drfile\n" );
			exit;
			}
		printf( $htmout );
		exit;
		}

	if( isset($_REQUEST['kups'])) {
		$kups=$_REQUEST['kups'];
		if( $kups == "" ) {
			$htmout = kups('');
			}
		if( $kups == "review" ) {
			$htmout = kups_review('');
			}
#		printf( "BUGS_295 isset _FILES<br>\n" );
		if( $kups == "go" ) {
			$htmout = img2dirs();
			}
		printf( $htmout );
		exit;
		}

	if( isset($_FILES["kups"])) {
		printf( "BUGS_295 isset _FILES<br>\n" );
		$htmout = img2dirs();
		printf( $htmout );
		exit;
		}


	if( isset($_REQUEST["k9"])) {
		$k9=$_REQUEST['k9'];
		printf( "BUGS_295 isset _K9 k9=$k9<br>\n" );		
		$htmout = k9($k9);
		printf( $htmout );
		exit;
		}

	if( isset($_REQUEST['img2b64'] )) {
#		img2b64( $imgfil, $fmt );
#		img2b64("./imgs/btn/kobrd.png","png","b64" );
# 		img2b64("./imgs/bg/ko_colorado_white.jpg","jpg","b64" );
# 		img2b64("./imgs/btn/kobrd.png","png","html" );
# 		img2b64("./imgs/btn/kobrd.png","png","" );

		$htmout = "";
		$htmout .= "<html><head><title>/ka/ko.php?img2b64 20230129_1700</title></head>\n";
		$img2b64=$_REQUEST['img2b64'];

		$htm_koeye = gdImgToHTML( "./imgs/btn/koeye.png", $format='png' );
		$htm_kobrd = gdImgToHTML( "./imgs/btn/kobrd.png", $format='png' );

		$img_koeye = img2b64("./imgs/btn/koeye.png","png","html");
		$img_kobrd = img2b64("./imgs/btn/kobrd.png","png","html");
		
		$b64_koeye = img2b64("./imgs/btn/koeye.png","png","b64");
		$b64_kobrd = img2b64("./imgs/btn/kobrd.png","png","b64");


		$htmout .= "<a href=./imgs/btn/koeye.png target=_blank>\n";
		$htmout .= $htm_koeye;
		$htmout .= "</a><br>\n";
		$htmout .= "<a href=./imgs/btn/kobrd.png target=_blank>\n";
		$htmout .= $htm_kobrd;
		$htmout .= "</a><br>\n";

		$htmout .= "<hr color=black>\n";
		$htmout .= "<a href=./imgs/btn/koeye.png target=_blank>\n";
		$htmout .= $img_koeye;
		$htmout .= "</a><br>\n";
		$htmout .= "<a href=./imgs/btn/kobrd.png target=_blank>\n";
		$htmout .= $img_kobrd;
		$htmout .= "</a><br>\n";

		$htmout .= "<hr color=black>\n";
		$htmout .= "<a href=./imgs/btn/koeye.png target=_blank>\n";
		$htmout .= "<img src=".$b64_koeye." height=30 border=0>\n";
		$htmout .= "</a><br>\n";
		$htmout .= "<a href=./imgs/btn/kobrd.png target=_blank>\n";
		$htmout .= "<img src=". $b64_kobrd." height=30 border=0>\n";
		$htmout .= "</a><br>\n";

		$htmout .= "	</body>\n";
		$htmout .= "	</html>\n";

		printf( $htmout);
		exit;
		}







	if( isset($_FILES["image"])) {
		printf( "BUGS_295 isset _FILES<br>\n" );
		$htmout = img2dirs();
		printf( $htmout );
		exit;
		}

	if( isset($_REQUEST['txt2imgs'])) {
		$htmout=txt2imgs('');
		printf($htmout);
		exit;
		}

	if( isset($_REQUEST['txt2img'])) {
		$htmout="";
		$img="./imgs/btn/koeye.png";
		$fmt="b64";
		$imgfil="./imgs/btn/kobrd.png";
		$fontid="yokkmokk";
		$text="sophia";
		$fmt="";
		$savefile="./imgs/btn/koeye_sophia.png";
		$htmout=txt2img($imgfil,$fontid,$text,$fmt,$save);
		printf($htmout);
		exit;
		}

	if( isset($_REQUEST['gd'])) {
		$options=""; 
		$gd=$_REQUEST['gd'];
		$htmout = gd($gd);
		printf($htmout);
		exit;
		}


	if( isset($_REQUEST['img2tn'])) {
		$htmout = "";
		$img=$_REQUEST['img2tn'];
		if( $img == "" ) { $img="/fb/pages/zn/zn_1.jpg"; }

		$htmout .= "<h1>BUGS_290 img2tn img=$img</h1>";
		$htmout=img2tn($img);
		printf( $htmout );
		}

	if( isset($_REQUEST['kin'])) {
		$htmout = "";
		$options="kin_options";
		$htmout .= "<h1>BUGS_291 kin options=$options</h1>";
		kin($options);
		}
	if( isset($_REQUEST['kup'])) {
		printf( "<h1>BUGS_292 kup ko_kup</h1>" );
		startup();
		}
	if( isset($_REQUEST['ko_kup'])) {
		printf( "<h1>BUGS_293 ko_kup</h1>" );
		ko_kup();
		}

	$args=array();
	$id="";
	$query_string="";
	if( isset($_REQUEST['QUERY_STRING'])) {
		$query_string = $_REQUEST['QUERY_string'];
		}
#	print( "\n<h1>BUGS_101 ko.php MAIN query_string=$query_string</h1><br>\n" );
	if( isset($_REQUEST['ko_form']) || isset($_REQUEST['ko_form'] )) {
			ko_form('');
			exit;
			}
	if( isset($_REQUEST['ko_form_submit']) || isset($_REQUEST['ko_form_submit'] )) {
			phpinfo();
			exit;
			}

	if( isset($_REQUEST['scrub_upload_form']) || isset($_REQUEST['scrub_upload_form'] )) {
		$options="";
		scrub_upload_form( $options ); 
		exit;
		}

	if( isset($_REQUEST['ko_upload']) || isset($_REQUEST['ko_upload2'] )) {
			$options="";
			$htmout=ko_upload2();
			printf( "$htmout" );
			exit;
			}

	if( isset($_REQUEST['ko_uploads']) || isset($_REQUEST['ko_uploads'] )) {
			$options="";
			$htmout=ko_uploads($options);
			printf( "$htmout" );
			exit;
			}

	if( isset($_REQUEST['bugs']) || isset($_REQUEST['bugs'] )) {
			$options="";
			$htmout=bugs($options);
			printf( "<h1>BUGS_100 $htmout </h1>\n" );
			exit;
			}

	$dbname="dgs";
	$db3fil="$dbname.db3";
	if( isset($_REQUEST['db2']) || isset($_REQUEST['db2'] )) {
		$request_db2=$_REQUEST['db2'];
		$server="localhost";
		$user="root";
		$pass="..root";
		$htmout = "";
#		$htmout .= htmout_head('db2');
		$htmout .= "<html><head>\n";
		$htmout .= htmout_load('ko_scripts.html');
		$htmout .= htmout_load('ko_styles.html');
		$htmout .= "	</head>";
		$htmout .= "<body bgcolor=linen onload=\"startup('db2);return false;\" >\n";
		$htmout .= "<img src=\"/imgs/btn/koeye.png\" onclick=\"toggle('div_db2'); return false;\" height=24>\n";
		$htmout .= "<div id=div_db2>\n";
		$htmout .= "	<hr color=goldenrod>\n";
		$htmout .= "	<h1>div_db2<h1>\n";

		$server="localhost";
		$dbname="dgs";
		$sql2="show tables;";
		$sql2="select * from ko_temp";
		$sql2="select * from Players";
		$dbname="zc"; $sql2="select * from Products";
		$dbname="zc"; $sql2="select * from Categories";
		$dbname="zc"; $sql2="select count(*) from Products";
		$dbname="dgs"; $sql2="describe Players";
		$dbname="dgs"; $sql2="show tables;";
		$dbname="zc"; $sql2="show tables;";
		$dbname="dgs"; $sql2="show tables;";
		$db3fil="$dbname.db3";

		$tblnum=1;
		$dbname="dgs";
		
		$j=0;
		if( preg_match("/show/", $request_db2 )) { 
			$dbname="dgs"; $tbl="ko_temp";
			$sql="show tables";
			if( preg_match("/show_dgs/", $request_db2 )) { $dbname="dgs"; }
			if( preg_match("/show_zc/", $request_db2 )) { $dbname="zc"; }
#			print( "<h3>MSG_716 DB2 SHOW tbl=$tbl sql=$sql</h3>" );
			$htmout_db2_query=db2_query( $server,$dbname,$tbl,$sql, $db3fil, $user,$pass );
			print( $htmout_db2_query );
			}

#		print( "<h3>MSG_290 DB2 SELECT HEAD</h3>" ); 
		if( preg_match("/select/", $request_db2 )) { 
			$tbl="ko_temp";	
			if( count(explode("_",$request_db2)) > 0 ) {
				$tbl=explode("select_", $request_db2)[1];
				}
			$sql="select * from $tbl";
#			print( "<h3>MSG_291 DB2 SELECT dbname=$dbname tbl=$tbl sq1=$sql</h3>" ); 
			$htmout_db2_query=db2_query( $server,$dbname,$tbl,$sql, $db3fil, $user,$pass );
			print( $htmout_db2_query );
			}



		if (( $_REQUEST['db2'] == "creates" ) || ( $_REQUEST['db2'] == "creates" )) {  
	#		print( "<h3>BUGS_275 dbname=$dbname db3fil=$db3fil tbls_len=$tbls_len</h3>\n" );
			$tbls=explode("\n", show_tables($dbname));
			$tbls_len=count($tbls);
#			print( "<h3>BUGS_270 dbname=$dbname db3fil=$db3fil  tbls_len=$tbls_len</h3>\n" );
			foreach( $tbls as $tbl ) {
				if( $tbl == "" ) { 
#					print( "<h1>BUGS_270 SKIP j=$j tbl=$tbl</h1>" );	
					continue; 
					}
				$j=$j+1;
				$sql2="describe $tbl;";
				$sql="";
				print( "<h2>BUGS_280 j=$j dbname=$dbname tbl=$tbl sql=$sql db3fil=$db3fil</h2>" );
#				mysql2sql3_insert( $server,$dbname,$tbl,$user,$pass,$db3fil);
				mysql2sql3_create( $server,$dbname,$tbl,$user,$pass,$db3fil);
				}
			}

		if (( $_REQUEST['db2'] == "inserts" ) || ( $_REQUEST['db2'] == "inserts" )) {  
#			print( "<h3>BUGS_275 dbname=$dbname db3fil=$db3fil tbls_len=$tbls_len</h3>\n" );
			$tbls=explode("\n", show_tables($dbname));
			$tbls_len=count($tbls);
#			print( "<h3>BUGS_270 dbname=$dbname db3fil=$db3fil  tbls_len=$tbls_len</h3>\n" );
			foreach( $tbls as $tbl ) {
				if( $tbl == "" ) { 
#					print( "<h1>BUGS_270 SKIP j=$j tbl=$tbl</h1>" );	
	 				continue; 
		 			}
				$j=$j+1;
				$sql2="describe $tbl;";
				$sql="";
				print( "<h2>BUGS_280 j=$j dbname=$dbname tbl=$tbl sql=$sql db3fil=$db3fil</h2>" );
				mysql2sql3_insert( $server,$dbname,$tbl,$user,$pass,$db3fil);
				mysql2sql3_create( $server,$dbname,$tbl,$user,$pass,$db3fil);
				}
			}

		$user="root"; $pass="..root";
		print( "<h1>BUGS_100 DB2</h1>" );
		if( isset( $_REQUEST['db2'] )) { $dbname=$_REQUEST['db2']; }
		if( isset( $_REQUEST['user'] )) { $user=$_REQUEST['user']; }
		if( isset( $_REQUEST['db3fil'] )) { $db3fil=$_REQUEST['db3fil']; }
		if( isset( $_REQUEST['sql'] )) { $sql=$_REQUEST['sql']; }
		if( isset( $_REQUEST['fmt'] )) { $fmt=$_REQUEST['fmt']; }
		$j=0; $k=0; $i=0;
		if( isset( $_REQUEST['tbl'] )) { $tbl=$_REQUEST['tbl']; }
		$dbname="zc"; $tbl="ko_temp";	
		$dbname="dgs"; $tbl="ko_temp";	
		$dbname="dgs"; $tbl="Players";	
		if( $dbname == "" ) { $dbname="dgs"; }
		if( $dbname == "" ) { $dbname="zc"; }


#		$db2=db2_connect($server,$dbname,$user,$pass);
#		$htmout_db2_query = db2_query($db2,$dbname,$sql2 );
#		$htmout_db2_exec = db2_exec($db2,$dbname,$sql2 );

		print( "<h1>BUGS_310 j=$j k=$k dbname=$dbname tbl=$tbl sql2=$sql2</h1>" );

		$htmout .= "	</div>\n";
		$htmout .= htmout_load('ko_divs.html');
		$htmout .= htmout_tail('db2');
		print($htmout);
		exit;
		}



	if( isset($_REQUEST['db3']) || isset($_REQUEST['db3'] )) {
		$htmout = "";
#		$htmout .= htmout_head('db3');
		$htmout .= "<html><head>\n";
		$htmout .= "	<title>$progid $dttm db3</title>\n";
		$htmout .= htmout_load('ko_styles.html');
		$htmout .= htmout_load('ko_scripts.html');
		$htmout .= "	</head>\n";
		$htmout .= "<body bgcolor=linen onload=\"startup('db3);return false;\" >\n";
		$htmout .= "<img src=\"/imgs/btn/koeye.png\" onclick=\"toggle('div_db3'); return false;\" height=24>\n";
		$htmout .= "<div id=div_db3>\n";
		$htmout .= "	<hr color=goldenrod>\n";
		$htmout .= "	<h1>div_db3<h1>\n";
		$htmout .= db3($db3fil);
		$htmout .= "	</div>\n";
		$htmout .= htmout_load('ko_divs.html');
		$htmout .= htmout_tail('db3');
		print($htmout);
		exit;
		}

	if( isset($_REQUEST['file']) || isset($_REQUEST['file'] )) {
		$filnam=$_REQUEST['file'];
		if( file_exists( $filnam )) {
			$filtxt=read_htmlfile($filnam);
			print($filtxt);
			}
		else {
			print( "ERR_430: NOTFOUND filnam=$filnam<br>\n" );
			}
		exit;
		}


	if( isset($_REQUEST['ko_coffeeshop']) || isset($_REQUEST['ko_coffeeshop'] )) {
		$gid=""; $fmt="";
		if( isset( $_REQUEST['db3'] )) { $db3=$_REQUEST['db3']; }
		if( isset( $_REQUEST['fmt'] )) { $fmt=$_REQUEST['fmt']; }
		$request="ko_coffeeshop";
		$txt=""; $csv=""; $psv=""; 
		$htmout=""; $htmout_table_head=""; $htmout_table_body="";
//		print( "<h1>BUGS_400 gid=$gid fmt=$fmt</h1>" );
		$json="{ \"$request\": [\n"; 


		$htmout_table_head = "<table id=table_$request>\n";
		$htmout_table_head .= "<tr><td style='text-align:center' colspan=14>gameid: $gid</td></tr>\n";
		$htmout_table_head .= "<tr>";
		$htmout_table_head .= "<td>row</td>";
		$htmout_table_head .= "<td>ord</td>";
		$htmout_table_head .= "<td>no</td>";
		$htmout_table_head .= "<td>id</td>";
		$htmout_table_head .= "<td>status</td>";
		$htmout_table_head .= "<td>dttm</td>";
		$htmout_table_head .= "<td>grp</td>";
		$htmout_table_head .= "<td>item</td>";
		$htmout_table_head .= "<td>logo</td>";

		$htmout_table_head .= "<td>coffee_id</td>";
		$htmout_table_head .= "<td>coffee_url</td>";
		$htmout_table_head .= "<td>coffee_tn</td>";
		$htmout_table_head .= "<td>logo</td>";
		$htmout_table_head .= "<td>hostid</td>";
		$htmout_table_head .= "<td>host</td>";

		$htmout_table_head .= "<td>pdf</td>";
		$htmout_table_head .= "<td>pdftxt</td>";
		$htmout_table_head .= "<td>fb</td>";
		$htmout_table_head .= "<td>fbtxt</td>";
		$htmout_table_head .= "<td>gif</td>";
		$htmout_table_head .= "<td>giftxt</td>";
		$htmout_table_head .= "<td>mp3</td>";
		$htmout_table_head .= "<td>mp3txt</td>";
		$htmout_table_head .= "<td>mp4</td>";
		$htmout_table_head .= "<td>mp4txt</td>";
		$htmout_table_head .= "<td>bc</td>";
		$htmout_table_head .= "<td>bctxt</td>";
		$htmout_table_head .= "<td>yt</td>";
		$htmout_table_head .= "<td>yttxt</td>";


		$htmout_table_head .= "<td>pn</td>";
		$htmout_table_head .= "<td>pntxt</td>";
		$htmout_table_head .= "<td>sl</td>";
		$htmout_table_head .= "<td>sltxt</td>";
		$htmout_table_head .= "<td>tl</td>";
		$htmout_table_head .= "<td>tltxt</td>";
		$htmout_table_head .= "<td>tx</td>";
		$htmout_table_head .= "<td>txtxt</td>";
		$htmout_table_head .= "<td>zm</td>";
		$htmout_table_head .= "<td>zmtxt</td>";

		$htmout_table_head .= "<td>hostid</td>";
		$htmout_table_head .= "<td>host</td>";
		$htmout_table_head .= "<td>home</td>";
		$htmout_table_head .= "<td>name</td>";
		$htmout_table_head .= "<td>email</td>";
		$htmout_table_head .= "<td>phn</td>";

		$htmout_table_head .= "<td>fab</td>";
		$htmout_table_head .= "<td>gab</td>";
		$htmout_table_head .= "<td>pl</td>";
		$htmout_table_head .= "<td>pt</td>";
		$htmout_table_head .= "<td>ss</td>";
		$htmout_table_head .= "<td>ts</td>";
		$htmout_table_head .= "<td>tw</td>";
		$htmout_table_head .= "<td>jitsi</td>";
		$htmout_table_head .= "<td>chat</td>";

		$htmout_table_head .= "<td>item</td>";
		$htmout_table_head .= "<td>cnt</td>";
		$htmout_table_head .= "<td>amt</td>";
		$htmout_table_head .= "<td>note</td>";
		$htmout_table_head .= "</tr>\n";
		
		$psvhdr="";	$psvdta ="";
		$psvhdr .= "row|ord|no|id|status|dttm|grp|item|logo|";
		$psvhdr .= "coffee_id|coffee_url|coffee_tn|";
		$psvhdr .= "fb|fbtxt|pdf|pdftxt|gif|giftxt|";
		$psvhdr .= "mp3|mp3txt|mp4|mp4txt|bc|bctxt|rm|rmtxt|vm|vmtxt|yt|yttxt|";
		$psvhdr .= "pn|pntxt|sl|sltxt|tl|tltxt|tx|txtxt|zm|zmtxt|";
		$psvhdr .= "hostid|host|home|name|email|phn|";
		$psvhdr .= "fab|gab|li|pl|pt|ss|ts|tw|jitsi|chat|";
		$psvhdr .= "dm|dmtxt|dr|drtxt|gp|gptxt|js|jstxt|wm|wmtxt|zh|zhtxt|";
		$psvhdr .= "itm|cnt|amt|note";
		$psvhdr .= "\n";




		$db3fil="ko.db3"; $fld=""; $output = "";
		$sql="select * from ko_coffeeshop";
//		$sql="select * from ko_coffeeshop where gid='$gid'";
//		$bxbys = sqlq( $db3fil, $sql, $fld );

        	$pdo = newpdo($db3fil);
		foreach( $pdo->query($sql) as $row ) {
			$rowno=$row['rowno'];
			$ord=$row['ord'];
			$no=$row['no'];
			$id=$row['id'];
			$status=$row['status'];
			$dttm=$row['dttm'];
			$grp=$row['grp'];
			$item=$row['item'];
			$logo=$row['logo'];

			$coffee_id=$row['coffee_id'];
			$coffee_url=$row['coffee_url'];
			$coffee_tn=$row['coffee_tn'];

			$fb=$row['fb'];
			$fbtxt=$row['fbtxt'];
			$pdf=$row['pdf'];
			$pdftxt=$row['pdftxt'];
			$gif=$row['gif'];
			$giftxt=$row['giftxt'];

			$mp3=$row['mp3'];
			$mp3txt=$row['mp3txt'];
			$mp4=$row['mp4'];
			$mp4txt=$row['mp4txt'];
			$bc=$row['bc'];
			$bctxt=$row['bctxt'];
			$rm=$row['rm'];
			$rmtxt=$row['rmtxt'];
			$vm=$row['vm'];
			$vmtxt=$row['vmtxt'];
			$yt=$row['yt'];
			$yttxt=$row['yttxt'];

			$pn=$row['pn'];
			$pntxt=$row['pntxt'];
			$sl=$row['sl'];
			$sltxt=$row['sltxt'];
			$tl=$row['tl'];
			$tltxt=$row['tltxt'];
			$tx=$row['tx'];
			$txtxt=$row['txtxt'];
			$zm=$row['zm'];
			$zmtxt=$row['zmtxt'];

			$hostid=$row['hostid'];
			$host=$row['host'];
			$home=$row['home'];
			$name=$row['name'];
			$email=$row['email'];
			$phn=$row['phn'];

			$fab=$row['fab'];
			$gab=$row['gab'];
			$li=$row['li'];
			$pl=$row['pl'];
			$pt=$row['pt'];
			$ss=$row['ss'];
			$ts=$row['ts'];
			$tw=$row['tw'];
			$jitsi=$row['jitsi'];
			$chat=$row['chat'];

			$dm=$row['dm'];
			$dmtxt=$row['dmtxt'];
			$dr=$row['dr'];
			$drtxt=$row['drtxt'];
			$gp=$row['gp'];
			$gbtxt=$row['gbtxt'];
			$js=$row['js'];
			$jstxt=$row['jstxt'];
			$wm=$row['wm'];
			$wmtxt=$row['wmtxt'];
			$zh=$row['zh'];
			$zhtxt=$row['zhtxt'];

			$itm=$row['itm'];
			$cnt=$row['cnt'];
			$amt=$row['amt'];
			$note=$row['note'];

			$psvdta .= "$rowno|";
			$psvdta .= "$ord|";
			$psvdta .= "$no|";
			$psvdta .= "$id|";
			$psvdta .= "$status|";
			$psvdta .= "$dttm|";
			$psvdta .= "$grp|";
			$psvdta .= "$item|";
			$psvdta .= "$logo|";

			$psvdta .= "$coffee_id|";
			$psvdta .= "$coffee_url|";
			$psvdta .= "$coffee_tn|";

			$psvdta .= "$fb|";
			$psvdta .= "$fbtxt|";
			$psvdta .= "$pdf|";
			$psvdta .= "$pdftxt|";
			$psvdta .= "$gif|";
			$psvdta .= "$giftxt|";

			$psvdta .= "$mp3|";
			$psvdta .= "$mp3txt|";
			$psvdta .= "$mp4|";
			$psvdta .= "$mp4txt|";
			$psvdta .= "$bc|";
			$psvdta .= "$bctxt|";
			$psvdta .= "$rm|";
			$psvdta .= "$rmtxt|";
			$psvdta .= "$vm|";
			$psvdta .= "$vmtxt|";
			$psvdta .= "$yt|";
			$psvdta .= "$yttxt|";

			$psvdta .= "$pn|";
			$psvdta .= "$pntxt|";
			$psvdta .= "$sl|";
			$psvdta .= "$sltxt|";
			$psvdta .= "$tl|";
			$psvdta .= "$tltxt|";
			$psvdta .= "$tx|";
			$psvdta .= "$txtxt|";
			$psvdta .= "$zm|";
			$psvdta .= "$zmtxt|";

			$psvdta .= "$hostid|";
			$psvdta .= "$host|";
			$psvdta .= "$home|";
			$psvdta .= "$name|";
			$psvdta .= "$email|";
			$psvdta .= "$phn|";

			$psvdta .= "$fab|";
			$psvdta .= "$gab|";
			$psvdta .= "$li|";
			$psvdta .= "$pl|";
			$psvdta .= "$pt|";
			$psvdta .= "$ss|";
			$psvdta .= "$ts|";
			$psvdta .= "$tw|";
			$psvdta .= "$jitsi|";
			$psvdta .= "$chat|";

			$psvdta .= "$bitchute|";
			$psvdta .= "$bitchutetxt|";
			$psvdta .= "$shopify|";
			$psvdta .= "$shopifytxt|";
			$psvdta .= "$squareup|";
			$psvdta .= "$squareuptxt|";
			$psvdta .= "$stripe|";
			$psvdta .= "$stripetxt|";

			$psvdta .= "$dm|";
			$psvdta .= "$dmtxt|";
			$psvdta .= "$dr|";
			$psvdta .= "$drtxt|";
			$psvdta .= "$gp|";
			$psvdta .= "$gptxt|";
			$psvdta .= "$js|";
			$psvdta .= "$jstxt|";
			$psvdta .= "$wm|";
			$psvdta .= "$wmtxt|";
			$psvdta .= "$zh|";
			$psvdta .= "$zhtxt|";

			$psvdta .= "$itm|";
			$psvdta .= "$cnt|";
			$psvdta .= "$amt|";
			$psvdta .= "$note<br>\n";

			$json .= "{\n";
			$json .= "\"rowno\":\"$rowno\",\n";
			$json .= "\"ord\":\"$ord\",\n";
			$json .= "\"no\":\"$no\",\n";
			$json .= "\"id\":\"$id\",\n";
			$json .= "\"status\":\"$status\",\n";
			$json .= "\"dttm\":\"$dttm\",\n";
			$json .= "\"grp\":\"$grp\",\n";
			$json .= "\"item\":\"$item\",\n";
			$json .= "\"logo\":\"$host\",\n";

			$json .= "\"coffee_id\":\"$coffee_id\",\n";
			$json .= "\"coffee_url\":\"$coffee_url\",\n";
			$json .= "\"coffee_tn\":\"$coffee_tn\",\n";

			$json .= "\"fb\":\"$fb\",\n";
			$json .= "\"fbtxt\":\"$fbtxt\",\n";
			$json .= "\"pdf\":\"$pdf\",\n";
			$json .= "\"pdftxt\":\"$pdftxt\",\n";
			$json .= "\"gif\":\"$gif\",\n";
			$json .= "\"giftxt\":\"$giftxt\",\n";

			$json .= "\"mp3\":\"$mp3\",\n";
			$json .= "\"mp3txt\":\"$mp3txt\",\n";
			$json .= "\"mp4\":\"$mp4\",\n";
			$json .= "\"mp4txt\":\"$mp4txt\",\n";
			$json .= "\"bc\":\"$bc\",\n";
			$json .= "\"bctxt\":\"$bctxt\",\n";
			$json .= "\"rm\":\"$rm\",\n";
			$json .= "\"rmtxt\":\"$rmtxt\",\n";
			$json .= "\"vm\":\"$vm\",\n";
			$json .= "\"vmtxt\":\"$vmtxt\",\n";
			$json .= "\"yt\":\"$yt\",\n";
			$json .= "\"yttxt\":\"$yttxt\",\n";

			$json .= "\"pn\":\"$pn\",\n";
			$json .= "\"pntxt\":\"$pntxt\",\n";
			$json .= "\"sl\":\"$sl\",\n";
			$json .= "\"sltxt\":\"$sltxt\",\n";
			$json .= "\"tl\":\"$tl\",\n";
			$json .= "\"tltxt\":\"$tltxt\",\n";
			$json .= "\"tx\":\"$tx\",\n";
			$json .= "\"txtxt\":\"$txtxt\",\n";
			$json .= "\"zm\":\"$zm\",\n";
			$json .= "\"zmtxt\":\"$zmtxt\",\n";

			$json .= "\"hostid\":\"$hostid\",\n";
			$json .= "\"host\":\"$host\",\n";
			$json .= "\"home\":\"$home\",\n";
			$json .= "\"name\":\"$name\",\n";
			$json .= "\"email\":\"$email\",\n";
			$json .= "\"phn\":\"$phn\",\n";

			$json .= "\"fab\":\"$fab\",\n";
			$json .= "\"gab\":\"$gab\",\n";
			$json .= "\"pl\":\"$pl\",\n";
			$json .= "\"pt\":\"$pt\",\n";
			$json .= "\"ss\":\"$ss\",\n";
			$json .= "\"ts\":\"$ts\",\n";
			$json .= "\"tw\":\"$tw\",\n";
			$json .= "\"jitsi\":\"$jitsi\",\n";
			$json .= "\"chat\":\"$chat\",\n";

			$json .= "\"dm\":\"$dm\",\n";
			$json .= "\"dmtxt\":\"$dmtxt\",\n";
			$json .= "\"dr\":\"$dr\",\n";
			$json .= "\"drtxt\":\"$drtxt\",\n";
			$json .= "\"gp\":\"$gp\",\n";
			$json .= "\"gptxt\":\"$gptxt\",\n";
			$json .= "\"js\":\"$js\",\n";
			$json .= "\"jstxt\":\"$jstxt\",\n";
			$json .= "\"wm\":\"$wm\",\n";
			$json .= "\"wmtxt\":\"$wmtxt\",\n";
			$json .= "\"zh\":\"$zh\",\n";
			$json .= "\"zhtxt\":\"$zhtxt\",\n";

			$json .= "\"itm\":\"$itm\",\n";
			$json .= "\"cnt\":\"$cnt\",\n";
			$json .= "\"amt\":\"$amt\",\n";
			$json .= "\"note\":\"$note\"\n";
			$json .= "},\n";

			$htmout_table_body .= "<tr>";
			$htmout_table_body .= "<td>".$row['rowno']."</td>";
			$htmout_table_body .= "<td>".$row['ord']."</td>";
			$htmout_table_body .= "<td>".$row['no']."</td>";
			$htmout_table_body .= "<td>".$row['id']."</td>";
			$htmout_table_body .= "<td>".$row['status']."</td>";
			$htmout_table_body .= "<td>".$row['dttm']."</td>";
			$htmout_table_body .= "<td>".$row['grp']."</td>";
			$htmout_table_body .= "<td>".$row['item']."</td>";
			$htmout_table_body .= "<td>".$row['logo']."</td>";

			$htmout_table_body .= "<td>".$row['coffee_id']."</td>";
			$htmout_table_body .= "<td>".$row['coffee_url']."</td>";
			$htmout_table_body .= "<td>".$row['coffee_tn']."</td>";

			$htmout_table_body .= "<td>".$row['fb']."</td>";
			$htmout_table_body .= "<td>".$row['fbtxt']."</td>";
			$htmout_table_body .= "<td>".$row['pdf']."</td>";
			$htmout_table_body .= "<td>".$row['pdftxt']."</td>";
			$htmout_table_body .= "<td>".$row['gif']."</td>";
			$htmout_table_body .= "<td>".$row['giftxt']."</td>";

			$htmout_table_body .= "<td>".$row['mp3']."</td>";
			$htmout_table_body .= "<td>".$row['mp3txt']."</td>";
			$htmout_table_body .= "<td>".$row['mp4']."</td>";
			$htmout_table_body .= "<td>".$row['mp4txt']."</td>";
			$htmout_table_body .= "<td>".$row['bc']."</td>";
			$htmout_table_body .= "<td>".$row['bctxt']."</td>";
			$htmout_table_body .= "<td>".$row['rm']."</td>";
			$htmout_table_body .= "<td>".$row['rmtxt']."</td>";
			$htmout_table_body .= "<td>".$row['vm']."</td>";
			$htmout_table_body .= "<td>".$row['vmtxt']."</td>";
			$htmout_table_body .= "<td>".$row['yt']."</td>";
			$htmout_table_body .= "<td>".$row['yttxt']."</td>";


			$htmout_table_body .= "<td>".$row['pn']."</td>";
			$htmout_table_body .= "<td>".$row['pntxt']."</td>";
			$htmout_table_body .= "<td>".$row['sl']."</td>";
			$htmout_table_body .= "<td>".$row['sltxt']."</td>";
			$htmout_table_body .= "<td>".$row['tl']."</td>";
			$htmout_table_body .= "<td>".$row['tltxt']."</td>";
			$htmout_table_body .= "<td>".$row['tx']."</td>";
			$htmout_table_body .= "<td>".$row['txtxt']."</td>";
			$htmout_table_body .= "<td>".$row['zm']."</td>";
			$htmout_table_body .= "<td>".$row['zmtxt']."</td>";

			$htmout_table_body .= "<td>".$row['hostid']."</td>";
			$htmout_table_body .= "<td>".$row['host']."</td>";
			$htmout_table_body .= "<td>".$row['home']."</td>";
			$htmout_table_body .= "<td>".$row['name']."</td>";
			$htmout_table_body .= "<td>".$row['email']."</td>";
			$htmout_table_body .= "<td>".$row['phn']."</td>";

			$htmout_table_body .= "<td>".$row['fab']."</td>";
			$htmout_table_body .= "<td>".$row['gab']."</td>";
			$htmout_table_body .= "<td>".$row['li']."</td>";
			$htmout_table_body .= "<td>".$row['pl']."</td>";
			$htmout_table_body .= "<td>".$row['pt']."</td>";
			$htmout_table_body .= "<td>".$row['ss']."</td>";
			$htmout_table_body .= "<td>".$row['ts']."</td>";
			$htmout_table_body .= "<td>".$row['tw']."</td>";
			$htmout_table_body .= "<td>".$row['jitsi']."</td>";


			$htmout_table_body .= "<td>".$row['dm']."</td>";
			$htmout_table_body .= "<td>".$row['dmtxt']."</td>";
			$htmout_table_body .= "<td>".$row['dr']."</td>";
			$htmout_table_body .= "<td>".$row['drtxt']."</td>";
			$htmout_table_body .= "<td>".$row['gp']."</td>";
			$htmout_table_body .= "<td>".$row['gptxt']."</td>";
			$htmout_table_body .= "<td>".$row['js']."</td>";
			$htmout_table_body .= "<td>".$row['jstxt']."</td>";
			$htmout_table_body .= "<td>".$row['wm']."</td>";
			$htmout_table_body .= "<td>".$row['wmtxt']."</td>";
			$htmout_table_body .= "<td>".$row['zh']."</td>";
			$htmout_table_body .= "<td>".$row['zhtxt']."</td>";

			$htmout_table_body .= "<td>".$row['itm']."</td>";
			$htmout_table_body .= "<td>".$row['cnt']."</td>";
			$htmout_table_body .= "<td>".$row['amt']."</td>";
			$htmout_table_body .= "<td>".$row['note']."</td>";
			$htmout_table_body .= "</tr>\n";
			}


		$psv = $psvhdr . $psvdta;
		$csv=str_replace("|",",",$psv);
		$txt=str_replace("|"," ",$psv);

		$json .= "{\n";
		$json .= "\"rowno\":\"$rowno\",\n";
		$json .= "\"ord\":\"$ord\",\n";
		$json .= "\"no\":\"$no\",\n";
		$json .= "\"id\":\"$id\",\n";
		$json .= "\"status\":\"$status\",\n";
		$json .= "\"dttm\":\"$dttm\",\n";
		$json .= "\"grp\":\"$grp\",\n";
		$json .= "\"item\":\"$item\",\n";
		$json .= "\"logo\":\"$logo\",\n";

		$json .= "\"coffee_id\":\"$coffee_id\",\n";
		$json .= "\"coffee_url\":\"$coffee_url\",\n";
		$json .= "\"coffee_tn\":\"$coffee_tn\",\n";

		$json .= "\"fb\":\"$fb\",\n";
		$json .= "\"fbtxt\":\"$fbtxt\",\n";
		$json .= "\"pdf\":\"$pdf\",\n";
		$json .= "\"pdftxt\":\"$pdftxt\",\n";
		$json .= "\"gif\":\"$gif\",\n";
		$json .= "\"giftxt\":\"$giftxt\",\n";

		$json .= "\"mp3\":\"$mp3\",\n";
		$json .= "\"mp3txt\":\"$mp3txt\",\n";
		$json .= "\"mp4\":\"$mp4\",\n";
		$json .= "\"mp4txt\":\"$mp4txt\",\n";
		$json .= "\"bc\":\"$bc\",\n";
		$json .= "\"bctxt\":\"$bctxt\",\n";
		$json .= "\"rm\":\"$rm\",\n";
		$json .= "\"rmtxt\":\"$rmtxt\",\n";
		$json .= "\"vm\":\"$vm\",\n";
		$json .= "\"vmtxt\":\"$vmtxt\",\n";
		$json .= "\"yt\":\"$yt\",\n";
		$json .= "\"yttxt\":\"$yttxt\",\n";

		$json .= "\"pn\":\"$pn\",\n";
		$json .= "\"pntxt\":\"$pntxt\",\n";
		$json .= "\"sl\":\"$sl\",\n";
		$json .= "\"sltxt\":\"$sltxt\",\n";
		$json .= "\"tl\":\"$tl\",\n";
		$json .= "\"tltxt\":\"$tltxt\",\n";
		$json .= "\"tx\":\"$tx\",\n";
		$json .= "\"txtxt\":\"$txtxt\",\n";
		$json .= "\"zm\":\"$zm\",\n";
		$json .= "\"zmtxt\":\"$zmtxt\",\n";

		$json .= "\"fab\":\"$fab\",\n";
		$json .= "\"gab\":\"$gab\",\n";
		$json .= "\"pl\":\"$pl\",\n";
		$json .= "\"pt\":\"$pt\",\n";
		$json .= "\"ss\":\"$ss\",\n";
		$json .= "\"ts\":\"$ts\",\n";
		$json .= "\"tw\":\"$tw\",\n";
		$json .= "\"jitsi\":\"$jitsi\",\n";
		$json .= "\"chat\":\"$chat\",\n";


		$json .= "\"btc\":\"$btc\",\n";
		$json .= "\"btctxt\":\"$btctxt\",\n";
		$json .= "\"eth\":\"$eth\",\n";
		$json .= "\"ethtxt\":\"$ethtxt\",\n";
		$json .= "\"shopify\":\"$shopify\",\n";
		$json .= "\"shopifytxt\":\"$shopifytxt\",\n";
		$json .= "\"squareup\":\"$squareup\",\n";
		$json .= "\"squareuptxt\":\"$squareuptxt\",\n";
		$json .= "\"stripe\":\"$stripe\",\n";
		$json .= "\"stripetxt\":\"$stripetxt\",\n";

		$json .= "\"dm\":\"$dm\",\n";
		$json .= "\"dmtxt\":\"$dmtxt\",\n";
		$json .= "\"dr\":\"$dr\",\n";
		$json .= "\"drtxt\":\"$drtxt\",\n";
		$json .= "\"gp\":\"$gp\",\n";
		$json .= "\"gptxt\":\"$gptxt\",\n";
		$json .= "\"js\":\"$js\",\n";
		$json .= "\"jstxt\":\"$jstxt\",\n";
		$json .= "\"wm\":\"$wm\",\n";
		$json .= "\"wmtxt\":\"$wmtxt\",\n";
		$json .= "\"zh\":\"$zh\",\n";
		$json .= "\"zhtxt\":\"$zhtxt\",\n";

		$json .= "\"itm\":\"$itm\",\n";
		$json .= "\"cnt\":\"$cnt\",\n";
		$json .= "\"amt\":\"$amt\",\n";
		$json .= "\"note\":\"$note\"\n";
		$json .= "}\n";

		$json .= "]}";

		$htmout .= $htmout_table_head;
		$htmout .= $htmout_table_body;
		$htmout .= "	</table>\n";

//		printf( "BUGS_2390:  val=[$val] fld=[$fld] row=[$row]<br>\n" );
		if( $fmt == "psv" ) { print($psv); exit; }
		if( $fmt == "csv" ) { print($csv); exit; }
		if( $fmt == "json" ) { 
   			header('Content-type: application/json');
			print($json); exit; 
			}
		if( $fmt == "txt" ) { print($txt); exit; }
		if( $fmt == "html" ) { print($htmout); exit; }
		print( $psv );

// main		rowno|ord|no|id|status|dttm|grp|item|logo|
// coffee	coffee_id|coffee_url|coffee_tn|
// books	fb|fbtxt|pdf|pdftxt|gif|giftxt|
// media	mp3|mp3txt|mp4|mp4txt|bc|bctxt|rm|rmtxt|vm|vmtxt|yt|yttxt|
// views	pn|pntxt|sl|sltxt|tl|tltxt|tx|txtxt|zm|zmtxt|
// contacts	hostid|host|home|name|email|phn|
// smedia	fab|gab|li|pl|ss|ts|tw|jitsi|chat|
// biz		btc|btctxt|eth|ethtxt|shopify|shopifytxt|squareup|squareuptxt|stripe|stripetxt|
// amedia	dm|dmtxt|dr|drtxt|gp|gptxt|js|jstxt|wm|wmtxt|zh|zhtxt|
// notes	itm|cnt|amt|note

		exit;
		}

	if( isset($_REQUEST['kogo_db3']) || isset($_REQUEST['kogo_db3'] )) {
		$gid=""; $fmt="";
		if( isset( $_REQUEST['kogo_db3'] )) { $gid=$_REQUEST['kogo_db3']; }
		if( isset( $_REQUEST['fmt'] )) { $fmt=$_REQUEST['fmt']; }
		$txt=""; $csv=""; $psv=""; 
		$htmout=""; $htmout_table_head=""; $htmout_table_body="";
//		print( "<h1>BUGS_400 gid=$gid fmt=$fmt</h1>" );
		$json="{ \"kogo\": [\n"; 


		$htmout_table_head = "<table id=table_$gid>\n";
		$htmout_table_head .= "<tr><td style='text-align:center' colspan=14>gameid: $gid</td></tr>\n";
		$htmout_table_head .= "<tr>";
		$htmout_table_head .= "<td>gid</td>";
		$htmout_table_head .= "<td>dttm</td>";
		$htmout_table_head .= "<td>pb</td>";
		$htmout_table_head .= "<td>pw</td>";
		$htmout_table_head .= "<td>bxlim</td>";
		$htmout_table_head .= "<td>bylim</td>";
		$htmout_table_head .= "<td>bhandi</td>";
		$htmout_table_head .= "<td>t</td>";
		$htmout_table_head .= "<td>x</td>";
		$htmout_table_head .= "<td>y</td>";
		$htmout_table_head .= "<td>td</td>";
		$htmout_table_head .= "<td>tdx</td>";
		$htmout_table_head .= "<td>tdy</td>";
		$htmout_table_head .= "<td>note</td>";
		$htmout_table_head .= "</tr>\n";
		


		$db3fil="kogo.db3"; $fld=""; $output = "";
		$sql="select * from games where gid='$gid'";
//		$bxbys = sqlq( $db3fil, $sql, $fld );

        	$pdo = newpdo($db3fil);
		foreach( $pdo->query($sql) as $row ) {
			$dttm=$row['dttm'];
			$pb=$row['pb'];
			$pw=$row['pw'];
			$bxlim=$row['bxlim'];
			$bylim=$row['bylim'];
			$bhandi=$row['bhandi'];
			$bhandi=$row['bhandi'];
			$t=$row['t'];
			$x=$row['x'];
			$y=$row['y'];
			$td=$row['td'];
			$tdx=$row['tdx'];
			$tdy=$row['tdy'];
			$note=$row['note'];

			$psv .= "$gid|";
			$psv .= "$dttm|";
			$psv .= "$pb|";
			$psv .= "$pw|";
			$psv .= "$bxlim|";
			$psv .= "$bylim|";
			$psv .= "$bhandi|";
			$psv .= "$t|";
			$psv .= "$x|";
			$psv .= "$y|";
			$psv .= "$td|";
			$psv .= "$tdx|";
			$psv .= "$tdy|";
			$psv .= "$note<br>\n";

			$json .= "{\n";
			$json .= "\"gid\":\"$gid\",\n";
			$json .= "\"dttm\":\"$dttm\",\n";
			$json .= "\"pb\":\"$pb\",\n";
			$json .= "\"pw\":\"$pw\",\n";
			$json .= "\"bxlim\":\"$bxlim\",\n";
			$json .= "\"bylim\":\"$bylim\",\n";
			$json .= "\"bhandi\":\"$bhandi\",\n";
			$json .= "\"t\":\"$t\",\n";
			$json .= "\"x\":\"$x\",\n";
			$json .= "\"y\":\"$y\",\n";
			$json .= "\"td\":\"$td\",\n";
			$json .= "\"tdx\":\"$tdx\",\n";
			$json .= "\"tdy\":\"$tdy\",\n";
			$json .= "\"note\":\"$note\"\n";
			$json .= "},\n";

			$htmout_table_body .= "<tr>";
			$htmout_table_body .= "<td>".$row['gid']."</td>";
			$htmout_table_body .= "<td>".$row['dttm']."</td>";
			$htmout_table_body .= "<td>".$row['pb']."</td>";
			$htmout_table_body .= "<td>".$row['pw']."</td>";
			$htmout_table_body .= "<td>".$row['bxlim']."</td>";
			$htmout_table_body .= "<td>".$row['bylim']."</td>";
			$htmout_table_body .= "<td>".$row['bhandi']."</td>";
			$htmout_table_body .= "<td>".$row['t']."</td>";
			$htmout_table_body .= "<td>".$row['x']."</td>";
			$htmout_table_body .= "<td>".$row['y']."</td>";
			$htmout_table_body .= "<td>".$row['td']."</td>";
			$htmout_table_body .= "<td>".$row['tdx']."</td>";
			$htmout_table_body .= "<td>".$row['tdy']."</td>";
			$htmout_table_body .= "<td>".$row['note']."</td>";
			$htmout_table_body .= "</tr>\n";
			}

		$csv=str_replace("|",",",$psv);
		$txt=str_replace("|"," ",$psv);

		$json .= "{\n";
		$json .= "\"gid\":\"$gid\",\n";
		$json .= "\"dttm\":\"$dttm\",\n";
		$json .= "\"pb\":\"$pb\",\n";
		$json .= "\"pw\":\"$pw\",\n";
		$json .= "\"bxlim\":\"$bxlim\",\n";
		$json .= "\"bylim\":\"$bylim\",\n";
		$json .= "\"bhandi\":\"$bhandi\",\n";
		$json .= "\"t\":\"$t\",\n";
		$json .= "\"x\":\"\",\n";
		$json .= "\"y\":\"\",\n";
		$json .= "\"td\":\"\",\n";
		$json .= "\"tdx\":\"$tdx\",\n";
		$json .= "\"tdy\":\"$tdy\",\n";
		$json .= "\"note\":\"nextmove\"\n";
		$json .= "}\n";

		$json .= "]}";

		$htmout .= $htmout_table_head;
		$htmout .= $htmout_table_body;
		$htmout .= "	</table>\n";

//		printf( "BUGS_2390:  val=[$val] fld=[$fld] row=[$row]<br>\n" );
		if( $fmt == "psv" ) { print($psv); exit; }
		if( $fmt == "csv" ) { print($csv); exit; }
		if( $fmt == "json" ) { 
   			header('Content-type: application/json');
			print($json); exit; 
			}
		if( $fmt == "txt" ) { print($txt); exit; }
		if( $fmt == "html" ) { print($htmout); exit; }
		print( $psv );
		exit;
		}

	if( isset($_REQUEST['kogo_bxbys']) || isset($_REQUEST['kogo_bxbys'] )) {
		$bxbyid=$_REQUEST['kogo_bxbys'];
		$htmout = ""; 
		$bxbys=""; $t=1; $bxlim=19; $bylim=19;
		$bxbyss = array();

$bxbyss['a'] = "1,1 1,2 1,3 1,4";
$bxbyss['b'] = "10,1 10,2 10,3 10,4";
$bxbyss['c'] = "19,1 19,2 19,3 19,4";
$bxbyss['ko'] = "1,2 3,2 2,1 2,3 2,3 3,4";


		$bxbys=""; $bxbys_head=""; $bxbys_body="";$pb="pd"; $pw="pw";
		$bxlim=19; $bylim=19; $bhandi=9;$t=0;$x=0;$y=0;$td=0;$tlim=0;$tdx=0;$tdy=0;
		$dttm="20211203_1830";
		if( $bxbyid == "" ) {
			$htmout = "<h1>MSG_421 KOGO_BXBYS=$bxbyid $progid?kogo_bxbys=$bxbyid<h1>\n";
			$tlim=$bxlim*$bylim;
			for( $bx=1; $bx<$bxlim; $bx++ ) {
				for( $by=1; $by<$bylim; $by++ ) {
					$bxbys_body .= "$bxbyid,$t,$bx,$by,$td,$tdx,$tdy<br>\n";
					$t=$t+1;
					}
				}
			$bxbys_head="$bxbyid,$dttm,$pb,$pw,$bxlim,$bylim,$bhandi,$tlim,$tdx,$tdy<br>\n";
			}
		else {
			$bxbys_body="";
			if( ! isset( $bxbyss[$bxbyid] )) { print( "<h1>ERR_420 NOTFOUND bxbyid=$bxbyid</h1>"); exit;}
			$bxbys = $bxbyss[$bxbyid]; $xyd="";
			$tlim = count(explode(" ",$bxbys));
			for( $t=0; $t<$tlim; $t++ ) {
				$bx=""; $by=""; $td="";
				$xyd=explode(" ",$bxbys);
				$commas=count(explode(",",$xyd[$t]));
				$bx = explode(",",$xyd[$t])[0];
				if( $commas>1 ) {
					$by = explode(",",$xyd[$t])[1];
					}
				if( $commas>2 ) {
					$td = explode(",",$xyd[$t])[2];
					if( isOdd($td)) { $tdx=$tdx+1; } else { $tdy=$tdx+1; }
					}
				$t1=$t+1;
				$bxbys_body .= "$bxbyid,$t1,$bx,$by,$td<br>\n";
				}
			$bxbys_head="$bxbyid,$dttm,$pb,$pw,$bxlim,$bylim,$bhandi,$tlim,$tdx,$tdy<br>\n";
			}
		$bxbys = "";
		$bxbys .= $bxbys_head . $bxbys_body;
#		$htmout = "<h1>MSG_412 KOGO_BXBYS= $progid?todo=$kogo_bxbys<h1>\n";
		print($bxbys);
		exit;
		}

	if( isset($_REQUEST['kogo']) ||  isset($_REQUEST['kogo'] )) {
		$kogo=$_REQUEST['kogo'];
		if( $kogo == "" ) {
			$htmout = "<h1>MSG_411 TODO=KOGO $progid?todo=$todo<h1>\n";
			}
		$htmout = "<h1>MSG_412 TODO=KOGO $progid?todo=$todo<h1>\n";
		print($htmout);
		exit;
		}


	if( isset($_REQUEST['todo']) || isset($_REQUEST['todo'] )) {

		$todo="";

#		if( isset($_REQUEST['todo'] )) { 
#			$request=$_REQUEST['todo']; 
#			if( $request != "" ) { $todo=$request; }
#			print( "\n<h1>MSG_130 FINDIDS todo=$todo request=$request</h1><br>\n");
#			}
		if( isset($_REQUEST['fmt'] )) {$fmt=$_REQUEST['fmt'];}
$idfinds_ko='mp3s mp4s pdfs yts bcs txts htmls';

# yts|find yt/txt -type f -maxdepth 1 -name "ytlist_202111*.txt" -exec cat {} \; | grep "youtube" | head -100
# bcs|find yt/txt -type f -maxdepth 1 -name "ytlist_202111*.txt" -exec cat {} \; | grep "bitchute" | head -100
# htmls|find yt/txt -type f -maxdepth 1 -name "ytlist_202111*.txt" -exec cat {} \; | grep ".html" | head -100

$idfinds='
ko|find pdf -type f -maxdepth 1 -name "*.pdf"
kups|find ./kups -type f -name "*.*"
imgs|find ./imgs -type f -name "*.*"
mp3s|find kb/aud/mp3 -type f -name "*.mp3"
jsons|find pdf -type f -name "*.json"
host_list|cat ./kb/media/host_list.psv
host_list_ka|cat ./kb/media/host_list_ka.psv
media_list|cat ./kb/media/media_list.psv
media_list_ka|cat ./kb/media/media_list_ka.psv
coffeec_list|cat ./kb/media/coffeec_list.psv
coffeec_list_ka|cat /kb/media/coffeec_list_ka.psv
coffee_list|cat /kb/media/coffee_list.psv
cat_ko_coffeeshop_psv|cat ko_coffeeshop.psv
cat_ko_coffeeshop_csv|cat ko_coffeeshop.csv
sql3_kups|select * from kups
sql3_ko_coffeeshop|select * from ko_coffeeshop
sql3_host_list|select * from host_list
sql3_host_list_ka|select * from host_list_ka
sql3_media_list|select * from media_list
sql3_media_list_ka|select * from media_list_ka
sql3_coffeec_list|select * from coffeec_list
sql3_coffeec_list_ka|select * from coffeec_list_ka
sql3_coffee_list|select * from coffee_list
sql3_coffee_list_ka|select * from coffee_list_ka
txts|find txt -type f -name "*.txt"
mp4s|find kb/vid/jkwii -type f -maxdepth 2 -name "*.mp4" -o -name "*.webm"
pns|find pn/imgs -type f -maxdepth 1 -name "*.jpg"
pdf_ko|find pdf -type f  -name "*ko*.pdf"
pdf_iperms|find pdf -type f   -name "*iperms*.pdf"
pdf_jtfdc|find pdf -type f   -name "*jtfdc*.pdf"
pdf1|find pdf -type f -maxdepth 1 -name "*.pdf"
pdfs|find pdf -type f  -name "*.pdf"
mp3s1|find kb/aud/mp3  -type f  -maxdepth 1 -name "*.mp3"
yts|find kb/media/ -type f -maxdepth 1 -name "ko_media_yt.txt" -exec cat {} \; | grep "youtube" | head -100
bcs|find kb/media -type f -maxdepth 1 -name "ko_media_bc.txt" -exec cat {} \; | grep "bitchute" | head -100
htmls|find kb/media -type f -maxdepth 1 -name "ko_media_ht.txt" -exec cat {} \; | grep ".html" | head -100
pagesimgs|find ./pages -type f -maxdepth 1 -name "*.jpg"; find ./imgs -type f -maxdepth 1 -name "*.jpg" | grep -v "tn/";
pages|find fb/pages -type f -maxdepth 1 -name "*.jpg" 
pdfs1|find pdf -type f -maxdepth 1 -name "*.pdf"
fbd1|find fb -type d -maxdepth 1 -name "*"
txts|find txt -type f -maxdepth 2 -name "*.txt"
htms|find . -type f -maxdepth 1 -name "??.html"
dirs_mp3|find kb/aud -type d -maxdepth 3 -name "*"
dirs_mp4|find kb/vid -type d -maxdepth 3 -name "*"
dirs_pdf|find pdf -type d -maxdepth 3 -name "*"
dirs_yts|find yt/txt -type d -maxdepth 3 -name "ytlist_*.txt"
dirs_fb|find fb -type d -maxdepth 1 -name "*"
dirs_pn|find pn -type d -maxdepth 3 -name "*"
dirs_tl|find tl -type d -maxdepth 3 -name "*"
dirs_zn|find tl -type d -maxdepth 3 -name "*"
';

$idfinds_tests='
mp3_today|find kb/aud/mp3 -type f -name "library_of_congress.mp3"
mp4_today|find kb/aud/mp3 -type f -name "library_of_congress.mp3"
pdf_today|find kb/aud/mp3 -type f -name "library_of_congress.mp3"
txt_today|find kb/aud/mp3 -type f -name "library_of_congress.mp3"
htm_today|find kb/aud/mp3 -type f -name "library_of_congress.mp3"
yt_today|find kb/aud/mp3 -type f -name "library_of_congress.mp3"
fb_today|fb/mars
pn_today|pn/imgs/pano_creek.jpg
tl_todatoday|
zm_todatoday|
mp3s_n|find kb/aud/mp3 -type f -name "&ltn&gt.mp3"
mp4s2|find kb/vid/jkwii -type f -maxdepth &ltd&gt f -name "&ltn&gt.mp4"
mp4s_p|find kb/vid/&ltp&gt -type f -maxdepth &ltd&gt -name "&ltn&gt.mp4"
mp4s_n|find kb/vid/&ltp&gt -type f -maxdepth &ltd&gt -name "&ltn&gt.mp4"
mp4_p|find kb/vid -type d -maxdepth &ltd&gt -name "&ltn&gt"
yts|cat /yt/txt/ytlist.txt | grep "&ltn&gt" | head -100
yts_lim|cat /yt/txt/ytlist.txt | grep "&ltn&gt" | head -&ltlim&gt
ht_mp3|kb/aud/mp3/library_of_congress.mp3
ht_mp4|kb/vid/jkwii/dutch_jackson_weightup.mp4
ht_yt||https://www.youtube.com/watch?v=wQz5aG2tnd4|vladvt_megalithic_inca
ht_png|imgs/btn/koeye.png
ht_jpg|imgs/bg/bg_newton05b.jpg
ht_gif|imgs/gif/gifset_knots/knot1.gif
ht_zm|/index_zm.html
ht_zmd|/zm
ht_tl|/index_tl.html
ht_tld|/tl
find|find &ltp&gt -type f -maxdepth &ltlim&gt -name "&ltn&gt"
mp4s_jtfdc|find kb/vid -type f -name "jtfdc*.mp4"
gifd1|find imgs/gif -type d -maxdepth 2 -name "*"
gifs|find imgs/gif -type f -maxdepth 2 -name "*.gif"
pdfs|find pdf -type f -name "*.pdf"
pdfs2|find pdf/pdf -type f -maxdepth 1 -name "*.pdf"
fbd1|find fb -type d -maxdepth 1 -name "*"
fbds|find fb -type d -name "*"
pages|find fb/pages -type f -maxdepth 1 -name "*.jpg" \| head -5
pages_fb|find fb/pages -type f -maxdepth 1 -name "*.jpg"
pagesimgs|find ./pages -type f -maxdepth 1 -name "*.jpg"; find ./imgs -type f -maxdepth 1 -name "*.jpg";
topdirs|find / -type d -maxdepth 1 -name "??";
sh_ka1|./ka1.sh
sh_cp|find ./pages -type f -maxdepth 1 -name "*.jpg" | awk \'{ print "convert "$0" -resize 200x tn/tn_"$0"  # "NF }\' | sed "s/jpg  /png  /"

sql3_sel_db3tbllim|sqlite3 &ltdb3&gt "sel * from &lttbl&gt limit &ltlim&gt";
sql3_sel_tbllim|sqlite3 ko.db3 "sel * from &lttbl&gt limit &ltlim&gt";
sql3_tables|sqlite3 ko.db3 .tables
sql3_schema|sqlite3 ko.db3 .schema
sql3_files|sqlite3 ko.db3 "select * from files"
sql3_ko_coffee|sqlite3 ko.db3 "select * from coffee_list"
sql3_ko_media|sqlite3 ko.db3 "select * from media_list"
sql3_mp3|sqlite3 ko.db3 "select * from mp3"
sql3_mp4|sqlite3 ko.db3 "select * from mp4"
sql3_mp3|sqlite3 ko.db3 "select * from jpg"
sql3_books|sqlite3 ko.db3 "select * from books"
fb/iperms/pages|find fb/iperms/pages -type f -maxdepth 1 -name "*.jpg"
fb/konet/pages|find fb/konet/pages -type f -maxdepth 1 -name "*.jpg"
fb/jtfdc/pages|find fb/jtfdc_pages -type f -maxdepth 1 -name "*.jpg"
fb/jtfdcr/pages|find fb/jtfdcr/pages -type f -maxdepth 1 -name "*.jpg"
fb/jtfinc/pages|find fb/jtfinc/pages -type f -maxdepth 1 -name "*.jpg"
fb/kt/pages|find fb/kt/pages -type f -maxdepth 1 -name "*.jpg"
fb/iperms/pages|find fb/iperms/pages -type f -maxdepth 1 -name "*.jpg"
fb/konet/pages|find fb/konet/pages -type f -maxdepth 1 -name "*.jpg"
fb/jtfdc/pages|find fb/jtfdc_pages -type f -maxdepth 1 -name "*.jpg"
fb/jtfdcr/pages|find fb/jtfdcr/pages -type f -maxdepth 1 -name "*.jpg"
fb/jtfinc/pages|find fb/jtfinc/pages -type f -maxdepth 1 -name "*.jpg"
fb/kt/pages|find fb/kt/pages -type f -maxdepth 1 -name "&ltn&gt.jpg"
fb/go/pages|find fb/go/pages -type f -maxdepth 1 -name "&ltn&gt.jpg"
fb/kou/pages|find fb/kou/pages -type f -maxdepth 1 -name "&ltn&gt.jpg"
fb/royal1/pages|find fb/royal1/pages -type f -maxdepth 1 -name "&ltn&gt.jpg"
fb/iperms/imgs|find fb/iperms/imgs -type f -maxdepth 1 -name "&ltn&gt.jpg"
fb/konet/imgs|find fb/konet/imgs -type f -maxdepth 1 -name "&ltn&gt.jpg"
fb/jtfdc/imgs|find fb/jtfdc_imgs -type f -maxdepth 1 -name "&ltn&gt.jpg"
fb/jtfdcr/imgs|find fb/jtfdcr/imgs -type f -maxdepth 1 -name "&ltn&gt.jpg"
fb/jtfinc/imgs|find fb/jtfinc/imgs -type f -maxdepth 1 -name "&ltn&gt.jpg"
fb/kt/imgs|find fb/kt/imgs -type f -maxdepth 1 -name "&ltn&gt.jpg"
fb/go/imgs|find fb/go/imgs -type f -maxdepth 1 -name "&ltn&gt.jpg"
fb/kou/imgs|find fb/kou/imgs -type f -maxdepth 1 -name "&ltn&gt.jpg"
fb/royal1/imgs|find fb/royal1/imgs -type f -maxdepth 1 -name "&ltn&gt.jpg"
tls|find tl -type f -maxdepth 1 -name "&lt*&gt.json"
zms|find zm -type f -name "0-0-0.jpg"
pns|find pn -type f -name "*.jpg"
du|du -h -d 1 .
du_dp|du -h -d &ltd&gt
';


# du -h --max-depth 1 .	# bh
# du -h -d 1 .		# depth 1
# du -h -depth .	# depthtot







//		print( "<h1>BUGS_760 todo=$todo idfinds=$idfinds</h1><br>\n" );
		$ids=explode("\n",$idfinds);
		$htmout="";
		$list="";
		$todo="";
		if( isset($_REQUEST['todo'])) { $todo=$_REQUEST['todo']; }


		$db2=""; if( isset($_REQUEST['db2'])) { $db3=$_REQUEST['db2']; }
		$db3=""; if( isset($_REQUEST['db3'])) { $db3=$_REQUEST['db3']; }
		$tbl=""; if( isset($_REQUEST['tbl'])) { $tbl=$_REQUEST['tbl']; }
		$sel=""; if( isset($_REQUEST['sel'])) { $sel=$_REQUEST['sel']; }
		$fld=""; if( isset($_REQUEST['fld'])) { $fld=$_REQUEST['fld']; }
		$val=""; if( isset($_REQUEST['val'])) { $val=$_REQUEST['val']; }
		$fmt=""; if( isset($_REQUEST['fmt'])) { $fmt=$_REQUEST['fmt']; }
		$lim=""; if( isset($_REQUEST['lim'])) { $lim=$_REQUEST['lim']; }

		$a=""; if( isset($_REQUEST['a'])) { $a=$_REQUEST['a']; }
		$b=""; if( isset($_REQUEST['b'])) { $b=$_REQUEST['b']; }
		$c=""; if( isset($_REQUEST['c'])) { $c=$_REQUEST['c']; }
		$d=""; if( isset($_REQUEST['d'])) { $d=$_REQUEST['d']; }
		$d=""; if( isset($_REQUEST['d'])) { $d=$_REQUEST['d']; }
		$e=""; if( isset($_REQUEST['e'])) { $e=$_REQUEST['e']; }
		$f=""; if( isset($_REQUEST['f'])) { $f=$_REQUEST['f']; }
		$g=""; if( isset($_REQUEST['g'])) { $g=$_REQUEST['g']; }
		$h=""; if( isset($_REQUEST['h'])) { $h=$_REQUEST['h']; }
		$i=""; if( isset($_REQUEST['i'])) { $i=$_REQUEST['i']; }
		$j=""; if( isset($_REQUEST['j'])) { $j=$_REQUEST['j']; }
		$k=""; if( isset($_REQUEST['k'])) { $k=$_REQUEST['k']; }
		$l=""; if( isset($_REQUEST['l'])) { $l=$_REQUEST['l']; }
		$m=""; if( isset($_REQUEST['m'])) { $m=$_REQUEST['m']; }
		$n=""; if( isset($_REQUEST['n'])) { $n=$_REQUEST['n']; }
		$o=""; if( isset($_REQUEST['o'])) { $o=$_REQUEST['o']; }
		$p=""; if( isset($_REQUEST['p'])) { $p=$_REQUEST['p']; }
		$q=""; if( isset($_REQUEST['q'])) { $q=$_REQUEST['q']; }
		$r=""; if( isset($_REQUEST['r'])) { $r=$_REQUEST['r']; }
		$s=""; if( isset($_REQUEST['s'])) { $s=$_REQUEST['s']; }
		$t=""; if( isset($_REQUEST['t'])) { $t=$_REQUEST['t']; }
		$u=""; if( isset($_REQUEST['u'])) { $u=$_REQUEST['u']; }
		$v=""; if( isset($_REQUEST['v'])) { $v=$_REQUEST['v']; }
		$w=""; if( isset($_REQUEST['w'])) { $w=$_REQUEST['w']; }
		$x=""; if( isset($_REQUEST['x'])) { $x=$_REQUEST['x']; }
		$y=""; if( isset($_REQUEST['y'])) { $y=$_REQUEST['y']; }
		$z=""; if( isset($_REQUEST['z'])) { $z=$_REQUEST['z']; }


		$ids=explode("\n",$idfinds);
		$htmout="";
		$list="";
		$fmt="";

#		if( $todo == "" ) { print("<h1>BUGS_811 TODO=BLANK todo=$todo</h1>" ); }
#		if( $todo == 0 ) { print("<h1>BUGS_812 TODO=NUM0 todo=$todo</h1>" ); }
#		if( $todo == "0" ) { print("<h1>BUGS_813 TODO=NUMCHR todo=$todo</h1>" ); }
#		if( $todo == "menu" ) { print("<h1>BUGS_814 TODO=MENU todo=$todo</h1>" ); }
#		print("<h1>BUGS_815 TODO todo=$todo</h1>" ); 

		if( isset($_REQUEST['fmt'])) { $fmt=$_REQUEST['fmt']; }
		if(( $todo == "" ) 
		|| ( $todo == "0"  ) 
		|| ( $todo == "list"  ) 
		|| ( $todo == "menu" )) {
			print( "<h1>BUGS_815 MENU todo=$todo</h1><br>\n" );
			$htmout .= "<html>\n";
			$htmout .= "<head>\n";
			$htmout .= "	<title>$progid $dttm todo</title>\n";
			$htmout .= "	</head>\n";
			$htmout .= "<body bgcolor=linen>\n";
#			$htmout .= "<h1>todo</h1>\n";
			$htmout .= "<a href=/index.html target=_blank>";
			$htmout .= "<img src=ko.png height=20>";
			$htmout .= "</a>\n";
			$htmout .= "&nbsp &nbsp &nbsp &nbsp";
			$htmout .= "$progid $dttm";
			$htmout .= "<hr color=goldenrod>\n";
			$htmout .= "<table id=table_todo>";
			$htmout .= "<tr><td>j</td><td width=100 >url</td><td width=125>id</td><td width=400>find</td></tr>\n";
			for( $j=0; $j<count($ids); $j++ ) {
				$line=$ids[$j];
				$list .= $line;
				if( $line === "" ) { continue; }
				if( preg_match("/^#/", $line, $matches )) { continue; }

				if( preg_match("/^</", $line, $matches)) { 
#					$list .= $line;
#					$htmout .= $line;
#					print( "<h2>MSG_385 HTMFMT line=$line</h2><br>\n" );
					continue;
					}


				$id=explode("|",$line)[0];
				if( $id === "" ) { continue; }
				$find="";
				if( count(explode("|", $line)) > 1 ) {
					$idpipe=$id."|";
					$find=str_replace($idpipe,"",$line);
					}
				else {
					$find=explode("|",$line)[1];
					}
				$matches2="";

//				print( "<h1>BUGS_680 todo=$todo j=$j id=$id line=$line</h1><br>\n" );


				$find=str_replace('&ltfmt&gt',$fmt, $find, $matches2);
				$find=str_replace('&ltlim&gt',$lim, $find, $matches2);
				$find=str_replace('&ltdb3&gt',$db3, $find, $matches2);
				$find=str_replace('&lttbl&gt',$tbl, $find, $matches2);
				$find=str_replace('&ltsel&gt',$sel, $find, $matches2);
				$find=str_replace('&ltfld&gt',$fld, $find, $matches2);

				$find=str_replace('&lta&gt',$a, $find, $matches2);
				$find=str_replace('&ltb&gt',$b, $find, $matches2);
				$find=str_replace('&ltc&gt',$c, $find, $matches2);
				$find=str_replace('&ltd&gt',$d, $find, $matches2);
				$find=str_replace('&lte&gt',$e, $find, $matches2);
				$find=str_replace('&ltf&gt',$f, $find, $matches2);
				$find=str_replace('&ltg&gt',$g, $find, $matches2);
				$find=str_replace('&lth&gt',$h, $find, $matches2);
				$find=str_replace('&lti&gt',$i, $find, $matches2);
				$find=str_replace('&ltj&gt',$j, $find, $matches2);
				$find=str_replace('&ltk&gt',$k, $find, $matches2);
				$find=str_replace('&ltl&gt',$l, $find, $matches2);
				$find=str_replace('&ltm&gt',$m, $find, $matches2);
				$find=str_replace('&ltn&gt',$n, $find, $matches2);
				$find=str_replace('&lto&gt',$o, $find, $matches2);
				$find=str_replace('&ltp&gt',$p, $find, $matches2);
				$find=str_replace('&ltq&gt',$q, $find, $matches2);
				$find=str_replace('&ltr&gt',$r, $find, $matches2);
				$find=str_replace('&lts&gt',$s, $find, $matches2);
				$find=str_replace('&ltt&gt',$t, $find, $matches2);
				$find=str_replace('&ltu&gt',$u, $find, $matches2);
				$find=str_replace('&ltv&gt',$v, $find, $matches2);
				$find=str_replace('&ltw&gt',$w, $find, $matches2);
				$find=str_replace('&ltx&gt',$x, $find, $matches2);
				$find=str_replace('&lty&gt',$y, $find, $matches2);
				$find=str_replace('&ltx&gt',$z, $find, $matches2);
# 				print( "<h3>BUGS_460 j=$j id=$id p=$p find=$find</h3>\n") ;
				$k=$j+1;
				$htmout .= "<tr>";
				$htmout .= "<td>$k</td>";
				$htmout .= "<td width=100>";
				$htmout .= "<a href=/ko.php?todo=$id target=_blank>\n";
				$htmout .= "<img src=/imgs/btn/koeye.png height=25>";
				$htmout .= "</a>";
				$htmout .= "</td>\n";
				$htmout .= "<td width=125><b>$id</b></td>";
				$htmout .= "<td width=470>$find</td>";
				$htmout .= "</tr>";
				}
			$htmout .= "	</table>";
			$htmout .= "<hr color=goldenrod>\n";
			$htmout .= "	</body>\n";
			$htmout .= "	</html>\n";
			if( $fmt == "list" ) {	print( $list ); }
			else { 			print( $htmout ); }
			exit;
			}

		if( isset( $_REQUEST['todo'] )) { 
			$todo=$_REQUEST['todo']; 
			}


		if( $todo == "ko_coffeeshop" ) {
			$output=ko_coffeeshop('');	
			header('Content-type: text/plain');
			print( $output );
			}


		if( $todo == "ko_coffeeshop_psv" ) {
			$psvfil="ko_coffeeshop.psv";
			$fmt="psv";
			$options=array($psvfil,$fmt);
			if( file_exists( $psvfil )) {
				$psv=psv_ko_coffeeshop($options);
				}
			else {
				$psv="ERR_2011 NOTFOUND psvfil=$psvfil fmt=$fmt";
				}
			print($psv);
			exit;
			}

		if( $todo == "ko_coffeeshop_csv" ) {
			$csvfil="ko_coffeeshop.csv";
			$fmt="csv";
			$options=array($csvfil,$fmt);
			if( file_exists( $csvfil )) {
				$csv=csv_ko_coffeeshop($options);
				}
			else {
				$psv="ERR_2011 NOTFOUND csvfil=$csvfil fmt=$fmt";
				}
			print($psv);
			exit;
			}

		if( $todo == "ko_media_psv" ) {
			$psvfil="ko_media.psv";
			$fmt="psv";
			$options=array($psvfil,$fmt);
			if( file_exists( $psvfil )) {
				$psv=psv_ko_media($options);
				}
			else {
				$psv="ERR_2021 NOTFOUND psvfil=$psvfil fmt=$fmt";
				}
			print($psv);
			exit;
			}
		if( $todo == "ko_coffeeshop_sql3" ) {
			$db3fil="ko.db3";
			$fmt="html";
			$options=array($db3fil,$fmt);
			$sqlout=sql3_ko_coffeeshop($options);
			print_r($sqlout);
			exit;
			}
		if( $todo == "sql3_ko_media" ) {
			$db3fil="ko.db3";
			$fmt="html";
			$options=array($db3fil,$fmt);
			$sqlout=sql3_ko_media($options);
			print($sqlout);
			exit;
			}




		$min=1; $max=3;	
		if( $todo == "ko" ) {
			$id=$todo;
			$min=0;$max=0;
			$min=1; $max=count(explode(" ",$idfinds_ko))-1;
			$random=random_int($min,$max);
			$todo=explode(" ",$idfinds_ko)[$random];
			}

		for( $j=0; $j<count($ids); $j++) {
			$line=$ids[$j];
			$id=explode("|",$line)[0];
#			print( "<h1>BUGS_871 j=$j id=$id line=$line todo=$todo</h1><br>\n" );
			if( $id === "" ) { continue; }
			if( $id != $todo ) {continue; }
#			print( "<h1>BUGS_873 MATCH j=$j id=$id= todo=$todo= line=$line todo=$todo</h1><br>\n" );

#			$find=explode("|",$line)[1];
			$find=str_replace("$id|","", $line);
#			print( "<h1>BUGS_675 id=$id find=$find line=$line</h1>" );

			$list="";
			$url=$find;

			$url = urlcheck($url);
		

#			print( "<h1>MSG_661 query_string=$query_string name=name  id=$id find=$find</h1><br>\n" );
			$find=str_replace_all($find);

#			$find=str_replace("&ltn&gt", "$name", $find );
#			print( "<h1>MSG_900 j=$j k=$k todo=$todo id=$id find=$find</h1><br>\n" );
			$out = "";
#			print( "<h1>BUGS_800 find=$find</h1>" );


# pqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpq
			exec( $find, $out, $err );
# bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd

			$outcnt=count($out);
#			print( "<h1>BUGS_900 fmt=$fmt out=".$out[2]."</h1>" );
			$psv="";
			$csv="";
			$txt="";
			$json="";
			$json.="{\"todo\": [\n";

			$dttm=date('Ymd_His');
			$htmout = "";
			$htmout .= "<html>\n";
			$htmout .= "<head>\n";
			$htmout .= "	<title>todo=$todo $dttm</title>\n";
$icon="./favicon_ko64.ico";
#			$htmout .= "<link rel=\"icon\" href=\"$icon\" type=\"image/icon\">\n";
$icon_png="koeye.png";
$icon_png="ko.png";
$icon_gif="koeye_handhither.gif";
#			$htmout .= "<link rel=\"icon\" href=\"$icon_png\" type=\"image/png\">\n";
			$htmout .= "<link rel=\"icon\" href=\"$icon_gif\" type=\"image/gif\">\n";

			$htmout .= "	</head>\n";
			$htmout .= "<body bgcolor=linen>\n";
			$htmout .= "	<div id=div_todo_$todo>\n";
			$htmout .= "	<h1>div_todo_$todo</h1>\n";
			$htmout .= "	<hr color=goldenrod>\n";

			for( $j=0; $j< count($out); $j++ ) {
				$line= $out[$j];
				$txt .= $line."\n";
				$psv .= $line."|\n";
				$csv .= $line.",";
				$json .= "{ \"j\":\"".$j."\", \"line\":\"".$line."\" },\n";	
				}

			$psv .= preg_replace("/|$/", "", $psv );
			$csv .= preg_replace("/|/", ",", $psv );
//			$json .= preg_replace("/},$/", "}", $json );
//			$json .= str_lreplace( ",$", "", $json );
			$j=""; $line="";
			$json .= "{ \"j\":\"".$j."\", \"line\":\"".$line."\" }\n";	
//			$json .= str_replace_last( ",", "" , $json );
			$json .="]}\n\n"; 

			$fmt="";
			if( isset( $_REQUEST['fmt'] )) {$fmt=$_REQUEST['fmt']; }
//			print( "<h1>BUGS_925 fmt=$fmt</h1>\n" );
			if( $fmt == "txt" ) { 
				header('Content-type: text/plain');
				print($txt); exit(); 
				}
			if( $fmt == "list" ) { print($txt);exit(); }
			if( $fmt == "psv" ) { print($psv); exit(); }
			if( $fmt == "csv" ) { 
				header('Content-type: text/csv');
				print($csv); exit(); 
				}
			if( $fmt == "json" ) { 
				header('Content-type: application/json');
				print( $json );
				exit();
				}

			$k=1;
			$line=$out[$k];
#			print( "<h1>MSG_691 k=$k line=$line</h1>" );	
#			print( "<h1>MSG_700 k=$k id=$id find=$find outcnt=$outcnt out0=".$out[0]." </h1><br>\n" );
#			print( "<h2>MSG_704 out4=".$out[4]."</h2>" );
#			print( "<h2>MSG_705 out5=".$out[5]."</h2>" );
#			print( "<h2>MSG_706 out6=".$out[6]."</h2>" );
#			print( "<h2>MSG_707 out7=".$out[7]."</h2>" );

			$htmout_table = "";
			$htmout_table .= "<table id=table_media>\n";
			$htmout_table .= "<tr>";
			$htmout_table .= "<td>j</td>";
			$htmout_table .= "<td>k</td>";
			$htmout_table .= "<td>tot</td>";
			$htmout_table .= "<td>link</td>";
			$htmout_table .= "<td>group</td>";
			$htmout_table .= "<td width=400>base bugs_700</td>";
			$htmout_table .= "</tr>";
#			$htmout_table .= "</table>";

			$txt = "";
			$psv = "";
			$csv = "";
			$sql = "";
			$sql .= "insert into table files (\n";
			$json = "";
			$json .= "{\n";

#			print( "<h1>BUGS_710 skiplist $htmout_table</table></h1>" );
			$out_skiplist = skiplist($out);
			$out=$out_skiplist;

			$j=0; $k=0;
			for( $j=0; $j<count($out); $j++ ) {
				$k=$j+1;
				$line = $out[$j]."\n";
				$list .= $line."\n";
				$pathfile = $line;
#				print( "<h1>BUGS_950 j=$j k=$k line=$line</h1>" );

				
#				$extension = pathinfo($pathfile, PATHINFO_EXTENSION);
				$dirname=dirname($pathfile);
				$group = str_replace("/","_", $dirname );
				$temp= explode('.',$pathfile);
				$ext = end($temp);
				$base=basename($pathfile,".$ext");
	
				$link  = htmout_link($pathfile,'');
#				$url=$pathfile;
#				$tn="/imgs/btn/koeye.png";

				$txt .= "$line\n";
				$psv .= "$j|$k|$outcnt|$pathfile|$link|$group|$base\n";
				$csv .= "$j,$k,$outcnt,$pathfile,$link,$group,$base\n";

				$sql .= "( 'j','k','outcnt',pathfile,'link','group','base' ),";

				
				$json .= "{\n";
				$json .= "'j':'$k', ";
				$json .= " 'k':'$k', ";
				$json .= "'outcnt':'$outcnt', ";
				$json .= "'pathfile':'$pathfile', ";
				$json .= "'link':'$link', ";
				$json .= "'group':'$group', ";
				$json .= "'base':'$base' ";
				$json .= "},\n";


				$htmout_table .= "<tr>";
				$htmout_table .= "<td>$j</td>";
				$htmout_table .= "<td>$k</td>";
				$htmout_table .= "<td>$outcnt</td>";
				$htmout_table .= "<td>".htmout_link($pathfile,'')."</td>";
#				$htmout_table .= "<td><img src=/imgs/btn/koeye_handhither.gif height=100></td>";
				$htmout_table .= "<td>$group</td>";
				$htmout_table .= "<td>$base</td>";
				$htmout_table .= "</tr>\n";
#				print( "<h3>BUGS_740 j=$j k=$k outcnt=$outcnt group=$group base=$base ext=$ext </h3>" );
				$htmout_link=htmout_link($pathfile,'');
#				print( "<h3>BUGS_710 j=$j k=$k pathfile=<$pathfile></h3>" );
#				print( "<h3>BUGS_711 j=$j k=$k  htmout_link=<$htmout_link></h3>" );
				}
	
			
			$json .= "	}\n";
			$matches = "";
			$json = preg_replace( "/,}$/", "}", $matches );
			$sql = preg_replace( "/,\)$/", ")", $matches );
			$psv = preg_replace( "/|$/", "", $matches );
			$csv = preg_replace( "/,$/", "", $matches );

			$htmout_table .= "	</table>";
			$htmout .= "<hr color=goldenrod>";
			$htmout .= $htmout_table;
			$htmout .= "<hr color=goldenrod>";
			$htmout .= "	</body>\n";
			$htmout .= "	</html>\n";

		
			$fmt="";
			if( isset($_REQUEST['fmt'])) { $fmt=$_REQUEST['fmt']; }
#			print( "<h1>BUGS_1000 find=$find fmt=$fmt</h1>" );
			if( $fmt == "txt" ) { print( $txt ); exit; }
			if( $fmt == "psv" ) { print( $psv ); exit; }
			if( $fmt == "csv" ) { print( $csv ); exit; }
			if( $fmt == "sql" ) { print( $sql ); exit; }
			if( $fmt == "json" ) { 
   				header('Content-type: application/json');
				print( $json ); 
				exit; 
				}
			if( $fmt == "html" ) { print( $htmout ); exit; }
			print($htmout); exit;
			print( "<h3>BUGS_1021 j=$j k=$k outcnt=$outcnt group=$group base=$base ext=$ext </h3>" );
			}
		$outcnt="";
		$group="";
		$base="";
		$ext="";
#		print( "<h3>BUGS_1022 j=$j k=$k outcnt=$outcnt group=$group base=$base ext=$ext </h3>" );
		return($htmout);
		exit;
		}

	if( isset($_REQUEST['ls-lat']) || isset($_REQUEST['ls'] )) {
		if( isset($_REQUEST['ls-lat'])) {
			$request_path=$_REQUEST['ls-lat'];
			}
		else {
			$request_path=$_REQUEST['ls'];
			}
#		print( "<h1>BUGS_183 request_path=$request_path</h1><br>\n" );
		if( $request_path === "" ) { exit; }
		$pathparts = pathinfo($request_path);
		$dirname=$pathparts['dirname'];
		$basename=$pathparts['basename'];
		$ext="";
		if( isset($pathparts['extension'])) {
			$ext=$pathparts['extension'];
			}

		$path=$dirname;
		if( ! is_dir($path)) {
			print( "\n<h1>ERR_122 LSLAT NOTFOUND path=$path</h1><br>\n");
			exit;
			}
		$lscmd="ls $request_path";
		if( isset($_SERVER['ls-lat'])) {
			$lscmd="ls -lat $request_path";
			}

#		print( "\n<h1>MSG_199 LSLAT lscmd=$lscmd</h1><br>\n");

		$htmout = "";
		exec( $lscmd, $out, $err );
		for( $j=0; $j<count($out); $j++ ) {
			$htmout .= $out[$j]."\n";
			}
		print( $htmout );
		exit;
		}


	if( isset($_REQUEST['find'])) {
# 1		?find=/fb/zc/pages/*.jpg
# 4		?find=find $path -name $names
# 6		?find=find $path -type d -name $names
# 6		?find=find $path -maxdepth 2 -name $names
# 8		?find=find $path -type d -maxdepth 2 -name $names
# 4		?find=find $path -type d
# 6		?find=find $path -type d -maxdepth $maxdepth
		$request_find=""; $findargs=""; $findargs_len=0;
		$request_find=$_REQUEST['find'];
		$findargs = explode( " ", $request_find );
		$findargs_len=count($findargs);
		for( $j=0; $j<count($findargs); $j++ ) {
			$findargs[$j]=str_replace("\"","",$findargs[$j]);
			$findargs[$j]=str_replace("'","",$findargs[$j]);
			}

#		print( "<h1>BUGS_140 findargs_len=$findargs_len request_find=$request_find</h1><br>\n" );
		$path="";
		if( count($findargs) === 1 ) { 
//			print( "<h1>BUGS_141 findargs_len=$findargs_len request_find=$request_find</h1><br>\n" );
//			$pathparts = pathinfo($request_find);
//			$dirname=$pathparts['dirname'];
//			$basename=$pathparts['basename'];
//			$ext="";
//			if( isset($pathparts['extension'])) {
//				$ext=$pathparts['extension'];
//				}
//			print( "<h1>BUGS_161 dirname=$dirname basename=$basename request_find=$request_find</h1><br>\n" );
//			$path=$dirname;
//			$name=$basename;

			$path="fb";
			$type="d";
			$maxdepth="1";
			$name="??";

			if( ! is_dir($path)) { 
				print( "<h1>ERR_163 NOTFOUND path=$path</h1><br>\n" );
				exit; 
				}	
			$find="find $path -type $type -maxdepth $maxdepth -name \"$name\"";
//			print( "<h1>MSG_164 FOUND path=$path name=$name</h1><br>\n" );
//			print( "<h1>MSG_165 FOUND find=$find </h1><br>\n" );
			exec( $find, $out, $err );
			$htmout="";
			for( $j=0; $j<count($out); $j++ ) {
				$htmout .= $out[$j]."\n";
				}
//			print( "<h1>MSG_161 find=$find htmout=$htmout</h1><br>\n" );
			print( $htmout );
			exit;
			}

#		print( "<h1>BUGS_150 path=$path request_find=$request_find</h1><br>\n" );
		$path="";
		$maxdepth="";
		$type="";
		$names="";

		$query_string="";
		if( isset( $_SERVER['QUERY_STRING'])) {
			$query_string=$_SERVER['QUERY_STRING'];
			}
#		print( "<h1>BUGS_300 findargs_len=$findargs_len request_find=$request_find query_string=$query_string</h1><br>\n" );


		if( $findargs_len === 2 ) { 
			print( "<h1>BUGS_142 findargs_len=$findargs_len request_find=$request_find</h1><br>\n" );
			$path=$findargs[1];
			$path=str_replace("\"","",$path );
			if( ! is_dir($path)) {
				print( "<h1>ERR_143 NOTFOUND path=$path=- request_find=$request_find</h1><br>\n" );
				exit;
				}
			$path="fb"; $type="d"; $maxdepth="1"; $names="??";
			$find="find $path -type $type -maxdepth $maxdepth -name \"$names\"";
			exec($find,$out,$err);
			print( "<h1>BUGS_149 find=$find</h1><br>\n" );
			$htmout="";
			for( $j=0; $j<count($out); $j++ ) {
				$htmout .= $out[$j]."\n";
				}
			print( $htmout );
//			phpinfo();
//			$request_find=str_replace("%20"," ",$request_find);
			exit;
			}

		if( $findargs_len === 3 ) { 
			print( "<h1>BUGS_303 findargs_len=$findargs_len $request_find=$request_find query_string=$query_string</h1><br>\n" );
			exit;
			}

//		if( $findargs_len === 4 ) { 
//			print( "<h1>BUGS_304 findargs_len=$findargs_len $request_find=$request_find query_string=$query_string</h1><br>\n" );
//			}




		if( $findargs_len === 1 ) { 
			$path="fb";
			$type="d";
			$maxdepth="1";
			$names="??";
			$find="find $path -type $type -maxdepth $maxdepth -name \"$names\"";
			exec( $find, $out, $err );
			print( "BUGS_311 find=$find<br>\n" );
			$htmout="";
			for( $j=0; $j<count($out); $j++ ) {
				$htmout .= $out[$j]."\n";
				}
			print( $htmout );
//			print_r($out);
			exit; 
			}


//		if( $findargs_len === 2 ) { exit; }
//		if( $findargs_len === 3 ) { exit; }
//		if( $findargs_len === 5 ) { exit; }
//		if( $findargs_len === 7 ) { exit; }
		if( $findargs_len > 8 ) { exit; }


//		print( "<h1>BUGS_350 findargs_len=$findargs_len query_string=$query_string</h1>\n" );
		
		if( $findargs_len === 1 ) {
#			if( is_file($request_find)) {
#				print( "<h1>BUGS_101 is_file FOUND request_find=$request_find</h1>");
#				}
#			else {
#				print( "<h1>BUGS_102 is_file NOTFOUND request_find=$request_find</h1>");
#				}

		if( $request_find != "" ) {
			$pathparts = pathinfo($request_find);
			$dirname=$pathparts['dirname'];
			$basename=$pathparts['basename'];
			$ext="";
			if( isset($pathparts['extension'])) {
				$ext=$pathparts['extension'];
				}


			$path=$dirname;
			$names=$basename;
			$type="f";
			if( $ext === "" ) {
				$path=$request_find;
				$type="";
				$names="";
				}		
#			print( "BUGS_150 dirname=$dirname names=$names ext=$ext<br>\n" );
#			if( $basename === "" ) { $names=""; }
			}
		}

# ?find=find $path -name $names
# ?find=find $path -type $type
		if( $findargs_len === 4 ) {
			$path = $findargs[1];


		
			if ($findargs[2] === "-type" ) { $type=$findargs[3]; }
			if ($findargs[2] === "-maxdepth" ) { $maxdepth=$findargs[3]; }
			if ($findargs[2] === "-name" ) { $names=$findargs[3]; }
#			print( "<h1>BUGS_240 findargs3=".$findargs[3]." request_find=$request_find</h1><br>\n") ;
			if( ! is_dir($path)) { 
				print( "<h1>BUGS_241 NOTFOUND path=$path  request_find=$request_find</h1><br>\n") ;
				exit;
				}
#			print( "<h1>BUGS_242 FOUND path=$path request_find=$request_find</h1><br>\n") ;
		
			$find="find $path";
			if( $type != "" ) { $find .= " -type $type"; }
			if( $maxdepth != "" ) { $find .= " -maxdepth $maxdepth"; }
			if( $names != "" ) { $find .= " -name \"$names\""; }

#			print( "<h1>BUGS_243 type=$type find=$find request_find=$request_find</h1><br>\n") ;
			$htmout="";
			exec($find, $out, $err );
			for( $j=0; $j<count($out); $j++ ) {
				$htmout .= $out[$j]."\n";
				}
#			print( "<h1>BUGS_249 find=$find htmout=$htmout</h1><br>\n") ;
			print( $htmout );
			exit;
			}

# ?find=find $path -type f -name $names
# ?find=find $path -maxdepth $maxdepth -name $names
# ?find=find $path -type d -maxdepth 1
		if( $findargs_len === 6 ) {
#			print( "<h1>BUGS_601 request_find=$request_find</h1><br>\n" );
			$path="";
			$type="";
			$maxdepth="";
			$names="";

			$path = $findargs[1];
			if( $findargs[2] === "-type" ) { $type=$findargs[3]; }
			if( $findargs[2] === "-maxdepth" ) { $maxdepth=$findargs[3]; }
			if( $findargs[2] === "-name" ) { $names=$findargs[3]; }
			if( $findargs[4] === "-type" ) { $type=$findargs[5]; }
			if( $findargs[4] === "-maxdepth" ) { $maxdepth=$findargs[5]; }
			if( $findargs[4] === "-name" ) { $names=$findargs[5]; }

			$find="find $path";
			if( $type != "" ) { $find .= " -type $type"; }
			if( $maxdepth != "" ) { $find .= " -maxdepth $maxdepth"; }
			if( $names != "" ) { $find .= " -name \"$names\""; }
			$htmout="";
			exec( $find, $out, $err );
			for($j=0; $j<count($out); $j++ ) {
				$htmout .= $out[$j]."\n";
				}
			print( $htmout );
			exit;
			}

# ?find=find $path -type f -maxdepth $maxdepth -name $names
		if( $findargs_len === 8 ) {
			$path = $findargs[1];
			if( ! is_dir($path)) { print( "<h1>NOTFOUND path=$path</h1><br>\n" ); exit; }

			$find = "find $path";
			if( $findargs[2] === "-type" ) { $type=$findargs[3]; } 
			if( $findargs[2] === "-maxdepth" ) { $maxdepth=$findargs[3]; }
			if( $findargs[2] === "-name" ) { $names=$findargs[3]; }

			if( $findargs[4] === "-type" ) { $type=$findargs[5]; } 
			if( $findargs[4] === "-maxdepth" ) { $maxdepth=$findargs[5]; }
			if( $findargs[4] === "-name" ) { $names=$findargs[5]; }

			if( $findargs[6] === "-type" ) { $type=$findargs[7]; } 
			if( $findargs[6] === "-maxdepth" ) { $maxdepth=$findargs[7]; }
			if( $findargs[6] === "-name" ) { $names=$findargs[7]; }

			if( $type != "" ) { $find .= " -type $type"; }
			if( $maxdepth != "" ) { $find .= " -maxdepth $maxdepth"; }
			if( $names != "" ) { $find .= " -name \"$names\""; }

			$htmout="";
#			print( "<h1>BUGS_800 find=$find request_find=$request_find</h1><br>\n" );
			exec( $find, $out, $err );
			for( $j=0; $j<count($out); $j++ ) {
				$htmout .= $out[$j]."\n";
				}
			print( $htmout );
			exit;
			}


		$find="find $path";
		if( $type != "" ) { $find .= " -type $type"; }
		if( $maxdepth != "" ) { $find .= " -maxdepth $maxdepth"; }
		if( $names != "" ) { 
			$names=str_replace("\"","",$names);
			$names=str_replace("'","",$names);
			$find .= " -name \"$names\""; 
			}
//		$find="find $path -type $type -maxdepth $maxdepth -name \"$names\"";
//		if( $names === "" ) {
//			$find="find $path -type $type -maxdepth $maxdepth";
//			}
#		print( "<h1>BUGS_101 find=$find</h1>\n");
		$htmout="";


$types="http html htm php mp4 mp3 jps png gif";
 		$l=0;
 		foreach( $types as $types ) {
 			if( preg_match( "/$type/", $find, $matches )) {
 				print( "MSG_680 l=$l type=$type find=$find<br>\n");
 				window.location($find);
 				exit;
 				}
 			$l++;
 			}
		$url=$find; 
# 		print( "MSG_681 l=$l type=$type url=$url<br>\n");
 		if( preg_match( "/.http/", $url, $matches )) { window.open($url); exit; }
# 		print( "MSG_682 l=$l type=$type url=$url<br>\n");
 		if( preg_match( "/.html/", $url, $matches )) { window.open($url); exit; }
# 		print( "MSG_683 l=$l type=$type url=$url<br>\n");
 		if( preg_match( "/.htm/", $url, $matches )) { window.open($url); exit; }
# 		print( "MSG_684 l=$l type=$type url=$url<br>\n");
 		if( preg_match( "/.php/", $url, $matches )) { window.open($url); exit; }
# 		print( "MSG_685 l=$l type=$type url=$url<br>\n");
 		if( preg_match( "/.mp4/", $url, $matches )) { window.open($url); exit; }
# 		print( "MSG_686 l=$l type=$type url=$url<br>\n");
 		if( preg_match( "/.mp3/", $url, $matches )) { window.open($url); exit; }
# 		print( "MSG_687 l=$l type=$type url=$url<br>\n");
 		if( preg_match( "/.gif/", $url, $matches )) { window.open($url); exit; }
 		if( preg_match( "/.jpg/", $url, $matches )) { window.open($url); exit; }
 		if( preg_match( "/.png/", $url, $matches )) { window.open($url); exit; }
 			
#//		$path="fb";
#//		$find="find $path -type f -maxdepth 1 -name \"*.*\"";
#		if( is_dir($path)) {
#//			print( "<h1>MSG_271 find=$find</h1>\n" );
#			exec( $find, $out, $err );
#
#//			print( "<h1>MSG_272 OUT find=$find</h1>\n" );
#			$query_string="";
#			if( isset($_SERVER['QUERY_STRING'] )) {
#				$query_string=$_SERVER['QUERY_STRING'];
#				}
#//			print( "<h1>MSG_273 OUT query_string=$query_string</h1>\n" );
#//			print_r($out);
#			print_r($err);
#			$outlen=count($out);
#			$htmout="";
#			$htmout .= "<hr color=goldenrod>\n";
#			$list="";
#			for( $j=0; $j<$outlen; $j++ ) {
#				$htmout .= $out[$j]."<br>\n";
#				$list .= $out[$j]."\n";
#				}
#			$htmout .= "<hr color=goldenrod>\n";
##			print( "<h1>MSG_104 ERR</h1>\n" );
##			print_r($err);
#			$process = proc_open( $cmd, $descriptorspec, $pipes, $cwd_process );
#			print( "<h1>MSG_250 LS DONE find=$find outlen=$outlen</h1>" );
#			}
#		else {
#			print( "<h1>ERR_500 NOTFOUND path=$path request_find=$request_find query_string=$query_string</h1>\n" );
#			exit();
#			}
		
		print( "<h1>MSG_900 LS DONE find=$find</h1>\n" );
		if( $fmt == "list" ) { print ( $list ); return($list); }
		if( $fmt == "list" ) { print ( $list ); return($list); }

		print( $list );
		return( $list );
#		exit;
#		}


//		$path="fb";
//		$find="find $path -type f -maxdepth 1 -name \"*.*\"";
		if( is_dir($path)) {
//			print( "<h1>MSG_271 find=$find</h1>\n" );
			exec( $find, $out, $err );

//			print( "<h1>MSG_272 OUT find=$find</h1>\n" );
			$query_string="";
			if( isset($_SERVER['QUERY_STRING'] )) {
				$query_string=$_SERVER['QUERY_STRING'];
				}
//			print( "<h1>MSG_273 OUT query_string=$query_string</h1>\n" );
//			print_r($out);
			print_r($err);
			$outlen=count($out);
			$htmout="";
			$htmout .= "<hr color=goldenrod>\n";
			$list="";
			for( $j=0; $j<$outlen; $j++ ) {
				$htmout .= $out[$j]."<br>\n";
				$list .= $out[$j]."\n";
				}
			$htmout .= "<hr color=goldenrod>\n";
#			print( "<h1>MSG_104 ERR</h1>\n" );
#			print_r($err);
#			$process = proc_open( $cmd, $descriptorspec, $pipes, $cwd_process );
			print( "<h1>MSG_250 LS DONE find=$find outlen=$outlen</h1>" );
			}
		else {
			print( "<h1>ERR_500 NOTFOUND path=$path request_find=$request_find query_string=$query_string</h1>\n" );
			exit();
			}
		
#		print( "<h1>MSG_109 LS DONE find=$find</h1>\n" );
#		print( $htmout );	
		print( $list );
		exit;
		}



	if( isset($_REQUEST['kolog'])) {
		$db3file="ko.db3"; $tblname="kologs";
		$todo=$_REQUEST['kolog'];
		if( $todo == "" ) {$htmout=kolog($db3file, $tblname, $args); print( $htmout ); exit; }
		if( $todo == "new" ) {$htmout=kolog_new($db3file, $tblname, $args); print( $htmout ); exit; }
		if( $todo == "add" ) {$htmout=kolog_add($db3file, $tblname, $args); print( $htmout ); exit; }
		if( $todo == "del" ) {$htmout=kolog_del($db3file, $tblname, $args); print( $htmout ); exit; }
		if( $todo == "upd" ) {$htmout=kolog_upd($db3file, $tblname, $args); print( $htmout ); exit; }
		if( $todo == "sel" ) {$htmout=kolog_sel($db3file, $tblname, $args); print( $htmout ); exit; }
		if( $todo == "create" ) {$htmout=kolog_create($db3file, $tblname, $args); print( $htmout ); exit; }
		if( $todo == "form" ) {$htmout=kolog_form($db3file, $tblname, $args); print( $htmout ); exit; }
		if( $todo == "submit" ) {$htmout=kolog_submit($db3file, $tblname, $args); print( $htmout ); exit; }
		if( $todo == "list" ) {$htmout=kolog_list($db3file, $tblname, $args); print( $htmout ); exit; }
		if( $todo == "bugs" ) {$htmout=kolog_bugs($db3file, $tblname, $args); print( $htmout ); exit; }
		if( $todo == "logs" ) {$htmout=kologs($db3file, $tblname, $args); print( $htmout ); exit; }
		exit;
		}

	if( isset($_REQUEST['id'])) {
		$id=$_REQUEST['id'];

		if( $id == "bookmarkusb" ) {
			$htmout=bookmarkusb();
#			$htmout=bookmarkusb_form();
			exit;
			}
		if( $id == "bookmarkusb_list" ) {
			$htmout=bookmarkusb_list();
			exit;
			}
		if( $id == "bookmarkusb_select" ) {
			$htmout=bookmarkusb_select();
			exit;
			}
		if( $id == "bookmarkusb_form" ) {
			$htmout=bookmarkusb_form();
			exit;
			}
#		print( "<h1>BUGS_100c REQUEST_id id=$id REQ=".$_REQUEST['id']."</h1><br>" );
		}

#	startup_ls();
#	main_ka1();
#	main_tl();

	$htmlfile="index.html";
	$htmout=read_htmlfile($htmlfile);
	print( $htmout );
	exit;
	startup();
	exit;
	}


function str_replace_last( $search , $replace , $str ) {
	if( ( $pos = strrpos( $str , $search ) ) !== false ) {
	        $search_length  = strlen( $search );
		$str    = substr_replace( $str , $replace , $pos , $search_length );
		}
    return $str;
}

function isOdd($n) {
	if($n % 2 == 0 ) {return(0); } else { return(1); }
	}


function urlcheck($url) {	
	if( is_dir($url)) { window.location($url); exit; }
$urltypes = ".php .html .htm .mp3 .mp4 .jpg .pdf .txt";
	if( preg_match("/http/", $url, $matches )) { window.location($url); exit; }
#	print( "<h1>MSG_650 query_string=$query_string id=$id find=$find</h1><br>\n" );

#	$name="*";
	foreach( explode(" ", $urltypes) as $urltype ) {
		if( preg_match("/$urltype$/", $url, $matches )) {
			$htmout_link = "";
#			$htmout_link .= "<a href=$url target=_blank>";
#			$htmout_link .= "<img src=/imgs/btn/koeye.png height=20>";
#			$htmout_link .= "</a><br>\n";
#			$htmout_link .= "<img src=/imgs/btn/koeye.png height=20 onclick=\"window.location('$url');return false;\" >";
			print( "<h2>MSG_651 MATCH id=$id url=$url urltype=$urltype </h2><br>\n" );
			print( $htmout_link );
#			if( is_file($url)) { window.location($url); exit; }
			}
		}
	return($url);
	}


function skiplist($out) {
#$fbid1_skiplist="
#fb/chap01
#fb/chap02
#fb/chap03
#fb/imgs
#fb/i
#fb/extras
#";
#	for( $k=0; $k<count($out); $k++ ) {
#		if( $id === "fbd1" ) {
#			$skiplist=explode("\n",$fbid1_skiplist );
#			$skiplist_len=count($skiplist);
#			$fbid=$out[$k];
#			$tn=$fbid."/pages/tn/tn_1.png";
#
#//	print( "<h1>BUGS_240 $k fbid=$fbid tn=$tn</h1>\n" );
#			if(! is_file($tn)) { continue; }
#			for($i=0; $i<$skiplist_len; $i++ ) {
#				if( $skiplist[$i] === "" ) { continue; }
#				if( $fbid === $skiplist[$i] ) { continue; }
#				}
#			}
#		}

	return($out);
	}

function htmout_head($args) {
	$htmout = "";
	$htmout .= "<html><head><title>ko.php 20211126_2030 $args</title>\n";
	$htmout .= "	</head>\n";
	$htmout .= "<body bgcolor=\"linen\" onload=\"startup($args); return false;\">\n";
	return($htmout);
	}

function htmout_load($htmfil) {
	$htmout = "";
        $f = fopen( $htmfil, "r" ) or die("<h1>ERR_100 OPEN htmfil=$htmfil</h1>" );
        $htmout .= fread($f, filesize($htmfil));
        fclose($f);
	return($htmout);
	}

function htmout_tail($args) {
	$htmout = "";
	$htmout .= "	</body>\n";
	$htmout .= "	</html>\n";
	return( $htmout );
	}


function htmout_link($pathfile,$tn) {
 	$htmout = "";
 	if( $pathfile == "" ) { return(""); }
 	if( $tn == "" ) { $tn="/imgs/btn/koeye.png"; }
 
  	if( preg_match("/.pdf/", $pathfile, $matches )) {
		$pathfile=str_replace("\n","",$pathfile );

 		$tn="/imgs/btn/btn_pdf1.png";
#  		$tn="/imgs/btn/koeye_pdf.png";
#  		$htmout .= "<a href=\"/pdf/web/viewer.html?file=/$pathfile\" target=_blank>";
#  		$htmout .= "<a href=\"/pdf/web/viewer.html?file=/$pathfile\" target=_blankk >";
#		$htmout .= "<a href=/pdf/web/viewer.html?file=/$pathfile target=_blank>";

		$htmout_pdf = "";
		$htmout_pdf .= "<a href=/pdf/web/viewer.html?file=/$pathfile>";
#  		$htmout_pdf .= "<img src=$tn alt=$tn height=50>";
		$htmout_pdf .= "<img src=/imgs/btn/koeye_pdf.png height=60>";
  		$htmout_pdf .= "</a>\n";
#		print( "<h1>BUGS_1320 htmout_pdf=$htmout_pdf</h1>" );		

		$query_string="";
		if( isset( $_SERVER['QUERY_STRING'] )) {
			$query_string = $_SERVER['QUERY_STRING'];
			}
		$htmout .= "<h1>BUGS_1610   pathfile=$pathfile query_string=$query_string</h1>";
#		$htmout = "<h1>BUGS BUGS BUGS_1325</h1>";
#		print( "<h1>BUGS_1324 htmout pathfile >>>>$pathfile<<<<</h1>" );
#		print( "<h1>BUGS_1325 htmout htmout_pdf >>>>$htmout_pdf<<<</h1>" );
#		print( "<h1>BUGS_1326 htmout query_string >>>>$query_string<<<<h1>" );
		return( $htmout_pdf );
  		}
  
  	if( preg_match("/.mp3/", $pathfile, $matches )) {
  		$tn="/imgs/btn/koeye_mp3.png";
  		$htmout .= "<a href=\"$pathfile\" target=_blank>";
  		$htmout .= "	<img src=$tn alt=$tn height=50>\n";
  		$htmout .= "	</a>\n";
  		}
  
  	if( preg_match("/.mp4/", $pathfile, $matches )) {
  		$tn="/imgs/btn/koeye_mp4.png";
  		$htmout .= "<a href=\"$pathfile\" target=_blank>";
  		$htmout .= "	<img src=$tn alt=$tn height=50>\n";
  		$htmout .= "	</a>\n";
  		}
  
  	if( preg_match("/.jpg/", $pathfile, $matches )) {
  		$basename=basename($pathfile);
  		$path=str_replace($basename,"",$pathfile );
  		$tn="$path/tn/tn_$basename";
  		$tn=str_replace(".jpg", ".png",$tn );
  		$htmout .= "<a href=\"$pathfile\" target=_blank>";
  		$htmout .= "	<img src=$tn alt=$tn height=50>\n";
  		$htmout .= "	</a>\n";
  		}
  
  	if( preg_match("/.txt/", $pathfile, $matches )) {
  		$tn="/imgs/btn/koeye_txt.png";
  		$htmout .= "<a href=\"$pathfile\" target=_blank>";
  		$htmout .= "	<img src=$tn alt=$tn height=50>\n";
  		$htmout .= "	</a>\n";
  		}
  
  	if( preg_match("/bitchute.com/", $pathfile, $matches )) {
		$line=$pathfile;
		$bcid="";
		$url="";
		if( count( explode("video/", $line)) > 0 ) {
			$bcid=explode("video/",$line)[1];
			}
#		print( "<h1>BUGS_1350 bcid=$bcid url=$url line=$line</h1>" );
# https://www.bitchute.com/video/gDceXFTxSDk9/
		$url="https://www.bitchute.com/video/$bcid";
		$htmout_bitchute = "";
		$htmout_bitchute .= "<a href=$url target=_blank>";
		$htmout_bitchute .= "<img src=/imgs/btn/koeye_youtube.png height=50>";
		$htmout_bitchute .= "</a>";
#		$htmout_bitchute .= "<br>";
#		$htmout_bitchute .= $url;
#		$htmout_bitchute .= "<br>";
#		$htmout_bitchute .= "<iframe src=https://www.bitchute.com/embed/$bcid/ width=100% height=100></iframe>";
#		$htmout_bitchute .= "<iframe src=https://www.bitchute.com/embed/yecefLsE44U/ width=100% height=300></iframe>";
#		$htmout_bitchute .= "iframe src=https://www.bitchute.com/embed/$bcid/ width=100% height=500"
		$htmout .= $htmout_bitchute;
		return($htmout);
		}

  	if( preg_match("/youtube.com/", $pathfile, $matches )) {
		$ytid="";
  		if( preg_match("/www.youtube.com\/embed\//", $pathfile, $matches )) {
  			$ytid=explode("embed/", $pathfile)[1];
  			}
  		else {
			$line=$pathfile;
			if( count(explode("=",$line)) > 0 ) {
				if( isset( explode("=", $pathfile)[1])) {
		  			$ytid=explode("=",$pathfile)[1];
					}
				}
			else {
	  			$ytid=$pathfile;
				}
			}

		$ytid = str_lreplace("\n","", $ytid );
		$label=explode("|",$pathfile)[0];
  		$tn="https://img.youtube.com/vi/$ytid/default.jpg";
# 		https://www.youtube.com/watch?v=BtccrKwRTEA
		$url="https://www.youtube.com/watch?v=$ytid";

#		print( "<h2>BUGS_1360 YOUTUBE  ytid=$ytid </h2>" );
#		print( "<h3>BUGS_1362 tn=$tn<h3>" );
#		print( "<h3>BUGS_1363 label=$label<h3>" );
#		print( "<h3>BUGS_1364 url=$url<h3>" );

  		$htmout .= "<a href=\"$url\" target=_blank>";
  		$htmout .= "	<img src=$tn alt=$tn height=50>\n";
  		$htmout .= "	</a>\n";

#		print( "<h1>BUGS_1381 YOUTUBE htmout=$htmout</h1>" );
#		print( "<h1>BUGS_1380 YOUTUBE pathfile=$pathfile</h1>" );
#		print( "<h1>BUGS_1381 YOUTUBE url=$url</h1>" );
#		print( "<h1>BUGS_1382 YOUTUBE label=$label</h1>" );
		return($htmout);
  		}

	if( $htmout == "" ) {
	 	$htmout .= "<a href=\"$pathfile\" target=_blank>";
	 	$htmout .= "	<img src=$tn height=50>\n";
	 	$htmout .= "	</a>\n";
		}
	return($htmout);
	}

function str_lreplace($search, $replace, $subject) {
	$pos = strpos($subject, $search);
	if($pos !== false) {
		$subject = substr_replace($subject, $replace, $pos, strlen($search));
		}

	return $subject;
	}



function htmout_list( $id, $list, $fmt ) {
  	print( "<h1>BUGS_1100 fmt=$fmt id=$id</h1>\n" );
# 	$fmt="json";
# 	if( $fmt == "" ) { $fmt="html"; }
#
  	$urlcols = "";
  	$pipecount=0;
  	$spacecount=0;
  	$j=0;$k=0; $filetest="";
  	$lines=explode("\n", $list );
  	$lines_len=count($lines);
  	print( "<h1>BUGS_1180 lines_len=$lines_len</h1><br>\n" );

#  check for url columns
# 	print( "<h1>BUGS_1085 j=$j k=$k filetest=$filetest utlcols=$urlcols</h1><br>\n" );


  	$lines = "";
  	$htmout = "";
  	$htmout .= "<div id=div_list_$id>\n";
  	$htmout .= "	<h1>div_list_$id</h1>\n";
  	$htmout .= "	<hr color=goldenrod>\n";
  	$htmout .= "	<table id=table_$id>\n";
  	$htmout .= "<tr>";

   	for( $k=0; $k<$delim_len; $k++ ) {
		$fld=explode("$delim", $line)[$k];
  		$htmout .= "<td>";
  		$htmout .= $fld;
  		$htmout .= "</td>";
  		}
  	$htmout .= "</tr>\n";
  	$htmout .= "	<tr><td>j</td><td>line</td></tr>\n";
  	$json = "";
  	$json = '{"list":[';
 	
  	$list_len=count(explode("\n",$list));
  	print( "<h1>BUGS_1100 fmt=$fmt list_len=$list_len </h1>\n");
#	print_r($list);
#	$fmt="html";
#	$delim="|";
	if( $fmt == "list" ) { 
		print( "<h1>BUGS_851 LIST j=$j list_len=$list_len line=$line </h1>\n");
		$lines .= "$line\n"; 
		print( "<h1>BUGS_852 LIST j=$j list_len=$list_len lines=$lines </h1>\n");
		}


	print( "BUGS_1140 fmt=$fmt json=$json" );
  	if( $fmt == "json" ) { 
  		$json .= "{";
		for( $k=0; $k<$delim_len; $k++ ) {
  			$fld=explode($delim,$line)[$k];
  			$json .= '"fld_$k":"$fld",';
			}	
  		$json .= "},";
  		}
# 	}
  	$json .= "]}";
 
   	$htmout .= "	</table>\n";
   	$htmout .= "	<hr color=goldenrod>\n";
   	$htmout .= "	</div>\n";


	alert( "<h1>BUGS_1800 ko.php htmout=$htmout</h1>" );
   
   	if( $fmt == "list" ) { return($lines); }
   	if( $fmt == "html" ) { return($htmout); }
   	if( $fmt == "json" ) { 
   		header('Content-type: application/json');
   		print( $json );
   		exit();
   		}
 
 	return($htmout);
	}





function str_replace_first($search, $replace, $subject) {
	$search = '/'.preg_quote($search, '/').'/';
	return preg_replace($search, $replace, $subject, 1);
	}

function str_replace_all($find) {
$a=""; $b=""; $c=""; $e=""; $f="";
$g=""; $h=""; $i=""; $j=""; $k="";
$l=""; $m=""; $n=""; $o=""; $p=""; 
$q=""; $r=""; $s=""; $t=""; $u="";
$v=""; $w=""; $x=""; $y=""; $z="";
$fmt=""; $lim=""; $db3=""; $tbl=""; $sel=""; $fld=""; $val="";
$matches="";
  
  
  		$a=""; if( isset($_REQUEST['a'] )) { $a=$_REQUEST['a']; }
  		$b=""; if( isset($_REQUEST['b'] )) { $b=$_REQUEST['b']; }
  		$c=""; if( isset($_REQUEST['c'] )) { $c=$_REQUEST['c']; }
  		$d=""; if( isset($_REQUEST['d'] )) { $d=$_REQUEST['d']; }
  		$e=""; if( isset($_REQUEST['e'] )) { $e=$_REQUEST['e']; }
  		$f=""; if( isset($_REQUEST['f'] )) { $f=$_REQUEST['f']; }
  		$g=""; if( isset($_REQUEST['g'] )) { $g=$_REQUEST['g']; }
  		$g=""; if( isset($_REQUEST['g'] )) { $g=$_REQUEST['g']; }
  		$h=""; if( isset($_REQUEST['h'] )) { $h=$_REQUEST['h']; }
  		$i=""; if( isset($_REQUEST['i'] )) { $i=$_REQUEST['i']; }
  		$j=""; if( isset($_REQUEST['j'] )) { $j=$_REQUEST['j']; }
  		$k=""; if( isset($_REQUEST['k'] )) { $k=$_REQUEST['k']; }
  		$l=""; if( isset($_REQUEST['l'] )) { $l=$_REQUEST['l']; }
  		$m=""; if( isset($_REQUEST['m'] )) { $m=$_REQUEST['m']; }
  		$n=""; if( isset($_REQUEST['n'] )) { $n=$_REQUEST['n']; }
  		$o=""; if( isset($_REQUEST['o'] )) { $o=$_REQUEST['o']; }
  		$p=""; if( isset($_REQUEST['p'] )) { $p=$_REQUEST['p']; }
  		$q=""; if( isset($_REQUEST['q'] )) { $q=$_REQUEST['q']; }
  		$r=""; if( isset($_REQUEST['r'] )) { $r=$_REQUEST['r']; }
  		$s=""; if( isset($_REQUEST['s'] )) { $s=$_REQUEST['s']; }
  		$t=""; if( isset($_REQUEST['t'] )) { $t=$_REQUEST['t']; }
  		$u=""; if( isset($_REQUEST['u'] )) { $u=$_REQUEST['u']; }
  		$v=""; if( isset($_REQUEST['v'] )) { $v=$_REQUEST['v']; }
  		$w=""; if( isset($_REQUEST['w'] )) { $w=$_REQUEST['w']; }
  		$x=""; if( isset($_REQUEST['x'] )) { $x=$_REQUEST['x']; }
  		$y=""; if( isset($_REQUEST['y'] )) { $y=$_REQUEST['y']; }
  		$z=""; if( isset($_REQUEST['z'] )) { $z=$_REQUEST['z']; }
  		$j=""; if( isset($_REQUEST['j'] )) { $j=$_REQUEST['j']; }
  		$j=""; if( isset($_REQUEST['j'] )) { $j=$_REQUEST['j']; }
  		$j=""; if( isset($_REQUEST['j'] )) { $j=$_REQUEST['j']; }
  		$j=""; if( isset($_REQUEST['j'] )) { $j=$_REQUEST['j']; }
  		$j=""; if( isset($_REQUEST['j'] )) { $j=$_REQUEST['j']; }
  		$j=""; if( isset($_REQUEST['j'] )) { $j=$_REQUEST['j']; }
  		$j=""; if( isset($_REQUEST['j'] )) { $j=$_REQUEST['j']; }
  		$j=""; if( isset($_REQUEST['j'] )) { $j=$_REQUEST['j']; }
  		$j=""; if( isset($_REQUEST['j'] )) { $j=$_REQUEST['j']; }
  		$j=""; if( isset($_REQUEST['j'] )) { $j=$_REQUEST['j']; }
  		$j=""; if( isset($_REQUEST['j'] )) { $j=$_REQUEST['j']; }
  		$j=""; if( isset($_REQUEST['j'] )) { $j=$_REQUEST['j']; }
  		$j=""; if( isset($_REQUEST['j'] )) { $j=$_REQUEST['j']; }
  		$j=""; if( isset($_REQUEST['j'] )) { $j=$_REQUEST['j']; }
  
 		$fmt=""; if( isset($_REQUEST['fmt'] )) { $a=$_REQUEST['fmt']; }
 		$lim=""; if( isset($_REQUEST['lim'] )) { $a=$_REQUEST['lim']; }
 		$db3=""; if( isset($_REQUEST['db3'] )) { $a=$_REQUEST['db3']; }
 		$tbl=""; if( isset($_REQUEST['tbl'] )) { $a=$_REQUEST['tbl']; }
 		$sel=""; if( isset($_REQUEST['sel'] )) { $a=$_REQUEST['sel']; }
 		$fld=""; if( isset($_REQUEST['fld'] )) { $a=$_REQUEST['fld']; }
 		$val=""; if( isset($_REQUEST['val'] )) { $a=$_REQUEST['val']; }
 
 		str_replace("&lta&gt", $a, $find, $matches );
 		str_replace("&ltb&gt", $b, $find, $matches );
 		str_replace("&ltc&gt", $c, $find, $matches );
 		str_replace("&ltd&gt", $d, $find, $matches );
 		str_replace("&lte&gt", $e, $find, $matches );
 		str_replace("&ltf&gt", $f, $find, $matches );
 		str_replace("&ltg&gt", $g, $find, $matches );
 		str_replace("&lth&gt", $h, $find, $matches );
 		str_replace("&lti&gt", $i, $find, $matches );
 		str_replace("&ltj&gt", $j, $find, $matches );
 		str_replace("&ltk&gt", $k, $find, $matches );
 		str_replace("&ltl&gt", $l, $find, $matches );
 		str_replace("&ltm&gt", $m, $find, $matches );
 		str_replace("&ltn&gt", $n, $find, $matches );
 		str_replace("&lto&gt", $o, $find, $matches );
 		str_replace("&ltp&gt", $p, $find, $matches );
 		str_replace("&ltq&gt", $q, $find, $matches );
 		str_replace("&ltr&gt", $r, $find, $matches );
 		str_replace("&lts&gt", $s, $find, $matches );
 		str_replace("&ltt&gt", $t, $find, $matches );
 		str_replace("&ltv&gt", $v, $find, $matches );
 		str_replace("&ltw&gt", $w, $find, $matches );
 		str_replace("&ltx&gt", $x, $find, $matches );
 		str_replace("&lty&gt", $y, $find, $matches );
 		str_replace("&ltz&gt", $z, $find, $matches );
 
 		str_replace("&ltfmt&gt", $fmt, $find, $matches );
 		str_replace("&ltlim&gt", $lim, $find, $matches );
 		str_replace("&ltdb3&gt", $db3, $find, $matches );
 		str_replace("&lttbl&gt", $tbl, $find, $matches );
 		str_replace("&ltsel&gt", $sel, $find, $matches );
 		str_replace("&ltfld&gt", $fld, $find, $matches );
 		str_replace("&lval3&gt", $val, $find, $matches );
 	return($find);
	}



# str_replace(html_entity_decode('&ndash;', ENT_COMPAT, 'UTF-8'), '', $string);
// Fix for mb overloading strlen option
function decodeString($str) {
	if (function_exists('mb_strlen')) { 
		$len = mb_strlen($str, '8bit');
		} 
	else {
		$len = strlen($str);
		}
	$ret = '';
	for ($i = 0; $i < $len; $i++) {
		$ret .= dechex(ord($str[$i])).' ';
		}
	return trim($ret);
	}
function decode1($str) {
$arr1 = explode(",","0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F");
$arr2 = explode(",","B,C,D,E,F");

	foreach($arr2 as $t1){
		foreach($arr1 as $t2){
			$val = $t1.$t2;
			$desc = str_replace(chr(hexdec($val)),"",$desc);
			}   
		}

// if need removing individual value
	$desc = str_replace(chr(hexdec('A2')),"",$desc);
#	$string = str_replace("\x96", "-", $string);
#	$new_string = str_replace('&#8211;', 'or', $string);
#	$arr_needle = array("This", "function");
#	$arr_replace = array("That", "method");
#	$source_string= "This is a replace string tutorial by using str_replace function.";
#	$str_replaced = str_replace($arr_needle, $arr_replace, $source_string);
	}


class  Input {
	static $errors = true;

	static function check($arr, $on = false) {
		if ($on === false) {
			$on = $_REQUEST;
			}
		foreach ($arr as $value) {	
			if (empty($on[$value])) {
				self::throwError('Data is missing', 900);
				}
			}
		}

	static function int($val) {
		$val = filter_var($val, FILTER_VALIDATE_INT);
		if ($val === false) {
			self::throwError('Invalid Integer', 901);
			}
		return $val;
		}

	static function str($val) {
		if (!is_string($val)) {
			self::throwError('Invalid String', 902);
			}
		$val = trim(htmlspecialchars($val));
		return $val;
		}

	static function bool($val) {
		$val = filter_var($val, FILTER_VALIDATE_BOOLEAN);
		return $val;
		}

	static function email($val) {
		$val = filter_var($val, FILTER_VALIDATE_EMAIL);
		if ($val === false) {
			self::throwError('Invalid Email', 903);
			}
		return $val;
		}

	static function url($val) {
		$val = filter_var($val, FILTER_VALIDATE_URL);
		if ($val === false) {
			self::throwError('Invalid URL', 904);
			}
		return $val;
		}
	
	static function throwError($error = 'Error In Processing', $errorCode = 0) {
		if (self::$errors === true) {
			throw new Exception($error, $errorCode);
			}
		}
	}


function db2($dbname,$server,$user,$pass) {
		$htmout = "";
		$htmout .= "<h3>MSGS_1540 DB2 dbname=$dbname server=$server user=$user</h3>\n";
		print( $htmout );
		return($htmout);
		}


function db3($db3fil) {
		$htmout = "";
		$htmout .= "<h3>MSGS_1550 DB3 dbname=$dbname server=$server user=$user</h3>\n";
		print( $htmout );
		return($htmout);
		}

function ko_form($args) {
$fids="a b c d e f g h i j k l m n o p q r s t u v w x y z db3 tbl sel fld val fmt lim";
	$htmout = "";
	$htmout .= "<div id=div_ko_form>\n";
	$htmout .= "<h1>div_ko_form</h1>\n";
	$htmout .= '<form method=\"POST\" action="ko.php?ko_form_submit">\n';
	$htmout .= '	<input onkeydown="ko_onkeydown(event)" ><br>\n';
	$htmout .= "		</input>\n";
	foreach( $fids as $fid ) {
		$htmout .= '	<div id=div_form_$fid> <label for="$fid">$fid: </label> <input id="$fid" type="text"> </div>\n';
		}
	$htmout .= '	<div id=div_form_date> <label for="date">date: </label> <input id="date" type="date"> </div>\n';
	$htmout .= '	<div id=div_form_time> <label for="time">time: </label> <input id="time" type="time"> </div>\n';
	$htmout .= '	<div id=div_form_color> <label for="color">color: </label> <input id="color" type="color"> </div>\n';
	$htmout .= '	<div id=div_form_textarea> <label for="textarea">textarea: </label> <textarea name="comment" id="comment" type="textarea"></textarea> </div>\n';

	$htmout .= '	<div id=div_form_radio> <label for="radio">radio: </label><br>\n';
	$htmout .= '		 <input id="radio" name="gender" value="m" type="radio">m<br>\n'; 
	$htmout .= '		 <input id="radio" name="gender" value="f" type="radio">f<br>\n'; 
	$htmout .= '		</div>\n';
	$htmout .= '	<div id=div_form_checkbox> <label for="checkbox">checkbox: </label>\n';


	$htmout .= '		<input id="checkbox" name="checkbox" value="box1" type="checkbox">box1<br>\n';
	$htmout .= '		<input id="checkbox" name="checkbox" value="box1"type="checkbox">box2<br>\n';
	$htmout .= '		<input id="checkbox" name="checkbox" value="box1" type="checkbox">box3<br>\n';
	$htmout .= '		<input id="checkbox" name="checkbox" value="box1" type="checkbox">box4<br>\n';
	$htmout .= '		</div>\n';
	$htmout .= '	<div id=div_form_dropdown> <label for="dropdown">dropdown: </label> <input id="dropdown" type="dropdown"> </div>\n';
	$htmout .= '	<div id=div_form_email> <label for="email">email: </label> <input id="email" type="email"> </div>\n';





	$htmout .= '	<div id=div_form_submit> <label for="submit">submit: </label> <input id="submit" type="submit"> </div>\n';
	$htmout .= '	<div id=div_form_cancel> <label for="cancel">cancel: </label> <input id="cancel" type="cancel"> </div>\n';
	$htmout .= "</div>\n";

	$htmout .= "	</form>\n";




	}
# kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk 1302






function kolog_htmout_head($progid,$funid) {
	$dttm=date('Ymd_His');
	$htmout = "";
	$htmout .= "<html>";
	$htmout .= "<head>";
	$htmout .= "	<title>$progid $dttm $funid</title>";
	$htmout .= "	</head>";
	$htmout .= "<body bgcolor=linen>";
	$htmout .= "<a href=?kolog target=_blank><img src=/imgs/btn/koeye.png height=50></a>";
	return($htmout);
	}


// $db3file="/ko.db3";
// $tblname="kolog";

function kolog($db3file,$tblname,$args) {
$progid="ko"; $funid="kolog"; $dttm=date('Ymd_His');
$htmout = "";
$htmout .= kolog_htmout_head($progid,$funid);
$htmout .= "<div id=div_$funid>";
$htmout .= "<h1>$funid</h1><h2>$dttm</h2>";

$htmout .= "<a href=/ko.php?kolog target=_blank><img src=/imgs/btn/koeye.png height=50>kolog</a><br>";
$htmout .= "<a href=/ko.php?kolog=new target=_blank><img src=/imgs/btn/koeye.png height=50>kolog_new</a><br>";
$htmout .= "<a href=/ko.php?kolog=add target=_blank><img src=/imgs/btn/koeye.png height=50>kolog_add</a><br>";
$htmout .= "<a href=/ko.php?kolog=del target=_blank><img src=/imgs/btn/koeye.png height=50>kolog_del</a><br>";
$htmout .= "<a href=/ko.php?kolog=upd target=_blank><img src=/imgs/btn/koeye.png height=50>kolog_upd</a><br>";
$htmout .= "<a href=/ko.php?kolog=sel target=_blank><img src=/imgs/btn/koeye.png height=50>kolog_sel</a><br>";
$htmout .= "<a href=/ko.php?kolog=bugs target=_blank><img src=/imgs/btn/koeye.png height=50>kolog_bugs</a><br>";
$htmout .= "<a href=/ko.php?kolog=create target=_blank><img src=/imgs/btn/koeye.png height=50>kolog_create</a><br>";
$htmout .= "<a href=/ko.php?kolog=form target=_blank><img src=/imgs/btn/koeye.png height=50>kolog_form</a><br>";
$htmout .= "<a href=/ko.php?kolog=submit target=_blank><img src=/imgs/btn/koeye.png height=50>kolog_submit</a><br>";
$htmout .= "<a href=/ko.php?kolog=list target=_blank><img src=/imgs/btn/koeye.png height=50>kolog_list</a><br>";
$htmout .= "<a href=/ko.php?kolog=logs target=_blank><img src=/imgs/btn/koeye.png height=50>kologs</a><br>";


// $htmout .= "<a href=/ko.php?id=kolog target=_blank><img src=/imgs/btn/koeye.png height=50>kolog</a><br>";
// $htmout .= "<a href=/ko.php?id=kolog_new target=_blank><img src=/imgs/btn/koeye.png height=50>kolog_new</a><br>";
// $htmout .= "<a href=/ko.php?id=kolog_add target=_blank><img src=/imgs/btn/koeye.png height=50>kolog_add</a><br>";
// $htmout .= "<a href=/ko.php?id=kolog_del target=_blank><img src=/imgs/btn/koeye.png height=50>kolog_del</a><br>";
// $htmout .= "<a href=/ko.php?id=kolog_upd target=_blank><img src=/imgs/btn/koeye.png height=50>kolog_upd</a><br>";
// $htmout .= "<a href=/ko.php?id=kolog_sel target=_blank><img src=/imgs/btn/koeye.png height=50>kolog_sel</a><br>";
// $htmout .= "<a href=/ko.php?id=kologs target=_blank><img src=/imgs/btn/koeye.png height=50>kologs</a><br>";
		$htmout .= "	</div>";
		$htmout .= "<h1>db3file=$db3file tblname=$tblname</h1>";
		$htmout .= "	</body>";
		$htmout .= "	</html>";
		return($htmout);
		}


function kolog_new($db3file, $tblname, $args) {
$progid="ko"; $funid="kolog_new"; $dttm=date('Ymd_His');
	$htmout="";
	$htmout .= kolog_htmout_head($progid,$funid);
	$htmout .= "<div id=div_$funid>";
	$htmout .= "<h1>$funid</h1><h2>$dttm</h2>";
	$htmout .= "$funid $dttm";
	return($htmout);
	}

function kolog_add($db3file, $tblname, $args) {
$progid="ko"; $funid="kolog_add"; $dttm=date('Ymd_His');
	$htmout = "";
	$htmout .= kolog_htmout_head($progid,$funid);
	$htmout .= "<div id=div_$funid>";
	$htmout .= "<h1>$funid</h1><h2>$dttm</h2>";
	$htmout .= "$funid $dttm";
	$htmout .= "	</div>";
	$htmout .= "	</body>";
	$htmout .= "	</html>";

//	print( "BUGS_200 kolog_add htmout=$htmout<br>" );
	$htmout = "";
//	$htmout .= "<!DOCTYPE html>";
	$htmout .= "";
	$htmout .= "<html lang=\"en\">";
	$htmout .= "<head>";
//	print( "BUGS_201 kolog_add htmout=<pre>$htmout</pre><br>" );
	$htmout .= "    <!-- The jQuery library is a prerequisite for all jqSuite products -->\n";
	$htmout .= "    <script type=\"text/ecmascript\" src=\"/jq/js/jquery.min.js\"></script>\n ";
	$htmout .= "    <!-- We support more than 40 localizations -->\n";
	$htmout .= "    <script type=\"text/ecmascript\" src=\"/jq/js/trirand/i18n/grid.locale-en.js\"></script>\n";
	$htmout .= "    <!-- This is the Javascript file of jqGrid -->  \n ";
	$htmout .= "    <script type=\"text/ecmascript\" src=\"/jq/js/trirand/jquery.jqGrid.min.js\"></script>\n";
	$htmout .= "    <!-- A link to a Boostrap  and jqGrid Bootstrap CSS siles-->\n";
	$htmout .= "	<link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css\"> \n";
	$htmout .= "    <link rel=\"stylesheet\" type=\"text/css\" media=\"screen\" href=\"/jq/css/trirand/ui.jqgrid-bootstrap.css\" />\n";
//	print( "BUGS_202 kolog_add htmout=<pre>$htmout</pre><br>" );
	$htmout .= "	<script id=script_jq_defaults>\n";
	$htmout .= "		$.jgrid.defaults.width = 780;\n";
	$htmout .= "		$.jgrid.defaults.responsive = true;\n";
	$htmout .= "		$.jgrid.defaults.styleUI = 'Bootstrap';\n";
	$htmout .= "		</script>\n";
	$htmout .= "	<script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js\"></script>\n";
	$htmout .= "    <meta charset=\"utf-8\" />\n";
	$htmout .= "    <title>/ko.php?kolog=add jqGrid Loading Data - Dialogs - Edit, Add, Delete</title>\n";
	$htmout .= "</head>\n";
	$htmout .= "<body bgcolor=linen>\n";
//	print( "BUGS_204 kolog_add htmout=$htmout<br>" );
	$htmout .= "<div style=\"margin-left:20px\">\n";
	$htmout .= "    <table id=\"jqGrid\"></table>\n";
	$htmout .= "    <div id=\"jqGridPager\"></div>\n";
	$htmout .= "	</div>\n";
	$htmout .= "    <script id=script_js_ready type=\"text/javascript\">\n";
	$htmout .= "\n";
	$htmout .= "        $(document).ready(function () {\n";
	$htmout .= "            $(\"#jqGrid\").jqGrid({\n";
	$htmout .= "                url: '/jq/bootstrap/edit_add_delete/dialogs/data.json',\n";
	$htmout .= "				// we set the changes to be made at client side using predefined word clientArray\n";
	$htmout .= "                editurl: 'clientArray',\n";
	$htmout .= "                datatype: \"json\",\n";
	$htmout .= "                colModel: [\n";
	$htmout .= "                    {\n";
	$htmout .= "						label: 'Customer ID',\n";
	$htmout .= "                        name: 'CustomerID',\n";
	$htmout .= "                        width: 75,\n";
	$htmout .= "						key: true,\n";
	$htmout .= "						editable: true,\n";
	$htmout .= "						editrules : { required: true}\n";
	$htmout .= "                    },\n";
	$htmout .= "                    {\n";
	$htmout .= "						label: 'Company Name',\n";
	$htmout .= "                        name: 'CompanyName',\n";
	$htmout .= "                        width: 140,\n";
	$htmout .= "                        editable: true // must set editable to true if you want to make the field editable\n";
	$htmout .= "                    },\n";
	$htmout .= "                    {\n";
	$htmout .= "						label : 'Phone',\n";
	$htmout .= "                        name: 'Phone',\n";
	$htmout .= "                        width: 100,\n";
	$htmout .= "                        editable: true\n";
	$htmout .= "                    },\n";
	$htmout .= "                    {\n";
	$htmout .= "						label: 'Postal Code',\n";
	$htmout .= "                        name: 'PostalCode',\n";
	$htmout .= "                        width: 80,\n";
	$htmout .= "                        editable: true\n";
	$htmout .= "                    },\n";
	$htmout .= "                    {\n";
	$htmout .= "						label: 'City',\n";
	$htmout .= "                        name: 'City',\n";
	$htmout .= "                        width: 140,\n";
	$htmout .= "                        editable: true\n";
	$htmout .= "                    }\n";
	$htmout .= "                ],\n";
	$htmout .= "				sortname: 'CustomerID',\n";
	$htmout .= "				sortorder : 'asc',\n";
	$htmout .= "				loadonce: true,\n";
	$htmout .= "				viewrecords: true,\n";
	$htmout .= "                height: 200,\n";
	$htmout .= "                rowNum: 10,\n";
	$htmout .= "                pager: \"#jqGridPager\"\n";
	$htmout .= "            });\n";
	$htmout .= "\n";
	$htmout .= "            $('#jqGrid').navGrid('#jqGridPager',\n";
	$htmout .= "                // the buttons to appear on the toolbar of the grid\n";
	$htmout .= "                { edit: true, add: true, del: true, search: false, refresh: false, view: false, position: \"left\", cloneToTop: false },\n";
	$htmout .= "                // options for the Edit Dialog\n";
	$htmout .= "                {\n";
	$htmout .= "                    editCaption: \"The Edit Dialog\",\n";
	$htmout .= "                    recreateForm: true,\n";
	$htmout .= "					checkOnUpdate : true,\n";
	$htmout .= "					checkOnSubmit : true,\n";
	$htmout .= "                    closeAfterEdit: true,\n";
	$htmout .= "                    errorTextFormat: function (data) {\n";
	$htmout .= "                        return 'Error: ' + data.responseText\n";
	$htmout .= "                    }\n";
	$htmout .= "                },\n";
	$htmout .= "                // options for the Add Dialog\n";
	$htmout .= "                {\n";
	$htmout .= "                    closeAfterAdd: true,\n";
	$htmout .= "                    recreateForm: true,\n";
	$htmout .= "                    errorTextFormat: function (data) {\n";
	$htmout .= "                        return 'Error: ' + data.responseText\n";
	$htmout .= "                    }\n";
	$htmout .= "                },\n";
	$htmout .= "                // options for the Delete Dailog\n";
	$htmout .= "                {\n";
	$htmout .= "                    errorTextFormat: function (data) {\n";
	$htmout .= "                        return 'Error: ' + data.responseText\n";
	$htmout .= "                    }\n";
	$htmout .= "                });\n";
	$htmout .= "        });\n";
	$htmout .= "\n";
	$htmout .= "    </script>\n";
	$htmout .= "\n";
	$htmout .= "</body>\n";
	$htmout .= "</html>\n";


	return($htmout);
	}

function kolog_del($db3file, $tblname, $args) {
$progid="ko"; $funid="kolog_del"; $dttm=date('Ymd_His');
	$htmout = "";
	$htmout .= kolog_htmout_head($progid,$funid);
	$htmout .= "<div id=div_$funid>";
	$htmout .= "<h1>$funid</h1><h2>$dttm</h2>";
	$htmout .= "$funid $dttm";
	$htmout .= "	</div>";
	$htmout .= "	</body>";
	$htmout .= "	</html>";
	return($htmout);
	}

function kolog_upd($db3file, $tblname, $args) {
$progid="ko"; $funid="kolog_upd"; $dttm=date('Ymd_His');
	$htmout = "";
	$htmout .= kolog_htmout_head($progid,$funid);
	$htmout .= "<div id=div_$funid>";
	$htmout .= "<h1>$funid</h1><h2>$dttm</h2>";
	$htmout .= "$funid $dttm";
	$htmout .= "	</div>";
	$htmout .= "	</body>";
	$htmout .= "	</html>";
	return($htmout);
	}

function kolog_sel($db3file, $tblname, $args) {
$progid="ko"; $funid="kolog_sel"; $dttm=date('Ymd_His');
	$htmout = "";
	$htmout .= kolog_htmout_head($progid,$funid);
	$htmout .= "<div id=div_$funid>";
	$htmout .= "<h1>$funid</h1><h2>$dttm</h2>";
	$htmout .= "$funid $dttm";
	$htmout .= "	</div>";
	$htmout .= "	</body>";
	$htmout .= "	</html>";

// jjjjjjjjjjjjjjjjjjj

	$htmout = "";
//	$htmout .= "<!DOCTYPE html>\n";
	$htmout .= "\n";
	$htmout .= "<html lang=\"en\">\n";
	$htmout .= "<head>\n";
	$htmout .= "    <!-- The jQuery library is a prerequisite for all jqSuite products -->\n";
	$htmout .= "    <script type=\"text/ecmascript\" src=\"/jq/js/jquery.min.js\"></script> \n";
	$htmout .= "    <!-- We support more than 40 localizations -->\n";
	$htmout .= "    <script type=\"text/ecmascript\" src=\"/jq/js/trirand/i18n/grid.locale-en.js\"></script>\n";
	$htmout .= "    <!-- This is the Javascript file of jqGrid -->   \n";
	$htmout .= "    <script type=\"text/ecmascript\" src=\"/jq/js/trirand/jquery.jqGrid.min.js\"></script>\n";
	$htmout .= "    <!-- A link to a Boostrap  and jqGrid Bootstrap CSS siles-->\n";
//	$htmout .= "	<link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css\"> \n";
	$htmout .= "	<link rel=\"stylesheet\" href=\"/jq/css/jq_bootstrap.css\"> \n";

	$htmout .= "    <link rel=\"stylesheet\" type=\"text/css\" media=\"screen\" href=\"/jq/css/trirand/ui.jqgrid-bootstrap.css\" /> \n";
	$htmout .= "	<script>\n";
	$htmout .= "		$.jgrid.defaults.width = 780;\n";
	$htmout .= "		$.jgrid.defaults.responsive = true;\n";
	$htmout .= "		$.jgrid.defaults.styleUI = 'Bootstrap';\n";
	$htmout .= "	</script>\n";
//	$htmout .= "	<script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js\"></script>\n";
	$htmout .= "	<script src=\"/jq/js/jq_bootstrap.js\"></script>\n";
	$htmout .= "    <meta charset=\"utf-8\" />\n";
	$htmout .= "    <title>jqGrid Loading Data - Master / Detail</title>\n";
	$htmout .= "</head>\n";
	$htmout .= "<body bgcolor=linen>\n";
	$htmout .= "<div style=\"margin-left:8px;\">\n";
	$htmout .= "	<table id=\"jqGrid\"></table>\n";
	$htmout .= "	<div id=\"jqGridPager\"></div>\n";
	$htmout .= "\n";
	$htmout .= "    <br /><br />\n";
	$htmout .= "\n";
	$htmout .= "	<div id=\"detailsPlaceholder\">\n";
	$htmout .= "		<table id=\"jqGridDetails\"></table>\n";
	$htmout .= "		<div id=\"jqGridDetailsPager\"></div>\n";
	$htmout .= "		</div>\n";
	$htmout .= "	</div>\n";
	$htmout .= "    <script id=\"script_jq_ready\" type=\"text/javascript\"> \n";
	$htmout .= "    \n";
	$htmout .= "        $(document).ready(function () {\n";
	$htmout .= "			\n";
	$htmout .= "// master grid\n";
	$htmout .= "            $(\"#jqGrid\").jqGrid({\n";
	$htmout .= "                url: '/jq/bootstrap/selection/master_detail/data.json',\n";
	$htmout .= "                datatype: \"json\",\n";
	$htmout .= "                colModel: [\n";
	$htmout .= "                    { label: 'ID', name: 'CustomerID', key: true, width: 75 },\n";
	$htmout .= "                    { label: 'Company Name', name: 'CompanyName', width: 150 },\n";
	$htmout .= "                    { label: 'Contact Name', name: 'ContactName', width: 150 },\n";
	$htmout .= "                    { label: 'Phone', name: 'Phone', width: 150 },\n";
	$htmout .= "                    { label: 'City', name: 'City', width: 150 }\n";
	$htmout .= "                ],\n";
	$htmout .= "                width: 780,\n";
	$htmout .= "                height: 150,\n";
	$htmout .= "                rowNum: 7,\n";
	$htmout .= "				viewrecords: true,\n";
	$htmout .= "				loadonce: true,\n";
	$htmout .= "				caption: 'Master Grid',\n";
	$htmout .= "                onSelectRow: function(rowid, selected) {\n";
	$htmout .= "					if(rowid != null) {\n";
	$htmout .= "						jQuery(\"#jqGridDetails\").jqGrid('setGridParam',{url: \"/jq/bootstrap/selection/master_detail/\"+rowid+\".json\",datatype: 'json'}); // the last setting is for demo only\n";
	$htmout .= "						jQuery(\"#jqGridDetails\").jqGrid('setCaption', 'Detail Grid::'+rowid);\n";
	$htmout .= "						jQuery(\"#jqGridDetails\").trigger(\"reloadGrid\");\n";
	$htmout .= "					}					\n";
	$htmout .= "				}, // use the onSelectRow that is triggered on row click to show a details grid\n";
	$htmout .= "				onSortCol : clearSelection,\n";
	$htmout .= "				onPaging : clearSelection,\n";
	$htmout .= "                pager: \"#jqGridPager\"\n";
	$htmout .= "            });\n";
	$htmout .= "        });\n";
	$htmout .= "// detail grid\n";
	$htmout .= "        $(\"#jqGridDetails\").jqGrid({\n";
	$htmout .= "			url: '/jq/bootstrap/selection/master_detail/empty.json',\n";
	$htmout .= "            mtype: \"GET\",\n";
	$htmout .= "            datatype: \"json\",\n";
	$htmout .= "            page: 1,\n";
	$htmout .= "			colModel: [\n";
	$htmout .= "                    { label: 'Order ID', name: 'OrderID', key: true, width: 75 },\n";
	$htmout .= "                    { label: 'Required Date', name: 'RequiredDate', width: 100 },\n";
	$htmout .= "                    { label: 'Ship Name', name: 'ShipName', width: 100 },\n";
	$htmout .= "                    { label: 'Ship City', name: 'ShipCity', width: 100 },\n";
	$htmout .= "                    { label: 'Freight', name: 'Freight', width: 75 }\n";
	$htmout .= "			],\n";
	$htmout .= "			width: 780,\n";
	$htmout .= "			rowNum: 5,\n";
	$htmout .= "			loadonce: true,\n";
	$htmout .= "			height: '100',\n";
	$htmout .= "			viewrecords: true,\n";
	$htmout .= "			caption: 'Detail grid::',\n";
	$htmout .= "			pager: \"#jqGridDetailsPager\"\n";
	$htmout .= "		});\n";
	$htmout .= "\n";
	$htmout .= "			function clearSelection() {\n";
	$htmout .= "				jQuery(\"#jqGridDetails\").jqGrid('setGridParam',{url: \"/jq/bootstrap/selection/master_detail/empty.json\", datatype: 'json'}); // the last setting is for demo purpose only\n";
	$htmout .= "				jQuery(\"#jqGridDetails\").jqGrid('setCaption', 'Detail Grid:: none');\n";
	$htmout .= "				jQuery(\"#jqGridDetails\").trigger(\"reloadGrid\");\n";
	$htmout .= "				\n";
	$htmout .= "			}\n";
	$htmout .= "    </script>\n";
	$htmout .= "\n";
//	$htmout .= "    <!-- This code is related to code tabs -->\n";
//	$htmout .= "    <br />\n";
//	$htmout .= "    <span style=\"margin-left:18px; font-family: Tahoma\">Click on the Tabs below the see the relevant code for the example:</span>\n";
//	$htmout .= "    <br /><br />\n";
//	$htmout .= "    <div id=\"codetabs\" style=\"width:780px; height: 400px; font-size:65%;\"></div>\n";
//	$htmout .= "     \n";
//	$htmout .= "    <script type=\"text/ecmascript\" src=\"/jq/js/prettify/prettify.js\"></script>\n";
//	$htmout .= "    <link rel=\"stylesheet\" href=\"/jq/css/prettify.css\" />\n";
//	$htmout .= "        <script type=\"text/ecmascript\" src=\"/jq/js/codetabs-b.js\"></script> \n";
//	$htmout .= "    \n";
//	$htmout .= "    <script type=\"text/javascript\">\n";
//	$htmout .= "\n";
//	$htmout .= "        var tabData =\n";
//	$htmout .= "            [\n";
//	$htmout .= "                { name: \"HTML\", url: \"/jq/bootstrap/selection/master_detail/index.html\", lang: \"lang-html\" },\n";
//	$htmout .= "                { name: \"Data.JSON\", url: \"/jq/bootstrap/selection/master_detail/data.json\", lang: \"lang-json\" },\n";
//	$htmout .= "                { name: \"Description\", url: \"/jq/bootstrap/selection/master_detail/description.html\", lang: \"lang-html\" },\n";
//	$htmout .= "            ];\n";
//	$htmout .= "\n";
//	$htmout .= "        codeTabs(tabData);\n";
//	$htmout .= "\n";
//	$htmout .= "    </script>\n";
//	$htmout .= "    <!-- End of code related to code tabs -->\n";
	$htmout .= "</body>\n";
	$htmout .= "</html>\n";
// kkkkkkkkkkkkkkkkkkkkkkkkk

	return($htmout);
	}

function kolog_bugs($db3file, $tblname, $args) {
$progid="ko"; $funid="kolog_bugs"; $dttm=date('Ymd_His');
	$htmout = "";
	$htmout .= kolog_htmout_head($progid,$funid);
	$htmout .= "<div id=div_$funid>";
	$htmout .= "<h1>$funid</h1><h2>$dttm</h2>";
	$htmout .= "$funid $dttm";

//	echo strtotime("now"), "\n";
//	echo strtotime("10 September 2000"), "\n";
//	echo strtotime("+1 day"), "\n";
//	echo strtotime("+1 week"), "\n";
//	echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n";
//	echo strtotime("next Thursday"), "\n";
//	echo strtotime("last Monday"), "\n"//	;


//	$str = 'Not Good';
//	if (($timestamp = strtotime($str)) === false) {
//		print( "The string ($str) is bogus" );
//		} 
//	else {
//		print( "$str == " . date('l dS \o\f F Y h:i:s A', $timestamp));
//		}

	$date1 = new DateTimeImmutable('2000-01-01');
	$date2 = $date1->add(new DateInterval('P6M5DT24H'));
//	print( "date1=".$date1->format('Y-m-d') . "<br>" );
//	print( "date2=".$date2->format('Y-m-d') . "<br>" );





	$j=0; $k=0;
	$sql = "";

//	$dttm_beg=date("H:i:s", strtotime("+0 hours"));
//	$dttm_end8=date("D Y-m-d H:i:s", strtotime("+8 hours"));
//	$dttm_end11=date("D Y-m-d H:i:s", strtotime("+11 hours"));
//	$dttm_end14=date("D Y-m-d H:i:s", strtotime("+14 hours"));
//	$dttm_end=date("D Y-m-d H:i:s", strtotime("+14 hours"));

//	$htmout .= "<hr color=goldenrod width=200>";
//	$htmout .= "<table id=table_dttm_head>";
//	$htmout .= "	<tr><td> &nbsp </td><td> &nbsp </td></tr>\n";
//	$htmout .= "	<tr><td>dttm_beg</td><td>$dttm_beg</td></tr>";
//	$htmout .= "	<tr><td>dttm_end8</td><td>$dttm_end8</td></tr>";
//	$htmout .= "	<tr><td>dttm_end11</td><td>$dttm_end11</td></tr>";
//	$htmout .= "	<tr><td>dttm_end14</td><td>$dttm_end14</td></tr>";
//	$htmout .= "	<tr><td>dttm_end</td><td>$dttm_end</td></tr>";
//	$htmout .= "	</table>";



//	for( $dttm=$dttm_beg; $dttm<$dttm_end14; $dttm=date("H:i:s", strtotime("+1 hours"))) {
//		$j=$j+1;
//		$htmout .= "j=$j dttm=$dttm<br>";
//		}
//	$interval = DateInterval::createFromDateString('1 hour');
//	$period = new DatePeriod($dttm_beg, $interval, $dttm_end);
//	$j=0;
//	foreach ($period as $dt) {
//		$j=$j+1;
//		$dttm=$dt->format("l Y-m-d H:i:s\n");
//		$htmout .= "foreach period as dt j=$j dttm=$dttm<br>";
//		}
// Loop between timestamps, 24 hours at a time
//	$dttm_beg = strtotime( '2021-11-07 12:00' );
//	$dttm_end = strtotime( '2021-11-08 12:00' );
//	for ( $i = $dttm_beg; $i <= $dttm_end; $i = $i + 86400 ) {
//		$thisDate = date( 'Y-m-d', $i ); 	// 2010-05-01, 2010-05-02, etc
//		$htmout .= "for i j=$j i=$i<br>";
//		}
//	$htmout .= "<hr color=goldenrod>";
//	$dttm_beg = $month = strtotime('2021-11-07');
//	$dttm_end = strtotime('2021-11-14');
//	while($month < $dttm_end) {
//		$j=$j+1;
//		$htmout .= "j=$j ".date('F Y', $month);
//		$month = strtotime("+1 month", $month);
//		}
//	$dttm_beg = new DateTime('2010-12-02');
//	$dttm_beg->modify('first day of this month');
//	$dttm_end      = new DateTime('2012-05-06');
//	$dttm_end->modify('first day of next month');
//	$interval = DateInterval::createFromDateString('1 month');
//	$dttm_beg = $dttm_now;
//	$dttm_end = $dttm_beg;
//	$dttm_end8 = $dttm_beg;
//	$dttm_end8->modify('+8 hours');
//	$dttm_end11 = $dttm_beg;
//	$dttm_end11->modify('+11 hours');
//	$dttm_end14 = $dttm_beg;
//	$dttm_end14->modify("+14 hours');
//	$dttm_end = $dttm_end14;


//	$dttm_now = new DateTime('now');
	$dttm_now=date("D Y-m-d H:i:s", strtotime("+0 hours"));
	$dttm_beg=date("D Y-m-d H:i:s", strtotime("+0 hours"));
	$dttm_end8=date("D Y-m-d H:i:s", strtotime("+8 hours"));
	$dttm_end11=date("D Y-m-d H:i:s", strtotime("+11 hours"));
	$dttm_end14=date("D Y-m-d H:i:s", strtotime("+14 hours"));
	$dttm_end=date("D Y-m-d H:i:s", strtotime("+14 hours"));



	$htmout .= "<a href=?kolog target=_blank><img src=/imgs/btn/koeye.png height=50></a>";
	$htmout .= "<hr color=goldenrod width=200>";
	$htmout .= "<table id=table_head>";
	$htmout .= "<tr><td>dttm_now</td><td>".date("D Y-m-d H:i:s", strtotime( $dttm_now ))."</td></tr>\n";
	$htmout .= "<tr><td>dttm_beg</td><td>".date("D Y-m-d H:i:s", strtotime( $dttm_beg ))."</td></tr>\n";
	$htmout .= "<tr><td>dttm_end</td><td>".date("D Y-m-d H:i:s", strtotime( $dttm_end ))."</td></tr>\n";
	$htmout .= "<tr><td>dttm_end8</td><td>".date("D Y-m-d H:i:s", strtotime( $dttm_end8 ))."</td></tr>\n";
	$htmout .= "<tr><td>dttm_end11</td><td>".date("D Y-m-d H:i:s", strtotime( $dttm_end11 ))."</td></tr>\n";
	$htmout .= "<tr><td>dttm_end14</td><td>".date("D Y-m-d H:i:s", strtotime( $dttm_end14 ))."</td></tr>\n";
	$htmout .= "	</table>";
	$htmout .= "<hr color=goldenrod width=200>";

	$j=0;
	$dttm = $dttm_beg;
	$htmout .= "<table id=table_body>";
	$htmout .= "<tr><td>hr</td><td>type</td><td>rem</td><td>time</td><td>act</td><td>desc</td></tr>";
	while( $dttm < $dttm_end ) {
		$j=$j+1;
		$desc="desc hour $j";
		$act="action_$j";
		$type="t__";
		$interval = DateInterval::createFromDateString("1 hour");
		$dttm = date("H:i:s", strtotime( "+$j hours" ));
		if( strtotime($dttm) < strtotime($dttm_end14)) { 
//			print( "BUGS_381 dttm=$dttm dttm_end14=$dttm_end14<br>\n" );
			$type="t14"; 
			}
		if( strtotime($dttm) < strtotime($dttm_end11)) {
//			print( "BUGS_382 dttm=$dttm dttm_end11=$dttm_end11<br>\n" );
			$type="t11"; 
			}
		if( strtotime($dttm) < strtotime($dttm_end8)) {
//			print( "BUGS_383 dttm=$dttm dttm_end8=$dttm_end8<br>\n" );
			$type="t8"; 
			}
		$rem = date("H:i:s", strtotime($dttm_end) - strtotime($dttm));

//		$dttm = date("l Y-m-d H:i:s", strtotime( "$dttm +.5 hours"));
//		$dttm_day1nextmonth=$dttm_beg->modify("first day of next month");
//		$interval = DateInterval::createFromDateString("1 month");

//		$htmout .= "j=$j dttm=" .date("l Y-m-d H:i:s", strtotime( $dttm ))."<br>\n";
//		$htmout .= "<tr><td>$j</td><td>" .date("D Y-m-d H:i:s", strtotime( "+$j hours" ))."</td></tr>\n";


		$htmout .= "<tr>";
		$htmout .= "<td width=20>$j</td>";
		$htmout .= "<td width=10>$type</td>";
		$htmout .= "<td width=10>$rem</td>";
		$htmout .= "<td width=200>" .date("D Y-m-d H:i:s", strtotime( "+$j hours" ))."</td>";
		$htmout .= "<td width=100>$act</td>";
		$htmout .= "<td width=100>$desc</td>";
		$htmout .= "</tr>\n";
		if( $j > 50 ) { break; }
//		if( date(strtotime($dttm)) > date(strtotime($dttm_end))) { break; }
//		if( strtotime($dttm) > strtotime($dttm_end)) { 
		$dttm=date("D Y-m-d H:i:s", strtotime("+$j hours"));
		if( date(strtotime($dttm)) > date(strtotime($dttm_end))) {
//			print( "BUGS_401 BREAK dttm=$dttm dttm_end=$dttm_end<br>" );
			break; 
			}
		}
	$htmout .= "	</table>";


//	for( $j=0; $j<100; $j++ ) {
//		$dttm = $
//		if( $j>5 ) { break; }
//		$htmout .= "BUGS j=$j<br>";
//		}



//	$htmout .= "dttm_now=".$dttm_now->format("l Y-m-d H:i:s\n");
//	$htmout .= "dttm_beg=".$dttm_beg->format("l Y-m-d H:i:s\n")."<br>";
//	$htmout .= "dttm_end8=".$dttm_end8->format("l Y-m-d H:i:s\n")."<br>";
//	$htmout .= "dttm_end11=".$dttm_end11->format("l Y-m-d H:i:s\n")."<br>";
//	$htmout .= "dttm_end14=".$dttm_end14->format("l Y-m-d H:i:s\n")."<br>";
//	$htmout .= "dttm_end=".$dttm_end->format("l Y-m-d H:i:s\n")."<br>";

	$interval = DateInterval::createFromDateString('1 hour');
//	$period   = new DatePeriod($dttm_beg, $interval, $dttm_end);

	$j=0;
//	foreach ($period as $dt) {
//		$j=$j+1;
//		$htmout .= $dt->format("Y-m") . "<br>\n";
//		}

//	$pdo = newpdo($db3file);
//	$pdo->exec($sql);
//	$pdo=null;

	$htmout .= "	</div>";
	$htmout .= "	</body>";
	$htmout .= "	</html>";
	return($htmout);
	}



function kologs($db3file, $tblname,$args) {
$progid="ko"; $funid="kologs"; $dttm=date('Ymd_His');
	$htmout = "";
	$htmout .= kolog_htmout_head($progid,$funid);
	$htmout .= "<div id=div_$funid>";
	$htmout .= "<h1>$funid</h1><h2>$dttm</h2>";
	$htmout .= "$funid $dttm";
	$htmout .= "	</div>";
	$htmout .= "	</body>";
	$htmout .= "	</html>";
	return($htmout);
	}


function kolog_create($db3file, $tblname, $args) {
$progid="ko"; $funid="create"; $dttm=date('Ymd_His');
$htmout="";

$sqldrop="";
$sqldrop .= "drop table if exists $tblname;";
	$pdo = newpdo($db3file);
	$pdo->exec($sqldrop);
	$pdo=null;

$sqlcr_tblname="";
$sqlcr_tblname .= "create table if not exists $tblname ( ";
$sqlcr_tblname .= "progid text, ";
$sqlcr_tblname .= "dttm text, ";
$sqlcr_tblname .= "status text, ";
$sqlcr_tblname .= "id text, ";
$sqlcr_tblname .= "ip text, ";
$sqlcr_tblname .= "agent text, ";
$sqlcr_tblname .= "referer text, ";
$sqlcr_tblname .= "type text, ";
$sqlcr_tblname .= "effdt text, ";
$sqlcr_tblname .= "end8 text, ";
$sqlcr_tblname .= "rem8 text, ";
$sqlcr_tblname .= "end11 text, ";
$sqlcr_tblname .= "rem11 text, ";
$sqlcr_tblname .= "end14 text, ";
$sqlcr_tblname .= "rem14 text, ";
$sqlcr_tblname .= "loc text, ";
$sqlcr_tblname .= "act text, ";
$sqlcr_tblname .= "who text, ";
$sqlcr_tblname .= "notes text, ";
$sqlcr_tblname .= "desc text ";
$sqlcr_tblname .= " );";

//	$pdo = newpdo($GLOBALS['dbfile']);
//	$pdo->exec($sqlcr);

	$pdo = newpdo($db3file);
	$pdo->exec($sqlcr_tblname);
	$pdo=null;

	$htmout .= kolog_htmout_head($progid,$funid);
	$htmout .= "<div id=div_$funid>";
	$htmout .= "<h1>$funid</h1><h2>$dttm</h2>";
	$htmout .= "$funid $dttm";
	$htmout .= "<h1>db3file=$db3file tblname=$tblname</h1>";
	$htmout .= "<h2>sqlcr=$sqlcr_tblname</h2>";


$sqldrop = "";
$sqldrop .= "drop table if exists kologs;";
	$pdo = newpdo($db3file);
	$pdo->exec($sqldrop);
	$pdo=null;


$sqlcr_kologs = "";
$sqlcr_kologs .= "create table if not exists kologs ";
$sqlcr_kologs .= "as select * from files limit 1;";
	$pdo = newpdo($db3file);
	$pdo->exec($sqlcr_kologs);
	$pdo=null;

	$htmout .= "<h2>sql_kologs=$sqlcr_kologs</h2>";
	$htmout .= "<a href=$progid.php?kolog ><img src=/imgs/btn/koeye.png height=50></a>";
	$htmout .= "	</body>";
	$htmout .= "	</html>";

	return($htmout);
	}


/**
 * Converts current time for given timezone (considering DST)
 *      to 14-digit UTC timestamp (YYYYMMDDHHMMSS)
 *
 * DateTime requires PHP >= 5.2
 *
 * @param $str_user_timezone
 * @param string $str_server_timezone
 * @param string $str_server_dateformat
 * @return string
 */
function now($str_user_timezone,
                         $str_server_timezone = CONST_SERVER_TIMEZONE,
                         $str_server_dateformat = CONST_SERVER_DATEFORMAT) {
 
        // set timezone to user timezone
        date_default_timezone_set($str_user_timezone);
 
        $date = new DateTime('now');
        $date->setTimezone(new DateTimeZone($str_server_timezone));
        $str_server_now = $date->format($str_server_dateformat);
 
        // return timezone to server default
        date_default_timezone_set($str_server_timezone);
 
        return $str_server_now;
}

// jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj

function kolog_submit() {
$htmout=""; $j=0;$k=0;
	print( "<h1>kolog FORM</h1>" );
#	foreach($_REQUEST as $key=>$value) { $j=$j+1; }

$acts="";
$locs="";
$whos="";
$select_acts=array();
$select_locs=array();
$select_whos=array();
$html_acts="";
$html_locs="";
$html_whos="";
$html_select_acts="";
$html_select_locs="";
$html_select_whos="";
$db3file="ko.db3";
$tblname="kologs";
$sql="";
$selects=array();
$select="";
$fbid="";
$desc="";
$media="";


	if( isset($_REQUEST['acts'])) { $acts=$_REQUEST['acts']; }
	if( isset($_REQUEST['locs'])) { $locs=$_REQUEST['locs']; }
	if( isset($_REQUEST['whos'])) { $whos=$_REQUEST['whos']; }
	if( isset($_REQUEST['select_acts'])) { $select_acts=$_REQUEST['select_acts']; }
	if( isset($_REQUEST['select_locs'])) { $select_locs=$_REQUEST['select_locs']; }
	if( isset($_REQUEST['select_whos'])) { $select_whos=$_REQUEST['select_whos']; }

#		print( "BUGS_101 db3file=$db3file<br>");
#		print( "BUGS_102b acts=$acts<br>");
#		print( "BUGS_102m locs=$locs<br>");
#		print( "BUGS_102u whos=$whos<br>");
#		print( "BUGS_103b select_acts=$select_acts<br>");
#		print( "BUGS_103m select_locs=$select_locs<br>");
#		print( "BUGS_103u select_whos=$select_whos<br>");

$acts_amt=0;
$locs_amt=0;
$whos_amt=0;
$kolog_amt=0;
$types="acts locs whos";
	foreach(explode(" ",$types) as $type) {
		$j=0; 
		if( preg_match("/acts/", $type, $matchs )) {
			$tblname=$type;
			$list=$acts;
			$select=$select_acts;
#			print( "BUGS_101 ACTS type=$type tblname=$tblname<br>");
			}
		if( preg_match("/locs/", $type, $matchs )) {
			$tblname=$type;
			$list=$locs;
			$select=$select_locs;
#			print( "BUGS_102 LOCS type=$type tblname=$tblname<br>");
			}
		if( preg_match("/whos/", $type, $matchs )) {
			$tblname=$type;
			$list=$whos;
			$select=$select_whos;
#			print( "BUGS_103 WHOS type=$type tblname=$tblname<br>");
			}

# phpinfo();
#		print( "BUGS_200 db3file=$db3file tblname=$tblname j=$j selects=$selects fbid=$fbid desc=$desc media=$media<br>" );	

		$sql="select * from $tblname";
		if( is_array($select)) {
			$select=implode(" ",$select);
			}
		$sql="select * from $tblname where fbid='$select'";
#		$sql="select * from $tblname where fbid='".implode(" ",$select)."'";
#		print( "BUGS_201 select=$select sql=$sql<br>" );
		
		$pdo = newpdo($db3file);
		foreach( $pdo->query($sql) as $row ) {
			$j=$j+1;
			$fbid="";
			$grp="";
			$media="";
			$tn="";
			$link="";
			$credit="";
			$caption="";
			$text;
			$desc="";

			$fbid=$row['fbid'];
			$grp=$row['grp'];
			$media=$row['media'];
			$tn=$row['tn'];
			$link=$row['link'];
			$credit=$row['credit']; 
			$amt=$credit;
			$caption=$row['caption'];
			$text=$row['text'];
			$desc=$row['desc'];
			if( preg_match( "/acts/", $type, $matches )) {
				$acts_amt=$acts_amt+$amt;
				}
			if( preg_match( "/locs/", $type, $matches )) {
				$locs_amt=$locs_amt+$amt;
				}
			if( preg_match( "/whos/", $type, $matches )) {
				$whos_amt=$whos_amt+$amt;
				}

//			print( "BUGS_250 MATCH j=$j grp=$grp type=$type select=$select sql=$sql fbid=$fbid<br>");
			$html_tbl = "";
			$html_tbl .= "<table id=table_select_$fbid>";
			$html_tbl .= "<tr>";
			$html_tbl .= "<td width=200>img</td>";
			$html_tbl .= "<td> &nbsp </td>";
			$html_tbl .= "<td>id</td>";
			$html_tbl .= "<td> &nbsp </td>";
			$html_tbl .= "<td>grp</td>";
			$html_tbl .= "<td> &nbsp </td>";
			$html_tbl .= "<td>type</td>";
			$html_tbl .= "<td> &nbsp </td>";
			$html_tbl .= "<td>amt</td>";
			$html_tbl .= "<td> &nbsp </td>";
			$html_tbl .= "<td>caption</td>";
			$html_tbl .= "<td> &nbsp </td>";
			$html_tbl .= "<td>text</td>";
			$html_tbl .= "<td> &nbsp </td>";
			$html_tbl .= "<td>desc</td>";
			$html_tbl .= "</tr>";


			$html_tbl .= "<tr>";
			$html_tbl .= "<td width=200>";
			$html_tbl .= "<a href=".$media." target=_blank>";
			$html_tbl .= "	<img src=".$tn." height=50 >";
			$html_tbl .= "	</a>";
			$html_tbl .= "	</td>";
			$html_tbl .= "<td> &nbsp &nbsp </td>";
			$html_tbl .= "<td>$fbid</td>";
			$html_tbl .= "<td> &nbsp &nbsp </td>";
			$html_tbl .= "<td>$grp</td>";
			$html_tbl .= "<td> &nbsp &nbsp </td>";
			$html_tbl .= "<td>$type</td>";
			$html_tbl .= "<td> &nbsp &nbsp </td>";
			$html_tbl .= "<td>\$credit</td>";
			$html_tbl .= "<td> &nbsp &nbsp </td>";
			$html_tbl .= "<td>$caption</td>";
			$html_tbl .= "<td> &nbsp &nbsp </td>";
			$html_tbl .= "<td>$text</td>";
			$html_tbl .= "<td> &nbsp &nbsp </td>";
			$html_tbl .= "<td>$desc</td>";
			$html_tbl .= "</tr>";
			$html_tbl .= "	</table>";

			$html = $html_tbl;
			if( preg_match("/acts/", $type, $matches )) {
				$html_select_acts .= $html;
				}
			if( preg_match("/locs/", $type, $matches )) {
				$html_select_locs .= $html;
				}
			if( preg_match("/whos/", $type, $matches )) {
				$html_select_whos .= $html;
				}

			$progid="ko";
			$dttm=date('Ymd_His');
			$remote_addr="";
			$remote_port="";
			$referer="";
			$http_user_agent="";
			$query_string="";
			if( isset( $_SERVER['REMOTE_ADDR'])) {
				$remote_addr=$_SERVER['REMOTE_ADDR'];
				$remote_addr=str_replace(".","-",$remote_addr);
				}
			if( isset( $_SERVER['HTTP_USER_AGENT'])) {
				$http_user_agent=$_SERVER['HTTP_USER_AGENT'];
				$http_user_agent=str_replace(" ","",$http_user_agent );
				$http_user_agent=str_replace(".","",$http_user_agent );
				$http_user_agent=str_replace(";","",$http_user_agent );
				$http_user_agent=str_replace(":","",$http_user_agent );
				$http_user_agent=str_replace("/","",$http_user_agent );
				$http_user_agent=str_replace("\n","",$http_user_agent );
				$http_user_agent=str_replace("(","",$http_user_agent );
				$http_user_agent=str_replace(")","",$http_user_agent );
				}
			if( isset( $_SERVER['REMOTE_PORT'])) { $remote_port=$_SERVER['REMOTE_PORT']; }
			if( isset( $_SERVER['REFERER'])) { $referer=$_SERVER['REFERER']; }
			if( isset( $_SERVER['QUERY_STRING'])) {
				$query_string=$_SERVER['QUERY_STRING'];
				$query_string=str_replace("%27","",$query_string);
				}

			$progid="ko";
			$krow="ko";
			$grp=$type;
			
			$pathfile=$media;



			$db3file="ko.db3";
			$tblname="kologs";
#			$pdo = newpdo($db3file);
			foreach( $pdo->query($sql) as $row ) {
				$j=$j+1;
				$fbid=$row['fbid'];
				$grp=$row['grp'];
				$media=$row['media'];
				$tn=$row['tn'];
				$link=$row['link'];
				$credit=$row['credit']; $amt=$credit;
				$caption=$row['caption'];
				$text=$row['text'];
				$desc=$row['desc'];

				$sql = "";
				$sql .= "insert or replace into $tblname (";
				$sql .= "'progid',";
				$sql .= "'krow',";
				$sql .= "'dttm',";
				$sql .= "'remote_addr',";
				$sql .= "'remote_port',";
				$sql .= "'referer',";
				$sql .= "'user_agent',";
				$sql .= "'query_string',";
				$sql .= "'pathfile',";

				$sql .= "'fbid',";
				$sql .= "'grp',";
				$sql .= "'media',";
				$sql .= "'tn',";
				$sql .= "'link',";
				$sql .= "'credit',";
				$sql .= "'caption',";
				$sql .= "'text',";
				$sql .= "'desc'";
				$sql .= " ) values ( ";
				$sql .= "'$progid',";
				$sql .= "'$krow',";
				$sql .= "'$dttm',";
				$sql .= "'$remote_addr',";
				$sql .= "'$remote_port',";
				$sql .= "'$referer',";
				$sql .= "'$http_user_agent',";
				$sql .= "'$query_string',";
				$sql .= "'$pathfile',";
				$sql .= "'$fbid',";
				$sql .= "'$grp',";
				$sql .= "'$media',";
				$sql .= "'$tn',";
				$sql .= "'$link',";
				$sql .= "'$credit',";
				$sql .= "'$caption',";
				$sql .= "'$text',";
				$sql .= "'$desc'";
				$sql .= " ) ";

#				print( "BUGS_2370 sql=$sql<br>" );
				$pdo->exec($sql);

				}



#			print( "BUGS_2500 type=$type tblname=$tblname j=$j select=$select fbid=$fbid desc=$desc media=$media<br>" );	
			}
		$pdo = null;
#		print( "BUGS_2530 type=$type tblname=$tblname j=$j select=$select fbid=$fbid desc=$desc media=$media<br>" );	
		}

	$dttm=date('Ymd_His');
	$html="";
	$html .= "<html>";
	$html .= "<head>";
	$html .= "	<title>/ko.php $dttm</title>";

	$html .= "	<script id=script_hideshow>";
	$html .= "		function script_hideshow(args) {";
	$html .= "			divid=args;";
	$html .= "			alert( \"BUGS_123 script_hideshow args=\"+args );";
	$html .= "			if( document.getElementByID(divid)) { ";
	$html .= "				if( document.getElementByID(divid).style.display == \"inline\") { ";
	$html .= "					document.getElementById(divid).style.display = \"none\"; ";
	$html .= "					}";
	$html .= "				else {";
	$html .= "					document.getElementById(divid).style.display = \"none\"; ";
	$html .= "					}";
	$html .= "				}";

	$html .= "			return(htmout);";
	$html .= "			}";

	$html .= "		</script>";

	$html .= "	</head>";
	$html .= "<body bgcolor=linen>";
	$html .= "<hr color=goldenrod>";

//	$html .= "<img src=ko.png onclick=\"script_hideshow('div_head'); return false;\" height=50><br>";
	$html .= "<a href=?kolog target=_blank><img src=/imgs/btn/koeye.png height=50></a>";
	$html .= "<hr color=goldenrod>";
	$html .= "<div id=div_head>";
	$html .= "	<h1>div_head</h1>";
	$html .= "	</div>";
	$html .= "<br>";
	$html .= "<hr bgcolor=goldenrod>";
	$html .= "<h1>kolog: selects</h1>";
	$html .= "<h2>select_acts</h2>";
	$html .= $html_select_acts;
	$html .= "acts_amt=$acts_amt<br>";

	$html .= "<h2>select_locs</h2>";
	$html .= $html_select_locs;
	$html .= "locs_amt=$locs_amt<br>";
	$html .= "<h2>select_whos</h2>";
	$html .= $html_select_whos;
	$html .= "whos_amt=$whos_amt<br>";
	$html .= "<hr color=goldenrod>";
	$kolog_amt=0;
	$kolog_amt=$kolog_amt+$acts_amt;
	$kolog_amt=$kolog_amt+$locs_amt;
	$kolog_amt=$kolog_amt+$whos_amt;

	$html .= "kolog_amt=$kolog_amt<br>";
	print( $html );
	return($htmout);
	}



function kolog_form() {

$db3file="ko.db3";
$htmout=""; $j=0;$k=0;
$dttm=date('Ymd_His');
print("<hr color=black>");
print("<hr color=white>");
print("<a href=/ target=_blank ><img src=ko.png height=10></a>");
print("<hr color=white>");
print("<hr color=black>");
print( "<h1>kolog FORM $dttm</h1>" );
print("<h2>$dttm</h2>" );

$html_select_acts="";
$html_select_locs="";
$html_select_whos="";
$acts="";
$locs="";
$whos="";

if( isset($_REQUEST['acts'])) { $acts=$_REQUEST['acts']; }
if( isset($_REQUEST['locs'])) { $marks=$_REQUEST['locs']; }
if( isset($_REQUEST['whos'])) { $usbs=$_REQUEST['whos']; }


	$html_form="";
//	$html_form .= "<form id=\"form_kologs\" method=\"post\" action=\"?kolog=submit\" >";


	$html_form .= "<input type=\"hidden\" id=\"acts\" name=\"acts\" value=\"".$acts."\" >";	
	$html_form .= "<input type=\"hidden\" id=\"locs\" name=\"locs\" value=\"".$locs."\" >";	
	$html_form .= "<input type=\"hidden\" id=\"whos\" name=\"whos\" value=\"".$whos."\" >";	

	$html_form .= "<table id=\"table_form_kologs\">";
	$html_form .= "<tr><td>form_fname</td><td><input type=\"text\" id=\"form_fname\" name=\"form_fname\"></input></td></tr>";
	$html_form .= "<tr><td>form_lname</td><td><input type=\"text\" id=\"form_lname\" name=\"form_lname\"></input></td></tr>";
	$html_form .= "<tr><td>form_addr</td><td><input type=\"text\" id=\"form_addr\" name=\"form_addr\"></input></td></tr>";
	$html_form .= "<tr><td>form_city</td><td><input type=\"text\" id=\"form_city\" name=\"form_city\"></input></td></tr>";
	$html_form .= "<tr><td>form_zip</td><td><input type=\"text\" id=\"form_zip\" name=\"form_zip\"></input></td></tr>";

	$html_form .= "<tr><td>form_note</td><td><input type=\"text\" id=\"form_note\" name=\"form_note\"></input></td></tr>";
	$html_form .= "<tr><td>form_file</td><td><input type=\"file\" id=\"form_file\" name=\"form_file\"></input></td></tr>";
	$html_form .= "<tr><td>form_checkbox</td><td><input type=\"checkbox\" id=\"form_checkbox\" name=\"form_checkbox\"></input></td></tr>";
	$html_form .= "<tr><td>form_checkbox</td><td><input type=\"checkbox\" id=\"form_checkbox\" name=\"form_checkbox\"></input></td></tr>";
	$html_form .= "<tr><td>form_checkbox</td><td><input type=\"checkbox\" id=\"form_checkbox\" name=\"form_checkbox\"></input></td></tr>";

	$html_form .= "<tr><td>form_date</td><td><input type=\"date\" id=\"form_date\" name=\"form_date\"></td><td></input></td></tr>";
	$html_form .= "<tr><td>form_mail</td><td><input type=\"email\" id=\"form_email\" name=\"form_email\"></td><td></input></td></tr>";
	$html_form .= "<tr><td>form_radio</td><td><input type=\"radio\" id=\"form_radio\" name=\"form_radio\"></td><td></input></td></tr>";
	$html_form .= "<tr><td>form_radio</td><td><input type=\"radio\" id=\"form_radio\" name=\"form_radio\"></td><td></input></td></tr>";
	$html_form .= "<tr><td>form_radio</td><td><input type=\"radio\" id=\"form_radio\" name=\"form_radio\"></td><td></input></td></tr>";
	$html_form .= "<tr><td>form_tel</td><td><input type=\"tel\" id=\"form_tel\" name=\"form_tel\"></td><td></input></td></tr>";
	$html_form .= "<tr><td>form_url</td><td><input type=\"url\" id=\"form_url\" name=\"form_url\"></td><td></input></td></tr>";
	$html_form .= "<tr><td>form_week</td><td><input type=\"week\" id=\"form_week\" name=\"form_week\"></td><td></input></td></tr>";
	$html_form .= "<tr><td>form_image</td><td><input type=\"image\" id=\"form_image\" name=\"form_image\"></td><td></input></td></tr>";
	$html_form .= "<tr><td>form_month</td><td><input type=\"month\" id=\"form_month\" name=\"form_month\"></td><td></input></td></tr>";
	$html_form .= "<tr><td>form_number</td><td><input type=\"number\" id=\"form_number\" name=\"form_number\"></td><td></input></td></tr>";
	$html_form .= "<tr><td>form_password</td><td><input type=\"password\" id=\"form_password\" name=\"form_password\"></td><td></input></td></tr>";
	$html_form .= "<tr><td>form_range</td><td><input type=\"range\" id=\"form_range\" name=\"form_range\"></td><td></input></td></tr>";
	$html_form .= "<tr><td>form_time</td><td><input type=\"time\" id=\"form_time\" name=\"form_time\"></td><td></input></td></tr>";
	$html_form .= "<tr><td>form_search</td><td><input type=\"search\" id=\"kolog_search\" name=\"form_search\"></td><td></input></td></tr>";
	$html_form .= "	</table>";
//	$html_form .= "<input type=\"submit\">";
//	$html_form .= "</form>";

	$dttm=date('Ymd_His');

	$html = "";
	$html .= "<html>";
	$html .= "	<head>";
	$html .= "		<title>ko.php?id=kolog_form $dttm</title>";
	$html .= "	</head>";
	$html .= "<body bgcolor=linen >";
	$html .= "<a href=?kolog target=_blank><img src=/imgs/btn/koeye.png height=100></a>";
	$html .= "<hr color=goldenrod>";
	$html .= "<hr color=red>";
	$html .= "<hr color=white>";
	$html .= "<hr color=blue>";

//	$html .= "<h1>BUGS_1001</h1>";
//	$html .= $html_form;
//	$html .= "<h1>BUGS_1002</h1>";

	$html .= "<hr color=red>";
	$html .= "<hr color=white>";
	$html .= "<hr color=blue>";

#	$html .= "<form method=\"post\" id=form_kologs action=\"ko.php?kolog=submit\" >";
#	$html .= "<form method=\"post\" id=form_kologs action=\"ko.php?kolog=submit\" >";




$types="acts locs whos";
	foreach( explode(" ", $types) as $type ) {
#		$html .= "<select class=\"select\" id=select_$type name=select_$type multiple size=\"20\" >";

		$tblname=$type;
#		if( preg_match("/acts/", $type, $matches )) { $tblname=$type; $lists=$acts; }
#		if( preg_match("/locs/", $type, $matches )) { $tblname=$type; $lists=$locs; }
#		if( preg_match("/whos/", $type, $matches )) { $tblname=$type; $lists=$whos; }


#		$sql="select * from $tblname where fbid='$select'";
		$sql="select * from $tblname";
#		print( "BUGS_300 type=$type sql=$sql<br>" );


		$fbid="";
		$grp="";
		$media="";
		$tn="";
		$link="";
		$credit="";
		$caption="";
		$desc="";

		$html_select = "";
#		$html_select .= "<select id=select_$type multiple size=25 >";
		if( preg_match("/acts/", $type, $matches )) {
			$html_select_acts = "";
			$html_select_acts .= "<select id=select_$type multiple size=25 >";
			}
		if( preg_match("/locs/", $type, $matches )) {
			$html_select_locs = "";
			$html_select_locs .= "<select id=select_$type multiple size=25 >";
			}
		if( preg_match("/whos/", $type, $matches )) {
			$html_select_whos = "";
			$html_select_whos .= "<select id=select_$type multiple size=25 >";
			}
# 		print( "BUGS_301 html=$html" );
		
		$pdo = newpdo($db3file);
		foreach( $pdo->query($sql) as $row ) {
			$j=$j+1;
			$fbid=$row['fbid'];
			$grp=$row['grp'];
			$media=$row['media'];
			$tn=$row['tn'];
			$link=$row['link'];
			$credit=$row['credit'];
			$caption=$row['caption'];
			$text=$row['text'];
			$desc=$row['desc'];

#			print( "BUGS_601 j=$j fbid=$fbid credit=$credit desc=$desc<br>" );
#			print( "BUGS_602 j=$j fbid=$fbid html_select=<hr>$html_select<hr>" );

			$html_select="";
			$html_select .= "<option ";
			$html_select .= " id=\"select_$type\" ";
			$html_select .= " name=\"select_$type\" ";
			$html_select .= ">";
			$html_select .= "$j ";
			$html_select .= "$grp ";
			$html_select .= "$fbid ";
			$html_select .= "$credit ";
			$html_select .= "$caption ";
			$html_select .= "$text ";
			$html_select .= "$desc ";
			$html_select .= "	</option>";
			$html_select .= "<br>";
#			print( "BUGS_1050 html_select=$html_select<br>" );

			if( preg_match("/acts/", $type, $matches )) {
				$html_select_acts .= $html_select; 
#				$html_select_acts .= "	</select>"; 
#				printf( "BUGS_1051 $j $fbid html_select_acts=$html_select_acts" );
				}
			if( preg_match("/locs/", $type, $matches )) {
				$html_select_locs .= $html_select; 
#				$html_select_locs .= "	</select>"; 
#				printf( "BUGS_1052 html_select_locs=$html_select_locs" );
				}
			if( preg_match("/whos/", $type, $matches )) { 
				$html_select_whos .= $html_select; 
#				$html_select_whos .= "	</select>"; 
# 				printf( "BUGS_1053 html_select_whos=$html_select_whos" );
				}

			}

		if( preg_match("/acts/", $type, $matches )) { $html_select_acts .= "	</select>"; 
#			print( "BUGS_631 html_select_acts=$html_select_acts<br>");
			}
		if( preg_match("/locs/", $type, $matches )) { $html_select_locs .= "	</select>"; 
#			print( "BUGS_632 html_select_locs=$html_select_locs<br>");
			}
		if( preg_match("/whos/", $type, $matches )) { $html_select_whos .= "	</select>"; 
#			print( "BUGS_633html_select_whos=$html_select_whos<br>");
			}

#		print( "BUGS_650 type=$type html=$html" );
		}


	$html_select="";
	$html_select .= "<hr color=goldenrod>";
	$html_select .= "<hr color=black>";
	$html_select .= "<table id=table_form>";
	$html_select .= "<tr><td>acts</td><td width=10> &nbsp </td><td>locs</td><td> &nbsp </td><td>whos</td></tr>";
	$html_select .= "<tr>";
	$html_select .= "	<td>";
	$html_select .= 		$html_select_acts;
	$html_select .= "		</td>";
	$html_select .= "	<td width=20> &nbsp </td>";

	$html_select .= "	<td>";
	$html_select .= 		$html_select_locs;
	$html_select .= "		</td>";
	$html_select .= "	<td width=20> &nbsp </td>";

	$html_select .= "	<td>";
	$html_select .= 		$html_select_whos;
	$html_select .= "		</td>";
	$html_select .= "	</tr>";
	$html_select .= "	</table>";
	$html_select .= "<hr color=black>";
	$html_select .= "<hr color=goldenrod>";
#	$html_select .= "BUGS_3000<br>";


#	print( $html );

	$html_flds = "";
	$html_flds .= "<table id=table_flds>";
	$html_flds .= "<tr><td></td><td><input type=\"hidden\" id=\"acts\" value=\"$acts\" ></input></td></tr>";
	$html_flds .= "<tr><td></td><td><input type=\"hidden\" id=\"locs\" value=\"$locs\" ></input></td></tr>";
	$html_flds .= "<tr><td></td><td><input type=\"hidden\" id=\"whos\" value=\"$whos\" ></input></td></tr>";

	$html_flds .= "<tr><td>fname</td><td><input type=\"text\" id=\"form_fname\"></input></td></tr>";
	$html_flds .= "<tr><td>lname</td><td><input type=\"text\" id=\"form_lname\"></input></td></tr>";
	$html_flds .= "<tr><td>addr</td><td><input type=\"text\" id=\"form_addr\"></input></td></tr>";
	$html_flds .= "<tr><td>city</td><td><input type=\"text\" id=\"form_city\"></input></td></tr>";
	$html_flds .= "<tr><td>zip</td><td><input type=\"text\" id=\"form_zip\"></input></td></tr>";
	$html_flds .= "<tr><td>country</td><td><input type=\"text\" id=\"form_country\"></input></td></tr>";

	$html_flds .= "<tr><td>notes</td><td><input type=\"text\" id=\"form_notes\"></input></td></tr>";
	$html_flds .= "<tr><td>tel</td><td><input type=\"tel\" id=\"form_phn\"></input></td></tr>";
	$html_flds .= "<tr><td>email</td><td><input type=\"email\" id=\"form_email\"></input></td></tr>";
	$html_flds .= "<tr><td>url</td><td><input type=\"url\" id=\"form_url\"></input></td></tr>";

	$html_flds .= "<tr><td>file</td><td><input type=\"text\" id=\"form_file\"></input></td></tr>";
	$html_flds .= "<tr><td>checkbox</td><td><input type=\"text\" id=\"form_checkbox\"></input></td></tr>";
	$html_flds .= "<tr><td>date</td><td><input type=\"text\" id=\"form_date\"></input></td></tr>";
	$html_flds .= "<tr><td>radio</td><td><input type=\"text\" id=\"form_radio\"></input></td></tr>";
	$html_flds .= "<tr><td>number</td><td><input type=\"text\" id=\"form_number\"></input></td></tr>";
	$html_flds .= "<tr><td>image</td><td><input type=\"text\" id=\"form_image\"></input></td></tr>";
	$html_flds .= "<tr><td>date</td><td><input type=\"text\" id=\"form_date\"></input></td></tr>";
	$html_flds .= "<tr><td>month</td><td><input type=\"text\" id=\"form_month\"></input></td></tr>";
	$html_flds .= "<tr><td>week</td><td><input type=\"text\" id=\"form_week\"></input></td></tr>";

	$html_flds .= "<tr><td>submit</td><td><input type=\"submit\" id=\"form_submit\"></input></td></tr>";
	$html_flds .= "	</table>";
	$html_flds .= "<hr color=black>";

#	print( "BUGS_2960 html_flds=$html_flds" );
	$html_kludge="";
	$html_kludge .= "<hr color=blue>";
	$html_kludge .= "<hr color=white>";
	$html_kludge .= "<hr color=red>";
	$html_kludge .= "<h1>form</h1>";
	$html_kludge .= "<form method=\"post\" id=\"form_kolog\" action=\"ko.php?kolog=submit\">";
	$html_kludge .= "	<hr color=white>";
	$html_kludge .= 	$html_select;
	$html_kludge .= "	<hr color=black>";
	$html_kludge .= 	$html_flds;
	$html_kludge .= "	<hr color=white>";
	$html_kludge .= "	</form>";
	$html_kludge .= "<hr color=red>";
	$html_kludge .= "<hr color=white>";
	$html_kludge .= "<hr color=blue>";
	$html_kludge .= "<h1>BUGS_END</h1>";
	$html_kludge .= "</body>";
	$html_kludge .= "</html>";

#	print( "BUGS_730 html_kludge=$html_kludge" );

	$dttm=date('Ymd_His');

	$html = "";
	$html .= "<html>";
	$html .= "<head>";
	$html .= "	<title>ko.php?kolog=submit $dttm</title>";
	$html .= "	</head>";
	$html .= "<body bgcolor=linen>";

//	$html .= "<h1>BUGS_1201</h1>";
	$html .= "<a href=ko.php?kolog target=_blank><img src=/imgs/btn/koeye.png height=50></a>";
	$html .= "<hr color=goldenrod>";
	$html .= "<form method=\"post\" id=\"form_kologs\" action=\"ko.php?kolog=submit\">";
	$html .= $html_select;
//	$html .= $html_flds;
	$html .= $html_form;
	$html .= "<input type=\"submit\">";
	$html .= "	</form>";
//	$html .= "<h1>BUGS_1202</h1>";

	$html .= "	</body>";
	$html .= "	</html>";


//	print($html);


//	print( "<form method=\"post\" id=\"form_kologs\" action=\"ko.php?kolog=submit\">");
//	print( $html_select );
//	print( $html_flds );
//	print( "	</form>" );
	return($html);
	}

function kolog_list() {
$db3file="ko.db3";
$htmout=""; $j=0;$k=0;
print( "<h1>kolog LIST $db3file</h1>" );

$html_acts="";
$html_locs="";
$html_whos="";
$acts="";
$locs="";
$whos="";

if( isset($_REQUEST['acts'])) { $acts=$_REQUEST['acts']; }
if( isset($_REQUEST['locs'])) { $locs=$_REQUEST['locs']; }
if( isset($_REQUEST['whos'])) { $whos=$_REQUEST['whos']; }

# print( "BUGS_300 acts=$acts<br>");
# print( "BUGS_300 locs=$locs<br>");
# print( "BUGS_300 whos=$whos<br>");

$types="acts locs whos";
	foreach( explode(" ", $types) as $type ) {
		if( preg_match("/acts/", $type, $matches )) { $tblname=$type; $lists=$acts; }
		if( preg_match("/locs/", $type, $matches )) { $tblname=$type; $lists=$locs; }
		if( preg_match("/whos/", $type, $matches )) { $tblname=$type; $lists=$whos; }

# jjjjjjjjjjjjjjjjjjjjjjj

#		$sql="select * from $tblname where fbid='$select'";
		$sql="select * from $tblname";
#		print( "BUGS_300 type=$type sql=$sql<br>" );

		$fbid="";
		$grp="";
		$media="";
		$tn="";
		$link="";
		$credit="";
		$caption="";
		$desc="";

		$html = "";
		$html .= "<table id=table_$type>";
		$html .= "<tr>";
		$html .= "<td width=200>img</td>";
		$html .= "<td> &nbsp </td>";
		$html .= "<td>id</td>";
		$html .= "<td> &nbsp </td>";
		$html .= "<td>grp</td>";
		$html .= "<td> &nbsp </td>";
		$html .= "<td>type</td>";
		$html .= "<td> &nbsp </td>";
		$html .= "<td>amt</td>";
		$html .= "<td> &nbsp </td>";
		$html .= "<td>caption</td>";
		$html .= "<td> &nbsp </td>";
		$html .= "<td>text</td>";
		$html .= "<td> &nbsp </td>";
		$html .= "<td>desc</td>";
		$html .= "</tr>";

# 		print( "BUGS_301 html=$html" );
		
		$pdo = newpdo($db3file);
		foreach( $pdo->query($sql) as $row ) {
			$j=$j+1;
			$fbid=$row['fbid'];
			$grp=$row['grp'];
			$media=$row['media'];
			$tn=$row['tn'];
			$link=$row['link'];
			$credit=$row['credit'];
			$caption=$row['caption'];
			$text=$row['text'];
			$desc=$row['desc'];


			$html .= "<tr>";
			$html .= "<td width=200>";
			$html .= "<a href=".$media." target=_blank>";
			$html .= "	<img src=".$tn." height=50 >";
			$html .= "	</a>";
			$html .= "	</td>";
			$html .= "<td> &nbsp &nbsp </td>";
			$html .= "<td>$fbid</td>";
			$html .= "<td> &nbsp &nbsp </td>";
			$html .= "<td>$grp</td>";
			$html .= "<td> &nbsp &nbsp </td>";
			$html .= "<td>$type</td>";
			$html .= "<td> &nbsp &nbsp </td>";
			$html .= "<td>\$$credit</td>";
			$html .= "<td> &nbsp &nbsp </td>";
			$html .= "<td>$caption</td>";
			$html .= "<td> &nbsp &nbsp </td>";
			$html .= "<td>$text</td>";
			$html .= "<td> &nbsp &nbsp </td>";
			$html .= "<td>$desc</td>";
			$html .= "</tr>";

			}
		$html .= "	</table>";
		print( "BUGS_2860 type=$type html=$html" );

		if( preg_match("/acts/", $type, $matches )) { $html_acts=$html; }
		if( preg_match("/locs/", $type, $matches )) { $html_locs=$html; }
		if( preg_match("/whos/", $type, $matches )) { $html_whos=$html; }


		}

	$html .= "<h1>kolog $dttm</h2>";
	$html .= "<h2>acts</h2>";
	$html .= $html_acts;
	$html .= "<h2>locs</h2>";
	$html .= $html_locs;
	$html .= "<h2>whos</h2>";
	$html .= $html_whos;
	return($htmout);
	}


// kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk




function bookmarkusb_form() {
$htmout=""; $j=0;$k=0;
	print( "<h1>BOOKMARKUSB_FORM</h1>" );
#	foreach($_REQUEST as $key=>$value) { $j=$j+1; }

$books=""; 
$marks=""; 
$usbs="";
$select_books=array();
$select_marks=array();
$select_usbs=array();
$html_books="";
$html_marks="";
$html_usbs="";
$html_select_books="";
$html_select_marks="";
$html_select_usbs="";
$db3file="ko.db3";
$tblname="orders";
$sql="";
$selects=array();
$select="";
$fbid="";
$desc="";
$media="";


	if( isset($_REQUEST['books'])) { $books=$_REQUEST['books']; }
	if( isset($_REQUEST['marks'])) { $marks=$_REQUEST['marks']; }
	if( isset($_REQUEST['usbs'])) { $usbs=$_REQUEST['usbs']; }
	if( isset($_REQUEST['select_books'])) { $select_books=$_REQUEST['select_books']; }
	if( isset($_REQUEST['select_marks'])) { $select_marks=$_REQUEST['select_marks']; }
	if( isset($_REQUEST['select_usbs'])) { $select_usbs=$_REQUEST['select_usbs']; }

#		print( "BUGS_101 db3file=$db3file<br>");
#		print( "BUGS_102b books=$books<br>");
#		print( "BUGS_102m marks=$marks<br>");
#		print( "BUGS_102u usbs=$usbs<br>");
#		print( "BUGS_103b select_books=$select_books<br>");
#		print( "BUGS_103m select_marks=$select_marks<br>");
#		print( "BUGS_103u select_usbs=$select_usbs<br>");

$books_amt=0;
$marks_amt=0;
$usbs_amt=0;
$bookmarkusb_amt=0;
$types="books marks usbs";
	foreach(explode(" ",$types) as $type) {
		$j=0; 
		if( preg_match("/books/", $type, $matchs )) {
			$tblname=$type;
			$list=$books;
			$select=$select_books;
#			print( "BUGS_101 BOOKS type=$type tblname=$tblname<br>");
			}
		if( preg_match("/marks/", $type, $matchs )) {
			$tblname=$type;
			$list=$marks;
			$select=$select_marks;
#			print( "BUGS_102 MARKS type=$type tblname=$tblname<br>");
			}
		if( preg_match("/usbs/", $type, $matchs )) {
			$tblname=$type;
			$list=$usbs;
			$select=$select_usbs;
#			print( "BUGS_103 USBS type=$type tblname=$tblname<br>");
			}

# phpinfo();
#		print( "BUGS_200 db3file=$db3file tblname=$tblname j=$j selects=$selects fbid=$fbid desc=$desc media=$media<br>" );	

		$sql="select * from $tblname";
		if( is_array($select)) {
			$select=implode(" ",$select);
			}
		$sql="select * from $tblname where fbid='$select'";
#		$sql="select * from $tblname where fbid='".implode(" ",$select)."'";
#		print( "BUGS_201 select=$select sql=$sql<br>" );
		
		$pdo = newpdo($db3file);
		foreach( $pdo->query($sql) as $row ) {
			$j=$j+1;
			$fbid="";
			$grp="";
			$media="";
			$tn="";
			$link="";
			$credit="";
			$caption="";
			$text;
			$desc="";

			$fbid=$row['fbid'];
			$grp=$row['grp'];
			$media=$row['media'];
			$tn=$row['tn'];
			$link=$row['link'];
			$credit=$row['credit']; 
			$amt=$credit;
			$caption=$row['caption'];
			$text=$row['text'];
			$desc=$row['desc'];
			if( preg_match( "/books/", $type, $matches )) {
				$books_amt=$books_amt+$amt;
				}
			if( preg_match( "/marks/", $type, $matches )) {
				$marks_amt=$marks_amt+$amt;
				}
			if( preg_match( "/usbs/", $type, $matches )) {
				$usbs_amt=$usbs_amt+$amt;
				}

//			print( "BUGS_250 MATCH j=$j grp=$grp type=$type select=$select sql=$sql fbid=$fbid<br>");
			$html_tbl = "";
			$html_tbl .= "<table id=table_select_$fbid>";
			$html_tbl .= "<tr>";
			$html_tbl .= "<td width=200>img</td>";
			$html_tbl .= "<td> &nbsp </td>";
			$html_tbl .= "<td>id</td>";
			$html_tbl .= "<td> &nbsp </td>";
			$html_tbl .= "<td>grp</td>";
			$html_tbl .= "<td> &nbsp </td>";
			$html_tbl .= "<td>type</td>";
			$html_tbl .= "<td> &nbsp </td>";
			$html_tbl .= "<td>amt</td>";
			$html_tbl .= "<td> &nbsp </td>";
			$html_tbl .= "<td>caption</td>";
			$html_tbl .= "<td> &nbsp </td>";
			$html_tbl .= "<td>text</td>";
			$html_tbl .= "<td> &nbsp </td>";
			$html_tbl .= "<td>desc</td>";
			$html_tbl .= "</tr>";


			$html_tbl .= "<tr>";
			$html_tbl .= "<td width=200>";
			$html_tbl .= "<a href=".$media." target=_blank>";
			$html_tbl .= "	<img src=".$tn." height=50 >";
			$html_tbl .= "	</a>";
			$html_tbl .= "	</td>";
			$html_tbl .= "<td> &nbsp &nbsp </td>";
			$html_tbl .= "<td>$fbid</td>";
			$html_tbl .= "<td> &nbsp &nbsp </td>";
			$html_tbl .= "<td>$grp</td>";
			$html_tbl .= "<td> &nbsp &nbsp </td>";
			$html_tbl .= "<td>$type</td>";
			$html_tbl .= "<td> &nbsp &nbsp </td>";
			$html_tbl .= "<td>\$$credit</td>";
			$html_tbl .= "<td> &nbsp &nbsp </td>";
			$html_tbl .= "<td>$caption</td>";
			$html_tbl .= "<td> &nbsp &nbsp </td>";
			$html_tbl .= "<td>$text</td>";
			$html_tbl .= "<td> &nbsp &nbsp </td>";
			$html_tbl .= "<td>$desc</td>";
			$html_tbl .= "</tr>";
			$html_tbl .= "	</table>";

			$html = $html_tbl;
			if( preg_match("/books/", $type, $matches )) {
				$html_select_books .= $html;
				}
			if( preg_match("/marks/", $type, $matches )) {
				$html_select_marks .= $html;
				}
			if( preg_match("/usbs/", $type, $matches )) {
				$html_select_usbs .= $html;
				}

			$progid="ko";
			$dttm=date('Ymd_His');
			$remote_addr="";
			$remote_port="";
			$referer="";
			$http_user_agent="";
			$query_string="";
			if( isset( $_SERVER['REMOTE_ADDR'])) {
				$remote_addr=$_SERVER['REMOTE_ADDR'];
				$remote_addr=str_replace(".","-",$remote_addr);
				}
			if( isset( $_SERVER['HTTP_USER_AGENT'])) {
				$http_user_agent=$_SERVER['HTTP_USER_AGENT'];
				$http_user_agent=str_replace(" ","",$http_user_agent );
				$http_user_agent=str_replace(".","",$http_user_agent );
				$http_user_agent=str_replace(";","",$http_user_agent );
				$http_user_agent=str_replace(":","",$http_user_agent );
				$http_user_agent=str_replace("/","",$http_user_agent );
				$http_user_agent=str_replace("\n","",$http_user_agent );
				$http_user_agent=str_replace("(","",$http_user_agent );
				$http_user_agent=str_replace(")","",$http_user_agent );
				}
			if( isset( $_SERVER['REMOTE_PORT'])) { $remote_port=$_SERVER['REMOTE_PORT']; }
			if( isset( $_SERVER['REFERER'])) { $referer=$_SERVER['REFERER']; }
			if( isset( $_SERVER['QUERY_STRING'])) {
				$query_string=$_SERVER['QUERY_STRING'];
				$query_string=str_replace("%27","",$query_string);
				}

			$progid="ko";
			$krow="ko";
			$grp=$type;
			
			$pathfile=$media;



			$db3file="ko.db3";
			$tblname="orders";
#			$pdo = newpdo($db3file);
			foreach( $pdo->query($sql) as $row ) {
				$j=$j+1;
				$fbid=$row['fbid'];
				$grp=$row['grp'];
				$media=$row['media'];
				$tn=$row['tn'];
				$link=$row['link'];
				$credit=$row['credit']; $amt=$credit;
				$caption=$row['caption'];
				$text=$row['text'];
				$desc=$row['desc'];

				$sql = "";
				$sql .= "insert or replace into $tblname (";
				$sql .= "'progid',";
				$sql .= "'krow',";
				$sql .= "'dttm',";
				$sql .= "'remote_addr',";
				$sql .= "'remote_port',";
				$sql .= "'referer',";
				$sql .= "'user_agent',";
				$sql .= "'query_string',";
				$sql .= "'pathfile',";

				$sql .= "'fbid',";
				$sql .= "'grp',";
				$sql .= "'media',";
				$sql .= "'tn',";
				$sql .= "'link',";
				$sql .= "'credit',";
				$sql .= "'caption',";
				$sql .= "'text',";
				$sql .= "'desc'";
				$sql .= " ) values ( ";
				$sql .= "'$progid',";
				$sql .= "'$krow',";
				$sql .= "'$dttm',";
				$sql .= "'$remote_addr',";
				$sql .= "'$remote_port',";
				$sql .= "'$referer',";
				$sql .= "'$http_user_agent',";
				$sql .= "'$query_string',";
				$sql .= "'$pathfile',";
				$sql .= "'$fbid',";
				$sql .= "'$grp',";
				$sql .= "'$media',";
				$sql .= "'$tn',";
				$sql .= "'$link',";
				$sql .= "'$credit',";
				$sql .= "'$caption',";
				$sql .= "'$text',";
				$sql .= "'$desc'";
				$sql .= " ) ";

#				print( "BUGS_3150 sql=$sql<br>" );
				$pdo->exec($sql);

				}



#			print( "BUGS_3270 type=$type tblname=$tblname j=$j select=$select fbid=$fbid desc=$desc media=$media<br>" );	
			}
		$pdo = null;
#		print( "BUGS_3300 type=$type tblname=$tblname j=$j select=$select fbid=$fbid desc=$desc media=$media<br>" );	
		}

	$dttm=date('Ymd_His');
	$html="";
	$html .= "<html>";
	$html .= "<head>";
	$html .= "	<title>/ko.php $dttm</title>";

	$html .= "	<script id=script_hideshow>";
	$html .= "		function script_hideshow(args) {";
	$html .= "			divid=args;";
	$html .= "			alert( \"BUGS_123 script_hideshow args=\"+args );";
	$html .= "			if( document.getElementByID(divid)) { ";
	$html .= "				if( document.getElementByID(divid).style.display == \"inline\") { ";
	$html .= "					document.getElementById(divid).style.display = \"none\"; ";
	$html .= "					}";
	$html .= "				else {";
	$html .= "					document.getElementById(divid).style.display = \"none\"; ";
	$html .= "					}";
	$html .= "				}";

	$html .= "			return(htmout);";
	$html .= "			}";

	$html .= "		</script>";

	$html .= "	</head>";
	$html .= "<body bgcolor=linen>";
	$html .= "<hr color=goldenrod>";

	$html .= "<img src=ko.png onclick=\"script_hideshow('div_head'); return false;\" height=50><br>";
	$html .= "<hr color=goldenrod>";
	$html .= "<div id=div_head>";
	$html .= "	<h1>div_head</h1>";
	$html .= "	</div>";
	$html .= "<br>";
	$html .= "<hr bgcolor=goldenrod>";
	$html .= "<h1>bookmarkusb: selects</h1>";
	$html .= "<h2>select_books</h2>";
	$html .= $html_select_books;
	$html .= "books_amt=$books_amt<br>";

	$html .= "<h2>select_marks</h2>";
	$html .= $html_select_marks;
	$html .= "books_amt=$marks_amt<br>";
	$html .= "<h2>select_usbs</h2>";
	$html .= $html_select_usbs;
	$html .= "usbs_amt=$usbs_amt<br>";
	$html .= "<hr color=goldenrod>";
	$bookmarkusb_amt=0;
	$bookmarkusb_amt=$bookmarkusb_amt+$books_amt;
	$bookmarkusb_amt=$bookmarkusb_amt+$marks_amt;
	$bookmarkusb_amt=$bookmarkusb_amt+$usbs_amt;

	$html .= "bookmarkusb_amt=$bookmarkusb_amt<br>";
	print( $html );
	return($htmout);
	}



function bookmarkusb_select() {

$db3file="ko.db3";
$htmout=""; $j=0;$k=0;
$dttm=date('Ymd_His');
print("<hr color=black>");
print("<hr color=white>");
print("<a href=/ target=_blank ><img src=ko.png height=10></a>");
print("<hr color=white>");
print("<hr color=black>");
print( "<h1>BOOKMARKUSB_SELECT $dttm</h1>" );
print("<h2>$dttm</h2>" );

$html_select_books="";
$html_select_marks="";
$html_select_usbs="";
$books="";
$marks="";
$usbs="";

if( isset($_REQUEST['books'])) { $books=$_REQUEST['books']; }
if( isset($_REQUEST['marks'])) { $marks=$_REQUEST['marks']; }
if( isset($_REQUEST['usbs'])) { $usbs=$_REQUEST['usbs']; }

# print( "BUGS_300 books=$books<br>");
# print( "BUGS_300 marks=$marks<br>");
# print( "BUGS_300 usbs=$usbs<br>");

	$html = "";
	$html .= "<html>";
	$html .= "	<head>";
	$html .= "		<title>ko.php?id=bookmarkusb_form 20211024_1230</title>";
	$html .= "	</head>";
	$html .= "<body bgcolor=linen >";
	$html .= "<hr color=red>";
	$html .= "<hr color=white>";
	$html .= "<hr color=blue>";
#	$html .= "<form method=\"post\" id=form_bookmarkusb action=\"ko.php?id=bookmarkusb_form\" >";
#	$html .= "<form method=\"post\" id=form_bookmarkusb action=\"ko_selects.php\" >";




$types="books marks usbs";
	foreach( explode(" ", $types) as $type ) {
#		$html .= "<select class=\"select\" id=select_$type name=select_$type multiple size=\"20\" >";

		$tblname=$type;
#		if( preg_match("/books/", $type, $matches )) { $tblname=$type; $lists=$books; }
#		if( preg_match("/marks/", $type, $matches )) { $tblname=$type; $lists=$marks; }
#		if( preg_match("/usbs/", $type, $matches )) { $tblname=$type; $lists=$usbs; }

# jjjjjjjjjjjjjjjjjjjjjjj

#		$sql="select * from $tblname where fbid='$select'";
		$sql="select * from $tblname";
#		print( "BUGS_300 type=$type sql=$sql<br>" );


		

		$fbid="";
		$grp="";
		$media="";
		$tn="";
		$link="";
		$credit="";
		$caption="";
		$desc="";

#		$html .= "<table id=table_$type>";
#		$html .= "<tr>";
#		$html .= "<td width=200>img</td>";
#		$html .= "<td> &nbsp </td>";
#		$html .= "<td>id</td>";
#		$html .= "<td> &nbsp </td>";
#		$html .= "<td>grp</td>";
#		$html .= "<td> &nbsp </td>";
#		$html .= "<td>type</td>";
#		$html .= "<td> &nbsp </td>";
#		$html .= "<td>amt</td>";
#		$html .= "<td> &nbsp </td>";
#		$html .= "<td>caption</td>";
#		$html .= "<td> &nbsp </td>";
#		$html .= "<td>text</td>";
#		$html .= "<td> &nbsp </td>";
#		$html .= "<td>desc</td>";
#		$html .= "</tr>";
#
#
		$html_select = "";
#		$html_select .= "<select id=select_$type multiple size=25 >";
		if( preg_match("/books/", $type, $matches )) {
			$html_select_books = "";
			$html_select_books .= "<select id=select_$type multiple size=25 >";
			}
		if( preg_match("/marks/", $type, $matches )) {
			$html_select_marks = "";
			$html_select_marks .= "<select id=select_$type multiple size=25 >";
			}
		if( preg_match("/usbs/", $type, $matches )) {
			$html_select_usbs = "";
			$html_select_usbs .= "<select id=select_$type multiple size=25 >";
			}
# 		print( "BUGS_301 html=$html" );
		
		$pdo = newpdo($db3file);
		foreach( $pdo->query($sql) as $row ) {
			$j=$j+1;
			$fbid=$row['fbid'];
			$grp=$row['grp'];
			$media=$row['media'];
			$tn=$row['tn'];
			$link=$row['link'];
			$credit=$row['credit'];
			$caption=$row['caption'];
			$text=$row['text'];
			$desc=$row['desc'];

#			print( "BUGS_601 j=$j fbid=$fbid credit=$credit desc=$desc<br>" );
#			print( "BUGS_602 j=$j fbid=$fbid html_select=<hr>$html_select<hr>" );

			$html_select="";
			$html_select .= "<option ";
			$html_select .= " id=\"select_$type\" ";
			$html_select .= " name=\"select_$type\" ";
			$html_select .= ">";
			$html_select .= "$j ";
			$html_select .= "$grp ";
			$html_select .= "$fbid ";
			$html_select .= "$credit ";
			$html_select .= "$caption ";
			$html_select .= "$text ";
			$html_select .= "$desc ";
			$html_select .= "	</option>";
			$html_select .= "<br>";
#			print( "BUGS_610 html_select=$html_select<br>" );

			if( preg_match("/books/", $type, $matches )) {
				$html_select_books .= $html_select; 
#				$html_select_books .= "	</select>"; 
#				printf( "BUGS_611 $j $fbid html_select_books=$html_select_books" );
				}
			if( preg_match("/marks/", $type, $matches )) {
				$html_select_marks .= $html_select; 
#				$html_select_marks .= "	</select>"; 
#				printf( "BUGS_502 html_select_marks=$html_select_marks" );
				}
			if( preg_match("/usbs/", $type, $matches )) { 
				$html_select_usbs .= $html_select; 
#				$html_select_usbs .= "	</select>"; 
# 				printf( "BUGS_503 html_select_usbs=$html_select_usbs" );
				}

			}

		if( preg_match("/books/", $type, $matches )) { $html_select_books .= "	</select>"; 
#			print( "BUGS_631 html_select_books=$html_select_books<br>");
			}
		if( preg_match("/marks/", $type, $matches )) { $html_select_marks .= "	</select>"; 
#			print( "BUGS_632 html_select_marks=$html_select_marks<br>");
			}
		if( preg_match("/usbs/", $type, $matches )) { $html_select_usbs .= "	</select>"; 
#			print( "BUGS_633html_select_usbs=$html_select_usbs<br>");
			}

#		print( "BUGS_650 type=$type html=$html" );

# kkkkkkkkkkkkkkkkkkkkkkk

		}


	$html_select="";
	$html_select .= "<hr color=goldenrod>";
	$html_select .= "<hr color=black>";
	$html_select .= "<table id=table_select>";
	$html_select .= "<tr><td>books</td><td width=10> &nbsp </td><td>marks</td><td> &nbsp </td><td>usbs</td></tr>";
	$html_select .= "<tr><td>books</td><td width=10> &nbsp </td><td>marks</td><td> &nbsp </td><td>usbs</td></tr>";
	$html_select .= "<tr>";
	$html_select .= "	<td>";
	$html_select .= 		$html_select_books;
	$html_select .= "		</td>";
	$html_select .= "	<td width=20> &nbsp </td>";

	$html_select .= "	<td>";
	$html_select .= 		$html_select_marks;
	$html_select .= "		</td>";
	$html_select .= "	<td width=20> &nbsp </td>";

	$html_select .= "	<td>";
	$html_select .= 		$html_select_usbs;
	$html_select .= "		</td>";
	$html_select .= "	</tr>";
	$html_select .= "	</table>";
	$html_select .= "<hr color=black>";
	$html_select .= "<hr color=goldenrod>";
#	$html_select .= "BUGS_3750<br>";



#	print( "BUGS_3661 html_select=$html_select<br>");
#	print( "BUGS_3662 html_select_books=$html_select_books<br>");
#	print( "BUGS_3663 html_select_marks=$html_select_marks<br>");
#	print( "BUGS_3664 html_select_usbs=$html_select_usbs<br>");

#	print( $html );

	$html_flds = "";
	$html_flds .= "<table id=table_flds>";
	$html_flds .= "<tr><td></td><td><input type=\"hidden\" id=\"books\" value=\"$books\" ></input></td></tr>";
	$html_flds .= "<tr><td></td><td><input type=\"hidden\" id=\"marks\" value=\"$marks\" ></input></td></tr>";
	$html_flds .= "<tr><td></td><td><input type=\"hidden\" id=\"usbs\" value=\"$usbs\" ></input></td></tr>";

	$html_flds .= "<tr><td>fname</td><td><input type=\"text\" id=\"bmu_fname\"></input></td></tr>";
	$html_flds .= "<tr><td>lname</td><td><input type=\"text\" id=\"bmu_lname\"></input></td></tr>";
	$html_flds .= "<tr><td>addr</td><td><input type=\"text\" id=\"bmu_addr\"></input></td></tr>";
	$html_flds .= "<tr><td>city</td><td><input type=\"text\" id=\"bmu_city\"></input></td></tr>";
	$html_flds .= "<tr><td>zip</td><td><input type=\"text\" id=\"bmu_zip\"></input></td></tr>";
	$html_flds .= "<tr><td>country</td><td><input type=\"text\" id=\"bmu_country\"></input></td></tr>";

	$html_flds .= "<tr><td>notes</td><td><input type=\"text\" id=\"bmu_notes\"></input></td></tr>";
	$html_flds .= "<tr><td>tel</td><td><input type=\"tel\" id=\"bmu_phn\"></input></td></tr>";
	$html_flds .= "<tr><td>email</td><td><input type=\"email\" id=\"bmu_email\"></input></td></tr>";
	$html_flds .= "<tr><td>url</td><td><input type=\"url\" id=\"bmu_url\"></input></td></tr>";

	$html_flds .= "<tr><td>file</td><td><input type=\"text\" id=\"bmu_file\"></input></td></tr>";
	$html_flds .= "<tr><td>checkbox</td><td><input type=\"text\" id=\"bmu_checkbox\"></input></td></tr>";
	$html_flds .= "<tr><td>date</td><td><input type=\"text\" id=\"bmu_date\"></input></td></tr>";
	$html_flds .= "<tr><td>radio</td><td><input type=\"text\" id=\"bmu_radio\"></input></td></tr>";
	$html_flds .= "<tr><td>number</td><td><input type=\"text\" id=\"bmu_number\"></input></td></tr>";
	$html_flds .= "<tr><td>image</td><td><input type=\"text\" id=\"bmu_image\"></input></td></tr>";
	$html_flds .= "<tr><td>date</td><td><input type=\"text\" id=\"bmu_date\"></input></td></tr>";
	$html_flds .= "<tr><td>month</td><td><input type=\"text\" id=\"bmu_month\"></input></td></tr>";
	$html_flds .= "<tr><td>week</td><td><input type=\"text\" id=\"bmu_week\"></input></td></tr>";

	$html_flds .= "<tr><td>submit</td><td><input type=\"submit\" id=\"bmu_submit\"></input></td></tr>";
	$html_flds .= "	</table>";
	$html_flds .= "<hr color=black>";

#	print( "BUGS_710 html_flds=$html_flds" );
	$html_kludge="";
	$html_kludge .= "<hr color=blue>";
	$html_kludge .= "<hr color=white>";
	$html_kludge .= "<hr color=red>";
	$html_kludge .= "<h1>form</h1>";
	$html_kludge .= "<form method=\"post\" id=\"form_bookmarkusb\" action=\"ko.php?id=bookmarkusb_form\">";
	$html_kludge .= "	<hr color=white>";
	$html_kludge .= 	$html_select;
	$html_kludge .= "	<hr color=black>";
	$html_kludge .= 	$html_flds;
	$html_kludge .= "	<hr color=white>";
	$html_kludge .= "	</form>";
	$html_kludge .= "<hr color=red>";
	$html_kludge .= "<hr color=white>";
	$html_kludge .= "<hr color=blue>";
	$html_kludge .= "<h1>BUGS_END</h1>";
	$html_kludge .= "</body>";
	$html_kludge .= "</html>";

#	print( "BUGS_730 html_kludge=$html_kludge" );


	$html = "";
	$html .= "<html>";
	$html .= "<head>";
	$html .= "	<title>ko.php 20211024_2000</title>";
	$html .= "	</head>";
	$html .= "<body bgcolor=linen>";
	$html .= "<form method=\"post\" id=\"form_bookmarkusb\" action=\"ko.php?id=bookmarkusb_form\">";
	$html .= $html_select;
	$html .= $html_flds;
	$html .= "	</form>";
	$html .= "	</body>";
	$html .= "	</html>";
	print($html);


#	print( $html_select );
#	print( $html_flds );
	return($html);
	}

function bookmarkusb_list() {
$db3file="ko.db3";
$htmout=""; $j=0;$k=0;
print( "<h1>BOOKMARKUSB_LIST $db3file</h1>" );

$html_books="";
$html_marks="";
$html_usbs="";
$books="";
$marks="";
$usbs="";

if( isset($_REQUEST['books'])) { $books=$_REQUEST['books']; }
if( isset($_REQUEST['marks'])) { $marks=$_REQUEST['marks']; }
if( isset($_REQUEST['usbs'])) { $usbs=$_REQUEST['usbs']; }

# print( "BUGS_300 books=$books<br>");
# print( "BUGS_300 marks=$marks<br>");
# print( "BUGS_300 usbs=$usbs<br>");

$types="books marks usbs";
	foreach( explode(" ", $types) as $type ) {
		if( preg_match("/books/", $type, $matches )) { $tblname=$type; $lists=$books; }
		if( preg_match("/marks/", $type, $matches )) { $tblname=$type; $lists=$marks; }
		if( preg_match("/usbs/", $type, $matches )) { $tblname=$type; $lists=$usbs; }

# jjjjjjjjjjjjjjjjjjjjjjj

#		$sql="select * from $tblname where fbid='$select'";
		$sql="select * from $tblname";
#		print( "BUGS_300 type=$type sql=$sql<br>" );

		$fbid="";
		$grp="";
		$media="";
		$tn="";
		$link="";
		$credit="";
		$caption="";
		$desc="";

		$html = "";
		$html .= "<table id=table_$type>";
		$html .= "<tr>";
		$html .= "<td width=200>img</td>";
		$html .= "<td> &nbsp </td>";
		$html .= "<td>id</td>";
		$html .= "<td> &nbsp </td>";
		$html .= "<td>grp</td>";
		$html .= "<td> &nbsp </td>";
		$html .= "<td>type</td>";
		$html .= "<td> &nbsp </td>";
		$html .= "<td>amt</td>";
		$html .= "<td> &nbsp </td>";
		$html .= "<td>caption</td>";
		$html .= "<td> &nbsp </td>";
		$html .= "<td>text</td>";
		$html .= "<td> &nbsp </td>";
		$html .= "<td>desc</td>";
		$html .= "</tr>";

# 		print( "BUGS_301 html=$html" );
		
		$pdo = newpdo($db3file);
		foreach( $pdo->query($sql) as $row ) {
			$j=$j+1;
			$fbid=$row['fbid'];
			$grp=$row['grp'];
			$media=$row['media'];
			$tn=$row['tn'];
			$link=$row['link'];
			$credit=$row['credit'];
			$caption=$row['caption'];
			$text=$row['text'];
			$desc=$row['desc'];


			$html .= "<tr>";
			$html .= "<td width=200>";
			$html .= "<a href=".$media." target=_blank>";
			$html .= "	<img src=".$tn." height=50 >";
			$html .= "	</a>";
			$html .= "	</td>";
			$html .= "<td> &nbsp &nbsp </td>";
			$html .= "<td>$fbid</td>";
			$html .= "<td> &nbsp &nbsp </td>";
			$html .= "<td>$grp</td>";
			$html .= "<td> &nbsp &nbsp </td>";
			$html .= "<td>$type</td>";
			$html .= "<td> &nbsp &nbsp </td>";
			$html .= "<td>\$$credit</td>";
			$html .= "<td> &nbsp &nbsp </td>";
			$html .= "<td>$caption</td>";
			$html .= "<td> &nbsp &nbsp </td>";
			$html .= "<td>$text</td>";
			$html .= "<td> &nbsp &nbsp </td>";
			$html .= "<td>$desc</td>";
			$html .= "</tr>";

			}
		$html .= "	</table>";
		print( "BUGS_3603 type=$type html=$html" );

# kkkkkkkkkkkkkkkkkkkkkkk



		if( preg_match("/books/", $type, $matches )) { $html_books=$html; }
		if( preg_match("/marks/", $type, $matches )) { $html_marks=$html; }
		if( preg_match("/usbs/", $type, $matches )) { $html_usbs=$html; }


		}

	$html .= "<h1>bookmarkusb</h2>";
	$html .= "<h2>books</h2>";
	$html .= $html_books;
	$html .= "<h2>marks</h2>";
	$html .= $html_marks;
	$html .= "<h2>usbs</h2>";
	$html .= $html_usbs;
	return($htmout);
	}


function bookmarkusb() {
# $select_books=array();
# $select_marks=array();
# $select_usbs=array();
$select_books="x2,b_1";
$select_marks="m2,m_1";
$select_usbs="u2,u_1";
$books="";
$marks="";
$usbs="";

#	print( "BUGS_100 bookmarkusb <br>" );
#	print( "BUGS_111 select_books=$select_books[0]<br>" );
#	print( "BUGS_112 select_marks=$select_marks[0]<br>" );
#	print( "BUGS_113 select_usbs=$select_usbs[0]<br>" );
#	print( "BUGS_121 books=$books<br>" );
#	print( "BUGS_122 marks=$marks<br>" );
#	print( "BUGS_123 usbs=$usbs<br>" );

$htmout="";
$htmout.="<html>";
$htmout.="<body bgcolor=linen>";
$books="";
$marks="";
$usbs="";
$select_books = array();
$select_marks = array();
$select_usbs = array();;

# print_r($_REQUEST);
# print_r($_REQUEST['select_books']);
# print_r($_REQUEST['select_marks']);
# print_r($_REQUEST['select_usbs']);

if( isset($_REQUEST['select_books'])) { 
	$select_books=$_REQUEST['select_books']; 
#	if(empty($select_books)) {
#		print( "BUGS_11 EMPTY select_books=$select_books");
#		}
#	else {
#		print( "BUGS_12 REQUEST select_books=$select_books");
#		}
	}
if( isset($_REQUEST['select_marks'])) { 
	$select_marks=$_REQUEST['select_marks']; 
#	if(empty($select_marks)) {
#		print( "BUGS_21 EMPTY select_marks select_marks=$select_marks");
#		}
#	else {
#		print( "BUGS_22 REQUEST REQUEST select_marks=$select_marks");
#		}
	}
if( isset($_REQUEST['select_usbs'])) { 
	$select_usbs=$_REQUEST['select_usbs']; 
#	if(empty($select_usbs)) {
#		print( "BUGS_31 EMPTY select_usbs=$select_usbs");
#		}
#	else {
#		print( "BUGS_32 REQUEST select_usbs=$select_usbs");
#		}
	}

if( isset($_REQUEST['select_books'])) {
	print( "select_books=".$_REQUEST['select_books']."<br>" );
	}
if( isset($_REQUEST['select_marks'])) {
	print( "select_marks=".$_REQUEST['select_marks']."<br>" );
	}
if( isset($_REQUEST['select_usbs'])) {
	print( "select_usbs=".$_REQUEST['select_usbs']."<br>" );
	}
if( isset($_REQUEST['books'])) {
# 	print( "select_books=".$_REQUEST['books']."<br>" );
	}
if( isset($_REQUEST['marks'])) {
# 	print( "select_marks=".$_REQUEST['marks']."<br>" );
	}
if( isset($_REQUEST['usbs'])) {
#	print( "select_usbs=".$_REQUEST['usbs']."<br>" );
	}
#print( "BUGS_31=".$_REQUEST['select_books'][0] );
# print( "BUGS_32=".$_REQUEST['select_marks'][0] );
# print( "BUGS_33=".$_REQUEST['select_usbs'][0] );

# $books=array();
# $marks=array();
# $usbs=array();

if( isset($_REQUEST['select_books'])) {
	$books=$_REQUEST['select_books'];
	}
if( isset($_REQUEST['select_marks'])) {
	$marks=$_REQUEST['select_marks'];
	}
if( isset($_REQUEST['select_usbs'])) {
	$usbs=$_REQUEST['select_usbs'];
	}

 if( isset($_REQUEST['books'])) {
 	$books=$_REQUEST['books'];
# 	print( "BUGS_41 ISSET books=$books<br>");
# 	print( "BUGS_42 ISSET request_books="+$_REQUEST['books']+"<br>");
#	print_r($_REQUEST['books']);
 	}
if( isset($_REQUEST['marks'])) {
 	$marks=$_REQUEST['marks'];
# 	print( "BUGS_51 ISSET marks=$marks<br>");
#	print( "BUGS_52 ISSET request_marks="+$_REQUEST['marks']+"<br>" );
#	print_r($_REQUEST['marks']);
 	}
if( isset($_REQUEST['usbs'])) {
	$usbs=$_REQUEST['usbs'];
#	print( "BUGS_61 ISSET usbs=$usbs<br>");
#	print( "BUGS_62 ISSET request_usbs="+$_REQUEST['usbs']+"<br>" );
#	print_r($_REQUEST['usbs']);
	}


$email="email";
$phn="phn";
$fname="fname";
$lname="lname";
$addr="addr";
$city="city";
$zip="zip";
$note="note";

if( isset($_REQUEST['email'])) { $email=$_REQUEST['email']; }
if( isset($_REQUEST['phn'])) { $phn=$_REQUEST['phn']; }
if( isset($_REQUEST['fname'])) { $fname=$_REQUEST['fname']; }
if( isset($_REQUEST['lname'])) { $lname=$_REQUEST['lname']; }
if( isset($_REQUEST['address'])) { $eessmail=$_REQUEST['eessmail']; }
if( isset($_REQUEST['city'])) { $city=$_REQUEST['city']; }
if( isset($_REQUEST['zip'])) { $zip=$_REQUEST['zip']; }
if( isset($_REQUEST['notes'])) { $notes=$_REQUEST['notes']; }



#		$htmout .="<hr color=goldenrod>";
#		$htmout .= "<h1>books</h1>";
#		$htmout.="books=$books";
#		$htmout .="<hr color=goldenrod>";
#		$htmout .= "<h1>marks</h1>";
#		$htmout.="marks=$marks";
#		$htmout .="<hr color=goldenrod>";
#		$htmout .= "<h1>usbs</h1>";
#		$htmout.="usbs=$usbs";

		$bigline="";
		$progid="ko";
		$dttm=date('y,m,d_H:i:s');
		$remote_addr=$_SERVER['REMOTE_ADDR'];


		$lines = $books;
#		print( "BUGS_3900 lines=$lines<br>" );
		$lines = explode("\n", $bigline );
		for( $j=0; $j < count($lines); $j++ ) {
			$line=$lines[$j];
#			printf( "$progid $dttm MSG:_300:  $j line=[$line] [$remote_addr]<br>\n" );
			}

$htmout .="<hr color=goldenrod>";
$htmout .= "email=$email<br>";
$htmout .= "phn=$phn<br>";
$htmout .= "fname=$fname<br>";
$htmout .= "fname=$fname<br>";
$htmout .= "addr=$addr<br>";
$htmout .= "city=$city<br>";
$htmout .= "zip=$zip<br>";
$htmout .= "note=$note<br>";
$htmout.="	</body>";
$htmout.="	</html>";


#	foreach ( $post_data as $key => $value) {
#		$post_items[] = $key . '=' . $value;
#		}
#	$post_string = implode ('&', $post_items)


	print("$htmout");

#	phpinfo();

	$htmout=bmu_sql("");
#	print( "BUGS_300 htmout=$htmout" );

	exit;
	}



function bmu_sql($options) {
$id="b_0";
$db3file="ko.db3";
$tblname="bmu";
$fbid=$id;
$tblname="books";

$html_books="";
$html_marks="";
$html_usbs="";

$found_marks="";
$found_usbs="";
$found_book="";
$types="books marks usbs";
$select_books=array();
$select_marks=array();
$select_usbs=array();
$selects=array();
$html_books="";
$html_marks="";
$htm_usbs="";

	foreach( explode(" ",$types) as $type ) {
#		print( "BUGS_3840 type=$type<br>" );

		if( $type == "books" ) {
			$tblname="books";
			$selects=$select_books;
			}
		if( $type == "marks" ) {
			$tblname="marks";
			$selects=$select_marks;
			}
		if( $type == "usbs" ) {
			$tblname="usbs";
			$selects=$select_usbs;
			}

		
		$sql = "select * from $tblname where fbid == '$fbid'";
		$sql = "select * from $tblname";
#		printf( "BUGS_320: sql=[$sql] [$db3file]<br>\n" );

		$html="";
		$html .= "<br>";
		$html .= "<hr color=goldenrod>";
		$html .= "<h1>$tblname</h1>";
		$html .= "<table id=table_".$tblname." >";
	        $html .= "<tr>";
		$html .= "<td>grp</td>";
		$html .= "<td>media</td>";
		$html .= "<td>tn</td>";
		$html .= "<td>link</td>";
		$html .= "<td>credit</td>";
		$html .= "<td>caption</td>";
		$html .= "<td>text</td>";
		$html .= "<td>desc</td>";
	        $html .= "</tr>\n";
	
		$j=0;
		$remote_addr="";
		$remote_port="";
		$referer="";
		$query_string="";
		$user_agent="";
	#	phpinfo();
		if( isset($_SERVER['REMOTE_ADDR'])) { 
			$remote_addr=$_SERVER['REMOTE_ADDR']; 
			str_replace(".","-",$remote_addr);
			}
		if( isset($_SERVER['REMOTE_PORT'])) { $remote_port=$_SERVER['REMOTE_PORT']; }
		if( isset($_SERVER['REFERER'])) { $referer=$_SERVER['REFERER']; }
		if( isset($_SERVER['QUERY_STRING'])) { 
			$query_string=$_SERVER['QUERY_STRING']; 
			str_replace("%27","",$query_string);
			}
		if( isset($_SERVER['HTTP_USER_AGENT'])) { 
			$user_agent=$_SERVER['HTTP_USER_AGENT']; 
			str_replace(" ","_",$user_agent );
			str_replace(".","",$user_agent );
			str_replace(";","",$user_agent );
			str_replace(":","",$user_agent );
			str_replace("/","",$user_agent );
			str_replace("(","",$user_agent );
			str_replace(")","",$user_agent );
			}
	
		$pdo = newpdo($db3file);
		$sqls="";
		foreach( $pdo->query($sql) as $row ) {
			$j=$j+1;
	#		printf( "BUGS__3228:  row=$row['fbid']<br>\n" );
			$fbid=$row['fbid'];
			$grp=$row['grp'];
			$media=$row['media'];
			$tn=$row['tn'];
			$link=$row['link'];
			$credit=$row['credit'];
			$caption=$row['caption'];
			$text=$row['text'];
			$desc=$row['desc'];
	
	
			$sql = "";
			$tblname="orders";
			$sql .= "insert or replace into $tblname ( ";
			$sql .= "'remote_addr','remote_port', 'referer', 'query_string','user_agent',";
			$sql .= "'fbid', 'grp', 'media', 'tn', 'link', 'credit', 'caption', 'text', 'desc'";
			$sql .= ") values ( ";
			$sql .= "'$remote_addr','$remote_port', '$referer', '$query_string','$user_agent',";
			$sql .= "'$fbid', '$grp', '$media', '$tn', '$link', '$credit', '$caption', '$text', '$desc'";
			$sql .= "	);";
	
#			print( "BUGS_3940 j=$j sql=$sql<br>\n" );
	
			if( isset($_REQUEST['select_books'] )) { $select_books=$_REQUEST['select_books']; }
			if( isset($_REQUEST['select_marks'] )) { $select_marks=$_REQUEST['select_marks']; }
			if( isset($_REQUEST['select_usbs'] )) { $select_usbs=$_REQUEST['select_usbs']; }

#			foreach( explode("\n",$select_books) as $select_book ) {
#				if( $select_book == "$fbid" ) { $pdo->exec($sql); }
#				}
#			foreach( explode(" ",$select_marks) as $select_mark ) {
#				if( $select_mark == "$fbid" ) { $pdo->exec($sql); }
#				}
#			foreach( $select_usbs as $select_usb ) {
#				if( $select_usb == "$fbid" ) { $pdo->exec($sql); }
#				}
#			print( "BUGS_440 fbid=$fbid books=$select_books marks=$select_marks usbs=$select_usbs<br>");
	
			if( $select_books == "$fbid" ) { 
				$found_book.="<a href=$media target=_blank class=\"popover\">";
				$found_book.="<img src=$tn height=50>";
#				$found_book.="<span><img src=$tn height=200></span>";
				$found_book.="	</a><br>";
				printf( "$found_book" );
#				print( "MSG_441 FOUND_BOOK fbid=$fbid books=$select_books marks=$select_marks usbs=$select_usbs<br>");
				$pdo->exec( $sql ); }
			if( $select_marks == "$fbid" ) { 
				$found_marks.="<a href=$media target=_blank class=\"popover\">";
				$found_marks.="<img src=$tn height=50>";
#				$found_marks.="<span><img src=$tn height=200></span>";
				$found_marks.="	</a><br>";
				printf( "$found_marks" );
#				print( "MSG_402: FOUND_MARK fbid=$fbid books=$select_books marks=$select_marks usbs=$select_usbs<br>");
				$pdo->exec( $sql ); }

$selects=array('books','marks','usbs');
if( $type == "books" ) { $selects=array($select_books); }
if( $type == "marks" ) { $selects=array($select_marks); }
if( $type == "usbs" ) { $selects=array($select_usbs); }
$selects_books=array();
$selects_marks=array();
$selects_usbs=array();
if( isset($_REQUEST['selects_books'])) {
	$selects_books=$_REQUEST['selects_books'];
	}
if( isset($_REQUEST['selects_marks'])) {
	$selects_marks=$_REQUEST['selects_marks'];
	}
if( isset($_REQUEST['selects_usbs'])) {
	$selects_usbs=$_REQUEST['selects_usbs'];
	}

# phpinfo();
# print_r($selects_books);
# print_r($selects_marks);
# print_r($selects_usbs);
# print( "BUGS_481 selects_books=$selects_books<br>" );
# print( "BUGS_482 selects_marks=$selects_marks<br>" );
# print( "BUGS_483 selects_usbs=$selects_usbs<br>" );

#				foreach( $selects as $select ) {
#				foreach( array('books','marks','usbs') as $select ) {
#					print( "BUGS_500 type=$type select=$select<br>\n");
#					}

				if( $select_usbs == "$fbid" ) { 
					$found_usbs.="<a href=$media target=_blank class=\"popover\">";
					$found_usbs.="<img src=$tn height=50>";
		#			$found_usbs.="<span><img src=$tn height=200></span>";
					$found_usbs.="	</a><br>";
					printf( "$found_usbs" );
		#			print( "MSG_403: FOUND_USB fbid=$fbid books=$select_books marks=$select_marks usbs=$select_usbs<br>");
					$pdo->exec( $sql ); }
	
# print	( "BUGS_370 db3file=$db3file tblname=$tblname sql=$sql<br>" );
	
	
# print	( "BUGS_380 db3file=$db3file tblname=$tblname sql=$sql<br>" );
	
	
$fbid="";
$select_books="";
$select_marks="";
$select_usbs="";
$select_book="";
$select_mark="";
$select_usb="";

				if( isset($_REQUEST['fbid'])) {$fbid=$_REQUEST['fbid'];}
				if( isset($_REQUEST['select_books'])) {$select_books=$_REQUEST['select_books'];}
				if( isset($_REQUEST['select_marks'])) {$select_marks=$_REQUEST['select_marks'];}
				if( isset($_REQUEST['select_usbs'])) {$select_usbs=$_REQUEST['select_usbs'];}
	
				if( $select_books == $fbid ) {
		$html_books.="<a href=$media target=_blank ><img src=$tn height=50></a><br>";
					}
				if( $select_marks == $fbid ) {
		$html_marks.="<a href=$media target=_blank ><img src=$tn height=50></a><br>";
					}
				if( $select_usbs == $fbid ) {
		$html_usbs.="<a href=$media target=_blank ><img src=$tn height=50></a><br>";
					}
	
   			     	$html .= "<tr>";
				$html .= "<td>$grp</td>";
				$html .= "<td><a href=$media class=\"popover\" target=_blank> <img src=$tn height=50>";
		#		$html .= "<span><img src=$tn height=200></span><a></td>";
				$html .= "<td>tn</td>";
				$html .= "<td>$link</td>";
				$html .= "<td>$credit</td>";
				$html .= "<td>$caption</td>";
				$html .= "<td>$text</td>";
				$html .= "<td>$desc</td>";
		        	$html .= "</tr>\n";
				}

		        $html .= "</table>\n";
			$html .= "</div>\n";
			}

	$html_temp=$html;
	$html = "";
	$html .= "<br>";
	$html .= "<hr color=goldenrod>";
	$html .= "<div id=div_selects>";
	$html .= "	<h1>div_selects</h1>";
	$html .= "	<h2>books</h2>";
	$html .= $select_book;
	$html .= $html_books;
	$html .= "	<h2>marks</h2>";
	$html .= $select_book;
	$html .= $html_marks;
	$html .= "	<h2>usbs</h2>";
	$html .= $select_book;
	$html .= $html_usbs;
	$html .= "<hr color=goldenrod>";
	$html .= "<br>";
	
	$html .= $html_temp;
#	printf( "BUGS_331: html=[$html]<br>\n" );
	printf( "$html" );
	return($html);
	}




function startup_ls() {
	$path="";
	if(!empty($_REQUEST['ls'])) {
		$path=$_REQUEST['ls'];
//		print( "BUGS_121 url path=".$path );
		}
	else {
		$path="pages";
//		print( "BUGS_122 default path=".$path );
		}

//	if( isset( $_REQUEST['ls'] )) { $usrpath = "allow"; }
//	ko.php?ls=pages/
//	ko.php?ls
//	ko.php?db
//	ko.php?ls=/fb/jtfdcr/pages/
//	ko.php?ls=/fb/pages/

	$document_root=$_SERVER['DOCUMENT_ROOT'];
	$rootpath = $document_root.$path;
//	$path=$document_root."/fb/jtfdcr/pages";
	$htmout="";
	$options="";
//	print( "/ko.php path=".$path." rootpath=".$rootpath );
	print( "/ko.php path=".$path );
	$htmout=ko_ls( $options, $path );
	print( "htmout=".$htmout );
	exit();
	}



function startup() {
//	bd3_test();

	printf( "<h1>BUGS_100 startup</h1>\n" );
	startup_kup();
//	$html_inputlist=html_inputlist( "listid", "a b c" );
//	print( "BUGS_startup html_inputlist=".$html_inputlist."<br>" );

//	session_cache_limiter("must-revalidate");
//	session_cache_limiter("public");
//	session_start();

	error_reporting(0);
	$progid="ka1";
	$dttm=date('Ymd_His');
	$dttm_ip= sprintf( "%s.%s.%s.%s", 
		substr( $dttm, 0, 2 ),
		substr( $dttm, 2, 2 ),
		substr( $dttm, 4, 2 ),
		substr( $dttm, 6, 2 ));

//	$output = leds_about( $options );
//	print( $output );
//	print( "$php_self startup MSG: validate=[$validate] </br>\n" );
//	print( "$php_self startup MSG: dttm_ip=[$dttm_ip] </br>\n" );
//	print( "$php_self startup MSG: r_user=[".$row['user_code']."] </br>\n" );
//	print( "$php_self startup MSG: r_role=[".$row['user_role']."] <br/>\n" );
//	print( "$php_self startup MSG: s_id=[".$_SESSION['id']."] <br/>\n" );
//	print( "$php_self startup MSG: s_user=[".$_SESSION['user']."] </br>\n" );
//	print( "$php_self startup MSG: s_role=[".$_SESSION['role']."] <br/>\n" );
//	print( "$php_self startup MSG:  u=[$user][$pass] r=[$role] step=[step] sid=[$sid]<br/>\n" );
//	print_r( $_SESSION );

	$path_btn="./imgs/btn";
	$path_ani="./imgs/ani";

#	phpinfo();
	$document_root=$_SERVER['DOCUMENT_ROOT'];

#	$GLOBALS['hosts_allow']="/etc/hosts.allow";
	$GLOBALS['hosts_allow']="./hosts.allow";
	$GLOBALS['kbfile']="/var/www/html/ka1/db3/koaac_kb.db3";
	$GLOBALS['kb_rootpath'] = "/var/www/html/ka1/kb";
	$GLOBALS['ka1_certsfile'] = "/var/www/html/ka1/db3/ka1_certs.db3";
	$GLOBALS['screenshots_pcharts'] = "";
	$GLOBALS['kbpath'] = "/var/www/html/ka1/kb";

	$yyyymm=date('Ym');
	$logfil_basename="$progid"."_"."$yyyymm".".log";
	$logfil_rootpath="$document_root"."/../ko_safer";
	$logfil="$logfil_rootpath/$logfil_basename";


	$GLOBALS['logfil']=$logfil;	
	$GLOBALS['progid']=$progid;	


	$hostos="";
//	$uname='uname -a';
//	$uname='uname -a';
//	$hostos="win";
//	
//	escapeshellarg()
//	escapeshellcmd()
//	exec()
//	passthru()
//	pcntl_exec()
//	backtick operator	

//	$uname=system("uname -a 2>&1",$status);	
	$status=exec("uname -a 2>&1",$uname);	
//	printf( "BUGS_135a:  status=[$status] uname=[$uname]<hr>\n" );
//	$status=exec("ls -lat 2>&1",$files);	


	$dttm=date('Ymd_His');

//	foreach(PDO::getAvailableDrivers() as $driver) {$html .= "$j $driver<br>\n"; $j++;}
//	$allowflag_fields=split( " ", $allowflag ); $kb_user = $allowflag_fields[2];
//	foreach( $files as $file) {
//		$html .= "$j $file<br>\n"; 
//		printf( "BUGS_135b: $j file=$file status=[$status] lslat=[$lslat]<hr>\n" );
//		$j++;
//		}
//	printf( "$html\n");
//	printf( "BUGS_135b:  status=[$status] lslat=[$lslat]<hr>\n" );
//

	
//	$item_level=count( explode( "!", $item_levels ));
//	$item_text=str_replace( "!", "", $item_levels );



	$uname=`uname -a`;
	if( preg_match( "/CYG/", $uname, $matches)) { $hostos = "win"; }

	if( $hostos == "win" ) {
//		$GLOBALS['kbfile'] = "L:\\xampp\\htdocs\\ka1\\db3/koaac_kb.db3";
//		$GLOBALS['kbrootpath'] = "L:\\xampp\\htdocs\\ka1\\kb";
//		$GLOBALS['dbfile'] = "L:\\xampp\\htdocs\\ka1\\ka1.db3";
//		$GLOBALS['hosts_allow']="L:\\xampp\\htdocs\\ka1\\hosts.allow";
		$GLOBALS['kbfile'] = "S:\\xampp\\htdocs\\ka1\\db3/koaac_kb.db3";
		$GLOBALS['kbrootpath'] = "S:\\xampp\\htdocs\\ka1\\kb";
		$GLOBALS['dbfile'] = "S:\\xampp\\htdocs\\ka1\\ka1.db3";
		$GLOBALS['hosts_allow']="S:\\xampp\\htdocs\\ka1\\hosts.allow";
		$GLOBALS['hosts_allow']="c:\\windows\\system32\\drivers\\etc\\hosts.allow";
		$hosts_allow=$GLOBALS['hosts_allow'];
		}

//	$wc=`wc -l *.php`;
//	printf( "BUGS_160 uname=[$uname] hosts_allow=[$hosts_allow]<hr>\n" );



	if (!extension_loaded('gd') && !extension_loaded('gd2')) {
		printf( "<hr><b>extension not loaded gd and gd2 </b><hr>\n" );
		if(!extension_loaded('gd2')) {
			printf( "<hr><b>extension not loaded gd2 </b><hr>\n" );
			}
		return;
		}

// check REMOTE_ADDR ip against hosts.all
///	$filename="/var/www/html/ka1/ka1.db3";
///	$filename="/etc/hosts.allow";
//	$filename="c:\\windows\\system32\\drivers\\etc\\hosts.allow";
///	$filename="c:/windows/system32/drivers/etc/hosts.allow";
	$remote_addr=$_SERVER['REMOTE_ADDR'];
	$php_self=$_SERVER['PHP_SELF'];
	$allowflag="";
	$hosts_allow = $GLOBALS['hosts_allow'];
	$kbfile = $GLOBALS['kbfile'];
	$kb_rootpath = $GLOBALS['kb_rootpath'];




	
	$logrec="$progid|$dttm|bugs_0130_sitehit|$remote_addr|$user|$email||\n"; logwrite( $logfil, $logrec );

///	logdump( $logfil );
///	print( "<hr>BUGS_134 progid=$progid dttm=[$dttm] logfil=[$logfil]<hr>\n" );
///	return;

///	$path="/ka1/kb/201208/20120810_130000";
///	ko_ls( $options, $path );


//	$remote_addr="160.132.7.53";	# mouserk
//	$remote_addr="10.200.82.186";	# wilsong
//	$remote_addr="10.200.80.179";	# gospodarecsm


	$remote_addr=$_SERVER['HTTP_REMOTE_ADDR'];
	$query_string=$_SERVER['QUERY_STRING'];
	$http_host=$_SERVER['HTTP_HOST'];
	$php_self=$_SERVER['PHP_SELF'];
	$get=$_GET;
	$post=$_POST;
	$files=$_FILES;

#	printf( "$progid $dttm MSG:_245:  SQLITE dbfile=[$dbfile][$remote_addr][$php_self]<br>\n" );
#	printf( "$progid $dttm MSG:_245:  SQLITE http_host=[$http_host]<br>" );
#	printf( "$progid $dttm MSG:_245:  SQLITE php_self=[$php_self]<br>" );
#	printf( "$progid $dttm MSG:_245:  SQLITE get=[".var_dump($get)."]<br>" );
#	printf( "$progid $dttm MSG:_245:  SQLITE post=[".var_dump($post)."]<br>" );
#	printf( "$progid $dttm MSG:_245:  SQLITE files=[".var_dump($files)."]<br>" );

#	printf( "$progid $dttm MSG:_300:  FOUND dbfile=[$dbfile][$remote_addr][$php_self]<br>\n" );
	if( file_exists( $dbfile )) {
	        $dbfile= $GLOBALS['dbfile'];
	        $pdo = newpdo($GLOBALS['dbfile']);
	        $tblname=$GLOBALS['tblname'];
		$tblname="koye";

	        $sql = "select * from $tblname";
//	        $sql = "select * from $tblname where led_dttm == 'current'";
		try { 
			$output .= "<table>\n";
			$output .= "<tr>\n";
			$pdo = newpdo($kbfile);
//			$result = $stmg->fetch(PDO::FETCH_ASSOC);
			$output .= "<table border=1>\n";
			$output .= "<tr>\n";
			foreach( $pdo->query($sql) as $row ) {
				$koye_idx=$row['idx'];
				$koye_status=$row['status'];
				$koye_ip=$row['ip'];
				$koye_koco=$row['koco'];
				$koye_name=$row['name'];
				$output .= "<td>$rpt_ip - $remote_addr</td>\n";

				if( preg_match( "/$remote_addr/", $koye_ip, $matches)) {
					$GLOBALS['allowflag']=$koye_ip;
					$GLOBALS['kb_ip']=$remote_addr;
					$allowflag=$koye_ip;
					$logrec="$progid|$dttm|bugs_0161_notfound_hostsallow|$remote_addr|ERR_NOTFOUND_hosts_allow=$hosts_allow|\n"; logwrite( $logfil, $logrec );
					}
				}
			printf( "$progid $dttm MSG:_280:  $j koye_ip=[$koye_ip] [$remote_addr]<br>\n" );
			printf( "$progid $dttm MSG:_280:  $j koye_name=[$koye_name] [$remote_status]<br>\n" );
//			if( $remote_addr == $line ) { printf( "ALLOW<br>\n" ); }
//			if( preg_match( "/$remote_addr/", $line, $matches)) {
			$output .= "</tr>\n";
			$output .= "</table>\n";
			$pdo = null;
			}
		catch(PDOException $e) { $output .= $e->getMessage(); }
		}


//	if( file_exists( $hosts_allow )) {
	$check_hosts_allow_file="no";
	if( $check_hosts_allow_file == "yes" ) {
		if( file_exists( $hosts_allow )) {
			printf( "$progid $dttm MSG:_280:  FOUND hosts_allow=[$hosts_allow][$remote_addr][$php_self]<br>\n" );
			$fp = fopen( $hosts_allow, 'r' );
			while( $bigline = fread($fp, 1024)) { 
				$image .= $bigline;
				$lines = explode("\n", $bigline );
				for( $j=0; $j < count($lines); $j++ ) {
					$line=$lines[$j];
//					printf( "$progid $dttm MSG:_150:  $j line=[$line] [$remote_addr]<br>\n" );
//					if( $remote_addr == $line ) { printf( "ALLOW<br>\n" ); }
					if( preg_match( "/$remote_addr/", $line, $matches)) {
//						$allowflag="true";
						$allowflag=$line;
						$GLOBALS['allowflag']=$line;
						$GLOBALS['kb_ip']=$remote_addr;
						break;
						}
					}
//				printf( "$progid $dttm MSG_110:  line=[$line]<br>\n" );
				}
			fclose( $fp );
			}
		}
	else {
//		$logrec="$progid|$dttm|bugs_0161_notfound_hostsallow|$remote_addr|ERR_NOTFOUND_hosts_allow=$hosts_allow|\n"; logwrite( $logfil, $logrec );
//		printf( "$progid $dttm ERR_210: NOTFOUND hosts_allow=[$hosts_allow][$remote_addr]<br>\n" );
		}

///	$allowflag=$GLOBALS['allowflag'];
///	$allowflag_fields=split( "#", $allowflag );
///	$user=$allowflag_fields[3];
///	$allowflag="";

	$allowflag="allow";
	if( isset( $_REQUEST['ip'] )) { $allowflag = "allow"; }
//	printf( "<hr>BUGS_170 hostos=[$hostos] allowflag=[$allowflag] form_request_access php_self=[https:/$php_self]<br>\n" );
	if( "$allowflag" == "" ) { 
		printf( "BUGS_171 form_request_access php_self=[https:/$php_self]<br>\n" );
		$html = "<html><title>$php_self $dttm DENIED $remote_addr</title>\n";
		$html .= "<body bgcolor=lightblue>\n";
		$html .= "<hr>$progid $dttm ERR_127:  HOSTDENIED allowflag=[$allowflag] your_ip=[$remote_addr] userid=[] email=[] <hr>\n";
		$html .= "<a href=\"mailto:joachim.kassil.ctr@mail.mil?subject=ka1 l1033 access: $remote_addr userid email org\" target=_blank>request access</a><br>\n";
		$html .= "</body></html>\n";
		printf( $html );
		$logrec="$progid|$dttm|bugs_177_login_notallowd|$remote_addr|$user|$email|allowflag=$allowflag|\n"; logwrite( $logfil, $logrec );
//		header( 'Location:  https://147.238.94.126/ka1/ka1.php?q=form_request_access' );
///		header( 'Location:  https://147.238.94.126/ka1/ka1.php?q=about' );
		exit;
		}
	$logrec="$progid|$dttm|bugs_180_login_allowed|$remote_addr|$user|$email|\n"; logwrite( $logfil, $logrec );

//	$sysid="fp";
	$sysid="ka1";
	$tblname= "leds";
	$dttm=date("Ymd_His");
	$query_string_all=$_SERVER['QUERY_STRING'];
	$query_strings = split( "&", $query_string_all );
	$query_string = $query_strings[0];
	$user=$_POST['user'];
	$pass=$_POST['pass'];
	$step=$_POST['step'];
	$step=$_POST['user'];
	$step=$_POST['email'];
	$php_self=$_SERVER['PHP_SELF'];
	$http_host=$_SERVER['HTTP_HOST'];
	$request_uri=$_SERVER['REQUEST_URI'];

	$script_filename = $_SERVER['SCRIPT_FILENAME'];
	$script_basename = basename( $script_filename );
	
	$dbfile = str_replace( "php", "db3", $script_filename );
//	$dbfile = str_replace( "index.db3", "$sysid.db3", $dbfile );

	dbs_init($options);

	$default_role="anon";
	$default_role="";
//	$default_role="admin";

	if( ! $_SESSION['role'] ) { $_SESSION['role'] = $default_role; $role=$default_role; } else { $role=$_SESSION['role']; }
	if( $_SESSION['role'] ) {$role=$_SESSION['role']; } else { $_SESSION['role'] = $default_role; }

//	print( "BUGS_100 role=$role _SESSION['role'] = ".$_SESSION['role']."<br>\n" );
	if(( $_SESSION['role'] != "" ) && ( $_SESSION['role'] != "anon" )) {
//		print( "role=$role/".$_SESSION['role']."<hr>\n" );
		$output .= "role=$role/".$_SESSION['role']."<hr>\n";
		$logrec="$progid|$dttm|msg_0215_valid_session|$remote_addr|user=$user|email=$email|role=$role|\n"; logwrite( $logfil, $logrec );
		}


//	$themes = array( 'swanky', 'redmond', 'humanity', 'frog', 'swanky', 'darkness', 'lightness', 'sunny', 'mint' );
	$themes = array( 'swanky', 'redmond', 'humanity', 'frog', 'darkness', 'lightness' );
	$default_theme=$themes[0];

///	$GLOBALS['allowflag'] = "";
	$GLOBALS['themes'] = $themes;
	if(! $_SESSION['theme']) { $_SESSION['theme'] = $default_theme; }

	$roles = $GLOBALS['roles'];
	$dbfiles = $GLOBALS['dbfiles'];
	$GLOBALS['dbs'] = $dbfiles[$role];
//	$GLOBALS['dbs'] = $dbfiles;


	$GLOBALS['version'] = "0.13_20120531_1320";
	$GLOBALS['dbfile'] = $dbfile;
	$GLOBALS['tblname'] = $tblname;
//	$GLOBALS['media_path'] = "media/";
//	$GLOBALS['media_path'] = "/var/www/inbox/";
	$GLOBALS['media_path'] = "/var/www/html/inbox/";
	$_SESSION['preview'] = "on";



//	print( "$php_self startup MSG:  sysid=$sysid [$script_basename] script_filename=[$script_filename] dbfile=[$dbfile]<br \>\n" );
//	$dbfile = "C:/xampp/htdocs/hrc/hrc.db3";
//	$GLOBALS['dbfile'] = "c:/xampp/htdocs/hrc/hrc.db3";
//	print( "script_filename=[$script_filename] dbfile=[$dbfile]<br>\n" );
//	phpinfo();

	$allowflag_fields=split( " ", $allowflag ); $kb_user = $allowflag_fields[2];
	$GLOBALS['kb_user']=$kb_user;
///	$allowflag_fields=split( " ", $allowflag ); $user = $allowflag_fields[1];
///	print( "$progid $dttm MSG_168:  startup:  allowflag=[$allowflag] user=[$user]" );
//	print( "startup: [$dttm] [$user][$pass][$step]<br> [$query_string] option=[$option] option1=[$option1] option2=[$option2]<br>\n" );
//	print( "php_self=[$php_self]<br>\n" );
//	print( "http_host=[$http_host]<br>\n" );
//	print( "request_uri=[$request_uri]<br>\n" );
//	print( "dbfile=[".$GLOBALS['dbfile'] ."]<br>\n" );
//	phpinfo();
//	parse_str( $query_string, $query_args );

//	$args=split( "/", $query_string );
//	$args=split( "/", $_REQUEST['q'] );
//	$options=split( "/", $query_string );
//	$option=$args[0]; $option1=$args[1]; $option2=$args[2]; $option3=$args[3]; $option4=$args[4];
	$options=split( "/", $_REQUEST['q'] );
	$dttm=date("Ymd_His");

//	print( "BUGS173:  query_string=$query_string<br>\n" );
//	print( "BUGS173:  \$_REQUEST['q']=[".$_REQUEST['q']."]<br>\n" );
//	print( "BUGS175: o0=$options[0]<br>\n" );
//	print( "BUGS175: o1=$options[1]<br>\n" );
//	print( "BUGS175: o2=$options[2]<br>\n" );
//	print( "BUGS175: o3=$options[3]<br>\n" );
//	print( "BUGS175: o4=$options[4]<br>\n" );
//	print_r( $options );
//	return;



// new install if no db3 file
//	unlink( $dbfile );
	if( ! file_exists( $GLOBALS['dbfile'] )) {
//		print( "<hr>$php_self ERR:  NOT INSTALLED<hr>\n" );
		ob_start();
		leds_install("new");
		header( 'Location:'.$php_self );	
		ob_flush();
		die();
//		leds_show();
//		return;
		}

//	$fp = "fp05";
//	$xmlfile= "$fp"."_hotspots.xml";
//	$options[1]="$fp";
//	$xmltext= leds_zview_xmlnew( $options );
//	if( ! file_exists( $xmlfile )) {
//		print( "<hr>fp.php MSG:  NEW xmlfile=[$xmlfile]<hr>\n" );
//		$f = fopen( $xmlfile, "w" );
//		fwrite( $f, $xmltext );
//		for( $x=0; $x<count($xmltext); $x++ ){
//			fputs($f, $xmltext[$x]);
//			}
//		fclose($f);
//		}
//	
//	print( "<hr>xmltext=<hr>$xmltext<hr>\n" );
//	return;

// session tests
	if( $options[0] == "about" ) { 
		$output = leds_about( $options ); 
		leds_show();
		print( $output );
		return; 
		}

#	printf( "$progid $dttm MSG:_500:  OPTIONS dbfile=[$dbfile][$remote_addr][$php_self]<br>\n" );
#	printf( "$progid $dttm MSG:_500:  OPTIONS query_string=[$query_string][$http_host]<br>\n" );

	$option0=$options[0];
	$option1=$options[1];
	$option2=$options[2];
	$option3=$options[3];
	$option4=$options[4];
	$option5=$options[5];


#	ko.php?q=psv_ko_media
#	ko.php?q=sql3_ko_media
#	ko.php?q=psv_ko_coffee
#	ko.php?q=sql3_ko_coffee
#	ko.php?todo=psv_ko_media
#	ko.php?todo=sql3_ko_media
#	ko.php?todo=psv_ko_coffee
#	ko.php?todo=sql3_ko_coffee
#	print( "<a href=ko.php?q=sql3_ko_coffee target=_blank>q=sql3_ko_coffee</a><br>" );
#	print( "<a href=ko.php?q=psv_ko_coffee target=_blank>q=psv_ko_coffee</a><br>" );
#	print( "<a href=ko.php?q=sql3_ko_media target=_blank>q=sql3_ko_media</a><br>" );
#	print( "<a href=ko.php?q=psv_ko_media target=_blank>q=psv_ko_media</a><br>" );
#	print( "<a href=ko.php?todo=sql3_ko_coffee target=_blank>todo=sql3_ko_coffee</a><br>" );
#	print( "<a href=ko.php?todo=psv_ko_coffee target=_blank>todo=psv_ko_coffee</a><br>" );
#	print( "<a href=ko.php?todo=sql3_ko_media target=_blank>todo=sql3_ko_media</a><br>" );
#	print( "<a href=ko.php?todo=psv_ko_media target=_blank>todo=psv_ko_media</a><br>" );

	if( preg_match( "/json/", $options[0] )) {
		ko_json($options);
		$ko_json="";
		$ko_json=ko_json($options);


		header("Content-type: text/plain");
		print( $ko_json );
#		print( "BUGS_520 startup q=json <br>" );
		exit;
		}

	if( preg_match( "/psv_ko_media/", $options[0] )) {
		print( "BUGS_5200 startup psv_ko_media q=psv_ko_media <br>" );
		$ko_media=psv_ko_media($options);


		header("Content-type: text/plain");
		print( $ko_media );
		print( "BUGS_5299 startup ko_media q=psv_ko_media <br>" );
		exit;
		}

	if( preg_match( "/psv_ko_coffee/", $options[0] )) {
		print( "BUGS_5300 startup ko_coffee q=json <br>" );
		$ko_coffee=psv_ko_coffee($options);

		header("Content-type: text/plain");
		print( $ko_coffee );
		print( "BUGS_5399 startup ko_coffee q=psv_ko_coffee <br>" );
		exit;
		}








#	printf( "$progid $dttm MSG:_525:  OPTIONS_chats query_string=[$query_string][$http_host]<br>\n" );
	if( preg_match( "/chati/", $options[0] )) {
#		print( "BUGS_527 startup chats <br>" );
		$ko_chati=ko_chati($options);
		header("Content-type: text/plain");
		print( $ko_chati );
		exit;
		}
	
	if( preg_match( "/chats/", $options[0] )) {
#		print( "BUGS_533 startup chats <br>" );
		$ko_chats=ko_chats($options);
		header("Content-type: text/plain");
		print( $ko_chats );
		exit;
		}
	
	printf( "$progid $dttm MSG:_534:  OPTIONS_chatu query_string=[$query_string][$http_host]<br>\n" );
	if( preg_match( "/chatu/", $options[0] )) {
		print( "BUGS_535 startup chatu <br>" );
		$ko_chatu=ko_chatu($options);
		header("Content-type: text/plain");
		print( $ko_chatu );
		print( "BUGS_530 startup chatu <br>" );
		exit;
		}

	printf( "$progid $dttm MSG:_540:  OPTIONS_chat query_string=[$query_string][$http_host]<br>\n" );
	if( preg_match( "/chat/", $options[0] )) {
		$ko_chat=ko_chat($options);
		header("Content-type: text/plain");
		print( $ko_chat );
		print( "BUGS_540 startup chat <br>" );
		exit;
		}


	primt( "BUGS_550 RETURN xxxxxxxxxxxxxxxxxx<br>" );
	return;

	if( preg_match( "/jg/", $options[0] )) {
		main_jg($options);
		exit;
		}

	
	if( preg_match( "/kup/", $options[0] )) {
		ko_kup();
		phpinfo();
		exit;
		}
	if( preg_match( "/ko_kup/", $options[0] )) {
		ko_kup();
		phpinfo();
		exit;
		}

#	if( preg_match( "/dir/", $options[0] )) {
#		$path=$options[1];
#		$path="/kup";
#		ko_dir($path);
#		exit;
#		}

#	$query_string=$_SERVER['QUERY_STRING'];
#	print( "BUGS_455 query_string=".$query_string."<br>" );
	if( preg_match( "/dir/", $_SERVER['QUERY_STRING'] )) {
		print( "BUGS_454 MATCH dir<br>" );
#		$path="/kup";
#		ko_dir( $path );
#		exit;
		}

	if( preg_match( "/sh/", $options[0] )) {
		ko_sh("/index.sh");
		exit;
		}

	if( preg_match( "/py/", $options[0] )) {
		ko_py("python index.py");
		exit;
		}

	if( $options[0] == "ko_im" ) { 
		$html  = html_header( $options );
		$html .= html_btn_squares($options);
		$html .= leds_show($options);
		$html .= "<hr>\n";
		if( $options[1] == "test1" ) { 
			$html .= "<hr><b>test1:  $option2</b><hr>\n"; 
			$html .= ko_im( $options );
			$html .= html_footer($options);
			print( $html );
			return;
			}
		if( $options[1] == "test2" ) { 
			$html .= "<hr><b>test2:  $option2</b><hr>\n"; 
			$html .= ko_im( $options );
			$html .= html_footer($options);
			print( $html );
			return;
			}
		if( $options[1] == "test3" ) { 
			$html .= "<hr><b>test2:  $option2</b><hr>\n"; 
			$html .= ko_im( $options );
			$html .= html_footer($options);
			print( $html );
			return;
			}
		if( $options[1] == "test4" ) { 
			$html .= "<hr><b>test2:  $option2</b><hr>\n"; 
			$html .= ko_im( $options );
			$html .= html_footer($options);
			print( $html );
			return;
			}
		print( $html );
		return;
		}




	if( $options[0] == "ko_ajax" ) { 
		$html  = html_header( $options );
		$html .= html_btn_squares($options);
		$html .= leds_show($options);
		$html .= "<hr>\n";
		if( $options[1] == "test1" ) { 
			$html .= "<hr><b>test1:  $option2</b><hr>\n"; 
			$html .= ko_ajax( $options );
			$html .= html_footer($options);
			print( $html );
			return;
			}
		if( $options[1] == "test2" ) { 
			$html .= "<hr><b>test2:  $option2</b><hr>\n"; 
			$html .= ko_ajax( $options );
			$html .= html_footer($options);
			print( $html );
			return;
			}
		}



	if( $options[0] == "ko_dragdrop" ) { 
		$html  = html_header( $options );
		$html .= html_btn_squares($options);
		$html .= leds_show($options);
		$html .= "<hr>\n";
		if( $options[1] == "test1" ) { 
			$html .= "<hr><b>test1:  $option2</b><hr>\n"; 
			$html .= ko_dragdrop( $options );
			$html .= "<hr><b>test1:  $option2</b><hr>\n"; 
			$html .= html_footer($options);
			print( $html );
			return;
			}
		if( $options[1] == "test2" ) { 
			$html .= "<hr><b>test2:  $option2</b><hr>\n"; 
			$html .= ko_dragdrop( $options );
			$html .= html_footer($options);
			print( $html );
			return;
			}
		if( $options[1] == "test3" ) { 
			$html .= "<hr><b>test2:  $option2</b><hr>\n"; 
			$html .= ko_dragdrop( $options );
			$html .= html_footer($options);
			print( $html );
			return;
			}
		if( $options[1] == "test4" ) { 
			$html .= "<hr><b>test2:  $option2</b><hr>\n"; 
			$html .= ko_dragdrop( $options );
			$html .= html_footer($options);
			print( $html );
			return;
			}
		print( $html );
		return;
		}



	if( $options[0] == "reports" ) {
                $dttm=date("Ymd_His");
//              printf( "<hr>BUGS_1200 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n" );
                $output = html_btn_squares( $options, "" );
                $output .= leds_show( $options );
//              $output .= leds_temp($options);

                $output .= "<h3>ka1 reports detail </h3>\n";

                $output .= "<a href=$php_self?q=reports/rpt ><img src=images/btn/report.png border=0 width=75></a>\n";
		$output .= "<br>\n";
//              $output .= " &nbsp &nbsp &nbsp ";
//              $output .= "<a href=$php_self?q=reports/view >view</a>\n";
//              $output .= " &nbsp &nbsp &nbsp ";

//              $output .= "<a href=$php_self?q=db/grid/ka1/periods >periods </a>\n";
//              $output .= " &nbsp &nbsp &nbsp ";

                $output .= "<a href=$php_self?q=db/grid/ka1/ko_plans>ko_plans</a>\n";
                $output .= " &nbsp &nbsp &nbsp ";
                $output .= "<a href=$php_self?q=db/grid/ka1/ko_hw>ko_hw</a>\n";
                $output .= " &nbsp &nbsp &nbsp ";
		$output .= "<br>\n";

                $output .= "<a href=$php_self?q=db/grid/ka1/rpts >rpts</a>\n";
                $output .= " &nbsp &nbsp &nbsp ";
                $output .= "<a href=$php_self?q=db/grid/ka1/hw >hw </a>\n";
                $output .= " &nbsp &nbsp &nbsp ";
                $output .= " &nbsp &nbsp &nbsp ";

                $output .= "<a href=$php_self?q=db/grid/ka1/defrag_plan >defrag_plan </a>\n";
                $output .= " &nbsp &nbsp &nbsp ";
                $output .= "<a href=$php_self?q=db/grid/ka1/defrag_plansum >defrag_plansum </a>\n";
                $output .= " &nbsp &nbsp &nbsp";
		$output .= "<br>\n" ;
                $output .= "<a href=$php_self?q=db/grid/ka1/hrc_dc_unix>hrc_dc_unix</a>\n";
                $output .= " &nbsp &nbsp &nbsp ";
                $output .= "<a href=$php_self?q=db/grid/ka1/hrc_dc_win>hrc_dc_win </a>\n";
                $output .= " &nbsp &nbsp &nbsp ";
                $output .= "<a href=$php_self?q=db/grid/ka1/hrc_datacenters_equipment >hrc_datacenters_equipment </a>\n";
                $output .= " &nbsp &nbsp &nbsp ";
                $output .= "<a href=$php_self?q=db/grid/ka1/hrc_datacenters_equipment_defrag >hrc_datacenters_equipment_defrag </a>\n";
//                $output .= " &nbsp &nbsp &nbsp ";
//                $output .= "<a href=$php_self?q=db/grid/ka1/jk >jk</a>\n";
//                $output .= " &nbsp &nbsp &nbsp ";
//                $output .= "<a href=$php_self?q=db/grid/ka1/sm >sm</a>\n";
//                $output .= " &nbsp &nbsp &nbsp ";
//                $output .= "<a href=$php_self?q=db/grid/ka1/bk >bk</a>\n";
//                $output .= " &nbsp &nbsp &nbsp ";
//                $output .= "<a href=$php_self?q=db/grid/ka1/tmp >tmp</a>\n";
//                $output .= " &nbsp &nbsp &nbsp ";
                $output .= " &nbsp &nbsp &nbsp ";
                $output .= "<hr>\n";

//                $output .= leds_cons($options);

                if( $options[1] == "" ) {
//                      $output .= "<hr>BUGS_1301 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
                        print( "$output" );
                        return;
                        }
                else {
////                    if( $option1 == "new" ) {
////                            $output .= ka1aac_kb_add_form();
////                            print( "$output" );
////                            return;
////                            }
                        if( $option1 == "view" ) {
                                $cert_code=$option2;
                                $host_code=$option2;
                                $output .= leds_reports_view($options);
                                print( "$output" );
                                return;
                                }
                        if( $option1 == "rpt" ) {
///                             $output .= leds_reports_rpt( $options );
                                $output .= leds_reports_rpt( $options );
                                print( "$output" );
                                return;
                                }
                        if( $option1 == "sql" ) {
                                $output .= leds_reports_sql( $options );
                                print( "$output" );
                                return;
                                }
                        if( $option1 == "mod" ) {
                                $cert_id=$option2;
                                $output = html_btn_squares( $options, "" );
                                $output .= leds_reports_view($options);
//                                $output .= "<hr>BUGS_1320 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
                                print( "$output" );
                                return;
                                }
                        if( $option1 == "add" ) {
                                $output = html_btn_squares( $options, "" );
//                               $output .= leds_reports_view($options);
                                $output .= "<hr>BUGS_1330 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
                                print( "$output" );
                                return;
                                }
                        if( $option1 == "search" ) {
                                $output = html_btn_squares( $options, "" );
                                $output .= leds_reports_view($options);
//                                $output .= "<hr>BUGS_1330 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
                                print( "$output" );
                                return;
                                }
                        $output .= "<hr>BUGS_522 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
                        print( $output );
                        return;
                        }

                $output .= "<hr>BUGS_1820 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
                print( $output );
                return;
                }

	if( $options[0] == "rptsxml" ) { 
		$html = html_header($options);
		$html .= "<h4>rptsxml </h4>\n";
		$html .= rptsxml($options);
		$html .= "</body>\n";
		$html .= "</html>\n";
		print( $html );
		return; 
		}

	if( $options[0] == "hw" ) { 
		$html  = html_header( $options );
		$html .= html_btn_squares($options);
		$html .= leds_show($options);
		$html .= "<hr>\n";
		if( $options[1] == "cab" ) { 
			$html .= "<hr><b>cabinet:  $option2</b><hr>\n"; 
			$html .= html_footer($options);
			print( $html );
			return;
			}
		if( $options[1] == "model" ) { 
			$html .= "<hr><b>model:  $option2</b><hr>\n"; 
			$html .= html_footer($options);
			print( $html );
			return;
			}
		if( $options[1] == "sn" ) { 
			$html .= "<hr><b>sn:  $option2</b><hr>\n"; 
			$html .= html_footer($options);
			print( $html );
			return;
			}
		if( $options[1] == "hrc_tag" ) { 
			$html .= "<hr><b>hrc_tag:  $option2</b><hr>\n"; 
			$html .= html_footer($options);
			print( $html );
			return;
			}
		if( $options[1] == "bluetag" ) { 
			$html .= "<hr><b>bluetag:  $option2</b><hr>\n"; 
			$html .= html_footer($options);
			print( $html );
			return;
			}
		hw($options); return; 
		}

	if( $options[0] == "koaac_kb_new_form" ) { koaac_kb_new_form($options); return; }
	if( $options[0] == "koaac_kb_add_form" ) { koaac_kb_add_form($options); return; }

	if( $options[0] == "koaac_kb_mod_form" ) { koaac_kb_mod_form(); return; }
	if( $options[0] == "koaac_kb_upd_form" ) { koaac_kb_upd_form(); return; }
	if( $options[0] == "koaac_kb_view_form" ) { koaac_kb_view_form(); return; }


	if( $options[0] == "phpinfo" ) { leds_phpinfo( $options ); return; }
	if( $options[0] == "pdo_cr_dbs" ) { pdo_cr_dbs(); return; }
	if( $options[0] == "pdo_cr_kb" ) { pdo_cr_kb(); return; }
	if( $options[0] == "pdo_cr_flds" ) { pdo_cr_flds(); return; }
	if( $options[0] == "pdo_cr_menus" ) { pdo_cr_menus(); return; }
	if( $options[0] == "pdo_insert_menus" ) { pdo_insert_menus( $options ); return; }
	if( $options[0] == "pdo_insert_dbs" ) { pdo_insert_dbs( $options ); return; }


//	if( $options[0] == "fgmenu" ) { fgmenu_dyn( $options ); return; }
	if( $options[0] == "fgmenu" ) { fgmenu_htm( $options ); return; }
	if( $options[0] == "fgmenu_htm" ) { fgmenu_htm( $options ); return; }
	if( $options[0] == "fgmenu_dyn" ) { fgmenu_dyn( $options ); return; }


	if( $options[0] == "login" ) { leds_login_form( $options ); return; }
	if( $options[0] == "login_validate" ) { leds_login_validate( $options ); return; }



	if( $options[0] == "logout" ) { leds_logout( $options ); return; }
	if( $options[0] == "konet" ) { 
		$html = "";
		$html .= html_header($options);
		$html .= html_btn_squares($options);
		$html .= leds_show($options);
		$html .= "<hr>\n";
		$html .= "<img src=images/ko.png width=25 height=12><br>\n";
		$html .= "joachim kassil<br>\n";
		$html .= "1-502-613-0144 desk<br>\n";
		$html .= "1-314-355-0144 mo<br>\n";
		$html .= "1-270-998-1075 ky<br>\n";
		$html .= "<a href=mailto:admin@konet.org?subject=hrc help konet>admin@konet.org</a><br>\n";
		$html .= "<br>\n";
		$html .= "lds 1-314-571-9505<br>\n";
		$html .= "<a href=mailto:lds@focussolutions.us?subject=hrc help focussolutions hrc>lds@focussolutions.us</a><br>\n";
		print( $html );
		return;
		}

	if( $options[0] == "pdo" ) { 
		$html = "";
		$html .= html_header($options);
		$html .= html_btn_squares($options);
		$html .= leds_show($options);
		$j=1;
		foreach(PDO::getAvailableDrivers() as $driver) {
			$html .= "$j $driver<br>\n"; $j++;
			}
		print($html );
		return;
		}

	if( $options[0] == "form_request_access" ) { 
//		form_login_access( $options ); 
		$html = "";
		$html .= html_header($options);
		$html .= html_btn_squares($options);
		$html .= leds_show($options);
		$html .= "<h1>ka1 l1033 access request form</h1>\n";
		$html .= "</body></html>\n";
		return; 
		}


        if( $options[0] == "ko_plans" ) {
                $dttm=date("Ymd_His");
		$html  = html_header($options);
                $html .= html_btn_squares( $options, "" );
                $html .= leds_show( $options );
//              $html .= leds_ka1($options);

                $html .= "<h3>ka1 ko_plans </h3>\n";

                $html .= "<a href=$php_self?q=db/grid/ka1/props >grid_search </a>\n";
                $html .= " &nbsp &nbsp &nbsp ";
                $html .= "<a href=$php_self?q=db/grid/ka1/rpts >grid_rpts</a>\n";
                $html .= " &nbsp &nbsp &nbsp ";
                $html .= "<a href=$php_self?q=ko_plans/reports >reports</a>\n";
                $html .= " &nbsp &nbsp &nbsp ";
                $html .= "<a href=$php_self?q=ko_plans/view >view</a>\n";
                $html .= " &nbsp &nbsp &nbsp ";
                $html .= "<a href=$php_self?q=ko_plans/steps >step</a>\n";
                $html .= " &nbsp &nbsp &nbsp ";
                $html .= "<a href=$php_self?q=ko_plans/items >items</a>\n";
                $html .= " &nbsp &nbsp &nbsp ";
                $html .= "<hr>\n";

		if( $options[1] == "" ) {
			printf( $html );
			return;
			}	
		
		if( $options[1] == "steps" ) {
			$html .= "<h1>ko_plans_steps</h1>\n";
			$html .= ko_plans_steps($options);
			printf( $html );
			return;
			}	
		
		if( $options[1] == "items" ) {
			$html .= "<h1>ko_plans_items</h1>\n";
			$html .= ko_plans_items($options);
			printf( $html );
			return;
			}	
		
//		$html .= ko_plans($options);
//		printf( $html );

                if( $options[1] == "" ) {
//			$output .= "<hr>BUGS_1301 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
			$output .= ko_plans( $options );
			$html .= $output;
                        print( "$html" );
                        return;
                        }
                else {
///                        if( $option1 == "new" ) {
///                                $output .= ka1_kb_add_form();
///                                print( "$output" );
///                               return;
///                                }
                        if( $option1 == "view" ) {
                                $ka1d_code=$option2;
                                $output .= leds_ka1($options);
                                print( "$output" );
                                return;
                                }
                        if( $option1 == "rpts" ) {
//                              $output .= "<h2>BUGS_1415 rpts</h2>\n";
                                $output .= leds_ka1_rpts( $options );
                                print( "$output" );
                                return;
                                }
//                        if( $option1 == "mod" ) {
//                                $cert_id=$option2;
//                                $output = html_btn_squares( $options, "" );
//                                $output .= leds_certs($options);
//                                $output .= "<hr>BUGS_1320 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
//                                print( "$output" );
//                                return;
//                                }

//                        if( $option1 == "add" ) {
//                                $output = html_btn_squares( $options, "" );
//                               $output .= leds_certs($options);
//                                $output .= "<hr>BUGS_1330 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
//                                print( "$output" );
//                                return;
//                                }
//                        if( $option1 == "search" ) {
//                                $output = html_btn_squares( $options, "" );
//                                $output .= leds_kb($options);
//                                $output .= "<hr>BUGS_1330 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
//                                print( "$output" );
//                                return;
//                                }
                        $output .= "<hr>BUGS_s719 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
                        print( $output );
                        return;
                        }


        $output .= "<hr>BUGS_600 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
        print( $output );
        return;
        }


	if( $options[0] == "ka11" ) { 
		$html  = "";
		$html .= html_header($options);
		$html .= html_btn_squares($options);
		$html .= leds_show( $options );
//		$html .= "$progid $dttm MSG_470:  ka1 $options[0] $options[1] $option2[2]<h1>ka1 engineering</h1>\n";

		$html .= "<a href=?q=ka1/about >\n";
		$html .= "<img src=\"/ka1/about/tn_ka1_orgchart.png\" alt=\"ka1_about\" border=0 height=\"30\" width=\"30\" /></a>\n";

		if( $options[1] == "about" ) { 
			$html .= "<h1>Systems Management Branch</h1>\n";
			$html .= "<h2>about</h2>\n";
			$html .= "<hr>\n";
			$html .= "<a href=/ka1/about/ka1_orgchart.png target=_blank><img src=/ka1/about/tn_ka1_orgchart.png border=0></a><br>\n";
			$html .= "<hr>\n";
			$html .= "<a href=/ka1/about/ka1_mission_9-blank.jpg target=_blank><img src=/ka1/about/tn_ka1_mission_9-blank.jpg border=0></a>\n";
			$html .= "<br> \n";
			$html .= "<a href=/ka1/about/ka1_mission_1-td.jpg target=_blank><img src=/ka1/about/tn_ka1_mission_1-td.jpg border=0></a>\n";
			$html .= " &nbsp &nbsp &nbsp \n";
			$html .= "<a href=/ka1/about/ka1_mission_2-mission.jpg target=_blank><img src=/ka1/about/tn_ka1_mission_2-mission.jpg border=0></a>\n";
			$html .= " &nbsp &nbsp &nbsp \n";
			$html .= "<a href=/ka1/about/ka1_mission_3-metl.jpg target=_blank><img src=/ka1/about/tn_ka1_mission_3-metl.jpg border=0></a>\n";
			$html .= " &nbsp &nbsp &nbsp \n";
			$html .= "<a href=/ka1/about/ka1_mission_4-core.jpg target=_blank><img src=/ka1/about/tn_ka1_mission_4-core.jpg border=0></a>\n";
			$html .= "<br>\n";
			$html .= "<a href=/ka1/about/ka1_mission_5-struct.jpg target=_blank><img src=/ka1/about/tn_ka1_mission_5-struct.jpg border=0></a>\n";
			$html .= " &nbsp &nbsp &nbsp \n";
			$html .= "<a href=/ka1/about/ka1_mission_6-org.jpg target=_blank><img src=/ka1/about/tn_ka1_mission_6-org.jpg border=0></a>\n";
			$html .= " &nbsp &nbsp &nbsp \n";
			$html .= "<a href=/ka1/about/ka1_mission_7-workforce.jpg target=_blank><img src=/ka1/about/tn_ka1_mission_7-workforce.jpg border=0></a>\n";
			$html .= " &nbsp &nbsp &nbsp \n";
			$html .= "<a href=/ka1/about/ka1_mission_8-plan.jpg target=_blank><img src=/ka1/about/tn_ka1_mission_8-plan.jpg border=0></a>\n";
			print( "$html" );
			return; 
			}
		print( $html );
		return;
		}


	if( $options[0] == "pchart" ) { 
		if( $options[1] == "main" ) { 
				$html  = "";
				$html .= html_header($options);
				$html .= html_btn_squares($options);
				$html .= leds_show( $options );
				$html .= "<h1>Systems Management Branch</h1><h2>pchart main demo</h2>\n";
				$html .= "<hr>\n";
				$html .= "<a href=https://147.238.94.126/ka1/ko_pchart_examples.php target=_blank>ko_Pchart_examples</a><br>\n";
///				$html .= "<br>\n";
///				$html .= "<a href=https://147.238.94.126/pChart/pchart213.pdf target=_blank>pchart213.pdf</a><br>\n";
///				$html .= "<br>\n";
///				$html .= "<a href=https://147.238.94.126/pChart target=_blank>pChart_examples</a><br>\n";
				print( $html );
				return;
				}

		if( $options[1] == "demo" ) { 
//			if( file_exists( "/var/www/html/pChart/" )) {
			if( is_dir( "/var/www/html/pChart" )) {
				header( 'Location:  https://147.238.94.126/pChart/' );
				return;
				}
			else {
				$html  = "";
				$html .= html_header($options);
				$html .= html_btn_squares($options);
				$html .= leds_show( $options );
				$html .= "<h1>Systems Management Branch</h1><h2>pchart demo unavailable</h2>\n";
				$html .= "<hr>\n";
				print( $html );
				return;
				}
			}

		if( $options[1] == "pie" ) { 
			$html  = "";
			$html .= html_header($options);
			$html .= html_btn_squares($options);
			$html .= leds_show( $options );
			$html .= "<h1>pchar pie</h1><h2>fld=$fld val=[$val]</h2>\n";

			$html .= pchart_pie($options);
			$html .= "<hr>\n";
			print( $html );
			return;
			}
		if( $options[1] == "pdf" ) { 
//			if( file_exists( "/var/www/html/pChart/" )) {
			if( file_exists( "/var/www/html/pChart/pchart231.pdf" )) {
				header( 'Location:  https://147.238.94.126/pChart/pchart231.pdf' );
				return;
				}
			else {
				$html  = "";
				$html .= html_header($options);
				$html .= html_btn_squares($options);
				$html .= leds_show( $options );
				$html .= "<h1>Systems Management Branch</h1><h2>pchart231.pdf unavailable</h2>\n";
				$html .= "<hr>\n";
				print( $html );
				return;
				}
			}



		return;
		}
	if( $options[0] == "detail" ) { 
//		printf( "$progid $dttm MSG_440:  $options[0] $options[1] $option2[2]<hr>xxxxxxxxxxxx<hr>\n" );
		$html  = "";
		$html .= html_header($options);
		$html .= html_btn_squares($options);
		$html .= leds_show($options);
		$html .= "<hr>\n";

		$html .= "<table><tr><td>\n";
		$html .= "<a href=$php_self?q=leds_update_form>update $option1</a>";
		$html .= " &nbsp &nbsp ";
//		$html .= "<a href=$php_self?q=leds_rpts_form>rpts $option1</a>";
//		$html .= "<a href=$php_self?q=leds_rpts_form>rpts $option1</a>";
//		$html .= " &nbsp &nbsp ";
		$html .= "<a href=$php_self?q=nodes/rpts>rpts $option1</a>";

//		$html .= leds_update_form( $options );
		$html .= "</td></tr></table>\n";
		$html .= "<hr>\n";


		if( $options[1] == "ka1" ) {
			$html_ka1  = "";
//			$html_ka1 .= "$progid $dttm MSG_460:  ka1 $options[0] $options[1] $option2[2]<h1>system management branch</h1>\n";


			$html  .= "<a href=?q=ka1 >\n";
			$html  .= "<img src=\"./imgs/btn/ka1.png\" alt=\"ka1\" border=0 height=\"35\" width=\"35\" /></a>\n";
			$html .= " &nbsp &nbsp &nbsp \n" ;


			$html .= "<a href=/itil/index.html >\n";
			$html .= "<img src=\"$path_btn/itil.png\" alt=\"itil\" border=0 height=\"30\" width=\"30\" />";
			$html .= "</a>\n";
			$html .= " &nbsp &nbsp &nbsp \n" ;


			$html .= "<a href=?q=kb >\n";
			$html .= "<img src=\"./imgs/btn/kbbooks.png\" alt=\"kb\" border=0 height=\"30\" width=\"30\" /></a>\n";


			print( $html );
			return;
			}



		if( $options[1] == "ka1e" ) {
			$html  = "";
			$html .= "$progid $dttm MSG_470:  ka1 $options[0] $options[1] $option2[2]<h1>ka1 engineering</h1>\n";

			$html .= "<a href=?q=certs >\n";
			$html .= "<img src=\"./imgs/btn/cert.png\" alt=\"kb\" border=0 height=\"30\" width=\"30\" /></a>\n";

			$html .= "<a href=?q=db/grid/ka1_certs >\n";
			$html .= "<img src=\"./imgs/btn/cert.png\" alt=\"kbka1_certs\" border=0 height=\"30\" width=\"30\" /></a>\n";

			$html .= "<a href=?q=db/grid/ka1_certs/certs >\n";
			$html .= "<img src=\"./imgs/btn/cert.png\" alt=\"kbka1_certs_certs\" border=0 height=\"30\" width=\"30\" /></a>\n";

			print( $html );
			return;
			}

		if( $options[1] == "ka1d" ) {
                	$dttm=date("Ymd_His");
//			$html   = "";

//                	$html .= html_btn_squares( $options, "" );
//	               	$html .= leds_show( $options );

                	$html .= "<h3>ka1d deployment detail </h3>\n";

			$html .= "<a href=?q=db/grid/ka1d>\n";
			$html .= "<img src=\"./imgs/btn/moving.png\" alt=\"ka1d\" border=0 height=\"40\" width=\"40\" /></a>\n";

                	$html .= "<a href=$php_self?q=db/grid/ka1d/moves >grid_search </a>\n";
                	$html .= " &nbsp &nbsp &nbsp ";
                	$html .= "<a href=$php_self?q=db/grid/ka1d/rpts >grid_rpts</a>\n";
                	$html .= " &nbsp &nbsp &nbsp ";
                	$html .= "<a href=$php_self?q=ka1d/rpts >rpts</a>\n";
                	$html .= " &nbsp &nbsp &nbsp ";
///                	$html .= "<a href=$php_self?q=ka1d/view >view</a>\n";
                	$html .= " &nbsp &nbsp &nbsp ";
                	$html .= "<hr>\n";

//                	$html .= leds_certs($options);

			if( $options[2] == "" ) {
//				$html .= "<hr>BUGS_1301 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
				print( "$html" );
				return;
				}
//			if( $option2 == "new" ) {
//                                $html .= koaac_kb_add_form();
//                                print( "$html" );
//                                return;
//                                }
                        if( $option2 == "view" ) {
                                $ka1d_code=$option2;
                                $html .= leds_ka1d($options);
                                print( "$html" );
                                return;
                                }
                        if( $option2 == "rpts" ) {
//                              $html .= "<h2>BUGS_620 rpts</h2>\n";
                                $html .= leds_ka1d_rpts( $options );
                                print( "$html" );
                                return;
                                }
//			if( $option2 == "mod" ) {
//				$cert_id=$option2;
//				$html .= leds_certs($options);
//				$html .= "<hr>BUGS_1320 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
//				print( "$html" );
//				return;
//				}
//
//			if( $option2 == "add" ) {
//				$html .= leds_certs($options);
//				$html .= "<hr>BUGS_1330 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
//				print( "$html" );
//				return;
//				}

                        if( $option2 == "search" ) {
                                $html .= leds_ka1d($options);
//				$html .= "<hr>BUGS_1330 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
                                print( "$html" );
                                return;
                                }

			print( $html );
			return;
			}

		if( $options[1] == "ka1t" ) {
			$html_ka1  = "";
			$html_ka1 .= "$progid $dttm MSG_480:  ka1 $options[0] $options[1] $option2[2]<h1>ka1 training</h1>\n";
			$html .= $html_ka1;
			print( $html );
			return;
			}


		if( $options[1] == "hpx" ) {
			if( $options[2] == "_us" ) {
				if( file_exists( "/var/www/html/ka1/us/kohpx_us.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/us/kohpx_us.php' );
					return;
					}
				}
			if( $options[2] == "_vg" ) {
				if( file_exists( "/var/www/html/ka1/vg/kohpx_vg.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/vg/kohpx_vg.php' );
					return;
					}
				}
			if( $options[2] == "_sw" ) {
				if( file_exists( "/var/www/html/ka1/sw/kohpx_sw.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/sw/kohpx_sw.php' );
					return;
					}
				}
			if( $options[2] == "_hs" ) {
				if( file_exists( "/var/www/html/ka1/hs/kohpx_hs.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/hs/kohpx_hs.php' );
					return;
					}
				}
			if( $options[2] == "_kb" ) {
				if( file_exists( "/var/www/html/ka1/kb/kohpx_kb.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/kb/kohpx_kb.php' );
					return;
					}
				$html  = "";
				$html .= html_header($options);
				$html .= html_btn_squares($options);
				$html .= leds_show( $options );
				$html .= "<h1>kohpx_kb</h1>\n";
				$html .= "<h2>knowledgebase</h2>\n";
				$html .= "<a href=$php_self/ka1/hpx target=_blank>kohpx_rpts</a><br>\n";
				$html .= "<hr>\n";
				$html .= ko_ls( $options, "/home/ko/hpx" );
				print( $html );
				return;
				}
			if( $options[2] == "_bp" ) {
				if( file_exists( "/var/www/html/ka1/bp/kohpx_bp.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/bp/kohpx_bp.php' );
					return;
					}
				}
			}

		if( $options[1] == "aix" ) {
			if( $options[2] == "_us" ) {
				if( file_exists( "/var/www/html/ka1/us/koaix_us.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/us/koaix_us.php' );
					return;
					}
				}
			if( $options[2] == "_vg" ) {
				if( file_exists( "/var/www/html/ka1/vg/koaix_vg.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/vg/koaix_vg.php' );
					return;
					}
				}
			if( $options[2] == "_sw" ) {
				if( file_exists( "/var/www/html/ka1/sw/koaix_sw.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/sw/koaix_sw.php' );
					return;
					}
				}
			if( $options[2] == "_hs" ) {
				if( file_exists( "/var/www/html/ka1/hs/koaix_hs.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/hs/koaix_hs.php' );
					return;
					}
				}
			if( $options[2] == "_kb" ) {
				if( file_exists( "/var/www/html/ka1/kb/koaix_kb.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/kb/koaix_kb.php' );
					return;
					}
				}
			if( $options[2] == "_bp" ) {
				if( file_exists( "/var/www/html/ka1/bp/koaix_bp.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/bp/koaix_bp.php' );
					return;
					}
				}
			}


		if( $options[1] == "rhe" ) {
			if( $options[2] == "_us" ) {
				if( file_exists( "/var/www/html/ka1/us/korhe_us.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/us/korhe_us.php' );
					return;
					}
				}
			if( $options[2] == "_vg" ) {
				if( file_exists( "/var/www/html/ka1/vg/korhe_vg.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/vg/korhe_vg.php' );
					return;
					}
				}
			if( $options[2] == "_sw" ) {
				if( file_exists( "/var/www/html/ka1/sw/korhe_sw.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/sw/korhe_sw.php' );
					return;
					}
				}
			if( $options[2] == "_hs" ) {
				if( file_exists( "/var/www/html/ka1/hs/korhe_hs.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/hs/korhe_hs.php' );
					return;
					}
				}
			if( $options[2] == "_kb" ) {
				if( file_exists( "/var/www/html/ka1/kb/korhe_kb.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/kb/korhe_kb.php' );
					return;
					}
				}
			if( $options[2] == "_bp" ) {
				if( file_exists( "/var/www/html/ka1/bp/korhe_bp.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/bp/korhe_bp.php' );
					return;
					}
				}
			}


		if( $options[1] == "win" ) {
			if( $options[2] == "_us" ) {
				if( file_exists( "/var/www/html/ka1/us/kowin_us.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/us/kowin_us.php' );
					return;
					}
				}
			if( $options[2] == "_vg" ) {
				if( file_exists( "/var/www/html/ka1/vg/kowin_vg.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/vg/kowin_vg.php' );
					return;
					}
				}
			if( $options[2] == "_sw" ) {
				if( file_exists( "/var/www/html/ka1/sw/kowin_sw.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/sw/kowin_sw.php' );
					return;
					}
				}
			if( $options[2] == "_hs" ) {
				if( file_exists( "/var/www/html/ka1/hs/kowin_hs.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/hs/kowin_hs.php' );
					return;
					}
				}
			if( $options[2] == "_kb" ) {
				if( file_exists( "/var/www/html/ka1/kb/kowin_kb.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/kb/kowin_kb.php' );
					return;
					}
				}
			if( $options[2] == "_bp" ) {
				if( file_exists( "/var/www/html/ka1/bp/kowin_bp.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/bp/kowin_bp.php' );
					return;
					}
				}
			}


		if( $options[1] == "uss" ) {
			if( $options[2] == "_us" ) {
				if( file_exists( "/var/www/html/ka1/us/kouss_us.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/us/kouss_us.php' );
					return;
					}
				}
			if( $options[2] == "_vg" ) {
				if( file_exists( "/var/www/html/ka1/vg/kouss_vg.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/vg/kouss_vg.php' );
					return;
					}
				}
			if( $options[2] == "_sw" ) {
				if( file_exists( "/var/www/html/ka1/sw/kouss_sw.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/sw/kouss_sw.php' );
					return;
					}
				}
			if( $options[2] == "_hs" ) {
				if( file_exists( "/var/www/html/ka1/hs/kouss_hs.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/hs/kouss_hs.php' );
					return;
					}
				}
			if( $options[2] == "_kb" ) {
///				if( file_exists( "/var/www/html/ka1/kb/kouss_kb.php" )) {
///					header( 'Location:  https://147.238.94.126/ka1/kb/kouss_kb.php' );
///					return;
///					}

				$html  = "";
				$html .= html_header($options);
				$html .= html_btn_squares($options);
				$html .= leds_show( $options );
				$html .= "<h1>kouss_kb</h1>\n";
				$html .= "<h2>knowledgebase</h2>\n";
				$html .= "<a href=$php_self/ka1/uss target=_blank>kouss_rpts</a><br>\n";
				$html .= "<hr>\n";
				$html .= ko_ls( $options, "./uss" );
				print( $html );
				return;
				}
			if( $options[2] == "_bp" ) {
				if( file_exists( "/var/www/html/ka1/bp/kouss_bp.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/bp/kouss_bp.php' );
					return;
					}
				}
			}


		if( $options[1] == "aac" ) {
			if( $options[2] == "_us" ) {
				if( file_exists( "/var/www/html/ka1/us/koaac_us.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/us/koaac_us.php' );
					return;
					}
				}
			if( $options[2] == "_vg" ) {
				if( file_exists( "/var/www/html/ka1/vg/koaac_vg.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/vg/koaac_vg.php' );
					return;
					}
				}
			if( $options[2] == "_sw" ) {
				if( file_exists( "/var/www/html/ka1/sw/koaac_sw.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/sw/koaac_sw.php' );
					return;
					}
				}
			if( $options[2] == "_hs" ) {
				if( file_exists( "/var/www/html/ka1/hs/koaac_hs.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/hs/koaac_hs.php' );
					return;
					}
				}
			if( $options[2] == "_kb" ) {
///				if( file_exists( "/var/www/html/ka1/kb/koaac_kb.php" )) {
///					header( 'Location:  https://147.238.94.126/ka1/kb/koaac_kb.php' );
///					return;
///					}


				if( $options[3] == "search" ) {
					$html  = "";
					$html .= html_header($options);
					$html .= html_btn_squares($options);
					$html .= leds_show( $options );
					print( "$html" );


					koaac_kb_update_form();
					return;
					}
				if( $options[3] == "new" ) {
//					$html  = "";
//					$html .= html_header($options);
//					$html .= html_btn_squares($options);
//					$html .= leds_show( $options );
//					$html .= html_kb_Links($options);
					$html .= koaac_kb_new_form($options); 
					print( $html );
					return;
					}
				if( $options[3] == "add" ) {
					$html  = "";
					$html .= html_header($options);
					$html .= html_btn_squares($options);
					$html .= leds_show( $options );
					print( "$html" );
					koaac_kb_add_form();
					return;
					}

				if( $options[3] == "mod" ) {
					$html  = "";
					$html .= html_header($options);
					$html .= html_btn_squares($options);
					$html .= leds_show( $options );
					print( "$html" );

					koaac_kb_mod_form( $kbid );
					return;
					}

				if( $options[3] == "upd" ) {
					$html  = "";
					$html .= html_header($options);
					$html .= html_btn_squares($options);
					$html .= leds_show( $options );
					print( "$html" );

					koaac_kb_upd_form( $kbid );
					return;
					}

				if( $options[3] == "view" ) {
					$html  = "";
					$html .= html_header($options);
					$html .= html_btn_squares($options);
					$html .= leds_show( $options );
					print( "$html" );

					koaac_kb_view_form( $kbid );
					return;
					}

				$kbfile = $GLOBALS['kbfile'];
				$html  = "";
				$html .= html_header($options);
				$html .= html_btn_squares($options);
				$html .= leds_show( $options );
				$html .= "<h1>koaac_kb</h1>\n";
				$html .= "<h2>knowledgebase</h2>\n";
				$html .= "<a href=$php_self?q=detail/aac/_kb/new>search</a><br>\n";
				$html .= "<a href=$php_self?q=detail/aac/_kb/new>new</a><br>\n";
				$html .= "<a href=$php_self?q=detail/aac/_kb/update>update</a><br>\n";
				$html .= "<a href=$php_self?q=detail/aac/_kb/new>mod</a><br>\n";
				$html .= "<hr>\n";
				$html .= "<a href=$php_self?q=db/grid/koaac_kb/kb target=_blank>grid</a><br>\n";
				$html .= "<hr>\n";
				$html .= "<a href=$php_self?q=pdo_cr_kb>pdo_cr_kb</a><br>\n";
				$html .= "<a href=$php_self?q=pdo_cr_flds>pdo_cr_flds</a><br>\n";
				$html .= "<hr>\n";
				$html .= "kbfile=[$kbfile]<br>\n";
				print( $html );
				return;
				}
			if( $options[2] == "_bp" ) {
				if( file_exists( "/var/www/html/ka1/bp/koaac_bp.php" )) {
					header( 'Location:  https://147.238.94.126/ka1/bp/koaac_bp.php' );
					return;
					}
				}

			if( $options[2] == "ka1" ) {
				$html .= "<hr>ka1_822<hr>\n";
				}
			if( $options[2] == "ka1e" ) {
				$html .= "<hr>ka1e_822<hr>\n";
				}
			if( $options[2] == "ka1d" ) {
				$html .= "<hr>ka1d_822<hr>\n";
				}
			if( $options[2] == "ka1t" ) {
				$html .= "<hr>ka1t_822<hr>\n";
				}
			}
		
//		printf( "$progid $dttm MSG_1360: j=$j k=$k  $options[0] $options[1] $option2[2]<hr>xxxxxxxxxxxx<hr>\n" );
		$output = leds_detail( $options ); 
		printf( $output );
		return; 
		}


	if( $options[0] == "view" ) { leds_view( $options ); return; }
	if( $options[0] == "menu" ) { leds_menu( $options ); return; }

	if( $options[0] == "tools" ) { 
		$html  = "";
//		printf( "<html><title>ka1.php tools</title><body bgcolor=lightblue><hr>tools<hr></body></html>\n" );
		$html .= html_header($options);
		$html .= html_btn_squares($options);
		$html .= html_btn_footer($options,"");
		$html .= html_footer($options,"");
		print( $html );
		return;

		}

	if( $options[0] == "scrub" ) { 
		$html  = "";
		$html .= html_header($options);
		$html .= html_btn_squares($options);

		$html .= leds_show( $options );


//		$html = scrub_show( $options ); 

//		$output .= "<hr><a href=/ka1/scrub.php target=_blank><img src=./imgs/scrubbrush01.jpg width=100 height=100 border=0></a><hr>\n";
//		$output .= "<hr><a href=/ka1/scrub.php target=_blank><img src=./imgs/scrubbrush02.jpg width=100 height=100 border=0></a><hr>\n";
//		$output .= "<a href=$php_self?q=scrub_upload_form/$led_name>scrub_upload_form $led_name</a><br/>\n";

		$html .= "ko_scrub will parse a file for ip, mac, hostname, ssn and replace with labels<br>\n";
		$html .= "<hr>\n";
		$html .= "<a href=/ka1/ko_scrub_test.log target=_blank>ko_scrub_test.log</a><br>\n";
		$html .= "<hr>\n";
		$html .= "<a href=https://147.238.94.126/ka1/ka1.php?q=scrub_upload_form target=_blank>\n";
		$html .= "<img src=\"./imgs/scrubbrush.png\" alt=\"btn_black_scrub scrub_upload_form\" border=0 height=\"40\" width=\"40\" />";
		$html .= "</a><hr>\n";
		$html .= "<br>ko_scrub 0.2 multiple file download tests<br>\n";

		$html .= "<a href=/biupload/index.html target=_blank><img src=./imgs/scrubbrush01.png width=30 height=30 border=0> biupload </a>\n";
		$html .= " &nbsp &nbsp &nbsp ";
		$html .= "<a href=/h5upload/index.html target=_blank><img src=./imgs/scrubbrush01.png width=30 height=30 border=0> h5upload</a>\n";
		$html .= " &nbsp &nbsp &nbsp ";
		$html .= "<a href=/plupload/examples/scrub.html target=_blank><img src=./imgs/scrubbrush01.png width=30 height=30 border=0> plupload</a>\n";

		$html .= html_footer($options,"");
		print( $html );
		return; 
		}


	if(  $options[0] == "bugs" ) { 
		bugs( $options ); 
		return; 
		}

	if(  $options[0] == "ko_uploads" ) { 
		ko_uploads( $options ); 
		return; 
		}

	if(  $options[0] == "ko_upload2" ) { 
		ko_upload2( $options ); 
		return; 
		}

	if(  $options[0] == "scrub_upload_form" ) { 
		scrub_upload_form( $options ); 
		return; 
		}

	if( $options[0] == "scrub_upload" ) { 

		$html=scrub_upload( $options ); 
		echo $html;
		return; 
		}

	if( $options[0] == "csv2db3" ) {
                $html  = "";
                $html .= html_header($options);
                $html .= html_btn_squares($options);

                $html .= leds_show( $options );


                $html .= "ko_csv2db3 will parse a file csv file and create db3 file<br>\n";
                $html .= "<hr>\n";
                $html .= "<a href=/ka1/ko_csv2db3.csv target=_blank>ko_csv2db3.csv</a><br>\n";
                $html .= "<a href=/ka1/ko_csv2db3.psv target=_blank>ko_csv2db3.psv</a><br>\n";
                $html .= "<hr>\n";
                $html .= "<a href=https://147.238.94.126/ka1/ka1.php?q=csv2db3_upload_form target=_blank>\n";
                $html .= "<img src=\"./imgs/scrubbrush.png\" alt=\"btn_black_scrub csv2db3_upload_form\" border=0 height=\"40\" width=\"40\" />";
                $html .= "</a><hr>\n";
                $html .= "<br>ko_csv2db3 0.1 multiple file download tests<br>\n";


		if( $options[1] != "" ) {
			$csvfil=$options[1];
			$delimiter="|";
			if( preg_match( "/csv$/i", $csvfil )) { $delimiter = ","; }
			$html_csv2db3=csv2db3($csvfil, $delimiter);
			$html .= $html_csv2db3; 
			}

                $html .= html_footer($options,"");
                print( $html );
                return;
                }

        if(  $options[0] == "csvdb3_upload_form" ) {
                csv2db3_upload_form( $options );
                return;
                }

        if( $options[0] == "csv2db3_upload" ) {
///             printf( "BUGS_SCRUB_UPLOAD_238:  output=[$output]\n" );
                $html=csv2db3_upload( $options );
                echo $html;
                return;
                }



	if( $options[0] == "leds_update_form" ) { leds_update_form( $options ); return; }
	if( $options[0] == "leds_update" ) { 
///		printf( "BUGS_LEDS_UPDATE_235:  option=[$options[0]]<br>\n" );
///		printf( "BUGS_LEDS_UPDATE_236:  option1=[$options[1]]<br>\n" );
///		printf( "BUGS_LEDS_UPDATE_237:  option2=[$options[2]]<br>\n" );
///		$output=ko_upload( $options );
///		printf( "BUGS_LEDS_UPDATE_238:  output=[$output]\n" );
		leds_update( $options ); 
		return; 
		}

	if( $options[0] == "mail" ) { ko_imap( $options ); return; }
	if( $options[0] == "list" ) { leds_list( $options ); return; }
	if( $options[0] == "install" ) { leds_install("new"); return; }
	if( $options[0] == "reinstall" ) { leds_install("old"); return; }
	if( $options[0] == "test" ) { leds_test( $options ); return; }

	if( $options[0] == "local" ) { localcmds( $options ); return; }

	if( $options[0] == "docview" ) {
		$dbcode=$options[1];
		$dbtable=$options[2];
		$dbrowid=$options[3];
		$page=$options[4];
		docview( $dbcode, $dbtable, $dbrowid,$page );
		return;
		}

	if( $options[0] == "set" ) {
//		print( "<hr><a href=http://$http_host$php_self?q=set>set</a><hr>\n" );
		$url_setvar=$options[1];
		$url_setval=$options[2];

		switch( true ) {
			case ($url_setvar == "theme" ):
				$setvals = split( " ", "swanky redmond humanity frog darkness lightness" );
				foreach( $setvals as $setval ) {
					if( $setval == $url_setval ) { 
						$_SESSION['theme'] = $url_setval; 
//						print( "$url_setvar $url_setval _SESSION['theme']=".$_SESSION['theme']."<br>\n" );
						}
					}
				break;
			case ($url_setvar == "role" ):
				$setvals = split( " ", "admin local mgr op user anon" );
				foreach( $setvals as $setval ) {
//					print( "BUGS_254 setval=$setval url_setval=$url_setval<br>\n" );
					if( $setval == $url_setval ) { 
						$_SESSION['role'] = $url_setval; 
//						print( "$url_setvar $url_setval _SESSION['role']=".$_SESSION['role']."<br>\n" );
//						print( "BUGS_255_match setval=$setval url_setval=$url_setval<br>\n" );
						}
					}
				break;
			case ($url_setvar == "hs" ):
//				$setvals = split( " ", "none all grid us hw n11" );
				$setvals = split( " ", "all grid us hw n11" );
				foreach( $setvals as $setval ) {
					if( $setval == $url_setval ) { 
						$_SESSION['hs_type'] = $url_setval; 
//						print( "$url_setvar $url_setval _SESSION['hs_type']=".$_SESSION['hs_type']."<br>\n" );
						}
					}
				break;
			case ($url_setvar == "org" ):
				$setvals = split( " ", "a e h o p t" );
				foreach( $setvals as $setval ) {
					if( $setval == $url_setval ) { 
						$_SESSION['org_type'] = $url_setval; 
//						print( "$url_setvar $url_setval _SESSION['org_type']=".$_SESSION['org_type']."<br>\n" );
						}
					}
			case ($url_setvar == "preview" ):
				$setvals = split( " ", "on off" );
				foreach( $setvals as $setval ) {
					if( $setval == $url_setval ) { 
						$_SESSION['preview'] = $url_setval; 
//						print( "$url_setvar $url_setval _SESSION['preview']=".$_SESSION['preview']."<br>\n" );
						}
					}
			case ( $url_setvar == "grid_zoom" ):
				if( $_SESSION['grid_zoom'] ) { unset( $_SESSION['grid_zoom'] ); }
				else { $_SESSION['grid_zoom'] = true; }
				break;
			}
		$location_url="$php_self?q=config";
		if( $_REQUEST['callback'] != "" ) { $location_url=$_REQUEST['callback']; }
//		print( "<a href=$location_url>$location_url</a><br>\n" );
		header( 'Location:'.$location_url );	
//		html_page($options);
		return;
		}


	if( $options[0] == "leds" ) {
		if( $options[1] == "fp" ) {
			printf( "\n<hr>fp<hr>\n" );
			return;
			}
		if( $options[1] == "us" ) { /* users */
			printf( "\n<hr>us<hr>\n" );
			return;
			}
		if( $options[1] == "hs" ) { /* hosts */
			printf( "\n<hr>hs<hr>\n" );
			return;
			}
		if( $options[1] == "os" ) { /* os teams */
			printf( "\n<hr>hs<hr>\n" );
			return;
			}
		if( $options[1] == "sw" ) { /* swlist */
			printf( "\n<hr>sw<hr>\n" );
			return;
			}
		html_page($options);
		return;
		}


	if( $options[0] == "db" ) {
		$html_btn_squares = html_btn_squares($options);

		if( $options[1] == "grid" ) { 
			$html_body .=pdo_grid($options ); 
			$html_head .= html_header($options);
			$html = $html_head . $html_btn_squares . $html_body . $html_foot;
			print( $html );
			return; 
			}
		if( $options[1] == "load" ) { pdo_load($options ); return; }
		if( $options[1] == "unload" ) { pdo_unload($options ); return; }
		if( $options[1] == "gridxml" ) { pdo_gridxml($options ); return; }
		if( $options[1] == "list" ) { pdo_list($options ); return; }
		if( $options[1] == "update" ) { pdo_update($options ); return; }

//		$callback="$php_self?q=zoom/$url_zmcode/$url_zmtype/$url_zmrowid";
		$html_body = "<hr>\n";



		$html_body .= "<a href=$php_self?q=db/grid>db grid</a><br>\n";
//		$html_body .= "<a href=$php_self?q=db/unload>db unload</a><br>\n";
//		$html_body .= "<a href=$php_self?q=db/load>db load</a><br>\n";
//		$html_body .= "<a href=$php_self?q=db/list><i>db list</i></a><br>\n";
//		$html_body .= "<a href=$php_self?q=db/update><i>db update</i></a><br>\n";
		$html_body .= "<hr>\n";
		$html_head = html_header($options);
		$html = $html_head . $html_btn_squares . $html_body . $html_foot;
		print( $html );
		return;
		}


	if( $options[0] == "telnet" ) { telnet($options); return; }

	if( $options[0] == "pdo_insert_pano" ) { pdo_insert_pano($options ); return; }
	if( $options[0] == "pdo_insert_obj" ) { pdo_insert_obj($options ); return; }


	if( $options[0] == "config" ) { 
		leds_config($options); 
		return; 
		}
	if( $options[0] == "zoom" ) { 
		leds_zoom($options); 
		return; 
		}
	if( $options[0] == "zoomxml" ) { 
		if( $_SESSION['zoomxml'] ) { 
			$zoomxml=$_SESSION['zoomxml']; print( $zoomxml ); }
//		else {
//			leds_zoomxml($options); 
//			}
		return; 
		}

	if( $options[0] == "zview" ) { 
		$output = leds_zview($options ); 
		print( "$output" );
		return; 
		}

	if( $options[0] == "zviewxml" ) { 
		$zmcode=$options[1]; 
		$zmtype=$options[2]; 
		$zmrowid=$options[3]; 
		leds_zview_xml($options);
//		print( "BUGS_368 zviewxml:  zmcode=[$zmcode] zmtype=[$zmtype] zmrowid=[$zmrowid]<br>\n" );
		return;
		if( $zmrowid != "" ) {
			leds_zview_xml($options ); 
			return;
			}

		if( $_SESSION['zoomxml'] ) {
			$zoomxml = $_SESSION['zoomxml'];
			print( $zoomxml );
			return;
			}
		return; 
		}

	if( $options[0] == "zview" ) { leds_zview($options ); return; }
//	if( $options[0] == "zoom" ) { leds_zviewxml($options); return; }
	if( $options[0] == "zview_xml" ) { leds_zview_xml($options); return; }
	if( $options[0] == "zview_details" ) { 
		leds_zview_details($options); return; 
		}

	if( $options[0] == "zoom" ) { 
		$output = leds_zoom($options); 
		print( "$output" );
		return; 
		}
	if( $options[0] == "ptobject" ) { 
		$output = html_btn_squares( $options, "" );
		$output .= leds_ptobject($options); 
		print( "$output" );
		return; 
		}
	if( $options[0] == "ptviewer" ) { 
		$output = html_btn_squares( $options, "" );
		$output .= leds_ptviewer($options); 
		print( "$output" );
		return; 
		}

   	if( $options[0] == "dc" ) {
   		$dttm=date("Ymd_His");
//		printf( "<hr>BUGS_1430 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n" );
		$html = html_btn_squares( $options, "" );
		$html .= leds_show( $options );
//		$html .= html_dc_links( $options );

		if( $options[1] == "" ) {
			$html .= "<hr>BUGS_1201 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
			print( "$html" );
			return;
			}
		else {
///			if( $option1 == "new" ) {
///				$html .= "<hr>BUGS_1333 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
///				$html .= html_dc_links($options);
///                              print( $html );
//				$html = dc_new_form( $options );
//				print( $html );
//				return;
//				}
//			if( $option1 == "mod" ) {
//				printf( "<h3>BUGS_1340_MOD</h3>\n" );
//				$kbid=$option2;
////                              $html .= "<hr>BUGS_1220 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
//                              $html .= koaac_kb_mod_form( $kbid );
//				$html .= koaac_kb_new_form( $kbid );
//				print( "$html" );
//				return;
//				}

			if( $option1 == "rpts" ) {
				printf( "BUGS_1460 RPTS<hr>\n" );
				$html .= rpts( $options );
				$html .= leds_dc_rpts( $options );
				print( "$html" );
				return;
				}
   			if( $option1 == "rptsxml" ) {
				$html .= rptsxml( $options );
				print( "$html" );
				return;
				}
//			if( $option1 == "view" ) {
//                              $html  = html_header($options);
//                              $html .= "";
//                              $html .= html_btn_squares( $options, "" );
//				$html .= "<h3>ka1_reports</h3>\n";
//				$html .= leds_dc($options);
//                              $html .= html_dc_links($options);
//                              $html .= "<hr>BUGS_1240 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
//				print( "$html" );
//				return;
//				}
			if( $option1 == "search" ) {
				$output = html_btn_squares( $options, "" );
//                              $output .= leds_kb($options);
				$output .= "<hr>BUGS_1250 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
				print( "$output" );
				return;
				}
			$output .= "<hr>BUGS_1231 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
			print( $output );
			}
		$output .= "<hr>BUGS_1235 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
		print( $output );
		}


// knowledgebase
	if( $options[0] == "kb" ) { 

		$dttm=date("Ymd_His");
//		printf( "<hr>BUGS_1200 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n" );
		$html = html_btn_squares( $options, "" );
		$html .= leds_show( $options );

		$html .= html_kb_links( $options );

		if( $options[1] == "" ) {
//			$html .= "<hr>BUGS_1201 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
			print( "$html" );
			return; 
			}
		else {
			if( $option1 == "new" ) {
				$html .= "<hr>BUGS_1333 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
//				$html .= html_kb_links($options);
//				print( $html );
				$html = koaac_kb_new_form( $options );
				print( $html );
				return; 
				}
			if( $option1 == "mod" ) {
				printf( "<h3>BUGS_1340_MOD</h3>\n" );
				$kbid=$option2;
//				$html .= "<hr>BUGS_1220 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
//				$html .= koaac_kb_mod_form( $kbid );
				$html .= koaac_kb_new_form( $kbid );
				print( "$html" );
				return; 
				}
			if( $option1 == "rpts" ) {
				$html .= rpts( $options );
				$html .= leds_kb_rpts( $options );
				print( "$html" );
				return; 
				}

			if( $option1 == "rptsxml" ) {
				$html .= rptsxml( $options );
				print( "$html" );
				return; 
				}


			if( $option1 == "view" ) {
//				$html  = html_header($options);
//				$html .= "";
//				$html .= html_btn_squares( $options, "" );
				$html .= "<h3>ka1_knowledgebase_view</h3>\n";
				$html .= leds_kb($options); 
//				$html .= html_kb_links($options);
//				$html .= "<hr>BUGS_1240 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
				print( "$html" );
				return; 
				}
			if( $option1 == "search" ) {
				$output = html_btn_squares( $options, "" );
//				$output .= leds_kb($options); 
				$output .= "<hr>BUGS_1250 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
				print( "$output" );
				return; 
				}
			$output .= "<hr>BUGS_1231 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
			print( $output );
			}
		$output .= "<hr>BUGS_1565 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
		print( $output );
		}

        if( $options[0] == "nodes" ) {
                $dttm=date("Ymd_His");
//              printf( "<hr>BUGS_1390 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n" );
//		return;
                $html = html_btn_squares( $options, "" );
                $html .= leds_show( $options );
                $html .= html_nodes_links( $options );

                if( $options[1] == "" ) {
                        $html .= "<hr>BUGS_1201 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
                        print( "$html" );
                        return; 
                        }       
                else {  
                        if( $option1 == "new" ) {
                                $html .= "<hr>BUGS_1333 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
//                              $html .= html_nodes_links($options);
//                              print( $html );
//                                $html = koaac_kb_new_form( $options );
                                print( $html );
                                return; 
                                }       
                        if( $option1 == "mod" ) {
                                printf( "<h3>BUGS_1340_MOD</h3>\n" );
                                $kbid=$option2;
//                              $html .= "<hr>BUGS_1220 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
//                              $html .= koaac_kb_mod_form( $kbid );
                                $html .= koaac_kb_new_form( $kbid );
                                print( "$html" );
                                return; 
                                }       
                        if( $option1 == "rpts" ) {
                                $html .= leds_nodes_rpts( $options );
                                print( "$html" );
                                return; 
                                }       


                        if( $option1 == "view" ) {
//                              $html  = html_header($options);
//                              $html .= "";
//                              $html .= html_btn_squares( $options, "" );
                                $html .= "<h3>ka1_nodes_view</h3>\n";
//                              $html .= leds_nodes($options); 
                              $html .= html_nodes_links($options);
                              $html .= "<hr>BUGS_1433 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
                                print( "$html" );
                                return; 
                                }       

                                }       
                        if( $option1 == "search" ) {
                                $output = html_btn_squares( $options, "" );
//                              $output .= leds_kb($options);
                                $output .= "<hr>BUGS_1250 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
                                print( "$output" );
                                return;
                                }
                        $output .= "<hr>BUGS_1231 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
                        print( $output );
                        }

        if( $options[0] == "ka1" ) {
                $dttm=date("Ymd_His");
//              printf( "<hr>BUGS_1400 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n" );
                $html  = html_btn_squares( $options, "" );
                $html .= leds_show( $options );
//              $html .= leds_smdb($options);

                $html .= "<h3>ka1 ka1d detail </h3>\n";

                $html .= "<a href=$php_self?q=db/grid/ka1d/certs >grid_search </a>\n";
                $html .= " &nbsp &nbsp &nbsp ";
                $html .= "<a href=$php_self?q=db/grid/ka1d/rpts >grid_rpts</a>\n";
                $html .= " &nbsp &nbsp &nbsp ";
                $html .= "<a href=$php_self?q=ka1d/rpts >rpts</a>\n";
                $html .= " &nbsp &nbsp &nbsp ";
                $html .= "<a href=$php_self?q=ka1d/view >view</a>\n";
                $html .= " &nbsp &nbsp &nbsp ";
                $html .= "<hr>\n";

//              $html .= leds_ka1d($options);

                if( $options[1] == "" ) {
//                      $output .= "<hr>BUGS_1301 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
                        print( "$html" );
                        return;
                        }
                else {
///                        if( $option1 == "new" ) {
///                                $output .= koaac_kb_add_form();
///                                print( "$output" );
///                                return;
///                                }
                        if( $option1 == "view" ) {
                                $ka1d_code=$option2;
                                $output .= leds_ka1d($options);
                                print( "$output" );
                                return;
                                }
                        if( $option1 == "rpts" ) {
//                              $output .= "<h2>BUGS_1415 rpts</h2>\n";
                                $output .= leds_ka1d_rpts( $options );
                                print( "$output" );
                                return;
                                }
//                        if( $option1 == "mod" ) {
//                                $cert_id=$option2;
//                                $output = html_btn_squares( $options, "" );
//                                $output .= leds_certs($options);
//                                $output .= "<hr>BUGS_1320 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
//                                print( "$output" );
//                                return;
//                                }

//                        if( $option1 == "add" ) {
//                                $output = html_btn_squares( $options, "" );
//                               $output .= leds_certs($options);
//                                $output .= "<hr>BUGS_1330 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
//                                print( "$output" );
//                                return;
//                                }
//                        if( $option1 == "search" ) {
//                                $output = html_btn_squares( $options, "" );
//                                $output .= leds_kb($options);
//                                $output .= "<hr>BUGS_1330 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
//                                print( "$output" );
//                                return;
//                                }
                        $output .= "<hr>BUGS_1956 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
                        print( $output );
                        return;
                        }


        $output .= "<hr>BUGS_1330 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
        print( $output );
        return;
        }




        if( $options[0] == "certs" ) {
                $dttm=date("Ymd_His");
//              printf( "<hr>BUGS_1200 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n" );
                $output = html_btn_squares( $options, "" );
                $output .= leds_show( $options );
//		$output .= leds_certs($options);

		$output .= "<h3>ka1 certs detail </h3>\n";

                $output .= "<a href=$php_self?q=db/grid/ka1_certs/certs >grid_search </a>\n";
		$output .= " &nbsp &nbsp &nbsp ";
                $output .= "<a href=$php_self?q=db/grid/ka1_certs/rpts >grid_rpts</a>\n";
		$output .= " &nbsp &nbsp &nbsp ";
                $output .= "<a href=$php_self?q=certs/rpts >rpts</a>\n";
		$output .= " &nbsp &nbsp &nbsp ";
                $output .= "<a href=$php_self?q=certs/view >view</a>\n";
		$output .= " &nbsp &nbsp &nbsp ";
                $output .= "<hr>\n";

//                $output .= leds_certs($options);

                if( $options[1] == "" ) {
//                        $output .= "<hr>BUGS_1301 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
                        print( "$output" );
                        return;
                        }
                else {
                        if( $option1 == "new" ) {
				$output .= koaac_kb_add_form();
                                print( "$output" );
                                return;
                                }
                        if( $option1 == "view" ) {
				$cert_code=$option2;
                                $output .= leds_certs($options);
                                print( "$output" );
                                return;
                                }
			if( $option1 == "rpts" ) {
//				$output .= "<h2>BUGS_1315 rpts</h2>\n";
				$output .= leds_certs_rpts( $options );
				print( "$output" );
				return; 
				}
                        if( $option1 == "mod" ) {
				$cert_id=$option2;
                                $output = html_btn_squares( $options, "" );
                                $output .= leds_certs($options);
//                                $output .= "<hr>BUGS_1320 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
                                print( "$output" );
                                return;
                                }
                        if( $option1 == "add" ) {
                                $output = html_btn_squares( $options, "" );
//                               $output .= leds_certs($options);
                                $output .= "<hr>BUGS_1330 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
                                print( "$output" );
                                return;
                                }
                        if( $option1 == "search" ) {
                                $output = html_btn_squares( $options, "" );
                                $output .= leds_kb($options);
//                                $output .= "<hr>BUGS_1330 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
                                print( "$output" );
                                return;
                                }
                        $output .= "<hr>BUGS_2036 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
                        print( $output );
			return;
                        }


	$output .= "<hr>BUGS_1330 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
	print( $output );
	return;
	}


// certs
	if( $options[0] == "certs1" ) { 
		if( $options[2] == "" ) {
			$output = html_btn_squares( $options, "" );
			$output .= leds_certs($options); 
			$output .= "<h2>CERTS_1140 o0=[$option1] o1=[$option1] o2=[$option2] o3=[$options3]</h2>\n";
			print( "$output" );
			return; 
			}
		else {
			if( $option1 == "view" ) {
				$output = html_btn_squares( $options, "" );
				$output .= leds_certs($options); 
				print( "$output" );
				return; 
				}
			if( $option1 == "mod" ) {
				$output = html_btn_squares( $options, "" );
				$output .= leds_certs($options); 
				print( "$output" );
				return; 
				}
			if( $option1 == "add" ) {
				$output = html_btn_squares( $options, "" );
				$output .= leds_certs($options); 
				print( "$output" );
				return; 
				}
			$output = html_btn_squares( $option2, "" );
			$output .= "<h2>CERTS_1180 UNSUPPORTED COMMAND o0=[$option1] o1=[$option1] o2=[$option2] o3=[$options3]</h2>\n";
			}
		}


        if( $options[0] == "cons" ) {
                $dttm=date("Ymd_His");
//              printf( "<hr>BUGS_1200 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n" );
                $output = html_btn_squares( $options, "" );
                $output .= leds_show( $options );
//              $output .= leds_certs($options);

                $output .= "<h3>ka1 cons detail </h3>\n";

                $output .= "<a href=$php_self?q=db/grid/ka1_cons/rsncons >grid_search </a>\n";
                $output .= " &nbsp &nbsp &nbsp ";
                $output .= "<a href=$php_self?q=db/grid/ka1_cons/rpts >grid_rpts</a>\n";
                $output .= " &nbsp &nbsp &nbsp ";
                $output .= "<a href=$php_self?q=cons/rpts >rpts</a>\n";
                $output .= " &nbsp &nbsp &nbsp ";
                $output .= "<a href=$php_self?q=cons/view >view</a>\n";
                $output .= " &nbsp &nbsp &nbsp ";
                $output .= "<hr>\n";

//                $output .= leds_cons($options);

                if( $options[1] == "" ) {
//                        $output .= "<hr>BUGS_1301 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
                        print( "$output" );
                        return;
                        }
                else {
////                    if( $option1 == "new" ) {
////                            $output .= koaac_kb_add_form();
////                            print( "$output" );
////                            return;
////                            }
                        if( $option1 == "view" ) {
                                $cert_code=$option2;
                                $output .= leds_cons($options);
                                print( "$output" );
                                return;
                                }
                        if( $option1 == "rpts" ) {
//                              $output .= "<h2>BUGS_1315 rpts</h2>\n";
                                $output .= leds_cons_rpts( $options );
                                print( "$output" );
                                return;
                                }
                        if( $option1 == "mod" ) {
                                $cert_id=$option2;
                                $output = html_btn_squares( $options, "" );
                                $output .= leds_cons($options);
//                                $output .= "<hr>BUGS_1320 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
                                print( "$output" );
                                return;
                                }
                        if( $option1 == "add" ) {
                                $output = html_btn_squares( $options, "" );
//                               $output .= leds_cons($options);
                                $output .= "<hr>BUGS_1330 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
                                print( "$output" );
                                return;
                                }
                        if( $option1 == "search" ) {
                                $output = html_btn_squares( $options, "" );
                                $output .= leds_kb($options);
//                                $output .= "<hr>BUGS_1330 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
                                print( "$output" );
                                return;
                                }
                        $output .= "<hr>BUGS_2148 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
                        print( $output );
                        return;
                        }

	        $output .= "<hr>BUGS_1330 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
        	print( $output );
        	return;
        	}

        if( $options[0] == "dc" ) {
                $dttm=date("Ymd_His");
//              printf( "<hr>BUGS_1200 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n" );
                $output = html_btn_squares( $options, "" );
                $output .= leds_show( $options );
//              $output .= leds_certs($options);

                $output .= "<h3>ka1 test detail </h3>\n";

                $output .= "<a href=$php_self?q=db/grid/ka1_hosts/ka1_hosts >ka1_hosts </a>\n";
                $output .= " &nbsp &nbsp &nbsp ";
                $output .= "<a href=$php_self?q=db/grid/ka1_hosts/ka1_servers >ka1_servers </a>\n";
                $output .= " &nbsp &nbsp &nbsp ";
                $output .= "<a href=$php_self?q=db/grid/ka1_hosts/rsn_servers >rsn_servers </a>\n";
                $output .= " &nbsp &nbsp &nbsp ";
                $output .= "<a href=$php_self?q=db/grid/ka1_hosts/hrc_servers >hrc_servers </a>\n";
                $output .= " &nbsp &nbsp &nbsp ";
                $output .= "<a href=$php_self?q=db/grid/ka1_hosts/hrc_hosts >hrc_hosts </a>\n";
                $output .= " &nbsp &nbsp &nbsp ";
                $output .= "<a href=$php_self?q=db/grid/ka1_hosts/datacall >datacall </a>\n";
                $output .= " &nbsp &nbsp &nbsp ";
                $output .= "<a href=$php_self?q=db/grid/ka1_hosts/rpts >rpts</a>\n";
                $output .= " &nbsp &nbsp &nbsp ";
                $output .= "<a href=$php_self?q=hosts/rpts >rpts</a>\n";
                $output .= " &nbsp &nbsp &nbsp ";


		}

        if( $options[0] == "hosts" ) {
                $dttm=date("Ymd_His");
//              printf( "<hr>BUGS_1200 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n" );
                $output = html_btn_squares( $options, "" );
                $output .= leds_show( $options );
//              $output .= leds_certs($options);

                $output .= "<h3>ka1 hosts detail </h3>\n";

                $output .= "<a href=$php_self?q=db/grid/ka1_hosts/ka1_hosts >ka1_hosts </a>\n";
                $output .= " &nbsp &nbsp &nbsp ";
                $output .= "<a href=$php_self?q=db/grid/ka1_hosts/ka1_servers >ka1_servers </a>\n";
                $output .= " &nbsp &nbsp &nbsp ";
                $output .= "<a href=$php_self?q=db/grid/ka1_hosts/rsn_servers >rsn_servers </a>\n";
                $output .= " &nbsp &nbsp &nbsp ";
                $output .= "<a href=$php_self?q=db/grid/ka1_hosts/hrc_servers >hrc_servers </a>\n";
                $output .= " &nbsp &nbsp &nbsp ";
                $output .= "<a href=$php_self?q=db/grid/ka1_hosts/hrc_hosts >hrc_hosts </a>\n";
                $output .= " &nbsp &nbsp &nbsp ";
                $output .= "<a href=$php_self?q=db/grid/ka1_hosts/datacall >datacall </a>\n";
                $output .= " &nbsp &nbsp &nbsp ";
                $output .= "<a href=$php_self?q=db/grid/ka1_hosts/rpts >rpts</a>\n";
                $output .= " &nbsp &nbsp &nbsp ";
                $output .= "<a href=$php_self?q=hosts/rpts >rpts</a>\n";
                $output .= " &nbsp &nbsp &nbsp ";
                $output .= "<a href=$php_self?q=hosts/view >view</a>\n";
                $output .= " &nbsp &nbsp &nbsp ";
                $output .= "<hr>\n";

//                $output .= leds_cons($options);

                if( $options[1] == "" ) {
//                        $output .= "<hr>BUGS_1301 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
                        print( "$output" );
                        return;
                        }
                else {
////                    if( $option1 == "new" ) {
////                            $output .= koaac_kb_add_form();
////                            print( "$output" );
////                            return;
////                            }
                        if( $option1 == "view" ) {
                                $cert_code=$option2;
                                $host_code=$option2;
                                $output .= leds_hosts($options);
                                print( "$output" );
                                return;
                                }
                        if( $option1 == "rpts" ) {
//                              $output .= "<h2>BUGS_1315 rpts</h2>\n";
                                $output .= leds_hosts_rpts( $options );
                                print( "$output" );
                                return;
                                }
                        if( $option1 == "mod" ) {
                                $cert_id=$option2;
                                $output = html_btn_squares( $options, "" );
                                $output .= leds_hosts($options);
//                                $output .= "<hr>BUGS_1320 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
                                print( "$output" );
                                return;
                                }
                        if( $option1 == "add" ) {
                                $output = html_btn_squares( $options, "" );
//                               $output .= leds_hosts($options);
                                $output .= "<hr>BUGS_1330 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
                                print( "$output" );
                                return;
                                }
                        if( $option1 == "search" ) {
                                $output = html_btn_squares( $options, "" );
                                $output .= leds_hosts($options);
//                                $output .= "<hr>BUGS_1330 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
                                print( "$output" );
                                return;
                                }
                        $output .= "<hr>BUGS_2262 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
                        print( $output );
                        return;
                        }

                $output .= "<hr>BUGS_1820 $progid $dttm o0=$option0 o1=$option1 o2=$option2 o3=$option3<hr>\n";
                print( $output );
                return;
                }






	if( $options[0] == "iperms" ) { iperms($options); return; }

	if( $options[0] == "run" ) {
		$function_name=$options[1];
		if( function_exists( $function_name )) {
//			print( "startup MSG:  EXISTS $function_name<br>\n" );
			html_page($options);
			$function_name( $options );
			}
		else {
			html_page($options);
			print( "startup ERR:  UNAVAILABLE $options[1]<br>\n" );
//			$functions = get_defined_functions();
//			print_r($functions['user']);
			}
		return;
		}
		
	if( $options[0] == "install_leds" ) {pdo_cr_leds(); pdo_insert_leds(); return;}
	if( $options[0] == "install_users" ) {pdo_cr_users(); pdo_insert_users(); return;}

//	leds_install();
//	leds_query();

//	$option0=$options[0];
//	printf( "<hr>BUGS_501 option=$option0<hr>\n" );

	html_page($options);

//	printf( "<hr>BUGS_502 option=$option0<hr>\n" );

//	fgmenu_htm($options);
//	fgmenu_dyn($options);
	}

function ko_ajax( $options ) {
	$option1=$options[1];
	$option2=$options[2];
	$option3=$options[3];
//         if( preg_match( "/index/i", $filename )) { continue; }
	$output .= "ko_ajax MSG_2430:  [$option1][$option2][$option3]<br>\n";

	if( $option1 == "test1" ) {
		$ctrl = new LoginController();
		$result = new ServiceResult();
		$result->success = $ctrl->login($_POST['username'], $_POST['password']);
		$result->errors = $ctrl->errors;
		$result->onSuccessEvent = 'refreshPage';
		$result->onErrorEvent = 'userLoginFailed';
		echo json_encode($result);
		}
	if( $option1 == "test2" ) {

		}

	return( $output );

	}

function ko_ajax_controller($options) {
	$ko_ajax_controler="";
	$ko_ajax_controller .= "LoginController.prototype.login = function() {\n";
	$ko_ajax_controller .= "    var self = this;\n";
	$ko_ajax_controller .= "    var username = jQuery('#loginForm .email').val()\n";
	$ko_ajax_controller .= "    var password = jQuery('#loginForm .password').val()\n";
	$ko_ajax_controller .= "    var data = {\n";
	$ko_ajax_controller .= "        username:username,\n";
	$ko_ajax_controller .= "        password:password,\n";
	$ko_ajax_controller .= "    };\n";
	$ko_ajax_controller .= "    jQuery.ajax({\n";
	$ko_ajax_controller .= "        url:'login.php',\n";
	$ko_ajax_controller .= "        async:true,\n";
	$ko_ajax_controller .= "        service:'login',\n";
	$ko_ajax_controller .= "        type:'post',\n";
	$ko_ajax_controller .= "        dataType:'json',\n";
	$ko_ajax_controller .= "        data:data\n";
	$ko_ajax_controller .= "    });\n";
	$ko_ajax_controller .= "}\n";
	return( $ko_ajax_controller );
	}


function ko_ajax_listener($options) {
	$ko_ajax_listener  = "";
	$ko_ajax_listener .= "LoginController.prototype.login = function() {\n";
	$ko_ajax_listener .= "function LoginController() {\n";
	$ko_ajax_listener .= "    var self = this;\n";
	$ko_ajax_listener .= "    jQuery(document).ready(function() {\n";
	$ko_ajax_listener .= "        self.onLoad();\n";
	$ko_ajax_listener .= "    })\n";
	$ko_ajax_listener .= "}\n";
	$ko_ajax_listener .= "\n";
	$ko_ajax_listener .= "LoginController.prototype = new BaseController();\n";
	$ko_ajax_listener .= "\n";
	$ko_ajax_listener .= "LoginController.prototype.onLoad = function() {\n";
	$ko_ajax_listener .= "    var self = this;\n";
	$ko_ajax_listener .= "    this.addListener('userLoginFailed', function(event, result) {\n";
	$ko_ajax_listener .= "        self.onLoginFailed(result);\n";
	$ko_ajax_listener .= "    })\n";
	$ko_ajax_listener .= "}\n";
	$ko_ajax_listener .= "\n";
	$ko_ajax_listener .= "LoginController.prototype.onLoginFailed = function(result) {\n";
	$ko_ajax_listener .= "    jQuery('#errorDisplay').html(result.errors[0]);\n";
	$ko_ajax_listener .= "}\n";
	return( $ko_ajax_listener );
	}

function ko_ajax_app($options) {
	$ko_ajax_app = "";
	$ko_ajax_app .= "function AppController() {\n";
	$ko_ajax_app .= "    var self = this;\n";
	$ko_ajax_app .= "    jQuery(document).ready(function() {\n";
	$ko_ajax_app .= "        self.onLoad();\n";
	$ko_ajax_app .= "    })\n";
	$ko_ajax_app .= "}\n";
	$ko_ajax_app .= "\n";
	$ko_ajax_app .= "AppController.prototype = new BaseController();\n";
	$ko_ajax_app .= "\n";
	$ko_ajax_app .= "AppController.prototype.onLoad = function () {\n";
	$ko_ajax_app .= "    this.addListener('refreshPage', function(event, user) {\n";
	$ko_ajax_app .= "        window.location.reload()\n";
	$ko_ajax_app .= "    })\n";
	$ko_ajax_app .= "}\n";
	return( $ko_ajax_app );
	}

function ko_ajax_complete($options) {
	$ko_ajax_compledte .= "jQuery(document).ajaxComplete(function(event, request, settings) {\n";
	$ko_ajax_compledte .= "    if (settings.dataType == 'json') {\n";
	$ko_ajax_compledte .= "        var dispatcher = new EventDispatcher();\n";
	$ko_ajax_compledte .= "        var result = jQuery.parseJSON(request.responseText);\n";
	$ko_ajax_compledte .= "        if (result) {\n";
	$ko_ajax_compledte .= "            if (result.success == true && result.onSuccessEvent) {\n";
	$ko_ajax_compledte .= "                dispatcher.dispatch(result.onSuccessEvent, result)\n";
	$ko_ajax_compledte .= "            } else if (result.onErrorEvent) {\n";
	$ko_ajax_compledte .= "                dispatcher.dispatch(result.onErrorEvent, result)\n";
	$ko_ajax_compledte .= "            }\n";
	$ko_ajax_compledte .= "        }\n";
	$ko_ajax_compledte .= "    }\n";
	$ko_ajax_compledte .= "})\n";
	return( $ko_ajax_compete );
	}

function ko_ajax_result($options) {
	$output .= "class ServiceResult {\n";
	$output .= "       public $success;\n";
	$output .= "      public $errors;\n";
	$output .= "     public $messages;\n";
	$output .= "    public $data;\n";
	$output .= "     public $onSuccessEvent;\n";
	$output .= "    public $onErrorEvent;\n";
	$output .= "}\n";
	return( $output );
	}



function ko_dragdrop_redirect($options) {
	$http_host=$_SERVER['HTTP_HOST'];
	$php_self=$_SERVER['PHP_SELF'];
//	$url="https://$http_host/$php_self?q=dragdrop/test2\n";
//	$ko_dragdrop_redirect = "";
//	$ko_dragdrop_redirect .= "url:$url";

        $location_url .= "var url = \"https://$http_host/php_self?q=dragdrop/test2/\";\n";
	$location_url = "$(location).attr('href',url);\n";

	$output = "";
	$output .= $location_url;
	return( $output );
	}


function ko_dragdrop( $options ) {
	$option1=$options[1];
	$option2=$options[2];
	$option3=$options[3];
//         if( preg_match( "/index/i", $filename )) { continue; }
	$output .= "dragdrop MSG_2430:  [$option1][$option2][$option3]<br>\n";
	$cab="./imgs/cab/cab_empty.png";
	$item1="./imgs/cab/visix_content_server.png";
	$item2="./imgs/cab/hp_dl585_g2.png";
	$item3="./imgs/cab/hp_rx7640.png";
	$item4="./imgs/cab/sun_x4140.png";
	$item5="./imgs/cab/sunfire_v440.png";

	$output = "";
	$width="50";
	if( $option1 == "test1" ) {
		$output .= "<hr><h2>test1</h2><hr>\n";
///		$output .= "div id=\"drop\"> &nbsp; &nbsp; &nbsp; &nbsp;\n";
////		$output .= "<div id=\"drop\"> <span id=\"sw\">Show</span>\n";
////		$output .= "<div id=\"drop\"><img src=images/cab/cab_empty.png width=50><span id=\"sw\">Show</span>\n";
		$output .= "<div id=\"drop\"><img src=images/cab/cab_empty.png width=50></div>\n";
		$output .= "<hr>\n";
		$output .= "<div id=\"drop\"><span id=\"sw\">Show</span></div>\n";
////		$output .= "</div>\n";

		$output .= "<div id=\"drag\">\n";
		$output .= " images:<br/>\n";
////		$output .= "<img src=\"circle.gif\" alt=\"circle\" width=\"45\" height=\"45\" class=\"drg\" />\n";
////		$output .= "<img src=\"triangle.gif\" alt=\"triangle\" width=\"65\" height=\"55\" class=\"drg\" />\n";
		$output .= " <img src=\"$item1\" alt=\"visix_content_server\" width=\"$width\" class=\"drg\" />\n";
		$output .= " <img src=\"$item2\" alt=\"hp_dl585\" width=\"$width\" class=\"drg\" />\n";
		$output .= " <img src=\"$item3\" alt=\"hp_rx7640\"  width=\"$width\" class=\"drg\" />\n";
		$output .= " <img src=\"$item4\" alt=\"sun_x4140\"  width=\"$width\" class=\"drg\" />\n";
		$output .= " <img src=\"$item5\" alt=\"sunfire_v440\"  width=\"$width\" class=\"drg\" />\n";
		$output .= "</div>\n";
		$output .= " <div class=\"drg\" Click and drag</div>\n";
		}

	if( $option1 == "test2" ) {
#		printf( "MSG_2500:  [$option1][$option2][$option3][$option4]<br>\n" );
		}

	if( $option1 == "test3" ) {

		}
	if( $option1 == "test4" ) {

		}
	return( $output );
	}

function dragdrop_test1($options) {
	$html = "";
	$html .= "<style type=\"text/css\"><!--\n";
	$html .= "#drop {\n";
	$html .= " width:200px;\n";
	$html .= " height:150px;\n";
	$html .= " margin:3px auto;\n";
	$html .= " background:#eddaa8;\n";
	$html .= " font-size:16px;\n";
	$html .= "}\n";
	$html .= "#drop #sw { text-decoration:underline; cursor:pointer; }\n";
	$html .= "#drag {\n";
	$html .= " width:450px;\n";
	$html .= " height:180px;\n";
	$html .= " margin:12px auto;\n";
	$html .= " border:1px solid silver;\n";
	$html .= " font-size:16px;\n";
	$html .= "}\n";
	$html .= "#drag .drg { margin:10px 12px; }\n";
	$html .= "#drag div.drg {\n";
	$html .= " width:150px;\n";
	$html .= " height:50px;\n";
	$html .= " background:#07da08;\n";
	$html .= " border:2px solid blue;\n";
	$html .= "}\n";
	$html .= "--></style>\n";

////	$html .= "<script type=\"text/javascript\" src=\"jquery_1.6.1.js\"></script>\n";
////	$html .= "<script type=\"text/javascript\" src=\"jquery-ui-1.8.14.js\"></script>\n";
//// jk	$html .= "<script type=\"text/javascript\" src=\"jquery_1.8.3.js\"></script>\n";
//// jk	$html .= "<script type=\"text/javascript\" src=\"jquery-ui-1.9.2.custom.js\"></script>\n";
////	$html .= "<script type=\"text/javascript\"><!--\n";


	$html .= "<script type=\"text/javascript\">\n";
	$html .= "$(document).ready(function() {\n";
	$html .= "  // sets the draggable\n";
	$html .= "  $('#drag .drg').draggable({\n";
	$html .= "    cursor: 'move',          // sets the cursor apperance\n";
	$html .= "    revert: 'valid'\n";
	$html .= "  });\n";
	$html .= "\n";
	$html .= "  // sets droppable\n";
	$html .= "  $('#drop').droppable({\n";
	$html .= "    drop: function(event, ui) {\n";
	$html .= "      // after the draggable is droped, hides it with a hide() effect\n";
	$html .= "      ui.draggable.hide(1000);\n";
	$html .= "    }\n";
	$html .= "  });\n";
	$html .= "\n";
	$html .= "  // when the \"#sw\" element (inside the \"#drop\") is clicked\n";
	$html .= "  // show the items with class \"drg\", contained in \"#drag\"\n";
	$html .= "  $('#drop #sw').click(function(){\n";
	$html .= "    $('#drag .drg').slideDown(1000);\n";
	$html .= "  });\n";
	$html .= "});\n";
	$html .= "--></script>\n";
	$html .= "</head>\n";
	$html .= "<body>\n";

////	$html .= "<div id=\"drop\">Drop here &nbsp; &nbsp; &nbsp; &nbsp; <span id=\"sw\">Show</span></div>\n";
////	$html .= "<div id=\"drop\"><img src=images/cab/cab_empty width=50><span id=\"sw\">Show</span></div>\n<img src=images/cab/cab_empty width=25></div>\n";

	$html .= "<div id=\"drop\"><img src=images/cab/cab_empty width=50>\n";
	$html .= "<span id=\"hd\">hide</span></div>\n";
	$html .= "<span id=\"loc\">loc</span></div>\n";


	$html .= "<div id=\"drag\">\n";
	$html .= " ka1 dragdrop test_2575: <br/>\n";
	$html .= " <img src=\"images/cab/vbrick.png\" alt=\"vbrick\" width=\"45\" height=\"45\" class=\"drg\" />\n";
	$html .= " <img src=\"images/cab/item1.png\" alt=\"item1\" width=\"45\" height=\"45\" class=\"drg\" />\n";
	$html .= " <img src=\"images/cab/item2.png\" alt=\"item2\" width=\"45\" height=\"45\" class=\"drg\" />\n";
////	$html .= " <img src=\"images/cab/item3.png\" alt=\"item3\" width=\"45\" height=\"45\" class=\"drg\" />\n";
////	$html .= " <div class="drg">DIV with some content. Click and drag</div>\n";
	$html .= "</div>\n";

	return( $html );
	}


function ko_im( $options ) {
	$option1=$options[1];
	$option2=$options[2];
	$option3=$options[3];
//         if( preg_match( "/index/i", $filename )) { continue; }
	$output .= "MSG_2450 dragdrop MSG_1234:  [$option1][$option2][$option3]<br>\n";
	if( $option1 == "test1" ) {

		}
	if( $option1 == "test2" ) {

		}
	if( $option1 == "test3" ) {

		}
	if( $option1 == "test4" ) {

		}
	return( $output );
	}




function ko_plans_items($options) {
	$http_host=$_SERVER['HTTP_HOST'];
	$php_self=$_SERVER['PHP_SELF'];

	$dbfile="ka1.db3";
	$planid="plan1";
	$cabtop_pngfil="./imgs/cab/cabtop.png";
	$cabbottom_pngfil="./imgs/cab/cabbottom.png";
	$cabtop_pngfil="./imgs/cab/tn/tn_cabtop.png";
	$cabbottom_pngfil="./imgs/cab/tn/tn_cabbottom.png";
	$cab_empty_pngfil="./imgs/cab/cab_empty.png";
	$output  = "<h2>ko_plans_2750:  dbfile=[$dbfile] planid=[$planid] cab=[$cab]</h2>\n";
	$output .= "<hr>\n";
	$items_flag="true";
	$width="35";
	$limit="5";

	$step=0;
	$steplim=5;
	$item_limit=5;

	$sql_maxamp = "select val maxamp from cfg where fld=='maxamp'";
	$maxamp = sqlq( $dbfile, $sql_maxamp, "maxamp" );
////	printf( "MSG_2011:  maxamp=[$maxamp] sql_maxamp=[$sql_maxamp] dbfile=[$dbfile]<br>\n" );
	
	$sql_minamp = "select val minamp from cfg where fld=='minamp'";
	$minamp = sqlq( $dbfile, $sql_minamp, "minamp" );
////	printf( "MSG_2012:  maxamp=[$maxamp] sql_minamp=[$sql_minamp] dbfile=[$dbfile]<br>\n" );

        $zm5_output ="";
        $zm5_output .= "<a href=https://$http_host/ka1/zm5/zm5.html alt=zoomify target=_blank>zm5</a><br>";

//	$setup_output = "MSG_2780:  maxamp=[$maxamp] minamp=[$minamp] dropzone=[$dropzone] <hr>\n";
//	$setup_ouput .= $dropzone;

	$output_test1 = "";
	$output_test1 .= "<img src=\"./imgs/cab/dd42.png\" class=\"img-float\">\n";
	$output_test1 .= "<img src=\"./imgs/cab/dd45.png\" class=\"img-float\">\n";
	$output_test1 .= "<img src=\"./imgs/cab/dd47.png\" class=\"img-float\">\n";

	$item_limit=6;
        $sql_items="select distinct(item) item, sn,cab,cab1,cab2,amps from ko_plans where planid == 'plan1' order by cast(amps as real) desc, cab limit $item_limit ";

	$output = "";
	$item_output = "";
	$item_output .= "<hr><h1>item</h1><hr>\n" . $testout ;
////	$item_output .= "MSG_2330: width=$width dbfile=[$dbfile] sql_items=[$sql_items]<br>\n";
        $pdo = newpdo( $dbfile );
        $j=0; $item_tot_samps=0; $item1_pnglist="";

        foreach( $pdo->query( $sql_items) as $row ) {
		$item_output = "";
////		printf( "MSG_2828:  $j sql_items=[$sql_items] dbfile=[$dbfile]<br>\n" );
                $j++;
                foreach( $row as $key=>$val ) {
			if( is_numeric( $key )) { continue; } 
			if( $key == 'item' ) { $item=$val; }
			if( $key == 'cab' ) { $cab=$val; }
			if( $key == 'cab1' ) { $cab1=$val; }
			if( $key == 'cab2' ) { $cab2=$val; }
			if( $key == 'sn' ) { $sn=$val; }
			if( $key == 'hrctag' ) { $hrctag=$val; }
			if( $key == 'amps' ) { $amps=$val; }
			}
////		printf( "MSG_2830:  $j $item $cabs $sn $samps<br>" );
		$item_pngfil="./imgs/cab/tn/tn_$item.png";
		$item_pngfil="./imgs/cab/$item.png";
		$im_cmd .= " $item_pngfil";
		if( file_exists( $item_pngfil )) {
			$item_url  = "<a href=https://$http_host/$php_self?q=sn/$sn>";
			$item_url .= "<img id=\"ko_dragdrop\" src=$item_pngfil border=0 width=$width alt=$sn>";
			$item_url .= "</a>";
////			$item_divurl = "<div id=\"ko_dragdrop\" >\n";
////			$item_divurl .= "<div class=\"drg\" id=\"drag\" >$item_url</div>\n";
			$item_divurl .= "<div class=\"ko_dragdrop\" id=\"$sn\" >$item_url</div>\n";
			$item_output .= $item_divurl;
			$item_divurl .= "</div>";
////			$item_divurl .= "</div>";
			$item_output .= "\n<h4>MSG_2860</h4> sn=$sn hrctag=$hrctag item=$item amps=$amps [$cab][$cab1][$cab2] samps=$samps\n";
////			printf( "MSG_2841:  FOUND item=[$item] item_pngfil=[$item_pngfil]<br>\n" );
			}
		else {
////			printf( "MSG_2842:  NOTFOUND item=[$item] item_pngfil=[$item_pngfil]<br>\n" );
			$item_null_url="<a https://$http_host/$php_self?q=item/$item>$item_empty_png</a>";
			$item_divurl  ="<div id=\"drag\" \n";
			$item_divurl .= "<div class=\"ko_dragdrop\" id=\"$sn\" >$item_empty_url</div>";
			$item_divurl .= "</div>\n";
			$item_output .= $item_divurl;
			}
		}

////	printf( "MSG_2840:  $j sql_items=[$sql_items] dbfile=[$dbfile]<br>\n" );
	$dropzone = "";
//	$dropzone .= "<div id=\"drop\"><img src=\"$cab_empty_pngfil\" alt=$sn width=$width><span id=\"sw\">show</span></div>\n";
	$item_output .= "<hr>MSG_2870<hr>\n";
	return( $item_output );
	}




function ko_plans_steps($options) {
	$http_host=$_SERVER['HTTP_HOST'];
	$php_self=$_SERVER['PHP_SELF'];

	$dbfile="ka1.db3";
	$planid="plan1";
	$cabtop_pngfil="./imgs/cab/cabtop.png";
	$cabbottom_pngfil="./imgs/cab/cabbottom.png";
	$cabtop_pngfil="./imgs/cab/tn/tn_cabtop.png";
	$cabbottom_pngfil="./imgs/cab/tn/tn_cabbottom.png";
	$cab_empty_pngfil="./imgs/cab/cab_empty.png";
	$output  = "<h2>ko_plans_2750:  dbfile=[$dbfile] planid=[$planid] cab=[$cab]</h2>\n";
	$output .= "<hr>\n";
	$items_flag="true";
	$width="35";
	$limit="5";

	$step=0;
	$steplim=5;
	$item_limit=5;

	$sql_maxamp = "select val maxamp from cfg where fld=='maxamp'";
	$maxamp = sqlq( $dbfile, $sql_maxamp, "maxamp" );
////	printf( "MSG_2011:  maxamp=[$maxamp] sql_maxamp=[$sql_maxamp] dbfile=[$dbfile]<br>\n" );
	
	$sql_minamp = "select val minamp from cfg where fld=='minamp'";
	$minamp = sqlq( $dbfile, $sql_minamp, "minamp" );
////	printf( "MSG_2012:  maxamp=[$maxamp] sql_minamp=[$sql_minamp] dbfile=[$dbfile]<br>\n" );

        $zm5_output ="";
        $zm5_output .= "<a href=https://$http_host/ka1/zm5/zm5.html alt=zoomify target=_blank>zm5</a><br>";

//	$setup_output = "MSG_2780:  maxamp=[$maxamp] minamp=[$minamp] dropzone=[$dropzone] <hr>\n";
//	$setup_ouput .= $dropzone;

	$output_test1 .= "<img src=\"./imgs/cab/dd42.png\" class=\"img-float\">\n";
	$output_test1 .= "<img src=\"./imgs/cab/dd45.png\" class=\"img-float\">\n";
	$output_test1 .= "<img src=\"./imgs/cab/dd47.png\" class=\"img-float\">\n";




        $sql_items="select distinct(item) item, sn,cab,cab1,cab2,amps from ko_plans where planid == 'plan1' order by cast(amps as real) desc, cab limit $item_limit ";

	$output = "";
	$item_output = "";
	$item_output .= "<hr><h1>item</h1><hr>\n" . $testout ;
////	$item_output .= "MSG_2330: width=$width dbfile=[$dbfile] sql_items=[$sql_items]<br>\n";
////	printf( "item_output = $item_output $sql_items dbfile=[$dbfile]<br>\n" );
        $pdo = newpdo( $dbfile );
        $j=0; $item_tot_samps=0; $item1_pnglist="";

        foreach( $pdo->query( $sql_items) as $row ) {
////		printf( "MSG_2930:  $j sql_items=[$sql_items] dbfile=[$dbfile]<br>\n" );
                $j++;
                foreach( $row as $key=>$val ) {
			if( is_numeric( $key )) { continue; } 
			if( $key == 'item' ) { $item=$val; }
			if( $key == 'cab' ) { $cab=$val; }
			if( $key == 'cab1' ) { $cab1=$val; }
			if( $key == 'cab2' ) { $cab2=$val; }
			if( $key == 'sn' ) { $sn=$val; }
			if( $key == 'hrctag' ) { $hrctag=$val; }
			if( $key == 'amps' ) { $amps=$val; }
			}
////		printf( "MSG_2950:  $j $item $cabs $sn $samps<br>" );
		$item_pngfil="./imgs/cab/tn/tn_$item.png";
		$item_pngfil="./imgs/cab/$item.png";
		$im_cmd .= " $item_pngfil";
		if( file_exists( $item_pngfil )) {
			$item_url  = "<a href=https://$http_host/$php_self?q=item/$item>";
			$item_url .= "<img class=\"ko_dragdrop\" src=$item_pngfil border=0 width=$width alt=$sn>";
			$item_url .= "</a>";
////			$item_divurl = "<div id=\"drag\" \n";
////			$item_divurl .= "<div class=\"drg\" id=\"drag\" >$item_url</div>\n";
////			$item_divurl .= "<div class=\"drg\" id=\"$sn\" >$item_url</div>\n";
////			$item_divurl .= "</div>";
			$item_output .= $item_divurl;
			$item_output .= "\n<br> sn=$sn hrctag=$hrctag item=$item amps=$amps samps=$samps\n";
////			printf( "MSG_2961:  FOUND item=[$item] item_pngfil=[$item_pngfil]<br>\n" );
			}
		else {
////			printf( "MSG_2962:  NOTFOUND item=[$item] item_pngfil=[$item_pngfil]<br>\n" );
			$item_null_url="<a https://$http_host/$php_self?q=item/$item>$item_empty_png</a>";
////			$item_divurl  ="<div id=\"drag\" \n";
////			$item_divurl .= "<div class=\"drg\" id=\"drag\" >$item_empty_url</div>";
////			$item_divurl .= "</div>\n";
			$item_output .= $item_divurl;
			}
		}

////	printf( "MSG_2970:  $j sql_items=[$sql_items] dbfile=[$dbfile]<br>\n" );


        $sql_cab1="select distinct(cab1) cab1, group_concat( item, ' ' ) items, sum(amps) samps from ko_plans where planid == 'plan1'  and cab == cab1 group by cab1 limit 6";

	$output = "";
	$cab1_output .= "<hr><h1>cab1</h1><hr>\n";
        $pdo = newpdo( $dbfile );
        $j=0; $cab1_tot_samps=0; $cab1_pnglist="";
///	printf( "MSG_2860: $j sql_cab1=[$sql_cab1] cab1=[$cab1] cab1_items=[$cab1_items] cab1_samps=[$cab1_samps] cab1_pngfil=[$cab1_pngfil]<br>\n" );
        foreach( $pdo->query( $sql_cab1) as $row ) {
                $j++;
                foreach( $row as $key=>$val ) {
			if( is_numeric( $key )) { continue; } 
			if( $key == 'cab1' ) { $cab1=$val; }
			if( $key == 'items' ) { $cab1_items=$val; }
			if( $key == 'samps' ) { $samps=$val; }
                        }
//		printf( "$j cab1=[$cab1] cab1_items=[$cab1_items] cab1_samps=[$cab1_samps] cab1_pngfil=[$cab1_pngfil]<br>\n" );
		$im_cmd = "convert $cabtop_pngfil ";
		$items=explode( " ", $cab1_items );
		foreach( $items as $item ) {
////		$item_pngfil="./imgs/cab/tn/tn_$item.png";
			$item_pngfil="./imgs/cab/$item.png";
			$im_cmd .= " $item_pngfil";
			if( file_exists( $item_pngfil )) {
//				printf( "MSG_2991:  FOUND cab1 item=[$item] item_pngfil=[$item_pngfil]<br>\n" );
				}
			else {
//				printf( "MSG_2992:  NOTFOUND cab1 item=[$item] item_pngfil=[$item_pngfil]<br>\n" );
				}
			}

		$cab1_pngfil=sprintf( "./ko_plans/imgs/%s_cab1_%s_%03d_%03d.png", $planid, $cab1, $step, $samps );
		$cab1_pngfiles .= " $cab1_pngfil";
		$cab1_tot_samps += $samps;
		$im_cmd .= " $cabbottom_pngfil -append $cab1_pngfil ";
		$im_cmd_status="";
		$status=exec($im_cmd,$im_cmd_status);	

		if( $items_flag == "true" ) {
			$cab1_output .= "<img class=\"ko_dragdrop\" src=$cab1_pngfil> $cab1_pngfil $samps<br>\n";
//			printf( "MSG_2481:  status=[$status] im_cmd=[$im_cmd] cab2_tot_samps=[$cab2_tot_samps]<hr>\n" );
			}
                }
        $pdo=null;
	$cab1beg_pngfile=sprintf( "./ko_plans/imgs/%s_cab1beg_%03d_%04d.png", $planid, $setp, $cab1_tot_samps );

//	floats to top
//	$im_cmd = "convert $cab1_pngfiles +append -gravity north $cab1beg_pngfile";
	$im_cmd = "convert $cab1_pngfiles +append -gravity north $cab1beg_pngfile";

	printf( "MSG_3022:  cab1_tot_samps=[$cab1_tot_samps] im_cmd=[$im_cmd] cab1beg_pngfil=[$cab1beg_pngfil]<hr>\n" );
	$status=exec($im_cmd,$im_cmd_status);	
	$cab1_output .= "MSG_2441:  <img src=$cab1beg_pngfile border=0 alt=$cab1beg_pngfile><hr>cab1beg_pngfile=[$cab1beg_pngfile] cab1_tot_samps=[$cab1_tot_samps]<br>\n";

//        $sql_cab="select distinct(cab) cab, group_concat( item, ' ' ) items, sum(amps) samps from ka1 where planid == 'plan1' group by cab";

       $sql_cab2="select distinct(cab2) cab2, group_concat( item, ' ' ) items, sum(amps) samps from ko_plans where planid == 'plan1' and cab == cab2 group by cab2";


	$cab2_output = "<hr><h1>cab2</h1><hr>\n";
        $pdo = newpdo( $dbfile );
        $j=0; $cab2_tot_samps=0; $cab2_pnglist="";
        foreach( $pdo->query( $sql_cab2) as $row ) {
                $j++;
                foreach( $row as $key=>$val ) {
                        if( is_numeric( $key )) { continue; }
                        if( $key == 'cab2' ) { $cab2=$val; }
                        if( $key == 'items' ) { $cab2_items=$val; }
                        if( $key == 'samps' ) { $samps=$val; }
                        }
 		printf( "MSG_3042:  $j cab2=[$cab2] cab2_items=[$cab2_items] cab2_samps=[$cab2_samps] cab2_pngfil=[$cab2_pngfil]<br>\n" );
                $im_cmd = "convert $cabtop_pngfil ";
                $items=explode( " ", $cab2_items );
                foreach( $items as $item ) {
///                     $item_pngfil="./imgs/cab/tn/tn_$item.png";
                        $item_pngfil="./imgs/cab/$item.png";
                        $im_cmd .= " $item_pngfil";
////                    if( file_exists( $item_pngfil )) {
////                            printf( "MSG_2422:  FOUND cab2 item=[$item] item_pngfil=[$item_pngfil]<br>\n" );
////                            }
////                    else {
////                            printf( "MSG_2422:  NOTFOUND cab2 item=[$item] item_pngfil=[$item_pngfil]<br>\n" );
////                            }
                        }
                $cab2_pngfil=sprintf( "./ko_plans/imgs/%s_cab2_%s_%03d_%03d.png", $planid, $cab2, $step, $samps );
                $cab2_pngfiles .= " $cab2_pngfil";
                $cab2_tot_samps += $samps;
///             printf( "bugs_1234 tot_samps=[$cab2_tot_samps] samps=[$samps]<br>\n" );
                $im_cmd .= " $cabbottom_pngfil -append $cab2_pngfil ";
                $im_cmd_status="";
                $status=exec($im_cmd,$im_cmd_status);

		if( $items_flag == 'true' ) {
	                $cab2_output .= "<img class=\"drg\" src=$cab2_pngfil> $cab2_pngfil $samps<br>\n";
///			printf( "MSG_2482:  status=[$status] im_cmd=[$im_cmd] cab2_tot_samps=[$cab2_tot_samps]<hr>\n" );
			}
		}
        $pdo=null;


	$cab2beg_pngfile=sprintf( "./ko_plans/imgs/%s_cab2beg_%03d_%04d.png", $planid, $step, $cab2_tot_samps );
	$im_cmd = "convert $cab2_pngfiles +append -gravity north $cab2beg_pngfile";
///	printf( "MSG_2432:  cab2_tot_samps=[$cab2_tot_samps] im_cmd=[$im_cmd] cab2beg_pngfil=[$cab2beg_pngfil]<hr>\n" );
	$status=exec($im_cmd,$im_cmd_status);	
	$cab2_output .= "<img class=\"drg\" src=$cab2beg_pngfile border=0 alt=$cab2beg_pngfile><hr>cab2beg_pngfile=[$cab2beg_pngfile] cab2_tot_samps=[$cab2_tot_samps]<br>\n";
	$cab2_output .= "<hr><h2>cab2</h2><hr>\n";

	$setup_output = "maxamp=[$maxamp] minamp=[$minamp]<hr>\n";

	$reports_major=reports_menu("major");
	$reports_minor=reports_menu("minor");

	$output .= $setup_output . cab1_output . $cab2_output;
//	$output = $setup_output . $reports_major . $zm5_output . $cab1_output . $cab2_output . $reports_output_minor;
	return( $output );
	}



function ko_plans1($options) {


	}


function ko_plans_save($options) {
	$http_host=$_SERVER['HTTP_HOST'];
	$php_self=$_SERVER['PHP_SELF'];

	$dbfile="ka1.db3";
	$planid="plan1";
	$cabtop_pngfil="./imgs/cab/cabtop.png";
	$cabbottom_pngfil="./imgs/cab/cabbottom.png";
	$cabtop_pngfil="./imgs/cab/tn/tn_cabtop.png";
	$cabbottom_pngfil="./imgs/cab/tn/tn_cabbottom.png";
	$cab_empty_pngfil="./imgs/cab/cab_empty.png";
	$output  = "<h2>ko_plans_2750:  dbfile=[$dbfile] planid=[$planid] cab=[$cab]</h2>\n";
	$output .= "<hr>\n";
	$items_flag="true";
	$width="35";
	$limit="5";

	$step=0;
	$steplim=5;
	$item_limit=5;

	$sql_maxamp = "select val maxamp from cfg where fld=='maxamp'";
	$maxamp = sqlq( $dbfile, $sql_maxamp, "maxamp" );
////	printf( "MSG_2011:  maxamp=[$maxamp] sql_maxamp=[$sql_maxamp] dbfile=[$dbfile]<br>\n" );
	
	$sql_minamp = "select val minamp from cfg where fld=='minamp'";
	$minamp = sqlq( $dbfile, $sql_minamp, "minamp" );
////	printf( "MSG_2012:  maxamp=[$maxamp] sql_minamp=[$sql_minamp] dbfile=[$dbfile]<br>\n" );

        $zm5_output ="";
        $zm5_output .= "<a href=https://$http_host/ka1/zm5/zm5.html alt=zoomify target=_blank>zm5</a><br>";

//	$setup_output = "MSG_2780:  maxamp=[$maxamp] minamp=[$minamp] dropzone=[$dropzone] <hr>\n";
//	$setup_ouput .= $dropzone;

	$output_widgets = "";
	$output_widgets .= "<div id=\"resizable\" class=\"ui-widget-congent\">\n";
	$output_widgets .= " <h3 class=\"ui-widget-header\">Resizable</h3>\n";
	$output_widgets .= " </div>\n";



	$output_test1 = "";
	$output_test1 .= "<img src=\"./imgs/cab/dd42.png\" class=\"img-float\">\n";
	$output_test1 .= "<img src=\"./imgs/cab/dd45.png\" class=\"img-float\">\n";
	$output_test1 .= "<img src=\"./imgs/cab/dd47.png\" class=\"img-float\">\n";




        $sql_items="select distinct(item) item, sn,cab,cab1,cab2,amps from ko_plans where planid == 'plan1' order by cast(amps as real) desc, cab limit $item_limit ";

	$output = "";
	$item_output = "";
	$item_output .= "<hr><h1>item</h1><hr>\n" . $testout ;
////	$item_output .= "MSG_2330: width=$width dbfile=[$dbfile] sql_items=[$sql_items]<br>\n";
        $pdo = newpdo( $dbfile );
        $j=0; $item_tot_samps=0; $item1_pnglist="";

        foreach( $pdo->query( $sql_items) as $row ) {
////		printf( "MSG_2828:  $j sql_items=[$sql_items] dbfile=[$dbfile]<br>\n" );
                $j++;
                foreach( $row as $key=>$val ) {
			if( is_numeric( $key )) { continue; } 
			if( $key == 'item' ) { $item=$val; }
			if( $key == 'cabs' ) { $cabs=$val; }
			if( $key == 'sn' ) { $sn=$val; }
			if( $key == 'hrctag' ) { $hrctag=$val; }
			if( $key == 'samps' ) { $samps=$val; }
			if( $key == 'amps' ) { $amps=$val; }
			}
////		printf( "MSG_2830:  $j $item $cabs $sn $samps<br>" );
		$item_pngfil="./imgs/cab/tn/tn_$item.png";
		$item_pngfil="./imgs/cab/$item.png";
		$im_cmd .= " $item_pngfil";
		if( file_exists( $item_pngfil )) {
			$item_url  = "<a href=https://$http_host/$php_self?q=item/$item>";
			$item_url .= "<img class=\"drg\" src=$item_pngfil border=0 width=$width alt=$sn>";
			$item_url .= "</a>";
			$item_divurl = "<div id=\"drag\" \n";
////			$item_divurl .= "<div class=\"drg\" id=\"drag\" >$item_url</div>\n";
			$item_divurl .= "<div class=\"drg\" id=\"$sn\" >$item_url</div>\n";
			$item_divurl .= "</div>";
			$item_output .= $item_divurl;
			$item_output .= "\n<br> sn=$sn hrctag=$hrctag item=$item amps=$amps samps=$samps\n";
////			printf( "MSG_2841:  FOUND item=[$item] item_pngfil=[$item_pngfil]<br>\n" );
			}
		else {
////			printf( "MSG_2842:  NOTFOUND item=[$item] item_pngfil=[$item_pngfil]<br>\n" );
			$item_null_url="<a https://$http_host/$php_self?q=item/$item>$item_empty_png</a>";
			$item_divurl  ="<div id=\"drag\" \n";
			$item_divurl .= "<div class=\"drg\" id=\"drag\" >$item_empty_url</div>";
			$item_divurl .= "</div>\n";
			$item_output .= $item_divurl;
			}
		}

////	printf( "MSG_2840:  $j sql_items=[$sql_items] dbfile=[$dbfile]<br>\n" );
	$dropzone = "";
//	$dropzone .= "<div id=\"drop\"><img src=\"$cab_empty_pngfil\" alt=$sn width=$width><span id=\"sw\">show</span></div>\n";
	$dropzone .= "<div id=\"drop\"><span id=\"sw\">show</span></div>\n";
	$dropzone .= "<div id=\"drop\"><span id=\"sw\">show</span></div>\n";


	$testout = "<div id=\"drop\">Drop here &nbsp; <span id=\"sw\">Show</span></div>\n";
	$testout .= "<div id=\"drop\"> cab_empty <img src=\"./imgs/cab/cab_empty.png>\n\"";

	$testout .= "<span id=\"sw\">Show</span></div>\n";

///	$testout .= "<div id=\"drag\"> Drag these images:<br/>\n";
//	$testout .= "<img src=\"./imgs/cab/visix_content_server.png\" alt=\"visix_content_server\\">\n";
///	$testout .= "<img src=\"./imgs/cab/hp_dl585_g2.png\" alt=\"hp_dl585\" />\n";
///	$testout .= "<div class=\"drg\">DIV with some content. Click and drag</div>";
///	$testout .= "</div>\n";


	$item_output .= $output_widgets;
	$item_output .= $dropzone;
	$item_output .= "<hr>MSG_2870<hr>\n";
	return( $item_output );


        $sql_cab1="select distinct(cab1) cab1, group_concat( item, ' ' ) items, sum(amps) samps from ko_plans where planid == 'plan1'  and cab == cab1 group by cab1";

	$output = "";
	$cab1_output .= "<hr><h1>cab1</h1><hr>\n";
        $pdo = newpdo( $dbfile );
        $j=0; $cab1_tot_samps=0; $cab1_pnglist="";
///	printf( "MSG_2860: $j sql_cab1=[$sql_cab1] cab1=[$cab1] cab1_items=[$cab1_items] cab1_samps=[$cab1_samps] cab1_pngfil=[$cab1_pngfil]<br>\n" );
        foreach( $pdo->query( $sql_cab1) as $row ) {
                $j++;
                foreach( $row as $key=>$val ) {
			if( is_numeric( $key )) { continue; } 
			if( $key == 'cab1' ) { $cab1=$val; }
			if( $key == 'items' ) { $cab1_items=$val; }
			if( $key == 'samps' ) { $samps=$val; }
                        }
//		printf( "$j cab1=[$cab1] cab1_items=[$cab1_items] cab1_samps=[$cab1_samps] cab1_pngfil=[$cab1_pngfil]<br>\n" );
		$im_cmd = "convert $cabtop_pngfil ";
		$items=explode( " ", $cab1_items );
		foreach( $items as $item ) {
////			$item_pngfil="./imgs/cab/tn/tn_$item.png";
			$item_pngfil="./imgs/cab/$item.png";
			$im_cmd .= " $item_pngfil";
			if( file_exists( $item_pngfil )) {
///				printf( "MSG_2876:  FOUND cab1 item=[$item] item_pngfil=[$item_pngfil]<br>\n" );
				}
			else {
////				printf( "MSG_2877:  NOTFOUND cab1 item=[$item] item_pngfil=[$item_pngfil]<br>\n" );
				}
			}

		$cab1_pngfil=sprintf( "./ko_plans/imgs/%s_cab1_%s_%03d_%03d.png", $planid, $cab1, $step, $samps );
		$cab1_pngfiles .= " $cab1_pngfil";
		$cab1_tot_samps += $samps;
		$im_cmd .= " $cabbottom_pngfil -append $cab1_pngfil ";
		$im_cmd_status="";
		$status=exec($im_cmd,$im_cmd_status);	

		if( $items_flag == "true" ) {
			$cab1_output .= "<img class=\"drg\" src=$cab1_pngfil> $cab1_pngfil $samps<br>\n";
//			printf( "MSG_2481:  status=[$status] im_cmd=[$im_cmd] cab2_tot_samps=[$cab2_tot_samps]<hr>\n" );
			}
                }
        $pdo=null;
	$cab1beg_pngfile=sprintf( "./ko_plans/imgs/%s_cab1beg_%03d_%04d.png", $planid, $setp, $cab1_tot_samps );

//	floats to top
//	$im_cmd = "convert $cab1_pngfiles +append -gravity north $cab1beg_pngfile";
	$im_cmd = "convert $cab1_pngfiles +append -gravity north $cab1beg_pngfile";

////	printf( "MSG_2432:  cab1_tot_samps=[$cab1_tot_samps] im_cmd=[$im_cmd] cab1beg_pngfil=[$cab1beg_pngfil]<hr>\n" );
	$status=exec($im_cmd,$im_cmd_status);	
	$cab1_output .= "MSG_2441:  <img src=$cab1beg_pngfile border=0 alt=$cab1beg_pngfile><hr>cab1beg_pngfile=[$cab1beg_pngfile] cab1_tot_samps=[$cab1_tot_samps]<br>\n";

//        $sql_cab="select distinct(cab) cab, group_concat( item, ' ' ) items, sum(amps) samps from ka1 where planid == 'plan1' group by cab";

       $sql_cab2="select distinct(cab2) cab2, group_concat( item, ' ' ) items, sum(amps) samps from ko_plans where planid == 'plan1' and cab == cab2 group by cab2";


	$cab2_output = "<hr><h1>cab2</h1><hr>\n";
        $pdo = newpdo( $dbfile );
        $j=0; $cab2_tot_samps=0; $cab2_pnglist="";
        foreach( $pdo->query( $sql_cab2) as $row ) {
                $j++;
                foreach( $row as $key=>$val ) {
                        if( is_numeric( $key )) { continue; }
                        if( $key == 'cab2' ) { $cab2=$val; }
                        if( $key == 'items' ) { $cab2_items=$val; }
                        if( $key == 'samps' ) { $samps=$val; }
                        }
/// 		printf( "MSG_2460:  $j cab2=[$cab2] cab2_items=[$cab2_items] cab2_samps=[$cab2_samps] cab2_pngfil=[$cab2_pngfil]<br>\n" );
                $im_cmd = "convert $cabtop_pngfil ";
                $items=explode( " ", $cab2_items );
                foreach( $items as $item ) {
///                     $item_pngfil="./imgs/cab/tn/tn_$item.png";
                        $item_pngfil="./imgs/cab/$item.png";
                        $im_cmd .= " $item_pngfil";
////                    if( file_exists( $item_pngfil )) {
////                            printf( "MSG_2422:  FOUND cab2 item=[$item] item_pngfil=[$item_pngfil]<br>\n" );
////                            }
////                    else {
////                            printf( "MSG_2422:  NOTFOUND cab2 item=[$item] item_pngfil=[$item_pngfil]<br>\n" );
////                            }
                        }
                $cab2_pngfil=sprintf( "./ko_plans/imgs/%s_cab2_%s_%03d_%03d.png", $planid, $cab2, $step, $samps );
                $cab2_pngfiles .= " $cab2_pngfil";
                $cab2_tot_samps += $samps;
///             printf( "bugs_1234 tot_samps=[$cab2_tot_samps] samps=[$samps]<br>\n" );
                $im_cmd .= " $cabbottom_pngfil -append $cab2_pngfil ";
                $im_cmd_status="";
                $status=exec($im_cmd,$im_cmd_status);

		if( $items_flag == 'true' ) {
	                $cab2_output .= "<img class=\"drg\" src=$cab2_pngfil> $cab2_pngfil $samps<br>\n";
///			printf( "MSG_2482:  status=[$status] im_cmd=[$im_cmd] cab2_tot_samps=[$cab2_tot_samps]<hr>\n" );
			}
		}
        $pdo=null;


	$cab2beg_pngfile=sprintf( "./ko_plans/imgs/%s_cab2beg_%03d_%04d.png", $planid, $step, $cab2_tot_samps );
	$im_cmd = "convert $cab2_pngfiles +append -gravity north $cab2beg_pngfile";
///	printf( "MSG_2432:  cab2_tot_samps=[$cab2_tot_samps] im_cmd=[$im_cmd] cab2beg_pngfil=[$cab2beg_pngfil]<hr>\n" );
	$status=exec($im_cmd,$im_cmd_status);	
	$cab2_output .= "<img class=\"drg\" src=$cab2beg_pngfile border=0 alt=$cab2beg_pngfile><hr>cab2beg_pngfile=[$cab2beg_pngfile] cab2_tot_samps=[$cab2_tot_samps]<br>\n";
	$cab2_output .= "<hr><h2>cab2</h2><hr>\n";

	$setup_output = "maxamp=[$maxamp] minamp=[$minamp]<hr>\n";
	$setup_output .= $dropzone;

	$reports_major=reports_menu("major");
	$reports_minor=reports_menu("minor");

	$output .= $setup_output . cab1_output . $cab2_output;
//	$output = $setup_output . $reports_major . $zm5_output . $cab1_output . $cab2_output . $reports_output_minor;
	return( $output );
	}

function reports_menu($code) {
	if( $code == 'main' ) {
	        $output  = "<h1>reports</h1>\n";
	        $output .= "<a href=https://$http_host/$php_self?q=reports/sql/defrag_fromcabs>defrag_fromcabs</a><br>";
	        $output .= "<a href=https://$http_host/$php_self?q=reports/sql/defrag_fromcabs_sum>defrag_fromcabs_sum</a><br>";
	        $output .= "<a href=https://$http_host/$php_self?q=reports/sql/defrag_tocabs>defrag_tocabs</a><br>";
	        $output .= "<a href=https://$http_host/$php_self?q=reports/sql/defrag_tocabs_sum>defrag_tocabs_sum</a><br>";
	        $output .= "<a href=https://$http_host/$php_self?q=reports/sql/defrag_plans>defrag_plans</a><br>";
	        $output .= "<a href=https://$http_host/$php_self?q=reports/sql/defrag_plans_sum>defrag_plans_sum</a><br>";
	        $output .= "<a href=https://$http_host/$php_self?q=reports/sql/defrag_plans_sumcab>defrag_plans_sumcab</a><br>";
	        $output .= "<a href=https://$http_host/$php_self?q=reports/sql/defrag_plans_items>defrag_plans_items</a><br>";
	        $output .= "<a href=https://$http_host/$php_self?q=reports/sql/defrag_plans_items_amps>defrag_plans_items_amps</a><br>";
	        $output .= "<a href=https://$http_host/$php_self?q=reports/sql/defrag_plans_items_cab>defrag_plans_items_cab</a><br>";
	        $output .= "<a href=https://$http_host/$php_self?q=reports/sql/defrag_plans_items_sum>defrag_plans_items_sum</a><br>";
	        $output .= "<a href=https://$http_host/$php_self?q=reports/sql/defrag_plans_items_sumamps>defrag_plans_items_sumamps</a><br>";
	        $output .= "<br>\n";
	        $output .= "<a href=https://$http_host/$php_self?q=reports/sql/sm>sm</a><br>";
		return( $output );
		}
	if( $code == 'minor' ) {
	        $output .= "<a href=https://$http_host/$php_self?q=reports/sql/sm>sm</a><br>";
	        $output .= "<a href=https://$http_host/$php_self?q=reports/sql/sm1>sm1</a><br>";
	        $output .= "<a href=https://$http_host/$php_self?q=reports/sql/sm2>sm2</a><br>";
	        $output .= "<a href=https://$http_host/$php_self?q=reports/sql/sm3>sm3</a><br>";
	        $output .= "<a href=https://$http_host/$php_self?q=reports/sql/sm4>sm4</a><br>";
	        $output .= "<a href=https://$http_host/$php_self?q=reports/sql/sm5>sm5</a><br>";
	        $output .= "<br>\n";
	
	        $output .= "<a href=https://$http_host/$php_self?q=reports/sql/jk>jk</a><br>";
	        $output .= "<a href=https://$http_host/$php_self?q=reports/sql/jk1>jk1</a><br>";
	        $output .= "<a href=https://$http_host/$php_self?q=reports/sql/jk2>jk2</a><br>";
	        $output .= "<a href=https://$http_host/$php_self?q=reports/sql/jk3>jk3</a><br>";
	        $output .= "<a href=https://$http_host/$php_self?q=reports/sql/jk4>jk4</a><br>";
	        $reports_output_minor .= "<a href=https://$http_host/$php_self?q=reports/sql/jk5>jk5</a><br>";
		return($output );
		}
	return( "" );
	}
	


function ko_dcall($options) {
	$output  = "<h2>ka1</h2>\n";
	$output .= "<hr>\n";

	return( $output );
	}




function ko_leds($options) {
	$output  = "<h2>ka1</h2>\n";
	$output .= "<hr>\n";

	return( $output );
	}




function ko_pchart_pie($options) {
	$output  = "<h2>ko_pchart_pie</h2>\n";
	$output .= "<hr>\n";

include("../pcharts/class/pData.class.php");
include("../pcharts/class/pDraw.class.php");
include("../pcharts/class/pPie.class.php");
include("../pcharts/class/pImage.class.php");

	$q=$_REQUEST['q'];
	$options=split( "/", $_REQUEST['q'] );
	$option0=$options[0];
	$option1=$options[1];
	$option2=$options[2];
	$option3=$options[3];
	$option4=$options[4];

	$size="10";
	$used="5";

	$rptcode=$option3;

	$progid="ka1";
	$dttm=date('Ymd_His');
	$series_code="df_size";	
	$series_desc="dv_size";
	$labels_list=array();
	$labels_list[0]="used";
	$labels_list[1]="free";
	$labels_list[3]="other";
	$series_values=array();
	$series_values[0]="25";
	$series_values[1]="50";
	$series_values[2]="25";


//	printf( "<hr>\n" );
//	$last_line=passthru( 'df|grep var', $retval );
//	$last_line=system( 'df|grep var', $retval );
//	$path="/tmp";
//	if( $option1 == "" ) { $option1=$path; };
//	$path=$option1;
//	$syscmd="df|grep '/var' 2>&1";
//	$syscmd="df|grep '/tmp'";
//	$syscmd="df|grep '/home' 2>&1";
//	$syscmd="df|grep '/var'";
//	$syscmd="df | grep '/var'";
//	$syscmd="df | grep '/tmp'";
//	$syscmd="df | grep ' $option1'";
//	$last_line=passthru( $syscmd, $retval ); 
//	$last_line=system( "df|grep var", $retval );
//	$last_line_system=system( $syscmd, $retval );
///	$last_line_passthru=passthru( $syscmd, $retval );
//	$last_line_exec=exec( $syscmd, $retval );

////	exec( $syscmd, $syslines, $retval );
////	$sysline=$syslines[0];
//	$args=split( " ", $sysline );
//	print_r( $args );
//	$explode_text=explode($sysline);
//	$args=preg_split('/ +/', $sysline );
//	$total=$args[1];
//	$used=$args[2];
//	$avail=$args[3];
//	$perc=$args[4];
//	$path=$args[5];
//
//	$host=$option1;
//	$path=$option2;
//	$used=$option3;
//	$free=$option4;

	$series_values[0]=$used;
	$series_values[1]=$free;
	$chart_title="$dttm $host /$path used=$used free=$free";

	$dbfile="ka1.db3";
	$pngfil="../imgs/pchart/ko_pchart_pie.png";

	$sql="select distinct(cab1) from ka1 where planid == 'plan1' limit 5";
	$pdo = newpdo( $dbfile );
	$j=0;
	foreach( $pdo->query( $sql) as $row ) {
		$j++;
		foreach( $row as $key=>$val ) {
			$series_values[$j]=$j;
			$labels_list[$j]=$val;
//			print( "$j row=[$row] key=[$key] val=[$val] labels_list=[$labels_list[$j]] [$series_values[$j]]<br>\n" );
			}
		}
	$pdo=null;



//	$jlim=$j;
//	printf( "MSG_2490: pchart_pie pngfil=[$pngfil] chart_title=[$chart_title]<hr>\n" );
//	printf( "MSG_2490: pchart_pie jlim=[$jlim] labels_list[$j] series_values=[$series_values]<hr>\n" );
//	for( $j=0; $j<$jlim; $j++ ) {
//		printf( "MSG_2491: pchart_pie j=[$j] series_values=[$series_values[$j]]<hr>\n" );
//		printf( "MSG_2492: pchart_pie j=[$j] labels_list=[$labels_list[$j]] [$series_values[$j]]<hr>\n" );
//		}
//	return;

//	$j=0;
//	$testlines=split( '\n', $syslines );
//	printf( "testcount=[$testcount]<br>\n" );
//	foreach( $testlines as $sysline ) {
//		$j++;
//		printf( "$j sysline=[$sysline]<br>\n" );
//		}
//	
//	print_r( $syslines );

/* Create and populate the pData object */
	$MyData = new pData();   

//	$MyData->addPoints(array(50,2,3,4,7,10,25,48,41,10,100,200,500),"ScoreA");  
//	$MyData->addPoints(array(0,2,3,4,7,10),"ko_ScoreA");  
//	$MyData->setSerieDescription("ko_ScoreA","ko_Application A");
//	$MyData->addPoints(array(0,2,3,4,7,10),"$series_code");  
//	$MyData->addPoints(array(0,2,3,4,7,10),"$series_code");  
	$MyData->addPoints($series_values,"$series_code");  
 	$MyData->setSerieDescription("$series_code","$series_desc");

	
/* Define the absissa serie */
//	$MyData->addPoints(array("A0","B1","C2","D3","E4","K5","J9"),"Labels");
//	$labels_list=array("total", "used", "other" );



//	printf( "BUGS_1234 labels_list=[$labels_list]<hr>\n" );
//	print_r( $labels_list );	
//	return;
	$MyData->addPoints($labels_list,"Labels");
///	$MyData->addPoints(array( "ab01", "ab02", "ab03", "ab04", "ab05"),"Labels");
	$MyData->setAbscissa("Labels");

/* Create the pChart object */
	$myPicture = new pImage(300,260,$MyData);

/* Draw a solid background */
	$Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
	$myPicture->drawFilledRectangle(0,0,300,300,$Settings);

/* Overlay with a gradient */
	$Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
	$myPicture->drawGradientArea(0,0,300,260,DIRECTION_VERTICAL,$Settings);
	$myPicture->drawGradientArea(0,0,300,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>100));

/* Add a border to the picture */
	$myPicture->drawRectangle(0,0,299,259,array("R"=>0,"G"=>0,"B"=>0));

/* Write the picture title */ 
	$myPicture->setFontProperties(array("FontName"=>"../pChart/fonts/Silkscreen.ttf","FontSize"=>6));
	$myPicture->drawText(10,13,$chart_title,array("R"=>255,"G"=>255,"B"=>255));

/* Set the default font properties */ 
	$myPicture->setFontProperties(array("FontName"=>"../pChart/fonts/Forgotte.ttf","FontSize"=>10,"R"=>80,"G"=>80,"B"=>80));

/* Create the pPie object */ 
	$PieChart = new pPie($myPicture,$MyData);

/* Draw an AA pie chart */ 
	$PieChart->draw3DPie(160,140,array("Radius"=>70,"DrawLabels"=>TRUE,"LabelStacked"=>TRUE,"Border"=>TRUE));

/* Write the legend box */ 
	$myPicture->setShadow(FALSE);
	$PieChart->drawPieLegend(15,40,array("Alpha"=>20));

/* Render the picture (choose the best way) */

//	$myPicture->autoOutput("$pngfil");
	$myPicture->autoOutput($pngfil);

	return( $output );
	}




function csv2db3( $csvfil, $delimiter ) {
//         if( preg_match( "/index/i", $filename )) { continue; }
	$html  = "";
	$html .= "<hr>\n";
	$html .= "csvfil=[$csvfil] [$delimiter]<br>\n";
	$html .= "<hr>\n";

	$db3hdr="";
	$db3dta="";
	$row = 1;
//	$delimiter=",";
//	if (($handle = fopen("commplat_test_20120927.csv", "r")) !== FALSE) {
	if (($handle = fopen($csvfil, "r")) !== FALSE) {
		while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
			$num = count($data);
			echo "<p> $num fields in line $row: <br /></p>\n";
			for ($c=0; $c < $num; $c++) {
				$fld = $data[$c];
				$fld = strtolower($fld);
				$tmp=$fld;
				$fld = str_replace( ",",";", $tmp );
				$tmp=$fld;
				$fld = str_replace( "|",":", $tmp );
				$tmp=$fld;
				$fld = str_replace( "\"", "", $tmp );

//				echo $data[$c] . "<br />\n";
				echo $data[$c] . "$delimiter";

				if( $row == 1 ) {
					$tmp=$fld;
					$fld = str_replace( " ", "_", $tmp );
					$db3hdr .= $fld . "$delimiter";
					}
				else {
					$db3dta .= $fld . "$delimiter";
					}

				}

			if( $row == 1 ) {
				$db3hdr .= "\n";
				}
			else {
				$db3dta .= "\n";
				}
			if( $row == 1 ) {
				echo "db3hdr=[".$db3hdr."]<br>\n";
				}
			else {
				echo "db3dta=[".$db3dta."]<br>\n";
				}
//			echo "  db3hdr =[" . $db3hdr . "] &nbsp db3dta=[" . $db3dta . "]<br />\n";

			$row++;
			}
		fclose($handle);
		}

	return( $html);
	}

function leds_reports_sql( $options ) {
	$option0=$options[0];
	$option1=$options[1];
	$option2=$options[2];
	$option3=$options[3];
        $dbfile=$GLOBALS['dbfile'];

        if( ! file_exists( $dbfile )) {
                print( "leds_reports_sql ERR_2370:  NOTFOUND sql=[$sql] dbfile=[$dbfile] csvfil=[$csvfil]<hr>\n" );
                return;
                }

//	print( "leds_reports_sql MSG_2380: o0=[$option0] [$option1] o2=[$option2]  FOUND sql=[$sql] dbfile=[$dbfile] csvfil=[$csvfil]<hr>\n" );

///	phpinfo();
///	exit;

	if( isset( $_POST['post_options'] )) {
		$post_option=$_POST['post_option'];
		$rptnum=$_POST['rptnum'];
		$rptcode=$_POST['rptcode'];
		$rptdesc=$_POST['rptdesc'];
		$rptsql=$_POST['rptsql'];
		$rpt_dbfile=$_POST['rpt_dbfile'];
		$sqlfile=$_POST['sqlfile'];
		$sqltext=$_POST['sqltext'];
		$status=$_POST['status'];
		$dttm=date("Ymd_His");
		$savefile = str_replace( ".sql", "_$dttm.sql", $sqlfile );

		$sqladd="";
		if( file_exists( $sqlfile )) {
			copy( $sqlfile, $savefile );
			}
		else {
			$sqladd = "insert or replace into rpts (";
			$sqladd .= "rptnum, rptcode, rptdesc, rptsql, ";
			$sqladd .= "dbfile, sqlfile, outfile, status ";
			$sqladd .= ") ";
			$sqladd .= " values ( ";
			$sqladd .= "\"$rptnum\", \"$rptcode\", \"$rptdesc\", \"$rptsql\", ";
			$sqladd .= "\"$dbfile\", \"$sqlfile\", \"$outfile\", \"$status\" ); ";
//			print( "<hr>sqladd=[$sqladd]<br />\n" );
			printf( "BUGS_1234:  sqladd=[$sqladd]<br>\n" );

			$pdo = newpdo($GLOBALS['dbfile']);
//			$pdo->exec($sqlupd);
			$pdo->exec($sqladd);
			$pdo->null;
			$option2=$rptcode;
			}

		$fh = fopen( $sqlfile, 'w'); 
		if( $fh != "" ) {	
			$status = fwrite( $fh, $sqltext ); 
			}
		fclose($fh);
///		$sql_insert="update table rpts 
///		printf( "BUGS_2409: status=[$status]  sqlfile=[$sqlfile] sqltext=[$sqltext] [$sqladd]<br>\n" );
//		exit;
		}

	$rptcode=$option2;
	$tblname="rpts";
        $pdo = newpdo($dbfile);
        $sql = "select * from $tblname where rptcode == '$rptcode'";
        $result = $pdo->query($sql);
        $collim = $result->columnCount();
        $countrows = 1;
        $output = "";



	foreach( $pdo->query($sql) as $row ) {
		$rptnum=$row['rptnum'];
		$rptcode=$row['rptcode'];
		$rptdesc=$row['rptdesc'];
		$rptsql=$row['rptsql'];
		$rpt_dbfile=$row['dbfile'];
		$sqlfile=$row['sqlfile'];
		$outfile=$row['outfile'];
		$status=$row['status'];

////		printf( "$progid $rptnum][$rptcode][$rptdesc][$rptsql][$dbfile][$sqlfile][$outfile][$status]<br>\n" );
		}

//	print( "MSG_2405:  rptcode=[$rptcode] [$sqlfile]<br>\n" );
	$sqltext="";
	if( file_exists( $sqlfile )) {
////		print( "MSG_2406:  rptcode=[$rptcode] FOUND sqlfile=[$sqlfile]<br>\n" );
		$fp = fopen( $sqlfile, 'r' );
		while( $bigline = fread($fp, 1024)) { 
			$lines = explode("\n", $bigline );
			for( $j=0; $j < count($lines); $j++ ) {
				$line=$lines[$j];
				$sqltext .= $line . "\n";
				$sqlhtml .= $line . "<br>\n";
//				printf( "$progid $dttm MSG:_2420:  $j line=[$line] [$remote_addr]<br>\n" );
//				if( preg_match( "/$remote_addr/", $line, $matches)) {
//					$allowflag="true";
//					$GLOBALS['allowflag']=$line;
//					break;
//					}
				}
//			printf( "$progid $dttm MSG_2640: sqltext=[$sqltext]  line=[$line]<br>\n" );
			}
//	printf( "BUGS_2650:  sqltext=[$sqltext]<br>\n" );

	$html_sqltext  = "";
	$html_sqltext .= "<hr>";


//	$html_sqltext .= "<pre>\n";
//	printf( "BUGS_2420: [$contents] [$html_sqltext]<hr>\n" );
////	for( $j=0; $j < count($lines); $j++ ) {
////		$sqltext .= $lines[$j] . "\n";
////		$html_sqltext .= $lines[$j] . "<br>\n";
//		printf( "$j $html_sqltext<br>\n" );
////		}
//	$html_sqltext .= "</pre>\n";
	
	$html_anchor_top = "<a name='top'> --- top --- </a>\n";
	$html_anchor_bottom = "<a name='bottom'> --- bottom --- </a>\n";

	$html_go2top_link = "<a href=\"#top\"><img src=\"./imgs/btn/go2top.png\" border=0 width=25 alt=\"go2top\"></a>\n";
	$html_go2bottom_link = "<a href=\"#bottom\"><img src=\"./imgs/btn/go2bottom.png\" border=0 width=25 alt=\"go2bottom\"></a>\n";
///	$html .= $html_go2top_link;

////	$html_updform = sql_updform($rptcode, $sqlfile, $sqltext );
///	printf( "BUGS_2459:  sqltext=[$sqltext]<br>\n" );

///	printf( "BUGS_2460:  [$rptnum][$rptcode][$rptdesc][$rptsql][$dbfile][$sqlfile][$outfile][$status]\n" );
	$html_updform = sql_updform($rptnum, $rptcode, $rptdesc, $rptsql, $rpt_dbfile, $sqlfile, $outfile,  $status, $sqltext );

	$html .= $html_anchor_top;
	$html .= $html_go2bottom_link;

	$report_options[0]="reports";
	$report_options[1]="rpt";
	$report_options[2]="$rptcode";
	$html_report = leds_reports_rpt( $report_options );

	$html .= $html_report;
	$html .= "<hr>\n";

	$html .= $html_sqltext;
	$html .= $html_updform;
	$html .= $html_anchor_bottom;
//	$html .= $html_totop_link;

////	print( $html );

	}
	return($html);

        $dttm=date("Ymd_His");
//      $csvfile = "$url_dbcode"."_$url_table"."_$dttm.csv";
	}


function leds_reports_csv(  $dbfile, $sql, $csvfil ) {
        $dbfile=$GLOBALS['dbfile'];

        if( ! file_exists( $dbfile )) {
                print( "leds_reports_csv ERR_3340:  NOTFOUND sql=[$sql] dbfile=[$dbfile] csvfil=[$csvfil]<hr>\n" );
                return;
                }

        $pdo = newpdo($dbfile);
//        $sql = "select * from $url_table";
        $result = $pdo->query($sql);
        $collim = $result->columnCount();
        $countrows = 1;
        $output = "";
        while($row = $result->fetch(PDO::FETCH_ASSOC)) {
                if($countrows == 1) {
                        $csvhdr=join(",",array_keys($row)) . "\n";
//                      $output .= join(",", array_keys($row)) . "\n";
                        $output .= join(",", $row) ."\n";
                        }
                else {
                        $output .= join(",", $row) ."\n";
                        }
                $countrows++;
                }
        $pdo=null;
//      print( "BUGS tblname=$tblname cols=$cols<br>\n" );


        $dttm=date("Ymd_His");
//      $csvfile = "$url_dbcode"."_$url_table"."_$dttm.csv";


//      print( "__FUNCTION__=".__FUNCTION__."<br>\n" );
//      $content_type = "Content-type: application/csv Content-Disposition:  \"inline; filename=$csvfile\"";
//      print( "$content_type\n" );
//      header( "$content_type" );



        $dbfile=$dbfiles[$url_dbcode][dbfile];
        if( ! file_exists( $dbfile )) {
                print( "pdo_unload ERR:  NOTFOUND url_dbcode=[$url_dbcode] dbfile=[$dbfile]<hr>\n" );
                return;
                }
        $pdo = newpdo($dbfile);
        $sql = "select * from $url_table";
        $result = $pdo->query($sql);
        $collim = $result->columnCount();
        $countrows = 1;
        $output = "";
        while($row = $result->fetch(PDO::FETCH_ASSOC)) {
                if($countrows == 1) {
                        $csvhdr=join(",",array_keys($row)) . "\n";
//                      $output .= join(",", array_keys($row)) . "\n";
                        $output .= join(",", $row) ."\n";
                        }
                else {
                        $output .= join(",", $row) ."\n";
                        }
                $countrows++;
                }
        $pdo=null;
//      print( "$output" );
//      print( "BUGS tblname=$tblname cols=$cols<br>\n" );


        $dttm=date("Ymd_His");
        $csvfile = "$url_dbcode"."_$url_table"."_$dttm.csv";


//      print( "__FUNCTION__=".__FUNCTION__."<br>\n" );
//      $content_type = "Content-type: application/csv Content-Disposition:  \"inline; filename=$csvfile\"";
//      print( "$content_type\n" );
//      header( "$content_type" );


	header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
//	header("Content-Length: " . strlen($out));
	header("Content-type: text/x-csv");
//	header("Content-type: text/csv");
//	header("Content-type: application/vnd.ms-excel");
//	header("Content-type: application/csv");
	header("Content-Disposition: attachment; filename=$csvfile");

	print( "$output" );
	return;

	}

function leds_reports_rpt( $options ) {
//      printf( "BUGS_9900 $options[1] $options[2]<hr>\n" );
        $dbfile=$GLOBALS['dbfile'];
	$progid=$GLOBALS['progid'];
        $php_self=$_SERVER['PHP_SELF'];
        $pdo = newpdo($dbfile);
//	$dbfile="s:/xampp/htdocs/ka1/ka1.db3";
//	$dbfile="/var/www/html/ka1/ka1.db3";
        $tblname="rpts";

        $option0=$options[0];
        $option1=$options[1];
        $option2=$options[2];
        $option3=$options[3];
        if( isset( $_GET['fmt'] )) { $fmt=$_GET['fmt']; } else { $fmt=""; }
	$output = "<h2>$php_self leds_reports_rpt MSG_3540: fmt=[$fmt]  $dbfile $option1 $option2 $option3</h2>\n";

//	printf( "BUGS_dbfile=[$dbfile] $option1 $option2 $option0<br>\n" );
        if( $option2 == "" ) {
                $output .= "<hr>\n";
//              $output .= "<h3>$progid $dttm MSG_3350: rpts dbfile=[$dbfile] tblname=[$tblname][$rpt]</h3>\n";
                $output .= "<table border=1>\n";
                $output .= "<tr>\n";
                $output .= "<td>rptnum</td>\n";
                $output .= "<td>status</td>\n";
                $output .= "<td>rpturl</td>\n";
                $output .= "<td>csvurl</td>\n";
                $output .= "<td>rptdesc</td>\n";
                $output .= "<td>sqlfile</td>\n";
                $output .= "<td>rptsql</td>\n";
                $output .= "<td>dbfile</td>\n";
                $output .= "<td>outfile</td>\n";
                $output .= "</tr>\n";
                $sql = "select * from $tblname";
                foreach( $pdo->query($sql) as $row ) {


                        $rptnum=$row['rptnum'];
                        $rptcode=$row['rptcode'];

                        $rpturl="<a href=$php_self?q=reports/rpt/$rptcode>$rptcode</a>\n";

//			$csvimg="<img src=images/btn/export.png height=40 border=0 target=_blank>";
			$csvimg="<img src=images/btn/export.png height=20 border=0 target=_blank>";
			$csvurl  = "<a href=$php_self?q=reports/rpt/$rptcode&fmt=header_csv>";
			$csvurl .= "$csvimg</a>\n";

                        $rptdesc=$row['rptdesc'];
                        $rptsql=$row['rptsql'];
                        $dbfile=$row['dbfile'];
                        $sqlfile=$row['sqlfile'];
                        $outfile=$row['outfile'];
                        $status=$row['status'];
                        $output .= "<tr>\n";
                        $output .= "<td>$rptnum</td>\n";
                        $output .= "<td>$status</td>\n";
			$output .= "<td>$rpturl</td>\n";
                        $output .= "<td>$csvurl</td>\n";
                        $output .= "<td>$rptdesc</td>\n";
                        if( file_exists( $sqlfile )) {
				$sqlurl="<a href=$php_self?q=reports/sql/$rptcode>$rptcode sqlfile</a>\n";
				$output .= "<td>$sqlurl</td>\n";
                                }
                        else {
                                $output .= "<td>$sqlfile notfound</td>\n";
//				printf( "BUGS_9962 NOTFOUnD sqlfile=[$sqlfile] <br>\n" );
                                }
                        $output .= "<td>$rptsql</td>\n";
                        $output .= "<td>$dbfile</td>\n";
                        $output .= "<td>$outfile</td>\n";
                        $output .= "</tr>\n";
                        }
                $output .= "</table>\n";
                $output .= "<hr>\n";
                $pdo = null;
                return( $output );
                }


        if( $option2 != "" ) {
                $rptcode=$option2;
                $sql = "select * from $tblname where rptcode='$rptcode'";

                $output .= "<html><head><title>leds_dc_rpts detail rptcode=$rptcode o1=$option1 o2=$option2 </title></head>\n";
                $output .= "<body bgcolor=lightblue>\n";
                $output .= "<h2>leds_reports detail $rptcode </h2>\n";
//              $output .= "<hr>sql=[$sql]<hr>\n";
                $output .= "<div id=\"rpts\">\n";
//              $output .= "<hr>\n";

                $output .= "<table>\n";
                $output .= "<tr>\n";
                $output .= "<td>rptnum</td>\n";
                $output .= "<td>status</td>\n";
                $output .= "<td>rptcode</td>\n";
                $output .= "<td>rptdesc</td>\n";
                $output .= "<td>sqlfile</td>\n";
                $output .= "<td>rptsql</td>\n";
                $output .= "<td>dbfile</td>\n";
                $output .= "<td>outfile</td>\n";
                $output .= "</tr>\n";

///		$output .= "<hr>BUGS_2540: sqlfile=[$sqlfile] rptcode=[$rptcode] sql=[$sql] $dbfile=[$dbfile] tblname=[$tblname] $option0 o1=$option1 o2=$option2<hr>\n";
                foreach( $pdo->query($sql) as $row ) {
                        $rptnum=$row['rptnum'];
                        $status=$row['status'];
                        $rptcode=$row['rptcode'];
                        $rptdesc=$row['rptdesc'];
                        $sqlfile=$row['sqlfile'];
                        $rptsql=$row['rptsql'];
                        $dbfile=$row['dbfile'];
                        $outfile=$row['outfile'];
///			$output .= "<hr>BUGS_2550: sqlfile=[$sqlfile] rptcode=[$rptcode] sql=[$sql] $dbfile=[$dbfile] tblname=[$tblname] $option0 o1=$option1 o2=$option2<hr>\n";
                        $output .= "<tr>";
                        $output .= "<td>$rptnum</td>";
                        $output .= "<td>$status</td>";
                        $output .= "<td>$rptcode</td>";
                        $output .= "<td>$rptdesc</td>";
                        $output .= "<td>$sqlfile</td>";
                        $output .= "<td>$rptsql</td>";
                        $output .= "<td>$dbfile</td>";
                        $output .= "<td>$outfile</td>";
                        $output .= "</tr>\n";
                        }
                $output .= "</table>\n";

                $pdo=null;
//                $dbfile=$GLOBALS['dbfile'];
///		$output .= "<hr>BUGS_2560: sqlfile=[$sqlfile] rptcode=[$rptcode] sql=[$sql] $dbfile=[$dbfile] tblname=[$tblname] $option0 o1=$option1 o2=$option2<hr>\n";
                if( $sqlfile != '' ) {
                        if( file_exists( $sqlfile )) {
//                                printf( "$progid $dttm MSG_10010:  FOUND sqlfile=[$sqlfile]<br>\n" );
//                              return;
//                              $path_sqlfile="/var/www/html/ka1/$sqlfile";
//                                printf( "BUG_10028 :  sqlfile=[$sqlfile] path_sqlfile=[$path_sqlfile]<br>\n" );
                                $rptsql="";
//                                printf( "BUG_10029 : GOOD sqlfile=[$sqlfile] path_sqlfile=[$path_sqlfile]<br>\n" );
                                $fh = fopen( $sqlfile, 'r' );
////                            $contents = fread( $fh, filesize($filename));
                                if( $fh ) {
                                        $icnt=0;
                                        while (( $irec = fgets( $fh, 4096)) !== false) {
                                                $icnt++;
                                                $rptsql .= $irec;
						if( $option2 == '' ) {
							print( "$progid $dttm MSG_3560:  $icnt $irec<br>\n" );

							}
                                                }
///                                     if(!feof($fh)){
///                                             print( "<hr>$progid ERR_140:  reading $sqlfile<hr>\n" );
///                                             }
                                        }
                                fclose($fh);
                                }

                        }

//                              $fp = fopen( $sqlfile, "r" )
//                              || die  "$progid $dttm ERR_10010; fopen sqlfile=[$sqlfile]<br>\n";
///                             while(( $filetext = fgets($fp)) !== false ) {
///                                     $rptsql .= $filetext;
///                                     printf( "$progid $dttm MSG_10030:  filetext=[$filetext]<br>\n" );
///                                     $rownum++;
///                                     }
//                              fclose($fp);
////                            }
///                     else {
///                             printf( "$progid $dttm MSG_10037:  NOTFOUND sqlfile=[$sqlfile]<br>\n" );
///                             }
///                     }
///     		printf( "$progid $dttm MSG_10042:  <pre>rptsql=[$rptsql]</pre><hr>\n" );
///     		return;

// display headers
                $dbfile=$GLOBALS['dbfile'];

                try {
                        $pdo = newpdo($dbfile);
                        $stmt = $pdo->query($rptsql);
                        $result = $stmt->fetch(PDO::FETCH_ASSOC);
                        $output .= "<table border=1>\n";
                        $output .= "<tr>\n";
			if(! empty( $result )) {
	                       	foreach( $result as $key=>$val) {
                               		$output .= "<td>$key</td>\n";
					}
                                }
                        $output .= "</tr>\n";
                        $pdo = null;
                        }
                catch(PDOException $e) { $output .= $e->getMessage(); }

// display details
                try {
			$fmt="header";
			if( isset( $_GET['fmt'] )) { $fmt = $_GET['fmt']; }
                        $pdo = newpdo($dbfile);
                        $j=0;

			$firsttime=1;
			$htmhdr = "";
			$htmdtl = "";
			$htmout = "";
			$csvhdr = "";
			$csvdtl = "";
			$csvout = "";

        		$dttm=date("Ymd_His");
			$rowcnt = 0;
			$csvfil=sprintf( "%s_%s_%s.csv", $progid, $rptcode, $dttm );
//			printf( "$progid $dttm MSG_2655: csvfil=[$csvfil] rptsql=[$rptsql] fmt=[$fmt] rowcnt=[$rowcnt]<br>\n" );
//			$output .= "$progid $dttm MSG_2655: rptsql=[$rptsql] fmt=[$fmt] rowcnt=[$rowcnt]<br>\n";
                        $output .= "<tr>\n";


// orig                 foreach( $pdo->query($rptsql) as $row ) {
                        foreach( $pdo->query($rptsql) as $rowkey ) {
				$rowcnt++;

// get field names
				if( $firsttime == 1 ) {
					$htmhdr = "<tr>";
					$csvhdr = "";
					}
				$htmdtl .= "<tr>\n";

				$colcnt = 0;
				$csvrow = "";
                                foreach( $rowkey as $key=>$val ) {

// skip numeric columns
					if( is_numeric( $key )) { continue; }
					$colcnt++;
					
                                        $val=$rowkey[$key];

                                      $output .= "<td>$j key=$key val=$val</td>";


//                                      $output .= "<td>$val</td>\n";

					if( $firsttime == 1 ) {
						$htmhdr .= "<td>$key</td>\n";
						$csvhdr .= "$key,";
//						printf( "BUGS_3670_1 $firsttime  [$rowcnt][$colcnt]:  csvdtl=[$csvdtl] val=[$val] key=[$key] rowkey=[$rowkey]<br>\n" );
						}
					else {

// check if fieldname contains _png for image output

						$pngimg=key2png( $key, $val );
						if( $pngimg == "" ) {
							$htmdtl .= "<td>$val</td>";
							}
						else {
							$htmdtl .= "<td>$pngimg</td>";
							}							
						$csvrow .= "$val,";
						$csvdtl .= "$val,";
//						printf( "BUGS_3670_2 $firsttime  [$rowcnt][$colcnt]:  csvrow=[$csvrow] csvdtl=[$csvdtl]<br>\n" );
						}


//					printf( "BUGS_3671 [$rowcnt][$colcnt]: csvrow=[$csvrow]  csvdtl=[$csvdtl] val=[$val] key=[$key] rowkey=[$rowkey]<br>\n" );
                                        }
		
//				printf( "BUGS_3685 [$rowcnt][$colcnt]: csvrow=[$csvrow]  csvdtl=[$csvdtl] val=[$val] key=[$key] rowkey=[$rowkey]<br>\n" );

				if( $firsttime == 1 ) {
					$htmhdr .= "</tr>\n";
					$csvhdr .= "\n";
					$firsttime=0;

					}
				$htmdtl .= "</tr>\n";
				$csvdtl .= "\n";
                                $output .= "\n";
                                }



//                        $htmout .= "</table>\n";
//                        $output .= "</table>\n";
//                        $csvout .= "\n";
                        $pdo=null;
                        }
                catch(PDOException $e) { $output .= $e->getMessage(); }




//		printf( "$prog $dttm MSG_2730: csvhdr=[$csvhdr]  fmt=[$fmt]<br>\n" );
//		printf( "$prog $dttm MSG_2730: csvdtl=[$csvdtl]  fmt=[$fmt] csvfile=[$csvfil]<br>\n" );
//		return;


		$hdr_mask = "noheader";
//		if( preg_match( "/$hdr_mask/", $fmt )) {
		$matches="";
		if( preg_match( "/noheader/", $fmt, $matches )) {
///			printf( "NOHEADERS_3580 [$fmt][csv][$csvfil]<hr>\n" );
			$csvout = "";
			$csvout .= $csvdtl;
			$htmout .= "<table>\n";
			$htmout .= "$htmdtl\n";
			$htmout .= "</table>\n";
			}
		else {
///			printf( "HEADERS_3580 [$fmt][csv][$csvfil]<hr>\n" );
			$csvout = "";
			$csvout .= "$progid,$dttm,$csvfil\n";
			$csvout .= $csvhdr;
			$csvout .= $csvdtl;

			$htmout .= "<table>\n";
			$htmout .= $htmhdr;
			$htmout .= $htmdtl;
			$htmout .= "</table>\n";
			}

		if( preg_match( "/csv/", $fmt, $matches )) {
//			printf( "$progid $dttm MSG_3690: dbfile=$dbfile sql=$sql csvfil=[$csvfil]<hr>\n" );
//			leds_reports_csv( $dbfile, $sql, $csvfil );
//			return;

			$dttm=date("Ymd_His");
			$progid=$GLOBALS['progid'];
			$version=$GLOBALS['version'];
			$csvfil = sprintf( "%s_%s_%s.csv", $progid,  $rptcode, $dttm );
		
//			printf( "BUGS_2770:  csvfil=[$csvfil]<br>\n" );
//			print( "__FUNCTION__=".__FUNCTION__."<br>\n" );
//			printf( "NOHEADERS_3580 [$fmt][csv][$csvfil]<hr>\n" );
//			return;
//			$content_type = "Content-type: application/csv Content-Disposition:  \"inline; filename=$csvfile\"";

//			printf( "BUG_2310:  csvfil=[$csvfil] <br>\n" );
			header("Pragma: public");
			header("Expires: 0");
			header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
			header("Cache-Control: private",false);
			header("Content-Type: application/octet-stream");
			header("Content-Disposition: attachment; filename=\"$csvfil\";" );
			header("Content-Transfer-Encoding: binary");
			print( $csvout );
			exit;

//			print( "a,b,c,jk,sk\n" );
//			print( $csvout );
//			print( $csvhdr );
//			print( $csvdtl );
//			return( ""  );
			}
		else {
			$csvimg="<img src=images/btn/export.png height=30 border=0 target=_blank>";
			$csvurl  = "<a href=$php_self?q=reports/rpt/$rptcode&fmt=header_csv>";
			$csvurl .= "$csvimg</a>\n";
			$htmout .= "<hr>$csvurl<hr>\n";
                	return( $htmout );
			}
		printf( "<hr>$prog $dttm MSG_3600:  fmt=[$fmt]<hr>\n" );
		return;
                }

        $output .= "$progid $dttm ERR UNSUPPORTED_7545:  leds_kb_rpts o0=$option0 o1=$option1 o2=$option2<br>\n";
        return;
        }

function im_identify( $filemask ) {
////	$im_identifys_mask="images/cab/dd29*.png";
////	$cmdtext=`identify $im_identifys_mask`;
	$cmdtext=`identify $filemask`;
	$lines = explode( "\n", $cmdtext );

	foreach( $lines as $line ) {
		$flds_im = explode( " ", $line );
		
		$im_filename=$flds_im[0];
		$im_type=$flds_im[1];
		$im_dim=$flds_im[2];
		$im_loc=$flds_im[3];
		$im_bit=$flds_im[4];
		$im_class=$flds_im[5];
		$im_colors=$flds_im[6];
		$im_size=$flds_im[7];

		$flds_im_dim = explode( "x", $im_dim );
		$im_width=$flds_im_dim[0];
		$im_height=$flds_im_dim[1];
		$flds_im[8]=$im_width;
		$flds_im[9]=$im_height;

//		printf( "BUGS_160:  im_width=[$im_width] im_height=[$im_height]<br>\n" );
//		printf( "BUGS_160:  im_filename=[$im_filename]<br>\n" );
//		printf( "BUGS_160:  im_type=[$im_type]<br>\n" );
//		printf( "BUGS_160:  im_dim=[$im_dim]<br>\n" );
//		printf( "BUGS_160:  im_loc=[$im_loc]<br>\n" );
//		printf( "BUGS_160:  im_bit=[$im_bit]<br>\n" );
//		printf( "BUGS_160:  im_class=[$im_class]<br>\n" );
//		printf( "BUGS_160:  im_colors=[$im_colors]<br>\n" );
//		printf( "BUGS_160:  im_size=[$im_size]<br>\n" );
//		printf( "BUGS_160:  width_height=[$width_height]<br>\n" );
		return( $flds_im );
		}
	return( "" );
	}

function key2png( $key, $val ) {
	$matches = "";
	$pngurl="";
	$width="";
	if(( preg_match( "/item_png/", $key, $matches ))
	|| ( preg_match( "/cab_png/", $key, $matches ))
	|| ( preg_match( "/cab1_png/", $key, $matches ))
	|| ( preg_match( "/cab2_png/", $key, $matches ))) {
		$pngfil = sprintf( "./imgs/cab/tn/tn_%s.png", $val );
		$pngfil_null = sprintf( "./imgs/cab/tn/tn_%s_null.png", $key );
		$pngfil_empty = sprintf( "./imgs/cab/tn/tn_%s_empty.png", $key );

		$width="";
		if( preg_match( "/_full/", $key )) { 
			$width=""; 
			$pngfil = sprintf( "./imgs/cab/%s.png", $val );
			$pngfil_null = sprintf( "./imgs/cab/%s_null.png", $key );
			$pngfil_empty = sprintf( "./imgs/cab/%s_empty.png", $key );
			}
		if( preg_match( "/_larg/", $key )) { 
			$width="width=75"; 
			$pngfil = sprintf( "./imgs/cab/%s.png", $val );
			$pngfil_null = sprintf( "./imgs/cab/%s_null.png", $key );
			$pngfil_empty = sprintf( "./imgs/cab/%s_empty.png", $key );
			}
		if( preg_match( "/_big/", $key )) { 
			$pngfil = sprintf( "./imgs/cab/%s.png", $val );
			$pngfil_null = sprintf( "./imgs/cab/%s_null.png", $key );
			$pngfil_empty = sprintf( "./imgs/cab/%s_empty.png", $key );
			$width="width=50"; 
			}
	
		if( preg_match( "/_small/", $key )) {
			 $width="width=25"; 
			}
		if( preg_match( "/_tiny/", $key )) {
			 $width="width=10"; 
			}


		if( file_exists( $pngfil )) {
			$im_flds=im_identify( $pngfil );
			$png_color=$im_flds[6];
			$png_width=$im_flds[8];
			$png_height=$im_flds[9];
			$alt="alt=\"$png_width $png_height $png_color\"";

			$pngimg="<img src=$pngfil border=0 $alt $width >";
			$pngurl="<a href=https://$http_host$php_self?q=png/$key/$val>";
			$pngurl  .= $pngimg;
			$pngurl  .= "</a>\n";
//			printf( "BUGS_2921:  pngurl=[$pngurl] key=[$key] val=[$val]<br>\n" );
			}
		else {
			$pngurl_null = "<img src=$pngfil_null border=0 alt=$val $width >";
			$pngurl = $pngurl_null;
//			printf( "BUGS_2941:  $pngfil_null pngurl_null=[$pngurl_null] key=[$key] val=[$val]<br>\n" );
			$pngurl_empty = "<img src=$pngfil_empty border=0 alt=$val $width >";
			$pngurl = $pngurl_empty;
//			printf( "BUGS_2942:  $pngfil_empty pngurl_empty=[$pngurl_empty] key=[$key] val=[$val]<br>\n" );
			$pngurl = $pngurl_empty;
			if( preg_match( "empty", $key )) { $pngurl = $pngurl_empty; }
			if( preg_match( "null", $key )) { $pngurl = $pngurl_null; }

			if( preg_match( "text" )) { $pngurl = "$val"; }
			}
		return( $pngurl );
		}
	return( "" );
	}

function sql_updform($rptnum, $rptcode, $rptdesc, $rptsql, $rpt_dbfile, $sqlfile, $outfile,  $status, $sqltext ) {
//	$sqlurl="<a href=$php_self?q=reports/sqlupd/$rptcode>$rptcode sqlfile</a>\n";
//	printf( "BUGS sqlurl=[$sqlurl]<br>\n" );
//	$output .= "<td>$sqlurl</td>";
//	$output .= sql_updform($sqlfile);
//	printf( "BUGS_9961 FOUND sqlfile= $sqlfile<br>\n" );

///	$url_sqlupd = "<a href=$php_self?q=reports/rpt/upd/$rptcode>sqlupd</a>\n";
//	$url_sqlundo = "<a href=$php_self?q=reports/rpt/undo/$rptcode>sqlundo</a><br>\n";
	$html = "<hr>\n";
////	$html .= "MSG_2940:  sqltext=[$sqltext] sqlfile=[$sqlfile]<br>\n";
	$html .= "$url_sqlupd &nbsp &nbsp &nbsp $url_sqlundo<br>\n";
	$html .= "<hr>\n";

	$html_form  = "<form method=\"post\" action=\"$php_self?q=reports/sql/$rptcode\" enctype=\"multipart/form-data\">\n";
	$html_form .= "<input type=\"submit\" name=\"update\" value=\"update\"/>\n";
	$html_form .= "<input type=\"reset\"/>\n";
	$html_form .= "<input type=\"submit\" name=\"undo\" value=\"undo\"/>\n";
	$html_form .= "<br>\n";
	$html_form .= "<table>\n";
	$html_form .= "<tr>\n";
	$html_form .= "<td>rptnum:</td><td> <input type=\"text\" name=\"rptnum\" value=\"$rptnum\"></td>\n";
	$html_form .= "<td>rptcode:</td><td> <input type=\"text\" name=\"rptcode\" value=\"$rptcode\"></td>\n";
	$html_form .= "<td>rptdesc:</td><td> <input type=\"text\" name=\"rptdesc\" value=\"$rptdesc\"><td>\n";
	$html_form .= "</tr>\n";
	$html_form .= "<tr>\n";
	$html_form .= "<td>rptsql:</td><td><input type=\"text\" name=\"rptsql\" value=\"$rptsql\"></td>\n";
	$html_form .= "<td>dbfile:</td><td><input type=\"text\" name=\"rpt_dbfile\" value=\"$rpt_dbfile\"></td>\n";
	$html_form .= "<td> &nbsp </td><td> &nbsp </td>\n";
	$html_form .= "</tr>\n";
	$html_form .= "<tr>\n";
	$html_form .= "<td>sqlfile:</td><td><input type=\"text\" name=\"sqlfile\" value=\"$sqlfile\"></td>\n";
	$html_form .= "<td> &nbsp </td><td> &nbsp </td>\n";
	$html_form .= "<td> &nbsp </td><td> &nbsp </td>\n";
	$html_form .= "</tr>\n";
	$html_form .= "</table>\n";
	$html_form .= "<textarea rows=\"20\" cols=\"80\" name=\"sqltext\">$sqltext</textarea><br/>\n";
##	$html_form .= "<input type=\"hidden\" name=\"rptcode\" value=\"$rptcode\"/>\n";
##	$html_form .= "&nbsp &nbsp &nbsp &nbsp \n";
##	$html_form .= "<input type=\"hidden\" name=\"rptnum\" value=\"$rptnum\"/>\n";
##	$html_form .= "<input type=\"hidden\" name=\"sqlfile\" value=\"$sqlfile\"/>\n";
##	$html_form .= "<input type=\"hidden\" name=\"sqltext\" value=\"$sqltext\"/>\n";
	$html_form .= "<input type=\"hidden\" name=\"post_options\" value=\"upd\"/>\n";
	$html_form .= "<input type=\"hidden\" name=\"query_string\" value=\"$query_string\"/>\n";
	$html_form .= "<input type=\"hidden\" name=\"uploaded_loos\" value=\"'". $globals['uploaded']."'\"/>\n";
	$html_form .= "<input type=\"submit\" name=\"update\" value=\"update\"/>\n";
	$html_form .= "<input type=\"reset\"/>\n";
	$html_form .= "<input type=\"submit\" name=\"undo\" value=\"undo\"/>\n";


	if(( isset( $_SESSION['role'] )) && ( ! $_SESSION['role'] == "" )) {
		$html .= $html_form;
		}
	$html_go2top_link .= "<a href=\"#top\"><img src=\"./imgs/btn/go2top.png\" border=0 width=25 alt=\"go2top\"></a>\n";
	$html_go2bottom_link .= "<a href=\"#bottom\"><img src=\"./imgs/btn/go2bottom.png\" border=0 width=25 alt=\"go2bottom\"></a>\n";
	$html .= $html_go2top_link;
	return( $html );
	}


function pchart_pie( $options ) {
	$option0=$options[0]; 
	$option1=$options[1]; 
	$option2=$options[2]; 

	$fld=$_GET['fld'];

	$tblname="plans";
	$sqldb="ka1.db3";
	$html=  "pchart_pie_beg: fld=[$fld]  [$option1][$option2][$option3]<br>\n";


	$planid="plan1";
	$sql = "select cab from $tblname where planid == '$planid'";
	printf( "pchart_pie MSG_3210: sql=[$sql] [$sqldb]<br>\n" );
                $pdo = newpdo($sqldb);
                foreach( $pdo->query($sql) as $row ) {
			printf( "BUGS__3228: $rpt_cabs row=[$row]<br>\n" );
                        $rpt_cabs=$row['cabs'];
                        $html .= "<tr>";
                        $html .= "<td>$rpt_cabs</td>";
                        $html .= "</tr>\n";
                        }
                $html .= "</table>\n";
                $html .= "</div>\n";
                $pdo=null;
	
	$html=  "pchart_pie_end: fld=[$fld]  [$option1][$option2][$option3]<br>\n";
	return( $html);


/* Create and populate the pData object */
        $MyData = new pData();

//      $MyData->addPoints(array(50,2,3,4,7,10,25,48,41,10,100,200,500),"ScoreA");
//      $MyData->addPoints(array(0,2,3,4,7,10),"ko_ScoreA");
//      $MyData->setSerieDescription("ko_ScoreA","ko_Application A");
//      $MyData->addPoints(array(0,2,3,4,7,10),"$series_code");
//      $MyData->addPoints(array(0,2,3,4,7,10),"$series_code");
        $MyData->addPoints($series_values,"$series_code");
        $MyData->setSerieDescription("$series_code","$series_desc");

 /* Define the absissa serie */

//      $MyData->addPoints(array("A0","B1","C2","D3","E4","K5","J9"),"Labels");
//      $labels_list=array("total", "used", "other" );


        $MyData->addPoints($labels_list,"Labels");
        $MyData->setAbscissa("Labels");

 /* Create the pChart object */
	$myPicture = new pImage(300,260,$MyData);

 /* Draw a solid background */
	$Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
	$myPicture->drawFilledRectangle(0,0,300,300,$Settings);

 /* Overlay with a gradient */
	$Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
	$myPicture->drawGradientArea(0,0,300,260,DIRECTION_VERTICAL,$Settings);
	$myPicture->drawGradientArea(0,0,300,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>100));

 /* Add a border to the picture */
	$myPicture->drawRectangle(0,0,299,259,array("R"=>0,"G"=>0,"B"=>0));

 /* Write the picture title */
	$myPicture->setFontProperties(array("FontName"=>"../pChart/fonts/Silkscreen.ttf","FontSize"=>6));
	$myPicture->drawText(10,13,$chart_title,array("R"=>255,"G"=>255,"B"=>255));

 /* Set the default font properties */
	$myPicture->setFontProperties(array("FontName"=>"../pChart/fonts/Forgotte.ttf","FontSize"=>10,"R"=>80,"G"=>80,"B"=>80));

 /* Create the pPie object */
	$PieChart = new pPie($myPicture,$MyData);

 /* Draw an AA pie chart */
	$PieChart->draw3DPie(160,140,array("Radius"=>70,"DrawLabels"=>TRUE,"LabelStacked"=>TRUE,"Border"=>TRUE));

 /* Write the legend box */
	 $myPicture->setShadow(FALSE);
	 $PieChart->drawPieLegend(15,40,array("Alpha"=>20));

 /* Render the picture (choose the best way) */
	 $myPicture->autoOutput("../imgs/pchart/ko_draw3DPie_labels.png");
	}




function hw($options) {

	$item=$options[1];
	$tblname="ko_hw";
	$cabid= str_replace( "cab_", "", $option1);
	$sql = "select * from $tblname where item like '%$item%'";

//	print( "$php_self MSG_2000: option1=[$option1] tblname=[$tblname] sql=[$sql]<br>\n");

	$collim=8;
	$collim=24;
	$colnum=1;

	$html .= html_header($options);
	$html .= html_btn_squares($options);
	$html .= leds_show($options);

	$pdo = newpdo($GLOBALS['dbfile']);


	$led_output  = "<table>\n";
	$led_output .= "<tr>\n";
	$led_output .= "<td>cab</td>\n";
	$led_output .= "<td>model</td>\n";
	$led_output .= "<td>sn</td>\n";
	$led_output .= "<td>hrc_tag</td>\n";
	$led_output .= "<td>u_position</td>\n";
	$led_output .= "<td>network</td>\n";
	$led_output .= "<td>cpumem</td>\n";
	$led_output .= "<td>amps</td>\n";
	$led_output .= "<td>rpdu_outlets</td>\n";
	$led_output .= "<td>rpdu_bank</td>\n";
	$led_output .= "<td>switch</td>\n";
	$led_output .= "<td>port</td>\n";
	$led_output .= "<td>old_rowname</td>\n";
	$led_output .= "</tr>\n";

	foreach( $pdo->query($sql) as $row ) {
		$item=$row['item'];
		$item_png="./imgs/cab/$item.png";
	
//		printf( "BUGS_3220 item=[$item] item_png=$item_png<br>\n" );
// cab|zone|grp|vendor|item|cab1|zone1|grp1|btu|watts|amps|vac|height|width|depth|weight|spectext
		$servers = $row['servers'];
		$switch = $row['switch'];
		$port = $row['port'];
		$old_rowname = $row['old_rowname'];
		$cab = $row['cab'];
		$u_position = $row['u_position'];
		$model = $row['model'];
		$cpumem = $row['cpumem'];
		$hrc_tag = $row['hrc_tag'];
		$sn = $row['sn'];
		$rpdu_outlet = $row['rpdu_outlet'];
		$rpdu_bank = $row['rpdu_bank'];
		$amps = $row['amps'];
//		$led_output = 
//			'cab=' . $cab . " &nbsp \n" .
//			'u_position=' . $u_position .  " &nbsp \n" .
//			'network=' . $network .  " &nbsp \n" .
//			'model=' . $model .  " &nbsp\n" .
//			'cpumem=' . $cpumem .  " &nbsp \n" .
//			'hrc_tag=' . $hrc_tag .  " &nbsp \n" .
////			'sn=' . $sn .  " &nbsp\n" .
//			'rpdu_outlet=' . $rpdu_outlet . "<br>\n" .
//			'amps=' . $amps . "<br>\n" .
//			'rpdu_bank=' . $rpdu_bank ."<br>\n" .
//			'servers=' . $servers . 
//			'switch=' . $switch . 
//			'port=' . $port . 
//			'old_rowname=' . $old_rowname .
//			'<br>\n";

////		printf( "BUGS_3250 item=[$item] item_png=[$item_png]<br>\n" );
		$item_url="<a href=https://$http_host/$php_self?q=hw/item='$item'><img src=$item_png border=0></a>\n";
		$led_output .= "<tr>\n";
		$led_output .= "<td>$item_url</td>\n";
		$led_output .= "<td><a href=$php_self?q=hw&cab='$cab'>$cab</a></td>\n";
		$led_output .= "<td><a href=$php_self?q=hw&item='$item'>$item</a></td>\n";
		$led_output .= "<td><a href=$php_self?q=hw&sn='$sn'>$sn</a></td>\n";
		$led_output .= "<td><a href=$php_self?q=hw&ip='$ip'>$ip</a></td>\n";
		$led_output .= "<td><a href=$php_self?q=hw&machinename='$machinename'>$machinename</a></td>\n";
		$led_output .= "<td><a href=$php_self?q=hw&hrctag='$hrctag'>$hrctag</a></td>\n";
		$led_output .= "<td>$u_position</td>\n";
		$led_output .= "<td>$network</td>\n";
		$led_output .= "<td>$cpumem</td>\n";
		$led_output .= "<td>$amps</td>\n";
		$led_output .= "<td>$rpdu_outlets</td>\n";
		$led_output .= "<td>$rpdu_bank</td>\n";
		$led_output .= "<td>$switch</td>\n";
		$led_output .= "<td>$port</td>\n";
		$led_output .= "<td>$old_rowname</td>\n";
		$led_output .= "</tr>\n";

		$html .= $led_output;
		}
	
	$html .= "</table>\n";
	print( $html );
	}

function kbwrite( $kbfil, $kbrec ) {
//	$fh = fopen( $kbfil, 'a+'); 
	$fh = fopen( $kbfil, 'w'); 
///	print( "<hr>$progid $dttm BUGS_1180: fh=[$fh] status=[$status] logrec=[$logrec] logfil=[$logfil]<hr>\n" );

	if( $fh != "" ) {	
		$status = fwrite( $fh, $kbrec ); 
		$status = fwrite( $fh, "\n" ); 
		fclose($fh);
		}
	}

function logwrite( $logfil, $logrec ) {
	$fh = fopen( $logfil, 'a+'); 
///	print( "<hr>$progid $dttm BUGS_1180: fh=[$fh] status=[$status] logrec=[$logrec] logfil=[$logfil]<hr>\n" );

	if( $fh != "" ) {	
		$status = fwrite( $fh, $logrec ); 
		fclose($fh);
		}
	}

function logdump( $logfil ) {
	$fh = fopen( $logfil, 'r' );
//	$contents = fread( $fh, filesize($filename));
	if( $fh ) {
		$icnt=0;
		while (( $irec = fgets( $fh, 4096)) !== false) {
			$icnt++;
			print( "$icnt $irec<br>\n" );
			}
		if(!feof($fh)){
			print( "<hr>$progid ERR_140:  reading $logfil<hr>\n" );
			}
		}
	fclose($fh);
///	print( "<hr>BUGS_145 contents=[$contents]<hr>\n" );
	}

// list knowledgebase subddir
function kb_ls( $options, $path ) {
// kb_ls.php
//
// open this directory 

	
//	printf( "$progid $dttm kb_ls BUGS_1264:  path=[$path]<br>\n" );
//      $myDirectory = opendir(".");
///	$path="./uss";
///	$path="/home/ko/hpx";
        $myDirectory = opendir("$path");
        while($entryName = readdir($myDirectory)) { $dirArray[] = $entryName; }
        closedir($myDirectory);

//      count elements in array
        $indexCount     = count($dirArray);
        $indexCount2=$indexCount-2;
///	Print ("please wait<br>");

// sort 'em
        sort($dirArray);

//	$option0=$options[0]; 
//	$option1=$options[1]; 
//	$option2=$options[2]; 
//	$option3=$options[3]; 
//	$option4=$options[4]; 

	$html_ls  = "";
	$html_ls .= "<h2>path=$path o1=[$o1] o2=[$o2] o3=[$o3]</h2>\n";
        $html_ls .= "<TABLE border=1 cellpadding=5 cellspacing=0 class=whitelinks>\n";
        $html_ls .= "<tr><th>Filename</th><th>Filetype</th><th>Filesize</th></tr>\n";

//      print("<TABLE border=1 cellpadding=5 cellspacing=0 class=whitelinks>\n");
//      print("<TR><TH>Filename</TH><th>Filetype</th><th>Filesize</th></TR>\n");

//	$GLOBALS['kb_rootpath'] = "/var/www/html/ka1/kb";
	$kb_rootpath = $GLOBALS['kb_rootpath'];
	$document_root=$_SERVER['DOCUMENT_ROOT'];
//	$kb_localpath = str_replace( $document_root, "", $kb_rootpath, $count );
	$kb_localpath = str_replace( $document_root, "", $path, $count );

///	printf( "<h2>kb_localpath=[$kb_localpath] document_root=[$document_root] kb_rootpath=[$kb_rootpath] path=[$path]</h2>\n" );

// loop through the array of files and print them all
        for($index=0; $index < $indexCount; $index++) {
                if (substr("$dirArray[$index]", 0, 1) != "."){ // don't list hidden files

                        $filename=$dirArray[$index];
//                      if( preg_match( "index", "$dirArray[$index]" )) { 
                        if( preg_match( "/index/i", $filename )) { continue; }
                        if( preg_match( "/php/i", $filename )) { continue; }

//                        $html_ls .= "<tr><td><a href=\"$kb_rootpath/$dirArray[$index]\">$dirArray[$index]</a></td>";
                        $html_ls .= "<tr><td><a href=\"$kb_localpath/$dirArray[$index]\">$dirArray[$index]</a></td>";
                        $html_ls .= "<td>";
                        $html_ls .= filetype($dirArray[$index]);
                        $html_ls .= "</td>";
                        $html_ls .= "<td>";
                        $html_ls .= filesize($dirArray[$index]);
                        $html_ls .= "</td>";
                        $html_ls .= "</TR>\n";

//                      print("<TR><TD><a href=\"$dirArray[$index]\">$dirArray[$index]</a></td>");
//                      print("<td>");
//                      print(filetype($dirArray[$index]));
//                      print("</td>");
//                      print("<td>");
//                      print(filesize($dirArray[$index]));
//                      print("</td>");
//                      print("</TR>\n");
                        }
                }
        $html_ls .= "</table>\n";
//	printf( "$progid $dttm ko_ls BUGS_1234:  path=[$path] html_ls=[$html_ls]<br>\n" );
//        print( "$html" );
	return( $html_ls );
	}


function ko_ls( $options, $path ) {
//	print_r($options);
//	print( "path=".$path );
//	$path="/fb/pages";
	$html_ls="";
	$rootpath=$_SERVER['DOCUMENT_ROOT'].$path;
        $myDirectory = opendir("$rootpath");
//	$myDirectory = opendir("$path");
        while($entryName = readdir($myDirectory)) { $dirArray[] = $entryName; }
        closedir($myDirectory);

//      count elements in array
        $indexCount     = count($dirArray);
        $indexCount2=$indexCount-2;

//	Print ("please wait<br>");
// sort 'em
        sort($dirArray);

// loop through the array of files and print them all
        for($index=0; $index < $indexCount; $index++) {
                if (substr("$dirArray[$index]", 0, 1) != "."){ // don't list hidden files
                        $filename=$dirArray[$index];
			$pathfile=$path.$filename;
//                      if( preg_match( "index", "$dirArray[$index]" )) { 
                        if( preg_match( "/index/i", $filename )) { continue; }
                        if( preg_match( "/php/i", $filename )) { continue; }

//			$html_ls .= "<a href=\"uss/$dirArray[$index]\">$dirArray[$index]</a>";
//// error 20200225	$html_ls .= filetype($dirArray[$index]);
//// error 20200225	$html_ls .= filesize($dirArray[$index]);
//                      print(filetype($dirArray[$index]));
//                      print(filesize($dirArray[$index]));
//			$html_ls .= $filename."<br>";
			$html_ls .= $pathfile."<br>";
                        }
                }
//	printf( "$progid $dttm ko_ls BUGS_1234:  path=[$path] html_ls=[$html_ls]<br>\n" );
	return( $html_ls );


	}


function ko_ls_orig( $options, $path ) {
// ko_ls.php
//
// open this directory 

//	printf( "$progid $dttm ko_ls BUGS_4900:  path=[$path]<br>\n" );
//      $myDirectory = opendir(".");
///	$path="./uss";
///	$path="/home/ko/hpx";
	print_r($options);
	print( "path=".$path );
        $myDirectory = opendir("$path");
        while($entryName = readdir($myDirectory)) { $dirArray[] = $entryName; }
        closedir($myDirectory);

//      count elements in array
        $indexCount     = count($dirArray);
        $indexCount2=$indexCount-2;
	Print ("please wait<br>");

// sort 'em
        sort($dirArray);

	$html_ls  = "";
	$html_ls .= "<h2>path=$path</h2>\n";
        $html_ls .= "<TABLE border=1 cellpadding=5 cellspacing=0 class=whitelinks>\n";
        $html_ls .= "<tr><th>Filename</th><th>Filetype</th><th>Filesize</th></tr>\n";

//      print("<TABLE border=1 cellpadding=5 cellspacing=0 class=whitelinks>\n");
//      print("<TR><TH>Filename</TH><th>Filetype</th><th>Filesize</th></TR>\n");

// loop through the array of files and print them all
        for($index=0; $index < $indexCount; $index++) {
                if (substr("$dirArray[$index]", 0, 1) != "."){ // don't list hidden files

                        $filename=$dirArray[$index];
//                      if( preg_match( "index", "$dirArray[$index]" )) { 
                        if( preg_match( "/index/i", $filename )) { continue; }
                        if( preg_match( "/php/i", $filename )) { continue; }

                        $html_ls .= "<tr><td><a href=\"uss/$dirArray[$index]\">$dirArray[$index]</a></td>";
                        $html_ls .= "<td>";
//// error 20200225	$html_ls .= filetype($dirArray[$index]);
                        $html_ls .= "</td>";
                        $html_ls .= "<td>";
//// error 20200225	$html_ls .= filesize($dirArray[$index]);
                        $html_ls .= "</td>";
                        $html_ls .= "</TR>\n";

//                      print("<TR><TD><a href=\"$dirArray[$index]\">$dirArray[$index]</a></td>");
//                      print("<td>");
//                      print(filetype($dirArray[$index]));
//                      print("</td>");
//                      print("<td>");
//                      print(filesize($dirArray[$index]));
//                      print("</td>");
//                      print("</TR>\n");
                        }
                }
        $html_ls .= "</table>\n";
//	printf( "$progid $dttm ko_ls BUGS_1234:  path=[$path] html_ls=[$html_ls]<br>\n" );
//        print( "$html" );
	return( $html_ls );
	}

function koaac_kb_new_form( $options ) {

	$php_self=$_SERVER['PHP_SELF'];
	$query_string=$_SERVER['QUERY_STRING'];
	$user=$_POST['user'];
	$pass=$_POST['pass'];
	$step=$_POST['step'];
	$tblname=$GLOBALS['tblname'];
	$led_name=$options[1];

	$kb_name=$options[1];
	$kb_dttm=date("Y-m-d H:i:s");
	$kb_remote_addr=$_SERVER['REMOTE_ADDR'];
	$kb_referer=$_SERVER['REFERER'];
	$kb_remote_port=$_SERVER['REMOTE_PORT'];

	$kb_user=$GLOBALS['kb_user'];
	$kb_host=$kb_referer;
	$kb_ip=$kb_remote_addr;
	$kb_org="kb_org";
	$kb_os="kb_os";
	$kb_grp="kb_grp";
	$kb_sys="kb_sys";
	$kb_cat="kb_cat";

//	printf( "BUGS_1807<hr>\n" );
//	leds_show();

//	$html_btn_squares=&html_btn_squares();


	$html = "";
	$html .= html_header($options);
//	$html .= $html_btn_squares;
	$html .= html_btn_squares();
	$html .= leds_show();
	$html .= html_kb_links($options);


//	$option5=$options[5];
//	$user_kbid=$option5;
//	print_r( $options );
//	printf( " $progid $dttm BUGS_1176: kbid=[%s] [$kbid] user_kbid=[$user_kbid] option5=[%s][$option5] options5[%s] <br>\n", 
//		$kbid, $option5, $options[5] );


//	$url_kbid=$options[4];
	$url_kbid=$options[3];
//	printf( "koaac_kb_new MSG_1627:  BEG  url_kbid=[%s] kbid=[%s] o1=[%s] o2=[%s] o3=[%s] o4=[%s] o5=[%s]<br>\n",
//		$url_kbid, $options[0], $options[1], $options[2], $options[3], $options[4], $options[5] );

	if( $url_kbid != "" ) {
		printf( "koaac_kb_new MSG_1170:  MOD url_kbid=[%s] o1=[%s] o2=[%s] o3=[%s] o4=[%s] o5=[%s]<br>\n",
			$url_kbid, $options[0], $options[1], $options[2], $options[3], $options[4], $options[5] );

		$kbfile=$GLOBALS['kbfile'];
		if( file_exists( $kbfile )) {
			$pdo = newpdo($GLOBALS['kbfile']);
			$tblname="kb";

			$sql = "select * from $tblname where kbid like '$url_kbid'";
			$kbcnt=0;
			printf( "$progid $dttm MSG:  kbfile=[%s] tblname=[%s] sql=[$sql]<br>\n", $kbfile, $tblname );
			foreach( $pdo->query($sql) as $row ) {
				$kbcnt++;
				$kbid=$row['kbid'];
				$kb_user=$row['kb_user'];
				$kb_host=$row['kb_host'];
				$kb_ip=$row['kb_ip'];
				$kb_os=$row['kb_os'];
				$kb_org=$row['kb_org'];
				$kb_grp=$row['kb_grp'];
				$kb_sys=$row['kb_sys'];
				$kb_cat=$row['kb_cat'];
				$status=$row['status'];
				$status_reason=$row['status_reason'];
				$impact=$row['impact'];
				$urgency=$row['urgency'];
				$priority=$row['priority'];
				$source=$row['source'];
				$request_type=$row['request_type'];
				$root_cause=$row['root_cause'];
				$publish=$row['publish'];
				$errtxt=$row['errtxt'];
				$fixtxt=$row['fixtxt'];
				$errtext=$row['errtext'];
				$fixtext=$row['fixtext'];
				$searchable=$row['searchable'];
				$attachements=$row['attachements'];
				$urgency=$row['filecount'];
				$filecount=$row['filecount'];
				$filelist=$row['filelist'];
				$lock=$row['lock'];
				$view_access=$row['view_access'];
				$vendor_name=$row['vendor_name'];
				$vendor_contact=$row['vendor_contact'];
				$vendor_ticket_num=$row['vendor_ticket_num'];
				$vendor_phone=$row['vendor_phone'];
				$vendor_email=$row['vendor_email'];
				$vendor_reported_dttm=$row['vendor_reported_dttm'];
				$vendor_responded_dttm=$row['vendor_responded_dttm'];
				$comment=$row['comment'];

				printf( "$progid $dttm MSG_1240: FOUND url_kbid=[$url_kbid] kbid=[$kbid] kb_ip=[$kb_ip] kbcnt=[$kbcnt] errtxt=[$errtxt] fixtxt=[$fixtxt] status=[$status]<br>\n" );
				}
			$pdo=null;
			if( $kbcnt == 0 ) {			
				$html .= "$progid $dttm ERR_1240:  NOTFOUND url_kbid=[$url_kbid] kbcnt=[$kbcnt] kb_ip=[$kb_ip] status=[$status] status_reason=[$status_reason] url_kbid=[$url_kbid]<br>\n";
				return($html);
				}
			else {
				$html .= "$progid $dttm MSG_1245:  FOUND url_kbid=[$url_kbid] kbcnt=[$kbcnt] kb_ip=[$kb_ip] status=[$status] status_reason=[$status_reason] url_kbid=[$url_kbid]<br>\n";
				}
			}
		else {
			$html .= "$progid $dttm ERR:  NOTFOUND kbfile=[$kbfile]<br>\n";
			return($html);
			}
		}



//	print( "<hr>leds_admin<hr>\n" );
	$dttm=date("Ymd_His");
//	$html .= "<head><title>koaac_kb_new_form $dttm</title></head>\n";

///	$html .= "<body bgcolor=\"lightblue\">\n";
///	$html .= "<b>koaac_kb_new_form</b>\n";
//	$html .= "<h2>$query_string [$user] step=[$step][$options[0][$options[1]]</h2>\n";

//	$html .= "<form method=\"post\" action=\"$php_self?q=koaac_kb_update/$kbid\" enctype=\"multipart/form-data\">\n";
//	$html .= "<form method=\"post\" action=\"$php_self?q=detail/aac/_kb/new\" enctype=\"multipart/form-data\">\n";
	$html .= "<form method=\"post\" action=\"$php_self?q=detail/aac/_kb/add\" enctype=\"multipart/form-data\">\n";
	$html .= "<br/>\n";

///	$html .= "led_name=[$led_name][$led_color][$led_speed][$led_type]<br>\n";
///	$html .= "[$led_date][$led_cmd][$led_desc][$led_misc]<br>\n";
///	$html .= "[$led_comment][$led_filename]<br /><br />\n";

	$status_assigned_checked = "";
	$status_scheduled_checked = "";
	$status_tovendor_checked = "";
	$status_noaction__checked = "";
	$status_corrected_checked = "";
	$status_closed_checked = "";
	$status_cancelled_checked = "";

	if( $status == "assigned" ) { $status_assigned_checked = "checked"; }
	if( $status == "scheduled" ) { $status_scheduled_checked = "checked"; }
	if( $status == "tovendor" ) { $status_tovendor_checked = "checked"; }
	if( $status == "noaction" ) { $status_noaction_checked = "checked"; }
	if( $status == "corrected" ) { $status_corrected_checked = "checked"; }
	if( $status == "closed" ) { $status_closed_checked = "checked"; }
	if( $status == "cancelled" ) { $status_cancelled_checked = "checked"; }
	if( $status == "" ) { $status_noaction_checked = "checked"; }


	$kb_host=$_SERVER['referer'];
	$kbid=$dttm;
	$kb_dttm=$kbid;


	$html .= "<input type=\"text\" name=\"kbid\" value=\"$kbid\"> kbid <br/>\n";
	$html .= "<input type=\"text\" name=\"kb_dttm\" value=\"$dttm\"> dttm <br/>\n";
	$html .= "<input type=\"text\" name=\"kb_user\" value=\"$kb_user\"> kb_user <br/>\n";
	$html .= "<input type=\"text\" name=\"kb_host\" value=\"$kb_host\"> kb_host <br/>\n";
	$html .= "<input type=\"text\" name=\"kb_ip\" value=\"$kb_ip\"> kb_ip <br/>\n";
	$html .= "<input type=\"text\" name=\"kb_org\" value=\"$kb_org\"> kb_org <br/>\n";
	$html .= "<input type=\"text\" name=\"kb_grp\" value=\"$kb_grp\"> kb_grp <br/>\n";
	$html .= "<input type=\"text\" name=\"kb_sys\" value=\"$kb_sys\"> kb_sys <br/>\n";
	$html .= "<br>\n";
	$html .= "<input type=\"text\" name=\"errtxt\" value=\"$errtxt\"> errtxt <br/>\n";
	$html .= "<input type=\"text\" name=\"fixtxt\" value=\"$fixtxt\"> fixtxt <br/>\n";
	$html .= "<input type=\"text\" name=\"comment\" value=\"$comment\"> comment <br/>\n";
	$html .= "<input type=\"text\" name=\"notes\" value=\"$notes\"> notes <br/>\n";

	$html .= "<br>\n";
	$html .= "upload_:  <input type=\"file\" name=\"uploaded\" /><br />\n";
	$html .= "upload1:  <input type=\"file\" name=\"uploaded1\" /><br />\n";
	$html .= "upload2:  <input type=\"file\" name=\"uploaded2\" /><br />\n";
	$html .= "upload3:  <input type=\"file\" name=\"uploaded3\" /><br />\n";
	$html .= "upload4:  <input type=\"file\" name=\"uploaded4\" /><br />\n";
	$html .= "upload5:  <input type=\"file\" name=\"uploaded5\" /><br />\n";
	$html .= "upload6:  <input type=\"file\" name=\"uploaded6\" /><br />\n";
	$html .= "upload7:  <input type=\"file\" name=\"uploaded7\" /><br />\n";
	$html .= "upload8:  <input type=\"file\" name=\"uploaded8\" /><br />\n";
	$html .= "upload9:  <input type=\"file\" name=\"uploaded9\" /><br />\n";
	$html .= "<br>\n";

	$html .= "<p>\n";
	$html .= "<input type=\"submit\" name=\"update\" value=\"update\"/>\n";
	$html .= "<input type=\"reset\"/>\n";
	$html .= "</p>\n";

	$html .= "<table>\n";
	$html .= "<tr valign=\"top\">\n";
	$html .= "<td width=\"100\">\n"; 
	$html .= "<b>status: </b>\n";
	$html .= "</td><td width=\"100\">\n";
	$html .= "<input type=\"radio\" name=\"status\" value=\"assigned\" $status_assigned_checked />1-assigned";
	$html .= "</td><td width=\"100\">\n";
	$html .= "<input type=\"radio\" name=\"status\" value=\"scheduled\" $status_scheduled_checked />2-scheduled";
	$html .= "</td><td width=\"100\">\n";
	$html .= "<input type=\"radio\" name=\"status\" value=\"tovendor\" $status_tovendor_checked />3-tovendor";
	$html .= "</td><td width=\"100\">\n";
	$html .= "<input type=\"radio\" name=\"status\" value=\"noaction\" $status_noaction_checked />4-noaction";
	$html .= "</td><td width=\"100\">\n";
	$html .= "<input type=\"radio\" name=\"status\" value=\"corrected\" $status_corrected_checked />5-corrected";
	$html .= "</td><td width=\"100\">\n";
	$html .= "<input type=\"radio\" name=\"status\" value=\"closed\" $status_closed_checked />6-closed";
	$html .= "</td><td width=\"100\">\n";
	$html .= "<input type=\"radio\" name=\"status\" value=\"cancelled\" $status_cancelled_checked />7-cancelled";
	$html .= "</td>\n";
	$html .= "</tr>\n";
	$html .= "</table>\n";



	$status_reason_assigned_checked = "";
	$status_reason_scheduled_checked = "";
	$status_reason_infra_checked = "";
	$status_reason_vendor_checked = "";
	$status_reason_noaction_checked = "";
	$status_reason_nofunding_checked = "";
	$status_reason_corrected_checked = "";
	$status_reason_pending_checked = "";
	$status_reason_cancelled_checked = "";
	$status_reason_duplicate_checked = "";
	$status_reason_notapply_checked = "";	
	$status_reason_closed_checked = "";	
	$status_reason_other_checked = "";	
	

	if( $status_reason == "assigned" ) { $status_reason_assigned_checked = "checked"; }
	if( $status_reason == "scheduled" ) { $status_reason_scheduled_checked = "checked"; }
	if( $status_reason == "infra" ) { $status_reason_infra_checked = "checked"; }
	if( $status_reason == "vendor" ) { $status_reason_vendor_checked = "checked"; }
	if( $status_reason == "noaction" ) { $status_reason_noaction_checked = "checked"; }
	if( $status_reason == "nofunding" ) { $status_reason_nofunding_checked = "checked"; }
	if( $status_reason == "corrected" ) { $status_reason_corrected_checked = "checked"; }
	if( $status_reason == "pending" ) { $status_reason_pending_checked = "checked"; }
	if( $status_reason == "cancelled" ) { $status_reason_cancelled_checked = "checked"; }
	if( $status_reason == "duplicate" ) { $status_reason_duplicate_checked = "checked"; }
	if( $status_reason == "notapply" ) { $status_reason_notapply_checked = "checked"; }
	if( $status_reason == "closed" ) { $status_reason_closed_checked = "checked"; }
	if( $status_reason == "other" ) { $status_reason_other_checked = "checked"; }
	if( $status_reason == "" ) { $status_reason_other_checked = "checked"; }

	$html .= "<hr>\n";
	$html .= "<table>\n";
	$html .= "<tr valign=\"top\">\n";
	$html .= "<td width=100>\n";
        $html .= "<b>status_reason: </b>";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"status_reason\" value=\"scheduled\" $status_reason_scheduled_checked />1-scheduled";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"status_reason\" value=\"infra\" $status_reason_infra_checked />2-infra";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"status_reason\" value=\"vendor\" $status_reason_vendor_checked />3-vendor";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"status_reason\" value=\"noaction\" $status_reason_noaction_checked />4-noaction";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"status_reason\" value=\"nofunding\" $status_reason_nofunding_checked />5-nofunding";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"status_reason\" value=\"corrected\" $status_reason_corrected_checked />6-corrected";
	$html .= "</tr><tr>\n";
	$html .= "<td width=100>\n";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"status_reason\" value=\"pending\" $status_reason_pending_checked />7-pending";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"status_reason\" value=\"cancelled\" $status_reason_cancelled_checked />8-cancelled";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"status_reason\" value=\"duplicate\" $status_reason_duplicate_checked />9-duplicate";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"status_reason\" value=\"notapply\" $status_reason_notapply_checked />10-notapply";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"status_reason\" value=\"closed\" $status_reason_closed_checked />11-closed";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"status_reason\" value=\"other\" $status_reason_other_checked />12-other";
	$html .= "</td>\n";
	$html .= "</tr>\n";
	$html .= "</table>\n";
	$html .= "<hr>\n";

	$impact_extensive_checked="";
	$impact_significant_checked="";
	$impact_medium_checked="";
	$impact_minor_checked="";
	if( $impact == "extensive" ) { $impact_extensive_checked = "checked"; }
	if( $impact == "significant" ) { $impact_significant_checked = "checked"; }
	if( $impact == "moderate" ) { $impact_moderate_checked = "checked"; }
	if( $impact == "minor" ) { $impact_minor_checked = "checked"; }
	$html .= "<table>\n";
	$html .= "<tr>\n";
	$html .= "<td width=100>\n";
	$html .= "<b>impact: </b>";
	$html .= "</td></tr>\n";
	$html .= "<tr><td width=100> &nbsp </td><td width=500>\n";
	$html .= "<input type=\"radio\" name=\"impact\" value=\"extensive\" $impact_extensive_checked />1-extensive/widspread (service_down_multiple_users)";
	$html .= "</td>\n";
	$html .= "</tr>\n";
	$html .= "<tr><td width=100> &nbsp </td><td width=500>\n";
	$html .= "<input type=\"radio\" name=\"impact\" value=\"significant\" $impact_significant_checked />2-significant/Large (service_degraded_multiple_users)";
	$html .= "</td>\n";
	$html .= "</tr>\n";
	$html .= "<tr><td width=100> &nbsp </td><td width=500>\n";
	$html .= "<input type=\"radio\" name=\"impact\" value=\"medium\" $impact_medium_checked />3-medium/limited (service_down_one_use)";
	$html .= "</td>\n";
	$html .= "</tr>\n";
	$html .= "<tr><td width=100> &nbsp </td><td width=500>\n";
	$html .= "<input type=\"radio\" name=\"impact\" value=\"minor\" $impact_minor_checked />4-minor/localized (no_service_degradation_or_degraded_one_user)";
	$html .= "</td>\n";
	$html .= "</tr>\n";
	$html .= "</table>\n";
	$html .= "<hr>\n";

	$urgency_critical_checked="";
	$urgency_high_checked="";
	$urgency_medium_checked="";
	$urgency_low_checked="";
	if( $urgency == "critical" ) { $urgency_critical_checked = "checked"; }
	if( $urgency == "high" ) { $urgency_high_checked = "checked"; }
	if( $urgency == "medium" ) { $urgency_medium_checked = "checked"; }
	if( $urgency == "low" ) { $urgency_low_checked = "checked"; }
	$html .= "<table>\n";
	$html .= "<tr valign=\"top\" >\n";
	$html .= "<td width=100>\n";
	$html .= "<b>urgency: </b>";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"urgency\" value=\"critical\" $urgency_critical_checked />1-critical";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"urgency\" value=\"high\" $urgency_high_checked />2-high";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"urgency\" value=\"medium\" $urgency_medium_checked />3-medium";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"urgency\" value=\"minor\" $urgency_low_checked />4-low";
	$html .= "</td>\n";
	$html .= "</tr>\n";
	$html .= "</table>\n";


	$priority_critical_checked="";
	$priority_high_checked="";
	$priority_medium_checked="";
	$priority_low_checked="";
	if( $priority  == "critical" ) { $priority_critical_checked = "checked"; }
	if( $priority  == "high" ) { $priority_high_checked = "checked"; }
	if( $priority  == "medium" ) { $priority_moderate_checked = "checked"; }
	if( $priority  == "low" ) { $priority_low_checked = "checked"; }

	$html .= "<hr>\n";
	$html .= "<table>\n";
	$html .= "<tr>\n";
	$html .= "<td width=100>\n";
	$html .= "<b>priority: </b>";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"priority \" value=\"critical\" $priority_critical_checked />1 - critical<br/>";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"priority \" value=\"high\" $priority_high_checked />2 - high<br/>";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"priority \" value=\"medium\" $priority_medium_checked />3 - medium<br/>";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"priority \" value=\"low\" $priority_low_checked />4 - low<br/>";
	$html .= "</td>\n";
	$html .= "</tr>\n";
	$html .= "</table>\n";
	$html .= "<hr>\n";


	$source_email_checked="";
	$source_fax_checked="";
	$source_phone_checked="";
	$source_vmail_checked="";
	$source_walkin_checked="";
	$source_system_checked="";
	$source_web_checked="";
	$source_other_checked="";

	if( $source  == "email" ) { $source_email_checked = "checked"; }
	if( $source  == "phone" ) { $source_phone_checked = "checked"; }
	if( $source  == "vmail" ) { $source_vmail_checked = "checked"; }
	if( $source  == "walkin" ) { $source_walkin_checked = "checked"; }
	if( $source  == "system" ) { $source_system_checked = "checked"; }
	if( $source  == "web" ) { $source_web_checked = "checked"; }
	if( $source  == "fax" ) { $source_fax_checked = "checked"; }
	if( $source  == "other" ) { $source_other_checked = "checked"; }

	$html .= "<table>\n";
	$html .= "<tr>\n";
	$html .= "<td width=100>\n";
	$html .= "<b>source: </b>";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"source \" value=\"email\" $source_email_checked />1 - email<br/>";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"source \" value=\"phone\" $source_phone_checked />2 - phone<br/>";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"source \" value=\"vmail\" $source_vmail_checked />3 - vmail<br/>";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"source \" value=\"walkin\" $source_walkin_checked />4 - walkin<br/>";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"source \" value=\"system\" $source_system_checked />5 - system<br/>";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"source \" value=\"web\" $source_web_checked />6 - web<br/>";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"source \" value=\"other\" $source_other_checked />7 - other<br/>";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"source \" value=\"fax\" $source_fax_checked />8 - fax<br/>";
	$html .= "</td>\n";
	$html .= "</table>\n";
	$html .= "<hr>\n";

	$request_type_config_item_checked="";
	$request_type_incident_checked="";
	$request_type_infrastruct_change_checked="";
	$request_type_knownerr_checked="";
	$request_type_investigation_checked="";
	$request_type_release_checked="";
	$request_type_solutiondb="";
	if( $request_type  == "config_item" ) { $request_type_config_item_checked = "checked"; }
	if( $request_type  == "incident" ) { $request_type_incident_checked = "checked"; }
	if( $request_type  == "infrastruct_change" ) { $request_infrastruct_change_checked = "checked"; }
	if( $request_type  == "knownerr" ) { $request_type_knownerr_checked = "checked"; }
	if( $request_type  == "investigation" ) { $request_type_investigation_cheked = "checked"; }
	if( $request_type  == "release" ) { $request_type_release_checked = "checked"; }
	if( $request_type  == "solutiondb" ) { $request_type_solutiondb_checked = "checked"; }

	$html .= "<table>\n";
	$html .= "<tr>\n";
	$html .= "<td width=100>\n";
	$html .= "<b>request_type: </b>";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"request_type\" value=\"config\" $request_type_config_checked />1-config";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"request_type\" value=\"incident\" $request_type_incident_checked />2 - incident";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"request_type\" value=\"infrastruct\" $request_type_infrastruct_checked />3-infrastruct";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"request_type\" value=\"knownerr\" $request_type_knownerr_checked />4-knownerr";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"request_type\" value=\"investigation\" $request_type_investigation_checked />5-investigate";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"request_type\" value=\"release\" $request_type_release_checked />6-release";
	$html .= "</td>\n";
	$html .= "</tr>\n";
	$html .= "</table>\n";
	$html .= "<hr>\n";

	$root_cause_hw_checked="";
	$root_cause_sw_checked="";
	$root_cause_patch_checked="";
	$root_cause_operator_checked="";
	$root_cause_other_checked="";
	if( $root_cause == "hw" ) { $root_cause_hw_checked = "checked"; }
	if( $root_cause == "sw" ) { $root_cause_sw_checked = "checked"; }
	if( $root_cause == "patch" ) { $root_cause_patch_checked = "checked"; }
	if( $root_cause == "operator" ) { $root_cause_operator_checked = "checked"; }
	if( $root_cause == "other" ) { $root_cause_other_checked = "checked"; }
	if( $root_cause == "" ) { $root_cause_other_checked = "checked"; }

	$html .= "<table>\n";
	$html .= "<tr>\n";
	$html .= "<td width=100>\n";
	$html .= "<b>root_cause: <br/>";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"root_cause \" value=\"hw\" $root_cause_hw_checked />1 - hw<br/>";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"root_cause \" value=\"sw\" $root_cause_sw_checked />2 - sw<br/>";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"root_cause \" value=\"patch\" $root_cause_patch_checked />3 - patch<br/>";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"root_cause \" value=\"operator\" $root_cause_operator_checked />4 - operator<br/>";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"root_cause \" value=\"other\" $root_cause_other_checked />5 - other<br/>";
	$html .= "</td>\n";
	$html .= "</tr>\n";
	$html .= "</table>\n";
	$html .= "<hr>\n";

	$kb_aac_checked="";
	$kb_aix_checked="";
	$kb_hpx_checked="";
	$kb_ios_checked="";
	$kb_sol_checked="";
	$kb_uss_checked="";
	$kb_win_checked="";
	if( $kb_os == "aac" ) { $kb_aac_checked = "checked"; }
	if( $kb_os == "aix" ) { $kb_aix_checked = "checked"; }
	if( $kb_os == "hpx" ) { $kb_hpx_checked = "checked"; }
	if( $kb_os == "ios" ) { $kb_ios_checked = "checked"; }
	if( $kb_os == "sol" ) { $kb_sol_checked = "checked"; }
	if( $kb_os == "uss" ) { $kb_uss_checked = "checked"; }
	if( $kb_os == "win" ) { $kb_win_checked = "checked"; }
	if( $kb_os == "" ) { $os_aac_checked = "checked"; }

	$html .= "<table>\n";
	$html .= "<tr>\n";
	$html .= "<td width=100>\n";
	$html .= "<b>os: <b/>";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"kb_os\" value=\"aac\" $kb_aac_checked />1-aac";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"kb_os\" value=\"aix\" $kb_aix_checked />2-aix";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"kb_os\" value=\"hpx\" $kb_hpx_checked />3-hpx";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"kb_os\" value=\"ios\" $kb_ios_checked />4-ios";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"kb_os\" value=\"sol\" $kb_sol_checked />5-sol";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"kb_os\" value=\"uss\" $kb_uss_checked />6-uss";
	$html .= "</td><td width=100>\n";
	$html .= "<input type=\"radio\" name=\"kb_os\" value=\"win\" $kb_win_checked />7-win";
	$html .= "</td>\n";
	$html .= "</tr>\n";
	$html .= "</table>\n";
	$html .= "<hr>\n";

        $html .= "publish: ";
	$html .= "<input type=\"radio\" name=\"published\" value=\"1\" \"checked\" />true";
	$html .= "<input type=\"radio\" name=\"published\" value=\"0\" />false";
	$html .= "<br />\n";


	$html .= "<br />\n";
        $html .= "errtext: <textarea rows=\"20\" cols=\"80\" name=\"errtext\">$errtext</textarea><br/>\n";
	$html .= "<br />\n";
        $html .= "fixtext: <textarea rows=\"40\" cols=\"100\" name=\"fixtext\">$fixtext</textarea><br/>\n";
	$html .= "<br />\n";

	$html .= "<p>\n";
	$html .= "<input type=\"submit\" name=\"update\" value=\"update\"/>\n";
	$html .= "<input type=\"reset\"/>\n";
	$html .= "</p>\n";

	$html .= "<input type=\"text\" name=\"kb_dttm\" value=\"$kb_dttm\"> kb_dttm <br/>\n";
	$html .= "<input type=\"text\" name=\"kb_user\" value=\"$kb_user\"> kb_user <br/>\n";
	$html .= "<input type=\"text\" name=\"kb_host\" value=\"$kb_host\"> kb_host <br/>\n";
	$html .= "<input type=\"text\" name=\"kb_ip\" value=\"$kb_ip\"> kb_ip <br/>\n";
	$html .= "<input type=\"text\" name=\"kb_os\" value=\"$kb_os\"> kb_os <br/>\n";
	$html .= "<input type=\"text\" name=\"kb_org\" value=\"$kb_org\"> kb_org <br/>\n";
	$html .= "<input type=\"text\" name=\"kb_sys\" value=\"$kb_sys\"> kb_sys <br/>\n";
	$html .= "<input type=\"text\" name=\"kb_cat\" value=\"$kb_cat\"> kb_cat <br/>\n";



//	$html .= "<input type=\"text\" name=\"impact\" value=\"$impact\"> impact <br/>\n";
//	$html .= "<input type=\"text\" name=\"urgency\" value=\"$urgency\"> urgency <br/>\n";
//	$html .= "<input type=\"text\" name=\"priority\" value=\"$priority\"> priority <br/>\n";
//	$html .= "<input type=\"text\" name=\"source\" value=\"$source\"> source <br/>\n";
//	$html .= "<input type=\"text\" name=\"request_type\" value=\"$request_type\"> request_type <br/>\n";
//	$html .= "<input type=\"text\" name=\"root_cause\" value=\"$root_cause\"> root_cause <br/>\n";
//	$html .= "<input type=\"text\" name=\"publish\" value=\"$publish\"> publish <br/>\n";

//	$html .= "<input type=\"text\" name=\"searchable\" value=\"$searchable\"> searchable <br/>\n";
//	$html .= "<input type=\"text\" name=\"attachments\" value=\"$attachments\"> attachments <br/>\n";
//	$html .= "<input type=\"text\" name=\"filecount\" value=\"$filecount\"> filecount <br/>\n";
//	$html .= "<input type=\"text\" name=\"filelist\" value=\"$filelist\"> filelist <br/>\n";
//	$html .= "<input type=\"text\" name=\"locked\" value=\"$locked\"> locked <br/>\n";
//	$html .= "<input type=\"text\" name=\"view_access\" value=\"$view_access\"> view_access <br/>\n";

	$html .= "<input type=\"text\" name=\"vendor_name\" value=\"$vendor_name\"> vendor_name <br/>\n";
	$html .= "<input type=\"text\" name=\"vendor_contact\" value=\"$vendor_contact\"> vendor_contact <br/>\n";
	$html .= "<input type=\"text\" name=\"vendor_ticket_num\" value=\"$vendor_ticket_num\"> vendor_ticket_num <br/>\n";
	$html .= "<input type=\"text\" name=\"vendor_phone\" value=\"$vendor_phone\"> vendor_phone <br/>\n";
	$html .= "<input type=\"text\" name=\"vendor_email\" value=\"$vendor_email\"> vendor_email <br/>\n";
	$html .= "<input type=\"text\" name=\"vendor_reported_dttm\" value=\"$vendor_reported_dttm\"> vendor_reported_dttm <br/>\n";
	$html .= "<input type=\"text\" name=\"vendor_responded_dttm\" value=\"$vendor_responded_dttm\"> vendor_responded_dttm <br/>\n";





	$html .= "<input type=\"hidden\" name=\"user\" value=\"$user\"/>\n";
	$html .= "<input type=\"hidden\" name=\"pass\" value=\"$pass\"/>\n";
	$html .= "<input type=\"hidden\" name=\"step\" value=\"update\"/>\n";
	$html .= "<input type=\"hidden\" name=\"query_string\" value=\"$query_string\"/>\n";
	$html .= "<input type=\"hidden\" name=\"uploaded_loos\" value=\"'". $globals['uploaded']."'\"/>\n";

	$html .= "<hr/>\n";

	$html .= "<p>\n";
	$html .= "<input type=\"submit\" name=\"new\" value=\"add\"/>\n";
	$html .= "<input type=\"reset\"/>\n";
	$html .= "</p>\n";
	$html .= "</form>\n";
	$html .= "</body>\n";
	$html .= "<html>\n";
	return( $html );
//	print( $html );
	}


function koaac_kb_add_form( $options ) {
	html_header();
	$php_self=$_SERVER['PHP_SELF'];
	$kb_name=$options[1];
//	$kb_dttm=date("Y-m-d H:i:s");
	$kb_dttm=date("Ymd_His");
	$kb_remote_addr=$_SERVER['REMOTE_ADDR'];
	$kb_referer=$_SERVER['REFERER'];
	$kb_remote_port=$_SERVER['REMOTE_PORT'];
	$kbpath = $GLOBALS['kbpath'];
	$kbfile=$GLOBALS['kbfile'];

	$query_string=$_SERVER['QUERY_STRING'];
	$user=$_POST['user'];
	$pass=$_POST['pass'];
	$step=$_POST['step'];

	$id = $_POST['id'];
	$kbid = $_POST['kbid'];
	$kb_dttm = $_POST['kb_dttm'];
	$kb_user = $_POST['kb_user'];
	$kb_host = $_POST['kb_host'];
	$kb_ip = $_POST['kb_ip'];
	$kb_os = $_POST['kb_os'];
	$kb_org = $_POST['kb_org'];
	$kb_grp = $_POST['kb_grp'];
	$kb_sys = $_POST['kb_sys'];
	$kb_cat = $_POST['kb_cat'];
	$status = $_POST['status'];
	$status_reason = $_POST['status_reason'];
	$impact = $_POST['impact'];
	$urgency = $_POST['urgency'];
	$priority = $_POST['priority'];
	$source = $_POST['source'];
	$request_type = $_POST['request_type'];
	$root_cause = $_POST['root_cause'];
	$publish = $_POST['publish'];
	$errtxt = $_POST['errtxt'];
	$fixtxt = $_POST['fixtxt'];
	$errtext = $_POST['errtext'];
	$fixtext = $_POST['fixtext'];
	$searchable = $_POST['searchable'];
	$attachments = $_POST['attachments'];
	$filecount = $_POST['filecount'];
	$filelist = $_POST['filelist'];
	$locked = $_POST['locked'];
	$view_access = $_POST['view_access'];

	$vendor_name = $_POST['vendor_name'];
	$vendor_contact = $_POST['vendor_contact'];
	$vendor_ticket_num = $_POST['vendor_ticket_num'];
	$vendor_contact = $_POST['vendor_contact'];
	$vendor_phone = $_POST['vendor_phone'];
	$vendor_email = $_POST['vendor_email'];
	$vendor_reported_dttm = $_POST['vendor_reported_dttm'];
	$vendor_responded_dttm = $_POST['vendor_responded_dttm'];
	$comment = $_POST['comment'];
	$notes = $_POST['notes'];

//	print( "leds_update MSG:  user=[$user][$pass][$step] [$query_string]<br />\n" );
//	print( "leds_update MSG:  name=[$led_name][$led_color][$led_speed][$led_comment][$led_user]<br/>\n" );
//	print( "leds_update MSG:  filename=[$led_filename] published=[$led_published]<br/>\n" );
	print( "$php_self koaac_kb_add MSG_1600:  kbid=[$kbid] kb_user=[$kb_user] kb_dttm=[$kb_dttm]<br>\n" );


// create directory criteria
//	if((isset($_FILES['uploaded']) && !empty($_FILES['uploaded']['name']))
//	|| (isset($_FILES['uploaded1']) && !empty($_FILES['uploaded1']['name']))
//	|| (isset($_FILES['uploaded2']) && !empty($_FILES['uploaded2']['name'])) 
//	|| (isset($_FILES['uploaded3']) && !empty($_FILES['uploaded3']['name']))
////	|| (isset($_FILES['uploaded4']) && !empty($_FILES['uploaded4']['name'])) 
//	|| (isset($_FILES['uploaded5']) && !empty($_FILES['uploaded5']['name']))
////	|| (isset($_FILES['uploaded6']) && !empty($_FILES['uploaded6']['name']))
////	|| (isset($_FILES['uploaded7']) && !empty($_FILES['uploaded7']['name'])) 
//	|| (isset($_FILES['uploaded8']) && !empty($_FILES['uploaded8']['name']))
//	|| (isset($_FILES['uploaded9']) && !empty($_FILES['uploaded9']['name']))
//	|| (isset($_POST['errtxt']) && !empty($_POST['errtxt']))
//	|| (isset($_POST['fixtxt']) && !empty($_POST['fixtxt']))
//	|| (isset($_POST['errtext']) && !empty($_POST['errtext']))
//	|| (isset($_POST['fixtext']) && !empty($_POST['fixtext']))
//	|| (isset($_POST['comments']) && !empty($_POST['comments']))
//	|| (isset($_POST['notes']) && !empty($_POST['notes']))
//		) {
//		printf( "<hr>create directory kbid=$kbid<hr>\n" );
//		$full_kbpath=kb_mkdir( $kbpath, $kbid );
//		}

	$kbfullpath=kb_mkdir( $kbpath, $kbid );
	printf( "BUGS_2525 kbpath=[$kbpath] kbid=[$kbid] full_kbpath=[$full_kbpath]<br>\n" );

	if(isset($_POST['errtxt']) && !empty($_POST['errtxt'])) {
		$pathfile_errtxt="$kbfullpath/errtxt_$kbid.txt";
		kbwrite( $pathfile_errtxt, $_POST['errtxt'] );
		}
		
	if(isset($_POST['fixtxt']) && !empty($_POST['fixtxt'])) {
		$pathfile_fixtxt="$kbfullpath/fixtxt_$kbid.txt";
		kbwrite( $pathfile_fixtxt, $_POST['fixtxt'] );
		}
	if(isset($_POST['errtext']) && !empty($_POST['errtext'])) {
		$pathfile_errtext="$kbfullpath/errtext_$kbid.txt";
		kbwrite( $pathfile_errtext, $_POST['errtext'] );
		}
	if(isset($_POST['fixtext']) && !empty($_POST['fixtext'])) {
		$pathfile_fixtext="$kbfullpath/fixtext_$kbid.txt";
		kbwrite( $pathfile_fixtext, $_POST['fixtext'] );
		}
	if(isset($_POST['comment']) && !empty($_POST['comment'])) {
		$pathfile_comment="$kbfullpath/comment_$kbid.txt";
		kbwrite( $pathfile_comment, $_POST['comment']);
		}
	if(isset($_POST['notes']) && !empty($_POST['notes'])) {
		$pathfile_notes="$kbfullpath/notes_$kbid.txt";
		kbwrite( $pathfile_notes, $_POST['notes']);
		}

//	printf( "BUGS_2550 full_kbpath=[$full_kbpath] kbpath=[$kbpath] kbid=[$kbid]<br>\n" );
//	printf( "BUGS_2550 pathfile_errtxt=[$pathfile_errtxt]<br>\n" );
//	printf( "BUGS_2550 pathfile_fixtxt=[$pathfile_fixtxt]<br>\n" );
//	printf( "BUGS_2550 pathfile_errtext=[$pathfile_errtext]<br>\n" );
//	printf( "BUGS_2550 pathfile_fixtext=[$pathfile_fixtext]<br>\n" );
//	printf( "BUGS_2550 pathfile_comment=[$pathfile_comment]<br>\n" );
//	printf( "BUGS_2550 pathfile_notes=[$pathfile_notes]<br>\n" );
//	printf( "BUGS_2550 pathfile_psv=[$pathfile_psv]<br>\n" );
//	return;


	$html_koaac_kb_upload = koaac_kb_upload( $kbid );
	printf( "BUGS_2580 html_koaac_kb_upload=[$html_koaac_kb_upload]<br>\n" );


// cleanup paste text
//	whilte(strpos($str, '  ') !== false) { $str = str_replace('  ', ' ', $string);

//	$fmt_errtxt= htmlentities(preg_replace('/\s+/', ' ', $errtxt ));
	$fmt_errtxt= preg_replace('/\s+/', ' ', $errtxt );

	printf( "BUGS_2601  fmt_errtxt=[$fmt_errtxt][$errtxt]<br>\n" );
	$fmt_errtxt = htmlentities($fmt_errtxt );
	printf( "BUGS_2601  fmt_errtxt=[$fmt_errtxt][$errtxt]<br>\n" );




	$fmt_errtxt= ereg_replace("/\n\r|\r\n|\r|\n", " ", $errtxt );
	$fmt_errtxt= htmlentities(preg_replace('/\s+/', ' ', $fmt_errtxt ));

	$fmt_fixtxt= ereg_replace("/\n\r|\r\n|\r|\n", " ", $fixtxt );
	$fmt_fixtxt= htmlentities(preg_replace('/\s+/', ' ', $fmt_fixtxt ));

	$fmt_errtext= ereg_replace("/\n\r|\r\n|\r|\n", " ", $errtext );
	$fmt_errtext= htmlentities(preg_replace('/\s+/', ' ', $fmt_errtext ));

	$fmt_fixtext= ereg_replace("/\n\r|\r\n|\r|\n", " ", $fixtext );
	$fmt_fixtext= htmlentities(preg_replace('/\s+/', ' ', $fmt_fixtext ));

	$fmt_notes= ereg_replace("/\n\r|\r\n|\r|\n", " ", $notes );
	$fmt_notes= htmlentities(preg_replace('/\s+/', ' ', $fmt_notes ));

	$fmt_comment= ereg_replace("/\n\r|\r\n|\r|\n", " ", $comment );
	$fmt_comment= htmlentities(preg_replace('/\s+/', ' ', $fmt_comment ));


//	printf( "BUGS_2602  fmt_fixtxt=[$fmt_fixtxt][$fixtxt]<br>\n" );
//	printf( "BUGS_2603  fmt_fixtext=[$fmt_fixtext][fixtext]<br>\n" );
//	printf( "BUGS_2604  fmt_errtext=[$fmt_errtext][errtext]<br>\n" );
//	printf( "BUGS_2605  fmt_notes=[$fmt_notes][notes]<br>\n" );
//	printf( "BUGS_2606  fmt_comment=[$fmt_comment][comment]<br>\n" );


//	print( "$php_self koaac_kb_add MSG_1635:  kbid=[$kbid] kb_user=[$kb_user] kb_dttm=[$kb_dttm]<br>\n" );
	$html   .= "$php_self koaac_kb_add MSG_2590:  kbid=[$kbid] kb_user=[$kb_user] kb_dttm=[$kb_dttm]<br>\n";

	$sqlupd = "update kb  set ";
	$sqlupd .= "dttm='$dttm', ";
	$sqlupd .= "submit_by='$submit_by', ";
	$sqlupd .= "where kbid=='$kbid' ";

//	$html   .= "<hr>sqlupd=[$sqlupd]<br />\n";
//	printf( "BUGS_2615  sqlupd=[$sqlupd]<br>\n");

	$sqladd = "insert or replace into kb (";
//	$sqladd .= "id, kbid, kb_dttm, kb_user, kb_host, kb_os, kb_org, kb_grp, kb_sys, kb_cat, ";
	$sqladd .= "kbid, kb_dttm, kb_user, kb_host, kb_os, kb_org, kb_grp, kb_sys, kb_cat, ";
	$sqladd .= "status, status_reason, ";
	$sqladd .= "impact, urgency, priority, source, request_type, root_cause, publish, ";
	$sqladd .= "errtxt, fixtxt, errtext, fixtext, ";
	$sqladd .= "vendor_name, vendor_contact, vendor_ticket_num, vendor_phone, vendor_email, ";
	$sqladd .= "vendor_reported_dttm, vendor_responded_dttm, ";
	$sqladd .= "comment, notes"; 
	$sqladd .= ") ";
	$sqladd .= " values ( ";


//	$sqladd .= "\"$id\", \"$kbid\", \"$kb_dttm\", \"$kb_user\", \"$kb_host\", \"$kb_os\", \"$kb_org\", \"$kb_grp\", \"$kb_sys\", \"$kb_cat\", ";
	$sqladd .= "\"$kbid\", \"$kb_dttm\", \"$kb_user\", \"$kb_host\", \"$kb_os\", \"$kb_org\", \"$kb_grp\", \"$kb_sys\", \"$kb_cat\", ";
	$sqladd .= "\"$status\", \"$status_reason\", ";
	$sqladd .= "\"$impact\", \"$urgency\", \"$priority\", \"$source\", \"$request_type\", \"$root_cause\", \"publish\",  ";
	$sqladd .= "\"$fmt_errtxt\", \"$fmt_fixtxt\", ";
	$sqladd .= "\"$fmt_errtext\", \"$fmt_fixtext\", ";

	$sqladd .= "\"$vendor_name\", \"$vendor_contact\", \"$vendor_ticket_num\", \"$vendor_phone\", \"$vendor_email\", ";
	$sqladd .= "\"$vendor_reported_dttm\", \"$vendor_responded_dttm\", ";
	$sqladd .= "\"$fmt_comment\", \"fmt_$notes\" ";
	$sqladd .= " ); ";

	$html   .= "<hr>sqladd=[$sqladd]<br />\n";

	printf( "BUGS_2622  sqladd=[$sqladd]<br>\n");
//	print( "$php_self koaac_kb_add MSG_1670: kbfile=[$kbfile]\ kbid=[$kbid] kb_user=[$kb_user] kb_dttm=[$kb_dttm] sqladd=[$sqladd]<br>\n" );



	try {
		$pdo = newpdo($GLOBALS['kbfile']);
		$result = $pdo->exec($sqladd);
		$pdo = null;
		}
	catch(PDOException $e) { $output .= $e->getMessage(); }

//	$string = htmlentities($string); 
//	$string = str_replace(array('&lt;','&gt;'), array('<', '>'), $string); 

///	$pdo = newpdo($GLOBALS['dbfile']);
//	$pdo = newpdo($GLOBALS['kbfile']);

//	printf( "BUGS_2650:  sqladd=[$sqladd]<hr>\n");
///	$pdo->exec($sqlupd);
//	$pdo->exec($sqladd);
//	$pdo = null;
	printf( "<hr>BUGS_2670:  sqladd=[$sqladd]<hr>\n");

	$pathfile_sql="$full_kbpath/$kbid".".sql";
	logwrite( $pathfile_sql, $sqladd );

//	$pathfile_csv="$full_kbpath/$kbid".".csv";
//	logwrite( $pathfile_csv, $sqladd );
//	$pathfile_psv="$full_kbpath/$kbid".".psv";
//	logwrite( $pathfile_psv, $sqladd );

	$html_btn_squares = html_btn_squares($options);
	$html_head .= html_header($options);
	$html_kb_links = html_kb_links($options);
	$html_body = leds_show();
	$html_footer = html_footer( $options );
	$html = $html_head . $html_btn_squares . $html_kb_links;
	$html .= "$php_self koaac_kb_add MSG_2490:  kbid=[$kbid] kb_user=[$kb_user] kb_dttm=[$kb_dttm] sqladd=[$sqladd]<br>\n";
	$html .= $html_body . $html_upload . $html_scrub . $html_foot;
	$html .= $html_body . $html_upload . $html_scrub . $html_foot;
	print( $html );
	}



function koaac_kb_upload( $kbid ) {
	$php_self=$_SERVER['PHP_SELF'];
	$dttm=date("Ymd_His");
	$media_path = $GLOBALS['media_path'];
	$kbpath=$GLOBALS['kbpath'];
//	define( "FILEREPOSITORY", "/var/www/html/inbox" );


	$html_upload = "";
	$html_upload .= "php_self koaac_kb_upload MSG_1700a:  kbid=[$kbid] syscmd_mkdir=[$syscmd_mkdir]<hr>\n"; 

//	print_r($_FILES);
//	print_r($_FILES[uploaded] );
//	print( "<hr> uploaded1\n" );
//	print_r($_FILES[uploaded1] );
//	print( "<hr> uploaded2\n" );
//	print_r($_FILES[uploaded2] );
//	print( "<hr> uploaded3\n" );
//	print_r($_FILES[uploaded3] );
//	print( "<hr> uploaded4\n" );
//	print_r($_FILES[uploaded4] );
//	print( "<br>\n" );
//	print( "$php_self koaac_kb_upload MSG_1700b:  kbid=[$kbid] syscmd_mkdir=[$syscmd_mkdir]<hr>\n" );

	$uploaded_name=$_FILES[uploaded][name];
	$uploaded_tmpname=$_FILES[uploaded][tmp_name];
	$uploaded_error=$_FILES[uploaded][error];
	$uploaded_size=$_FILES[uploaded][size];

	$uploaded_name1=$_FILES[uploaded1][name];
	$uploaded_tmpname1=$_FILES[uploaded1][tmp_name];
	$uploaded_error1=$_FILES[uploaded1][error];
	$uploaded_size1=$_FILES[uploaded1][size];

	$uploaded_name2=$_FILES[uploaded2][name];
	$uploaded_tmpname2=$_FILES[uploaded2][tmp_name];
	$uploaded_error2=$_FILES[uploaded2][error];
	$uploaded_size2=$_FILES[uploaded2][size];

	$uploaded_name3=$_FILES[uploaded3][name];
	$uploaded_tmpname3=$_FILES[uploaded3][tmp_name];
	$uploaded_error3=$_FILES[uploaded3][error];
	$uploaded_size3=$_FILES[uploaded3][size];

	$uploaded_name4=$_FILES[uploaded4][name];
	$uploaded_tmpname4=$_FILES[uploaded4][tmp_name];
	$uploaded_error4=$_FILES[uploaded4][error];
	$uploaded_size4=$_FILES[uploaded4][size];

	$uploaded_name5=$_FILES[uploaded5][name];
	$uploaded_tmpname5=$_FILES[uploaded5][tmp_name];
	$uploaded_error5=$_FILES[uploaded5][error];
	$uploaded_size5=$_FILES[uploaded5][size];

	$uploaded_name6=$_FILES[uploaded6][name];
	$uploaded_tmpname6=$_FILES[uploaded6][tmp_name];
	$uploaded_error6=$_FILES[uploaded6][error];
	$uploaded_size6=$_FILES[uploaded6][size];

	$uploaded_name7=$_FILES[uploaded7][name];
	$uploaded_tmpname7=$_FILES[uploaded7][tmp_name];
	$uploaded_error7=$_FILES[uploaded7][error];
	$uploaded_size7=$_FILES[uploaded7][size];

	$uploaded_name8=$_FILES[uploaded8][name];
	$uploaded_tmpname8=$_FILES[uploaded8][tmp_name];
	$uploaded_error8=$_FILES[uploaded8][error];
	$uploaded_size8=$_FILES[uploaded8][size];

	$uploaded_name9=$_FILES[uploaded9][name];
	$uploaded_tmpname9=$_FILES[uploaded9][tmp_name];
	$uploaded_error9=$_FILES[uploaded9][error];
	$uploaded_size9=$_FILES[uploaded9][size];


//	$html_upload .= "BUGS_1700_uploaded0:  $uploaded_name tmpname=[$uploaded_tmpname] error=[$uploaded_error1] size=[$uploaded_size1]<hr>\n";
//	$html_upload .= "BUGS_1700_uploaded1:  name1=$uploaded_name1 tmpname1=[$uploaded_tmpname1] error1=[$uploaded_error1] size1=[$uploaded_size1]<hr>\n";
//	$html_upload .= "BUGS_1700_uploaded2:  name2=$uploaded_name2 tmpname2=[$uploaded_tmpname2] error2=[$uploaded_error2] size2=[$uploaded_size2]<hr>\n";
//	$html_upload .= "BUGS_1700_uploaded3:  name3=$uploaded_name3 tmpname3=[$uploaded_tmpname3] error3=[$uploaded_error3] size3=[$uploaded_size3]<hr>\n";
//	$html_upload .= "BUGS_1700_uploaded4:  name4=$uploaded_name4 tmpname4=[$uploaded_tmpname4] error4=[$uploaded_error4] size4=[$uploaded_size1]<hr>\n";
//	$html_upload .= "BUGS_1700_uploaded5:  name5=$uploaded_name5 tmpname5=[$uploaded_tmpname5] error5=[$uploaded_error5] size5=[$uploaded_size1]<hr>\n";
//	$html_upload .= "BUGS_1700_uploaded6:  name6=$uploaded_name6 tmpname6=[$uploaded_tmpname6] error6=[$uploaded_error6] size6=[$uploaded_size1]<hr>\n";
//	$html_upload .= "BUGS_1700_uploaded7:  name7=$uploaded_name7 tmpname7=[$uploaded_tmpname7] error7=[$uploaded_error7] size7=[$uploaded_size1]<hr>\n";
//	$html_upload .= "BUGS_1700_uploaded8:  name8=$uploaded_name8 tmpname8=[$uploaded_tmpname8] error8=[$uploaded_error8] size8=[$uploaded_size1]<hr>\n";
//	$html_upload .= "BUGS_1700_uploaded9:  name9=$uploaded_name9 tmpname9=[$uploaded_tmpname9] error9=[$uploaded_error9] size9=[$uploaded_size1]<hr>\n";



	if( $kbid == "" )  {
		$html_upload .= "$php_self koaac_kb_upload ERR_2675:  kbid=[$kbid] <hr>\n";
		return( $html_upload);
		}

///	else {	

// create new kb directory
	$kbfullpath=kb_mkdir($kbpath, $kbid);


	$html_upload .= "$php_self koaac_kb_upload MSG_2766: _FILES[uploaded][name]=".$_FILES['uploaded']['name']. " <br>\n";
	$html_upload .= "$php_self koaac_kb_upload MSG_2767: _FILES[uploaded][tmp_name]=".$_FILES['uploaded']['tmp_name']. " <br>\n";
	$html_upload .= "$php_self koaac_kb_upload MSG_2768: kbpath_ym_kb=[$kbpath_ym_kb] <br>\n";
	$html_upload .= "$php_self koaac_kb_upload MSG_2768: kbfullpath=[$kbfullpath] <br>\n";

	$j=0;
        foreach ($_FILES as $file) {
		$j++;
		$file_name=$file['name'];
		$file_tmpname=$file['tmp_name'];
		$file_error=$file['error'];
		$file_size=$file['size'];

		if( $file_name == "" ) { continue; }
//		printf( "$bugs koaac_kb_upload MSG_2778: j=[$j]  file_name=[$file_name] file_tmpname=[$file_tmpname] error=[$file_error] size=[$file_size]<br>\n");
		$html_upload .= "$php_self koaac_kb_upload MSG_2780: j=[$j]  to_filename=[$to_filename] file_error=[$file_error] size=[$file_size]<br>\n";

// upload errors
		switch ($file_error) {
			case 1: 
//				print '<p> 1: bigger upload_max_filesixe in php.ini</p>';
				$html_upload .= "p> 1: bigger upload_max_filesixe in php.ini</p>";
        	                break;  
			case 2: 
//				print '<p> 2: bigger than max_file_size in form</p>';
				$html_upload .= "<p> 2: bigger than max_file_size in form</p>";
				break;  
			case 3: 
//				print '<p> 3: partial upload</p>';
				$html_upload .= "<p> 3: partial upload</p>";
				break;  
			case 4: 
//				print '<p> 4: not uploaded 4</p>'; 
				$html_uplaod .= "<p> 4: not uploaded 4</p>"; 
				break;  
			case 5: 
//				print '<p> 5: upload error 5</p>'; 
				$html_upload .= "<p> 5: upload error 5</p>"; 
				break;  
			case 6: 
//				print '<p> 6:  missing temp folder</p>';
				$html_upload .= "<p> 6:  missing temp folder</p>";
				break;  
			case 7: 
//				print '<p> 7: failed write to disk</p>';
				$html_upload .= "<p> 7: failed write to disk</p>";
				break;  
			case 8: 
//				print '<p> 8:  upload_err_extension</p>';
				$html_upload .= "<p> 8:  upload_err_extension</p>";
				break;  
//			default:
//			print '<p> 0:  unknown upload err</p>';
//             	        break;  
			}       

		$allowedExtensions = array( "txt", "csv", "log", "htm", "html", "xml", "css", "doc", "xls", "rtf", "ppt", "pdf"," swf", "flv", "avi", "wmv", "mov", "jpg", "jpeg", "gif", "png", "pl", "php", "db3", "psv", "xlsx", "docx", "xfdl", "vcf" );

///                if ($file_tmpname > '') { 
///                        if (!in_array(end(explode(".", strtolower($file_name))), $allowedExtensions)) {
///                                die($file_name.' is an invalid file type!<br/>'.
///                                '<a href="javascript:history.go(-1);">'.
///                                '&lt;&lt Go Back</a>');
///                                }       
///                        }       

		$from_filename=$file_name;
		$from_tmp_filename=$file_tmpname;

//		$to_filename = $kbpath_ym_kb . "/".  basename( $file_name ) ;
		$to_filename = $kbfullpath . "/".  basename( $file_name ) ;
//		printf( "$php_self MSG_2840: to_filename=[$to_filename]<br>\n");
		$html_upload .= "$php_self MSG_2840: to_filename=[$to_filename]<br>\n";

//		if( ereg(".brp", $to_filename )) {
//			$orig_filename=$to_filename;
//			$to_filename =str_replace( ".brp", "_brp.txt", $orig_filename );
//			printf( "BUGS_2400:  to_filename=[$to_filename] orig_filename=[$orig_filename]<br>\n" );
//			}


		$path_parts = pathinfo( $upload_filename );
//		$path_parts['dirname'];	
//		$path_parts['basename'];	
//		$path_parts['extension'];	
//		$path_parts['filename'];	

		$from_filename_parts = pathinfo( $from_filename );
		$from_filename_dirname = $from_filename_parts['dirname'];
		$from_filename_basename = $from_filename_parts['basename'];
		$name_ext = $from_filename_parts['basename'];
		$from_filename_extension = $from_filename_parts['extension'];
		$from_filename_filename = $from_filename_parts['filename'];
		$basename = $from_filename_parts['filename'];
	
//		$html_upload .= "BUGS_2700:  from_filename=[$from_filename]<br>\n";
//		$html_upload .= "BUGS_2701:  from_filename_dirname=[$from_filename_dirname]<br>\n";
//		$html_upload .= "BUGS_2702:  from_filename_basename=[$from_filename_basename]<br>\n";
//		$html_upload .= "BUGS_2703:  from_filename_extension=[$from_filename_extension]<br>\n";
//		$html_upload .= "BUGS_2704:  from_filename_filename=[$from_filename_filename]<br>\n";
//		$html_upload .= "BUGS_2705:  basename=[$basename]<br>\n";


		$ok=1;
//		print_r($_FILES);

		$to_pathfile="$kbpath_ym_kb$to_filename";
		$result = move_uploaded_file($from_tmp_filename, $to_filename );
		if( $result == 1 ) {
			$html_upload .= "hr>$php_self ko_upload MSG_2901:  result=[$result] from_tmp_filename=[$from_tmp_filename]<br> to_filename=[$to_filename] to_pathfile=[$to_pathfile]<hr>\n";
			}
		else {
			$html_upload .= "<hr>$php_self ko_upload ERR_2902:  result=[$result] from_tmp_filename=[$from_tmp_filename]<br> to_filename=[$to_filename] to_pathfile=[$to_pathfile]<hr>\n";
			}


//		$html_upload .= "$php_self ko_upload MSG_2718: user=[$user] upload_filename=[$upload_filename]<br>\n";
//		$html_upload .= "$php_self ko_upload MSG_2719: user=[$user] led_filename=[$led_filename]<br>\n";

///		$uploaded_size_limit = 350000;
///		if( $uploaded_size > $uploaded_size_limit ) { 
///			$html_upload .= "$php_self ko_upload ERR: file to big uploaded_size=[$uploaded_size] size_limit=[$uploaded_size_limit]<br/>\n"; 
///			$ok=0; 
///			}

///		if( $uploaded_type == "text/php") { $html_upload .= "$php_self ko_upload ERR: no php<br/>\n"; $ok=0; }
///		if( $uploaded_type == "text/exe") { $html_upload .= "$php_self ko_upload ERR: no exe<br/>\n"; $ok=0; }
///		if( $uploaded_type == "text/bin") { $html_upload .= "$php_self ko_upload ERR: no bin<br/>\n"; $ok=0; }


///		$nofile="nofile";
///		if( file_exists( $nofile )) {
		if( file_exists( $to_filename )) {
///			$syscmd="cd $media_path; /usr/bin/perl $media_path/ko_scrub.pl scrub $to_filename > scrub.log";
///			system( $syscmd );
		
			$html_upload .= "$php_self ko_upload MSG_2930 FOUND to_filename=[$to_filename]<br>\n";

			$scrubfile=$to_filename;
			$html_upload .= "$php_self ko_upload MSG_2631: FOUND to_filename=[$to_filename] name_ext=[$name_ext]<br/>\n"; 

// process gz files
			if( preg_match( "/_skip_gz_uncompress/", $to_filename )) {
				$gunzipfile = str_replace( ".gz", "", $to_filename );
				$scrubfile = str_replace( ".gz", ".txt", $to_filename );
//				print( "$php_self ko_upload MSG_1784: to_filename=[$to_filename] <br/>\n" ); 
//				print( "$php_self ko_upload MSG_1785: gunzipfile=[$gunzipfile] <br/>\n" ); 
//				print( "$php_self ko_upload MSG_1786: scrubfile=[$scrubfile] <br/>\n" ); 
				$syscmd_gunzip = "gunzip $to_filename";
//				print( "$php_self ko_upload MSG_2785: syscmd_gunzip=[$syscmd_gunzip] <br/>\n" ); 
				system( $syscmd_gunzip );
				if( file_exists( $gunzipfile )) {
//					print( "$php_self ko_upload MSG_1800: rename($gunzipfile, $scrubfile) <br/>\n" ); 
					rename( $gunzipfile, $scrubfile );
					}
				else {
					print( "$php_self ko_upload ERR_1800: NOTFOUND gunzipfile=[$gunzipfile]<br/>\n" ); 
					}

				if( file_exists( $scrubfile )) {
//					print( "$php_self ko_upload MSG_1800: FOUND scrubfile=[$scrubfile]<br/>\n" ); 
					}
				else {
					print( "$php_self ko_upload ERR_1800: NOTFOUND scrubfile=[$scrubfile]<br/>\n" ); 
					}
//				exit;
				}	


///			if( file_exists( $scrubfile )) {
			$kludge=1;
			if( $kludge == 0 ) {
				$scrubfile_parts = pathinfo( $to_filename );
				$scrubfile_dirname = $scrubfile_parts['dirname'];
				$scrubfile_basename = $scrubfile_parts['basename'];
				$scrubfile_extension = $scrubfile_parts['extension'];
				$basename=str_replace( $scrubfile_extension, "", $scrubfile_basename );
///				$basename=str_replace( ".", "", $basename );
				$scrubout  = "";
////				$scrubout .= "header('Content-Type: text/html; charset-iso-8859-1');";
////				$scrubout .= "\n\n";
////				$filedata=array();
////				$rownum=0;
////				$fp = fopen( $scrubfile, "r" );
////				while(( $filetext = fgets($fp)) !== false ) {
//					$filedata[] =  $filetext;
////					$scrubout .= $filetext;
///					printf( "BUGS:  filetext=[$filetext]<br>\n" );
////					$rownum++;
////					}
////				fclose($fp);
//				$data = $filedata;
////				$scrubout .= $filedata;
////				print( $scrubout );
////				exit;
//				return;
//				return( $scrubout );
///				print( "$php_self ko_upload MSG_2475: FOUND to_filename=[$to_filename] name_ext=[$name_ext]<br/>\n" ); 

				$html_header=html_header($options);
				$html_btn_squares=html_btn_squares($options);
	
				$html_scrub_done = "<hr>\n";
				$html_scrub_done .= "<body bgcolor=lightblue>\n";


				$scrubfile_path = "/var/www/html/inbox";
				$scrubfile_jobid = str_replace( $scrubfile_extension, "", $scrubfile_basename );
				$results = getfiles( $scrubfile_path, $scrubfile_jobid );	
	
				$to_basename = str_replace( $scrubfile_dirname, "", $to_filename );
				$to_basename = str_replace( "/", "", $to_basename );
				$html_scrub_done .= "$to_basename<br><br>\n";
				foreach( $results as $result ) {
					if( preg_match( "/zip$/", $result )) {
						$html_scrub_done .= "<a href=/inbox/$result target=_blank>$result</a><br>\n";
						}
					else {
						$html_scrub_cond .= "... $result <br>\n";
						}
					}
	
				$html_footer=html_footer();
				$html_kb_links=$html_kb_links($options);
				$html = $html_header . $html_btn_squares . $html_scrub_done . $html_kb_links . $html_footer;
				return( $html );
				}
			else {
///				$html_upload .= "$php_self ko_upload MSG_2787: NOTFOUND to_filename=[$to_filename] to_pathfile=[$to_pathfile]<br/>\n"; 
				}
			}
		else {
			$html_upload .= "$php_self ko_upload ERR_2790: NOTFOUND file_name=[$file_name] file_tmpname=[$file_tmpname] to_filename=[$to_filename] to_pathfile=[$to_pathfile]<br/>\n"; 
//			print( "$php_self ko_upload ERR_2790: NOTFOUND file_name=[$file_name] file_tmpname=[$file_tmpname] to_filename=[$to_filename] to_pathfile=[$to_pathfile]<br/>\n" ); 
			}

                }
//	return( $led_filename );
	return( $html_upload );
	}


function kb_mkdir( $kbpath, $kbid ) {

// /var/www/html/ka1/kb
	$syscmd_mkdir="mkdir $kbpath";
//	print( "$php_self koaac_kb_upload MSG_1711:  kbid=[$kbid] kbpath=[$kbpath] syscmd_mkdir=[$syscmd_mkdir]<hr>\n" );
	if( ! is_dir( $kbpath )) {
		print( "$php_self koaac_kb_upload MSG_1711a:  kbid=[$kbid] NOTFOUND kbpath=[$kbpath]<hr>\n" );
		print( "$php_self koaac_kb_upload MSG_1712:  kbid=[$kbid] syscmd_mkdir=[$syscmd_mkdir]<hr>\n" );
		system( "$syscmd_mkdir" );
		}
	else {
//		print( "$php_self koaac_kb_upload MSG_1713:  kbid=[$kbid] exists syscmd_mkdir=[$syscmd_mkdir]<hr>\n" );
		}

// /var/www/html/ka1/kb/yyyymm
	$kb_ym=substr( $kbid, 0, 6 );
	$kbpath_ym .= "$kbpath/$kb_ym";
	$syscmd_mkdir="mkdir $kbpath_ym";
//	print( "$php_self koaac_kb_upload MSG_1711:  kbid=[$kbid] kbpath_ym=[$kbpath_ym] syscmd_mkdir=[$syscmd_mkdir]<hr>\n" );
	if( ! is_dir( $kbpath_ym )) {
		print( "$php_self koaac_kb_upload MSG_1721a:  kbid=[$kbid] NOTFOUND kbpath_ym=[$kbpath_ym]<hr>\n" );
		print( "$php_self koaac_kb_upload MSG_1722:  kbid=[$kbid] syscmd_mkdir=[$syscmd_mkdir]<hr>\n" );
		system( "$syscmd_mkdir" );
		}
	else {
//		print( "$php_self koaac_kb_upload MSG_1723:  kbid=[$kbid] exists syscmd_mkdir=[$syscmd_mkdir]<hr>\n" );
		}


// /var/www/html/ka1/kb/yyyymm/yyyymmdd_hhmmss/
	$kbpath_ym_kb="$kbpath_ym/$kbid";
	$syscmd_mkdir="mkdir $kbpath_ym_kb";
//	print( "$php_self koaac_kb_upload MSG_1731:  kbid=[$kbid] kbpath_ym_kb=[$kbpath_ym_kb]<hr>\n" );
	if(! is_dir( $kbpath_ym_kb )) {
//		print( "$php_self koaac_kb_upload MSG_560:  kbid=[$kbid] syscmd_mkdir=[$syscmd_mkdir]<hr>\n" );
		system( "$syscmd_mkdir" );
		}
	else {
//		print( "$php_self koaac_kb_upload WARN_2840:  kbid=[$kbid] EXISTS syscmd_mkdir=[$syscmd_mkdir]<hr>\n" );
		}
	return( $kbpath_ym_kb );
	}


function getfiles( $path, $mask ) {
//      print( "getfiles: path=[$path] mask=[$mask] <br>\n" );
        if( file_exists( $path )) {
                $handler = opendir($path);
                while( $file = readdir($handler)) {
                        if ( $file == "." ) { continue; }
                        if ( $file == ".." ) { continue; }
//                      print( "getfiles MSG_035: file=[$file] path=[$path] mask=[$mask] <br>\n" );
                        if ( preg_match( "/^$mask/", $file )) {
//                              print( "getfiles MSG_040:  preg_match file=[$file] mask=[$mask] matches=[$matches]<br>\n" );
                                $results[] = $file;
                                }
                        else {
//                              print( "get_filelsit ERR_040:  preg_match file=[$file] mask=[$mask] matches=[$matches]<br>\n" );
                                }
                        }
                }
        return( $results );
        }


function scrub_view( $options ) {
	$output ="";
	$output .= "<html><title> es scrub view</title><body bgcolor=lightblue>\n";
	$output .= "<hr>$php_self<br/>$dttm<br/>$version<br/>\n";
	$output .= "_SERVER remote_addr=$remote_addr<br/>\n";
	$output .= "_SERVER server_addr=$server_addr<br/>\n";
	$output .= "_SERVER server_name=$server_name<br/>\n";
	$output .= "_SERVER windir=$windir <br/>\n";
	$output .= "<hr></body></html>\n";
	return( $output );
	}

function leds_about( $options ) {
	$dttm=date("Ymd_His");
        $php_self=$_SERVER['PHP_SELF'];
	$remote_addr=$_SERVER['REMOTE_ADDR'];
	$server_addr=$_SERVER['SERVER_ADDR'];
	$server_name=$_SERVER['SERVER_NAME'];
	$windir=$_SERVER['WINDIR'];

	$cygwin = $_ENV['CYGWIN'];
	$os= $_ENV['OS'];
	$username=$_ENV['USERNAME'];
	$processor_architecture=$_ENV['PROCESSOR_ARCHITECTURE'];

	$version = $GLOBALS['version'];

	$hs_type=$_SESSION['hs_type'];
	$org_type=$_SESSION['org_type'];
	$preview=$_SESSION['preview'];

	$output .= "<hr>$php_self<br/>$dttm<br/>$version<br/>\n";
	$output .= "_SERVER remote_addr=$remote_addr<br/>\n";
	$output .= "_SERVER server_addr=$server_addr<br/>\n";
	$output .= "_SERVER server_name=$server_name<br/>\n";
	$output .= "_SERVER windir=$windir <br/>\n";

	$output .= "_ENV username=$username <br/>\n";
	$output .= "_ENV cygwin=$cygwin <br/>\n";
	$output .= "_ENV os=$os <br/>\n";
	$output .= "_ENV processor_architecture=$processor_architecture <br/>\n";

	$output .= "_SESSION hs_type=$hs_type <br/>\n";
	$output .= "_SESSION org_type=$org_type <br/>\n";
	$output .= "_SESSION preview=$preview <br/>\n";
	$output .= "_GLOBALS version=$version <br/>\n";
	$output .= "<hr>\n";

	if($remote_addr == $server_addr ) {
		$user_location="local";
		$server_os = substr( $os, 0, 7 );

		}
	else {
		$user_location="remote";
		}

	$_SESSION['user_location']=$user_location;
	$_SESSION['server_os']=$server_os;

	$output .= "user_location=$user_location<br>\n";
	$output .= "server_os=$server_os<hr>\n"; 
	
//	if(( $user_location == "local" ) & ($server_os == "Windows" )) {
//			$cmd="wi temp.txt";
//			$cmd="i_view32.exe";
//			system( $cmd );
//		}

	return( $output );
//	print( "<hr>BUGS_390 leds_about:  $output<hr>\n" );
//	html_page($options);
//	print( "<hr>\n" );
	}

function leds_phpinfo( $options ) {
	$dttm=date("Ymd_His");
        $php_self=$_SERVER['PHP_SELF'];
	$version = $GLOBALS['version'];
	print( "<hr>$php_self<br/>$dttm<br/>$version<hr>\n" );
	print( "<hr>options=<br>\n" );
	print_r( $options );
	print( "<hr>_REQUEST=<br>\n" );
	print_r( $_REQUEST );
	print( "<hr>_GET=<br>\n" );
	print_r( $_GET );
	print( "<hr>\n" );
#	phpinfo();
	print( "<hr>\n" );
	html_page($options);
	}
function anonymous_option1( $options ) { print( "<hr>\n" ); print_r( $options ); }
function anonymous_option2( $options ) { print( "<hr>\n" ); print_r( $options ); }
function anonymous_option3( $options ) { print( "<hr>\n" ); print_r( $options ); }
function guest_option1( $options ) { print( "<hr>\n" ); print_r( $options ); }
function guest_option2( $options ) { print( "<hr>\n" ); print_r( $options ); }
function guest_option3( $options ) { print( "<hr>\n" ); print_r( $options ); }
function user_option1( $options ) { print( "<hr>\n" ); print_r( $options ); }
function user_option2( $options ) { print( "<hr>\n" ); print_r( $options ); }
function user_option3( $options ) { print( "<hr>\n" ); print_r( $options ); }
function qc_option1( $options ) { print( "<hr>\n" ); print_r( $options ); }
function qc_option2( $options ) { print( "<hr>\n" ); print_r( $options ); }
function qc_option3( $options ) { print( "<hr>\n" ); print_r( $options ); }
function manager_option1( $options ) { print( "<hr>\n" ); print_r( $options ); }
function manager_option2( $options ) { print( "<hr>\n" ); print_r( $options ); }
function manager_option3( $options ) { print( "<hr>\n" ); print_r( $options ); }
function operator_option1( $options ) { print( "<hr>\n" ); print_r( $options ); }
function operator_option2( $options ) { print( "<hr>\n" ); print_r( $options ); }
function operator_option3( $options ) { print( "<hr>\n" ); print_r( $options ); }
function admin_option1( $options ) { print( "<hr>\n" ); print_r( $options ); }
function admin_option2( $options ) { print( "<hr>\n" ); print_r( $options ); }
function admin_option3( $options ) { print( "<hr>\n" ); print_r( $options ); }


function iperms( $options ) { 
	$php_self=$_SERVER['PHP_SELF'];
	$cwd = getcwd();
	$cwd_iperms = "c:/iperms/ko/bin";

	if( $options[1] == "" ) {
		html_page($options);
		print( "<hr>iperms<hr>\n" );
		print( "<a href=$php_self?q=iperms/periods_p>periods_p</a><br/>\n" );
		print( "<a href=$php_self?q=iperms/periods_pp>periods_pp</a><br/>\n" );
//		print( "<br/>\n" );
		print( "<a href=$php_self?q=iperms/job2db>job2db</a><br/>\n" );
		return;
		}

	if( $options[1] == "periods_p" ) {
		$title="<hr>iperms periods_p<hr>\n";
		$cmd="c:/perl/bin/perl.exe iperms.pl periods_p";
		leds_process_psv( $title, $cmd, $cwd_iperms );
		return;
		}

	if( $options[1] == "periods_pp" ) {
		$title="<hr>iperms periods_pp<hr>\n";
		$cmd="c:/perl/bin/perl.exe iperms.pl periods_pp";
		leds_process_psv( $title, $cmd, $cwd_iperms );
		return;
		}

	if(( $options[1] == "job2db" ) & ( $options[2] == "" )) {
		html_page($options);
		print( "<hr>iperms job2db<hr>\n" );
		print( "<a href=$php_self?q=iperms/job2db/mkwl>mkwl</a><br/>\n" );
		print( "<a href=$php_self?q=iperms/job2db/catwl>catwl</a><br/>\n" );
		print( "<a href=$php_self?q=iperms/job2db/runwl>runwl</a><br/>\n" );
		return;
		}

	if(( $options[1] == "job2db" ) & ( $options[2] != "" )) {
		if( $options[2] == "mkwl" ) {
			$title="<hr>iperms job2db mkwl<hr>\n";
			$cmd="c:/perl/bin/perl.exe iperms.pl job2db mkwl";
			leds_process( $title, $cmd, $cwd_iperms );
			}
		if( $options[2] == "catwl" ) {
			$title="<hr>iperms job2db catwl<hr>\n";
			$cmd="c:/perl/bin/perl.exe iperms.pl job2db catwl";
			leds_process( $title, $cmd, $cwd_iperms );
			}

		if( $options[2] == "runwl" ) {
			$title="<hr>iperms job2db runwl<hr>\n";
			$cmd="c:/perl/bin/perl.exe iperms.pl job2db runwl";
			leds_process( $title, $cmd, $cwd_iperms );
			}
		return;
		}
	}


function leds_process( $title, $cmd, $cwd_process ) {
	$php_self=$_SERVER['PHP_SELF'];
	$dttm=date("Ymd_His");
	html_page($options);
	if( $title != "" ) {print( "<hr>$title<hr>\n" ); }
	print( "<hr>$php_self $dttm BEG:  leds_process( $cmd, $cwd_process)<hr>\n" );

	$descriptorspec = array(
		0 => array("pipe", "r"),
		1 => array("pipe", "w"),
		2 => array("file","./ko_error.log","a")
		);
	$process = proc_open( $cmd, $descriptorspec, $pipes, $cwd_process );
	if( is_resource($process)) {
		print( "<hr>\n" );
		$raw_output=stream_get_contents( $pipes[1] );
		$output = explode( "\n", $raw_output );

		$linenum=1;
		print( "<table>\n" );
		foreach( $output as $line ) {
			trim( $line );
			if( $line != "" ) {
				print( "$linenum $line<br />\n" );
				}
			$linenum++;
			}
		print( "<hr>\n" );
		fclose($pipes[1]);
		$return_value=proc_close($process);
		}
	return;
	}

function leds_process_psv( $title, $cmd, $cwd_process ) {
	$php_self=$_SERVER['PHP_SELF'];
	$dttm=date("Ymd_His");
	html_page($options);
	if( $title != "" ) {print( "<hr>$title<hr>\n" ); }
	print( "<hr>$php_self $dttm BEG:  leds_process_psv( $cmd, $cwd_process)<hr>\n" );

	$descriptorspec = array(
		0 => array("pipe", "r"),
		1 => array("pipe", "w"),
		2 => array("file","./ko_error.log","a")
		);
	$process = proc_open( $cmd, $descriptorspec, $pipes, $cwd_process );
	if( is_resource($process)) {
		print( "<hr>\n" );
		$raw_output=stream_get_contents( $pipes[1] );
		$output = explode( "\n", $raw_output );

		$linenum=0;
		print( "<table>\n" );
		foreach( $output as $line ) {
			if( strpos( $line, "select" )) {print( "$line<br/>\n" ); continue;}
			if( strpos( $line, "from" )) {print( "$line<br/><br/>\n" ); continue;}
			if( ! strpos( $line, "|" )) { continue; }
			$flds = explode( "|", $line );
			print( "<tr>\n" );
			foreach( $flds as $fld ) {
				trim( $fld );
				print( "<td>$fld<td>\n" );
				}
			print( "</tr>\n" );
			$linenum++;
			}
		print( "</table>\n" );
		print( "<hr>\n" );
		fclose($pipes[1]);
		$return_value=proc_close($process);
		}
	return;
	}

function leds_process_value( $title, $cmd, $cwd_process ) {
	$php_self=$_SERVER['PHP_SELF'];
	$dttm=date("Ymd_His");
//	html_page($options);
//	if( $title != "" ) {print( "<hr>$title<hr>\n" ); }
//	print( "<hr>$php_self $dttm BEG:  leds_process( $cmd, $cwd_process)<hr>\n" );

	$descriptorspec = array(
		0 => array("pipe", "r"),
		1 => array("pipe", "w"),
		2 => array("file","./ko_error.log","a")
		);
	$process = proc_open( $cmd, $descriptorspec, $pipes, $cwd_process );
	if( is_resource($process)) {
		print( "<hr>\n" );
		$raw_output=stream_get_contents( $pipes[1] );
		$output = explode( "\n", $raw_output );

//		$linenum=1;
//		print( "<table>\n" );
//		foreach( $output as $line ) {
//			trim( $line );
//			if( $line != "" ) {
//				print( "$linenum $line<br />\n" );
//				}
//			$linenum++;
//			}
//		print( "<hr>\n" );
		fclose($pipes[1]);
		$return_value=proc_close($process);
		}
	return( $output );
	}


function newpdo( $dbfile ) {
        $php_self=$_SERVER['PHP_SELF'];
        $http_host=$_SERVER['HTTP_HOST'];
        $request_uri=$_SERVER['REQUEST_URI'];

	if( ! file_exists( $dbfile )) {
		print( "$php_self newpdo ERR_3979:  NOT_EXISTS dbfile=[$dbfile]<br>\n" );
		if( $GLOBALS['install'] != true ) {
			print( "$php_self newpdo ERR:  NOT_INSTALL dbfile=[$dbfile]<br>\n" );
			return;
			}
		else {
			print( "$php_self newpdo MSG:  CREATE dbfile=[$dbfile]<br>\n" );
			}
		}

	try {
		$pdo = null;
		$pdo = new PDO("sqlite:$dbfile" );
		$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//		$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
//		$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
		
		if( $pdo == null ) {
			print( "$php_self newpdo ERR:   dbfile=[$dbfile]<br>\n" );
			return $pdo;
			}
		return $pdo;
		}


	catch(PDOException $e ) {
		$errmsg = $e->getMessage();
		print( "$php_self newpdo ERR:  pdo=[$pdo] dbfile=[$dbfile] errmsg=[$errmsg]<br>\n" );
		$pdo = null;
		return $pdo;
		}
	}


function html_page($options) {

	$html  = "";
	$html .= html_header($options);
	$html .= html_btn_squares($options);

//	$html .= "<hr>$progid $dttm MSG_826 [$html]<hr>\n";

	$html .= leds_show( $options );
//	$html .= html_btn_themes($options,"");
//	$html .= html_btn_roles($options,"");
//	$html .= html_btn_orgs($options,"");
//	$html .= html_btn_hotspots($options,"");
//	$html .= html_footer($options,"");
	print( $html );
	}


function leds_config($options) {
	$php_self=$_SERVER['PHP_SELF'];
	$html = html_header($options);
	$html .= html_btn_squares($options);
	$html .= "<hr>leds_config<hr>\n";
//	$html .= leds_show( $options );

	$html .= html_btn_preview($options,"");
	$html .= html_btn_themes($options,"");
	$html .= html_btn_roles($options,"");
	$html .= html_btn_orgs($options,"");
	$html .= html_btn_hotspots($options,"");


	$html .= html_footer($options);
	print( $html );
//	$location_url="$http_host$php_self?q=config";
//	header( 'Location:'.$location_url );	

	}
function html_btn_hotspots($options, $callback) {
	$php_self=$_SERVER['PHP_SELF'];
	$query_string=$_SERVER['QUERY_STRING'];
	$path_btn="./imgs/btn";
	$path_ani="./imgs/ani";
	$output = "<hr>\n";
//	$hotspots_list="none all grid us hw n11";
	$hotspots_list="all grid us hw n11";
	$hs_type=$_SESSION['hs_type'];

//	$hotspots=split( " ", "none all grid us hw n11" );
	$hotspots=split( " ", "all grid us hw n11" );
	$output .= "<hr><b>hotspots</b> $hs_type: &nbsp &nbsp &nbsp\n";
	foreach( $hotspots as $hotspot ) {	
		$btn_hs="$path_btn/btn_$hotspot.gif"; $btn_width=15; $btn_height=15;
		if( $hs_type == $hotspot ) { $btn_width=30; $btn_height=30; }
//		$output .= "<a href=$php_self?q=hs_$hotspot>\n";\
		if( $callback ) {
			$hs_callback = str_replace( "\$hs", "$hotspot", $callback );
			$output .= "<a href=$php_self?q=set/hs/$hotspot&callback=$hs_callback>\n";
			}
		else {
			$output .= "<a href=$php_self?q=set/hs/$hotspot>\n";
			}

		$output .= "<img src=\"$btn_hs\" alt=\"$btn_hs\" border=0 height=\"$btn_width\" width=\"$btn_height\" />";
		$output .= "</a> \n";
		$output .= " &nbsp &nbsp\n ";
		}
	$output .= "<br>\n";

	if(( ! isset( $_SESSION['grid_zoom'] )) || ( $_SESSION['grid_zoom'] == "" )) {
//		$_SESSION['grid_zoom'] = true;
//		$output .= "<a href=$php_self?q=set/grid_zoom&callback=$query_string>\n";
		$output .= "<a href=$php_self?q=set/grid_zoom/false&callback=$php_self?$query_string>\n";
		$output .= "<img src=\"$path_btn/btn_black.gif\" alt=\"btn_white\" border=0 height=\"20\" width=\"20\" />";
		$output .= "</a>\n";
		}
//	if(( isset( $_SESSION['role'] )) && ( ! $_SESSION['role'] == "" )) {
	else {
//		unset( $_SESSION['grid_zoom'] );
//		$output .= "<a href=$php_self?q=$query_string>\n";
//		$output .= "<a href=$php_self?q=set/grid_zoom&callback=$query_string>\n";
		$output .= "<a href=$php_self?q=set/grid_zoom/true&callback=$php_self?$query_string>\n";
		$output .= "<img src=\"$path_btn/btn_white.gif\" alt=\"btn_white\" border=0 height=\"20\" width=\"20\" />";
		$output .= "</a>\n";
		}


	$output .= "\n";



	return( $output );
	}

function html_btn_orgs($options, $callback) {
	$php_self=$_SERVER['PHP_SELF'];
	$path_btn="./imgs/btn";
	$path_ani="./imgs/ani";

	$orgs_list="a e h o p t";
	$org_type=$_SESSION['org_type'];
	$orgs=split( " ", $orgs_list );
	$output .= "<hr><b>orgs</b> $org_type: &nbsp &nbsp &nbsp\n";
	foreach( $orgs as $org ) {	
		$btn_org="btn_$org.gif"; $btn_width=15; $btn_height=15;
		if( $org_type == $org ) { $btn_width=30; $btn_height=30; }
//		$output .= "<a href=$php_self?q=org_$org>\n";
//		$output .= "<a href=$php_self?q=set/org/$org>\n";
		if( $callback != "" ) {
			$output .= "<a href=$php_self?q=set/org/$org&callback=$callback>\n";
			}
		else {
			$output .= "<a href=$php_self?q=set/org/$org&callback=$callback>\n";
			}
		$output .= "<img src=\"$path_btn/$btn_org\" alt=\"$btn_org\" border=0 height=\"$btn_width\" width=\"$btn_height\" />";
		$output .= "</a> \n";
//		$output .= "&nbsp &nbsp";
		}
	return( $output );
	}

function html_btn_preview($options, $callback) {
	$php_self=$_SERVER['PHP_SELF'];
	$path_btn="./imgs/btn";
	$path_ani="./imgs/ani";
	$preview=$_SESSION['preview'];

	$output .= "<hr><b>preview</b> $preview: &nbsp &nbsp &nbsp\n";

	$previews_list="on off";
	$preview_on="on";
	$preview_off="off";

	if( $preview == $preview_on ) {
		$btn_preview="$path_ani/ani_grn00.gif"; $btn_width=15; $btn_height=15;
		$output .= "<a href=$php_self?q=set/preview/$preview_off&callback=$callback>\n";
		}
	else {
		$btn_preview="$path_ani/ani_red00.gif"; $btn_width=15; $btn_height=15;
		$output .= "<a href=$php_self?q=set/preview/$preview_on&callback=$callback>\n";
		}


	$output .= "<img src=\"$btn_preview\" alt=\"$btn_preview\" border=0 height=\"$btn_width\" width=\"$btn_height\" />";
	$output .= "</a> \n";
	return( $output );
	}

function html_btn_roles($options, $callback) {
	$php_self=$_SERVER['PHP_SELF'];
	$path_btn="./imgs/btn";
	$path_ani="./imgs/ani";

	$roles_list="admin local op mgr user anon";
	$role_type=$_SESSION['role'];
///	if(( $role_type != "admin" ) && ( $role_type != "local" ) && ( $role_type != "op" )) { return; }
	$roles=split( " ", $roles_list );
//	$output .= "<hr><b>roles</b> $role_type:\n";
	$output .= "<hr><b>roles</b> $role_type: &nbsp &nbsp &nbsp\n";
	foreach( $roles as $role ) {	
		$btn_role="btn_$role.gif"; $btn_width=15; $btn_height=15;
		if( $role_type == $role ) { $btn_width=20; $btn_height=20; }
//		$output .= "<a href=$php_self?q=set_role/$role>\n";
//		$output .= "<a href=$php_self?q=set/role/$role>\n";
		if( $callback ) {
			$output .= "<a href=$php_self?q=set/role/$role&callback=$callback>\n";
			}
		else {
			$output .= "<a href=$php_self?q=set/role/$role>\n";
			}
		$output .= "<img src=\"$path_btn/$btn_role\" alt=\"$btn_role\" border=0 height=\"$btn_width\" width=\"$btn_height\" />";
		$output .= "</a> \n";
		$output .= " &nbsp &nbsp ";
		}
	return( $output );
	}

function html_btn_themes($options, $callback) {
	$http_host=$_SERVER['HTTP_HOST'];
	$php_self=$_SERVER['PHP_SELF'];
	$themes=$GLOBALS['themes'];
	$default_theme=$themes[0];
	$current_theme=$_SESSION['theme'];
	$path_btn="./imgs/btn";
	$path_ani="./imgs/ani";

//	$html_theme_links  ="";
//	$html_theme_links .= "<a href=\"http://$http_host$php_self\"><b><img src=\"images/btn/btn_black.gif\"></a> &nbsp\n";
	$html_theme_links  = "<div id=\"themes\"\n";
	$html_theme_links .= "<hr><b>themes:</b> $current_theme<br>\n";
	foreach( $themes as $theme ) {
		$theme_abrev=substr( $theme, 0, 2 );
		if( $current_theme == $theme ) {
//			$html_theme_links .= "<a href=\"http://$http_host$php_self?q=set_theme/$theme\" alt=$theme>";
			if( $callback ) {
				$html_theme_links .= "<a href=$php_self?q=set/theme/$theme&callback=$callback alt=$theme>\n";
				}
			else {
				$html_theme_links .= "<a href=\"http://$http_host$php_self?q=set/theme/$theme\" alt=$theme>";
				}
//			$html_theme_links .= "<b>$theme_abrev</b></a> &nbsp\n";
			$html_theme_links .= "<img src=\"images/btn/btn_theme_$theme".".gif\" border=0 height=100>";
			$html_theme_links .= "<font size=3>$theme</font></a> &nbsp\n";
			}
		else {
//			$html_theme_links .= "<a href=\"http://$http_host$php_self?q=set_theme/$theme\" alt=$theme>";
//			$html_theme_links .= "<a href=\"http://$http_host$php_self?q=set/theme/$theme\" alt=$theme>";
			if( $callback != "" ) {
				$html_theme_links .= "<a href=$php_self?q=set/theme/$theme&callback=$callback alt=$theme>\n";
				}
			else {
				$html_theme_links .= "<a href=$php_self?q=set/theme/$theme alt=$theme>\n";
				}
//			$html_theme_links .= "$theme_abrev</a> &nbsp\n";
			$html_theme_links .= "<img src=\"images/btn/btn_theme_$theme".".gif\" border=0 height=50>";
			$html_theme_links .= "<font size=2>$theme</font></a> &nbsp\n";
			}
		}
	$html_theme_links .= "<hr>\n";
	$html_theme_links .= "</div>\n";
	return( $html_theme_links);
	}


function scrub_show($options) {
	$html = "";
	$html .= leds_show( $options );

	$dttm=date("Ymd_His");
        $php_self=$_SERVER['PHP_SELF'];
        $http_host=$_SERVER['HTTP_HOST'];
        $request_uri=$_SERVER['REQUEST_URI'];
	$preview=$_SESSION['preview'];
	$path_btn="./imgs/btn";
	$path_ani="./imgs/ani";
	$path_fpb="./imgs/fpb";

//	printf( "<hr>$php_self $dttm ERR_1058:  UNAVAILABLE dbfile=[".$GLOBALS['dbfile']."]<hr>\n"); 
	if( ! file_exists( $GLOBALS['dbfile'] )) {
//		printf( "<hr>$php_self $dttm ERR:  UNAVAILABLE dbfile=[".$GLOBALS['dbfile']."]<hr>\n"); 
		$html .= "<hr>$php_self $dttm ERR:  UNAVAILABLE dbfile=[".$GLOBALS['dbfile']."]<hr>\n";
		return;
		}
//	else {
//		printf( "<hr>$php_self $dttm MSG_1025:  FOUND dbfile=[".$GLOBALS['dbfile']."]<hr>\n"); 
//		}
//	$testfile="/var/www/html/ka1/es.db3";
//	$testfile="/var/www/html/index.php";

	
///	$html .= html_btn_footer($options);
	$html .= "<hr>\n";
	$html .= html_footer();
///	echo $html;
///	printf( "BUGS_1043<hr>\n" );
	return( $html );

	}


function leds_show( $options ) {
//	$output = html_header();

	$dttm=date("Ymd_His");
        $php_self=$_SERVER['PHP_SELF'];
        $http_host=$_SERVER['HTTP_HOST'];
        $request_uri=$_SERVER['REQUEST_URI'];
	$preview="";
	if( isset($_SESSION['preview'])) { $preview=$_SESSION['preview']; }
	$path_btn="./imgs/btn";
	$path_ani="./imgs/ani";
	$path_fpb="./imgs/fpb";
	$path_fpb="./imgs/cab";

//	printf( "BUGS_4017 path_fpb=[$path_fpb]<br>\n" );
//	print_r($options);
//	$option_len=count($options);
//	$option_len=0;
//	print( "<h1>BUGS_11500 option_len=$option_len options=$options</h1>" );

	if( isset($options[1])) { $options1=$options[1]; }
	if( isset($options[2])) { $options2=$options[2]; }
	if( isset($options[3])) { $options3=$options[3]; }
	if( isset($options[4])) { $options4=$options[4]; }
	if( isset($options[5])) { $options5=$options[5]; }
//	if( count($options) > 0 ) {$option1=$options[1]; }
//	if( count($options) > 1 ) {$option2=$options[2];}
//	if( count($options) > 2 ) {$option3=$options[3];}
//	if( count($options) > 3 ) {$option4=$options[4]; }
//	if( count($options) > 4 ) {$option5=$options[5]; }
//	$dbfile=""; $output=""; $dbfile="ko_center/ko_center.db3";

	$dbfile=""; $output=""; $dbfile="ko.db3";
	if( isset( $GLOBALS['dbfile'] )) { $dbfile=$GLOBALS['dbfile']; }
	if( ! file_exists( $dbfile )) {
		printf( "<h1>$php_self $dttm ERR:  UNAVAILABLE dbfile=$dbfile</h1>\n"); 
		$output .= "<hr>$php_self $dttm ERR:  UNAVAILABLE dbfile=$dbfile<hr>\n";
		return;
		}
//	$output .= "<hr>leds_show<hr>\n";
//	printf( "<hr>leds_show_6330<hr>\n" );


	$dttm=date( "Ymd_His" );
        $today = mktime( 0,0,0, date("m"), date("d"), date("y"));                                                                   
//	$tomorrow = mktime( 0,0,0, date("m"), date("d")+1, date("y"));                                                              
//	$yesterday = mktime( 0,0,0, date("m"), date("d")-1, date("y"));                                                             
	$htmout = "";
//	$htmout .= '<p style="font-family:yokkmokkOT;font-size:120px;font-style:italic;">';
	$htmout .= '<p style="font-family:arial;font-size:20px;">';

	$htmout .= "<a href=/index.html target=_blank><img src=ko.png height=20 ></a>\n";
	$htmout .= "ko $dttm 11500";
	$htmout .= "</p>";
	print( $htmout );

	$GLOBALS['dbfile']="ko.db3";
	$GLOBALS['tblname']="leds";
	if( isset( $GLOBALS['dbfile'] )) {
		$dbfile= $GLOBALS['dbfile']; 
		$pdo = newpdo($GLOBALS['dbfile']);
		}

	if( isset( $GLOBALS['tblname'])) {
		$tblname=$GLOBALS['tblname'];
		}

	$sql = "select * from $tblname";
	$sql = "select * from $tblname where led_dttm == 'current'";
	if(( isset( $_REQUEST['led_type'] )) && ( ! $_REQUEST['led_type'] == "" )) {
		$led_type = $_REQUEST['led_type'];
		$sql = "select * from $tblname where led_dttm == 'current' and led_type == '$led_type'";
		} 

//	print( "$php_self MSG_11580: dbfile=[$dbfile] tblname=[$tblname] sql=[$sql] led_type=[$led_type]<br>\n");
	return;
//	phpinfo();
	$collim=8;
	$collim=24;
	$colnum=1;
	foreach( $pdo->query($sql) as $row ) {

		$led_output = 
			$row['led_name'] . ' - ' .
			$row['led_dttm'] . ' - ' .
			$row['led_color' ] . ' - ' .
			$row['led_speed' ] . ' - ' .
			$row['led_type' ] . ' - ' .
			$row['led_date' ] . ' - ' .
			$row['led_cmd' ] . ' - ' .
			$row['led_desc' ] . ' - ' .
			$row['led_misc' ] . ' - ' .
			' <br />';

///		print( "MSG_5360: option1=[$option1] cab=[$cab] sql=[$sql] colnum=$colnum collim=$collim<br>led_output=[$led_output]<hr>\n" );

		if( $row['led_type'] == "date" ) {
			$mydt_yyyymd=$row['led_date'];
			if( $mydt_yyyymd == "current" ) {
				$mydt=$today;
				$mydt_yyyy=date("Y");
				$mydt_m=date("m");
				$mydt_d=date("d");
				}
			else {
				$mydt_yyyy=substr( $mydt_yyyymd, 0, 4 );
				$mydt_m=substr( $mydt_yyyymd, 4, 2 );
				$mydt_d=substr( $mydt_yyyymd, 6, 2 );
				}
//			print( "BUGS mydt_yyyymd=[$mydt_yyyymd] mydt_m=[$mydt_m][$mydt_d][$mydt_yyyy]<br>\n" );
			$mydt=mktime( 0,0,0, $mydt_m, $mydt_d, $mydt_yyyy );
			$diffdays=datediff( 'd', $today, $mydt );
			$leds_properties=datediff_leds( $diffdays);
			$diffdays=$leds_properties[0];
			$color=$leds_properties[1];
			$speed=$leds_properties[2];
			$ledimg = "$path_ani/ani_" . $color . $speed . ".gif";
			}
		else {
			if( $row['led_type'] == "cmd" ) {
				$ledimg = "$path_ani/ani_" . $row['led_color'] . $row['led_speed'] . ".gif";
////				if( $row['led_cmd'] == "pwd" ) { $cmdout= system( "pwd" ); }
////				$cmdout=system( $row['led_cmd'] );
				$cmd_code=$row['led_cmd'];
				$led_cmd="";
				$cmdout[0]="";
				if( $cmd_code == "pwd" ) { $led_cmd = "pwd"; }
				if( $cmd_code == "date" ) { $led_cmd = "date"; }
//				if( $cmd_code == "dir" ) { $led_cmd = "ls -lat c:/xampp/htdocs/hrc/fp/fp*.php"; }
				if( $cmd_code == "dir" ) { $led_cmd = "ls"; }
				if( $cmd_code == "dir" ) { $led_cmd = "ps -W | grep SSH "; }
				if( $cmd_code == "pwd" ) { $led_cmd = "ps -W | grep ssh "; }
				if( $cmd_code == "ls" ) { $led_cmd = "ls"; }
//				$led_cmd=$row['led_cmd'];
				if( $led_cmd != "" ) {
					$cmdout=leds_process_value( "", $led_cmd, $cmd_process );
					};
				if( $cmdout[0] == "" ) {
					$color="red"; $speed="90";
					}
				else {
					$color="grn"; $speed="90";
					}
				$ledimg = "$path_ani/ani_$color$speed.gif";
				}
			else {
				$ledimg = "$path_ani/ani_" . $row['led_color'] . $row['led_speed'] . ".gif";
				}
			}

		$fpnam = $row['led_name'];
		$fpbnam = str_replace( "fp", "fpb", $fpnam );
		$fpbimg = "$path_fpb/" . $fpbnam . ".png";
		$fpbimg = "$path_fpb/tn/tn_" . $fpbnam . ".png";
//		$fpbimg_default = "$path_fpb/fpb00.png";
		$fpbimg_default = "$path_fpb/preview_default.png";
		$fpbimg_default_cmd = "$path_fpb/preview_default_cmd.png";
		$fpbimg_default_date = "$path_fpb/preview_default_date.png";
		$fpb_title = $row['led_name'] . "(";
		$fpb_title .= $row['led_title'] .") ";

//		print( "<hr>BUGS_4130 cab=[$cab] sql=[$sql] path_fpb=[$path_fpb] preview=[$preview][". $_SESSION['preview'] . "]<hr>\n" );
		if(( $row['led_type'] == "manual" ) | ( $row['led_type'] == "" )) {
			$fpb_title .= " (" . $row['led_color'] . $row['led_speed'] . ")(";
			$fpb_title .= " bldg(";
			$fpb_title .= $row['led_bldg'] .") floor(";
			$fpb_title .= $row['led_floor'].")";
			}


		if( $row['led_type'] == "date" ) {
			$fpbimg_default = $fpbimg_default_date;
			$fpb_title .= "($color$speed)";
			$fpb_title .= " date(";
			$fpb_title .= $row['led_date'] .") diffdays($diffdays)";
			}
		if( $row['led_type'] == "cmd" ) {
			$fpbimg_default = $fpbimg_default_cmd;
			$fpb_title .= "($color$speed)";
			$fpb_title .= " cmd(";
			$fpb_title .= $row['led_cmd'] .")($led_cmd) cmdout(". $cmdout[0]. ")";

///			$fpb_title .= $row['led_cmd'] .") cmdout(" ;
///			print( "BUGS_1125 [$cmd_code][$led_cmd]<br>\n" );
///			print( "BUGS_1125 cmdout0=[$cmdout[0]]<br>\n" );
///			print( "BUGS_1125 cmdout1=[$cmdout[1]]<br>\n" );
///			print( "BUGS_1125 cmdout2=[$cmdout[2]]<br>\n" );
///			foreach( $cmdout as $cmdline ) {
///				print( "BUGS_1129 cmdline=[$cmdline][$fbp_title]<br>\n" );
///				$fpb_title .= $cmdline ."<br>\n";
///				}
///			$fpb_title .= ")<hr>";
//			$fpb_title .= $row['led_cmd'] .") cmdout(". $row['led_cmdout'] . ")";
			}



		if( $row['led_type'] == "null" ) {
			$ledimg="led_null.png";
			$ledimg = "$path_ani/ani_null.gif";
			}

		$output .= "<a href=$php_self?q=detail/".$row['led_name']." ";

//		$preview = "off";
		if( $preview == "on" ) {
			if( $GLOBALS['screenshots_pcharts'] != "" ) {
				$host="l1033"; $path="/var"; $used=rand(1,100); $free=rand(1,900);
				$pchart_title="$dttm p=$path u=$used f=$free";
				$pchart_url="/ka1/ko_pcharts_pie.php?q=df/$host/$host/$used/$free";
				$output .= " class=\"screenshot\" rel=\"$pchart_url\" title=\"$pchart_title\" "; 
				}
			else {
				if( file_exists( $fpbimg )) {
					$output .= " class=\"screenshot\" rel=\"$fpbimg\" title=\"$fpb_title\" width=100 "; 
//					$output .= " class=\"preview\" rel=\"$fpbimg\" title=\"$fpb_title\" "; 
					}
				else {
					$output .= " class=\"screenshot\" rel=\"$fpbimg_default\" title=\"$fpb_title\" "; 
					}
				}
			}

		$output .= ">\n";

		if( preg_match( "/ka1/", $fpbnam, $matches )) {

///			$output .= "<div id=\"drag\">\n";
///			$output .= "<div class=\"drg\" id=\"$ledcode\">\n";
			$output .= "<img src=\"$ledimg\" alt=\"$ledimg\" border=0 height=\"20\" width=\"20\" />";
			$output .= "</a>\n";
////			$output .= "</div>\n";
///			$output .= "</div>\n";
			}
		else {
			$output .= "<img src=\"$ledimg\" alt=\"$ledimg\" border=0 height=\"15\" width=\"15\" />";
			$output .= "</a>\n";
			}


//		$output .= "<!-- fpbimg=$fpbimg fpbnam=[$fpbnam]-->\n";
//		$output .= "<a href=$fpbimg>$fpbimg<img src=$fpbimg></a>\n";

		if(( preg_match( "/ka1t/", $fpbnam, $matches ))
		|| ( preg_match( "/nl/", $fpbnam, $matches ))
		|| ( preg_match( "/pl/", $fpbnam, $matches ))
		|| ( preg_match( "/ql/", $fpbnam, $matches ))
		|| ( preg_match( "/tl/", $fpbnam, $matches ))
		|| ( preg_match( "/vl/", $fpbnam, $matches ))
		|| ( preg_match( "/xl/", $fpbnam, $matches ))
		|| ( preg_match( "/vio/", $fpbnam, $matches ))
		|| ( preg_match( "/data/", $fpbnam, $matches ))) {
			$output .= "<br />\n";
			$colnum=1;
			}	
		else {
//			if( $colnum == 12 ) { $output .= " &nbsp &nbsp _ &nbsp &nbsp "; }

			if(( preg_match( "/al/", $fpbnam, $matches ))
			|| ( preg_match( "/cl/", $fpbnam, $matches ))
			|| ( preg_match( "/el/", $fpbnam, $matches ))
			|| ( preg_match( "/gl/", $fpbnam, $matches ))
			|| ( preg_match( "/il/", $fpbnam, $matches ))
			|| ( preg_match( "/kl/", $fpbnam, $matches ))
			|| ( preg_match( "/ml/", $fpbnam, $matches ))
			|| ( preg_match( "/ol/", $fpbnam, $matches ))
			|| ( preg_match( "/ql/", $fpbnam, $matches ))
			|| ( preg_match( "/sl/", $fpbnam, $matches ))
			|| ( preg_match( "/ul/", $fpbnam, $matches ))) {
				$output .= "&nbsp - &nbsp \n";
				}
			$colnum=$colnum+1;
			if( $colnum > $collim ) {
				$output .= "<br />\n";
				$colnum=1;
				}
			}
		}

	$output .= "</div>\n";

	$output .= "<hr>\n";
////	$output .= "BUGS_5540<br>\n";

	$output .= "<a href=$php_self?q=kb target=_blank>\n";
	$output .= "<img src=\"$path_btn/kbbooks.png\" alt=\"kb\" border=0 height=\"50\" width=\"50\" />";
	$output .= "</a>\n";
	$output .= "&nbsp &nbsp &nbsp \n";

	$output .= "<a href=/ka1/ka1.php?q=reports><img src=./imgs/btn/reports.png border=0 height=50 width=50 alt=reports></a>\n";
	$output .= "&nbsp &nbsp &nbsp \n";

	$output .= "<a href=$php_self?q=hosts><img src=./imgs/btn/datacall.png border=0 height=50 width=50 alt=datacall></a>\n";

	$output .= "<a href=$php_self?q=ko_plans><img src=./imgs/btn/whatsyourplan.png border=0 height=50 width=50 alt=plans></a>\n";
//      $output .= "<a href=$php_self?q=ko_plans><img src=./imgs/btn/plan.png border=0 height=50 width=50 alt=plans></a>\n";
//     	$output .= "<a href=$php_self?q=ko_plans><img src=./imgs/btn/plan2.jpg border=0 height=50 width=50 alt=plans></a>\n";
//     	$output .= "<a href=$php_self?q=ko_plans><img src=./imgs/btn/plan_hands.jpg border=0 height=50 width=50 alt=plans></a>\n";
//     	$output .= "<a href=$php_self?q=ko_plans><img src=./imgs/btn/plans_toon.jpg border=0 height=50 width=50 alt=plans></a>\n";
//     	$output .= "<a href=$php_self?q=ko_plans><img src=./imgs/btn/scenario_planning.jpg border=0 height=50 width=50 alt=plans></a>\n";

      	$output .= "<hr>\n";

	$pdo = null;


	if(! isset($_SESSION['hs_type'] )) { 	$hs_type="default"; }
	else {$hs_type=$_SESSION['hs_type'];}

	if(! isset($_SESSION['org_type'] )) { 	$org_type="p"; }
	else {$org_type=$_SESSION['org_type'];}

///	$osteams="hpx aix sol rhe win uss ioc aac"

//	js_rollover( $options );
//	css_rollovers_href( $options );
//	js_fgmenu( $options );

//	print( $output );

//	$output .= html_btn_footer($options);


	$tblname="shelves";
	$tblname="ko_hw";
	$cabid= str_replace( "cab_", "", $option1);
	$sql = "select * from $tblname where cab == '$cabid'";
//		$fpbnam = str_replace( "fp", "fpb", $led_name );



	$collim=8;
	$collim=24;
	$colnum=1;
//	if( $cabid == "" ) { return; }
	$dbfile=$GLOBALS['dbfile'];
//	printf( "BUGS_5560 sql=[$sql] cabid=[$cabid] dbfile=[$dbfile]<hr>\n" );
	$pdo = newpdo($GLOBALS['dbfile']);
	$j=0;
	foreach( $pdo->query($sql) as $row ) {
		$j++;
		$item=$row['item'];
		$model=$row['model'];
		$item_png="./imgs/cab/".$item.".png";
		$alt="";

//		printf( "BUGS_5568 j=$j sql=[$sql] item_png=[$item_png] item=[$item]<br>\n" );
		if( file_exists( $item_png )) {
			$im_flds = im_identify( $item_png );
			$im_color=$im_flds[6];
			$im_width=$im_flds[8];
			$im_height=$im_flds[9];
			$im_size=$im_flds[10];
			$alt="alt=\" $im_width $im_height $im_size $im_color\"";
//			printf( "BUGS_5580: FOUND j=$j alt=[$alt] sql=[$sql] item_png=[$item_png] item=[$item]<br>\n" );
			}


//		printf( "BUGS_4331 item=[$item] item_png=$item_png<br>\n" );
// cab|zone|grp|vendor|item|cab1|zone1|grp1|btu|watts|amps|vac|height|width|depth|weight|spectext
		$led_output = "";
		if( $item_png != "" ) {
			$led_output .= "<a href=https://$http_host/$php_self?q=item/$item>";
			$led_output .= "<img src=". $item_png . " width=100 alt=$alt >";
			$led_output .= "</a>\n";
			}

		$led_output .= 
			$row['cab'] . ' - ' .
			$row['zone'] . ' - ' .
			$row['grp' ] . ' - ' .
			$row['vendor' ] . ' - ' .
			$row['item' ] . ' - ' .
			$row['cab1' ] . ' - ' .
			$row['zone1' ] . ' - ' .
			$row['grp1' ] . ' - ' .
			$row['btu' ] . ' - ' .
			$row['watts' ] . ' - ' .
			$row['amps' ] . ' - ' .
			$row['vac' ] . ' - ' .
			$row['height' ] . ' - ' .
			$row['width' ] . ' - ' .
			$row['depth' ] . ' - ' .
			$row['weight' ] . ' - ' .
			$row['spectext' ];
//			'<img src='. $item_png . ' height=50 alt=$alt>' .
//			' <br />';
//		printf( "$led_output<hr>\n" );
//		printf( "MSG_5611: led_output=$led_output<br>\n" );
		}
	$pdo=null;

	$output .= $led_output;
////	printf( "MSG_5618: led_output=$led_output output=[$output]<br>\n" );
////	$output .= html_dc_links($options);
///	$output .= leds_zm5($options);
	$output .= html_footer();
	return( $output );
	}


function leds_zm5($options) {
	$output = "<hr>\n";
//	$output .= "<a href=$php_self?q=zm5/row01>\n";
//	$output .= "<img src=images/cab/row01.png>\n";

//	$output .= "<a href=zm5/index.htm><img src=images/cab/tn_hrc_zm5.png alt=hrc_zm5></a>";
//	$output .= "<a href=zm5/hrc_c.htm><img src=images/cab/tn/tn_hrc_zm5.png alt=hrc_zm5></a>";

//	$output .= "<a href=zm5/hrc_cr01c00.htm><img width=%5 src=images/cab/tn/tn_hrc_cr01c00.png alt=hrc_cr01c00></a>";
//	$output .= " &nbsp &nbsp ";
	$output .= "<a href=zm5/hrc_dr13d09.htm><img width=%5 src=images/cab/tn/tn_hrc_dr13d09.png alt=hrc_dr13d09></a>";
	$output .= "<br>\n";

	$output .= "<a href=zm5/hrc_cr03c12.htm><img width=%5 src=images/cab/tn/tn_hrc_cr03c12.png alt=hrc_cr03c12></a>";
	$output .= " &nbsp &nbsp ";
	$output .= "<a href=zm5/hrc_dr14d12.htm><img width=%5 src=images/cab/tn/tn_hrc_dr14d12.png alt=hrc_dr14d12></a>";
	$output .= "<br>\n";
	$output .= "<a href=zm5/hrc_cr04c17.htm><img width=%5 src=images/cab/tn/tn_hrc_cr04c17.png alt=hrc_cr04c17></a>";
	$output .= " &nbsp &nbsp ";
	$output .= "<a href=zm5/hrc_dr15d17.htm><img width=%5 src=images/cab/tn/tn_hrc_dr15d17.png alt=hrc_dr15d17></a>";
	$output .= "<br>\n";
	$output .= "<a href=zm5/hrc_cr05c20.htm><img width=%5 src=images/cab/tn/tn_hrc_cr05c20.png alt=hrc_cr05c20></a>";
	$output .= " &nbsp &nbsp ";
	$output .= "<a href=zm5/hrc_dr16d20.htm><img width=%5 src=images/cab/tn/tn_hrc_dr16d20.png alt=hrc_dr16d20></a>";
	$output .= "<br>\n";
	$output .= "<a href=zm5/hrc_cr06c26.htm><img width=%5 src=images/cab/tn/tn_hrc_cr06c26.png alt=hrc_cr06c26></a>";
	$output .= " &nbsp &nbsp ";
	$output .= "<a href=zm5/hrc_dr17d26.htm><img width=%5 src=images/cab/tn/tn_hrc_dr17d26.png alt=hrc_dr17d26></a>";
	$output .= "<br>\n";
	$output .= "<a href=zm5/hrc_cr07c29.htm><img width=%5 src=images/cab/tn/tn_hrc_cr07c29.png alt=hrc_cr07c29></a>";
	$output .= " &nbsp &nbsp ";
	$output .= "<a href=zm5/hrc_dr18d29.htm><img width=%5 src=images/cab/tn/tn_hrc_dr18d29.png alt=hrc_dr18d29></a>";
	$output .= "<br>\n";
	$output .= "<a href=zm5/hrc_cr08c34.htm><img width=%5 src=images/cab/tn/tn_hrc_cr08c34.png alt=hrc_cr08c34></a>";
	$output .= " &nbsp &nbsp ";
	$output .= "<a href=zm5/hrc_dr19d34.htm><img width=%5 src=images/cab/tn/tn_hrc_dr19d34.png alt=hrc_dr19d34></a>";
	$output .= "<br>\n";
	$output .= "<a href=zm5/hrc_cr09c37.htm><img width=%5 src=images/cab/tn/tn_hrc_cr09c37.png alt=hrc_cr09c37></a>";
	$output .= " &nbsp &nbsp ";
	$output .= "<a href=zm5/hrc_dr20d37.htm><img width=%5 src=images/cab/tn/tn_hrc_dr20d37.png alt=hrc_dr20d37></a>";
	$output .= "<br>\n";
	$output .= "<a href=zm5/hrc_cr10c42.htm><img width=%5 src=images/cab/tn/tn_hrc_cr10c42.png alt=hrc_cr10c42></a>";
	$output .= " &nbsp &nbsp ";
	$output .= "<a href=zm5/hrc_dr21d42.htm><img width=%5 src=images/cab/tn/tn_hrc_dr21d42.png alt=hrc_dr21d42></a>";
	$output .= "<br>\n";
	$output .= "<a href=zm5/hrc_cr11c45.htm><img width=%5 src=images/cab/tn/tn_hrc_cr11c45.png alt=hrc_cr11c4cr11c45></a>";
	$output .= " &nbsp &nbsp ";
	$output .= "<a href=zm5/hrc_dr22d45.htm><img width=%5 src=images/cab/tn/tn_hrc_dr22d45.png alt=hrc_dr22d45></a>";
	$output .= "<br>\n";
	$output .= "<a href=zm5/hrc_cr12c51.htm><img width=%5 src=images/cab/tn/tn_hrc_cr12c51.png alt=hrc_cr12c51></a>";
	$output .= " &nbsp &nbsp ";
	$output .= "<br>\n";
	$output .= "<a href=zm5/hrc_d.htm><img src=images/cab/tn_hrc_d.png alt=hrc_d></a>";
	$output .= "<hr>\n";
	return( $output );
	}


function html_btn_squares($options) {
	$dttm=date("Ymd_His");
        $php_self=$_SERVER['PHP_SELF'];
        $http_host=$_SERVER['HTTP_HOST'];
        $request_uri=$_SERVER['REQUEST_URI'];
	$path_btn="./imgs/btn";
	$path_ani="./imgs/ani";

	$output = "";
//	$output .= "<body bgimage=images/chalk.gif>\n";
	$output .= "<body bgcolor=lightblue>\n";
	$output .= "<hr>\n";
	$output .= "<div class=\"layer1\" id=\"leds_show\" >\n";
//	$output .= "	<p class=\"heading\">leds_show</p>\n";
//	$output .= "	<div class=\"content\">\n";


	$output .= "<a href=$php_self>\n";
	$output .= "<img src=\"$path_btn/btn_black.gif\" alt=\"btn_black\" border=0 height=\"20\" width=\"20\" />";
	$output .= "</a>\n";


	
	if(( ! isset( $_SESSION['role'] )) || ( $_SESSION['role'] == "" )) {
		$output .= "<a href=$php_self?q=login>\n";
		$output .= "<img src=\"$path_btn/btn_black.gif\" alt=\"btn_black\" border=0 height=\"20\" width=\"20\" />";
		$output .= "</a>\n";
		}
	if(( isset( $_SESSION['role'] )) && ( ! $_SESSION['role'] == "" )) {
		$output .= "<a href=$php_self?q=logout>\n";
		$output .= "<img src=\"$path_btn/btn_white.gif\" alt=\"btn_white\" border=0 height=\"20\" width=\"20\" />";
		$output .= "</a>\n";



//		$squares = array( 'config', 'zoom', 'db', 'fgmenu', 'fgmenu_dyn', 'fgmenu_htm' );
//		$squares = array( 'config', 'zoom', 'db', 'ptviewer', 'ptobject', 'fgmenu_htm' );
//		$squares = array( 'config', 'zoom', 'db', 'ptviewer', 'ptobject', 'fgmenu_htm', 'db/grid/fp/pano', 'db/grid/fp/obj' );
//		$squares = array( 'config', 'zoom', 'db/grid', 'db/grid/fp/pano', 'db/grid/fp/obj', 'fgmenu_htm' );
		$squares = array( 'config', 'db/grid' );
		foreach( $squares as $square ) {
			$output .= "<a href=$php_self?q=$square>\n";
			$output .= "<img src=\"$path_btn/btn_black.gif\" alt=\"btn_black\" border=0 height=\"20\" width=\"20\" />";
			$output .= "</a>\n";
			}

///		$output .= " &nbsp &nbsp &nbsp ";
///		$output .= "<a href=https://147.238.94.126/fp/fp.php target=_blank>\n";
///		$output .= "<img src=\"$path_btn/btn_black.gif\" alt=\"btn_black_fp\" border=0 height=\"20\" width=\"20\" />";
///		$output .= "</a>\n";

///		$output .= "<a href=https://147.238.94.126/ka1/ka1.php?q=scrub target=_blank>\n";
///		$output .= "<img src=\"$path_btn/btn_black.gif\" alt=\"btn_black_scrub\" border=0 height=\"20\" width=\"20\" />";
///		$output .= "</a>\n";

///		$output .= "<a href=https://hrc.mil target=_blank>\n";
///		$output .= "<img src=\"$path_btn/btn_hrc.png\" alt=\"btn_hrc\" border=0 height=\"20\" width=\"20\" />";
///		$output .= "</a>\n";

///		$output .= "<a href=https://us.army.mil target=_blank>\n";
///		$output .= "<img src=\"$path_btn/btn_perscom.gif\" alt=\"btn_perscom\" border=0 height=\"20\" width=\"20\" />";
///		$output .= "</a>\n";

///		$output .= "<a href=https://147.238.94.126/ka1/media/zm5/index.htm target=_blank>\n";
///		$output .= "<img src=\"$path_btn/btn_hrc.png\" alt=\"btn_perscom\" border=0 height=\"20\" width=\"20\" />";
///		$output .= "</a>\n";
		}

	$output .= "<a href=$php_self?q=tools>\n";
	$output .= "<img src=\"$path_btn/btn_black.gif\" alt=\"tools\" border=0 height=\"20\" width=\"20\" />";
	$output .= "</a>\n";

	$output .= "<br>\n";
//	$output .= "		</div>\n";
	return( $output );

//	$output .= "<a href=$php_self?q=zoom>\n";
//	$output .= "<img src=\"$path_btn/btn_black.gif\" alt=\"btn_black\" border=0 height=\"20\" width=\"20\" />";
//	$output .= "</a>\n";
//	$output .= "<a href=$php_self?q=fgmenu>\n";
//	$output .= "<img src=\"$path_btn/btn_black.gif\" alt=\"btn_black\" border=0 height=\"20\" width=\"20\" />";
//	$output .= "</a>\n";
//	$output .= "<a href=$php_self?q=fgmenu_dyn>\n";
//	$output .= "<img src=\"$path_btn/btn_black.gif\" alt=\"btn_black\" border=0 height=\"20\" width=\"20\" />";
//	$output .= "</a>\n";
//	$output .= "<a href=$php_self?q=fgmenu_htm>\n";
//	$output .= "<img src=\"$path_btn/btn_black.gif\" alt=\"btn_black\" border=0 height=\"20\" width=\"20\" />";
//	$output .= "</a>\n";
//	$output .= "<a href=$php_self?q=view>\n";
//	$output .= "<a href=$php_self?q=db/grid>\n";
//	$output .= "<img src=\"$path_btn/btn_black.gif\" alt=\"btn_black\" border=0 height=\"20\" width=\"20\" />";
//	$output .= "</a>\n";
//	$output .= "<a href=$php_self?q=update>\n";
//	$output .= "<img src=\"$path_btn/btn_black.gif\" alt=\"btn_black\" border=0 height=\"20\" width=\"20\" />";
//	$output .= "</a>\n";
//	$output .= "<a href=$php_self?q=list>\n";
//	$output .= "<img src=\"$path_btn/btn_black.gif\" alt=\"btn_black\" border=0 height=\"20\" width=\"20\" />";
//	$output .= "</a>\n";

	}

function html_btn_footer( $options ) {
	$path_btn="./imgs/btn";
	$path_ani="./imgs/ani";
	$http_host=$_SERVER['HTTP_HOST'];
	$server_name=$_SERVER['SERVER_NAME'];
	$server_addr=$_SERVER['SERVER_ADDR'];

	$html_btn_footer  = "";
	$html_btn_footer .= "<hr>\n";
	$html_btn_footer .= leds_show($options);

	$html_btn_footer .= "<a href=https://us.army.mil target=_blank>\n";
	$html_btn_footer .= "<img src=\"$path_btn/ako.png\" alt=\"us.army.mil\" border=0 height=\"30\" width=\"50\" />";
	$html_btn_footer .= "</a>\n";
	$html_btn_footer .= " &nbsp &nbsp &nbsp &nbsp ";

	$html_btn_footer .= "<a href=https://atc.us.army.mil/iastar/ target=_blank>\n";
	$html_btn_footer .= "<img src=\"$path_btn/iastar.png\" alt=\"atc.us.army.mil/iastar\" border=0 height=\"30\" width=\"60\" />";
	$html_btn_footer .= "</a>\n";
	$html_btn_footer .= " &nbsp &nbsp &nbsp &nbsp ";

	$html_btn_footer .= "<a href=https://ia.signal.army.mil target=_blank>\n";
	$html_btn_footer .= "<img src=\"$path_btn/iasignal.png\" alt=\"ia.signal.army.mil\" border=0 height=\"30\" width=\"30\" />";
	$html_btn_footer .= "</a>\n";
	$html_btn_footer .= " &nbsp &nbsp &nbsp &nbsp ";

	$html_btn_footer .= "<a href=https://www.iad.gov target=_blank>\n";
	$html_btn_footer .= "<img src=\"$path_btn/iad.png\" alt=\"iad.gov\" border=0 height=\"30\" width=\"30\" />";
	$html_btn_footer .= "</a>\n";
	$html_btn_footer .= " &nbsp &nbsp &nbsp &nbsp ";

	$html_btn_footer .= "<a href=https://www.iad.gov/ioss/index.cfm target=_blank>\n";
	$html_btn_footer .= "<img src=\"$path_btn/ioss.png\" alt=\"iad.gov/ioss\" border=0 height=\"30\" width=\"30\" />";
	$html_btn_footer .= "</a>\n";
	$html_btn_footer .= " &nbsp &nbsp &nbsp &nbsp ";

	$html_btn_footer .= "<a href=https://www.hrc.army.mil target=_blank>\n";
	$html_btn_footer .= "<img src=\"$path_btn/btn_hrc.png\" alt=\"hrc.army.mil\" border=0 height=\"30\" width=\"30\" />";
	$html_btn_footer .= "</a>\n";
	$html_btn_footer .= " &nbsp &nbsp &nbsp &nbsp ";

	$html_btn_footer .= "<hr>\n";

	$html_btn_footer .= "<table>\n";
	$html_btn_footer .= "<tr>\n";
	$html_btn_footer .= "<td>\n";
	$html_btn_footer .= "ka1<br>\n";
	$html_btn_footer .= "<a href=$php_self?q=ka1/about target=_blank>\n";
	$html_btn_footer .= "<img src=\"$path_btn/ka1.png\" alt=\"ka1\" border=0 height=\"35\" width=\"35\" />";
	$html_btn_footer .= "</a>\n";
	$html_btn_footer .= "</td>\n";

	$html_btn_footer .= "<td width=15> &nbsp </td>\n";

	$html_btn_footer .= "<td>\n";
	$html_btn_footer .= "ka1e<br>\n";
	$html_btn_footer .= "<a href=$php_self?q=ka1e target=_blank>\n";
	$html_btn_footer .= "<img src=\"$path_btn/ka1e.png\" alt=\"ka1e\" border=0 height=\"30\" width=\"30\" />";
	$html_btn_footer .= "</a>\n";
	$html_btn_footer .= "</td>\n";
	$html_btn_footer .= "<td width=15> &nbsp </td>\n";

	$html_btn_footer .= "<td>\n";
	$html_btn_footer .= "ka1d<br>\n";
	$html_btn_footer .= "<a href=$php_self?q=ka1d target=_blank>\n";
	$html_btn_footer .= "<img src=\"$path_btn/ka1d.png\" alt=\"ka1d\" border=0 height=\"30\" width=\"30\" />";
	$html_btn_footer .= "</a>\n";
	$html_btn_footer .= "</td>\n";
	$html_btn_footer .= "<td width=15> &nbsp </td>\n";

	$html_btn_footer .= "<td>\n";
	$html_btn_footer .= "ka1t<br>\n";
	$html_btn_footer .= "<a href=$php_self?q=ka1t target=_blank>\n";
	$html_btn_footer .= "<img src=\"$path_btn/ka1t.png\" alt=\"ka1t\" border=0 height=\"30\" width=\"30\" />";
	$html_btn_footer .= "</a>\n";
	$html_btn_footer .= "</td>\n";

	$html_btn_footer .= "<td width=15> &nbsp </td>\n";
	$html_btn_footer .= "<td width=15> &nbsp </td>\n";

	$html_btn_footer .= "<td>\n";
	$html_btn_footer .= "itil<br>\n";
	$html_btn_footer .= "<a href=/itil/index.html target=_blank>\n";
	$html_btn_footer .= "<img src=\"$path_btn/itil.png\" alt=\"itil\" border=0 height=\"30\" width=\"30\" />";
	$html_btn_footer .= "</a>\n";
	$html_btn_footer .= "</td>\n";
	$html_btn_footer .= "<td width=15> &nbsp </td>\n";
	$html_btn_footer .= "</tr>\n";
	$html_btn_footer .= "</table>\n";

	$html_btn_footer .= "<hr>\n";

	$html_btn_footer .= "<a href=http://arcsight.com target=_blank>\n";
	$html_btn_footer .= "<img src=\"$path_btn/arcsight.png\" alt=\"arcsight\" border=0 height=\"30\" width=\"40\" />";
	$html_btn_footer .= "</a>\n";
	$html_btn_footer .= " &nbsp &nbsp &nbsp &nbsp ";

	$html_btn_footer .= "<a href=https://147.238.94.170/console/app.showApp.cmd target=_blank>\n";
	$html_btn_footer .= "<img src=\"$path_btn/tripwire.png\" alt=\"tripwire\" border=0 height=\"30\" width=\"40\" />";
	$html_btn_footer .= "</a>\n";
	$html_btn_footer .= " &nbsp &nbsp &nbsp &nbsp ";

	$html_btn_footer .= "<a href=https://147.238.94.105/zabbix target=_blank>\n";
	$html_btn_footer .= "<img src=\"$path_btn/zabbix.gif\" alt=\"zabbix\" border=0 height=\"30\" width=\"50\" />";
	$html_btn_footer .= "</a>\n";
	$html_btn_footer .= " &nbsp &nbsp &nbsp &nbsp ";

        $html_btn_footer .= "<a href=https://sbm.usarec.army.mil target=_blank>\n";
        $html_btn_footer .= "<img src=\"$path_btn/serena.png\" alt=\"serena\" border=0 height=\"30\" width=\"60\" />";
        $html_btn_footer .= "</a>\n";
	$html_btn_footer .= " &nbsp &nbsp &nbsp &nbsp ";

	$html_btn_footer .= "<a href=https://hrcsharepoint.nase.ds.army.mil/hrcos/default.aspx target=_blank>\n";
	$html_btn_footer .= "<img src=\"$path_btn/sharepoint.png\" alt=\"sharepoint\" border=0 height=\"30\" width=\"60\" />";
	$html_btn_footer .= "</a>\n";
	$html_btn_footer .= " &nbsp &nbsp &nbsp &nbsp ";

        $html_btn_footer .= "<a href=http://147.238.93.73:6122 target=_blank>\n";
        $html_btn_footer .= "<img src=\"$path_btn/bex.png\" alt=\"bex\" border=0 height=\"30\" width=\"50\" />";
        $html_btn_footer .= "</a>\n";
	$html_btn_footer .= " &nbsp &nbsp &nbsp &nbsp ";

	$html_btn_footer .= "<hr>\n";

	$html_btn_footer .= "<a href=https://147.238.94.126/dp7 target=_blank>\n";
	$html_btn_footer .= "<img src=\"$path_btn/drupal.png\" alt=\"drupal\" border=0 height=\"30\" width=\"30\" />";
	$html_btn_footer .= "</a>\n";
	$html_btn_footer .= " &nbsp &nbsp &nbsp &nbsp ";

//	$html_btn_footer .= "<a href=https://147.238.99.102/index.php target=_blank>\n";
	$html_btn_footer .= "<a href=https://147.238.94.105/pat target=_blank>\n";
	$html_btn_footer .= "<img src=\"$path_btn/thepat.png\" alt=\"thep@\" border=0 height=\"30\" width=\"40\" />";
	$html_btn_footer .= "</a>\n";
	$html_btn_footer .= " &nbsp &nbsp &nbsp &nbsp ";

	$html_btn_footer .= "<a href=https://147.238.94.105/media/index.php target=_blank>\n";
	$html_btn_footer .= "<img src=\"$path_btn/mediawiki.png\" alt=\"mediawiki\" border=0 height=\"40\" width=\"50\" />";
	$html_btn_footer .= "</a>\n";
	$html_btn_footer .= " &nbsp &nbsp &nbsp &nbsp ";

	$html_btn_footer .= "<a href=$php_self/ka1/media/zm5/index.htm target=_blank>\n";
	$html_btn_footer .= "<img src=\"$path_btn/zoomify.png\" alt=\"zoomify\" border=0 height=\"40\" width=\"50\" />";
	$html_btn_footer .= "</a>\n";
	$html_btn_footer .= " &nbsp &nbsp &nbsp &nbsp ";

	$html_btn_footer .= "<a href=$php_self?q=scrub target=_blank>\n";
	$html_btn_footer .= "<img src=\"$path_btn/scrubbrush.png\" alt=\"scrub\" border=0 height=\"30\" width=\"30\" />";
	$html_btn_footer .= "</a>\n";

	$html_btn_footer .= " &nbsp &nbsp &nbsp &nbsp ";
	$html_btn_footer .= "<a href=$php_self/nap target=_blank>\n";
	$html_btn_footer .= "<img src=\"$path_btn/netapp.png\" alt=\"scrub\" border=0 height=\"30\" width=\"30\" />";
	$html_btn_footer .= "</a>\n";



////	$html_btn_footer .= "<hr>\n";
////	$html_btn_footer .= "<a href=/ka1/ldap/index.html target=_blank>\n";
////	$html_btn_footer .= "<img src=\"$path_btn/ldap_us.png\" alt=\"ldap_us\" border=0 height=\"30\" width=\"30\" />\n";
//	$html_btn_footer .= "<img src=\"$path_btn/ldap_bolt.png\" alt=\"ldap_bolt\" border=0 height=\"30\" width=\"30\" />";
////	$html_btn_footer .= "</a>\n";
///	$html_btn_footer .= "<img src=\"$path_btn/ldap.png\" alt=\"ldap\" border=0 height=\"30\" width=\"30\" />";
////	$html_btn_footer .= "<hr>\n";

//	printf( "<hr>http_host=$http_host<hr>\n" );
//	printf( "<hr>server_name=$server_name<hr>\n" );
//	printf( "<hr>server_addr=$server_addr<hr>\n" );
//	$html_btn_footer .= "<a href=$server_name/../../webcal/ target=_blank>\n";

//	$html_btn_footer .= "<a href=http://www.k5n.us/webcalendar.php target=_blank>\n";
//	$html_btn_footer .= "<img src=\"$path_btn/webcalendar.png\" alt=\"webcalendar $http_host\" border=0 height=\"30\" width=\"30\" />";
//	$html_btn_footer .= "</a>\n";


	$html_btn_footer .= "<hr>\n";

	$html_btn_footer .= "<table>\n";
	$html_btn_footer .= "<tr>\n";
	$html_btn_footer .= "<td>\n";
	$html_btn_footer .= "kb<br>\n";
	$html_btn_footer .= "<a href=$php_self?q=kb target=_blank>\n";
	$html_btn_footer .= "<img src=\"$path_btn/kbbooks.png\" alt=\"kb\" border=0 height=\"30\" width=\"30\" />";
	$html_btn_footer .= "</a>\n";
	$html_btn_footer .= "</td>\n";

	$html_btn_footer .= "<td width=15> &nbsp </td>\n";

	$html_btn_footer .= "<td>\n";
	$html_btn_footer .= "certs<br>\n";
	$html_btn_footer .= "<a href=$php_self?q=certs target=_blank>\n";
	$html_btn_footer .= "<img src=\"$path_btn/cert.png\" alt=\"certs\" border=0 height=\"30\" width=\"30\" />";
	$html_btn_footer .= "</a>\n";
	$html_btn_footer .= "</td>\n";


// phpmaster.com/charting-with-pchart
// phpro.php 

	$html_btn_footer .= "<td width=15> &nbsp </td>\n";
	$html_btn_footer .= "<td width=15> &nbsp </td>\n";
	$html_btn_footer .= "<td>\n";
	$html_btn_footer .= "pcharts<br>\n";
	$html_btn_footer .= "<a href=$php_self?q=pchart/main target=_blank>\n";
	$html_btn_footer .= "<img src=\"$path_btn/pchart_mirror.png\" alt=\"pchart\" border=0 height=\"30\" width=\"30\" />";
	$html_btn_footer .= "</a>\n";
	$html_btn_footer .= "</td>\n";
	$html_btn_footer .= "<td width=5> &nbsp </td>\n";

	$html_btn_footer .= "<td>\n";
	$html_btn_footer .= "dynamic<br>\n";
	$html_btn_footer .= "<a href=/ka1/ko_pcharts_df.php target=_blank>\n";
	$html_btn_footer .= "<img src=\"$path_btn/pchart_mirror.png\" alt=\"pchart\" border=0 height=\"30\" width=\"30\" />";
	$html_btn_footer .= "</a>\n";
	$html_btn_footer .= "</td>\n";

	$html_btn_footer .= "</tr>\n";
	$html_btn_footer .= "</table>\n";

//	$html_btn_footer .= "&nbsp &nbsp path_btn=[$path_btn]<br>\n";
//	$html_btn_footer .= "<br>webcalendar sqlite3 version currently pending<br>\n";
///	$html_btn_footer .= "<a href=$http_host/../../supercali target=_blank>\n";
///	$html_btn_footer .= "<img src=\"$path_btn/supercali.png\" alt=\"supercali\" border=0 height=\"30\" width=\"30\" />";
///	$html_btn_footer .= "</a>\n";

//	$html_btn_footer .= "<br>path_btn=[$path_btn]<br>\n";

	$html_btn_footer .= leds_zm5($options);

	$html_btn_footer .= "<br><br><a href=$php_self?q=konet ><img src=\"$path_btn/ko.png\" border=0 width=25 height=12></a><br>\n";

	return( $html_btn_footer );
	}

function html_dc_links( $option ) {
	$html  = "";
//	$html .= "<h3>AAC knowledge base </h3>\n";
///	$html .= "<a href=$php_self?q=dc/rpts >rpts</a>\n";
	$html .= "<a href=$php_self?q=dc/rpts ><img src=./imgs/btn/postits.png border=0 height=25></a>\n";
	$html .= " &nbsp &nbsp &nbsp \n";
///	$html .= "<a href=$php_self?q=dc/view >view</a>\n";
	$html .= " &nbsp &nbsp \n";
//	$html .= "<a href=$php_self?q=db/grid/ka1/hw >grid: hw</a>\n";
	$html .= "<a href=$php_self?q=db/grid/ka1/hw ><img src=./imgs/btn/theme_swanky.jpg border=0 height=25></a>\n";
	$html .= " &nbsp &nbsp \n";
//	$html .= "<a href=$php_self?q=db/grid/ka1/rpts >grid: rpts</a>\n";
	$html .= "<a href=$php_self?q=db/grid/ka1/rpts ><img src=./imgs/btn/postit.png border=0 height=25 ></a>\n";
	$html .= " &nbsp &nbsp &nbsp \n";
//	$html .= "<a href=$php_self?q=db/grid/ka1 >grid: dc_hw</a>\n";
//	$html .= " &nbsp &nbsp &nbsp \n";
///	$html .= "<a href=$php_self?q=dc/new >new</a>\n";
//	$html .= " &nbsp &nbsp &nbsp \n";
//	$html .= "<a href=$php_self?q=dc/mod >mod</a>\n";
	$html .= "<br>\n";
	return( $html );
	}

function html_kb_links( $options ) {
	$html  = "";
	$html .= "<h3>AAC knowledge base </h3>\n";
	$html .= "<a href=$php_self?q=kb/view >view</a>\n";
	$html .= " &nbsp &nbsp \n";
	$html .= "<a href=$php_self?q=db/grid/koaac_kb/kb >grid: search</a>\n";
	$html .= " &nbsp &nbsp \n";
	$html .= "<a href=$php_self?q=db/grid/koaac_kb/rpts >grid: koaac_kb-rpts</a>\n";
	$html .= " &nbsp &nbsp &nbsp \n";
//	$html .= "<a href=$php_self?q=db/grid/koaac_kb >grid: koaac_kb-kb</a>\n";
//	$html .= " &nbsp &nbsp &nbsp \n";
	$html .= "<a href=$php_self?q=kb/rpts >kb_rpts</a>\n";
	$html .= " &nbsp &nbsp &nbsp \n";
	$html .= "<a href=$php_self?q=kb/new >new</a>\n";
//	$html .= " &nbsp &nbsp &nbsp \n";
//	$html .= "<a href=$php_self?q=kb/mod >mod</a>\n";
	$html .= "<hr>\n";
	return( $html );
	}

function html_nodes_links( $options ) {
	$html  = "";
	$html .= "<h3>AAC nodes </h3>\n";
	$html .= "<a href=$php_self?q=nodes/view >view</a>\n";
	$html .= " &nbsp &nbsp \n";
	$html .= "<a href=$php_self?q=db/grid/ka1/nodes >grid: ka1-nodes</a>\n";
	$html .= " &nbsp &nbsp \n";
	$html .= "<a href=$php_self?q=db/grid/ka1/rpts >grid: ka1-rpts</a>\n";
	$html .= " &nbsp &nbsp &nbsp \n";
//	$html .= "<a href=$php_self?q=db/grid/ka1 >grid: ka1_nodes-kb</a>\n";
//	$html .= " &nbsp &nbsp &nbsp \n";
	$html .= "<a href=$php_self?q=nodes/rpts >nodes_rpts</a>\n";
	$html .= " &nbsp &nbsp &nbsp \n";
//	$html .= "<a href=$php_self?q=nodes/new >new</a>\n";
//	$html .= " &nbsp &nbsp &nbsp \n";
//	$html .= "<a href=$php_self?q=kb/mod >mod</a>\n";
	$html .= "<hr>\n";
	return( $html );
	}


function html_scrub( $options ) {
        $php_self=$_SERVER['PHP_SELF'];
        $http_host=$_SERVER['HTTP_HOST'];
        $request_uri=$_SERVER['REQUEST_URI'];


//	printf( "$progid $dttm MSG_1337:  o0=[$options[0]] o1=[$options[1]] o2=[$options[2]]<hr>\n" );
//	leds_show();

	$pdo = newpdo($GLOBALS['dbfile']);
	$tblname=$GLOBALS['tblname'];
	$media_path=$GLOBALS['media_path'];
	$path_ani="./imgs/ani";
	$path_fpb="./imgs/fpb";

	$output  = "";
	$output .= "<head>\n";
//	$output .= "	<script src=\"js/jqgrid.3.5.3/js/jquery-1.3.2.min.js\" type=\"text/javascript\"></script>\n";
//	$output .= "	<script src=\"js/jqgrid-4.4.0/js/jquery-1.7.2.min.js\" type=\"text/javascript\"></script>\n";
	$output .= "	<script src=\"js/jqgrid-4.4.0/js/jquery-1.8.3.min.js\" type=\"text/javascript\"></script>\n";
	$output .= "	<script src=\"js/jqgrid-4.4.0/js/jquery-ui-1.9.2.custom.js\" type=\"text/javascript\"></script>\n";
	$output .= "	<script src=\"js/tooltip/tooltip_main_screenshot.js\" type=\"text/javascript\"></script>\n";
	$output .= "	</head>\n";

	$output .= html_btn_squares( $options, "" );
//	$output .= "leds_detail MSG_1353:  name=[$led_name] title=[$led_title] led_loc_code=[$led_loc_code] led_comment=[$led_comment]<br>\n";
//	leds_show();
	return;
	}


function leds_detail( $options ) {
        $php_self=$_SERVER['PHP_SELF'];
        $http_host=$_SERVER['HTTP_HOST'];
        $request_uri=$_SERVER['REQUEST_URI'];

//	printf( "$progid $dttm MSG_6120:  o0=[$options[0]] o1=[$options[1]] o2=[$options[2]]<hr>\n" );
//	leds_show();
//	return;

	$pdo = newpdo($GLOBALS['dbfile']);
	$tblname=$GLOBALS['tblname'];
	$media_path=$GLOBALS['media_path'];
	$path_ani="./imgs/ani";
	$path_fpb="./imgs/fpb";
	$path_fpb="./imgs/cab";

	$output  = "";
	$output .= "<head>\n";
//	$output .= "	<script src=\"js/jqgrid.3.5.3/js/jquery-1.3.2.min.js\" type=\"text/javascript\"></script>\n";
	$output .= "	<script src=\"js/jqgrid-4.4.0/js/jquery-1.7.2.min.js\" type=\"text/javascript\"></script>\n";
	$output .= "	<script src=\"js/tooltip/tooltip_main_screenshot.js\" type=\"text/javascript\"></script>\n";
	$output .= "	</head>\n";

	$output .= html_btn_squares( $options, "" );
//	$output .= "leds_detail MSG_3545:  name=[$led_name] title=[$led_title] led_loc_code=[$led_loc_code] led_comment=[$led_comment]<br>\n";
//	leds_show();

	$cab=$options[1];
	$led_name=$options[1];
	$os=$options[1];

	$osimg= sprintf("./imgs/btn/$os.png");
//	$output .= "<br><img src=$osimg width=10% height=6%><br>\n";
	$cabimg= sprintf("./imgs/cab/$cab.png");
//	$output .= "<br><img src=$cabimg width=10% height=6%><br>\n";
	$output .= "<br><img src=$cabimg height=50%><br>\n";

//	printf( "BUGS_4862 cabimg=[$cabimg] cab=[$cab] led_name=[$led_name] os=[$os]<hr>\n" );
	$tblname="ko_hw";
	$sql = "select * from $tblname";
	$sql = "select * from $tblname where led_name == '$led_name' and led_published == '1' and led_dttm == 'current'";
	$sql = "select * from $tblname where led_name == '$led_name'";
//	$sql = "select * from $tblname where cab == '$cab' and model != ''";
	$sql = "select * from $tblname where cab == '$cab' and item != ''";
//	printf( "$progid $dttm MSG_4800:  sql=[$sql] led_name=[$led_name]  o0=[$options[0]] o1=[$options[1]] o2=[$options[2]]<hr>\n" );
///	exit;
	$j=0;
	$samps=0;
	$output  .= "<table>\n";
	$tblhdr   = "";
	$tblhdr  .= "<tr>\n";
	$tblhdr  .= "<td>jhdr</td>";
	$tblhdr  .= "<td>item_img jk</td>";
	$tblhdr  .= "<td>item</td>";
	$tblhdr  .= "<td>amps</td>";
	$tblhdr  .= "<td>ip</td>";
	$tblhdr  .= "<td>sn</td>";
	$tblhdr  .= "<td>hrctag</td>";
	$tblhdr  .= "<td>hostname</td>";
	$tblhdr  .= "<td>machinename</td>";
	$tblhdr  .= "</tr>\n";

	$output .= $tblhdr;

	foreach( $pdo->query($sql) as $row ) {
		$j++;
//		printf( "BUGS_6160:  sql=[$sql]<br>\n" );
		$led_name = $row['led_name'];
		$led_dttm = $row['led_dttm'];
		$led_cab = $row['cab'];
		$btu = $row['btu'];
		$os = $row['os'];
		$item = $row['item'];
		$model = $row['model'];
		$sn = $row['sn'];
		$btu = $row['btu'];
		$amps = $row['amps'];
		$switch = $row['switch'];
		$hrctag = $row['hrctag'];
		$hostname = $row['hostname'];
		$machinename = $row['machinename'];
		$ip = $row['ip'];
//		$led_amps = $row['amps'];
		$led_sn = $row['sn'];
		$led_title = $row['led_title'];
		$led_comment = $row['led_comment'];
		$led_loc_code = $row['led_loc_code'];
		$led_published = $row['led_published'];
		$led_group = $row['led_group'];
		$led_orgs = $row['led_orgs'];
		$led_filename = $row['led_filename'];
		$samps=$samps+$amps;

///		printf( "MSG_6200:  item=[$item] sn=[$sn] amps=[$amps] $led_amps=[$led_amps]<br>\n" );

		$item_img= sprintf("./imgs/cab/$item.png" );
//		$output_detail="<hr>";
		if( file_exists( $item_img )) {
			$item_imgurl = "";
			$item_imgurl .= "<a href=https://$http_host$php_self?q=hw/$item&hrctag=$hrctag>";
			$item_imgurl .= "<img src=$item_img border=0 ></a>\n";

			$tbldtl  = "<tr>\n";
			$tbldtl .= "<td>$j &nbsp </td>\n";
			$tbldtl .= "<td>$item_imgurl &nbsp </td>\n";
			$tbldtl .= "<td>$item &nbsp </td>\n";
			$tbldtl .= "<td>$amps &nbsp </td>\n";
			$tbldtl .= "<td>$ip &nbsp </td>\n";
			$tbldtl .= "<td>$sn &nbsp </td>\n";
			$tbldtl .= "<td>$hrctag &nbsp </td>\n";
			$tbldtl .= "<td>$hostname &nbsp </td>\n";
			$tbldtl .= "<td>$machinename &nbsp </td>\n";
			$tbldtl .= "</tr>\n";
		
//			$output_detail .= "$item_imgurl";
//			$output_detail .= "amps=[$amps] \n";
//			$output_detail .= "led_sn=[$led_sn] \n";
//			$output_detail .= "item=[$item] \n";
//			$output_detail .= "led_hrctag=[$led_hrctag] \n";
//			$output_detail .= "led_ip=[$led_ip] \n";
//			$output_detail .= "led_sn=[$led_sn] \n";
			}
		else {
///			$output_detail .= "$item_img &nbsp &nbsp \n";
			$tbldtl .= "<tr>\n";
			$tbldtl .= "<td>$j &nbsp </td>";
			$tbldtl .= "<td>$item_img &nbsp </td>";
			$tbldtl .= "<td>$item &nbsp </td>";
			$tbldtl .= "<td>$amps &nbsp </td>";
			$tbldtl .= "<td>$ip &nbsp </td>";
			$tbldtl .= "<td>$sn &nbsp </td>";
			$tbldtl .= "<td>$hrctag &nbsp </td>";
			$tbldtl .= "<td>$hostname &nbsp </td>";
			$tbldtl .= "<td>$machinename &nbsp </td>";
			$tbldtl .= "</tr>\n";
			}

//		printf( "BUGS_6205:  output_detail=[$output_detail]<br>\n" );
//		$output_detail .= sprintf( "cab=%s model=%s sn=%s btu=%s amps=%s", $cab, $model, $sn, $btu, $amps );	

		$output .= $tbldtl;
////		$output .= "</table>\n";

////		$output .= "<table>\n";

////		if( $led_title != "" ) {$output .= "<tr><td>title:</td><td><b>$led_title</b></td></tr>";}
////		if( $led_loc_code != "" ) {$output .= "<tr><td>loc_code:</td><td><b>$led_loc_code</b></td></tr>";}
////		if( $led_orgs != "" ) {$output .= "<tr><td>org:</td><td><b>$led_orgs</b></td></tr>";}
////		if( $led_group != "" ) {$output .= "<tr><td>group:</td><td><b>$led_group</b></td></tr>";}
////		if( $led_comment != "" ) {$output .= "<tr><td>comment:</td><td><b>$led_comment</b></td></tr>";}

////		$output .= "</table>\n";

		if( $led_filename != "" ) {
//			$led_pathfile="$media_path/$led_filename";
//			$led_pathfile="$media_path/$led_filename";
			$led_pathfile="$path_ani/$led_filename";
			if( file_exists( $led_pathfile)) {
				$output .= "<img src=\"$led_pathfile\"><br/>\n";
				}
			}
//		print( $output );
		}

	$pdo = null;

	$tbltot  = "";
	$tbltot .= "<tr>\n";
	$tbltot .= "<td> &nbsp </td>\n";
	$tbltot .= "<td><b>totals $dttm: $cab</b></td>\n";
	$tbltot .= "<td> $j </td>\n";
	$tbltot .= "<td><b>$samps</b></td>\n";
	$tbltot .= "<td> &nbsp </td>\n";
	$tbltot .= "</tr>\n";

	$output .= "$tbltot";
	$output .= "</table>\n";
	$output .= "<hr>\n";

//	printf( "MSG_6260:  samps=[$samps]<br>\n" );

//	leds_show();
//	print( "<a href=\"./fp_zviewer.php?file=$led_name&path=images/\" target=_blank>$led_name</a><br>\n" );
//	$fp_url="./fp_zviewer.php?file=$led_name&path=images/";
//	header( 'Location:'.$fp_url );	

	print( "<br/>\n" );
	if(! isset($_SESSION['hs_type'] )) { 	$hs_type="default"; }
	else {$hs_type=$_SESSION['hs_type'];}

	if(! isset($_SESSION['org_type'] )) { 	$org_type="p"; }
	else {$org_type=$_SESSION['org_type'];}


	$os=$options[1];
	if( preg_match( "/ka1/", $os, $matches )) {
		$output .= "<h3>System Management Branch</h3>\n";
		$output .= "<a href=$php_self?q=ka1/about>about</a> &nbsp &nbsp &nbsp \n";
		$output .= "<a href=/itil>itil</a><br>\n";
		$output .= "<hr>\n";
		}		

	if( preg_match( "/ka1e/", $os, $matches )) {
		$output .= "<h3>System Management Branch:  Engineering</h3>\n";
		}		
	if( preg_match( "/ka1d/", $os, $matches )) {
		$output .= "<h3>System Management Branch:  Deployment</h3>\n";
		}		
	if( preg_match( "/ka1t/", $os, $matches )) {
		$output .= "<h3>System Management Branch:  Training</h3>\n";
		}		

//	printf( "$progid $dttm MSG_3600: os=[$os]  o0=[$options[0]] o1=[$options[1]] o2=[$options[2]]<hr>\n" );
	$tbllist="kb hs us sw vg hw dp bp";
	$tbls=split( " ",$tbllist );

	$fpb_title="$os $tbl";
	foreach( $tbls as $tbl ) {	
		$fpbimg= sprintf("./imgs/fpb/$tbl.png");
//		$fpbimg= sprintf("./imgs/cab/$tbl.png");
//		printf( "BUGS_3600 fpbimg=[$fpbimg] tbl=[$tbl]<br>\n" );
//		printf( "$progid $dttm BUGS_1414: os=[$os] tbl=[$tbl] <hr>$php_self?q=detail/$os/$tbl<hr>\n" );
//		$output .= "<a href=\"$php_self?q=grid/$os/$tbl\" ";
//		$output .= "<a href=\"$php_self?q=db/grid/ko$os"."_$tbl\" ";
		$output .= "<a href=\"$php_self?q=detail/$os/$op"."_$tbl\" ";
		$output .= " class=\"screenshot\" rel=\"$fpbimg\" title=\"$fpb_title\" ";
		$output .= "><img src=$fpbimg border=0 height=40></a>  &nbsp &nbsp \n";
		}



//	$path_tn="./media/zoom";
//	sprintf( $xmlfile, "%s_%s_hotspots.xml", $option[1], $hs_type );
//	$xmlfile=$led_name . "_" . $hs_type . "_hotspots.xml";
//	$fpbfile="$path_fpb/fpb".substr( $led_name, 2 ) .".png";


//	$zoom_file=$led_name;
//	$zoom_code=$led_name;
//	$zoomxml_code=$hs_type;
//	$zoom_path="images/";
//	$zoom_xml=$led_name . "_" . $hs_type . "_hotspots.xml";
//	$zview_xml=$led_name . "_" . $hs_type . "_hotspots.xml";
//	$zview_xml=$led_name . "_hotspots.xml";

//	$zview_file=$led_name;
//	$tn_zview_file="$path_tn/$led_name/Tilegroup0/0-0-0.jpg";

//	$output = "<hr>no show_leds<hr>\n";
//	$output .= "<hr>\n";
//	$output .= "<hr>\n";

//	print( "<img src=$tn_zview_file><br>\n" );
//	print( "<img src=$fpbfile><br>\n" );

//	if( file_exists( $tn_zview_file )) {
//		$output .= "<a href=\"$php_self?q=zview/$zview_file/$zview_xml\" target=_blank><img src=$tn_zview_file border=0></a><br><br>\n";
////		$output .= "<a href=\"$php_self?q=zoom/$zoom_code/$zoomxml_code\" target=_blank><img src=$tn_zview_file border=0></a><br><br>\n";

//		$path_fpb = "./imgs/fpb";
///		$path_fpb = "images/fpb";
//		$fpbnam = str_replace( "fp", "fpb", $led_name );
//		$fpbimg = "$path_fpb/" . $fpbnam . ".png";
//		$fpb_title = $led_name . "(";
//		$fpb_title .= $led_title . ")";
//		$fpb_title .= " bldg(". $row['led_bldg'];
//		$fpb_title .= " floor(". $row['led_floor'];
//		$fpb_title .= ")";
//		
//		$output .= "<a href=\"$php_self?q=zoom/$zoom_code/$zoomxml_code\" ";
//		$output .= " class=\"screenshot\" rel=\"$fpbimg\" title=\"$fpb_title\" ";
//		$output .= ">\n";
//
//		$output .= "<img src=$tn_zview_file border=0></a><br><br>\n";
//		}
//	else {
////		$output .= "<a href=\"$php_self?q=zview/$zview_file/$zview_xml\" target=_blank><img src=$fpbfile border=0></a><br><br>\n";
	//	$output .= "<a href=\"$php_self?q=zview/$zoom_code/$zoomxml_code\" target=_blank><img src=$fpbfile border=0></a><br><br>\n";
	//	}
//
//	leds_zviewer( $zoom_file, $zoom_path, $zoom_xml );
//	print( "<a href=\"$php_self?q=zview/$zview_file/$zview_xml\" target=_blank>zview $led_name</a><br><br>\n" );
//	print( "<a href=\"./fp_zviewer.php?file=$led_name&path=images/&xml=$zoom_xml\" target=_blank>zviewer $led_name</a><br>\n" );

	$led_name=$options[1];
//	printf( "BUGS_5300 o1=$option1 o2=$option2 options=$options<hr>\n" );
	if(( isset( $_SESSION['role'] )) && ( ! $_SESSION['role'] == "" )) {
		$output .= "<hr>role: ". $_SESSION['role'] . "<hr>\n";
		$output .= "<a href=$php_self?q=leds_update_form/$led_name>\n";
//		$output .= "update $led_name</a>\n";
		$output .= "<img src=./imgs/btn/postit.png height=20 border=0>";
		$output .= "</a>\n";
		$output .= " &nbsp &nbsp &nbsp &nbsp";
		$output .= "<a href=$php_self?q=rpts/$led_name>";
///		$output .= "rpts $led_name</a><br/>\n";
		$output .= "<img src=./imgs/btn/postits.png height=20 border=0>\n";
		$output .= "</a><br/>\n";
		}
	else {
		$output .= "<hr>role: ". $_SESSION['role'] . " guest<hr>\n";
		$output .= "<a href=$php_self?q=leds_update_form/$led_name>";
		$output .= "<img src=./imgs/btn/postit.png height=20></a>";
		$output .= " &nbsp &nbsp &nbsp &nbsp";
		$output .= "<a href=$php_self?q=rpts/$led_name>";
		$output .= "<img src=./imgs/btn/postits.png height=20>";
		$output .= "</a><br/>\n";
		}
///	$output .= "<br>\n";
	$output .= "<hr><a href=$php_self?q=scrub_upload_form/$led_name>scrub_upload_form $led_name</a><br/><hr>\n";
	print( $output );
	return( $output );
	}

function html_zoom_detail($options) {
	$php_self=$_SERVER['PHP_SELF'];
	$path_fpb="./imgs/fpb";
	$path_tn="./media/zoom";

	$zmcode = $options[1];
//	$zmtype = $options[2];
	$zmtype = $_SESSION['hs_type'];
	$zmrowid= $options[3];

	
///	$output .= "<hr>html_zoom_detail_1061:  o1=$options[1]] o2=[$options[2]] o3=[$options[3]]<hr>\n";


//	$xmlfile = sprintf( "%s_%s_hotspots.xml", $zmcode, $zmtype );
	$xmlfile = sprintf( "%s_%s_%s_hotspots.xml", $zmcode, $zmtype, $zmrowid );
	$fpbfile="$path_fpb/fpb".substr( $zmcode, 2 ) .".png";


//	$zoom_file=$led_name;
//	$zoom_code=$led_name;
//	$zoomxml_code=$hs_type;
	$zoom_file=$zmcode;
	$zoom_code=$zmcode;
	$zoomxml_code=$zmtype;
	$zoom_path="images/";
	$zoom_xml=$zmcode . "_" . $zmtype . "_hotspots.xml";
	$zview_xml=$zmcode . "_" . $zmtype . "_hotspots.xml";
//	$zview_xml=$zmcode . "_hotspots.xml";
	$zview_xml = sprintf( "%s_%s_%s_hotspots.xml", $zmcode, $zmtype, $zmrowid );

	$zview_file=$zmcode;
	$tn_zview_file="$path_tn/$zmcode/Tilegroup0/0-0-0.jpg";

//	$output = "<hr>html_zoom_details<hr>\n";
//	$output .= "xmlfile=[$xmlfile]<br>\n";
//	$output .= "<hr>\n";
//	$output .= "leds_detail MSG:  name=[$zmcode] title=[$led_title] led_loc_code=[$led_loc_code] led_comment=[$led_comment]<br>\n";
	$output .= "<hr>\n";

//	print( "<img src=$tn_zview_file><br>\n" );
//	print( "<img src=$fpbfile><br>\n" );
	if( file_exists( $tn_zview_file )) {


////		$output .= "    <script src=\"js/jqgrid.3.5.3/js/jquery-1.3.2.min.js\" type=\"text/javascript\"></script>\n";
////		$output .= "    <script src=\"js/jqgrid-4.4.0/js/jquery-1.7.2.min.js\" type=\"text/javascript\"></script>\n";
		$output .= "    <script src=\"js/tooltip/tooltip_main_screenshot_top.js\" type=\"text/javascript\"></script>\n";


		$path_fpb = "./imgs/fpb";
		$fpnam = $row['led_name'];                                  
                $fpbnam = str_replace( "fp", "fpb", $zmcode );               
                $fpbimg = "$path_fpb/" . $fpbnam . ".png";                  
		$fpb_title = "$fpbnam";
///		$fpb_title = $row['led_name'] . "(";                        
///		$fpb_title .= $row['led_title'] .") bldg(";              
///		$fpb_title .= $row['led_bldg'] .") floor(";                             
///		$fpb_title .= $row['led_floor'].")";                                    
                                                                                        


// orig		$output .= "<a href=\"$php_self?q=zview/$zview_file/$zview_xml\" target=_blank ><img src=$tn_zview_file border=0></a><br><br>\n";
		$output .= "<a href=\"$php_self?q=zview/$zview_file/$zview_xml\" ";
		$output .= "class=\"screenshot_top\" rel=\"$fpbimg\" title=\"$fpb_title\" >\n";
		$output .= "<img src=$tn_zview_file border=0>\n";
		$output .= "	</a>\n";

///		$output .= "<a href=\"$php_self?q=zoom/$zoom_code/$zoomxml_code\" target=_blank><img src=$tn_zview_file border=0></a><br><br>\n";
		}
	else {
		$output .= "<a href=\"$php_self?q=zview/$zview_file/$zview_xml\" target=_blank ><img src=$fpbfile border=0></a><br><br>\n";
///		$output .= "<a href=\"$php_self?q=zoom/$zoom_code/$zoomxml_code\" target=_blank><img src=$fpbfile border=0></a><br><br>\n";
		}

//	leds_zviewer( $zoom_file, $zoom_path, $zoom_xml );
//	print( "<a href=\"$php_self?q=zview/$zview_file/$zview_xml\" target=_blank>zview $led_name</a><br><br>\n" );
//	print( "<a href=\"./fp_zviewer.php?file=$led_name&path=images/&xml=$zoom_xml\" target=_blank>zviewer $led_name</a><br>\n" );
//	$output .= "<a href=$php_self?q=leds_update_form/$led_name>update $led_name</a><br/>\n";
//	print( $output );
	return( $output );
	}

function docview($dbcode, $dbtable, $dbrowid, $page ) {
	$php_self=$_SERVER['PHP_SELF'];
	$user=$_SESSION['user'];
	$role=$_SESSION['role'];
	$dbfiles = $GLOBALS['dbfiles'];
	$roles = $GLOBALS['roles'];
	$dbs = $dbfiles[$role];
	$dbfile=$dbs[$dbcode]['dbfile'];

	$html = html_header($options);
	$html .= html_btn_squares($options);

///	print_r( $dbs );

	$output = "$php_self docview MSG:  user=[$user] role=[$role]<br>\n";
	

	if( $dbcode == "" ) { $output .= "<hr>$php_self ERR:  dbcode=[$dbcode]<hr>\n"; }
	if( $dbtable == "" ) { $output .= "<hr>$php_self ERR:  dbtable=[$dbtable]<hr>\n";  }
	if( $dbrowid == "" ) { $output .= "<hr>$php_self ERR:  dbrowid=[$dbrowid]<hr>\n";  }

//	$output .= "$php_self docview MSG_1510:  [$dbcode][$dbtable][$dbrowid] [$dbfile]<hr>\n";
///	print_r( $GLOBALS['dbfiles'] );
                                                                                                                           
	if( ! file_exists( $dbfile )) {
		$output .= "$php_self docview ERR_1514:  NOTFOUND dbcode=[$dbcode] dbfile=[$dbfile]<hr>\n";
		}

	if( file_exists( $dbfile )) {
//		$pdo = newpdo($GLOBALS['dbfile']);
//		print( "BUGS_1519 dbfile=[$dbfile][$dbtable]<br>\n" );
		$pdo = newpdo( $dbfile );
		$output .= "<html><head><title>fp docview $dbcode $dbtable $dbrowid</title></head>\n";
//		$output .= "<body bgcolor=lightgray>\n";
		$output .= "<body bgcolor=lightblue>\n";
		$output .= "<hr>fp docview $dbcode $dbtable $dbrowid<hr>\n";
		$output .= "<hr>\n";
		$output .= "<div class=docview>\n";
		$output .= "<table>\n";

		$sql = "select * from $dbtable where id=$dbrowid";
		foreach( $pdo->query($sql) as $row ) {
			$jobid=$row['jobid'];
			$pagetotal=$row['pagetotal'];

			$doc_pathfile=$row['tifffil'];
			$doc_paths = explode( $jobid, $doc_pathfile );
			$doc_rootpath = $doc_paths[0];
			$doc_file = $doc_paths[1];

			$doc_path = "$doc_rootpath"."$jobid";
			$doc_todopath = "$doc_rootpath"."todo_$jobid";
			$doc_donepath = "$doc_rootpath"."done_$jobid";
			$doc_failpath = "$doc_rootpath"."fail_$jobid";

			$docpath="";
			switch( true ) {
///				case is_dir( "C:\iperms\ltrs\images" ): $docpath="C:\iperms\ltrs\images"; break;
				case is_dir( $doc_path ): $docpath=$doc_path; break;
				case is_dir( $doc_todopath ): $docpath=$doc_todopath; break;
				case is_dir( $doc_donepath ): $docpath=$doc_donepath; break;
				case is_dir( $doc_failpath ): $docpath=$doc_failpath; break;
				}

			if( $docpath == "" ) {
				$output .= "$php_self docview MSG:  NOTFOUND docpath=[$docpath]<br>\n";
				return( $output );
				}

			$doc_pathfile="$docpath$doc_file";	

			if(( $page == "" ) | ( $page > $pagetotal )) {
//				$output .= "page=$page pagetotal=$pagetotal<hr>\n";
				$page="1";
				while( $page <= $pagetotal ) {
					$doc_pathfile_page= str_replace( ".tiff", ".0$page.tiff", $doc_pathfile );
					if( file_exists( $doc_pathfile_page )) {
						$output .= "<a href=$php_self?q=docview/$dbcode/$dbtable/$dbrowid/$page>";
						$output .= "$dbrowid $doc_file page $page</a><br>\n";
//						print( "BUGS_1576 FOUND page=[$page] $doc_pathfile_page<br>\n" );
						}
					else {
//						print( "BUGS_1576 NOTFOUND page=[$page] $doc_pathfile_page<br>\n" );
						$output .= "docview $doc_pathfile_page<br>\n";
						}
					$page++;
					}
				}
			else {
				$doc_pathfile_page= str_replace( ".tiff", ".0$page.tiff", $doc_pathfile );
				if( file_exists( $doc_pathfile_page )) {
//					$output .= "docview DISPLAY doc_pathfile_page=[$doc_pathfile_page]<br>\n";
					$image="";
					$fp = fopen( $doc_pathfile_page, 'r' );
					while( $line = fread($fp, 1024)) { $image .= $line; }
					fclose( $fp );
					header('Content-Type:  image/tiff');
					print( $image);
					return( $output );
					}
				}

//			$output .= "doc_pathfile=[$doc_pathfile]<br>\n";
//			$output .= "doc_pathfile_page=[$doc_pathfile_page]<br>\n";

//			for( $pagenum=1; $pagenum <= $pagetotal; $pagenum++ ) {
//				$output .= "doc_pathfile_page=[$doc_pathfile_page]<br>\n";
//				}

//			$output .= "$dbrowid jobid=[$jobid] doc_pathfile=[$doc_pathfile]<br>\n";
//			$output .= "doc_path=[$doc_path] doc_file=[$doc_file]<br>\n";
//			$output .= "pagetotal=[$pagetotal] doc_file=[$doc_file]<br>\n";
			}

		$output .= "</table>\n";
		$output .= "</div>\n";
		$output .= "<hr>\n";
//		$output .= "</body></html>\n";
		}

	$html .= $output;
	$html .= html_footer($options,"");
	print( $html );
	}

function leds_query() {
	html_header();

	$limit=1000;

        $php_self=$_SERVER['PHP_SELF'];
        $http_host=$_SERVER['HTTP_HOST'];
        $request_uri=$_SERVER['REQUEST_URI'];
	$tblname=$GLOBALS['tblname'];




	$dbfile="/var/www/html/ka1/$tblname";
	$sql = "select * from $tblname";
	$sql = "select * from leds $tblname led_dttm == 'current'";


	$dbfile="C:/iperms/ko/bin/iperms.db";
	$sql = "select * from periods limit $limit";
	$sql = "select * from jobs limit $limit";
	$sql = "select id, type, filnam, wc from jobs limit $limit";

//	$dbfile="C:/iperms/aors/bin/aors.db";
//	$sql = "select * from wl limit $limit";

//	$dbfile="C:/iperms/ltrs/bin/ltrs.db";
//	$sql = "select * from wl limit $limit";

	print( "<hr>$php_self leds_query MSG:  sql=[$sql] dbfile=[$dbfile] <hr>\n");
	$pdo = newpdo($dbfile);

	print( "<a href=$php_self>\n" );
	print( "<img src=\"btn_white.gif\" alt=\"btn_white\" border=0 height=\"20\" width=\"20\" />" );
	print( "</a>\n" );
	print( "<hr>\n" );

	print( "<div id=\"hrc\" >\n" );

//	$sql = "SELECT * FROM periods LIMIT 10";
//	$sql = "SELECT fy,p,pp,wk,enddt FROM periods LIMIT 3";
	try {
//		$stmt = $pdo->prepare($sql, array(PDO::ATTR_CURSOR, PDO::CURSOR_SCROLL));
//		$stmt->execute();

		$stmt = $pdo->query($sql);
//		$result = $stmt->fetch(PDO::FETCH_BOTH);
		$result = $stmt->fetch(PDO::FETCH_ASSOC);


		$output = "<table>\n";
		$output .= "<tr><td>key</td><td>val</td></tr>\n";
		foreach($result as $key=>$val ) {
			$output .= "<tr><td>$key</td><td>$val</td></tr>\n";
			}
		$output .= "</table>\n";
		print( "$output" );
		

//		while ($row = $stmt->fetch(PDO::FETCH_BOTH, PDO::FETCH_ORI_NEXT)) {
//			$collim=count($row);
//
//			print( "collim=[$collim] count(row)=[".count($row)."<hr>\n" );
//			$data = $row[0] . "\t" . $row[1] . "\t" . $row[2] . "<br>\n";
//			print $data;
//
//			print_r($row);
//			for( $collim=0; $c<$collim; $col++ ) {
//
//				print( "collim=$collim col=$col row[collim]=".$row[$col]."<br>\n" );
//				}
//
//			}
		$stmt = null;
		$pdo = null;
		}
	catch (PDOException $e) {
		print $e->getMessage();
		}

	print( "<hr>$php_self leds_query END<hr>\n" );

	return;




	$sth = $pdo->prepare( $sql );
	$sth->execute();
	$result = $sth->fetch(PDO::FETCH_BOTH);
	print_r($result);
	return;




	$pdo->query($sql);
	foreach( $pdo->query($sql) as $row ) {
		$output = 
			$row['led_name'] . ' - ' .
			$row['led_dttm'] . ' - ' .
			$row['led_color' ] . ' - ' .
			$row['led_speed' ] . ' - ' .
			' <br />';
		print( "$output" );
		}

	print( "</div>\n" );
	print( "<hr>\n" );
	$pdo = null;

	}



function html_header() {
///	$et=">";
//	header("Content-type: text/vnd.wap.wml");
//	$output  = "<?xml version=\"1.0\"?$et\n";

//	print( "<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.0//EN\" \"http://www.wapforum.org/DTD/xhtml-mobile10.dtd\">\n" );
//	print( "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n\n" );

///	$output .= "<!DOCTYPE html PUBLIC \"-//OMA//DTD XHTML MOBILE 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">\n";
///	$output .= "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n\n";
//	$output = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n\n";
//	$output .= "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n";
//	$output .= "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n";

	$output  = "";
	$output .= "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n";
//	$output .= "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n";
	$output .= "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n"; 
	$output .= "<head>\n";
	$output .= js_scripts();
//	$output .= css_rollovers_head( $options );
	$output .= "</head>\n";
	return( $output );

	}

// pending
function jqgrid_login_form( $options ) {
	$output = "";
	$output .= "<table id=\"login_form\" class=\"scroll\" cellpadding=\"0\" cellspacing=\"0\">\n";
	$output .= "</table>\n";

	$output .= "<script type=\"text/javascript\">\n";
//	$output .= "var gridimgpath = 'js/jqgrid-3.5.3/themes/redmond/images';\n";
	$output .= "var gridimgpath = 'js/jqgrid-4.4.0/themes/redmond/images';\n";
	$output .= "jQuery(\"#login_form\").jqGrid({\n";
	$output .= " datatype: \"xml\",\n";
//	$output .= " datatype: \"local\",\n";
	$output .= " url:'http://$http_host$php_self?q=login_validate'\n";
	$output .= " urledit:'http://$http_host$php_self?q=login_validate'\n";
	$output .= " height: 250,\n";
	$output .= " colNames:['user','pass'],\n";
	$output .= " colModel:[ \n";
	$output .= "	{name:'user',index:'user', width:60 },\n";
	$output .= "	{name:'pass',index:'user', width:60 }\n";
	$output .= "	{name:'sid',index:'sid', width:60 },\n";
	$output .= " ], \n";
	$output .= "imgpath: gridimgpath,\n";
	$output .= "multiselect: true,\n";
	$output .= "caption: \"login\"\n";
	$output .= "});\n";
	$output .= "</script>\n";
	return( $output );
	}

function leds_login_form( $options ) {
	$html = html_header($options);
	$html .= html_btn_squares($options);

///	html_header();
	$query_string = $_SERVER['QUERY_STRING'];
	$user = $_POST['user'];
	$role = $_POST['role'];
	$sid = $_POST['sid'];
//	$pass = $_POST['pass'];
	$step = $_POST['step'];

//	$jqgrid_login_html=jqgrid_login_form( $options );
//	print( $jqgrid_login_html );
//	print( "<hr>jqgrid_login_html<hr>\n" );

///	leds_show();
//	print( "$progid $dttm ka1_login MSG_3070:  g_allowflag=[$g_allowflag] allowflag=[$allowflag]<br>\n" );
//	print( "$progid $dttm ka1_login MSG_3071:  user=[$user] role=[$role] step=[$step] id=[$id] [$query_string]<br>\n" );

	$php_self=$_SERVER['PHP_SELF'];
	$allowflag = $GLOBALS['allowflag'];
	$allowflag_fields=split( " ", $allowflag );
	$user=$allowflag_fields[2];

///	print( "<head><title>ka1_login</title>\n" );

//	css_rollovers_head($options );
//	js_fgmenu_head( $options );

///	print( "</head>\n" );
///	$output .= "<body bgcolor=\"lightgrey\">\n";
//	$output .= "<h1>ka1_login_form allowflag=[$allowflag] user=[$user] </h1>\n";
///	$output .= "<h2>ka1_login_form  allowflag=[$allowflag] user=[$user]</h2>\n";
	$output .= "<h2>ka1_login_form</h2>\n";
	$output .= "<form method=\"post\" action=\"$php_self?q=login_validate\">\n";
	$output .= "user: <input type=\"text\" name=\"user\"  value=\"$user\"  /><br/>\n";

        $output .= "_pin: <input type=\"password\" name=\"pass\" /><br/>\n";
	$output .= "<br>\n";
	$output .= "<font size=1>\n";
        $output .= "newpass1: <input type=\"password\" name=\"newpass1\" /><br/>\n";
        $output .= "newpass2: <input type=\"password\" name=\"newpass2\" /><br/>\n";
	$output .= "<input type=\"hidden\" name=\"role\" value=\"$role\"/>\n";
	$output .= "<input type=\"hidden\" name=\"sid\" value=\"$sid\"/>\n";
	$output .= "<input type=\"hidden\" name=\"step\" value=\"login\"/>\n";
	$output .= "<input type=\"hidden\" name=\"query_string\" value=\"$query_string\"/>\n";
	$output .= "</font>\n";
	$output .= "<p>\n";
	$output .= "<input type=\"submit\"/>\n";
	$output .= "<input type=\"reset\"/>\n";
	$output .= "</p>\n";
	$output .= "</form>\n";

//	$output .= jqgrid_login_form( $options );

// ssh to l1033 
	$sshurl_ip ="ssh://147.238.94.126";
	$sshurl_name = "ssh://l1033";

//	$html_ssh  = "\n";
//	$html_ssh .= "<hr>\n";
//	$html_ssh .= "<a href=$sshurl_ip target=_blank>$sshurl_ip</a><br>\n";
//	$html_ssh .= "<a href=$sshurl_name target=_blank>$sshurl_name</a><br>\n";
//	$html_ssh .= "<hr>\n";
//	$html_ssh .= "\n";
//
//	$html .= $html_ssh;

	$html .= $output;
       	$html .= html_footer($options,"");

	print( $html );
	}

function ldap_authenticate() {
// proxy1389.ldif
// dn: cn=proxyagent,ou=Profile,dc-hrc,dc=mil
// changeType: modify
// replace: userPassword
// userPassword: _________________

///        $ldapconfig['host'] = 'localhost';
///        $ldapconfig['port'] = NULL;
///        $ldapconfig['basedn'] = 'dc=localhost,dc=com';
///        $ldapconfig['authrealm'] = 'MSSE ldap Realm';

        global $ldapconfig;
        global $PHP_AUTH_USER;
        global $PHP_AUTH_PW;

        if ($PHP_AUTH_USER != "" && $PHP_AUTH_PW != "") {
                $ds=@ldap_connect($ldapconfig['host'],$ldapconfig['port']);
                $r = @ldap_search( $ds, $ldapconfig['basedn'], 'uid=' . $PHP_AUTH_USER);
                if ($r) {
                        $result = @ldap_get_entries( $ds, $r);
                        if ($result[0]) {
                                if (@ldap_bind( $ds, $result[0]['dn'], $PHP_AUTH_PW) ) {
                                        return $result[0];
                                        }
                                }
                        }
                }

        header('WWW-Authenticate: Basic realm="'.$ldapconfig['authrealm'].'"');
        header('HTTP/1.0 401 Unauthorized');
	return NULL;

///        if (($result = ldap_authenticate()) == NULL) {
///                echo('Authorization Failed');
///                exit(0);
///                }

///        echo('Authorization success');
///        print_r($result);
        }


function leds_login_validate( $options ) {
	$pdo = newpdo($GLOBALS['dbfile']);
	$user = $_POST['user'];
	$pass = $_POST['pass'];
	$role = $_POST['role'];
	$sid = $_POST['sid'];
	$step = $_POST['step'];
	$newpass1 = "";
	$newpass2 = "";
	if( isset( $_POST['newpass1'] )) { $newpass1 = $_POST['newpass1']; }
	if( isset( $_POST['newpass2'] )) { $newpass2 = $_POST['newpass2']; }

	$user_code=strtolower($user);
	$user_pass=strtolower($pass);
	$user_newpass1 = strtolower($newpass1);
	$user_newpass2 = strtolower($newpass2);
	$validate="0";

//	print( "$php_self leds_login_validate MSG_1678:  sql=[$user][$pass] [$user_code][$user_pass]<br/>\n" );
//	print( "$php_self leds_login_validate MSG_1679:  u=[$user][$pass] r=[$role] step=[step] sid=[$sid]<br/>\n" );

	$pwfile="/etc/passwd";
	$allowflag="false";
	if( file_exists( $pwfile )) {
//		printf( "$progid $dttm MSG:_200:  FOUND filename=[$filename][$remote_addr][$php_self]<br>\n" );
		$fp = fopen( $pwfile, 'r' );
		while( $line = fread($fp, 1024)) { 
			$image .= $line;
//			if( $remote_addr == $line ) { printf( "ALLOW<br>\n" ); }
			if( preg_match( "/$user/", $line, $matches)) {
//				printf( "$progid $dttm msg_4126_in_pwfile: pwfile=[$pwfile] [$remote_addr][$matches[0]]<br>\n" );		
				$logrec="$progid|$dttm|msg_4126_in_pwfile|$remote_addr|$user|$email|allow|\n"; logwrite( $logfil, $logrec );
				$allowflag="true";
				break;
				}
//			printf( "$progid $dttm MSG_110:  line=[$line]<br>\n" );
			}
		fclose( $fp );
		}

	if( $user == "admin" ) { 
		$allowflag="true"; 
		$logrec="$progid|$dttm|msg_4137_allow_admin|$remote_addr|$user|$email|admin|\n"; logwrite( $logfil, $logrec );
		}
	if( $allowflag == "false" ) {
		printf( "$php_SELF leds_login_validate:  user=[$user] LOGIN NOT ALLOWED<br>\n" );
		$logrec="$progid|$dttm|err_4141_notin_pwfile|$remote_addr|$user|$email||\n"; logwrite( $logfil, $logrec );
		}


	$sql = "select * from users where user_code == '$user_code' and user_pass == '$user_pass' and user_status == 'a'";
//	print( "$php_self leds_login_validate MSG_1680:  sql=[$sql]<br/>\n" );

	foreach( $pdo->query($sql) as $row ) {
		$output = 
			"user=[". $row['user_code'] . '] ' .
//			$row['user_pass'] . ' - ' .
			"role=[" . $row['user_role'] . ']' .
			$row['user_status'] . ' - ' .
			' <br />';
			print( "leds_login_validate MSG_1690:  $output\n" );
			if( $user_code == $row['user_code'] 
			&&  $user_pass == $row['user_pass'] 
			&&  $row['user_status'] == 'a' )  {
				$validate=1;
				$user=$row['user_code'];
				$role=$row['user_role'];
				break;
//				print( "$php_self leds_login_validate MSG:  VALID USER $user<br/>\n" );
//				$logrec="$progid|$dttm|bugs_4164|$remote_addr|$user|$email|valid|\n"; logwrite( $logfil, $logrec );
//				print( "$php_self leds_login_validate MSG:  VALID USER logrec=$logrec<br/>\n" );
				}
		}
	if( $validate == 1 ) {
		$_SESSION['id'] = session_id(); 
		$_SESSION['user'] = $row['user_code'];
		$_SESSION['name'] = $row['user_name'];
		$_SESSION['pagelines'] = $row['user_pagelines'];
		$_SESSION['role'] = $row['user_role'];
//		print( "$php_self leds_login_validate MSG: validate=[$validate] </br>\n" );
//		print( "$php_self leds_login_validate MSG: r_user=[".$row['user_code']."] </br>\n" );
//		print( "$php_self leds_login_validate MSG: r_role=[".$row['user_role']."] <br/>\n" );
//		print( "$php_self leds_login_validate MSG: s_id=[".$_SESSION['id']."] <br/>\n" );
//		print( "$php_self leds_login_validate MSG: s_user=[".$_SESSION['user']."] </br>\n" );
//		print( "$php_self leds_login_validate MSG: s_role=[".$_SESSION['role']."] <br/>\n" );
//		print( "$php_self leds_login_validate MSG:  u=[$user][$pass] r=[$role] step=[step] sid=[$sid]<br/>\n" );
//		print_r( $_SESSION );
//		$_SESSION['user'] = $_POST['user'];
//		$_SESSION['data'] = $_POST['data'];

		$id=$_SESSION['id'];
		$user=$_SESSION['user'];
		$name=$_SESSION['name'];
		$role=$_SESSION['role'];

		printf( "BUGS_4190:  validate=$validate id=[$id] user=[$user] name=[$name] role=[$role]<br>\n" );
		$logrec="$progid|$dttm|msg_4191_login_success|$remote_addr|$user|$email|$name|$role|$id||\n"; logwrite( $logfil, $logrec );

// change passwd implied
		if(( $user_newpass1 != "" ) && ( $user_newpass2 != "" )) {
			if( $user_newpass1 == $user_newpass2 ) {
				$sql_chgpass  = "update users ";
				$sql_chgpass .= "set user_pass = '$user_newpass1' ";
				$sql_chgpass .= "where user_code == '$user_code' and user_pass == '$user_pass' and user_status == 'a';";

				$html_newpass = "$progid $dttm MSG_3400: user_newpass1=[$user_newpass1] user_newpass2=[$user_newpass2]<br>\n";
				$html_newpass .= "sql_chgpass=[$sql_chgpass]<br>\n";

///				print( $html_newpass );
				$pdo = newpdo($GLOBALS['dbfile']);
				$pdo->exec($sql_chgpass);
				$pdo = null;
				$logrec="$progid|$dttm|bugs_4191_pwchange_success|$remote_addr|$user|$email|$name|$role|$id||\n"; logwrite( $logfil, $logrec );
///				print( $html_newpass );
				}
			else {
///				$html_newpass = "$progid $dttm MSG_3401: user_newpass1=[$user_newpass1] user_newpass2=[$user_newpass2]<br>\n";
///				print( $html_newpass );
				$logrec="$progid|$dttm|bugs_4191_pwchange_fail|$remote_addr|$user|$email|$name|$role|$id||\n"; logwrite( $logfil, $logrec );
				}
			}
		else {
///			$html_newpass = "$progid $dttm MSG_3402: user_newpass1=[$user_newpass1] user_newpass2=[$user_newpass2]<br>\n";
///			print( $html_newpass );
			}


	        $html = html_header($options);
		$html .= html_btn_squares($options);
		$html .= leds_show( $options );
//      	$html .= html_btn_themes($options,"");
//      	$html .= html_btn_roles($options,"");
//      	$html .= html_btn_orgs($options,"");
//      	$html .= html_btn_hotspots($options,"");
        	$html .= html_footer($options,"");
	        print( $html );
		leds_menu( $options );
		}
	else {
		leds_login_form( $options );
		}
//	return( $validate );
	}


function leds_logout( $options ) {
//	session_start();
//	$_SESSION = array();
//	if( isset($_COOKIE[session_name()])) {
//		setcookie(session_name(), '', time()-42000, '/');
//		}
//	print( "$php_self leds_logout MSG: validate=[$validate] </br>\n" );
//	print( "$php_self leds_logout MSG: r_user=[".$row['user_code']."] </br>\n" );
//	print( "$php_self leds_logout MSG: r_role=[".$row['user_role']."] <br/>\n" );
//	print( "$php_self leds_logout MSG: s_id=[".$_SESSION['id']."] <br/>\n" );
//	print( "$php_self leds_logout MSG: s_user=[".$_SESSION['user']."] </br>\n" );
//	print( "$php_self leds_logout MSG: s_role=[".$_SESSION['role']."] <br/>\n" );
//	print( "$php_self leds_logout MSG:  u=[$user][$pass] r=[$role] step=[step] sid=[$sid]<br/>\n" );
//	print( "leds_logout MSG:  [$user][$role][$step] [$query_string]<br>\n" );


	$id=$_SESSION['id'];
	$user=$_SESSION['user'];
	$role=$_SESSION['role'];
	$logrec="$progid|$dttm|bugs_4259_logout|$remote_addr|$user|$email|$name|$role|$id|logout|\n"; logwrite( $logfil, $logrec );

	if( isset($_SESSION['id'])) { unset($_SESSION['id']); }
	if( isset($_SESSION['user'])) { unset($_SESSION['user']); }
	if( isset($_SESSION['role'])) { unset($_SESSION['role']); }
	session_destroy();

        $html = html_header($options);                                                                                              
        $html .= html_btn_squares($options);                                                                                        
        $html .= leds_show( $options );                                                                                             
//      $html .= html_btn_themes($options,"");                                                                                      
//      $html .= html_btn_roles($options,"");                                                                                       
//      $html .= html_btn_orgs($options,"");                                                                                        
//      $html .= html_btn_hotspots($options,"");                                                                                    
        $html .= html_footer($options,"");                                                                                          
        print( $html );                                                                                                             
	}

function leds_update_form( $options ) {
	$html = "";
	$html .= html_header();

	$php_self=$_SERVER['PHP_SELF'];
	$query_string=$_SERVER['QUERY_STRING'];
	$user=$_POST['user'];
	$pass=$_POST['pass'];
	$step=$_POST['step'];
	$tblname=$GLOBALS['tblname'];
	$led_name=$options[1];


	$html .= html_btn_squares($options);
	$html .= leds_show();

	$dbfile=$GLOBALS['dbfile'];
	$pdo = newpdo($dbfile);
	$sql = "select * from $tblname where led_dttm='current' and led_name == '$led_name'";



	foreach( $pdo->query($sql) as $row ) {
		$led_name = $row['led_name'];
		$led_color = $row['led_color'];
		$led_speed = $row['led_speed'];
		$led_type = $row['led_type'];
		$led_date = $row['led_date'];
		$led_cmd = $row['led_cmd'];
		$led_cmdout = $row['led_cmdout'];
		$led_desc = $row['led_desc'];
		$led_misc = $row['led_misc'];
		$led_err = $row['led_err'];
		$led_fix = $row['led_fix'];
		$led_os = $row['led_os'];
		$led_comment = $row['led_comment'];
		}
	$pdo = null;

	$dttm=date("Ymd_His");

	$html .= "<hr>leds_admin<hr>\n";
	$html .= "<head><title>leds_update_form $dttm</title></head>\n";

	$html .= "<body bgcolor=\"lightblue\">\n";
	$html .= "<b>leds_update_form</b>\n";
	$html .= "<h2>$query_string [$user][$pass][$step][$options[0][$options[1]]</h2>\n";
	$html .= "<h4>dbfile=[$dbfile] <br>sql=[$sql]</h4>\n";

	$html .= "<form method=\"post\" action=\"$php_self?q=leds_update/$led_name\" enctype=\"multipart/form-data\">\n";
//	$html .= "user: <input name=\"user\"/><br/>\n";
//      $html .= "pass: <input type=\"pass\" name=\"pass\"/><br/>\n";

	$html .= "<br/>\n";
//	$html .= "led:\n";
//	$html .= "<select name=\"led\">\n";
//	$html .= "<option value=\"led1\" >led1</option>\n";
//	$html .= "<option value=\"led2\">led2</option>\n";
//	$html .= "<option value=\"led3\">led3</option>\n";
//	$html .= "</select><br/>\n";

//	$html .= "led_name=[$led_name][$led_color][$led_speed][$led_type]<br>\n";
//	$html .= "[$led_date][$led_cmd][$led_desc][$led_misc]<br>\n";
//	$html .= "[$led_comment][$led_filename]<br /><br />\n";

	$type_manual_checked = "";
	$type_date_checked = "";
	$type_cmd_checked = "";
	if(( $led_type == "manual" ) || ( $led_type == "" )) { $type_manual_checked = "checked"; }
	if( $led_type == "date" ) { $type_date_checked = "checked"; }
	if( $led_type == "cmd" ) { $type_cmd_checked = "checked"; }

	$html .= "<table>\n";

	$html .= "<tr>\n";
        $html .= "<td>type: </td>";
	$html .= "<td>\n";
	$html .= "<input type=\"radio\" name=\"type\" value=\"manual\" $type_manual_checked />manual";
	$html .= "<input type=\"radio\" name=\"type\" value=\"date\" $type_date_checked />date";
	$html .= "<input type=\"radio\" name=\"type\" value=\"cmd\" $type_cmd_checked />cmd";
	$html .= "</td>\n";
	$html .= "</tr>\n";
//	$html .= "<br>\n";

	$red_checked = "";
	$blu_checked = "";
	$grn_checked = "";
	if( $led_color == "red" ) { $red_checked = "checked"; }
	if( $led_color == "blu" ) { $blu_checked = "checked"; }
	if( $led_color == "grn" ) { $grn_checked = "checked"; }


	$html .= "<tr>\n";
        $html .= "<td>color: </td>";
	$html .= "<td>\n";
	$html .= "<input type=\"radio\" name=\"color\" value=\"red\" $red_checked />red";
	$html .= "<input type=\"radio\" name=\"color\" value=\"blu\" $blu_checked />blue";
	$html .= "<input type=\"radio\" name=\"color\" value=\"grn\" $grn_checked />green";
	$html .= "</td>\n";
	$html .= "</tr>\n";

	$os_aac_checked="";
	$os_aix_checked="";
	$os_hpx_checked="";
	$os_ios_checked="";
	$os_sol_checked="";
	$os_uss_checked="";
	$os_win_checked="";
	if( $led_os == "aac" ) { $os_aac_checked = "checked"; }
	if( $led_os == "aix" ) { $os_aix_checked = "checked"; }
	if( $led_os == "hpx" ) { $os_hpx_checked = "checked"; }
	if( $led_os == "ios" ) { $os_ios_checked = "checked"; }
	if( $led_os == "sol" ) { $os_sol_checked = "checked"; }
	if( $led_os == "uss" ) { $os_uss_checked = "checked"; }
	if( $led_os == "win" ) { $os_win_checked = "checked"; }
	if( $led_os == "" ) { $os_aac_checked = "checked"; }

//	$html .= "<br/>\n";
	$html .= "<tr>\n";
	$html .= "<td>os: </td>";
	$html .= "<td>\n";
	$html .= "<input type=\"radio\" name=\"led_os\" value=\"aac\" $os_aac_checked />aac";
	$html .= "<input type=\"radio\" name=\"led_os\" value=\"aix\" $os_aix_checked />aix";
	$html .= "<input type=\"radio\" name=\"led_os\" value=\"hpx\" $os_hpx_checked />hpx";
	$html .= "<input type=\"radio\" name=\"led_os\" value=\"ios\" $os_ios_checked />ios";
	$html .= "<input type=\"radio\" name=\"led_os\" value=\"sol\" $os_sol_checked />sol";
	$html .= "<input type=\"radio\" name=\"led_os\" value=\"uss\" $os_uss_checked />uss";
	$html .= "<input type=\"radio\" name=\"led_os\" value=\"win\" $os_win_checked />win";
	$html .= "</td>\n";
	$html .= "</tr>\n";


	if( $led_speed == "00" ) { $select_speed_00 = "selected"; }
	if( $led_speed == "10" ) { $select_speed_10 = "selected"; }
	if( $led_speed == "20" ) { $select_speed_20 = "selected"; }
	if( $led_speed == "30" ) { $select_speed_30 = "selected"; }
	if( $led_speed == "40" ) { $select_speed_40 = "selected"; }
	if( $led_speed == "50" ) { $select_speed_50 = "selected"; }
	if( $led_speed == "60" ) { $select_speed_60 = "selected"; }
	if( $led_speed == "70" ) { $select_speed_70 = "selected"; }
	if( $led_speed == "80" ) { $select_speed_80 = "selected"; }
	if( $led_speed == "90" ) { $select_speed_90 = "selected"; }


//	$html .= "<br/>\n";
	$html .= "<tr>\n";
	$html .= "<td>speed:  </td>\n";
	$html .= "<td>\n";
	$html .= "<select name=\"speed\">\n";


	$html .= "<option $select_speed_00 value=\"00\" >0</option>\n";
	$html .= "<option $select_speed_10 value=\"10\">1</option>\n";
	$html .= "<option $select_speed_20 value=\"20\">2</option>\n";
	$html .= "<option $select_speed_30 value=\"30\">3</option>\n";
	$html .= "<option $select_speed_40 value=\"40\">4</option>\n";
	$html .= "<option $select_speed_50 value=\"50\">5</option>\n";
	$html .= "<option $select_speed_60 value=\"60\">6</option>\n";
	$html .= "<option $select_speed_70 value=\"70\">7</option>\n";
	$html .= "<option $select_speed_80 value=\"80\">8</option>\n";
	$html .= "<option $select_speed_90 value=\"90\">9</option>\n";
	$html .= "</select><br/>\n";
	$html .= "</td>\n";
	$html .= "</tr>\n";


//	$html .= "<br />\n";
//      $html .= "led_err: <input size=\"256\" type=\"text\" name=\"led_err\" value=\"$led_err\"/><br/>\n";

        $html .= "<tr><td>led_err: </td><td><textarea rows=\"2\" cols=\"40\" name=\"led_err\">$led_err</textarea><br/></td></tr>\n";
        $html .= "<tr><td>led_fix: </td><td><textarea rows=\"2\" cols=\"40\" name=\"led_fix\">$led_fix</textarea><br/></td></tr>\n";

        $html .= "<tr><td>date: </td><td><input type=\"text\" name=\"date\" value=\"$led_date\"/><br/></td></tr>\n";
        $html .= "<tr><td>cmd: </td><td><input type=\"text\" name=\"cmd\" value=\"$led_cmd\"/></td></tr>\n";
        $html .= "<tr><td>cmdout: </td><td><input type=\"text\" name=\"cmdout\" value=\"$led_cmdout\"/></td></tr>\n";
        $html .= "<tr><td>desc: </td><td><input type=\"text\" name=\"desc\" value=\"$led_desc\"/></td></tr>\n";
        $html .= "<tr><td>misc: </td><td><input type=\"text\" name=\"misc\" value=\"$led_misc\"/></td></tr>\n";

//      $html .= "<tr><td>status: </td><td>\n";
//	$html .= "<input type=\"checkbox\" name=\"status\" value=\"0\"/>0\n";
//	$html .= "<input type=\"checkbox\" name=\"status\" value=\"1\"/>1\n";
//	$html .= "<input type=\"checkbox\" name=\"status\" value=\"2\"/>2\n";
//	$html .= "<input type=\"checkbox\" name=\"status\" value=\"3\"/>3\n";
//	$html .= "</td></tr>\n";

        $html .= "<tr><td>publish: </td><td>";
	$html .= "<input type=\"radio\" name=\"published\" value=\"1\" \"checked\" />true";
	$html .= "<input type=\"radio\" name=\"published\" value=\"0\" />false";
	$html .= "</td></tr>\n";

        $html .= "<tr><td>comment: </td><td><input type=\"text\" name=\"comment\" value=\"$led_comment\"/></td></tr>\n";

	$html .= "<tr><td>upload:  </td><td><input type=\"file\" name=\"uploaded\" /></td></tr>\n";


	$html .= "<tr><td> &nbsp </td><td><input type=\"hidden\" name=\"user\" value=\"$user\"/></td></tr>\n";
	$html .= "<tr><td> &nbsp </td><td><input type=\"hidden\" name=\"pass\" value=\"$pass\"/></td></tr>\n";
	$html .= "<tr><td> &nbsp </td><td><input type=\"hidden\" name=\"step\" value=\"update\"/></td></tr>\n";
	$html .= "<tr><td> &nbsp </td><td><input type=\"hidden\" name=\"query_string\" value=\"$query_string\"/></td></tr>\n";
	$html .= "<tr><td> &nbsp </td><td><input type=\"hidden\" name=\"uploaded_loos\" value=\"'". $globals['uploaded']."'\"/></td></tr></td></tr>\n";

	$html .= "</table>\n";

	$html .= "<hr/>\n";
	$html .= "<p>\n";

	$html .= "<input type=\"submit\" name=\"update\" value=\"update\"/>\n";
	$html .= "<input type=\"reset\"/>\n";
	$html .= "</p>\n";
	$html .= "</form>\n";
	$html .= "</body>\n";
	$html .= "<html>\n";
	print( $html );
	}


function leds_update( $options ) {
	html_header();
	$php_self=$_SERVER['PHP_SELF'];

	$led_name=$options[1];
	$led_dttm=date("Y-m-d H:i:s");
	$led_user_ip=$_SERVER['REMOTE_ADDR'];
	$led_referer=$_SERVER['REFERER'];
	$led_remote_port=$_SERVER['REMOTE_PORT'];

	$query_string=$_SERVER['QUERY_STRING'];
	$user=$_POST['user'];
	$pass=$_POST['pass'];
	$step=$_POST['step'];

	$led_user=$_POST['user'];
	$led_color=$_POST['color'];
	$led_speed=$_POST['speed'];
	$led_err=$_POST['led_err'];
	$led_fix=$_POST['led_fix'];
	$led_os=$_POST['led_os'];
	$led_type=$_POST['type'];
	$led_date=$_POST['date'];
	$led_cmd=$_POST['cmd'];
	$led_cmdout=$_POST['cmdout'];
	$led_desc=$_POST['desc'];
	$led_misc=$_POST['misc'];
	$led_comment=$_POST['comment'];
	$led_filename=$_POST['filename'];
	$led_published=$_POST['published'];


//	print( "leds_update MSG:  user=[$user][$pass][$step] [$query_string]<br />\n" );
//	print( "leds_update MSG:  name=[$led_name][$led_color][$led_speed][$led_comment][$led_user]<br/>\n" );
//	print( "leds_update MSG:  filename=[$led_filename] published=[$led_published]<br/>\n" );

	if(isset($_FILES['uploaded']) && !empty($_FILES['uploaded']['name'])) {
//		print_r($_FILES);
//		$led_filename = ko_upload( $led_user );

		$html_scrub = ko_upload( $led_user );

///		print( "$php_self leds_update MSG_2333:  led_user=[$led_user] led_filename=[$led_filename]<br>\n" );
//		ko_upload2();
		}


	$sqlupd = "update leds  set ";
	$sqlupd .= "led_color='$led_color', led_speed='$led_speed', ";
	$sqlupd .= "led_err='$led_err', ";
	$sqlupd .= "led_fix='$led_fix', ";
	$sqlupd .= "led_os='$led_os', ";
	$sqlupd .= "led_type='$led_type', ";
	$sqlupd .= "led_date='$led_date', ";
	$sqlupd .= "led_cmd='$led_cmd', ";
	$sqlupd .= "led_cmdout='$led_cmdout', ";
	$sqlupd .= "led_desc='$led_desc', ";
	$sqlupd .= "led_misc='$led_misc', ";
	$sqlupd .= "led_comment='$led_comment', ";
	$sqlupd .= "led_user='$led_user', led_user_ip='$led_user_ip', led_referer='$led_referer', ";
	$sqlupd .= "led_filename='$led_filename', led_published='$led_published' ";
 	$sqlupd .= "where led_dttm='current' and led_name == '$led_name'";

	$option0=$options[0];
	$option1=$options[1];
	$option2=$options[2];
	print( "<hr>MSG_6280 o0=$option0 o1=$options1 $options2  sqlupd=[$sqlupd]<br />\n" );

	$sqladd = "insert or replace into nodes (";
	$sqladd .= "node_name, node_dttm, node_color, node_speed, ";
	$sqladd .= "node_comment, node_user, node_user_ip, node_referer, ";
	$sqladd .= "node_filename, node_published ";
	$sqladd .= ") ";
	$sqladd .= " values ( ";
	$sqladd .= "\"$led_name\", \"$led_dttm\", \"$led_color\", \"$led_speed\", ";
	$sqladd .= "\"$led_comment\", \"$led_user\", \"$led_user_ip\", \"$led_referer\", ";
	$sqladd .= "\"$led_filename\", \"$led_published\" ) ";
//	print( "<hr>sqladd=[$sqladd]<br />\n" );


	$pdo = newpdo($GLOBALS['dbfile']);
	$pdo->exec($sqlupd);
	$pdo->exec($sqladd);
	$pdo = null;

	$html_btn_squares = html_btn_squares($options);
	$html_head .= html_header($options);
	$html_body = leds_show();
	$html_footer = html_footer( $options );
	$html = $html_head . $html_btn_squares . $html_body .  $html_scrub . $html_foot;
	print( $html );
	}

function scrub_upload_form( $options ) {
	$html_head = html_header($options);

	$php_self=$_SERVER['PHP_SELF'];
	$query_string=$_SERVER['QUERY_STRING'];
	$user="user";
	$pass="pass";
	$step="step";
	$db3="uploads.db3";
	$tblname="uploads";
	if( isset($_REQUEST['user'])) { $user=$_REQUEST['user']; }
	if( isset($_REQUEST['pass'])) { $pass=$_REQUEST['pass']; }
	if( isset($_REQUEST['step'])) { $step=$_REQUEST['step']; }
	if( isset($GLOBALS['dbfile'])) { $tblname=$GLOBALS['dbfile']; }
	if( isset($GLOBALS['tblname'])) { $tblname=$GLOBALS['tblname']; }
	$led_name="uploads";
//	$led_name=$options[1];
	$options="";
	leds_show($options);
	return("");

	$pdo = newpdo($GLOBALS['dbfile']);
	$sql = "select * from $tblname where led_dttm='current' and led_name == '$led_name'";

	foreach( $pdo->query($sql) as $row ) {
		$led_name = $row['led_name'];
		$led_color = $row['led_color'];
		$led_speed = $row['led_speed'];
		$led_type = $row['led_type'];
		$led_date = $row['led_date'];
		$led_cmd = $row['led_cmd'];
		$led_cmdout = $row['led_cmdout'];
		$led_desc = $row['led_desc'];
		$led_misc = $row['led_misc'];
		$led_comment = $row['led_comment'];
		}
	$pdo = null;

	$html_btn_squares = html_btn_squares($option);

//	$html .= "<head><title>scrub_upload_form</title></head>\n";
//	print( "<hr>leds_admin<hr>\n" );
//	print( "<head><title>scrub_upload_form</title></head>\n" );

	$html_scrub_form  = "<b>scrub_upload_form</b>\n";


	$html_scrub_form .= "<form method=\"post\" action=\"$php_self?q=scrub_upload\" enctype=\"multipart/form-data\">\n";
	$html_scrub_form.= "<br/>\n";

	$html_scrub_form .= "upload:  <input type=\"file\" name=\"uploaded\" /><br />\n";


	$html_scrub_form .= "<input type=\"hidden\" name=\"user\" value=\"$user\"/>\n";
	$html_scrub_form .= "<input type=\"hidden\" name=\"pass\" value=\"$pass\"/>\n";
	$html_scrub_form .= "<input type=\"hidden\" name=\"step\" value=\"update\"/>\n";
	$html_scrub_form .= "<input type=\"hidden\" name=\"query_string\" value=\"$query_string\"/>\n";
	$html_scrub_form .= "<input type=\"hidden\" name=\"uploaded_loos\" value=\"'". $globals['uploaded']."'\"/>\n";

	$html_scrub_form .= "<hr/>\n";

	$html_scrub_form .= "<p>\n";
	$html_scrub_form .= "<input type=\"submit\" name=\"update\" value=\"scrub\"/>\n";
	$html_scrub_form .= "<input type=\"reset\"/>\n";
	$html_scrub_form .= "</p>\n";
	$html_scrub_form .= "</form>\n";


	$html_foot=html_footer();

	$html = $html_head . $html_btn_squares . $html_scrub_form . $html_foot;
	print( $html );
	}


function scrub_upload( $user ) {
	$php_self=$_SERVER['PHP_SELF'];
	$dttm=date("Ymd_His");
	$media_path = $GLOBALS['media_path'];
//	define( "FILEREPOSITORY", "/var/www/html/inbox" );
//	define( "FILEREPOSITORY", "./imgs" );

///	print( "$php_self ko_upload MSG_4180: _FILES[uploaded][name]=".$_FILES['uploaded']['name']. " <br>\n" );
///	print( "$php_self ko_upload MSG_4181: _FILES[uploaded][tmp_name]=".$_FILES['uploaded']['tmp_name']. " <br>\n" );
///	print( "$php_self ko_upload MSG_4182: media_path=[$media_path] <br>\n" );


///	printf( "<hr>\n" );
///	printf( "_FILES:  <br>\n" );
///	print_r( $_FILES );
///	printf( "<hr>\n" );


// upload errors
	switch ($_FILES['uploaded'] ['error']) {  
		case 1:
			print '<p> 1: bigger upload_max_filesixe in php.ini</p>';

			break;
		case 2:
			print '<p> 2: bigger than max_file_size in form</p>';
			break;
		case 3:
			print '<p> 3: partial upload</p>';
			break;
		case 4:
			print '<p> 4: not uploaded 4</p>';
        	   	break;
		case 5:
			print '<p> 5: upload error 5</p>';
			break;
		case 6:
			print '<p> 6:  missing temp folder</p>';
			break;
		case 7:
			print '<p> 7: failed write to disk</p>';
			break;
		case 8:
			print '<p> 8:  upload_err_extension</p>';
			break;
///		default:
///			print '<p> 0:  unknown upload err</p>';
///			break;
 		}

	$allowedExtensions = array("txt","csv", "log", "htm","html","xml",
		"css","doc","xls","rtf","ppt","pdf","swf","flv","avi",
		"wmv","mov","jpg","jpeg","gif","png");

	foreach ($_FILES as $file) {
		if ($file['tmp_name'] > '') {
			if (!in_array(end(explode(".", strtolower($file['name']))), $allowedExtensions)) {
				die($file['name'].' is an invalid file type!<br/>'.
				'<a href="javascript:history.go(-1);">'.
				'&lt;&lt Go Back</a>');
				}
			}
		}


//	phpinfo();

	$from_filename=$_FILES['uploaded']['name'];
	$from_tmp_filename=$_FILES['uploaded']['tmp_name'];
	$to_filename = $media_path . basename( $_FILES['uploaded']['name']) ;

	if( ereg(".brp", $to_filename )) {
		$orig_filename=$to_filename;
		$to_filename =str_replace( ".brp", "_brp.txt", $orig_filename );
//		printf( "BUGS_4190:  to_filename=[$to_filename] orig_filename=[$orig_filename]<br>\n" );
		}


//	$media_path = "media/";
//	$media_path = "./imgs";
	$path_parts = pathinfo( $upload_filename );
//	$path_parts['dirname'];	
//	$path_parts['basename'];	
//	$path_parts['extension'];	
//	$path_parts['filename'];	


	$from_filename_parts = pathinfo( $from_filename );
	$from_filename_dirname = $from_filename_parts['dirname'];
	$from_filename_basename = $from_filename_parts['basename'];
	$name_ext = $from_filename_parts['basename'];
	$from_filename_extension = $from_filename_parts['extension'];
	$from_filename_filename = $from_filename_parts['filename'];
	$basename = $from_filename_parts['filename'];
	

///	printf( "BUGS_4405:  from_filename=[$from_filename]<br>\n");
///	printf( "BUGS_4405:  from_filename_dirname=[$from_filename_dirname]<br>\n");
///	printf( "BUGS_4405:  from_filename_basename=[$from_filename_basename]<br>\n");
///	printf( "BUGS_4405:  from_filename_extension=[$from_filename_extension]<br>\n");
///	printf( "BUGS_4414:  from_filename_filename=[$from_filename_filename]<br>\n");
///	printf( "BUGS_4415:  basename=[$basename]<br>\n");
///
	if( $user == "" ) { $user="scrub";  }
	$led_filename = $path_parts['dirname'] . "/$user" . "_" . "$dttm." . $path_parts['extension'];


	$ok=1;
	print_r($_FILES);
	$result = move_uploaded_file($from_tmp_filename, $to_filename );
	if( $result == 1 ) {
		printf( "$php_self ko_upload MSG_2391:  from_tmp_filename=[ $from_tmp_filename] to_filename=[$to_filename]<br>\n" );
		}
	else {
		printf( "$php_self ko_upload ERR_2392:  from_tmp_filename=[ $from_tmp_filename] to_filename=[$to_filename]<br>\n" );
		}


//	print( "$php_self ko_upload MSG_2385: user=[$user] upload_filename=[$upload_filename]<br>\n" );
//	print( "$php_self ko_upload MSG: user=[$user] led_filename=[$led_filename]<br>\n" );





	if( $uploaded_size > 350000 ) { print( "$php_self ko_upload ERR: file to big<br/>\n" ); $ok=0; }
	if( $uploaded_type == "text/php") { print( "$php_self ko_upload ERR: no php<br/>\n" ); $ok=0; }
	if( $uploaded_type == "text/exe") { print( "$php_self ko_upload ERR: no exe<br/>\n" ); $ok=0; }
	if( $uploaded_type == "text/bin") { print( "$php_self ko_upload ERR: no bin<br/>\n" ); $ok=0; }

//	printf( "BUGS_2443:  to_filename=[$to_filename] basename=[$basename]<br>\n");

	if( file_exists( $to_filename )) {
		$syscmd="cd $media_path; /usr/bin/perl $media_path/ko_scrub.pl scrub $to_filename > scrub.log";
// disabled		system( $syscmd );
		
//		$scrubfile="$media_path/$name_ext";
		$scrubfile=$to_filename;
//		print( "$php_self ko_upload MSG_2590: FOUND to_filename=[$to_filename] name_ext=[$name_ext]<br/>\n" ); 
//		print( "$php_self ko_upload MSG_2591: scrubfile=[$scrubfile] <br/>\n" ); 


		if( preg_match( "/gz/", $to_filename )) {
			$gunzipfile = str_replace( ".gz", "", $to_filename );
			$scrubfile = str_replace( ".gz", ".txt", $to_filename );
//			print( "$php_self ko_upload MSG_2780: to_filename=[$to_filename] <br/>\n" ); 
//			print( "$php_self ko_upload MSG_2780: gunzipfile=[$gunzipfile] <br/>\n" ); 
//			print( "$php_self ko_upload MSG_2780: scrubfile=[$scrubfile] <br/>\n" ); 
			$syscmd_gunzip = "gunzip $to_filename";
//			print( "$php_self ko_upload MSG_2785: syscmd_gunzip=[$syscmd_gunzip] <br/>\n" ); 
			system( $syscmd_gunzip );
			if( file_exists( $gunzipfile )) {
//				print( "$php_self ko_upload MSG_2790: rename($gunzipfile, $scrubfile) <br/>\n" ); 
				rename( $gunzipfile, $scrubfile );
				}
			else {
				print( "$php_self ko_upload ERR_2790: NOTFOUND gunzipfile=[$gunzipfile]<br/>\n" ); 
				}

			if( file_exists( $scrubfile )) {
//				print( "$php_self ko_upload MSG_2800: FOUND scrubfile=[$scrubfile]<br/>\n" ); 
				}
			else {
				print( "$php_self ko_upload ERR_2800: NOTFOUND scrubfile=[$scrubfile]<br/>\n" ); 
				}
//			exit;
			}	


		if( file_exists( $scrubfile )) {
			$scrubfile_parts = pathinfo( $to_filename );
			$scrubfile_dirname = $scrubfile_parts['dirname'];
			$scrubfile_basename = $scrubfile_parts['basename'];
			$scrubfile_extension = $scrubfile_parts['extension'];
			$basename=str_replace( $scrubfile_extension, "", $scrubfile_basename );
///			$basename=str_replace( ".", "", $basename );
			$scrubout  = "";
////			$scrubout .= "header('Content-Type: text/html; charset-iso-8859-1');";
////			$scrubout .= "\n\n";
////			$filedata=array();
////			$rownum=0;
////			$fp = fopen( $scrubfile, "r" );
////			while(( $filetext = fgets($fp)) !== false ) {
//				$filedata[] =  $filetext;
////				$scrubout .= $filetext;
///				printf( "BUGS:  filetext=[$filetext]<br>\n" );
////				$rownum++;
////				}
////			fclose($fp);
//			$data = $filedata;
////			$scrubout .= $filedata;
////			print( $scrubout );
////			exit;
//			return;
//			return( $scrubout );
///			print( "$php_self ko_upload MSG_2475: FOUND to_filename=[$to_filename] name_ext=[$name_ext]<br/>\n" ); 
			$html_header=html_header($options);
			$html_btn_squares=html_btn_squares($options);

///			$scrubout="<html><title>$php_self $dttm scrub $to_filename</title>\n";
			$html_scrub_done = "<hr>\n";
			$html_scrub_done .= "<body bgcolor=lightblue>\n";
///			$html_scrub_done .= "<br>basename=[$basename] to_filename=$to_filename<br>";


///			$html_scrub_done .= "scrubfile_dirname=[$scrubfile_dirname]<br>\n";
///			$html_scrub_done .= "scrubfile_basename=[$scrubfile_basename]<br>\n";
///			$html_scrub_done .= "scrubfile_extension=[$scrubfile_extension]<br>\n";
///			$html_scrub_done .= "to_filename=[$to_filename]<br>\n";
///			$html_scrub_done .= "scrubfile=[$scrubfile]<br>\n";
///			$html_scrub_done .= "<a href=/inbox/$basename"."_out1.txt target=_blank>$basename"."_out1.txt</a><br>\n";
///			$html_scrub_done .= "<a href=/inbox/$basename"."_out2.txt target=_blank>$basename"."_out2.txt</a><br>\n";
///			$html_scrub_done .= "<a href=/inbox/$basename"."_hs.txt target=_blank>$basename"."_hs.txt</a><br>\n";
///			$html_scrub_done .= "<a href=/inbox/$basename"."_ip.txt target=_blank>$basename"."_ip.txt</a><br>\n";
///			$html_scrub_done .= "<a href=/inbox/$basename"."db3 target=_blank>$basename.db3</a><br>\n";
///			$html_scrub_done .= "<a href=/inbox/$basename"."zip target=_blank>$basename.zip</a><br>\n";

			$scrubfile_path = "/var/www/html/inbox";
			$scrubfile_jobid = str_replace( $scrubfile_extension, "", $scrubfile_basename );
///			$scrubfile_zipfile = str_replace( $scrubfile_extension, "zip", $scrubfile_basename );
			$results = getfiles( $scrubfile_path, $scrubfile_jobid );	
///			$html_scrub_done .= "<hr>scrubfile_path=[$scrubfile_path] scrubfile_basename=[$scrubfile_basename] scrubfile_extension=[$scrubfile_extension] scrubfile_jobid=[$scrubfile_jobid]<hr>\n";


			$to_basename = str_replace( $scrubfile_dirname, "", $to_filename );
			$to_basename = str_replace( "/", "", $to_basename );
			$html_scrub_done .= "$to_basename<br><br>\n";
			foreach( $results as $result ) {
				if( preg_match( "/zip$/", $result )) {
					$html_scrub_done .= "<a href=/inbox/$result target=_blank>$result</a><br>\n";
					}
				else {
					$html_scrub_cond .= "... $result <br>\n";
					}
				}
///			$html_scrub_done .= "<a href=/inbox/$result.zip target=_blank>$result.zip xyz</a><br>\n";
///			$html_scrub_done .= "<hr><hr>\n";


			$html_footer=html_footer();
			$html = $html_header . $html_btn_squares . $html_scrub_done . $html_footer;
			return( $html );
			}
		else {
			print( "$php_self ko_upload MSG_7990: NOTFOUND scrubfile=[$scrubfile]<br/>\n" ); 
			}
		}
	else {
		print( "$php_self ko_upload ERR_2425: NOTFOUND to_filename=[$to_filename]<br/>\n" ); 
////		if(move_uploaded_file($_FILES['uploaded']['tmp_name'], $upload_filename)) {
//			print( "$php_self ko_upload MSG_619: move_uploaded_file ".$_FILES['uploadedfile']['name']."<br/>\n" ); 
////			}
////		else {
//			print( "$php_self ko_upload ERR_620: move_uploaded_file ".$_FILES['uploadedfile']['name']."<br/>\n" ); 
////			}

////		if( file_exists( $upload_filename )) {
//			print( "$php_self ko_upload MSG_621: rename($upload_filename, $led_filename) <br/>\n" ); 
////			rename( $upload_filename, $led_filename );
////			}
////		else {
////			print( "$php_self ko_upload ERR_624: rename($upload_filename, $led_filename) <br/>\n" ); 
////			$led_filename="filefail";
////			}
		}

	return( $led_filename );
	}


function ko_upload2() {
	global $globals;
	$php_self=$_SERVER['PHP_SELF'];
//	$uploaddir = 'inbox/';
	$uploaddir = 'imgs/';
	$dir = opendir($uploaddir);
	$files = array();
	if(!empty($_POST['uploaded_loos'])) {
		$globals['uploaded'] = $POST['uploaded_loos'];
		}
	if(isset($_FILES['uploaded']) && !empty($_FILES['uploaded']['name'])) {
		if(!eregi('image/', $_FILES['uploaded']['type'])) {
			print( "$php_self upload_back ERR:  NOT IMAGE<br/>\n" );
			}
		else {
			while($file = readdir($dir)) {
				array_push($files,"$file");
				print( "$php_self upload_back MSG:  file=$file<br/>\n" );
				}
			closedir($dir);

			$_FILES['uploaded']['name'] = ceil(count($files)+'1').''.
				strrchr($_FILES['uploaded']['name'], '.');
			$uploadfile=$uploaddir . basename($_FILES['uploaded']['name']);
			$previousToDestroy = 
				empty($globals['uploaded']) && !empty($_FILES['uploaded']['name']) ?
				'' : $uploaddir . $files[ceil(count($files)-'1')];

			if(!move_uploaded_file($_FILES['uploaded']['tmp_name'], $uploadfile)) {
				print( "<pre>\n" );
				print( "$php_self upload_back ERR:  <br/>\n" );
				print_r($_FILES);
				print( "</pre><br/>\n" );
				}
			else {
				print( "$php_self upload_back MSG:  upload successful<br/>\n" );
				}

			$globals['uploaded'] = $_FILES['uploaded']['name'];
			if(!empty($previousToDestroy)) { unlink($previousToDestroy); }
			}
		}
	}


function ko_uploads() {
//	$uploads_dir = '/inbox';
	$uploads_dir = './imgs';
//	print_r($_FILES);
//	foreach ($_FILES["files"]["error"] as $key => $error) {
	if( isset($_FILES["pictures"])) {
		foreach ($_FILES["pictures"]["error"] as $key => $error) {
			if ($error == UPLOAD_ERR_OK) {
       		 		$tmp_name = $_FILES["pictures"]["tmp_name"][$key];
       		 		$name = $_FILES["pictures"]["name"][$key];
       		 		move_uploaded_file($tmp_name, "$uploads_dir/$name");
				}
			}
		}
	else {
		printf( "<h1>ko_upload \$_FILES notset</h1>\n" );
		}
	}


function leds_menu( $options ) {
//	print( "$php_self leds_menu MSG: validate=[$validate] </br>\n" );
//	print( "$php_self leds_menu MSG: r_user=[".$row['user_code']."] </br>\n" );
//	print( "$php_self leds_menu MSG: r_role=[".$row['user_role']."] <br/>\n" );
//	print( "$php_self leds_menu MSG: s_id=[".$_SESSION['id']."] <br/>\n" );
//	print( "$php_self leds_menu MSG: s_user=[".$_SESSION['user']."] </br>\n" );
//	print( "$php_self leds_menu MSG: s_role=[".$_SESSION['role']."] <br/>\n" );
//	print( "$php_self leds_menu MSG:  u=[$user][$pass] r=[$role] step=[step] sid=[$sid]<br/>\n" );
//	print_r( $_SESSION );

	$dttm=date("Ymd_His");
	$php_self = $_SERVER['PHP_SELF'];

	leds_show();

	print( "leds_menu: u: " . $_SESSION['user'] . " r: " . $_SESSION['role'] . " - " . $dttm . "<br\>\n" );	

	$dbfiles = $GLOBALS['dbs'];

	if(( $_SESSION['role'] == "" ) || ( $_SESSION['role'] == "anonymous" )) {
		print( "<hr>\n" );
		print( "<a href=$php_self?q=run/anonymous_option1>anonymous_option1</a><br />\n" );
		print( "<a href=$php_self?q=run/anonymous_option2>anonymous_option2</a><br />\n" );
		print( "<a href=$php_self?q=run/anonymous_option3>anonymous_option3</a><br />\n" );

		}
	if( $_SESSION['role'] == "guest" ) {
		print( "<hr>\n" );
		print( "<a href=$php_self?q=run/guest_option1>guest_option1</a><br />\n" );
		print( "<a href=$php_self?q=run/guest_option2>guest_option1</a><br />\n" );
		print( "<a href=$php_self?q=run/guest_option3>guest_option1</a><br />\n" );
		}
	if( $_SESSION['role'] == "user" ) {
		print( "<hr>\n" );
		print( "<a href=$php_self?q=run/user_option1>user_option1</a><br />\n" );
		print( "<a href=$php_self?q=run/user_option2>user_option2</a><br />\n" );
		print( "<a href=$php_self?q=run/user_option3>user_option3</a><br />\n" );
		}
	if( $_SESSION['role'] == "qc" ) {
		print( "<hr>\n" );
		print( "<a href=$php_self?q=run/qc_option1>qc_option1</a><br />\n" );
		print( "<a href=$php_self?q=run/qc_option2>qc_option2</a><br />\n" );
		print( "<a href=$php_self?q=run/qc_option3>qc_option3</a><br />\n" );
		}
	if( $_SESSION['role'] == "tester" ) {
		print( "<hr>\n" );
		print( "<a href=$php_self?q=run/tester_option1>tester_option1</a><br />\n" );
		print( "<a href=$php_self?q=run/tester_option2>tester_option2</a><br />\n" );
		print( "<a href=$php_self?q=run/tester_option3>tester_option3</a><br />\n" );
		}
///	if( $_SESSION['role'] == "iperms" ) {
///		print( "<hr>\n" );
///		print( "<a href=$php_self?q=run/iperms_option1>iperms_option1</a><br />\n" );
///		print( "<a href=$php_self?q=run/iperms_option2>iperms_option2</a><br />\n" );
///		print( "<a href=$php_self?q=run/iperms_option3>iperms_option3</a><br />\n" );
///		}
	if( $_SESSION['role'] == "manager" ) {
		print( "<hr>\n" );
		print( "<a href=$php_self?q=run/manager_option1>manager_option1</a><br />\n" );
		print( "<a href=$php_self?q=run/manager_option2>manager_option2</a><br />\n" );
		print( "<a href=$php_self?q=run/manager_option3>manager_option3</a><br />\n" );
		}
	if( $_SESSION['role'] == "operator" ) {
		print( "<hr>\n" );
		print( "<a href=$php_self?q=run/operator_option1>operator_option1</a><br />\n" );
		print( "<a href=$php_self?q=run/operator_option2>operator_option2</a><br />\n" );
		print( "<a href=$php_self?q=run/operator_option3>operator_option3</a><br />\n" );
		}

	if( $_SESSION['role'] == "admin" ) {
		print( "<hr>\n" );
		print( "<a href=$php_self?q=run/admin_option1>admin_option1</a><br />\n" );
		print( "<a href=$php_self?q=run/admin_option2>admin_option2</a><br />\n" );
		print( "<a href=$php_self?q=run/admin_option3>admin_option3</a><br />\n" );
		print( "<br\>\n" );
//		print( "<a href=$php_self?q=aors>aors</a><br />\n" );
//		print( "<a href=$php_self?q=ltrs>ltrs</a><br />\n" );
//		print( "<a href=$php_self?q=iperms>iperms</a><br />\n" );
		print( "<hr>admin:".$_SESSION['user'] . " ". $_SESSION['user'] . "<hr>\n" );
// select database
		
		$url_dbcode=$options[1];
		$url_table=$options[2];
//		print( "BUGS_2252:  dbfiles0=[$dbfiles[1]]<br>\n" );
		if( $url_dbcode == "" ) {
			if( $dbfiles[0] != "" ) {
				foreach( $dbfiles as $dbcode => $dbinfo ) {
					$dbfile=$dbfiles[$dbcode]['dbfile'];
					$tblcnt=count( $dbfiles[$dbcode]['tables']);
					$path_parts = pathinfo($dbfile);
					$dbfile_filename=$path_parts['filename'];
					print( "<a href=$php_self?q=menu/$dbfile_filename>$dbfile_filename $tblcnt</a><br />\n" );
					}
				}
			}

// select database/tables
		if(( $url_dbcode != "" )  && ( $url_table == "" )) {
			foreach( $dbfiles[$url_dbcode]['tables'] as $table => $tableinfo ) {
				print( "<a href=$php_self?q=menu/$url_dbcode/$tableinfo>$tableinfo </a><br />\n" );
				}
			}
		if(( $url_dbcode != "" )  && ( $url_table != "" )) {
//			print( "leds_menu BUGS_1021:  url_dbcode=[$url_dbcode] url_table=[$url_table]<br/>\n" );
			sql_view( $options );
			}
		else {
//			print( "leds_menu BUGS_1022:  url_dbcode=[$url_dbcode] url_table=[$url_table]<br/>\n" );
			return;
			}
		}


	if( $_SESSION['role'] == "" ) {
		print( "<hr>public:".$_SESSION['user'] . " ". $_SESSION['user'] . "<hr>\n" );
		}



	print( "<hr>\n" );
	print( "<a href=$php_self?q=unload>dbs unload<a><br>\n" );
	print( "<a href=$php_self?q=load>dbs load<a><br>\n" );
	print( "<hr>\n" );
	print( "<a href=$php_self?q=ptviewer>panos<a><br>\n" );
	print( "<a href=$php_self?q=ptobject>objects<a><br>\n" );
	print( "<hr>\n" );

//	print_r( $dbfiles );
//	foreach( $dbfiles as $dbcode => $dbinfo) {
//		$dbfile=$dbfiles[$dbcode]['dbfile'];
//		$tblcnt=count($dbfiles[$dbcode]['tables']);
//		print( "$dbcode dbfile=[$dbfile] tblcnt=[$tblcnt]<br>\n" );
//		foreach( $dbfiles[$dbcode]['tables'] as $tblnum => $tblname ) {
//			print( "$dbcode $tblnum tblname=[$tblname]<br>\n" );
//			}
//		}
//
//	fgmenu_dyn( $options );
	return;




	leds_show();
	print( "<hr>leds_menu o=$options[0]  o1=$options[1]<hr>\n" );

	$pdo = newpdo($GLOBALS['dbfile']);
	if( $options[1] == "" ) {
		$sql = "SELECT * from sqlite_master WHERE type='table'";
		foreach( $pdo->query($sql) as $row ) {
			print( "<a href=$php_self?q=menu/".$row['tbl_name'].">".$row['tbl_name'] );
			print( "</a><br />\n" );
			}
		}

	if( $options[1] != "" ) {
		$sql = "SELECT * from $option1";
		foreach( $pdo->query($sql) as $row ) {
			print( "<a href=$php_self?q=menu/".$row['tbl_name'].">".$row['tbl_name'] );
			print( "</a><br />\n" );
			}
		}


	$pdo = null;
	}

function sql_view( $options ) {
	$dbfiles = $GLOBALS['dbs'];

	leds_show();
	$dbcode=$options[1];
	$table=$options[2];
	$dbfile = $dbfiles[$dbcode]['dbfile'];
	print( "<hr>sql_view [$dbcode][$table]<hr>\n" );
	
	if( file_exists( $dbfile )) {
		$pdo = newpdo( $dbfile );
		$sql = "SELECT * from $table";
		print( "sql_view MSG:  sql=[$sql]<br>\n" );
		$pdo_query = $pdo->query($sql );

		$pdo_result = $pdo_query->fetchAll(PDO::FETCH_OBJ);
		$result_count=count($pdo_result);

		print( "sql_view MSG:  result_count=[$result_count]\n" );
		print( "<hr><hr>\n" );
//		return;


//		foreach( $pdo->query($sql) as $row ) {
		foreach( $pdo_result as $row ) {
			foreach( $row as $col ) {
				print( "$col - " );
				}
			print( "<br/>\n" );
			}
		}
	else {
		print( "sql_view $dttm ERR_7550:  NOTFOUND dbfile=[$dbfile]<br>\n" );
		}
	$pdo = null;



	}

function leds_view( $options ) {
	leds_show();
	print( "<hr>leds_view o=$options[0]  o1=$options[1]<hr>\n" );
	}
function leds_list( $options ) {
	leds_show();
	print( "<hr>leds_list o=$options[0]  o1=$options[1]<hr>\n" );
	}

function leds_test( $options ) {
	$dttm=date("Ymd_His");
	$php_self=$_SERVER['PHP_SELF'];
	$dbfile=$GLOBALS['dbfile'];
	print( "$php_self leds_test MSG:  dbfile=[$dbfile] test_mode=[$test_mode]<br>\n" );
	print_r($options);
	print_r( $_SESSION );
	return;
	}




function leds_install( $install_mode ) {
	
	
	$dttm=date("Ymd_His");
	print( "<hr>leds_install BEG:<hr>\n" );
	$GLOBALS['install'] = true;
	$dbfile=$GLOBALS['dbfile'];
	$dbfile_dttm = $dbfile;
	$dbfile_dttm = str_replace( ".db3", "_$dttm.db3", $dbfile );
//	print( "$php_self leds_install MSG: $install_mode dbfile=[$dbfile] dbfile_dttm=[$dbfile_dttm]<br/>\n" );


	if(( "$install_mode" == "new" ) && file_exists( $dbfile )) {
		print( "$php_self leds_install $install_mode ERR:  already installed [$dbfile]\n" );
		return;
		}

	if(( "$install_mode" == "old" ) && file_exists( $dbfile )) {
		print( "$php_self leds_install $install_mode MSG:  already installed [$dbfile]\n" );
		if( file_exists( $dbfile )) {
			print( "$php_self leds_install MSG:  rename( $dbfile, $dbfile_dttm<br/>\n" );
			rename( $dbfile, $dbfile_dttm );
//			copy( $dbfile, $dbfile_dttm );
			if( file_exists( $dbfile_dttm )) {
//				unlink( $dbfile );
				print( "$php_self leds_install MSG:  unlink $dbfile<br/>\n" );
				}
			}
		}
//	$file = basename($path, ".php");
//	$dir = dirname($path);
//	$path_parts = pathinfo('$pathfile');
//	$path_parts['dirname'];
//	$path_parts['basename'];
//	$path_parts['extension'];
//	$path_parts['filename'];

//	pdo_cr( $dbfile, $dbtable, $dbdata );
//	pdo_insert( $dbfile, $dbtable, $dbdata );

	pdo_cr_leds();
	pdo_insert_leds();
	pdo_cr_nodes();
	pdo_insert_nodes();
	pdo_cr_roles();
	pdo_insert_roles();
	pdo_cr_users();
	pdo_insert_roles();


	pdo_cr_dbs();
	pdo_insert_dbs();

	pdo_cr_fgmenu();
	pdo_insert_fgmenu();

	pdo_cr_fp();
	pdo_insert_fp();

	pdo_cr_grid();
	pdo_insert_grid();

	pdo_cr_us();
	pdo_insert_us();

	pdo_cr_hw();
	pdo_insert_hw();

	pdo_cr_n11();
	pdo_insert_n11();

//	pdo_insert( $dbfile, temp1, "" );
//	pdo_insert( $dbfile, temp2, "" );
//	pdo_insert( $dbfile, temp3, "" );
	print( "<hr>leds_install END:<hr>\n" );
	}


function pdo_create( $dbfile, $tblname, $sql ) {
	$php_self=$_SERVER['PHP_SELF'];
	$pdo = newpdo( $dbfile );
	$sqldrop="DROP TABLE IF EXISTS $tblname";
	printf( "<hr>$php_self pdo_cr DROP:  dbfile=[$dbfile] tblfile=[$tblname] [$sqldrop]<br>\n" );
	$pdo->exec($sqldrop);

	printf( "$php_self pdo_create CREATE:  dbfile=[$dbfile] tblfile=[$tblname] [$sql]<br>\n" );
	$pdo->exec($sql);
	$pdo = null;
	}



function pdo_insert( $dbfile, $tblname, $data ) {
	
	$csvfile = "$tblname.csv";
	$psvfile = "$tblname.psv";

	$create_csv = "";
	if( $create_csv == "true" ) {
	if( file_exists( $csvfile )) {
		$filedata= array();
		print( "pdo_insert CSV: FOUND  csvfile=[$csvfile]<br>\n" );
		$rownum=0;
		$fp = fopen( $csvfile, "r" );
		while(( $filetext = fgets($fp)) !== false ) {
			$filedata[] =  $filetext;
			print( "pdo_insert CSV: rownum=$rownum filedata=[".$filedata[$rownum]. "]<br>\n" );
			$rownum++;
			}
		fclose($fp);
		$data = $filedata;
		}
	else {
		print( "pdo_insert CSV_ERR: NOTFOUND  csvfile=[$csvfile]<br>\n" );
		}
	}


	if( file_exists( $psvfile )) {
		print( "pdo_insert PSV: FOUND  psvfile=[$psvfile]<br>\n" );
		$rownum=0;
		$filedata=array();
		$fp = fopen( $psvfile, "r" );
		while(( $filetext = fgets($fp)) !== false ) {
			$filedata[] =  str_replace( "|", ",", $filetext);
			print( "pdo_insert PSV: rownum=$rownum filedata=[".$filedata[$rownum]. "]<br>\n" );
			$rownum++;
			}
		fclose($fp);
		$data = $filedata;
		}


//	foreach( $data_leds as $data_led ) {
//		print( "pdo_insert_leds MSG: data_led=[$data_led]<br>\n" );
//		}

	if( $data == "" ) { 
		print( "<hr>$php_self pdo_insert ERR: DATA_NOTFOUND tblname=[$tblname]<hr>\n" );
		return; 
		}

	$create_table="";
	if( $create_table == "true" ) { 
	set_time_limit(0);	// 30 seconds
	$pdo = newpdo( $dbfile );
	$rownum=0;
	foreach( $data as $row ) {
		$cols = explode( ",", $row );
		if( $rownum == 0 ) {
//			print( "pdo_insert ROW_$rownum: dbfile=[$dbfile] tblname=[$tblname] row=[$row]<br>\n" );
			$colnum=0;
			$collim=count($cols);
			$sql_cr = " CREATE TABLE IF NOT EXISTS $tblname ( ";
//			$sql_cr .= "$tblname"."_id INTEGER PRIMARY KEY DESC, ";
//			$sql_cr .= "$tblname"."_id INTEGER PRIMARY KEY, ";

			$sql_flds = "INSERT OR REPLACE into $tblname ( ";
			foreach( $cols as $col ) { 
//				if( $col != $tblname."_id" ) {
					$sql_cr .= "$col VARCHAR, ";
					$sql_flds .= "$col, "; 
					$colnum++; 
//					}
				}
			$sql_cr .= ")";
			$sql_flds .= ")";
			$sql_tmp = str_replace( "VARCHAR, )", "VARCHAR )", $sql_cr );
			$sql_cr = $sql_tmp;
			$sql_tmp = str_replace( ", )", " )", $sql_flds );
			$sql_flds = $sql_tmp;
//			print( "pdo_insert ROW_$rownum: sql_flds=[$sql_flds]<br>\n" );
			print( "pdo_insert ROW_$rownum: sql_cr=[$sql_cr]<br>\n" );
			$pdo->exec( $sql_cr );
			$rownum++;
			continue;
			}

		if( $rownum != 0 ) {
//			print( "..... BUGS1608: pdo_insert ROW_$rownum: dbfile=[$dbfile] tblname=[$tblname] row=[$row]<br>\n" );
			$sql_vals = "VALUES ( ";
			foreach( $cols as $col ) {
				$col_trim=trim($col);
				$col = $col_trim;
				$sql_vals .= "\"$col\", ";
				}

			$sql_vals .= ");";
			$sql_tmp = str_replace( ", )", ")", $sql_vals );
			$sql_vals=$sql_tmp;

			if( $sql_vals == "VALUES ( \"\");"  ) { 
				$sql = "END_OF_FIELDS";
				}
			else {
				$sql = $sql_flds . " " . $sql_vals;
				}
//			print( "pdo_insert ROW_$rownum: sql_vals=[$sql_vals]<br>\n" );
//			print( "pdo_insert ROW_$rownum: sql=[$sql]<br>\n" );
			}

//		print( "$php_self pdo_insert INS: $rownum  dbfile=[$dbfile] tblname=[$tblname] sql=[$sql]<br>\n" );
//		print( "$php_self pdo_insert BUGS_875:  sql_vals=[$sql_vals]<br>\n" );
//		print( "$php_self pdo_insert BUGS_876:  sql=[$sql]<br>\n" );
		if( $sql != "END_OF_FIELDS" ) {
			print( "pdo_insert_1845:  sql=[$sql]<br>\n" );
			$pdo->exec( $sql );
			}
		$rownum++;
		}

	$pdo = null;
	set_time_limit(30);	// 30 seconds
	}

///	return;
///	$row=1;
///	$handle = fopen($csvfile, "r");
///	while( $data = fgetcsv($handle, 1000, ",") !== FALSE ){
///		$num = count($data);
///		$row++;
///		for( $col=0l $col < $num; $col++ ) {
///			print( "$data[$col] <br />\n" );
///			}
///		}
	}

function pdo_cr_leds() {
	$dbfile = $GLOBALS['dbfile'];
	$tblname="leds";
	$sql="CREATE TABLE IF NOT EXISTS $tblname ( ";
	$sql .= "led_id INTEGER PRIMARY KEY, ";
	$sql .= "led_status VARCHAR, ";
	$sql .= "led_code VARCHAR, ";
	$sql .= "led_name VARCHAR, ";
	$sql .= "led_dttm VARCHAR, ";
	$sql .= "led_color VARCHAR, ";
	$sql .= "led_speed VARCHAR, ";
	$sql .= "led_err VARCHAR, ";
	$sql .= "led_fix VARCHAR, ";
	$sql .= "led_os VARCHAR, ";

	$sql .= "led_type VARCHAR, ";		// manual date cmd
	$sql .= "led_date VARCHAR, ";
	$sql .= "led_cmd VARCHAR, ";
	$sql .= "led_cmdout VARCHAR, ";
	$sql .= "led_desc VARCHAR, ";
	$sql .= "led_misc VARCHAR, ";

	$sql .= "led_city VARCHAR, ";
	$sql .= "led_bldg VARCHAR, ";
	$sql .= "led_loc_code VARCHAR, ";
	$sql .= "led_floor VARCHAR, ";
	$sql .= "led_group VARCHAR, ";
	$sql .= "led_orgs VARCHAR, ";
	$sql .= "led_title VARCHAR, ";
	$sql .= "led_published VARCHAR, ";
	$sql .= "led_width VARCHAR, ";
	$sql .= "led_height VARCHAR, ";

	$sql .= "led_comment VARCHAR, ";
	$sql .= "led_filename VARCHAR, ";
	$sql .= "led_user VARCHAR, ";
	$sql .= "led_user_ip VARCHAR, ";
	$sql .= "led_referer VARCHAR, ";
	$sql .= "led_remote_port VARCHAR, ";
	$sql .= "led_viewrole VARCHAR, ";
	$sql .= "led_user_agent VARCHAR, ";
	$sql .= "led_unique_id VARCHAR ";
	$sql .= ");";

//	print( "BUGS_2449: pdo_cr_leds dbfile=[$dbfile]<br>\n" );
//	print( "BUGS_2450: pdo_cr_leds tlbname=[$tblname]<br>\n" );
//	print( "BUGS_2451 : pdo_cr_leds sql=[$sql]<br>\n" );

	pdo_create( $dbfile, $tblname, $sql );
	}


function pdo_cr_menus() {
	$dbfile = $GLOBALS['dbfile'];
	$tblname="menus";
	$sql="CREATE TABLE IF NOT EXISTS $tblname ( ";
	$sql .= "menus_id INTEGER PRIMARY KEY DESC, ";
	$sql .= "role VARCHAR, ";
	$sql .= "url VARCHAR, ";
	$sql .= "levels VARCHAR";
	$sql .= ");";
	pdo_create( $dbfile, $tblname, $sql );
	}


function pdo_insert_menus( $options ) {
	$role=$_SESSION['role'];
	$dbfiles = $GLOBALS['dbfiles'];
	$roles = $GLOBALS['roles'];
	$dbs = $dbfiles[$role];

	$GLOBALS['dbs'] = $dbs;
	$dbcode="fp";
	$dbfile_menu=$dbfiles['admin'][$dbcode]['dbfile'];
	$dbtable = "menus";
	

	print( "pdo_cr_menus MSG_1961:  role=[$role] dbfile_menu=[$dbfile_menu]  dbcode=[$dbcode] dbtable=[$dbtable]<br>\n" );


//	$menus[""][] = "?q=fgmenu/menu1,menu1";
//	$menus[""][] = "?q=fgmenu/menu2,menu2";
//	$menus[""][] = "?q=fgmenu/menu3,menu3";
//	$menus[""][] = "?q=fgmenu/menu4,menu4";
//
//	$menus[1][] = "?q=fgmenu/1,menu1";
//	$menus[1][] = "?q=fgmenu/2,menu2";
//	$menus[1][] = "?q=fgmenu/3,menu3";
//	$menus[1][] = "?q=fgmenu/4,menu4";
//	$menus[1][] = "?q=fgmenu/5,menu5";
//	$menus[1][] = "?q=fgmenu/6,menu6";
//	$menus[1][] = "?q=fgmenu/7,menu7";
//
//	$menus[2][] = "?q=fgmenu/2/1,menu1";
//	$menus[2][] = "?q=fgmenu/2/1/1,!menu11";
//	$menus[2][] = "?q=fgmenu/2/1/2,!menu12";
//	$menus[2][] = "?q=fgmenu/2/1/3,!menu13";
//	$menus[2][] = "?q=fgmenu/2/1/4,!menu14";
//	$menus[2][] = "?q=fgmenu/2/1/5,!menu15";
//	$menus[2][] = "?q=fgmenu/2/1/6,!menu16";

//	$menus[2][] = "?q=fgmenu/2/1/1/1,!!menu111";
//	$menus[2][] = "?q=fgmenu/2,menu3";

//	$menus[3][] = "?q=fgmenu/3/1,menu1";
//	$menus[3][] = "?q=fgmenu/3/2,menu2";
//	$menus[3][] = "?q=fgmenu/3/2/1,!menu2-1";
//	$menus[3][] = "?q=fgmenu/3/2/2,!menu2-2";
//	$menus[3][] = "?q=fgmenu/3/2/3,!menu2-3";
//	$menus[3][] = "?q=fgmenu/3/3,menu3";
//	$menus[3][] = "?q=fgmenu/3/3/1,!menu3-1";
//	$menus[3][] = "?q=fgmenu/3/3/2,!menu3-2";
//	$menus[3][] = "?q=fgmenu/3/3/2/1,!!menu3-2-1";
//	$menus[3][] = "?q=fgmenu/3/3/2/2,!!menu3-2-2";
//	$menus[3][] = "?q=fgmenu/3/3/2/3,!!menu3-2-3";
//	$menus[5][] = "?q=fgmenu/5/1,menu5-1";
//	$menus[5][] = "?q=fgmenu/5/1/1,!menu5-11";

	$menus[anon][] = "?q=login/,login";
	$menus[anon][] = "?q=logout/,logout";
	$menus[anon][] = "?q=logout/,logout";
	$menus[anon][] = "?q=menu/,menu";
	$menus[anon][] = "?q=view/,view";
	$menus[anon][] = "?q=update/,update";

	$menus[admin][] = "?q=fgmenu/admin/db,db";
	$menus[admin][] = "?q=fgmenu/admin/unload,!unload";
	$menus[admin][] = "?q=fgmenu/admin/load,!load";
	$menus[admin][] = "?q=fgmenu/admin/query,!query";
	$menus[admin][] = "?q=fgmenu/admin/media,media";
	$menus[admin][] = "?q=fgmenu/zoom,!zoom";
	$menus[admin][] = "?q=fgmenu/objects,!object";
	$menus[admin][] = "?q=fgmenu/pano,!pano";

	$menus[users][] = "?q=fgmenu/users/update,update";
	$menus[users][] = "?q=fgmenu/users/zoom,zoom";
	$menus[users][] = "?q=fgmenu/users/object,object";
	$menus[users][] = "?q=fgmenu/users/pano,pano";

	$menus[op][] = "?q=fgmenu/op/iperms,iperms";
	$menus[op][] = "?q=fgmenu/op/iperms,!periods_p";
	$menus[op][] = "?q=fgmenu/op/iperms,!periods_pp";
	$menus[op][] = "?q=fgmenu/op/iperms,!job2db";
	$menus[op][] = "?q=fgmenu/op/iperms,!!mkwl";
	$menus[op][] = "?q=fgmenu/op/iperms,!!viwl";
	$menus[op][] = "?q=fgmenu/op/iperms,!!catwl";
	$menus[op][] = "?q=fgmenu/op/iperms,!!runwl";
	$menus[op][] = "?q=fgmenu/op/aors,!aors";
	$menus[op][] = "?q=fgmenu/op/aors/txt2tif,!!txt2tif";
	$menus[op][] = "?q=fgmenu/op/aors/txt2tif/mkwl,!!!mkwl";
	$menus[op][] = "?q=fgmenu/op/aors/txt2tif/catwl,!!!catwl";
	$menus[op][] = "?q=fgmenu/op/aors/txt2tif/runwl,!!!runwl";
	$menus[op][] = "?q=fgmenu/op/aors/tif2api,!!tif2api";
	$menus[op][] = "?q=fgmenu/op/aors/tif2api/mkwl,!!!mkwl";
	$menus[op][] = "?q=fgmenu/op/aors/tif2api/catwl,!!!catwl";
	$menus[op][] = "?q=fgmenu/op/aors/tif2api/runwl,!!!runwl";
	$menus[op][] = "?q=fgmenu/op/ltrs,!ltrs";
	$menus[op][] = "?q=fgmenu/op/ltrs/txt2tif,!!txt2tif";
	$menus[op][] = "?q=fgmenu/op/ltrs/txt2tif/mkwl,!!!mkwl";
	$menus[op][] = "?q=q=fgmenu/op/ltrs/txt2tif/catwl,!!!catwl";
	$menus[op][] = "?q=fgmenu/op/ltrs/txt2tif/runwl,!!!runwl";
	$menus[op][] = "?q=fgmenu/op/ltrs/tif2api,!!tif2api";
	$menus[op][] = "?q=fgmenu/op/ltrs/tif2api/mkwl,!!!mkwl";
	$menus[op][] = "?q=fgmenu/op/ltrs/tif2api/catwl,!!!catwl";
	$menus[op][] = "?q=fgmenu/op/ltrs/tif2api/runwl,!!!runwl";
	$menus[op][] = "?q=fgmenu/op/db/,db";

	$csvout = "menus_id,role,url,levels\n";
	$id=1;
	foreach( $menus as $role=>$menu_role ) {
		print( "role=$role menu_role=$menu_role<br>\n" );
		foreach( $menu_role as $menu_option=>$menu_data ) {
			print( "menu_option=$menu_option menu_data=$menu_data<br>\n" );
			$menu_fields = split( ",", $menu_data );
			$url=$menu_fields[0];
			$levels=$menu_fields[1];
			$csvout .= "$id,$role,$url,$levels\n";
			$id++;
			}
		}

	$dttm=date("Ymd_His");
	$csvfil="fp_menus_$dttm.csv";
	$csvfil="fp_menus.csv";
	$csvfil="menus.csv";
	$fp = fopen( $csvfil, "w" );
//	$fp = fopen( $csvfil, "a" );
	fwrite( $fp, $csvout );
//	print( $csvout );
	fclose($fp);

	set_time_limit(120);	// disable
	print( $csvout );
	
//	print( "BUGS_5287 pdo_cr_menus:  pdo_insert( $dbfile_menu, $dbtable, csvout )<br>\n" );
//	print( "pdo_cr_menus MSG_1961:  role=[$role] dbfile_menu=[$dbfile_menu]  dbcode=[$dbcode] dbtable=[$dbtable]<br>\n" );
//	return;
//	pdo_insert( $dbfile_menu, $dbtable, $csvout );
	set_time_limit(30);	// enable to 30 seconds
	}



function pdo_cr_nodes() {
	$dbfile = $GLOBALS['dbfile'];
	$tblname="nodes";
	$sql="CREATE TABLE IF NOT EXISTS $tblname ( ";
	$sql .= "node_id INTEGER PRIMARY KEY, ";
	$sql .= "node_status VARCHAR, ";
	$sql .= "node_code VARCHAR, ";
	$sql .= "node_name VARCHAR, ";
	$sql .= "node_dttm VARCHAR, ";
	$sql .= "node_color VARCHAR, ";
	$sql .= "node_speed VARCHAR, ";
	$sql .= "node_city VARCHAR, ";
	$sql .= "node_bldg VARCHAR, ";
	$sql .= "node_loc_code VARCHAR, ";
	$sql .= "node_floor VARCHAR, ";
	$sql .= "node_group VARCHAR, ";
	$sql .= "node_orgs VARCHAR, ";
	$sql .= "node_title VARCHAR, ";
	$sql .= "node_published VARCHAR, ";
	$sql .= "node_width VARCHAR, ";
	$sql .= "node_height VARCHAR, ";
	$sql .= "node_comment VARCHAR, ";
	$sql .= "node_filename VARCHAR, ";
	$sql .= "node_user VARCHAR, ";
	$sql .= "node_user_ip VARCHAR, ";
	$sql .= "node_referer VARCHAR, ";
	$sql .= "node_remote_port VARCHAR, ";
	$sql .= "node_viewrole VARCHAR, ";
	$sql .= "node_user_agent VARCHAR, ";
	$sql .= "node_unique_id VARCHAR ";
	$sql .= ");";
	pdo_create( $dbfile, $tblname, $sql );
	}

function pdo_cr_roles() {
	$dbfile = $GLOBALS['dbfile'];
	$tblname = "roles";
	$sql="CREATE TABLE IF NOT EXISTS $tblname (";
	$sql .= "role_id INTEGER PRIMARY KEY, ";
	$sql .= "role_code VARCHAR, ";
	$sql .= "role_status VARCHAR, ";
	$sql .= "role_comment VARCHAR ";
	$sql .= ");";
	pdo_create( $dbfile, $tblname, $sql );
	}

function pdo_cr_users() {
	$dbfile = $GLOBALS['dbfile'];
	$tblname = "users";
	$sql="CREATE TABLE IF NOT EXISTS $tblname (";
	$sql .= "user_id INTEGER PRIMARY KEY, ";
	$sql .= "user_code VARCHAR, ";
	$sql .= "user_status VARCHAR, ";
	$sql .= "user_pass VARCHAR, ";
	$sql .= "user_role VARCHAR, ";
	$sql .= "user_group VARCHAR, ";
	$sql .= "user_name VARCHAR, ";
	$sql .= "user_phone VARCHAR, ";
	$sql .= "user_email VARCHAR, ";
	$sql .= "user_dttm VARCHAR, ";
	$sql .= "user_comment VARCHAR, ";
	$sql .= "user_pagelines VARCHAR ";
	$sql .= "user_unique_id VARCHAR ";
	$sql .= ");";
	pdo_create( $dbfile, $tblname, $sql );
	}


function pdo_cr_fp() {
	$dbfile = $GLOBALS['dbfile'];
	$tblname = "fp";
	$sql="CREATE TABLE IF NOT EXISTS $tblname (";
	$sql .= "fp_id INTEGER PRIMARY KEY, ";
	$sql .= "code VARCHAR, ";
	$sql .= "status VARCHAR, ";
	$sql .= "label VARCHAR, ";
	$sql .= "title VARCHAR, ";
	$sql .= "width VARCHAR, ";
	$sql .= "height VARCHAR, ";
	$sql .= "dttm VARCHAR, ";
	$sql .= "comment VARCHAR, ";
	$sql .= "unique_id VARCHAR";
	$sql .= ");";
//	print( "BUGS1720 pdo_cr_fp END:  [$dbfile][$tblname]<hr>$sql<hr>\n" );
	pdo_create( $dbfile, $tblname, $sql );
	}


function pdo_cr_grid() {
	$dbfile = $GLOBALS['dbfile'];
	$tblname = "grid";
	$sql="CREATE TABLE IF NOT EXISTS $tblname (";
	$sql .= "grid_id INTEGER PRIMARY KEY, ";
	$sql .= "code VARCHAR, ";
	$sql .= "status VARCHAR, ";
	$sql .= "x VARCHAR, ";
	$sql .= "y VARCHAR, ";
	$sql .= "org VARCHAR, ";
	$sql .= "name VARCHAR, ";
	$sql .= "phone VARCHAR, ";
	$sql .= "email VARCHAR, ";
	$sql .= "dttm VARCHAR, ";
	$sql .= "comment VARCHAR, ";
	$sql .= "unique_id VARCHAR ";
	$sql .= ");";
	pdo_create( $dbfile, $tblname, $sql );
	}

function pdo_cr_us() {
	$dbfile = $GLOBALS['dbfile'];
	$tblname = "us";
	$sql="CREATE TABLE IF NOT EXISTS $tblname (";
	$sql .= "us_id INTEGER PRIMARY KEY, ";
	$sql .= "code VARCHAR, ";
	$sql .= "status VARCHAR, ";
	$sql .= "x VARCHAR, ";
	$sql .= "y VARCHAR, ";
	$sql .= "grp VARCHAR, ";
	$sql .= "name VARCHAR, ";
	$sql .= "phone VARCHAR, ";
	$sql .= "email VARCHAR, ";
	$sql .= "dttm VARCHAR, ";
	$sql .= "comment VARCHAR, ";
	$sql .= "unique_id VARCHAR ";
	$sql .= ");";
	pdo_create( $dbfile, $tblname, $sql );
	}


function pdo_cr_hw() {
	$dbfile = $GLOBALS['dbfile'];
	$tblname = "hw";
	$sql="CREATE TABLE IF NOT EXISTS $tblname (";
	$sql .= "hw_id INTEGER PRIMARY KEY, ";
	$sql .= "code VARCHAR, ";
	$sql .= "status VARCHAR, ";
	$sql .= "x VARCHAR, ";
	$sql .= "y VARCHAR, ";
	$sql .= "grp VARCHAR, ";
	$sql .= "name VARCHAR, ";
	$sql .= "phone VARCHAR, ";
	$sql .= "email VARCHAR, ";
	$sql .= "ip VARCHAR, ";
	$sql .= "dttm VARCHAR, ";
	$sql .= "comment VARCHAR, ";
	$sql .= "unique_id VARCHAR ";
	$sql .= ");";
	pdo_create( $dbfile, $tblname, $sql );
	}

function pdo_cr_n11() {
	$dbfile = $GLOBALS['dbfile'];
	$tblname = "n11";
	$sql="CREATE TABLE IF NOT EXISTS $tblname (";
	$sql .= "n11_id INTEGER PRIMARY KEY, ";
	$sql .= "code VARCHAR, ";
	$sql .= "status VARCHAR, ";
	$sql .= "x VARCHAR, ";
	$sql .= "y VARCHAR, ";
	$sql .= "grp VARCHAR, ";
	$sql .= "name VARCHAR, ";
	$sql .= "phone VARCHAR, ";
	$sql .= "email VARCHAR, ";
	$sql .= "ip VARCHAR, ";
	$sql .= "dttm VARCHAR, ";
	$sql .= "comment VARCHAR, ";
	$sql .= "unique_id VARCHAR ";
	$sql .= ");";
	pdo_create( $dbfile, $tblname, $sql );
	}



function pdo_insert_leds() {
	$dbfile=$GLOBALS['dbfile'];
	$tblname="leds";
	$php_self=$_SERVER['PHP_SELF'];
	$led_referer=$_SERVER['HTTP_REFERER'];
	$led_user_agent=$_SERVER['HTTP_USER_AGENT'];
	$led_user_agent="Foxfire/3.0.13";
	$led_remote_port=$_SERVER['REMOTE_PORT'];

// old	$data[]="led_name,led_dttm,led_color,led_speed,
// oldled_type, led_date, led_cmd, led_cmdout, led_desc, led_misc,
// oldled_comment,led_user,led_user_ip,led_referer,led_user_agent,led_remote_port";
// old	$data[]="fp01,current,red,10,type,date,cmd,cmdout,desc,misc,comment1,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp02,current,blu,10,type,date,cmd,cmdout,desc,misc,comment2,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp03,current,grn,10,type,date,cmd,cmdout,desc,misc,comment3,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp04,current,grn,50,type,date,cmd,cmdout,desc,misc,comment4,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp05,current,grn,90,type,date,cmd,cmdout,desc,misc,comment5,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp06,current,grn,90,type,date,cmd,cmdout,desc,misc,comment5,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp07,current,grn,90,type,date,cmd,cmdout,desc,misc,comment5,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp08,current,grn,90,type,date,cmd,cmdout,desc,misc,comment5,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp09,current,grn,90,type,date,cmd,cmdout,desc,misc,comment5,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp10,current,grn,90,type,date,cmd,cmdout,desc,misc,comment5,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp11,current,grn,90,type,date,cmd,cmdout,desc,misc,comment5,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp12,current,grn,90,type,date,cmd,cmdout,desc,misc,comment5,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp13,current,grn,90,type,date,cmd,cmdout,desc,misc,comment5,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp14,current,grn,90,type,date,cmd,cmdout,desc,misc,comment5,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp15,current,grn,90,type,date,cmd,cmdout,desc,misc,comment5,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp16,current,grn,90,type,date,cmd,cmdout,desc,misc,comment5,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp17,current,grn,90,type,date,cmd,cmdout,desc,misc,comment5,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp18,current,grn,90,type,date,cmd,cmdout,desc,misc,comment5,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp19,current,grn,90,type,date,cmd,cmdout,desc,misc,comment5,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp20,current,grn,90,type,date,cmd,cmdout,desc,misc,comment5,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp21,current,grn,90,type,date,cmd,cmdout,desc,misc,comment5,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp22,current,grn,90,type,date,cmd,cmdout,desc,misc,comment5,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp23,current,grn,90,type,date,cmd,cmdout,desc,misc,comment5,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp24,current,grn,90,type,date,cmd,cmdout,desc,misc,comment5,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp25,current,grn,90,type,date,cmd,cmdout,desc,misc,comment5,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp26,current,grn,90,type,date,cmd,cmdout,desc,misc,comment5,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp27,current,grn,90,type,date,cmd,cmdout,desc,misc,comment5,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp28,current,grn,90,type,date,cmd,cmdout,desc,misc,comment5,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp29,current,grn,90,type,date,cmd,cmdout,desc,misc,comment5,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp30,current,grn,90,type,date,cmd,cmdout,desc,misc,comment5,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp31,current,grn,90,type,date,cmd,cmdout,desc,misc,comment5,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp32,current,grn,90,type,date,cmd,cmdout,desc,misc,comment5,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp33,current,grn,90,type,date,cmd,cmdout,desc,misc,comment5,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp34,current,grn,90,type,date,cmd,cmdout,desc,misc,comment5,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp35,current,grn,90,type,date,cmd,cmdout,desc,misc,comment5,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";
// old	$data[]="fp36,current,grn,90,type,date,cmd,cmdout,desc,misc,comment5,admin,127.0.0.1,$led_referer,$led_user_agent,$led_remote_port";



	$data[]="led_id,led_status,led_code,led_name,led_dttm,led_color,led_speed,led_type,led_date,led_cmd,led_cmdout,led_desc,led_misc,led_city,led_bldg,led_loc_code,led_floor,led_group,led_orgs,led_title,led_published,led_width,led_height,led_comment,led_filename,led_user,led_user_ip,led_referer,led_user_agent,led_remote_port";

	$data[]="1,ga,fp01,fp01,current,blu,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,1s,1,,p,PERSINDS,1,10200,6600,comment_01,filename,user,127.0.0.1,referer,Firefox_3.0.13,";
	$data[]="2,ga,fp02,fp02,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,1n,1,,p,PERSINDS,1,10200,6600,comment_02,20101230,,198.49.187.20,,Firefox_3.0.13,";
	$data[]="3,ga,fp03,fp03,current,blu,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,1s,1,,t,TAGD,1,10200,6600,comment_03,20090101,,198.49.187.20,,Firefox_3.0.13,";
	$data[]="4,ga,fp04,fp04,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,1n,1,,t,TAGD,,10200,6600,comment_04,20100301,admin,127.0.0.1,http://localhost/hrc/fp/fp.php?hs_us,Firefox_3.0.13,";
	$data[]="5,ga,fp05,fp05,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,1s,1,,h,HRC Staff,,10200,6600,comment_05,20100301,admin,127.0.0.1,http://localhost/hrc/fp/fp.php?hs_us,Firefox_3.0.13,";
	$data[]="6,ga,fp06,fp06,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,1n,1,,h,HRC Staff,,10200,6600,comment_06,20100301,admin,127.0.0.1,http://localhost/hrc/fp/fp.php?hs_us,Firefox_3.0.13,";
	$data[]="7,ga,fp07,fp07,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,2e,1,,t,TAGD,,10200,6600,comment_07,20100301,admin,127.0.0.1,http://localhost/hrc/fp/fp.php?hs_us,Firefox_3.0.13,";
	$data[]="8,ga,fp08,fp08,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,2w,1,,t,TAGD,,10200,6600,comment_08,20100301,admin,127.0.0.1,http://localhost/hrc/fp/fp.php?hs_us,Firefox_3.0.13,";
	$data[]="9,ga,fp09,fp09,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,2e,1,,o,OMPD,,10200,6600,comment_09,20100301,admin,127.0.0.1,http://localhost/hrc/fp/fp.php?hs_us,Firefox_3.0.13,";
	$data[]="10,ga,fp10,fp10,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,2w,1,,o,OMPD,,10200,6600,comment_10,20100311,admin,127.0.0.1,http://localhost/hrc/fp/fp.php?hs_us,Firefox_3.0.13,";
	$data[]="11,ga,fp11,fp11,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,2e,1,,e,EPMD,,10200,6600,comment_11,20100310,admin,127.0.0.1,http://localhost/hrc/fp/fp.php?hs_us,Firefox_3.0.13,";
	$data[]="12,ga,fp12,fp12,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,2w,1,,e,EPMD,,10200,6600,comment_12,20100301,admin,127.0.0.1,http://localhost/hrc/fp/fp.php?hs_us,Firefox_3.0.13,";
	$data[]="13,ga,fp13,fp13,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,3e,1,,t,TAGD,,10200,6600,comment_13,20100201,admin,127.0.0.1,http://localhost/hrc/fp/fp.php?hs_us,Firefox_3.0.13,";
	$data[]="14,ga,fp14,fp14,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,3w,1,,t,TAGD,,10200,6600,comment_14,20100301,admin,127.0.0.1,http://localhost/hrc/fp/fp.php?hs_us,Firefox_3.0.13,";
	$data[]="15,ga,fp15,fp15,current,red,50,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,3e,1,,o e t,OPMD EPMD TAG,1,10200,6600,comment_test,20100301,,127.0.0.1,,Firefox_3.0.13,";
	$data[]="16,ga,fp16,fp16,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,3w,1,,o e t,OPMD EPMD TAG,,10200,6600,comment_16,20100301,admin,127.0.0.1,http://localhost/hrc/fp/fp.php?hs_us,Firefox_3.0.13,";
	$data[]="17,ga,fp17,fp17,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,3e,1,,e,EPMD,,10200,6600,comment_17,20100301,admin,127.0.0.1,http://localhost/hrc/fp/fp.php?hs_us,Firefox_3.0.13,";
	$data[]="18,ga,fp18,fp18,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,3w,1,,e,EPMD,,10200,6600,comment_18,20100301,admin,127.0.0.1,http://localhost/hrc/fp/fp.php?hs_us,Firefox_3.0.13,";
	$data[]="19,ga,fp19,fp19,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,nb,1,,h,HRC CG & Staff (north bridge),,10200,6600,comment_19,20100301,admin,127.0.0.1,http://localhost/hrc/fp/fp.php?hs_us,Firefox_3.0.13,";
	$data[]="20,ga,fp20,fp20,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,4ne,1,,p,PERSINDS HRCoE JDC,,10200,6600,comment_20,20100312,admin,127.0.0.1,http://localhost/hrc/fp/fp.php?hs_us,Firefox_3.0.13,";
	$data[]="21,ga,fp21,fp21,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,4nw,1,,p,PERSINDS HRCoE JDC,,10200,6600,comment_21,20100313,admin,127.0.0.1,http://localhost/hrc/fp/fp.php?hs_us,Firefox_3.0.13,";
	$data[]="22,ga,fp22,fp22,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,4sw,1,,p,PERSINDS HRCoE JDC,,10200,6600,comment_22,20100314,admin,127.0.0.1,http://localhost/hrc/fp/fp.php?hs_us,Firefox_3.0.13,";
	$data[]="23,ga,fp23,fp23,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,4se,1,,p,PERSINDS HRCoE JDC,,10200,6600,comment_23,20100330,admin,127.0.0.1,http://localhost/hrc/fp/fp.php?hs_us,Firefox_3.0.13,";
	$data[]="24,ga,fp24,fp24,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,5s,1,,p,PERSINDS,,10200,6600,comment_24,20100401,admin,127.0.0.1,http://localhost/hrc/fp/fp.php?hs_us,Firefox_3.0.13,";
	$data[]="25,ga,fp25,fp25,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,5n,1,,p,PERSINDS,,10200,6600,comment_25,20100415,admin,127.0.0.1,http://localhost/hrc/fp/fp.php?hs_us,Firefox_3.0.13,";
	$data[]="26,ga,fp26,fp26,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,5s,1,,p a g6,PERSINDS AAC G6,,10200,6600,comment_26,20100301,admin,127.0.0.1,http://localhost/hrc/fp/fp.php?hs_us,Firefox_3.0.13,";
	$data[]="27,ga,fp27,fp27,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,5n,1,,p a g6,PERSINDS AAC G6,,10200,6600,comment_27,20100301,admin,127.0.0.1,http://localhost/hrc/fp/fp.php?hs_us,Firefox_3.0.13,";
	$data[]="28,ga,fp28,fp28,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,5s,1,,a,AAC,,10200,6600,comment_28,20100301,admin,127.0.0.1,http://localhost/hrc/fp/fp.php?hs_us,Firefox_3.0.13,";
	$data[]="29,ga,fp29,fp29,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,5n,1,,a,AAC,,10200,6600,comment_29,20100301,admin,127.0.0.1,http://localhost/hrc/fp/fp.php?hs_us,Firefox_3.0.13,";
	$data[]="30,ga,fp30,fp30,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,6e,1,,a t,AAC TAGD,,10200,6600,comment_30,20100301,admin,127.0.0.1,http://localhost/hrc/fp/fp.php?hs_us,Firefox_3.0.13,";
	$data[]="31,ga,fp31,fp31,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,6w,1,,a t h,AAC TAGD HRC Staff,,10200,6600,comment_31,20100301,admin,127.0.0.1,http://localhost/hrc/fp/fp.php?hs_us,Firefox_3.0.13,";
	$data[]="32,ga,fp32,fp32,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,6e,1,,a,AAC,1,10200,6600,comment_32,20100312,,198.49.187.20,,Firefox_3.0.13,";
	$data[]="33,ga,fp33,fp33,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,6w,1,,a,AAC,,10200,6600,comment_33,20100301,admin,127.0.0.1,http://localhost/hrc/fp/fp.php?hs_us,Firefox_3.0.13,";
	$data[]="34,ga,fp34,fp34,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,6e,1,,a,AAC,,10200,6600,comment_34,20100301,admin,127.0.0.1,http://localhost/hrc/fp/fp.php?hs_us,Firefox_3.0.13,";
	$data[]="35,ga,fp35,fp35,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,6w,1,,a,AAC,,10200,6600,comment_35,20100301,admin,127.0.0.1,http://localhost/hrc/fp/fp.php?hs_us,Firefox_3.0.13,";
	$data[]="36,ga,fp36,fp36,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,knox,plan-a,sb,1,,a,AAC CG (south bridge),,10200,6600,comment_36,20100301,admin,127.0.0.1,http://localhost/hrc/fp/fp.php?hs_us,Firefox_3.0.13,";
	$data[]="37,ga,fp37,fp37,current,blu,90,manual,20100316,cmd,cmdout,desc,misc,stl,prevedel,prv-b2,-2,,h,Prevedel B2,,5000,5000,comment_37,20100301,,,,Firefox_3.0.13,";
	$data[]="38,ga,fp38,fp38,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,stl,prevedel,prv-b1,-1,,h,Prevedel B1,,5000,5000,comment_38,20100301,,,,Firefox_3.0.13,";
	$data[]="39,ga,fp39,fp39,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,stl,prevedel,prv-1,1,,h,Prevedel 1,,5000,5000,comment_39,20100301,,,,Firefox_3.0.13,";
	$data[]="40,ga,fp40,fp40,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,stl,prevedel,prv-2,2,,h,Prevedel 2,,5000,5000,comment_40,20100301,,,,Firefox_3.0.13,";
	$data[]="41,ga,fp41,fp41,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,stl,prevedel,prv-3,3,,h,Prevedel 3,,5000,5000,comment_41,20100301,,,,Firefox_3.0.13,";
	$data[]="42,ga,fp42,fp42,current,blu,90,manual,20100316,cmd,cmdout,desc,misc,stl,prevedel,prv-4,4,,h,Prevedel 4,,5000,5000,comment_42,20100301,,,,Firefox_3.0.13,";
	$data[]="43,ga,fp43,fp43,current,red,90,manual,20100316,cmd,cmdout,desc,misc,stl,prevedel,prv-5,5,,h,Prevedel 5,,5000,5000,comment_43,20100301,,,,Firefox_3.0.13,";
	$data[]="44,ga,fp44,fp44,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,stl,bldg100,b100-1,1,,x,Bldg 100 1,,5000,5000,comment_44,20100301,,,,Firefox_3.0.13,";
	$data[]="45,ga,fp45,fp45,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,stl,bldg100,b100-2,2,,x,Bldg 100 2,,5000,5000,comment_45,20100301,,,,Firefox_3.0.13,";
	$data[]="46,ga,fp46,fp46,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,stl,bldg100,b100-3,3,,x,Bldg 100 3,,5000,5000,comment_46,20100301,,,,Firefox_3.0.13,";
	$data[]="47,ga,fp47,fp47,current,red,90,manual,20100316,cmd,cmdout,desc,misc,stl,bldg100,b100-4,4,,x,Bldg 100 4,,5000,5000,comment_47,20100301,,,,Firefox_3.0.13,";
	$data[]="48,ga,fp48,fp48,current,blu,90,manual,20100316,cmd,cmdout,desc,misc,stl,hrcstl,b100-prv,1,,h,b100-prv,,4800,6650,comment_48,20100301,,,,,";
	$data[]="49,ga,fp49,fp49,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,stl,hrcstl-org2009,hrcstl-org2009,1,,h,hrcstl-org,,,,,20100301,,,,,";
	$data[]="50,ga,fp50,fp50,current,grn,90,manual,20100316,cmd,cmdout,desc,misc,stl,advon-templet,advon-templet,1,,h,advon-templet,1,,,test,20120101,,198.49.187.20,,,";
	$data[]="51,ga,fp51,fp51,current,blu,90,date,20010101,cmd,cmdout,desc,misc,,,,,,,,,,,comment_51_20010101,,,,,,";
	$data[]="52,ga,fp52,fp52,current,blu,90,date,20100229,cmd,cmdout,desc,misc,,,,,,,,,,,comment_52_20100229,,,,,,";
	$data[]="53,ga,fp53,fp53,current,blu,90,date,20100301,cmd,cmdout,desc,misc,,,,,,,,,,,comment_53_20100301,,,,,,";
	$data[]="54,ga,fp54,fp54,current,blu,90,date,20100315,cmd,cmdout,desc,misc,,,,,,,,,,,comment_54_20100315,,,,,,";
	$data[]="55,ga,fp55,fp55,current,blu,90,date,20100316,cmd,cmdout,desc,misc,,,,,,,,,,,comment_55_20100316,,,,,,";
	$data[]="56,ga,fp56,fp56,current,blu,90,date,20100317,cmd,cmdout,desc,misc,,,,,,,,,,,comment_56_201000317,,,,,,";
	$data[]="57,ga,fp57,fp57,current,blu,90,date,20100330,cmd,cmdout,desc,misc,,,,,,,,,,,comment_57_20100330,,,,,,";
	$data[]="58,ga,fp58,fp58,current,blu,90,date,20100401,cmd,cmdout,desc,misc,,,,,,,,,,,comment_58_20100401,,,,,,";
	$data[]="59,ga,fp59,fp59,current,blu,90,date,20110101,cmd,cmdout,desc,misc,,,,,,,,,,,comment_59_20110101,,,,,,";
	$data[]="60,ga,fp60,fp60,current,blu,90,cmd,20100316,pwd,cmdout,desc,misc,,,,,,,,,,,comment_59_cmd_pwd,,,,,,";
	$data[]="61,ga,fp61,fp61,current,blu,90,cmd,20100316,dir,cmdout,desc,misc,,,,,,,,,,,comment_59_cmd_dir,,,,,,";

	pdo_insert( $dbfile, $tblname, $data);
	}

function pdo_insert_nodes() {
	$dbfile=$GLOBALS['dbfile'];
	$tblname="nodes";
	$node_dttm=date("Y-m-d H:i:s");
	$led_referer=$_SERVER['HTTP_REFERER'];
	$led_user_agent=$_SERVER['HTTP_USER_AGENT'];
	$led_remote_port=$_SERVER['REMOTE_PORT'];

	$data[]="node_name,node_dttm,node_color,node_speed,node_comment,node_user,node_user_ip,node_referer,node_user_agent,node_remote_port";
	$data[]="fp01,$dttm,red,10,comment1,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp02,$dttm,blu,10,comment2,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp03,$dttm,grn,10,comment3,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp04,$dttm,grn,50,comment4,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp05,$dttm,grn,90,comment5,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp06,$dttm,grn,90,comment5,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp07,$dttm,grn,90,comment5,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp08,$dttm,grn,90,comment5,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp09,$dttm,grn,90,comment5,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp10,$dttm,grn,90,comment5,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp11,$dttm,red,10,comment1,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp12,$dttm,blu,10,comment2,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp13,$dttm,grn,10,comment3,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp14,$dttm,grn,50,comment4,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp15,$dttm,grn,90,comment5,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp16,$dttm,grn,90,comment5,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp17,$dttm,grn,90,comment5,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp18,$dttm,grn,90,comment5,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp19,$dttm,grn,90,comment5,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp20,$dttm,grn,90,comment5,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp21,$dttm,red,10,comment1,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp22,$dttm,blu,10,comment2,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp23,$dttm,grn,10,comment3,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp24,$dttm,grn,50,comment4,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp25,$dttm,grn,90,comment5,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp26,$dttm,grn,90,comment5,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp27,$dttm,grn,90,comment5,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp28,$dttm,grn,90,comment5,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp29,$dttm,grn,90,comment5,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp30,$dttm,grn,90,comment5,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp31,$dttm,grn,90,comment5,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp32,$dttm,grn,90,comment5,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp33,$dttm,grn,90,comment5,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp34,$dttm,grn,90,comment5,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp35,$dttm,grn,90,comment5,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";
	$data[]="fp36,$dttm,grn,90,comment5,admin,127.0.0.1,$node_referer,$node_user_agent,$node_remote_port";

	pdo_insert( $dbfile, $tblname, $data);
	return;
	}


function pdo_insert_roles() {
	$dbfile=$GLOBALS['dbfile'];
	$tblname="roles";
	$data[]="role_code, role_status, role_comment";
	$data[]="admin,a,administrator";
	$data[]="iperms,a,iperms";
	$data[]="operator,a,operator";
	$data[]="manager,a,manager";
	$data[]="qc,a,quality_control";
	$data[]="user,a,user";
	$data[]="tester,a,tester";
	$data[]="guest,a,guest";
	$data[]=",a,anonymous";
	pdo_insert( $dbfile, $tblname, $data);
	return;
	}

function pdo_insert_users() {
	$dbfile=$GLOBALS['dbfile'];
	$tblname="users";
	$dt=date("Y-m-d H:i:s");
	$data[] = "user_code,user_status,user_pass,user_role,user_group,user_name,user_dttm,user_pagelines";
	$data[] = ",a,,,,anonymous,$dt,5";
	$data[] = "admin,a,..adm1n,admin,grp,jan admin,$dt,30";
	$data[] = "iperms,a,..ip3rmz,iperms,grp,jan admin,$dt,30";
	$data[] = "tester,a,..t3st3r,tester,grp,jan admin,$dt,30";
	$data[] = "op,a,..op,grp,grp,jan operator,$dt,25";
	$data[] = "manager,a,..mgr,manager,grp,jan manager,$dt,20";
	$data[] = "qc,a,..qc,qc,grp,jan quality_control,$dt,15";
	$data[] = "user,a,..user,user,grp,jan user,$dt,10";
	$data[] = "guest,a,..guest,guest,grp,jan guest,$dt,5";
	$data[] = "a,a,aa,admin,grp,joe admin,$dt,30";
	$data[] = "o,a,oo,admin,grp,joe admin,$dt,25";
	$data[] = "m,a,mm,manager,grp,joe manager,$dt,20";
	$data[] = "q,a,qq,qc,grp,joe quality_control,$dt,15";
	$data[] = "u,a,uu,user,grp,joe user,$dt,10";
	$data[] = "g,a,gg,guest,grp,jan guest,$dt,5";	
	pdo_insert( $dbfile, $tblname, $data );
	return;
	}


function pdo_insert_fp() {
	$dbfile=$GLOBALS['dbfile'];
	$tblname="fp";
	$dt=date("Y-m-d H:i:s");
	print( "BUGS1910 pdo_insert_fp BEG: [$dbfile][$tblname]<hr>$sql<hr>\n" );
	$data[] = "code,status,label,title,width,height,dttm,comment,unique_id";
	$data[] = "fp01,a,fp01,title01,5301,3300,20090912,comment,unique_id";
	$data[] = "fp02,a,fp02,title02,5301,3300,20090912,comment,unique_id";
	$data[] = "fp03,a,fp03,title03,5301,3300,20090912,comment,unique_id";
	$data[] = "fp04,a,fp04,title04,5301,3300,20090912,comment,unique_id";
	$data[] = "fp05,a,fp05,title05,5301,3300,20090912,comment,unique_id";
	$data[] = "fp06,a,fp06,title06,5301,3300,20090912,comment,unique_id";
	$data[] = "fp07,a,fp07,title07,5301,3300,20090912,comment,unique_id";
	$data[] = "fp08,a,fp08,title08,5301,3300,20090912,comment,unique_id";
	$data[] = "fp09,a,fp09,title09,5301,3300,20090912,comment,unique_id";
	print_r( $data );
	print( "BUGS1920 pdo_insert_fp END: [$dbfile][$tblname]<hr>$sql<hr>\n" );
	pdo_insert( $dbfile, $tblname, $data );
	}



function pdo_insert_grid() {
	$dbfile=$GLOBALS['dbfile'];
	$tblname="grid";
	$dt=date("Y-m-d H:i:s");
	$data[] ="code,status,x,y,org,name,phone,email,dttm,comment,unique_id";
	$data[] ="fp01,status,x,y,org,name,phone,email,dttm,comment,unique_id";
	$data[] ="fp02,status,x,y,org,name,phone,email,dttm,comment,unique_id";
	$data[] ="fp03,status,x,y,org,name,phone,email,dttm,comment,unique_id";
	$data[] ="fp36,status,x,y,org,name,phone,email,dttm,comment,unique_id";
	pdo_insert( $dbfile, $tblname, $data );
	}



function pdo_insert_us() {
	$dbfile=$GLOBALS['dbfile'];
	$tblname="us";
	$dt=date("Y-m-d H:i:s");
	$data[] ="code,status,x,y,grp,name,phone,email,dttm,comment,unique_id";
	$data[] ="hb,us_status,us_x,us_y,us_grp,us_name,us_phone,us_email,us_dttm,us_comment,us_unique_id";
	$data[] ="ct,us_status,us_x,us_y,us_grp,us_name,us_phone,us_email,us_dttm,us_comment,us_unique_id";
	$data[] ="jn,us_status,us_x,us_y,us_grp,us_name,us_phone,us_email,us_dttm,us_comment,us_unique_id";
	$data[] ="ng,us_status,us_x,us_y,us_grp,us_name,us_phone,us_email,us_dttm,us_comment,us_unique_id";
	$data[] ="sw,us_status,us_x,us_y,us_grp,us_name,us_phone,us_email,us_dttm,us_comment,us_unique_id";
	$data[] ="mo,us_status,us_x,us_y,us_grp,us_name,us_phone,us_email,us_dttm,us_comment,us_unique_id";
	$data[] ="ds,us_status,us_x,us_y,us_grp,us_name,us_phone,us_email,us_dttm,us_comment,us_unique_id";
	$data[] ="mlj,us_status,us_x,us_y,us_grp,us_name,us_phone,us_email,us_dttm,us_comment,us_unique_id";
	$data[] ="tb,us_status,us_x,us_y,us_grp,us_name,us_phone,us_email,us_dttm,us_comment,us_unique_id";
	$data[] ="jw,us_status,us_x,us_y,us_grp,us_name,us_phone,us_email,us_dttm,us_comment,us_unique_id";
	pdo_insert( $dbfile, $tblname, $data );
	}

function pdo_insert_hw() {
	$dbfile=$GLOBALS['dbfile'];
	$tblname="hw";
	$dt=date("Y-m-d H:i:s");
	$data[] = "code,status,x,y,grp,name,phone,email,ip,dttm,comment,unique_id";
	$data[] = "ftp1a,status,x,y,grp,name,phone,email,ip,dttm,comment,unique_id";
	$data[] = "ftp2a,status,x,y,grp,name,phone,email,ip,dttm,comment,unique_id";
	$data[] = "ftp3a,status,x,y,grp,name,phone,email,ip,dttm,comment,unique_id";
	$data[] = "api1,status,x,y,grp,name,phone,email,ip,dttm,comment,unique_id";
	$data[] = "ascrv1,status,x,y,grp,name,phone,email,ip,dttm,comment,unique_id";
	$data[] = "host1,status,x,y,grp,name,phone,email,ip,dttm,comment,unique_id";
	print( "BUGS1953 pdo_insert_hw: $dbfile $tblname $data<br>\n" );
	print_r( $data );
//	pdo_insert( $dbfile, $tblname, $data );
	}

function pdo_insert_n11() {
	$dbfile=$GLOBALS['dbfile'];
	$tblname="n11";
	$dt=date("Y-m-d H:i:s");
	$data[] = "code,status,x,y,grp,name,phone,email,ip,dttm,comment,unique_id";
	$data[] = "ftp1a,status,x,y,grp,name,phone,email,ip,dttm,comment,unique_id";
	$data[] = "ftp2a,status,x,y,grp,name,phone,email,ip,dttm,comment,unique_id";
	$data[] = "ftp3a,status,x,y,grp,name,phone,email,ip,dttm,comment,unique_id";
	$data[] = "api1,status,x,y,grp,name,phone,email,ip,dttm,comment,unique_id";
	$data[] = "ascrv1,status,x,y,grp,name,phone,email,ip,dttm,comment,unique_id";
	$data[] = "host1,status,x,y,grp,name,phone,email,ip,dttm,comment,unique_id";
	pdo_insert( $dbfile, $tblname, $data );
	}

function pdo_insert_obj() {
	$dbfile=$GLOBALS['dbfile'];
	$tblname="obj";
	$dt=date("Y-m-d H:i:s");
	$data[] = "filename,width,height,nhor,nvert,title,desc";
	$data[] = "petri_1053_600_13_6.jpg,1053,600,13,1,petri dishes large 1053x600,desc01";
	$data[] = "petri_526_300_13_6.jpg,526,300,13,1,petri dishes small 526x300,desc02";
	$data[] = "strip_goplayers.jpg,4819,200,17,1,goplayer 4819x200,desc03";
	$data[] = "strip_helmet.jpg,10880,480,17,1,helmet 10880x480,desc04";
	$data[] = "strip_p100.jpg,1280,480,2,1,p100 two sides,desc05";
	$data[] = "usf_1711_200_8_1.jpg,1711,200,8,1,us female body 1711x200,desc06";
	$data[] = "usf_3464_405_8_1.jpg,3464,405,8,1,us female body 3464x405,desc07";
	$data[] = "usf_855_100_8_1.jpg,855,100,8,1,us female body 855x100,desc08";
	$data[] = "usf_head_3464_72_8_1.jpg,3452,72,8,1,femail head 3464x72,desc09";
	$data[] = "usm_1711_200_8_1.jpg,1711,200,8,1,mail body 1711x200,desc10";
	$data[] = "usm_3464_405_8_1.jpg,3464,405,8,1,us male body 3464x405,desc11";
	$data[] = "usm_855_100_8_1.jpg,855,100,8,1,us male body 855x100,desc12";
	$data[] = "usm_head_3464_64_8_1.jpg,3452,64,8,1,us male head 3464x64,desc13";
	pdo_insert( $dbfile, $tblname, $data );

	}
function pdo_insert_pano() {
	$dbfile=$GLOBALS['dbfile'];
	$tblname="pano";
	$dt=date("Y-m-d H:i:s");
	$data[] = "filename,width,height,nhor,nvert,title,desc";
	$data[] = "pano_creek.jpg,2000,1000,0,0,pano creek,desc01";
	$data[] = "pano_fort.jpg,2000,1000,0,0,pano fort,desc02";
	$data[] = "pano_fort2.jpg,2000,1000,0,0,pano fort2,desc03";
	$data[] = "pano_grotto.jpg,2000,1000,0,0,pano grotto.jpg,desc04";
	$data[] = "pano_jtf_entrance.jpg,5607,512,0,0,pano entrance,desc05";
	$data[] = "pano_night.jpg,2000,1000,0,0,pano night,desc06";
	$data[] = "pano_office.jpg,2000,1000,0,0,pano office,desc07";
	$data[] = "pano_templet.gif,600,300,0,0,pano templet,desc08";
	$data[] = "pano_templet2.jpg,300,154,0,0,pano templet2,desc09";
	pdo_insert( $dbfile, $tblname, $data );
	}


function pdo_grid_array($options) {
	$output = "";
	$output .= "<table id=\"list4\" class=\"scroll\" cellpadding=\"0\" cellspacing=\"0\">\n";
	$output .= "</table>\n";

	$output .= "<script type=\"text/javascript\">\n";
//	$output .= "var gridimgpath = 'js/jqgrid-3.5.3/themes/redmond/images';\n";
	$output .= "var gridimgpath = 'js/jqgrid-4.4.0/themes/redmond/images';\n";
	$output .= "jQuery(\"#list4\").jqGrid({\n";
	$output .= " datatype: \"local\",\n";
	$output .= " height: 250,\n";
	$output .= " colNames:['No','Date', 'Client', 'Amount','Tax','Total','Notes'],\n";
	$output .= " colModel:[ \n";
	$output .= "	{name:'id',index:'id', width:60, sorttype:\"int\"},\n";
	$output .= "	{name:'date',index:'date', width:90, sorttype:\"date\"},\n";
	$output .= "	{name:'name',index:'name', width:100},\n";
	$output .= "	{name:'amount',index:'amount', width:80, align:\"right\",sorttype:\"float\"},\n";
	$output .= "	{name:'tax',index:'tax', width:80, align:\"right\",sorttype:\"float\"},\n";
	$output .= "	{name:'total',index:'total', width:80,align:\"right\",sorttype:\"float\"},\n";
	$output .= "	{name:'note',index:'note', width:150, sortable:false}\n";
	$output .= " ], \n";
	$output .= "imgpath: gridimgpath,\n";
	$output .= "multiselect: true,\n";
	$output .= "caption: \"Manipulating Array Data\"\n";
	$output .= "});\n";
	$output .= "var mydata = [\n";
	$output .= "	{id:\"1\",date:\"2007-10-01\",name:\"test\",note:\"note\",amount:\"200.00\",tax:\"10.00\",total:\"210.00\"},\n";
	$output .= "	{id:\"2\",date:\"2007-10-02\",name:\"test2\",note:\"note2\",amount:\"300.00\",tax:\"20.00\",total:\"320.00\"},\n";
	$output .= "	{id:\"3\",date:\"2007-09-01\",name:\"test3\",note:\"note3\",amount:\"400.00\",tax:\"30.00\",total:\"430.00\"},\n";
	$output .= "	{id:\"4\",date:\"2007-10-04\",name:\"test\",note:\"note\",amount:\"200.00\",tax:\"10.00\",total:\"210.00\"},\n";
	$output .= "	{id:\"5\",date:\"2007-10-05\",name:\"test2\",note:\"note2\",amount:\"300.00\",tax:\"20.00\",total:\"320.00\"},\n";
	$output .= "	{id:\"6\",date:\"2007-09-06\",name:\"test3\",note:\"note3\",amount:\"400.00\",tax:\"30.00\",total:\"430.00\"},\n";
	$output .= "	{id:\"7\",date:\"2007-10-04\",name:\"test\",note:\"note\",amount:\"200.00\",tax:\"10.00\",total:\"210.00\"},\n";
	$output .= "	{id:\"8\",date:\"2007-10-03\",name:\"test2\",note:\"note2\",amount:\"300.00\",tax:\"20.00\",total:\"320.00\"},\n";
	$output .= "	{id:\"9\",date:\"2007-09-01\",name:\"test3\",note:\"note3\",amount:\"400.00\",tax:\"30.00\",total:\"430.00\"}\n";
	$output .= "	]; \n";
	$output .= "for( var i=0; i <= mydata.length; i++) \n";
	$output .= "	jQuery(\"#list4\").addRowData(i+1,mydata[i]); \n";
	$output .= "</script>\n";


	return( $output );
	}




function pdo_grid( $options ) {
	$http_host=$_SERVER['HTTP_HOST'];
	$php_self=$_SERVER['PHP_SELF'];
	$js_output=$GLOBALS['js_output'];

	$dbfiles = $GLOBALS['dbs'];
	$url_dbcode=$options[2];
	$url_table=$options[3];
	$url_value=$options[4];
	$url_value1=$options[5];
	$url_value2=$options[6];

	$url_zmcode=$options[4];
	$url_zmtype=$options[5];
	$url_zmrowid=$options[6];

//	print( "pdo_gird_2877:  o1=[$options[1]] o2=[$options[2]] o3=[$options[3]] o4=[$options[4]] o5=[$options[5]] o6=[$options[6]] o7=[$options[7]]<br>\n" );
//	print( "pdo_grid_2878: _SESSION[hs_type]=[".$_SESSION['hs_type']."] dbcode=[$url_dbcode] url_table=[$url_table] url_zmcode=[$url_zmcode] url_zmtype=[$url_zmtype]<br>\n" );
	if(( $url_zmtype == "" ) & ( $_SESSION['hs_type'] )) { $url_zmtype = $_SESSION['hs_type']; }

//	print( "pdo_grid_2880: _SESSION[hs_type]=[".$_SESSION['hs_type']."] dbcode=$url_dbcode url_table=$url_table url_zmcode=[$url_zmcode] url_zmtype=[$url_zmtype] url_zmrowid=[$url_zmrowid]<br>\n" );

	$role=$_SESSION['role'];
	$theme=$_SESSION['theme'];
	$gridimgpath = $_SESSION['gridimgpath'];
//	print( "BUGS_2595 gridimgpath=[$gridimgpath] theme=$theme role=$role<br>\n" );

	$page=1;
	$records=1;

	if( $url_dbcode == "" ) {
		print( "<hr><h2>pdo_grid url_dbcode[$url_dbcode] url_table=[$url_table]</h2><hr>\n" );
		foreach( $dbfiles as $dbcode => $dbinfo ) {
			$dbfile=$dbfiles[$dbcode]['dbfile'];
			$tblcnt=count( $dbfiles[$dbcode]['tables']);
			$path_parts = pathinfo($dbfile);
			$dbfile_filename=$path_parts['filename'];
//			print( "<a href=$php_self?q=db/grid/$dbfile_filename>$dbfile_filename $tblcnt</a><br />\n" );
			$output .= "<a href=$php_self?q=db/grid/$dbfile_filename>$dbfile_filename $tblcnt</a><br />\n";
			}
		return($output);
		}


// select database/tables
	if(( $url_dbcode != "" )  && ( $url_table == "" )) {
//		print( "<hr><h2>$dttm MSG_3536:  pdo_unload url_dbcode[$url_dbcode] url_table=[$url_table]</h2><hr>\n" );
		$output .= "<hr><h2>$dttm MSG_3536:  pdo_unload url_dbcode[$url_dbcode] url_table=[$url_table]</h2><hr>\n";
		foreach( $dbfiles[$url_dbcode]['tables'] as $table => $tableinfo ) {
//			print( "<a href=$php_self?q=db/grid/$url_dbcode/$tableinfo>$tableinfo </a><br />\n" );
			$output .= "<a href=$php_self?q=db/grid/$url_dbcode/$tableinfo>$tableinfo </a><br />\n";
			}
		return( $output );
		}

	$dbfile=$dbfiles[$url_dbcode][dbfile];
//	print( "pdo_grid BUGS_3546:  url_dbcode=[$url_dbcode] dbfile=[$dbfile]<hr>\n" );
	$testfile="/home/ko/vg/kohpx_vg.db3";
	$testfile="/var/www/html/index1.php";
	$testfile="/home/ko/vg/kohpx_vg.db3";
	$testfile="/var/www/html/ka1/kohpx_vg.db3";
///	if( file_exists( "/home/ko/vg/kohpx_vg.db3" )) {
///		printf( "$progid MSG_3550:  FOUND testfile=[$testfile]<hr>\n" );
///		}
///	else {
///		printf( "$progid ERR_3550:  NOTFOUND testfile=[$testfile]<hr>\n" );
///		}

	if( ! file_exists( $dbfile )) {
//		print( "pdo_grid ERR:  NOTFOUND url_dbcode=[$url_dbcode] dbfile=[$dbfile]<hr>\n" );
		$output .= "pdo_grid ERR:  NOTFOUND url_dbcode=[$url_dbcode] dbfile=[$dbfile]<hr>\n";
		return( $output );
		}



	$where_clause="";
	$jqgrid_list_id = "list_$url_dbcode"."_$url_table"."_$url_value"."_$url_value1"."_$url_value2";
	$jqgrid_pager_id = "pager_$url_dbcode"."_$url_table"."_$url_value"."_$url_value1"."_$url_value2";
	$jqgrid_url = "url:'https://$http_host$php_self";
	$jqgrid_url .= "?q=db/gridxml/".$url_dbcode."/".$url_table."/".$url_value."/".$url_value1."/".$url_value2."',";
	$jqgrid_editurl = "editurl:'https://$http_host$php_self";
	$jqgrid_editurl .= "?q=db/gridxml/".$url_dbcode."/".$url_table."/".$url_value."/".$url_value1."/".$url_value2."',";

//	print( "BUGS_2925 pdo_grid url_table=[$url_table]<br>\n" );
	if( $url_table == "zoomxml" ) {
		$jqgrid_list_id = "list_$url_dbcode"."_$url_table"."_$url_zmcode"."_$url_zmtype"."_$url_zmrowid";
		$jqgrid_pager_id = "pager_$url_dbcode"."_$url_table"."_$url_zmcode"."_$url_zmtype"."_$url_zmrowid";
		$jqgrid_url = "url:'https://$http_host$php_self";
		$jqgrid_url .= "?q=db/gridxml/".$url_dbcode."/".$url_table."/".$url_zmcode."/".$url_zmtype."/".$url_zmrowid."',";
		$jqgrid_editurl = "editurl:'https://$http_host$php_self";
		$jqgrid_editurl .= "?q=db/gridxml/".$url_dbcode."/".$url_table."/".$url_zmcode."/".$url_zmtype."/".$url_zmrowid."',";
		switch( true ) {
			case( $url_zmcode == "" & $url_zmtype == "" & $url_zmrowid == "" ):	
				$where_clause = "";
				break;
			case( $url_zmcode == "" & $url_zmtype == "" & $url_zmrowid != "" ):	
				$where_clause = "where rowid = '$url_zmrowid'";
				break;
			case( $url_zmcode == "" & $url_zmtype != "" & $url_zmrowid == "" ):	
				$where_clause = "where type = '$url_zmtype'";
				break;
			case( $url_zmcode == "" & $url_zmtype != "" & $url_zmrowid != "" ):	
				$where_clause = "where type = '$url_zmtype' and rowid='$zmrowid'";
				break;
			case( $url_zmcode == "all" & $url_zmtype == "all" & $url_zmrowid == "" ):	
				$where_clause = "";
				break;
			case( $url_zmcode == "" & $url_zmtype == "all" & $url_zmrowid == "" ):	
				$where_clause = "";
				break;
			case( $url_zmcode == "" & $url_zmtype == "all" & $url_zmrowid != "" ):	
				$where_clause = "where zoomxml_id = '$url_zmrowid'";
				break;
			case( $url_zmcode != "" & $url_zmtype == "" & $url_zmrowid == "" ):	
//				$where_clause = "where code = '$url_zmcode'";
				break;
			case( $url_zmcode != "" & $url_zmtype == "" & $url_zmrowid != "" ):	
				$where_clause = "where code = '$url_zmcode' and rowid = '$rowid'";
				break;
			case( $url_zmcode != "" & $url_zmtype != "" & $url_zmrowid == "" ):	
				$where_clause = "where code = '$url_zmcode' and type = '$url_zmtype'";
				break;
			case( $url_zmcode != "" & $url_zmtype != "" & $url_zmrowid != "" ):	
				$where_clause = "where code = '$url_zmcode' & type = '$url_zmtype' and rowid = '$url_rowid'";
				break;
			}
///		print( "BUGS_2968 pdo_grid ZOOMXML:  url_zmtype=[$url_zmtype] url_zmcode=[$url_zmcode] where=[$where_clause]\n" );
		}
	if( $url_table == "zoom" ) {
///		print( "BUGS_2972 pdo_grid ZOOM:  url_zmtype=[$url_zmtype] url_zmcode=[$url_zmcode] where=[$where_clause]\n" );
		}

	$pdo = newpdo($dbfile);

//	$sql = "select count(*) pagetotal from $url_table";
	$sql = "select count(*) pagetotal from $url_table $where_clause";


	$output .= "<!-- pdo_grid_2986: sql=[$sql]<br> -->\n";
	$output .= "<!-- pdo_grid_2987: where_clause=[$where_clause]<br> -->\n";

	$sqlout = $pdo->query($sql);
	$record = $sqlout->fetchall();
	if(sizeof($record) != 0) { 
//		print( "sizeof record != 0 $record<br>\n" );
		$total_pages=$record[0][0];
		}
	else {
		$total_pages=0;
		}		


//	$sql = "select * from $url_table";
//	$sql = "select rowid,* from $url_table";
	$sql = "select rowid,* from $url_table $where_clause";
//	print( "BUGS_2999 sql=[$sql] url_table=[$url_table] where_clause=[$where_clause] $zmcode $zmtype<br>\n" );
//	print( "BUGS_3000 url_table[$url_table] url_zmcode=[$url_zmcode] url_zmtype=[$url_zmtype] url_zmrowid=[$url_zmrowid]<br>\n" );
	$result = $pdo->query($sql);
	$collim = $result->columnCount();

	$xml_rowid = 1;
	$output = "";
	$colmodel="";
	$colnames="";
	$coldata=""; 
	$sortname="";

	while($row = $result->fetch(PDO::FETCH_ASSOC)) {
		$xml .= "<row id='". $xml_rowid . ";>\n";
		
		if($xml_rowid == 1) {
//			$output .= join(",", array_keys($row)) . "\n";
			$colnames = "			colNames:[";
			$colmodel .= "			colModel:[\n";
			foreach( $row as $col => $val ) {
				if( $sortname == "" ) { $sortname=$col; }
//				$colnames .= "<td>hdrs:". $col. " = ".$val."</td>\n";
//				$colnames .= "    colNames:['No','Date', 'Client', 'Amount','Tax','Total','Notes'],\n";
				$colnames .= "'$col',";
//				$colmodel .= "				{name:'".$col."',index:'".$col."', width:40 },\n";
				$colmodel .= "				{name:'".$col."',index:'".$col."', width:40, editable:true },\n";
				}
			$colnames .= "]\n";
			$colnames = str_replace( ",]", "],", $colnames );
			$colmodel .= "]";
			$colmodel = str_replace( "},\n]", "}\n				],\n", $colmodel );
			
			}
		else {
//			$output .= join(",", $row) ."\n";
			$coldata .="<tr>\n";	
			foreach( $row as $col => $val ) {
//				$colmodel .= "<td>cols: ". $col. " = ".$val."</td>\n";
//				$output .= "    colModel:[\n";
//				$output .= "        {name:'No',index:'id', width:55},\n";
//				$output .= "        {name:'Notes',index:'note', width:150, sortable:false}		\n";
//				$output .= "    ],\n";
				$coldata .= "<td>$val</td>";
				}
			$coldata .= "\n</tr>\n";
			}

//		$rowid++;
		$xml_rowid++;
		}
	$pdo=null;


//	$js_output .= "<script type=\"text/javascript\">\n";
//	$js_output .= "	var gridimgpath = 'js/themes/swanky-purse/images'\n";
//	$js_output .= "jQuery(document).ready(function(){\n";
//	$js_output .= "	jQuery().ready(function(){\n";

	$js_output .= "		jQuery(\"#$jqgrid_list_id\").jqGrid({\n";

///	$request="";
///	if( $_REQUEST['rowid'] ) { $request .= "&rowid=".$_REQUEST['rowid']; }
///	if( $_REQUEST['code'] ) { $request .= "&code=".$_REQUEST['code']; }
///	if( $_REQUEST['type'] ) { $request .= "&type=".$_REQUEST['type']; }


	$js_output .= "			$jqgrid_url\n";
	$js_output .= "			$jqgrid_editurl\n";

//	$js_output .= "			datatype: \"json\",\n";
	$js_output .= "			datatype: \"xml\",\n";
	$js_output .= $colnames;
	$js_output .= $colmodel;
//	$js_output .= "			imgpath: \"js/jqgrid-3.5.3/themes/redmond/images\",\n";
	$js_output .= "			imgpath: gridimgpath,\n";

	$js_output .= "			height:400,\n";
//	$js_output .= "			rowNum:50,\n";

	$rownum_default=10;
	$rownum=$rownum_default;
	if( $url_table == "zoom" ) { $rownum=50; }
	if( $url_table == "zoomxml" ) { $rownum=25; }
	$caption =  "$url_dbcode $url_table $zmcode $where_clause";

///	print( "BUGS_3081 CAPTION pdo_grid: caption=[$caption] rownum=[$rownum] url_table=[$url_table] where_clause=[$where_clause]<br>\n" );
	$js_output .= "			rowNum: $rownum,\n";
	$js_output .= "			autowidth: true,\n";
	$js_output .= "			rowList:[10,20,30,50, 100, 500, 1000],\n";
//	$js_output .= "			pager: jQuery('#pager1'),\n";
	$js_output .= "			pager: jQuery('#$jqgrid_pager_id'),\n";
	$js_output .= "			sortname: '".$sortname."',\n";
	$js_output .= "			viewrecords: true,\n";
	$js_output .= "			sortorder: \"asc\",\n";
//	$js_output .= "			sortorder: \"desc\",\n";
//	$js_output .= "			caption: \"jqgrid $url_dbcode $url_table $url_value\"\n";
//	$js_output .= "			caption: \"$url_dbcode $url_table $zmcode $where_clause\"\n";
	$js_output .= "			caption: \"$caption\"\n";
//	$js_output .= "			}).navGrid('#pager1',{edit:false,add:false,del:false});\n";	
//	$js_output .= "			}).navGrid('#pager1',{edit:true,add:true,del:true});\n";	
	$js_output .= "			}).navGrid('#$jqgrid_pager_id',{edit:true,add:true,del:true});\n";	
	$js_output .= "\n";

//	$js_output .= "		});\n";
//	$js_output .= "	});\n";
//	$js_output .= "</script>\n";



	$output  = "";
///	$output .= $html_theme_links;

	$output .= "<table id=\"$jqgrid_list_id\" class=\"scroll\" cellpadding=\"0\" cellspacing=\"0\"></table>\n";
	$output .= "<div id=\"$jqgrid_pager_id\" class=\"scroll\" style=\"text-align:center;\"></div>\n";
	$output .= "\n";

	$url_table=$options[3];
	$url_value=$options[4];



	$export_img="<img src=images/btn/export.png width=40 border=0>";
	$import_img="<img src=images/btn/import.png width=40 border=0>";
	$unload_img="<img src=images/btn/unload.png width=40 border=0>";
	$load_img="<img src=images/btn/load.png width=40 border=0>";
	$http_host=$_SERVER['HTTP_HOST'];
	$php_self=$_SERVER['PHP_SELF'];
	$output .= "<hr>\n";
///	$output .= "<a href=http://$http_host$php_self?q=db/unload/$url_dbcode/$url_table>$export_img unload $url_dbcode $url_table</a>\n";
	$output .= "<a href=http://$http_host$php_self?q=db/unload/$url_dbcode/$url_table>$unload_img unload (get) $url_dbcode $url_table</a>\n";
	$output .= "&nbsp &nbsp &nbsp\n";
///	$output .= "<a href=http://$http_host$php_self?q=db/load/$url_dbcode/$url_table>load $url_dbcode $url_table</a>\n";
	$output .= "<a href=http://$http_host$php_self?q=db/load/$url_dbcode/$url_table> (put) $url_dbcode $url_table $import_img</a>\n";
	$output .= "<hr>\n";

///	$output .= "<hr>\n";
///	$output .= pdo_grid_array($options);
///	$output .= "<hr>\n";

//	print( $output );
	$GLOBALS['js_output'] = $js_output;
	return( $output );
	}


function html_footer() { 
	$output = "</body>\n";
	$output .= "</html>\n";
	return( $output );
	}

function bugfile($options) {
	$ofile="fp_bugs.txt";
	$fp = fopen( $ofile, "w" );
	$tmp  = "";
	$tmp .= "dbfile=$dbfile\n";
	$tmp .= "url_table=$url_table\n";
	$tmp .= "page=$page\n";
	$tmp .= "total_pages=$total_pages\n";
	$tmp .= "count=$count\n";
	$tmp .= "limit-$limit\n";
	$tmp .= "sidx=$sidx\n";
	fwrite( $fp, $tmp );
	$j=0;
	fwrite( $fp, "post: =======================================\n" );
	foreach( $_POST as $request ) {fwrite( $fp, "request-$j $request\n" ); $j++;}
	$j=0;
	fwrite( $fp, "request: =======================================\n" );
	foreach( $_REQUEST as $request ) {fwrite( $fp, "request-$j $request\n" ); $j++;}
	$j=0;
	fwrite( $fp, "get: =======================================\n" );
	foreach( $_GET as $get ) {fwrite( $fp, "get-$j $get\n" ); $j++;}
	fwrite( $fp, "session: =======================================\n" );
	foreach( $_SESSION as $session ) {fwrite( $fp, "session-$j $session\n" ); $j++;}
	fwrite( $fp, $xml );
	fclose( $fp );
	system( "wi $ofile" );
	}

function pdo_gridxml($options) {
	$http_host=$_SERVER['HTTP_HOST'];
	$php_self=$_SERVER['PHP_SELF'];
	$query_string=$_SERVER['QUERY_STRING'];
	$dbfiles = $GLOBALS['dbs'];
	$url_dbcode=$options[2];
	$url_table=$options[3];
	$url_value=$options[4];
	$url_value1=$options[5];
	$url_value2=$options[6];

	$url_zmcode=$options[4];
	$url_zmtype=$options[5];
	$url_zmrowid=$options[6];

	$output="";

	if( $url_dbcode == "" ) {
//		print( "<hr><h2>pdo_gridxml url_dbcode[$url_dbcode] url_table=[$url_table]</h2><hr>\n" );
		$output .= "<hr><h2>pdo_gridxml url_dbcode[$url_dbcode] url_table=[$url_table]</h2><hr>\n";
		$output .= "<a href=$php_self?q=db/gridxml/fp>gridxml</a><br>\n";	
		$output .= "<br>\n";
//		print( $output );
//		print_r( $dbfiles );

		foreach( $dbfiles as $dbcode => $dbinfo ) {
			$dbfile=$dbfiles[$dbcode]['dbfile'];
			$tblcnt=count( $dbfiles[$dbcode]['tables']);
			$path_parts = pathinfo($dbfile);
			$dbfile_filename=$path_parts['filename'];
//			print( "<a href=$php_self?q=db/gridxml/$dbfile_filename>$dbfile_filename $tblcnt</a><br />\n" );
			$output .= "<a href=$php_self?q=db/gridxml/$dbfile_filename>$dbfile_filename $tblcnt</a><br />\n";
			}
//		return;
		}


// select database/tables
	if(( $url_dbcode != "" )  && ( $url_table == "" )) {
//		print( "<hr><h2>pdo_unload url_dbcode[$url_dbcode] url_table=[$url_table]</h2><hr>\n" );
		$output .= "<hr><h2>pdo_unload url_dbcode[$url_dbcode] url_table=[$url_table]</h2><hr>\n";
		foreach( $dbfiles[$url_dbcode]['tables'] as $table => $tableinfo ) {
//			print( "<a href=$php_self?q=db/gridxml/$url_dbcode/$tableinfo>$tableinfo </a><br />\n" );
			$output .= "<a href=$php_self?q=db/gridxml/$url_dbcode/$tableinfo>$tableinfo </a><br />\n";
			}
//		return;
		}

	$dbfile=$dbfiles[$url_dbcode]['dbfile'];
	if( ! file_exists( $dbfile )) {
//		print( "pdo_unload ERR:  NOTFOUND url_dbcode=[$url_dbcode] dbfile=[$dbfile]<hr>\n" );
		$output .= "pdo_unload ERR:  NOTFOUND url_dbcode=[$url_dbcode] dbfile=[$dbfile]<hr>\n";
//		return;
		}

	$q=$_REQUEST['q'];
	$dttm=date("Ymd_His");
	$tmp  = "// $q,$dttm,BUGS_2962 BEG_pqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpq<br>\n";

///	$jqgrid_list_id = "list_$url_dbcode"."_$url_table"."_$url_zmcode"."_$url_zmtype"."_$url_zmrowid";
///	$jqgrid_pager_id = "pager_$url_dbcode"."_$url_table"."_$url_zmcode"."_$url_zmtype"."_$url_zmrowid";
///	$jqgrid_url = "url:'http://$http_host$php_self";
///	$jqgrid_url .= "?q=db/gridxml/".$url_dbcode."/".$url_table."/".$url_zmcode."/".$url_zmtype."/".$url_zmrowid."',";
///	$jqgrid_editurl = "editurl:'http://$http_host$php_self";
///	$jqgrid_editurl .= "?q=db/gridxml/".$url_dbcode."/".$url_table."/".$url_zmcode."/".$url_zmtype."/".$url_zmrowid."',";

	if( $url_table == "zoomxml" ) {
		switch( true ) {
			case( $url_zmcode == "" & $url_zmtype == "" & $url_zmrowid == "" ):	
				$where_clause = "";
				break;
			case( $url_zmcode == "" & $url_zmtype == "" & $url_zmrowid != "" ):	
				$where_clause = "where rowid = '$url_zmrowid'";
				break;
			case( $url_zmcode == "" & $url_zmtype != "" & $url_zmrowid == "" ):	
				$where_clause = "where type = '$url_zmtype'";
				break;
			case( $url_zmcode == "" & $url_zmtype != "" & $url_zmrowid != "" ):	
				$where_clause = "where type = '$url_zmtype' and rowid='$zmrowid'";
				break;
				break;
			case( $url_zmcode == "all" & $url_zmtype == "all" & $url_zmrowid == "" ):	
				$where_clause = "";
				break;
			case( $url_zmcode == "" & $url_zmtype == "all" & $url_zmrowid == "" ):	
				$where_clause = "";
				break;
			case( $url_zmcode == "" & $url_zmtype == "all" & $url_zmrowid != "" ):	
				$where_clause = "where zoomxml_id = '$url_zmrowid'";
				break;




			case( $url_zmcode != "" & $url_zmtype == "" & $url_zmrowid == "" ):	
//				$where_clause = "where code = '$url_zmcode'";
				break;
			case( $url_zmcode != "" & $url_zmtype == "" & $url_zmrowid != "" ):	
				$where_clause = "where code = '$url_zmcode' and rowid = '$rowid'";
				break;
			case( $url_zmcode != "" & $url_zmtype != "" & $url_zmrowid == "" ):	
				$where_clause = "where code = '$url_zmcode' and type = '$url_zmtype'";
				break;
			case( $url_zmcode != "" & $url_zmtype != "" & $url_zmrowid != "" ):	
				$where_clause = "where code = '$url_zmcode' & type = '$url_zmtype' and rowid = '$url_rowid'";
				break;
			}
		$xml .= "<!-- BUGS_3120 gridxml:  url_zmtype=[$url_zmtype] url_zmcode=[$url_zmcode]<br> [$where_clause] -->\n";
//		return;	
		}

// build column array from _REQUEST and skip non-column keys
	$j=0;
	$colnames = "( ";
	$colvalues = "( ";
	foreach( $_REQUEST as $key => $val ) {
		$skip=0;
		if( $key == "q" ) { $skip=1; }
		if( $key == "oper" ) { $skip=1; }
		if( $key == "_search" ) { $skip=1; }
		if( $key == "nd" ) { $skip=1; }
		if( $key == "rows" ) { $skip=1; }
		if( $key == "page" ) { $skip=1; }
		if( $key == "sidx" ) { $skip=1; }
		if( $key == "sord" ) { $skip=1; }
		if( $key == "id" ) { $rowid=$val; $skip=1; }
		if( $key == "PHPSESSID" ) { $skip=1;; }
		if( $skip == 0 ) {
			$colnames .= "'$key',";
			$colvalues .= "'$val',";
			$setvalues .= "$key = '$val',";
			$colname = $key;
			$colvalue = $val;
			}
		}
	$colnames .= ")";
	$colnames = str_replace( ",)", " )", $colnames );
	$colvalues .= ")";
	$colvalues = str_replace( ",)", " )", $colvalues );
	$setvalues .= ")";
	$setvalues = str_replace( ",)", "", $setvalues );

	$tmp  .= "// $q,$dttm,colnames=[$colnames]<br>\n";
	$tmp  .= "// $q,$dttm,colvalues=[$colvalues]<br>\n";
	$tmp  .= "// $q,$dttm,setvalues=[$setvalues]<br>\n";
	$tmp  .= "// $q,$dttm,colname=[$colname]<br>\n";
	$tmp  .= "// $q,$dttm,colvalue=[$colvalue]<br>\n";

	$qops = array(
		  'eq'=>" = ",
		  'ne'=>" <> ",
		  'lt'=>" < ",
		  'le'=>" <= ",
		  'gt'=>" > ",
		  'ge'=>" >= ",
		  'bw'=>" LIKE ",
		  'bn'=>" NOT LIKE ",
		  'in'=>" IN ",
		  'ni'=>" NOT IN ",
		  'ew'=>" LIKE ",
		  'en'=>" NOT LIKE ",
		  'cn'=>" LIKE " ,
		  'nc'=>" NOT LIKE " 
		);

//	$searchoper="eq"; $searchop=" = ";
//	$searchoper=$options[4];
//	print( "BUGS_200 searchoper=[$searchoper] searchop=[$searchop]<br>\n" ) ;
	if( $_REQUEST['searchField'] ) { $searchfield = $_REQUEST['searchField']; }
	if( $_REQUEST['searchString'] ) { $searchstring = $_REQUEST['searchString']; }
	if( $_REQUEST['searchOper'] ) { $searchoper = $_REQUEST['searchOper']; }
//	if( $searchoper == "eq" ) { $searchop = "="; }
//	if( $searchoper == "lt" ) { $searchop = ">="; }
//	if( $searchoper == "gt" ) { $searchop = "<="; }
	foreach( $qops as $qop_col => $qop_val ) {
//		print( "BUGS_201 qop_col=[$qop_col] qop_val=[$qop_val] qops=".$qops['$qop_col']."<br>\n" ) ;
		if( $searchoper == $qop_col ) { $searchop = $qop_val; break; }
		}

	$sql_search= "select rowid,* from  $url_table where $searchfield $searchop '".$searchstring."';";
//	$sql_add= "insert or replace into $url_table $colnames values $colvalues where rowid = '".$_REQUEST['id']."';";
	$sql_add= "insert or replace into $url_table $colnames values $colvalues;";
	$sql_edit = "update $url_table set $setvalues where rowid = '".$_REQUEST['id']."';";
	$sql_delete= "delete from  $url_table where rowid = '".$_REQUEST['id']."';";
//	$sql = "select * from $url_table ORDER BY $sidx $sord LIMIT $start, $limit";
//	$sql = "select rowid,* from $url_table ORDER BY $sidx $sord LIMIT $start, $limit";
	$sql = "select rowid,* from $url_table $where_clause ORDER BY $sidx $sord LIMIT $start, $limit";

	if( $_REQUEST[_search] == 'true' ) {
//		request_7 $_REQUEST[searchField]=[code] [( ][( ]
//		request_8 $_REQUEST[searchString]=[abc] [( 'searchField',][( 'code',]
//		request_9 $_REQUEST[searchOper]=[gt] [( 'searchField','searchString',][( 'code','abc',]
//		$pdo = newpdo( $dbfile );
//		$pdo->exec( $sql_search );
//		$pdo = null;
		$tmp  .= "// $q,$dttm,BUGS_3046 _REQUEST[_search] sql_search=[$sql_search] dbfile=[$dbfile]<br>\n";
		}

	if( $_REQUEST[oper] == 'del' ) {
		$tmp  .= "// $q,$dttm,BUGS_3050 _REQUEST[_oper]==del sql_delete=[$sql_delete] dbfile=[$dbfile]<br>\n";
		$pdo = newpdo( $dbfile );
		$pdo->exec( $sql_delete );
		$pdo = null;
		}
	if( $_REQUEST[oper] == 'add' ) {
		$tmp  .= "// $q,$dttm,BUGS_3056 _REQUEST[_oper]==add sql_add=[$sql_add] dbfile=[$dbfile]<br>\n";
		$pdo = newpdo( $dbfile );
		$pdo->exec( $sql_add );
		$pdo = null;
		}

	if( $_REQUEST[oper] == 'edit' ) {
		$tmp  .= "// $q,$dttm,BUGS_3062 _REQUEST[_oper]==edit sql_edit=[$sql_edit] dbfile=[$dbfile]<br>\n";
		$pdo = newpdo( $dbfile );
		$pdo->exec( $sql_edit );
		$pdo = null;

//		for( $row=1; $row<10; $row++ ) {
//			$sql  = "insert or replace into test ( 'test_id', 'c1', 'c2', 'c3' ) ";
//			$sql .= "values ( '$row', 'v1$row', 'v2$row', 'v3$row' );";
//			$pdo->exec( $sql );
//			}
//		request_0 $_REQUEST[q]=[db/gridxml/fp/zoom/edit]
//		request_1 $_REQUEST[zoom_id]=[5]
//		request_2 $_REQUEST[code]=[fp05]
//		...
//		request_25 $_REQUEST[maxscale]=[2]
//		request_26 $_REQUEST[id]=[5]
//		request_27 $_REQUEST[oper]=[edit]
//		request_28 $_REQUEST[PHPSESSID]=[62autt8r17aiicstp30fa176c0]
//		return;
		}


	if( $dbmode == "count" ) {
		$count=0;
		$pdo = newpdo($dbfile);
		$sqlcnt = "select count(*) pagetotal from $table";
		$sqlout = $pdo->query($sqlcnt);
		$record = $sqlout->fetchall();
		if(sizeof($record) != 0) { 
//			print( "sizeof record != 0 $record<br>\n" );
			$count=$record[0][0];
			}
		return( $count );
		}

	$page=1;
	$records=1;
	$page = $_GET['page'];	// requested page
	$limit = $_GET['rows'];	//rows in grid
	$sidx = $_GET['sidx'];	// index row ie user click sort
	$sord = $_GET['sord'];	// sort direction
	if(!$page) $page =1;
	if(!$sidx) $sidx =1;
	if(!$sord) $sord ="asc";
	if(!$limit) $limit=20;


	$pdo = newpdo($dbfile);

//	$sql = "select count(*) pagetotal from $url_table";
	$sql = "select count(*) pagetotal from $url_table $where_clause";
	$sqlout = $pdo->query($sql);
	$record = $sqlout->fetchall();

	if(sizeof($record) != 0) { 
//		print( "sizeof record != 0 $record<br>\n" );
		$count=$record[0][0];
		}
	else {
		$count=0;
		}		
	if( $count > 0 ) {
		$total_pages = ceil($count/$limit);
		}
	else {
		$total_pages = 0;
		}
	if( $page > $total_pages) $page=$total_pages;
	$start = $limit*$page - $limit;		// do not put $limit*($page - 1)
	$pdo = null;
	$tmp  .= "// $q,$dttm,COUNT sql=[$sql]<br>\n";

//	$sql_select_page = "select rowid,* from $url_table ORDER BY $sidx $sord LIMIT $start, $limit";
	$sql_select_page = "select rowid,* from $url_table $where_clause ORDER BY $sidx $sord LIMIT $start, $limit";

	$xml .= "";
	$xml .= "<!-- sql=$sql -->\n";
	$xml .= "<!-- url_zmcode=$url_zmcode -->\n";
	$xml .= "<!-- url_zmtype=$url_zmtype -->\n";
	$xml .= "<!-- sql_select_page=$sql_select_page -->\n";
	$xml .= "<!-- dbfile=$dbfile -->\n";
	$xml .="<rows>\n";
	$xml .= "<page>$page</page>\n";
	$xml .= "<total>$total_pages</total>\n";
	$xml .= "<records>$count</records>\n";
	$xml .= "<limit>$limit</limit>\n";
	$xml .= "<sidx>$sidx</sidx>\n";
	$xml .= "<sord>$sord</sord>\n";

//	$xml .= "<options1>".$options[1]."</options1>\n";
//	$xml .= "<options2>".$options[2]."</options2>\n";
//	$xml .= "<options3>".$options[3]."</options3>\n";
//	$xml .= "<options4>".$options[4]."</options4>\n";
//	$xml .= "<options5>".$options[5]."</options5>\n";

// be sure to put text data in CDATA

	if( $_REQUEST[_search] == 'true' ) {
		$sql = $sql_search;
		}
	else {
		$sql = $sql_select_page;
		}
	$tmp  .= "// $q,$dttm,BUGS_3164 SQL sql=[$sql] <br>\n";
	$pdo = newpdo($dbfile);
	$result = $pdo->query($sql);

	$collim = $result->columnCount();
	$xml_rowid = 1;
	$output = "";
	$rowcnt=0;
	if( $url_table == "zoomxml" ) {
		$zoomxml_rowid = 0;
		$zoomxml  = "<DATA>\n";
		$zoomxml = "<DATA>\n";
		$zoomxml .= "	<HOTSPOTSETUP\n";
		$zoomxml .= "		AUTOLOOP=\"0\"\n";
		$zoomxml .= "		CHOICELIST=\"2\"\n";
		$zoomxml .= "		LISTSOURCE=\"CAPTION\"\n";
		$zoomxml .= "		INITIALVISIBILITY=\"1\"\n";
		$zoomxml .= "		MINSCALE=\"0.15\"\n";
		$zoomxml .= "		MAXSCALE=\"2\"\n";
		$zoomxml .= "	/>\n";
		}

	$http_host=$_SERVER['HTTP_HOST'];
	while($row = $result->fetch(PDO::FETCH_ASSOC)) {
		$rowcnt++;
		
//		if($countrows == 1) {
//			$output .= join(",", array_keys($row)) . "\n";
//			}
//		else {
//			$output .= join(",", $row) ."\n";
//			}
//


		if( $url_table == "zoomxml" & $rowcnt > 0  ) {
//			$id=$row['rowid'];
			$zoomxml_id=$row['zoomxml_id'];
			$zmcode=$row['code'];
			$zmtype=$row['type'];
			$x=$row['x'];
			$y=$row['y'];
			$mediatype=$row['mediatype'];
			$media=$row['media'];
			$url=$row['url'];
			$urltarget=$row['urltarget'];
			$zoom=$row['zoom'];
			$zoom="40";
			$caption=$row['caption'];
			$interval=$row['interval'];
			$transition=$row['transition'];
			$duration=$row['duration'];
			$comment=$row['comment'];
			$zoomxml .= "	<HOTSPOT \n";
			$zoomxml .= "		ID=\"$zoomxml_id\"\n";
			$zoomxml .= "		MEDIATYPE=\"$mediatype\"\n";
			$zoomxml .= "		MEDIA=\"$media\"\n";
//			$zoomxml .= "		URL=\"$url\"\n";
			$zoomxml .= "		URL=\"$php_self?q=zview/$zmcode/$zmtype/$zoomxml_id\"\n";
			$zoomxml .= "		URLTARGET=\"$urltarget\"\n";
			$zoomxml .= "		X=\"$x\"\n";
			$zoomxml .= "		Y=\"$y\"\n";
			$zoomxml .= "		ZOOM=\"$zoom\"\n";
//			$zoomxml .= "		CAPTION=\"3: ".$zmcode."_".$zmtype."_hotspots.xml - $comment - $dttm\"\n";
			$zoomxml .= "		CAPTION=\"$zoomxml_id $caption\"\n";
			$zoomxml .= "		INTERVAL=\"$interval\"\n";
			$zoomxml .= "		TRANSITION=\"$transition\" \n";
			$zoomxml .= "		DURATION=\"$duration\" >\n";
			$zoomxml .= "	</HOTSPOT>\n";
			$id++;
			}


		$colcnt=0;
		foreach( $row as $col => $val ) {
			if( $colcnt == 0 ) {
				$db_rowid=$val;
				$xml .= "<row id='". $db_rowid . "'>\n";
				$tmp .= "// $q,$dttm,ROWID: xml_rowid=[$xml_rowid] db_rowid=[$db_rowid]<br>\n";
				}
//			$tmp .= "// $q,$dttm,xmlloop:  rowcnt=[$rowcnt] colcnt=[$colcnt] col=[$col] val=[$val]<br>\n";
			if( $colcnt < 0 ) {
				$tmp .= "// $q,$dttm,foreach_ROWID: xml_rowid=[$xml_rowid] db_rowid=[$db_rowid] row['rowid']=[".$row['rowid']."]<br>\n";
//				$cdata = "<a href=\"http://$http_host$php_self?q=zoom/$val\" target=_blank>$val</a>";
				$cdata = "<a href=\"http://$http_host$php_self?q=zoom/$val\" target=_blank>$val<img src=\"images/btn/btn_hw.gif\" border=0></a>";
				$xml .= "<cell><![CDATA[". $cdata ."]]></cell>\n";
				}
			else {
//				$cdata = $val;
//				$xml .= "<cell><![CDATA[". $cdata ."]]></cell>\n";
//				$tmp .= "// $q,$dttm,xmlloop:  colcnt=[$colcnt] col=[$col] val=[$val]<br>\n";

// field exception handling
				switch( true ) {
					case ($url_table == "zoom"  and $col ==="code" ):
						$fp=$row['code'];
						if($_SESSION['hs_type'] ) { $hscode=$_SESSION['hs_type']; } else { $hscode=""; }
						$url="$php_self?q=zoom/$fp/$hscode";
//						$cdata = "<a href=\"$url\" target=_blank>$fp $db_rowid</a>";
						$cdata = "<a href=\"$url\" >$fp $db_rowid</a>";
						$xml .= "<cell><![CDATA[". $cdata ."]]></cell>\n";
						break;


///					case ($url_table == "zoomxml" ):
					case ($url_table == "zoomxml" & $col ==="url" ):
						if( $col ==="url" ) {
							$fp=$row['code'];
							if(! $_SESSION['hs_code'] ) { $hscode=""; } else { $hscode=$_SESSION['hs_code']; }
							$url="$php_self?q=zoom/$fp/$hscode/$db_rowid";
							$cdata = "<a href=\"$url\" target=_blank>$fp $db_rowid</a>";
							$xml .= "<cell><![CDATA[". $cdata ."]]></cell>\n";
							break;
							}

					case ($url_table == "kb"  and $col ==="kbid" ):
						$kbid=$row['kbid'];
						$kb_title=$row['kb_title'];
						$height=$row['height'];
						$width=$row['width'];
//						$basename_flds = split( "\.", $kbid );
//						$basename = $basename_flds[0];
					
						$kb_title=$kbid;
//						$basename = $row['rowid'];
						$url="$php_self?q=kb/view/$kbid/$width/$height";
//						$cdata = "<a href=\"$url\" target=_blank>$kbid $db_rowid $kb_title</a>";
						$cdata = "<a href=\"$url\" >$db_rowid $kb_title</a>";
						$xml .= "<cell><![CDATA[". $cdata ."]]></cell>\n";
						break;

					case ($url_table == "certs"  and $col ==="cert_code" ):
						$cert_code=$row['cert_code'];
						$height=$row['height'];
						$width=$row['width'];
//						$basename_flds = split( "\.", $cert_id );
//						$basename = $basename_flds[0];
					
//						$basename = $row['rowid'];
						$cert_title=$cert_code;
						$url="$php_self?q=certs/view/$cert_code/$width/$height/";
//						$cdata = "<a href=\"$url\" target=_blank>$db_rowid $cert_id</a>";
						$cdata = "<a href=\"$url\" >$db_rowid $cert_code</a>";
						$xml .= "<cell><![CDATA[". $cdata ."]]></cell>\n";
						break;

					case ($url_table == "pano"  and $col ==="filename" ):
						$filename=$row['filename'];
						$height=$row['height'];
						$width=$row['width'];
						$basename_flds = split( "\.", $filename );
						$basename = $basename_flds[0];
					
//						$basename = $row['rowid'];
						$url="$php_self?q=ptviewer/$filename/$width/$height";
//						$cdata = "<a href=\"$url\" target=_blank>$filename $db_rowid</a>";
						$cdata = "<a href=\"$url\" >$basename $db_rowid</a>";
						$xml .= "<cell><![CDATA[". $cdata ."]]></cell>\n";
						break;

					case ($url_table == "obj"  and $col ==="filename" ):
						$filename=$row['filename'];
						$basename_flds = split( "\.", $filename );
						$basename = $basename_flds[0];
						$width=$row['width'];
						$height=$row['height'];
						$nhor=$row['nhor'];
						$nvert=$row['nvert'];

						$url="$php_self?q=ptobject/$filename/$width/$height/$nhor/$nvert";
//						$cdata = "<a href=\"$url\" target=_blank>$fp $db_rowid</a>";
						$cdata = "<a href=\"$url\" >$basename </a>";
						$xml .= "<cell><![CDATA[". $cdata ."]]></cell>\n";
						break;

					default;
//						$cdata = "<a href=\"http://$http_host$php_self?q=zoom&id=$col $val\" target=_blank>$val</a>";
//						$xml .= "<cell><![CDATA[". $cdata ."]]></cell>\n";
						$xml .= "<cell>". htmlentities($val). "</cell>\n";
						break;
					}	
				}
			$colcnt++;
			}
		$xml .= "</row>\n";
		$xml_rowid++;
		}
	$pdo=null;
	$xml .= "</rows>\n";


	if( $url_table == "zoomxml" ) {
		$zoomxml .= "</DATA>\n";
		if( $xml_rowid > 1 ) { $_SESSION['zoomxml'] = $zoomxml; }
		$fzxfil="fp_bugs_zoomxml.txt";
		$fzx = fopen( $fzxfil, "w" );
//		$fzx = fopen( $fzxfil, "a" );
		fwrite( $fzx, $zoomxml );
		fclose( $fzx );
		}

	
	$dttm=date("Ymd_His");
//	$csvfile = "$url_dbcode"."_$url_table"."_$dttm.csv";


//	print( "__FUNCTION__=".__FUNCTION__."<br>\n" );
//	$content_type = "Content-type: application/csv Content-Disposition:  \"inline; filename=$csvfile\"";
//	print( "$content_type\n" );
//	header( "$content_type" );
//	header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
//	header("Content-Length: " . strlen($out));
///	header("Content-type: text/x-csv");
//	header("Content-type: text/csv");
//	header("Content-type: application/vnd.ms-excel");
//	header("Content-type: application/csv");
//	header("Content-Disposition: attachment; filename=$csvfile");

	if ( stristr($_SERVER["HTTP_ACCEPT"],"application/xhtml+xml") ) { 
		header("Content-type: application/xhtml+xml;charset=utf-8"); 
		} 
	else { 
		header("Content-type: text/xml;charset=utf-8"); 
		} 

///	$js_output .= "});\n";

	$q=$_REQUEST['q'];
	$dttm=date("Ymd_His");


	$tmp .= "// $q,$dttm,_REQUEST[q] =============================================<br>\n";
	$tmp .= "// $q,$dttm,ofile=$ofile";
	$tmp .= "// $q,$dttm,dbfile=$dbfile\n";
	$tmp .= "// $q,$dttm,url_table=$url_table\n";
	$tmp .= "// $q,$dttm,page=$page\n";
	$tmp .= "// $q,$dttm,total_pages=$total_pages\n";
	$tmp .= "// $q,$dttm,count=$count\n";
	$tmp .= "// $q,$dttm,limit=$limit\n";
	$tmp .= "// $q,$dttm,sidx=$sidx\n";

	$tmp .= "// $q, $dttm, post: =======================================\n";
//	$j=0;
//	foreach( $_POST as $col=>$val ) { 
//
//		$tmp .= "// $q,$dttm,post_$j col=$col val=$val\n"; $j++;
//		}
	$tmp .= "// $q,$dttm,request: =======================================\n";
	$j=0;
	$colnames = "( ";
	$colvalues = "( ";
	foreach( $_REQUEST as $key => $val ) {
		$skip=0;
//		$tmp .= "// $q,$dttm,request_$j \$_REQUEST[$key]=[$val] [$colnames][$colvalues]\n"; $j++;
		$tmp .= "// $q,$dttm,request_$j \$_REQUEST[$key]=[$val]\n"; $j++;
		if( $key == "q" ) { $skip=1; }
		if( $key == "oper" ) { $skip=1; }
		if( $key == "_search" ) { $skip=1; }
		if( $key == "nd" ) { $skip=1; }
		if( $key == "rows" ) { $skip=1; }
		if( $key == "page" ) { $skip=1; }
		if( $key == "sidx" ) { $skip=1;; }
		if( $key == "sord" ) { $skip=1;; }
		if( $key == "PHPSESSID" ) { $skip=1;; }
		if( $skip == 0 ) {
			$colnames .= "'$key',";
			$colvalues .= "'$val',";
			}
//		$tmp .= "// $q,$dttm,request_$j \$_REQUEST[$key]=[$val] [$colnames][$colvalues]\n"; $j++;
		}

	$colnames .= ")";
	$colnames = str_replace( ",)", " )", $colnames );
	$colvalues .= ")";
	$colvalues = str_replace( ",)", " )", $colvalues );


	$tmp .= "// $q,$dttm,sql= $sql\n";
	$tmp .= "// $q,$dttm,sql_select_page= $sql_select_page\n";
	$tmp .= "// $q,$dttm,sql_edit= $sql_edit\n";
	$tmp .= "// $q,$dttm,sql_add= $sql_add\n";
	$tmp .= "// $q,$dttm,sql_delete= $sql_delete\n";
	$tmp .= "// $q,$dttm,sql_search= $sql_search\n";
	$tmp .= "\n";
	$tmp .= "// $q,$dttm,colnames=[$colnames]\n";
	$tmp .= "// $q,$dttm,colvalues=[$colvalues]\n";
	$tmp .= "// $q,$dttm,setvalues=[$setvalues]\n";
	$tmp .= "\n";
	$tmp .= "// $q,$dttm,colname=[$colname]\n";
	$tmp .= "// $q,$dttm,colvalue=[$colvalue]\n";
	$tmp .= "\n";
	$tmp .= "// $q,$dttm,searchfield=[$searchfield]\n";
	$tmp .= "// $q,$dttm,searchoper=[$searchoper]\n";
	$tmp .= "// $q,$dttm,searchop=[$searchop]\n";
	$tmp .= "// $q,$dttm,searchstring=[$searchstring]\n";


	$tmp .= "// $q,$dttm, get: =======================================\n";
	$j=0;
	foreach( $_GET as $key => $val ) {
		$tmp .= "// $q,$dttm,get_$j \$_GET[$key]=[$val]\n"; $j++;
		}
	$tmp .= "// $q,$dttm, session: =======================================\n";
	$j=0;
	foreach( $_SESSION as $key => $val ) {
		$tmp .= "// $q,$dttm,session_$j \$_SESSION[$key]=[$val]\n"; $j++;
		}
	$tmp .= "// $q,$dttm,END_bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd<br>\n";


//	$xml .= "\n\n\n//bugs\n\n";
//	$xml .= "\r\n// bugs";
//	$xml .= "\r";

//	$xml2 = str_replace( "\r", "=0D=0A=", $xml );
//	$xml2 = str_replace( "\r", "\r\n", $xml );
//	print( "$xml2" );


	$xmlfile="fp_menus1.xml";
	$xmlfile="fp_menus2.xml";
	$xmlfile="";
	if( file_exists( $xmlfile )) {
		$fpxml = fopen( $xmlfile, "r" );
		$xmltext = "";
		while(( $filetext = fgets($fpxml)) !== false ) {
			$xmltext .=  $filetext;
			}
		fclose( $fpxml );
//		print( $xmltext );
//		return;
		$xml=$xmltext;
		}

	print( "$xml" );


	$ofile="fp_bugs.txt";
	$fpo = fopen( $ofile, "w" );
//	$fpo = fopen( $ofile, "a" );
	fwrite( $fpo, $tmp );
	fclose( $fpo );

	$xfile="fp_bugs_xml.txt";
	$fpx = fopen( $xfile, "w" );
//	$fpx = fopen( $xfile, "a" );
	fwrite( $fpx, $xml );
	fclose( $fpx );

//	system( "wi $ofile" );
//	system( "wi $xfile" );

	return;
	}



function pdo_unload($options) {
	$php_self=$_SERVER['PHP_SELF'];
	$dbfiles = $GLOBALS['dbs'];
	if($_SESSION['role'] ) { $role=$_SESSION['role']; }
	$role=$_SESSION['role'];
	$GLOBALS['dbfiles'];
	$GLOBALS['dbs'] = $dbfiles[$role];
	$url_dbcode=$options[2];
	$url_table=$options[3];
	if( $url_dbcode == "" ) {
		print( "<hr><h2>pdo_unload url_dbcode[$url_dbcode] url_table=[$url_table]</h2><hr>\n" );
		$output = "";
		$output .= "<a href=$php_self?q=db/unload/fp>unload_fp</a><br>\n";	
		$output .= "<a href=$php_self?q=db/unload/us>unload_us</a><br>\n";	
		$output .= "<a href=$php_self?q=db/unload/hw>unload_hw</a><br>\n";	
		$output .= "<a href=$php_self?q=db/unload/grid>unload_grid</a><br>\n";	
		$output .= "<br>\n";
		$output .= "<a href=$php_self?q=db/unload/leds>unload_leds</a><br>\n";	
		$output .= "<a href=$php_self?q=db/unload/users>unload_users</a><br>\n";	
		$output .= "<a href=$php_self?q=db/unload/roles>unload_roles</a><br>\n";	
		print( $output );
		print_r( $dbfiles );
		foreach( $dbfiles as $dbcode => $dbinfo ) {
			$dbfile=$dbfiles[$dbcode]['dbfile'];
			$tblcnt=count( $dbfiles[$dbcode]['tables']);
			$path_parts = pathinfo($dbfile);
			$dbfile_filename=$path_parts['filename'];
			print( "<a href=$php_self?q=db/unload/$dbfile_filename>$dbfile_filename $tblcnt</a><br />\n" );
			}

	
		return;
		}


// select database/tables
	if(( $url_dbcode != "" )  && ( $url_table == "" )) {
		print( "<hr><h2>pdo_unload url_dbcode[$url_dbcode] url_table=[$url_table]</h2><hr>\n" );
		foreach( $dbfiles[$url_dbcode]['tables'] as $table => $tableinfo ) {
			print( "<a href=$php_self?q=db/unload/$url_dbcode/$tableinfo>$tableinfo </a><br />\n" );
			}
		return;
		}

	$dbfile=$dbfiles[$url_dbcode][dbfile];
	if( ! file_exists( $dbfile )) {
		print( "pdo_unload ERR:  NOTFOUND url_dbcode=[$url_dbcode] dbfile=[$dbfile]<hr>\n" );
		return;
		}
	$pdo = newpdo($dbfile);
	$sql = "select * from $url_table";
	$result = $pdo->query($sql);
	$collim = $result->columnCount();
	$countrows = 1;
	$output = "";
	while($row = $result->fetch(PDO::FETCH_ASSOC)) {
		if($countrows == 1) {
			$csvhdr=join(",",array_keys($row)) . "\n";
//			$output .= join(",", array_keys($row)) . "\n";
			$output .= join(",", $row) ."\n";
			}
		else {
			$output .= join(",", $row) ."\n";
			}
		$countrows++;
		}
	$pdo=null;
//	print( "$output" );
//	print( "BUGS tblname=$tblname cols=$cols<br>\n" );

	
	$dttm=date("Ymd_His");
	$csvfile = "$url_dbcode"."_$url_table"."_$dttm.csv";


//	print( "__FUNCTION__=".__FUNCTION__."<br>\n" );
//	$content_type = "Content-type: application/csv Content-Disposition:  \"inline; filename=$csvfile\"";
//	print( "$content_type\n" );
//	header( "$content_type" );


	header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
//	header("Content-Length: " . strlen($out));
	header("Content-type: text/x-csv");
//	header("Content-type: text/csv");
//	header("Content-type: application/vnd.ms-excel");
//	header("Content-type: application/csv");
	header("Content-Disposition: attachment; filename=$csvfile");

	print( "$output" );
	return;
	}

function pdo_list($options) {
	$output = "<hr>pdo_list o1=[$option[1]] o2=[$option[2]] o3=[$option[3]]<br>\n";
	print( "$output" );
	}
function pdo_update($options) {
	$output = "<hr>pdo_list o1=[$option[1]] o2=[$option[2]] o3=[$option[3]]<br>\n";
	print( "$output" );
	}
function pdo_load($options) {
	$php_self=$_SERVER['PHP_SELF'];
	$dbfiles = $GLOBALS['dbs'];
	$url_dbcode=$options[2];
	$url_table=$options[3];
	$dbcode=$url_dbcode;
	$tblname=$url_table;


//	print_r( $options );
//	return;
	if( $url_dbcode == "" ) {
		print( "<hr><h2>pdo_load url_dbcode[$url_dbcode] url_table=[$url_table]</h2><hr>\n" );
		$output = "";
		$output .= "<a href=$php_self?q=db/load/fp>load_fp</a><br>\n";	
		$output .= "<a href=$php_self?q=db/load/us>load_us</a><br>\n";	
		$output .= "<a href=$php_self?q=db/load/hw>load_hw</a><br>\n";	
		$output .= "<a href=$php_self?q=db/load/grid>load_grid</a><br>\n";	
		$output .= "<br>\n";
		$output .= "<a href=$php_self?q=db/load/leds>load_leds</a><br>\n";	
		$output .= "<a href=$php_self?q=db/load/users>load_users</a><br>\n";	
		$output .= "<a href=$php_self?q=db/load/roles>load_roles</a><br>\n";	
//		print( $output );
//		print_r( $dbfiles );

		foreach( $dbfiles as $dbcode => $dbinfo ) {
			$dbfile=$dbfiles[$dbcode]['dbfile'];
			$tblcnt=count( $dbfiles[$dbcode]['tables']);
			$path_parts = pathinfo($dbfile);
			$dbfile_filename=$path_parts['filename'];
			print( "<a href=$php_self?q=db/load/$dbfile_filename>$dbfile_filename $tblcnt</a><br />\n" );
			}
		return;
		}


// select database/tables
	if(( $url_dbcode != "" )  && ( $url_table == "" )) {
		print( "<hr><h2>pdo_load url_dbcode[$url_dbcode] url_table=[$url_table]</h2><hr>\n" );
		foreach( $dbfiles[$url_dbcode]['tables'] as $table => $tableinfo ) {
			print( "<a href=$php_self?q=db/load/$url_dbcode/$tableinfo>$tableinfo </a><br />\n" );
			}
		return;
		}

	$url_filename = $_FILES['loaddata']['name'];
	$url_filetype = $_FILES['loaddata']['type'];
	$url_filetemp = $_FILES['loaddata']['tmp_name'];
	$url_fileerror = $_FILES['loaddata']['error'];
	$url_filesize = $_FILES['loaddata']['size'];


	if(( $url_dbcode != "" )  && ( $url_table != "" ) && ( $url_filetemp == "" )) {
		$output = "";
		$output .= "<html>";
		$output .= "<head><title>pdo_load</title></head>\n";
		$output .= "<body bgcolor=\"lightblue\">\n";
		$output .= "<b>leds_load_form</b>\n";
		$output .= "<br>";
		$output .= "url_filename=[$url_filename]<br>\n";
		$output .= "url_filetype=[$url_filetype]<br>\n";
		$output .= "url_filetemp=[$url_filetemp]<br>\n";
		$output .= "url_fileerror=[$url_fileerror]<br>\n";
		$output .= "url_filesize=[$url_filesize]<br>\n";

		$output .= "<form method=\"post\" action=\"$php_self?q=db/load/$url_dbcode/$url_table/$url_filename\" enctype=\"multipart/form-data\">\n";
		$output .= "<br/>\n";
		$output .= "loadmode: <br>\n";
		$load_delete_checked = "";
		$load_update_checked = "";
		if( $led_loadmode == "load_delete" ) { $load_delete_checked = "checked"; }
		if( $led_loadmode == "load_update" ) { $load_checked_checked = "checked"; }

		$output .= "<input type=\"radio\" name=\"loadmode\" value=\"load_delete\" $load_delete_checked />load_delete";
		$output .= "<input type=\"radio\" name=\"loadmode\" value=\"load_update\" $load_update_checked />load_update";

		$output .= "<br/>";
		$output .= "load:  <input type=\"file\" name=\"loaddata\" /><br />\n";


		$output .= "<input type=\"hidden\" name=\"query_string\" value=\"$query_string\"/>\n";
		$output .= "<input type=\"hidden\" name=\"loaddata_loos\" value=\"'". $globals['loaddata']."'\"/>\n";


		$output .= "<input type=\"hidden\" name=\"dbcode\" value=\"$url_dbcode\"/>\n";		
		$output .= "<input type=\"hidden\" name=\"loadfile\" value=\"'". $globals['uploaded']."'\"/>\n";
		$output .= "<input type=\"hidden\" name=\"table\" value=\"$url_table\"/>\n";
		$output .= "<hr/>\n";

		$output .= "<p>\n";
		$output .= "<input type=\"submit\" name=\"load\" value=\"load\"/>\n";
		$output .= "<input type=\"reset\"/>\n";
		$output .= "</p>\n";
		$output .= "</form>\n";
		$output .= "</body>\n";
		$output .= "<html>\n";
		print( "$output" );
		return;
		}

	if(( $url_dbcode != "" )  && ( $url_table != "" ) && ( $url_filetemp != "" )) {
		$output = "";
		$output .= "<head><title>fp_load</title></head>\n";
		$output .= "<body bgcolor=\"lightblue\">\n";
		$output .= "<b>fp_load</b>\n";
		$output .= "<br>";
		$output .= "url_filename=[$url_filename]<br>\n";
		$output .= "url_filetype=[$url_filetype]<br>\n";
		$output .= "url_filetemp=[$url_filetemp]<br>\n";
		$output .= "url_fileerror=[$url_fileerror]<br>\n";
		$output .= "url_filesize=[$url_filesize]<br>\n";

		if( file_exists( $url_filetemp )) {
			$output .= "pdo_load MSG:  FOUND url_filetemp=[$url_filetemp]<br>\n";
			$filedata= array();
			$rownum=0;
			$fp = fopen( $url_filetemp, "r" );
			while(( $filetext = fgets($fp)) !== false ) {
				$filedata[] =  $filetext;
///				$output .= "pdo_load CSV: rownum=$rownum filedata=[".$filedata[$rownum]. "]<br>\n";
				$rownum++;
				}
			fclose($fp);


			$dbfile=$dbfiles[$url_dbcode]['dbfile'];
			if( ! file_exists( $dbfile )) {
				print( "pdo_unload ERR:  NOTFOUND dbfile=[$dbfile] <hr>\n" );
				return;
				}
			else {
				print( "pdo_unload MSG:  FOUND dbfile=[$dbfile] <hr>\n" );
				}

			$data = $filedata;
			$dttm=date("Ymd_His");

			$newfile="$url_dbcode"."_".$url_table.".csv";	
			$savefile="$url_dbcode"."_".$url_table."_$dttm.csv";	
			$dbcode=$url_dbcode;
			$tblname=$url_table;
			$output .= "BUGS2311:  pdo_insert( $url_dbcode, $url_table, \$data )<br>\n";
			$output .= "BUGS2312:  pdo_insert( $dbfile, $tblname, \$data )<br>\n";
			$output .= "BUGS2313:  copy( $newfile, $savefile )<br>\n";
			$output .= "BUGS2314:  copy( $url_filetemp, $newfile )<br>\n";

			if( file_exists( $newfile )) { copy( $newfile, $savefile ); }
			if( file_exists( $url_filetemp )) { copy( $url_filetemp, $newfile ); }

///			print( "BUGS2315_PDO_INSERT_BEG:  dbfile=[$dbfile] tblname=[$tblname]<br>\n" );
//			print_r( $data );
			pdo_insert( $dbfile, $tblname, $data );
///			print( "BUGS2315_PDO_INSERT_END:  dbfile=[$dbfile] [tblname=[$tblname]<br>\n" );
///			print_r( $data );
			}
		else {
			$output .= "pdo_load ERR:  NOTFOUND url_filetemp=[$url_filetemp]<br>\n";
			}
		print( $output );
		return;
		}

	$dbfile=$dbfiles[$url_dbcode][dbfile];
	print( "pdo_load MSG:  NOTFOUND url_dbcode=[$url_dbcode] dbfile=[$dbfile]<hr>\n" );
	if( ! file_exists( $dbfile )) {
		print( "pdo_load ERR:  NOTFOUND url_dbcode=[$url_dbcode] dbfile=[$dbfile]<hr>\n" );
		return;
		}

	}


function leds_zviewer( $zoom_file, $zoom_path, $zoom_xml ) {
//	$xmlfile="$file"."_".$hscode."_hotspots.xml";
	print( "leds_zviewer MSG:  zoom_file=$zoom_file zoom_path=$zoom_path zoom_xml=$zoom_xml<br>\n" );
	$output  ="<html>\n";
	$output .= "<head>\n";
	$output .= "<title>leds_zviewer $zoom_path  $zoom_file $zoom_xml</title>";
	$output .= "<body bgcolor=\"lightblue\">\n";

//	print( "<hr>\n" );
	$file=$zoom_file; $path=$zoom_path; $xml=$zoom_xml;
	print( "leds_zviewer MSG1985:  file=$file path=$path xml=$xml<hr>\n" );

	$output .= "<div align=\"center\">\n";

	$object  = "<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"\n";
	$object .= "codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0\"\n";
	$object .= "width=\"900\" height=\"500\"\n";
	$object .= "id=\"ZoomifyHotspotViewer\"\n";
//	$object .= "id=\"ZoomifyTourViewer\"\n";
//	$object .= "id=\"zoomifyviewer\"\n";
	$object .= ">\n";

	$object .= "<param name=\"flashvars\"\n";
	$object .= "value=\"zoomifyImagePath=$path$file&zoomifyHotspotsXMLPath=$xml\">\n";
	$object .= "<param name=\"menu\" value=\"false\">\n";

	$object .= "<param name=\"src\"\n";
	$object .= "value=\"ZoomifyHotspotViewer.swf\">\n";
//	$object .= "value=\"ZoomifyTourViewer.swf\">\n";
//	$object .= "value=\"zoomifyviewer.swf\">\n";
	$object .= "<embed\n";

	$object .= "flashvars=\"zoomifyImagePath=$path$file&zoomifyHotspotsXMLPath=$xml\"\n";
	$object .= "src=\"ZoomifyHotspotViewer.swf\"\n";
//	$object .= "src=\"ZoomifyTourViewer.swf\"\n";
//	$object .= "src=\"zoomifyviewer.swf\"\n";
	$object .= "menu=\"false\"\n";
	$object .= "pluginspage=\"http://www.adobe.com/go/getflashplayer\"\n";
	$object .= "type=\"application/x-shockwave-flash\"\n";
	$object .= "width=\"900\" height=\"500\"\n";
	$object .= "name=\"ZoomifyHotspotViewer\">\n";
//	$object .= "name=\"ZoomifyTourViewer\">\n";
//	$object .= "name=\"zoomifyviewer\">\n";
	$object .= "</embed>\n";
	$object .= "</object>\n";

	$output .= $object;
	$output .= "</div>\n";
	$output .= "</body>\n";
	$output .= "</html>\n";
	print( "$output\n" );
	}

function html_zviewer( $zoom_file, $zoom_path, $zoom_xml ) {
//	$xmlfile="$file"."_".$hscode."_hotspots.xml";
//	$output  = "<hr>html_zviewer MSG_3948:  zoom_file=$zoom_file zoom_path=$zoom_path zoom_xml=$zoom_xml<br>\n";
//	$output .= "html_zviewer [$zoom_path]  [$zoom_file] [$zoom_xml]</title>";
//	$output .= "<body bgcolor=\"#ffffff\">\n";

	$file=$zoom_file; $path=$zoom_path; $xml=$zoom_xml;

	$output .= "<hr>html_zviewer MSG1985:  file=$file path=$path xml=$xml<hr>\n";

	$output .= "<div id=\"zviewer\" align=\"center\">\n";

	$object  = "<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"\n";
	$object .= "codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0\"\n";
	$object .= "width=\"900\" height=\"500\"\n";
	$object .= "id=\"ZoomifyHotspotViewer\"\n";
//	$object .= "id=\"ZoomifyTourViewer\"\n";
//	$object .= "id=\"zoomifyviewer\"\n";
	$object .= ">\n";

	$object .= "<param name=\"flashvars\"\n";
	$object .= "value=\"zoomifyImagePath=$path$file&zoomifyHotspotsXMLPath=$xml\">\n";
	$object .= "<param name=\"menu\" value=\"false\">\n";

	$object .= "<param name=\"src\"\n";
	$object .= "value=\"ZoomifyHotspotViewer.swf\">\n";
//	$object .= "value=\"ZoomifyTourViewer.swf\">\n";
//	$object .= "value=\"zoomifyviewer.swf\">\n";
	$object .= "<embed\n";

	$object .= "flashvars=\"zoomifyImagePath=$path$file&zoomifyHotspotsXMLPath=$xml\"\n";
	$object .= "src=\"ZoomifyHotspotViewer.swf\"\n";
//	$object .= "src=\"ZoomifyTourViewer.swf\"\n";
//	$object .= "src=\"zoomifyviewer.swf\"\n";
	$object .= "menu=\"false\"\n";
	$object .= "pluginspage=\"http://www.adobe.com/go/getflashplayer\"\n";
	$object .= "type=\"application/x-shockwave-flash\"\n";
	$object .= "width=\"900\" height=\"500\"\n";
	$object .= "name=\"ZoomifyHotspotViewer\">\n";
//	$object .= "name=\"ZoomifyTourViewer\">\n";
//	$object .= "name=\"zoomifyviewer\">\n";
	$object .= "</embed>\n";
	$object .= "</object>\n";

	$output .= $object;
	$output .= "</div>\n";
	return( "$output\n" );
	}

// jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
function leds_certs( $options )  {
	$php_self=$_SERVER['PHP_SELF'];
	$output = "";
	$option0=$options[0];
	$option1=$options[1];
	$option2=$options[2];

	$pdo = newpdo($GLOBALS['ka1_certsfile']);
	$tblname="certs";

	$output .= "<h2>leds_certs_7607 o0=[$option0] o1=[$option1] o2=[$option2]</h2>\n";
//	$output .= "<a href=$php_self?q=certs target=_blank>certs</a>";
//	$output .= "<a href=$php_self?q=db/grid/ka1_certs/certs target=_blank> ka1_certs: certs</a>";
	$output .= "<a href=$php_self?q=db/grid/ka1_certs/certs> ka1_certs: certs</a>";
	$output .= "<hr>\n";

	if(( $option2 == "" ) && ( $option3 == "" )) {
		$output = "";
		$output .= "<html><head><title>ka1_certs_7610 index tblname=[$tblname]</title></head>\n";
		$output .= "<body bgcolor=lightblue>\n";
		$output .= "<hr>ka1_certs tblname=[$tblname] index<hr>\n";
		$output .= "<hr>\n";
		$output .= "<div class=certs>\n";
		$output .= "<table>\n";
		$output .= "<tr>\n";
		$output .= "<td>cert_id</td>\n";
		$output .= "<td>os</td>\n";
		$output .= "<td>fn</td>\n";
		$output .= "<td>cn</td>\n";
		$output .= "<td>notbefore</td>\n";
		$output .= "<td>notafter</td>\n";
		$output .= "<td>hosts</td>\n";

//		$sql = "select * from $tblname limit 25";
		$sql = "select * from $tblname";
		
		foreach( $pdo->query($sql) as $row ) {
			$output .= "<tr><td>";
//			$output .= "<a href=$php_self?q=certs/view/$cert_id target=_blank>certs</a><br>\n";
//			$output .= "<a href=$php_self?q=certs/".$row['cert_code'] . " target=_blank>". $row['cert_code']. "</a>";
			$output .= "<a href=$php_self?q=certs/view/".$row['cert_code'] . " target=_blank>". $row['cert_code']. "</a>";
			$output .= "<td>".$row['host']."</td>\n";
			$output .= "<td>".$row['os']."</td>";
			$output .= "<td>".$row['fn']."</td>";
			$output .= "<td>".$row['cn']."</td>";
			$output .= "<td>".$row['notbefore']."</td>";
			$output .= "<td>".$row['notafter']."</td>";
			$output .= "<td>".$row['hosts']."</td>";
			$output .= "</tr>\n";
			}

		$output .= "</table>\n";
		$output .= "<hr>\n";
		$output .= "</div>\n";
		$output .= "</body></html>\n";
		return( $output );
		}

	$cert_code=$option2;
//	$sql = "select * from $tblname where cert_id = '$cert_id'";
	$sql = "select * from $tblname where cert_code='$cert_code'";

//	$output .= "<html><head><title>MSG_7970 ka1_certs detail cert_code=$cert_code o1=$option1 o2=$option2 </title></head>\n";
//	$output .= "<body bgcolor=lightblue>\n";
	$output .= "<h3>ka1_certs detail $cert_code<h3>\n";
	$output .= "<h4>sql=[$sql]</h4><br>\n";
	$output .= "<div id=\"certs\">\n";
	$output .= "<hr>\n";

	$output .= "<table border=1 >\n";
	$output .= "<tr><td>cert_code</td><td>host</td><td>os</td><td>fn</td><td>cn</td><td>notbefore</td><td>notafter</td><td>hosts</td></tr>\n";
//	$output .= "<h4>sql=[$sql]</h4>\n";
//	return( $output );
	
	foreach( $pdo->query($sql) as $row ) {
			$output .= "<tr>";
			$output .= "<td>".$row['cert_code']."</td>";
			$output .= "<td>".$row['host']."</td>";
			$output .= "<td>".$row['os']."</td>";
			$output .= "<td>".$row['fn']."</td>";
			$output .= "<td>".$row['cn']."</td>";
			$output .= "<td>".$row['notbefore']."</td>";
			$output .= "<td>".$row['notafter']."</td>";
			$output .= "<td>".$row['hosts']."</td>";
			$output .= "</tr>\n";

		}
	$output .= "</table>\n";
	$output .= "</div>\n";
	$output .= "<hr>\n";
	$output .= "</body></html>\n";
	return( $output );
	}


function leds_cons( $options )  {
        $php_self=$_SERVER['PHP_SELF'];
        $output = "";
        $option0=$options[0];
        $option1=$options[1];
        $option2=$options[2];

        $pdo = newpdo($GLOBALS['ka1_cons']);
        $tblname="certs";

        $output .= "<h2>leds_cons_7607 o0=[$option0] o1=[$option1] o2=[$option2]</h2>\n";
//      $output .= "<a href=$php_self?q=cons target=_blank>certs</a>";
//      $output .= "<a href=$php_self?q=db/grid/ka1_cons/rsncons target=_blank> ka1_cons: cons</a>";
        $output .= "<a href=$php_self?q=db/grid/ka1_cons/rsncons> ka1_certs: cons</a>";
        $output .= "<hr>\n";

        if(( $option2 == "" ) && ( $option3 == "" )) {
                $output = "";
                $output .= "<html><head><title>ka1_cons_8610 index tblname=[$tblname]</title></head>\n";
                $output .= "<body bgcolor=lightblue>\n";
                $output .= "<hr>ka1_cons tblname=[$tblname] index<hr>\n";
                $output .= "<hr>\n";
                $output .= "<div class=cons>\n";
                $output .= "<table>\n";
                $output .= "<tr>\n";
                $output .= "<td>vendor</td>\n";
                $output .= "<td>sw_name</td>\n";
                $output .= "<td>sw_ver</td>\n";
                $output .= "<td>con_yn</td>\n";
                $output .= "<td>prod_id</td>\n";
                $output .= "<td>endprod</td>\n";
                $output .= "<td>platform</td>\n";
                $output .= "<td>type_cots_gots</td>\n";
                $output .= "<td>poc</td>\n";
                $output .= "<td>domain</td>\n";
                $output .= "<td>envir</td>\n";
                $output .= "<td>connam</td>\n";
                $output .= "<td>localhrc_yn</td>\n";
                $output .= "<td>comments</td>\n";
                $output .= "<td>status</td>\n";

//              $sql = "select * from $tblname limit 25";
                $sql = "select * from $tblname";

                foreach( $pdo->query($sql) as $row ) {
                        $output .= "<tr><td>";
//                      $output .= "<a href=$php_self?q=cons/view/$row_id target=_blank>cons</a><br>\n";
//                      $output .= "<a href=$php_self?q=cons/".$row['row_id'] . " target=_blank>". $row['cert_code']. "</a>";
                        $output .= "<a href=$php_self?q=cons/view/".$row['row_id'] . " target=_blank>". $row['row_id']. "</a>";
                        $output .= "<td>".$row['vendor']."</td>\n";
                        $output .= "<td>".$row['sw_name']."</td>\n";
                        $output .= "<td>".$row['sw_ver']."</td>\n";
                        $output .= "<td>".$row['con_yn']."</td>\n";
                        $output .= "<td>".$row['prod_id']."</td>\n";
                        $output .= "<td>".$row['endprod']."</td>\n";
                        $output .= "<td>".$row['platform']."</td>\n";
                        $output .= "<td>".$row['typ_cots_gots']."</td>\n";
                        $output .= "<td>".$row['poc']."</td>\n";
                        $output .= "<td>".$row['domain']."</td>\n";
                        $output .= "<td>".$row['envir']."</td>\n";
                        $output .= "<td>".$row['connam']."</td>\n";
                        $output .= "<td>".$row['localhrc_yn']."</td>\n";
                        $output .= "<td>".$row['comments']."</td>\n";
                        $output .= "<td>".$row['status']."</td>";
                        $output .= "</tr>\n";
                        }

                $output .= "</table>\n";
                $output .= "<hr>\n";
                $output .= "</div>\n";
                $output .= "</body></html>\n";
                return( $output );
                }

        $row_id=$option2;
//      $sql = "select * from $tblname where row_id = '$row_id'";
        $sql = "select * from $tblname where row_id='$row_id'";

//      $output .= "<html><head><title>MSG_7970 ka1_certs detail cert_code=$cert_code o1=$option1 o2=$option2 </title></head>\n";
//      $output .= "<body bgcolor=lightblue>\n";
        $output .= "<h3>ka1_cons detail $row_id<h3>\n";
        $output .= "<h4>sql=[$sql]</h4><br>\n";
        $output .= "<div id=\"cons\">\n";
        $output .= "<hr>\n";

        $output .= "<table border=1 >\n";
        $output .= "<tr><td>vendor</td>
<td>sw_name</td><td>sw_ver</td><td>con_yn</td><td>prod_id</td><td>endprod</td><td>platform</td><td>type_cots_gots</td><td>poc</td><td>domain</td><td>envir</td><td>connam</td><td>localhrc_yn</td><td>comments</td><td>status</td></tr>\n";
//      $output .= "<h4>sql=[$sql]</h4>\n";
//      return( $output );

        foreach( $pdo->query($sql) as $row ) {
                        $output .= "<tr>";
                        $output .= "<td>".$row['vendor']."</td>";
                        $output .= "<td>".$row['sw_name']."</td>";
                        $output .= "<td>".$row['sw_ver']."</td>";
                        $output .= "<td>".$row['con_yn']."</td>";
                        $output .= "<td>".$row['prod_id']."</td>";
                        $output .= "<td>".$row['endprod']."</td>";
                        $output .= "<td>".$row['platform']."</td>";
                        $output .= "<td>".$row['type_cots_gots']."</td>";
                        $output .= "<td>".$row['poc']."</td>";
                        $output .= "<td>".$row['domain']."</td>";
                        $output .= "<td>".$row['envir']."</td>";
                        $output .= "<td>".$row['connam']."</td>";
                        $output .= "<td>".$row['localhrc_yn']."</td>";
                        $output .= "<td>".$row['comments']."</td>";
                        $output .= "<td>".$row['status']."</td>";
                        $output .= "</tr>\n";

                }
        $output .= "</table>\n";
        $output .= "</div>\n";
        $output .= "<hr>\n";
        $output .= "</body></html>\n";
        return( $output );
        }

function leds_hosts( $options )  {
        $php_self=$_SERVER['PHP_SELF'];
        $output = "";
        $option0=$options[0];
        $option1=$options[1];
        $option2=$options[2];

        $pdo = newpdo($GLOBALS['ka1_cons']);
        $tblname="hosts";

        $output .= "<h2>leds_cons_7607 o0=[$option0] o1=[$option1] o2=[$option2]</h2>\n";
//      $output .= "<a href=$php_self?q=hosts target=_blank>certs</a>";
//      $output .= "<a href=$php_self?q=db/grid/ka1_hosts/rsn_servers> ka1_hosts rsn_servers: </a>";
        $output .= "<a href=$php_self?q=db/grid/ka1_hosts/hrc_servers> ka1_hosts hrc_servers: </a>";
        $output .= "<a href=$php_self?q=db/grid/ka1_hosts/hrc_hosts> ka1_hosts hrc_hosts: </a>";
        $output .= "<hr>\n";

        if(( $option2 == "" ) && ( $option3 == "" )) {
                $output = "";
                $output .= "<html><head><title>ka1_cons_8610 index tblname=[$tblname]</title></head>\n";
                $output .= "<body bgcolor=lightblue>\n";
                $output .= "<hr>ka1_cons tblname=[$tblname] index<hr>\n";
                $output .= "<hr>\n";
                $output .= "<div class=cons>\n";
                $output .= "<table>\n";
                $output .= "<tr>\n";
                $output .= "<td>vendor</td>\n";
                $output .= "<td>sw_name</td>\n";
                $output .= "<td>sw_ver</td>\n";
                $output .= "<td>con_yn</td>\n";
                $output .= "<td>prod_id</td>\n";
                $output .= "<td>endprod</td>\n";
                $output .= "<td>platform</td>\n";
                $output .= "<td>type_cots_gots</td>\n";
                $output .= "<td>poc</td>\n";
                $output .= "<td>domain</td>\n";
                $output .= "<td>envir</td>\n";
                $output .= "<td>connam</td>\n";
                $output .= "<td>localhrc_yn</td>\n";
                $output .= "<td>comments</td>\n";
                $output .= "<td>status</td>\n";

//              $sql = "select * from $tblname limit 25";
                $sql = "select * from $tblname";

                foreach( $pdo->query($sql) as $row ) {
                        $output .= "<tr><td>";
//                      $output .= "<a href=$php_self?q=cons/view/$row_id target=_blank>cons</a><br>\n";
//                      $output .= "<a href=$php_self?q=cons/".$row['row_id'] . " target=_blank>". $row['cert_code']. "</a>";
                        $output .= "<a href=$php_self?q=cons/view/".$row['row_id'] . " target=_blank>". $row['row_id']. "</a>";
                        $output .= "<td>".$row['vendor']."</td>\n";
                        $output .= "<td>".$row['sw_name']."</td>\n";
                        $output .= "<td>".$row['sw_ver']."</td>\n";
                        $output .= "<td>".$row['con_yn']."</td>\n";
                        $output .= "<td>".$row['prod_id']."</td>\n";
                        $output .= "<td>".$row['endprod']."</td>\n";
                        $output .= "<td>".$row['platform']."</td>\n";
                        $output .= "<td>".$row['typ_cots_gots']."</td>\n";
                        $output .= "<td>".$row['poc']."</td>\n";
                        $output .= "<td>".$row['domain']."</td>\n";
                        $output .= "<td>".$row['envir']."</td>\n";
                        $output .= "<td>".$row['connam']."</td>\n";
                        $output .= "<td>".$row['localhrc_yn']."</td>\n";
                        $output .= "<td>".$row['comments']."</td>\n";
                        $output .= "<td>".$row['status']."</td>";
                        $output .= "</tr>\n";
                        }

                $output .= "</table>\n";
                $output .= "<hr>\n";
                $output .= "</div>\n";
                $output .= "</body></html>\n";
                return( $output );
                }

        $row_id=$option2;
//      $sql = "select * from $tblname where row_id = '$row_id'";
        $sql = "select * from $tblname where row_id='$row_id'";

//      $output .= "<html><head><title>MSG_7970 ka1_hosts detail cert_code=$cert_code o1=$option1 o2=$option2 </title></head>\n";
//      $output .= "<body bgcolor=lightblue>\n";
        $output .= "<h3>ka1_hosts detail $row_id<h3>\n";
        $output .= "<h4>sql=[$sql]</h4><br>\n";
        $output .= "<div id=\"hosts\">\n";
        $output .= "<hr>\n";

        $output .= "<table border=1 >\n";
        $output .= "<tr><td>vendor</td>
<td>sw_name</td><td>sw_ver</td><td>con_yn</td><td>prod_id</td><td>endprod</td><td>platform</td><td>type_cots_gots</td><td>poc</td><td>domain</td><td>envir</td><td>connam</td><td>localhrc_yn</td><td>comments</td><td>status</td></tr>\n";
//      $output .= "<h4>sql=[$sql]</h4>\n";
//      return( $output );

        foreach( $pdo->query($sql) as $row ) {
                        $output .= "<tr>";
                        $output .= "<td>".$row['vendor']."</td>";
                        $output .= "<td>".$row['sw_name']."</td>";
                        $output .= "<td>".$row['sw_ver']."</td>";
                        $output .= "<td>".$row['con_yn']."</td>";
                        $output .= "<td>".$row['prod_id']."</td>";
                        $output .= "<td>".$row['endprod']."</td>";
                        $output .= "<td>".$row['platform']."</td>";
                        $output .= "<td>".$row['type_cots_gots']."</td>";
                        $output .= "<td>".$row['poc']."</td>";
                        $output .= "<td>".$row['domain']."</td>";
                        $output .= "<td>".$row['envir']."</td>";
                        $output .= "<td>".$row['connam']."</td>";
                        $output .= "<td>".$row['localhrc_yn']."</td>";
                        $output .= "<td>".$row['comments']."</td>";
                        $output .= "<td>".$row['status']."</td>";
                        $output .= "</tr>\n";

                }
        $output .= "</table>\n";
        $output .= "</div>\n";
        $output .= "<hr>\n";
        $output .= "</body></html>\n";
        return( $output );
        }

function leds_kb( $options )  {
	$php_self=$_SERVER['PHP_SELF'];
	$output = "";
	$option0=$options[0];
	$option1=$options[1];
	$option2=$options[2];
	$option3=$options[3];

	$pdo = newpdo($GLOBALS['kbfile']);
	$tblname="kb";

	if( $option2 == "" ) {
		$output .= "<hr>kb tblname=[$tblname] index<hr>\n";
//		$output .= "<hr>\n";
		$output .= "<div class=kb>\n";
		$output .= "<table border=2>\n";
		$output .= "<tr>\n";
		$output .= "<td>kbid</td>\n";
		$output .= "<td>kb_user</td>\n";
		$output .= "<td>status</td>\n";
		$output .= "<td>fixtxt</td>\n";
		$output .= "<td>errtxt</td>\n";
		$output .= "<td>searchable</td>\n";
		$output .= "<td>notes</td>\n";
		$output .= "<td>comments</td>\n";
		$output .= "<td>filelist</td>\n";
		$output .= "<td>filecount</td>\n";
		$output .= "</tr>\n";

//		$sql = "select * from $tblname limit 25";
		$sql = "select * from $tblname order by kbid desc limit 100";
		foreach( $pdo->query($sql) as $row ) {
			$kbid=$row['kb_user'];
			$status=$row['status'];
			$searchable=$row['searchable'];
			$notes=$row['notes'];
			$comment=$row['comment'];
			$errtext=$row['errtext'];
			$errtxt=$row['errtxt'];
			$fixtxt=$row['fixtxt'];
			$fixtext=$row['fixtext'];


			$yyyymm=substr( $kbid, 0, 6 );
			$kb_rootpath="/var/www/html/kb/ka1";
			$kb_path="/var/www/html/ka1/kb/$yyyymm/$kbid";
			if( is_dir( $kb_path )) {
//				printf( "BUGS_7776:  FOUND isdir kb_path=[$kb_path]<br>\n" );
//				$filelist=system( "ls -lat $kb_path" );
//				$filecount=system( "ls -lat $kb_path | wc -l" );
				$filelist="true";
				$filecount="1";
				}
			else {
				$filelist="nodir";
				$filecount=0;
				}
			$output .= "<tr><td>";
//			$output .= "<a href=$php_self?q=kb/view/$kbid target=_blank>kb</a><br>\n";
			$output .= "<a href=$php_self?q=kb/view/".$row['kbid'] . " target=_blank>". $row['kbid']. "</a>";
			$output .= "<td>".$kb_user."</td>\n";
			$output .= "<td>".$status."</td>";
			$output .= "<td>".$searchable."</td>";
			$output .= "<td>".$notes."</td>";
			$output .= "<td>".$comments."</td>";
			$output .= "<td>".$errtxt."</td>";
			$output .= "<td>".$fixtxt."</td>";
			$output .= "<td>".$errtext."</td>";
			$output .= "<td>".$fixtext."</td>";
			$output .= "<td>".$filelist."</td>";
			$output .= "<td>".$filecount."</td>";
			$output .= "</tr>\n";
			}

		$output .= "</table>\n";
		$output .= "<hr>\n";
		$output .= "</div>\n";
		$output .= "</body></html>\n";
		return( $output );
		}

	if( $option1 == "view" ) {
		$kbid=$option2;
		$sql = "select * from $tblname where kbid='$kbid' order by kbid desc";

//		$output .= "<html><head><title>koaac_kb view kbid=$kbid o1=$option1 o2=$option2 </title></head>\n";
//		$output .= "<body bgcolor=lightblue>\n";
		$output .= "<h2>koaac_kb view kbid=$kbid </h2>\n";
		$output .= "<h3>sql=[$sql]</h3>\n";
		$output .= "<div id=\"kb_view\">\n";
		$output .= "<hr>\n";

		$output .= "<table border=1>\n";
		$output .= "<tr><td>kbid</td><td>kb_user</td><td>status</td>\n";
		$output .= "<td>fixtxt</td><td>errtxt</td><td>notes</td><td>comments</td>\n";
		$output .= "<td>searchable</td><td>filelist</td><td>filecount</td></tr>\n";


//		printf( "BUGS_7496:  view o1=$option1 o2=$option2 kb_path=[$kb_path]<br>\n" );
		$yyyymm=substr( $kbid, 0, 6 );
		$kb_rootpath="/var/www/html/kb/ka1";
		$kb_path="/var/www/html/ka1/kb/$yyyymm/$kbid";
		$output_ls="";
		if( is_dir( $kb_path )) {
///			printf( "BUGS_7500:  FOUND isdir kb_path=[$kb_path]<br>\n" );
///			$filelist=system( "ls -lat $kb_path" );
///			$filecount=system( "ls -lat $kb_path | wc -l" );
			$output_ls = kb_ls( $options, $kb_path );
			}
		else {
			$filelist="nofiles";
			$filecount=0;
			}
//		return( $output );
	
		foreach( $pdo->query($sql) as $row ) {
			$kbid=$row['kbid'];
			$kb_user=$row['kb_user'];
			$kb_status=$row['kb_status'];
			$kb_searchable=$row['searchable'];
//			$kb_filecount=$row['kb_filecount'];
//			$kb_filelist=$row['filelist'];
			$errtxt=$row['errtxt'];
			$fixtxt=$row['fixtxt'];
			$errtext=$row['errtext'];
			$fixtext=$row['fixtext'];
			$comment=$row['comment'];
			$notes=$row['notes'];
			$filelist=$row['filelist'];
			$filecount=$row['filecount'];
			$searchable=$row['searchable'];

			$output .= "<tr>";
			$output .= "<td>".$kbid."</td>";
			$output .= "<td>".$kb_user."</td>";
			$output .= "<td>".$kb_status."</td>";
			$output .= "<td>".$fixtxt."</td>";
			$output .= "<td>".$errtxt."</td>";
			$output .= "<td>".$notes."</td>";
			$output .= "<td>".$comment."</td>";
			$output .= "<td>".$searchable."</td>";
			$output .= "<td>".$filelist."</td>";
			$output .= "<td>".$filecount."</td>";
			$output .= "</tr>\n";

			}
		$output .= "</table>\n";
		$output .= "<hr>\n";

		$output .= $output_ls;
		$output .= "</body></html>\n";
		return( $output );
		}


	if( $option1 == "mod" ) {
		$kbid=$option2;
		$sql = "select * from $tblname where kbid='$kbid'";

		$output .= "<html><head><title>koaac_kb detail kbid=$kbid o1=$option1 o2=$option2 </title></head>\n";
		$output .= "<body bgcolor=lightblue>\n";
		$output .= "<h2>koaac_kb detail $kbid </h2>\n";
		$output .= "<hr>sql=[$sql]<hr>\n";
		$output .= "<div id=\"kb\">\n";
		$output .= "<hr>\n";

		$output .= "<table>\n";
		$output .= "<tr><td>kbid</td><td>kb_user</td><td>status</td><td>searchable</td><td>filelist</td><td>filecount</td></tr>\n";
//		$output .= "<hr>sql=[$sql]<hr>\n";
//		return( $output );
	
		foreach( $pdo->query($sql) as $row ) {
			$output .= "<tr>";
			$output .= "<td>".$row['kbid']."</td>";
			$output .= "<td>".$row['kb_user']."</td>";
			$output .= "<td>".$row['status']."</td>";
			$output .= "<td>".$row['searchable']."</td>"; $output .= "<td>".$row['filelist']."</td>";
			$output .= "<td>".$row['filecount']."</td>";
			$output .= "</tr>\n";

			}
		$output .= "</table>\n";
		$output .= "<hr>\n";
		$output .= "</body></html>\n";
		return( $output );
		}

	printf( "ERR UNSUPPORTED_7545:  leds_kb o0=$option0 o1=$option1 o2=$option2<br>\n" );
	return;
	}



function leds_kb_rpts( $options ) {

	$kbfile=$GLOBALS['kbfile'];
	$php_self=$SERVER['PHP_SELF'];
	$pdo = newpdo($kbfile);
	$tblname="rpts";
	$option0=$options[0];
	$option1=$options[1];
	$option2=$options[2];
	$option3=$options[3];
	if( isset( $_GET['fmt'] )) { $fmt=$_GET['fmt']; } else { $fmt=""; }
	$output = "<h2>$php_self leds_kb_rpts MSG_8800: fmt=[$fmt] $option1 $option2 $option3</h2>\n";

	if( $option2 == "" ) {
		$output .= "<hr>\n";
//		$output .= "<h3>leds_kb_rpts kbfile=[$kbfile] tblname=[$tblname]</h3>\n";
		$output .= "<table border=1>\n";
		$output .= "<tr><td>rpt_code</td><td>rpt_sql</td></tr>\n";
		$sql = "select * from $tblname";
		foreach( $pdo->query($sql) as $row ) {
			$rpt_code=$row['rpt_code'];
			$rpt_sql=$row['rpt_sql'];
			$rpt_url="<a href=$php_self?q=kb/rpts/$rpt_code >$rpt_code</a>\n";
			$output .= "<tr><td>$rpt_url</td><td>$rpt_sql</td></tr>\n";
			}
		$output .= "</table>\n";
		$output .= "<hr>\n";
		$pdo = null;
		return( $output );
		}

	if( $option2 != "" ) {
		$rpt_code=$option2;
		$sql = "select * from $tblname where rpt_code='$rpt_code'";

		$output .= "<html><head><title>leds_kb_rpts detail rpt_code=$rpt_code o1=$option1 o2=$option2 </title></head>\n";
		$output .= "<body bgcolor=lightblue>\n";
		$output .= "<h2>leds_kb_rpts detail $rpt_code </h2>\n";
//		$output .= "<hr>sql=[$sql]<hr>\n";
		$output .= "<div id=\"kb_rpts\">\n";
//		$output .= "<hr>\n";

		$output .= "<table>\n";
		$output .= "<tr><td>rpt_code</td><td>rpt_title</td><td>rpt_sql</td></tr>\n";

		foreach( $pdo->query($sql) as $row ) {
			$rpt_code=$row['rpt_code'];
			$rpt_sql=$row['rpt_sql'];
			$rpt_title=$row['rpt_title'];
			$output .= "<tr>";
			$output .= "<td>$rpt_code</td>";
			$output .= "<td>$rpt_title</td>";
			$output .= "<td>$rpt_sql</td>";
			$output .= "</tr>\n";
			}
		$output .= "</table>\n";
		$pdo=null;
//		$output .= "<h2>BUGS_8248 kbfile=[$kbfile] rpt_sql=[$rpt_sql]</h2>\n";

// display headers
		try {
			$pdo = newpdo($kbfile);
			$stmt = $pdo->query($rpt_sql);
			$result = $stmt->fetch(PDO::FETCH_ASSOC);
			$output .= "<table border=1>\n";
			$output .= "<tr>\n";
			foreach( $result as $key=>$val) {
				$output .= "<td>$key</td>\n";
				}
			$output .= "</tr>\n";
			$pdo = null;
			}
		catch(PDOException $e) { $output .= $e->getMessage(); }

// display details
		try {
			$pdo = newpdo($kbfile);
			$j=0;
//			$output .= "BUGS_1234 rpt_sql=[$rpt_sql]<br>\n";
			$output .= "<tr>\n";
			foreach( $pdo->query($rpt_sql) as $row ) {

// get field names
				foreach( $result as $key=>$val ) {
//					$output .= "<td>$j key=$key val=$val</td>";
					$rowkey=$row[$key];
					$output .= "<td>$rowkey</td>\n";
					}
				$output .= "</tr>\n";
				}
			$output .= "</tr>\n";
			$output .= "</table>\n";
			$pdo=null;
			}
		catch(PDOException $e) { $output .= $e->getMessage(); }
		return( $output );
		}

	$output .= "$progid $dttm ERR UNSUPPORTED_7545:  leds_kb_rpts o0=$option0 o1=$option1 o2=$option2<br>\n";
	return;
	}

function leds_dc_rpts( $options ) {
//	printf( "BUGS_9900 $options[1] $options[2]<hr>\n" );
        $kbfile=$GLOBALS['dbfile'];
        $php_self=$SERVER['PHP_SELF'];
        $pdo = newpdo($kbfile);
        $tblname="rpts";
        $option0=$options[0];
        $option1=$options[1];
        $option2=$options[2];
        $option3=$options[3];
        if( isset( $_GET['fmt'] )) { $fmt=$_GET['fmt']; } else { $fmt=""; }
        $output = "<h2>$php_self leds_kb_rpts MSG_8800: fmt=[$fmt] $option1 $option2 $option3</h2>\n";

        if( $option2 == "" ) {
                $output .= "<hr>\n";
//              $output .= "<h3>leds_kb_rpts kbfile=[$kbfile] tblname=[$tblname]</h3>\n";
                $output .= "<table border=1>\n";
                $output .= "<tr><td>rpt_code</td><td>rpt_sql</td></tr>\n";
                $sql = "select * from $tblname";
                foreach( $pdo->query($sql) as $row ) {
                        $rpt_code=$row['rpt_code'];
                        $rpt_sql=$row['rpt_sql'];
                        $rpt_url="<a href=$php_self?q=dc/rpts/$rpt_code >$rpt_code</a>\n";
                        $output .= "<tr><td>$rpt_url</td><td>$rpt_sql</td></tr>\n";
                        }
                $output .= "</table>\n";
                $output .= "<hr>\n";
                $pdo = null;
                return( $output );
                }

        if( $option2 != "" ) {
                $rpt_code=$option2;
                $sql = "select * from $tblname where rpt_code='$rpt_code'";

                $output .= "<html><head><title>leds_kb_rpts detail rpt_code=$rpt_code o1=$option1 o2=$option2 </title></head>\n";
                $output .= "<body bgcolor=lightblue>\n";
                $output .= "<h2>leds_kb_rpts detail $rpt_code </h2>\n";
//              $output .= "<hr>sql=[$sql]<hr>\n";
                $output .= "<div id=\"kb_rpts\">\n";
//              $output .= "<hr>\n";

                $output .= "<table>\n";
                $output .= "<tr><td>rpt_code</td><td>rpt_title</td><td>rpt_sql</td></tr>\n";

                foreach( $pdo->query($sql) as $row ) {
                        $rpt_code=$row['rpt_code'];
                        $rpt_sql=$row['rpt_sql'];
                        $rpt_title=$row['rpt_title'];
                        $output .= "<tr>";
                        $output .= "<td>$rpt_code</td>";
                        $output .= "<td>$rpt_title</td>";
                        $output .= "<td>$rpt_sql</td>";
                        $output .= "</tr>\n";
                        }
                $output .= "</table>\n";
                $pdo=null;
//              $output .= "<h2>BUGS_8248 kbfile=[$kbfile] rpt_sql=[$rpt_sql]</h2>\n";

// display headers
                try {
                        $pdo = newpdo($kbfile);
                        $stmt = $pdo->query($rpt_sql);
                        $result = $stmt->fetch(PDO::FETCH_ASSOC);
                        $output .= "<table border=1>\n";
                        $output .= "<tr>\n";
                        foreach( $result as $key=>$val) {
                                $output .= "<td>$key</td>\n";
                                }
                        $output .= "</tr>\n";
                        $pdo = null;
                        }
                catch(PDOException $e) { $output .= $e->getMessage(); }

// display details
                try {
                        $pdo = newpdo($kbfile);
                        $j=0;
//                      $output .= "BUGS_1234 rpt_sql=[$rpt_sql]<br>\n";
                        $output .= "<tr>\n";
                        foreach( $pdo->query($rpt_sql) as $row ) {

// get field names
                                foreach( $result as $key=>$val ) {
//                                      $output .= "<td>$j key=$key val=$val</td>";
                                        $rowkey=$row[$key];
                                        $output .= "<td>$rowkey</td>\n";
                                        }
                                $output .= "</tr>\n";
                                }
                        $output .= "</tr>\n";
                        $output .= "</table>\n";
                        $pdo=null;
                        }
                catch(PDOException $e) { $output .= $e->getMessage(); }
                return( $output );
                }

        $output .= "$progid $dttm ERR UNSUPPORTED_7545:  leds_kb_rpts o0=$option0 o1=$option1 o2=$option2<br>\n";
        return;
        }




function leds_certs_rpts( $options ) {

        $option0=$options[0];
        $option1=$options[1];
        $option2=$options[2];
        $option3=$options[3];

	$ka1_certsfile=$GLOBALS['ka1_certsfile'] = "/var/www/html/ka1/db3/ka1_certs.db3";
        $tblname="rpts";
        $php_self=$SERVER['PHP_SELF'];

//	$output = "<h2>BUGS_8197 ka1_certsfile=[$ka1_certsfile] leds_certs_rpts $option1 $option2 $option3</h2>\n";
//	return( $output );

        if( $option2 == "" ) {
                $output .= "<hr>\n";
                $output .= "<h3>leds_certs_rpts ka1_certsfile=[$ka1_certsfile] tblname=[$tblname]</h3>\n";
                $output .= "<table border=1>\n";
                $output .= "<tr><td>rpt_code</td><td>rpt_sql</td></tr>\n";
        	$pdo = newpdo($ka1_certsfile);
                $sql = "select * from $tblname";
                foreach( $pdo->query($sql) as $row ) {
                        $rpt_code=$row['rpt_code'];
                        $rpt_sql=$row['rpt_sql'];
                        $rpt_url="<a href=$php_self?q=certs/rpts/$rpt_code >$rpt_code</a>\n";
                        $output .= "<tr><td>$rpt_url</td><td>$rpt_sql</td></tr>\n";
                        }
                $output .= "</table>\n";
                $output .= "<hr>\n";
                $pdo = null;
                return( $output );
                }

        if( $option2 != "" ) {
                $rpt_code=$option2;

                $output .= "<html><head><title>leds_certs_rpts detail rpt_code=$rpt_code o1=$option1 o2=$option2 </title></head>\n";
                $output .= "<body bgcolor=lightblue>\n";
                $output .= "<h2>leds_certs_rpts detail $rpt_code </h2>\n";
                $output .= "<hr>sql=[$sql]<hr>\n";
                $output .= "<div id=\"certs_rpts\">\n";
                $output .= "<hr>\n";

                $output .= "<table>\n";
                $output .= "<tr><td>rpt_code</td><td>rpt_title</td><td>rpt_sql</td></tr>\n";

                $sql = "select * from $tblname where rpt_code='$rpt_code'";
        	$pdo = newpdo($ka1_certsfile);
                foreach( $pdo->query($sql) as $row ) {
                        $rpt_code=$row['rpt_code'];
                        $rpt_title=$row['rpt_title'];
                        $rpt_sql=$row['rpt_sql'];
                        $output .= "<tr>";
                        $output .= "<td>$rpt_code</td>";
                        $output .= "<td>$rpt_title</td>";
                        $output .= "<td>$rpt_sql</td>";
                        $output .= "</tr>\n";
                        }
                $output .= "</table>\n";
                $pdo=null;

                try {
                        $pdo = newpdo($ka1_certsfile);
                        $stmt = $pdo->query($rpt_sql);
//                      $output .= "<h2>BUGS_8250 kbfile=[$kbfile] rpt_sql=[$rpt_sql]</h2>\n";
                        $result = $stmt->fetch(PDO::FETCH_ASSOC);

//                      $output .= "result_count=[$result_count]<br>\n";
                        $output .= "<hr>\n";
                        $output .= "<table border=1>\n";
                        $output .= "<tr>\n";
                        foreach( $result as $key=>$val) {
                                $output .= "<td>$key</td>\n";
                                }
                        $output .= "</tr>\n";
                        $pdo = null;
                        }
                catch(PDOException $e) { $output .= $e->getMessage(); }

                try {
                        $pdo = newpdo($ka1_certsfile);
                        $j=0;
//                      $output .= "BUGS_1234 rpt_sql=[$rpt_sql]<br>\n";
                        $output .= "<tr>\n";
                        foreach( $pdo->query($rpt_sql) as $row ) {
                                foreach( $result as $key=>$val ) {
//                                      $output .= "<td>$j key=$key val=$val</td>";
                                        $rowkey=$row[$key];
                                        $output .= "<td>$rowkey</td>\n";
//                                      print_r($row );
                                        }
                                $output .= "</tr>\n";
                                }
                        $output .= "</tr>\n";
                        $output .= "</table>\n";
                        $pdo=null;
                        }
                catch(PDOException $e) { $output .= $e->getMessage(); }
                return( $output );
		}


        $output .= "$progid $dttm ERR UNSUPPORTED_8360:  leds_certs_rpts o0=$option0 o1=$option1 o2=$option2<br>\n";
        return;
        }

function leds_cons_rpts( $options ) {

        $option0=$options[0];
        $option1=$options[1];
        $option2=$options[2];
        $option3=$options[3];

        $ka1_cons=$GLOBALS['ka1_cons'] = "/var/www/html/ka1/db3/ka1_cons.db3";
        $tblname="rpts";
        $php_self=$SERVER['PHP_SELF'];

//      $output = "<h2>BUGS_8197 ka1_cons=[$ka1_cons] leds_cons_rpts $option1 $option2 $option3</h2>\n";
//      return( $output );

        if( $option2 == "" ) {
                $output .= "<hr>\n";
                $output .= "<h3>leds_cons_rpts ka1_cons=[$ka1_cons] tblname=[$tblname]</h3>\n";
                $output .= "<table border=1>\n";
                $output .= "<tr><td>rpt_code</td><td>rpt_sql</td></tr>\n";
                $pdo = newpdo($ka1_cons);
                $sql = "select * from $tblname";
                foreach( $pdo->query($sql) as $row ) {
                        $rpt_code=$row['rpt_code'];
                        $rpt_sql=$row['rpt_sql'];
                        $rpt_url="<a href=$php_self?q=cons/rpts/$rpt_code >$rpt_code</a>\n";
                        $output .= "<tr><td>$rpt_url</td><td>$rpt_sql</td></tr>\n";
                        }
                $output .= "</table>\n";
                $output .= "<hr>\n";
                $pdo = null;
                return( $output );
                }

        if( $option2 != "" ) {
                $rpt_code=$option2;

                $output .= "<html><head><title>leds_cons_rpts detail rpt_code=$rpt_code o1=$option1 o2=$option2 </title></head>\n";
                $output .= "<body bgcolor=lightblue>\n";
                $output .= "<h2>leds_cons_rpts detail $rpt_code </h2>\n";
                $output .= "<hr>sql=[$sql]<hr>\n";
                $output .= "<div id=\"cons_rpts\">\n";
                $output .= "<hr>\n";

                $output .= "<table>\n";
                $output .= "<tr><td>rpt_code</td><td>rpt_title</td><td>rpt_sql</td></tr>\n";

                $sql = "select * from $tblname where rpt_code='$rpt_code'";
                $pdo = newpdo($ka1_cons);
                foreach( $pdo->query($sql) as $row ) {
                        $rpt_code=$row['rpt_code'];
                        $rpt_title=$row['rpt_title'];
                        $rpt_sql=$row['rpt_sql'];
                        $output .= "<tr>";
                        $output .= "<td>$rpt_code</td>";
                        $output .= "<td>$rpt_title</td>";
                        $output .= "<td>$rpt_sql</td>";
                        $output .= "</tr>\n";
                        }
                $output .= "</table>\n";
                $pdo=null;

                try {
                        $pdo = newpdo($ka1_cons);
                        $stmt = $pdo->query($rpt_sql);
//                      $output .= "<h2>BUGS_8250 kbfile=[$kbfile] rpt_sql=[$rpt_sql]</h2>\n";
                        $result = $stmt->fetch(PDO::FETCH_ASSOC);

//                      $output .= "result_count=[$result_count]<br>\n";
                        $output .= "<hr>\n";
                        $output .= "<table border=1>\n";
                        $output .= "<tr>\n";
                        foreach( $result as $key=>$val) {
                                $output .= "<td>$key</td>\n";
                                }
                        $output .= "</tr>\n";
                        $pdo = null;
                        }
                catch(PDOException $e) { $output .= $e->getMessage(); }

                try {
                        $pdo = newpdo($ka1_cons);
                        $j=0;
//                      $output .= "BUGS_1234 rpt_sql=[$rpt_sql]<br>\n";
                        $output .= "<tr>\n";
                        foreach( $pdo->query($rpt_sql) as $row ) {
                                foreach( $result as $key=>$val ) {
//                                      $output .= "<td>$j key=$key val=$val</td>";
                                        $rowkey=$row[$key];
                                        $output .= "<td>$rowkey</td>\n";
//                                      print_r($row );
                                        }
                                $output .= "</tr>\n";
                                }
                        $output .= "</tr>\n";
                        $output .= "</table>\n";
                        $pdo=null;
                        }
                catch(PDOException $e) { $output .= $e->getMessage(); }
                return( $output );
                }


        $output .= "$progid $dttm ERR UNSUPPORTED_9145:  leds_cons_rpts o0=$option0 o1=$option1 o2=$option2<br>\n";
        return;
        }

function leds_hosts_rpts( $options ) {

        $option0=$options[0];
        $option1=$options[1];
        $option2=$options[2];
        $option3=$options[3];

        $ka1_hosts=$GLOBALS['ka1_hosts'] = "/var/www/html/ka1/db3/ka1_hosts.db3";
        $tblname="rpts";
        $php_self=$SERVER['PHP_SELF'];

//      $output = "<h2>BUGS_8197 ka1_hosts=[$ka1_hosts] leds_hosts_rpts $option1 $option2 $option3</h2>\n";
//      return( $output );

        if( $option2 == "" ) {
                $output .= "<hr>\n";
                $output .= "<h3>leds_hosts_rpts ka1_hosts=[$ka1_hosts] tblname=[$tblname]</h3>\n";
                $output .= "<table border=1>\n";
                $output .= "<tr><td>rpt_code</td><td>rpt_sql</td></tr>\n";
                $pdo = newpdo($ka1_hosts);
                $sql = "select * from $tblname";
                foreach( $pdo->query($sql) as $row ) {
///			printf( "$row<br>\n" );
                        $rptcode=$row['rptcode'];
                        $rptdesc=$row['rptdesc'];
                        $rptsql=$row['rptsql'];
                        $dbfile=$row['dbfile'];
                        $status=$row['status'];
                        $rpt_url="<a href=$php_self?q=hosts/rpts/$rptcode >$rptcode</a>\n";
                        $output .= "<tr><td>$rpt_url</td><td>$rptsql</td></tr>\n";
                        }
                $output .= "</table>\n";
                $output .= "<hr>\n";
                $pdo = null;
                return( $output );
                }

//      $output = "<h2>BUGS_9590 ka1_hosts=[$ka1_hosts] leds_hosts_rpts $option1 $option2 $option3</h2>\n";
//      return( $output );

        if( $option2 != "" ) {
                $rptcode=$option2;

                $output .= "<html><head><title>leds_hosts_rpts detail rptcode=$rptcode o1=$option1 o2=$option2 </title></head>\n";
                $output .= "<body bgcolor=lightblue>\n";
                $output .= "<h2>leds_hosts_rpts detail $rptcode </h2>\n";
///                $output .= "<hr>sql=[$sql]<hr>\n";
                $output .= "<div id=\"hosts_rpts\">\n";
                $output .= "<hr>\n";

                $output .= "<table>\n";
                $output .= "<tr><td>rptcode</td><td>rptdesc</td><td>rptsql</td></tr>\n";

                $sql = "select * from $tblname where rptcode='$rptcode'";
//		printf( "BUGS_9598 rptcode=$rptcode sql=[$sql]<hr>\n" );
//		return( $output );


                $pdo = newpdo($ka1_hosts);
                foreach( $pdo->query($sql) as $row ) {
                        $rptcode=$row['rptcode'];
                        $rptdesc=$row['rptdesc'];
                        $rptsql=$row['rptsql'];
                        $dbfile=$row['dbfile'];
                        $status=$row['status'];
                        $output .= "<tr>";
                        $output .= "<td>$rptcode</td>";
                        $output .= "<td>$rptdesc</td>";
                        $output .= "<td>$rptsql</td>";
                        $output .= "</tr>\n";
                        }
                $output .= "</table>\n";
                $pdo=null;

                try {
                        $pdo = newpdo($ka1_hosts);
                        $stmt = $pdo->query($rptsql);
                        $result = $stmt->fetch(PDO::FETCH_ASSOC);

//                      $output .= "result_count=[$result_count]<br>\n";
                        $output .= "<hr>\n";
                        $output .= "<table border=1>\n";
                        $output .= "<tr>\n";
                        foreach( $result as $key=>$val) {
                                $output .= "<td>$key</td>\n";
                                }
                        $output .= "</tr>\n";
                        $pdo = null;
                        }
                catch(PDOException $e) { $output .= $e->getMessage(); }

                try {
                        $pdo = newpdo($ka1_hosts);
                        $j=0;
//                      $output .= "BUGS_1234 rptsql=[$rptsql]<br>\n";
                        $output .= "<tr>\n";
                        foreach( $pdo->query($rptsql) as $row ) {
                                foreach( $result as $key=>$val ) {
//                                      $output .= "<td>$j key=$key val=$val</td>";
                                        $rowkey=$row[$key];
                                        $output .= "<td>$rowkey</td>\n";
//                                      print_r($row );
                                        }
                                $output .= "</tr>\n";
                                }
                        $output .= "</tr>\n";
                        $output .= "</table>\n";
                        $pdo=null;
                        }
                catch(PDOException $e) { $output .= $e->getMessage(); }
                return( $output );
                }


        $output .= "$progid $dttm ERR UNSUPPORTED_9145:  leds_hosts_rpts o0=$option0 o1=$option1 o2=$option2<br>\n";
        return;
        }







function leds_ka1d_rpts( $options ) {

        $option0=$options[0];
        $option1=$options[1];
        $option2=$options[2];
        $option3=$options[3];

        $ka1d_sqldb=$GLOBALS['ka1d_sqldb'] = "/var/www/html/ka1/db3/ka1d.db3";
        $tblname="rpts";
        $php_self=$SERVER['PHP_SELF'];

//	$html = "<h2>BUGS_8650 ka1d=[$ka1d] leds_ka1d_rpts $option1 $option2 $option3</h2>\n";
//	return( $html );

	$html = html_header($options);
	$html .= html_btn_squares($options);
	$html .= leds_show($options);

        if( $option2 == "" ) {
                $html .= "<hr>\n";
                $html .= "<h3>leds_ka1d_rpts ka1d=[$ka1d_sqldb] tblname=[$tblname]</h3>\n";
                $html .= "<table border=1>\n";
                $html .= "<tr><td>rpt_code</td><td>rpt_sql</td></tr>\n";
                $pdo = newpdo($ka1d_sqldb);
                $sql = "select * from $tblname";
                foreach( $pdo->query($sql) as $row ) {
                        $rpt_code=$row['rpt_code'];
                        $rpt_sql=$row['rpt_sql'];
                        $rpt_url="<a href=$php_self?q=ka1d/rpts/$rpt_code >$rpt_code</a>\n";
                        $html .= "<tr><td>$rpt_url</td><td>$rpt_sql</td></tr>\n";
                        }
                $html .= "</table>\n";
                $html .= "<hr>\n";
                $pdo = null;
                return( $html );
                }

        if( $option2 != "" ) {
                $rpt_code=$option2;

//		$html .= "<html><head><title>leds_ka1d_rpts detail rpt_code=$rpt_code o1=$option1 o2=$option2 </title></head>\n";
//		$html .= "<body bgcolor=lightblue>\n";
                $html .= "<h2>leds_ka1d_rpts detail $rpt_code </h2>\n";
                $html .= "<hr>sql=[$sql]<hr>\n";
                $html .= "<div id=\"ka1d_rpts\">\n";
                $html .= "<hr>\n";

                $html .= "<table>\n";
                $html .= "<tr><td>rpt_code</td><td>rpt_title</td><td>rpt_sql</td></tr>\n";

                $sql = "select * from $tblname where rpt_code='$rpt_code'";
                $pdo = newpdo($ka1d_sqldb);
                foreach( $pdo->query($sql) as $row ) {
                        $rpt_code=$row['rpt_code'];
                        $rpt_title=$row['rpt_title'];
                        $rpt_sql=$row['rpt_sql'];
                        $html .= "<tr>";
                        $html .= "<td>$rpt_code</td>";
                        $html .= "<td>$rpt_title</td>";
                        $html .= "<td>$rpt_sql</td>";
                        $html .= "</tr>\n";
                        }
                $html .= "</table>\n";
                $html .= "</div>\n";
                $pdo=null;

                try {
                        $pdo = newpdo($ka1d_sqldb);
                        $stmt = $pdo->query($rpt_sql);
//                      $html .= "<h2>BUGS_8250 ka1d_sqldb=[$ka1d_sqldb] rpt_sql=[$rpt_sql]</h2>\n";
                        $result = $stmt->fetch(PDO::FETCH_ASSOC);

//                      $html .= "result_count=[$result_count]<br>\n";
                        $html .= "<hr>\n";
                        $html .= "<table border=1>\n";
                        $html .= "<tr>\n";
                        foreach( $result as $key=>$val) {
                                $html .= "<td>$key</td>\n";
                                }
                        $html .= "</tr>\n";
                        $pdo = null;
                        }
                catch(PDOException $e) { $html .= $e->getMessage(); }

                try {
                        $pdo = newpdo($ka1d_sqldb);
                        $j=0;
//                      $html .= "BUGS_1234 rpt_sql=[$rpt_sql]<br>\n";
                        $html .= "<tr>\n";
                        foreach( $pdo->query($rpt_sql) as $row ) {
                                foreach( $result as $key=>$val ) {
//                                      $html .= "<td>$j key=$key val=$val</td>";
                                        $rowkey=$row[$key];
                                        $html .= "<td>$rowkey</td>\n";
//                                      print_r($row );
                                        }
                                $html .= "</tr>\n";
                                }
                        $html .= "</tr>\n";
                        $html .= "</table>\n";
                        $pdo=null;
                        }
                catch(PDOException $e) { $html .= $e->getMessage(); }
                return( $html );
                }


        $html .= "$progid $dttm ERR UNSUPPORTED_8360:  leds_ka1d_rpts o0=$option0 o1=$option1 o2=$option2<br>\n";
        return;
        }





function leds_nodes_rpts( $options ) {

        $option0=$options[0];
        $option1=$options[1];
        $option2=$options[2];
        $option3=$options[3];

//      $ka1d_sqldb=$GLOBALS['ka1d_sqldb'] = "/var/www/html/ka1/db3/ka1d.db3";
//      $ka1_sqldb=$GLOBALS['ka1_sqldb'] = "/var/www/html/ka1/ka1.db3";
        $tblname="rpts";
        $php_self=$SERVER['PHP_SELF'];

      $html = "<h2>BUGS_8935 leds_nodes_rpts $option1 $option2 $option3</h2>\n";

//        $html = html_header($options);
//        $html .= html_btn_squares($options);
//        $html .= leds_show($options);

        if( $option2 == "" ) {
                $html .= "<hr>\n";
                $html .= "<h3>leds_nodes_rpts ka1d=[$ka1d_sqldb] tblname=[$tblname]</h3>\n";
                $html .= "<table border=1>\n";
                $html .= "<tr><td>rpt_code</td><td>rpt_sql</td><td>rpt_filename</td></tr>\n";
		$pdo = newpdo($GLOBALS['dbfile']);
                $sql = "select * from $tblname";
                foreach( $pdo->query($sql) as $row ) {
                        $rpt_code=$row['rpt_code'];
                        $rpt_sql=$row['rpt_sql'];
                        $rpt_filename=$row['rpt_filename'];
                        $rpt_url="<a href=$php_self?q=nodes/rpts/$rpt_code >$rpt_code</a>\n";
                        $html .= "<tr><td>$rpt_url</td><td>$rpt_sql</td><td>$rpt_filename</td></tr>\n";
                        }
                $html .= "</table>\n";
                $html .= "<hr>\n";
                $pdo = null;
                return( $html );
                }

        if( $option2 != "" ) {
                $rpt_code=$option2;

//              $html .= "<html><head><title>leds_ka1d_rpts detail rpt_code=$rpt_code o1=$option1 o2=$option2 </title></head>\n";
//              $html .= "<body bgcolor=lightblue>\n";
                $html .= "<h2>leds_nodes_rpts detail $rpt_code </h2>\n";
                $html .= "<hr>sql=[$sql]<hr>\n";
                $html .= "<div id=\"ka1d_rpts\">\n";
                $html .= "<hr>\n";

                $html .= "<table>\n";
                $html .= "<tr><td>rpt_code</td><td>rpt_title</td><td>rpt_sql</td><td>rpt_filename</td></tr>\n";

                $sql = "select * from $tblname where rpt_code='$rpt_code'";
//                $pdo = newpdo($ka1d_sqldb);
		$pdo = newpdo($GLOBALS['dbfile']);
                foreach( $pdo->query($sql) as $row ) {
                        $rpt_code=$row['rpt_code'];
                        $rpt_title=$row['rpt_title'];
                        $rpt_sql=$row['rpt_sql'];
                        $rpt_filename=$row['rpt_filename'];
                        $html .= "<tr>";
                        $html .= "<td>$rpt_code</td>";
                        $html .= "<td>$rpt_title</td>";
                        $html .= "<td>$rpt_sql</td>";
                        $html .= "<td>$rpt_filename</td>";
                        $html .= "</tr>\n";
                        }
                $html .= "</table>\n";
                $html .= "</div>\n";
                $pdo=null;

                try {
                        $pdo = newpdo($GLOBALS['dbfile']);
                        $stmt = $pdo->query($rpt_sql);
//                      $html .= "<h2>BUGS_8250 ka1d_sqldb=[$ka1d_sqldb] rpt_sql=[$rpt_sql]</h2>\n";
                        $result = $stmt->fetch(PDO::FETCH_ASSOC);

//                      $html .= "result_count=[$result_count]<br>\n";
                        $html .= "<hr>\n";
                        $html .= "<table border=1>\n";
                        $html .= "<tr>\n";
                        foreach( $result as $key=>$val) {
                                $html .= "<td>$key</td>\n";
                                }
                        $html .= "</tr>\n";
                        $pdo = null;
                        }
                catch(PDOException $e) { $html .= $e->getMessage(); }

                try {
                        $pdo = newpdo($GLOBALS['dbfile']);
                        $j=0;
//                      $html .= "BUGS_1234 rpt_sql=[$rpt_sql]<br>\n";
                        $html .= "<tr>\n";
                        foreach( $pdo->query($rpt_sql) as $row ) {
                                foreach( $result as $key=>$val ) {
//                                      $html .= "<td>$j key=$key val=$val</td>";
                                        $rowkey=$row[$key];
                                        $html .= "<td>$rowkey</td>\n";
//                                      print_r($row );
                                        }
                                $html .= "</tr>\n";
                                }
                        $html .= "</tr>\n";
                        $html .= "</table>\n";
                        $pdo=null;
                        }
                catch(PDOException $e) { $html .= $e->getMessage(); }
                return( $html );
                }


        $html .= "$progid $dttm ERR UNSUPPORTED_8360:  leds_ka1d_rpts o0=$option0 o1=$option1 o2=$option2<br>\n";
        return;
	}


function leds_ptviewer( $options )  {
	$php_self=$_SERVER['PHP_SELF'];
	$ptpath="./java/ptviewer";
	$panopath="./media/pano";
	$panofile="obj.jpg"; $width="640"; $height="480"; $nhor="25"; $nver="1";
	$output = "";


	if( $options[2] == "" ) {
		$pdo = newpdo($GLOBALS['dbfile']);
		$tblname="pano";
		$output = "";
		$output .= "<html><head><title>fp ptviewer index</title></head>\n";
		$output .= "<body bgcolor=lightblue>\n";
		$output .= "<hr>fp ptviewer index<hr>\n";
		$output .= "<hr>\n";
		$output .= "<div class=pano>\n";
		$output .= "<table>\n";
		$sql = "select * from $tblname";
		foreach( $pdo->query($sql) as $row ) {
			$output .= "<tr><td>";
//			$output .= "<a href=$php_self?q=ptviewer/pano_templet.gif/600/300 target=_blank>pano_templet</a><br>\n";
			$output .= "<a href=$php_self?q=ptviewer/".$row['filename'];
			$output .= "/".$row['width']."/".$row['height']." target=_blank>";
			$output .= $row['filename']."</a></td><td>".$row['title']."</td></tr>\n";
			}

		$output .= "</table>\n";
		$output .= "<hr>\n";
		$output .= "</div>\n";
		$output .= "</body></html>\n";
		print( "$output" );
		return;
//		return( $output );
		}

	$panofile=$options[1];
	$width=$options[2];
	$height=$options[3];
	$nhor=$options[4];
	$nver=$options[5];
	if( $nver == "" ) { $nver="1"; }
	$panopathfile = "$panopath/$panofile";
	
	$output .= "<html><head><title>fp ptviewer detail $panofile $width $height</title></head>\n";
	$output .= "<body bgcolor=lightblue>\n";
	$output .= "<hr>fp ptviewer detail $panofile $width $height<hr>\n";
	$output .= "<div id=\"ptviewer\">\n";
	$output .= "<hr>\n";
	$output .= "<applet code=\"ptviewer.class\" archive=\"$ptpath/ptviewer.jar\" ";
	$output .= "width=$width height=$height>\n";
	$output .= "<param name=file value=\"$panopathfile\">\n";
//	$output .= "<param name=cursor value=\"CROSSHAIR\">\n";
	$output .= "<param name=cursor value=\"MOVE\">\n";
	$output .= "<param name=FOV value=\"-105\">\n";
	$output .= "<param name=pan value=\"360\">\n";
//	$output .= "<param name=imgLoadFeedback value=\"true\">\n";
//	$output .= "<param name=showToolbar value=\"true\">\n";
//	$output .= "<param name=inits value=\"ptviewer:startApplet(0)\">\n";
	$output .= "</applet>\n";
	$output .= "</div>\n";
	$output .= "</body></html>\n";

	return( $output );
	}

function leds_zoom( $options )  {
	$php_self=$_SERVER['PHP_SELF'];
	$zoompath="./media/zoom/";
	$output = "";
	$url_zmcode=$options[1];
	$url_zmtype=$options[2];
	$url_zmrowid=$options[3];

//	print( "leds_zoom MSG_4236: url_zmcode=[$url_zmcode] url_zmtype=[$url_zmtype] url_rowid=[$url_rowid]<br>\n" );
//	print( "leds_zoom MSG_4237:  _SESSION[hs_type]=[".$_SESSION['hs_type']."] url_zmtype=[$url_zmtype]<br>\n" );
//	print( "leds_zoom MSG_4238: o0=[$options[0]] o1=[$options[1]] o2=[$options[2]] o3=[$options[3]]<br>\n" );

	if( $url_zmtype != "" ) { $_SESSION['hs_type'] = $url_zmtype; }

//	print( "leds_zoom MSG_4242:  _SESSION[hs_type]=[".$_SESSION['hs_type']."] url_zmcode=[$url_zmcode] url_zmtype=[$url_zmtype]<br>\n" );

	$html_links = html_links($options);
	$html_btn_squares = html_btn_squares($options);

//	$callback="$php_self?q=zoom/$url_zmcode/$url_zmtype/$url_zmrowid";
	$callback="$php_self?q=zoom/$url_zmcode/\$hs/$url_zmrowid";

//	print( "leds_zoom MSG_2660: url_zmcode=[$url_zmcode] url_zmtype=[$url_zmtype] url_rowid=[$url_rowid]<br>$callback\n" );
//	print( "leds_zoom MSG_4252: callback=[$callback]<br>\n" );


	$html_btn_hotspots = html_btn_hotspots($options, $callback);
	$path_btn="./imgs/btn";
	$query_string=$_SERVER['QUERY_STRING'];
	$html_grid .= "<br>\n";

//	if(( ! isset( $_SESSION['grid_zoom'] )) || ( $_SESSION['grid_zoom'] == "" )) {
//		$html_grid .= "<a href=$php_self?$query_string>\n";
//		$_SESSION['grid_zoom'] = true;
//		$html_grid .= "<img src=\"$path_btn/btn_white.gif\" alt=\"btn_white\" border=0 height=\"20\" width=\"20\" />";
//		$html_grid .= "</a>\n";
//		}
//	else {
//		unset( $_SESSION['grid_zoom'] );
//		$html_grid .= "<a href=$php_self?$query_string>\n";
//		$html_grid .= "<img src=\"$path_btn/btn_black.gif\" alt=\"btn_white\" border=0 height=\"20\" width=\"20\" />";
//		$html_grid .= "</a>\n";
//		}

	if(( ! isset( $_SESSION['grid_zoom'] )) || ( $_SESSION['grid_zoom'] == "" )) {
		$zoom_options = array( "db", "grid", "fp", "zoom", "" );
		$html_grid .= "<hr>\n";
		$html_grid .= pdo_grid( $zoom_options );
		$html_grid .= "<hr>\n";
		$html_foot = html_footer($options);
		}





//	return;
	if( $url_zmcode == "" ) {

//		print( "BUGS_3938 zmcode=[$zmcode] zmtype=[$zmtype] o1=[$options[1]] o2=[$options[2]]<br>\n" );
		if( $_SESSION['hs_type'] ) { $zmtype=$_SESSION['hs_type']; } else { $zmtype="none"; $_SESSION['hs_type'] = "none"; }

		$zoomxml_options = array( "db", "grid", "fp", "zoomxml", "$url_zmcode", "$url_zmtype" );
		switch( true ) {
			case( $url_zmtype == "all" ):
				$zoomxml_options = array( "db", "grid", "fp", "zoomxml", "all", "$url_zmtype" );
//				$html_grid2 .= "BUGS_4270 leds_zoom ALL: url_zmcode=[$url_zmcode] url_zmtype=[$url_zmtype]<br>\n";
				$html_grid2 .= pdo_grid( $zoomxml_options );
				$html_grid2 .= "\n";
				break;
			case( $url_zmtype == "grid" ):
//				$html_grid2 .= "BUGS_4275 leds_zoom GRID:  url_zmcode=[$url_zmcode] url_zmtype=[$url_zmtype]<br>\n";
				$html_grid2 .= pdo_grid( $zoomxml_options );
				break;
			case( $url_zmtype == "us" ):
//				$html_grid2 .= "BUGS_4280 leds_zoom US:  url_zmcode=[$url_zmcode] url_zmtype=[$url_zmtype]<br>\n";
				$html_grid2 .= pdo_grid( $zoomxml_options );
				break;
			case( $url_zmtype == "hw" ):
//				$html_grid2 .= "BUGS_4285 leds_zoom HW:  url_zmcode=[$url_zmcode] url_zmtype=[$url_zmtype]<br>\n";
				$html_grid2 .= pdo_grid( $zoomxml_options );
				break;
			case( $url_zmtype == "n11" ):
//				$html_grid2 .= "BUGS_4290 leds_zoom 911:  url_zmcode=[$url_zmcode] url_zmtype=[$url_zmtype]<br>\n";
				$html_grid2 .= pdo_grid( $zoomxml_options );
				break;
			default:
//				$html_grid2 .= "BUGS_4295 leds_zoom NONE:  url_zmcode=[$url_zmcode] url_zmtype=[$url_zmtype]<br>\n";
			}


		$html_head = html_header($options);
		$html = $html_head . $html_btn_squares . $html_btn_hotspots . $html_grid . $html_grid2 . $html_foot;
		print( $html );
		return;
		}


	$zoomxml_options = array( "db", "grid", "fp", "zoomxml", "$url_zmcode", "$url_zmtype", "$url_zmrowid" );
//	$html_grid2 .= "BUGS_4307 leds_zoom ALL: url_zmcode=[$url_zmcode] url_zmtype=[$url_zmtype]<br>\n";
	$html_grid2 .= pdo_grid( $zoomxml_options );
	$html_grid2 .= "\n";

///	if( $url_zmcode != "" ) {
///
///		$zoom_options = array( "db", "grid", "fp", "zoom", "" );
///		$output .= pdo_grid( $zoom_options );
///
//		print( "leds_zoom MSG_2695: o1=[$options[1]] o2=[$options[2]] o3=[$options[3]]<br>\n" );
//		leds_zview( $options );
//		return;
///		$zoomcode=$options[1];
///		$pdo = newpdo($GLOBALS['dbfile']);
///		$tblname="zoom";
//		$output = "";
///		$output .= "<html><head><title>fp zoom index</title></head>\n";
///		$output .= "<body bgcolor=lightgray>\n";
///		$output .= "<hr>fp zoom index<hr>\n";
///		$output .= "<hr>\n";
///		$output .= "<a href=$php_self?q=zoom>list</a><br>\n";
///		$output .= "<div class=zoom>\n";
///		$output .= "<table>\n";
///		$sql = "select * from $tblname where code = '$zoomcode'";
//		print( "BUGS2607:  sql=[$sql]<br>\n" );
///		foreach( $pdo->query($sql) as $row ) {
//			$output .= "<a href=$php_self?q=zoom/fp01/grid target=_blank>fp01</a><br>\n";
///			$output .= "<tr><td>";
//			$output .= "<b>".$row['code']."</b>";
//			$output .= "<a href=$php_self?q=zoom/".$row['code'];
//			$output .= "/".$row['width']."/".$row['height'];
//			$output .= "/".$row['height']."/".$row['nvert']." target=_blank>";
//			$output .= " target=_blank";
//			$output .= ">";
//			$output .= $row['code']."</a></td><td>".$row['city']."</td>";
///			$output .= "<b>".$row['code']."</b><td>".$row['city']."</td>";
///			$output .= "<td>".$row['city']."</td>";
///			$output .= "<td>".$row['bldg']."</td>";
///			$output .= "<td>".$row['loc']."</td>";
///			$output .= "<td>".$row['floor']."</td>";
///			$output .= "<td>".$row['title']."</td>";
///			$output .= "<td>".$row['comment']."</td>";
///
///			$output .= "</tr>\n";
///			}
///
///		$output .= "</table>\n";
///		$output .= "</div>\n";
//////
///		$html_grids = "";
///		$zoomxml_codes= array( 'all', 'grid', 'us', 'hw', 'n11' );
///		foreach( $zoomxml_codes as $zoomxml_code ) {
///			$output .= "<a href=$php_self?q=zoom/".$row['code']."/$zoomxml_code";
//			$output .= "/".$row['width']."/".$row['height'];
//			$output .= "/".$row['height']."/".$row['nvert']." target=_blank>";
//			$output .= " target=_blank";
///			$output .= "> $zoomxml_code </a>";
///			$output .= " &nbsp &nbsp &nbsp ";
///			}
///		$output .= "<hr>\n";
//		print( "$output" );
//		return;
//		return( $output );
///		}
///
///	if(( $options[1] != "" ) & ( $options[2] != "" )) {
///		$output .= "leds_zoom MSG_2756:  o1=$options[1] o2=$options[2]<br>\n";
///		$output .= leds_zoomswf($options);
///		}


///	$zoom_options = array( "db", "grid", "fp", "zoom", "us" );
///	$output .= pdo_grid( $zoom_options );

	
///	$html_grids = "";
//	$zmtype_list = array( "1", "grid", "us", "hw", "n11" );
///	$zmtype_list = array( "us", "hw" );
///	foreach( $zmtype_list as $zmtype ) {
///		$zoomxml_options = array( "db", "grid", "fp", "zoomxml", "$zmcode", "$zmtype" );
///		$html_grids .= pdo_grid( $zoomxml_options );
///		$html_grids .= "\n";
///		}

///	$zoomxml_options = array( "db", "grid", "fp", "zoomxml", "$url_zmcode", "$url_zmtype", "$url_zmrowid" );
///	$html_grid2 .= pdo_grid( $zoomxml_options );



// screenshot rollover

	$path_fpb = "./imgs/fpb";
	$fpnam = $row['led_name'];                                  
	$fpbnam = str_replace( "fp", "fpb", $fpnam );               
	$fpbimg = "$path_fpb/" . $fpbnam . ".png";                  
	$fpb_title = $row['led_name'] . "(";                        
	$fpb_title .= $row['led_title'] .") bldg(";              
	$fpb_title .= $row['led_bldg'] .") floor(";                             
	$fpb_title .= $row['led_floor'].")";                                    
                                                                                        




	$zoom_file = "$url_zmcode";
	$zoom_path = $zoompath;
//	$zoom_xml = sprintf( "%s_%s_%s_hotspots.xml", $url_zmcode, $url_zmtype, $url_zmrowid );
	$zoom_xml = sprintf( "$php_self?q=zoomxml/%s/%s/%s", $url_zmcode, $url_zmtype, $url_zmrowid );
///	$zoom_xml = sprintf( "$php_self?q=zoomxml/%s/%s/%s class=\"screenshot\" rel=\"%s\" title=\"%s\"", 
///		$url_zmcode, $url_zmtype, $url_zmrowid, $fpbimg, $fpb_title );
	$html_zviewer = html_zviewer( $zoom_file, $zoom_path, $zoom_xml );

	$html_zoom_detail = html_zoom_detail($options);


	$html_head = html_header($options);
	$html_links = html_links($options);
	$html_foot = html_footer($options);
//	$html = $html_head . $html_links . $html_grid . $html_grids . $html_foot;


	$html_head = html_header($options);
	$html  = $html_head . $html_btn_squares . $html_btn_hotspots;
	$html .= $html_zoom_detail;
//	$html .= $html_zoom_detail . $html_zviewer;

//	$html .= "<div id=\"toggle\" class=\"layer1\">\n";
//	$html .= "	<p class=\"heading\">toggle</p>\n";
//	$html .= "	<div class=\"content\">\n";
//	$html .= "a b c d e f g h i j k l m n o p q r s t r v w z y z<br>\n";
//	$html .= "		</div></div>\n";

	$html .= $html_grid . $html_grid2;
	$html .= $html_footer;

	print( $html );
	return;
	}

function leds_zoomswf( $options ) {
//	$xmlfile="$file"."_".$hscode."_hotspots.xml";
	$http_host=$_SERVER['HTTP_HOST'];
	$php_self=$_SERVER['PHP_SELF'];

//	$hs_type = $_SESSION['hs_type'];
//	$org_type = $_SESSION['org_type'];


	$zoompath="./media/zoom/";

	$zoomcode=$options[1];
	$zoomxml_code="$options[2]";

	$zoomfile = "$zoompath/$zoomcode";
	
	if(( $zoomxml_code == "" ) || ( $zoomxml_code == "all" )) { 
		$zoomxml_file="$zoomcode"."_hotspots.xml"; 
		}
	else {
		$zoomxml_file="$zoomcode"."_".$zoomxml_code."_hotspots.xml"; 
		}

	$zoom_xmlurl="http://$http_host$php_self?q=zoomxml/$zoomcode/$zoomxml_code";
	if( file_exists( $zoomxml_file )) {
		$zoom_xmlurl="$zoomxml_file";
		}

	$flashvars = "zoomifyImagePath=$zoompath$zoomcode&zoomifyHotspotsXMLPath=$zoom_xmlurl";


///	$output  ="<html>\n";
//	$output .= "<head>\n";
//	$output .= "<title>leds_zviewer $zoom_path  $zoom_file $zoom_xml</title>";
//	$output .= "<body bgcolor=\"#ffffff\">\n";

//	print( "<hr>\n" );
//	print( "leds_zviewer MSG1985:  file=$file path=$path xml=$xml<hr>\n" );
	$output .= "zoom_file=[<b>$zoom_file</b>] hs_type=[<b>$hs_type</b>]<hr>\n";

	$output .= "<div id=\"zoomswf\" align=\"center\">\n";

	$object  = "<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"\n";
	$object .= "codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0\"\n";
	$object .= "width=\"900\" height=\"500\"\n";
	$object .= "id=\"ZoomifyHotspotViewer\"\n";
//	$object .= "id=\"ZoomifyTourViewer\"\n";
//	$object .= "id=\"zoomifyviewer\"\n";
	$object .= ">\n";

	$object .= "<param name=\"flashvars\"\n";
	$object .= "value=\"$flashvars\">\n";
	$object .= "<param name=\"menu\" value=\"false\">\n";

	$object .= "<param name=\"src\"\n";
	$object .= "value=\"ZoomifyHotspotViewer.swf\">\n";
//	$object .= "value=\"ZoomifyTourViewer.swf\">\n";
//	$object .= "value=\"zoomifyviewer.swf\">\n";
	$object .= "<embed\n";

	$object .= "flashvars=\"$flashvars\"\n";
	$object .= "src=\"ZoomifyHotspotViewer.swf\"\n";
//	$object .= "src=\"ZoomifyTourViewer.swf\"\n";
//	$object .= "src=\"zoomifyviewer.swf\"\n";
	$object .= "menu=\"false\"\n";
	$object .= "pluginspage=\"http://www.adobe.com/go/getflashplayer\"\n";
	$object .= "type=\"application/x-shockwave-flash\"\n";
	$object .= "width=\"900\" height=\"500\"\n";
	$object .= "name=\"ZoomifyHotspotViewer\">\n";
//	$object .= "name=\"ZoomifyTourViewer\">\n";
//	$object .= "name=\"zoomifyviewer\">\n";
	$object .= "</embed>\n";
	$object .= "</object>\n";

	$output .= $object;
	$output .= "</div>\n";

///	$output .= "</body>\n";
///	$output .= "</html>\n";
///	print( "$output\n" );
	return( $output );
	}


function leds_ptobject( $options )  {
	$php_self=$_SERVER['PHP_SELF'];
	$output = "";
	$ptpath="./java/ptviewer";
	$objpath="./media/obj";
//	$panofile="obj.jpg"; $width="640"; $height="480"; $nhor="25"; $nver="1";
	$output = "";

	if( $options[2] == "" ) {
		$pdo = newpdo($GLOBALS['dbfile']);
		$tblname="obj";
		$output = "";
		$output .= "<html><head><title>fp ptobject index</title></head>\n";
		$output .= "<body bgcolor=lightblue>\n";
		$output .= "<hr>fp ptviewer index<hr>\n";
		$output .= "<hr>\n";
		$output .= "<div class=pano>\n";
		$output .= "<table>\n";
		$sql = "select * from $tblname";
		foreach( $pdo->query($sql) as $row ) {
//			$output .= "<a href=$php_self?q=ptobject/usm_855_100_8_1.jpg/855/100/8/1 target=_blank>usm_100</a><br>\n";
			$output .= "<tr><td>";
//			$output .= "<a href=$php_self?q=ptobject/obj_templet.gif/600/300/nhor/nver target=_blank>pano_templet</a><br>\n";
			$output .= "<a href=$php_self?q=ptobject/".$row['filename'];
			$output .= "/".$row['width']."/".$row['height'];
			$output .= "/".$row['nhor']."/".$row['nvert']." target=_blank>";
			$output .= $row['filename']."</a></td><td>".$row['title']."</td></tr>\n";
			}

		$output .= "</table>\n";
		$output .= "</div>\n";
		$output .= "<hr>\n";
//		$output .= "</body></html>\n";
//		print( "$output" );
//		return;
		return( $output );
		}



	$ptpath="./java/ptviewer";
	$objectpath="./media/obj";
	$objectfile="obj.jpg"; $width="640"; $height="480"; $nhor="25"; $nver="1";
	$objectfile=$options[1];
	$full_width=$options[2];
	$full_height=$options[3];
	$nhor=$options[4];
	$nver=$options[5];
	if( $nver == "" ) { $nver="1"; }
	$width = round($full_width / $nhor);
	$height = round($full_height / $nver);
	$objectpathfile = "$objectpath/$objectfile";

///	$output .= "<html><head><title>fp ptobject detail $objectfile $width $height $nhor $nver</title></head>\n";
///	$output .= "<body bgcolor=lightblue>\n";
	$output .= "<hr>fp ptobject detail $objectfile $width $height $nhor $nver<hr>\n";
	$output .= "<div id=\"ptobject\">\n";
	
	$output .= "<applet archive=$ptpath/ptviewer.jar  \n";
	$output .= "code=ptviewer.class width=$width height=$height name=ptviewer>\n";
	$output .= "<param name=applet0 value=\"{code=ptobject.class} {file=$objectpathfile} {nhor=$nhor} {nver=$nver}\">\n";
	$output .= "<param name=inits value=\"ptviewer:startApplet(0)\">\n";
	$output .= "</applet>\n";
	$output .= "</div>\n";
//.	$output .= "<hr>\n";
//	$output .= "</body></html>\n";
	return( $output );
	}


function leds_zview( $options ) {
//	$xmlfile="$file"."_".$hscode."_hotspots.xml";
	$http_host=$_SERVER['HTTP_HOST'];
	$php_self=$_SERVER['PHP_SELF'];

	$hs_type = $_SESSION['hs_type'];
	$org_type = $_SESSION['org_type'];


	$zoom_path="./media/zoom/";
	$zoom_file=$options[1];
	$zoomcode=$options[1];
	$zoom_xml="$options[2]";

	$zoom_xml_args = split( "_", $zoom_xml );
	$zmcode = $zoom_xml_args[0];
	$zmtype = $zoom_xml_args[1];
	$zmrowid = $zoom_xml_args[2];

//	$output .= "leds_zview_4651:  zoomcode=[$zoomcode] zoom_xml=[$zoom_xml]<br>\n";
//	$output .= "leds_zview_4652:  zmcode=[$zmcode] zmtype=[$zmtype] zmrowid=[$zmrowid]<br>\n";
///	if( $zoom_xml != "" ) { 
///		if( $hs_type != "" ) {
///			$zoom_xml="$zoom_file"."_".$hs_type."_hotspots.xml"; 
///			}
///		else {
///			$zoom_xml="$zoom_file"."_hotspots.xml"; 
///			}
///		}
//	$zoom_xmlurl=$zoom_xml;
//	$zoom_xmlurl="http://$http_host$php_self?q=zview_xml/$zoom_xml";
//	$zoom_xmlurl="http://$http_host$php_self?q=zoomxml/$zoomcode/$hs_type";
///	$zoom_xmlurl="http://$http_host$php_self?q=zviewxml/$zoomcode/$hs_type";
	$zoom_xmlurl="http://$http_host$php_self?q=zviewxml/$zmcode/$zmtype/$zmrowid";
	$file=$zoom_file; $path=$zoom_path; $xml=$zoom_xml;
	$flashvars = "\"zoomifyImagePath=$path$file&zoomifyHotspotsXMLPath=$zoom_xmlurl\"";

//	print( "leds_zview MSG:  zoom_file=$zoom_file zoom_path=$zoom_path<br>\n" );
//	print( "leds_zview MSG:  zoom_xml=$zoom_xml<br>\n" );
//	print( "leds_zview MSG:  zoom_xmlurl=$zoom_xmlurl<br>\n" );
//	print( "leds_zview MSG:  flashvars=[$flashvars]<br>\n" );
//	print( "leds_zview MSG2638: zoom_file=[zoom_file] hs_type=[$hs_type]<br>\n" );

//	return;
//	$flashvars = leds_zview_xmltext() {
	$flashvars = "zoomifyImagePath=$path$file&zoomifyHotspotsXMLPath=$zoom_xmlurl";


//	$output .= "leds_zview_4670:  zoomcode=[$zoomcode] zoom_xml=[$zoom_xml]<br>\n";

///	$output  ="<html>\n";
///	$output .= "<head>\n";
///	$output .= "<title>leds_zviewer $zoom_path  $zoom_file $zoom_xml</title>";
///	$output .= "<body bgcolor=\"#ffffff\">\n";

	$output .= html_btn_squares( $options, "" );
//	print( "<hr>\n" );
//	print( "leds_zviewer MSG1985:  file=$file path=$path xml=$xml<hr>\n" );
	$output .= "zoom_file=[<b>$zoom_file</b>] hs_type=[<b>$hs_type</b>]<hr>\n";

	$output .= "<div id=\"leds_zview\" align=\"center\">\n";

	$object  = "<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"\n";
	$object .= "codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0\"\n";
	$object .= "width=\"900\" height=\"500\"\n";
	$object .= "id=\"ZoomifyHotspotViewer\"\n";
//	$object .= "id=\"ZoomifyTourViewer\"\n";
//	$object .= "id=\"zoomifyviewer\"\n";
	$object .= ">\n";

	$object .= "<param name=\"flashvars\"\n";
//	$object .= "value=\"zoomifyImagePath=$path$file&zoomifyHotspotsXMLPath=$zoom_xmlurl\">\n";
	$object .= "value=\"$flashvars\">\n";
	$object .= "<param name=\"menu\" value=\"false\">\n";

	$object .= "<param name=\"src\"\n";
	$object .= "value=\"ZoomifyHotspotViewer.swf\">\n";
//	$object .= "value=\"ZoomifyTourViewer.swf\">\n";
//	$object .= "value=\"zoomifyviewer.swf\">\n";
	$object .= "<embed\n";

//	$object .= "flashvars=\"zoomifyImagePath=$path$file&zoomifyHotspotsXMLPath=$zoom_xmlurl\"\n";
	$object .= "flashvars=\"$flashvars\"\n";
	$object .= "src=\"ZoomifyHotspotViewer.swf\"\n";
//	$object .= "src=\"ZoomifyTourViewer.swf\"\n";
//	$object .= "src=\"zoomifyviewer.swf\"\n";
	$object .= "menu=\"false\"\n";
	$object .= "pluginspage=\"http://www.adobe.com/go/getflashplayer\"\n";
	$object .= "type=\"application/x-shockwave-flash\"\n";
	$object .= "width=\"900\" height=\"500\"\n";
	$object .= "name=\"ZoomifyHotspotViewer\">\n";
//	$object .= "name=\"ZoomifyTourViewer\">\n";
//	$object .= "name=\"zoomifyviewer\">\n";
	$object .= "</embed>\n";
	$object .= "</object>\n";

	$output .= $object;
	$output .= "</div>\n";

	$http_host=$_SERVER['HTTP_HOST'];
	$output .= "<hr>\n";
	$output .= "<div id=\"brainmap\">\n";
	$output .= "<a href=http://$http_host/hrc/fp/java/brainmap/ajax-viewer.html";
	$output .= "?path=http://$http_host/hrc/fp/media/zoom/$zoomcode/&height=6600&width=10200 target=_blank>\n";
	$output .= "	<img src=media/zoom/$zoomcode/TileGroup0/0-0-0.jpg border=0>\n";
	$output .= "	</a>\n";
	$output .= "	<br>&nbsp &nbsp &nbsp <font size=2>brainmap viewer</font><br>\n";
	$output .= "	</div>\n";
	$output .= "<hr>\n";

//	phpinfo();
///	$output .= "</body>\n";
///	$output .= "</html>\n";
///	print( "$output\n" );
	return( $output );
	}

function leds_zview_xml( $options ) {
	$php_self=$_SERVER['PHP_SELF'];
	$http_host=$_SERVER['HTTP_HOST'];
	$document_root=$_SERVER['DOCUMENT_ROOT'];
	$xmlfile=$options[1];
	$xmlfile_args=split( "_", $xmlfile );
	$fp = $xmlfile_args[0];
	$fp_hs = $xmlfile_args[0];
	$output = "";
//	print_r( $options );
	$xmlpathfile="$document_root/$options[1]";

//	if( file_exists( $xmlfilepath )) {
//		print( "leds_zview_xml XML: FOUND  xmlpathfile=[$xmlpathfile]<br>\n" );
//		}
//	else {
//		print( "leds_zview_xml XML: NOTFOUND  xmlpathfile=[$xmlpathfile]<br>\n" );
//		}

////	$xml = leds_zoomxml( $options );
////	print( "BUGS2760 leds_zview_xml<hr>\n" );
////	print( $xml );
////	return;

	if( file_exists( $xmlfile )) {
//		$xmldata=array();
//		$xmldata = file_get_contents( $xmlfile );
//		$xmldata = file( $xmlfile, FILE_BINARY );
		$xmldata = file( $xmlfile, FILE_TEXT );

		foreach( $xmldata as $xmlline ) {
			$output .= "$xmlline\n";
//			print( "$xmlline\n" );
			}
//		print_r( $xmldata );
//		print( "xmldata=[<hr>$xmldata<hr>]\n" );
		return( $output );
		}	
	else {
//		$xmldata = leds_zview_xmltext();
		$xmldata = leds_zview_xmlnew( $options );
		$output .= $xmldata;
		return( $output );
///		print( $xmldata );
		}
	}

function leds_zview_details( $options ) {
	$fp=$options[1];
	$fp_hs=$options[2];
	leds_show($options );
	$output = "<hr>zview_details $options[1] $option[2]<hr>\n";
	print( $output );
	print_r($options);
	return;
	}

function leds_zview_xmltext() {
	$document_root = $_SERVER['DOCUMENT_ROOT'];
	$http_host = $_SERVER['HTTP_HOST'];
	$php_self = $_SERVER['PHP_SELF'];

	$xml = "<DATA>\n";
	$xml .= "	<HOTSPOTSETUP\n";
	$xml .= "		AUTOLOOP=\"0\"\n";
	$xml .= "		CHOICELIST=\"2\"\n";
	$xml .= "		LISTSOURCE=\"caption\"\n";
	$xml .= "		INITIALVISIBILITY=\"1\"\n";
	$xml .= "		MINSCALE=\"0.15\"\n";
	$xml .= "		MAXSCALE=\"2\"\n";
	$xml .= "	/>\n";

	$id=1;
	$x="7000";
	$y="6500";
	$zoom="0";
	$caption="$id. caption text";
	
		$mediatype="url";
		$media="./hrcstl_050.png";
		$url = "http://$php_self?q=zlink";
		$url = "http://google.com";
		$urltarget="_blank";
		$interval="2000";
		$duration="500";
		$transition="ZoomToView";

		$xml .= "	<HOTSPOT\n";
		$xml .= "		ID=\"$id\"\n";
		$xml .= "		X=\"$x\"\n";
		$xml .= "		Y=\"$y\"\n";
		$xml .= "		ZOOM=\"$zoom\"\n";
		$xml .= "		CAPTION=\"$caption\"\n";
		$xml .= "		MEDIATYPE=\"$mediatype\"\n";
		$xml .= "		MEDIA=\"$media\"\n";
		$xml .= "		URL=\"$url\"\n";
		$xml .= "		URLTARGET=\"$urltarget\"\n";
		$xml .= "		INTERVAL=\"$interval\"\n";
		$xml .= "		TRANSITION=\"$transition\"\n";
		$xml .= "		DURATION=\"$duration\">\n";
		$xml .= "	</HOTSPOT>\n";

	$xml .= "</DATA>\n";
	return( $xml );
	}	
function leds_zview_xmlnew( $options ) {
	$http_host=$_SERVER['HTTP_HOST'];
	$php_self=$_SERVER['PHP_SELF'];
	$document_root=$_SERVER['DOCUMENT_ROOT'];
	$dttm=date("Ymd_His");

	$xmlfile=$options[1];
	$xmlfile_args=split( "_", $xmlfile );
	$fp = $xmlfile_args[0];
	$fp_hs = $xmlfile_args[0];

	$fp_xmlfile=$options[1];
	$fp_xmlfile_args=split( "_", $fp_xmlfile );
	$fp=$fp_xmlfile_args[0];
	$fp_hs=$fp_xmlfile_args[1];

	$path_btn="./imgs/btn";
	if( $fp_hs != "" ) {
		$path_btn_hs="$path_btn/btn_".$fp_hs.".gif";
		}
	else {
		$path_btn_hs="$path_btn/btn_hrcstl.png";
		}

	$xml = leds_zoomxml( $options );
	print( $xml );
	return;

	$xml = "<DATA>\n";
	$xml .= "	<HOTSPOTSETUP\n";
	$xml .= "		AUTOLOOP=\"0\"\n";
	$xml .= "		CHOICELIST=\"2\"\n";
	$xml .= "		LISTSOURCE=\"CAPTION\"\n";
	$xml .= "		INITIALVISIBILITY=\"1\"\n";
	$xml .= "		MINSCALE=\"0.15\"\n";
	$xml .= "		MAXSCALE=\"2\"\n";
	$xml .= "	/>\n";


	$xml .= "	<HOTSPOT\n";
	$xml .= "		ID=\"1\"\n";
	$xml .= "		MEDIATYPE=\"url\"\n";
	$xml .= "		MEDIA=\"$path_btn/btn_hrcstl.png\"\n";
//	$xml .= "		URL=\"http://google.com\"\n";
	$xml .= "		URL=\"$php_self?q=zview_details/$fp/$fp_hs/1\"\n";
	$xml .= "		URLTARGET=\"_blank\"\n";
	$xml .= "		X=\"1000\"\n";
	$xml .= "		Y=\"1000\"\n";
	$xml .= "		ZOOM=\"0\"\n";
	$xml .= "		CAPTION=\"1: ".$fp."_hotspots.xml - overview $fp_hs (10,10) $dttm\"\n";
	$xml .= "		INTERVAL=\"2000\"\n";
	$xml .= "		TRANSITION=\"ZoomToView\" \n";
	$xml .= "		DURATION=\"500\" >\n";
	$xml .= "	</HOTSPOT>\n";
	$xml .= "	<HOTSPOT \n";
	$xml .= "		ID=\"2\"\n";
	$xml .= "		MEDIATYPE=\"url\"\n";
	$xml .= "		MEDIA=\"$path_btn_hs\"\n";
//	$xml .= "		URL=\"http://google.com\"\n";
	$xml .= "		URL=\"$php_self?q=zview_details/$fp/$fp_hs/2\"\n";
	$xml .= "		URLTARGET=\"_blank\"\n";
	$xml .= "		X=\"4660\"\n";
	$xml .= "		Y=\"3700\"\n";
	$xml .= "		ZOOM=\"55\" \n";
	$xml .= "		CAPTION=\"2: $fp"."_hotspots.xml - center $fp_hs (47,37) $dttm\"\n";
	$xml .= "		INTERVAL=\"2000\"\n";
	$xml .= "		TRANSITION=\"ZoomToView\" \n";
	$xml .= "		DURATION=\"500\" >\n";
	$xml .= "	</HOTSPOT>\n";
	$xml .= "\n";
	$xml .= "	<HOTSPOT \n";
	$xml .= "		ID=\"3\"\n";
	$xml .= "		MEDIATYPE=\"url\"\n";
	$xml .= "		MEDIA=\"$path_btn_hs\"\n";
//	$xml .= "		URL=\"http://google.com\"\n";
	$xml .= "		URL=\"$php_self?q=zview_details/$fp/$fp_hs/3\"\n";
	$xml .= "		URLTARGET=\"_blank\"\n";
	$xml .= "		X=\"1600\"\n";
	$xml .= "		Y=\"3800\"\n";
	$xml .= "		ZOOM=\"55\" \n";
	$xml .= "		CAPTION=\"3: ".$fp."_hotspots.xml - center left $fp_hs (10,38) $dttm\"\n";
	$xml .= "		INTERVAL=\"2000\"\n";
	$xml .= "		TRANSITION=\"ZoomToView\" \n";
	$xml .= "		DURATION=\"500\" >\n";
	$xml .= "	</HOTSPOT>\n";
	$xml .= "\n";
	$xml .= "\n";
	$xml .= "	<HOTSPOT \n";
	$xml .= "		ID=\"4\"\n";
	$xml .= "		MEDIATYPE=\"url\"\n";
	$xml .= "		MEDIA=\"$path_btn_hs.gif\"\n";
//	$xml .= "		URL=\"http://google.com\"\n";
	$xml .= "		URL=\"$php_self?q=zview_details/$fp/$fp_hs/4\"\n";
	$xml .= "		URLTARGET=\"_blank\"\n";
	$xml .= "		X=\"7800\"\n";
	$xml .= "		Y=\"3900\"\n";
	$xml .= "		ZOOM=\"55\" \n";
	$xml .= "		CAPTION=\"4: ".$fp."_hotspots.xml - center right $fp_hs (47,38) $dttm\"\n";
	$xml .= "		INTERVAL=\"2000\"\n";
	$xml .= "		TRANSITION=\"ZoomToView\" \n";
	$xml .= "		DURATION=\"500\" >\n";
	$xml .= "	</HOTSPOT>\n";
	$xml .= "\n";
	$xml .= "	<HOTSPOT \n";
	$xml .= "		ID=\"5\"\n";
	$xml .= "		MEDIATYPE=\"url\"\n";
	$xml .= "		MEDIA=\"$path_btn/btn_hrcstl_050.png\"\n";
//	$xml .= "		URL=\"http://google.com\"\n";
	$xml .= "		URL=\"$php_self?q=zview_details/$fp/$fp_hs/5\"\n";
	$xml .= "		URLTARGET=\"_blank\"\n";
	$xml .= "		X=\"9000\"\n";
	$xml .= "		Y=\"5800\"\n";
	$xml .= "		ZOOM=\"30\"\n";
	$xml .= "		CAPTION=\"3: ".$fp."_hotspots.xml - footprint $fp_hs (90,58) $dttm\"\n";
	$xml .= "		INTERVAL=\"2000\"\n";
	$xml .= "		TRANSITION=\"ZoomToView\" \n";
	$xml .= "		DURATION=\"500\" >\n";
	$xml .= "	</HOTSPOT>\n";

	$xml .= "</DATA>\n";
	return( $xml );
	}


function leds_zoomxml( $options ) {
	$http_host=$_SERVER['HTTP_HOST'];
	$php_self=$_SERVER['PHP_SELF'];
	$document_root=$_SERVER['DOCUMENT_ROOT'];
	$dttm=date("Ymd_His");

	$zoom_code=$options[1];
	$zoomxml_code=$options[2];
	$xmlfile="./$zoom_code"."_".$zoomxml_code."_hotspots.xml";


	$output = "";
// use existing xml file
	if( file_exists( $xmlfile )) {
//		$xmldata=array();
//		$xmldata = file_get_contents( $xmlfile );
//		$xmldata = file( $xmlfile, FILE_BINARY );
		$xmldata = file( $xmlfile, FILE_TEXT );

		foreach( $xmldata as $xmlline ) {
			$output .= "$xmlline";
//			print( "$xmlline\n" );
			}
//		print_r( $xmldata );
//		print( "xmldata=[<hr>$xmldata<hr>]\n" );
//		return;
		return( $output );
		}	


//	$xmlfile=$options[1];
//	$xmlfile_args=split( "_", $xmlfile );
//	$fp = $xmlfile_args[0];
//	$fp_hs = $xmlfile_args[0];

//	$fp_xmlfile=$options[1];
//	$fp_xmlfile_args=split( "_", $fp_xmlfile );
//	$fp=$fp_xmlfile_args[0];
//	$fp_hs=$fp_xmlfile_args[1];

	$path_btn="./imgs/btn";
	if( $fp_hs != "" ) {
		$path_btn_hs="$path_btn/btn_".$zoomxml_code.".gif";
		}
	else {
		$path_btn_hs="$path_btn/btn_hrcstl.png";
		}

	$xml = "<DATA>\n";
	$xml .= "	<HOTSPOTSETUP\n";
	$xml .= "		AUTOLOOP=\"0\"\n";
	$xml .= "		CHOICELIST=\"2\"\n";
	$xml .= "		LISTSOURCE=\"CAPTION\"\n";
	$xml .= "		INITIALVISIBILITY=\"1\"\n";
	$xml .= "		MINSCALE=\"0.15\"\n";
	$xml .= "		MAXSCALE=\"2\"\n";
	$xml .= "	/>\n";

	$output = "";
	$output .= "<!-- leds_zoomxml:  BUGS3100 o1=$options[1] o2=$options[2]<br> -->\n";
	$output .= "<!-- leds_zoomxml:  BUGS3101 zoom_code=$zoom_code zoomxml_code=$zoomxml_code zmlfile=$xmlfile<br> -->\n";

	if( ! file_exists( $GLOBALS['dbfile'] )) {
		$output .= "<hr>$php_self $dttm ERR:  UNAVAILABLE dbfile=[".$GLOBALS['dbfile']."]<hr>\n";
		return( $output );
		}

// use xmlfile if it exits
	if( file_exists( $xmlfile )) {
		return( $output );
		}

	$pdo = newpdo($GLOBALS['dbfile']);
	$tblname="zoomxml";
	if( $zoomxml_code != "" ) {
		if( is_numeric($zoomxml_code)) {
			$sql = "select * from $tblname where code == '$zoom_code' and rowid == '$zoomxml_code'";
			}
		else {
			$sql = "select * from $tblname where code == '$zoom_code' and type == '$zoomxml_code'";
			}
//		if( $fp_hs == "hotspots.xml" ) { 
//			$tblname="fp"; 
//			$sql = "select * from $tblname where code == '$fp'";
//			}
//		else {
//			$tblname=$fp_hs; 
//			$sql = "select * from $tblname where code == '$fp'";
//			}
		}
	else {
		$sql = "select * from $tblname where code == '$zoom_code'";
		}


///	if($_GET['id'])  { 
///		$rowid=$_GET['id']; 
///		$sql .= $sql ." and rowid='$rowid' ";
///		}

//	$sql = "select * from $tblname where code == '$fp'";

//	print( "<hr>zivew_xmldb MSG_3128:  fp=[$fp] fp_hs=[$fp_hs] id=[$id]<br>\n" );
	$output .= "<!-- <hr>zoomxml MSG_3129:  sql=[$sql]<hr> -->\n";

	$id=100;
	foreach( $pdo->query($sql) as $row ) {
		$code=$row['code'];
		$x=$row['x'];
		$y=$row['y'];
		$mediatype=$row['mediatype'];
		$media=$row['media'];
		$url=$row['url'];
		$urltarget=$row['urltarget'];
		$zoom=$row['zoom'];
		$zoom="40";
		$caption=$row['caption'];
		$interval=$row['interval'];
		$transition=$row['transition'];
		$duration=$row['duration'];
		$comment=$row['comment'];
//		print( "zoomxml MSG_2985:  x=$x y=$y comment=$comment<br>\n" );

		$xml .= "	<HOTSPOT \n";
		$xml .= "		ID=\"$id\"\n";
		$xml .= "		MEDIATYPE=\"$mediatype\"\n";
		$xml .= "		MEDIA=\"$media\"\n";
		$xml .= "		URL=\"$url\"\n";
//		$xml .= "		URL=\"$php_self?q=zview_details/$fp/$fp_hs/5\"\n";
		$xml .= "		URLTARGET=\"$urltarget\"\n";
		$xml .= "		X=\"$x\"\n";
		$xml .= "		Y=\"$y\"\n";
		$xml .= "		ZOOM=\"$zoom\"\n";
//		$xml .= "		CAPTION=\"3: ".$fp."_".$fp_hs."_hotspots.xml - $comment - $dttm\"\n";
		$xml .= "		CAPTION=\"$caption\"\n";
		$xml .= "		INTERVAL=\"$interval\"\n";
		$xml .= "		TRANSITION=\"$transition\" \n";
		$xml .= "		DURATION=\"$duration\" >\n";
		$xml .= "	</HOTSPOT>\n";
		$id++;
		}
	$pdo=null;
	$xml .= "</DATA>\n";
	$xmltext=str_replace( "<", "(", $xml );
	$xmltext=str_replace( ">", ")<br>", $xmltext );
	print( "$xml\n" );
//	print( "$xmltext\n" );
//	return( $xml );
	}




// pqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpq
// jquiery functions
// bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd
function js_scripts() {
	$http_host=$_SERVER['HTTP_HOST'];
	$php_self=$_SERVER['PHP_SELF'];
	$themes = ""; $theme = "";
	if( isset($GLOBALS['themes'] )) { $themes = $GLOBALS['themes']; }
	if( isset( $_SESSION['theme'] )) { $theme = $_SESSION['theme']; }

// expand collapse toggle
	$output_css  = "<style type=\"text/css\">\n";
//	$output_css .= ".layer1 {margin: 0; padding: 0; width: 600px; }\n";
	$output_css .= ".layer1 {margin: 0; padding: 0;  }\n";
	$output_css .= ".heading { \n";
	$output_css .= "	margin: 1px; color: white; padding: 3px 10px; cursor: pointer;\n";
	$output_css .= "	position: relative; background-color:grey;\n";
	$output_css .= "	}\n";
//	$output_css .= ".content {padding: 5px 10px; background-color:#fafafa;}\n";
	$output_css .= ".content {padding: 5px 10px; background-color:white;}\n";
	$output_css .= "p { padding: 5px 0; }\n";
	$output_css .= "</style>\n";
	$output_css .= "\n";

	$options = "";
	$output_css .= head_jqui_css($options);


	$output_css_jqui_dragdrop  = "";
	$output_css_jqui_dragdrop .= "<style type=\"text/css\"><!--\n";
	$output_css_jqui_dragdrop .= "#drop { width:200px; height:150px; margin:3px auto; background:#eddaa8; font-size:16px;}\n";
	$output_css_jqui_dragdrop .= "#drop #sw { text-decoration:underline; cursor:pointer; }\n";
	$output_css_jqui_dragdrop .= "#drag { width:50px; height:40px; margin:2px auto; border:1px solid silver; font-size:16px;}\n";
	$output_css_jqui_dragdrop .= "#drag .drg { margin:10px 12px; }\n";
	$output_css_jqui_dragdrop .= "#drag div.drg { width:150px; height:50px; background:#07da08; border:2px solid blue;}\n";
	$output_css_jqui_dragdrop .= "--></style>\n";


	$output_css_jqui_resizable = "";
	$output_css_jqui_resizable .= " <style>\n";
	$output_css_jqui_resizable .= " #resizable { width: 150px; height: 150px; padding: 0.5em; }\n";
	$output_css_jqui_resizable .= " #resizable h3 { text-align: center; margin: 0; }\n";
	$output_css_jqui_resizable .= " </style>\n";
	$output_css_jqui_resizable .= " <script>\n";
	$output_css_jqui_resizable .= " $(function() {\n";
	$output_css_jqui_resizable .= " $( \"#resizable\" ).resizable();\n";
	$output_css_jqui_resizable .= " });\n";
	$output_css_jqui_resizable .= " </script>\n";
							


	$js_output = "";
	if( isset( $GLOBALS['js_output'] )) { $js_output = $GLOBALS['js_output']; }


// theme options

	$gridimgpaths['redmond1']="js/themes/redmond_save/images";
	$gridimgpaths['redmond']="js/themes/redmond/images";
	$gridimgpaths['humanity']="js/themes/humanity/images";
	$gridimgpaths['frog']="js/themes/le-frog/images";
	$gridimgpaths['swanky']="js/themes/swanky-purse/images";
	$gridimgpaths['darkness']="js/themes/ui-darkness/images";
	$gridimgpaths['lightness']="js/themes/ui-lightness/images";
	$gridimgpaths['sunny']="js/themes/sunny/images";
	$gridimgpaths['mint']="js/themes/mint-choc/images";

	$themepaths['redmond1']="js/themes/redmond_save/jquery-ui-1.7.1.custom.css";
	$themepaths['redmond']="js/themes/redmond/jquery-ui-1.7.2.custom.css";
	$themepaths['humanity']="js/themes/humanity/jquery-ui-1.7.2.custom.css";
	$themepaths['frog']="js/themes/le-frog/jquery-ui-1.7.2.custom.css";
	$themepaths['swanky']="js/themes/swanky-purse/jquery-ui-1.7.2.custom.css";
	$themepaths['darkness']="js/themes/ui-darkness/jquery-ui-1.7.2.custom.css";
	$themepaths['lightness']="js/themes/ui-lightness/jquery-ui-1.7.2.custom.css";
	$themepaths['sunny']="js/themes/sunny/jquery-ui-1.7.2.custom.css";
	$themepaths['mint']="js/themes/mint-choc/jquery-ui-1.7.2.custom.css";

	$themepath="";
	if( isset( $themepaths[$theme])) { $themepath=$themepaths[$theme]; }
	$gridimgpath="";
	if( isset( $gridimgpaths[$theme] )) { $gridimgpath=$gridimgpaths[$theme]; }


	$_SESSION['gridimgpath']=$gridimgpath;

//		"js/jqgrid.3.5.3/themes/ui.jqgrid.css"
	$jq_css_includes_list = array( 
		"js/fg-menu/fg.menu.css",
		"js/fg-menu/theme/ui.all.css",
		"$themepath",
		"js/jqgrid-4.4.0/themes/ui.jqgrid.css"
		);

	foreach( $jq_css_includes_list as $jq_css_include ) {
		$output = "";
		if(! file_exists( $jq_css_include )) {
			$html_theme_links = "<!-- pdo_grid ERR_2435:  NOTFOUND jq_css_include=[$jq_css_include]<br>-->\n";
			}
		else {
			$output .= "<link rel=\"stylesheet\" type=\"text/css\" media=\"screen\" href=\"$jq_css_include\" />\n";
			}
		}
//	$output .= "\n";

	$jq_includes_list = array( 
//		"js/jquery-1.3.2.js",
//		"js/jqgrid.3.5.3/js/jquery-1.3.2.min.js",
//		"js/jqgrid-4.4.0/js/jquery-1.7.2.min.js",
//		"js/jqgrid-4.4.0/js/jquery-1.7.2.min.js",
//		"js/jquery-ui-1.7.2/js/jquery-ui-1.7.2.custom.min.js",
		"js/jquery-1.8.3.js",
		"js/jquery-ui-1.9.2.custom.js",
//		"js/jquery.ui.touch-punch.js",

		"js/jqgrid-4.4.0/js/i18n/grid.locale-en.js",
		"js/jqgrid-4.4.0/js/jquery.jqGrid.min.js",
//		"js/jqgrid.3.5.3/js/i18n/grid.locale-en.js",
//		"js/jqgrid.3.5.3/js/jquery.jqGrid.min.js",


		"js/tooltip/tooltip_main_screenshot.js",
//		"js/tooltip/tooltip_main_tooltip.js",
//		"js/tooltip/tooltip_main_preview.js",
		);
	foreach( $jq_includes_list as $jq_include ) {
		if(! file_exists( $jq_include )) {
			$output .= "<!-- pdo_grid ERR_2455:  NOTFOUND jq_include=[$jq_include]<br> -->\n";
			}
		else {
			$output .= "<script src=\"$jq_include\" type=\"text/javascript\"></script>\n";
			}
		}

	$output .= "\n";
	$output .= $output_css;
//	$output .= $output_css_jqui_dragdrop;
//	$output .= $output_css_jqui_resizable;
	$output .= "\n";

	$output .= "\n";
	$output .= "<script type=\"text/javascript\"><!--\n";

	$output .= "var gridimgpath = '$gridimgpath';\n";
	$output .= "$(document).ready(function(){\n";


/////	$output_dragdrop1 = jqui("dragdrop1");
////	$output_dragdrop2 = jqui("dragdrop2");
////	$output_dragdrop2 = "--></script>\n";

////	printf( "BUGS_13774: output=$output output_dragdrop1=$output_dragdrop1 <br>\n" );
////	printf( "BUGS_13774: output=$output output_dragdrop2=$output_dragdrop2 <br>\n" );
////	printf( "BUGS_13775: output=$output<br>\n" );
////	return;
////	$output .= "	jQuery().ready(function(){\n";

	$output .= $js_output;
////	$output_dragdrop = jqui("dragdrop");
////	$output .= $output_dragdrop;

////	$output .= "jQuery(document).ready(function(){\n";
////	$output .= "		jQuery(\".content\").hide();\n";
////	$output .= "		jQuery(\".heading\").click(function() {\n";
////	$output .= "			jQuery(this).next(\".content\").slideToggle(500);\n";
////	$output .= "			});\n";
////	$output .= "		});\n";
////	$output .= "	});\n";


	$output .= jqui_script($options);

//	$output .= "--></script>\n";
	$output .= "</script>\n";
////	$output .= "</script>\n";
	$output .= "<!-- BUGS_13800 testjk --->\n";

//	$output .= "\n";
//	$output .= $html_theme_links;
//	$output .= "\n";

////	if( $options[0] == "fgmenu_htm" ) {
////		$output .= fgmenu_js( $options );
////		}
////	if( $options[0] == "fgmenu_dyn" ) {
////		$output .= fgmenu_js( $options );
////		}
	return( $output );
	}


function head_jqui_css($options) {
	$output = "";
	$output .= "<style>\n";
	$output .= "#ko { \n";
//	$output .= "	background-image: url(images/ko/ko_100.png); \n";
	$output .= "	width: 90px; \n";
	$output .= "	height: 25px; \n";
	$output .= "	padding: 0.5em; \n";
	$output .= "	float: left; \n";
	$output .= "	margin: 10px 10px 10px 0; \n";
	$output .= "	}\n"; 
	$output .= "#ko_drag { \n"; 
	$output .= "	background-color:white; \n";
//	$output .= "	background-image: url(images/ko/kob.png); \n";
	$output .= "	width: 90px; \n";
	$output .= "	height: 25px; \n";
	$output .= "	float: left; \n";
	$output .= "	padding: 0.5em; \n";
	$output .= "	margin: 10px 10px 10px 0; \n";
	$output .= "	}\n";
	$output .= "#ko_drop { \n";
	$output .= "	background-color:white; \n";
//	$output .= "	background-image: url(images/ko/kiw.png); \n";
	$output .= "	width: 90px; \n";
	$output .= "	height: 20px; \n";
	$output .= "	padding: 0.5em; \n";
	$output .= "	float: left; \n";
	$output .= "	margin: 10px 10px 10px 0; \n";
	$output .= "	}\n"; 
	$output .= "#ko_dragdrop { \n"; 
//	$output .= "	background-color:black; \n";
//	$output .= "	background-image: url(images/ko/kib.png); \n";
	$output .= "	width: 90; \n";
	$output .= "	height: 25; \n";
	$output .= "	padding: 0.5em; \n";
	$output .= "	float: left; \n";
	$output .= "	margin: 10px 10px 10px 0; \n";
	$output .= "	}\n";
	$output .= "#ko_dropdrag { \n";
	$output .= "	background-color:white; \n";
//	$output .= "	background-image: url(images/ko/kiw.png); \n";
	$output .= "	width: 90; \n";
	$output .= "	height: 25; \n";
	$output .= "	padding: 0.5em; \n";
	$output .= "	float: left; \n";
	$output .= "	margin: 10px 10px 10px 0; \n";
	$output .= "	}\n";
	$output .= "</style>\n";
	return($output);
	}

function jqui_script($options) {
	$output = "";
//	$output .= "<script>	\n";
//	$output .= "	$(function() {\n";
	$output .= "	$(\"#ko\").draggable().droppable().resizable();\n";
	$output .= "	$(\"#ko_drag\").draggable();\n";
	$output .= "	$(\"#ko_drop\").droppable();\n";
	$output .= "	$(\"#ko_dragdrop\").draggable().droppable();\n";
	$output .= "	$(\"#ko_dropdrag\").droppable().draggable();\n";
	$output .= "	$( \"#ko\" ).droppable({\n";
	$output .= "		drop: function( event, ui ) {\n";
	$output .= "			var draggable_id = $(ui.draggable).attr('id');\n";
	$output .= "			var droppable_id = $(this).attr('id');\n";
	$output .= "			var url= \"https://ka6/ka1/ka1.php?q=jqui/ko/\"+ droppable_id + \"/\"+ draggable_id;\n";
	$output .= "//			alert( \"droppaable: \" + draggable_id + \" drop=\" + droppable_id );\n";
	$output .= "			alert( \"ko: \" + url );\n";
	$output .= "//			window.location = \"url\";\n";
	$output .= "			}\n";
	$output .= "		});\n";
	$output .= " 	$( \"#ko_drag\" ).droppable({\n";
	$output .= "   		drop: function( event, ui ) {\n";
	$output .= "			var draggable_id = $(ui.draggable).attr('id');\n";
	$output .= "			var droppable_id = $(this).attr('id');\n";
	$output .= "			var url= \"https://ka6/ka1/ka1.php?q=jqui/ko_drag/\"+ droppable_id + \"/\"+ draggable_id;\n";
	$output .= "//			alert( \"droppaable: \" + draggable_id + \" drop=\" + droppable_id );\n";
	$output .= "			alert( \"ko_drag: \" + url );\n";
	$output .= "//			window.location = \"url\";\n";
	$output .= "			}\n";
	$output .= "		});\n";
	$output .= " 	$( \"#ko_drop\" ).droppable({\n";
	$output .= "   		drop: function( event, ui ) {\n";
	$output .= "			var draggable_id = $(ui.draggable).attr('id');\n";
	$output .= "			var droppable_id = $(this).attr('id');\n";
	$output .= "			var url= \"https://ka6/ka1/ka1.php?q=jqui/ko_drop/\"+ droppable_id + \"/\"+ draggable_id;\n";
	$output .= "//			alert( \"droppaable: \" + draggable_id + \" drop=\" + droppable_id );\n";
	$output .= "			alert( \"ko_drop: \" + url );\n";
	$output .= "//			window.location = \"url\";\n";
	$output .= "			}\n";
	$output .= "		});\n";
	$output .= " 	$( \"#ko_dragdrop\" ).droppable({\n";
	$output .= "   		drop: function( event, ui ) {\n";
	$output .= "			var draggable_id = $(ui.draggable).attr('id');\n";
	$output .= "			var droppable_id = $(this).attr('id');\n";
	$output .= "			var url= \"https://ka6/ka1/ka1.php?q=jqui/ko_drop/\"+ droppable_id + \"/\"+ draggable_id;\n";
	$output .= "//			alert( \"droppaable: \" + draggable_id + \" drop=\" + droppable_id );\n";
	$output .= "			alert( \"ko_dragdrop: \" + url );\n";
	$output .= "//			window.location = \"url\";\n";
	$output .= "			}\n";
	$output .= "		});\n";
	$output .= " 	$( \"#ko_dropdrag\" ).droppable({\n";
	$output .= "   		drop: function( event, ui ) {\n";
	$output .= "			var draggable_id = $(ui.draggable).attr('id');\n";
	$output .= "			var droppable_id = $(this).attr('id');\n";
	$output .= "			var url= \"https://ka6/ka1/ka1.php?q=jqui/ko_drop/\"+ droppable_id + \"/\"+ draggable_id;\n";
	$output .= "//			alert( \"droppaable: \" + draggable_id + \" drop=\" + droppable_id );\n";
	$output .= "			alert( \"drop: \" + url );\n";
	$output .= "//			window.location = \"url\";\n";
	$output .= "			}\n";
	$output .= "		});\n";
	$output .= " 	});\n";
//	$output .= "</script>\n";
	$output .= "\n";
	return( $output );
	}
	

function js_rollover( $options ) {
	$output .= "<p><ul id=\"navigation\">\n";
	$output .= "	<li><a href=\"#1\"><img src=\"./imgs/btn/btn_black.gif\" border=\"0\"/></a></li>\n";
	$output .= "	<li><a href=\"#2\"><img src=\"./imgs/btn/btn_black.gif\" border=\"0\"/></a></li>\n";
	$output .= "	<li><a href=\"#3\"><img src=\"./imgs/btn/btn_black.gif\" border=\"0\"/></a></li>\n";
	$output .= "	<li><a href=\"#4\"><img src=\"./imgs/btn/btn_black.gif\" border=\"0\"/></a></li>\n";
	$output .= "	<li><a href=\"#5\"><img src=\"./imgs/btn/btn_black.gif\" border=\"0\"/></a></li>\n";
	$output .= "	</ul></p>\n";
	$output .= "\n";
	print( "$output" );
	}
function css_rollovers_head( $options ) {
	$output  = "<style media=\"screen_blobs\">\n";
	$output .= "\n";
	$output .= "#blobs {\n";
	$output .= " width: 300px;\n";
	$output .= " height: 150px;\n";
	$output .= " background: url(./imgs/icons/blobs.gif);\n";
	$output .= " margin: 10px auto; padding: 0;\n";
	$output .= " position: relative;\n";
	$output .= "}\n";
	$output .= "#blobs li {margin: 0; padding: 0; list-style: none; display: block; position: absolute;}\n";
	$output .= "\n";
	$output .= "#blobs a {display: block;}\n";
	$output .= "\n";
	$output .= "#blob1 {left: 9px; top: 7px; width: 86px; height: 130px;}\n";
	$output .= "#blob2 {left: 77px; top: 16px; width: 79px; height: 86px;}\n";
	$output .= "#blob3 {left: 160px; top: 0px; width: 112px; height: 77px;}\n";
	$output .= "#blob4 {left: 173px; top: 57px; width: 120px; height: 80px;}\n";
	$output .= "#blob5 {left: 110px; top: 102px; width: 98px; height: 45px;}\n";
	$output .= "#blob1 a {height: 130px;}\n";
	$output .= "#blob2 a {height: 86px;}\n";
	$output .= "#blob3 a {height: 77px;}\n";
	$output .= "#blob4 a {height: 80px;}\n";
	$output .= "#blob5 a {height: 45px;}\n";
	$output .= "\n";
	$output .= "#blob1 a:hover {background: url(./imgs/icons/blobs.gif) -10px -307px no-repeat;}\n";
	$output .= "#blob2 a:hover {background: url(./imgs/icons/blobs.gif) -77px -166px no-repeat;}\n";
	$output .= "#blob3 a:hover {background: url(./imgs/icons/blobs.gif) -160px -300px no-repeat;}\n";
	$output .= "#blob4 a:hover {background: url(./imgs/icons/blobs.gif) -173px -207px no-repeat;}\n";
	$output .= "#blob5 a:hover {background: url(./imgs/icons/blobs.gif) -110px -402px no-repeat;}\n";
	$output .= "\n";
	$output .= " </style>\n";
	$output .= "\n";
	return( $output );
//	print( "$output" );
	}
function css_rollovers_href( $options ) {
	$output .= "<div id=\"screen_blobs\">\n";
	$output .= " <ul id=\"blobs\">\n";
	$output .= "  <li id=\"blob1\"><a href=\"#1\"></a></li>\n";
	$output .= "  <li id=\"blob2\"><a href=\"#2\"></a></li>\n";
	$output .= "  <li id=\"blob3\"><a href=\"#3\"></a></li>\n";
	$output .= "  <li id=\"blob4\"><a href=\"#4\"></a></li>\n";
	$output .= "  <li id=\"blob5\"><a href=\"#5\"></a></li>\n";
	$output .= " </ul>\n";
	$output .= " </div>\n";
	$output .= "\n";
	return( $output );
//	print( "$output" );
	}

// pqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpq
// todo snippets
// bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd
// Example 602. Dump message structure
// php_self?q=mail
function ko_imap($options) {
	
	$host="localhost"; $user="user"; $pass="pass";
	if( $options[1] != "" ) { $mode=$options[1]; }
	if( $options[2] != "" ) { $host=$options[2]; }
	if( $options[3] != "" ) { $user=$options[3]; }
	if( $options[4] != "" ) { $pass=$options[4]; }
	$message=1;
	if( $_GET['message'] ) { $message=$_GET['message']; }

	print( "<hr>ko_imap message=$message<br>\n" );
	print_r($options);
	$mailmodes = array( 'status', 'ping', 'info', 'listmailbox', 'attachments', 'struct', 'nummsg' );
	if( $mode == "" ) {
		$output  = "";
		foreach( $mailmodes as $mailmode ) {
			$output .= "<a href=\"$php_self?q=mail/$mailmode\" target=_blank>$mailmode</a><br>\n";
			}
		print( $output );
		return;
		}

	$imap = imap_open("{$host}INBOX","$user","$pass");
//	$imap = imap_open("{$host:110/pop3}INBOX", $user, $pass);
//	$imap = imap_open("{imap.mycompany.com:993/imap/ssl}INBOX", $user, $pass);

	if (!$imap) { print_r(imap_errors());
		return;	
		}


	if( $mode == "ping" ) {
		if (imap_ping($imap)) {
			echo "ko_imap MSG: ping $host $user<br>";
			}
		else {
			echo "ko_imap ERR: ping $host $user<br>";
			}
		}

	if( $mode == "status" ) {
		$status = imap_status($imap, "{localhost}INBOX", SA_ALL);
		echo "Messages: ", $status->messages, "<BR>\n";
		echo "Recent: ", $status->recent, "<BR>\n";
		echo "Unseen: ", $status->unseen, "<BR>\n";
		echo "UIDnext: ", $status->uidnext, "<BR>\n";
		echo "UIDvalidity: ", $status->uidvalidity, "<BR>\n";
		echo "Flags: ", $status->flags, "<BR>\n";
		var_dump($status);
		}

	if( $mode == "info" ) {
		$info = imap_mailboxmsginfo($imap);
		echo "Date: " , $info->Date, "\n";
		echo "Driver: ", $info->Driver, "\n";
		echo "Mailbox: ", $info->Mailbox, "\n";
		echo "Number of messages: ", $info->Nmsgs, "\n";
		echo "Recent: ", $info->Recent, "\n";
		echo "Unread; ", $info->Unread, "\n";
		echo "Deleted: ", $info->Deleted, "\n";
		echo "Size: ", $info->Size, "\n";
		}

	if( $mode == "nummsg" ) {
		$number = imap_num_msg($imap);
		echo "Number of messages: $number<BR>\n";

// display message subjects
		for ($i=1; $i<=$number; $i++) {
			$header = imap_header($imap, $i);
			echo "Subject: ", $header->Subject, "<BR>\n";
			}
		}




	if( $mode == "struct" ) {
// duimp out every property of the message
		echo "<pre>\n\n";
		print_r(imap_fetchstructure($imap, $message));
		echo "\n\n</pre>";
		}

// list mailboxes
	if( $mode == "listmailbox" ) {
		$boxes = imap_listmailbox($imap, "{localhost}", "*");
		for ($i=0; $i<count($boxes); $i++) {
			echo "Mailbox: $boxes[$i]<BR>\n";
			}
		}

	if( $mode == "attachments" ) {
		$info = imap_fetchstructure($imap, $message);

// find out how may parts the object has
		$numparts = count($info->parts);

// find if if multipart message
		if ($numparts > 1) {
   			echo "More then one part<BR>";
   			foreach ($info->parts as $part) {
      				if ($part->disposition == "INLINE") {
// inline message. Show number of lines
     			    		printf("Inline message has %s lines<BR>", $part->lines);
				} elseif ($part->disposition == "ATTACHMENT") {
// an attachment
					echo "Attachment found!";
// print out the file name
					echo "Filename: ", $part->dparameters[0]->value;
					}
   				}
   	
			} 
		else {
// only one part so get some useful info
			echo "Only one part";
			}
		}

	imap_close($imap);
	}

function ko_sessions_start() {
	session_start();
	$_SESSION['user'] = $_POST['user'];
	$_SESSION['data'] = $_POST['data'];
	$_SESSION['hash'] = $_POST['hash'];
//	$output = "<input type=\"hidden\" name=\"user\" value=\"" . htmlentities($_POST['user']) . "\">";
//	$output .= "<input type=\"hidden\" name=\"data\" value=\"" . htmlentities($_POST['data']) . "\">";
//	$output .= "<input type=\"hidden\" name=\"hash\" value=\"" . htmlentities($_POST['hash']) . "\">";
	}

function ko_sessions() {
	session_start();
	$user=htmlentities($_SESSION['user']);
	$data=htmlentities($_SESSION['data']);
	$hash=htmlentities($_SESSION['hash']);
//	if( isset($_SESSION['user'])) { ; }
//	if( isset($_SESSION['role'])) { unset($_SESSION['role']); session_destroy(); }
	}

function ko_validata() {
	$secret = 'temp_secret_hash_code';
	if (! $data = pc_decode($_POST['data'], $_POST['hash'])) {
		print( "ko_validate ERR:  crack attempt<br>\n" );
		}
// process form
	
// updata data
	$data['user'] = $_POST['user'];
	$data['stage']++;
	unset($data['password']);
	list ($data, $hash) = pc_encode($data);

// store data and hash in form
	$output = "<form action=\"".$_SERVER['php_self']."?$query_string\" method=\"post\">";
	$output .= "<input type=\"hidden\" name=\"data\" value=\"" . htmlentities($data)."\">\n";
	$output .= "<input type=\"hidden\" name=\"hash\" value=\"" . htmlentities($hash)."\">\n";
	$output .= "</form>\n";
	}

function ko_validate_form() {
 	if(! ko_validate_form_user($_POST['user'])) {
 		$errors['user'] = "ERR:  user";
 		}
 	if(! ko_validate_form_pass($_POST['pass'])) {
 		$errors['pass'] = "ERR:  pass";
 		}
 	return $errors;
 	}
 
function ko_validate_form_user($user) {
 	}
function ko_validate_form_pass($pass) {
 	}

function ko_print_form($errors) {
	$fields = array('name' => 'Name',
		'rank' => 'Rank',
		'serial' => 'Serial');

	if( count($errors)) { print( "ko_print_form ERR: <br>\n" );}
	$output = "<table>\n";
	foreach( $fields as $field => $field_name) {
		$output .= "<tr><td>";
		if( !empty($errors[$field])) {
			$output .= $errors[$field];
			}
		else {
			$output .= "&nbsp;";
			}
		$output .= "</td><td>";

		$values = isset($_POST['field']) ? htmlentities($_POST['$field']) : '';
		$output .= "$field_name";
		$output .= "<input type=\"text\" name=\"$field\" value=\"$value\">";
		$output .= "</td></tr>";
		}

	$output .= "</table>\n";
	print( "$output" );
	}	
 	
function ko_unique() {
 	$unique_id = unique_id(microtime(),1);
 	$output = "<input type=\"hidden\" name=\"unique_id\" value=\"".$unique_id."\">";
 	}
 
function ko_unique1() {
	$GLOBALS['tblname'];
 	$unique_id = $pdo->quote($_POST['unique_id']);
 	$sth = $pdo->query("SELECT * from $tblname where unique_id = $unique_id");
 	if( $sth->numRows()) {
 		$output = "ERR ko_unique1<br>\n";
 		}
 	}

function pc_encode($data) {
	$data = serialize($data);
	$hash = md5($GLOBALS['secret'] . $data);
	return array($data,$hash);
	}
function pc_decode($data, $hash) {
	if( !empty($data) && !empty($hash)) {
		if( md5($GLOBALS['secret'] . $data) == $hash) {
			return unserialize($data);
			}
		else {
			error_log("pc_decode ERR:  data modified");
			return false;
			}			
		}
	return false;
	}


// datefunctions ==========================
// get the number of seconds between the two dates
function datediff ($interval,$date1,$date2) {
	$timedifference = $date2 - $date1;
	switch ($interval) {
//		case 'w': $retval = bcdiv($timedifference,604800); break;
//		case 'd': $retval = bcdiv($timedifference,86400); break;
//		case 'h': $retval = bcdiv($timedifference,3600); break;
//		case 'n': $retval = bcdiv($timedifference,60); break;
//		case 's': $retval = $timedifference; break;
		}
	return $retval;
	}

function datediff_leds( $diffdays ) {
//	print( "<hr>BUGS datediff_leds BEG:  diffdays=[$diffdays] color=[$color] speed=[$speed]<br><hr>\n" );
	switch( $diffdays ) {
		case ( $diffdays > 30 ): $color="red"; $speed="00"; break;
		case ( $diffdays > 14 ) && ( $diffdays < 30): $color="red"; $speed="20"; break;
		case ( $diffdays > 7 ): $color="red"; $speed="40"; break;
		case ( $diffdays > 3 ): $color="red"; $speed="60"; break;
		case ( $diffdays > 1 ): $color="red"; $speed="70"; break;
		case ( $diffdays == 1 ): $color="red"; $speed="80"; break;
		case ( $diffdays == 0 ): $color="blu"; $speed="00"; break;
		case ( $diffdays == "" ): $color="blu"; $speed="00"; break;
		case ( $diffdays == -1 ): $color="red"; $speed="90"; break;
		case ( $diffdays < -31 ): $color="grn"; $speed="00"; break;
		case ( $diffdays < -30 ): $color="blu"; $speed="00"; break;
		case ( $diffdays < -14 ): $color="blu"; $speed="40"; break;
		case ( $diffdays < -7 ): $color="blu"; $speed="50"; break;
		case ( $diffdays < -3 ): $color="blu"; $speed="60"; break;
		case ( $diffdays < -2 ): $color="blu"; $speed="70"; break;
		case ( $diffdays < -1 ): $color="blu"; $speed="80"; break;
		} 
//	print( "<hr>BUGS datediff_leds END:  diffdays=[$diffdays] color=[$color] speed=[$speed]<br><hr>\n" );
	return array( $diffdays, $color, $speed );
	}

// fgmenu ====================================================================
function fgmenu_head($options) {
	$output .= "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n";
	$output .= "\n";
	$output .= "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\">\n";
	$output .= "<head>\n";
	$output .= "<title>fgmenu $options[0] $options[1]</title>\n";
	$output .= "    <meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />\n";
	$output .= "    \n";
	$output .= "    <script type=\"text/javascript\" src=\"./js/fg-menu/jquery-1.3.2.min.js\"></script>\n";
//	$output .= "    <script type=\"text/javascript\" src=\"./js/fg-menu/fg.menu.js\"></script>\n";
	$output .= "    <script type=\"text/javascript\" src=\"./js/fg-menu/fg.menu_ko.js\"></script>\n";

///	$output .= "	<script type=\"text/javascript\" src=\"./js/jqgrid.3.5.3/js/jquery.jqGrid.min.js\"></script>\n";
///	$output .= "	<script type=\"text/javascript\" src=\"./js/jqgrid.3.5.3/js/i18n/grid.locale-en.js\"></script>\n";
	$output .= "	<script type=\"text/javascript\" src=\"./js/jqgrid-4.4.0/js/jquery.jqGrid.min.js\"></script>\n";
	$output .= "	<script type=\"text/javascript\" src=\"./js/jqgrid-4.4.0/js/i18n/grid.locale-en.js\"></script>\n";

	$output .= "   \n";
	$output .= "    <link type=\"text/css\" href=\"./js/fg-menu/fg.menu.css\" media=\"screen\" rel=\"stylesheet\" />\n";
	$output .= "    <link type=\"text/css\" href=\"./js/fg-menu/theme/ui.all.css\" media=\"screen\" rel=\"stylesheet\" />\n";
	$output .= "   \n";
	$output .= "    <!-- styles for this example page only -->\n";
	$output .= "	<style type=\"text/css\">\n";
	$output .= "	body { font-size:62.5%; margin:0; padding:0; }\n";
	$output .= "	#menuLog { font-size:1.4em; margin:20px; }\n";
	$output .= "	.hidden { position:absolute; top:0; left:-9999px; width:1px; height:1px; overflow:hidden; }\n";
	$output .= "	\n";
	$output .= "	.fg-button { clear:left; margin:0 4px 40px 20px; padding: .4em 1em; text-decoration:none !important; cursor:pointer; position: relative; text-align: center; zoom: 1; }\n";
	$output .= "	.fg-button .ui-icon { position: absolute; top: 50%; margin-top: -8px; left: 50%; margin-left: -8px; }\n";
	$output .= "	a.fg-button { float:left;  }\n";
	$output .= "	button.fg-button { width:auto; overflow:visible; } /* removes extra button width in IE */n";
	$output .= "	\n";
	$output .= "	.fg-button-icon-left { padding-left: 2.1em; }\n";
	$output .= "	.fg-button-icon-right { padding-right: 2.1em; }\n";
	$output .= "	.fg-button-icon-left .ui-icon { right: auto; left: .2em; margin-left: 0; }\n";
	$output .= "	.fg-button-icon-right .ui-icon { left: auto; right: .2em; margin-left: 0; }\n";
	$output .= "	.fg-button-icon-solo { display:block; width:8px; text-indent: -9999px; }	 /* solo icon buttons must have block properties for the text-indent to work */	n";
	$output .= "	\n";
	$output .= "	.fg-button.ui-state-loading .ui-icon { background: url(spinner_bar.gif) no-repeat 0 0; }\n";
	$output .= "	</style>\n";
	$output .= "	\n";
	$output .= "	<!-- style exceptions for IE 6 -->\n";
	$output .= "	<!--[if IE 6]>\n";
	$output .= "	<style type=\"text/css\">\n";
	$output .= "		.fg-menu-ipod .fg-menu li { width: 95%; }\n";
	$output .= "		.fg-menu-ipod .ui-widget-content { border:0; }\n";
	$output .= "	</style>\n";
	$output .= "	<![endif]-->	\n";
	$output .= "    \n";
//	$output  = "";
//	$output .= "<hr>fgmenu_head<hr>\n";

	return( $output );
	}


function fgmenu_js($options) {
	$role=$_SESSION['role'];
//	$role=$options[1];

	$output .= "    <script type=\"text/javascript\">    \n";
	$output .= "    $(function(){\n";
	$output .= "    	// BUTTONS\n";
	$output .= "    	$('.fg-button').hover(\n";
	$output .= "    		function(){ $(this).removeClass('ui-state-default').addClass('ui-state-focus'); },\n";
	$output .= "    		function(){ $(this).removeClass('ui-state-focus').addClass('ui-state-default'); }\n";
	$output .= "    	);\n";
	$output .= "    	\n";
//	$output .= "    	// MENUS    	\n";
//	$output .= "		$('#flat').menu({ \n";
//	$output .= "			content: $('#flat').next().html(), // grab content from this page\n";
//	$output .= "			showSpeed: 400 \n";
//	$output .= "		});\n";
//	$output .= "		\n";
//	$output .= "		$('#hierarchy').menu({\n";
//	$output .= "			content: $('#hierarchy').next().html(),\n";
//	$output .= "			crumbDefaultText: ' '\n";
//	$output .= "		});\n";
//	$output .= "		\n";
	$output .= "		$('#hierarchybreadcrumb').menu({\n";
	$output .= "			content: $('#hierarchybreadcrumb').next().html(),\n";
	$output .= "			backLink: false\n";
	$output .= "		});\n";
	$output .= "		\n";
	$output .= "    });\n";
	$output .= "    </script>\n";
	$output .= "    \n";
//	$output .= "    <!-- theme switcher button -->\n";
//	$output .= "    <script type=\"text/javascript\" src=\"http://ui.jquery.com/applications/themeroller/themeswitchertool/\"></script>\n";
//	$output .= "	<script type=\"text/javascript\"> $(function(){ $('<div style=\"position: absolute; top: 20px; right: 300px;\" />').appendTo('body').themeswitcher(); }); </script>\n";
	$output .= "</head>\n";
	$output .= "\n";

	return( $output );
	}




function fgmenu_htm($options) {
	$php_self=$_SERVER['PHP_SELF'];
	$role=$_SESSION['role'];
//	$role=$options[1];
	$output = "<hr>$php_self fgmenu [".$options[0]."][".$options[1]."][".$options[2]."]<br><hr>\n";
	$output .= fgmenu_head($options);
	$output .= fgmenu_js($options);
	$output .= html_btn_squares( $options, "" );
	$output .= fgmenu_htm_body($options);
	print( "$output\n" );
	}


function fgmenu_htm_body($options) {
	$php_self=$_SERVER['PHP_SELF'];
	$role=$_SESSION['role'];
//	$role=$options[1];
	if( $role == "" ) { 
		$menucontent="./js/fg-menu/menuContent.html"; 
		} 
	else {
		$menucontent="./js/fg-menu/menuContent_$role.html"; 
		}	

	$output  = "";
	$output .= "<p id=\"menuLog\">menuSelection_html $role: <span id=\"menuSelection\"></span></p>\n";
	$output .= "    <script type=\"text/javascript\">    \n";
	$output .= "		$.get('$menucontent', function(data){\n";
	$output .= "			$('#hierarchybreadcrumb').menu({ content: data, backLink: false });\n";
//	$output .= "			$('#hierarchybreadcrumb').menu({ content: data, hierarchybreadcrumb: true });\n";
	$output .= "		});\n";
	$output .= "		</script>\n";


	$output .= "<a tabindex=\"0\" href=\"#fgmenu_htm_$role\" ";
	$output .= "	class=\"fg-button fg-button-icon-right ui-widget ui-state-default ui-corner-all\" ";
	$output .= "	id=\"hierarchybreadcrumb\"><span class=\"ui-icon ui-icon-triangle-1-s\"></span>\n";
	$output .= "	fgmenu_htm_$role\n";
	$output .= "	</a>\n";
	$output .= "<div id=\"fgmenu_htm_$role\" class=\"hidden\">\n";
//	$output .= "<ul>\n";
//	$output .= "	<li><a href=\"#$php_self?q=menu/1\">Menu_1</a>\n";
//	$output .= "		<ul>\n";
//	$output .= "			<li><a href=\"#$php_self?q=menu/1/1\">Menu_1_1</a></li>\n";
//	$output .= "			<li><a href=\"#$php_self?q=menu/1/2\">Menu_1_2</a></li>\n";
//	$output .= "			<li><a href=\"#$php_self?q=menu/1/3\">Menu_1_3</a></li>\n";
//	$output .= "		</ul>\n";
//	$output .= "	</li>\n";
//	$output .= "	</ul>\n";
	$output .= "	</div>\n";
	return( $output );
	}


function fgmenu_dyn($options) {
	$php_self=$_SERVER['PHP_SELF'];
	$role=$_SESSION['role'];
//	$role=$options[1];
	$output = "<hr>$php_self fgmenu [".$options[0]."][".$options[1]."][".$options[2]."]<br><hr>\n";
	$output .= fgmenu_head($options);
	$output .= fgmenu_js($options);
	$output .= "<body bgcolor=\"lightblue\">\n";
	$output .= fgmenu_dyn_body($options);
	$output .= "</body>\n";
	$output .= "</html>\n";
	print( "$output\n" );
	}


function fgmenu_dyn_body($options) {
	$php_self=$_SERVER['PHP_SELF'];
	$role=$_SESSION['role'];
	print( "<hr>fgmenu_dyn_body MSG3339:  role=[$role] <hr>\n" );
//	$role=$options[1];
	$menu_id=$role;

	$menus[""][] = "?fgmenu/menu1,menu1";
	$menus[""][] = "?fgmenu/menu2,menu2";
	$menus[""][] = "?fgmenu/menu3,menu3";
	$menus[""][] = "?fgmenu/menu4,menu4";

	$menus[1][] = "?fgmenu/1,menu1";
	$menus[1][] = "?fgmenu/2,menu2";
	$menus[1][] = "?fgmenu/3,menu3";
	$menus[1][] = "?fgmenu/4,menu4";
	$menus[1][] = "?fgmenu/5,menu5";
	$menus[1][] = "?fgmenu/6,menu6";
	$menus[1][] = "?fgmenu/7,menu7";

	$menus[2][] = "?fgmenu/2/1,menu1";
	$menus[2][] = "?fgmenu/2/1/1,!menu11";
	$menus[2][] = "?fgmenu/2/1/2,!menu12";
	$menus[2][] = "?fgmenu/2/1/3,!menu13";
	$menus[2][] = "?fgmenu/2/1/4,!menu14";
	$menus[2][] = "?fgmenu/2/1/5,!menu15";
	$menus[2][] = "?fgmenu/2/1/6,!menu16";

//	$menus[2][] = "?fgmenu/2/1/1/1,!!menu111";
//	$menus[2][] = "?fgmenu/2,menu3";

	$menus[3][] = "?fgmenu/3/1,menu1";
	$menus[3][] = "?fgmenu/3/2,menu2";
	$menus[3][] = "?fgmenu/3/2/1,!menu2-1";
	$menus[3][] = "?fgmenu/3/2/2,!menu2-2";
	$menus[3][] = "?fgmenu/3/2/3,!menu2-3";
	$menus[3][] = "?fgmenu/3/3,menu3";
	$menus[3][] = "?fgmenu/3/3/1,!menu3-1";
	$menus[3][] = "?fgmenu/3/3/2,!menu3-2";
	$menus[3][] = "?fgmenu/3/3/2/1,!!menu3-2-1";
	$menus[3][] = "?fgmenu/3/3/2/2,!!menu3-2-2";
	$menus[3][] = "?fgmenu/3/3/2/3,!!menu3-2-3";
	$menus[5][] = "?fgmenu/5/1,menu5-1";
	$menus[5][] = "?fgmenu/5/1/1,!menu5-11";

	$menus[anon][] = "?login/,login";
	$menus[anon][] = "?logout/,logout";
	$menus[anon][] = "?logout/,logout";
	$menus[anon][] = "?menu/,menu";
	$menus[anon][] = "?view/,view";
	$menus[anon][] = "?update/,update";

	$menus[admin][] = "?fgmenu/admin/db,db";
	$menus[admin][] = "?fgmenu/admin/unload,!unload";
	$menus[admin][] = "?fgmenu/admin/load,!load";
	$menus[admin][] = "?fgmenu/admin/query,!query";
	$menus[admin][] = "?fgmenu/admin/media,media";
	$menus[admin][] = "?fgmenu/zoom,!zoom";
	$menus[admin][] = "?fgmenu/objects,!object";
	$menus[admin][] = "?fgmenu/pano,!pano";

	$menus[users][] = "?fgmenu/users/update,update";
	$menus[users][] = "?fgmenu/users/zoom,zoom";
	$menus[users][] = "?fgmenu/users/object,object";
	$menus[users][] = "?fgmenu/users/pano,pano";

	$menus[op][] = "?fgmenu/op/iperms,iperms";
	$menus[op][] = "?fgmenu/op/iperms,!periods_p";
	$menus[op][] = "?fgmenu/op/iperms,!periods_pp";
	$menus[op][] = "?fgmenu/op/iperms,!job2db";
	$menus[op][] = "?fgmenu/op/iperms,!!mkwl";
	$menus[op][] = "?fgmenu/op/iperms,!!viwl";
	$menus[op][] = "?fgmenu/op/iperms,!!catwl";
	$menus[op][] = "?fgmenu/op/iperms,!!runwl";
	$menus[op][] = "?fgmenu/op/aors,!aors";
	$menus[op][] = "?fgmenu/op/aors/txt2tif,!!txt2tif";
	$menus[op][] = "?fgmenu/op/aors/txt2tif/mkwl,!!!mkwl";
	$menus[op][] = "?fgmenu/op/aors/txt2tif/catwl,!!!catwl";
	$menus[op][] = "?fgmenu/op/aors/txt2tif/runwl,!!!runwl";
	$menus[op][] = "?fgmenu/op/aors/tif2api,!!tif2api";
	$menus[op][] = "?fgmenu/op/aors/tif2api/mkwl,!!!mkwl";
	$menus[op][] = "?fgmenu/op/aors/tif2api/catwl,!!!catwl";
	$menus[op][] = "?fgmenu/op/aors/tif2api/runwl,!!!runwl";
	$menus[op][] = "?fgmenu/op/ltrs,!ltrs";
	$menus[op][] = "?fgmenu/op/ltrs/txt2tif,!!txt2tif";
	$menus[op][] = "?fgmenu/op/ltrs/txt2tif/mkwl,!!!mkwl";
	$menus[op][] = "?fgmenu/op/ltrs/txt2tif/catwl,!!!catwl";
	$menus[op][] = "?fgmenu/op/ltrs/txt2tif/runwl,!!!runwl";
	$menus[op][] = "?fgmenu/op/ltrs/tif2api,!!tif2api";
	$menus[op][] = "?fgmenu/op/ltrs/tif2api/mkwl,!!!mkwl";
	$menus[op][] = "?fgmenu/op/ltrs/tif2api/catwl,!!!catwl";
	$menus[op][] = "?fgmenu/op/ltrs/tif2api/runwl,!!!runwl";
	$menus[op][] = "?fgmenu/op/db/,db";

	$menus[jk][] = "?fgmenu/jk/1,jk_menu1";

	if( $menu_id == "" ) {
		$j=0;
		foreach( $menus as $key => $val ) {
			$j++;
//			print( "$j $key $val<br>\n" );
			}
		return;
		}
	if(! array_key_exists( $menu_id, $menus )) { 
//		print( "ERR_301:  NOTFOUND menu_id=$menu_id <br>\n" );
		return; 
		}

	$output  = "";
	$output .= "<p id=\"menuLog\">menuSelection_dyn $role: <span id=\"menuSelection\"></span></p>\n";

	$output .= "<a tabindex=\"0\"\n";
	$output .= "	href=\"#fgmenu_dyn_$role\" ";
	$output .= "	class=\"fg-button fg-button-icon-right ui-widget ui-state-default ui-corner-all\"\n";
	$output .= "	id=\"hierarchybreadcrumb\">\n";
	$output .= "	<span class=\"ui-icon ui-icon-triangle-1-s\"></span>\n";
	$output .= "	fgmenu_dyn_$role\n";
	$output .= "	</a>\n";

	$output .= "<div id=\"fgmenu_dyn_$role\" class=\"hidden\">\n";

	$fg_output = ""; $item_id=0;

// fatal error	menutree( &$item_id, $menus[$role], &$fg_output );

//	$item_id=0; $level=0; $fg_output="";
//	foreach( $menus[$menu_id] as $menu_items ) {
//		$menu_item = explode( ",", $menu_items );
//		$menu_href=$menu_item[0];
//		$menu_item=$menu_item[1];
//		print( "items=$items<br>\n" );
//		print( "menu_id=$menu_id [$menu_href] [$menu_item]<br>\n" );
//		print( "menu_id=$menu_id $item_id $item<br>\n" );
//		menutree( $menu_id, $item_id, $menus, &$fg_output );
//		$item_id++;
//		}

	$output .= $fg_output;
	$output .= "</div><hr>\n";

//	$output  = "<div id=\"fgmenu_dyn_$role\" class=\"hidden\">\n";
//	$output .= "<ul>\n";
//	$output .= "	<li><a href=\"#$php_self?q=menu/1\">Menu_1</a>\n";
//	$output .= "		<ul>\n";
//	$output .= "			<li><a href=\"#$php_self?q=menu/1/1\">Menu_1_1</a></li>\n";
//	$output .= "			<li><a href=\"#$php_self?q=menu/1/2\">Menu_1_2</a></li>\n";
//	$output .= "			<li><a href=\"#$php_self?q=menu/1/3\">Menu_1_3</a></li>\n";
//	$output .= "		</ul>\n";
//	$output .= "	</li>\n";
//	$output .= "	</ul>\n";
//	$output .= "	</div>\n";

	$tmp_output=$fg_output;
	$tmp_output=str_replace( "<a href", "(a href", $tmp_output );
	$tmp_output=str_replace( "</a>", "(/a)<br>", $tmp_output );
	$tmp_output=str_replace( "<li>", "(li)", $tmp_output );
	$tmp_output=str_replace( "</li>", "(/li)<br>", $tmp_output );
	$tmp_output=str_replace( "<ul>", "(ul)", $tmp_output );
	$tmp_output=str_replace( "</ul>", "(/ul)<br>", $tmp_output );
	print( "<hr>BUGS_3421 fgmenu_dyn_body<br>\n" );
	print_r($menus[$role]);
	print( "<hr>\n" );
	print( $tmp_output );
	print( "<hr>\n" );
	
	return( $output );
	}

function menutree( &$item_id, $menu, &$output ) {
	$last_item_id=count($menu);
	if( $item_id > $last_item_id ) return( $output );

	$item_href=$items[0];
	$item_levels=$items[1];
	$item_level=count( explode( "!", $item_levels ));
	$item_text=str_replace( "!", "", $item_levels );

	for( $l=0; $l<$item_level; $l++ ) {$output .= "	";}
	$output .= "<ul>\n";

	while( $item_id < $last_item_id ) {
		$items=explode( ",", $menu[$item_id] );
		$item_href=$items[0];
		$item_levels=$items[1];
		$item_level=count( explode( "!", $item_levels ));
		$item_text=str_replace( "!", "", $item_levels );

		$next_item_id=$item_id+1;
		$next_items=explode( ",", $menu[$next_item_id] );
		$next_item_href=$next_items[0];
		$next_item_levels=$next_items[1];
		$next_item_level=count( explode( "!", $next_item_levels ));
		$next_item_text=str_replace( "!", "", $next_item_levels );


		print( "MENUTREE_CURR:  item_id=[$item_id] level=[$item_level] item_href=[$item_href] item_text=[$item_text] last_item_id=[$last_item_id]<br>\n" );
		print( "MENUTREE_NEXT:  item_id=[$next_item_id] level=[$next_item_level] item_href=[$next_item_href] item_text=[$next_item_text]<hr>\n" );

		if( $item_level == $next_item_level ) {
			for( $l=0; $l<$item_level; $l++ ) {$output .= "	";}
			$output .= "<li><a href=\"$item_href\">$item_text</a></li>\n";
			}
		if( $item_level < $next_item_level ) {
			for( $l=0; $l<$item_level; $l++ ) {$output .= "	";}
			$output .= "<li><a href=\"$item_href\">$item_text</a>\n";
			$item_id++;

// fagal error			menutree( &$item_id, $menu, &$output );

			for( $l=0; $l<$item_level; $l++ ) {$output .= "	";}
			$output .= "</li>\n";
			}

		if( $item_level > $next_item_level ) {
			for( $l=0; $l<$item_level; $l++ ) {$output .= "	";}
			$output .= "<li><a href=\"$item_href\">$item_text</a></li>\n";
			last;
			}
		$item_id++;
		}

	for( $l=0; $l<$item_level; $l++ ) {$output .= "	"; }
	$output .= "</ul>\n";

	return($output);
	}

function menutree1( $item_id, $menus, &$output ) {

	$next_item_id=$item_id+1;
	$item_id_last = count( $menus );

	if(! array_key_exists( $item_id, $menus[$menu_id] )) { 
//		print( "menutree ERR_315: menu_id=[$menu_id] next_item_id=$next_item_id<br>\n" );
		$output .= "</li></ul><br>\n";
		return; 
		}
	if(! array_key_exists( $next_item_id, $menus[$menu_id] )) { 
//		print( "menutree ERR_316: menu_id=[$menu_id] next_item_id=$next_item_id<br>\n" );
		$next_item="";
		$next_levels="";
		$next_level=0;
		}
	else {
		$next_item=$menus[$menu_id][$next_item_id];
		$next_levels= split( ",", $next_item );
		$next_level=count($next_levels);
		}

	$menu_items=$menus[$menu_id][$item_id];
	$menu_item = explode( ",", $menu_items );
	$menu_href=$menu_item[0];
	$menu_item=$menu_item[1];

	$levels= split( "!", $menu_item );
	$level=count($levels);

//	print( "menutree: item_id=$item_id l=$level item=[$item] next=$next_level [$next_item]<br>\n" );
	print( "menutree:  [$menu_id][$item_id] <a href=$menu_href>$menu_item</a><br>\n");
	if( $item_id == 0 ) {
		if( $next_level == $level ) { 
			$output .= "<ul>\n";
			$output .= "<li><a href=\"$menu_href\" >$item_id $menu_item</a></li>\n";
			}
		if( $next_level > $level ) {
			$output .= "<ul>\n";
			$output .= "<li><a href=\"$menu_href\" >$item_id $menu_item</a><ul>\n";
// fatal error			menutree( $menu_id, $next_id, $menus, &$output );

			}
		}

	if( $item_id != 0 ) {
		if( $next_level == $level ) {
			$output .= "<li><a href=\"#$item_id\" >$item_id $item</a></li>\n";
			}
		if( $next_level > $level ) {
			$output .= "<li><a href=\"#$item_id\" >$item_id $item</a>\n";
// fatal error			menutree( $menu_id, $next_id, $menus, &$output );
			}
		if( $next_item_id == 0 ) {
			$output .= "<li><a href=\"#$item_id\" >$item_id $item</a></li></ul>\n";
			}

		if( $next_level == 0 ) {
			$output .= "<li><a href=\"#$item_id\" >$item_id $item</a></li>\n";
			$output .= "</ul>\n";
			}
		}
	if( $item_id == $item_id_last ) {


		}
	}

// grid new db new table
function dbs_init( $options ) {
//	CREATE TABLE sqlite_master ( type TEXT, name TEXT, tbl_name TEXT, rootpage INTEGER, sql TEXT );

//	$drvltr="C";
//	if( is_dir( "L:/xampp/htdocs" )) { $drvltr="L"; }
//	if( is_dir( "N:/xampp/htdocs" )) { $drvltr="N"; }
//	if( $drvltr != "" ) { $rootpath = "$drvltr:/xampp/htdocs"; }
//	else {
//		$rootpath = "/var/www"
//		}
//	print( "drvltr=$drvltr<br>\n" );

	switch( true ) {
		case ( is_dir( "C:/xampp/htdocs" )): $rootpath = "C:/xampp/htdocs"; break;
		case ( is_dir( "S:/xampp/htdocs" )): $rootpath = "S:/xampp/htdocs"; break;
		case ( is_dir( "L:/xampp/htdocs" )): $rootpath = "L:/xampp/htdocs"; break;
		case ( is_dir( "N:/xampp/htdocs" )): $rootpath = "N:/xampp/htdocs"; break;
		case ( is_dir( "X:/xampp/htdocs" )): $rootpath = "X:/xampp/htdocs"; break;
		case ( is_dir( "/var/www/htdocs" )): $rootpath = "/var/www/htdocs"; break;
		case ( is_dir( "/var/www/html" )): $rootpath = "/var/www/html"; break;
		}

	switch( true ) {
		case ( is_dir( "C:/iperms" )): $rootpath_iperms = "C:/iperms"; break;
		case ( is_dir( "L:/iperms" )): $rootpath_iperms = "L:/iperms"; break;
		case ( is_dir( "N:/iperms" )): $rootpath_iperms = "N:/iperms"; break;
		case ( is_dir( "X:/iperms" )): $rootpath_iperms = "X:/iperms"; break;
		case ( is_dir( "/var/iperms" )): $rootpath_iperms = "/var/iperms"; break;
		case ( is_dir( "/home/ko" )): $rootpath_ko = "/home/ko"; break;
		}



	$roles = array( 'admin', 'local', 'op', 'mgrs', 'users', 'anon' );
	$roles = array( 'admin', 'local', 'users', 'anon' );
	$GLOBALS['roles'] = $roles;

	$dbfiles['admin']['ka1']['dbfile']="$rootpath/ka1/ka1.db3";
	$dbfiles['admin']['ka1']['tables']= array( 'fp', 'leds', 'rpts', 'roles', 'users', 'dbs', 'menus', 'nodes', 'zoom', 'zoomxml', 'pano', 

'ko_hw',
'ko_plans',
'hw',
'hw_chi',
'defrag_plan',
'defrag_plansum',
'hrc_dc_unix',
'hrc_dc_win',
'hrc_datacenters_equipment',
'hrc_datacenters_equipment_defrag',
'moveplan_details',
'hrc_dc_1307comm',
'hrc_dc_1307unix',
'hrc_dc_1307win',
'hrc_dc_btu',
'hrc_dc_comm',
'hrc_dc_explain',
'hrc_dc_hrc',
'hrc_dc_indy138k',
'hrc_dc_indy139k',
'hrc_dc_ports',
'hrc_dc_power',
'moveplan_details',
'obj' );

///	$dbfiles['admin']['kohpx_vgtest']['dbfile']="/var/www/html/ka1/db3/kohpx_vgtest.db3";
///	$dbfiles['admin']['kohpx_vgtest']['dbfile']="/home/ko/vg/kohpx_vgtest.db3";
///	$dbfiles['admin']['kohpx_vgtest']['tables']= array( 'snapdrive', 'vgdisplay', 'sanlun', 'sanlunp', 'ioscand'  );

///	$dbfiles['admin']['kohpx_vg']['dbfile']="/home/ko/vg/kohpx_vg.db3";
///	$dbfiles['admin']['kohpx_vg']['dbfile']="/home/ko/vg/kohpx_vg.db3";
///	$dbfiles['admin']['kohpx_vg']['tables']= array( 'snapdrive', 'vgdisplay', 'sanlun', 'sanlunp', 'ioscand', 'sard', 'sard_sas', 'ps', 'pw', 'machinfo', 'hs', 'bp', 'db', 'sard', 'sarh', 'sarl' );

///	$dbfiles['admin']['www_kohpx_vg']['dbfile']="/home/ko/vg/www_kohpx_vg.db3";
///	$dbfiles['admin']['www_kohpx_vg']['tables']= array( 'snapdrive', 'vgdisplay', 'sanlun', 'sanlunp', 'ioscand', 'sard', 'sard_sas', 'ps', 'pw', 'machinfo', 'hs', 'bp', 'db', 'sard', 'sarh', 'sarl' );

///	$dbfiles['admin']['kohpx_vg_20120424']['dbfile']="/var/www/html/ka1/db3/kohpx_vg_20120424.db3";
///	$dbfiles['admin']['kohpx_vg_20120424']['tables']= array( 'snapdrive', 'vgdisplay', 'sanlun', 'sanlunp', 'ioscand', 'sard', 'sarh', 'sard_aix', 'sard_hpx','sarh2', 'ps', 'pw', 'hosts' );

///	$dbfiles['admin']['kohpx_vg_20120209']['dbfile']="/var/www/html/ka1/db3/kohpx_vg_20120209.db3";
///	$dbfiles['admin']['kohpx_vg_20120209']['tables']= array( 'snapdrive', 'vgdisplay', 'sanlun', 'sanlunp', 'ioscand', 'sard', 'sarh', 'sard_aix', 'sard_hpx','sarh2', 'ps', 'pw', 'hosts' );

	$dbfiles['admin']['koaix_vg']['dbfile']="/var/www/html/ka1/db3/koaix_vg.db3";
	$dbfiles['admin']['koaix_vg']['tables']= array( 'hosts', 'sanlun', 'sarhraw', 'sarraw', 'ioscand', 'sard', 'ps', 'pw', 'hosts' );

	$dbfiles['admin']['kohpx_hs']['dbfile']="/var/www/html/ka1/db3/kohpx_hs.db3";
	$dbfiles['admin']['kohpx_hs']['tables']= array( 'hs' );

	$dbfiles['admin']['kohpx_us']['dbfile']="/var/www/html/ka1/db3/kohpx_us.db3";
	$dbfiles['admin']['kohpx_us']['tables']= array( 'us', 'users', 'pw','getprpw', 'rpcinfo', 'kctune', 'netstatan', 'netstata', 'ndd'  );

	$dbfiles['admin']['koaix_us']['dbfile']="/var/www/html/ka1/db3/koaix_us.db3";
//	$dbfiles['admin']['koaix_us']['tables']= array( 'us', 'users', 'pw','getprpw', 'rpcinfo', 'kctune', 'netstatan', 'netstata', 'ndd'  );
	$dbfiles['admin']['koaix_us']['tables']= array( 'us', 'users', 'pw','getprpw'  );

	$dbfiles['admin']['korhe_us']['dbfile']="/var/www/html/ka1/db3/korhe_us.db3";
	$dbfiles['admin']['korhe_us']['tables']= array( 'us', 'hs', 'pw','ps'  );

	$dbfiles['admin']['kohpx_sw']['dbfile']="/var/www/html/ka1/db3/kohpx_sw.db3";
	$dbfiles['admin']['kohpx_sw']['tables']= array( 'swlist'  );

	$dbfiles['admin']['kohpx_kb']['dbfile']="/var/www/html/ka1/db3/kohpx_kb.db3";
	$dbfiles['admin']['kohpx_kb']['tables']= array( 'kb'  );

	$dbfiles['admin']['koaac_kb']['dbfile']="/var/www/html/ka1/db3/koaac_kb.db3";
	$dbfiles['admin']['koaac_kb']['tables']= array( 'kb', 'rpts'  );

	$dbfiles['admin']['ka1_hosts']['dbfile']="/var/www/html/ka1/db3/ka1_hosts.db3";
	$dbfiles['admin']['ka1_hosts']['tables']= array( 'ka1_hosts', 'ka1_servers', 'rsn_servers', 'hrc_servers', 'hrc_hosts', 'datacall', 'tmp', 'rpts'  );

	$dbfiles['admin']['ka1_cons']['dbfile']="/var/www/html/ka1/db3/ka1_cons.db3";
	$dbfiles['admin']['ka1_cons']['tables']= array( 'rsncons', 'req', 'rpts'  );

	$dbfiles['admin']['ka1_kb']['dbfile']="/var/www/html/ka1/db3/ka1_kb.db3";
	$dbfiles['admin']['ka1_kb']['tables']= array( 'kb', 'rpts'  );

	$dbfiles['admin']['ka1_certs']['dbfile']="/var/www/html/ka1/db3/ka1_certs.db3";
	$dbfiles['admin']['ka1_certs']['tables']= array( 'certs', 'rpts', 'hrc_certs', 'rsn_certs'  );

	$dbfiles['admin']['ka1d']['dbfile']="/var/www/html/ka1/db3/ka1d.db3";
	$dbfiles['admin']['ka1d']['tables']= array( 'moves', 'rpts', 'teams', 'rfc'  );

	$dbfiles['admin']['kohpx_bp']['dbfile']="/var/www/html/ka1/db3/kohpx_bp.db3";
	$dbfiles['admin']['kohpx_bp']['tables']= array( 'bexdir', 'bexdir1', 'bexdir2', 'tapes'  );

	$dbfiles['admin']['ko_hs']['dbfile']="/var/www/html/ka1/db3/ko_hs.db3";
	$dbfiles['admin']['ko_hs']['tables']= array( 'hs'  );

//	$dbfiles['admin']['kohpx_cons']['dbfile']="/var/www/html/ka1/db3/kohpx_cons.db3";
//	$dbfiles['admin']['kohpx_cons']['tables']= array( 'cons'  );

//	$dbfiles['admin']['iperms']['dbfile']="$rootpath_iperms/ko/bin/iperms.db";
//	$dbfiles['admin']['iperms']['tables']= array( 'periods', 'wl' );
//	$dbfiles['admin']['aors_test']['dbfile']="$rootpath_iperms/aors/bin/aors_test.db";
//	$dbfiles['admin']['aors_test']['tables']= array( 'wl', 'aors' );
//	$dbfiles['admin']['ltrs_test']['dbfile']="$rootpath_iperms/ltrs/bin/ltrs_test.db";
//	$dbfiles['admin']['ltrs_test']['tables']= array( 'wl', 'ltrs' );

	$dbfiles['local']['fp']['dbfile']="$rootpath/fp/fp.db3";
	$dbfiles['local']['fp']['tables']= array( 'fp', 'leds', 'roles', 'users', 'dbs', 'menus', 'nodes', 'zoom', 'zoomxml', 'pano', 'obj' );
	$dbfiles['local']['iperms']['dbfile']="$rootpath_iperms/ko/bin/iperms_test.db";
	$dbfiles['local']['iperms']['tables']= array( 'periods', 'wl' );
	$dbfiles['local']['aors']['dbfile']="$rootpath_iperms/aors/bin/aors_test.db";
	$dbfiles['local']['aors']['tables']= array( 'wl', 'aors' );
	$dbfiles['local']['ltrs']['dbfile']="$rootpath_iperms/ltrs/bin/ltrs_test.db";
	$dbfiles['local']['ltrs']['tables']= array( 'wl', 'ltrs' );

	$dbfiles['iperms']['fp']['dbfile']="$rootpath/fp/fp.db3";
	$dbfiles['iperms']['fp']['tables']= array( 'fp', 'leds', 'users', 'roles', 'nodes', 'zoom', 'zoomxml', 'pano', 'obj' );
	$dbfiles['iperms']['iperms']['dbfile']="$rootpath_iperms/ko/bin/iperms.db";
	$dbfiles['iperms']['iperms']['tables']= array( 'periods', 'wl' );
	$dbfiles['iperms']['aors']['dbfile']="$rootpath_iperms/aors/bin/aors.db";
	$dbfiles['iperms']['aors']['tables']= array( 'wl', 'aors' );
	$dbfiles['iperms']['ltrs']['dbfile']="$rootpath_iperms/ltrs/bin/ltrs.db";
	$dbfiles['iperms']['ltrs']['tables']= array( 'wl', 'ltrs' );


	$dbfiles['tester']['fp']['dbfile']="$rootpath/hrc/fp/fp.db3";
	$dbfiles['tester']['fp']['tables']= array( 'fp', 'leds', 'users', 'roles', 'nodes', 'zoom', 'zoomxml', 'pano', 'obj' );
	$dbfiles['tester']['iperms']['dbfile']="$rootpath_iperms/ko/bin/iperms_test.db";
	$dbfiles['tester']['iperms']['tables']= array( 'periods', 'wl' );
	$dbfiles['tester']['aors']['dbfile']="$rootpath_iperms/aors/bin/aors_test.db";
	$dbfiles['tester']['aors']['tables']= array( 'wl', 'aors' );
	$dbfiles['tester']['ltrs']['dbfile']="$rootpath_iperms/ltrs/bin/ltrs_test.db";
	$dbfiles['tester']['ltrs']['tables']= array( 'wl', 'ltrs' );


	$dbfiles['op']['fp']['dbfile']="$rootpath/hrc/fp/fp.db3";
	$dbfiles['op']['fp']['tables']= array( 'fp', 'leds', 'users', 'roles', 'nodes', 'zoom', 'zoomxml', 'pano', 'obj' );
	$dbfiles['op']['iperms']['dbfile']="$rootpath_iperms/ko/bin/iperms_test.db";
	$dbfiles['op']['iperms']['tables']= array( 'periods', 'wl' );
	$dbfiles['op']['aors']['dbfile']="$rootpath_iperms/aors/bin/aors_test.db";
	$dbfiles['op']['aors']['tables']= array( 'wl', 'aors' );
	$dbfiles['op']['ltrs']['dbfile']="$rootpath_iperms/ltrs/bin/ltrs_test.db";
	$dbfiles['op']['ltrs']['tables']= array( 'wl', 'ltrs' );

	$dbfiles['mgrs']['fp']['dbfile']="$rootpath/hrc/fp/fp.db3";
	$dbfiles['mgrs']['fp']['tables']= array( 'fp', 'leds', 'users', 'roles', 'nodes', 'zoom', 'zoomxml', 'pano', 'obj' );
	$dbfiles['mgrs']['iperms']['dbfile']="$rootpath/iperms/ko/bin/iperms_test.db";
	$dbfiles['mgrs']['iperms']['tables']= array( 'periods', 'wl' );
	$dbfiles['mgrs']['aors']['dbfile']="$rootpath_iperms/aors/bin/aors_test.db";
	$dbfiles['mgrs']['aors']['tables']= array( 'wl', 'aors' );
	$dbfiles['mgrs']['ltrs']['dbfile']="$rootpath_iperms/ltrs/bin/ltrs_test.db";
	$dbfiles['mgrs']['ltrs']['tables']= array( 'wl', 'ltrs' );

	$dbfiles['users']['fp']['dbfile']="$rootpath/hrc/fp/fp.db3";
	$dbfiles['users']['fp']['tables']= array( 'zoom', 'zoomxml', 'pano', 'obj' );

	$dbfiles['anon']['fp']['dbfile']="$rootpath/hrc/fp/fp.db3";
	$dbfiles['anon']['fp']['tables']= array( 'zoom', 'pano', 'obj' );
	$GLOBALS['dbfiles'] = $dbfiles;
	}


function pdo_cr_dbs() {
	$dbfile = $GLOBALS['dbfile'];
	$tblname="dbs";
	$sql="CREATE TABLE IF NOT EXISTS $tblname ( ";
	$sql .= "dbs_id INTEGER PRIMARY KEY DESC, ";

	$sql .= "role VARCHAR, ";
	$sql .= "dbcode VARCHAR, ";
	$sql .= "dbfile VARCHAR, ";
	$sql .= "tbl_name VARCHAR, ";
	$sql .= "col_name VARCHAR, ";
	$sql .= "col_index VARCHAR, ";
	$sql .= "col_width VARCHAR, ";
	$sql .= "col_sorttype VARCHAR, ";
	$sql .= "col_editable VARCHAR, ";
	$sql .= "col_editrules VARCHAR, ";
	$sql .= "col_hidden VARCHAR, ";
	$sql .= "col_display VARCHAR, ";
	$sql .= "col_misc VARCHAR, ";
	$sql .= "notes VARCHAR";
	$sql .= ");";
	print( "BUGS_5304 pdo_cr_dbs( $dbfile, $tblname, $sql )<br>\n" );
	pdo_create( $dbfile, $tblname, $sql );
	}



function pdo_cr_kb() {
	$kbfile = $GLOBALS['kbfile'];
	if( ! file_exists( $kbfile )) { system( "touch $kbfile" ); }
	if( file_exists( $kbfile )) {
		printf( "$progid $dttm MSG: FOUND kbfile=[$kbfile]<br>\n" );
		}
	else {
		printf( "$progid $dttm ERR: NOTFOUND kbfile=[$kbfile]<br>\n" );
		return;
		}

	printf( "$progid $dttm BUGS: pdo_cr_kb BEG<hr>\n" );
	$tblname="kb";
	$sql="CREATE TABLE IF NOT EXISTS $tblname ( ";
	$sql  .= "id INTEGER PRIMARY KEY DESC, ";
	$sql  .= "kbid varchar, ";
	$sql  .= "kb_dttm varchar, ";
	$sql  .= "kb_user varchar, ";
	$sql  .= "kb_host varchar, ";
	$sql  .= "kb_ip varchar, ";
	$sql  .= "kb_os varchar, ";
	$sql  .= "kb_org varchar, ";
	$sql  .= "kb_grp varchar, ";
	$sql  .= "kb_sys varchar, ";
	$sql  .= "kb_cat varchar, ";
	$sql  .= "status varchar, ";
	$sql  .= "status_reason varchar, ";
	$sql  .= "impact varchar, ";
	$sql  .= "urgency varchar, ";
	$sql  .= "priority varchar, ";
	$sql  .= "source varchar, ";
	$sql  .= "request_type varchar, ";
	$sql  .= "root_cause varchar, ";
	$sql  .= "publish varchar, ";
	$sql  .= "errtxt varchar, ";
	$sql  .= "fixtxt varchar, ";
	$sql  .= "errtext varchar, ";
	$sql  .= "fixtext varchar, ";
	$sql  .= "searchable varchar, ";
	$sql  .= "attachements varchar, ";
	$sql  .= "filecount varchar, ";
	$sql  .= "filelist varchar, ";
	$sql  .= "locked varchar, ";
	$sql  .= "view_access varchar, ";
	$sql  .= "vendor_name varchar, ";
	$sql  .= "vendor_contact varchar, ";
	$sql  .= "vendor_ticket_num varchar, ";
	$sql  .= "vendor_phone varchar, ";
	$sql  .= "vendor_email varchar, ";
	$sql  .= "vendor_reported_dttm varchar, ";
	$sql  .= "vendor_responded_dttm varchar, ";
	$sql  .= "comment varchar, ";
	$sql .= "notes VARCHAR";
	$sql .= ");";
///	printf( "$progid $dttm BUGS: pdo_cr_kb END<hr>\n"" );
	print( "BUGS_8940 pdo_cr_kb( $kbfile, $tblname, $sql )<br>\n" );
	pdo_create( $kbfile, $tblname, $sql );
	}


function pdo_cr_flds() {
        $kbfile = $GLOBALS['kbfile'];
        if( ! file_exists( $kbfile )) { system( "touch $kbfile" ); }
        if( file_exists( $kbfile )) {
                printf( "$progid $dttm MSG: FOUND kbfile=[$kbfile]<br>\n" );
                }
        else {
                printf( "$progid $dttm ERR: NOTFOUND kbfile=[$kbfile]<br>\n" );
                return;
                }

        $tblname="flds";
        $sql="CREATE TABLE IF NOT EXISTS $tblname ( ";
        $sql  .= "id INTEGER PRIMARY KEY DESC, ";
        $sql  .= "fldname varchar, ";
        $sql  .= "fldtype varchar, ";
        $sql  .= "fldval varchar, ";
        $sql  .= "flddesc varchar, ";
        $sql .= "notes VARCHAR";
        $sql .= ");";
        print( "BUGS_8950 pdo_cr_flds( $dbfile, $tblname, $sql )<br>\n" );
        pdo_create( $kbfile, $tblname, $sql );
        }



function pdo_insert_dbs( $options ) {

	$role=$_SESSION['role'];
	$dbfiles = $GLOBALS['dbfiles'];
	$roles = $GLOBALS['roles'];
	$dbs = $dbfiles[$role];

	$GLOBALS['dbs'] = $dbs;
	$dbcode="fp";
	$dbfile_dbs=$dbfiles['admin'][$dbcode]['dbfile'];
	$dbtable = "dbs";
	

	print( "pdo_cr_dbs MSG_5092:  role=[$role] dbfile_dbs=[$dbfile_dbs] dbfile1=[$dbfile1] dbcode=[$dbcode] dbtable=[$dbtable]<br>\n" );
	
	$rolenum=1;
	$csvout  ="dbs_id,role,dbcode,dbfile,tbl_name,col_name,col_index,col_width,col_sorttype,col_editable,col_editrules,col_hidden,col_display,col_misc,notes\n";
//	$csvout  ="rowid,role,dbcode,dbfile,tbl_name,col_name,col_index,col_width,col_sorttype,note\n";
//	$csvout  ="role,dbcode,dbfile,tbl_name,col_name,col_index,col_width,col_sorttype,note\n";
	$dbs_id=1;
	foreach( $roles as $role ) {
		print( "role: $rolenum $role<br>\n" );

		foreach( $dbfiles[$role] as $dbfile ) {
			$my_dbfile=$dbfile['dbfile'];
			print( "! dbs_role $role: ". $my_dbfile." <br>\n" );
			$dbfile_basename = basename( $my_dbfile );
			$dbcode = str_replace( ".db3", "", $dbfile_basename );
			$sql_table = "select name FROM sqlite_master where type='table' order by name;";
			print( "! dbcode=$dbcode my_dbfile=$my_dbfile [$sql_table]<br>\n" );
			print( "! sql[$sql_table]<br>\n" );
			if( file_exists( $dbfile['dbfile'] )) {

				$pdo_table = newpdo( $dbfile['dbfile'] );
				foreach( $pdo_table->query($sql_table) as $row_table ) {
					$output = $row_table['type'] . ' - ' . $row_table['name'];
					print( "! ! sql row_table=$output<br>\n" );

					$sql_col="PRAGMA table_info(".$row_table['name'].");";	
//					print( "! ! sql[$sql_col]<br>\n" );
					$pdo_col = newpdo($dbfile['dbfile']);
					foreach( $pdo_col->query($sql_col) as $col_table ) {
						$output_colinfo = $col_table['cid'] . ' - ' . $col_table['name'] . ' - ' . $col_table['type'];
//						print( "! ! ! sql_col=[$output_colinfo]<br>\n" );
						$csvout .= "$dbs_id,";
						$csvout .= "$role,";			// role
						$csvout .= "$dbcode,";			// dbcode
						$csvout .= "$my_dbfile,";		// db_pathfile
						$csvout .= $row_table['name'].","; 	// table_name
						$csvout .= $col_table['name'].","; 	// col_name
						$csvout .= $col_table['name'].","; 	// col_index
						$csvout .= "60,";			// col_width
						$csvout .= ",";				// col_sorttype (int,date,float)


						if(( $role == "admin" ) 
						|| ( $role == "local" )) {
							$csvout .= "true,";	// col_editable
							$csvout .= ","; 	// col_editrules
							$csvout .= "false,";	// col_hidden
							$csvout .= "false,";	// col_display
							}
						else {
							$csvout .= "false,";	// col_editable
							$csvout .= ","; 	// col_editrules
							$csvout .= "true,";	// col_hidden
							$csvout .= "true,";	// col_display
							}
	
					
						$csvout .= "misc,";			// col_misc
						$csvout .= "";				// notes
						$csvout .= "\n";
//						$csvout .= "{name:'".$col_table['name']."',index:'".$col_table['name']."', width:60, sorttype:'int'},<br>\n";
// date						$csvout .= "	{name:'date',index:'date', width:90, sorttype:\"date\"},\n";
// float					$csvout .= "	{name:'amount',index:'amount', width:80, align:\"right\",sorttype:\"float\"},\n";

						$dbs_id++;
						}
					$pdo_col = null;
					}
	
				$pdo_table = null;
				}

			foreach( $dbfile['tables'] as $table ) {
				print( "dbs_role $role table: $table<br>\n" );
				}
			}
		$rolenum++;
		}

	$dttm=date("Ymd_His");
	$csvfil="fp_dbs_$dttm.csv";
	$csvfil="fp_dbs.csv";
	$csvfil="dbs.csv";
	$fp = fopen( $csvfil, "w" );
//	$fp = fopen( $csvfil, "a" );
	fwrite( $fp, $csvout );
//	print( $csvout );
	fclose($fp);

//	$csvarray = split( "\n", "<br>\n", $csvout );
//	$csvhtm = str_replace( "\n", "<br>\n", $csvout );
//	print( $csvhtm );
//	foreach( $csvarray as $csvtmp ) {
//		print( "$csvtmp" );
//		}

	

//	$sql = "select name FROM sqlite_master where type='table' order by name;";
// $ sqlite3 -header fp.db3 "PRAGMA table_info(roles)"
// cid|name|type|notnull|dflt_value|pk
// 0|role_id|INTEGER|0||1
// 1|role_code|VARCHAR|0||0
// 2|role_status|VARCHAR|0||0
// 3|role_comment|VARCHAR|0||0

	$options = array( "db", "load", "fp", "dbs" );

//	set_time_limit(120);	// disable
	set_time_limit(0);	// disable

//	pdo_load( $options );
	print( $csvout );
	
	print( "BUGS_5287 pdo_cr_dbs:  pdo_insert( $dbfile_dbs, $dbtable, csvout )<br>\n" );
	pdo_insert( $dbfile_dbs, $dbtable, $csvout );
	set_time_limit(30);	// enable to 30 seconds

	}

function localcmds( $options ) {
	$http_host=$_SERVER['HTTP_HOST'];
	$php_self=$_SERVER['PHP_SELF'];
	$role = $_SESSION['role'];
	$user_location = $_SESSION['user_location'];
	$server_os = $_SESSION['server_os'];
	if( $user_location != "local" ) { return; }
	if( $server_os == "Windows" ) { return; }
	if(( $role != "admin" ) & ( $role != "local" )) { return; }

	$cmds = array( 
		'crypt'=>'tc', 
		'view'=>'iv',
		'scrt'=>'scrt',
		'sftp'=>'sftp',
		'edit'=>'wi'
		);


	$output = "<div = \"localcmds\">\n";
	$output .= "<hr>\n";
	$output .= "<a href=\"http://$http_host$php_self?q=local\"><b>localcmds</b></a><br>\n";

	if( $options[1] == "" ) {
		foreach( $cmds as $col => $val ) {
			$output .= "<a href=\"http://$http_host/$php_self?q=local/$val\">$col</a><br>\n";

			}
		$output .= "</div>\n";
		print( $output );
		return;
		}	

	if( $options[1] == "wi" ) {$cmd="wi.exe ".$options[2]." ".$options[3]." ".$options[4]; }
	if( $options[1] == "tc" ) {$cmd="tc.exe ".$options[2]." ".$options[3]." ".$options[4]; }
	if( $options[1] == "iv" ) {$cmd="i_view32.exe ".$options[2]." ".$options[3]." ".$options[4]; }
	if( $options[1] == "scrt" ) {
		$scrt_wincmd="\"C:\\Program Files\\VanDyke Software\Clients\\SecureCRT.exe\"";
		$cmd="$scrt_wincmd ".$options[2]." ".$options[3]." ".$options[4]; 
		}
	if( $options[1] == "sftp" ) {
		$sftp_wincmd="\"C:\\Program Files\\Ipswitch\\WS_FTP Pro\\wsftpgui.exe\"";
		$cmd="$sftp_wincmd ".$options[2]." ".$options[3]." ".$options[4]; 
		}
//	set_time_limit(0);
	$output .= "<hr>cmd=[$cmd]<hr>\n";
	$output .= "</div>\n";
	print( $output );

	system($cmd);
//	set_time_limit(30);
	}
function telnet($options) {
	require_once "PHPTelnet.php";
	$telnet = new PHPTelnet();

	$host=$options[1];
	$user=$options[2];

	
	switch( $options[1] ) {
		case "host1":
			$host="host1";
			$user="host1_user";
			$pass="****";
			break;
		default:
			$host="localhost";
			$host="127.0.0.1";
			$user="localhost_user";
			$pass="***";
			break;
		}

	print( "<hr>host=$host user=$user<hr>\n" );
	$telnet = new PHPTelnet();
	print( "<hr>telnet->Connect($host,$user,****)<hr>\n" );
	return;


// pfsockeopen
	$file = 'somefile.txt'; 
	$remote_file = 'readme.txt'; 
	$ftp_server = '127.0.0.1'; 
	$ftp_user_name = 'user'; 
	$ftp_user_pass = 'pass'; 
	$conn_id = ftp_connect($ftp_server); 
	ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); 
	ftp_nb_put($conn_id, $remote_file, $file, FTP_ASCII); 
	echo "$file sent to $ftp_server as $remote_file\n"; 
	ftp_close($conn_id);

// finished copying the input.dat to the till now, just need to execute the print command. 
// That will copy somefile.txt in the same folder as this .php file to the ftp server root dir.
//	$header1=chr(0xFF).chr(0xFB).chr(0x1F).chr(0xFF).chr(0xFB).chr(0x20).chr(0xFF).chr(0xFB).chr(0x18).chr(0xFF).chr(0xFB).chr(0x27).chr(0xFF).chr(0xFD).chr(0x01).chr(0xFF).chr(0xFB).chr(0x03).chr(0xFF).chr(0xFD).chr(0x03).chr(0xFF).chr(0xFC).chr(0x23).chr(0xFF).chr(0xFC).chr(0x24).chr(0xFF).chr(0xFA).chr(0x1F).chr(0x00).chr(0x50).chr(0x00).chr(0x18).chr(0xFF).chr(0xF0).chr(0xFF).chr(0xFA).chr(0x20).chr(0x00).chr(0x33).chr(0x38).chr(0x34).chr(0x30).chr(0x30).chr(0x2C).chr(0x33).chr(0x38).chr(0x34).chr(0x30).chr(0x30).chr(0xFF).chr(0xF0).chr(0xFF).chr(0xFA).chr(0x27).chr(0x00).chr(0xFF).chr(0xF0).chr(0xFF).chr(0xFA).chr(0x18).chr(0x00).chr(0x58).chr(0x54).chr(0x45).chr(0x52).chr(0x4D).chr(0xFF).chr(0xF0);

	$fp=pfsockopen("127.0.0.1",23);
	echo "Telnet session opening ...";
	sleep(4);
	fputs($fp,$header1); sleep(4);
	fputs($fp,"$user\r"); sleep(2); fputs($fp,"$pass\r");
	sleep(2); fputs($fp,"notepad\r");
	sleep(3);

echo "Telnet session closing ...";

fclose($fp);

	return;

// PECL ssh2 => 0.9.0 connection
	$methods = array(
		'kex' => 'diffie-hellman-group1-sha1',
		'client_to_server' => array(
		'crypt' => '3des-cbc',
		'comp' => 'none'),
		'server_to_client' => array(
		'crypt' => 'aes256-cbc,aes192-cbc,aes128-cbc',
		'comp' => 'none'));

	$callbacks = array('disconnect' => 'my_ssh_disconnect');
//	phpinfo();

	$connection = ssh2_connect('$host', 22, $methods, $callbacks);
	if (!$connection) die('Connection failed');
	return;

//telnet connection
	$result = $telnet->Connect($host,$user,$pass );
	switch ($result) {
		case 0: 
			$telnet->DoCommand('pwd', $result);
			echo $result;
			$telnet->DoCommand('date', $result);
			echo $result;
			$telnet->Disconnect();
			break; 
		case 1:
			echo '[PHP Telnet] Connect failed: Unable to open network connection';
			break; 
		case 2:
			echo '[PHP Telnet] Connect failed: Unknown host';
			break; 
		case 3:
			echo '[PHP Telnet] Connect failed: Login failed';
			break; 
		case 4:
			echo '[PHP Telnet] Connect failed: Your PHP version does not support PHP Telnet';
			break; 
		}
	return;
	}
function my_ssh_disconnect($reason, $message, $language) {
	printf("Server disconnected with reason code [%d] and message: %s\n",$reason, $message);
	}

function rptsxml($options) {

	$kbid=$option3;
	$flds_list="rpt_id rpt_status rpt_code rpt_title rpt_sql rpt_file rpt_notes";
	$flds = split( " ", $flds_list );
//	foreach( $flds as $fld ) { print( "fld=[$fld]<br>\n" ); }
//	return;

	$jqgrid = "<script type=\"text/javascript\">\n";
	$jqgrid .= "var gridimgpath = 'js/themes/swanky-purse/images';\n";
	$jqgrid .= "jQuery(document).ready(function(){\n";
	$jqgrid .= "	jQuery().ready(function(){\n";
	$jqgrid .= "		jQuery(\"#list_ka1d_rpts___\").jqGrid({\n";
	$jqgrid .= "url:'https://147.238.94.126/ka1/ka1.php?q=kb/rpts/$kbid&fmt=xml///',\n";
	$jqgrid .= "editurl:'https://147.238.94.126/ka1/ka1.php?q=kb/rpts/$kbid&fmt=xml///',\n";
	$jqgrid .= "datatype: \"xml\",\n";
	$jqgrid .= "		colNames:[\n";


	$colnames = "'rpt_id','rpt_status','rpt_code','rpt_title','rpt_sql','rpt_file','rpt_notes'";
	$colnames  = "";
	foreach( $flds as $fld ) { $colnames .= "'$fld', "; }
	$colnames .= ")";
	$colnames = str_replace( ', )', '', $colnames );

	$jqgrid .= $colnames;

	$jqgrid .= "				],\n";
	$jqgrid .= "	colModel:[\n";

//	$colmodel = "";
//	$colmodel .= "{name:'rpt_id',index:'rpt_id', width:40, editable:true },\n";
//	$colmodel .= "{name:'rpt_id',index:'rpt_id', width:40, editable:true },\n";
//	$colmodel .= "{name:'rpt_status',index:'rpt_status', width:40, editable:true },\n";
//	$colmodel .= "{name:'rpt_code',index:'rpt_code', width:40, editable:true },\n";
//	$colmodel .= "{name:'rpt_title',index:'rpt_title', width:40, editable:true },\n";
//	$colmodel .= "{name:'rpt_sql',index:'rpt_sql', width:40, editable:true },\n";
//	$colmodel .= "{name:'rpt_file',index:'rpt_file', width:40, editable:true },\n";

	$colmodel = "";
	foreach( $flds as $fld ) {
		$colmodel .= "{name:'$fld',index:'$fld', width:40, editable:true }\n";
		}
//	printf( "BUGS_11820<br>colmodel=[$colmodel]<br>\n" );
//	return;
	$jqgrid .= $colmodel;

	$jqgrid .= "			],\n";
	$jqgrid .= "imgpath: gridimgpath,\n";
	$jqgrid .= "height:400,\n";
	$jqgrid .= "rowNum: 10,\n";
	$jqgrid .= "autowidth: true,\n";
	$jqgrid .= "rowList:[10,20,30,50, 100, 500, 1000],\n";
	$jqgrid .= "pager: jQuery('#pager_ka1d_rpts___'),\n";
	$jqgrid .= "sortname: 'rpt_id',\n";
	$jqgrid .= "viewrecords: true,\n";
	$jqgrid .= "sortorder: \"asc\",\n";
	$jqgrid .= "caption: \"ka1d rpts  \"\n";
	$jqgrid .= "			}).navGrid('#pager_ka1d_rpts___',{edit:true,add:true,del:true});\n";
	$jqgrid .= "		jQuery(\".content\").hide();\n";
	$jqgrid .= "		jQuery(\".heading\").click(function() {\n";
	$jqgrid .= "			jQuery(this).next(\".content\").slideToggle(500);\n";
	$jqgrid .= "			});\n";
	$jqgrid .= "		});\n";
	$jqgrid .= "	});\n";
	$jqgrid .= "</script>\n";
	$jqgrid .= "</head>\n";
	printf( $jqgrid );
	return;
	return( $jqgrid );
	}

function email_headers(){
//BUILD EMAIL HEADERS
	$headers  = "From: Some Person <person@website.com>\n";
	$headers .= "Reply-To: person@website.com\n";
	$headers .= "Return-Path: person@website.com\n";
	$headers .= "MIME-Version: 1.0\n";
	$headers .= "Content-Type: text/html; charset=\"iso-8859-1\"\n";

//SET EMAIL PRIORITY
	$headers .= "X-Priority: 1 (Highest)\n";
	$headers .= "X-MSMail-Priority: High\n";
	$headers .= "Importance: High\n";

//SEND EMAIL
//	mail("to@website.com","Subject","Body",$headers);
	}

function rpts($options) {

	$option0=$options[0];
	$option1=$options[1];
	$option2=$options[2];
	$option3=$options[3];
	$page = $_GET['page']; // get the requested page
	$limit = $_GET['rows']; // get how many rows we want to have into the grid
	$sidx = $_GET['sidx']; // get index row - i.e. user click to sort
	$sord = $_GET['sord']; // get the direction
	if(!$sidx) $sidx =1;

	$fmt=$_GET['fmt'];

//	$kbfile=$GLOBALS['kbfile'];
	$kbfile=$GLOBALS['dbfile'];
	$tablename="rpts";

	printf( "<hr>MSG_11770:  fmt=$fmt o0=[$option0] o1=[$option1] o2=[$option2] o3=[$option3] kbfile=[$kbfile]<hr>\n" );
	return;

	if( $option2 != "" ) {
		$rpt_code=$option2;
		$pdo = newpdo($kbfile);
		$sql="select * from $tablename where rpt_code='$option2'";
		try { 
			$output .= "<table>\n";
			$output .= "<tr>\n";
			$pdo = newpdo($kbfile);
//			$result = $stmg->fetch(PDO::FETCH_ASSOC);
			$output .= "<table border=1>\n";
			$output .= "<tr>\n";
			foreach( $pdo->query($sql) as $row ) {
				$rpt_code=$row['rpt_code'];
				$rpt_sql=$row['rpt_sql'];
				$rpt_title=$row['rpt_title'];
				$output .= "<td>$rpt_code - $rpt_sql</td>\n";
				}
			$output .= "</tr>\n";
			$output .= "</table>\n";
			$pdo = null;
			}
		catch(PDOException $e) { $output .= $e->getMessage(); }

// connect to the database

		try {
			$pdo = newpdo($kbfile);
			$stmt = $pdo->query($rpt_sql);
			$result = $stmt->fetch(PDO::FETCH_ASSOC);
			$output .= "<table border=1>\n";
			$output .= "<tr>\n";
			foreach( $result as $key=>$val) {
				$output .= "<td>$key</td>\n";
				}
			$output .= "</tr>\n";
			$output .= "</table>\n";
			$pdo = null;
			}
		catch(PDOException $e) { $output .= $e->getMessage(); }

	
		try { 
			$pdo = newpdo($kbfile);
			$j=0;
			$output .= "<table>\n";
			$output .= "<tr>\n";
			foreach( $pdo->query($rpt_sql) as $row ) {
				foreach( $result as $key=>$val ) {
//					$output .= "<td>$j key=$key val=$val</td>";
					$rowkey=$row[$key];
					$output .= "<td>$rowkey</td>\n";
					}
				$output .= "</tr>\n";
				}
			$output .= "</tr>\n";
			$output .= "</table>\n";
			$pdo=null;
			}
		catch(PDOException $e) { $output .= $e->getMessage(); }
		printf( "<hr>BUGS_11825 option2=[$option2] rpt_sql=[$rpt_sql]<hr>\n" );
		printf( $output );
		return;

		$count = $row['count'];
		if( $count >0 ) {
			$total_pages = ceil($count/$limit); 
			}
		else {
			$total_pages = 0;
			}

		if ($page > $total_pages) $page=$total_pages;
		$start = $limit*$page - $limit; // do not put $limit*($page - 1)
	
		if ( stristr($_SERVER["HTTP_ACCEPT"],"application/xhtml+xml") ) {
			header("Content-type: application/xhtml+xml;charset=utf-8"); 
			} 
		else {
			header("Content-type: text/xml;charset=utf-8");
			}
		$et = ">";
	
		$output .= "<?xml version='1.0' encoding='utf-8'?$et\n";
		$output .= "<rows>";
		$output .= "<page>".$page."</page>";
		$output .= "<total>".$total_pages."</total>";
		$output .= "<records>".$count."</records>";
	
// be sure to put text data in CDATA
//	while($row = mysql_fetch_array($result,MYSQL_ASSOC)) {
		foreach( $pdo->query($rpt_sql) as $row ) {
			foreach( $result as $key=>$val ) {
				$output .=  "<row id='". $row[id]."'>";			
				$output .= "<cell>". $row[$key]."</cell>";
//				$output .= "<cell><![CDATA[". $row[name]."]]></cell>";
//				$output .= "<cell><![CDATA[". $row[note]."]]></cell>";
				$output .= "</row>";
				}
			}
		$output .=  "</rows>";		
		}
		print( $output );
	}


function jqui($jqui) {
	$http_host=$_SERVER['HTTP_HOST'];
	$php_self=$_SERVER['PHP_SELF'];
	if( $jqui == "dragdrop" ) {
		$output= "";
////		$output.= "<!--\n";
		$output.= "  // sets the draggable\n";
		$output.= "  $('#drag .drg').draggable({\n";
		$output.= "    cursor: 'move',          // sets the cursor apperance\n";
		$output.= "    revert: 'valid'\n";
		$output.= "  });\n";
		$output.= "\n";
		$output.= "  // sets droppable\n";
		$output.= "  $('#drop').droppable({\n";
		$output.= "    drop: function(event, ui) {\n";
		$output.= "      // after the draggable is droped, hides it with a hide() effect\n";
		$output.= "      ui.draggable.hide(1000);\n";
		$output.= "    }\n";
		$output.= "  });\n";
		$output.= "\n";
		$output.= "  // when the \"#sw\" element (inside the \"#drop\") is clicked\n";
		$output.= "  // show the items with class \"drg\", contained in \"#drag\"\n";


		$output.= "  $('#drop #sw').click(function(){\n";


		$output.= "  //   $('#drag .drg').slideDown(1000);\n";
////		$output.= "   $('#drag .drg').location(url);\n";
		$output.= "   var url = \"https://$http_host/$php_self?q=jqui/dragdrop1/\"\n";
////		$output.= "   $(location).attr('href',url);\n";
		$output.= "   $(location).attr('href',url);\n";
		$output.= "  });\n";
		$output.= "});\n";
////		$output.= "--></script>\n";
		return($output);
		}
	
	if( $jqui == "dragdrop2" ) {
		$output_dragdrop2 = "";
		$output_dragdrop2 = "  // sets the draggable and define its options\n";
		$output_dragdrop2 = "  $('#drag .drg').draggable({\n";
		$output_dragdrop2 = "    cursor: 'move',          // sets the cursor apperance\n";
			$output_dragdrop2 = "    revert: 'invalid',       // makes the item to return if it isn't placed into droppable\n";
		$output_dragdrop2 = "    revertDuration: 900,     // duration while the item returns to its place\n";
		$output_dragdrop2 = "    opacity: 0.35            // opacity while the element is dragged\n";
		$output_dragdrop2 = "  });\n";
		$output_dragdrop2 = "\n";
		$output_dragdrop2 = "  // define options for droppable\n";
		$output_dragdrop2 = "  $('#drop').droppable({\n";
		$output_dragdrop2 = "    accept: 'img.drg',            // accept only images with class 'drg'\n";
		$output_dragdrop2 = "    activeClass: 'drp',           // add class \"drp\" while an accepted item is dragged\n";
		$output_dragdrop2 = "    drop: function(event, ui) {\n";
		$output_dragdrop2 = "      // after the draggable is droped, hides it with a hide() effect\n";
		$output_dragdrop2 = "      ui.draggable.hide(1000);\n";
		$output_dragdrop2 = "    }\n";
		$output_dragdrop2 = "  });\n";
		return( $output_dragdrop2 );
		}
	return("");
	}

function startup_kup() {
	printf( "<h1>BUGS_300 startup_kup</h1>\n" );
	$_GLOBAL['dbfile']="./kups.db3";
	$timezone_identifier="America/Denver";
	date_default_timezone_set( $timezone_identifier );
	$progid="kup";
	$dttm=date('Ymd_His');
	$query_string=$_SERVER['QUERY_STRING'];
#	print( "BUG16060 qs=".$query_string."<br>" );
	$php_self=$_SERVER['PHP_SELF'];
	$referer=getenv('HTTP_REFERER');

#	print( "getenv_referer=".$getenv_referer );
#	$server_referer=$_SERVER['HTTP_REFERER'];
#	print( "server_referer=".$server_referer );

	$file_cnt=count($_FILES);
	if( $file_cnt > 0 ) { 
		ko_kup(); 
		exit;
#		$html_main=html_main();
#		print( $html_main );
		}
	else {
		$html_kin=html_kin();
		print( $html_kin );
#		$html_main=html_display("index.html");
#		print( $html_main);
		}
	if( $query_string == "" ) {
		$html_main = html_main();
		print( $html_main );	
		}

#	print( "BUGS_24 query_string=$query_string<br>\n" );

#	if(!preg_match('#^Mozilla(.*)#', $agent)) {;}
	if( preg_match('/main/', $query_string  )) { 
#		$html_main=html_main();
#		print( $html_main );
		$html_kin=html_kin();
		print( $html_kin );
		exit; 
		}

	if( preg_match('/ko/', $query_string  )) { ko_ko(); exit; }
	if( preg_match('/sl/', $query_string  )) { ko_sl(); exit; }
	if( preg_match('/h5g/', $query_string  )) { 
#		print( "BUGS_25 MATCH_h5g query_string=$query_string<br>\n" );
		ko_h5g(); 
		exit; 
		}
	if( preg_match('/kup/', $query_string  )) { ko_kup(); exit; }
	if( preg_match('/kin/', $query_string )) { 
		$html_kin=html_kin();
		print( $html_kin );
		exit; 
		}
	if( preg_match('/go/', $query_string  )) { ko_go(); exit; }
	if( preg_match('/sh/', $query_string  )) { ko_sh("/index.sh" ); exit; }
	if( preg_match('/py/', $query_string  )) { ko_py("python index.py" ); exit; }
	if( preg_match('/dir/', $query_string  )) { 

		print( "kup.php BUGS_1609 BUGS_160900 MATCH_dir query_string=".$query_string."<br>" );
		$path=".";
		$path="/kup";
		ko_dir($path); 
		exit; 
		}
	}
function kin($options) {
	$htmout="";
	$htmout .= "<h1>BUGS_21970 options=$options</h1>";
	printf( $htmout );
	phpinfo();
	return($htmout);
	}


function ko_ko() {

	}
function ko_go() {

	}

function ko_sh( $syscmd_sh) {
	$syscmd_sh="./index.sh";

	$msg_sy=system( $syscmd_sh );
	exec($syscmd_sh, $msg_ex );
	$msg_sh=shell_exec( $syscmd_sh );
	print( "ka1 ko_sh MSG_800: syscmd_sh=".$syscmd_sh."<br>" );
	print( "ka1 ko_sh MSG_800: msg_sy=".$msg_sy."<br>" );
	print( "ka1 ko_sh MSG_800: msg_ex=".$msg_ex."<br>" );
	print( "ka1 ko_sh MSG_800: msg_sh=".$msg_sh."<br>" );
	var_dump( $msg_ex );
#	print_r( $msg_ex );
#	explode( "\n", $msg_ex );
#	foreach( $msg_exe as $line ) {
#		$j++;
#		print( "ka1 ko_sh MSG_801: j=".$j." line=".$line."<br>" );
#		}
	print( "ka1 ko_sh MSG_800: msg_sh=".$msg_sh."<br>" );
	}


function ko_py( $syscmd_py) {
	$syscmd_py="python ./index.py";
	$msg_sy=system( $syscmd_py );
	exec($syscmd_py, $msg_ex );
	$msg_py=shell_exec( $syscmd_py );
	print( "ka1 ko_py MSG_800: syscmd_py=".$syscmd_py."<br>" );
	print( "ka1 ko_py MSG_800: msg_sy=".$msg_sy."<br>" );
	print( "ka1 ko_py MSG_800: msg_ex=".$msg_ex."<br>" );
	$len=count( $msg_exe );
#	print_r( $msg_ex );
	var_dump( $msg_ex );
	for( $j=0; $j< $len; $j++ ) {
 		print( "ka1 ko_py MSG_802: len=".$len." j=".$j." msg_ex=".$msg_ex[$j]."<br>" );
		}
	$j=0;
	while( $row = each($msg_ex) ) {
                $row_array = explode(" ", $row);
                $line = $row_array[0];

#                if($pid == $check_pid) {return true;}
 		print( "ka1 ko_py MSG_802: j=".$j." line=".$line."<br>" );
		}
	print( "ka1 ko_py MSG_802: msg_py=".$msg_py."<br>" );
	}


function ko_sl() {
	$dttm=date('Ymd_His');
//	$html_sl_cur="./sl/index_sl_kup.html";
	$html_sl_cur="./sl/index_sl_kup.html";
	$html_sl_new="./sl/index_sl_new.html";
	$html_sl_old="./sl/index_sl_old.html";
	$html_sl_match='<div id="div_sl"';

	$html_sl_data = '<h1>kup sl '.$dttm.'</h1>';
	$html_sl_data = '';
	$html_sl_data .= '<a href="./kup.php?q=back_sl" class="popover" >';
	$html_sl_data .= '	<img src="./imgs/btn/koeye.png" height=100 border=0>';
	$html_sl_data .= '	<span><img src="./imgs/btn/koeye_handhither.png" height=100 border=0><span>';
	$html_sl_data .= '	</a>';
	$html_sl=html_show($html_sl_cur, $html_sl_match, $html_sl_data );

#	print( $html_sl );
#	html_update_div( $html_sl_cur, $html_sl_match, $html_sl_data, $html_sl_new, $html_sl_old );
	exit;
	}

function ko_h5g() {
	$dttm=date('Ymd_His');
#	$html_h5g_cur="/index_h5g.html";
	$html_h5g_cur="/sl/index_h5g_kup.html";
	$html_h5g_new="/sl/index_h5g_kup_new.html";
	$html_h5g_old="/sl/index_h5g_kup_old.html";
	$html_h5g_match='<div id="div_h5g"';
#	$html_h5g_match='div_h5g_links';
#	$h5g_match='<div id="div_h5g_links';

	print( "BUGS_90_h5g html_h5g_cur=".$html_h5g_cur."<br>" );
	print( "BUGS_90_h5g html_h5g_match=".$html_h5g_match."<br>" );
	print( "BUGS_90_h5g h5g_match=".$h5g_match."<br>" );

	$html_h5g_data = '<h1>kup h5g '.$dttm.'</h1>';
	$html_h5g_data = '';
	$html_h5g_data .= '<a href="/kup.php?q=back_h5g" class="popover" >';
	$html_h5g_data .= '	<img src="/imgs/btn/koeye.png" height=100 border=0>';
	$html_h5g_data .= '	<span><img src="/imgs/btn/koeye_handhither.png" height=100 border=0><span>';
	$html_h5g_data .= '	</a>';
	
//	print( "BUGS_100_h5g html_h5g_cur=".$html_h5g_cur."<br>" );
//	print( "BUGS_100_h5g html_h5g_match=".$html_h5g_match."<br>" );
//	print( "BUGS_100_h5g html_h5g_data=".$html_h5g_data."<br>" );
	$html_h5g=html_show($html_h5g_cur, $html_h5g_match, $html_h5g_data );

//	html_update_div( $html_h5g_cur, $html_h5g_match, $html_h5g_data, $html_h5g_new, $html_h5g_old );
//	print( $html_h5g );
	exit;
	}

function html_main() {
	$dttm=date('Ymd_His');
	$html_main = '';
	$html_main_hdr	= '<html><head><title>kup.phg".$dttm."</title>';

	$html_main_style .= html_style();

	$html_main_body = "";
	$html_main_body .= '	</head>';
	$html_main_body	.= '<body>';


	$html_main_body .="</body>";
	$html_main_body .= "</html>";

	$html_main = "";
	$html_main .= $html_main_hdr;
	$html_main .= $html_main_style;
	$html_main .= $html_main_body;
	$html_links	= html_links();
	$html_main .= $html_main_ftr;
	return( $html_main );
	}


function psv_ko_coffeeshop($options){
	$psvfil=$options[0]; $fmt=$options[1];
#	print( "BUGS_21430 psv_ko_coffeeshop psvfil=$psvfil fmt=$fmt<br>\n" );
	$psvfil="ko_coffeeshop.psv";
	$psv=read_htmlfile($psvfil);
	$ko_coffeeshop_psv=$psv;
	print($ko_coffeeshop_psv);
	return($ko_coffeeshop);
	}





function psv_ko_media($options){
	$psvfil=$options[0]; $fmt=$optons[1];
#	print( "BUGS_21420 psv_ko_media psvfil=$psvfil fmt=$fmt<br>\n" );
	$ko_media="psv_ko_media";
	return($ko_media);
	}



function ko_coffeeshop($options) {
	$src="sql3";
	$fmt="psv";	
	if( isset($_REQUEST['file'] )) { $file=$_REQUEST['file']; }
	if( isset($_REQUEST['fmt'] )) { $fmt=$_REQUEST['fmt']; }

	if( "file" ) {
		$psvfil="ko_coffeeshop.psv";
		$psvdta=read_htmlfile($psvfil);
		print( $psvdta );
		return( $psvdta );
		}
	
#	$ko_json=ko_json($options);
#	$dbfile="./kb/media/ko_media.db3";
	$dbfile="ko.db3";
	$sql_sel_coffee="select * from ko_coffeeshop";
#	print( "BUGS_22000 sql3_ko_coffeeshop dbfile=$dbfile sql_sel_coffee=$sql_sel_coffee<br>" );

	$j=0; $psvhdr=""; 
        $pdo = newpdo($dbfile);
	$result = $pdo->query($sql_sel_coffee);
	$result->setFetchMode(PDO::FETCH_ASSOC);
#	$rows = $result->fetchall();

	$j=0;
	$hdrs="";
	$vals="";
	$psvdta = array();

	$psv="";

	while ($row = $result->fetch()) {
		$j=$j+1;
		$keys = array_keys($row);
		$psvval="";
		foreach($keys as $key => $fld ) {
			$psvhdr .= $fld ."|";
			$psvval .= $row[$fld]."|";
			if( isset( $psvdta[$j] )) {
				$val=$row[$fld];
				$psvdta[$j] .= $row[$fld] . "|";
				print( "BUGS_21465 j=$j psvdta=".$psvdta[$j] );
				}
			if( isset( $row[$fld])) { 
				$val=$row[$fld]; 
#				echo( "BUGS_21441 j=$j fld=$fld val=$val key=".$key."<br>");
				}
			else {
				$val="";
#				echo( "BUGS_21442 j=$j fld=$fld val=$val rowval=".$row[$fld]." key=".$key."<br>");
				}
			}

		if( $j == 1 ) {
#			print( "$psvhdr\n" );
			}
		else {
#			print( "$psvval<br>\n" );
			print( "$psvval\n" );
			}
		$jlim=$j;
		if( $j==1) {
#			print( "BUGS_16401 $j psvhdr=".$psvhdr."<br>");
			print( $psvhdr );
			}
		else {
#			print( $psvdta );
#			if( isset( $psvdta[$j] )) {
#				print( "BUGS_16402 $j psvdta=".$psvdta[$j]."<br>");
#				}
			}

		}

#	print( $htmout );
#	for( $j=0; $j<$jlim; $j++ ) {
#		print( $psvdta[$j]."\n" );
#		}

#	while ($row = $result->fetch()) {
#		extract($row);
#		$datapie[] = array($idx, $img);
#		}
#	$ko_data = json_encode($datapie);
#	$pdo=null;


#	foreach( $pdo->query($sql_sel_json) as $row ) {
#		$j=$j+1;
#		$len=len($row[$j]);
#		print( "BUGS len=$len <br>" );
#		$val=$row[$j][$fld];
#		printf( "$progid $dttm MSG_16340: $sql_sel_json $j val=$val fld=$fld <br>\n" );
#		$output .= "$val ";
#		}
#	$pdo=null;

#	$pdo = newpdo( $dbfile );
#	$sql_sel_links = "select * from us";
#	$us = sqlq( $dbfile, $sql_sel_links, "us" );
#	printf( "ko_json MSG_16337:  us=[$us] sql_sel_link=[$sql_sel_link] dbfile=[$dbfile]<br>\n" );


#		$ko_data= Array();
#		$ko_data_test = array(
#			1 => array( "idx,koco,dttm,status,desc" ),
#			2 => array( "idx1,koco1,dttm1,status1,desc1" ),
#			3 => array( "idx2|koco2|dttm2|status2|desc2" ),
#			4 => array( "idx3|koco3|dttm3|status3|desc3"),
#			);
#		$ko_json_test=json_encode($ko_data_test);
#		$ko_json = json_encode($ko_data);

	$ko_json=$psvhdr;
	$ko_json=$psvdta;
	return( $ko_json );
	}

function sql3_ko_coffeeshop($options) {
#	$psvfil="ko_coffeeshop.psv";
#	$psv=read_htmlfile($psvfil);
#	$ko_json=ko_json($options);
#	$dbfile="./kb/media/ko_media.db3";
	$dbfile="ko.db3";
	$sql_sel_coffee="select * from ko_coffeeshop";
#	print( "BUGS_22000 sql3_ko_coffeeshop dbfile=$dbfile sql_sel_coffee=$sql_sel_coffee<br>" );

	$j=0; $psvhdr=""; 
        $pdo = newpdo($dbfile);
	$result = $pdo->query($sql_sel_coffee);
	$result->setFetchMode(PDO::FETCH_ASSOC);
#	$rows = $result->fetchall();

	$j=0;
	$hdrs="";
	$vals="";
	$psvdta = array();
	$htmout="";
	$htmtbl_main="";
	$htmtbl_media="";
	$htmtbl_smedia="";
	$htmtbl_views="";
	$htmtbl_contacts="";

	$htmout .= "<hr color=black>\n";
	$htmout .= "<hr color=white>\n";
#	$htmout .= "<img id=img_ko_coffeeshop_".$coffee_id." src=/imgs/btn/koeyew.png height=40 onclick(\'toggle\'); return false; >ko_coffeeshop_".$coffee_id;
#	$htmout .= "     <div id=div_ko_coffeeshop_".$coffee_id>\n";

	$htmtbl_main .= "<div id=div_coffeeshop_table_main>\n";
	$htmtbl_main .= "<h1>ko_coffeeshop_table_main</h1>\n";
	$htmtbl_main .= "<hr color=yellow>\n";
	$htmtbl_main .= "<table id=ko_coffeeshop_table_main>\n";
	$htmtbl_media .= "<div id=div_coffeeshop_table_media>\n";
	$htmtbl_media .= "<h1>ko_coffeeshop_table_media</h1>\n";
	$htmtbl_media .= "<table id=ko_coffeeshop_table_media>\n";
	$htmtbl_smedia .= "<div id=div_coffeeshop_table_smedia>\n";
	$htmtbl_smedia .= "<h1>ko_coffeeshop_table_smedia</h1>\n";
	$htmtbl_smedia .= "<table id=ko_coffeeshop_table_smedia>\n";
	$htmtbl_views .= "<div id=div_coffeeshop_table_views>\n";
	$htmtbl_views .= "<h1>ko_coffeeshop_table_views</h1>\n";
	$htmtbl_views .= "<table id=ko_coffeeshop_table_views>\n";
	$htmtbl_contacts .= "<div id=div_coffeeshop_table_contacts>\n";
	$htmtbl_contacts .= "<h1>ko_coffeeshop_table_contacts</h1>\n";
	$htmtbl_contacts .= "<table id=ko_coffeeshop_table_contacts>\n";

	$psv="";


	while ($row = $result->fetch()) {
		$j=$j+1;
		$keys = array_keys($row);
		$psvval="";
		foreach($keys as $key => $fld ) {
			$psvhdr .= $fld ."|";
			$psvval .= $row[$fld]."|";
			if( isset( $psvdta[$j] )) {
				$val=$row[$fld];
				$psvdta[$j] .= $row[$fld] . "|";
				print( "BUGS_21465 j=$j psvdta=".$psvdta[$j] );
				}
			if( isset( $row[$fld])) { 
				$val=$row[$fld]; 
#				echo( "BUGS_21441 j=$j fld=$fld val=$val key=".$key."<br>");
				}
			else {
				$val="";
#				echo( "BUGS_21442 j=$j fld=$fld val=$val rowval=".$row[$fld]." key=".$key."<br>");
				}
			}

		header('Content-type: text/plain');
		if( $j == 1 ) {
#			print( "$psvhdr\n" );
			}
		else {
#			print( "$psvval<br>\n" );
			print( "$psvval\n" );
			}
		$jlim=$j;
		if( $j==1) {
#			print( "BUGS_16401 $j psvhdr=".$psvhdr."<br>");
			print( $psvhdr );
			}
		else {
#			print( $psvdta );
#			if( isset( $psvdta[$j] )) {
#				print( "BUGS_16402 $j psvdta=".$psvdta[$j]."<br>");
#				}
			}

		$rowno=$row['rowno'];
		$ord=$row['ord'];
		$no=$row['no'];
		$id=$row['id'];
		$status=$row['status'];
		$dttm=$row['dttm'];
		$grp=$row['grp'];
		$item=$row['item'];
		$logo=$row['logo'];

		$coffee_id=$row['coffee_id'];
		$coffee_url=$row['coffee_url'];
		$coffee_tn=$row['coffee_tn'];

		$home=$row['home'];
		$fb=$row['fb'];
		$fbtxt=$row['fbtxt'];
		$pdf=$row['pdf'];
		$pdftxt=$row['pdftxt'];
		$gif=$row['gif'];
		$giftxt=$row['giftxt'];
		$mp3=$row['mp3'];
		$mp3txt=$row['mp3txt'];
		$mp4=$row['mp4'];
		$mp4txt=$row['mp4txt'];
		$bc=$row['bc'];
		$bctxt=$row['bctxt'];
		$rm=$row['rm'];
		$rmtxt=$row['rmtxt'];
		$vm=$row['vm'];
		$vmtxt=$row['vmtxt'];
		$yt=$row['yt'];
		$yttxt=$row['yttxt'];

		$pn=$row['pn'];
		$pntxt=$row['pntxt'];
		$sl=$row['sl'];
		$sltxt=$row['sltxt'];
		$tl=$row['tl'];
		$tltxt=$row['tltxt'];
		$tx=$row['tx'];
		$txtxt=$row['txtxt'];
		$zm=$row['zm'];
		$zmtxt=$row['zmtxt'];

		$hostid=$row['hostid'];
		$host=$row['host'];
		$home=$row['home'];
		$name=$row['name'];
		$email=$row['email'];
		$phn=$row['phn'];

		$fab=$row['fab'];
		$gab=$row['gab'];
		$li=$row['li'];
		$pl=$row['pl'];
		$pl=$row['pt'];
		$ss=$row['ss'];
		$ts=$row['ts'];
		$tw=$row['tw'];
		$jitsi=$row['jitsi'];
		$chat=$row['chat'];

		$shopify=$row['shopify'];
		$shopifytxt=$row['shopifytxt'];
		$squareup=$row['squareup'];
		$squareuptxt=$row['squareuptxt'];
		$stripe=$row['stripe'];
		$stripetxt=$row['stripetxt'];

		$dm=$row['dm'];
		$dmtxt=$row['dmtxt'];
		$dr=$row['dr'];
		$drtxt=$row['drtxt'];
		$js=$row['js'];
		$jstxt=$row['jstxt'];
		$wm=$row['wm'];
		$wmtxt=$row['wmtxt'];
		$zh=$row['zh'];
		$zhtxt=$row['zhtxt'];

		$itm=$row['itm'];
		$cnt=$row['cnt'];
		$amt=$row['amt'];
		$note=$row['note'];

#		print( "BUGS_21450 coffee_id=".$row['coffee_id']."<br>\n" );
#		print( "BUGS_21450 pdf=$pdf<br>\n" );
#		print( "BUGS_21450 mp3=$mp3<br>\n" );
#		print( "BUGS_21450 mp4=$mp4<br>\n" );
#		print( "BUGS_21450 yt=$yt<br>\n" );

		$htmout .= "<hr color=black>\n";
		$htmout .= "<hr color=white>\n";
		$htmout .= "<img id=img_ko_coffeeshop_".$coffee_id." src=/imgs/btn/koeyew.png height=40 onclick('toggle'); return false; >ko_coffeeshop_".$coffee_id;
		$htmout .= "     <div id=div_ko_coffeeshop_".$coffee_id.">\n";
		
		$htmtbl_main .= "<div id=div_coffeeshop_table_main>\n";
		$htmtbl_main .= "<h1>ko_coffeeshop_table_main</h1>\n";
		$htmtbl_main .= "<hr color=yellow>\n";
		$htmtbl_main .= "<table id=ko_coffeeshop_table_main>\n";
		$htmtbl_media .= "<div id=div_coffeeshop_table_media>\n";
		$htmtbl_media .= "<h1>ko_coffeeshop_table_media</h1>\n";
		$htmtbl_media .= "<table id=ko_coffeeshop_table_media>\n";
		$htmtbl_smedia .= "<div id=div_coffeeshop_table_smedia>\n";
		$htmtbl_smedia .= "<h1>ko_coffeeshop_table_smedia</h1>\n";
		$htmtbl_smedia .= "<table id=ko_coffeeshop_table_smedia>\n";
		$htmtbl_views .= "<div id=div_coffeeshop_table_views>\n";
		$htmtbl_views .= "<h1>ko_coffeeshop_table_views</h1>\n";
		$htmtbl_views .= "<table id=ko_coffeeshop_table_views>\n";
		$htmtbl_contacts .= "<div id=div_coffeeshop_table_contacts>\n";
		$htmtbl_contacts .= "<h1>ko_coffeeshop_table_contacts</h1>\n";
		$htmtbl_contacts .= "<table id=ko_coffeeshop_table_contacts>\n";
		$htmtbl_biz .= "<div id=div_coffeeshop_table_biz>\n";
		$htmtbl_biz .= "<h1>ko_coffeeshop_table_biz</h1>\n";
		$htmtbl_biz .= "<table id=ko_coffeeshop_table_biz>\n";

		$htmtbl_main .= "<tr>";
		$htmtbl_main .= "<td>".$grp."</td>";
		$htmtbl_main .= "<td>".$status."</td>";
		$htmtbl_main .= "<td>".$coffee_id."</td>";
		$htmtbl_main .= "<td>".$coffee_url."</td>";
		$htmtbl_main .= "</tr>";

		if( $fb == "" ) { $fb="/fb"; }
		if( $pdf == "" ) { $pdf="/pdf/konet.pdf"; }
		if( $gif == "" ) { $gif="/imgs/gif/orbs/orgs.gif"; }
		if( $mp3 == "" ) { $mp3="/kb/aud/mp3/library_of_congress.mp3"; }
		if( $mp4 == "" ) { $mp4="/index1_avril.mp4"; }
		if( $bc == "" ) { $bc="https://bitchute.com"; }
		if( $rm == "" ) { $rm="https://rumble.com"; }
		if( $vm == "" ) { $vm="https://vimeo.com"; }
		if( $yt == "" ) { $yt="https://youtube.com"; }

		if( $pn == "" ) { $pn="/index_pn.html"; }
		if( $sl == "" ) { $sl="/index_sl.html"; }
		if( $tl == "" ) { $tl="/index_tl.html"; }
		if( $tx == "" ) { $tx="/index_tx.html"; }
		if( $zm == "" ) { $zm="/index_zm.html"; }

		if( $fab == "" ) { $fab="https://facebook.com"; }
		if( $gab == "" ) { $gab="https://gab.com"; }
		if( $li == "" ) { $li="https://linkedin.com"; }
		if( $pl == "" ) { $pl="https://parlor.com"; }
		if( $pt == "" ) { $pt="https://pinterest.com"; }
		if( $ss == "" ) { $ss="https://substack.com"; }
		if( $ts == "" ) { $ts="https://truthsocial.com"; }
		if( $tw == "" ) { $tw="https://twitter.com"; }
		if( $jitsi == "" ) { $jitsi="https://jitsi.com"; }
		if( $chat == "" ) { $chat="https://chat.com"; }

		if( $btc == "" ) { $btc="https://bitcoin.com"; }
		if( $eth == "" ) { $eth="https://etherium.com"; }
		if( $shopify == "" ) { $shopify="https://shopify.com"; }
		if( $squareup == "" ) { $squareup="https://squareup.com"; }
		if( $stripe == "" ) { $stripe="https://stripe.com"; }

		if( $dm == "" ) { $dm="https://dailymail.com"; }
		if( $dr == "" ) { $dr="https://thedukereport.com"; }
		if( $gp == "" ) { $gp="https://thegatewaypundit.com"; }
		if( $js == "" ) { $js="https://jimstone.com"; }
		if( $wm == "" ) { $wm="https://whatdoesitmean.com"; }
		if( $zh == "" ) { $zh="https://zerohedge.com"; }

		$pdfhref="<a href=/pdf/web/viewer.html?file=".$pdf." _blank><img src=/imgs/btn/btn_pdf1.png height=25></a>\n";
		$giftn=$gif;
		$gifhref="<a href=".$gif." _blank><img src=".$giftn." height=25></a>\n";
		$fbhref="<a href=".$fb." _blank><img src=/fb/pages/tn/tn_1.png height=25></a>\n";
		$mp3href="<a href=".$mp3." _blank><img src=/imgs/btn/koeyeb_mp3.png height=25></a>\n";
		$mp4href="<a href=".$mp4." _blank><img src=/imgs/btn/koeyeb_mp4.png height=25></a>\n";
		$bchref="<a href=".$bc." _blank><img src=/imgs/btn/koeyeb_bitchute.png height=25></a>\n";
		$ythref="<a href=".$yt." _blank><img src=/imgs/btn/koeyeb_youtube.png height=25></a>\n";
		$txthref="<a href=".$txt." _blank><img src=/imgs/btn/koeyeb_txt.png height=25></a>\n";
		$fabhref="<a href=".$fab." _blank><img src=/imgs/btn/koeyeb_facebook.png height=25></a>\n";
		$sshref="<a href=".$ss." _blank><img src=/imgs/btn/koeyeb_substack.png height=25></a>\n";
		$twhref="<a href=".$tw." _blank><img src=/imgs/btn/koeyeb_twitter.png height=25></a>\n";
		$plhref="<a href=".$pl." _blank><img src=/imgs/btn/koeyeb_parler.png height=25></a>\n";
		$pthref="<a href=".$pt." _blank><img src=/imgs/btn/koeyeb_pinterest.png height=25></a>\n";
		
		$htmtbl_media .= "<td>".$pdfhref."</td><td>".$pdftxt."</td></tr>\n";
		$htmtbl_media .= "<td>".$gifhref."</td><td>".$giftxt."</td></tr>\n";
		$htmtbl_media .= "<td>".$mp3href."</td><td>".$mp3txt."</td></tr>\n";
		$htmtbl_media .= "<td>".$mp4href."</td><td>".$mp4txt."</td></tr>\n";
		$htmtbl_media .= "<td>".$fbhref."</td><td>".$fbtxt."</td></tr>\n";
		$htmtbl_media .= "<td>".$bchref."</td><td>".$bctxt."</td></tr>\n";
		$htmtbl_media .= "<td>".$ythref."</td><td>".$yttxt."</td></tr>\n";
		$htmtbl_media .= "<td>".$txthref."</td><td>".$txttxt."</td></tr>\n";
		
		
		$htmtbl_smedia .= "<tr>";
		$htmtbl_smedia .= "<td>".$fabhref."</td>";
		$htmtbl_smedia .= "<td>".$twhref."</td>";
		$htmtbl_smedia .= "<td>".$sshref."</td>";
		$htmtbl_smedia .= "<td>".$plhref."</td>";
		$htmtbl_smedia .= "<td>".$pthref."</td>";
		$htmtbl_smedia .= "      </tr>";
		
		$htmtbl_views .= "<tr>";
		$htmtbl_views .= "<td>".$pn."</td>";
		$htmtbl_views .= "<td>".$tl."</td>";
		$htmtbl_views .= "<td>".$sl."</td>";
		$htmtbl_views .= "<td>".$zm."</td>";
		$htmtbl_views .= "       </tr>";
		$htmtbl_views .= "<tr>";
		$htmtbl_views .= "<td>".$pntxt."</td>";
		$htmtbl_views .= "<td>".$tltxt."</td>";
		$htmtbl_views .= "<td>".$sltxt."</td>";
		$htmtbl_views .= "<td>".$zmtxt."</td>";
		$htmtbl_views .= "       </tr>";
		
		$htmtbl_contacts .= "<tr>";
		$htmtbl_contacts .= "<td>".$email."</td>";
		$htmtbl_contacts .= "<td>".$phn."</td>";
		$htmtbl_contacts .= "<td>".$jitsi."</td>";
		$htmtbl_contacts .= "<td>".$chat."</td>";

		$htmtbl_biz .= "<td>".$btc.": ".$btctxt."</td>";
		$htmtbl_biz .= "<td>".$eth.": ".$ethtxt."</td>";
		$htmtbl_biz .= "<td>".$shopify.": ".$shopifytxt."</td>";
		$htmtbl_biz .= "<td>".$squareup.": ".$squareuptxt."</td>";
		$htmtbl_biz .= "<td>".$stripe.": ".$stripetxt."</td>";
		$htmtbl_biz .= "</tr>";
		
		$htmtbl_main .= "        </table id=ko_coffeeshop_table_main_end>\n";
		$htmtbl_main .= "        </div id=dov_ko_coffeeshop_table_main_end>\n";
		$htmtbl_media .= "       </table id=ko_coffeeshop_table_media_end_end>\n";
		$htmtbl_media .= "       </div id=dov_ko_coffeeshop_table_media_end>\n";
		$htmtbl_smedia .= "      </table id=ko_coffeeshop_table_smedia_end>\n";
		$htmtbl_smedia .= "      </div id=dov_ko_coffeeshop_table_smedia_end>\n";
		$htmtbl_views .= "       </table id=ko_coffeeshop_table_views_end>\n";
		$htmtbl_views .= "       </div id=dov_ko_coffeeshop_table_views_end>\n";
		$htmtbl_contacts .= "    </table id=ko_coffeeshop_table_contacts_end>\n";
		$htmtbl_contacts .= "    </div id=dov_ko_coffeeshop_table_contacts_end>\n";
		$htmtbl_biz .= "    </table id=ko_coffeeshop_table_biz>\n";
		$htmtbl_biz .= "    </div id=dov_ko_coffeeshop_table_biz_end>\n";
		 
		$htmout .= $htmtbl_main;
		$htmout .= $htmtbl_media;
		$htmout .= $htmtbl_smedia;
		$htmout .= $htmtbl_views;
		$htmout .= $htmtbl_biz;
		$htmout .= $htmtbl_contacts;
		
		$htmout .= "     </div id=div_ko_coffeeshop_".$coffee_id."_end>\n";
		$htmout .= "<hr color=red>\n";
		$htmout .= "<hr color=red>\n";



#		print( "BUGS_16390 j=$j idx=".$row['idx']." <br>" );
#		print( "BUGS_16390 j=$j name=".$row['name']." <br>" );
#		print( "BUGS_16390 j=$j email=".$row['email']." <br>" );
#		print( "BUGS_16390 j=$j msg=".$row['msg']." <br>" );
		}

#	print( $htmout );
#	for( $j=0; $j<$jlim; $j++ ) {
#		print( $psvdta[$j]."\n" );
#		}
	print_r($psvdta);














#	while ($row = $result->fetch()) {
#		extract($row);
#		$datapie[] = array($idx, $img);
#		}
#	$ko_data = json_encode($datapie);
#	$pdo=null;


#	foreach( $pdo->query($sql_sel_json) as $row ) {
#		$j=$j+1;
#		$len=len($row[$j]);
#		print( "BUGS len=$len <br>" );
#		$val=$row[$j][$fld];
#		printf( "$progid $dttm MSG_16340: $sql_sel_json $j val=$val fld=$fld <br>\n" );
#		$output .= "$val ";
#		}
#	$pdo=null;

#	$pdo = newpdo( $dbfile );
#	$sql_sel_links = "select * from us";
#	$us = sqlq( $dbfile, $sql_sel_links, "us" );
#	printf( "ko_json MSG_16337:  us=[$us] sql_sel_link=[$sql_sel_link] dbfile=[$dbfile]<br>\n" );


#		$ko_data= Array();
#		$ko_data_test = array(
#			1 => array( "idx,koco,dttm,status,desc" ),
#			2 => array( "idx1,koco1,dttm1,status1,desc1" ),
#			3 => array( "idx2|koco2|dttm2|status2|desc2" ),
#			4 => array( "idx3|koco3|dttm3|status3|desc3"),
#			);
#		$ko_json_test=json_encode($ko_data_test);
#		$ko_json = json_encode($ko_data);

	$ko_json=$psvhdr;
	$ko_json=$psvdta;
	return( $ko_json );
	}




function sql3_ko_media($options) {
#	$ko_json=ko_json($options);
	$dbfile="./ko.db3";
	$sql_sel_coffee="select * from coffee_list";

	print( "BUGS_21000 sql3_ko_coffee options=$options dbfile=$dbfile sql_sel_coffee=$sql_sel_coffee<br>" );

	$j=0; $psvhdr="";
        $pdo = newpdo($dbfile);
	$result = $pdo->query($sql_sel_coffee);
	$result->setFetchMode(PDO::FETCH_ASSOC);
#	$rows = $result->fetchall();

	$j=0;
	$hdrs="";
	$vals="";
	$psvdta = array();
	while ($row = $result->fetch()) {
		$j=$j+1;
		$keys = array_keys($row);
		foreach($keys as $key => $val ) {
			$psvhdr .= $val ."|";
			$psvdta[$j] .= $row[$val] . "|";
#			echo( "BUGS_16381 hdr=$hdr key=".$key." val=".$val. "<br>");
			}
		$jlim=$j;
		if( $j==1) {
#			print( "BUGS_21742 $j psvhdr=".$psvhdr."<br>");
			}
#		print( "BUGS_21743 $j psvdta=".$psvdta[$j]."<br>");


#		print( "BUGS_16390 j=$j idx=".$row['idx']." <br>" );
#		print( "BUGS_16390 j=$j name=".$row['name']." <br>" );
#		print( "BUGS_16390 j=$j email=".$row['email']." <br>" );
#		print( "BUGS_16390 j=$j msg=".$row['msg']." <br>" );
		}

#	while ($row = $result->fetch()) {
#		extract($row);
#		$datapie[] = array($idx, $img);
#		}
#	$ko_data = json_encode($datapie);
#	$pdo=null;


#	foreach( $pdo->query($sql_sel_json) as $row ) {
#		$j=$j+1;
#		$len=len($row[$j]);
#		print( "BUGS len=$len <br>" );
#		$val=$row[$j][$fld];
#		printf( "$progid $dttm MSG_16340: $sql_sel_json $j val=$val fld=$fld <br>\n" );
#		$output .= "$val ";
#		}
#	$pdo=null;

#	$pdo = newpdo( $dbfile );
#	$sql_sel_links = "select * from us";
#	$us = sqlq( $dbfile, $sql_sel_links, "us" );
#	printf( "ko_json MSG_16337:  us=[$us] sql_sel_link=[$sql_sel_link] dbfile=[$dbfile]<br>\n" );


#		$ko_data= Array();
#		$ko_data_test = array(
#			1 => array( "idx,koco,dttm,status,desc" ),
#			2 => array( "idx1,koco1,dttm1,status1,desc1" ),
#			3 => array( "idx2|koco2|dttm2|status2|desc2" ),
#			4 => array( "idx3|koco3|dttm3|status3|desc3"),
#			);
#		$ko_json_test=json_encode($ko_data_test);
#		$ko_json = json_encode($ko_data);

	$ko_json=$psvhdr;
	$ko_json=$psvdta;
	return( $ko_json );
	}


function sql3_ko_media2($options) {
#	$ko_json=ko_json($options);
	$dbfile="./ko.db3";
	$sql_sel_media="select * from media_list";

#	print( "BUGS_22000 sql3_ko_media options=$options dbfile=$dbfile sql_sel_media=$sql_sel_media<br>" );

	$j=0; $psvhdr="";
        $pdo = newpdo($dbfile);
	$result = $pdo->query($sql_sel_media);
	$result->setFetchMode(PDO::FETCH_ASSOC);
#	$rows = $result->fetchall();

	$j=0;
	$hdrs="";
	$vals="";
	$psvdta = array();
	while ($row = $result->fetch()) {
		$j=$j+1;
		$keys = array_keys($row);
		foreach($keys as $key => $val ) {
			$psvhdr .= $val ."|";
			$psvdta[$j] .= $row[$val] . "|";
#			echo( "BUGS_16381 hdr=$hdr key=".$key." val=".$val. "<br>");
			}
		$jlim=$j;
		if( $j==1) {
			print( "BUGS_16400 $j psvhdr=".$psvhdr."<br>");
			}
		print( "BUGS_16400 $j psvdta=".$psvdta[$j]."<br>");


#		print( "BUGS_16390 j=$j idx=".$row['idx']." <br>" );
#		print( "BUGS_16390 j=$j name=".$row['name']." <br>" );
#		print( "BUGS_16390 j=$j email=".$row['email']." <br>" );
#		print( "BUGS_16390 j=$j msg=".$row['msg']." <br>" );
		}

#	while ($row = $result->fetch()) {
#		extract($row);
#		$datapie[] = array($idx, $img);
#		}
#	$ko_data = json_encode($datapie);
#	$pdo=null;


#	foreach( $pdo->query($sql_sel_json) as $row ) {
#		$j=$j+1;
#		$len=len($row[$j]);
#		print( "BUGS len=$len <br>" );
#		$val=$row[$j][$fld];
#		printf( "$progid $dttm MSG_16340: $sql_sel_json $j val=$val fld=$fld <br>\n" );
#		$output .= "$val ";
#		}
#	$pdo=null;

#	$pdo = newpdo( $dbfile );
#	$sql_sel_links = "select * from us";
#	$us = sqlq( $dbfile, $sql_sel_links, "us" );
#	printf( "ko_json MSG_16337:  us=[$us] sql_sel_link=[$sql_sel_link] dbfile=[$dbfile]<br>\n" );


#		$ko_data= Array();
#		$ko_data_test = array(
#			1 => array( "idx,koco,dttm,status,desc" ),
#			2 => array( "idx1,koco1,dttm1,status1,desc1" ),
#			3 => array( "idx2|koco2|dttm2|status2|desc2" ),
#			4 => array( "idx3|koco3|dttm3|status3|desc3"),
#			);
#		$ko_json_test=json_encode($ko_data_test);
#		$ko_json = json_encode($ko_data);

	$ko_json=$psvhdr;
	$ko_json=$psvdta;
	return( $ko_json );
	}





function ko_json() {
#	$ko_json=ko_json($options);
	$dbfile="./ka1.db3";
	$sql_sel_json="select * from us limit 5";

	$j=0;
        $pdo = newpdo($dbfile);
	$result = $pdo->query($sql_sel_json);
	$result->setFetchMode(PDO::FETCH_ASSOC);
#	$rows = $result->fetchall();

	$j=0;
	$hdrs="";
	$vals="";
	$psvdta = array();
	while ($row = $result->fetch()) {
		$j=$j+1;
		$keys = array_keys($row);
		foreach($keys as $key => $val ) {
			$psvhdr .= $val ."|";
			$psvdta[$j] .= $row[$val] . "|";
#			echo( "BUGS_16381 hdr=$hdr key=".$key." val=".$val. "<br>");
			}
		$jlim=$j;
		if( $j==1) {
			print( "BUGS_16400 $j psvhdr=".$psvhdr."<br>");
			}
		print( "BUGS_16400 $j psvdta=".$psvdta[$j]."<br>");


#		print( "BUGS_16390 j=$j idx=".$row['idx']." <br>" );
#		print( "BUGS_16390 j=$j name=".$row['name']." <br>" );
#		print( "BUGS_16390 j=$j email=".$row['email']." <br>" );
#		print( "BUGS_16390 j=$j msg=".$row['msg']." <br>" );
		}

#	while ($row = $result->fetch()) {
#		extract($row);
#		$datapie[] = array($idx, $img);
#		}
#	$ko_data = json_encode($datapie);
#	$pdo=null;


#	foreach( $pdo->query($sql_sel_json) as $row ) {
#		$j=$j+1;
#		$len=len($row[$j]);
#		print( "BUGS len=$len <br>" );
#		$val=$row[$j][$fld];
#		printf( "$progid $dttm MSG_16340: $sql_sel_json $j val=$val fld=$fld <br>\n" );
#		$output .= "$val ";
#		}
#	$pdo=null;

#	$pdo = newpdo( $dbfile );
#	$sql_sel_links = "select * from us";
#	$us = sqlq( $dbfile, $sql_sel_links, "us" );
#	printf( "ko_json MSG_16337:  us=[$us] sql_sel_link=[$sql_sel_link] dbfile=[$dbfile]<br>\n" );


#		$ko_data= Array();
#		$ko_data_test = array(
#			1 => array( "idx,koco,dttm,status,desc" ),
#			2 => array( "idx1,koco1,dttm1,status1,desc1" ),
#			3 => array( "idx2|koco2|dttm2|status2|desc2" ),
#			4 => array( "idx3|koco3|dttm3|status3|desc3"),
#			);
#		$ko_json_test=json_encode($ko_data_test);
#		$ko_json = json_encode($ko_data);

	$ko_json=$psvhdr;
	$ko_json=$psvdta;
	return( $ko_json );
	}



function ko_json1() {

#	header('Content-type: application/json');

	$arDaniel = array();
	$arAndi = array();
	$arDave = array();
	$arSimon = array();

	for ($j=0; $j < 4; $j++) { 
		$name;
		$arr;

  		if	(j == 0) {$name = 'Daniel'; $arr = $arDaniel;}
		elseif	(j == 1) {$name = 'Andi'; $arr = $arAndi;}
		elseif	(j == 2) {$name = 'Dave'; $arr = $arDave;}
		elseif	(j == 3) {$name = 'Simon'; $arr = $arSimon;}

		$sql = "SELECT Datum, ID, RR, RL, KB, BD, SD, KH, Reihenfolge FROM $name ORDER BY date(Datum)";
		$db = newpdo($dbfile,$sql,$result)
			or die('ko_json1 ERR_16382 $dbfile NOTFOUND');
		$i = 1;
		foreach($res = $db->query($query) as $value) {
			$curr = array();
			array_push($curr["Datum"] = $value[0]);
			array_push($curr["ID"] = $value[1]);
			array_push($curr["RR"] = $value[2]);
			array_push($curr["RL"] = $value[3]);
			array_push($curr["KB"] = $value[4]);
			array_push($curr["BD"] = $value[5]);
			array_push($curr["SD"] = $value[6]);
			array_push($curr["KH"] = $value[7]);
			array_push($curr["Reihenfolge"] = $value[8]);
			array_push($arr[$i] = $curr);
			$i++;
			}
		}
	$json = array(
		"Daniel" => $arDaniel,
		"Andi" => $arAndi,
		"Dave" => $arDave,
		"Simon" => $arSimon
		);
	
	echo json_encode($json);
	$db = NULL;
	}
		

function ko_chat() {
	print( "ko_chat_beg_16500 " );
	$dttm=date('Ymd_His');
	$remote_addr=$_SERVER['REMOTE_ADDR'];
	$referer=$_SERVER['HTTP_REFERER'];

	$user_agent=$_SERVER['USER_AGENT'];
	$http_host=$_SERVER['HTTP_HOST'];
	$query_string=$_SERVER['QUERY_STRING'];
	$get=$_GET;
	$post=$_POST;
	$files=$_FILES;

	ko_chat($ko_chat);
	$ko_chats=ko_chats($ko_chats);

	print( "ko_chat_end_16510 " );
	return( $ko_chats );
	}

function ko_chati() {
	print( "ko_chati_beg_16515 " );
#	$dbfile=$_GLOBAL['dbfile'];
	$dbfile="./im.db3";
	$tblname="im";

	$idx=1;
	$dttm=date('Ymd_His');
	$status="";
	$koco="koco";
	print( "ko_chati_16521 " );

	$remote_addr=$_SERVER['REMOTE_ADDR'];
	$remote_port=$_SERVER['REMOTE_PORT'];
	$user_agent=$_SERVER['USER_AGENT'];
	$http_user_agent=$_SERVER['HTTP_USER_AGENT'];
	$user_agent=$http_user_agent;
	$user_agent=str_replace( " ", "_", $user_agent );
	$user_agent=str_replace( ",", "", $user_agent );
	$user_agent=str_replace( "/", "", $user_agent );
	$user_agent=str_replace( ";", "", $user_agent );
	$user_agent=str_replace( "(", "", $user_agent );
	$user_agent=str_replace( ")", "", $user_agent );
	$user_agent=str_replace( ":", "", $user_agent );
	$user_agent=str_replace( ".", "", $user_agent );
	$user_agent=strtolower( $user_agent );

	
	$query_string=$_SERVER['QUERY_STRING'];
	$referer=$_SERVER['REFERER'];
	$http_host=$_SERVER['HTTP_HOST'];
	$get=$_GET;
	$post=$_POST;
	$files=$_FILES;

	$sqladd_im = "insert or replace into $tblname (";
	$sqladd_im .= "'idx', ";
	$sqladd_im .= "'dttm', ";
	$sqladd_im .= "'status', ";
	$sqladd_im .= "'koco', ";

	$sqladd_im .= "'remote_addr', ";
	$sqladd_im .= "'remote_port', ";
	$sqladd_im .= "'user_agent', ";
	$sqladd_im .= "'referer', ";

	$sqladd_im .= "'http_host', ";
	$sqladd_im .= "'query_string', ";
	$sqladd_im .= "'get', ";
	$sqladd_im .= "'post', ";
	$sqladd_im .= "'files', ";

	$sqladd_im .= "'msg', ";
	$sqladd_im .= "'desc' ";
	$sqladd_im .= ") "					;

	$sqladd_im .= " values ( ";
	
	$sqladd_im .= "\"$idx\", ";
	$sqladd_im .= "\"$dttm\", ";
	$sqladd_im .= "\"$status\", ";
	$sqladd_im .= "\"$koco\", ";

	$sqladd_im .= "\"$remote_addr\", ";
	$sqladd_im .= "\"$remote_port\", ";
	$sqladd_im .= "\"$user_agent\", ";
	$sqladd_im .= "\"$referer\", ";

	$sqladd_im .= "\"$http_host\", ";
	$sqladd_im .= "\"$query_string\", ";
	$sqladd_im .= "\"$get\", ";
	$sqladd_im .= "\"$post\", ";
	$sqladd_im .= "\"$files\", ";

	$sqladd_im .= "\"$msg\", ";
	$sqladd_im .= "\"$desc\" ";
	$sqladd_im .= " ); ";

	print( "ko_chati MSG_16600 sqladd_im=".$sqladd_im."<br>" );
	$j=0;
        $pdo = newpdo($dbfile);
	$result = $pdo->query($sqladd_im);

	ko_chats($ko_chats);
	print( "ko_chati_16611 sqladd_im=".$sqladd_im."<br>" );
	return( $ko_chati );
	}

function ko_chats() {
	$dttm=date('Ymd_His');
	$remote_addr=$_SERVER['REMOTE_ADDR'];
	$user_agent=$_SERVER['USER_AGENT'];
	$http_host=$_SERVER['HTTP_HOST'];
	$query_string=$_SERVER['QUERY_STRING'];
	$get=$_GET;
	$post=$_POST;
	$ko_chat2="ko_chati ".$dttm." ".$remote_addr." ".$user_agent;
	$dbfile="./im.db3";
	$sql_sel_chats="select * from im";

#	$dbfile="./ka1.db3";
	$dbfile="./im.db3";
	$dbtable="im";
	
	$sql_sel_chats="select * from im order by dttm desc";
	print( "ko_chats_16600 dbfile=$dbfile sql_sel_chats=$sql_sel_chats<br>" );

	$j=0;
        $pdo = newpdo($dbfile);
	$result = $pdo->query($sql_sel_chats);
	$result->setFetchMode(PDO::FETCH_ASSOC);
#	$rows = $result->fetchall();
#	print( "ko_chats_16630 dbfile=$dbfile sql_sel_chats=$sql_sel_chats<br>" );

	$j=0;
	$hdrs="";
	$vals="";
	$psvdta = array();
#	print( "BUGS_16635 ko_chats <br>" );
	while ($row = $result->fetch()) {
		$j=$j+1;
		$keys = array_keys($row);
		foreach($keys as $key => $val ) {
			$psvhdr .= $val ."|";
			$psvdta[$j] .= $row[$val] . "|";
#			echo( "BUGS_16630 hdr=$hdr key=".$key." val=".$val. "<br>");
			}
		$jlim=$j;
		if( $j==1) {
			print( "BUGS_16640 $j psvhdr=".$psvhdr."<br>");
			}
		print( "BUGS_16650 $j psvdta=".$psvdta[$j]."<br>");
		}


	$j=0;
	$im_chats="";
	print( "ko_chats_end_16660 ko_chats <br>" );

# err	while ($row = $result->fetch_array(PDO::FETCH_ARRAY)) {
# err	while ($row = $result->fetch_array()) {
##	while ($row = $result->fetch()) {
#		$j=$j++;
#		print( "ko_chats_16630: row_$j ".$j."<br><hr>" );
#		print( "ko_chats_16630: row_$j f_0=".$row[0]."=<br>" );
#		print( "ko_chats_16630: row_$j f_1=".$row[1]."=<br>" );
#		print( "ko_chats_16630: row_$j f_2=".$row[2]."=<br>" );
#		print( "ko_chats_16630: row_$j f_10=".$row[10]."=<br>" );

#		print( "ko_chats_16630: row_$j f_idx=".$row['idx']."=<br>" );
#		print( "ko_chats_16630: row_$j f_name=".$row['name']."=<br>" );
#		print( "ko_chats_16630: row_$j f_email=".$row['email']."=<br>" );
#		print( "ko_chats_16630: row_$j f_msg=".$row['msg']."=<br>" );

#		$j=0;


#		$im_chats .= $j . " = ";
#		$im_chats .= $row['idx'];
#		$im_chats .= $row['dttm'];
#		$im_chats .= $row['status'];
#		$im_chats .= $row['koco'];
#		$im_chats .= $row['remote_addr'];
#		$im_chats .= $row['remote_port'];
#		$im_chats .= $row['user_agent'];
#		$im_chats .= $row['referer'];
#		$im_chats .= $row['http_host'];
#		$im_chats .= $row['query_string'];
#		$im_chats .= $row['get'];
#		$im_chats .= $row['post'];
#		$im_chats .= $row['files'];
#		$im_chats .= $row['msg'];
#		$im_chats .= $row['user'];
#		$im_chats .= $row['name'];
#		$im_chats .= $row['email'];
#		$im_chats .= $row['phn'];
#		$im_chats .= $row['pw'];
#		$im_chats .= $row['desc'];
#		$im_chats .= "<br>";
##		}
#	$pdo=null;
	
#	while ($row = $result->fetch()) {
#		extract($row);
#		$datapie[] = array($idx, $img);
#		}
#	$ko_chats = $datapie;
#	$ko_data = json_encode($datapie);
#	$pdo=null;

	return( $im_chats );
	}

function ko_kup() {
	$request=$_REQUEST;
	$get=$_GET;
	$files=$_FILES;
	$referer="referer";

	if( isset($_SERVER['HTTP_REFERER'] )) { $referer=$_SERVER['HTTP_REFERER']; }
#	print( "referer=$pinfo_referer<br>" );
	$remote_addr="remote_addr";
	$remote_port="remote_port";
	$server_addr="server_addr";
	$server_port="server_port";
	$server_name="server_name";
	$server_redirect="server_redirect";

	if( isset($_SERVER['REMOTE_ADDR'])) { $remote_addr=$_SERVER['REMOTE_ADDR']; }
	if( isset($_SERVER['REMOTE_PORT'] )) { $remote_port=$_SERVER['REMOTE_PORT']; }
	if( isset($_SERVER['SERVER_ADDR'] )) { $server_addr=$_SERVER['SERVER_ADDR']; }
	if( isset($_SERVER['SERVER_PORT'] )) { $server_port=$_SERVER['SERVER_PORT']; }
	if( isset($_SERVER['SERVER_NAME'] )) { $server_name=$_SERVER['SERVER_NAME']; }
	if( isset($_SERVER['REDIRECT_STATUS'] )) { $server_redirect=$_SERVER['REDIRECT_STATUS']; }
	$php_self=$_SERVER['PHP_SELF'];

	$remote_addrcode=str_replace( ".", "-", $remote_addr );
#	print( "BUGS_22 remote_addr=$remote_addr<br>\n" );
#	print( "BUGS_22 remote_addrcode=$remote_addrcode<br>\n" );
	$server_content_length="server_content_length";
	$server_request_time="request_time";
	$server_argv="server_argv";
	$server_argc="server_argc";
	$server_name="server_name";
	$server_host="server_host";
	


	if( isset($_SERVER['CONTENT_LENGTH'] )) { $server_content_length=$_SERVER['CONTENT_LENGTH']; }
	if( isset($_SERVER['REQUEST_TIME'] )) { $server_request_time=$_SERVER['REQUEST_TIME']; }
	if( isset($_SERVER['argv'] )) { $server_argv=$_SERVER['argv']; }
	if( isset($_SERVER['argc'] )) { $server_argv=$_SERVER['argc']; }
	if( isset($_SERVER['SERVER_NAME'] )) { $server_name=$_SERVER['SERVER_NAME']; }
	if( isset($_SERVER['HOST'] )) { $server_host=$_SERVER['HOST']; }

#	print( "server_host=$server_host <br>" );
	$http_user_agent=$_SERVER['HTTP_USER_AGENT'];
	$user_agent=$http_user_agent;
	$user_agent=str_replace( " ", "_", $user_agent );
	$user_agent=str_replace( ",", "", $user_agent );
	$user_agent=str_replace( "/", "", $user_agent );
	$user_agent=str_replace( ";", "", $user_agent );
	$user_agent=str_replace( "(", "", $user_agent );
	$user_agent=str_replace( ")", "", $user_agent );
	$user_agent=str_replace( ":", "", $user_agent );
	$user_agent=str_replace( ".", "", $user_agent );
	$user_agent=strtolower( $user_agent );

#	print( "http_user_agent=$http_user_agent<br>" );
#	print( "user_agent=$user_agent<br>" );
#	$pinfo_user_agent=str_replace( " ", "_", $pinfo_user_agent );

	$files_cnt=count($_FILES);

	if( $files_cnt == 0 ) return(false);
	print( "files_cnt=".$files_cnt."<br>" );
#	print( "user_agent=".$user_agent."<br>" );

#	$item_level=count( explode( "!", $item_levels ));
#	$item_text=str_replace( "!", "", $item_levels );

	$dbfile="./kups.db3";
	$tblname="kups";

	$sql_create_kup="create table $tblname ( ";
	$sql_create_kup .= "dttm varchar, ";
	$sql_create_kup .= "status varchar, ";
	$sql_create_kup .= "f_name varchar, ";
	$sql_create_kup .= "f_type varchar, ";
	$sql_create_kup .= "f_size varchar, ";
	$sql_create_kup .= "f_error varchar, ";
	$sql_create_kup .= "f_tmp varchar, ";
	$sql_create_kup .= "t_name varchar, ";
	$sql_create_kup .= "referer varchar, ";
	$sql_create_kup .= "query_string varchar, ";
	$sql_create_kup .= "user_agent varchar, ";
	$sql_create_kup .= "remote_addr varchar, ";
	$sql_create_kup .= "remote_port varchar, ";
	$sql_create_kup .= "server_addr varchar, ";
	$sql_create_kup .= "server_port varchar, ";
	$sql_create_kup .= "desc"; 
	$sql_create_kup .= ") ";

#	print( "BUGS_230 sql_create_kup  dbfile=$dbfile tblname=$tblname sql_create_kup=$sql_create_kup<br>\n" );
#	pdo_create_kup( $dbfile,  $tblname, $sql_create_kup );
#	pdo_create_tbl( 'kup_tn.db3',  'kup_tn', $sql_create_kup );



# loop through the array of files
#	echo '<hr color=red>';
#	echo "<hr color=white>";
#	echo '<hr color=blud>';
#	echo '<a class="popover" href="./?q=i"  target="_blank">'
#	echo '	<img height=50 src="./imgs/btn/koeye.png" target="_blank">';
#	echo '	<span><img src="./imgs/btn/koeyeb.png" target="_blank"></span>'
#	echo '	</a>';
#	echo '<hr color=blud>';
#	echo '<hr color=white>';
#	echo '<hr color=red>';

	$server_path=$_SERVER['Path'];
	$server_systemdrive=$_SERVER['SystemDrive'];
	$server_systemroot=$_SERVER['SystemRoot'];
	$server_temp=$_SERVER['TEMP'];
	$server_tmp=$_SERVER['TMP'];

	$server_script_name=$_SERVER['SCRIPT_NAME'];
	$php_self=$_SERVER['PHP_SELF'];
	$server_query_string=$_SERVER['QUERY_STRING'];
	$server_request_method=$_SERVER['REQUEST_METHOD'];
	$server_document_root=$_SERVER['DOCUMENT_ROOT'];

	foreach($_FILES as $index => $file) {
// for easy access
		$fileName     = $file['name'];
		$fileTempName = $file['tmp_name'];

		$f_name=$fileName;
// check if there is an error for particular entry in array
// some error occurred with the file in index $index
// yield an error here
		if(!empty($file['error'][$index])) {
			return false;
			}
		$kup_path="./kup/"; 
		$kup_path_sl="./kup/"; 
		$kup_path_h5g="./kup/"; 

// check whether file has temporary path and whether it indeed is an uploaded file
// move the file from the temporary directory to somewhere of your choosing
// move_uploaded_file($fileTempName, "uploads/" . $fileName);
		$dttm=date('Ymd_His');
		if(!empty($fileTempName) && is_uploaded_file($fileTempName)) {
			$f_name=$fileName;
			$f_pathfile=$kup_path.$f_name;
			$t_name=$f_name;

			$t_name=ko_namefix( $f_name );
#			print( "kup MSG_21031:  f_name=".$f_name."<br>" );
#			print( "kup MSG_21032:  t_name=".$t_name."<br>" );


			$t_name="kup_".$dttm."_"."$remote_addrcode"."_".$t_name;
			$t_pathfile=$kup_path.$t_name;
			$t_pathfile_sl=$kup_path_sl.$t_name;
			$t_pathfile_h5g=$kup_path_h5g.$t_name;



			$tn_pathfile=$kup_path."tn/tn_".$t_name;
			$tn_pathfile=str_replace(".jpg", ".png", $tn_pathfile );
			$tn_pathfile=str_replace(".gif", ".png", $tn_pathfile );
			$tn_pathfile=str_replace(".pdf", ".png", $tn_pathfile );
			$tn_pathfile=str_replace(".mp4", ".png", $tn_pathfile );
			$tn_pathfile=str_replace(".csv", ".png", $tn_pathfile );
			$tn_pathfile=str_replace(".psv", ".png", $tn_pathfile );
			$tn_pathfile=str_replace(".db3", ".png", $tn_pathfile );
			$tn_pathfile=str_replace(".txt", ".png", $tn_pathfile );

#			print( "kup MSG_300:  kup_path=".$kup_path."<br>" );
#			print( "kup MSG_300:  f_name=".$f_name."<br>" );
#			print( "kup MSG_300:  t_name=".$t_name."<br>" );
#			print( "kup MSG_300:  t_pathfile=".$t_pathfile."<br>" );
#			print( "kup MSG_300:  tn_pathfile=".$tn_pathfile."<br>" );
#			print( "kup MSG_300:  f_pathfile=".$f_pathfile."<br>" );

			print( "kup MSG_290:  fileTempName=".$fileTempName."<br>" );

			move_uploaded_file($fileTempName, $t_pathfile);




# mark-up to be passed to jQuery's success function.
#			echo '<p>Click <strong><a href="uploads/' . $fileName . '" target="_blank">' . $fileName . '</a></strong> to download it.</p>';
#			echo '<p>... <strong><a href="i/' . $fileName . '" target="_blank">' . $fileName . '</a></strong> ...</p>';

# 			echo "<hr color=white>";
# 			echo '<a class="popover" href="i/' . $fileName . '" target="_blank">';
# 			echo '<a class="thumbnail" href="i/' . $fileName . '" target="_blank">';
# 			echo '	<img height=50 src="./imgs/btn/koeye.png" target="_blank">';
#   . $fileName;


			print( "<hr color=black>");
			print( '<a  href="' . $t_pathfile . '" target="_blank">');
			print( '	<img height=100 src="' . $tn_pathfile . '" bordder=0 >');
			print( '	</a>');
			print( "<p><font size=6>t=".$t_pathfile."</font></p>");
			print( "<p><font size=6>tn=".$tn_pathfile."</font></p>");
			print( "	<br>");
			print( "<hr color=white>");
			}
		}


#	print( "remote_addr=$pinfo_remote_addr<br>" );
#	print( "remote_port=$pinfo_remote_port<br>" );
#	print( "server_addr=$pinfo_server_addr<br>" );
#	print( "server_port=$pinfo_server_port<br>" );
#	print( "server_name=$pinfo_server_name<br>" );
#	print( "php_self=$php_self<br>" );
#	print( "<br>" );
#	print( "<hr color=white>" );


	$dttm=date('Ymd_His');

	$sl_data="";
	$sl_match='<div id="div_sl_links">';
	$sl_html_cur="./sl/index_sl_kup.html";
	$sl_html_old="./sl/index_sl_kup_".$dttm.".html";
	$sl_html_new="./sl/index_sl_kup_new.html";

	$h5g_data="";
	$h5g_match= '<div id="div_h5g_links" >';
	$h5g_html_cur= "sl/index_h5g_kup.html";
	$h5g_html_old= "sl/index_h5g_kup_".$dttm.".html";
	$h5g_html_new= "sl/index_h5g_kup_new.html";


	$file_cnt=count($_FILES);
	for( $fnum=0; $fnum< $file_cnt; $fnum++ ) {
		$fcode="file".$fnum;
		$f_name=$_FILES[$fcode][name];
		$f_type=$_FILES[$fcode][type];
		$f_size=$_FILES[$fcode][size];
		$f_error=$_FILES[$fcode][error];
		$f_tmp=$_FILES[$fcode][tmp_name];
		$t_name=$f_name;
		$t_name=strtolower( $t_name );
		$t_name=str_replace( " ","_", $t_name );
		$t_name=str_replace( "'","_", $t_name );
		$t_name=str_replace( "@","_", $t_name );
		$t_name=str_replace( "-","_", $t_name );
		$t_name=str_replace( "'","_", $t_name );
		$t_name=str_replace( ",","_", $t_name );
		$t_name=str_replace( ":","_", $t_name );
		$t_name=str_replace( "#","_", $t_name );
		$t_name=str_replace( "|","-", $t_name );
		$t_name=str_replace( "__","_", $t_name );


		$t_name="kup_".$dttm."_"."$remote_addrcode"."_".$t_name;
		$t_pathfile=$kup_path.$t_name;
		$f_pathfile=$kup_path.$t_name;
		$tn_pathfile=$kup_path."tn/tn_".$t_name;
		$tn_pathfile=str_replace( ".gif", ".png", $tn_pathfile );
		$tn_pathfile=str_replace( ".jpeg", ".png", $tn_pathfile );
		$tn_pathfile=str_replace( ".jpg", ".png", $tn_pathfile );
		$tn_pathfile=str_replace( ".txt", ".png", $tn_pathfile );
		$tn_pathfile=str_replace( ".pdf", ".png", $tn_pathfile );
		$tn_pathfile=str_replace( ".csv", ".png", $tn_pathfile );
		$tn_pathfile=str_replace( ".psv", ".png", $tn_pathfile );
		$tn_pathfile=str_replace( ".db3", ".png", $tn_pathfile );
		$tn_pathfile=str_replace( ".mp4", ".png", $tn_pathfile );
		$tn_height="100";

//		print( "BUGS_380 f_pathfile=".$f_pathfile."</br>" );
//		print( "BUGS_380 t_pathfile=".$t_pathfile."</br>" );
//		print( "BUGS_380 t_name=".$t_name."</br>" );
//		print( "BUGS_380 tn_height=".$tn_height."</br>" );

		
		$b64_tn=ko_tn( $kup_path, $t_name, $tn_height );
		$b64d_tn=base64_decode($b64_tn);
//		print( "<br><hr color=whte><br>" );
//		print( "BUGS_350 t_pathfile=".$t_pathfile."</br>" );
//		print( "BUGS_350 f_pathfile=".$f_pathfile."</br>" );
//		print( "BUGS_350 tn_pathfile=".$tn_pathfile."</br>" );

//		print( "BUGS_350 b64_tn=".$b64_tn."</br>" );
//		print( "BUGS_350 b64d_tn=".base64_decode($b64_tn)."</br>" );
//		print( 'kup '.$dttm.' BUGS_350: <br>' );

//		print( '<a href="'.$f_pathfile.'" class="popover" target=_blank>' );
//		print( '	<img src="'.$tn_pathfile.'" border=0 ' );
//		print( '	alt="'.$tn_pathfile.'" >' );
//		print( '	<span><img src="'.$b64_tn.'" border=0></span>' );
//		print( '	</a><br>' );

//		print( '<a href="'.$f_pathfile.'" class="popover" target=_blank>' );
//		print( '	<img src="'.$b64_tn.'" border=0>' );
//		print( '	<span><img src="'.$tn_pathfile.'" border=0 ' );
//		print( '	alt="'.$tn_pathfile.'" >' );
//		print( '	</a><br>' );

// 		$syscmd_im_tn = "mogrify -resize x100 -write $tn_pathfile $t_pathfile\n";
// 		print( "<font size=6>\n" );
// 		$syscmd_test2 = "mogrify >> ./syscmd_test.txt";
// 		system( $syscmd_test2 );

// 		print( "BUGS_214 syscmd_im_tn=".$syscmd_im_tn."<br>\n");
// 		$stat=system( $syscmd_im_tn );
// 		print( "BUGS_215 stat=".$stat."<br>\n");
// 		$syscmd_test='uname;pwd >> ./syscmd_test.txt';
// 		print( "BUGS_215 syscmd_test=".$syscmd_test."<br>\n");
// 		system( $syscmd_test );
// 		print( "</font>\n" );

		$t_pathfile_sl=$kup_path_sl.$t_name;
		$t_pathfile_h5g=$kup_path_h5g.$t_name;

		$desc="desc: ".$t_pathfile;

//		print( "fnum=$fnum fcode=$fcode<br>" );
//		print( "fnum=$fnum f_name=$f_name<br>" );
//		print( "fnum=$fnum f_type=$f_type<br>" );
//		print( "fnum=$fnum f_size=$f_size<br>" );
//		print( "fnum=$fnum t_name=$t_name<br>" );
//		print( "$progid $dttm $fnum pathfile=$t_pathfile type=$f_type size=f_size<br>" );

//		print( "$fcode name=".$_FILES[$fcode][name]."<br>" );
//		print( "$fcode type=".$_FILES[$fcode][type]."<br>" );
//		print( "$fcode size=".$_FILES[$fcode][size]."<br>" );
//		print( "$fcode error=".$_FILES[$fcode][error]."<br>" );
//		print( "$fcode tmp_name=".$_FILES[$fcode][tmp_name]."<br>" );
//		print( "<hr color=black>" );


		$sqladd = "insert or replace into $tblname (";
		$sqladd .= "dttm, ";
		$sqladd .= "status, ";
		$sqladd .= "f_name, ";
		$sqladd .= "f_type, ";
		$sqladd .= "f_size, ";
		$sqladd .= "f_error, ";
		$sqladd .= "f_tmp, ";
		$sqladd .= "t_name, ";
		$sqladd .= "referer, ";
		$sqladd .= "query_string, ";
		$sqladd .= "user_agent, ";
		$sqladd .= "remote_addr, ";
		$sqladd .= "remote_port, ";
		$sqladd .= "server_addr, ";
		$sqladd .= "server_port, ";
		$sqladd .= "desc"; 
		$sqladd .= ") "					;

		$sqladd .= " values ( ";
	
		$sqladd .= "\"$dttm\", ";
		$sqladd .= "\"$status\", ";
		$sqladd .= "\"$f_name\", ";
		$sqladd .= "\"$f_type\", ";
		$sqladd .= "\"$f_size\", ";
		$sqladd .= "\"$f_error\", ";
		$sqladd .= "\"$f_tmp\", ";
		$sqladd .= "\"$t_pathfile\", ";
		$sqladd .= "\"$query_string\", ";
		$sqladd .= "\"$referer\", ";
		$sqladd .= "\"$user_agent\", ";
		$sqladd .= "\"$remote_addr\", ";
		$sqladd .= "\"$remote_port\", ";
		$sqladd .= "\"$server_addr\", ";
		$sqladd .= "\"$server_port\", ";
		$sqladd .= "\"$desc\" ";
		$sqladd .= " ); ";


		$tblname_tn="kup_tn";
		$sqladd_tn = "insert or replace into $tblname_tn (";
		$sqladd_tn .= "dttm, ";
		$sqladd_tn .= "status, ";
		$sqladd_tn .= "f_name, ";
		$sqladd_tn .= "f_type, ";
		$sqladd_tn .= "f_size, ";
		$sqladd_tn .= "f_error, ";
		$sqladd_tn .= "f_tmp, ";
		$sqladd_tn .= "t_name, ";
		$sqladd_tn .= "referer, ";
		$sqladd_tn .= "query_string, ";
		$sqladd_tn .= "user_agent, ";
		$sqladd_tn .= "remote_addr, ";
		$sqladd_tn .= "remote_port, ";
		$sqladd_tn .= "server_addr, ";
		$sqladd_tn .= "server_port, ";
		$sqladd_tn .= "desc"; 
		$sqladd_tn .= ") "					;

		$sqladd_tn .= " values ( ";
	
		$sqladd_tn .= "\"$dttm\", ";
		$sqladd_tn .= "\"$status\", ";
		$sqladd_tn .= "\"$f_name\", ";
		$sqladd_tn .= "\"$f_type\", ";
		$sqladd_tn .= "\"$f_size\", ";
		$sqladd_tn .= "\"$f_error\", ";
		$sqladd_tn .= "\"$f_tmp\", ";
		$sqladd_tn .= "\"$t_pathfile\", ";
		$sqladd_tn .= "\"$query_string\", ";
		$sqladd_tn .= "\"$referer\", ";
		$sqladd_tn .= "\"$user_agent\", ";
		$sqladd_tn .= "\"$remote_addr\", ";
		$sqladd_tn .= "\"$remote_port\", ";
		$sqladd_tn .= "\"$server_addr\", ";
		$sqladd_tn .= "\"$server_port\", ";
		$sqladd_tn .= "\".$b64_tn.\" ";
		$sqladd_tn .= " ); ";

		pdo_insert( $dbfile, $tblname,  $sqladd );

		$dbfile_tn="kup_tn.db3";
		$tblname_tn="kup_tn";
		pdo_insert( $dbfile_tn, $tblname_tn,  $sqladd_tn );

		$h5g_data .= '<a href="'.$t_pathfile_h5g.'">';
		$h5g_data .= ' <img src="'.$t_pathfile_h5g.'" alt="'.$t_pathfile_h5g.'" data-description="'.$t_pathfile.'">';
		$h5g_data .= ' </a>\n';
		$h5g_data .= ' \n';

		$sl_data .= '<a href="'.$t_pathfile_sl.'" class="thumb_link">';
		$sl_data .= '	<span class="selected"></span>';
		$sl_data .= '	<img height=100 src="'.$t_pathfile_sl.'" title="'.$t_name.'" 
alt="'.$t_pathfile_sl.'" class="thumb" />';
		$sl_data .= '	</a>';
		$sl_data .= '\n';
		}


#	print( "<hr color=white>" );
#	print( "<br>" );


# Array
# (
#     [name] => 1P580940882EFFD2FCP2391R2M1-BR_a_sphere.png
#     [type] => image/png
#     [tmp_name] => C:\wngx\temp\php\php3B3F.tmp
#     [error] => 0
#     [size] => 192928
# )

#	$phpinfo=phpinfo();
#	echo $phpinfo;


# 	pdo_create_tbl( $dbfile, $tblname, $sql );
# 	pdo_create_tbl( 'kup_tn.db3', 'kup_tn', $sql );
# 	pdo_create_i( "./kups.db3", "kup", $data );
# 	pdo_select_i_cnt( "./kups.db3", "kup", $data );


	html_update_div( $sl_html_cur, $sl_match, $sl_data, $sl_html_new, $sl_html_old );
	html_update_div( $h5g_html_cur, $h5g_match, $h5g_data, $h5g_html_new, $h5g_html_old );

	}


function ko_namefix( $f_name) {
	$t_name=strtolower( $f_name );
//	print( "BUGS_570: ko_namefix: f_name=".$f_name." t_name=".$t_name."<br>" );
	$t_name=str_replace( " ","_", $t_name );
	$t_name=str_replace( "#","-", $t_name );
	$t_name=str_replace( "|","-", $t_name );
	$t_name=str_replace( "/","-", $t_name );
	$t_name=str_replace( ":","-", $t_name );
	$t_name=str_replace( "'","-", $t_name );
	$t_name=str_replace( ",","-", $t_name );
	$t_name=str_replace( "@","-", $t_name );
	$t_name=str_replace( "|","-", $t_name );
	$t_name=str_replace( "-","", $t_name );
	$t_name=str_replace( "__","_", $t_name );
//	print( "BUGS_570: ko_namefix: f_name=".$f_name." t_name=".$t_name."<br>" );
	return( $t_name );
	}



function html_show( $filepath, $match, $data ) {
	$progid="kup.php";
	$dttm=date('Ymd_His');
	$matchflag='';	

#	print( "$progid $dttm html_show MSG_530: ".$html_cur." ".$div_match." ".$div_data." ".$html_new." ".$html_old );
#	print( "$progid $dttm html_show MSG_531: html_cur=".$html_cur."<br>\n" );
#	print( "$progid $dttm html_show MSG_532: html_new=".$html_new."<br>\n" );
#	print( "$progid $dttm html_show MSG_533: html_old=".$html_old."<br>\n" );
#	print( "$progid $dttm html_show MSG_534: div_match=".$div_match."<br>\n" );

	$fp = fopen( $filepath, 'r' );
#	$fp_new = fopen( $html_new, 'w' );

#	while( $bigline = fread($fp, 1024)) { 
	while( $bigline = fread($fp, 2048)) { 
		$dttm=date('Ymd_His');
		$lines = explode("\n", $bigline );

#		$html_out="";
		for( $j=0; $j < count($lines); $j++ ) {
			$line=$lines[$j];
			print( $line );
#			$html_out .= $line;
#			printf( "$progid $dttm MSG:_660:  $j line=$line dif_flag=$div_flag<br>\n" );

			if(( preg_match( "/<\/div>/", $line, $matches)) && ( $matchflag=="true" )) {
				$matchflag="";
				}
#
			if( preg_match( "/$match/", $line, $matches)) {
				$matchflag="true";
				print( $data );
#				fwrite( $fp_new, $line."\n" );
#				fwrite( $fp_new, $div_data );
				continue;
				}
#			fwrite( $fp_new, $line."\n" );
			}
#		printf( "$progid $dttm html_show:  line=[$line]<br>\n" );
		}

	fclose( $fp );
#	fclose( $fp_new );


	$syscmd_rename_old="cp $html_cur $html_old";
#	printf( "$progid $dttm MSG_380:  syscmd_rename_old=[$syscmd_rename_old]<br>\n" );
#	system( $syscmd_rename_old );

#	printf( "$progid $dttm MSG:_360:  $j line=$line dif_flag=$div_flag]<br>\n" );
	return( $html_out );
	}

function html_update_div( $html_cur, $div_match, $div_data, $html_new, $html_old ) {
	$progid="kup.php";
	$dttm=date('Ymd_His');
	$div_flag="";	

#	print( "$progid $dttm MSG_630: ".$html_cur." ".$div_match." ".$div_data." ".$html_new." ".$html_old );
#	print( "$progid $dttm MSG_631: html_cur=".$html_cur."<br>\n" );
#	print( "$progid $dttm MSG_632: html_new=".$html_new."<br>\n" );
#	print( "$progid $dttm MSG_333: html_old=".$html_old."<br>\n" );
#	print( "$progid $dttm MSG_334: div_match=".$div_match."<br>\n" );

	$fp = fopen( $html_cur, 'r' );
	$fp_new = fopen( $html_new, 'w' );

	while( $bigline = fread($fp, 1024)) { 
		$dttm=date('Ymd_His');
		$lines = explode("\n", $bigline );
		for( $j=0; $j < count($lines); $j++ ) {
			$line=$lines[$j];
#			printf( "$progid $dttm MSG:_360:  $j line=$line dif_flag=$div_flag]<br>\n" );
			if(( preg_match( "/<\/div>/", $line, $matches)) && ( $div_flag=="true" )) {
				 $div_flag="";
				}

			if( preg_match( "/$div_match/", $line, $matches)) {
				$div_flag="true";
				fwrite( $fp_new, $line."\n" );
				fwrite( $fp_new, $div_data );
				continue;
				}
			fwrite( $fp_new, $line."\n" );
			}
//		printf( "$progid $dttm MSG_560:  line=[$line]<br>\n" );
		}

	fclose( $fp );
	fclose( $fp_new );


	$syscmd_rename_old="cp $html_cur $html_old";
#	printf( "$progid $dttm MSG_380:  syscmd_rename_old=[$syscmd_rename_old]<br>\n" );

#	system( $syscmd_rename_old );

	$syscmd_rename_new="cp $html_new $html_cur";
#	printf( "$progid $dttm MSG_383:  syscmd_rename_new=[$syscmd_rename_new]<br>\n" );
#	system( $syscmd_rename_new );
	}


function pdo_select_kup_cnt( $dbfile, $tblname, $data ) {
	$count=0;
	$pdo = newpdo($dbfile);
	$sqlcnt = "select count(*) icnt from $table";
	$sqlout = $pdo->query($sqlcnt);
	$record = $sqlout->fetchall();
	if(sizeof($record) != 0) { 
//		print( "sizeof record != 0 $record<br>\n" );
		$count=$record[0][0];
		}
	return( $count );
	}



function pdo_insert_csv( $dbfile, $tblname, $data ) {
	
	$csvfile = "$tblname.csv";
	$psvfile = "$tblname.psv";

	print( "ka1 16884 PDO_INSERT_beg:  dbfile=[$dbfile] tblname=[$tblname]<br>\n" );
//	print( "ka1 16884 PDO_INSERT_beg:  csvfile=[$csvfile]<br>\n" );
	print( "ka1 16884 PDO_INSERT_beg:  psvfile=[$psvfile]<br>\n" );
///	print_r($data);

//	if( file_exists( $csvfile )) {
//		$filedata= array();
//		print( "pdo_insert CSV: FOUND  csvfile=[$csvfile]<br>\n" );
//		$rownum=0;
//		$fp = fopen( $csvfile, "r" );
//		while(( $filetext = fgets($fp)) !== false ) {
//			$filedata[] =  $filetext;
//			print( "pdo_insert CSV: rownum=$rownum filedata=[".$filedata[$rownum]. "]<br>\n" );
//			$rownum++;
//			}
//		fclose($fp);
//		$data = $filedata;
//		}
//	else {
//		print( "pdo_insert CSV_ERR: NOTFOUND  csvfile=[$csvfile]<br>\n" );
//		////}


	print( "ka1 16906 PDO_INSERT_pdo:  psvfil=[$psvfile]<br>\n" );
	if( file_exists( $psvfile )) {
		print( "pdo_insert PSV: FOUND  psvfile=[$psvfile]<br>\n" );
		$rownum=0;
		$filedata=array();
		$fp = fopen( $psvfile, "r" );
		while(( $filetext = fgets($fp)) !== false ) {
			$filedata[] =  str_replace( "|", ",", $filetext);
			print( "pdo_insert PSV: rownum=$rownum filedata=[".$filedata[$rownum]. "]<br>\n" );
			$rownum++;
			}
		fclose($fp);
		$data = $filedata;
		}


//	foreach( $data_leds as $data_led ) {
//		print( "pdo_insert_leds MSG: data_led=[$data_led]<br>\n" );
//		}

	if( $data == "" ) { 
		print( "<hr>$php_self pdo_insert ERR: DATA_NOTFOUND tblname=[$tblname]<hr>\n" );
		return; 
		}

	set_time_limit(0);	// 30 seconds
	$pdo = newpdo( $dbfile );
	$rownum=0;
	foreach( $data as $row ) {
		$cols = explode( ",", $row );
		if( $rownum == 0 ) {
//			print( "pdo_insert ROW_$rownum: dbfile=[$dbfile] tblname=[$tblname] row=[$row]<br>\n" );
			$colnum=0;
			$collim=count($cols);
			$sql_cr = " CREATE TABLE IF NOT EXISTS $tblname ( ";
//			$sql_cr .= "$tblname"."_id INTEGER PRIMARY KEY DESC, ";
//			$sql_cr .= "$tblname"."_id INTEGER PRIMARY KEY, ";

			$sql_flds = "INSERT OR REPLACE into $tblname ( ";
			foreach( $cols as $col ) { 
//				if( $col != $tblname."_id" ) {
					$sql_cr .= "$col VARCHAR, ";
					$sql_flds .= "$col, "; 
					$colnum++; 
//					}
				}
			$sql_cr .= ")";
			$sql_flds .= ")";
			$sql_tmp = str_replace( "VARCHAR, )", "VARCHAR )", $sql_cr );
			$sql_cr = $sql_tmp;
			$sql_tmp = str_replace( ", )", " )", $sql_flds );
			$sql_flds = $sql_tmp;
//			print( "pdo_insert ROW_$rownum: sql_flds=[$sql_flds]<br>\n" );
			print( "pdo_insert ROW_$rownum: sql_cr=[$sql_cr]<br>\n" );
			$pdo->exec( $sql_cr );
			$rownum++;
			continue;
			}

		if( $rownum != 0 ) {
//			print( "..... BUGS1608: pdo_insert ROW_$rownum: dbfile=[$dbfile] tblname=[$tblname] row=[$row]<br>\n" );
			$sql_vals = "VALUES ( ";
			foreach( $cols as $col ) {
				$col_trim=trim($col);
				$col = $col_trim;
				$sql_vals .= "\"$col\", ";
				}

			$sql_vals .= ");";
			$sql_tmp = str_replace( ", )", ")", $sql_vals );
			$sql_vals=$sql_tmp;

			if( $sql_vals == "VALUES ( \"\");"  ) { 
				$sql = "END_OF_FIELDS";
				}
			else {
				$sql = $sql_flds . " " . $sql_vals;
				}
//			print( "pdo_insert ROW_$rownum: sql_vals=[$sql_vals]<br>\n" );
//			print( "pdo_insert ROW_$rownum: sql=[$sql]<br>\n" );
			}

//		print( "$php_self pdo_insert INS: $rownum  dbfile=[$dbfile] tblname=[$tblname] sql=[$sql]<br>\n" );
//		print( "$php_self pdo_insert BUGS_875:  sql_vals=[$sql_vals]<br>\n" );
//		print( "$php_self pdo_insert BUGS_876:  sql=[$sql]<br>\n" );
		if( $sql != "END_OF_FIELDS" ) {
			print( "pdo_insert_1845:  sql=[$sql]<br>\n" );
			$pdo->exec( $sql );
			}
		$rownum++;
		}

	$pdo = null;
	set_time_limit(30);	// 30 seconds

///	return;
///	$row=1;
///	$handle = fopen($csvfile, "r");
///	while( $data = fgetcsv($handle, 1000, ",") !== FALSE ){
///		$num = count($data);
///		$row++;
///		for( $col=0l $col < $num; $col++ ) {
///			print( "$data[$col] <br />\n" );
///			}
///		}
	}


function ko_dir($path) {
// open the directory
	$document_root=$_SERVER['DOCUMENT_ROOT'];
	$query_string=$_SERVER['QUERY_STRING'];
	$rt_path=$document_root.$path;
	$ht_path=$path;
	print( "ko_dir MSG_16930: path=".$path."<br>" );
	print( "ko_dir MSG_16930: rt_path=".$rt_path."<br>" );
	print( "ko_dir MSG_16930: ht_path=".$ht_path."<br>" );

	$path="";
	if( file_exists( ht_path )) {
		print( "ko_dir FOUND ht_path=".$ht_path."<br>" );
		$path=$ht_path;
		}
	else {
		print( "ko_dir NOTFOUND ht_path=".$ht_path."<br>" );
		}
	if( file_exists( rt_path )) {
		print( "ko_dir FOUND rt_path=".$rt_path."<br>" );
		$path=$rt_path;
		}
	else {
		print( "ko_dir NOTFOUND rt_path=".$rt_path."<br>" );
		}
	if( $path == "" ) { return; }
	$dir = opendir( $path );

// loop through it, looking for any/all JPG files:
	$j=0;
	$psvdta="";
	$htmout="";
	while (false !== ($fname = readdir( $dir ))) {
		$j++;
		$psvdta .= "$j|$fname|\n";
		$tn_file=$fname;
		$tn_file=str_replace( ".gif", ".png",$tn_file );
		$tn_file=str_replace( ".jpg", ".png",$tn_file );
		$tn_file=str_replace( ".jpeg", ".png",$tn_file );
		$tn_file=str_replace( ".txt", ".png",$tn_file );
		$tn_file=str_replace( ".csv", ".png",$tn_file );
		$tn_file=str_replace( ".psv", ".png",$tn_file );
		$tn_file=str_replace( ".mp3", ".png",$tn_file );
		$tn_file=str_replace( ".mp4", ".png",$tn_file );
		$tn_file=str_replace( ".db3", ".png",$tn_file );

//		print( "$php_self $dttm ko_dir: path=[$path] fnane=[$fname]<br>\n" );
//		str_replace( ".", "-", $remote_addr );
//		if (( preg_match( "/.png/", $fname, $matches)
//		|| ( preg_match( "/.png/", $fname, $matches) 
//		|| ( preg_match( "/.png/", $fname, $matches)
//		|| ( preg_match( "/.gif/", $fname, $matches ) 
//		|| ( preg_match( "/.jpg/", $fname, $matches ) 
//		|| ( preg_match( "/.jpeg/", $fname, $matches ) 
//		|| ( preg_match( "/.txt/", $fname, $matches ) 
//		|| ( preg_match( "/.csv/", $fname, $matches ) 
//		|| ( preg_match( "/.psv/", $fname, $matches ) 
//		|| ( preg_match( "/.mp4/", $fname, $matches ) 
//		|| ( preg_match( "/.mp3/", $fname, $matches )) {
			$htmout .= '<a href="'.$fname.'" target=_blank class="popover" >';
			$htmout .= '	<img src="'.tn_name.'" border=0>';
			$htmout .= '	<span><img src="'.fname.'" border=0></span>';
			$htmout .= '	</a>';
//			}

		}

	print( $htmout );
// close the directory
	closedir( $dir );
	print( $htmout );
	return( $psvdta );
	}

function png2jpg($originalFile, $outputFile, $quality) {
	$image = imagecreatefrompng($originalFile);
	imagejpeg($image, $outputFile, $quality);
	imagedestroy($image);
	}


// ko_tn(f_filename, tn_path, $tn_height);
// function createThumbs( $pathToImages, $pathToThumbs, $thumbWidth ) {


function ko_tn( $pathToImages, $imagefile, $thumbHeight ) {
//	print( "ko_tn BUGS_980:  pathtoimages=".$pathToImages."<br>" );
//	print( "ko_tn BUGS_981:  imagefile=".$imagefile."<br>" );
	$f_pathfile=$pathToImages.$imagefile;
	$t_pathfile=$f_pathfile;
//	print( "ko_tn BUGS_981:  f_pathfile=".$f_pathfile."<br>" );
//	print( "ko_tn BUGS_982:  t_pathfile=".$t_pathfile."<br>" );

	$tn_pathfile = $pathToImages."tn/tn_".$imagefile;
	$tn_pathfile = str_replace( ".gif",".png", $tn_pathfile );
	$tn_pathfile = str_replace( ".jpg",".png", $tn_pathfile );
	$tn_pathfile = str_replace( ".csv",".png", $tn_pathfile );
	$tn_pathfile = str_replace( ".txt",".png", $tn_pathfile );
	$tn_pathfile = str_replace( ".psv",".png", $tn_pathfile );
	$tn_pathfile = str_replace( ".db3",".png", $tn_pathfile );
	$tn_pathfile = str_replace( ".mp4",".png", $tn_pathfile );
	$tn_pathfile = str_replace( ".pdf",".png", $tn_pathfile );
//	print( "ko_tn BUGS_991:  f_pathfile=".$f_pathfile."<br>" );
//	print( "ko_tn BUGS_992:  tn_pathfile=".$tn_pathfile."<br>" );
	

//	header("Content-type: image/png");
//	passthru("cat $pathfile");


	$pathToThumbs="$PathToImages"."/tn/";
	$tn_name="tn_".$imagefile;
	if( file_exists( $tn_pathfile )) { 
		print( "kup.php DONE f_pathfile=". $f_pathfile."<br>\n" );
		print( "kup.php DONE tn_pathfile=". $tn_pathfile."<br>\n" );
		$b64_tn_raw=base64_encode($tn_pathfile );
		$b64_tn = "data:/image/png;base64,".$b64_tn;
		$b64d_tn=base64_decode(base64_encode($tn_pathfile ));

//		print( '=== <img src="'.$tn_pathfile.'" > ==='.'<br>' );
//		print( '=== tn_pathfile='.$tn_pathfile.' ==='.'<br>' );

//		print( '--- <img src="'.$b64_tn.'" > --- <br>' );
//		print( '--- b64_tn='.$b64_tn.' --- <br>' );

//		print( '... <img src="'.$b64d_tn.'" > ...' );
//		print( '... b64d_tn='.$b64d_tn.' ...'.'<br>' );
		return($b64_tn);
		}

//	print( "kup.php $dttm BUGS_800 $j f_pathfile=".$f_pathfile."<br>\n" );
//	print( "kup.php $dttm BUGS_800 $j tn_pathfile=".$tn_pathfile."<br>\n" );
 
// parse path for the extension
	$info = pathinfo($f_pathfile);
	$ext=strtolower($info['extension']);

//	$explode = explode(".", $f_pathfile); $filetype = $explode[1];

//	echo "tn.php ".$f_pathfile." <br />";
// continue only if this is a JPEG image


	$img="";
	if (( $ext == 'jpg' ) || ( $ext == 'png' ) || ( $ext == 'gif' ) || ( $ext=='jpeg' )) {
		if ($ext == 'jpg') {
//			print( "BUGS_888_jpg f_pathfile=".$f_pathfile );
			$img = imagecreatefromjpeg($f_pathfile);
			} else
		if ($ext == 'jpeg') {
//			print( "BUGS_888_jpeg f_pathfile=".$f_pathfile );
			$img = imagecreatefromjpeg($f_pathfile);
			} else
		if ($ext == 'png') {
//			print( "BUGS_888_png f_pathfile=".$f_pathfile );
			$img = imagecreatefrompng($f_pathfile);
			} else
		if ($ext == 'gif') {
//			print( "BUGS_888 f_pathfile=".$f_pathfile."<br>" );
//			print( "BUGS_888 tn_pathfile=".$tn_pathfile."<br>" );
			$img = imagecreatefromgif($f_pathfile);

//			$coalesce_pathfile= preg_replace( "/.gif/", "_coalesce.gif", $f_pathfile );
//			$coalesce_pathfile=str_replace( ".gif", "_coalesce.gif", $tn_pathfile );
			$coalesce_pathfile=str_replace( ".png", "_coalesce.png", $tn_pathfile );
//			print( "BUGS_860_gif coalesce_pathfile=".$coalesce_pathfile."<br>" );


			$im_cmd_coalesce="convert ".$f_pathfile." -coalesce ".$coalesce_pathfile;
//			print( "BUGS_860_gif im_cmd_coalesce=".$im_cmd_coalesce."<br>" );
//			system( $im_cmd_coalesce );

			$im_cmd_resize  = "convert ".$coalesce_pathfile;
			$im_cmd_resize .= " -resize ".$tn_height;
			$im_cmd_resize .= "  ".$tn_pathfile;
//			print( "BUGS_860_gif im_cmd_resize=".$im_cmd_resize."<br>" );
//			system( $im_cmd_resize );
// ani.gif resize
// 	convert anim.gif -coalesce anim_coalesce.gif
//	convert -size <original size> anim_coalesce.gif -resize 24x24 anim_resize_24.gif.



			} 
		if( $img != "" ) {		
			$width = imagesx( $img );
			$height = imagesy( $img );

// calculate thumbnail size
//			$new_width = $thumbWidth;
//			$new_height = floor( $height * ( $thumbWidth / $width ) );

			$new_height = $thumbHeight;
			$new_width = floor( $width * ( $thumbHeight / $height ) );

// create a new temporary image
			$tmp_img = imagecreatetruecolor( $new_width, $new_height );

// copy and resize old image into new image
			imagecopyresized( $tmp_img, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height );

// save thumbnail into a file
//			print( "ko_tn BUGS_915 ".$dttm." j=".$j."<ve>" );
//			print( "ko_tn BUGS_916 tn_pathfile=".$tn_pathfile."<br>");


		
//			imagejpeg( $tmp_img, $tn_pathfile );
//			imagegif( $tmp_img, $tn_pathfile );
			imagepng( $tmp_img, $tn_pathfile );
			$b64_raw=base64_encode( $tn_pathfile );
			$b64_tn="data:/image/png;base64,".$b64_raw;
//			print( "ko_tn BUGS_910: ".$dttm." j=".$j."<br>" );
//			print( 'ko_tn BUGS_910: <img src="'.$b64_tn.'" height=100 border=0><br><br>' );

// release the memory
			imagedestroy($tmp_img);
			imagedestroy($img);
			}
//		print( "BUGS_930: ERR f_pathfile=".$f_pathfile."<br>" );
//		print( "BUGS_930: ERR tn_pathfile=".$tn_pathfile."<br>" );
		}
	else {
		if ( $ext == 'txt' ) { 
			$tn_pathfile_ext="/imgs/btn/kob.png"; 
			$tn_pathfile=str_replace(".txt", ".png", $tn_pathfile );
			}
		if ( $ext == 'mp4' ) { 
			$tn_pathfile_ext="/imgs/btn/kow.png"; 
			$tn_pathfile=str_replace(".mp4", ".png", $tn_pathfile );
			}
		if ( $ext == 'pdf' ) { 
			$tn_pathfile_ext="/imgs/btn/koeyeb.png"; 
			$tn_pathfile=str_replace(".pdf", ".png", $tn_pathfile );
			}
		if ( $ext == 'db3' ) { 
			$tn_pathfile_ext="/imgs/btn/koeyew.png"; 
			$tn_pathfile=str_replace(".db3", ".png", $tn_pathfile );
			}
		if ( $ext == 'csv' ) { 
			$tn_pathfile_ext="/imgs/btn/kib.png"; 
			$tn_pathfile=str_replace(".csv", ".png", $tn_pathfile );
			}
		if ( $ext == 'psv' ) { 
			$tn_pathfile=str_replace(".psv", ".png", $tn_pathfile );
			$tn_pathfile_ext="./imgs/btn/kiw.png"; 
			}

		copy( $tn_pathfile_ext, $tn_pathfile );
#		$syscmd_cp="cp ".$tn_pathfile_ext." ".$tn_pathfile;
#		print( "BUGS_1050:  copy(".$tn_pathfile_ext." ".$tn_pathfile );
#		rename( $tn_pathfile_ext, $tn_pathfile );

//		$newdir="./ip/";
//		$perm="0755";
//		$stat = mkdir($newdir);
//		$stat = mkdir($dirPath1, 0755);

//		print( "BUGS_1050:  syscmd_cp=".$syscmd_cp."<br>" );
//		$stat=system( $syscmd_cp );
//		$stat=shell_exec( $syscmd_cp );
//		print( "BUGS_1051:  stat=".$stat."<br>" );
		
//		$syscmd_py="python ./index.py";
//		print( "BUGS_1052:  syscmd_py=".$syscmd_py."<br>" );
//		$stat=system( $syscmd_py );
//		$stat=shell_exec( $syscmd_py );
//		print( "BUGS_1053:  stat=".$stat."<br>" );
		
		$b64_raw=base64_encode( $tn_pathfile );
		$b64_tn="data:/image/png;base64,".$b64_raw;
//		print( "BUGS_1055:  b64_tn=".$b64_tn."<br>" );
//		print( '<a href="'.$tn_pathfile.'" target=_blank>' );
//		print( '<img src="'.$b64_tn.'" border=0 alt="'.$tn_pathfile.'" ></a><br>' );
//		$b64=base64_encode( $tn_pathfile );
		}

// call createThumb function and pass to it as parameters the path
// to the directory that contains images, the path to the directory
// in which thumbnails will be placed and the thumbnail's width.
// We are assuming that the path will be a relative path working
// both in the filesystem, and through the web for links
//	createThumbs("kup/","kup/tn/",100);
	return( $b64_tn );
	}


function html_style() {
	$html_style = <<<HTML_STYLE
	<style id="style_font_yokkmokk" >
		@font-face {
			font-family: yokkmokkOT;
			src: url("data:font/ttf;base64,AAEAAAAPADAAAwDAT1MvMlFdfQAAANO0AAAAVlBDTFRK3sYZAADUDAAAADZjbWFwIOwyJQAAwOwAAAhAY3Z0IFvZXQMAAAP8AAAAFGZwZ22DM8JPAAAD6AAAABRnbHlm/L/+SwAABDgAALYiaGRteC+LmY4AAMksAAAKiGhlYWTSA25fAADURAAAADZoaGVhBkUDJgAA1HwAAAAkaG10eAE0DCEAALzwAAACkGxvY2EAN7WQAAC6XAAAApRtYXhwASIBmQAA1KAAAAAgbmFtZT4kOPEAAAD8AAAC63Bvc3Qg7x7eAAC/gAAAAWpwcmVwCo0UlQAABBAAAAAoAAAAGAEmAAAAAAAAAAAAXAAuAAAAAAAAAAEAEACSAAAAAAAAAAIADgCpAAAAAAAAAAMASADzAAAAAAAAAAQAEAC/AAAAAAAAAAUATAFhAAAAAAAAAAYAEAG1AAAAAAAAAAcAAAHFAAEAAAAAAAAALgAAAAEAAAAAAAEACACKAAEAAAAAAAIABwCiAAEAAAAAAAMAJADPAAEAAAAAAAQACAC3AAEAAAAAAAUAJgE7AAEAAAAAAAYACAGtAAEAAAAAAAcAAAHFAAMAAQQJAAAAXAAuAAMAAQQJAAEAEACSAAMAAQQJAAIADgCpAAMAAQQJAAMASADzAAMAAQQJAAQAEAC/AAMAAQQJAAUATAFhAAMAAQQJAAYAEAG1AAMAAQQJAAcAAAHFQ29wci4xOTkzIEVsa2UgU3dpbGx1cywgRm9udFNob3AgSW50ZXJuYXRpb25hbABDAG8AcAByAC4AMQA5ADkAMwAgAEUAbABrAGUAIABTAHcAaQBsAGwAdQBzACwAIABGAG8AbgB0AFMAaABvAHAAIABJAG4AdABlAHIAbgBhAHQAaQBvAG4AYQBsWW9ra21va2sAWQBvAGsAawBtAG8AawBrUmVndWxhcgBSAGUAZwB1AGwAYQByWW9ra21va2sAWQBvAGsAawBtAG8AawBrTWFjcm9tZWRpYSBGb250b2dyYXBoZXIgNC4xIFlva2ttb2trAE0AYQBjAHIAbwBtAGUAZABpAGEAIABGAG8AbgB0AG8AZwByAGEAcABoAGUAcgAgADQALgAxACAAWQBvAGsAawBtAG8AawBrTWFjcm9tZWRpYSBGb250b2dyYXBoZXIgNC4xIDIwMDEtMTAtMDgATQBhAGMAcgBvAG0AZQBkAGkAYQAgAEYAbwBuAHQAbwBnAHIAYQBwAGgAZQByACAANAAuADEAIAAyADAAMAAxAC0AMQAwAC0AMAA4WW9ra21va2sAWQBvAGsAawBtAG8AawBrAEABACx2RSCwAyVFI2FoGCNoYEQt//wA7gFRAYcAKAAoWmJaYgACAARACQMDAgIBAQAAAY24Af+FRWhERWhERWhERWhEsQQERWhEsQUFRWhEAAIAPwAAAbYDIQADAAcAVkAgAQgIQAkCBwQEAQAGBQQDAgUEBQAHBgUBAgEDAAABAEZ2LzcYAD88LzwQ/TwQ/TwBLzz9PC88/TwAMTABSWi5AAAACEloYbBAUlg4ETe5AAj/wDhZMxEhESUzESM/AXf+x/r6AyH83z8CpAAHABj/9AEsAh0ACQATAB0AKQA1AEEASgB8QDUBS0tATB4WDAJGPAkFBAAPDgQTCkIENioEHh0UBBkYMAQkJwUtSAU5PwVEMwUhGxEHIQEkRnYvNxgALy88PBD9L/0v/S/9AS/9Lzz9PC/9L/0vPP08Li4uLi4uAC4uLjEwAUlouQAkAEtJaGGwQFJYOBE3uQBL/8A4WRMUIyI9ATQzMhUHFCMiPQE0MzIVBxQjIj0BNDMyFRMUBiMiJjU0NjMyFgc0JiMiBhUUFjMyNicUBiMiJjU0NjMyFgc0IyIVFDMyNvsUFBQURRMUFBNHFBQUFL1QOjpQUDo6UCg5KSk5OSkpORwpHR0oKB0dKSgeHR0MEgF/ExOKFBTaExPaFBSKExOKFBT+dTpQUDo6UFA6KTo6KSk5OSkdKCgdHSgoHR0dHhIAAwAXATwAyQGzAAkAEwAdAFRAHgEeHkAfAAUEBAkAEwoEDw4dFAQZGBsRBxYMAgEYRnYvNxgALzw8Lzw8AS88/TwvPP08Lzz9PAAxMAFJaLkAGAAeSWhhsEBSWDgRN7kAHv/AOFkTFCMiPQE0MzIVBxQjIj0BNDMyFQcUIyI9ATQzMhXJExQUE0UUFBQURRQUFBQBTxMTUBQUUBMTUBQUUBMTTxQUAAgADP/iAW8BqAALABUAHwAxAEMATQBXAGMAkkBAAWRkQGUAVUsyLyMYDgNeU1JNSUhEQjotJRUMACAEBhEQBCkGGxoEHxY1BD5XTgRYPmEFW1BGOAMdEwMJAwFeRnYvNxgAPz88Py88L/0BLzz9PBD9Lzz9PC88/TwQ/S4uLi4uLi4uLi4uLi4uAC4uLi4uLi4uMTABSWi5AF4AZEloYbBAUlg4ETe5AGT/wDhZARQGIyImNTQ2MzIWBxQjIj0BNDMyFQcUIyI9ATQzMhUTFAYjIjU0MjY1NCYiNTQzMhYnIiY1NDYzMhUUIgYVFBYyFRQXFCMiPQE0MzIVBxQjIj0BNDMyFQcUBiMiJjU0NjMyFgFvFxARFxgQEBdPFBQUFEUUFBQUbTQlEycdHScTJTS8JTQ0JRQoHR0oKBQUFBRFFBQUFCgYDxEXFxEQFwFZERcXEREXGEsTE3YUFHYTE3YUFP7iJTQUEx4UFB0UFDQgNCUlNBQUHRQUHRQUxRQUdhQUdhQUdhQUOxAXFhEQFxcAAAoACv/fAdcBrAANABkAJwAzAEEATwBbAGcAbwB3AJJAQwF4eEB5KEw3HQNOQDkmHwVWBEcUXAQMKHQEcA4EUGgEbC4EYmUFK1MFF2oFbjEFX3YFchEFWQoXRStuAz4BJAIBFEZ2LzcYAD8/Py88Lzwv/S/9L/0Q/RD9EP0BL/0v/S/9L/0vPP0vPP0uLi4uLi4ALi4uLjEwAUlouQAUAHhJaGGwQFJYOBE3uQB4/8A4WQEHBiMiNTQ/ATYzMhUUBRQGIyImNTQ2MzIWFwcGIyI1ND8BNjMyFRQXFAYjIiY1NDYzMhYnBwYjIjU0PwE2MzIVFA8BBiMiNTQ/ATYzMhUUJzQmIyIGFRQWMzI2ATQmIyIGFRQWMzI2ARQjIjU0MzIBFCMiNTQzMgHQfgYIFAZ+BggU/uY0JSU0NCUlNFqDBggUBoIHCBS7NCYlNDQlJTVyfgYIFQZ/BggVwn0GCBQGfQYIFBwdFBQeHhQUHQEbHhQUHR0UFB7+yBQUFBQBGhQUFBQBiX4GFAgGfgYUCD0lNDQlJjQ1VYMGFQgGggcVCPAlNDQlJTQ0bX4GFAgGfwYUCG59BhQIBn0GFAjpFB4eFBQdHf76FB0dFBQeHgEvFBQU/tEUFBQAAAEAFAAAAhYBRgBJAKFAUQFKSkBLODs6NjUvLiopD0Y/OCwlHg0wLykoIiEbBxoESUM8OzU0AAdCFgQGGhkFAhMFCURDIQMgBUlIHAMbQkEjAyIFPTwoAycyAgMCAAEGRnYvNxgAPzw/Lxc8/Rc8Lxc8/Rc8L/0Q/TwBL/0vFzz9FzwuLi4uLi4uAC4uLi4uLi4uLjEwAUlouQAGAEpJaGGwQFJYOBE3uQBK/8A4WSUUIyEiJjU0NjMyFxYVFCMiJyYjIgYVFBY7ATUhIjU0MyE1ISI1NDMhNSMiNTQ7ATU0MzIdATMyFRQrARUzMhUUKwEVMzIVFCsBAccU/vc+WFg+OCoIFAcGIictQUEt9f7VExMBK/7VExMBKzwTEzwUFDsUFDs7FBQ8PBQUOxQUVj4+WSUHCRMFG0EuLUI0FBQdFBQdFBQnFBQnFBQdFBQdFBQAAwAJACUBIQFmABQAJgA7AF9AJAE8PEA9LDUqEAUCATozMCwlIB0aDgsHCQQTAgADASIYAwEARnYvNxgAPy8BLxc8/S4uLi4uLi4uLi4uAC4uLi4uLjEwAUlouQAAADxJaGGwQFJYOBE3uQA8/8A4WTc1Mzc2MzIVFAcGBxcWFRQjIi8BJj8BNjMyFRQPARcWFRQjIi8BJj8BNjMyFRQHBgcXFhUUIyIvASY1NBIBPAcJFAQZGzQFFgkGPQlhawYJFARjYwQUCQZtCmM8BgkVBBkbNAQVCQY6Bs8CTgkUBgYhIkIGBhQITgsQiggUBgaBgQYGEwiNDglOCBQGBSEiQgUHFAhLBwgGAAADABEAJQEpAWYAEgAkADcAVkAeATg4QDklMyggFjYxLSolIx4bGBMNCgcCBQ8DARhGdi83GAA/LwEuLi4uLi4uLi4uLi4uLgAuLi4uMTABSWi5ABgAOEloYbBAUlg4ETe5ADj/wDhZNxYPAQYjIjU0PwEnJjU0MzIXFg8BBiMiNTQ/AScmNTQzMh8BFhcHBiMiNTQ/ASYnJjU0MzIfARbJCwptBgoUBGRkBBUJBm1aOwYJFQQzMwQUCgY7C6Q8BgkVBDMNJgQVCQY8CtELDI0IEwcFgYEFBhUIjBlOCBUGBUJDBQcTCE0LD00IFAYGQhIwBQcUCE4NAAUAFAABAdoBjAAJABcAIQAvADkAgkA8ATo6QDsWNycWOTAvAyIENTQrAyoREAUDBAQMCwkDAB0cBCEYAgUTJSQUAxMFCwoyGg4qKQEtHwcDASdGdi83GAA/PDw/PC88PC88/Rc8EP0BLzz9PC8XPP0XPC8XPP0XPC4uAC4xMAFJaLkAJwA6SWhhsEBSWDgRN7kAOv/AOFkBFCMiPQE0MzIVFyMVFCMiPQE0OwEyFRQHFCMiNRE0MzIVBxQrASI1NDsBNTQzMhURFCMiPQE0MzIVAVAUFBQUdnYUFBSKFM8UFBQURhOLExN3FBMTFBQTAQETE3cUFNqJFBSdFBQUihMTAWQUFJ4UFBSKFBT+nBMTdxQUAAIACv85ALwAKAAJABMAR0AXARQUQBUIEQgDDw4EEwoGBQwBAAABA0Z2LzcYAD88Ly88AS88/TwuLgAuMTABSWi5AAMAFEloYbBAUlg4ETe5ABT/wDhZMyMiNTQ7ATIVFAcUIyI9ATQzMhWoixMTixRFFBQUFBQUFBSzFBSKFBQAAwARAGgBdQEZAAkAEwAdAFhAIAEeHkAfCBwXEg0IAxoZBRQBAAUFEA8FCwoGBRUUAQ1Gdi83GAAvPC88Lzz9PBD9PBD9PAEuLi4uLi4AMTABSWi5AA0AHkloYbBAUlg4ETe5AB7/wDhZJSMiNTQ7ATIVFAchIjU0MyEyFRQHIyI1NDsBMhUUAWHFExPFFBT+xBQUATwUi8UUFMUU8RQUFBREFBQUFEUUExMUAAMAFv/zAMkApgALABcAHwBPQB0BICBAIQAYBBwMBAASBAYeBRoPBQkVBQMJAwEGRnYvNxgALy8Q/RD9L/0BL/0v/S/9ADEwAUlouQAGACBJaGGwQFJYOBE3uQAg/8A4WTcUBiMiJjU0NjMyFgc0JiMiBhUUFjMyNicUIyI1NDMyyTUlJTQ0JSY0KB0VFB0dFBUdHhQTExRMJTQ0JSU1NCYVHR0VFB0dFBMTFAAEABX/4AHhAasADQAbACkANwBPQBsBODhAOQw0HxEDNi8oIRoTDAUKLSYBGAIBL0Z2LzcYAD8/Ly8BLi4uLi4uLi4ALi4uLjEwAUlouQAvADhJaGGwQFJYOBE3uQA4/8A4WQEHBiMiNTQ/ATYzMhUUDwEGIyI1ND8BNjMyFRQXBwYjIjU0PwE2MzIVFA8BBiMiNTQ/ATYzMhUUAdt+BggVBn4GCBXBggYIFQaDBwcUSn8GCBUHfgYIFcF9BggVBn0GCBUBiX4GFAgGfgYUCG2DBhUIBoIHFQhefgYTCAd/BhUIbX0GFAgGfQYUCAAABQAd//MBvwGXAAsAFwAjAC8ANwBqQC4BODhAOQAMBAASBAYkBBgqBB4wBDQPBQknBSEVBQMtBRsyBTYDNgEhAgkDAQZGdi83GAA/Pz8vEP0v/RD9EP0Q/QEv/S/9L/0v/S/9ADEwAUlouQAGADhJaGGwQFJYOBE3uQA4/8A4WSUUBiMiJjU0NjMyFgc0JiMiBhUUFjMyNicUBiMiJjU0NjMyFgc0JiMiBhUUFjMyNicUIyI1NDMyAb96V1d6eldXeidkRkZkZEZGZC5INDRJSTQ0SCgxIyMyMiMjMTYeHh4exVd7e1dXe3tXRmRjR0ZkZEY0SUk0NElJNCMyMiMjMjIjHR0dAAMAGwABAM0BjAAJABMAHQBXQCABHh5AHwAMAhMKBA8OGAUEBAkAHRQEGRgWGxEHAwEORnYvNxgAPzw8LwEvPP083Tz9PBDdPP08AC4uMTABSWi5AA4AHkloYbBAUlg4ETe5AB7/wDhZNxQjIj0BNDMyFQcUIyI9ATQzMhUTFCMiNRE0MzIVzRQUFBSKFBQUFEUUFBQU7RMTixQUixMTixQU/pwTEwFkFBQAAwARAAABcwG0ABcAKQA3AGhAKQE4OEA5KDQgDgI2LyglIhsFBAQXAAwLBBEQCAUUJiUFGBQtGRgAAS9Gdi83GAA/PDwvEP08EP0BLzz9PC88/TwuLi4uLi4ALi4uLjEwAUlouQAvADhJaGGwQFJYOBE3uQA4/8A4WQEUIyI9ATQmIyIGHQEUIyI9ATQ2MzIWFRMjIjU0PwE2MzIVFA8BMzIVFAsBBiMiNTQ3EzYzMhUUAUcUFDkpKDoUFFE5OVEY2RcGWQYKFgREsxR+vgYKFgS/BgoVAR8UFAopOjopChQUCjlSUjn+1xAHCIEJFAYFYhQUAR7+6wkUBgUBFQkUBgAAAwAZ//QBMAGLABEAHwA5AGJAJgE6OkA7EDYoHBUJAzQXEAsIBQ0JBCYwBCAeLQUjIw4NAwgCASZGdi83GAA/PzwvEP0BLzz9L/08Li4uLi4uAC4uLi4uLjEwAUlouQAmADpJaGGwQFJYOBE3uQA6/8A4WQEHBiMiNTQ/ASMiNTQ7ATIVFA8BBiMiNTQ/ATYzMhUUFRQGIyImNTQzMhUUFjMyNjU0JyY1NDMyFxYBJI4GBRQJWZkTE9kXDK0GBRQJrQUGFFA6OlAUEzopKTkPBBUKBhYBZmEEFgoGPBQUEgthdQQVCwZ1BBYKlTpQUDoUFCk5OigfFgYGFAojAAAFACUAAQFEAdsADQAXACEAKwA1AHtAMwE2NkA3DDMpHyEYDAkIBAMdHAQKADUsBDEwJyYEKyIXDgQTEgoJBRABABUuJBoGAgESRnYvNxgAPy88PC8vPDz9PAEvPP08Lzz9PC88/TwvPP08Li4uLi4uLgAuLi4xMAFJaLkAEgA2SWhhsEBSWDgRN7kANv/AOFklIyI9ATQzMh0BMzIVFCcUIyI1ETQzMhUTFCMiPQE0MzIVBxQjIj0BNDMyFQcUIyI9ATQzMhUBMLEUFBOeFPcUFBQU4xQUFBRFFBQUFEUUFBQUnhSKFBR2FBQUExMBFRQU/k0TE2MUFGMTE2MUFGMTE2MUFAAAAwAn//QBPQGLAA0AFwAyAGdAKQEzM0A0DC4gFRAELCgEGAwXDgQTEgIBBB4HBgEABQklBRsbCgkDAQZGdi83GAA/PC8Q/RD9PAEvPDz9PC88/TwvPP0uAC4uLi4uMTABSWi5AAYAM0loYbBAUlg4ETe5ADP/wDhZASMVFCMiPQE0OwEyFRQHFCMiPQE0MzIVFxQGIyImJyYzMhceATMyNjU0JyY1NDMyFx4BASnVFBQU6RSoFBQUFKhROjBKCwYZDwQJNCIpOkIOFAQEKTMBY3gTE4wUFBTRFBSUFBSoOlA7LRkPICo6KEYXBQ0WAhBHAAAFABf/9AG4AdsADQAbACkANQBBAFtAIgFCQkBDDB8RAyghGhMMBTYEKjwEMDkFMz8FLSYYCi0BMEZ2LzcYAC8vPDwQ/S/9AS/9L/0uLi4uLi4ALi4uMTABSWi5ADAAQkloYbBAUlg4ETe5AEL/wDhZAQcGIyI1ND8BNjMyFRQPAQYjIjU0PwE2MzIVFA8BBiMiNTQ/ATYzMhUUExQGIyImNTQ2MzIWBzQmIyIGFRQWMzI2AbN9BgkWBX0GCRZpfQYJFQR9BgkVaXwGChUFfAYJFT5ROTpRUTo5USg5KSk6OikpOQG5nggVBwaeCBUHBJ8IFAYGnwgUBgafCBQGBp8IFAb+vTpQUDo6UFA6KTo6KSk5OgADABAAAQEuAYwACQATACEAYEAmASIiQCMAFgIcDw4EEwoFBAQJACEUBBkYGhkFBwwfHhEDBwMBHEZ2LzcYAD8XPC8Q/TwBLzz9PC88/TwvPP08LgAuLjEwAUlouQAcACJJaGGwQFJYOBE3uQAi/8A4WSUUIyI9ATQzMhUDFCMiNRE0MzIVBxQjIj0BIyI1NDsBMhUBLhQUFBRGExQUE0UUFFgTE2wU7RMTixQU/pwTEwFkFBSLExN3FBQUAAQAIv/zAMkBlgALABYAIQA9AGxALAE+PkA/JDQwJiIZFQAEPCgkHw8GBDYyLhwFOQ0MBSEXEgUDCQUrKzkDAS5Gdi83GAA/LxD9L/0vPP08EP0BLzw8/Tw8Lzw8/Tw8Li4uLgAxMAFJaLkALgA+SWhhsEBSWDgRN7kAPv/AOFk3NCYjIgYVFBYzMjYnIwYVFBYzMjY1NCc2NTQmIyIGFRQfARYVFAcWFRQGIyImNTQ3JjU0NyY1NDYzMhYVFKEaERIaGhIRGiUNJRoSERolJRoREholPB4dHTEiIjIdHR4eMSMiMUcSGRkSEhoauwckEhkZEiQvBSYRGhoRJgUUGyQlGholIjIyIicYGCcmGRgnIjExIiYABQALAAABqwHnAAsAGQAnADUAQQBkQCgBQkJAQwAyJBY0LSYfGBE8BAY2BAAfBQ85BQkDBT8JPwErHQ8AAS1Gdi83GAA/PDw/LxD9EP0Q/QEv/S/9Li4uLi4uAC4uLjEwAUlouQAtAEJJaGGwQFJYOBE3uQBC/8A4WQEUBiMiJjU0NjMyFg8BBiMiNTQ/ATYzMhUUDwEGIyI1ND8BNjMyFRQPAQYjIjU0PwE2MzIVFDc0JiMiBhUUFjMyNgGrUTo5UVE5OlE2fQYKFAV8BgkWa3wGCRYFfQYKFGh8BwkVBXwHCRXSOikpOjsoKToBXTpRUTo5UVHwnggTBwaeCBQGBp4IFAYGnggTBwadCBMHBp0IEwexKDo6KCg7OwAGACH/9ADUAWsACwAXACMALwA3AD8AbkAvAUBAQEEAJBgEDAA4MAQ0PB4qBAYSMgU2AwUhPgU6GwUJFQUnLQUPDyEBCQMBEkZ2LzcYAD8/LxD9L/0Q/S/9EP0v/QEvPP08Lzz9PC88/TwAMTABSWi5ABIAQEloYbBAUlg4ETe5AED/wDhZExQGIyImNTQ2MzIWFRQGIyImNTQ2MzIWJzQmIyIGFRQWMzI2FTQmIyIGFRQWMzI2JxQjIjU0MzIVFCMiNTQzMtQ0JSU0NCUlNDQlJTU1JSU0KB0UFB0dFBQdHRQUHh4UFB0dFBMTFBQUFBQBEiUzMyUlNDTrJDQ0JCY0NaEUHR0UFB0dshUdHRUTHRzaExMU2hMTFAAFABf/OQDJAO4ACwAVAB8AKwAzAGpALAE0NEA1AB0gBBQALB8WBDAbGiYEDwYjBQkuBTIDBSkSEQUMGA0MAAkBAQZGdi83GAA/PzwvEP08L/0v/RD9AS88/S88PP08PC88/QAuMTABSWi5AAYANEloYbBAUlg4ETe5ADT/wDhZNxQGIyImNTQ2MzIWByMiNTQ7ATIVFAcUIyI9ATQzMhU3NCYjIgYVFBYzMjYnFCMiNTQzMsk0JSU0NCUlNBSLExOLFEUUFBQUHh4UFB0dFBQeHhQUFBSVJTQ0JSU0NLoUFBQUsxQUjBMTvBQdHRQUHR0UFBQUAAADAAkAJQEhAWYAFAAmADsAX0AkATw8QD0sNSoQBQIBOjMwLCUgHRoOCwcJBBMCAAMBIhgDAQBGdi83GAA/LwEvFzz9Li4uLi4uLi4uLi4ALi4uLi4uMTABSWi5AAAAPEloYbBAUlg4ETe5ADz/wDhZNzUzNzYzMhUUBwYHFxYVFCMiLwEmPwE2MzIVFA8BFxYVFCMiLwEmPwE2MzIVFAcGBxcWFRQjIi8BJjU0EgE8BwkUBBkbNAUWCQY9CWFrBgkUBGNjBBQJBm0KYzwGCRUEGRs0BBUJBjoGzwJOCRQGBiEiQgYGFAhOCxCKCBQGBoGBBgYTCI0OCU4IFAYFISJCBQcUCEsHCAYAAAMAEQBoAXUBGQAJABMAHQBYQCABHh5AHwgcFxINCAMaGQUUAQAFBRAPBQsKBgUVFAENRnYvNxgALzwvPC88/TwQ/TwQ/TwBLi4uLi4uADEwAUlouQANAB5JaGGwQFJYOBE3uQAe/8A4WSUjIjU0OwEyFRQHISI1NDMhMhUUByMiNTQ7ATIVFAFhxRMTxRQU/sQUFAE8FIvFFBTFFPEUFBQURBQUFBRFFBMTFAADABEAJQEpAWYAEgAkADcAVkAeATg4QDklMyggFjYxLSolIx4bGBMNCgcCBQ8DARhGdi83GAA/LwEuLi4uLi4uLi4uLi4uLgAuLi4uMTABSWi5ABgAOEloYbBAUlg4ETe5ADj/wDhZNxYPAQYjIjU0PwEnJjU0MzIXFg8BBiMiNTQ/AScmNTQzMh8BFhcHBiMiNTQ/ASYnJjU0MzIfARbJCwptBgoUBGRkBBUJBm1aOwYJFQQzMwQUCgY7C6Q8BgkVBDMNJgQVCQY8CtELDI0IEwcFgYEFBhUIjBlOCBUGBUJDBQcTCE0LD00IFAYGQhIwBQcUCE4NAAMAKv85ANwCRAALABcAYACEQDkBYWFAYgxOKltaUERDLEc6AARXGwxeIwYEQDMSSgVUW1oFREM9BRg3NgUgJgUwFQUDCQUPVA8BEkZ2LzcYAC8vEP0v/S/9L/08L/0vPP08EP0BLzw8/Tw8Lzw8/Tw8Li4uLi4uAC4uMTABSWi5ABIAYUloYbBAUlg4ETe5AGH/wDhZFzQmIyIGFRQWMzI2NxQGIyImNTQ2MzIWAzIWFRQGBwYjIgYVFBYzMjc2MzIVFAcGIyImNTQ2NzMyNjU0JiMiJjU0NjMxMjY1NCYjIgcGIyI1NDc2MzIWFRQGIzEiBhUUFrQdFBQdHRQUHSg0JSU0NCUlNFklNC8jAwQUHR0UHg4GDBUCGTglNC8iCBQdHRQlNDQlFB0dFBkOBwoVBBkwJTQ0JRQdHW4UHR0UFB0dFCU0NCUlNDQBeTQlIzIDAR0UFB0cDBQFBTI0JSI0Ax0UFB00JiU0HRQUHRQKFAYGJTMlJTQdFBUdAAACABEAAAKyAZsAKwA1AFlAIQE2NkA3AhMQDQoHNC8YAjIxBS0sJiABKSMdAxYEAAEYRnYvNxgAPzw/PDw/PC88/TwBLi4uLgAuLi4uLjEwAUlouQAYADZJaGGwQFJYOBE3uQA2/8A4WSUWFRQjIicDBwYjIi8BBwYjIi8BAwYjIjU0NxM2MzIfATc2MzIfATc2MzIXAyEiNTQzITIVFAKxARUNBWdNBwsLB1FRBwwLB0xnBQ4VAXgGDAwHUFEHDAsHUFAHDA0FE/52ExMBihQaAwQTDgE/ow8PqqoPD6P+wQ4TBAMBcBEPqqoPD6qqDxH+2hQTExQAAAIAJP/FAQMBjAAWADkAbkArATo6QDsDOSonJh0cExIANzUzLSwoJyMfGRcVCQ8EAwwLBQYHBjAvAwEJRnYvNxgAPzwvPBD9PAEv/S4uLi4uLi4uLi4uLi4ALi4uLi4uLi4uMTABSWi5AAkAOkloYbBAUlg4ETe5ADr/wDhZNxcWFRQGKwEiNTQ7ATI2NTQmKwEiNTQzMjU0JisBIjU0MzI1NCYrAREUIyI1ETQ7ATIWFRQHFhUUB3NWOjsqZhQUZhkkIxorExNRHRUfFBQ5Fg87FBQUTyAtGDAjjwkbQik7FBQjGRokFBQxFB0UFCUQFv6wExMBZBQuIBoVGTYgGgADAB//9ANoAZgADQA9AE4AdkAxAU9PQFAUMCwkFkI+JhQKAAUENQxABB1KBAxEGgIFEE0gCAUqMi4qPDgQAzoOAwE1RnYvNxgAPzw/PDwvPDwQ/Tw8EP08PAEv/d39EN39Li4uLi4uAC4uLi4xMAFJaLkANQBPSWhhsEBSWDgRN7kAT//AOFkBJiMiBhUUFjMyNyY1NCU2MzIXFhUUIyInJiMiBhUUFjMyNzYzMhUUBwYjIicGIyInBiMiJjU0NjMyFzYzMhMmNTQ3JiMiBwYjBhUUFjMyAUcoL0ZjY0YvKDsBSDRCXDwGFAgGM0lGY2NGSzEGCBQGQFhBNTg+QDc1QlZ7e1ZCNDdBPxc7OyguOy8BAT5kRi4BWBhkR0ZjGD1UVVgmQgYIFAY2ZEdGYzQHFAgGQSUlJSV7Vlh7Jib+nDtWWDsYJQE0UUZjAAYAHP//AjQBjAATACcAOwBFAE8AWQCEQDwBWlpAWwBXUkM+IhoOBgoEAB4EFDIEKEU8BEE3LQNAT0YES0pZUARVVEpGBQRNOSQDEANIKxgDBAABVEZ2LzcYAD8XPD8XPBD9PAEvPP08Lzz9PC8XPP08L/0v/S/9Li4uLgAuLi4uMTABSWi5AFQAWkloYbBAUlg4ETe5AFr/wDhZJRQHBiMiNTQ3NjU0JyY1NDMyFxYHFAcGIyI1NDc2NTQnJjU0MzIXFgcUBiMiNTQzMjY1NCYjIjU0MzIWBxQjIj0BNDMyFQMUIyI1ETQzMhUDFCMiPQE0MzIVAjQ2BgoUAy8wAxQLBjZQSwYIFAY/QwcVCAZPT3RSExNCXFxCExNTc7MUFBQUTxQUFBRPFBQUFMVkVwoTBgVOWVlPBQYUClNrbVEHFAgGRV5iQwcIFAZRcFJzFBRcQUJcFBRzoRMTnRQU/wATEwFkFBT+/xMTnRQUAAcAIwAAAa4BjAAJABMAHQAnADEAOwBFAJFAQAFGRkBHCEQ/OjUwKyYhHBcSDQgDCwoFDx8eBSMBAAUGBS4tBSkoGhkFFRQ4NwUzMkJBBTw9PAAkIwIQDwMBIUZ2LzcYAD88Pzw/PBD9PC88/TwvPP08Lzz9PC88/TwQ/TwQ/TwBLi4uLi4uLi4uLi4uLi4AMTABSWi5ACEARkloYbBAUlg4ETe5AEb/wDhZJSMiNTQ7ATIVFCcjIjU0OwEyFRQXIyI1NDsBMhUUJyMiNTQ7ATIVFAcjIjU0OwEyFRQHIyI1NDsBMhUUByMiNTQ7ATIVFAGadxMTdxSL7BMT7BRjdxMTdxSL7RMT7RQU7BMT7BQU7RMT7RQU7BMT7BTrFBQUFHkUFBQU6xQUFBSrFBQUFHIUFBQUchQUFBRAFBQUFAAABQAjAAEBrgGMAAkAEwAdACcAMQBzQDEBMjJAMwgvJhwSCAMxKAQtLCENBBcLCgUPFRQFGQEABQYFJCMFHx4qGhkCEA8DARdGdi83GAA/PD88Ly88/TwvPP08EP08EP08AS8XPP08Li4uLi4ALjEwAUlouQAXADJJaGGwQFJYOBE3uQAy/8A4WSUjIjU0OwEyFRQnIyI1NDsBMhUUByMiNTQ7ATIVFAcjIjU0OwEyFRQHFCMiPQE0MzIVAZp3ExN3FIvsExPsFBTtExPtFBTsExPsFOwUFBQU6xQUFBR5FBQUFEAUFBQUchQUFBSeExN5FBQAAAEAF//0AaIBlwA0AHhANAE1NUA2DyIxLiAKAzQHBgMABBAPKQQZCAcFDCYFHAYFBQEANDMFLy4sBRYWHAMNDAEBGUZ2LzcYAD88Py8Q/S88/TwvPP08EP0Q/TwBL/0vPP0XPC4uLi4uAC4xMAFJaLkAGQA1SWhhsEBSWDgRN7kANf/AOFklIyI1NDsBNSMiNTQ7ATIdARQGFQ4BIyImNTQ2MzIXFhUUIyInJiMiBhUUFjMyNyMiNTQ7AQF6sRQUsbEUFMUUAhtjOld6eldIPAcUBwYtPUZjY0ZBMJAUFLGOFBQfFBMUfwIFAjE7eldXey8GCBUFJWRGRmMrFBQABAAg/7MBhAG0ABEAGwAlADcAiEA7ATg4QDkmLSwrKiQaBDcmDQwEEQALCgQGBR8VBDIxAwIFCxMSBRgXIiEFHRw1NAUsKw8ILygMCwIBMUZ2LzcYAD88LzwvPC88/TwvPP08Lzz9PBD9PAEvPP08Lzz9PC88/TwvPP08Li4uLgAxMAFJaLkAMQA4SWhhsEBSWDgRN7kAOP/AOFkBFCsBIj0BNDMyHQEzNTQzMhUXIyI1NDsBMhUUByMiNTQ7ATIVFBcUIyI9ASEVFCMiPQE0MyEyFQE0FJ0UFBR1FBQU7BQU7BQU7BQU7BQoFBT+7BQUFAE8FAE2FBRqFBRWVhQUxRQUFBRIFBQUFMwUFIWFFBSZFBQABQATAAEAsgIWAAsAFwAhAC0AOQBrQC0BOjpAOwAfLiIEDAAhGAQdHDQoBBIGJQUJAwUrMQUVDwU3CRo3ASsDFQIBBkZ2LzcYAD8/Py8vEP0Q/RD9EP0BLzz9PC88/TwvPP08AC4xMAFJaLkABgA6SWhhsEBSWDgRN7kAOv/AOFkTFAYjIiY1NDYzMhYVFAYjIiY1NDYzMhYDFCMiPQE0MzIVEzQmIyIGFRQWMzI2FTQmIyIGFRQWMzI2si4hIS8vISEuLiEhLy8hIS47FBQUFBMXEBEXFxEQFxcQEBgYEBAXAcchLi4hIS4u2iEvLyEhLi7+5RMTexQUATgQFxcQEBcXqRAXFxAQGBgAAAYACf/1AYUCFgALABcALQBBAE0AWQB6QDUBWlpAWwBANioiNCwgTkIELgwAEgYEVEhFBQkDBUtRBRUPBVcmBRs7BTEJMVcBSwMVAgE0RnYvNxgAPz8/Ly8Q/S/9EP0Q/RD9EP0BLzz9PC88PP08Li4uAC4uLi4xMAFJaLkANABaSWhhsEBSWDgRN7kAWv/AOFkBFAYjIiY1NDYzMhYVFAYjIiY1NDYzMhYHDgEjIiYnJjU0MzIXFjMyNzYzMhUUNw4BIyImJyYzMhceATMyNjc2MzIDNCYjIgYVFBYzMjYVNCYjIgYVFBYzMjYBgS4hIS4uISEuLiEhLi4hIS5MDTwmJTwNAhUNBRQ1NRUFDRVJDWlERGcNBRgQAwtSNTZTCwMQGCsYEBAXFxAQGBgQEBcXEBAYAcchLi4hIC8v2iEuLiEhLy+nISoqIQQEEwwyMgwTBAFBVlVBFxAzQkM0EAEjEBcXEBAXF6oQGBcREBcXAAAEACMAAAGtAYwADQAfAC0AOwBgQCUBPDxAPQI5GRELNzApIh4JAhkYBBQTAgUyJAQyACsBHBYDARNGdi83GAA/PD8/PDwQ/QEvPP08Li4uLi4uLgAuLi4uMTABSWi5ABMAPEloYbBAUlg4ETe5ADz/wDhZJRYVFCMiLwEmNTQzMhc3BwYjIj0BNDMyHQE3NjMyFRQTFhUUIyIvASY1NDMyHwEWFRQjIi8BJjU0MzIXAakEFQkGsAQVCAYHuwkIEBQUmgYHFUYEFQkGjwQVCAYzBBQJBm8EFQkGHwUGEwj7BQYUCEyUBxeUFBRrewUWCf6yBQYTCMwFBhQIzgUGEwieBQYUCAAAAwAhAAABIgHHAAkAFwAhAGBAJQEiIkAjFh8aEAIWBQQECQAhGAQdHBMSBA4NFBMFCgcLCgABDUZ2LzcYAD88LxD9PAEvPP08Lzz9PC88/TwuAC4uLi4xMAFJaLkADQAiSWhhsEBSWDgRN7kAIv/AOFk3FCMiNRE0MzIVEyMiPQE0MzIdATMyFRQnFCMiPQE0MzIV0xQUFBQ72RQUFMUUkxQUFBRZExMBWhQU/k0U2RQUxRQUWRMTTxQUAAABACUAAQJ3Ac0AJwBXQB8BKChAKQAiHBEOCwgFBQQEJwASEQQXFiUfGRQCARZGdi83GAAvPC88PAEvPP08Lzz9PAAuLi4uLi4uMTABSWi5ABYAKEloYbBAUlg4ETe5ACj/wDhZJRQjIjURBwYjIi8BBwYjIi8BERQjIjURNDMyHwE3NjMyHwE3NjMyFQJ3FBRlBwoLB3l5BwsKB2UUFBMMB3l5BwsKB3h5BwwTFBMTAU7MDg7z8w4OzP6yExMBohcO9fUODvT0DhcAAQAkAAECJgHOACMATEAZASQkQCUiIB0XDAkGAyINDAQSERQaDwERRnYvNxgALy88AS88/TwuAC4uLi4uLi4xMAFJaLkAEQAkSWhhsEBSWDgRN7kAJP/AOFkBAwYjIi8BBwYjIi8BERQjIjURNDMyHwE3NjMyHwE3NjMyFRQCJHcGDAwGZGQGDQwGUBQUEw0GZGUHCwsHZGQFDRUBrv7oDw/t7Q8Pvv7AExMBohYO7e0QEO3tDBMFAAUAHf/zAb8BlwALABcAIwAvADcAakAuATg4QDkADAQAEgQGJAQYKgQeMAQ0DwUJJwUhFQUDLQUbMgU2AzYBIQIJAwEGRnYvNxgAPz8/LxD9L/0Q/RD9EP0BL/0v/S/9L/0v/QAxMAFJaLkABgA4SWhhsEBSWDgRN7kAOP/AOFklFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYnFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYnFCMiNTQzMgG/eldXenpXV3onZEZGZGRGRmQuSDQ0SUk0NEgoMSMjMjIjIzE2Hh4eHsVXe3tXV3t7V0ZkY0dGZGRGNElJNDRJSTQjMjIjIzIyIx0dHQADACIAAQF9AYwAEwAvADkAbkAuATo6QDsAJw4GIAQUCgQAJSQEKhopOTAENTQkIwUQHRwFGAQXMjctLAMQAwE0RnYvNxgAPxc8Ly88PP08EP08AS88/TwvPDz9PC/9L/0uLgAuMTABSWi5ADQAOkloYbBAUlg4ETe5ADr/wDhZARQHBiMiNTQ3NjU0JyY1NDMyFxYHFAYrASI1NDsBMjY1NCYrARUUIyI9ATQ7ATIWAxQjIjURNDMyFQF9IgYKFAMbGwMUCgYiVkgyKBMTKCIxMSIUFBQUKDJI3RQUFBQBET00CRQFBiswMSsGBRQJND4zSBQUMSIiMVMTE2cUSP7QExMBZBQUAAACAB3/dQI+AZcAIABBAHxANwFCQkBDJDEuHxwVEg8sKSQaFwYDADQzFQMUBDk4EAMPDAQ8JyYBAwAFIiEGAwUJBT82PwMBPEZ2LzcYAD8vEP0vFzz9FzwBL/0vFzz9FzwuLi4uLi4uLgAuLi4uLi4uMTABSWi5ADwAQkloYbBAUlg4ETe5AEL/wDhZJSMiNTQ7AS4BIyIGFRQWFzU0MzIdATY3JyY1NDMyHwE2NzMyFRQrAQYHFxYVFCMiLwEGBxUUIyI9AS4BNTQ2MzIWAZhBExNBCGBBRmRXPxQULyYtBxUIBi0eLWsUFGsGKUwGFQgGSzFAFBRQbntXUXeyFBNAVmNHQWAIQBQUQAYeLQcIFAYuJlcTFD8zTAYIFQZMKQZrFBRrCHdSV3tuAAACACYAAAGUAYwACQA/AHpANQFAQEBBDTUSKCEeGBUNCi4EPjMyBDg3CQAEBQQyMQUHKyoFHh0VAxQjGgIDDwA7OgcDAQRGdi83GAA/PDw/FzwvFzz9PBD9PAEvPP08Lzz9PC/9Li4uLi4uLgAuLjEwAUlouQAEAEBJaGGwQFJYOBE3uQBA/8A4WTcUIyI1ETQzMhUfARYVFCMiLwEGKwEXFhUUIyIvASMXFhUUIyIvASY1NDsBMjY1NCYrARUUIyI9ATQ7ATIWFRROFBQUFONfBBUKBmUKDApYBBULBmYfWAQVCgdtBhd/IC4uIGsUFBR/MUUUExMBZBQUyZAGBRQJmAN/BgUUCZV/BQYUCZ4IBxAuISAvbxMTgxRGMUMAAQAd/zkA0AKiAFsAdkAyAVxcQF0fQBI+EDElGQRZTQlTRwMENysfFgUMIgUABgUcRAU6NAVKUAUuVgUoDDoBCUZ2LzcYAC8vL/0v/S/9EP0v/S/9EP0BLzw8/Tw8Lzw8/Tw8Li4ALi4xMAFJaLkACQBcSWhhsEBSWDgRN7kAXP/AOFkTMjY1NCYjIiY1NDYzMhcWFRQjIicmIyIGFRQWMzIWFRQGIyIGFRQWMzIWFRQGIyIGFRQWMzIWFRQGIyInJjU0MzIXFjMyNjU0JiMiJjU0NjMyNjU0JiMiJjU0NnYUHh0UJjQ0Ji8aBBULBg4ZFB8fFCU0NSQUHx4VJTQ2JRQdHxQlNDQlOhgCFAwGDiAUHR0UJjQ0JhQdHRQmNDQBjB4VFBw0JSY0JgYFFAkVHhUUHTMlJjQeFBQcNSUlNh0UFB01JSU0MwUFEwwcHRQUHjQlJjQeFBQdMyYmMwADAA0AAQFwAaAACQAhACsAeEA0ASwsQC0ZHw4HKiUZFAwLBBEQBCEKBB0cCQAEBQQcGxIRCwUKBRYjIgUnAignAxcWAgEURnYvNxgAPzw/PC8Q/TwQ/Rc8AS88/TzdPP08EN08/TwuLi4uAC4uLjEwAUlouQAUACxJaGGwQFJYOBE3uQAs/8A4WTcUIyI9ATQzMhU3IxUUIyI9ASMiNTQzITIVFCsBFRQjIjU3ISI1NDMhMhUU0hQUFBQdYhQURRMTATwUFEUUFG3+xBMTATwUFBMT7RQUMncTE3cUExMUdxMTvBQUFBQAAwAm//IBWQGEABcAKwA/AGVAKAFAQEBBKjw0KCA+Kh4TEgQXAAwLBDIHBg8FAyQFGjgFLi4VCQMBBkZ2LzcYAD88LxD9L/0v/QEvPDz9PC88/TwuLi4ALi4uLjEwAUlouQAGAEBJaGGwQFJYOBE3uQBA/8A4WQEUBiMiJj0BNDMyHQEUFjMyNj0BNDMyFQcGIyInJjU0MzIXFjMyNzYzMhUUBwYjIicmNTQzMhcWMzI3NjMyFRQBVlk/P1kUFEEvL0IUEwQ7VlQ9BxMHBjRERDMGBxQLQ0pLQwsUBQU7QD4+BQQTAStAWVlARRQURS9CQi9FFBT7MzQGCRQFKikFFAlmIyMGCxYDHx4CFAsAAgAI/+8BjAGMABMAJwBHQBgBKChAKSYhAyYcEggXDQEkHhADCgMBHEZ2LzcYAD8XPD8vAS4uLi4ALi4xMAFJaLkAHAAoSWhhsEBSWDgRN7kAKP/AOFkBBwYjIi8BJjU0MzIfATc2MzIVFBcDBiMiJwMmNTQzMhcbATYzMhUUATVYBwsMB1gCFQsGRkYGDBVTrgcMCwetAhULBpucBgwVAW66Dw+6BQUUDJSUDBQFBf6QDw8BcAUFFAz+twFJDBQFAAABAA7/8AKvAYoAKwBLQBkBLCxALSolHxkMBioUDwkDIhwBKBYDARRGdi83GAA/PD88Lzw8AS4uAC4uLi4uMTABSWi5ABQALEloYbBAUlg4ETe5ACz/wDhZAQMGIyIvAQcGIyIvAQcGIyInAyY1NDMyFxM3NjMyHwE3NjMyHwETNjMyFRQCrncGDQwHT1EHCwsHUVAHCw0GeAEVDgRoTAcLDAdRUQcLCwdNZwQOFQFw/pERDqqqDg6qqg4RAW8DBBMN/sGjDw+rqw4OowE/DRMEAAACABL/8wIJAZcAKwBXAGhAKAFYWEBZKlVST0xJPzkzJR8ZDwwJBgNELioUPDZCMAAiHAMoFgMBFEZ2LzcYAD88Pzw/PC88AS4uLi4ALi4uLi4uLi4uLi4uLi4uLjEwAUlouQAUAFhJaGGwQFJYOBE3uQBY/8A4WQEHBiMiLwEHBiMiLwEHBiMiLwEmNTQzMh8BNzYzMh8BNzYzMh8BNzYzMhUUAxYVFCMiLwEHBiMiLwEHBiMiLwEHBiMiNTQ/ATYzMh8BNzYzMh8BNzYzMhcCB0oHCgsHPj0HCwoHPT4HCwoHSgIUDAU4PwcLCgc9PAcKCwc/OAUMFAICFQsFOD8HCwoHPD0HCgsHPzgFCxUCSgcKCwc+PQcKCwc9PgcLCgcBbpQODnt7Dg57ew4OlAUEFAtxeg4OenoODnpxCxQE/qkFBBQLcnsODnt7Dg57cgsUBAWVDg58fA4OfHwODgAAAQAFAAEBngGzACsAX0AlASwsQC0NJh4bCwgAIR4ZDQgFKxEQAwAEJyYWAxUpEyMDAwEZRnYvNxgAPzwvLwEvFzz9FzwuLi4uLi4ALi4uLi4uMTABSWi5ABkALEloYbBAUlg4ETe5ACz/wDhZEzc2MzIVFA8BNzYzMhUUDwEVFCMiPQEnJjU0MzIfAScmNTQzMh8BNTQzMhXlTgYJFARNfgQEEw2sFBSrDRMEBH1NBBUJBk0UFAEYbggTBQZuMAIVDQVAuRMTuUAFDRUCL20FBhMIbocUFAAAAQAP/9gBBAHaAC0Ab0AsAS4uQC8gAiwpJiMgGxgVEg8MCQQBGRgFHRMSBSQjKikFDQweHQcGAQABCUZ2LzcYAD8vPC88Lzz9PC88/TwQ/TwBLi4uLi4uLi4uLi4uLi4ALjEwAUlouQAJAC5JaGGwQFJYOBE3uQAu/8A4WTcHMzIVFCsBIjU0PwEjIjU0PwEjIjU0PwEjIjU0OwEyFRQPATMyFRQPATMyFRT5mY0UFMcXCpmMFwqajRcKmYwTE8YYC5mMGAuZjBh6ehQUEgoIehIKCHoSCgh6FBQSCgh6EgoIehIKAAACAAcBvgDdAp8AFAAmAEdAFgEnJ0AoGCAdGgoAIhgQBSUVDgcBEEZ2LzcYAC88LzwBLi4uLgAuLi4uLjEwAUlouQAQACdJaGGwQFJYOBE3uQAn/8A4WRMyHwEWFRQjIi8BBgcGIyI1ND8BNjcXFhUUIyIvAQcGIyI1ND8BNnEJBlYGFAgGSBQ1BggUBlYGFlcHFQgGSUgGCBQGVg4CPQZWBggVBkgTNQYVCAZWBlRXBwgUBklIBhUIBlYOAAEAAf+xAO//2QAJADlADwEKCkALCAgDBgUBAAEDRnYvNxgALzwvPAEuLgAxMAFJaLkAAwAKSWhhsEBSWDgRN7kACv/AOFkXIyI1NDsBMhUU28YUFMYUTxQUFBQAAwABAb4A+gK3AA0AGwApAEVAFQEqKkArAicSCwQlHhcQCQIZIAEXRnYvNxgALy8BLi4uLi4uAC4uLi4xMAFJaLkAFwAqSWhhsEBSWDgRN7kAKv/AOFkTFhUUIyIvASY1NDMyFwcWFRQjIi8BJjU0MzIfARYVFCMiLwEmNTQzMhf0BhUIBkcGFQgGMwYVCAZWBhQIB5cGFQgGRwYUCAYCGwYIFQZHBggVBgYGCBUGVgYIFAbQBggVBkgGCBUGAAQAFP/zAb8BIAAJABMAHwArAGBAJgEsLEAtABEHBQQECQAPDgQTCiAEFCYEGiMFHSkFFx0XDAIAARpGdi83GAA/PC8vEP0Q/QEv/S/9Lzz9PC88/TwALi4xMAFJaLkAGgAsSWhhsEBSWDgRN7kALP/AOFklFCMiPQE0MzIVBxQjIj0BNDMyFQcUBiMiJjU0NjMyFgc0JiMiBhUUFjMyNgG/ExQUE0UUFBQUOVk+PlhYPj5ZKEEuLUFBLS5BExQU7RQU7RQU7RQUdj5ZWT4+WFg+LUFBLS5BQQAAAQAiAAABBgIVADcAc0AwATg4QDkCISA2NCwjHhgAEgQCJwQyDg0ECQgaBRYVKikFLg8OBQULLy4DBgUAAQhGdi83GAA/PD88LxD9PBD9PC88/QEvPP08L/0v/S4uLi4uLi4ALi4xMAFJaLkACAA4SWhhsEBSWDgRN7kAOP/AOFk3FhUUBisBIjURNDMyFREzMjY1NCYrAQY1NDMyNzY1NCsBIjU0MzI1NCsBIjU0OwEyFhUUBxYVFNE1OipsFBQUWBgkJBgnExMaFhwxGhMTMyUOExMOISwTK6gaNSU0FAHtFBT+JxwVFR0EFhUJCxMoFBQdHRQUKRwWExctHgADABX/8wK3AUgADQA9AEwAc0AvAU1NQE4UOjAsJBYOREAmFAoASQQMQgQdBQQ1RhoCBRA+CCAFKjIuKjw4EAIBNUZ2LzcYAD88PC88PBD9PDwQ/Tw8AS/9L/0v/S4uLi4uLgAuLi4uLi4xMAFJaLkANQBNSWhhsEBSWDgRN7kATf/AOFkTJiMiBhUUFjMyNyY1NCU2MzIXFhUUIyInJiMiBhUUFjMyNzYzMhUUBwYjIicGIyInBiMiJjU0NjMyFzYzMgMyNyY1NDcmIyIGFRQXFvwbIjZMTDYiGysBBik2RzQGFAgGJzg2TEw2OCcGCBQGNUYyLSg1NSgqNEZkZEY0KCs0NTUjGywsGiQ1TTYnARAQTTU2TA8wQ0JLHTUGCBMGKE01Nk0pBhQHBjYdHBwcZEZHYx0d/tQPL0RDLxBNNUIlGwAEABj/9AHDAdsACQATAB8AKwBdQCQBLCxALQAMAgUEBAkADw4EEwogBBQmBBojBR0pBRcRBxcBGkZ2LzcYAC8vPBD9L/0BL/0v/S88/TwvPP08AC4uMTABSWi5ABoALEloYbBAUlg4ETe5ACz/wDhZJRQjIjURNDMyFQMUIyI1ETQzMhUDFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYBwxMUFBNFFBQUFDlZPj5YWT0+WShBLi1BQS0uQRQTEwGzFBT+TRMTAbMUFP7EPllZPj5YWD4tQUEtLkFBAAMAFf/zAa0BIAAJABMAMwBiQCYBNDRANQgwIjIgEg0IAykEGQEABQYFJgUcEA8FCwosBRYcFgEZRnYvNxgALy8Q/S88/TwQ/S88/TwBL/0uLi4uLi4ALi4xMAFJaLkAGQA0SWhhsEBSWDgRN7kANP/AOFklISI1NDMhMhUUByEiNTQzITIVFAcGIyImNTQ2MzIXFhUUIyInJiMiBhUUFjMyNzYzMhUUAZn+2BMTASgUFP7YExMBKBSTLEI+WVk+OigHFAcGIScuQUEuLyIGCBSeFBMTFEYUFBQUNDFZPj5YJAYJFQUbQS0uQSQGFAcAAAEADf9+AOoB4wA+AJJASgE/P0BADhA7NCghGg4DLCslJB4dFwcWBD44NzEwBwYHABMFCh0cAQMABRgXBgMFPj0fAx4FOTgkAyM3NiYDJQUyMSsDKgouAQNGdi83GAAvLy8XPP0XPC8XPP0XPC8XPP0XPBD9AS8XPP0XPC4uLi4uLi4ALjEwAUlouQADAD9JaGGwQFJYOBE3uQA//8A4WTcjIjU0OwE1NDYzMhcWFRQjIiYjIgYdATMyFRQrARUzMhUUKwEVMzIVFCsBFRQjIj0BIyI1NDsBNSMiNTQ7AVw7FBQ7LiEgGAcUBhcOEBc7FBQ7OxQUOzsUFDsUFDsUFDs7FBQ74hQUiiAvFwYJExEXEIoUFB0UFB0UFMYUFMYUFB0UFAAEAAn/OQGtASAACwAkAEIATgBfQCUBT09AUEE/MSEULyMSQwRBAEkEBkYFCUwFAxsFDjgFKAkoAS9Gdi83GAAvLxD9L/0v/RD9AS/9Lzz9Li4uAC4uLi4xMAFJaLkALwBPSWhhsEBSWDgRN7kAT//AOFklFAYjIiY1NDYzMhYDBiMiJyY1NDMyFx4BFxYzMjc2NzYzMhUUFw4BIyImJyYnJjU0MzIXFhceATMyNjc2NzYzMhUUJzQmIyIGFRQWMzI2AaxYPj5YWD4+WFYvS0wwDBILBwIFASM5OiIGAQgKE0MbbkJCbhwBBAIUDQYBBBZaNzZaFwIDBg0SKEEuLkBALi5Bij5ZWT4+WFj+7js9DwoSCQIHAS0uBgMLFQkMO0dIOwQIBQQUDgMJMDo7MAUFDhQLxS1BQS0uQUEAAgAi/zkCJQHbAAkAOABeQCMBOTlAOhg4NTArJiEVExEPDQIeHRkYOAoJAwAEBQQHGwEERnYvNxgALy8BLzz9FzwuLi4uAC4uLi4uLi4uLi4uLjEwAUlouQAEADlJaGGwQFJYOBE3uQA5/8A4WTcUIyI1ETQzMh0BNDYzMhc2MzIXNjMyFhURFCMiNRE0JiMiBhUUIyI1NCYjIgYVFCMiNTQmIyIGFUoUFBQUIxgwIBwyMh0gLyk7FBQjGRgjFBQiGRgjExQjGRgjFBMTAbMUFMEMFygoKCg6Kf6HFBQBeRgjIxgTExgjIxgTExgjIxgABQAV/8gAswHyAAsAFwAhAC0AOQBnQCoBOjpAOwAfNCgEEgYcLiIEDAAhGAQdHCUFCQMFKzEFFTcFDwkaKwMBBkZ2LzcYAD8vLy/9L/0Q/RD9AS88/TzdPP08EN08/TwALjEwAUlouQAGADpJaGGwQFJYOBE3uQA6/8A4WRMUBiMiJjU0NjMyFhUUBiMiJjU0NjMyFgMUIyI9ATQzMhUTNCYjIgYVFBYzMjYVNCYjIgYVFBYzMjazLiEgLy8gIS4uISEuLiEhLjsUFBQUExcQEBcXEBAXFhEQFxcQEBcBoyEvLyEhLi7fIC8vICEuLv7WFBSMFBQBOxAXFxAQGBetERYWERAXFwAABgAK/8MBfQHkAAsAFwArAEEATQBZAHRAMQFaWkBbAD81KCAyLCoeTkIEDAAGEgRIVAMFS0UFCVEFFVcFDyQFGjoFLwkvSwMBMkZ2LzcYAD8vLxD9L/0v/S/9EP0Q/QEvPP08Lzz9PC4uLi4ALi4uLjEwAUlouQAyAFpJaGGwQFJYOBE3uQBa/8A4WQEUBiMiJjU0NjMyFhUUBiMiJjU0NjMyFgcGIyInJjU0MzIXFjMyNzYzMhUUFw4BIyImJyY2MzIXHgEzMjY3NjMyFgM0JiMiBhUUFjMyNhU0JiMiBhUUFjMyNgF9LiAhLi4hIC4uICEvLyEgLk4gTU4fAhUNBRUzMxYFDRRID2ZCQmYOAg0JDgQMUTM0Tw0EDgoNJRcQEBcXEBAXFxAQGBcREBcBlCAuLiAhLy/eIS4uISEvL6lHRwQFEwwvLwwTBAI+UVE+Cw0OMUBAMQ4NATcQGBcREBcXrRAYGBAQFxcAAAQAJ///AYQBoAANAB8ALQA7AFpAIQE8PEA9AjkrHBkRCzcwKSIeCQIZGAQUExYDMiQEAAETRnYvNxgAPzw8PwEvPP08Li4uLi4uLgAuLi4uLi4xMAFJaLkAEwA8SWhhsEBSWDgRN7kAPP/AOFklFhUUIyIvASY1NDMyFycHBiMiPQE0MzIdATc2MzIVFBcWFRQjIi8BJjU0FzIXBxYVFCMiLwEmNTQzMhcBgAQVCQZ8BBUJBjOKCQgPFBRrBgYURAQVCQZbBBUJBgcEFQkGOQQUCgYgBgYUCK0GBhQIJGIGFe4UFMdMBBUJ1wYGFQl/BgYVAQh/BgYVCVAGBhUJAAACACQAAQCaAaAACQATAEhAGAEUFEAVChEPDgQTCgkABAUEDAIHAwEERnYvNxgAPy88AS88/TwvPP08AC4xMAFJaLkABAAUSWhhsEBSWDgRN7kAFP/AOFk3FCMiNRE0MzIVExQjIj0BNDMyFUwUFBQUThQUFBQUExMBeBQU/ogTE9kUFAAFACUAAQJjAVAACQATAB0AJwBdAJlARAFeXkBfLVJHPDAlFhEHRUQPDgQTCh0UBBkYMzIELi0FBAQJACceBCMiUE8EVVQ+BDo5TEE2BVxYKiAMAlooARsCARhGdi83GAA/PzwvPDwvPDz9PDwBLzz9Lzz9PC88/TwvPP08Lzz9PC88/TwvPP08Li4ALi4uLi4uLi4xMAFJaLkAGABeSWhhsEBSWDgRN7kAXv/AOFklFCMiPQE0MzIVBxQjIj0BNDMyFQUUIyI9ATQzMhUTFCMiPQE0MzIVNzYzMhYdARQjIj0BNCYjIgYdARQjIjU0JiMiBh0BFCMiNTQmIyIGHQEUIyI9ATQ2MzIXNjMyAhQUFBQUnxMUFBP+1xMUFBOLFBQUFNcdNCk7FBQjGRgjFBQjFxkiFBQkGBgjFBQ7KC4fHzMtFBMTnhQUnhMTnhQUFBMTnhQU/tgTE54UFEwrOikKExMKGCMjGAsTExktIxgLExMZLSMYChMTCik6KysABAAdAAEBwQFTAAkAEwAdAEMAekAzAUREQEU6PDUtIRYRBzoFBAQJACQjBB8eEwoEDw4rKgQwLx0UBBkYQScFNzMMAhsCARhGdi83GAA/LzwvPP08AS88/TwvPP08Lzz9PC88/TwvPP08LgAuLi4uLi4uMTABSWi5ABgAREloYbBAUlg4ETe5AET/wDhZJRQjIj0BNDMyFQcUIyI9ATQzMhUHFCMiPQE0MzIVFxUUIyI9ATQmIyIGHQEUIyI9ATQ2MzIXNjMyFhUUIyI1NCYjIgYBchQUFBSgFBQUFI0UFBQU2xMVJBYZIxQUOykuIBs3KDsUFCQXGSUUExOfFBSfExOfFBQTExOfFBR2DBMTChcmJBgLExMLKToqKkQqExMaLSMAAAQAGf/zAUUBIAALABcAIwAvAFxAJQEwMEAxACoEHhIEBgwEACQEGA8FCScFIS0FGxUFAwkDIQEBBkZ2LzcYAD8vLxD9L/0Q/RD9AS/9L/0v/S/9ADEwAUlouQAGADBJaGGwQFJYOBE3uQAw/8A4WSUUBiMiJjU0NjMyFgc0JiMiBhUUFjMyNicUBiMiJjU0NjMyFgc0JiMiBhUUFjMyNgFFWD89WFc+P1goQS4tQUEtLkEbMSMiMDAiIzEoGhISGRkSEhqKPllZPj5YWD4tQUEtLkFBLiMwMCMjMDAjEhkZEhIZGQAABAAm/zoB0QEgAAsAFQAfACsAXUAkASwsQC0AHRMVDAQRECYEBiAEAB8WBBsaIwUJKQUDCRgOARpGdi83GAAvPC8v/RD9AS88/Twv/S/9Lzz9PAAuLjEwAUlouQAaACxJaGGwQFJYOBE3uQAs/8A4WSUUBiMiJjU0NjMyFgEUIyI1ETQzMhUDFCMiNRE0MzIVBTQmIyIGFRQWMzI2AdFYPz5YWD4/WP7BExQUE0QUFBQUAVtBLi1BQS0uQYo+WFg+PlhY/oYUFAGyFBT+ThQUAbIUFHYuQEAuLkBAAAQAGf86AcQBIAAJABMAHwArAF1AJAEsLEAtABEHBQQECQAPDgQTCiAEFCYEGiMFHSkFFx0MAgEaRnYvNxgALzwvL/0Q/QEv/S/9Lzz9PC88/TwALi4xMAFJaLkAGgAsSWhhsEBSWDgRN7kALP/AOFkFFCMiNRE0MzIVAxQjIjURNDMyFQcUBiMiJjU0NjMyFgc0JiMiBhUUFjMyNgHEFBQUFEUUFBQUOVg/PlhYPj9YKEEuLUFBLS5BshQUAbIUFP5OFBQBshQUdj5YWD4+WFg+LkBALi5AQAAAAgAhAAEBwAFQAAkALwBcQCIBMDBAMSQsJyEdFxEMLyUkGhkVFAoJAAQFBAIfAQcCAQRGdi83GAA/Py8BLzz9PC4uLi4uLi4uAC4uLi4uLi4xMAFJaLkABAAwSWhhsEBSWDgRN7kAMP/AOFk3FCMiNRE0MzIVFxQjIjU0JiMiBh0BFCMiPQE0NjMyFzYzMhYdARQjIjU0JiMiBhdIExQUE9sUFCQYGCMUFDsoLh8fMyg6FBQjFxkjARQTEwEoFBSBExMZLSMYChMTCik6KytDKgETExktIxgAAQAa/3UAzQHGAEcAZEAoAUhIQEkDMAwuCiETBD0DRTcEJxkQBQYkBTo0BSoABRYeBUIqBgEZRnYvNxgALy8v/S/9EP0v/RD9AS88/TwvPP08Li4ALi4xMAFJaLkAGQBISWhhsEBSWDgRN7kASP/AOFk3MhYVFAYjIicmNTQzMhcWMzI2NTQmIyImNTQ2NzYzMjY1NCYjIiY1NDYzMhcWFRQjIicmIyIGFRQWMzIWFRQGBwYjIgYVFBZzJTU0JjgZAhUNBQ0fFR0dFSU0LyMDBBUdHRUlNDQlLRwEFAkHEBkUHR0UJTUvIwMFFB0dJzQlJTQzBQQUDB0eFBQdNCUjMwMBHBQUHTUlJTQmBgYUCRUdFBQeNCUjMgMBHRQUHQAAAQARAAEA1wFPADMAikBGATQ0QDUPMCkdFg8DISAaGRMSDAcLBDMtLCYlBwYHABIRAQMABQ0MBgMFLi0ZAxgFMzIUAxMsKxsDGgUnJiADHyMJAgEDRnYvNxgAPy8vFzz9FzwvFzz9FzwvFzz9FzwBLxc8/Rc8Li4uLi4uADEwAUlouQADADRJaGGwQFJYOBE3uQA0/8A4WTcjIjU0OwE1NDMyHQEzMhUUKwEVMzIVFCsBFTMyFRQrARUUIyI9ASMiNTQ7ATUjIjU0OwFgOxQUOxQUOxQUOzsUFDs7FBQ7FBQ7FBQ7OxQUO+wUFCcUFCcUFB0UFBwUFE8TE08UFBwUFAAAAgAg//QBDgESABcAKwBXQCABLCxALSooIBMSBCoXAAwLBB4HBg8FAyQFGhUJGgEGRnYvNxgALy88EP0v/QEvPDz9PC88PP08AC4uMTABSWi5AAYALEloYbBAUlg4ETe5ACz/wDhZJRQGIyImPQE0MzIdARQWMzI2PQE0MzIVBwYjIicmNTQzMhcWMzI3NjMyFRQBDUUyMUUUFC4gIS4UFAgzPDwxCRMGBiYxMicFBhS6MkVFMkQUFEQhLi4hRBQU6SEhBgoVBBobBBYKAAACAAn/8QEyARUAEwAnAEVAFgEoKEApJiENAyYcEggkHhADChcBHEZ2LzcYAC8vFzwBLi4uLgAuLi4xMAFJaLkAHAAoSWhhsEBSWDgRN7kAKP/AOFk3BwYjIi8BJjU0MzIfATc2MzIVFBcHBiMiLwEmNTQzMh8BNzYzMhUU4jIHCwoHMwMVCwYhIQYLFEyABwsKB4EDFQsGb28GCxT4Yg4NYgUFFAtBQAsTBAX5Dg35BQUUC9fWCxMEAAABAAj/8QJZARwAKwBJQBcBLCxALSolIh8cGQwGKhQoFg8JAwEURnYvNxgALzw8LzwBLi4ALi4uLi4uLjEwAUlouQAUACxJaGGwQFJYOBE3uQAs/8A4WQEDBiMiLwEHBiMiLwEHBiMiJwMmNTQzMh8BNzYzMh8BNzYzMh8BNzYzMhUUAlhjBgwLB0dIBwsKB0ZIBwsMBmMCFA0FVUQICQoIR0gICgkIQ1QFDRQBAf8AEA1/fw0Nf38NEAEABAQTDdl5DQ1+fg4OedkNEwQAAAIACv/xAf4BPwArAFcAaEAoAVhYQFkqVVJPTEk/OTMoFg8MCQYDRC4qFDw2QjAAIhwCJR8ZAQEURnYvNxgAPzw8Pzw/PC88AS4uLi4ALi4uLi4uLi4uLi4uLi4uMTABSWi5ABQAWEloYbBAUlg4ETe5AFj/wDhZAQcGIyIvAQcGIyIvAQcGIyIvASY1NDMyHwE3NjMyHwE3NjMyHwE3NjMyFRQHFhUUIyIvAQcGIyIvAQcGIyIvAQcGIyI1ND8BNjMyHwE3NjMyHwE3NjMyFwH6SAgICAhAPwcJCAc/QAgICAhHBBQJBjhACAgICD8+CAgICEA4BgkVBQQUCgY4PwgICAg+QAgICAg/OAYKEwRHCAgICD9ACAgHCD8/CAgICAETZAoKV1cKCldXCwtkBgYUCE5XCwtXVwsLV04IFAb8BgYUCUxWCwtXVwoKVkwJFAYGYwsLV1cKCldXCwsAAQAJ/4kBowE8ACwAXkAkAS0tQC4OJyQfHAwJAwAiHxoOCQUsEhEDAAQoJxcDFioUARpGdi83GAAvLwEvFzz9FzwuLi4uLi4ALi4uLi4uLi4xMAFJaLkAGgAtSWhhsEBSWDgRN7kALf/AOFk/ATYzMhUUBwYHNzYzMhUUDwEVFCMiPQEnJjU0MzIfAScmNTQzMh8BNTQzMhXqTQYJFQQmKH8EBBMNrBQUrA0UBAR9TQQVCQZNFBSibggTBgU3ODABFA0FQLkUFLlABQ0VAjBvBQYTCG6GFBQAAQAR//8BBAGLACEAYEAlASIiQCMaEyAdGhUSDwwJBAECAQUGHh0FDQwYFwMSAgcGAAEJRnYvNxgAPzw/PzwvPP08EP08AS4uLi4uLi4uLi4ALjEwAUlouQAJACJJaGGwQFJYOBE3uQAi/8A4WTcHMzIVFCsBIjU0PwEjIjU0PwEjIjU0OwEyFRQPATMyFRT7n5EUFMUXCZ+RFwmfkRMTxRcJn5EXto8UFBEKCJARCgiOFBQRCgiPEQoABwAY//8BLAIpAAsAFQAfACkANQBBAEkAjkBCAUpKQEsAJxNGPBUREAwbGgQfFkIENioEACkgBCUkMAQGJCAaFhAFDAUOOQVIRAU/LQUJAwUzCUgDHQEiGA4AAQZGdi83GAA/PDw/Py8v/RD9L/0Q/RD9FzwBL/0vPP08L/0v/S88/TwuLi4uLi4ALi4xMAFJaLkABgBKSWhhsEBSWDgRN7kASv/AOFkBFAYjIiY1NDYzMhYDFCMiPQE0MzIVBxQjIj0BNDMyFQcUIyI9ATQzMhUTNCYjIgYVFBYzMjYnFAYjIiY1NDYzMhYHNCMiFRQzMgEsUDo6UFA6OlAxFBQUFEUTFBQTRxQUFBSVOSkpOTkpKTkcKR0dKCgdHSkoHh0dHgGfOlFROjlRUf47FBSLFBSLFBTZFBTZFBSLFBQBASk5OSkpOjopHSgoHR0oKB0dHR4AAAUABP//AUYBlwATAB0AJwAxADsAd0AyATw8QD06LyoMAjo1JiEcFw4AMSgELSwHBREVFAUZJCMFHx44NwUyMzIAGhkBEQMBDkZ2LzcYAD8/PD88EP08Lzz9PBD9PBD9AS88/TwuLi4uLi4uLgAuLi4uMTABSWi5AA4APEloYbBAUlg4ETe5ADz/wDhZARYjIicuASMiBgcGIyI3PgEzMhYHIyI1NDsBMhUUByMiNTQ7ATIVFAcUIyI9ATQzMhUTISI1NDMhMhUUARYGGQ8ECDYiIjQJBA8aBgtLMDBKOygTEygUFCgTEygUYxQUFBSy/usTEwEVFAEvGQ8gKiogDxktOzuXFBQUFEMUFBQUMxMTxRQU/usUFBQUAAkAAQGoAjwCWgALABcAIwAvADsARwBPAFcAXwCFQDsBYGBAYQAkBABYBFwYBDxMBEhQBFQ2BBIGBCowBAxCBB5FOS0FA15WTgVaUko/MycFCSEVCRsPAwEeRnYvNxgALzw8Lzw8EP08PC88PP08PBD9PDwBL/0v/S/9L/0v/S/9L/0v/S/9ADEwAUlouQAeAGBJaGGwQFJYOBE3uQBg/8A4WQEUBiMiJjU0NjMyFgcUBiMiJjU0NjMyFgcUBiMiJjU0NjMyFgU0JiMiBhUUFjMyNic0JiMiBhUUFjMyNic0JiMiBhUUFjMyNiUUIyI1NDMyBxQjIjU0MzIHFCMiNTQzMgI8MyYlNDQlJTTENCUmNDUlJTTGMyYlMzMlJTQBYx4UFB0dFBQexR0UFB4eFBQdxR4UFBwcFBQeAWwUFBQUxBQUFBTGFBMTFAIBJTQ0JSU0NCUlNDQlJTQ0JSU0NCUlNDQlFB0dFBQdHRQUHR0UFB0dFBQdHRQUHR0UExMUFBMTFBQTExQAA///Ab4A+AK3AA0AGwApAEVAFQEqKkArDCYYEQMoIRoTDAUKHwETRnYvNxgALy8BLi4uLi4uAC4uLi4xMAFJaLkAEwAqSWhhsEBSWDgRN7kAKv/AOFkTBwYjIjU0PwE2MzIVFA8BBiMiNTQ/ATYzMhUUFwcGIyI1ND8BNjMyFRTyVwYIFQdWBggVkEYHCBQHRgYIFDRHBgcWBkcGCBUClFYGFAgHVgYVCFZGBxQIB0YGFAhARgYWBwZGBhUIAAIAEP9qAMIAHAAXAB8AS0AaASAgQCEABg8EABgEExwMBQMIHgUaFQMBBkZ2LzcYAC8vL/08EP0BLzz9L/0uADEwAUlouQAGACBJaGGwQFJYOBE3uQAg/8A4WRcUBiMiJjU0MzIUFjMyNjU0JiI1NDMyFgcUIyI1NDMywjQlJTQUFB0UFB0dJxMlNEUUFBQUPSU0NCUTJx4eFBQdFBQ0JRQUFAAAAwAt/zkA3gJEAAsAFwBcAHtANQFdXUBeAEckRSJaThIEPjIGOCsMBFQbAA8FCQMFFUsFQTsFUTUFVxgFLy4oBR4JHkEDAQZGdi83GAA/Ly8Q/S88/S/9L/0Q/S/9EP0BLzw8/Tw8Lzw8/Tw8Li4ALi4xMAFJaLkABgBdSWhhsEBSWDgRN7kAXf/AOFkTFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYDMhYVFAYjIicmNTQzMhcWMzI2NTQmKwEiJjU0NjMyNjU0JiMiJjU0NjMyFxYVFCMiJyYjIgYVFBYzMhYVFAYjIgYVFBbeMyUlNDQlJTMoHBQUHh4UFBwxJTQ0JC8aBBQLBg4aFBwcFAElMzMkFB4dFCUzMyU5GAIUDAYNIBQdHRQlNDQkFB4dAewlNDQlJTMzJRQdHRQUHR3+EzQlJTQmBgYUChQdFBQdNCUlNB0UFB40JSU0MwUFEwwcHRQUHTUlJTQdFBQdAAUAEQAAArICuAANABsAKQBVAF8AcUAtAWBgQGEsPTo3NDEnIBILBF5ZQiwlHhcQCQJcWwVXVhlQSgFTTUcDQC4AAUJGdi83GAA/PD88PD88Ly88/TwBLi4uLi4uLi4uLgAuLi4uLi4uLi4uMTABSWi5AEIAYEloYbBAUlg4ETe5AGD/wDhZARYVFCMiLwEmNTQzMhcHFhUUIyIvASY1NDMyHwEWFRQjIi8BJjU0MzIXARYVFCMiJwMHBiMiLwEHBiMiLwEDBiMiNTQ3EzYzMh8BNzYzMh8BNzYzMhcDISI1NDMhMhUUAacGFQgGRwYVCAYzBhUIBlYGFQgGlwYUCAZIBhQIBwGKARUOBWdMBwsMB1BSBwsLB01nBQ0VAXcFDQwHUFEHDAsHUFAHDAwGE/52ExMBihQCHAYIFQZHBggVBgcGCBQGVgYIFAbQBggVBkgGCBUH/fEDBBMOAT+jDw+qqg8Po/7BDhMEAwFwEQ+qqg8PqqoPEf7aFBMTFAAFABAAAAKxArcADQAbACkAVQBfAHFALQFgYEBhLD06NzQxJh8YEQNeWUIsKCEaEwwFXFsFV1YKUEoBU01HA0AuAAFCRnYvNxgAPzw/PDw/PC8vPP08AS4uLi4uLi4uLi4ALi4uLi4uLi4uLjEwAUlouQBCAGBJaGGwQFJYOBE3uQBg/8A4WQEHBiMiNTQ/ATYzMhUUDwEGIyI1ND8BNjMyFRQXBwYjIjU0PwE2MzIVFBMWFRQjIicDBwYjIi8BBwYjIi8BAwYjIjU0NxM2MzIfATc2MzIfATc2MzIXAyEiNTQzITIVFAIGVgYIFgdXBwgTj0YGCBUGRgYIFTNHBggVBkcGBxb0ARUNBWhMBwsMB1BSBwsLB01nBQ0VAXcGDQwHT1EHDAsHUFAHDAwGE/52ExMBihQClVYGFQgGVQYUCFdGBhUIBkYGFQg/RgYVCAZGBhYH/gkEAxMOAT+jDw+qqg8Po/7BDhMEAwFwEQ+qqg8PqqoPEf7aFBMTFAAABAARAAACsgKhAAkANQBJAFwAdUAvAV1dQF4MWFVSQ0A9Nh0aFxQRWlBNRTsiDAgDBgUFAQBNSjAqATMtJwMgDgABIkZ2LzcYAD88Pzw8PzwvPC88/TwBLi4uLi4uLi4uAC4uLi4uLi4uLi4uLjEwAUlouQAiAF1JaGGwQFJYOBE3uQBd/8A4WSUhIjU0MyEyFRQXFhUUIyInAwcGIyIvAQcGIyIvAQMGIyI1NDcTNjMyHwE3NjMyHwE3NjMyFycyHwEWFRQjIi8BBwYjIjU0PwE2JzYXMRcWFRQjIi8BBwYjIjU0NwIm/nYTEwGKFHcBFQ4FZ0wHCwwHUFIHCwsHTWcFDRUBdwUNDAdQUQcMCwdQUAcMDAbYCAdWBhUIBkdJBggVBlYICA8OVwYVCAZISAYIFQZkFBMTFEoDBBMOAT+jDw+qqg8Po/7BDhMEAwFwEQ+qqg8PqqoPEbQGVgYIFQZISAYVCAZWBlQPD1cGCBUGSUgGFQgGAAQAEQAAArICLQARACMATwBZAHVAMAFaWkBbJjc0MS4rWFM8Jh4SBgAcFAMFDFZVBVFQGAUhEAghSkQBTUdBAzooAAE8RnYvNxgAPzw/PDw/PC88PBD9Lzz9PC/9PDwBLi4uLi4uLi4ALi4uLi4xMAFJaLkAPABaSWhhsEBSWDgRN7kAWv/AOFkBFAYjIiY1NDMyFBYzMjY0MzIHFCMiNCYjIgYUIyI1NDYzMhYBFhUUIyInAwcGIyIvAQcGIyIvAQMGIyI1NDcTNjMyHwE3NjMyHwE3NjMyFwMhIjU0MyEyFRQCJDQlJTQUFB0UFB0UFM8UFB0UFB4UFDUlJTQBXAEVDQVnTQcLCwdRUQcMCwdMZwUOFQF4BgwMB1BRBwwLB1BQBwwNBRP+dhMTAYoUAhglNDQlFCgeHihZEyceHicTJjQ1/iIDBBMOAT+jDw+qqg8Po/7BDhMEAwFwEQ+qqg8PqqoPEf7aFBMTFAALABEAAAKyAlsACwAXACMATwBZAGUAcQB9AIUAjQCVAK9AUgGWlkCXJjc0MS4rPCaKBIZmBAyOBJJTBgRgWgQAggR+WBgEcmwEEngEHpCIgAWUjIRWVQVRUHVpXQUJGw8DBXtvYyEVCUpEAU1HQQM6KAABPEZ2LzcYAD88Pzw8PzwvPDwvPDz9PDwQ/Tw8Lzz9PC88PP08PAEv/S/9L/0vPP0v/S/9Lzz9L/0v/S4uAC4uLi4uMTABSWi5ADwAlkloYbBAUlg4ETe5AJb/wDhZARQGIyImNTQ2MzIWBxQGIyImNTQ2MzIWBxQGIyImNTQ2MzIWARYVFCMiJwMHBiMiLwEHBiMiLwEDBiMiNTQ3EzYzMh8BNzYzMh8BNzYzMhcDISI1NDMhMhUUEzQmIyIGFRQWMzI2JzQmIyIGFRQWMzI2JzQmIyIGFRQWMzI2JRQjIjU0MzIHFCMiNTQzMgcUIyI1NDMyAoA0JSU0NCUlNMUzJiU0NCUlNMU0JSU0NCUlNAG7ARUNBWdNBwsLB1FRBwwLB0xnBQ4VAXgGDAwHUFEHDAsHUFAHDA0FE/52ExMBihQdHRQUHR0UFB3EHhQUHR0UFR3GHRQUHR0UFB0BbRQUFBTFFBMTFMUUExMUAgIlNDQlJTQ0JSU0NCUlNDQlJTQ0JSU0NP3zAwQTDgE/ow8PqqoPD6P+wQ4TBAMBcBEPqqoPD6qqDxH+2hQTExQBnhQdHRQVHBwVFB0dFBUcHBUUHR0UFRwcFRQUExMUFBMTFBQTAAAFABAAAAKxAloACwA3AEEATQBVAHlANAFWVkBXDh8cGRYTQDskDkgEBkIEAE4EUj49BTk4RQUJAwVLUAVUCTIsATUvKQMiEAABJEZ2LzcYAD88Pzw8PzwvL/0v/RD9Lzz9PAEv/S/9L/0uLi4uAC4uLi4uMTABSWi5ACQAVkloYbBAUlg4ETe5AFb/wDhZARQGIyImNTQ2MzIWExYVFCMiJwMHBiMiLwEHBiMiLwEDBiMiNTQ3EzYzMh8BNzYzMh8BNzYzMhcDISI1NDMhMhUUAzQmIyIGFRQWMzI2JxQjIjU0MzIBujQlJTQ0JSU09gEVDQVoTAcLDAdQUgcLCwdNZwUNFQF3Bg0MB09RBwwLB1BQBwwMBhP+dhMTAYoUpx0UFB4eFBQdHRQUFBQCASU0NCUlNDT99AQDEw4BP6MPD6qqDw+j/sEOEwQDAXARD6qqDw+qqg8R/toUExMUAZ0UHR0UFB0dFRUVEwAACgAJAAADVQGcAAkAEwAdACcAMQA7AEUATwBpAHMAvEBZAXR0QHUIcG9ralZTcm1oW0Q/OjUwKyYhHBcSDQgDT0YES0oLCgUPAQAFBgUuLQUpKBoZBRUUHx4FIzg3BTMyQkEFPGMBYANZSD0DPAAkIwJmTRADDwMBW0Z2LzcYAD8XPD88Pxc8Pz8Q/TwvPP08EP08Lzz9PC88/TwvPP08EP08AS88/TwuLi4uLi4uLi4uLi4uLi4uLi4ALi4uLi4uMTABSWi5AFsAdEloYbBAUlg4ETe5AHT/wDhZJSMiNTQ7ATIVFCcjIjU0OwEyFRQXIyI1NDsBMhUUJyMiNTQ7ATIVFAcjIjU0OwEyFRQHIyI1NDsBMhUUByMiNTQ7ATIVFCUUIyI1ETQzMhUPAQYjIi8BAwYjIjU0NxM2MzIfATc2MzIVFAMjIjU0OwEyFRQDQXcTE3cUi+wUFOwUY3YTE3YUi+0TE+0UFOwUFOwUFO0TE+0UFOwUFOwU/s4TFBQTR10HCwsHTmYFDRUBdgYNDAdQSwYLFRTAExPAFOsUFBQUeRQUFBTrFBQUFKsUFBQUchQUFBRyFBQUFEAUFBQUFBMTAWQUFAnFDw+j/sEOEwQDAXASEKqfDBQF/vAUExMUAAAEACH/agNrAZcABwAVACMAaACLQD0BaWlAajpUTDwmXlZOQzoiGBYMCAQEAGcEWB0EChEEK2QFW0AaDgUuYAYFAkggFAVSKFs0MAM2Mi4DAStGdi83GAA/PDw/PC8vPP08PC/9PBD9PDwQ/QEv/S/9L/0v/S4uLi4uLi4uLi4ALi4uLjEwAUlouQArAGlJaGGwQFJYOBE3uQBp/8A4WQUUIyI1NDMyJyY1NDcmIyIGFRQWMzI3NDcmIyIGFRQWMzI3JgciJwYjIiY1NDYzMhc2MzIXNjMyFxYVFCMiJyYjIgYVFB8BFjMyNzYzMhUUBwYjIicGBxYVFAYjIiY1NDMyFBYzMjY1NAH2FBMTFKw7OygvRmRkRi/ZPCssRmNjRiwrPBs/ODVBV3t7Vz83N0BBNjVBXDwGFQgGMklGZD4CLT1KMQYIFQY/WUE1FR4YNCYlMxQUHBQVHT0UFBRdO1ZXOxhkRkZjqVU+F2NHRmMXOnklJXtWV3slJSUlQQYHFQY1Y0dPNAIkNAcVBwZBJQ4MGiIlNDQlEyceHhQxAAAKAAD//wGvAqwADQAbACkAMwA9AEcAUQBbAGUAbwCpQEwBcHBAcTInIBILBG5pZF9aVVBLRkE8NzItJR4XEAkCWFcFU1JJSAVNMC8FKyo1NAU5REMFPz5iYQVdXGxrBWYZZ2YATk0COjkDARdGdi83GAA/PD88PzwvEP08Lzz9PC88/TwQ/TwvPP08EP08Lzz9PAEuLi4uLi4uLi4uLi4uLi4uLi4uLgAuLi4uLjEwAUlouQAXAHBJaGGwQFJYOBE3uQBw/8A4WRMWFRQjIi8BJjU0MzIXBxYVFCMiLwEmNTQzMh8BFhUUIyIvASY1NDMyFwEjIjU0OwEyFRQnIyI1NDsBMhUUFyMiNTQ7ATIVFCcjIjU0OwEyFRQHIyI1NDsBMhUUByMiNTQ7ATIVFAcjIjU0OwEyFRTzBhUIBkYGFQgGMwYVCAZXBhUIBpgGFQgGRwYUCAYBKHcTE3cUi+wUFOwUY3cTE3cUi+0TE+0UFOwUFOwUFO0TE+0UFOwUFOwUAg4GBxUGRgYIFQYGBggVBlcGCBUG0QYIFQZHBggVBv7OFBQUFHkUFBQU6xQUFBSrFBQUFHEUExMUcxQUFBRAFBQUFAAACgAjAAABrgKrAA0AGwApADMAPQBHAFEAWwBlAG8AqUBMAXBwQHEyJh8YEQNuaWRfWlVQS0ZBPDcyLSghGhMMBTU0BTlJSAVNMC8FKypYVwVTUkRDBT8+YmEFXVxsawVmCmdmAE5NAjo5AwFLRnYvNxgAPzw/PD88LxD9PC88/TwvPP08Lzz9PC88/TwQ/TwQ/TwBLi4uLi4uLi4uLi4uLi4uLi4uLi4ALi4uLi4xMAFJaLkASwBwSWhhsEBSWDgRN7kAcP/AOFkBBwYjIjU0PwE2MzIVFA8BBiMiNTQ/ATYzMhUUFwcGIyI1ND8BNjMyFRQTIyI1NDsBMhUUJyMiNTQ7ATIVFBcjIjU0OwEyFRQnIyI1NDsBMhUUByMiNTQ7ATIVFAcjIjU0OwEyFRQHIyI1NDsBMhUUAVFXBggVBlcGCBWQRgYIFQZGBggVM0YGCBUGRwYIFJR3ExN3FIvsExPsFGN3ExN3FIvtExPtFBTsExPsFBTtExPtFBTsExPsFAKIVgYVCAZWBhUIVkYGFQcGRwYVCEBGBhUIBkYGFQj+5xQUFBR5FBQUFOsUFBQUqxQUFBRyFBQUFHIUFBQUQBQUFBQAAAkAIwAAAa4CiwAJABMAHQAnADEAOwBFAFgAbQCpQEwBbm5AbwhnY2BXUk5LaV5USUQ/OjUwKyYhHBcSDQgDCwoFDx8eBSMGBQUBAC4tBSkoGhkFFRQ4NwUzMkJBBTxZPTwAJCMCEA8DASFGdi83GAA/PD88PzwvEP08Lzz9PC88/TwvPP08Lzz9PBD9PBD9PAEuLi4uLi4uLi4uLi4uLi4uLi4ALi4uLi4uLjEwAUlouQAhAG5JaGGwQFJYOBE3uQBu/8A4WSUjIjU0OwEyFRQnIyI1NDsBMhUUFyMiNTQ7ATIVFCcjIjU0OwEyFRQHIyI1NDsBMhUUByMiNTQ7ATIVFAcjIjU0OwEyFRQDFxYVFCMiLwEGBwYjIjU0PwE2JzIfARYVFCMiLwEGBwYjIjU0PwE2AZp3ExN3FIvsExPsFGN3ExN3FIvtExPtFBTsExPsFBTtExPtFBTsExPsFHpTBhQIBkgTNQYIFQZXEAMKBVYGFAgGSBM1BggVBlYG6xQUFBR5FBQUFOsUFBQUqxQUFBRyFBQUFHIUFBQUQBQUFBQCKVQGCBUGSBM1BhUIBlcQTwZWBggVBkgTNQYVCAZWBgAABv+4//8AswKMAA0AGwApADUAPwBLAHZAMgFMTEBNKj0nIBILBCUXEAlGBDA6QAQCKj8eNgQ7Ojo2BThDBTMtBUkZSQE4ADMDARdGdi83GAA/Pz8vEP0Q/RD9PAEvPP08PN08/RDd/S4uLi4ALi4uLi4uMTABSWi5ABcATEloYbBAUlg4ETe5AEz/wDhZExYVFCMiLwEmNTQzMhcHFhUUIyIvASY1NDMyHwEWFRQjIi8BJjU0MzIfARQGIyImNTQ2MzIWAxQjIj0BNDMyFTc0JiMiBhUUFjMyNqsGFAgGRwYUCAYzBhQIBlcGFQgGmAYVCAZIBhUIBoguISEuLiEhLjsUFBQUExYREBcXEBAXAe4GCBQGRwYIFAYGBggVBlcGCBUG0QYIFQZHBggVBuAhLi4hIS4u/tYUFIsUFH4RFhYREBcXAAAGABP//wEOAosADQAbACkANQA/AEsAdEAxAUxMQE0MPSYfGBEDKBoMBUAEKj82BDshOkYEEzA6NgU4QwUzLQVJCkkBOAAzAwEwRnYvNxgAPz8/LxD9EP0Q/TwBLzz9Lzw8/Twv/S4uLi4ALi4uLi4uMTABSWi5ADAATEloYbBAUlg4ETe5AEz/wDhZAQcGIyI1ND8BNjMyFRQPAQYjIjU0PwE2MzIVFBcHBiMiNTQ/ATYzMhUUBxQGIyImNTQ2MzIWAxQjIj0BNDMyFTc0JiMiBhUUFjMyNgEIVgYIFQZWBggVkEYGCBUGRgYIFTNGBggVBkYHCBQLLiIhLi4hIi47FBQUFBMXERAXFxAQGAJoVwYVCAZXBhUIVkcGFQgGRgYUCEBGBhUIBkUGFAjIIS4uISEuLv7WFBSLFBR+EBcWERAXFwAF//j//wDOAmsACwAXACEANgBIAHlANAFJSUBKJ0RBPjk3MCkfRjwyJwAEDB0cBCEYBgQSHBgFGgMFFQ8FCS0FIiIaABUDCQEBMkZ2LzcYAD8/Py8Q/RD9EP0Q/TwBL/0vPP08L/0uLi4uAC4uLi4uLi4uMTABSWi5ADIASUloYbBAUlg4ETe5AEn/wDhZEzQmIyIGFRQWMzI2NxQGIyImNTQ2MzIWAxQjIj0BNDMyFQMyHwEWFRQjIicmJwcGIyI1ND8BNgc2HwEWFRQjIi8BBwYjIjU0N4sXEBEXFxEQFycuICIuLiIgLjsTFBQTFAkGVgYVCAYjJUgGCBUGVgYFDw5WBhUIBkdJBggVBgEcEBcWERAXFxAhLi4hIS4u/tYUFIsUFAHNBlcGCBQGJCRIBhUIBlYGYA4OVwYIFAZISAYVCAYAAAMAIwABAiUCXwARACMARwBoQCgBSEhASUZEQT47ODAtKidGHhIGADEwBDY1GAUIHBQDBQwhEAgzATVGdi83GAAvLzw8L/08PBD9AS88/TwuLi4uLgAuLi4uLi4uLi4xMAFJaLkANQBISWhhsEBSWDgRN7kASP/AOFkBFAYjIiY1NDMyFBYzMjY0MzIHFCMiNCYjIgYUIyI1NDYzMhYFAwYjIi8BBwYjIi8BERQjIjURNDMyHwE3NjMyHwE3NjMyFRQB4zQlJTQUFB0UFB0UFM8UFB0UFB0UFDQlJTQBD3cGDAwGZGQGDQwGUBQUEw0GZWQHDAsHY2QFDRUCSyU0NCUUKB4eKFkTJx4eJxMlNDR9/ugPD+3tDw++/sATEwGiFg7t7RAQ7e0NFAUAAAgAHf/zAb8CuAANABsAKQA1AEEATQBZAGEAgkA6AWJiQGMqJyASCwQlHhcQCQI2BCo8BDBOBEJUBEhaBF45BTNRBUs/BS1XBUVcBWAZLWABSwIzAwEwRnYvNxgAPz8/Ly8Q/S/9EP0Q/RD9AS/9L/0v/S/9L/0uLi4uLi4ALi4uLi4xMAFJaLkAMABiSWhhsEBSWDgRN7kAYv/AOFkBFhUUIyIvASY1NDMyFwcWFRQjIi8BJjU0MzIfARYVFCMiLwEmNTQzMhcBFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYnFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYnFCMiNTQzMgE1BhQIB0cGFQgGMwYVCAZWBhMIB5gGFAgGSAYVCAYBCnpXV3p6V1d6J2RGRmRkRkZkLkg0NElJNDRIKDEjIzIyIyMxNh4eHh4CGgYIFAZGBggVBgYGCBUGVwYIFQfRBggVBkgGCBUG/p1Xe3tXV3t7V0ZkY0dGZGRGNElJNDRJSTQjMjIjIzIyIx0dHQAACAAd//MBvwK3AA0AGwApADUAQQBNAFkAYQCCQDoBYmJAYyomHxgRAyghGhMMBTYEKjwEME4EQlQESFoEXjkFM1EFSz8FLVcFRVwFYAotYAFLAjMDATBGdi83GAA/Pz8vLxD9L/0Q/RD9EP0BL/0v/S/9L/0v/S4uLi4uLgAuLi4uLjEwAUlouQAwAGJJaGGwQFJYOBE3uQBi/8A4WQEHBiMiNTQ/ATYzMhUUDwEGIyI1ND8BNjMyFRQXBwYjIjU0PwE2MzIVFBMUBiMiJjU0NjMyFgc0JiMiBhUUFjMyNicUBiMiJjU0NjMyFgc0JiMiBhUUFjMyNicUIyI1NDMyAZRXBggVBlcGCBWQRgcIFAZGBggVM0cGBxUGRwYIFHZ6V1d6eldXeidkRkZkZEZGZC5INDRJSTQ0SCgxIyMyMiMjMTYeHh4eApRWBhUIBlYGFQhWRgcVCAZGBhQIQEYGFQgGRgYVCP61V3t7V1d7e1dGZGNHRmRkRjRJSTQ0SUk0IzIyIyMyMiMdHR0ABwAc//MBvwKWAAsAFwAjAC8ANwBMAGAAhUA8AWFhQGIAWlRLREA9XFJGOyQEGAwEABIEBioEHjAENA8FCScFIS0FGxUFA1cFTTIFNk0DNgEhAgkDAQZGdi83GAA/Pz8vLxD9EP0Q/S/9EP0Q/QEv/S/9L/0v/S/9Li4uLgAuLi4uLi4xMAFJaLkABgBhSWhhsEBSWDgRN7kAYf/AOFklFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYnFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYnFCMiNTQzMgMXFhUUIyIvAQYHBiMiNTQ/ATYXFicyHwEWFRQjIi8BBwYjIjU0PwE2Ab97V1d6eldXeyhkRkZjY0ZGZC5INDRJSTQ0SCcyIyMyMiMjMjceHh4eDVQGFQgGSBM1BggVBlcHCgkNCgZWBhQIB0lHBggVBlYGxVd7e1dXe3tXRmRjR0ZkZEY0SUk0NElJNCMyMiMjMjIjHR0dAVJUBggVBkgTNQYVCAZXBwECWwZXBggVB0hIBhUIBlYGAAcAHP/zAb8CUwARACMALwA7AEcAUwBbAIRAOwFcXEBdJFhUMCQeEgYASAQ8TgRCNgQqGAUhHBQDBQwzBS1LBUVRBT85BSdWBVoQCCEnWgFFAi0DASpGdi83GAA/Pz8vLzw8EP0Q/S/9EP0Q/S/9PDwQ/QEv/S/9L/0uLi4uLi4uLgAxMAFJaLkAKgBcSWhhsEBSWDgRN7kAXP/AOFkBFAYjIiY1NDMyFBYzMjY0MzIHFCMiNCYjIgYUIyI1NDYzMhYTFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYnFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYnFCMiNTQzMgGtNCUlNBQUHRQUHRQU0BMUHRQUHRQUNCUlM+J7V1d6eldXeyhkRkZjY0ZGZC5INDRJSTQ0SCcyIyMyMiMjMjceHh4eAj4lNDQlFCgdHShYFCgdHSgUJTQ0/qZXe3tXV3t7V0ZkY0dGZGRGNElJNDRJSTQjMjIjIzIyIx0dHQALAB3/8wHAAyEACwAXACMALwA7AEcATwBXAGMAbwB3AKJATQF4eEB5GHRwNjAqJBIMBgA8BBhqBF5kBFhCBB5QSARUTFIFVkoFTicFCTMFFQMFLQ8FOT8FIWcFYUUFG20FW3IFdgkbdgFhAiEDAR5Gdi83GAA/Pz8vLxD9L/0Q/RD9EP0v/S/9L/0Q/S/9L/0BLzz9PC/9L/0v/S/9Li4uLi4uLi4uLgAxMAFJaLkAHgB4SWhhsEBSWDgRN7kAeP/AOFkBFAYjIiY1NDYzMhYHFAYjIiY1NDYzMhYTFAYjIiY1NDYzMhYDNCYjIgYVFBYzMjYHNCYjIgYVFBYzMjYTNCYjIgYVFBYzMjYDFCMiNTQzMgcUIyI1NDMyExQGIyImNTQ2MzIWBzQmIyIGFRQWMzI2JxQjIjU0MzIBSDQlJTQ0JSU0ATQkJTQ0JSQ0eXtWV3t7V1Z7oB0UFB4eFBQdAR0TFB4eFBQceWNGRmRkRkZjlRQUFBQBExQUE2lJMzRJSTQzSSgxIyMyMiMjMTcdHh4dAsklNTQmJTMz6yU0NCUlNDT+nVd7e1dXe3sBrRQcHBQUHh6yFB0dFBQdHf7WRmRjR0ZkZAJKFBQT2RQUE/6vNElJNDRJSTQjMjIjIzIyIx0dHQAGAA3/4AHZAasADQAnADUATwBdAGsAdkAxAWxsQG0MaFNMPysfEgNqY1xVSj00LR0QDAVGBDYZBCMWBSZDBTkKYVoBMgImAwFjRnYvNxgAPz8/Ly8v/RD9AS/9L/0uLi4uLi4uLi4uLi4ALi4uLi4uLi4xMAFJaLkAYwBsSWhhsEBSWDgRN7kAbP/AOFkBBwYjIjU0PwE2MzIVFAcWFRQjIicmIyIGFRQXFhUUIyInJjU0NjMyDwEGIyI1ND8BNjMyFRQXFAYjIicmNTQzMhcWMzI2NTQnJjU0MzIXFg8BBiMiNTQ/ATYzMhUUDwEGIyI1ND8BNjMyFRQB034GCBUGfgYIFYgLFAQFJiZGZBICFAsGF3tXMQyCBggVBoMHBxSme1YxLgsTBQUlKEZjEgMVCwYXXH8GCBQGfgYIFcF9BggVBn0GCBUBiX4GFAgGfgYUCA8GCxQCEmNHJyYFBBMLKzNXe3WDBhUIBoIHFQhjV3sXBgsUAhJkRishBQUUCysvfgYUCAZ/BhUIbX0GFAgGfQYUCAAABgAP//MBVgKlAA0AGwApAEEAVQBpAH1ANAFqakBrVGZeUkonIBILBGhUSCUeFxAJAj08BEEqNjUEXDEwOQUtTgVEYgVYGVg/MwMBF0Z2LzcYAD88Ly8Q/S/9L/0BLzw8/TwvPP08Li4uLi4uLi4uAC4uLi4uLi4uLjEwAUlouQAXAGpJaGGwQFJYOBE3uQBq/8A4WQEWFRQjIi8BJjU0MzIXBxYVFCMiLwEmNTQzMh8BFhUUIyIvASY1NDMyHwEUBiMiJj0BNDMyHQEUFjMyNj0BNDMyFQcGIyInJjU0MzIXFjMyNzYzMhUUBwYjIicmNTQzMhcWMzI3NjMyFRQBAQYUCAZHBhUHBjMGFAcHVgYUCAaYBxYIBkgGFAgH0lk/P1kUFEIuLkIUFAU8VFI/BxMHBjVDRDMGBxQLQ0pLQwsUBQU5Qj4+BQQTAgkGCBUGRgYIFQYGBggVB1YGCBQG0AYIFQZHBggUBuo/Wlo/RhQURi9CQy5GFBT7MzQGCRQFKikFFAlnIiMGCxUDHh4CFQsABgAl//MBaAKkAA0AGwApAEEAVQBpAH1ANQFqakBrDGZeUkomHxgRA2goIRoTDAU2NQRcSDEDMD08BFRBKjkFLU4FRGIFWApYPzMDATBGdi83GAA/PC8vEP0v/S/9AS88PP08Lxc8/TwuLi4uLi4uAC4uLi4uLi4uLjEwAUlouQAwAGpJaGGwQFJYOBE3uQBq/8A4WQEHBiMiNTQ/ATYzMhUUDwEGIyI1ND8BNjMyFRQXBwYjIjU0PwE2MzIVFBcUBiMiJj0BNDMyHQEUFjMyNj0BNDMyFQcGIyInJjU0MzIXFjMyNzYzMhUUBwYjIicmNTQzMhcWMzI3NjMyFRQBYlcGCBUGVwYIFZBGBggVBkYGBxYzRwYIFAZGBggVPlo+P1kUE0MuLkIUFAU8VFM/BxQHBjRERDMGBxMKQ0pMQwsUBQU4RD49BQQUAoJXBhUIBlYGFAhXRwYVCAZHBhYHP0YGFQgGRgYVCNM/Wlo/RhQURi5DQy5GFBT7MzQGCBUFKikFFAlnIiMGCxUDHh4CFQsABQAk//MBVwKFABMAJwA/AFMAZwB9QDUBaGhAaRJlXltYS0hFJBwQCGBWTUMSOzoEPyYoNDMELxoGAy43BSsgBRYMBQJSAj0xAwEuRnYvNxgAPzwvLxD9L/0v/QEvFzz9PC88PP08Li4uLi4ALi4uLi4uLi4uLi4xMAFJaLkALgBoSWhhsEBSWDgRN7kAaP/AOFklBiMiJyY1NDMyFxYzMjc2MzIVFCcGIyInJjU0MzIXFjMyNzYzMhUUJxQGIyImPQE0MzIdARQWMzI2PQE0MzIVAxcWFRQjIi8BBwYjIjU0PwE2MzIXFhUUIyIvAQcGIyI1ND8BNjMyFwFMQ0pLQwsUBQU4Qz49BQQUCDxUUz8HFAcGNUNEMwYHEwJaPj9ZFBRCLi5CFBSIUwcVCAZISAYIFQZXBggKWwcVCAZJSAYIFQZXCAcIBxUiIwYLFQMeHgIVC1szNAYIFQUqKQUUCa8/Wlo/RhQURi9CQy5GFBQBC1MHCBQGSEgGFQgGVga2BwgUBkhIBhUIBlYHCQAJACX/9AFZAtUACwAXAC8AQwBXAGMAbwB3AH8AokBLAYCAQIFCVExAOFZCNnhwBHx0ZFgEDAArKgQvGGpeBBIGJCMESh8eWwUJcgV2AwVhZwUVegV+DwUhJwUbPAUyUAVGCUZtLSEDAR5Gdi83GAA/PDwvLxD9L/0v/RD9L/0v/S/9L/0Q/QEvPDz9PC88/TwvPP08Lzz9PC88/TwuLi4ALi4uLjEwAUlouQAeAIBJaGGwQFJYOBE3uQCA/8A4WQEUBiMiJjU0NjMyFhUUBiMiJjU0NjMyFhcUBiMiJj0BNDMyHQEUFjMyNj0BNDMyFQcGIyInJjU0MzIXFjMyNzYzMhUUBwYjIicmNTQzMhcWMzI3NjMyFRQDNCYjIgYVFBYzMjYVNCYjIgYVFBYzMjYnFCMiNTQzMhUUIyI1NDMyARc1JSU0NCUmNDUlJTQ0JSU1P1o/P1kUFEIuL0IUFAVAUFM/BxMHBjRFQTUGBxULQUxOQQsUBQU3RUQ2BQUUah0VFB0dFBUdHRUUHR0UFR0eFBMTFBQTExQCeyU0NCUlNTTrJTQ0JSU0NLA/WVk/RhQURi5CQi5GFBT8MjQGCRQFKioFFgllIiIGCxUDHR0DFQsCXxQeHhQUHR2xFB0dFBQdHdkUFBTZFBQUAAABACX/dQEIAYsANwBzQDABODhAOSQ0MzYqIiAeCAIREAQWFTAEJAwEHBAPBRgGBQUKLSwFJxMoJwAZGAMBFUZ2LzcYAD88PzwvEP08L/08EP08AS/9L/0vPP08Li4uLi4uLgAuLjEwAUlouQAVADhJaGGwQFJYOBE3uQA4/8A4WTcyNTQmKwEiNTQzMjU0JisBERQjIjURNDsBMhYVFAcWFRQHFhUUBisBIjU0OwEyNjU0JisBIjU0fUwdFRkTEzMXDz8TFBRSIS0UKx42OislExMlGSQkGSYTsicSFhQUHQwR/iYUFAHuFCkcFRQWLhsWGTYlNBQUHBUVHRQTAAcAEP/0AbsCQQANABsAKQAzAD0ASQBVAHVAMAFWVkBXKjs2MSwnIBILBCUeFxAJAi8uBDMqOTgEPTRKBD5QBERHBU1TBUEZQQFERnYvNxgALy8Q/S/9AS/9L/0vPP08Lzz9PC4uLi4uLgAuLi4uLi4uLi4xMAFJaLkARABWSWhhsEBSWDgRN7kAVv/AOFkBFhUUIyIvASY1NDMyFwcWFRQjIi8BJjU0MzIfARYVFCMiLwEmNTQzMhcBFCMiPQE0MzIVBxQjIj0BNDMyFQcUBiMiJjU0NjMyFgc0JiMiBhUUFjMyNgEnBhQIBkYGFAgGMwYVCAZWBhUIBpcGFAgHRwYVCAYBExMUFBNFFBQUFDlZPj5YWT0+WShBLi1BQS0uQQGkBggVBkcGCBQGBgYIFQZXBggVBtEGCBQGRgYIFQb+YxMT7RQU7RMT7RQUdj5ZWT4+WFg+LUFBLS5BQQAABwAU//QBvwJBAA0AGwApADMAPQBJAFUAdUAwAVZWQFcqOzYxLCYfGBEDKCEaEwwFLy4EMyo5OAQ9NEoEPlAEREcFTVMFQQpBAURGdi83GAAvLxD9L/0BL/0v/S88/TwvPP08Li4uLi4uAC4uLi4uLi4uLjEwAUlouQBEAFZJaGGwQFJYOBE3uQBW/8A4WQEHBiMiNTQ/ATYzMhUUDwEGIyI1ND8BNjMyFRQnBwYjIjU0PwE2MzIVFBMUIyI9ATQzMhUHFCMiPQE0MzIVBxQGIyImNTQ2MzIWBzQmIyIGFRQWMzI2AU9WBggUBlYGCBRVRwYHFgZHBggVQUYGCBQGRgYIFPQTFBQTRRQUFBQ5WT4+WFk9PlkoQS4tQUEtLkECHlcGFAgHVwYVCJBGBhYHBkYGFQg0RwYVCAZGBhQI/kATE+0UFO0TE+0UFHY+WVk+PlhYPi1BQS0uQUEABgAS//QBvgIpAAsAFwAhACsAQABUAH9ANQFVVUBWIlBNSkNBPDk2KSQfGlJIREM+NDAnJgQrIh0cBCEYAAQMBgQSAwUVCQUPMCwPARJGdi83GAAvLzwQ/S/9AS/9L/0vPP08Lzz9PC4uLi4uLi4ALi4uLi4uLi4uLi4uMTABSWi5ABIAVUloYbBAUlg4ETe5AFX/wDhZJTQmIyIGFRQWMzI2NxQGIyImNTQ2MzIWFxQjIj0BNDMyFRcUIyI9ATQzMhUBNhcmFRYXFhUUIyIvAQcGIyI1NDcXNhcVFhcWFRQjIi8BBwYjIjU0NwEXQS0uQUEuLUEoWD4+WVk+Plg6FBQUFEUUFBQU/twPDgEDVAYUCAdHSQcIEwZWDw4DVAYUCAdISQcIEwaLLUFBLS5BQS4+WVk+PlhYtRMT7RQU7RMT7RQUARkPDwEBAVYGCBUHSEcGFAgGBA8PAQFUBggUBkdHBhQIBgAABgAR//QBuwG1ABEAGwAtADcAQwBPAHxANQFQUEBRADUwGRQoHAYXFgQbEgBEBDgzMgQ3Lj4ESiIFCCYeAwUMRwVBTQU7KxAIOwwDAT5Gdi83GAA/Ly88PBD9L/0Q/Tw8EP0BL/0vPP08L/0vPDz9PC4uLgAuLi4uMTABSWi5AD4AUEloYbBAUlg4ETe5AFD/wDhZARQGIyImNTQzMhQWMzI2NDMyERQjIj0BNDMyFScUIyI0JiMiBhQjIjU0NjMyFhMUIyI9ATQzMhUHFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYBuzQlJTQUFB0UFB4UExMUFBPPExQeFBQdFBQ0JSU0ihQUFBQ5WD4+WFg+PlgoQC4uQEAuLkABoSU0NCUUKB0dKP5fExPtFBRbEycdHScTJTQ0/pMTE+0UFHY+WVk+PlhYPi1BQS0uQUEAAAgAEf/0AbwClAALABUAIQArADcAQwBPAFsAhUA7AVxcQF0MKSQTDhEQBBUMJyYEKyJQBCwWAAREOEo+BBwGVgQyAwVBOwUJRwUfGQVNNQVTWQUvCS8BMkZ2LzcYAC8vEP0v/S/9L/0Q/S/9AS/9Lzz9PC88/Twv/S88/TwvPP08AC4uLi4xMAFJaLkAMgBcSWhhsEBSWDgRN7kAXP/AOFkTFAYjIiY1NDYzMhYTFCMiPQE0MzIVJxQGIyImNTQ2MzIWExQjIj0BNDMyFQcUBiMiJjU0NjMyFgM0JiMiBhUUFjMyNhU0JiMiBhUUFjMyNhc0JiMiBhUUFjMyNvcvISEuLiEhL8UUFBQUxS4iIS4uISIugBQUFBQ5WT4+WFg+PllvFxEQFxcQEBgYEBAXFxARF0dBLi1BQS0uQQJEIC4uICEvL/2vExPtFBSLIi4uIiAvLv5nExPtFBR2PllZPj5YWAF7ERcYEBAXF6gQFxcQERcX8C1BQS0uQUEABgAS//QBvQHbAAkAFQAfACsANwBDAHNAMQFEREBFAB0YBwI4BCA+BCYFBAQJABsaBB8WCgQsMgQQLwUTDQU1OwUpQQUjEyMBJkZ2LzcYAC8vEP0v/S/9EP0BL/0v/S88/TwvPP08L/0v/QAuLi4uMTABSWi5ACYAREloYbBAUlg4ETe5AET/wDhZJRQjIj0BNDMyFScUBiMiJjU0NjMyFhMUIyI9ATQzMhUHFAYjIiY1NDYzMhYnNCYjIgYVFBYzMjYXNCYjIgYVFBYzMjYBvRQUFBTFLiIhLi4hIi6AFBQUFDpYPj5YWD4+WG4YEBAXFhERF0dBLi5BQS4uQRQTE+0UFIsiLi4iIC8u/mcTE+0UFHY+WVk+PlhYwxAXFxARFxfwLUFBLS5BQQAABQAV//MDDQEgAAkAEwAzAD0AXQCEQDgBXl5AXwhaTDs2MCJcSjIgEg0IAykEGT00BDk4UwRDAQAFBgVQJgUcEA8FCwosVgVARhwWQAFDRnYvNxgALzwvPBD9PC88/TwQ/TwvPP08AS/9Lzz9PC/9Li4uLi4uLi4ALi4uLi4uMTABSWi5AEMAXkloYbBAUlg4ETe5AF7/wDhZJSEiNTQzITIVFAchIjU0MyEyFRQHBiMiJjU0NjMyFxYVFCMiJyYjIgYVFBYzMjc2MzIVFAUUIyI9ATQzMhUHBiMiJjU0NjMyFxYVFCMiJyYjIgYVFBYzMjc2MzIVFAL5/tcTEwEpFBT+1xMTASkUkytDP1hYPzgpBxQGBh8pLkFBLjAhBggU/tkUFBQUSyo4PlhYPjooBxUHBh0qLkBALiodBggUnhQTExRFFBQUFDUwWD4+WCQGCRQFGkAuLkAjBhQHFhMT7BQU6CVZPj5YJAcIFgYbQS0uQRsGFQkAAAQAFf9qArgBSAAHAE0AWwBpAIpAPAFqakBrHDQsHhYSCGZcWlBOPjYuJRxHBDgEBABVBGhhBA1ABgUCRAU7XlIiBRBkWCgFCjI7GBQQAgENRnYvNxgAPzw8Ly88/Tw8EP08PBD9L/08AS/9L/0v/S/9Li4uLi4uLi4uLgAuLi4uLi4xMAFJaLkADQBqSWhhsEBSWDgRN7kAav/AOFkFFCMiNTQzMicGIyImNTQ2MzIXNjMyFzYzMhcWFRQjIicmIyIGFRQWMzI3NjMyFRQHBiMiJwYHFhUUBiMiJjU0MzIUFjMyNjU0JiMiJyY3NDcmIyIGFRQWMzI3JicmIyIGFRQWMzI3JjU0AZAUFBQUcio0R2RkRzQoKTY1KCk2RjUGFAgGJzg2TU02OCcGCBQGNkUzLA8OGjQlJTQUEx4UFB0dFAUCMEctGiQ2TEw2IxstjxsiNk1NNiIbLD0UFBM6HGRGRmQdHR0dNQYIEwYoTTU2TSkGFAcGNh0KBRokJTQzJhMnHh4UFBwBAqhCMBBNNTZMDzC1EE01NkwPMUJBAAYAFv/zAa4CQQANABsAKQAzAD0AXQB4QDEBXl5AXzJaTCcgEgsEXEo8NzItJR4XEAkCUwRDMC8FKypGBVA6OQU1NFYFQBlAAUNGdi83GAAvLxD9Lzz9PC/9Lzz9PAEv/S4uLi4uLi4uLi4uLgAuLi4uLi4uMTABSWi5AEMAXkloYbBAUlg4ETe5AF7/wDhZARYVFCMiLwEmNTQzMhcHFhUUIyIvASY1NDMyHwEWFRQjIi8BJjU0MzIXEyEiNTQzITIVFAchIjU0MyEyFRQHBiMiJjU0NjMyFxYVFCMiJyYjIgYVFBYzMjc2MzIVFAEsBhQIB0YGFAgHMwYVCAZWBhQIBpgHFAgHSAcWCAbt/tgTEwEoFBT+2BMTASgUkyxCPllZPjkpBxQHBiImLkFBLjAhBggUAaQGCBUHRgYIFQcFBggVBlYGCBUG0QcIEwZGBggVBv7tFBMTFEYUFBQUNDFZPj5YJAYJFQUbQS0uQSQGFAcAAAYAFf/zAa0CPwANABsAKQAzAD0AXQB4QDEBXl5AXzJaTCYfGBEDXEo8NzItKCEaEwwFUwRDMC8FKypGBVA6OQU1NFYFQApAAUNGdi83GAAvLxD9Lzz9PC/9Lzz9PAEv/S4uLi4uLi4uLi4uLgAuLi4uLi4uMTABSWi5AEMAXkloYbBAUlg4ETe5AF7/wDhZAQcGIyI1ND8BNjMyFRQPAQYjIjU0PwE2MzIVFBcHBiMiNTQ/ATYzMhUUFyEiNTQzITIVFAchIjU0MyEyFRQHBiMiJjU0NjMyFxYVFCMiJyYjIgYVFBYzMjc2MzIVFAFSVwYIFQZXBggVkEYGCBUGRgYHFjNHBggUBkcGBxWS/tgTEwEoFBT+2BMTASgUkyxCPllZPjooBxQHBiEnLkFBLi8iBggUAh1XBhQIBlcGFAhXRwYVCAZHBhYHP0YGFAgGRwYVCPsUExMURhQUFBQ0MVk+PlgkBgkVBRtBLS5BJAYUBwAFABX/8wGtAh8AHwApADMARwBZAHpAMgFaWkBbKFlXUk9MPzw5HA5USkE3Mi0oIx4MFQQFMC8FKyoSBQgmJQUhIBgFAkYCAQVGdi83GAAvLxD9Lzz9PC/9Lzz9PAEv/S4uLi4uLi4uLi4ALi4uLi4uLi4uLjEwAUlouQAFAFpJaGGwQFJYOBE3uQBa/8A4WSUGIyImNTQ2MzIXFhUUIyInJiMiBhUUFjMyNzYzMhUUNyEiNTQzITIVFCchIjU0MyEyFRQDFxYVFCMiLwEHBiMiNTQ/ATYzMhcWFRQjIi8BBwYjIjU0PwE2FwEaLEI+WVk+OigHFAcGIScuQUEuLyIGCBR6/tgTEwEoFBT+2BMTASgU8FMGFAgGSEgGCBUGVwYIClsGFQgGSEgGCBUGVxEMJDFZPj5YJAYJFQUbQS0uQSQGFAcuFBQUFEYUExMUAXhTBggVBkhIBhUIBlYGtgYIFQZISAYVCAZWEBAABv+2/7oAsgJGAA0AGwApADUAPwBLAGZAKAFMTEBNKj0nIBILBCUXEAlABAIqOzoEPzYeRgQwQwUzSQUtGTgBF0Z2LzcYAC8vL/0v/QEv/S88PP08Lzz9Li4uLgAuLi4uLi4xMAFJaLkAFwBMSWhhsEBSWDgRN7kATP/AOFkTFhUUIyIvASY1NDMyFwcWFRQjIi8BJjU0MzIfARYVFCMiLwEmNTQzMh8BFAYjIiY1NDYzMhYDFCMiPQE0MzIVNzQmIyIGFRQWMzI2qgYVCAZHBhUIBjMGFQgGVwYUCAeYBhUIBkcGFAgGiS4hIi4uIiEuOxQUFBQTFxARFxcREBcBqQYIFQZHBggVBgYGCBUGVwYIFAbQBggVBkcGCBUG4CEuLiEhLi7+1hQUixQUfhAXFxARFhcAAAYAFP+6AQ4CRQANABsAKQA1AD8ASwBmQCgBTExATQw9Jh8YEQMoGgwFQAQqPzYEOyE6RgQTMEMFM0kFLQo4ATBGdi83GAAvLy/9L/0BLzz9Lzw8/Twv/S4uLi4ALi4uLi4uMTABSWi5ADAATEloYbBAUlg4ETe5AEz/wDhZAQcGIyI1ND8BNjMyFRQPAQYjIjU0PwE2MzIVFBcHBiMiNTQ/ATYzMhUUBxQGIyImNTQ2MzIWAxQjIj0BNDMyFTc0JiMiBhUUFjMyNgEIVgYIFAZWBggUj0YGCBUGRgYIFTNGBggVBkYGCBUMLiAiLi4iIC47ExQUExQXEBEXFxEQFwIiVgYVCAZWBhUIVUcGFAgGRwYVB0FFBhUIBkUGFQjHIS4uISEuLv7WFBSLFBR+EBcXEBEWFwAF//j/ugDNAiYACwAXACEANgBJAGtAKwFKSkBLJ0hGQT47MCkfQzkyJwAEDCEYBB0cBgQSAwUVCQUPLQUiIhoBMkZ2LzcYAC8vEP0v/S/9AS/9Lzz9PC/9Li4uLgAuLi4uLi4uLjEwAUlouQAyAEpJaGGwQFJYOBE3uQBK/8A4WTc0JiMiBhUUFjMyNjcUBiMiJjU0NjMyFgMUIyI9ATQzMhUDMh8BFhUUIyInJicHBiMiNTQ/ATYXFhUUIyIvAQcGIyI1ND8BNhcWihcQERcXERAXKC4hIi4uIiEuOxQUFBQVCQZWBhUIBiMlSAYIFAZWBW4GFQgGR0kGCBQGVg0OEtcQFxcQERYXECEuLiEhLi7+1hQUixQUAc0GVwYIFQYlJEgGFQgGVga3BggVBklIBhUIBlYNDREAAAYAHQABAcEBwgARABsAJQAvAEEAZwCcQEYBaGhAaV5gWVFFKCMZNjAMAGIEXhcWBBsSSEcEQ0IlHAQhIE9OBFRTLyYEKyplSwVbVwYFDwoCMwU8QDgPHhQ8Ay0CASpGdi83GAA/Py88Lzw8EP08PBD9Lzz9PAEvPP08Lzz9PC88/TwvPP08Lzz9PC/9Li4uLgAuLi4uLi4uMTABSWi5ACoAaEloYbBAUlg4ETe5AGj/wDhZExQjIjQmIyIGFCMiNTQ2MzIWExQjIj0BNDMyFQcUIyI9ATQzMhUHFCMiPQE0MzIVJRQGIyImNTQzMhQWMzI2NDMyBxUUIyI9ATQmIyIGHQEUIyI9ATQ2MzIXNjMyFhUUIyI1NCYjIgbmFBQeFBUdFBQ1JSU1jBQUFBSgFBQUFI0UFBQUAXI0JSU1FBQdFRQeFBOXExUkFhkjFBQ7KS4gGzcoOxQUJBcZJQFoEygdHSgTJjQ1/ocTE58UFJ8TE58UFBMTE58UFG8mNDUlFCkdHSn5DBMTChcmJBgLExMLKToqKkQqExMaLSMAAAcAAv/zAUQCVQANABsAKQA1AEEATQBZAHJAMAFaWkBbKicgEgsEJR4XCQI2BCpOBEIQVARIPAQwMwU5UQVLVwVFPwUtGS1LAQEXRnYvNxgAPy8vEP0v/RD9L/0BL/0v/Twv/S/9Li4uLi4ALi4uLi4xMAFJaLkAFwBaSWhhsEBSWDgRN7kAWv/AOFkTFhUUIyIvASY1NDMyFwcWFRQjIi8BJjU0MzIfARYVFCMiLwEmNTQzMhcTFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYnFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjb1BhQIBkcGFAgGMwYUCAZXBhUIBpgGFAgHSAYVCAbPWD4+WFg+PlgoQC4uQEAuLkAbMCMjMDAjIzAoGhESGRkSERoBtwYIFAZHBggUBgYHCBQGVwYIFQbRBggUBkYGCBUG/sU+WVk+PlhYPi1BQS0uQUEuIjEwIyMwMCMSGRkSEhkZAAcAGf/zAVsCVAANABsAKQA1AEEATQBZAHJAMAFaWkBbDCYfGBEDKCEaEwxUBEg8BDA2BCoFTgRCMwU5UQVLVwVFPwUtCi1LAQEwRnYvNxgAPy8vEP0v/RD9L/0BL/08L/0v/S/9Li4uLi4ALi4uLi4xMAFJaLkAMABaSWhhsEBSWDgRN7kAWv/AOFkBBwYjIjU0PwE2MzIVFA8BBiMiNTQ/ATYzMhUUFwcGIyI1ND8BNjMyFRQTFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYnFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYBVVcHCBQGVwYIFZBGBgcWBkYGCBUzRwYIFAZHBggUO1g/PVhXPj9YKEEuLUFBLS5BGzEjIjAwIiMxKBoSEhkZEhIaAjFWBhQIBlcGFQhWRwYWBwZHBhUIP0YGFAgGRgYUCP7cPllZPj5YWD4tQUEtLkFBLiMwMCMjMDAjEhkZEhIZGQAABgAX//MBQwI0AAsAFwAjAC8ARABZAHJAMAFaWkBbAFFNSkM8ODVTSD4zJAQYDAQAKgQeEgQGCQUPJwUhLQUbFQUDWAMhAQEGRnYvNxgAPy8vEP0v/RD9L/0BL/0v/S/9L/0uLi4uAC4uLi4uLi4xMAFJaLkABgBaSWhhsEBSWDgRN7kAWv/AOFklFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYnFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYDFxYVFCMiLwEGBwYjIjU0PwE2MzI3FxYVFCMiLwEGBwYjIjU0PwE2MzIBQ1g+PlhYPj5YKEAuLkBALi5AGzAjIjExIiMwJxoSEhkZEhIaG1QGFQgGRxQ1BggVBlcHCAoGVAYVCAZHFDUGCBUGVwYIC4o+WVk+PlhYPi1BQS0uQUEuIjExIiMwMCMSGRkSEhkZAVlUBggUBkcTNAYUCAZXB1BUBggUBkcTNAYUCAZXBgAG/+7/8wFwAbQAEQAjAC8AOwBHAFMAeEA0AVRUQFUASDweEgYAMAQkTgRCNgQqGAUIHBQDBQwzBS1LBUVRBT85BSchEAgnRQEMAwEeRnYvNxgAPz8vLzw8EP0v/RD9L/0Q/Tw8EP0BL/0v/S/9Li4uLi4uADEwAUlouQAeAFRJaGGwQFJYOBE3uQBU/8A4WQEUBiMiJjU0MzIUFjMyNjQzMgcUIyI0JiMiBhQjIjU0NjMyFhcUBiMiJjU0NjMyFgc0JiMiBhUUFjMyNicUBiMiJjU0NjMyFgc0JiMiBhUUFjMyNgFwNCUlNRQUHhQUHRQUzxQUHRQUHhQUNSUlNKNYPj9YWD8+WChBLS5BQS4tQRwwIiMxMSMiMCcaERIaGhIRGgGgJTQ0JRQoHR0oWRMnHR0nEyU0NPY+WVk+PlhYPi1BQS0uQUEuIzAwIyMwMCMSGRkSEhkZAAgAGf/zAUYCjwALABcAIwAvADsARwBTAF8Ag0A7AWBgQGEYVEg2KhIGPAQYMCQEDABaBE5CBB4nBQkDBS0zBRUPBTkhBT9XBVFdBUtFBRsJG1EBOQIBHkZ2LzcYAD8/Ly8Q/S/9EP0v/RD9L/0v/RD9AS/9L/0vPP08L/0uLi4uLi4AMTABSWi5AB4AYEloYbBAUlg4ETe5AGD/wDhZExQGIyImNTQ2MzIWFRQGIyImNTQ2MzIWExQGIyImNTQ2MzIWAzQmIyIGFRQWMzI2FTQmIyIGFRQWMzI2FzQmIyIGFRQWMzI2JxQGIyImNTQ2MzIWBzQmIyIGFRQWMzI2/y4hIi4uIiEuLiEhLy8hIS5HWD8+WFg+P1hvFxARFxcREBcXEBAYGBAQF0dBLi1BQS0uQRsxIyIxMSIjMSgaEhIZGRISGgJAIS4uISEuLtohLy8hIS4u/uI+WVk+PlhYAXgQFxcQEBcXqRAXFxAQGBjtLUFBLS5BQS4iMTEiIzAxIhIZGRISGRkABgAN/+YBVgEvAA0AGwAzAEEAWQBnAHJALgFoaEBpDGRWSz43KyARA2ZfVElAOSkeGhMMBVEEQiYELyMFMk4FRQpdGAEBX0Z2LzcYAD8vLy/9L/0BL/0v/S4uLi4uLi4uLi4uLgAuLi4uLi4uLi4xMAFJaLkAXwBoSWhhsEBSWDgRN7kAaP/AOFkBBwYjIjU0PwE2MzIVFA8BBiMiNTQ/ATYzMhUUNxYVFCMiJiMiBhUUFhUUIyInJjU0NjMyFwcGIyI1ND8BNjMyFRQ3FAYjIicmNTQzMhYzMjY1NCY1NDMyFxYPAQYjIjU0PwE2MzIVFAFQVwcIFAdWBggVkEYGCBQGRgYIFBQNEwYaCC5BBhQOBQdZPh4wRgcIFAZGBwgUQlg+GhQPEwccBy1BBhQOBQfBVwYIFQZXBggVAQxWBxQIB1cGFQhWRgYTCAdHBhUIWAUOFAVALQccBxMPFBo9WJ5FBxUIBkUGFAgDP1gHBQ4UBkEuBxsHEw8UYlYGFQgGVgYVCAAABf/p//QBDgIzAA0AGwApAEEAVQBvQCwBVlZAV1RSSj8zJyASCwQlHhcQCQI9PARUQSo2NQRIMTA5BS1OBUQZRAEXRnYvNxgALy8Q/S/9AS88PP08Lzw8/TwuLi4uLi4ALi4uLi4uLi4uMTABSWi5ABcAVkloYbBAUlg4ETe5AFb/wDhZExYVFCMiLwEmNTQzMhcHFhUUIyIvASY1NDMyHwEWFRQjIi8BJjU0MzIfARQGIyImPQE0MzIdARQWMzI2PQE0MzIVBwYjIicmNTQzMhcWMzI3NjMyFRTcBhYHBkYGFQgGNAYVCAZWBhUIBpcGFAgGSAYVCAawRDIyRRQULyAgLxQTCDM7PTEJFAYFJTMyJgUGFQGWBgcWBkcGCBUGBgYIFQZWBggVBtEGCBUGRwYIFQbpMkVFMkQUFEQhLi4hRBQU6SEhBgoVBBobBBYKAAAFACD/9AFAAjMADQAbACkAQQBVAG9ALAFWVkBXDFJKPzMmHxgRAzY1KBoTDAU9PARUQSohBEgxMDkFLU4FRApEATBGdi83GAAvLxD9L/0BLzw8/S88PP08Li4uLi4uLgAuLi4uLi4uLi4xMAFJaLkAMABWSWhhsEBSWDgRN7kAVv/AOFkBBwYjIjU0PwE2MzIVFA8BBiMiNTQ/ATYzMhUUJwcGIyI1ND8BNjMyFRQTFAYjIiY9ATQzMh0BFBYzMjY9ATQzMhUHBiMiJyY1NDMyFxYzMjc2MzIVFAE6VQYIFQZWBggUVkYGCBUGRgYIFT9GBggVBkYGCBVWRTIxRRQULiAhLhQUCDM8PDEJEwYGJjEyJwUGFAIQVwcWCAZXBhQIkUYGFQgGRgYVCDNGBhQIBkcGFQj+9TJFRTJEFBREIS4uIUQUFOkhIQYKFQQaGwQWCgAABAAe//QBDQIaABcAKwA9AFEAd0AwAVJSQFMqTUpHPTs2MzAoIBUJT0VBQDguExIEKhcADAsEHgcGDwUDJAUaQD4aAQZGdi83GAAvLzwQ/S/9AS88PP08Lzw8/TwuLi4uLi4ALi4uLi4uLi4uLi4uMTABSWi5AAYAUkloYbBAUlg4ETe5AFL/wDhZJRQGIyImPQE0MzIdARQWMzI2PQE0MzIVBwYjIicmNTQzMhcWMzI3NjMyFRQDFhUUIyIvAQcGIyI1ND8BNhcnNhcVFhcWFRQjIi8BBwYjIjU0NwEMRTIxRhQULyAhLhQUCDM8PTEJFAYFJTMxJwYGFBQGFAgGSUgGCBQGVg4OHA4OBlEGFAgGSUgGCBUGujJFRTJEFBREIS4uIUQUFOkhIQYKFQQaGwQWCgFABggVBklIBhUIBlYODloODgEFUQYIFQZJSAYVCAYAAAYAH//0AQ4CXgALABcALwBDAE8AWwCGQDsBXFxAXUJAOC0hKyokI0IvGAQAUEQEDABWSgQGEgYENh8eUwUVRwUJAwVNWQUPJwUbPAUyCTIVAwEeRnYvNxgAPy8vEP0v/S/9L/0Q/RD9AS88PP08EP08Lzz9PBD9PDwuLi4uAC4uLi4xMAFJaLkAHgBcSWhhsEBSWDgRN7kAXP/AOFkTFAYjIiY1NDYzMhYVFAYjIiY1NDYzMhYXFAYjIiY9ATQzMh0BFBYzMjY9ATQzMhUHBiMiJyY1NDMyFxYzMjc2MzIVFAM0JiMiBhUUFjMyNhU0JiMiBhUUFjMyNuUvICEuLiEhLi8gIS4uISAvJ0QyMkUUFC8gIC8UEwgzOz0xCRQGBSUzMiYFBhVRFxARFhcQEBcXEBAXFxAQFwIOIS4uISIuLtohLy8hIC4uvDJFRTJEFBREIS4uIUQUFOkhIQYKFQQaGwQWCgHzERcXERAXF6gQFxcQERcYAAAMABn/2gNLAX0ACQATAB0AJwAxADsARQBRAF0AaQB1AH0AvkBZAX5+QH8IfHhVQkE9PDg3MzIkIx8eRD86NTArJiEcFxINCANGBFJYBExeBGpwBGR2BHoBAAUFbQVnCwoFDxoZBRUUcwVhWwVJLi0FKShJTwMQDwMGBQEBTEZ2LzcYAD88Pzw/Ly88/TwQ/S/9Lzz9PBD9PC/9EP08AS/9L/0v/S/9L/0uLi4uLi4uLi4uLi4uLgAuLi4uLi4uLi4uLi4uLi4xMAFJaLkATAB+SWhhsEBSWDgRN7kAfv/AOFklIyI1NDsBMhUUJyEiNTQzITIVFBcjIjU0OwEyFRQnIyI1NDsBMhUUByMiNTQ7ATIVFAcjIjU0OwEyFRQHISI1NDMhMhUUJRQGIyImNTQ2MzIWBzQmIyIGFRQWMzI2JxQGIyImNTQ2MzIWBzQmIyIGFRQWMzI2JxQjIjU0MzIDN3YUFHYUiv7yFBQBDhRidhMTdhSK5BMT5BQUyxMTyxQU5BMT5BQU/vMTEwENFP7meldXenpXV3onZEZGZGRGRmQuSDQ0SUk0NEgoMSMjMjIjIzE2Hh4eHtEUExMUeBQUFBTrFBQUFKwUFBQUcxQUFBRyFBQUFD8UFBQUxVZ7e1ZXe3tXRmRjR0ZjY0YzSUkzNElJNCMyMiMjMTIjHR0dAAYAEv/zAq4BIAALABcAIwAtADcAXwB+QDQBYGBAYSxYVE5KQjg0My8uGwkDWlFIPTYxLCcGAAwEGB4EEiUkBSopIQUPREBeOhUBAT1Gdi83GAA/LzwvPC/9Lzz9PAEv/S/9Li4uLi4uLi4uLgAuLi4uLi4uLi4uLi4uMTABSWi5AD0AYEloYbBAUlg4ETe5AGD/wDhZJTQmIyIGFRQWMzI2JxQGIyImNTQ2MzIWBzQmIyIGFRQWMzI2JSEiNTQzITIVFAchIjU0MyEyFRQFBiMiJjU0NjMyFzYzMhcWFRQjIicmIyIGFRQWMzI3NjMyFRQHBiMiARdBLi5BQS4uQRwwIyMxMSMjMCgZEhIaGhISGQHH/tcTEwEpFBT+1xMTASkU/n0uVT9XVz9WLSpYOicHFAYGIScuQUEuMCAGCRUGLEJYii1BQS0uQUEuIjExIiIxMCMSGRkSEhkZJRQUFBRFFBQUFBlMWD8+WExLIwcIFQUbQS0uQSMHFQcGMAADAAr/2AD+AtoALQA/AFEAhUA3AVJSQFMgUUc9ODEuAkxCOzMsKSYjIBsYFRIPDAkEARkYBR4dJCMFExIqKQUNDERKBwYBAAEJRnYvNxgAPy88LzwvPP08Lzz9PC88/TwBLi4uLi4uLi4uLi4uLi4uLi4uAC4uLi4uLi4xMAFJaLkACQBSSWhhsEBSWDgRN7kAUv/AOFk3BzMyFRQrASI1ND8BIyI1ND8BIyI1ND8BIyI1NDsBMhUUDwEzMhUUDwEzMhUUAzc2MzIVFA8BBi8BJjU0MzIXJyY1NDMyHwE3NjMyFRQPAQYn9JmNFBTHFwqZjBcKmo0XCpmMFBTGFwqZjBcKmo0XekkGCBQGVg8OVgYVCAYdBhUIBkhIBggUBlUPDnp6FBQSCgh6EgoIehIKCHoUFBIKCHoSCgh6EgoBsEgGFQgGVg8OVwYIFQY8BggVBkhJBhUIBlYPDgADAAr//wD+AosAIQA1AEoAeUAyAUtLQEwaMywlIhNGPDEnIB0aFRIPDAkEAR4dBQ0MAgEFBkEFNjpIGBcDEgIHBgABCUZ2LzcYAD88Pz88Lzwv/RD9PC88/TwBLi4uLi4uLi4uLi4uLi4ALi4uLi4xMAFJaLkACQBLSWhhsEBSWDgRN7kAS//AOFk3BzMyFRQrASI1ND8BIyI1ND8BIyI1NDsBMhUUDwEzMhUUAzc2MzIVFA8BBiMiLwEmNTQzMhc3Njc2MzIVFA8BBiMiLwEmNTQzMhf0npEUFMYXCp6RFwqekRMTxhcKnpEXekkGCBUHVgYIBwhWBhUIBkcUNQYIFQdVBwcJBlcGFQgGto8UFBEJCZARCQmOFBQRCQmPEQkBI0gGFAgHVgYGVgYIFgcSFDQGFAgHVQgHVgYIFgcAAAIABwG/ANwCoAATACYASUAXAScnQCgFIh8cCgAkGhcPBRcUDQcBD0Z2LzcYAC88LzwBLi4uLi4ALi4uLi4xMAFJaLkADwAnSWhhsEBSWDgRN7kAJ//AOFkTMh8BFhUUIyIvAQcGIyI1ND8BNic2FzEXFhUUIyIvAQcGIyI1NDdxCAdWBhQIBkhJBggUBlYICA4OVwYUCAZJSAYIFAYCPgZWBggVBkhIBhUIBlYGVA4OVwYIFQZJSAYVCAYAAgADAfkA2QLbABEAIwBFQBUBJCRAJQUcFA8DACEXDQUZHwoBF0Z2LzcYAC8vPAEuLi4uAC4uLi4uMTABSWi5ABcAJEloYbBAUlg4ETe5ACT/wDhZEzc2MzIVFA8BBi8BJjU0MzIfAQYvASY1NDMyHwE3NjMyFRQHbkgGCBUGVg8OVgYUCAZXDw5WBxUIBklHBggVBgIzSAYVCAZWDw5XBwgUBhkPDlYHCBQGSEkGFQgGAAEABQG/APIB5gAJADlADwEKCkALCAgDBgUBAAEDRnYvNxgALzwvPAEuLgAxMAFJaLkAAwAKSWhhsEBSWDgRN7kACv/AOFkTIyI1NDsBMhUU3sYTE8YUAb8UExMUAAABAAUBqAC3AhUAEQA8QBEBEhJAEwAGAAwFAxAIAwEGRnYvNxgALy88EP0BLi4AMTABSWi5AAYAEkloYbBAUlg4ETe5ABL/wDhZExQGIyImNTQzMhQWMzI2NDMytzQlJTQUFB0UFB0UFAIBJTQ0JRQoHR0oAAEADQHaAFwCKQALADZADgEMDEANAAAEBgkDAQZGdi83GAAvLwEv/QAxMAFJaLkABgAMSWhhsEBSWDgRN7kADP/AOFkTFAYjIiY1NDYzMhZcFxARFxcREBcCARAXFxARFxcAAwAPAagAwQJaAAsAFwAfAE9AHQEgIEAhAAwEABgEHBIEBhUFAx4FGg8FCQkDAQZGdi83GAAvLxD9L/0Q/QEv/S/9L/0AMTABSWi5AAYAIEloYbBAUlg4ETe5ACD/wDhZExQGIyImNTQ2MzIWBzQmIyIGFRQWMzI2JxQjIjU0MzLBNCUlNDQlJTQnHhQUHR0UFB4eFBQUFAIBJTQ0JSU0NCUUHR0UFB0dFRUVEwAAAgAV/2oAxwAcAAcAHwBLQBoBICBAIQgIFwQOEwAEBBoFCx4GBQIRCwEORnYvNxgALy8v/TwQ/QEv/Twv/S4AMTABSWi5AA4AIEloYbBAUlg4ETe5ACD/wDhZFxQjIjU0MzIXFAYjIiY1NDYzMhUUIgYVFBYzMjY0MzKCFBQUFEU0JSU0NCUUKB0dFBQdFBQ9FBQUFCU0NCUlNBQUHRQUHh4nAAACAAYBvwGIAi0AEQAjAEtAGQEkJEAlAB4SBgAMBQMYBSEQCCEcFAMBHkZ2LzcYAC88PC88PBD9EP0BLi4uLgAxMAFJaLkAHgAkSWhhsEBSWDgRN7kAJP/AOFkBFAYjIiY1NDMyFBYzMjY0MzIHFCMiNCYjIgYUIyI1NDYzMhYBiDQlJTQUFB0UFB0UFM8UFB0UFR0UFDUlJTQCGCU0NCUUKB4eKFkTJx4eJxMmNDUAAAMAFwAFAMkAfAAJABMAHQBUQB4BHh5AHwAFBAQJABMKBA8OHRQEGRgbEQcWDAIBGEZ2LzcYAC88PC88PAEvPP08Lzz9PC88/TwAMTABSWi5ABgAHkloYbBAUlg4ETe5AB7/wDhZNxQjIj0BNDMyFQcUIyI9ATQzMhUHFCMiPQE0MzIVyRMUFBNFFBQUFEUUFBQUGRQUTxQUTxQUTxQUUBMTUBQUAAADABYBPADJAbMACQATAB0AVEAeAR4eQB8AEwoEDw4FBAQJAB0UBBkYGxEHFgwCARhGdi83GAAvPDwvPDwBLzz9PC88/TwvPP08ADEwAUlouQAYAB5JaGGwQFJYOBE3uQAe/8A4WRMUIyI9ATQzMhUHFCMiPQE0MzIVBxQjIj0BNDMyFckUFBQURhMUFBNFFBQUFAFPExNQFBRQExNQFBRQExNPFBQAAwAWAHYAyAEoAAsAFwAfAFRAIAEgIEAhABIEBhwMBAAYBBwVBQMaBR4PBQkJAx4BAQZGdi83GAA/Ly8Q/RD9EP0BL/3d/RDd/QAxMAFJaLkABgAgSWhhsEBSWDgRN7kAIP/AOFk3FAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYnFCMiNTQzMsg0JSU0NCUlNCgcFRQdHRQVHB0UExMUzyU0NCUlNDQlFB0dFBQdHRQUFBQAAA0ABv/fAqMBrAANABkAJwAzAEEATwBbAGcAbwB3AIMAjwCXAK1AUgGYmECZeEw3HQNOQDkmHwVWBEcUlASQfgSKXAQMKIQEeGIELg4EUGgEbHQEcI1lBStTBRdqBW6BMQWHX5Z2BZJyEQVZChd7RStuAz4BJAIBFEZ2LzcYAD8/Py88PC88L/0vPP08Lzz9PBD9EP0Q/TwBL/0v/S/9L/0v/S88/S/9L/0vPP0uLi4uLi4ALi4uLjEwAUlouQAUAJhJaGGwQFJYOBE3uQCY/8A4WQEHBiMiNTQ/ATYzMhUUBRQGIyImNTQ2MzIWFwcGIyI1ND8BNjMyFRQXFAYjIiY1NDYzMhYnBwYjIjU0PwE2MzIVFA8BBiMiNTQ/ATYzMhUUJzQmIyIGFRQWMzI2ATQmIyIGFRQWMzI2ARQjIjU0MzIBFCMiNTQzMgUUBiMiJjU0NjMyFgc0JiMiBhUUFjMyNicUIyI1NDMyAcx+BggUBn4GCBT+5jQlJTQ0JSU0WoMGCBQGggcIFLs0JiU0NCUlNXF/BggVBn8GCBXCfQYIFAZ9BggVHR0UFB4eFBQdARseFBQdHRQUHv7IFBQUFAEaFBQUFAEWNCUlNDQlJTQoHRQUHR0UFB0dFBQUFAGJfgYUCAZ+BhQIPSU0NCUmNDVVgwYVCAaCBxUI8CU0NCUlNDRtfgYUCAZ/BhUIbX0GFAgGfQYUB+gUHh4UFB0d/voUHR0UFB4eAS8UFBT+0RQUFBQlNDQlJTQ0JRQdHRQUHh4UFBQUAAQAFf/gAeEBqwANABsAKQA3AE9AGwE4OEA5DDQfEQM2LyghGhMMBQotJgEYAgEvRnYvNxgAPz8vLwEuLi4uLi4uLgAuLi4uMTABSWi5AC8AOEloYbBAUlg4ETe5ADj/wDhZAQcGIyI1ND8BNjMyFRQPAQYjIjU0PwE2MzIVFBcHBiMiNTQ/ATYzMhUUDwEGIyI1ND8BNjMyFRQB234GCBUGfgYIFcGCBggVBoMHBxRKfwYIFQd+BggVwX0GCBUGfQYIFQGJfgYUCAZ+BhQIbYMGFQgGggcVCF5+BhMIB38GFQhtfQYUCAZ9BhQIAAACAAwAoABvAQIACwATAEJAFQEUFEAVAAYADAQQDgUSAwkSAQEGRnYvNxgAPy8vEP0BL/0uLgAxMAFJaLkABgAUSWhhsEBSWDgRN7kAFP/AOFk3NCYjIgYVFBYzMjYnFCMiNTQzMm8eFBQdHRQUHh4UFBQU0RQdHRQUHR0UFBQUAAAAAAAAAAAAfAAAAHwAAAB8AAAAfAAAAb4AAAJkAAAD9gAABdAAAAciAAAILAAACSQAAAo4AAAKuAAAC2QAAAwQAAAM/gAADgQAAA6uAAAPsAAAEK4AABG0AAASpgAAE7oAABR2AAAVjAAAFqgAABfCAAAYuAAAGcIAABpuAAAbZgAAHOQAAB3cAAAe3AAAICgAACGWAAAi1gAAI8oAACTIAAAl3AAAJugAAChaAAApYAAAKhwAACrmAAArngAALKQAAC2sAAAu2AAAL/YAADFUAAAyPAAAM0oAADQMAAA03gAANj4AADcWAAA3/AAAOLgAADkUAAA50gAAOqwAADuqAAA87gAAPcgAAD64AAA/3AAAQRgAAEIIAABDEAAARHwAAEV8AABGAAAAR34AAEiiAABJiAAASmQAAEs+AABMFgAATTYAAE44AABPBgAAT8AAAFCOAABR7AAAUsQAAFN+AABU0gAAVewAAFd0AABYMgAAWNYAAFpCAABbwAAAXT4AAF62AABgIgAAYmgAAGPUAABltgAAZ1QAAGkaAABq4AAAbKQAAG3qAABvLgAAcHQAAHGgAABzLgAAdLoAAHZKAAB3wgAAeagAAHs+AAB80AAAfmIAAH/wAACB3AAAgtoAAIQ4AACFlAAAhvwAAIhKAACJxgAAivIAAIxqAACOCAAAj3wAAJDuAACSWgAAk5AAAJTGAACWAAAAl54AAJkGAACacAAAm9oAAJ0yAACeugAAoEAAAKGSAACi5gAApDoAAKWyAACnsgAAqTAAAKqMAACrzAAArIgAAK06AACtmAAArgwAAK5uAACvHAAAr8AAALBwAACxFgAAsbwAALJuAAC0tAAAtaIAALYiAAC2IgAAtiIB9AA/AAAAAACLAAAAiwAAAUUAGADdABcBdQAMAeUACgIqABQBMgAJATIAEQHuABQAxQAKAYcAEQDfABYB9AAVAdwAHQDnABsBgAARAUYAGQFcACUBYgAnAcoAFwFSABAA6gAiAbUACwD0ACEA3wAXATIACQGHABEBMgARAQ0AKgLAABEBIwAkA3kAHwJFABwBtAAjAbQAIwHDABcBowAgAMYAEwGWAAkBuwAjAS0AIQKaACUCNQAkAdwAHQGQACICSAAdAaAAJgDrAB0BfAANAXkAJgGUAAgCuwAOAhkAEgGkAAUBFwAPAOIABwD2AAEA+wABAd8AFAEcACICxgAVAeoAGAG0ABUA7AANAcYACQJHACIAxgAVAZcACgGNACcAugAkAnUAJQHRAB0BXQAZAekAJgHpABkB0QAhAOoAGgDoABEBLQAgAT4ACQJoAAgCBgAKAawACQEXABEBRQAYAU0ABAI8AAEA+v//ANIAEAENAC0CwAARAsAAEALAABECwAARAsAAEQLAABADWgAJA5AAIQG0AAABvQAjAbQAIwDG/7gAxgATAMb/+AI1ACMB3AAdAdwAHQHcABwB3AAcAdwAHQHlAA0BeQAPAXkAJQF5ACQBeQAlARwAJQHfABAB3wAUAd8AEgHfABEB3wARAd8AEgMTABUCxgAVAbQAFgG0ABUBtAAVAMb/tgDGABQAxv/4AdEAHQFdAAIBXQAZAV0AFwFd/+4BXQAZAWIADQEt/+kBLQAgAS0AHgEtAB8DUAAZArIAEgEJAAoBCQAKAOIABwDiAAMA9gAFALsABQBoAA0A0QAPANIAFQGOAAYA4QAXAOEAFgDfABYCowAGAfQAFQB6AAwB9AAAAfQAAAACAAAAAAAA/5YAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAKQAAAABAAIAAwAEAAUABwAIAAkACwAMAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQBBAEIAQwBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AowCFAI4AjQDeAKIArQDJAMcArgBiAGMAkABkAMsAZQDIAM8AzADNAGYA0wDQANEArwBnAJEA1gDUANUAaACJAGoAaQBrAG0AbABuAKAAbwBxAHAAcgB1AHQAdgB4AHoAeQB7AH0AfAChAH8AfgCAAIEAsACxAOYA5wDYAOEA2gDbANwA3QDgANkAtAC1AIcAxgC8AMMAAACsAAAAAAADAAAAAAAABegAAQAAAAAAHAADAAEAAAXoAAYFzAAAAAAC4QABAAAAAAAAAAAAAAAAAAAAAQADAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAwAEAAUAAAAGAAcACAAAAAkACgAAAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfAAAAIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5AAAAAAAAADoAOwA8AD0APgA/AEAAQQBCAEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAFgAAAAAAAAAAABZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABaAAAAAAAAAFsAAAAAAAAAAAAAAAAAXABdAF4AXwBgAGEAYgBjAGQAZQBmAGcAAABoAGkAagAAAAAAawBsAG0AbgBvAHAAAABxAHIAcwB0AHUAAAAAAHYAdwB4AHkAegB7AHwAfQB+AH8AgACBAAAAggCDAIQAAAAAAIUAhgCHAIgAiQCKAAAAiwCMAI0AjgCPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkACRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACSAJMAAAAAAAAAAAAAAAAAAAAAAAAAlACVAJYAlwCYAJkAmgCbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnACdAAAAAAAAAAAAngAAAJ8AAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjAKIABAJYAAAAQABAAAUAAAAiACYAKQA/AFoAegChAKMAqACvALQAuADKAM4A1gDcAOoA7gD2APwBUwF+AscCyQLcIBAgHSAiIDAgRCIZ//8AAAAgACQAKAArAEEAXgCgAKMAqACvALQAtwC/AMwA0QDYAN8A7ADxAPgBUgF9AsYCyQLYIBAgHCAiIDAgRCIZ//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAEAARABIAEoAcgCkANwA3gDeAN4A3gDeAOAA9gD6AQQBDAEiASYBMAE4AToBPAE+AT4BRgFGAUgBSAFIAUj//wADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgA/AEAAQQBCAEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgCjAFcAWABZAJYAWgChAFsAXABdAF4AXwBgAGEAYgBjAGQAZQBmAGcAaABpAGoAawBsAG0AbgBvAHAAcQByAHMAdAB1AHYAdwB4AHkAegB7AHwAfQB+AH8AgACBAIIAgwCEAIUAhgCHAIgAiQCKAIsAjACNAI4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJoAmwANAJwAnQCeAJ8AoAChAAAAAAAQAAAAqAkIBQABAQMCAwQFAwMEAgQCBQQCAwMDAwQDAgQCAgMEAwIGAwgFBAQEBAIEBAMGBQQEBQQCAwMEBgUEAwICAgQDBgQEAgQFAgQEAgYEAwQEBAICAwMGBQQDAwMFAgICBgYGBgYGCAgEBAQCAgIFBAQEBAQEAwMDAwMEBAQEBAQHBgQEBAICAgQDAwMDAwMDAwMDCAYCAgICAgIBAgIEAgICBgUBBQUAAAoJBQABAQMCBAUGAwMFAgQCBQUCBAMDBAUDAgQCAgMEAwMHAwkGBAQFBAIEBAMHBgUEBgQCBAQEBwUEAwICAwUDBwUEAgUGAgQEAgYFAwUFBQICAwMGBQQDAwMGAwIDBwcHBwcHCQkEBAQCAgIGBQUFBQUFBAQEBAMFBQUFBQUIBwQEBAICAgUDAwMDAwQDAwMDCAcDAwICAgIBAgIEAgICBwUBBQUAAAsKBgACAgQCBAUGAwMFAgQCBgUDBAQEBAUEAwUDAgMEAwMIAwoGBQUFBQIEBQMHBgUEBgUDBAQECAYFAwIDAwUDCAUFAwUGAgQEAgcFBAUFBQMDAwMHBgUDBAQGAwIDCAgICAgICQoFBQUCAgIGBQUFBQUFBAQEBAMFBQUFBQUJCAUFBQICAgUEBAQEBAQDAwMDCQgDAwICAwIBAgIEAgICBwYBBgYAAAwLBgACAgQDBAYHBAQGAgUDBgYDBQQEBAUEAwUDAwQFBAMIAwsHBQUFBQIFBQQIBwYFBwUDBQUFCAYFAwMDAwYDCQYFAwUHAgUFAggGBAYGBgMDBAQHBgUDBAQHAwMDCAgICAgICgsFBQUCAgIHBgYGBgYGBQUFBQMGBgYGBgYJCQUFBQICAgYEBAQEBAQEBAQECggDAwMDAwIBAwMFAwMDCAYBBgYAAA0MBwACAgQDBQYHBAQGAwUDBwYDBQQFBQYEAwYDAwQFBAMJBAwIBgYGBQMFBgQJBwYFCAUDBQUFCQcFBAMDAwYECQYGAwYIAwUFAggGBQYGBgMDBAQIBwYEBAQHAwMDCQkJCQkJCwwGBgYDAwMHBgYGBgYGBQUFBQQGBgYGBgYKCQYGBgMDAwYFBQUFBQUEBAQECwkDAwMDAwIBAwMFAwMDCQcCBwcAAA4NBwACAgUDBQcIBAQHAwUDBwcDBQUFBQYFAwYDAwQFBAQKBAwIBgYGBgMGBgQJCAcGCAYDBQUGCggGBAMDBAcECgcGAwYIAwYGAwkHBQcHBwMDBAQJBwYEBQUIBAMECgoKCgoKDA0GBgYDAwMIBwcHBwcHBQUFBQQHBwcHBwcLCgYGBgMDAwcFBQUFBQUEBAQEDAoEBAMDAwMBAwMGAwMDCQcCBwcAAA8OCAACAgUDBgcIBQUHAwYDCAcDBgUFBQcFBAcEAwUGBQQLBA0JBwcHBgMGBwUKCAcGCQYEBgYGCggGBAMEBAcECwcHBAcJAwYGAwkHBQcHBwQDBQUJCAYEBQUJBAMECwsLCwsLDQ4HBwcDAwMIBwcHBwcHBgYGBgQHBwcHBwcMCwcHBwMDAwcFBQUFBQUFBQUFDQoEBAMDBAMCAwMGAwMDCggCCAgAABAPCAACAgUEBggJBQUIAwYECAgEBgUGBgcFBAcEBAUGBQQLBQ4JBwcHBwMGBwULCQgGCQcEBgYGCwkHBAQEBAgFCwgHBAcJAwcGAwoHBggIBwQEBQUKCAcEBQUJBAMECwsLCwsLDg8HBwcDAwMJCAgICAgIBgYGBgUICAgICAgNCwcHBwMDAwcGBgYGBgYFBQUFDgsEBAQEBAMCAwMGBAQECwgCCAgAABEQCQACAgYEBggJBQUIAwcECQgEBwYGBggGBAcEBAUHBQUMBQ8KBwcIBwMHCAULCggHCgcEBgYHDAkHBQQEBAgFDAgHBAgKAwcHAwsIBggICAQEBQUKCQcFBgYKBAQFDAwMDAwMDxAHCAcDAwMKCAgICAgIBgYGBgUICAgICAgNDAcHBwMDAwgGBgYGBgYFBQUFDgwFBQQEBAMCBAQHBAQECwkCCQkAABIQCQADAwYEBwkKBgYJBAcECQkEBwYGBggGBAgEBAYHBgUNBRAKCAgICAQHCAUMCgkHCwcEBwcHDQoIBQQEBQkFDQkIBAgKBAcHAwsIBgkJCAQEBQYLCQgFBgYKBQQFDQ0NDQ0NDxAICAgEBAQKCQkJCQkJBwcHBwUJCQkJCQkODQgICAQEBAgGBgYGBgYFBQUFDwwFBQQEBAMCBAQHBAQEDAkCCQkAABMRCgADAwYEBwkLBgYJBAcECgkEBwYHBwkGBAgFBAYHBgUNBhELCAgJCAQICAYNCwkICwgEBwcIDQoIBQQFBQkFDQkIBAkLBAgIBAwJBwkJCQQEBgYMCggFBgYLBQQFDQ0NDQ0NEBEICAgEBAQLCQkJCQkJBwcHBwUJCQkJCQkPDQgICAQEBAkHBwcHBwcGBgYGEA0FBQQEBQQCBAQIBAQEDQoCCgoAABQSCgADAwcEBwoLBgYKBAgECgoFCAcHBwkHBQkFBAYIBgUOBhIMCQkJCAQICQYNCwoIDAgFCAgIDgsIBgUFBQoGDgoJBQkMBAgIBA0JBwoKCQUFBgYMCgkGBwcLBQQFDg4ODg4OERIJCQkEBAQLCgoKCgoKCAgICAYKCgoKCgoQDgkJCQQEBAkHBwcHBwcGBgYGEQ4FBQUFBQQCBAQIBQUEDgoCCgoAABUTCwADAwcFCAoMBgYKBAgFCwoFCAcHBwoHBQkFBQYIBgYPBhMMCQkJCQQJCQYODAoIDAkFCAgIDwsJBgUFBQoGDwoJBQoMBAkIBA0KBwoKCgUFBgcNCwkGBwcMBQQGDw8PDw8PEhMJCQkEBAQMCgoKCgoKCAgICAYKCgoKCgoRDwkJCQQEBAoHBwcHBwcGBgYGEg4GBgUFBQQCBAQIBQUFDgsDCwsAABYUCwADAwcFCAsMBwcLBAkFCwoFCAcICAoHBQoFBQcJBwYPBhQNCgoKCQQJCgcPDAoJDQkFCAgJDwwJBgUFBgsGEAsKBQoNBAkJBA4KCAsLCgUFBwcOCwkGBwcNBgUGDw8PDw8PExQKCgoEBAQMCgoKCgoLCAgICAYLCwsLCwsREAoKCgQEBAoICAgICAgHBwcHEw8GBgUFBQQCBQUJBQUFDwsDCwsAABcVDAADAwcFCQsNBwcLBQkFDAsFCQcICAsIBQoGBQcJBwYQBxQNCgoKCgUJCgcPDQsJDQoFCQkJEAwKBgUGBgsHEAsKBQoNBQkJBA4LCAsLCwUFBwcODAoGBwgNBgUGEBAQEBAQFBUKCgoFBQUNCwsLCwsLCQkJCQcLCwsLCwsSEAoKCgUFBQsICAgICAgHBwcHFBAGBgUFBgQCBQUJBQUFEAwDDAwAABgWDAADAwgFCQwNBwcMBQkFDAsGCQgICAsIBgoGBQcJBwYRBxUOCgoLCgUKCwcQDgsKDgoGCQkKEQ0KBwUGBgsHEQwKBgsOBQoKBA8LCAwMCwYGBwgPDAoHCAgOBgUGERERERERFRYKCwoFBQUOCwsLCwsMCQkJCQcLCwsLCwsTEQoKCgUFBQsICAgICAgHBwcHFBEGBgUFBgQCBQUKBQUFEAwDDAwAAAABAV0BkAAFAAICvAKKAAAAjwK8AooAAAHFADIBAwAAAAAEAAAAAAAAAAAAAAMAAAAAAAAAAAAAAABNQUNSAEAAICIZAyH/OQAAAyEAxwAAAAEAAAAAAAAAAQAAgAAAAACLAT8AAGAAAbQCdVlva2ttb2trICAgICAgICD/////N////llPS1IwMAAAAAAAAAABAAAAAQAAmJpL9V8PPPUAAAPoAAAAALfnFZIAAAAAt+cVkv+2/zkDawMhAAAAAwACAAEAAAAAAAEAAAMh/zkAAAOQ/7b/uANrAAEAAAAAAAAAAAAAAAAAAACkAAEAAACkAJgADQAAAAAAAgAIAEAACgAAAF0AvgABAAE=");
			}

		@font-face {
			font-family: 'yokkmokkOT_file';
			src: url('./fonts/yokkmokkOT.otf'); /* IE 5-8 */ 
			src: local('?'),             /* sneakily trick IE */
		        url('./fonts/yokkmokk.ttf') format('truetype'), /* Opera, Safari */
		        url('./fonts/yokkmokkOT.woff') format('woff'),    /* FF 3.6, Chrome 5, IE9 */
		        url('./fonts/yokkmokkOT.svg#font') format('svg'); /* iOS */
			}
	

		body { 
//			background: url("data:font/ttf;base64,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AEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgCjAFcAWABZAJYAWgChAFsAXABdAF4AXwBgAGEAYgBjAGQAZQBmAGcAaABpAGoAawBsAG0AbgBvAHAAcQByAHMAdAB1AHYAdwB4AHkAegB7AHwAfQB+AH8AgACBAIIAgwCEAIUAhgCHAIgAiQCKAIsAjACNAI4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJoAmwANAJwAnQCeAJ8AoAChAAAAAAAQAAAAqAkIBQABAQMCAwQFAwMEAgQCBQQCAwMDAwQDAgQCAgMEAwIGAwgFBAQEBAIEBAMGBQQEBQQCAwMEBgUEAwICAgQDBgQEAgQFAgQEAgYEAwQEBAICAwMGBQQDAwMFAgICBgYGBgYGCAgEBAQCAgIFBAQEBAQEAwMDAwMEBAQEBAQHBgQEBAICAgQDAwMDAwMDAwMDCAYCAgICAgIBAgIEAgICBgUBBQUAAAoJBQABAQMCBAUGAwMFAgQCBQUCBAMDBAUDAgQCAgMEAwMHAwkGBAQFBAIEBAMHBgUEBgQCBAQEBwUEAwICAwUDBwUEAgUGAgQEAgYFAwUFBQICAwMGBQQDAwMGAwIDBwcHBwcHCQkEBAQCAgIGBQUFBQUFBAQEBAMFBQUFBQUIBwQEBAICAgUDAwMDAwQDAwMDCAcDAwICAgIBAgIEAgICBwUBBQUAAAsKBgACAgQCBAUGAwMFAgQCBgUDBAQEBAUEAwUDAgMEAwMIAwoGBQUFBQIEBQMHBgUEBgUDBAQECAYFAwIDAwUDCAUFAwUGAgQEAgcFBAUFBQMDAwMHBgUDBAQGAwIDCAgICAgICQoFBQUCAgIGBQUFBQUFBAQEBAMFBQUFBQUJCAUFBQICAgUEBAQEBAQDAwMDCQgDAwICAwIBAgIEAgICBwYBBgYAAAwLBgACAgQDBAYHBAQGAgUDBgYDBQQEBAUEAwUDAwQFBAMIAwsHBQUFBQIFBQQIBwYFBwUDBQUFCAYFAwMDAwYDCQYFAwUHAgUFAggGBAYGBgMDBAQHBgUDBAQHAwMDCAgICAgICgsFBQUCAgIHBgYGBgYGBQUFBQMGBgYGBgYJCQUFBQICAgYEBAQEBAQEBAQECggDAwMDAwIBAwMFAwMDCAYBBgYAAA0MBwACAgQDBQYHBAQGAwUDBwYDBQQFBQYEAwYDAwQFBAMJBAwIBgYGBQMFBgQJBwYFCAUDBQUFCQcFBAMDAwYECQYGAwYIAwUFAggGBQYGBgMDBAQIBwYEBAQHAwMDCQkJCQkJCwwGBgYDAwMHBgYGBgYGBQUFBQQGBgYGBgYKCQYGBgMDAwYFBQUFBQUEBAQECwkDAwMDAwIBAwMFAwMDCQcCBwcAAA4NBwACAgUDBQcIBAQHAwUDBwcDBQUFBQYFAwYDAwQFBAQKBAwIBgYGBgMGBgQJCAcGCAYDBQUGCggGBAMDBAcECgcGAwYIAwYGAwkHBQcHBwMDBAQJBwYEBQUIBAMECgoKCgoKDA0GBgYDAwMIBwcHBwcHBQUFBQQHBwcHBwcLCgYGBgMDAwcFBQUFBQUEBAQEDAoEBAMDAwMBAwMGAwMDCQcCBwcAAA8OCAACAgUDBgcIBQUHAwYDCAcDBgUFBQcFBAcEAwUGBQQLBA0JBwcHBgMGBwUKCAcGCQYEBgYGCggGBAMEBAcECwcHBAcJAwYGAwkHBQcHBwQDBQUJCAYEBQUJBAMECwsLCwsLDQ4HBwcDAwMIBwcHBwcHBgYGBgQHBwcHBwcMCwcHBwMDAwcFBQUFBQUFBQUFDQoEBAMDBAMCAwMGAwMDCggCCAgAABAPCAACAgUEBggJBQUIAwYECAgEBgUGBgcFBAcEBAUGBQQLBQ4JBwcHBwMGBwULCQgGCQcEBgYGCwkHBAQEBAgFCwgHBAcJAwcGAwoHBggIBwQEBQUKCAcEBQUJBAMECwsLCwsLDg8HBwcDAwMJCAgICAgIBgYGBgUICAgICAgNCwcHBwMDAwcGBgYGBgYFBQUFDgsEBAQEBAMCAwMGBAQECwgCCAgAABEQCQACAgYEBggJBQUIAwcECQgEBwYGBggGBAcEBAUHBQUMBQ8KBwcIBwMHCAULCggHCgcEBgYHDAkHBQQEBAgFDAgHBAgKAwcHAwsIBggICAQEBQUKCQcFBgYKBAQFDAwMDAwMDxAHCAcDAwMKCAgICAgIBgYGBgUICAgICAgNDAcHBwMDAwgGBgYGBgYFBQUFDgwFBQQEBAMCBAQHBAQECwkCCQkAABIQCQADAwYEBwkKBgYJBAcECQkEBwYGBggGBAgEBAYHBgUNBRAKCAgICAQHCAUMCgkHCwcEBwcHDQoIBQQEBQkFDQkIBAgKBAcHAwsIBgkJCAQEBQYLCQgFBgYKBQQFDQ0NDQ0NDxAICAgEBAQKCQkJCQkJBwcHBwUJCQkJCQkODQgICAQEBAgGBgYGBgYFBQUFDwwFBQQEBAMCBAQHBAQEDAkCCQkAABMRCgADAwYEBwkLBgYJBAcECgkEBwYHBwkGBAgFBAYHBgUNBhELCAgJCAQICAYNCwkICwgEBwcIDQoIBQQFBQkFDQkIBAkLBAgIBAwJBwkJCQQEBgYMCggFBgYLBQQFDQ0NDQ0NEBEICAgEBAQLCQkJCQkJBwcHBwUJCQkJCQkPDQgICAQEBAkHBwcHBwcGBgYGEA0FBQQEBQQCBAQIBAQEDQoCCgoAABQSCgADAwcEBwoLBgYKBAgECgoFCAcHBwkHBQkFBAYIBgUOBhIMCQkJCAQICQYNCwoIDAgFCAgIDgsIBgUFBQoGDgoJBQkMBAgIBA0JBwoKCQUFBgYMCgkGBwcLBQQFDg4ODg4OERIJCQkEBAQLCgoKCgoKCAgICAYKCgoKCgoQDgkJCQQEBAkHBwcHBwcGBgYGEQ4FBQUFBQQCBAQIBQUEDgoCCgoAABUTCwADAwcFCAoMBgYKBAgFCwoFCAcHBwoHBQkFBQYIBgYPBhMMCQkJCQQJCQYODAoIDAkFCAgIDwsJBgUFBQoGDwoJBQoMBAkIBA0KBwoKCgUFBgcNCwkGBwcMBQQGDw8PDw8PEhMJCQkEBAQMCgoKCgoKCAgICAYKCgoKCgoRDwkJCQQEBAoHBwcHBwcGBgYGEg4GBgUFBQQCBAQIBQUFDgsDCwsAABYUCwADAwcFCAsMBwcLBAkFCwoFCAcICAoHBQoFBQcJBwYPBhQNCgoKCQQJCgcPDAoJDQkFCAgJDwwJBgUFBgsGEAsKBQoNBAkJBA4KCAsLCgUFBwcOCwkGBwcNBgUGDw8PDw8PExQKCgoEBAQMCgoKCgoLCAgICAYLCwsLCwsREAoKCgQEBAoICAgICAgHBwcHEw8GBgUFBQQCBQUJBQUFDwsDCwsAABcVDAADAwcFCQsNBwcLBQkFDAsFCQcICAsIBQoGBQcJBwYQBxQNCgoKCgUJCgcPDQsJDQoFCQkJEAwKBgUGBgsHEAsKBQoNBQkJBA4LCAsLCwUFBwcODAoGBwgNBgUGEBAQEBAQFBUKCgoFBQUNCwsLCwsLCQkJCQcLCwsLCwsSEAoKCgUFBQsICAgICAgHBwcHFBAGBgUFBgQCBQUJBQUFEAwDDAwAABgWDAADAwgFCQwNBwcMBQkFDAsGCQgICAsIBgoGBQcJBwYRBxUOCgoLCgUKCwcQDgsKDgoGCQkKEQ0KBwUGBgsHEQwKBgsOBQoKBA8LCAwMCwYGBwgPDAoHCAgOBgUGERERERERFRYKCwoFBQUOCwsLCwsMCQkJCQcLCwsLCwsTEQoKCgUFBQsICAgICAgHBwcHFBEGBgUFBgQCBQUKBQUFEAwDDAwAAAABAV0BkAAFAAICvAKKAAAAjwK8AooAAAHFADIBAwAAAAAEAAAAAAAAAAAAAAMAAAAAAAAAAAAAAABNQUNSAEAAICIZAyH/OQAAAyEAxwAAAAEAAAAAAAAAAQAAgAAAAACLAT8AAGAAAbQCdVlva2ttb2trICAgICAgICD/////N////llPS1IwMAAAAAAAAAABAAAAAQAAmJpL9V8PPPUAAAPoAAAAALfnFZIAAAAAt+cVkv+2/zkDawMhAAAAAwACAAEAAAAAAAEAAAMh/zkAAAOQ/7b/uANrAAEAAAAAAAAAAAAAAAAAAACkAAEAAACkAJgADQAAAAAAAgAIAEAACgAAAF0AvgABAAE=");
//			background-color: lightblue;
//			background-color: black;
//			background-color: darkslategrey;
			background-color: linen;
//			color: black;
			color: white;
//			font-size:62.5%; 
//			font-family: yokkmokkOT;
//			font-size: 38pt;
			font-size: 12pt;
			}

//		h1 { font-size: 2.4em; } /* =24px */
//		h1 { font-size: 14pt; } /* =24px */
//		h2 { font-size: 12pt; } /* =24px */
//		p  { font-size: 10pt; } /* =14px */
//		li { font-size: 20pt; } /* =14px? */
		}
		</style>

	<style id="style_input">
		.fileContainer {
			overflow: hidden;
			position: relative;
			}
		
		.fileContainer [type=file] {
			cursor: inherit;
			display: block;
			font-size: 999px;
			filter: alpha(opacity=0);
			min-height: 100%;
			min-width: 100%;
			opacity: 0;
			position: absolute;
			right: 0;
			text-align: right;`
			top: 0;
			}
		</style>

<!--
	<style id="style_input2">
		input[type=text] {
//			background-color: #BFBDBD;
			background-color: dargslategrey;
			border:solid 1px #BFBDBD;
//			color: #979797;
			color: yellow;
			height: 28px;
			padding-left:10px;
			width: 191px;
			box-shadow: 2px 2px 0 #828181 inset;
			}
		input[type=button] {
//			background-color: #1E1E1E;
			background-color: ivory;
//			color: #979797;
			color: yellow;
			height: 24px;
			width: 103px;
			color: #bbbbbb;
			text-transform:uppercase;
			box-shadow:-1px 2px #6E6B6A inset;
			}
		input[type=button], input[type=text]
			{border-radius: 5px; font-family: Sansation;}
			{border-radius: 5px; font-family: yokkmokkOT;}
		</style>
	-->

	<style id="style_input">
		.fileContainer {
		    overflow: hidden;
		    position: relative;
			}
		
		.fileContainer [type=file] {
		    cursor: inherit;
		    display: block;
		    font-size: 999px;
		    filter: alpha(opacity=0);
		    min-height: 100%;
		    min-width: 100%;
		    opacity: 0;
		    position: absolute;
		    right: 0;
		    text-align: right;`
		    top: 0;
			}
		</style>

	<style id="style_popover" >
		.popover  {
			position: relative;
			float: left;
			padding: 5px;
			/*z-index: 0;*/
			}
		.popover:hover {
//			background-color: #e9e9e2;
			background-color: darkslategrey;
			/*z-index: 50;*/
			color: white;
//			color: #335500;
			text-decoration: none;
			}
/*CSS for enlarged image*/
		.popover span { 
			position: absolute; 
//			background-color: #e5e5e5;
			background-color: darkslategrey;
			padding: 5px;
			/*left: -1000px;*/
//			border: 1px solid #666;
			border: 1px solid darkslategrey;
			visibility: hidden;
			color: black;
			text-decoration: none;
			}
/*CSS for enlarged image*/
		.popover span img { 
			border-width: 0px; 
			/*padding: 2px;*/
			}
		
/*CSS for enlarged image on hover*/
		.popover:hover span { 
			visibility: visible; 
//			width: 200px;
			top: 0px; /* use IF IE6 style to correct IE6 positions of larger image relative to thumb */
			left: 0px;/*position where enlarged image should offset horizontally */
			}
		</style>

	<style id="style_thumbnail" >
		.thumbnail  {
			position: relative;
			float: left;
			padding: 5px;
			/*z-index: 0;*/
			}
		.thumbnail:hover {
//			background-color: #e9e9e2;
			background-color: darkslategrey;
			/*z-index: 50;*/
			color: #335500;
			text-decoration: none;
			}
/*CSS for enlarged image*/
		.thumbnail span { 
			position: absolute; 
//			background-color: #e5e5e5;
			background-color: darkslategrey;
			padding: 5px;
			/*left: -1000px;*/
			border: 1px solid #666;
			visibility: hidden;
			color: black;
			text-decoration: none;
			}
/*CSS for enlarged image*/
		.thumbnail span img { 
			border-width: 0px; 
			/*padding: 2px;*/
			}
		
/*CSS for enlarged image on hover*/
		.thumbnail:hover span { 
			visibility: visible; 
			width: 200px;
			top: 5px; /* use IF IE6 style to correct IE6 positions of larger image relative to thumb */
			left: 300px;/*position where enlarged image should offset horizontally */
			}
		</style>

	<style id="style_buttons" >
                body { text-align: center; background-color: "darkslategrey"; color:"white"; }
                button {
//			visibility: hidden;
//			background: rgba(7, 99, 53, .1);
			background: transparent;
//	                border: 3px solid rgba(7, 99, 53, 1);
	                border: 3px solid darkslategrey;
			border-radius: 5px;
//			color: rgba(7, 99, 53, 1);
			color: darkslategrey;
			cursor: pointer;
			line-height: 40px;
			font-size: 20px;
			outline: none;
			padding: 0 20px;
			transition: all .3s;
                	}
	        button:hover {
//	              background: rgba(7, 99, 53, 1);
  	              background: darkgreyslate;
//  	              background: yellow;
//  	              background: white;
//  	              color: rgba(255,255,255,1);
  	              color: white;
  	              }
		p {font-size: 20px; font-weight: bold;
		</style>

	<style id="style_input" >
                body { text-align: center; background-color: "darkslategrey"; color:"white"; }
                input {
//			visibility: hidden;
//			background: rgba(7, 99, 53, .1);
			background: transparent;
//	                border: 3px solid rgba(7, 99, 53, 1);
	                border: 3px solid darkslategrey;
			border-radius: 5px;
//			color: rgba(7, 99, 53, 1);
			color: darkslategrey;
			cursor: pointer;
			line-height: 40px;
			font-size: 10px;
			outline: none;
			padding: 0 20px;
			transition: all .3s;
                	}
	        button:hover {
//	              background: rgba(7, 99, 53, 1);
  	              background: darkgreyslate;
//  	              background: yellow;
//  	              background: white;
//  	              color: rgba(255,255,255,1);
  	              color: white;
  	              }
		p {font-size: 10px; font-weight: bold;
		</style>

	<style type="text/css">
		#drop {
			width:200px;
			height:150px;
			margin:3px auto;
			background:#eddaa8;
			font-size:16px;
			}
		#drop #sw { text-decoration:underline; cursor:pointer; }
		#drag {
			width:450px;
			height:180px;
			margin:12px auto;
			border:1px solid silver;
			font-size:16px;
			}
		#drag .drg { margin:10px 12px; }
		#drag div.drg {
			width:150px;
			height:50px;
			background:#07da08;
			border:2px solid blue;
			}
		</style>

	<script type="text/javascript">

$(document).ready(function() {
  // sets the draggable
   $('#drag .drg').draggable({
    cursor: 'move',          // sets the cursor apperance
    revert: 'valid'
  });

  // sets droppable
  $('#drop').droppable({
    drop: function(event, ui) {
      // after the draggable is droped, hides it with a hide() effect
      ui.draggable.hide(1000);
    }
  });

  $('#drop1').droppable({
    drop: function(event, ui) {
      // after the draggable is droped, hides it with a hide() effect
      ui.draggable.hide(1000);
    }
  });

  $('#drop2').droppable({
    drop: function(event, ui) {
      // after the draggable is droped, hides it with a hide() effect
      ui.draggable.hide(1000);
    }
  });

  // when the "#sw" element (inside the "#drop") is clicked
  // show the items with class "drg", contained in "#drag"
			$('#drop #sw').click(function(){
//			$('#drag .drg').slideDown(1000);
			var url = "./kup.php?q=jqui/dragdrop1/"
		$(location).attr('href',url);
			});
		});
		</script>
HTML_STYLE;
	return( $html_style );
	}

function html_links() {
	$html_links = '';
	$html_links .= '	<div id="kup_links" >';
	$html_links .= '<!-- 		<span><img src="/imgs/anim/eyes/koeye_hand.gif" height="50" width="100" alt="kup_htm" ></span> -->';
	$html_links .= '		<h1>kup_links</h1>\n';
	$html_links .= '		<a href="./kup.html?kup" class="popover" target=_blank>';
	$html_links .= '		        <img  src="/imgs/btn/koeye.png" height="50" width="100" alt="kup_htm" >';
	$html_links .= '		        <span><img src="/imgs/btn/koeye_hand.gif" height="50" width="100" alt="kup_php" ></span>';
	$html_links .= '			./kup.html?kup</a>';
	$html_links .= '		<a href="./ko.php?kup" class="popover" target=_blank>';
	$html_links .= '		        <img  src="/imgs/btn/koeye.png" height="50" width="100" alt="kupphp" >';
	$html_links .= '		        <span><img src="/imgs/btn/koeye_handhither.gif" height="50" width="100" alt="kup_php" ></span>';
	$html_links .= '			./ko.php?kup</a>';

	$html_links .= '		<a href="./ko.php?kin" class="popover" target=_blank>';
	$html_links .= '		        <img  src="/imgs/btn/koeye.png" height="50" width="100" alt="kupphp" >';
	$html_links .= '		        <span><img src="/imgs/btn/koeye_handhither.gif" height="50" width="100" alt="kup_php" ></span>';
	$html_links .= '			./ko.php?kin</a>';
	$html_links .= '		<br><br><br><br>';
	$html_links .= '		<hr color=pink>';




	$html_links .= "<!--";
#	$html_links .= '		<img src=/imgs/btn/kib.png height=10>	';
#	$html_links .= '		<img src=/imgs/btn/kiw.png height=10>	';

	$html_links .= '		<a href="/sl/index_sl_kup_new.html" class="popover" target=_blank>';
	$html_links .= '		        <img  src="/imgs/btn/koeye.png" height="100" width="200" alt="sl_sl_new_htm" >';
	$html_links .= '		        <span><img src="/imgs/btn/kib.png" height="100" width="200" alt="sl_sl_new_htm" ></span>';
	$html_links .= '			</a>';
	$html_links .= '		<a href="/sl/index_h5g_kup_new.html" class="popover" target=_blank>';
	$html_links .= '		        <img  src="/imgs/btn/koeye.png" height="100" width="200" alt="sl_h5g_new_htm" >';
	$html_links .= '		        <span><img src="/imgs/btn/kiw.png" height="100" width="200" alt="sl_h5g_new_htm" ></span>';
	$html_links .= '			</a>';

#	$html_links .= '		<img src=/imgs/btn/kob.png height=10>	';
#	$html_links .= '		<img src=/imgs/btn/kow.png height=10>	';

	$html_links .= '		<a href="/sl/index_sl_kup.html" class="popover" target=_blank>';
	$html_links .= '		        <img  src="/imgs/btn/koeye.png" height="50" width="100" alt="sl_sl_htm" >';
	$html_links .= '		        <span><img src="/imgs/btn/kib.png" height="50" width="100" alt="sl_sl_htm" ></span>';
	$html_links .= '			</a>';
	$html_links .= '		<a href="/sl/index_h5g_kup.html" class="popover" target=_blank>';
	$html_links .= '		        <img  src="/imgs/btn/koeye.png" height="50" width="100" alt="sl_h5g_htm" >';
	$html_links .= '		        <span><img src="/imgs/btn/kiw.png" height="50" width="100" alt="sl_h5g_htm" ></span>';
	$html_links .= '			</a>';

#	$html_links .= '		<img src=/imgs/btn/ko.png height=10>	';
#	$html_links .= '		<img src=/imgs/btn/ok.png height=10>	';

	$html_links .= '		<a href="/kup.php?q=sl" class="popover" target=_blank>';
	$html_links .= '		        <img  src="/imgs/btn/koeye.png" height="50" width="100" alt="kup_php_sl" >';
	$html_links .= '		        <span><img src="/imgs/btn/kib.png" height="50" width="100" alt="kup_php_sl" ></span>';
	$html_links .= '			</a>';
	$html_links .= '		<a href="/kup.php?q=hg5" class="popover" target=_blank>';
	$html_links .= '		        <img  src="/imgs/btn/koeye.png" height="50" width="100" alt="kup_php_h5g" >';
	$html_links .= '		        <span><img src="/imgs/btn/kiw.png" height="50" width="100" alt="kup_php_h5g" ></span>';
	$html_links .= '			</a>';

#	$html_links .= '		<img src=/imgs/btn/ko.png height=10>	';
#	$html_links .= '		<img src=/imgs/btn/ok.png height=10>	';


	$html_links .= '';
	$html_links .= '		<a href="/kup/" class="popover"  target=_blank>';
	$html_links .= '		        <img  src="./imgs/btn/koeye.png" height="50" width="100" alt="kup_dir" >';
	$html_links .= '		        <span><img src="./imgs/btn/kib.png" height="50" width="100" alt="kup_dir" ></span>';
	$html_links .= '			</a>';
	$html_links .= '	-->';
	$html_links .= '		</div>';

	return( $html_links );
	}

function html_kin() {

	$html_kin_hdr=<<<HTML_KIN_HDR
<html>
	<head>
		<meta charset="utf-8" />
		<title>kup.php?q=kin 20180703_2200</title>
HTML_KIN_HDR;


	$html_kin_body=<<<HTML_KIN_BODY
	</head>
<body>
	<div class="la-anim-10"></div><!-- .corner-preloader -->
	<div id="wrapper">
		<div id="upload-widget">
			<h1>
				<i class="fa fa-cloud-upload"></i>fin
				</h1>
 
				<form id="file-upload-form">
					<div class="file-input-wrap">
						files
						<input type="file" name="file" id="file" multiple>
						</div>
<!-- .file-input-wrap -->
					</form>
<!-- #file-upload-form -->
				</div>
<!-- #upload-widget -->
 
			<div id="upload-result">
				<hr color=white>
				<hr color=black>
				<img src="/imgs/btn/kob.png" height="50" width="100" alt="koeyew" >
				<br><br>
				<hr color=black>
				<hr color=white>
				</div>

<!-- #upload-result -->
		</div><!-- #wrapper -->
		<center>
		<div id="preloader">
			        <img  src="/imgs/btn/kow.png" height="50" width="100" alt="koeyew" >
			</div>
			</center>

HTML_KIN_BODY;


$html_kin_input=<<<HTML_KIN_INPUT


	<script id="script_kin_input_show" >
		<a href=# onClick="#div_kin_input.show();" class="popover">
			<img src="/imgs/btn/koeye.png" border=0>
			<span><img src="/imgs/btn/koeye.png" border=0></span>
			</a>
		</script>

	<div id="div_kin_input" hidden >


<hr color=red>
kludge kludge kludge
<hr color=white>
kludge kludge kludge
<hr color=blue>
function html_kin_input() {
        <label for="input_choctype">chocolates</label>
                <input id="input_choctype" list="choctypes" type="text">
                <datalist id="choctypes">
                        <option value="white" />
                        <option value="milk" />
                        <option value="dark" />
                        <option value="semisweet" />
                        <option value="herseys" />
                        </datalist>

<!--
        <hr color=black>
        <hr color=white>
                <iframe id="myframe" src="ka1.php?q=kup" width="1000" height="500"
                        frameborder="0" scrolling="yes"></iframe>
        <hr color=black>
        <hr color=white>
                <iframe id="myframe" src="ka1.php?q=kin" width="1000" height="500"
                        frameborder="0" scrolling="yes"></iframe>
	-->
<input type="text" id="partNumber" pattern="[A-Z]{3}[0-9]{4}" />
<input type="text" required id="partNumber" pattern="[A-Z]{3}[0-9]{4}" />
<input type="number" id="qty" min="0" max="100" step="1" />
<input type="text" id="83filename" maxlength="12" />
<form role="form" novalidate>
  <label for="inpEmail">Email address</label>
  <input type="email" id="inpEmail" placeholder="Enter email">
</form>

<script id="input_validate" >
	var elem = document.getElementById("email_addr_confirm");
	elem.addEventListener("blur", verifyEmail);

// the provided value doesn’t match the primary email address
// input is valid -- reset the error message
	function verifyEmail(input) {
		input = input.srcElement;
		if (input.value != document.getElementById('email_addr').value) {
			input.setCustomValidity('The two email addresses must match.');
			} 
		else {
			input.setCustomValidity('');
			}
		}

// FormData gives you a way to create HTML forms on-the-fly using JavaScript, and then submit them using XMLHttpRequest.send(). Here's a simple example:

	var formData = new FormData();
		formData.append("part_num", "123ABC"); 
		formData.append("part_price", 7.95);
		formData.append("part_image", somefile)

	var xhr = new XMLHttpRequest();
	xhr.open("POST", "http://ka1.php?q=kup&new/");
	xhr.send(formData);

// You can also use FormData to add additional data to an existing form before submitting it.

	var formElement = document.getElementById("someFormElement");
	var formData = new FormData(formElement);
	formData.append("part_description", "The best part ever!");

	var xhr = new XMLHttpRequest();
	xhr.open("POST", "http://ka1.php?q=kup&add/");
	xhr.send(formData);
	</script>

<input type="number" id="pinNum" min="0" max="9999" autocomplete="off" />
<input type="text" id="partNum" pattern="[A-Z]{3}[0-9]{4}" autofocus />
<style id="style_kin" >
	input:invalid {outline: 2px solid red;}
	input:focus:invalid {color: red;}
	</style>
	</div>

HTML_KIN_INPUT;



	$html_kin_ftr=<<<HTML_KIN_FTR
	 
<hr color=black>
<hr color=white>
		<!-- SCRIPTS -->
<!--		<script type="text/javascript" src="js/libraries/jquery-2.1.1.min.js"></script> -->
<!--
		<script type="text/javascript" src="./jquery-3.3.1.js" > </script>
	-->

		<script id="jquery_331_js" src="data:/text/plain;base64,LyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjMuMy4xCiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS8KICoKICogSW5jbHVkZXMgU2l6emxlLmpzCiAqIGh0dHBzOi8vc2l6emxlanMuY29tLwogKgogKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKiBodHRwczovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBEYXRlOiAyMDE4LTAxLTIwVDE3OjI0WgogKi8KKCBmdW5jdGlvbiggZ2xvYmFsLCBmYWN0b3J5ICkgewoKCSJ1c2Ugc3RyaWN0IjsKCglpZiAoIHR5cGVvZiBtb2R1bGUgPT09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gIm9iamVjdCIgKSB7CgoJCS8vIEZvciBDb21tb25KUyBhbmQgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgd2hlcmUgYSBwcm9wZXIgYHdpbmRvd2AKCQkvLyBpcyBwcmVzZW50LCBleGVjdXRlIHRoZSBmYWN0b3J5IGFuZCBnZXQgalF1ZXJ5LgoJCS8vIEZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3QgaGF2ZSBhIGB3aW5kb3dgIHdpdGggYSBgZG9jdW1lbnRgCgkJLy8gKHN1Y2ggYXMgTm9kZS5qcyksIGV4cG9zZSBhIGZhY3RvcnkgYXMgbW9kdWxlLmV4cG9ydHMuCgkJLy8gVGhpcyBhY2NlbnR1YXRlcyB0aGUgbmVlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIGEgcmVhbCBgd2luZG93YC4KCQkvLyBlLmcuIHZhciBqUXVlcnkgPSByZXF1aXJlKCJqcXVlcnkiKSh3aW5kb3cpOwoJCS8vIFNlZSB0aWNrZXQgIzE0NTQ5IGZvciBtb3JlIGluZm8uCgkJbW9kdWxlLmV4cG9ydHMgPSBnbG9iYWwuZG9jdW1lbnQgPwoJCQlmYWN0b3J5KCBnbG9iYWwsIHRydWUgKSA6CgkJCWZ1bmN0aW9uKCB3ICkgewoJCQkJaWYgKCAhdy5kb2N1bWVudCApIHsKCQkJCQl0aHJvdyBuZXcgRXJyb3IoICJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50IiApOwoJCQkJfQoJCQkJcmV0dXJuIGZhY3RvcnkoIHcgKTsKCQkJfTsKCX0gZWxzZSB7CgkJZmFjdG9yeSggZ2xvYmFsICk7Cgl9CgovLyBQYXNzIHRoaXMgaWYgd2luZG93IGlzIG5vdCBkZWZpbmVkIHlldAp9ICkoIHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiID8gd2luZG93IDogdGhpcywgZnVuY3Rpb24oIHdpbmRvdywgbm9HbG9iYWwgKSB7CgovLyBFZGdlIDw9IDEyIC0gMTMrLCBGaXJlZm94IDw9MTggLSA0NSssIElFIDEwIC0gMTEsIFNhZmFyaSA1LjEgLSA5KywgaU9TIDYgLSA5LjEKLy8gdGhyb3cgZXhjZXB0aW9ucyB3aGVuIG5vbi1zdHJpY3QgY29kZSAoZS5nLiwgQVNQLk5FVCA0LjUpIGFjY2Vzc2VzIHN0cmljdCBtb2RlCi8vIGFyZ3VtZW50cy5jYWxsZWUuY2FsbGVyICh0cmFjLTEzMzM1KS4gQnV0IGFzIG9mIGpRdWVyeSAzLjAgKDIwMTYpLCBzdHJpY3QgbW9kZSBzaG91bGQgYmUgY29tbW9uCi8vIGVub3VnaCB0aGF0IGFsbCBzdWNoIGF0dGVtcHRzIGFyZSBndWFyZGVkIGluIGEgdHJ5IGJsb2NrLgoidXNlIHN0cmljdCI7Cgp2YXIgYXJyID0gW107Cgp2YXIgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQ7Cgp2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7Cgp2YXIgc2xpY2UgPSBhcnIuc2xpY2U7Cgp2YXIgY29uY2F0ID0gYXJyLmNvbmNhdDsKCnZhciBwdXNoID0gYXJyLnB1c2g7Cgp2YXIgaW5kZXhPZiA9IGFyci5pbmRleE9mOwoKdmFyIGNsYXNzMnR5cGUgPSB7fTsKCnZhciB0b1N0cmluZyA9IGNsYXNzMnR5cGUudG9TdHJpbmc7Cgp2YXIgaGFzT3duID0gY2xhc3MydHlwZS5oYXNPd25Qcm9wZXJ0eTsKCnZhciBmblRvU3RyaW5nID0gaGFzT3duLnRvU3RyaW5nOwoKdmFyIE9iamVjdEZ1bmN0aW9uU3RyaW5nID0gZm5Ub1N0cmluZy5jYWxsKCBPYmplY3QgKTsKCnZhciBzdXBwb3J0ID0ge307Cgp2YXIgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24oIG9iaiApIHsKCiAgICAgIC8vIFN1cHBvcnQ6IENocm9tZSA8PTU3LCBGaXJlZm94IDw9NTIKICAgICAgLy8gSW4gc29tZSBicm93c2VycywgdHlwZW9mIHJldHVybnMgImZ1bmN0aW9uIiBmb3IgSFRNTCA8b2JqZWN0PiBlbGVtZW50cwogICAgICAvLyAoaS5lLiwgYHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAib2JqZWN0IiApID09PSAiZnVuY3Rpb24iYCkuCiAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gY2xhc3NpZnkgKmFueSogRE9NIG5vZGUgYXMgYSBmdW5jdGlvbi4KICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIG9iai5ub2RlVHlwZSAhPT0gIm51bWJlciI7CiAgfTsKCgp2YXIgaXNXaW5kb3cgPSBmdW5jdGlvbiBpc1dpbmRvdyggb2JqICkgewoJCXJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT09IG9iai53aW5kb3c7Cgl9OwoKCgoKCXZhciBwcmVzZXJ2ZWRTY3JpcHRBdHRyaWJ1dGVzID0gewoJCXR5cGU6IHRydWUsCgkJc3JjOiB0cnVlLAoJCW5vTW9kdWxlOiB0cnVlCgl9OwoKCWZ1bmN0aW9uIERPTUV2YWwoIGNvZGUsIGRvYywgbm9kZSApIHsKCQlkb2MgPSBkb2MgfHwgZG9jdW1lbnQ7CgoJCXZhciBpLAoJCQlzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudCggInNjcmlwdCIgKTsKCgkJc2NyaXB0LnRleHQgPSBjb2RlOwoJCWlmICggbm9kZSApIHsKCQkJZm9yICggaSBpbiBwcmVzZXJ2ZWRTY3JpcHRBdHRyaWJ1dGVzICkgewoJCQkJaWYgKCBub2RlWyBpIF0gKSB7CgkJCQkJc2NyaXB0WyBpIF0gPSBub2RlWyBpIF07CgkJCQl9CgkJCX0KCQl9CgkJZG9jLmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdCApLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOwoJfQoKCmZ1bmN0aW9uIHRvVHlwZSggb2JqICkgewoJaWYgKCBvYmogPT0gbnVsbCApIHsKCQlyZXR1cm4gb2JqICsgIiI7Cgl9CgoJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTIuMyBvbmx5IChmdW5jdGlvbmlzaCBSZWdFeHApCglyZXR1cm4gdHlwZW9mIG9iaiA9PT0gIm9iamVjdCIgfHwgdHlwZW9mIG9iaiA9PT0gImZ1bmN0aW9uIiA/CgkJY2xhc3MydHlwZVsgdG9TdHJpbmcuY2FsbCggb2JqICkgXSB8fCAib2JqZWN0IiA6CgkJdHlwZW9mIG9iajsKfQovKiBnbG9iYWwgU3ltYm9sICovCi8vIERlZmluaW5nIHRoaXMgZ2xvYmFsIGluIC5lc2xpbnRyYy5qc29uIHdvdWxkIGNyZWF0ZSBhIGRhbmdlciBvZiB1c2luZyB0aGUgZ2xvYmFsCi8vIHVuZ3VhcmRlZCBpbiBhbm90aGVyIHBsYWNlLCBpdCBzZWVtcyBzYWZlciB0byBkZWZpbmUgZ2xvYmFsIG9ubHkgZm9yIHRoaXMgbW9kdWxlCgoKCnZhcgoJdmVyc2lvbiA9ICIzLjMuMSIsCgoJLy8gRGVmaW5lIGEgbG9jYWwgY29weSBvZiBqUXVlcnkKCWpRdWVyeSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHsKCgkJLy8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25zdHJ1Y3RvciAnZW5oYW5jZWQnCgkJLy8gTmVlZCBpbml0IGlmIGpRdWVyeSBpcyBjYWxsZWQgKGp1c3QgYWxsb3cgZXJyb3IgdG8gYmUgdGhyb3duIGlmIG5vdCBpbmNsdWRlZCkKCQlyZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KCBzZWxlY3RvciwgY29udGV4dCApOwoJfSwKCgkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHkKCS8vIE1ha2Ugc3VyZSB3ZSB0cmltIEJPTSBhbmQgTkJTUAoJcnRyaW0gPSAvXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2c7CgpqUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0gewoKCS8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWQKCWpxdWVyeTogdmVyc2lvbiwKCgljb25zdHJ1Y3RvcjogalF1ZXJ5LAoKCS8vIFRoZSBkZWZhdWx0IGxlbmd0aCBvZiBhIGpRdWVyeSBvYmplY3QgaXMgMAoJbGVuZ3RoOiAwLAoKCXRvQXJyYXk6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzbGljZS5jYWxsKCB0aGlzICk7Cgl9LAoKCS8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1IKCS8vIEdldCB0aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFuIGFycmF5CglnZXQ6IGZ1bmN0aW9uKCBudW0gKSB7CgoJCS8vIFJldHVybiBhbGwgdGhlIGVsZW1lbnRzIGluIGEgY2xlYW4gYXJyYXkKCQlpZiAoIG51bSA9PSBudWxsICkgewoJCQlyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApOwoJCX0KCgkJLy8gUmV0dXJuIGp1c3QgdGhlIG9uZSBlbGVtZW50IGZyb20gdGhlIHNldAoJCXJldHVybiBudW0gPCAwID8gdGhpc1sgbnVtICsgdGhpcy5sZW5ndGggXSA6IHRoaXNbIG51bSBdOwoJfSwKCgkvLyBUYWtlIGFuIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrCgkvLyAocmV0dXJuaW5nIHRoZSBuZXcgbWF0Y2hlZCBlbGVtZW50IHNldCkKCXB1c2hTdGFjazogZnVuY3Rpb24oIGVsZW1zICkgewoKCQkvLyBCdWlsZCBhIG5ldyBqUXVlcnkgbWF0Y2hlZCBlbGVtZW50IHNldAoJCXZhciByZXQgPSBqUXVlcnkubWVyZ2UoIHRoaXMuY29uc3RydWN0b3IoKSwgZWxlbXMgKTsKCgkJLy8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSkKCQlyZXQucHJldk9iamVjdCA9IHRoaXM7CgoJCS8vIFJldHVybiB0aGUgbmV3bHktZm9ybWVkIGVsZW1lbnQgc2V0CgkJcmV0dXJuIHJldDsKCX0sCgoJLy8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC4KCWVhY2g6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHsKCQlyZXR1cm4galF1ZXJ5LmVhY2goIHRoaXMsIGNhbGxiYWNrICk7Cgl9LAoKCW1hcDogZnVuY3Rpb24oIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm1hcCggdGhpcywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7CgkJCXJldHVybiBjYWxsYmFjay5jYWxsKCBlbGVtLCBpLCBlbGVtICk7CgkJfSApICk7Cgl9LAoKCXNsaWNlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHNsaWNlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSApOwoJfSwKCglmaXJzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIDAgKTsKCX0sCgoJbGFzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIC0xICk7Cgl9LAoKCWVxOiBmdW5jdGlvbiggaSApIHsKCQl2YXIgbGVuID0gdGhpcy5sZW5ndGgsCgkJCWogPSAraSArICggaSA8IDAgPyBsZW4gOiAwICk7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqID49IDAgJiYgaiA8IGxlbiA/IFsgdGhpc1sgaiBdIF0gOiBbXSApOwoJfSwKCgllbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3RvcigpOwoJfSwKCgkvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCgkvLyBCZWhhdmVzIGxpa2UgYW4gQXJyYXkncyBtZXRob2QsIG5vdCBsaWtlIGEgalF1ZXJ5IG1ldGhvZC4KCXB1c2g6IHB1c2gsCglzb3J0OiBhcnIuc29ydCwKCXNwbGljZTogYXJyLnNwbGljZQp9OwoKalF1ZXJ5LmV4dGVuZCA9IGpRdWVyeS5mbi5leHRlbmQgPSBmdW5jdGlvbigpIHsKCXZhciBvcHRpb25zLCBuYW1lLCBzcmMsIGNvcHksIGNvcHlJc0FycmF5LCBjbG9uZSwKCQl0YXJnZXQgPSBhcmd1bWVudHNbIDAgXSB8fCB7fSwKCQlpID0gMSwKCQlsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLAoJCWRlZXAgPSBmYWxzZTsKCgkvLyBIYW5kbGUgYSBkZWVwIGNvcHkgc2l0dWF0aW9uCglpZiAoIHR5cGVvZiB0YXJnZXQgPT09ICJib29sZWFuIiApIHsKCQlkZWVwID0gdGFyZ2V0OwoKCQkvLyBTa2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0CgkJdGFyZ2V0ID0gYXJndW1lbnRzWyBpIF0gfHwge307CgkJaSsrOwoJfQoKCS8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KQoJaWYgKCB0eXBlb2YgdGFyZ2V0ICE9PSAib2JqZWN0IiAmJiAhaXNGdW5jdGlvbiggdGFyZ2V0ICkgKSB7CgkJdGFyZ2V0ID0ge307Cgl9CgoJLy8gRXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkCglpZiAoIGkgPT09IGxlbmd0aCApIHsKCQl0YXJnZXQgPSB0aGlzOwoJCWktLTsKCX0KCglmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCgkJLy8gT25seSBkZWFsIHdpdGggbm9uLW51bGwvdW5kZWZpbmVkIHZhbHVlcwoJCWlmICggKCBvcHRpb25zID0gYXJndW1lbnRzWyBpIF0gKSAhPSBudWxsICkgewoKCQkJLy8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdAoJCQlmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7CgkJCQlzcmMgPSB0YXJnZXRbIG5hbWUgXTsKCQkJCWNvcHkgPSBvcHRpb25zWyBuYW1lIF07CgoJCQkJLy8gUHJldmVudCBuZXZlci1lbmRpbmcgbG9vcAoJCQkJaWYgKCB0YXJnZXQgPT09IGNvcHkgKSB7CgkJCQkJY29udGludWU7CgkJCQl9CgoJCQkJLy8gUmVjdXJzZSBpZiB3ZSdyZSBtZXJnaW5nIHBsYWluIG9iamVjdHMgb3IgYXJyYXlzCgkJCQlpZiAoIGRlZXAgJiYgY29weSAmJiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb3B5ICkgfHwKCQkJCQkoIGNvcHlJc0FycmF5ID0gQXJyYXkuaXNBcnJheSggY29weSApICkgKSApIHsKCgkJCQkJaWYgKCBjb3B5SXNBcnJheSApIHsKCQkJCQkJY29weUlzQXJyYXkgPSBmYWxzZTsKCQkJCQkJY2xvbmUgPSBzcmMgJiYgQXJyYXkuaXNBcnJheSggc3JjICkgPyBzcmMgOiBbXTsKCgkJCQkJfSBlbHNlIHsKCQkJCQkJY2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIHNyYyApID8gc3JjIDoge307CgkJCQkJfQoKCQkJCQkvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW0KCQkJCQl0YXJnZXRbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGRlZXAsIGNsb25lLCBjb3B5ICk7CgoJCQkJLy8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlcwoJCQkJfSBlbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXRhcmdldFsgbmFtZSBdID0gY29weTsKCQkJCX0KCQkJfQoJCX0KCX0KCgkvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdAoJcmV0dXJuIHRhcmdldDsKfTsKCmpRdWVyeS5leHRlbmQoIHsKCgkvLyBVbmlxdWUgZm9yIGVhY2ggY29weSBvZiBqUXVlcnkgb24gdGhlIHBhZ2UKCWV4cGFuZG86ICJqUXVlcnkiICsgKCB2ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIC9cRC9nLCAiIiApLAoKCS8vIEFzc3VtZSBqUXVlcnkgaXMgcmVhZHkgd2l0aG91dCB0aGUgcmVhZHkgbW9kdWxlCglpc1JlYWR5OiB0cnVlLAoKCWVycm9yOiBmdW5jdGlvbiggbXNnICkgewoJCXRocm93IG5ldyBFcnJvciggbXNnICk7Cgl9LAoKCW5vb3A6IGZ1bmN0aW9uKCkge30sCgoJaXNQbGFpbk9iamVjdDogZnVuY3Rpb24oIG9iaiApIHsKCQl2YXIgcHJvdG8sIEN0b3I7CgoJCS8vIERldGVjdCBvYnZpb3VzIG5lZ2F0aXZlcwoJCS8vIFVzZSB0b1N0cmluZyBpbnN0ZWFkIG9mIGpRdWVyeS50eXBlIHRvIGNhdGNoIGhvc3Qgb2JqZWN0cwoJCWlmICggIW9iaiB8fCB0b1N0cmluZy5jYWxsKCBvYmogKSAhPT0gIltvYmplY3QgT2JqZWN0XSIgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCXByb3RvID0gZ2V0UHJvdG8oIG9iaiApOwoKCQkvLyBPYmplY3RzIHdpdGggbm8gcHJvdG90eXBlIChlLmcuLCBgT2JqZWN0LmNyZWF0ZSggbnVsbCApYCkgYXJlIHBsYWluCgkJaWYgKCAhcHJvdG8gKSB7CgkJCXJldHVybiB0cnVlOwoJCX0KCgkJLy8gT2JqZWN0cyB3aXRoIHByb3RvdHlwZSBhcmUgcGxhaW4gaWZmIHRoZXkgd2VyZSBjb25zdHJ1Y3RlZCBieSBhIGdsb2JhbCBPYmplY3QgZnVuY3Rpb24KCQlDdG9yID0gaGFzT3duLmNhbGwoIHByb3RvLCAiY29uc3RydWN0b3IiICkgJiYgcHJvdG8uY29uc3RydWN0b3I7CgkJcmV0dXJuIHR5cGVvZiBDdG9yID09PSAiZnVuY3Rpb24iICYmIGZuVG9TdHJpbmcuY2FsbCggQ3RvciApID09PSBPYmplY3RGdW5jdGlvblN0cmluZzsKCX0sCgoJaXNFbXB0eU9iamVjdDogZnVuY3Rpb24oIG9iaiApIHsKCgkJLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi8KCQkvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VzbGludC9lc2xpbnQvaXNzdWVzLzYxMjUKCQl2YXIgbmFtZTsKCgkJZm9yICggbmFtZSBpbiBvYmogKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJcmV0dXJuIHRydWU7Cgl9LAoKCS8vIEV2YWx1YXRlcyBhIHNjcmlwdCBpbiBhIGdsb2JhbCBjb250ZXh0CglnbG9iYWxFdmFsOiBmdW5jdGlvbiggY29kZSApIHsKCQlET01FdmFsKCBjb2RlICk7Cgl9LAoKCWVhY2g6IGZ1bmN0aW9uKCBvYmosIGNhbGxiYWNrICkgewoJCXZhciBsZW5ndGgsIGkgPSAwOwoKCQlpZiAoIGlzQXJyYXlMaWtlKCBvYmogKSApIHsKCQkJbGVuZ3RoID0gb2JqLmxlbmd0aDsKCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQlpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApID09PSBmYWxzZSApIHsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCWZvciAoIGkgaW4gb2JqICkgewoJCQkJaWYgKCBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKSA9PT0gZmFsc2UgKSB7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBvYmo7Cgl9LAoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seQoJdHJpbTogZnVuY3Rpb24oIHRleHQgKSB7CgkJcmV0dXJuIHRleHQgPT0gbnVsbCA/CgkJCSIiIDoKCQkJKCB0ZXh0ICsgIiIgKS5yZXBsYWNlKCBydHJpbSwgIiIgKTsKCX0sCgoJLy8gcmVzdWx0cyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seQoJbWFrZUFycmF5OiBmdW5jdGlvbiggYXJyLCByZXN1bHRzICkgewoJCXZhciByZXQgPSByZXN1bHRzIHx8IFtdOwoKCQlpZiAoIGFyciAhPSBudWxsICkgewoJCQlpZiAoIGlzQXJyYXlMaWtlKCBPYmplY3QoIGFyciApICkgKSB7CgkJCQlqUXVlcnkubWVyZ2UoIHJldCwKCQkJCQl0eXBlb2YgYXJyID09PSAic3RyaW5nIiA/CgkJCQkJWyBhcnIgXSA6IGFycgoJCQkJKTsKCQkJfSBlbHNlIHsKCQkJCXB1c2guY2FsbCggcmV0LCBhcnIgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX0sCgoJaW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFyciwgaSApIHsKCQlyZXR1cm4gYXJyID09IG51bGwgPyAtMSA6IGluZGV4T2YuY2FsbCggYXJyLCBlbGVtLCBpICk7Cgl9LAoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seQoJLy8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdAoJbWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkgewoJCXZhciBsZW4gPSArc2Vjb25kLmxlbmd0aCwKCQkJaiA9IDAsCgkJCWkgPSBmaXJzdC5sZW5ndGg7CgoJCWZvciAoIDsgaiA8IGxlbjsgaisrICkgewoJCQlmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTsKCQl9CgoJCWZpcnN0Lmxlbmd0aCA9IGk7CgoJCXJldHVybiBmaXJzdDsKCX0sCgoJZ3JlcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgaW52ZXJ0ICkgewoJCXZhciBjYWxsYmFja0ludmVyc2UsCgkJCW1hdGNoZXMgPSBbXSwKCQkJaSA9IDAsCgkJCWxlbmd0aCA9IGVsZW1zLmxlbmd0aCwKCQkJY2FsbGJhY2tFeHBlY3QgPSAhaW52ZXJ0OwoKCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zCgkJLy8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb24KCQlmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkJY2FsbGJhY2tJbnZlcnNlID0gIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7CgkJCWlmICggY2FsbGJhY2tJbnZlcnNlICE9PSBjYWxsYmFja0V4cGVjdCApIHsKCQkJCW1hdGNoZXMucHVzaCggZWxlbXNbIGkgXSApOwoJCQl9CgkJfQoKCQlyZXR1cm4gbWF0Y2hlczsKCX0sCgoJLy8gYXJnIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CgltYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGFyZyApIHsKCQl2YXIgbGVuZ3RoLCB2YWx1ZSwKCQkJaSA9IDAsCgkJCXJldCA9IFtdOwoKCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIgbmV3IHZhbHVlcwoJCWlmICggaXNBcnJheUxpa2UoIGVsZW1zICkgKSB7CgkJCWxlbmd0aCA9IGVsZW1zLmxlbmd0aDsKCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQl2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTsKCgkJCQlpZiAoIHZhbHVlICE9IG51bGwgKSB7CgkJCQkJcmV0LnB1c2goIHZhbHVlICk7CgkJCQl9CgkJCX0KCgkJLy8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9iamVjdCwKCQl9IGVsc2UgewoJCQlmb3IgKCBpIGluIGVsZW1zICkgewoJCQkJdmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7CgoJCQkJaWYgKCB2YWx1ZSAhPSBudWxsICkgewoJCQkJCXJldC5wdXNoKCB2YWx1ZSApOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzCgkJcmV0dXJuIGNvbmNhdC5hcHBseSggW10sIHJldCApOwoJfSwKCgkvLyBBIGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHMKCWd1aWQ6IDEsCgoJLy8galF1ZXJ5LnN1cHBvcnQgaXMgbm90IHVzZWQgaW4gQ29yZSBidXQgb3RoZXIgcHJvamVjdHMgYXR0YWNoIHRoZWlyCgkvLyBwcm9wZXJ0aWVzIHRvIGl0IHNvIGl0IG5lZWRzIHRvIGV4aXN0LgoJc3VwcG9ydDogc3VwcG9ydAp9ICk7CgppZiAoIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgKSB7CglqUXVlcnkuZm5bIFN5bWJvbC5pdGVyYXRvciBdID0gYXJyWyBTeW1ib2wuaXRlcmF0b3IgXTsKfQoKLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUgbWFwCmpRdWVyeS5lYWNoKCAiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCAiICIgKSwKZnVuY3Rpb24oIGksIG5hbWUgKSB7CgljbGFzczJ0eXBlWyAiW29iamVjdCAiICsgbmFtZSArICJdIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpOwp9ICk7CgpmdW5jdGlvbiBpc0FycmF5TGlrZSggb2JqICkgewoKCS8vIFN1cHBvcnQ6IHJlYWwgaU9TIDguMiBvbmx5IChub3QgcmVwcm9kdWNpYmxlIGluIHNpbXVsYXRvcikKCS8vIGBpbmAgY2hlY2sgdXNlZCB0byBwcmV2ZW50IEpJVCBlcnJvciAoZ2gtMjE0NSkKCS8vIGhhc093biBpc24ndCB1c2VkIGhlcmUgZHVlIHRvIGZhbHNlIG5lZ2F0aXZlcwoJLy8gcmVnYXJkaW5nIE5vZGVsaXN0IGxlbmd0aCBpbiBJRQoJdmFyIGxlbmd0aCA9ICEhb2JqICYmICJsZW5ndGgiIGluIG9iaiAmJiBvYmoubGVuZ3RoLAoJCXR5cGUgPSB0b1R5cGUoIG9iaiApOwoKCWlmICggaXNGdW5jdGlvbiggb2JqICkgfHwgaXNXaW5kb3coIG9iaiApICkgewoJCXJldHVybiBmYWxzZTsKCX0KCglyZXR1cm4gdHlwZSA9PT0gImFycmF5IiB8fCBsZW5ndGggPT09IDAgfHwKCQl0eXBlb2YgbGVuZ3RoID09PSAibnVtYmVyIiAmJiBsZW5ndGggPiAwICYmICggbGVuZ3RoIC0gMSApIGluIG9iajsKfQp2YXIgU2l6emxlID0KLyohCiAqIFNpenpsZSBDU1MgU2VsZWN0b3IgRW5naW5lIHYyLjMuMwogKiBodHRwczovL3NpenpsZWpzLmNvbS8KICoKICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogRGF0ZTogMjAxNi0wOC0wOAogKi8KKGZ1bmN0aW9uKCB3aW5kb3cgKSB7Cgp2YXIgaSwKCXN1cHBvcnQsCglFeHByLAoJZ2V0VGV4dCwKCWlzWE1MLAoJdG9rZW5pemUsCgljb21waWxlLAoJc2VsZWN0LAoJb3V0ZXJtb3N0Q29udGV4dCwKCXNvcnRJbnB1dCwKCWhhc0R1cGxpY2F0ZSwKCgkvLyBMb2NhbCBkb2N1bWVudCB2YXJzCglzZXREb2N1bWVudCwKCWRvY3VtZW50LAoJZG9jRWxlbSwKCWRvY3VtZW50SXNIVE1MLAoJcmJ1Z2d5UVNBLAoJcmJ1Z2d5TWF0Y2hlcywKCW1hdGNoZXMsCgljb250YWlucywKCgkvLyBJbnN0YW5jZS1zcGVjaWZpYyBkYXRhCglleHBhbmRvID0gInNpenpsZSIgKyAxICogbmV3IERhdGUoKSwKCXByZWZlcnJlZERvYyA9IHdpbmRvdy5kb2N1bWVudCwKCWRpcnJ1bnMgPSAwLAoJZG9uZSA9IDAsCgljbGFzc0NhY2hlID0gY3JlYXRlQ2FjaGUoKSwKCXRva2VuQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLAoJY29tcGlsZXJDYWNoZSA9IGNyZWF0ZUNhY2hlKCksCglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKCQlpZiAoIGEgPT09IGIgKSB7CgkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7CgkJfQoJCXJldHVybiAwOwoJfSwKCgkvLyBJbnN0YW5jZSBtZXRob2RzCgloYXNPd24gPSAoe30pLmhhc093blByb3BlcnR5LAoJYXJyID0gW10sCglwb3AgPSBhcnIucG9wLAoJcHVzaF9uYXRpdmUgPSBhcnIucHVzaCwKCXB1c2ggPSBhcnIucHVzaCwKCXNsaWNlID0gYXJyLnNsaWNlLAoJLy8gVXNlIGEgc3RyaXBwZWQtZG93biBpbmRleE9mIGFzIGl0J3MgZmFzdGVyIHRoYW4gbmF0aXZlCgkvLyBodHRwczovL2pzcGVyZi5jb20vdGhvci1pbmRleG9mLXZzLWZvci81CglpbmRleE9mID0gZnVuY3Rpb24oIGxpc3QsIGVsZW0gKSB7CgkJdmFyIGkgPSAwLAoJCQlsZW4gPSBsaXN0Lmxlbmd0aDsKCQlmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKCQkJaWYgKCBsaXN0W2ldID09PSBlbGVtICkgewoJCQkJcmV0dXJuIGk7CgkJCX0KCQl9CgkJcmV0dXJuIC0xOwoJfSwKCglib29sZWFucyA9ICJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsCgoJLy8gUmVndWxhciBleHByZXNzaW9ucwoKCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc2VsZWN0b3JzLyN3aGl0ZXNwYWNlCgl3aGl0ZXNwYWNlID0gIltcXHgyMFxcdFxcclxcblxcZl0iLAoKCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCN2YWx1ZS1kZWYtaWRlbnRpZmllcgoJaWRlbnRpZmllciA9ICIoPzpcXFxcLnxbXFx3LV18W15cMC1cXHhhMF0pKyIsCgoJLy8gQXR0cmlidXRlIHNlbGVjdG9yczogaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNhdHRyaWJ1dGUtc2VsZWN0b3JzCglhdHRyaWJ1dGVzID0gIlxcWyIgKyB3aGl0ZXNwYWNlICsgIiooIiArIGlkZW50aWZpZXIgKyAiKSg/OiIgKyB3aGl0ZXNwYWNlICsKCQkvLyBPcGVyYXRvciAoY2FwdHVyZSAyKQoJCSIqKFsqXiR8IX5dPz0pIiArIHdoaXRlc3BhY2UgKwoJCS8vICJBdHRyaWJ1dGUgdmFsdWVzIG11c3QgYmUgQ1NTIGlkZW50aWZpZXJzIFtjYXB0dXJlIDVdIG9yIHN0cmluZ3MgW2NhcHR1cmUgMyBvciBjYXB0dXJlIDRdIgoJCSIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIgKyBpZGVudGlmaWVyICsgIikpfCkiICsgd2hpdGVzcGFjZSArCgkJIipcXF0iLAoKCXBzZXVkb3MgPSAiOigiICsgaWRlbnRpZmllciArICIpKD86XFwoKCIgKwoJCS8vIFRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBuZWVkaW5nIHRva2VuaXplIGluIHRoZSBwcmVGaWx0ZXIsIHByZWZlciBhcmd1bWVudHM6CgkJLy8gMS4gcXVvdGVkIChjYXB0dXJlIDM7IGNhcHR1cmUgNCBvciBjYXB0dXJlIDUpCgkJIignKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcIil8IiArCgkJLy8gMi4gc2ltcGxlIChjYXB0dXJlIDYpCgkJIigoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIgKyBhdHRyaWJ1dGVzICsgIikqKXwiICsKCQkvLyAzLiBhbnl0aGluZyBlbHNlIChjYXB0dXJlIDIpCgkJIi4qIiArCgkJIilcXCl8KSIsCgoJLy8gTGVhZGluZyBhbmQgbm9uLWVzY2FwZWQgdHJhaWxpbmcgd2hpdGVzcGFjZSwgY2FwdHVyaW5nIHNvbWUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBwcmVjZWRpbmcgdGhlIGxhdHRlcgoJcndoaXRlc3BhY2UgPSBuZXcgUmVnRXhwKCB3aGl0ZXNwYWNlICsgIisiLCAiZyIgKSwKCXJ0cmltID0gbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiICsgd2hpdGVzcGFjZSArICIrJCIsICJnIiApLAoKCXJjb21tYSA9IG5ldyBSZWdFeHAoICJeIiArIHdoaXRlc3BhY2UgKyAiKiwiICsgd2hpdGVzcGFjZSArICIqIiApLAoJcmNvbWJpbmF0b3JzID0gbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIqKFs+K35dfCIgKyB3aGl0ZXNwYWNlICsgIikiICsgd2hpdGVzcGFjZSArICIqIiApLAoKCXJhdHRyaWJ1dGVRdW90ZXMgPSBuZXcgUmVnRXhwKCAiPSIgKyB3aGl0ZXNwYWNlICsgIiooW15cXF0nXCJdKj8pIiArIHdoaXRlc3BhY2UgKyAiKlxcXSIsICJnIiApLAoKCXJwc2V1ZG8gPSBuZXcgUmVnRXhwKCBwc2V1ZG9zICksCglyaWRlbnRpZmllciA9IG5ldyBSZWdFeHAoICJeIiArIGlkZW50aWZpZXIgKyAiJCIgKSwKCgltYXRjaEV4cHIgPSB7CgkJIklEIjogbmV3IFJlZ0V4cCggIl4jKCIgKyBpZGVudGlmaWVyICsgIikiICksCgkJIkNMQVNTIjogbmV3IFJlZ0V4cCggIl5cXC4oIiArIGlkZW50aWZpZXIgKyAiKSIgKSwKCQkiVEFHIjogbmV3IFJlZ0V4cCggIl4oIiArIGlkZW50aWZpZXIgKyAifFsqXSkiICksCgkJIkFUVFIiOiBuZXcgUmVnRXhwKCAiXiIgKyBhdHRyaWJ1dGVzICksCgkJIlBTRVVETyI6IG5ldyBSZWdFeHAoICJeIiArIHBzZXVkb3MgKSwKCQkiQ0hJTEQiOiBuZXcgUmVnRXhwKCAiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIiArIHdoaXRlc3BhY2UgKwoJCQkiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIgKyB3aGl0ZXNwYWNlICsgIiooPzooWystXXwpIiArIHdoaXRlc3BhY2UgKwoJCQkiKihcXGQrKXwpKSIgKyB3aGl0ZXNwYWNlICsgIipcXCl8KSIsICJpIiApLAoJCSJib29sIjogbmV3IFJlZ0V4cCggIl4oPzoiICsgYm9vbGVhbnMgKyAiKSQiLCAiaSIgKSwKCQkvLyBGb3IgdXNlIGluIGxpYnJhcmllcyBpbXBsZW1lbnRpbmcgLmlzKCkKCQkvLyBXZSB1c2UgdGhpcyBmb3IgUE9TIG1hdGNoaW5nIGluIGBzZWxlY3RgCgkJIm5lZWRzQ29udGV4dCI6IG5ldyBSZWdFeHAoICJeIiArIHdoaXRlc3BhY2UgKyAiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIiArCgkJCXdoaXRlc3BhY2UgKyAiKigoPzotXFxkKT9cXGQqKSIgKyB3aGl0ZXNwYWNlICsgIipcXCl8KSg/PVteLV18JCkiLCAiaSIgKQoJfSwKCglyaW5wdXRzID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSwKCXJoZWFkZXIgPSAvXmhcZCQvaSwKCglybmF0aXZlID0gL15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLAoKCS8vIEVhc2lseS1wYXJzZWFibGUvcmV0cmlldmFibGUgSUQgb3IgVEFHIG9yIENMQVNTIHNlbGVjdG9ycwoJcnF1aWNrRXhwciA9IC9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sCgoJcnNpYmxpbmcgPSAvWyt+XS8sCgoJLy8gQ1NTIGVzY2FwZXMKCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCNlc2NhcGVkLWNoYXJhY3RlcnMKCXJ1bmVzY2FwZSA9IG5ldyBSZWdFeHAoICJcXFxcKFtcXGRhLWZdezEsNn0iICsgd2hpdGVzcGFjZSArICI/fCgiICsgd2hpdGVzcGFjZSArICIpfC4pIiwgImlnIiApLAoJZnVuZXNjYXBlID0gZnVuY3Rpb24oIF8sIGVzY2FwZWQsIGVzY2FwZWRXaGl0ZXNwYWNlICkgewoJCXZhciBoaWdoID0gIjB4IiArIGVzY2FwZWQgLSAweDEwMDAwOwoJCS8vIE5hTiBtZWFucyBub24tY29kZXBvaW50CgkJLy8gU3VwcG9ydDogRmlyZWZveDwyNAoJCS8vIFdvcmthcm91bmQgZXJyb25lb3VzIG51bWVyaWMgaW50ZXJwcmV0YXRpb24gb2YgKyIweCIKCQlyZXR1cm4gaGlnaCAhPT0gaGlnaCB8fCBlc2NhcGVkV2hpdGVzcGFjZSA/CgkJCWVzY2FwZWQgOgoJCQloaWdoIDwgMCA/CgkJCQkvLyBCTVAgY29kZXBvaW50CgkJCQlTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoICsgMHgxMDAwMCApIDoKCQkJCS8vIFN1cHBsZW1lbnRhbCBQbGFuZSBjb2RlcG9pbnQgKHN1cnJvZ2F0ZSBwYWlyKQoJCQkJU3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCA+PiAxMCB8IDB4RDgwMCwgaGlnaCAmIDB4M0ZGIHwgMHhEQzAwICk7Cgl9LAoKCS8vIENTUyBzdHJpbmcvaWRlbnRpZmllciBzZXJpYWxpemF0aW9uCgkvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3Nzb20vI2NvbW1vbi1zZXJpYWxpemluZy1pZGlvbXMKCXJjc3Nlc2NhcGUgPSAvKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZywKCWZjc3Nlc2NhcGUgPSBmdW5jdGlvbiggY2gsIGFzQ29kZVBvaW50ICkgewoJCWlmICggYXNDb2RlUG9pbnQgKSB7CgoJCQkvLyBVKzAwMDAgTlVMTCBiZWNvbWVzIFUrRkZGRCBSRVBMQUNFTUVOVCBDSEFSQUNURVIKCQkJaWYgKCBjaCA9PT0gIlwwIiApIHsKCQkJCXJldHVybiAiXHVGRkZEIjsKCQkJfQoKCQkJLy8gQ29udHJvbCBjaGFyYWN0ZXJzIGFuZCAoZGVwZW5kZW50IHVwb24gcG9zaXRpb24pIG51bWJlcnMgZ2V0IGVzY2FwZWQgYXMgY29kZSBwb2ludHMKCQkJcmV0dXJuIGNoLnNsaWNlKCAwLCAtMSApICsgIlxcIiArIGNoLmNoYXJDb2RlQXQoIGNoLmxlbmd0aCAtIDEgKS50b1N0cmluZyggMTYgKSArICIgIjsKCQl9CgoJCS8vIE90aGVyIHBvdGVudGlhbGx5LXNwZWNpYWwgQVNDSUkgY2hhcmFjdGVycyBnZXQgYmFja3NsYXNoLWVzY2FwZWQKCQlyZXR1cm4gIlxcIiArIGNoOwoJfSwKCgkvLyBVc2VkIGZvciBpZnJhbWVzCgkvLyBTZWUgc2V0RG9jdW1lbnQoKQoJLy8gUmVtb3ZpbmcgdGhlIGZ1bmN0aW9uIHdyYXBwZXIgY2F1c2VzIGEgIlBlcm1pc3Npb24gRGVuaWVkIgoJLy8gZXJyb3IgaW4gSUUKCXVubG9hZEhhbmRsZXIgPSBmdW5jdGlvbigpIHsKCQlzZXREb2N1bWVudCgpOwoJfSwKCglkaXNhYmxlZEFuY2VzdG9yID0gYWRkQ29tYmluYXRvcigKCQlmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWUgJiYgKCJmb3JtIiBpbiBlbGVtIHx8ICJsYWJlbCIgaW4gZWxlbSk7CgkJfSwKCQl7IGRpcjogInBhcmVudE5vZGUiLCBuZXh0OiAibGVnZW5kIiB9CgkpOwoKLy8gT3B0aW1pemUgZm9yIHB1c2guYXBwbHkoIF8sIE5vZGVMaXN0ICkKdHJ5IHsKCXB1c2guYXBwbHkoCgkJKGFyciA9IHNsaWNlLmNhbGwoIHByZWZlcnJlZERvYy5jaGlsZE5vZGVzICkpLAoJCXByZWZlcnJlZERvYy5jaGlsZE5vZGVzCgkpOwoJLy8gU3VwcG9ydDogQW5kcm9pZDw0LjAKCS8vIERldGVjdCBzaWxlbnRseSBmYWlsaW5nIHB1c2guYXBwbHkKCWFyclsgcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMubGVuZ3RoIF0ubm9kZVR5cGU7Cn0gY2F0Y2ggKCBlICkgewoJcHVzaCA9IHsgYXBwbHk6IGFyci5sZW5ndGggPwoKCQkvLyBMZXZlcmFnZSBzbGljZSBpZiBwb3NzaWJsZQoJCWZ1bmN0aW9uKCB0YXJnZXQsIGVscyApIHsKCQkJcHVzaF9uYXRpdmUuYXBwbHkoIHRhcmdldCwgc2xpY2UuY2FsbChlbHMpICk7CgkJfSA6CgoJCS8vIFN1cHBvcnQ6IElFPDkKCQkvLyBPdGhlcndpc2UgYXBwZW5kIGRpcmVjdGx5CgkJZnVuY3Rpb24oIHRhcmdldCwgZWxzICkgewoJCQl2YXIgaiA9IHRhcmdldC5sZW5ndGgsCgkJCQlpID0gMDsKCQkJLy8gQ2FuJ3QgdHJ1c3QgTm9kZUxpc3QubGVuZ3RoCgkJCXdoaWxlICggKHRhcmdldFtqKytdID0gZWxzW2krK10pICkge30KCQkJdGFyZ2V0Lmxlbmd0aCA9IGogLSAxOwoJCX0KCX07Cn0KCmZ1bmN0aW9uIFNpenpsZSggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7Cgl2YXIgbSwgaSwgZWxlbSwgbmlkLCBtYXRjaCwgZ3JvdXBzLCBuZXdTZWxlY3RvciwKCQluZXdDb250ZXh0ID0gY29udGV4dCAmJiBjb250ZXh0Lm93bmVyRG9jdW1lbnQsCgoJCS8vIG5vZGVUeXBlIGRlZmF1bHRzIHRvIDksIHNpbmNlIGNvbnRleHQgZGVmYXVsdHMgdG8gZG9jdW1lbnQKCQlub2RlVHlwZSA9IGNvbnRleHQgPyBjb250ZXh0Lm5vZGVUeXBlIDogOTsKCglyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTsKCgkvLyBSZXR1cm4gZWFybHkgZnJvbSBjYWxscyB3aXRoIGludmFsaWQgc2VsZWN0b3Igb3IgY29udGV4dAoJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciIHx8ICFzZWxlY3RvciB8fAoJCW5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICYmIG5vZGVUeXBlICE9PSAxMSApIHsKCgkJcmV0dXJuIHJlc3VsdHM7Cgl9CgoJLy8gVHJ5IHRvIHNob3J0Y3V0IGZpbmQgb3BlcmF0aW9ucyAoYXMgb3Bwb3NlZCB0byBmaWx0ZXJzKSBpbiBIVE1MIGRvY3VtZW50cwoJaWYgKCAhc2VlZCApIHsKCgkJaWYgKCAoIGNvbnRleHQgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6IHByZWZlcnJlZERvYyApICE9PSBkb2N1bWVudCApIHsKCQkJc2V0RG9jdW1lbnQoIGNvbnRleHQgKTsKCQl9CgkJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CgoJCWlmICggZG9jdW1lbnRJc0hUTUwgKSB7CgoJCQkvLyBJZiB0aGUgc2VsZWN0b3IgaXMgc3VmZmljaWVudGx5IHNpbXBsZSwgdHJ5IHVzaW5nIGEgImdldCpCeSoiIERPTSBtZXRob2QKCQkJLy8gKGV4Y2VwdGluZyBEb2N1bWVudEZyYWdtZW50IGNvbnRleHQsIHdoZXJlIHRoZSBtZXRob2RzIGRvbid0IGV4aXN0KQoJCQlpZiAoIG5vZGVUeXBlICE9PSAxMSAmJiAobWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICkpICkgewoKCQkJCS8vIElEIHNlbGVjdG9yCgkJCQlpZiAoIChtID0gbWF0Y2hbMV0pICkgewoKCQkJCQkvLyBEb2N1bWVudCBjb250ZXh0CgkJCQkJaWYgKCBub2RlVHlwZSA9PT0gOSApIHsKCQkJCQkJaWYgKCAoZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSkgKSB7CgoJCQkJCQkJLy8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXQKCQkJCQkJCS8vIFRPRE86IGlkZW50aWZ5IHZlcnNpb25zCgkJCQkJCQkvLyBnZXRFbGVtZW50QnlJZCBjYW4gbWF0Y2ggZWxlbWVudHMgYnkgbmFtZSBpbnN0ZWFkIG9mIElECgkJCQkJCQlpZiAoIGVsZW0uaWQgPT09IG0gKSB7CgkJCQkJCQkJcmVzdWx0cy5wdXNoKCBlbGVtICk7CgkJCQkJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCQkJCQl9CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlyZXR1cm4gcmVzdWx0czsKCQkJCQkJfQoKCQkJCQkvLyBFbGVtZW50IGNvbnRleHQKCQkJCQl9IGVsc2UgewoKCQkJCQkJLy8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXQKCQkJCQkJLy8gVE9ETzogaWRlbnRpZnkgdmVyc2lvbnMKCQkJCQkJLy8gZ2V0RWxlbWVudEJ5SWQgY2FuIG1hdGNoIGVsZW1lbnRzIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRAoJCQkJCQlpZiAoIG5ld0NvbnRleHQgJiYgKGVsZW0gPSBuZXdDb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICkpICYmCgkJCQkJCQljb250YWlucyggY29udGV4dCwgZWxlbSApICYmCgkJCQkJCQllbGVtLmlkID09PSBtICkgewoKCQkJCQkJCXJlc3VsdHMucHVzaCggZWxlbSApOwoJCQkJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCQkJCX0KCQkJCQl9CgoJCQkJLy8gVHlwZSBzZWxlY3RvcgoJCQkJfSBlbHNlIGlmICggbWF0Y2hbMl0gKSB7CgkJCQkJcHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggc2VsZWN0b3IgKSApOwoJCQkJCXJldHVybiByZXN1bHRzOwoKCQkJCS8vIENsYXNzIHNlbGVjdG9yCgkJCQl9IGVsc2UgaWYgKCAobSA9IG1hdGNoWzNdKSAmJiBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiYKCQkJCQljb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKSB7CgoJCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggbSApICk7CgkJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCQl9CgkJCX0KCgkJCS8vIFRha2UgYWR2YW50YWdlIG9mIHF1ZXJ5U2VsZWN0b3JBbGwKCQkJaWYgKCBzdXBwb3J0LnFzYSAmJgoJCQkJIWNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgIiAiIF0gJiYKCQkJCSghcmJ1Z2d5UVNBIHx8ICFyYnVnZ3lRU0EudGVzdCggc2VsZWN0b3IgKSkgKSB7CgoJCQkJaWYgKCBub2RlVHlwZSAhPT0gMSApIHsKCQkJCQluZXdDb250ZXh0ID0gY29udGV4dDsKCQkJCQluZXdTZWxlY3RvciA9IHNlbGVjdG9yOwoKCQkJCS8vIHFTQSBsb29rcyBvdXRzaWRlIEVsZW1lbnQgY29udGV4dCwgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudAoJCQkJLy8gVGhhbmtzIHRvIEFuZHJldyBEdXBvbnQgZm9yIHRoaXMgd29ya2Fyb3VuZCB0ZWNobmlxdWUKCQkJCS8vIFN1cHBvcnQ6IElFIDw9OAoJCQkJLy8gRXhjbHVkZSBvYmplY3QgZWxlbWVudHMKCQkJCX0gZWxzZSBpZiAoIGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gIm9iamVjdCIgKSB7CgoJCQkJCS8vIENhcHR1cmUgdGhlIGNvbnRleHQgSUQsIHNldHRpbmcgaXQgZmlyc3QgaWYgbmVjZXNzYXJ5CgkJCQkJaWYgKCAobmlkID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoICJpZCIgKSkgKSB7CgkJCQkJCW5pZCA9IG5pZC5yZXBsYWNlKCByY3NzZXNjYXBlLCBmY3NzZXNjYXBlICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJY29udGV4dC5zZXRBdHRyaWJ1dGUoICJpZCIsIChuaWQgPSBleHBhbmRvKSApOwoJCQkJCX0KCgkJCQkJLy8gUHJlZml4IGV2ZXJ5IHNlbGVjdG9yIGluIHRoZSBsaXN0CgkJCQkJZ3JvdXBzID0gdG9rZW5pemUoIHNlbGVjdG9yICk7CgkJCQkJaSA9IGdyb3Vwcy5sZW5ndGg7CgkJCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQkJCWdyb3Vwc1tpXSA9ICIjIiArIG5pZCArICIgIiArIHRvU2VsZWN0b3IoIGdyb3Vwc1tpXSApOwoJCQkJCX0KCQkJCQluZXdTZWxlY3RvciA9IGdyb3Vwcy5qb2luKCAiLCIgKTsKCgkJCQkJLy8gRXhwYW5kIGNvbnRleHQgZm9yIHNpYmxpbmcgc2VsZWN0b3JzCgkJCQkJbmV3Q29udGV4dCA9IHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8CgkJCQkJCWNvbnRleHQ7CgkJCQl9CgoJCQkJaWYgKCBuZXdTZWxlY3RvciApIHsKCQkJCQl0cnkgewoJCQkJCQlwdXNoLmFwcGx5KCByZXN1bHRzLAoJCQkJCQkJbmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCBuZXdTZWxlY3RvciApCgkJCQkJCSk7CgkJCQkJCXJldHVybiByZXN1bHRzOwoJCQkJCX0gY2F0Y2ggKCBxc2FFcnJvciApIHsKCQkJCQl9IGZpbmFsbHkgewoJCQkJCQlpZiAoIG5pZCA9PT0gZXhwYW5kbyApIHsKCQkJCQkJCWNvbnRleHQucmVtb3ZlQXR0cmlidXRlKCAiaWQiICk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQl9Cgl9CgoJLy8gQWxsIG90aGVycwoJcmV0dXJuIHNlbGVjdCggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sICIkMSIgKSwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApOwp9CgovKioKICogQ3JlYXRlIGtleS12YWx1ZSBjYWNoZXMgb2YgbGltaXRlZCBzaXplCiAqIEByZXR1cm5zIHtmdW5jdGlvbihzdHJpbmcsIG9iamVjdCl9IFJldHVybnMgdGhlIE9iamVjdCBkYXRhIGFmdGVyIHN0b3JpbmcgaXQgb24gaXRzZWxmIHdpdGgKICoJcHJvcGVydHkgbmFtZSB0aGUgKHNwYWNlLXN1ZmZpeGVkKSBzdHJpbmcgYW5kIChpZiB0aGUgY2FjaGUgaXMgbGFyZ2VyIHRoYW4gRXhwci5jYWNoZUxlbmd0aCkKICoJZGVsZXRpbmcgdGhlIG9sZGVzdCBlbnRyeQogKi8KZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKSB7Cgl2YXIga2V5cyA9IFtdOwoKCWZ1bmN0aW9uIGNhY2hlKCBrZXksIHZhbHVlICkgewoJCS8vIFVzZSAoa2V5ICsgIiAiKSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUgcHJvdG90eXBlIHByb3BlcnRpZXMgKHNlZSBJc3N1ZSAjMTU3KQoJCWlmICgga2V5cy5wdXNoKCBrZXkgKyAiICIgKSA+IEV4cHIuY2FjaGVMZW5ndGggKSB7CgkJCS8vIE9ubHkga2VlcCB0aGUgbW9zdCByZWNlbnQgZW50cmllcwoJCQlkZWxldGUgY2FjaGVbIGtleXMuc2hpZnQoKSBdOwoJCX0KCQlyZXR1cm4gKGNhY2hlWyBrZXkgKyAiICIgXSA9IHZhbHVlKTsKCX0KCXJldHVybiBjYWNoZTsKfQoKLyoqCiAqIE1hcmsgYSBmdW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlCiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBtYXJrCiAqLwpmdW5jdGlvbiBtYXJrRnVuY3Rpb24oIGZuICkgewoJZm5bIGV4cGFuZG8gXSA9IHRydWU7CglyZXR1cm4gZm47Cn0KCi8qKgogKiBTdXBwb3J0IHRlc3RpbmcgdXNpbmcgYW4gZWxlbWVudAogKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQgZWxlbWVudCBhbmQgcmV0dXJucyBhIGJvb2xlYW4gcmVzdWx0CiAqLwpmdW5jdGlvbiBhc3NlcnQoIGZuICkgewoJdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKTsKCgl0cnkgewoJCXJldHVybiAhIWZuKCBlbCApOwoJfSBjYXRjaCAoZSkgewoJCXJldHVybiBmYWxzZTsKCX0gZmluYWxseSB7CgkJLy8gUmVtb3ZlIGZyb20gaXRzIHBhcmVudCBieSBkZWZhdWx0CgkJaWYgKCBlbC5wYXJlbnROb2RlICkgewoJCQllbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbCApOwoJCX0KCQkvLyByZWxlYXNlIG1lbW9yeSBpbiBJRQoJCWVsID0gbnVsbDsKCX0KfQoKLyoqCiAqIEFkZHMgdGhlIHNhbWUgaGFuZGxlciBmb3IgYWxsIG9mIHRoZSBzcGVjaWZpZWQgYXR0cnMKICogQHBhcmFtIHtTdHJpbmd9IGF0dHJzIFBpcGUtc2VwYXJhdGVkIGxpc3Qgb2YgYXR0cmlidXRlcwogKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyIFRoZSBtZXRob2QgdGhhdCB3aWxsIGJlIGFwcGxpZWQKICovCmZ1bmN0aW9uIGFkZEhhbmRsZSggYXR0cnMsIGhhbmRsZXIgKSB7Cgl2YXIgYXJyID0gYXR0cnMuc3BsaXQoInwiKSwKCQlpID0gYXJyLmxlbmd0aDsKCgl3aGlsZSAoIGktLSApIHsKCQlFeHByLmF0dHJIYW5kbGVbIGFycltpXSBdID0gaGFuZGxlcjsKCX0KfQoKLyoqCiAqIENoZWNrcyBkb2N1bWVudCBvcmRlciBvZiB0d28gc2libGluZ3MKICogQHBhcmFtIHtFbGVtZW50fSBhCiAqIEBwYXJhbSB7RWxlbWVudH0gYgogKiBAcmV0dXJucyB7TnVtYmVyfSBSZXR1cm5zIGxlc3MgdGhhbiAwIGlmIGEgcHJlY2VkZXMgYiwgZ3JlYXRlciB0aGFuIDAgaWYgYSBmb2xsb3dzIGIKICovCmZ1bmN0aW9uIHNpYmxpbmdDaGVjayggYSwgYiApIHsKCXZhciBjdXIgPSBiICYmIGEsCgkJZGlmZiA9IGN1ciAmJiBhLm5vZGVUeXBlID09PSAxICYmIGIubm9kZVR5cGUgPT09IDEgJiYKCQkJYS5zb3VyY2VJbmRleCAtIGIuc291cmNlSW5kZXg7CgoJLy8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzCglpZiAoIGRpZmYgKSB7CgkJcmV0dXJuIGRpZmY7Cgl9CgoJLy8gQ2hlY2sgaWYgYiBmb2xsb3dzIGEKCWlmICggY3VyICkgewoJCXdoaWxlICggKGN1ciA9IGN1ci5uZXh0U2libGluZykgKSB7CgkJCWlmICggY3VyID09PSBiICkgewoJCQkJcmV0dXJuIC0xOwoJCQl9CgkJfQoJfQoKCXJldHVybiBhID8gMSA6IC0xOwp9CgovKioKICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBpbnB1dCB0eXBlcwogKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogKi8KZnVuY3Rpb24gY3JlYXRlSW5wdXRQc2V1ZG8oIHR5cGUgKSB7CglyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJcmV0dXJuIG5hbWUgPT09ICJpbnB1dCIgJiYgZWxlbS50eXBlID09PSB0eXBlOwoJfTsKfQoKLyoqCiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgYnV0dG9ucwogKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogKi8KZnVuY3Rpb24gY3JlYXRlQnV0dG9uUHNldWRvKCB0eXBlICkgewoJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCXZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwoJCXJldHVybiAobmFtZSA9PT0gImlucHV0IiB8fCBuYW1lID09PSAiYnV0dG9uIikgJiYgZWxlbS50eXBlID09PSB0eXBlOwoJfTsKfQoKLyoqCiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgOmVuYWJsZWQvOmRpc2FibGVkCiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGlzYWJsZWQgdHJ1ZSBmb3IgOmRpc2FibGVkOyBmYWxzZSBmb3IgOmVuYWJsZWQKICovCmZ1bmN0aW9uIGNyZWF0ZURpc2FibGVkUHNldWRvKCBkaXNhYmxlZCApIHsKCgkvLyBLbm93biA6ZGlzYWJsZWQgZmFsc2UgcG9zaXRpdmVzOiBmaWVsZHNldFtkaXNhYmxlZF0gPiBsZWdlbmQ6bnRoLW9mLXR5cGUobisyKSA6Y2FuLWRpc2FibGUKCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKCgkJLy8gT25seSBjZXJ0YWluIGVsZW1lbnRzIGNhbiBtYXRjaCA6ZW5hYmxlZCBvciA6ZGlzYWJsZWQKCQkvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zY3JpcHRpbmcuaHRtbCNzZWxlY3Rvci1lbmFibGVkCgkJLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2NyaXB0aW5nLmh0bWwjc2VsZWN0b3ItZGlzYWJsZWQKCQlpZiAoICJmb3JtIiBpbiBlbGVtICkgewoKCQkJLy8gQ2hlY2sgZm9yIGluaGVyaXRlZCBkaXNhYmxlZG5lc3Mgb24gcmVsZXZhbnQgbm9uLWRpc2FibGVkIGVsZW1lbnRzOgoJCQkvLyAqIGxpc3RlZCBmb3JtLWFzc29jaWF0ZWQgZWxlbWVudHMgaW4gYSBkaXNhYmxlZCBmaWVsZHNldAoJCQkvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY2F0ZWdvcnktbGlzdGVkCgkJCS8vICAgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNjb25jZXB0LWZlLWRpc2FibGVkCgkJCS8vICogb3B0aW9uIGVsZW1lbnRzIGluIGEgZGlzYWJsZWQgb3B0Z3JvdXAKCQkJLy8gICBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI2NvbmNlcHQtb3B0aW9uLWRpc2FibGVkCgkJCS8vIEFsbCBzdWNoIGVsZW1lbnRzIGhhdmUgYSAiZm9ybSIgcHJvcGVydHkuCgkJCWlmICggZWxlbS5wYXJlbnROb2RlICYmIGVsZW0uZGlzYWJsZWQgPT09IGZhbHNlICkgewoKCQkJCS8vIE9wdGlvbiBlbGVtZW50cyBkZWZlciB0byBhIHBhcmVudCBvcHRncm91cCBpZiBwcmVzZW50CgkJCQlpZiAoICJsYWJlbCIgaW4gZWxlbSApIHsKCQkJCQlpZiAoICJsYWJlbCIgaW4gZWxlbS5wYXJlbnROb2RlICkgewoJCQkJCQlyZXR1cm4gZWxlbS5wYXJlbnROb2RlLmRpc2FibGVkID09PSBkaXNhYmxlZDsKCQkJCQl9IGVsc2UgewoJCQkJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIFN1cHBvcnQ6IElFIDYgLSAxMQoJCQkJLy8gVXNlIHRoZSBpc0Rpc2FibGVkIHNob3J0Y3V0IHByb3BlcnR5IHRvIGNoZWNrIGZvciBkaXNhYmxlZCBmaWVsZHNldCBhbmNlc3RvcnMKCQkJCXJldHVybiBlbGVtLmlzRGlzYWJsZWQgPT09IGRpc2FibGVkIHx8CgoJCQkJCS8vIFdoZXJlIHRoZXJlIGlzIG5vIGlzRGlzYWJsZWQsIGNoZWNrIG1hbnVhbGx5CgkJCQkJLyoganNoaW50IC1XMDE4ICovCgkJCQkJZWxlbS5pc0Rpc2FibGVkICE9PSAhZGlzYWJsZWQgJiYKCQkJCQkJZGlzYWJsZWRBbmNlc3RvciggZWxlbSApID09PSBkaXNhYmxlZDsKCQkJfQoKCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IGRpc2FibGVkOwoKCQkvLyBUcnkgdG8gd2lubm93IG91dCBlbGVtZW50cyB0aGF0IGNhbid0IGJlIGRpc2FibGVkIGJlZm9yZSB0cnVzdGluZyB0aGUgZGlzYWJsZWQgcHJvcGVydHkuCgkJLy8gU29tZSB2aWN0aW1zIGdldCBjYXVnaHQgaW4gb3VyIG5ldCAobGFiZWwsIGxlZ2VuZCwgbWVudSwgdHJhY2spLCBidXQgaXQgc2hvdWxkbid0CgkJLy8gZXZlbiBleGlzdCBvbiB0aGVtLCBsZXQgYWxvbmUgaGF2ZSBhIGJvb2xlYW4gdmFsdWUuCgkJfSBlbHNlIGlmICggImxhYmVsIiBpbiBlbGVtICkgewoJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7CgkJfQoKCQkvLyBSZW1haW5pbmcgZWxlbWVudHMgYXJlIG5laXRoZXIgOmVuYWJsZWQgbm9yIDpkaXNhYmxlZAoJCXJldHVybiBmYWxzZTsKCX07Cn0KCi8qKgogKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIHBvc2l0aW9uYWxzCiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuCiAqLwpmdW5jdGlvbiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmbiApIHsKCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIGFyZ3VtZW50ICkgewoJCWFyZ3VtZW50ID0gK2FyZ3VtZW50OwoJCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7CgkJCXZhciBqLAoJCQkJbWF0Y2hJbmRleGVzID0gZm4oIFtdLCBzZWVkLmxlbmd0aCwgYXJndW1lbnQgKSwKCQkJCWkgPSBtYXRjaEluZGV4ZXMubGVuZ3RoOwoKCQkJLy8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzCgkJCXdoaWxlICggaS0tICkgewoJCQkJaWYgKCBzZWVkWyAoaiA9IG1hdGNoSW5kZXhlc1tpXSkgXSApIHsKCQkJCQlzZWVkW2pdID0gIShtYXRjaGVzW2pdID0gc2VlZFtqXSk7CgkJCQl9CgkJCX0KCQl9KTsKCX0pOwp9CgovKioKICogQ2hlY2tzIGEgbm9kZSBmb3IgdmFsaWRpdHkgYXMgYSBTaXp6bGUgY29udGV4dAogKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0PX0gY29udGV4dAogKiBAcmV0dXJucyB7RWxlbWVudHxPYmplY3R8Qm9vbGVhbn0gVGhlIGlucHV0IG5vZGUgaWYgYWNjZXB0YWJsZSwgb3RoZXJ3aXNlIGEgZmFsc3kgdmFsdWUKICovCmZ1bmN0aW9uIHRlc3RDb250ZXh0KCBjb250ZXh0ICkgewoJcmV0dXJuIGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICYmIGNvbnRleHQ7Cn0KCi8vIEV4cG9zZSBzdXBwb3J0IHZhcnMgZm9yIGNvbnZlbmllbmNlCnN1cHBvcnQgPSBTaXp6bGUuc3VwcG9ydCA9IHt9OwoKLyoqCiAqIERldGVjdHMgWE1MIG5vZGVzCiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IGVsZW0gQW4gZWxlbWVudCBvciBhIGRvY3VtZW50CiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmZiBlbGVtIGlzIGEgbm9uLUhUTUwgWE1MIG5vZGUKICovCmlzWE1MID0gU2l6emxlLmlzWE1MID0gZnVuY3Rpb24oIGVsZW0gKSB7CgkvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0CgkvLyAoc3VjaCBhcyBsb2FkaW5nIGlmcmFtZXMgaW4gSUUgLSAjNDgzMykKCXZhciBkb2N1bWVudEVsZW1lbnQgPSBlbGVtICYmIChlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSkuZG9jdW1lbnRFbGVtZW50OwoJcmV0dXJuIGRvY3VtZW50RWxlbWVudCA/IGRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIDogZmFsc2U7Cn07CgovKioKICogU2V0cyBkb2N1bWVudC1yZWxhdGVkIHZhcmlhYmxlcyBvbmNlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRvY3VtZW50CiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IFtkb2NdIEFuIGVsZW1lbnQgb3IgZG9jdW1lbnQgb2JqZWN0IHRvIHVzZSB0byBzZXQgdGhlIGRvY3VtZW50CiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGN1cnJlbnQgZG9jdW1lbnQKICovCnNldERvY3VtZW50ID0gU2l6emxlLnNldERvY3VtZW50ID0gZnVuY3Rpb24oIG5vZGUgKSB7Cgl2YXIgaGFzQ29tcGFyZSwgc3ViV2luZG93LAoJCWRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYzsKCgkvLyBSZXR1cm4gZWFybHkgaWYgZG9jIGlzIGludmFsaWQgb3IgYWxyZWFkeSBzZWxlY3RlZAoJaWYgKCBkb2MgPT09IGRvY3VtZW50IHx8IGRvYy5ub2RlVHlwZSAhPT0gOSB8fCAhZG9jLmRvY3VtZW50RWxlbWVudCApIHsKCQlyZXR1cm4gZG9jdW1lbnQ7Cgl9CgoJLy8gVXBkYXRlIGdsb2JhbCB2YXJpYWJsZXMKCWRvY3VtZW50ID0gZG9jOwoJZG9jRWxlbSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCWRvY3VtZW50SXNIVE1MID0gIWlzWE1MKCBkb2N1bWVudCApOwoKCS8vIFN1cHBvcnQ6IElFIDktMTEsIEVkZ2UKCS8vIEFjY2Vzc2luZyBpZnJhbWUgZG9jdW1lbnRzIGFmdGVyIHVubG9hZCB0aHJvd3MgInBlcm1pc3Npb24gZGVuaWVkIiBlcnJvcnMgKGpRdWVyeSAjMTM5MzYpCglpZiAoIHByZWZlcnJlZERvYyAhPT0gZG9jdW1lbnQgJiYKCQkoc3ViV2luZG93ID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcpICYmIHN1YldpbmRvdy50b3AgIT09IHN1YldpbmRvdyApIHsKCgkJLy8gU3VwcG9ydDogSUUgMTEsIEVkZ2UKCQlpZiAoIHN1YldpbmRvdy5hZGRFdmVudExpc3RlbmVyICkgewoJCQlzdWJXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggInVubG9hZCIsIHVubG9hZEhhbmRsZXIsIGZhbHNlICk7CgoJCS8vIFN1cHBvcnQ6IElFIDkgLSAxMCBvbmx5CgkJfSBlbHNlIGlmICggc3ViV2luZG93LmF0dGFjaEV2ZW50ICkgewoJCQlzdWJXaW5kb3cuYXR0YWNoRXZlbnQoICJvbnVubG9hZCIsIHVubG9hZEhhbmRsZXIgKTsKCQl9Cgl9CgoJLyogQXR0cmlidXRlcwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8vIFN1cHBvcnQ6IElFPDgKCS8vIFZlcmlmeSB0aGF0IGdldEF0dHJpYnV0ZSByZWFsbHkgcmV0dXJucyBhdHRyaWJ1dGVzIGFuZCBub3QgcHJvcGVydGllcwoJLy8gKGV4Y2VwdGluZyBJRTggYm9vbGVhbnMpCglzdXBwb3J0LmF0dHJpYnV0ZXMgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJCWVsLmNsYXNzTmFtZSA9ICJpIjsKCQlyZXR1cm4gIWVsLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIik7Cgl9KTsKCgkvKiBnZXRFbGVtZW50KHMpQnkqCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLy8gQ2hlY2sgaWYgZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSByZXR1cm5zIG9ubHkgZWxlbWVudHMKCXN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJCWVsLmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVDb21tZW50KCIiKSApOwoJCXJldHVybiAhZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGg7Cgl9KTsKCgkvLyBTdXBwb3J0OiBJRTw5CglzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBybmF0aXZlLnRlc3QoIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKTsKCgkvLyBTdXBwb3J0OiBJRTwxMAoJLy8gQ2hlY2sgaWYgZ2V0RWxlbWVudEJ5SWQgcmV0dXJucyBlbGVtZW50cyBieSBuYW1lCgkvLyBUaGUgYnJva2VuIGdldEVsZW1lbnRCeUlkIG1ldGhvZHMgZG9uJ3QgcGljayB1cCBwcm9ncmFtbWF0aWNhbGx5LXNldCBuYW1lcywKCS8vIHNvIHVzZSBhIHJvdW5kYWJvdXQgZ2V0RWxlbWVudHNCeU5hbWUgdGVzdAoJc3VwcG9ydC5nZXRCeUlkID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHsKCQlkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmlkID0gZXhwYW5kbzsKCQlyZXR1cm4gIWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lIHx8ICFkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSggZXhwYW5kbyApLmxlbmd0aDsKCX0pOwoKCS8vIElEIGZpbHRlciBhbmQgZmluZAoJaWYgKCBzdXBwb3J0LmdldEJ5SWQgKSB7CgkJRXhwci5maWx0ZXJbIklEIl0gPSBmdW5jdGlvbiggaWQgKSB7CgkJCXZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOwoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoImlkIikgPT09IGF0dHJJZDsKCQkJfTsKCQl9OwoJCUV4cHIuZmluZFsiSUQiXSA9IGZ1bmN0aW9uKCBpZCwgY29udGV4dCApIHsKCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7CgkJCQl2YXIgZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIGlkICk7CgkJCQlyZXR1cm4gZWxlbSA/IFsgZWxlbSBdIDogW107CgkJCX0KCQl9OwoJfSBlbHNlIHsKCQlFeHByLmZpbHRlclsiSUQiXSA9ICBmdW5jdGlvbiggaWQgKSB7CgkJCXZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOwoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09ICJ1bmRlZmluZWQiICYmCgkJCQkJZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpOwoJCQkJcmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gYXR0cklkOwoJCQl9OwoJCX07CgoJCS8vIFN1cHBvcnQ6IElFIDYgLSA3IG9ubHkKCQkvLyBnZXRFbGVtZW50QnlJZCBpcyBub3QgcmVsaWFibGUgYXMgYSBmaW5kIHNob3J0Y3V0CgkJRXhwci5maW5kWyJJRCJdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkgewoJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudElzSFRNTCApIHsKCQkJCXZhciBub2RlLCBpLCBlbGVtcywKCQkJCQllbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTsKCgkJCQlpZiAoIGVsZW0gKSB7CgoJCQkJCS8vIFZlcmlmeSB0aGUgaWQgYXR0cmlidXRlCgkJCQkJbm9kZSA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTsKCQkJCQlpZiAoIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gaWQgKSB7CgkJCQkJCXJldHVybiBbIGVsZW0gXTsKCQkJCQl9CgoJCQkJCS8vIEZhbGwgYmFjayBvbiBnZXRFbGVtZW50c0J5TmFtZQoJCQkJCWVsZW1zID0gY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZSggaWQgKTsKCQkJCQlpID0gMDsKCQkJCQl3aGlsZSAoIChlbGVtID0gZWxlbXNbaSsrXSkgKSB7CgkJCQkJCW5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7CgkJCQkJCWlmICggbm9kZSAmJiBub2RlLnZhbHVlID09PSBpZCApIHsKCQkJCQkJCXJldHVybiBbIGVsZW0gXTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gW107CgkJCX0KCQl9OwoJfQoKCS8vIFRhZwoJRXhwci5maW5kWyJUQUciXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPwoJCWZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7CgkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICkgewoJCQkJcmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApOwoKCQkJLy8gRG9jdW1lbnRGcmFnbWVudCBub2RlcyBkb24ndCBoYXZlIGdFQlROCgkJCX0gZWxzZSBpZiAoIHN1cHBvcnQucXNhICkgewoJCQkJcmV0dXJuIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnICk7CgkJCX0KCQl9IDoKCgkJZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHsKCQkJdmFyIGVsZW0sCgkJCQl0bXAgPSBbXSwKCQkJCWkgPSAwLAoJCQkJLy8gQnkgaGFwcHkgY29pbmNpZGVuY2UsIGEgKGJyb2tlbikgZ0VCVE4gYXBwZWFycyBvbiBEb2N1bWVudEZyYWdtZW50IG5vZGVzIHRvbwoJCQkJcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApOwoKCQkJLy8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50cwoJCQlpZiAoIHRhZyA9PT0gIioiICkgewoJCQkJd2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7CgkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQl0bXAucHVzaCggZWxlbSApOwoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gdG1wOwoJCQl9CgkJCXJldHVybiByZXN1bHRzOwoJCX07CgoJLy8gQ2xhc3MKCUV4cHIuZmluZFsiQ0xBU1MiXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJiBmdW5jdGlvbiggY2xhc3NOYW1lLCBjb250ZXh0ICkgewoJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7CgkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIGNsYXNzTmFtZSApOwoJCX0KCX07CgoJLyogUVNBL21hdGNoZXNTZWxlY3RvcgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8vIFFTQSBhbmQgbWF0Y2hlc1NlbGVjdG9yIHN1cHBvcnQKCgkvLyBtYXRjaGVzU2VsZWN0b3IoOmFjdGl2ZSkgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKElFOS9PcGVyYSAxMS41KQoJcmJ1Z2d5TWF0Y2hlcyA9IFtdOwoKCS8vIHFTYSg6Zm9jdXMpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChDaHJvbWUgMjEpCgkvLyBXZSBhbGxvdyB0aGlzIGJlY2F1c2Ugb2YgYSBidWcgaW4gSUU4LzkgdGhhdCB0aHJvd3MgYW4gZXJyb3IKCS8vIHdoZW5ldmVyIGBkb2N1bWVudC5hY3RpdmVFbGVtZW50YCBpcyBhY2Nlc3NlZCBvbiBhbiBpZnJhbWUKCS8vIFNvLCB3ZSBhbGxvdyA6Zm9jdXMgdG8gcGFzcyB0aHJvdWdoIFFTQSBhbGwgdGhlIHRpbWUgdG8gYXZvaWQgdGhlIElFIGVycm9yCgkvLyBTZWUgaHR0cHM6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEzMzc4CglyYnVnZ3lRU0EgPSBbXTsKCglpZiAoIChzdXBwb3J0LnFzYSA9IHJuYXRpdmUudGVzdCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCApKSApIHsKCQkvLyBCdWlsZCBRU0EgcmVnZXgKCQkvLyBSZWdleCBzdHJhdGVneSBhZG9wdGVkIGZyb20gRGllZ28gUGVyaW5pCgkJYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHsKCQkJLy8gU2VsZWN0IGlzIHNldCB0byBlbXB0eSBzdHJpbmcgb24gcHVycG9zZQoJCQkvLyBUaGlzIGlzIHRvIHRlc3QgSUUncyB0cmVhdG1lbnQgb2Ygbm90IGV4cGxpY2l0bHkKCQkJLy8gc2V0dGluZyBhIGJvb2xlYW4gY29udGVudCBhdHRyaWJ1dGUsCgkJCS8vIHNpbmNlIGl0cyBwcmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoCgkJCS8vIGh0dHBzOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMjM1OQoJCQlkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmlubmVySFRNTCA9ICI8YSBpZD0nIiArIGV4cGFuZG8gKyAiJz48L2E+IiArCgkJCQkiPHNlbGVjdCBpZD0nIiArIGV4cGFuZG8gKyAiLVxyXFwnIG1zYWxsb3djYXB0dXJlPScnPiIgKwoJCQkJIjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+IjsKCgkJCS8vIFN1cHBvcnQ6IElFOCwgT3BlcmEgMTEtMTIuMTYKCQkJLy8gTm90aGluZyBzaG91bGQgYmUgc2VsZWN0ZWQgd2hlbiBlbXB0eSBzdHJpbmdzIGZvbGxvdyBePSBvciAkPSBvciAqPQoJCQkvLyBUaGUgdGVzdCBhdHRyaWJ1dGUgbXVzdCBiZSB1bmtub3duIGluIE9wZXJhIGJ1dCAic2FmZSIgZm9yIFdpblJUCgkJCS8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvaGg0NjUzODguYXNweCNhdHRyaWJ1dGVfc2VjdGlvbgoJCQlpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIlttc2FsbG93Y2FwdHVyZV49JyddIikubGVuZ3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICJbKl4kXT0iICsgd2hpdGVzcGFjZSArICIqKD86Jyd8XCJcIikiICk7CgkJCX0KCgkJCS8vIFN1cHBvcnQ6IElFOAoJCQkvLyBCb29sZWFuIGF0dHJpYnV0ZXMgYW5kICJ2YWx1ZSIgYXJlIG5vdCB0cmVhdGVkIGNvcnJlY3RseQoJCQlpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCJbc2VsZWN0ZWRdIikubGVuZ3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICJcXFsiICsgd2hpdGVzcGFjZSArICIqKD86dmFsdWV8IiArIGJvb2xlYW5zICsgIikiICk7CgkJCX0KCgkJCS8vIFN1cHBvcnQ6IENocm9tZTwyOSwgQW5kcm9pZDw0LjQsIFNhZmFyaTw3LjArLCBpT1M8Ny4wKywgUGhhbnRvbUpTPDEuOS44KwoJCQlpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCAiW2lkfj0iICsgZXhwYW5kbyArICItXSIgKS5sZW5ndGggKSB7CgkJCQlyYnVnZ3lRU0EucHVzaCgifj0iKTsKCQkJfQoKCQkJLy8gV2Via2l0L09wZXJhIC0gOmNoZWNrZWQgc2hvdWxkIHJldHVybiBzZWxlY3RlZCBvcHRpb24gZWxlbWVudHMKCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWQKCQkJLy8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHMKCQkJaWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGggKSB7CgkJCQlyYnVnZ3lRU0EucHVzaCgiOmNoZWNrZWQiKTsKCQkJfQoKCQkJLy8gU3VwcG9ydDogU2FmYXJpIDgrLCBpT1MgOCsKCQkJLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNjg1MQoJCQkvLyBJbi1wYWdlIGBzZWxlY3RvciNpZCBzaWJsaW5nLWNvbWJpbmF0b3Igc2VsZWN0b3JgIGZhaWxzCgkJCWlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoICJhIyIgKyBleHBhbmRvICsgIisqIiApLmxlbmd0aCApIHsKCQkJCXJidWdneVFTQS5wdXNoKCIuIy4rWyt+XSIpOwoJCQl9CgkJfSk7CgoJCWFzc2VydChmdW5jdGlvbiggZWwgKSB7CgkJCWVsLmlubmVySFRNTCA9ICI8YSBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPiIgKwoJCQkJIjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD4iOwoKCQkJLy8gU3VwcG9ydDogV2luZG93cyA4IE5hdGl2ZSBBcHBzCgkJCS8vIFRoZSB0eXBlIGFuZCBuYW1lIGF0dHJpYnV0ZXMgYXJlIHJlc3RyaWN0ZWQgZHVyaW5nIC5pbm5lckhUTUwgYXNzaWdubWVudAoJCQl2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwoJCQlpbnB1dC5zZXRBdHRyaWJ1dGUoICJ0eXBlIiwgImhpZGRlbiIgKTsKCQkJZWwuYXBwZW5kQ2hpbGQoIGlucHV0ICkuc2V0QXR0cmlidXRlKCAibmFtZSIsICJEIiApOwoKCQkJLy8gU3VwcG9ydDogSUU4CgkJCS8vIEVuZm9yY2UgY2FzZS1zZW5zaXRpdml0eSBvZiBuYW1lIGF0dHJpYnV0ZQoJCQlpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPWRdIikubGVuZ3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICJuYW1lIiArIHdoaXRlc3BhY2UgKyAiKlsqXiR8IX5dPz0iICk7CgkJCX0KCgkJCS8vIEZGIDMuNSAtIDplbmFibGVkLzpkaXNhYmxlZCBhbmQgaGlkZGVuIGVsZW1lbnRzIChoaWRkZW4gZWxlbWVudHMgYXJlIHN0aWxsIGVuYWJsZWQpCgkJCS8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzCgkJCWlmICggZWwucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGggIT09IDIgKSB7CgkJCQlyYnVnZ3lRU0EucHVzaCggIjplbmFibGVkIiwgIjpkaXNhYmxlZCIgKTsKCQkJfQoKCQkJLy8gU3VwcG9ydDogSUU5LTExKwoJCQkvLyBJRSdzIDpkaXNhYmxlZCBzZWxlY3RvciBkb2VzIG5vdCBwaWNrIHVwIHRoZSBjaGlsZHJlbiBvZiBkaXNhYmxlZCBmaWVsZHNldHMKCQkJZG9jRWxlbS5hcHBlbmRDaGlsZCggZWwgKS5kaXNhYmxlZCA9IHRydWU7CgkJCWlmICggZWwucXVlcnlTZWxlY3RvckFsbCgiOmRpc2FibGVkIikubGVuZ3RoICE9PSAyICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICI6ZW5hYmxlZCIsICI6ZGlzYWJsZWQiICk7CgkJCX0KCgkJCS8vIE9wZXJhIDEwLTExIGRvZXMgbm90IHRocm93IG9uIHBvc3QtY29tbWEgaW52YWxpZCBwc2V1ZG9zCgkJCWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKTsKCQkJcmJ1Z2d5UVNBLnB1c2goIiwuKjoiKTsKCQl9KTsKCX0KCglpZiAoIChzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciA9IHJuYXRpdmUudGVzdCggKG1hdGNoZXMgPSBkb2NFbGVtLm1hdGNoZXMgfHwKCQlkb2NFbGVtLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fAoJCWRvY0VsZW0ubW96TWF0Y2hlc1NlbGVjdG9yIHx8CgkJZG9jRWxlbS5vTWF0Y2hlc1NlbGVjdG9yIHx8CgkJZG9jRWxlbS5tc01hdGNoZXNTZWxlY3RvcikgKSkgKSB7CgoJCWFzc2VydChmdW5jdGlvbiggZWwgKSB7CgkJCS8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRvIG1hdGNoZXNTZWxlY3RvcgoJCQkvLyBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlIChJRSA5KQoJCQlzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoID0gbWF0Y2hlcy5jYWxsKCBlbCwgIioiICk7CgoJCQkvLyBUaGlzIHNob3VsZCBmYWlsIHdpdGggYW4gZXhjZXB0aW9uCgkJCS8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWQKCQkJbWF0Y2hlcy5jYWxsKCBlbCwgIltzIT0nJ106eCIgKTsKCQkJcmJ1Z2d5TWF0Y2hlcy5wdXNoKCAiIT0iLCBwc2V1ZG9zICk7CgkJfSk7Cgl9CgoJcmJ1Z2d5UVNBID0gcmJ1Z2d5UVNBLmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lRU0Euam9pbigifCIpICk7CglyYnVnZ3lNYXRjaGVzID0gcmJ1Z2d5TWF0Y2hlcy5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5TWF0Y2hlcy5qb2luKCJ8IikgKTsKCgkvKiBDb250YWlucwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJaGFzQ29tcGFyZSA9IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApOwoKCS8vIEVsZW1lbnQgY29udGFpbnMgYW5vdGhlcgoJLy8gUHVycG9zZWZ1bGx5IHNlbGYtZXhjbHVzaXZlCgkvLyBBcyBpbiwgYW4gZWxlbWVudCBkb2VzIG5vdCBjb250YWluIGl0c2VsZgoJY29udGFpbnMgPSBoYXNDb21wYXJlIHx8IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb250YWlucyApID8KCQlmdW5jdGlvbiggYSwgYiApIHsKCQkJdmFyIGFkb3duID0gYS5ub2RlVHlwZSA9PT0gOSA/IGEuZG9jdW1lbnRFbGVtZW50IDogYSwKCQkJCWJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlOwoJCQlyZXR1cm4gYSA9PT0gYnVwIHx8ICEhKCBidXAgJiYgYnVwLm5vZGVUeXBlID09PSAxICYmICgKCQkJCWFkb3duLmNvbnRhaW5zID8KCQkJCQlhZG93bi5jb250YWlucyggYnVwICkgOgoJCQkJCWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYnVwICkgJiAxNgoJCQkpKTsKCQl9IDoKCQlmdW5jdGlvbiggYSwgYiApIHsKCQkJaWYgKCBiICkgewoJCQkJd2hpbGUgKCAoYiA9IGIucGFyZW50Tm9kZSkgKSB7CgkJCQkJaWYgKCBiID09PSBhICkgewoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJcmV0dXJuIGZhbHNlOwoJCX07CgoJLyogU29ydGluZwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8vIERvY3VtZW50IG9yZGVyIHNvcnRpbmcKCXNvcnRPcmRlciA9IGhhc0NvbXBhcmUgPwoJZnVuY3Rpb24oIGEsIGIgKSB7CgoJCS8vIEZsYWcgZm9yIGR1cGxpY2F0ZSByZW1vdmFsCgkJaWYgKCBhID09PSBiICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCQlyZXR1cm4gMDsKCQl9CgoJCS8vIFNvcnQgb24gbWV0aG9kIGV4aXN0ZW5jZSBpZiBvbmx5IG9uZSBpbnB1dCBoYXMgY29tcGFyZURvY3VtZW50UG9zaXRpb24KCQl2YXIgY29tcGFyZSA9ICFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIC0gIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247CgkJaWYgKCBjb21wYXJlICkgewoJCQlyZXR1cm4gY29tcGFyZTsKCQl9CgoJCS8vIENhbGN1bGF0ZSBwb3NpdGlvbiBpZiBib3RoIGlucHV0cyBiZWxvbmcgdG8gdGhlIHNhbWUgZG9jdW1lbnQKCQljb21wYXJlID0gKCBhLm93bmVyRG9jdW1lbnQgfHwgYSApID09PSAoIGIub3duZXJEb2N1bWVudCB8fCBiICkgPwoJCQlhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBiICkgOgoKCQkJLy8gT3RoZXJ3aXNlIHdlIGtub3cgdGhleSBhcmUgZGlzY29ubmVjdGVkCgkJCTE7CgoJCS8vIERpc2Nvbm5lY3RlZCBub2RlcwoJCWlmICggY29tcGFyZSAmIDEgfHwKCQkJKCFzdXBwb3J0LnNvcnREZXRhY2hlZCAmJiBiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBhICkgPT09IGNvbXBhcmUpICkgewoKCQkJLy8gQ2hvb3NlIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgcmVsYXRlZCB0byBvdXIgcHJlZmVycmVkIGRvY3VtZW50CgkJCWlmICggYSA9PT0gZG9jdW1lbnQgfHwgYS5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBhKSApIHsKCQkJCXJldHVybiAtMTsKCQkJfQoJCQlpZiAoIGIgPT09IGRvY3VtZW50IHx8IGIub3duZXJEb2N1bWVudCA9PT0gcHJlZmVycmVkRG9jICYmIGNvbnRhaW5zKHByZWZlcnJlZERvYywgYikgKSB7CgkJCQlyZXR1cm4gMTsKCQkJfQoKCQkJLy8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXIKCQkJcmV0dXJuIHNvcnRJbnB1dCA/CgkJCQkoIGluZGV4T2YoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZiggc29ydElucHV0LCBiICkgKSA6CgkJCQkwOwoJCX0KCgkJcmV0dXJuIGNvbXBhcmUgJiA0ID8gLTEgOiAxOwoJfSA6CglmdW5jdGlvbiggYSwgYiApIHsKCQkvLyBFeGl0IGVhcmx5IGlmIHRoZSBub2RlcyBhcmUgaWRlbnRpY2FsCgkJaWYgKCBhID09PSBiICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCQlyZXR1cm4gMDsKCQl9CgoJCXZhciBjdXIsCgkJCWkgPSAwLAoJCQlhdXAgPSBhLnBhcmVudE5vZGUsCgkJCWJ1cCA9IGIucGFyZW50Tm9kZSwKCQkJYXAgPSBbIGEgXSwKCQkJYnAgPSBbIGIgXTsKCgkJLy8gUGFyZW50bGVzcyBub2RlcyBhcmUgZWl0aGVyIGRvY3VtZW50cyBvciBkaXNjb25uZWN0ZWQKCQlpZiAoICFhdXAgfHwgIWJ1cCApIHsKCQkJcmV0dXJuIGEgPT09IGRvY3VtZW50ID8gLTEgOgoJCQkJYiA9PT0gZG9jdW1lbnQgPyAxIDoKCQkJCWF1cCA/IC0xIDoKCQkJCWJ1cCA/IDEgOgoJCQkJc29ydElucHV0ID8KCQkJCSggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRleE9mKCBzb3J0SW5wdXQsIGIgKSApIDoKCQkJCTA7CgoJCS8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MsIHdlIGNhbiBkbyBhIHF1aWNrIGNoZWNrCgkJfSBlbHNlIGlmICggYXVwID09PSBidXAgKSB7CgkJCXJldHVybiBzaWJsaW5nQ2hlY2soIGEsIGIgKTsKCQl9CgoJCS8vIE90aGVyd2lzZSB3ZSBuZWVkIGZ1bGwgbGlzdHMgb2YgdGhlaXIgYW5jZXN0b3JzIGZvciBjb21wYXJpc29uCgkJY3VyID0gYTsKCQl3aGlsZSAoIChjdXIgPSBjdXIucGFyZW50Tm9kZSkgKSB7CgkJCWFwLnVuc2hpZnQoIGN1ciApOwoJCX0KCQljdXIgPSBiOwoJCXdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHsKCQkJYnAudW5zaGlmdCggY3VyICk7CgkJfQoKCQkvLyBXYWxrIGRvd24gdGhlIHRyZWUgbG9va2luZyBmb3IgYSBkaXNjcmVwYW5jeQoJCXdoaWxlICggYXBbaV0gPT09IGJwW2ldICkgewoJCQlpKys7CgkJfQoKCQlyZXR1cm4gaSA/CgkJCS8vIERvIGEgc2libGluZyBjaGVjayBpZiB0aGUgbm9kZXMgaGF2ZSBhIGNvbW1vbiBhbmNlc3RvcgoJCQlzaWJsaW5nQ2hlY2soIGFwW2ldLCBicFtpXSApIDoKCgkJCS8vIE90aGVyd2lzZSBub2RlcyBpbiBvdXIgZG9jdW1lbnQgc29ydCBmaXJzdAoJCQlhcFtpXSA9PT0gcHJlZmVycmVkRG9jID8gLTEgOgoJCQlicFtpXSA9PT0gcHJlZmVycmVkRG9jID8gMSA6CgkJCTA7Cgl9OwoKCXJldHVybiBkb2N1bWVudDsKfTsKClNpenpsZS5tYXRjaGVzID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1lbnRzICkgewoJcmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgZWxlbWVudHMgKTsKfTsKClNpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggZWxlbSwgZXhwciApIHsKCS8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZAoJaWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT09IGRvY3VtZW50ICkgewoJCXNldERvY3VtZW50KCBlbGVtICk7Cgl9CgoJLy8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkCglleHByID0gZXhwci5yZXBsYWNlKCByYXR0cmlidXRlUXVvdGVzLCAiPSckMSddIiApOwoKCWlmICggc3VwcG9ydC5tYXRjaGVzU2VsZWN0b3IgJiYgZG9jdW1lbnRJc0hUTUwgJiYKCQkhY29tcGlsZXJDYWNoZVsgZXhwciArICIgIiBdICYmCgkJKCAhcmJ1Z2d5TWF0Y2hlcyB8fCAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KCBleHByICkgKSAmJgoJCSggIXJidWdneVFTQSAgICAgfHwgIXJidWdneVFTQS50ZXN0KCBleHByICkgKSApIHsKCgkJdHJ5IHsKCQkJdmFyIHJldCA9IG1hdGNoZXMuY2FsbCggZWxlbSwgZXhwciApOwoKCQkJLy8gSUUgOSdzIG1hdGNoZXNTZWxlY3RvciByZXR1cm5zIGZhbHNlIG9uIGRpc2Nvbm5lY3RlZCBub2RlcwoJCQlpZiAoIHJldCB8fCBzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoIHx8CgkJCQkJLy8gQXMgd2VsbCwgZGlzY29ubmVjdGVkIG5vZGVzIGFyZSBzYWlkIHRvIGJlIGluIGEgZG9jdW1lbnQKCQkJCQkvLyBmcmFnbWVudCBpbiBJRSA5CgkJCQkJZWxlbS5kb2N1bWVudCAmJiBlbGVtLmRvY3VtZW50Lm5vZGVUeXBlICE9PSAxMSApIHsKCQkJCXJldHVybiByZXQ7CgkJCX0KCQl9IGNhdGNoIChlKSB7fQoJfQoKCXJldHVybiBTaXp6bGUoIGV4cHIsIGRvY3VtZW50LCBudWxsLCBbIGVsZW0gXSApLmxlbmd0aCA+IDA7Cn07CgpTaXp6bGUuY29udGFpbnMgPSBmdW5jdGlvbiggY29udGV4dCwgZWxlbSApIHsKCS8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZAoJaWYgKCAoIGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0ICkgIT09IGRvY3VtZW50ICkgewoJCXNldERvY3VtZW50KCBjb250ZXh0ICk7Cgl9CglyZXR1cm4gY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKTsKfTsKClNpenpsZS5hdHRyID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CgkvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWQKCWlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9PSBkb2N1bWVudCApIHsKCQlzZXREb2N1bWVudCggZWxlbSApOwoJfQoKCXZhciBmbiA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZS50b0xvd2VyQ2FzZSgpIF0sCgkJLy8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKGpRdWVyeSAjMTM4MDcpCgkJdmFsID0gZm4gJiYgaGFzT3duLmNhbGwoIEV4cHIuYXR0ckhhbmRsZSwgbmFtZS50b0xvd2VyQ2FzZSgpICkgPwoJCQlmbiggZWxlbSwgbmFtZSwgIWRvY3VtZW50SXNIVE1MICkgOgoJCQl1bmRlZmluZWQ7CgoJcmV0dXJuIHZhbCAhPT0gdW5kZWZpbmVkID8KCQl2YWwgOgoJCXN1cHBvcnQuYXR0cmlidXRlcyB8fCAhZG9jdW1lbnRJc0hUTUwgPwoJCQllbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApIDoKCQkJKHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZShuYW1lKSkgJiYgdmFsLnNwZWNpZmllZCA/CgkJCQl2YWwudmFsdWUgOgoJCQkJbnVsbDsKfTsKClNpenpsZS5lc2NhcGUgPSBmdW5jdGlvbiggc2VsICkgewoJcmV0dXJuIChzZWwgKyAiIikucmVwbGFjZSggcmNzc2VzY2FwZSwgZmNzc2VzY2FwZSApOwp9OwoKU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1zZyApIHsKCXRocm93IG5ldyBFcnJvciggIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIgKyBtc2cgKTsKfTsKCi8qKgogKiBEb2N1bWVudCBzb3J0aW5nIGFuZCByZW1vdmluZyBkdXBsaWNhdGVzCiAqIEBwYXJhbSB7QXJyYXlMaWtlfSByZXN1bHRzCiAqLwpTaXp6bGUudW5pcXVlU29ydCA9IGZ1bmN0aW9uKCByZXN1bHRzICkgewoJdmFyIGVsZW0sCgkJZHVwbGljYXRlcyA9IFtdLAoJCWogPSAwLAoJCWkgPSAwOwoKCS8vIFVubGVzcyB3ZSAqa25vdyogd2UgY2FuIGRldGVjdCBkdXBsaWNhdGVzLCBhc3N1bWUgdGhlaXIgcHJlc2VuY2UKCWhhc0R1cGxpY2F0ZSA9ICFzdXBwb3J0LmRldGVjdER1cGxpY2F0ZXM7Cglzb3J0SW5wdXQgPSAhc3VwcG9ydC5zb3J0U3RhYmxlICYmIHJlc3VsdHMuc2xpY2UoIDAgKTsKCXJlc3VsdHMuc29ydCggc29ydE9yZGVyICk7CgoJaWYgKCBoYXNEdXBsaWNhdGUgKSB7CgkJd2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7CgkJCWlmICggZWxlbSA9PT0gcmVzdWx0c1sgaSBdICkgewoJCQkJaiA9IGR1cGxpY2F0ZXMucHVzaCggaSApOwoJCQl9CgkJfQoJCXdoaWxlICggai0tICkgewoJCQlyZXN1bHRzLnNwbGljZSggZHVwbGljYXRlc1sgaiBdLCAxICk7CgkJfQoJfQoKCS8vIENsZWFyIGlucHV0IGFmdGVyIHNvcnRpbmcgdG8gcmVsZWFzZSBvYmplY3RzCgkvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9zaXp6bGUvcHVsbC8yMjUKCXNvcnRJbnB1dCA9IG51bGw7CgoJcmV0dXJuIHJlc3VsdHM7Cn07CgovKioKICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgcmV0cmlldmluZyB0aGUgdGV4dCB2YWx1ZSBvZiBhbiBhcnJheSBvZiBET00gbm9kZXMKICogQHBhcmFtIHtBcnJheXxFbGVtZW50fSBlbGVtCiAqLwpnZXRUZXh0ID0gU2l6emxlLmdldFRleHQgPSBmdW5jdGlvbiggZWxlbSApIHsKCXZhciBub2RlLAoJCXJldCA9ICIiLAoJCWkgPSAwLAoJCW5vZGVUeXBlID0gZWxlbS5ub2RlVHlwZTsKCglpZiAoICFub2RlVHlwZSApIHsKCQkvLyBJZiBubyBub2RlVHlwZSwgdGhpcyBpcyBleHBlY3RlZCB0byBiZSBhbiBhcnJheQoJCXdoaWxlICggKG5vZGUgPSBlbGVtW2krK10pICkgewoJCQkvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBub2RlcwoJCQlyZXQgKz0gZ2V0VGV4dCggbm9kZSApOwoJCX0KCX0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBlID09PSAxMSApIHsKCQkvLyBVc2UgdGV4dENvbnRlbnQgZm9yIGVsZW1lbnRzCgkJLy8gaW5uZXJUZXh0IHVzYWdlIHJlbW92ZWQgZm9yIGNvbnNpc3RlbmN5IG9mIG5ldyBsaW5lcyAoalF1ZXJ5ICMxMTE1MykKCQlpZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50ID09PSAic3RyaW5nIiApIHsKCQkJcmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7CgkJfSBlbHNlIHsKCQkJLy8gVHJhdmVyc2UgaXRzIGNoaWxkcmVuCgkJCWZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkgewoJCQkJcmV0ICs9IGdldFRleHQoIGVsZW0gKTsKCQkJfQoJCX0KCX0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAzIHx8IG5vZGVUeXBlID09PSA0ICkgewoJCXJldHVybiBlbGVtLm5vZGVWYWx1ZTsKCX0KCS8vIERvIG5vdCBpbmNsdWRlIGNvbW1lbnQgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBub2RlcwoKCXJldHVybiByZXQ7Cn07CgpFeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHsKCgkvLyBDYW4gYmUgYWRqdXN0ZWQgYnkgdGhlIHVzZXIKCWNhY2hlTGVuZ3RoOiA1MCwKCgljcmVhdGVQc2V1ZG86IG1hcmtGdW5jdGlvbiwKCgltYXRjaDogbWF0Y2hFeHByLAoKCWF0dHJIYW5kbGU6IHt9LAoKCWZpbmQ6IHt9LAoKCXJlbGF0aXZlOiB7CgkJIj4iOiB7IGRpcjogInBhcmVudE5vZGUiLCBmaXJzdDogdHJ1ZSB9LAoJCSIgIjogeyBkaXI6ICJwYXJlbnROb2RlIiB9LAoJCSIrIjogeyBkaXI6ICJwcmV2aW91c1NpYmxpbmciLCBmaXJzdDogdHJ1ZSB9LAoJCSJ+IjogeyBkaXI6ICJwcmV2aW91c1NpYmxpbmciIH0KCX0sCgoJcHJlRmlsdGVyOiB7CgkJIkFUVFIiOiBmdW5jdGlvbiggbWF0Y2ggKSB7CgkJCW1hdGNoWzFdID0gbWF0Y2hbMV0ucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTsKCgkJCS8vIE1vdmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkCgkJCW1hdGNoWzNdID0gKCBtYXRjaFszXSB8fCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCAiIiApLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7CgoJCQlpZiAoIG1hdGNoWzJdID09PSAifj0iICkgewoJCQkJbWF0Y2hbM10gPSAiICIgKyBtYXRjaFszXSArICIgIjsKCQkJfQoKCQkJcmV0dXJuIG1hdGNoLnNsaWNlKCAwLCA0ICk7CgkJfSwKCgkJIkNISUxEIjogZnVuY3Rpb24oIG1hdGNoICkgewoJCQkvKiBtYXRjaGVzIGZyb20gbWF0Y2hFeHByWyJDSElMRCJdCgkJCQkxIHR5cGUgKG9ubHl8bnRofC4uLikKCQkJCTIgd2hhdCAoY2hpbGR8b2YtdHlwZSkKCQkJCTMgYXJndW1lbnQgKGV2ZW58b2RkfFxkKnxcZCpuKFsrLV1cZCspP3wuLi4pCgkJCQk0IHhuLWNvbXBvbmVudCBvZiB4bit5IGFyZ3VtZW50IChbKy1dP1xkKm58KQoJCQkJNSBzaWduIG9mIHhuLWNvbXBvbmVudAoJCQkJNiB4IG9mIHhuLWNvbXBvbmVudAoJCQkJNyBzaWduIG9mIHktY29tcG9uZW50CgkJCQk4IHkgb2YgeS1jb21wb25lbnQKCQkJKi8KCQkJbWF0Y2hbMV0gPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpOwoKCQkJaWYgKCBtYXRjaFsxXS5zbGljZSggMCwgMyApID09PSAibnRoIiApIHsKCQkJCS8vIG50aC0qIHJlcXVpcmVzIGFyZ3VtZW50CgkJCQlpZiAoICFtYXRjaFszXSApIHsKCQkJCQlTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7CgkJCQl9CgoJCQkJLy8gbnVtZXJpYyB4IGFuZCB5IHBhcmFtZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxECgkJCQkvLyByZW1lbWJlciB0aGF0IGZhbHNlL3RydWUgY2FzdCByZXNwZWN0aXZlbHkgdG8gMC8xCgkJCQltYXRjaFs0XSA9ICsoIG1hdGNoWzRdID8gbWF0Y2hbNV0gKyAobWF0Y2hbNl0gfHwgMSkgOiAyICogKCBtYXRjaFszXSA9PT0gImV2ZW4iIHx8IG1hdGNoWzNdID09PSAib2RkIiApICk7CgkJCQltYXRjaFs1XSA9ICsoICggbWF0Y2hbN10gKyBtYXRjaFs4XSApIHx8IG1hdGNoWzNdID09PSAib2RkIiApOwoKCQkJLy8gb3RoZXIgdHlwZXMgcHJvaGliaXQgYXJndW1lbnRzCgkJCX0gZWxzZSBpZiAoIG1hdGNoWzNdICkgewoJCQkJU2l6emxlLmVycm9yKCBtYXRjaFswXSApOwoJCQl9CgoJCQlyZXR1cm4gbWF0Y2g7CgkJfSwKCgkJIlBTRVVETyI6IGZ1bmN0aW9uKCBtYXRjaCApIHsKCQkJdmFyIGV4Y2VzcywKCQkJCXVucXVvdGVkID0gIW1hdGNoWzZdICYmIG1hdGNoWzJdOwoKCQkJaWYgKCBtYXRjaEV4cHJbIkNISUxEIl0udGVzdCggbWF0Y2hbMF0gKSApIHsKCQkJCXJldHVybiBudWxsOwoJCQl9CgoJCQkvLyBBY2NlcHQgcXVvdGVkIGFyZ3VtZW50cyBhcy1pcwoJCQlpZiAoIG1hdGNoWzNdICkgewoJCQkJbWF0Y2hbMl0gPSBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCAiIjsKCgkJCS8vIFN0cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZyb20gdW5xdW90ZWQgYXJndW1lbnRzCgkJCX0gZWxzZSBpZiAoIHVucXVvdGVkICYmIHJwc2V1ZG8udGVzdCggdW5xdW90ZWQgKSAmJgoJCQkJLy8gR2V0IGV4Y2VzcyBmcm9tIHRva2VuaXplIChyZWN1cnNpdmVseSkKCQkJCShleGNlc3MgPSB0b2tlbml6ZSggdW5xdW90ZWQsIHRydWUgKSkgJiYKCQkJCS8vIGFkdmFuY2UgdG8gdGhlIG5leHQgY2xvc2luZyBwYXJlbnRoZXNpcwoJCQkJKGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoICIpIiwgdW5xdW90ZWQubGVuZ3RoIC0gZXhjZXNzICkgLSB1bnF1b3RlZC5sZW5ndGgpICkgewoKCQkJCS8vIGV4Y2VzcyBpcyBhIG5lZ2F0aXZlIGluZGV4CgkJCQltYXRjaFswXSA9IG1hdGNoWzBdLnNsaWNlKCAwLCBleGNlc3MgKTsKCQkJCW1hdGNoWzJdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApOwoJCQl9CgoJCQkvLyBSZXR1cm4gb25seSBjYXB0dXJlcyBuZWVkZWQgYnkgdGhlIHBzZXVkbyBmaWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVudCkKCQkJcmV0dXJuIG1hdGNoLnNsaWNlKCAwLCAzICk7CgkJfQoJfSwKCglmaWx0ZXI6IHsKCgkJIlRBRyI6IGZ1bmN0aW9uKCBub2RlTmFtZVNlbGVjdG9yICkgewoJCQl2YXIgbm9kZU5hbWUgPSBub2RlTmFtZVNlbGVjdG9yLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTsKCQkJcmV0dXJuIG5vZGVOYW1lU2VsZWN0b3IgPT09ICIqIiA/CgkJCQlmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0gOgoJCQkJZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQkJcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBub2RlTmFtZTsKCQkJCX07CgkJfSwKCgkJIkNMQVNTIjogZnVuY3Rpb24oIGNsYXNzTmFtZSApIHsKCQkJdmFyIHBhdHRlcm4gPSBjbGFzc0NhY2hlWyBjbGFzc05hbWUgKyAiICIgXTsKCgkJCXJldHVybiBwYXR0ZXJuIHx8CgkJCQkocGF0dGVybiA9IG5ldyBSZWdFeHAoICIoXnwiICsgd2hpdGVzcGFjZSArICIpIiArIGNsYXNzTmFtZSArICIoIiArIHdoaXRlc3BhY2UgKyAifCQpIiApKSAmJgoJCQkJY2xhc3NDYWNoZSggY2xhc3NOYW1lLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJCQlyZXR1cm4gcGF0dGVybi50ZXN0KCB0eXBlb2YgZWxlbS5jbGFzc05hbWUgPT09ICJzdHJpbmciICYmIGVsZW0uY2xhc3NOYW1lIHx8IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSAhPT0gInVuZGVmaW5lZCIgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgIiIgKTsKCQkJCX0pOwoJCX0sCgoJCSJBVFRSIjogZnVuY3Rpb24oIG5hbWUsIG9wZXJhdG9yLCBjaGVjayApIHsKCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJdmFyIHJlc3VsdCA9IFNpenpsZS5hdHRyKCBlbGVtLCBuYW1lICk7CgoJCQkJaWYgKCByZXN1bHQgPT0gbnVsbCApIHsKCQkJCQlyZXR1cm4gb3BlcmF0b3IgPT09ICIhPSI7CgkJCQl9CgkJCQlpZiAoICFvcGVyYXRvciApIHsKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCX0KCgkJCQlyZXN1bHQgKz0gIiI7CgoJCQkJcmV0dXJuIG9wZXJhdG9yID09PSAiPSIgPyByZXN1bHQgPT09IGNoZWNrIDoKCQkJCQlvcGVyYXRvciA9PT0gIiE9IiA/IHJlc3VsdCAhPT0gY2hlY2sgOgoJCQkJCW9wZXJhdG9yID09PSAiXj0iID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPT09IDAgOgoJCQkJCW9wZXJhdG9yID09PSAiKj0iID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPiAtMSA6CgkJCQkJb3BlcmF0b3IgPT09ICIkPSIgPyBjaGVjayAmJiByZXN1bHQuc2xpY2UoIC1jaGVjay5sZW5ndGggKSA9PT0gY2hlY2sgOgoJCQkJCW9wZXJhdG9yID09PSAifj0iID8gKCAiICIgKyByZXN1bHQucmVwbGFjZSggcndoaXRlc3BhY2UsICIgIiApICsgIiAiICkuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDoKCQkJCQlvcGVyYXRvciA9PT0gInw9IiA/IHJlc3VsdCA9PT0gY2hlY2sgfHwgcmVzdWx0LnNsaWNlKCAwLCBjaGVjay5sZW5ndGggKyAxICkgPT09IGNoZWNrICsgIi0iIDoKCQkJCQlmYWxzZTsKCQkJfTsKCQl9LAoKCQkiQ0hJTEQiOiBmdW5jdGlvbiggdHlwZSwgd2hhdCwgYXJndW1lbnQsIGZpcnN0LCBsYXN0ICkgewoJCQl2YXIgc2ltcGxlID0gdHlwZS5zbGljZSggMCwgMyApICE9PSAibnRoIiwKCQkJCWZvcndhcmQgPSB0eXBlLnNsaWNlKCAtNCApICE9PSAibGFzdCIsCgkJCQlvZlR5cGUgPSB3aGF0ID09PSAib2YtdHlwZSI7CgoJCQlyZXR1cm4gZmlyc3QgPT09IDEgJiYgbGFzdCA9PT0gMCA/CgoJCQkJLy8gU2hvcnRjdXQgZm9yIDpudGgtKihuKQoJCQkJZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQkJcmV0dXJuICEhZWxlbS5wYXJlbnROb2RlOwoJCQkJfSA6CgoJCQkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJCQl2YXIgY2FjaGUsIHVuaXF1ZUNhY2hlLCBvdXRlckNhY2hlLCBub2RlLCBub2RlSW5kZXgsIHN0YXJ0LAoJCQkJCQlkaXIgPSBzaW1wbGUgIT09IGZvcndhcmQgPyAibmV4dFNpYmxpbmciIDogInByZXZpb3VzU2libGluZyIsCgkJCQkJCXBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZSwKCQkJCQkJbmFtZSA9IG9mVHlwZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksCgkJCQkJCXVzZUNhY2hlID0gIXhtbCAmJiAhb2ZUeXBlLAoJCQkJCQlkaWZmID0gZmFsc2U7CgoJCQkJCWlmICggcGFyZW50ICkgewoKCQkJCQkJLy8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxvZi10eXBlKQoJCQkJCQlpZiAoIHNpbXBsZSApIHsKCQkJCQkJCXdoaWxlICggZGlyICkgewoJCQkJCQkJCW5vZGUgPSBlbGVtOwoJCQkJCQkJCXdoaWxlICggKG5vZGUgPSBub2RlWyBkaXIgXSkgKSB7CgkJCQkJCQkJCWlmICggb2ZUeXBlID8KCQkJCQkJCQkJCW5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6CgkJCQkJCQkJCQlub2RlLm5vZGVUeXBlID09PSAxICkgewoKCQkJCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCQkvLyBSZXZlcnNlIGRpcmVjdGlvbiBmb3IgOm9ubHktKiAoaWYgd2UgaGF2ZW4ndCB5ZXQgZG9uZSBzbykKCQkJCQkJCQlzdGFydCA9IGRpciA9IHR5cGUgPT09ICJvbmx5IiAmJiAhc3RhcnQgJiYgIm5leHRTaWJsaW5nIjsKCQkJCQkJCX0KCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQl9CgoJCQkJCQlzdGFydCA9IFsgZm9yd2FyZCA/IHBhcmVudC5maXJzdENoaWxkIDogcGFyZW50Lmxhc3RDaGlsZCBdOwoKCQkJCQkJLy8gbm9uLXhtbCA6bnRoLWNoaWxkKC4uLikgc3RvcmVzIGNhY2hlIGRhdGEgb24gYHBhcmVudGAKCQkJCQkJaWYgKCBmb3J3YXJkICYmIHVzZUNhY2hlICkgewoKCQkJCQkJCS8vIFNlZWsgYGVsZW1gIGZyb20gYSBwcmV2aW91c2x5LWNhY2hlZCBpbmRleAoKCQkJCQkJCS8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXkKCQkJCQkJCW5vZGUgPSBwYXJlbnQ7CgkJCQkJCQlvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7CgoJCQkJCQkJLy8gU3VwcG9ydDogSUUgPDkgb25seQoJCQkJCQkJLy8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpCgkJCQkJCQl1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fAoJCQkJCQkJCShvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gPSB7fSk7CgoJCQkJCQkJY2FjaGUgPSB1bmlxdWVDYWNoZVsgdHlwZSBdIHx8IFtdOwoJCQkJCQkJbm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdOwoJCQkJCQkJZGlmZiA9IG5vZGVJbmRleCAmJiBjYWNoZVsgMiBdOwoJCQkJCQkJbm9kZSA9IG5vZGVJbmRleCAmJiBwYXJlbnQuY2hpbGROb2Rlc1sgbm9kZUluZGV4IF07CgoJCQkJCQkJd2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9kZVsgZGlyIF0gfHwKCgkJCQkJCQkJLy8gRmFsbGJhY2sgdG8gc2Vla2luZyBgZWxlbWAgZnJvbSB0aGUgc3RhcnQKCQkJCQkJCQkoZGlmZiA9IG5vZGVJbmRleCA9IDApIHx8IHN0YXJ0LnBvcCgpKSApIHsKCgkJCQkJCQkJLy8gV2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBgcGFyZW50YCBhbmQgYnJlYWsKCQkJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7CgkJCQkJCQkJCXVuaXF1ZUNhY2hlWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIG5vZGVJbmRleCwgZGlmZiBdOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgkJCQkJCQl9CgoJCQkJCQl9IGVsc2UgewoJCQkJCQkJLy8gVXNlIHByZXZpb3VzbHktY2FjaGVkIGVsZW1lbnQgaW5kZXggaWYgYXZhaWxhYmxlCgkJCQkJCQlpZiAoIHVzZUNhY2hlICkgewoJCQkJCQkJCS8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXkKCQkJCQkJCQlub2RlID0gZWxlbTsKCQkJCQkJCQlvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7CgoJCQkJCQkJCS8vIFN1cHBvcnQ6IElFIDw5IG9ubHkKCQkJCQkJCQkvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSkKCQkJCQkJCQl1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fAoJCQkJCQkJCQkob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pOwoKCQkJCQkJCQljYWNoZSA9IHVuaXF1ZUNhY2hlWyB0eXBlIF0gfHwgW107CgkJCQkJCQkJbm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdOwoJCQkJCQkJCWRpZmYgPSBub2RlSW5kZXg7CgkJCQkJCQl9CgoJCQkJCQkJLy8geG1sIDpudGgtY2hpbGQoLi4uKQoJCQkJCQkJLy8gb3IgOm50aC1sYXN0LWNoaWxkKC4uLikgb3IgOm50aCgtbGFzdCk/LW9mLXR5cGUoLi4uKQoJCQkJCQkJaWYgKCBkaWZmID09PSBmYWxzZSApIHsKCQkJCQkJCQkvLyBVc2UgdGhlIHNhbWUgbG9vcCBhcyBhYm92ZSB0byBzZWVrIGBlbGVtYCBmcm9tIHRoZSBzdGFydAoJCQkJCQkJCXdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8CgkJCQkJCQkJCShkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkgewoKCQkJCQkJCQkJaWYgKCAoIG9mVHlwZSA/CgkJCQkJCQkJCQlub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOgoJCQkJCQkJCQkJbm9kZS5ub2RlVHlwZSA9PT0gMSApICYmCgkJCQkJCQkJCQkrK2RpZmYgKSB7CgoJCQkJCQkJCQkJLy8gQ2FjaGUgdGhlIGluZGV4IG9mIGVhY2ggZW5jb3VudGVyZWQgZWxlbWVudAoJCQkJCQkJCQkJaWYgKCB1c2VDYWNoZSApIHsKCQkJCQkJCQkJCQlvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7CgoJCQkJCQkJCQkJCS8vIFN1cHBvcnQ6IElFIDw5IG9ubHkKCQkJCQkJCQkJCQkvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSkKCQkJCQkJCQkJCQl1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fAoJCQkJCQkJCQkJCQkob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pOwoKCQkJCQkJCQkJCQl1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBkaWZmIF07CgkJCQkJCQkJCQl9CgoJCQkJCQkJCQkJaWYgKCBub2RlID09PSBlbGVtICkgewoJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQkvLyBJbmNvcnBvcmF0ZSB0aGUgb2Zmc2V0LCB0aGVuIGNoZWNrIGFnYWluc3QgY3ljbGUgc2l6ZQoJCQkJCQlkaWZmIC09IGxhc3Q7CgkJCQkJCXJldHVybiBkaWZmID09PSBmaXJzdCB8fCAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApOwoJCQkJCX0KCQkJCX07CgkJfSwKCgkJIlBTRVVETyI6IGZ1bmN0aW9uKCBwc2V1ZG8sIGFyZ3VtZW50ICkgewoJCQkvLyBwc2V1ZG8tY2xhc3MgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUKCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNwc2V1ZG8tY2xhc3NlcwoJCQkvLyBQcmlvcml0aXplIGJ5IGNhc2Ugc2Vuc2l0aXZpdHkgaW4gY2FzZSBjdXN0b20gcHNldWRvcyBhcmUgYWRkZWQgd2l0aCB1cHBlcmNhc2UgbGV0dGVycwoJCQkvLyBSZW1lbWJlciB0aGF0IHNldEZpbHRlcnMgaW5oZXJpdHMgZnJvbSBwc2V1ZG9zCgkJCXZhciBhcmdzLAoJCQkJZm4gPSBFeHByLnBzZXVkb3NbIHBzZXVkbyBdIHx8IEV4cHIuc2V0RmlsdGVyc1sgcHNldWRvLnRvTG93ZXJDYXNlKCkgXSB8fAoJCQkJCVNpenpsZS5lcnJvciggInVuc3VwcG9ydGVkIHBzZXVkbzogIiArIHBzZXVkbyApOwoKCQkJLy8gVGhlIHVzZXIgbWF5IHVzZSBjcmVhdGVQc2V1ZG8gdG8gaW5kaWNhdGUgdGhhdAoJCQkvLyBhcmd1bWVudHMgYXJlIG5lZWRlZCB0byBjcmVhdGUgdGhlIGZpbHRlciBmdW5jdGlvbgoJCQkvLyBqdXN0IGFzIFNpenpsZSBkb2VzCgkJCWlmICggZm5bIGV4cGFuZG8gXSApIHsKCQkJCXJldHVybiBmbiggYXJndW1lbnQgKTsKCQkJfQoKCQkJLy8gQnV0IG1haW50YWluIHN1cHBvcnQgZm9yIG9sZCBzaWduYXR1cmVzCgkJCWlmICggZm4ubGVuZ3RoID4gMSApIHsKCQkJCWFyZ3MgPSBbIHBzZXVkbywgcHNldWRvLCAiIiwgYXJndW1lbnQgXTsKCQkJCXJldHVybiBFeHByLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoIHBzZXVkby50b0xvd2VyQ2FzZSgpICkgPwoJCQkJCW1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHsKCQkJCQkJdmFyIGlkeCwKCQkJCQkJCW1hdGNoZWQgPSBmbiggc2VlZCwgYXJndW1lbnQgKSwKCQkJCQkJCWkgPSBtYXRjaGVkLmxlbmd0aDsKCQkJCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQkJCQlpZHggPSBpbmRleE9mKCBzZWVkLCBtYXRjaGVkW2ldICk7CgkJCQkJCQlzZWVkWyBpZHggXSA9ICEoIG1hdGNoZXNbIGlkeCBdID0gbWF0Y2hlZFtpXSApOwoJCQkJCQl9CgkJCQkJfSkgOgoJCQkJCWZ1bmN0aW9uKCBlbGVtICkgewoJCQkJCQlyZXR1cm4gZm4oIGVsZW0sIDAsIGFyZ3MgKTsKCQkJCQl9OwoJCQl9CgoJCQlyZXR1cm4gZm47CgkJfQoJfSwKCglwc2V1ZG9zOiB7CgkJLy8gUG90ZW50aWFsbHkgY29tcGxleCBwc2V1ZG9zCgkJIm5vdCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJCS8vIFRyaW0gdGhlIHNlbGVjdG9yIHBhc3NlZCB0byBjb21waWxlCgkJCS8vIHRvIGF2b2lkIHRyZWF0aW5nIGxlYWRpbmcgYW5kIHRyYWlsaW5nCgkJCS8vIHNwYWNlcyBhcyBjb21iaW5hdG9ycwoJCQl2YXIgaW5wdXQgPSBbXSwKCQkJCXJlc3VsdHMgPSBbXSwKCQkJCW1hdGNoZXIgPSBjb21waWxlKCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgIiQxIiApICk7CgoJCQlyZXR1cm4gbWF0Y2hlclsgZXhwYW5kbyBdID8KCQkJCW1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcywgY29udGV4dCwgeG1sICkgewoJCQkJCXZhciBlbGVtLAoJCQkJCQl1bm1hdGNoZWQgPSBtYXRjaGVyKCBzZWVkLCBudWxsLCB4bWwsIFtdICksCgkJCQkJCWkgPSBzZWVkLmxlbmd0aDsKCgkJCQkJLy8gTWF0Y2ggZWxlbWVudHMgdW5tYXRjaGVkIGJ5IGBtYXRjaGVyYAoJCQkJCXdoaWxlICggaS0tICkgewoJCQkJCQlpZiAoIChlbGVtID0gdW5tYXRjaGVkW2ldKSApIHsKCQkJCQkJCXNlZWRbaV0gPSAhKG1hdGNoZXNbaV0gPSBlbGVtKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0pIDoKCQkJCWZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CgkJCQkJaW5wdXRbMF0gPSBlbGVtOwoJCQkJCW1hdGNoZXIoIGlucHV0LCBudWxsLCB4bWwsIHJlc3VsdHMgKTsKCQkJCQkvLyBEb24ndCBrZWVwIHRoZSBlbGVtZW50IChpc3N1ZSAjMjk5KQoJCQkJCWlucHV0WzBdID0gbnVsbDsKCQkJCQlyZXR1cm4gIXJlc3VsdHMucG9wKCk7CgkJCQl9OwoJCX0pLAoKCQkiaGFzIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJcmV0dXJuIFNpenpsZSggc2VsZWN0b3IsIGVsZW0gKS5sZW5ndGggPiAwOwoJCQl9OwoJCX0pLAoKCQkiY29udGFpbnMiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHRleHQgKSB7CgkJCXRleHQgPSB0ZXh0LnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7CgkJCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXJldHVybiAoIGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lclRleHQgfHwgZ2V0VGV4dCggZWxlbSApICkuaW5kZXhPZiggdGV4dCApID4gLTE7CgkJCX07CgkJfSksCgoJCS8vICJXaGV0aGVyIGFuIGVsZW1lbnQgaXMgcmVwcmVzZW50ZWQgYnkgYSA6bGFuZygpIHNlbGVjdG9yCgkJLy8gaXMgYmFzZWQgc29sZWx5IG9uIHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWUKCQkvLyBiZWluZyBlcXVhbCB0byB0aGUgaWRlbnRpZmllciBDLAoJCS8vIG9yIGJlZ2lubmluZyB3aXRoIHRoZSBpZGVudGlmaWVyIEMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgIi0iLgoJCS8vIFRoZSBtYXRjaGluZyBvZiBDIGFnYWluc3QgdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZSBpcyBwZXJmb3JtZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LgoJCS8vIFRoZSBpZGVudGlmaWVyIEMgZG9lcyBub3QgaGF2ZSB0byBiZSBhIHZhbGlkIGxhbmd1YWdlIG5hbWUuIgoJCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jbGFuZy1wc2V1ZG8KCQkibGFuZyI6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIGxhbmcgKSB7CgkJCS8vIGxhbmcgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIGlkZW50aWZpZXIKCQkJaWYgKCAhcmlkZW50aWZpZXIudGVzdChsYW5nIHx8ICIiKSApIHsKCQkJCVNpenpsZS5lcnJvciggInVuc3VwcG9ydGVkIGxhbmc6ICIgKyBsYW5nICk7CgkJCX0KCQkJbGFuZyA9IGxhbmcucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpOwoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl2YXIgZWxlbUxhbmc7CgkJCQlkbyB7CgkJCQkJaWYgKCAoZWxlbUxhbmcgPSBkb2N1bWVudElzSFRNTCA/CgkJCQkJCWVsZW0ubGFuZyA6CgkJCQkJCWVsZW0uZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCJsYW5nIikpICkgewoKCQkJCQkJZWxlbUxhbmcgPSBlbGVtTGFuZy50b0xvd2VyQ2FzZSgpOwoJCQkJCQlyZXR1cm4gZWxlbUxhbmcgPT09IGxhbmcgfHwgZWxlbUxhbmcuaW5kZXhPZiggbGFuZyArICItIiApID09PSAwOwoJCQkJCX0KCQkJCX0gd2hpbGUgKCAoZWxlbSA9IGVsZW0ucGFyZW50Tm9kZSkgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9OwoJCX0pLAoKCQkvLyBNaXNjZWxsYW5lb3VzCgkJInRhcmdldCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQl2YXIgaGFzaCA9IHdpbmRvdy5sb2NhdGlvbiAmJiB3aW5kb3cubG9jYXRpb24uaGFzaDsKCQkJcmV0dXJuIGhhc2ggJiYgaGFzaC5zbGljZSggMSApID09PSBlbGVtLmlkOwoJCX0sCgoJCSJyb290IjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtID09PSBkb2NFbGVtOwoJCX0sCgoJCSJmb2N1cyI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiAoIWRvY3VtZW50Lmhhc0ZvY3VzIHx8IGRvY3VtZW50Lmhhc0ZvY3VzKCkpICYmICEhKGVsZW0udHlwZSB8fCBlbGVtLmhyZWYgfHwgfmVsZW0udGFiSW5kZXgpOwoJCX0sCgoJCS8vIEJvb2xlYW4gcHJvcGVydGllcwoJCSJlbmFibGVkIjogY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIGZhbHNlICksCgkJImRpc2FibGVkIjogY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIHRydWUgKSwKCgkJImNoZWNrZWQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJLy8gSW4gQ1NTMywgOmNoZWNrZWQgc2hvdWxkIHJldHVybiBib3RoIGNoZWNrZWQgYW5kIHNlbGVjdGVkIGVsZW1lbnRzCgkJCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaGVja2VkCgkJCXZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCQkJcmV0dXJuIChub2RlTmFtZSA9PT0gImlucHV0IiAmJiAhIWVsZW0uY2hlY2tlZCkgfHwgKG5vZGVOYW1lID09PSAib3B0aW9uIiAmJiAhIWVsZW0uc2VsZWN0ZWQpOwoJCX0sCgoJCSJzZWxlY3RlZCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQkvLyBBY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eSBtYWtlcyBzZWxlY3RlZC1ieS1kZWZhdWx0CgkJCS8vIG9wdGlvbnMgaW4gU2FmYXJpIHdvcmsgcHJvcGVybHkKCQkJaWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7CgkJCQllbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKCQkJfQoKCQkJcmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7CgkJfSwKCgkJLy8gQ29udGVudHMKCQkiZW1wdHkiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNlbXB0eS1wc2V1ZG8KCQkJLy8gOmVtcHR5IGlzIG5lZ2F0ZWQgYnkgZWxlbWVudCAoMSkgb3IgY29udGVudCBub2RlcyAodGV4dDogMzsgY2RhdGE6IDQ7IGVudGl0eSByZWY6IDUpLAoJCQkvLyAgIGJ1dCBub3QgYnkgb3RoZXJzIChjb21tZW50OiA4OyBwcm9jZXNzaW5nIGluc3RydWN0aW9uOiA3OyBldGMuKQoJCQkvLyBub2RlVHlwZSA8IDYgd29ya3MgYmVjYXVzZSBhdHRyaWJ1dGVzICgyKSBkbyBub3QgYXBwZWFyIGFzIGNoaWxkcmVuCgkJCWZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkgewoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlIDwgNiApIHsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIHRydWU7CgkJfSwKCgkJInBhcmVudCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gIUV4cHIucHNldWRvc1siZW1wdHkiXSggZWxlbSApOwoJCX0sCgoJCS8vIEVsZW1lbnQvaW5wdXQgdHlwZXMKCQkiaGVhZGVyIjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiByaGVhZGVyLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTsKCQl9LAoKCQkiaW5wdXQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIHJpbnB1dHMudGVzdCggZWxlbS5ub2RlTmFtZSApOwoJCX0sCgoJCSJidXR0b24iOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJCXJldHVybiBuYW1lID09PSAiaW5wdXQiICYmIGVsZW0udHlwZSA9PT0gImJ1dHRvbiIgfHwgbmFtZSA9PT0gImJ1dHRvbiI7CgkJfSwKCgkJInRleHQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJdmFyIGF0dHI7CgkJCXJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJpbnB1dCIgJiYKCQkJCWVsZW0udHlwZSA9PT0gInRleHQiICYmCgoJCQkJLy8gU3VwcG9ydDogSUU8OAoJCQkJLy8gTmV3IEhUTUw1IGF0dHJpYnV0ZSB2YWx1ZXMgKGUuZy4sICJzZWFyY2giKSBhcHBlYXIgd2l0aCBlbGVtLnR5cGUgPT09ICJ0ZXh0IgoJCQkJKCAoYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKCJ0eXBlIikpID09IG51bGwgfHwgYXR0ci50b0xvd2VyQ2FzZSgpID09PSAidGV4dCIgKTsKCQl9LAoKCQkvLyBQb3NpdGlvbi1pbi1jb2xsZWN0aW9uCgkJImZpcnN0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbigpIHsKCQkJcmV0dXJuIFsgMCBdOwoJCX0pLAoKCQkibGFzdCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkgewoJCQlyZXR1cm4gWyBsZW5ndGggLSAxIF07CgkJfSksCgoJCSJlcSI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHsKCQkJcmV0dXJuIFsgYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudCBdOwoJCX0pLAoKCQkiZXZlbiI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkgewoJCQl2YXIgaSA9IDA7CgkJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkgewoJCQkJbWF0Y2hJbmRleGVzLnB1c2goIGkgKTsKCQkJfQoJCQlyZXR1cm4gbWF0Y2hJbmRleGVzOwoJCX0pLAoKCQkib2RkIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7CgkJCXZhciBpID0gMTsKCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7CgkJCQltYXRjaEluZGV4ZXMucHVzaCggaSApOwoJCQl9CgkJCXJldHVybiBtYXRjaEluZGV4ZXM7CgkJfSksCgoJCSJsdCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHsKCQkJdmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50OwoJCQlmb3IgKCA7IC0taSA+PSAwOyApIHsKCQkJCW1hdGNoSW5kZXhlcy5wdXNoKCBpICk7CgkJCX0KCQkJcmV0dXJuIG1hdGNoSW5kZXhlczsKCQl9KSwKCgkJImd0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkgewoJCQl2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7CgkJCWZvciAoIDsgKytpIDwgbGVuZ3RoOyApIHsKCQkJCW1hdGNoSW5kZXhlcy5wdXNoKCBpICk7CgkJCX0KCQkJcmV0dXJuIG1hdGNoSW5kZXhlczsKCQl9KQoJfQp9OwoKRXhwci5wc2V1ZG9zWyJudGgiXSA9IEV4cHIucHNldWRvc1siZXEiXTsKCi8vIEFkZCBidXR0b24vaW5wdXQgdHlwZSBwc2V1ZG9zCmZvciAoIGkgaW4geyByYWRpbzogdHJ1ZSwgY2hlY2tib3g6IHRydWUsIGZpbGU6IHRydWUsIHBhc3N3b3JkOiB0cnVlLCBpbWFnZTogdHJ1ZSB9ICkgewoJRXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVJbnB1dFBzZXVkbyggaSApOwp9CmZvciAoIGkgaW4geyBzdWJtaXQ6IHRydWUsIHJlc2V0OiB0cnVlIH0gKSB7CglFeHByLnBzZXVkb3NbIGkgXSA9IGNyZWF0ZUJ1dHRvblBzZXVkbyggaSApOwp9CgovLyBFYXN5IEFQSSBmb3IgY3JlYXRpbmcgbmV3IHNldEZpbHRlcnMKZnVuY3Rpb24gc2V0RmlsdGVycygpIHt9CnNldEZpbHRlcnMucHJvdG90eXBlID0gRXhwci5maWx0ZXJzID0gRXhwci5wc2V1ZG9zOwpFeHByLnNldEZpbHRlcnMgPSBuZXcgc2V0RmlsdGVycygpOwoKdG9rZW5pemUgPSBTaXp6bGUudG9rZW5pemUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIHBhcnNlT25seSApIHsKCXZhciBtYXRjaGVkLCBtYXRjaCwgdG9rZW5zLCB0eXBlLAoJCXNvRmFyLCBncm91cHMsIHByZUZpbHRlcnMsCgkJY2FjaGVkID0gdG9rZW5DYWNoZVsgc2VsZWN0b3IgKyAiICIgXTsKCglpZiAoIGNhY2hlZCApIHsKCQlyZXR1cm4gcGFyc2VPbmx5ID8gMCA6IGNhY2hlZC5zbGljZSggMCApOwoJfQoKCXNvRmFyID0gc2VsZWN0b3I7Cglncm91cHMgPSBbXTsKCXByZUZpbHRlcnMgPSBFeHByLnByZUZpbHRlcjsKCgl3aGlsZSAoIHNvRmFyICkgewoKCQkvLyBDb21tYSBhbmQgZmlyc3QgcnVuCgkJaWYgKCAhbWF0Y2hlZCB8fCAobWF0Y2ggPSByY29tbWEuZXhlYyggc29GYXIgKSkgKSB7CgkJCWlmICggbWF0Y2ggKSB7CgkJCQkvLyBEb24ndCBjb25zdW1lIHRyYWlsaW5nIGNvbW1hcyBhcyB2YWxpZAoJCQkJc29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hbMF0ubGVuZ3RoICkgfHwgc29GYXI7CgkJCX0KCQkJZ3JvdXBzLnB1c2goICh0b2tlbnMgPSBbXSkgKTsKCQl9CgoJCW1hdGNoZWQgPSBmYWxzZTsKCgkJLy8gQ29tYmluYXRvcnMKCQlpZiAoIChtYXRjaCA9IHJjb21iaW5hdG9ycy5leGVjKCBzb0ZhciApKSApIHsKCQkJbWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7CgkJCXRva2Vucy5wdXNoKHsKCQkJCXZhbHVlOiBtYXRjaGVkLAoJCQkJLy8gQ2FzdCBkZXNjZW5kYW50IGNvbWJpbmF0b3JzIHRvIHNwYWNlCgkJCQl0eXBlOiBtYXRjaFswXS5yZXBsYWNlKCBydHJpbSwgIiAiICkKCQkJfSk7CgkJCXNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7CgkJfQoKCQkvLyBGaWx0ZXJzCgkJZm9yICggdHlwZSBpbiBFeHByLmZpbHRlciApIHsKCQkJaWYgKCAobWF0Y2ggPSBtYXRjaEV4cHJbIHR5cGUgXS5leGVjKCBzb0ZhciApKSAmJiAoIXByZUZpbHRlcnNbIHR5cGUgXSB8fAoJCQkJKG1hdGNoID0gcHJlRmlsdGVyc1sgdHlwZSBdKCBtYXRjaCApKSkgKSB7CgkJCQltYXRjaGVkID0gbWF0Y2guc2hpZnQoKTsKCQkJCXRva2Vucy5wdXNoKHsKCQkJCQl2YWx1ZTogbWF0Y2hlZCwKCQkJCQl0eXBlOiB0eXBlLAoJCQkJCW1hdGNoZXM6IG1hdGNoCgkJCQl9KTsKCQkJCXNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7CgkJCX0KCQl9CgoJCWlmICggIW1hdGNoZWQgKSB7CgkJCWJyZWFrOwoJCX0KCX0KCgkvLyBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW52YWxpZCBleGNlc3MKCS8vIGlmIHdlJ3JlIGp1c3QgcGFyc2luZwoJLy8gT3RoZXJ3aXNlLCB0aHJvdyBhbiBlcnJvciBvciByZXR1cm4gdG9rZW5zCglyZXR1cm4gcGFyc2VPbmx5ID8KCQlzb0Zhci5sZW5ndGggOgoJCXNvRmFyID8KCQkJU2l6emxlLmVycm9yKCBzZWxlY3RvciApIDoKCQkJLy8gQ2FjaGUgdGhlIHRva2VucwoJCQl0b2tlbkNhY2hlKCBzZWxlY3RvciwgZ3JvdXBzICkuc2xpY2UoIDAgKTsKfTsKCmZ1bmN0aW9uIHRvU2VsZWN0b3IoIHRva2VucyApIHsKCXZhciBpID0gMCwKCQlsZW4gPSB0b2tlbnMubGVuZ3RoLAoJCXNlbGVjdG9yID0gIiI7Cglmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKCQlzZWxlY3RvciArPSB0b2tlbnNbaV0udmFsdWU7Cgl9CglyZXR1cm4gc2VsZWN0b3I7Cn0KCmZ1bmN0aW9uIGFkZENvbWJpbmF0b3IoIG1hdGNoZXIsIGNvbWJpbmF0b3IsIGJhc2UgKSB7Cgl2YXIgZGlyID0gY29tYmluYXRvci5kaXIsCgkJc2tpcCA9IGNvbWJpbmF0b3IubmV4dCwKCQlrZXkgPSBza2lwIHx8IGRpciwKCQljaGVja05vbkVsZW1lbnRzID0gYmFzZSAmJiBrZXkgPT09ICJwYXJlbnROb2RlIiwKCQlkb25lTmFtZSA9IGRvbmUrKzsKCglyZXR1cm4gY29tYmluYXRvci5maXJzdCA/CgkJLy8gQ2hlY2sgYWdhaW5zdCBjbG9zZXN0IGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50CgkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJd2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHsKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkgewoJCQkJCXJldHVybiBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfSA6CgoJCS8vIENoZWNrIGFnYWluc3QgYWxsIGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50cwoJCWZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CgkJCXZhciBvbGRDYWNoZSwgdW5pcXVlQ2FjaGUsIG91dGVyQ2FjaGUsCgkJCQluZXdDYWNoZSA9IFsgZGlycnVucywgZG9uZU5hbWUgXTsKCgkJCS8vIFdlIGNhbid0IHNldCBhcmJpdHJhcnkgZGF0YSBvbiBYTUwgbm9kZXMsIHNvIHRoZXkgZG9uJ3QgYmVuZWZpdCBmcm9tIGNvbWJpbmF0b3IgY2FjaGluZwoJCQlpZiAoIHhtbCApIHsKCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7CgkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7CgkJCQkJCWlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7CgkJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsKCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7CgkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7CgkJCQkJCW91dGVyQ2FjaGUgPSBlbGVtWyBleHBhbmRvIF0gfHwgKGVsZW1bIGV4cGFuZG8gXSA9IHt9KTsKCgkJCQkJCS8vIFN1cHBvcnQ6IElFIDw5IG9ubHkKCQkJCQkJLy8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpCgkJCQkJCXVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgZWxlbS51bmlxdWVJRCBdIHx8IChvdXRlckNhY2hlWyBlbGVtLnVuaXF1ZUlEIF0gPSB7fSk7CgoJCQkJCQlpZiAoIHNraXAgJiYgc2tpcCA9PT0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICkgewoJCQkJCQkJZWxlbSA9IGVsZW1bIGRpciBdIHx8IGVsZW07CgkJCQkJCX0gZWxzZSBpZiAoIChvbGRDYWNoZSA9IHVuaXF1ZUNhY2hlWyBrZXkgXSkgJiYKCQkJCQkJCW9sZENhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgb2xkQ2FjaGVbIDEgXSA9PT0gZG9uZU5hbWUgKSB7CgoJCQkJCQkJLy8gQXNzaWduIHRvIG5ld0NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHMKCQkJCQkJCXJldHVybiAobmV3Q2FjaGVbIDIgXSA9IG9sZENhY2hlWyAyIF0pOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJLy8gUmV1c2UgbmV3Y2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50cwoJCQkJCQkJdW5pcXVlQ2FjaGVbIGtleSBdID0gbmV3Q2FjaGU7CgoJCQkJCQkJLy8gQSBtYXRjaCBtZWFucyB3ZSdyZSBkb25lOyBhIGZhaWwgbWVhbnMgd2UgaGF2ZSB0byBrZWVwIGNoZWNraW5nCgkJCQkJCQlpZiAoIChuZXdDYWNoZVsgMiBdID0gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkpICkgewoJCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9Owp9CgpmdW5jdGlvbiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSB7CglyZXR1cm4gbWF0Y2hlcnMubGVuZ3RoID4gMSA/CgkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJdmFyIGkgPSBtYXRjaGVycy5sZW5ndGg7CgkJCXdoaWxlICggaS0tICkgewoJCQkJaWYgKCAhbWF0Y2hlcnNbaV0oIGVsZW0sIGNvbnRleHQsIHhtbCApICkgewoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gdHJ1ZTsKCQl9IDoKCQltYXRjaGVyc1swXTsKfQoKZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IsIGNvbnRleHRzLCByZXN1bHRzICkgewoJdmFyIGkgPSAwLAoJCWxlbiA9IGNvbnRleHRzLmxlbmd0aDsKCWZvciAoIDsgaSA8IGxlbjsgaSsrICkgewoJCVNpenpsZSggc2VsZWN0b3IsIGNvbnRleHRzW2ldLCByZXN1bHRzICk7Cgl9CglyZXR1cm4gcmVzdWx0czsKfQoKZnVuY3Rpb24gY29uZGVuc2UoIHVubWF0Y2hlZCwgbWFwLCBmaWx0ZXIsIGNvbnRleHQsIHhtbCApIHsKCXZhciBlbGVtLAoJCW5ld1VubWF0Y2hlZCA9IFtdLAoJCWkgPSAwLAoJCWxlbiA9IHVubWF0Y2hlZC5sZW5ndGgsCgkJbWFwcGVkID0gbWFwICE9IG51bGw7CgoJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CgkJaWYgKCAoZWxlbSA9IHVubWF0Y2hlZFtpXSkgKSB7CgkJCWlmICggIWZpbHRlciB8fCBmaWx0ZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkgewoJCQkJbmV3VW5tYXRjaGVkLnB1c2goIGVsZW0gKTsKCQkJCWlmICggbWFwcGVkICkgewoJCQkJCW1hcC5wdXNoKCBpICk7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIG5ld1VubWF0Y2hlZDsKfQoKZnVuY3Rpb24gc2V0TWF0Y2hlciggcHJlRmlsdGVyLCBzZWxlY3RvciwgbWF0Y2hlciwgcG9zdEZpbHRlciwgcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICkgewoJaWYgKCBwb3N0RmlsdGVyICYmICFwb3N0RmlsdGVyWyBleHBhbmRvIF0gKSB7CgkJcG9zdEZpbHRlciA9IHNldE1hdGNoZXIoIHBvc3RGaWx0ZXIgKTsKCX0KCWlmICggcG9zdEZpbmRlciAmJiAhcG9zdEZpbmRlclsgZXhwYW5kbyBdICkgewoJCXBvc3RGaW5kZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKTsKCX0KCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNvbnRleHQsIHhtbCApIHsKCQl2YXIgdGVtcCwgaSwgZWxlbSwKCQkJcHJlTWFwID0gW10sCgkJCXBvc3RNYXAgPSBbXSwKCQkJcHJlZXhpc3RpbmcgPSByZXN1bHRzLmxlbmd0aCwKCgkJCS8vIEdldCBpbml0aWFsIGVsZW1lbnRzIGZyb20gc2VlZCBvciBjb250ZXh0CgkJCWVsZW1zID0gc2VlZCB8fCBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciB8fCAiKiIsIGNvbnRleHQubm9kZVR5cGUgPyBbIGNvbnRleHQgXSA6IGNvbnRleHQsIFtdICksCgoJCQkvLyBQcmVmaWx0ZXIgdG8gZ2V0IG1hdGNoZXIgaW5wdXQsIHByZXNlcnZpbmcgYSBtYXAgZm9yIHNlZWQtcmVzdWx0cyBzeW5jaHJvbml6YXRpb24KCQkJbWF0Y2hlckluID0gcHJlRmlsdGVyICYmICggc2VlZCB8fCAhc2VsZWN0b3IgKSA/CgkJCQljb25kZW5zZSggZWxlbXMsIHByZU1hcCwgcHJlRmlsdGVyLCBjb250ZXh0LCB4bWwgKSA6CgkJCQllbGVtcywKCgkJCW1hdGNoZXJPdXQgPSBtYXRjaGVyID8KCQkJCS8vIElmIHdlIGhhdmUgYSBwb3N0RmluZGVyLCBvciBmaWx0ZXJlZCBzZWVkLCBvciBub24tc2VlZCBwb3N0RmlsdGVyIG9yIHByZWV4aXN0aW5nIHJlc3VsdHMsCgkJCQlwb3N0RmluZGVyIHx8ICggc2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8IHBvc3RGaWx0ZXIgKSA/CgoJCQkJCS8vIC4uLmludGVybWVkaWF0ZSBwcm9jZXNzaW5nIGlzIG5lY2Vzc2FyeQoJCQkJCVtdIDoKCgkJCQkJLy8gLi4ub3RoZXJ3aXNlIHVzZSByZXN1bHRzIGRpcmVjdGx5CgkJCQkJcmVzdWx0cyA6CgkJCQltYXRjaGVySW47CgoJCS8vIEZpbmQgcHJpbWFyeSBtYXRjaGVzCgkJaWYgKCBtYXRjaGVyICkgewoJCQltYXRjaGVyKCBtYXRjaGVySW4sIG1hdGNoZXJPdXQsIGNvbnRleHQsIHhtbCApOwoJCX0KCgkJLy8gQXBwbHkgcG9zdEZpbHRlcgoJCWlmICggcG9zdEZpbHRlciApIHsKCQkJdGVtcCA9IGNvbmRlbnNlKCBtYXRjaGVyT3V0LCBwb3N0TWFwICk7CgkJCXBvc3RGaWx0ZXIoIHRlbXAsIFtdLCBjb250ZXh0LCB4bWwgKTsKCgkJCS8vIFVuLW1hdGNoIGZhaWxpbmcgZWxlbWVudHMgYnkgbW92aW5nIHRoZW0gYmFjayB0byBtYXRjaGVySW4KCQkJaSA9IHRlbXAubGVuZ3RoOwoJCQl3aGlsZSAoIGktLSApIHsKCQkJCWlmICggKGVsZW0gPSB0ZW1wW2ldKSApIHsKCQkJCQltYXRjaGVyT3V0WyBwb3N0TWFwW2ldIF0gPSAhKG1hdGNoZXJJblsgcG9zdE1hcFtpXSBdID0gZWxlbSk7CgkJCQl9CgkJCX0KCQl9CgoJCWlmICggc2VlZCApIHsKCQkJaWYgKCBwb3N0RmluZGVyIHx8IHByZUZpbHRlciApIHsKCQkJCWlmICggcG9zdEZpbmRlciApIHsKCQkJCQkvLyBHZXQgdGhlIGZpbmFsIG1hdGNoZXJPdXQgYnkgY29uZGVuc2luZyB0aGlzIGludGVybWVkaWF0ZSBpbnRvIHBvc3RGaW5kZXIgY29udGV4dHMKCQkJCQl0ZW1wID0gW107CgkJCQkJaSA9IG1hdGNoZXJPdXQubGVuZ3RoOwoJCQkJCXdoaWxlICggaS0tICkgewoJCQkJCQlpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgKSB7CgkJCQkJCQkvLyBSZXN0b3JlIG1hdGNoZXJJbiBzaW5jZSBlbGVtIGlzIG5vdCB5ZXQgYSBmaW5hbCBtYXRjaAoJCQkJCQkJdGVtcC5wdXNoKCAobWF0Y2hlckluW2ldID0gZWxlbSkgKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQlwb3N0RmluZGVyKCBudWxsLCAobWF0Y2hlck91dCA9IFtdKSwgdGVtcCwgeG1sICk7CgkJCQl9CgoJCQkJLy8gTW92ZSBtYXRjaGVkIGVsZW1lbnRzIGZyb20gc2VlZCB0byByZXN1bHRzIHRvIGtlZXAgdGhlbSBzeW5jaHJvbml6ZWQKCQkJCWkgPSBtYXRjaGVyT3V0Lmxlbmd0aDsKCQkJCXdoaWxlICggaS0tICkgewoJCQkJCWlmICggKGVsZW0gPSBtYXRjaGVyT3V0W2ldKSAmJgoJCQkJCQkodGVtcCA9IHBvc3RGaW5kZXIgPyBpbmRleE9mKCBzZWVkLCBlbGVtICkgOiBwcmVNYXBbaV0pID4gLTEgKSB7CgoJCQkJCQlzZWVkW3RlbXBdID0gIShyZXN1bHRzW3RlbXBdID0gZWxlbSk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCS8vIEFkZCBlbGVtZW50cyB0byByZXN1bHRzLCB0aHJvdWdoIHBvc3RGaW5kZXIgaWYgZGVmaW5lZAoJCX0gZWxzZSB7CgkJCW1hdGNoZXJPdXQgPSBjb25kZW5zZSgKCQkJCW1hdGNoZXJPdXQgPT09IHJlc3VsdHMgPwoJCQkJCW1hdGNoZXJPdXQuc3BsaWNlKCBwcmVleGlzdGluZywgbWF0Y2hlck91dC5sZW5ndGggKSA6CgkJCQkJbWF0Y2hlck91dAoJCQkpOwoJCQlpZiAoIHBvc3RGaW5kZXIgKSB7CgkJCQlwb3N0RmluZGVyKCBudWxsLCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4bWwgKTsKCQkJfSBlbHNlIHsKCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTsKCQkJfQoJCX0KCX0pOwp9CgpmdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkgewoJdmFyIGNoZWNrQ29udGV4dCwgbWF0Y2hlciwgaiwKCQlsZW4gPSB0b2tlbnMubGVuZ3RoLAoJCWxlYWRpbmdSZWxhdGl2ZSA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1swXS50eXBlIF0sCgkJaW1wbGljaXRSZWxhdGl2ZSA9IGxlYWRpbmdSZWxhdGl2ZSB8fCBFeHByLnJlbGF0aXZlWyIgIl0sCgkJaSA9IGxlYWRpbmdSZWxhdGl2ZSA/IDEgOiAwLAoKCQkvLyBUaGUgZm91bmRhdGlvbmFsIG1hdGNoZXIgZW5zdXJlcyB0aGF0IGVsZW1lbnRzIGFyZSByZWFjaGFibGUgZnJvbSB0b3AtbGV2ZWwgY29udGV4dChzKQoJCW1hdGNoQ29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbSA9PT0gY2hlY2tDb250ZXh0OwoJCX0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSwKCQltYXRjaEFueUNvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGluZGV4T2YoIGNoZWNrQ29udGV4dCwgZWxlbSApID4gLTE7CgkJfSwgaW1wbGljaXRSZWxhdGl2ZSwgdHJ1ZSApLAoJCW1hdGNoZXJzID0gWyBmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgewoJCQl2YXIgcmV0ID0gKCAhbGVhZGluZ1JlbGF0aXZlICYmICggeG1sIHx8IGNvbnRleHQgIT09IG91dGVybW9zdENvbnRleHQgKSApIHx8ICgKCQkJCShjaGVja0NvbnRleHQgPSBjb250ZXh0KS5ub2RlVHlwZSA/CgkJCQkJbWF0Y2hDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSA6CgkJCQkJbWF0Y2hBbnlDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSApOwoJCQkvLyBBdm9pZCBoYW5naW5nIG9udG8gZWxlbWVudCAoaXNzdWUgIzI5OSkKCQkJY2hlY2tDb250ZXh0ID0gbnVsbDsKCQkJcmV0dXJuIHJldDsKCQl9IF07CgoJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CgkJaWYgKCAobWF0Y2hlciA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1tpXS50eXBlIF0pICkgewoJCQltYXRjaGVycyA9IFsgYWRkQ29tYmluYXRvcihlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwgbWF0Y2hlcikgXTsKCQl9IGVsc2UgewoJCQltYXRjaGVyID0gRXhwci5maWx0ZXJbIHRva2Vuc1tpXS50eXBlIF0uYXBwbHkoIG51bGwsIHRva2Vuc1tpXS5tYXRjaGVzICk7CgoJCQkvLyBSZXR1cm4gc3BlY2lhbCB1cG9uIHNlZWluZyBhIHBvc2l0aW9uYWwgbWF0Y2hlcgoJCQlpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHsKCQkJCS8vIEZpbmQgdGhlIG5leHQgcmVsYXRpdmUgb3BlcmF0b3IgKGlmIGFueSkgZm9yIHByb3BlciBoYW5kbGluZwoJCQkJaiA9ICsraTsKCQkJCWZvciAoIDsgaiA8IGxlbjsgaisrICkgewoJCQkJCWlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2pdLnR5cGUgXSApIHsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQkJcmV0dXJuIHNldE1hdGNoZXIoCgkJCQkJaSA+IDEgJiYgZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksCgkJCQkJaSA+IDEgJiYgdG9TZWxlY3RvcigKCQkJCQkJLy8gSWYgdGhlIHByZWNlZGluZyB0b2tlbiB3YXMgYSBkZXNjZW5kYW50IGNvbWJpbmF0b3IsIGluc2VydCBhbiBpbXBsaWNpdCBhbnktZWxlbWVudCBgKmAKCQkJCQkJdG9rZW5zLnNsaWNlKCAwLCBpIC0gMSApLmNvbmNhdCh7IHZhbHVlOiB0b2tlbnNbIGkgLSAyIF0udHlwZSA9PT0gIiAiID8gIioiIDogIiIgfSkKCQkJCQkpLnJlcGxhY2UoIHJ0cmltLCAiJDEiICksCgkJCQkJbWF0Y2hlciwKCQkJCQlpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSwKCQkJCQlqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAodG9rZW5zID0gdG9rZW5zLnNsaWNlKCBqICkpICksCgkJCQkJaiA8IGxlbiAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKQoJCQkJKTsKCQkJfQoJCQltYXRjaGVycy5wdXNoKCBtYXRjaGVyICk7CgkJfQoJfQoKCXJldHVybiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTsKfQoKZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgewoJdmFyIGJ5U2V0ID0gc2V0TWF0Y2hlcnMubGVuZ3RoID4gMCwKCQlieUVsZW1lbnQgPSBlbGVtZW50TWF0Y2hlcnMubGVuZ3RoID4gMCwKCQlzdXBlck1hdGNoZXIgPSBmdW5jdGlvbiggc2VlZCwgY29udGV4dCwgeG1sLCByZXN1bHRzLCBvdXRlcm1vc3QgKSB7CgkJCXZhciBlbGVtLCBqLCBtYXRjaGVyLAoJCQkJbWF0Y2hlZENvdW50ID0gMCwKCQkJCWkgPSAiMCIsCgkJCQl1bm1hdGNoZWQgPSBzZWVkICYmIFtdLAoJCQkJc2V0TWF0Y2hlZCA9IFtdLAoJCQkJY29udGV4dEJhY2t1cCA9IG91dGVybW9zdENvbnRleHQsCgkJCQkvLyBXZSBtdXN0IGFsd2F5cyBoYXZlIGVpdGhlciBzZWVkIGVsZW1lbnRzIG9yIG91dGVybW9zdCBjb250ZXh0CgkJCQllbGVtcyA9IHNlZWQgfHwgYnlFbGVtZW50ICYmIEV4cHIuZmluZFsiVEFHIl0oICIqIiwgb3V0ZXJtb3N0ICksCgkJCQkvLyBVc2UgaW50ZWdlciBkaXJydW5zIGlmZiB0aGlzIGlzIHRoZSBvdXRlcm1vc3QgbWF0Y2hlcgoJCQkJZGlycnVuc1VuaXF1ZSA9IChkaXJydW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSksCgkJCQlsZW4gPSBlbGVtcy5sZW5ndGg7CgoJCQlpZiAoIG91dGVybW9zdCApIHsKCQkJCW91dGVybW9zdENvbnRleHQgPSBjb250ZXh0ID09PSBkb2N1bWVudCB8fCBjb250ZXh0IHx8IG91dGVybW9zdDsKCQkJfQoKCQkJLy8gQWRkIGVsZW1lbnRzIHBhc3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHMKCQkJLy8gU3VwcG9ydDogSUU8OSwgU2FmYXJpCgkJCS8vIFRvbGVyYXRlIE5vZGVMaXN0IHByb3BlcnRpZXMgKElFOiAibGVuZ3RoIjsgU2FmYXJpOiA8bnVtYmVyPikgbWF0Y2hpbmcgZWxlbWVudHMgYnkgaWQKCQkJZm9yICggOyBpICE9PSBsZW4gJiYgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBieUVsZW1lbnQgJiYgZWxlbSApIHsKCQkJCQlqID0gMDsKCQkJCQlpZiAoICFjb250ZXh0ICYmIGVsZW0ub3duZXJEb2N1bWVudCAhPT0gZG9jdW1lbnQgKSB7CgkJCQkJCXNldERvY3VtZW50KCBlbGVtICk7CgkJCQkJCXhtbCA9ICFkb2N1bWVudElzSFRNTDsKCQkJCQl9CgkJCQkJd2hpbGUgKCAobWF0Y2hlciA9IGVsZW1lbnRNYXRjaGVyc1tqKytdKSApIHsKCQkJCQkJaWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0IHx8IGRvY3VtZW50LCB4bWwpICkgewoJCQkJCQkJcmVzdWx0cy5wdXNoKCBlbGVtICk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCQkJCQlpZiAoIG91dGVybW9zdCApIHsKCQkJCQkJZGlycnVucyA9IGRpcnJ1bnNVbmlxdWU7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Igc2V0IGZpbHRlcnMKCQkJCWlmICggYnlTZXQgKSB7CgkJCQkJLy8gVGhleSB3aWxsIGhhdmUgZ29uZSB0aHJvdWdoIGFsbCBwb3NzaWJsZSBtYXRjaGVycwoJCQkJCWlmICggKGVsZW0gPSAhbWF0Y2hlciAmJiBlbGVtKSApIHsKCQkJCQkJbWF0Y2hlZENvdW50LS07CgkJCQkJfQoKCQkJCQkvLyBMZW5ndGhlbiB0aGUgYXJyYXkgZm9yIGV2ZXJ5IGVsZW1lbnQsIG1hdGNoZWQgb3Igbm90CgkJCQkJaWYgKCBzZWVkICkgewoJCQkJCQl1bm1hdGNoZWQucHVzaCggZWxlbSApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gYGlgIGlzIG5vdyB0aGUgY291bnQgb2YgZWxlbWVudHMgdmlzaXRlZCBhYm92ZSwgYW5kIGFkZGluZyBpdCB0byBgbWF0Y2hlZENvdW50YAoJCQkvLyBtYWtlcyB0aGUgbGF0dGVyIG5vbm5lZ2F0aXZlLgoJCQltYXRjaGVkQ291bnQgKz0gaTsKCgkJCS8vIEFwcGx5IHNldCBmaWx0ZXJzIHRvIHVubWF0Y2hlZCBlbGVtZW50cwoJCQkvLyBOT1RFOiBUaGlzIGNhbiBiZSBza2lwcGVkIGlmIHRoZXJlIGFyZSBubyB1bm1hdGNoZWQgZWxlbWVudHMgKGkuZS4sIGBtYXRjaGVkQ291bnRgCgkJCS8vIGVxdWFscyBgaWApLCB1bmxlc3Mgd2UgZGlkbid0IHZpc2l0IF9hbnlfIGVsZW1lbnRzIGluIHRoZSBhYm92ZSBsb29wIGJlY2F1c2Ugd2UgaGF2ZQoJCQkvLyBubyBlbGVtZW50IG1hdGNoZXJzIGFuZCBubyBzZWVkLgoJCQkvLyBJbmNyZW1lbnRpbmcgYW4gaW5pdGlhbGx5LXN0cmluZyAiMCIgYGlgIGFsbG93cyBgaWAgdG8gcmVtYWluIGEgc3RyaW5nIG9ubHkgaW4gdGhhdAoJCQkvLyBjYXNlLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhICIwMCIgYG1hdGNoZWRDb3VudGAgdGhhdCBkaWZmZXJzIGZyb20gYGlgIGJ1dCBpcyBhbHNvCgkJCS8vIG51bWVyaWNhbGx5IHplcm8uCgkJCWlmICggYnlTZXQgJiYgaSAhPT0gbWF0Y2hlZENvdW50ICkgewoJCQkJaiA9IDA7CgkJCQl3aGlsZSAoIChtYXRjaGVyID0gc2V0TWF0Y2hlcnNbaisrXSkgKSB7CgkJCQkJbWF0Y2hlciggdW5tYXRjaGVkLCBzZXRNYXRjaGVkLCBjb250ZXh0LCB4bWwgKTsKCQkJCX0KCgkJCQlpZiAoIHNlZWQgKSB7CgkJCQkJLy8gUmVpbnRlZ3JhdGUgZWxlbWVudCBtYXRjaGVzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3Igc29ydGluZwoJCQkJCWlmICggbWF0Y2hlZENvdW50ID4gMCApIHsKCQkJCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQkJCQlpZiAoICEodW5tYXRjaGVkW2ldIHx8IHNldE1hdGNoZWRbaV0pICkgewoJCQkJCQkJCXNldE1hdGNoZWRbaV0gPSBwb3AuY2FsbCggcmVzdWx0cyApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoKCQkJCQkvLyBEaXNjYXJkIGluZGV4IHBsYWNlaG9sZGVyIHZhbHVlcyB0byBnZXQgb25seSBhY3R1YWwgbWF0Y2hlcwoJCQkJCXNldE1hdGNoZWQgPSBjb25kZW5zZSggc2V0TWF0Y2hlZCApOwoJCQkJfQoKCQkJCS8vIEFkZCBtYXRjaGVzIHRvIHJlc3VsdHMKCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIHNldE1hdGNoZWQgKTsKCgkJCQkvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmcKCQkJCWlmICggb3V0ZXJtb3N0ICYmICFzZWVkICYmIHNldE1hdGNoZWQubGVuZ3RoID4gMCAmJgoJCQkJCSggbWF0Y2hlZENvdW50ICsgc2V0TWF0Y2hlcnMubGVuZ3RoICkgPiAxICkgewoKCQkJCQlTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApOwoJCQkJfQoJCQl9CgoJCQkvLyBPdmVycmlkZSBtYW5pcHVsYXRpb24gb2YgZ2xvYmFscyBieSBuZXN0ZWQgbWF0Y2hlcnMKCQkJaWYgKCBvdXRlcm1vc3QgKSB7CgkJCQlkaXJydW5zID0gZGlycnVuc1VuaXF1ZTsKCQkJCW91dGVybW9zdENvbnRleHQgPSBjb250ZXh0QmFja3VwOwoJCQl9CgoJCQlyZXR1cm4gdW5tYXRjaGVkOwoJCX07CgoJcmV0dXJuIGJ5U2V0ID8KCQltYXJrRnVuY3Rpb24oIHN1cGVyTWF0Y2hlciApIDoKCQlzdXBlck1hdGNoZXI7Cn0KCmNvbXBpbGUgPSBTaXp6bGUuY29tcGlsZSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgbWF0Y2ggLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7Cgl2YXIgaSwKCQlzZXRNYXRjaGVycyA9IFtdLAoJCWVsZW1lbnRNYXRjaGVycyA9IFtdLAoJCWNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgIiAiIF07CgoJaWYgKCAhY2FjaGVkICkgewoJCS8vIEdlbmVyYXRlIGEgZnVuY3Rpb24gb2YgcmVjdXJzaXZlIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoZWNrIGVhY2ggZWxlbWVudAoJCWlmICggIW1hdGNoICkgewoJCQltYXRjaCA9IHRva2VuaXplKCBzZWxlY3RvciApOwoJCX0KCQlpID0gbWF0Y2gubGVuZ3RoOwoJCXdoaWxlICggaS0tICkgewoJCQljYWNoZWQgPSBtYXRjaGVyRnJvbVRva2VucyggbWF0Y2hbaV0gKTsKCQkJaWYgKCBjYWNoZWRbIGV4cGFuZG8gXSApIHsKCQkJCXNldE1hdGNoZXJzLnB1c2goIGNhY2hlZCApOwoJCQl9IGVsc2UgewoJCQkJZWxlbWVudE1hdGNoZXJzLnB1c2goIGNhY2hlZCApOwoJCQl9CgkJfQoKCQkvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb24KCQljYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3RvciwgbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgKTsKCgkJLy8gU2F2ZSBzZWxlY3RvciBhbmQgdG9rZW5pemF0aW9uCgkJY2FjaGVkLnNlbGVjdG9yID0gc2VsZWN0b3I7Cgl9CglyZXR1cm4gY2FjaGVkOwp9OwoKLyoqCiAqIEEgbG93LWxldmVsIHNlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IHdvcmtzIHdpdGggU2l6emxlJ3MgY29tcGlsZWQKICogIHNlbGVjdG9yIGZ1bmN0aW9ucwogKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gc2VsZWN0b3IgQSBzZWxlY3RvciBvciBhIHByZS1jb21waWxlZAogKiAgc2VsZWN0b3IgZnVuY3Rpb24gYnVpbHQgd2l0aCBTaXp6bGUuY29tcGlsZQogKiBAcGFyYW0ge0VsZW1lbnR9IGNvbnRleHQKICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdHNdCiAqIEBwYXJhbSB7QXJyYXl9IFtzZWVkXSBBIHNldCBvZiBlbGVtZW50cyB0byBtYXRjaCBhZ2FpbnN0CiAqLwpzZWxlY3QgPSBTaXp6bGUuc2VsZWN0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICkgewoJdmFyIGksIHRva2VucywgdG9rZW4sIHR5cGUsIGZpbmQsCgkJY29tcGlsZWQgPSB0eXBlb2Ygc2VsZWN0b3IgPT09ICJmdW5jdGlvbiIgJiYgc2VsZWN0b3IsCgkJbWF0Y2ggPSAhc2VlZCAmJiB0b2tlbml6ZSggKHNlbGVjdG9yID0gY29tcGlsZWQuc2VsZWN0b3IgfHwgc2VsZWN0b3IpICk7CgoJcmVzdWx0cyA9IHJlc3VsdHMgfHwgW107CgoJLy8gVHJ5IHRvIG1pbmltaXplIG9wZXJhdGlvbnMgaWYgdGhlcmUgaXMgb25seSBvbmUgc2VsZWN0b3IgaW4gdGhlIGxpc3QgYW5kIG5vIHNlZWQKCS8vICh0aGUgbGF0dGVyIG9mIHdoaWNoIGd1YXJhbnRlZXMgdXMgY29udGV4dCkKCWlmICggbWF0Y2gubGVuZ3RoID09PSAxICkgewoKCQkvLyBSZWR1Y2UgY29udGV4dCBpZiB0aGUgbGVhZGluZyBjb21wb3VuZCBzZWxlY3RvciBpcyBhbiBJRAoJCXRva2VucyA9IG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAgKTsKCQlpZiAoIHRva2Vucy5sZW5ndGggPiAyICYmICh0b2tlbiA9IHRva2Vuc1swXSkudHlwZSA9PT0gIklEIiAmJgoJCQkJY29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiBkb2N1bWVudElzSFRNTCAmJiBFeHByLnJlbGF0aXZlWyB0b2tlbnNbMV0udHlwZSBdICkgewoKCQkJY29udGV4dCA9ICggRXhwci5maW5kWyJJRCJdKCB0b2tlbi5tYXRjaGVzWzBdLnJlcGxhY2UocnVuZXNjYXBlLCBmdW5lc2NhcGUpLCBjb250ZXh0ICkgfHwgW10gKVswXTsKCQkJaWYgKCAhY29udGV4dCApIHsKCQkJCXJldHVybiByZXN1bHRzOwoKCQkJLy8gUHJlY29tcGlsZWQgbWF0Y2hlcnMgd2lsbCBzdGlsbCB2ZXJpZnkgYW5jZXN0cnksIHNvIHN0ZXAgdXAgYSBsZXZlbAoJCQl9IGVsc2UgaWYgKCBjb21waWxlZCApIHsKCQkJCWNvbnRleHQgPSBjb250ZXh0LnBhcmVudE5vZGU7CgkJCX0KCgkJCXNlbGVjdG9yID0gc2VsZWN0b3Iuc2xpY2UoIHRva2Vucy5zaGlmdCgpLnZhbHVlLmxlbmd0aCApOwoJCX0KCgkJLy8gRmV0Y2ggYSBzZWVkIHNldCBmb3IgcmlnaHQtdG8tbGVmdCBtYXRjaGluZwoJCWkgPSBtYXRjaEV4cHJbIm5lZWRzQ29udGV4dCJdLnRlc3QoIHNlbGVjdG9yICkgPyAwIDogdG9rZW5zLmxlbmd0aDsKCQl3aGlsZSAoIGktLSApIHsKCQkJdG9rZW4gPSB0b2tlbnNbaV07CgoJCQkvLyBBYm9ydCBpZiB3ZSBoaXQgYSBjb21iaW5hdG9yCgkJCWlmICggRXhwci5yZWxhdGl2ZVsgKHR5cGUgPSB0b2tlbi50eXBlKSBdICkgewoJCQkJYnJlYWs7CgkJCX0KCQkJaWYgKCAoZmluZCA9IEV4cHIuZmluZFsgdHlwZSBdKSApIHsKCQkJCS8vIFNlYXJjaCwgZXhwYW5kaW5nIGNvbnRleHQgZm9yIGxlYWRpbmcgc2libGluZyBjb21iaW5hdG9ycwoJCQkJaWYgKCAoc2VlZCA9IGZpbmQoCgkJCQkJdG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLAoJCQkJCXJzaWJsaW5nLnRlc3QoIHRva2Vuc1swXS50eXBlICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8IGNvbnRleHQKCQkJCSkpICkgewoKCQkJCQkvLyBJZiBzZWVkIGlzIGVtcHR5IG9yIG5vIHRva2VucyByZW1haW4sIHdlIGNhbiByZXR1cm4gZWFybHkKCQkJCQl0b2tlbnMuc3BsaWNlKCBpLCAxICk7CgkJCQkJc2VsZWN0b3IgPSBzZWVkLmxlbmd0aCAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKTsKCQkJCQlpZiAoICFzZWxlY3RvciApIHsKCQkJCQkJcHVzaC5hcHBseSggcmVzdWx0cywgc2VlZCApOwoJCQkJCQlyZXR1cm4gcmVzdWx0czsKCQkJCQl9CgoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJfQoJfQoKCS8vIENvbXBpbGUgYW5kIGV4ZWN1dGUgYSBmaWx0ZXJpbmcgZnVuY3Rpb24gaWYgb25lIGlzIG5vdCBwcm92aWRlZAoJLy8gUHJvdmlkZSBgbWF0Y2hgIHRvIGF2b2lkIHJldG9rZW5pemF0aW9uIGlmIHdlIG1vZGlmaWVkIHRoZSBzZWxlY3RvciBhYm92ZQoJKCBjb21waWxlZCB8fCBjb21waWxlKCBzZWxlY3RvciwgbWF0Y2ggKSApKAoJCXNlZWQsCgkJY29udGV4dCwKCQkhZG9jdW1lbnRJc0hUTUwsCgkJcmVzdWx0cywKCQkhY29udGV4dCB8fCByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0CgkpOwoJcmV0dXJuIHJlc3VsdHM7Cn07CgovLyBPbmUtdGltZSBhc3NpZ25tZW50cwoKLy8gU29ydCBzdGFiaWxpdHkKc3VwcG9ydC5zb3J0U3RhYmxlID0gZXhwYW5kby5zcGxpdCgiIikuc29ydCggc29ydE9yZGVyICkuam9pbigiIikgPT09IGV4cGFuZG87CgovLyBTdXBwb3J0OiBDaHJvbWUgMTQtMzUrCi8vIEFsd2F5cyBhc3N1bWUgZHVwbGljYXRlcyBpZiB0aGV5IGFyZW4ndCBwYXNzZWQgdG8gdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24Kc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzID0gISFoYXNEdXBsaWNhdGU7CgovLyBJbml0aWFsaXplIGFnYWluc3QgdGhlIGRlZmF1bHQgZG9jdW1lbnQKc2V0RG9jdW1lbnQoKTsKCi8vIFN1cHBvcnQ6IFdlYmtpdDw1MzcuMzIgLSBTYWZhcmkgNi4wLjMvQ2hyb21lIDI1IChmaXhlZCBpbiBDaHJvbWUgMjcpCi8vIERldGFjaGVkIG5vZGVzIGNvbmZvdW5kaW5nbHkgZm9sbG93ICplYWNoIG90aGVyKgpzdXBwb3J0LnNvcnREZXRhY2hlZCA9IGFzc2VydChmdW5jdGlvbiggZWwgKSB7CgkvLyBTaG91bGQgcmV0dXJuIDEsIGJ1dCByZXR1cm5zIDQgKGZvbGxvd2luZykKCXJldHVybiBlbC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKSApICYgMTsKfSk7CgovLyBTdXBwb3J0OiBJRTw4Ci8vIFByZXZlbnQgYXR0cmlidXRlL3Byb3BlcnR5ICJpbnRlcnBvbGF0aW9uIgovLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNTM2NDI5JTI4VlMuODUlMjkuYXNweAppZiAoICFhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJZWwuaW5uZXJIVE1MID0gIjxhIGhyZWY9JyMnPjwvYT4iOwoJcmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikgPT09ICIjIiA7Cn0pICkgewoJYWRkSGFuZGxlKCAidHlwZXxocmVmfGhlaWdodHx3aWR0aCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHsKCQlpZiAoICFpc1hNTCApIHsKCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJ0eXBlIiA/IDEgOiAyICk7CgkJfQoJfSk7Cn0KCi8vIFN1cHBvcnQ6IElFPDkKLy8gVXNlIGRlZmF1bHRWYWx1ZSBpbiBwbGFjZSBvZiBnZXRBdHRyaWJ1dGUoInZhbHVlIikKaWYgKCAhc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJZWwuaW5uZXJIVE1MID0gIjxpbnB1dC8+IjsKCWVsLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCAidmFsdWUiLCAiIiApOwoJcmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCAidmFsdWUiICkgPT09ICIiOwp9KSApIHsKCWFkZEhhbmRsZSggInZhbHVlIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkgewoJCWlmICggIWlzWE1MICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gImlucHV0IiApIHsKCQkJcmV0dXJuIGVsZW0uZGVmYXVsdFZhbHVlOwoJCX0KCX0pOwp9CgovLyBTdXBwb3J0OiBJRTw5Ci8vIFVzZSBnZXRBdHRyaWJ1dGVOb2RlIHRvIGZldGNoIGJvb2xlYW5zIHdoZW4gZ2V0QXR0cmlidXRlIGxpZXMKaWYgKCAhYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHsKCXJldHVybiBlbC5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikgPT0gbnVsbDsKfSkgKSB7CglhZGRIYW5kbGUoIGJvb2xlYW5zLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7CgkJdmFyIHZhbDsKCQlpZiAoICFpc1hNTCApIHsKCQkJcmV0dXJuIGVsZW1bIG5hbWUgXSA9PT0gdHJ1ZSA/IG5hbWUudG9Mb3dlckNhc2UoKSA6CgkJCQkJKHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApKSAmJiB2YWwuc3BlY2lmaWVkID8KCQkJCQl2YWwudmFsdWUgOgoJCQkJbnVsbDsKCQl9Cgl9KTsKfQoKcmV0dXJuIFNpenpsZTsKCn0pKCB3aW5kb3cgKTsKCgoKalF1ZXJ5LmZpbmQgPSBTaXp6bGU7CmpRdWVyeS5leHByID0gU2l6emxlLnNlbGVjdG9yczsKCi8vIERlcHJlY2F0ZWQKalF1ZXJ5LmV4cHJbICI6IiBdID0galF1ZXJ5LmV4cHIucHNldWRvczsKalF1ZXJ5LnVuaXF1ZVNvcnQgPSBqUXVlcnkudW5pcXVlID0gU2l6emxlLnVuaXF1ZVNvcnQ7CmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7CmpRdWVyeS5pc1hNTERvYyA9IFNpenpsZS5pc1hNTDsKalF1ZXJ5LmNvbnRhaW5zID0gU2l6emxlLmNvbnRhaW5zOwpqUXVlcnkuZXNjYXBlU2VsZWN0b3IgPSBTaXp6bGUuZXNjYXBlOwoKCgoKdmFyIGRpciA9IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkgewoJdmFyIG1hdGNoZWQgPSBbXSwKCQl0cnVuY2F0ZSA9IHVudGlsICE9PSB1bmRlZmluZWQ7CgoJd2hpbGUgKCAoIGVsZW0gPSBlbGVtWyBkaXIgXSApICYmIGVsZW0ubm9kZVR5cGUgIT09IDkgKSB7CgkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQlpZiAoIHRydW5jYXRlICYmIGpRdWVyeSggZWxlbSApLmlzKCB1bnRpbCApICkgewoJCQkJYnJlYWs7CgkJCX0KCQkJbWF0Y2hlZC5wdXNoKCBlbGVtICk7CgkJfQoJfQoJcmV0dXJuIG1hdGNoZWQ7Cn07CgoKdmFyIHNpYmxpbmdzID0gZnVuY3Rpb24oIG4sIGVsZW0gKSB7Cgl2YXIgbWF0Y2hlZCA9IFtdOwoKCWZvciAoIDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcgKSB7CgkJaWYgKCBuLm5vZGVUeXBlID09PSAxICYmIG4gIT09IGVsZW0gKSB7CgkJCW1hdGNoZWQucHVzaCggbiApOwoJCX0KCX0KCglyZXR1cm4gbWF0Y2hlZDsKfTsKCgp2YXIgcm5lZWRzQ29udGV4dCA9IGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dDsKCgoKZnVuY3Rpb24gbm9kZU5hbWUoIGVsZW0sIG5hbWUgKSB7CgogIHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpOwoKfTsKdmFyIHJzaW5nbGVUYWcgPSAoIC9ePChbYS16XVteXC9cMD46XHgyMFx0XHJcblxmXSopW1x4MjBcdFxyXG5cZl0qXC8/Pig/OjxcL1wxPnwpJC9pICk7CgoKCi8vIEltcGxlbWVudCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGZpbHRlciBhbmQgbm90CmZ1bmN0aW9uIHdpbm5vdyggZWxlbWVudHMsIHF1YWxpZmllciwgbm90ICkgewoJaWYgKCBpc0Z1bmN0aW9uKCBxdWFsaWZpZXIgKSApIHsKCQlyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKCQkJcmV0dXJuICEhcXVhbGlmaWVyLmNhbGwoIGVsZW0sIGksIGVsZW0gKSAhPT0gbm90OwoJCX0gKTsKCX0KCgkvLyBTaW5nbGUgZWxlbWVudAoJaWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7CgkJcmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiAoIGVsZW0gPT09IHF1YWxpZmllciApICE9PSBub3Q7CgkJfSApOwoJfQoKCS8vIEFycmF5bGlrZSBvZiBlbGVtZW50cyAoalF1ZXJ5LCBhcmd1bWVudHMsIEFycmF5KQoJaWYgKCB0eXBlb2YgcXVhbGlmaWVyICE9PSAic3RyaW5nIiApIHsKCQlyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuICggaW5kZXhPZi5jYWxsKCBxdWFsaWZpZXIsIGVsZW0gKSA+IC0xICkgIT09IG5vdDsKCQl9ICk7Cgl9CgoJLy8gRmlsdGVyZWQgZGlyZWN0bHkgZm9yIGJvdGggc2ltcGxlIGFuZCBjb21wbGV4IHNlbGVjdG9ycwoJcmV0dXJuIGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZWxlbWVudHMsIG5vdCApOwp9CgpqUXVlcnkuZmlsdGVyID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7Cgl2YXIgZWxlbSA9IGVsZW1zWyAwIF07CgoJaWYgKCBub3QgKSB7CgkJZXhwciA9ICI6bm90KCIgKyBleHByICsgIikiOwoJfQoKCWlmICggZWxlbXMubGVuZ3RoID09PSAxICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgkJcmV0dXJuIGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZWxlbSwgZXhwciApID8gWyBlbGVtIF0gOiBbXTsKCX0KCglyZXR1cm4galF1ZXJ5LmZpbmQubWF0Y2hlcyggZXhwciwgalF1ZXJ5LmdyZXAoIGVsZW1zLCBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMTsKCX0gKSApOwp9OwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJZmluZDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciBpLCByZXQsCgkJCWxlbiA9IHRoaXMubGVuZ3RoLAoJCQlzZWxmID0gdGhpczsKCgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewoJCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeSggc2VsZWN0b3IgKS5maWx0ZXIoIGZ1bmN0aW9uKCkgewoJCQkJZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKCQkJCQlpZiAoIGpRdWVyeS5jb250YWlucyggc2VsZlsgaSBdLCB0aGlzICkgKSB7CgkJCQkJCXJldHVybiB0cnVlOwoJCQkJCX0KCQkJCX0KCQkJfSApICk7CgkJfQoKCQlyZXQgPSB0aGlzLnB1c2hTdGFjayggW10gKTsKCgkJZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKCQkJalF1ZXJ5LmZpbmQoIHNlbGVjdG9yLCBzZWxmWyBpIF0sIHJldCApOwoJCX0KCgkJcmV0dXJuIGxlbiA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggcmV0ICkgOiByZXQ7Cgl9LAoJZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCBmYWxzZSApICk7Cgl9LAoJbm90OiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCB0cnVlICkgKTsKCX0sCglpczogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiAhIXdpbm5vdygKCQkJdGhpcywKCgkJCS8vIElmIHRoaXMgaXMgYSBwb3NpdGlvbmFsL3JlbGF0aXZlIHNlbGVjdG9yLCBjaGVjayBtZW1iZXJzaGlwIGluIHRoZSByZXR1cm5lZCBzZXQKCQkJLy8gc28gJCgicDpmaXJzdCIpLmlzKCJwOmxhc3QiKSB3b24ndCByZXR1cm4gdHJ1ZSBmb3IgYSBkb2Mgd2l0aCB0d28gInAiLgoJCQl0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICYmIHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSA/CgkJCQlqUXVlcnkoIHNlbGVjdG9yICkgOgoJCQkJc2VsZWN0b3IgfHwgW10sCgkJCWZhbHNlCgkJKS5sZW5ndGg7Cgl9Cn0gKTsKCgovLyBJbml0aWFsaXplIGEgalF1ZXJ5IG9iamVjdAoKCi8vIEEgY2VudHJhbCByZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRvY3VtZW50KQp2YXIgcm9vdGpRdWVyeSwKCgkvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5ncwoJLy8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKCM5NTIxKQoJLy8gU3RyaWN0IEhUTUwgcmVjb2duaXRpb24gKCMxMTI5MDogbXVzdCBzdGFydCB3aXRoIDwpCgkvLyBTaG9ydGN1dCBzaW1wbGUgI2lkIGNhc2UgZm9yIHNwZWVkCglycXVpY2tFeHByID0gL14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0rKSkkLywKCglpbml0ID0galF1ZXJ5LmZuLmluaXQgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3QgKSB7CgkJdmFyIG1hdGNoLCBlbGVtOwoKCQkvLyBIQU5ETEU6ICQoIiIpLCAkKG51bGwpLCAkKHVuZGVmaW5lZCksICQoZmFsc2UpCgkJaWYgKCAhc2VsZWN0b3IgKSB7CgkJCXJldHVybiB0aGlzOwoJCX0KCgkJLy8gTWV0aG9kIGluaXQoKSBhY2NlcHRzIGFuIGFsdGVybmF0ZSByb290alF1ZXJ5CgkJLy8gc28gbWlncmF0ZSBjYW4gc3VwcG9ydCBqUXVlcnkuc3ViIChnaC0yMTAxKQoJCXJvb3QgPSByb290IHx8IHJvb3RqUXVlcnk7CgoJCS8vIEhhbmRsZSBIVE1MIHN0cmluZ3MKCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCWlmICggc2VsZWN0b3JbIDAgXSA9PT0gIjwiICYmCgkJCQlzZWxlY3Rvclsgc2VsZWN0b3IubGVuZ3RoIC0gMSBdID09PSAiPiIgJiYKCQkJCXNlbGVjdG9yLmxlbmd0aCA+PSAzICkgewoKCQkJCS8vIEFzc3VtZSB0aGF0IHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNraXAgdGhlIHJlZ2V4IGNoZWNrCgkJCQltYXRjaCA9IFsgbnVsbCwgc2VsZWN0b3IsIG51bGwgXTsKCgkJCX0gZWxzZSB7CgkJCQltYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTsKCQkJfQoKCQkJLy8gTWF0Y2ggaHRtbCBvciBtYWtlIHN1cmUgbm8gY29udGV4dCBpcyBzcGVjaWZpZWQgZm9yICNpZAoJCQlpZiAoIG1hdGNoICYmICggbWF0Y2hbIDEgXSB8fCAhY29udGV4dCApICkgewoKCQkJCS8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KQoJCQkJaWYgKCBtYXRjaFsgMSBdICkgewoJCQkJCWNvbnRleHQgPSBjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5ID8gY29udGV4dFsgMCBdIDogY29udGV4dDsKCgkJCQkJLy8gT3B0aW9uIHRvIHJ1biBzY3JpcHRzIGlzIHRydWUgZm9yIGJhY2stY29tcGF0CgkJCQkJLy8gSW50ZW50aW9uYWxseSBsZXQgdGhlIGVycm9yIGJlIHRocm93biBpZiBwYXJzZUhUTUwgaXMgbm90IHByZXNlbnQKCQkJCQlqUXVlcnkubWVyZ2UoIHRoaXMsIGpRdWVyeS5wYXJzZUhUTUwoCgkJCQkJCW1hdGNoWyAxIF0sCgkJCQkJCWNvbnRleHQgJiYgY29udGV4dC5ub2RlVHlwZSA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogZG9jdW1lbnQsCgkJCQkJCXRydWUKCQkJCQkpICk7CgoJCQkJCS8vIEhBTkRMRTogJChodG1sLCBwcm9wcykKCQkJCQlpZiAoIHJzaW5nbGVUYWcudGVzdCggbWF0Y2hbIDEgXSApICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb250ZXh0ICkgKSB7CgkJCQkJCWZvciAoIG1hdGNoIGluIGNvbnRleHQgKSB7CgoJCQkJCQkJLy8gUHJvcGVydGllcyBvZiBjb250ZXh0IGFyZSBjYWxsZWQgYXMgbWV0aG9kcyBpZiBwb3NzaWJsZQoJCQkJCQkJaWYgKCBpc0Z1bmN0aW9uKCB0aGlzWyBtYXRjaCBdICkgKSB7CgkJCQkJCQkJdGhpc1sgbWF0Y2ggXSggY29udGV4dFsgbWF0Y2ggXSApOwoKCQkJCQkJCS8vIC4uLmFuZCBvdGhlcndpc2Ugc2V0IGFzIGF0dHJpYnV0ZXMKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJdGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoKCQkJCQlyZXR1cm4gdGhpczsKCgkJCQkvLyBIQU5ETEU6ICQoI2lkKQoJCQkJfSBlbHNlIHsKCQkJCQllbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWyAyIF0gKTsKCgkJCQkJaWYgKCBlbGVtICkgewoKCQkJCQkJLy8gSW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3QKCQkJCQkJdGhpc1sgMCBdID0gZWxlbTsKCQkJCQkJdGhpcy5sZW5ndGggPSAxOwoJCQkJCX0KCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0KCgkJCS8vIEhBTkRMRTogJChleHByLCAkKC4uLikpCgkJCX0gZWxzZSBpZiAoICFjb250ZXh0IHx8IGNvbnRleHQuanF1ZXJ5ICkgewoJCQkJcmV0dXJuICggY29udGV4dCB8fCByb290ICkuZmluZCggc2VsZWN0b3IgKTsKCgkJCS8vIEhBTkRMRTogJChleHByLCBjb250ZXh0KQoJCQkvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcikKCQkJfSBlbHNlIHsKCQkJCXJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTsKCQkJfQoKCQkvLyBIQU5ETEU6ICQoRE9NRWxlbWVudCkKCQl9IGVsc2UgaWYgKCBzZWxlY3Rvci5ub2RlVHlwZSApIHsKCQkJdGhpc1sgMCBdID0gc2VsZWN0b3I7CgkJCXRoaXMubGVuZ3RoID0gMTsKCQkJcmV0dXJuIHRoaXM7CgoJCS8vIEhBTkRMRTogJChmdW5jdGlvbikKCQkvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHkKCQl9IGVsc2UgaWYgKCBpc0Z1bmN0aW9uKCBzZWxlY3RvciApICkgewoJCQlyZXR1cm4gcm9vdC5yZWFkeSAhPT0gdW5kZWZpbmVkID8KCQkJCXJvb3QucmVhZHkoIHNlbGVjdG9yICkgOgoKCQkJCS8vIEV4ZWN1dGUgaW1tZWRpYXRlbHkgaWYgcmVhZHkgaXMgbm90IHByZXNlbnQKCQkJCXNlbGVjdG9yKCBqUXVlcnkgKTsKCQl9CgoJCXJldHVybiBqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciwgdGhpcyApOwoJfTsKCi8vIEdpdmUgdGhlIGluaXQgZnVuY3Rpb24gdGhlIGpRdWVyeSBwcm90b3R5cGUgZm9yIGxhdGVyIGluc3RhbnRpYXRpb24KaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47CgovLyBJbml0aWFsaXplIGNlbnRyYWwgcmVmZXJlbmNlCnJvb3RqUXVlcnkgPSBqUXVlcnkoIGRvY3VtZW50ICk7CgoKdmFyIHJwYXJlbnRzcHJldiA9IC9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLAoKCS8vIE1ldGhvZHMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgdW5pcXVlIHNldCB3aGVuIHN0YXJ0aW5nIGZyb20gYSB1bmlxdWUgc2V0CglndWFyYW50ZWVkVW5pcXVlID0gewoJCWNoaWxkcmVuOiB0cnVlLAoJCWNvbnRlbnRzOiB0cnVlLAoJCW5leHQ6IHRydWUsCgkJcHJldjogdHJ1ZQoJfTsKCmpRdWVyeS5mbi5leHRlbmQoIHsKCWhhczogZnVuY3Rpb24oIHRhcmdldCApIHsKCQl2YXIgdGFyZ2V0cyA9IGpRdWVyeSggdGFyZ2V0LCB0aGlzICksCgkJCWwgPSB0YXJnZXRzLmxlbmd0aDsKCgkJcmV0dXJuIHRoaXMuZmlsdGVyKCBmdW5jdGlvbigpIHsKCQkJdmFyIGkgPSAwOwoJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJCQlpZiAoIGpRdWVyeS5jb250YWlucyggdGhpcywgdGFyZ2V0c1sgaSBdICkgKSB7CgkJCQkJcmV0dXJuIHRydWU7CgkJCQl9CgkJCX0KCQl9ICk7Cgl9LAoKCWNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvcnMsIGNvbnRleHQgKSB7CgkJdmFyIGN1ciwKCQkJaSA9IDAsCgkJCWwgPSB0aGlzLmxlbmd0aCwKCQkJbWF0Y2hlZCA9IFtdLAoJCQl0YXJnZXRzID0gdHlwZW9mIHNlbGVjdG9ycyAhPT0gInN0cmluZyIgJiYgalF1ZXJ5KCBzZWxlY3RvcnMgKTsKCgkJLy8gUG9zaXRpb25hbCBzZWxlY3RvcnMgbmV2ZXIgbWF0Y2gsIHNpbmNlIHRoZXJlJ3Mgbm8gX3NlbGVjdGlvbl8gY29udGV4dAoJCWlmICggIXJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3JzICkgKSB7CgkJCWZvciAoIDsgaSA8IGw7IGkrKyApIHsKCQkJCWZvciAoIGN1ciA9IHRoaXNbIGkgXTsgY3VyICYmIGN1ciAhPT0gY29udGV4dDsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7CgoJCQkJCS8vIEFsd2F5cyBza2lwIGRvY3VtZW50IGZyYWdtZW50cwoJCQkJCWlmICggY3VyLm5vZGVUeXBlIDwgMTEgJiYgKCB0YXJnZXRzID8KCQkJCQkJdGFyZ2V0cy5pbmRleCggY3VyICkgPiAtMSA6CgoJCQkJCQkvLyBEb24ndCBwYXNzIG5vbi1lbGVtZW50cyB0byBTaXp6bGUKCQkJCQkJY3VyLm5vZGVUeXBlID09PSAxICYmCgkJCQkJCQlqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGN1ciwgc2VsZWN0b3JzICkgKSApIHsKCgkJCQkJCW1hdGNoZWQucHVzaCggY3VyICk7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkLmxlbmd0aCA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApIDogbWF0Y2hlZCApOwoJfSwKCgkvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluIHRoZSBzZXQKCWluZGV4OiBmdW5jdGlvbiggZWxlbSApIHsKCgkJLy8gTm8gYXJndW1lbnQsIHJldHVybiBpbmRleCBpbiBwYXJlbnQKCQlpZiAoICFlbGVtICkgewoJCQlyZXR1cm4gKCB0aGlzWyAwIF0gJiYgdGhpc1sgMCBdLnBhcmVudE5vZGUgKSA/IHRoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoIDogLTE7CgkJfQoKCQkvLyBJbmRleCBpbiBzZWxlY3RvcgoJCWlmICggdHlwZW9mIGVsZW0gPT09ICJzdHJpbmciICkgewoJCQlyZXR1cm4gaW5kZXhPZi5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdGhpc1sgMCBdICk7CgkJfQoKCQkvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQKCQlyZXR1cm4gaW5kZXhPZi5jYWxsKCB0aGlzLAoKCQkJLy8gSWYgaXQgcmVjZWl2ZXMgYSBqUXVlcnkgb2JqZWN0LCB0aGUgZmlyc3QgZWxlbWVudCBpcyB1c2VkCgkJCWVsZW0uanF1ZXJ5ID8gZWxlbVsgMCBdIDogZWxlbQoJCSk7Cgl9LAoKCWFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjaygKCQkJalF1ZXJ5LnVuaXF1ZVNvcnQoCgkJCQlqUXVlcnkubWVyZ2UoIHRoaXMuZ2V0KCksIGpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgKSApCgkJCSkKCQkpOwoJfSwKCglhZGRCYWNrOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMuYWRkKCBzZWxlY3RvciA9PSBudWxsID8KCQkJdGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZpbHRlciggc2VsZWN0b3IgKQoJCSk7Cgl9Cn0gKTsKCmZ1bmN0aW9uIHNpYmxpbmcoIGN1ciwgZGlyICkgewoJd2hpbGUgKCAoIGN1ciA9IGN1clsgZGlyIF0gKSAmJiBjdXIubm9kZVR5cGUgIT09IDEgKSB7fQoJcmV0dXJuIGN1cjsKfQoKalF1ZXJ5LmVhY2goIHsKCXBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQlyZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMTEgPyBwYXJlbnQgOiBudWxsOwoJfSwKCXBhcmVudHM6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJwYXJlbnROb2RlIiApOwoJfSwKCXBhcmVudHNVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJwYXJlbnROb2RlIiwgdW50aWwgKTsKCX0sCgluZXh0OiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gc2libGluZyggZWxlbSwgIm5leHRTaWJsaW5nIiApOwoJfSwKCXByZXY6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBzaWJsaW5nKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiApOwoJfSwKCW5leHRBbGw6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJuZXh0U2libGluZyIgKTsKCX0sCglwcmV2QWxsOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZGlyKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiApOwoJfSwKCW5leHRVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJuZXh0U2libGluZyIsIHVudGlsICk7Cgl9LAoJcHJldlVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7CgkJcmV0dXJuIGRpciggZWxlbSwgInByZXZpb3VzU2libGluZyIsIHVudGlsICk7Cgl9LAoJc2libGluZ3M6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBzaWJsaW5ncyggKCBlbGVtLnBhcmVudE5vZGUgfHwge30gKS5maXJzdENoaWxkLCBlbGVtICk7Cgl9LAoJY2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBzaWJsaW5ncyggZWxlbS5maXJzdENoaWxkICk7Cgl9LAoJY29udGVudHM6IGZ1bmN0aW9uKCBlbGVtICkgewogICAgICAgIGlmICggbm9kZU5hbWUoIGVsZW0sICJpZnJhbWUiICkgKSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtLmNvbnRlbnREb2N1bWVudDsKICAgICAgICB9CgogICAgICAgIC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5LCBpT1MgNyBvbmx5LCBBbmRyb2lkIEJyb3dzZXIgPD00LjMgb25seQogICAgICAgIC8vIFRyZWF0IHRoZSB0ZW1wbGF0ZSBlbGVtZW50IGFzIGEgcmVndWxhciBvbmUgaW4gYnJvd3NlcnMgdGhhdAogICAgICAgIC8vIGRvbid0IHN1cHBvcnQgaXQuCiAgICAgICAgaWYgKCBub2RlTmFtZSggZWxlbSwgInRlbXBsYXRlIiApICkgewogICAgICAgICAgICBlbGVtID0gZWxlbS5jb250ZW50IHx8IGVsZW07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgZWxlbS5jaGlsZE5vZGVzICk7Cgl9Cn0sIGZ1bmN0aW9uKCBuYW1lLCBmbiApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHVudGlsLCBzZWxlY3RvciApIHsKCQl2YXIgbWF0Y2hlZCA9IGpRdWVyeS5tYXAoIHRoaXMsIGZuLCB1bnRpbCApOwoKCQlpZiAoIG5hbWUuc2xpY2UoIC01ICkgIT09ICJVbnRpbCIgKSB7CgkJCXNlbGVjdG9yID0gdW50aWw7CgkJfQoKCQlpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCW1hdGNoZWQgPSBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgbWF0Y2hlZCApOwoJCX0KCgkJaWYgKCB0aGlzLmxlbmd0aCA+IDEgKSB7CgoJCQkvLyBSZW1vdmUgZHVwbGljYXRlcwoJCQlpZiAoICFndWFyYW50ZWVkVW5pcXVlWyBuYW1lIF0gKSB7CgkJCQlqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApOwoJCQl9CgoJCQkvLyBSZXZlcnNlIG9yZGVyIGZvciBwYXJlbnRzKiBhbmQgcHJldi1kZXJpdmF0aXZlcwoJCQlpZiAoIHJwYXJlbnRzcHJldi50ZXN0KCBuYW1lICkgKSB7CgkJCQltYXRjaGVkLnJldmVyc2UoKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkICk7Cgl9Owp9ICk7CnZhciBybm90aHRtbHdoaXRlID0gKCAvW15ceDIwXHRcclxuXGZdKy9nICk7CgoKCi8vIENvbnZlcnQgU3RyaW5nLWZvcm1hdHRlZCBvcHRpb25zIGludG8gT2JqZWN0LWZvcm1hdHRlZCBvbmVzCmZ1bmN0aW9uIGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSB7Cgl2YXIgb2JqZWN0ID0ge307CglqUXVlcnkuZWFjaCggb3B0aW9ucy5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdLCBmdW5jdGlvbiggXywgZmxhZyApIHsKCQlvYmplY3RbIGZsYWcgXSA9IHRydWU7Cgl9ICk7CglyZXR1cm4gb2JqZWN0Owp9CgovKgogKiBDcmVhdGUgYSBjYWxsYmFjayBsaXN0IHVzaW5nIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKICoKICoJb3B0aW9uczogYW4gb3B0aW9uYWwgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgb3B0aW9ucyB0aGF0IHdpbGwgY2hhbmdlIGhvdwogKgkJCXRoZSBjYWxsYmFjayBsaXN0IGJlaGF2ZXMgb3IgYSBtb3JlIHRyYWRpdGlvbmFsIG9wdGlvbiBvYmplY3QKICoKICogQnkgZGVmYXVsdCBhIGNhbGxiYWNrIGxpc3Qgd2lsbCBhY3QgbGlrZSBhbiBldmVudCBjYWxsYmFjayBsaXN0IGFuZCBjYW4gYmUKICogImZpcmVkIiBtdWx0aXBsZSB0aW1lcy4KICoKICogUG9zc2libGUgb3B0aW9uczoKICoKICoJb25jZToJCQl3aWxsIGVuc3VyZSB0aGUgY2FsbGJhY2sgbGlzdCBjYW4gb25seSBiZSBmaXJlZCBvbmNlIChsaWtlIGEgRGVmZXJyZWQpCiAqCiAqCW1lbW9yeToJCQl3aWxsIGtlZXAgdHJhY2sgb2YgcHJldmlvdXMgdmFsdWVzIGFuZCB3aWxsIGNhbGwgYW55IGNhbGxiYWNrIGFkZGVkCiAqCQkJCQlhZnRlciB0aGUgbGlzdCBoYXMgYmVlbiBmaXJlZCByaWdodCBhd2F5IHdpdGggdGhlIGxhdGVzdCAibWVtb3JpemVkIgogKgkJCQkJdmFsdWVzIChsaWtlIGEgRGVmZXJyZWQpCiAqCiAqCXVuaXF1ZToJCQl3aWxsIGVuc3VyZSBhIGNhbGxiYWNrIGNhbiBvbmx5IGJlIGFkZGVkIG9uY2UgKG5vIGR1cGxpY2F0ZSBpbiB0aGUgbGlzdCkKICoKICoJc3RvcE9uRmFsc2U6CWludGVycnVwdCBjYWxsaW5ncyB3aGVuIGEgY2FsbGJhY2sgcmV0dXJucyBmYWxzZQogKgogKi8KalF1ZXJ5LkNhbGxiYWNrcyA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewoKCS8vIENvbnZlcnQgb3B0aW9ucyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2JqZWN0LWZvcm1hdHRlZCBpZiBuZWVkZWQKCS8vICh3ZSBjaGVjayBpbiBjYWNoZSBmaXJzdCkKCW9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gInN0cmluZyIgPwoJCWNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSA6CgkJalF1ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMgKTsKCgl2YXIgLy8gRmxhZyB0byBrbm93IGlmIGxpc3QgaXMgY3VycmVudGx5IGZpcmluZwoJCWZpcmluZywKCgkJLy8gTGFzdCBmaXJlIHZhbHVlIGZvciBub24tZm9yZ2V0dGFibGUgbGlzdHMKCQltZW1vcnksCgoJCS8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IHdhcyBhbHJlYWR5IGZpcmVkCgkJZmlyZWQsCgoJCS8vIEZsYWcgdG8gcHJldmVudCBmaXJpbmcKCQlsb2NrZWQsCgoJCS8vIEFjdHVhbCBjYWxsYmFjayBsaXN0CgkJbGlzdCA9IFtdLAoKCQkvLyBRdWV1ZSBvZiBleGVjdXRpb24gZGF0YSBmb3IgcmVwZWF0YWJsZSBsaXN0cwoJCXF1ZXVlID0gW10sCgoJCS8vIEluZGV4IG9mIGN1cnJlbnRseSBmaXJpbmcgY2FsbGJhY2sgKG1vZGlmaWVkIGJ5IGFkZC9yZW1vdmUgYXMgbmVlZGVkKQoJCWZpcmluZ0luZGV4ID0gLTEsCgoJCS8vIEZpcmUgY2FsbGJhY2tzCgkJZmlyZSA9IGZ1bmN0aW9uKCkgewoKCQkJLy8gRW5mb3JjZSBzaW5nbGUtZmlyaW5nCgkJCWxvY2tlZCA9IGxvY2tlZCB8fCBvcHRpb25zLm9uY2U7CgoJCQkvLyBFeGVjdXRlIGNhbGxiYWNrcyBmb3IgYWxsIHBlbmRpbmcgZXhlY3V0aW9ucywKCQkJLy8gcmVzcGVjdGluZyBmaXJpbmdJbmRleCBvdmVycmlkZXMgYW5kIHJ1bnRpbWUgY2hhbmdlcwoJCQlmaXJlZCA9IGZpcmluZyA9IHRydWU7CgkJCWZvciAoIDsgcXVldWUubGVuZ3RoOyBmaXJpbmdJbmRleCA9IC0xICkgewoJCQkJbWVtb3J5ID0gcXVldWUuc2hpZnQoKTsKCQkJCXdoaWxlICggKytmaXJpbmdJbmRleCA8IGxpc3QubGVuZ3RoICkgewoKCQkJCQkvLyBSdW4gY2FsbGJhY2sgYW5kIGNoZWNrIGZvciBlYXJseSB0ZXJtaW5hdGlvbgoJCQkJCWlmICggbGlzdFsgZmlyaW5nSW5kZXggXS5hcHBseSggbWVtb3J5WyAwIF0sIG1lbW9yeVsgMSBdICkgPT09IGZhbHNlICYmCgkJCQkJCW9wdGlvbnMuc3RvcE9uRmFsc2UgKSB7CgoJCQkJCQkvLyBKdW1wIHRvIGVuZCBhbmQgZm9yZ2V0IHRoZSBkYXRhIHNvIC5hZGQgZG9lc24ndCByZS1maXJlCgkJCQkJCWZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGg7CgkJCQkJCW1lbW9yeSA9IGZhbHNlOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gRm9yZ2V0IHRoZSBkYXRhIGlmIHdlJ3JlIGRvbmUgd2l0aCBpdAoJCQlpZiAoICFvcHRpb25zLm1lbW9yeSApIHsKCQkJCW1lbW9yeSA9IGZhbHNlOwoJCQl9CgoJCQlmaXJpbmcgPSBmYWxzZTsKCgkJCS8vIENsZWFuIHVwIGlmIHdlJ3JlIGRvbmUgZmlyaW5nIGZvciBnb29kCgkJCWlmICggbG9ja2VkICkgewoKCQkJCS8vIEtlZXAgYW4gZW1wdHkgbGlzdCBpZiB3ZSBoYXZlIGRhdGEgZm9yIGZ1dHVyZSBhZGQgY2FsbHMKCQkJCWlmICggbWVtb3J5ICkgewoJCQkJCWxpc3QgPSBbXTsKCgkJCQkvLyBPdGhlcndpc2UsIHRoaXMgb2JqZWN0IGlzIHNwZW50CgkJCQl9IGVsc2UgewoJCQkJCWxpc3QgPSAiIjsKCQkJCX0KCQkJfQoJCX0sCgoJCS8vIEFjdHVhbCBDYWxsYmFja3Mgb2JqZWN0CgkJc2VsZiA9IHsKCgkJCS8vIEFkZCBhIGNhbGxiYWNrIG9yIGEgY29sbGVjdGlvbiBvZiBjYWxsYmFja3MgdG8gdGhlIGxpc3QKCQkJYWRkOiBmdW5jdGlvbigpIHsKCQkJCWlmICggbGlzdCApIHsKCgkJCQkJLy8gSWYgd2UgaGF2ZSBtZW1vcnkgZnJvbSBhIHBhc3QgcnVuLCB3ZSBzaG91bGQgZmlyZSBhZnRlciBhZGRpbmcKCQkJCQlpZiAoIG1lbW9yeSAmJiAhZmlyaW5nICkgewoJCQkJCQlmaXJpbmdJbmRleCA9IGxpc3QubGVuZ3RoIC0gMTsKCQkJCQkJcXVldWUucHVzaCggbWVtb3J5ICk7CgkJCQkJfQoKCQkJCQkoIGZ1bmN0aW9uIGFkZCggYXJncyApIHsKCQkJCQkJalF1ZXJ5LmVhY2goIGFyZ3MsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7CgkJCQkJCQlpZiAoIGlzRnVuY3Rpb24oIGFyZyApICkgewoJCQkJCQkJCWlmICggIW9wdGlvbnMudW5pcXVlIHx8ICFzZWxmLmhhcyggYXJnICkgKSB7CgkJCQkJCQkJCWxpc3QucHVzaCggYXJnICk7CgkJCQkJCQkJfQoJCQkJCQkJfSBlbHNlIGlmICggYXJnICYmIGFyZy5sZW5ndGggJiYgdG9UeXBlKCBhcmcgKSAhPT0gInN0cmluZyIgKSB7CgoJCQkJCQkJCS8vIEluc3BlY3QgcmVjdXJzaXZlbHkKCQkJCQkJCQlhZGQoIGFyZyApOwoJCQkJCQkJfQoJCQkJCQl9ICk7CgkJCQkJfSApKCBhcmd1bWVudHMgKTsKCgkJCQkJaWYgKCBtZW1vcnkgJiYgIWZpcmluZyApIHsKCQkJCQkJZmlyZSgpOwoJCQkJCX0KCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9LAoKCQkJLy8gUmVtb3ZlIGEgY2FsbGJhY2sgZnJvbSB0aGUgbGlzdAoJCQlyZW1vdmU6IGZ1bmN0aW9uKCkgewoJCQkJalF1ZXJ5LmVhY2goIGFyZ3VtZW50cywgZnVuY3Rpb24oIF8sIGFyZyApIHsKCQkJCQl2YXIgaW5kZXg7CgkJCQkJd2hpbGUgKCAoIGluZGV4ID0galF1ZXJ5LmluQXJyYXkoIGFyZywgbGlzdCwgaW5kZXggKSApID4gLTEgKSB7CgkJCQkJCWxpc3Quc3BsaWNlKCBpbmRleCwgMSApOwoKCQkJCQkJLy8gSGFuZGxlIGZpcmluZyBpbmRleGVzCgkJCQkJCWlmICggaW5kZXggPD0gZmlyaW5nSW5kZXggKSB7CgkJCQkJCQlmaXJpbmdJbmRleC0tOwoJCQkJCQl9CgkJCQkJfQoJCQkJfSApOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX0sCgoJCQkvLyBDaGVjayBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0LgoJCQkvLyBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgcmV0dXJuIHdoZXRoZXIgb3Igbm90IGxpc3QgaGFzIGNhbGxiYWNrcyBhdHRhY2hlZC4KCQkJaGFzOiBmdW5jdGlvbiggZm4gKSB7CgkJCQlyZXR1cm4gZm4gPwoJCQkJCWpRdWVyeS5pbkFycmF5KCBmbiwgbGlzdCApID4gLTEgOgoJCQkJCWxpc3QubGVuZ3RoID4gMDsKCQkJfSwKCgkJCS8vIFJlbW92ZSBhbGwgY2FsbGJhY2tzIGZyb20gdGhlIGxpc3QKCQkJZW1wdHk6IGZ1bmN0aW9uKCkgewoJCQkJaWYgKCBsaXN0ICkgewoJCQkJCWxpc3QgPSBbXTsKCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9LAoKCQkJLy8gRGlzYWJsZSAuZmlyZSBhbmQgLmFkZAoJCQkvLyBBYm9ydCBhbnkgY3VycmVudC9wZW5kaW5nIGV4ZWN1dGlvbnMKCQkJLy8gQ2xlYXIgYWxsIGNhbGxiYWNrcyBhbmQgdmFsdWVzCgkJCWRpc2FibGU6IGZ1bmN0aW9uKCkgewoJCQkJbG9ja2VkID0gcXVldWUgPSBbXTsKCQkJCWxpc3QgPSBtZW1vcnkgPSAiIjsKCQkJCXJldHVybiB0aGlzOwoJCQl9LAoJCQlkaXNhYmxlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gIWxpc3Q7CgkJCX0sCgoJCQkvLyBEaXNhYmxlIC5maXJlCgkJCS8vIEFsc28gZGlzYWJsZSAuYWRkIHVubGVzcyB3ZSBoYXZlIG1lbW9yeSAoc2luY2UgaXQgd291bGQgaGF2ZSBubyBlZmZlY3QpCgkJCS8vIEFib3J0IGFueSBwZW5kaW5nIGV4ZWN1dGlvbnMKCQkJbG9jazogZnVuY3Rpb24oKSB7CgkJCQlsb2NrZWQgPSBxdWV1ZSA9IFtdOwoJCQkJaWYgKCAhbWVtb3J5ICYmICFmaXJpbmcgKSB7CgkJCQkJbGlzdCA9IG1lbW9yeSA9ICIiOwoJCQkJfQoJCQkJcmV0dXJuIHRoaXM7CgkJCX0sCgkJCWxvY2tlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gISFsb2NrZWQ7CgkJCX0sCgoJCQkvLyBDYWxsIGFsbCBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgYXJndW1lbnRzCgkJCWZpcmVXaXRoOiBmdW5jdGlvbiggY29udGV4dCwgYXJncyApIHsKCQkJCWlmICggIWxvY2tlZCApIHsKCQkJCQlhcmdzID0gYXJncyB8fCBbXTsKCQkJCQlhcmdzID0gWyBjb250ZXh0LCBhcmdzLnNsaWNlID8gYXJncy5zbGljZSgpIDogYXJncyBdOwoJCQkJCXF1ZXVlLnB1c2goIGFyZ3MgKTsKCQkJCQlpZiAoICFmaXJpbmcgKSB7CgkJCQkJCWZpcmUoKTsKCQkJCQl9CgkJCQl9CgkJCQlyZXR1cm4gdGhpczsKCQkJfSwKCgkJCS8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzCgkJCWZpcmU6IGZ1bmN0aW9uKCkgewoJCQkJc2VsZi5maXJlV2l0aCggdGhpcywgYXJndW1lbnRzICk7CgkJCQlyZXR1cm4gdGhpczsKCQkJfSwKCgkJCS8vIFRvIGtub3cgaWYgdGhlIGNhbGxiYWNrcyBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZQoJCQlmaXJlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gISFmaXJlZDsKCQkJfQoJCX07CgoJcmV0dXJuIHNlbGY7Cn07CgoKZnVuY3Rpb24gSWRlbnRpdHkoIHYgKSB7CglyZXR1cm4gdjsKfQpmdW5jdGlvbiBUaHJvd2VyKCBleCApIHsKCXRocm93IGV4Owp9CgpmdW5jdGlvbiBhZG9wdFZhbHVlKCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0LCBub1ZhbHVlICkgewoJdmFyIG1ldGhvZDsKCgl0cnkgewoKCQkvLyBDaGVjayBmb3IgcHJvbWlzZSBhc3BlY3QgZmlyc3QgdG8gcHJpdmlsZWdlIHN5bmNocm9ub3VzIGJlaGF2aW9yCgkJaWYgKCB2YWx1ZSAmJiBpc0Z1bmN0aW9uKCAoIG1ldGhvZCA9IHZhbHVlLnByb21pc2UgKSApICkgewoJCQltZXRob2QuY2FsbCggdmFsdWUgKS5kb25lKCByZXNvbHZlICkuZmFpbCggcmVqZWN0ICk7CgoJCS8vIE90aGVyIHRoZW5hYmxlcwoJCX0gZWxzZSBpZiAoIHZhbHVlICYmIGlzRnVuY3Rpb24oICggbWV0aG9kID0gdmFsdWUudGhlbiApICkgKSB7CgkJCW1ldGhvZC5jYWxsKCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0ICk7CgoJCS8vIE90aGVyIG5vbi10aGVuYWJsZXMKCQl9IGVsc2UgewoKCQkJLy8gQ29udHJvbCBgcmVzb2x2ZWAgYXJndW1lbnRzIGJ5IGxldHRpbmcgQXJyYXkjc2xpY2UgY2FzdCBib29sZWFuIGBub1ZhbHVlYCB0byBpbnRlZ2VyOgoJCQkvLyAqIGZhbHNlOiBbIHZhbHVlIF0uc2xpY2UoIDAgKSA9PiByZXNvbHZlKCB2YWx1ZSApCgkJCS8vICogdHJ1ZTogWyB2YWx1ZSBdLnNsaWNlKCAxICkgPT4gcmVzb2x2ZSgpCgkJCXJlc29sdmUuYXBwbHkoIHVuZGVmaW5lZCwgWyB2YWx1ZSBdLnNsaWNlKCBub1ZhbHVlICkgKTsKCQl9CgoJLy8gRm9yIFByb21pc2VzL0ErLCBjb252ZXJ0IGV4Y2VwdGlvbnMgaW50byByZWplY3Rpb25zCgkvLyBTaW5jZSBqUXVlcnkud2hlbiBkb2Vzbid0IHVud3JhcCB0aGVuYWJsZXMsIHdlIGNhbiBza2lwIHRoZSBleHRyYSBjaGVja3MgYXBwZWFyaW5nIGluCgkvLyBEZWZlcnJlZCN0aGVuIHRvIGNvbmRpdGlvbmFsbHkgc3VwcHJlc3MgcmVqZWN0aW9uLgoJfSBjYXRjaCAoIHZhbHVlICkgewoKCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCBvbmx5CgkJLy8gU3RyaWN0IG1vZGUgZnVuY3Rpb25zIGludm9rZWQgd2l0aG91dCAuY2FsbC8uYXBwbHkgZ2V0IGdsb2JhbC1vYmplY3QgY29udGV4dAoJCXJlamVjdC5hcHBseSggdW5kZWZpbmVkLCBbIHZhbHVlIF0gKTsKCX0KfQoKalF1ZXJ5LmV4dGVuZCggewoKCURlZmVycmVkOiBmdW5jdGlvbiggZnVuYyApIHsKCQl2YXIgdHVwbGVzID0gWwoKCQkJCS8vIGFjdGlvbiwgYWRkIGxpc3RlbmVyLCBjYWxsYmFja3MsCgkJCQkvLyAuLi4gLnRoZW4gaGFuZGxlcnMsIGFyZ3VtZW50IGluZGV4LCBbZmluYWwgc3RhdGVdCgkJCQlbICJub3RpZnkiLCAicHJvZ3Jlc3MiLCBqUXVlcnkuQ2FsbGJhY2tzKCAibWVtb3J5IiApLAoJCQkJCWpRdWVyeS5DYWxsYmFja3MoICJtZW1vcnkiICksIDIgXSwKCQkJCVsgInJlc29sdmUiLCAiZG9uZSIsIGpRdWVyeS5DYWxsYmFja3MoICJvbmNlIG1lbW9yeSIgKSwKCQkJCQlqUXVlcnkuQ2FsbGJhY2tzKCAib25jZSBtZW1vcnkiICksIDAsICJyZXNvbHZlZCIgXSwKCQkJCVsgInJlamVjdCIsICJmYWlsIiwgalF1ZXJ5LkNhbGxiYWNrcyggIm9uY2UgbWVtb3J5IiApLAoJCQkJCWpRdWVyeS5DYWxsYmFja3MoICJvbmNlIG1lbW9yeSIgKSwgMSwgInJlamVjdGVkIiBdCgkJCV0sCgkJCXN0YXRlID0gInBlbmRpbmciLAoJCQlwcm9taXNlID0gewoJCQkJc3RhdGU6IGZ1bmN0aW9uKCkgewoJCQkJCXJldHVybiBzdGF0ZTsKCQkJCX0sCgkJCQlhbHdheXM6IGZ1bmN0aW9uKCkgewoJCQkJCWRlZmVycmVkLmRvbmUoIGFyZ3VtZW50cyApLmZhaWwoIGFyZ3VtZW50cyApOwoJCQkJCXJldHVybiB0aGlzOwoJCQkJfSwKCQkJCSJjYXRjaCI6IGZ1bmN0aW9uKCBmbiApIHsKCQkJCQlyZXR1cm4gcHJvbWlzZS50aGVuKCBudWxsLCBmbiApOwoJCQkJfSwKCgkJCQkvLyBLZWVwIHBpcGUgZm9yIGJhY2stY29tcGF0CgkJCQlwaXBlOiBmdW5jdGlvbiggLyogZm5Eb25lLCBmbkZhaWwsIGZuUHJvZ3Jlc3MgKi8gKSB7CgkJCQkJdmFyIGZucyA9IGFyZ3VtZW50czsKCgkJCQkJcmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkgewoJCQkJCQlqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7CgoJCQkJCQkJLy8gTWFwIHR1cGxlcyAocHJvZ3Jlc3MsIGRvbmUsIGZhaWwpIHRvIGFyZ3VtZW50cyAoZG9uZSwgZmFpbCwgcHJvZ3Jlc3MpCgkJCQkJCQl2YXIgZm4gPSBpc0Z1bmN0aW9uKCBmbnNbIHR1cGxlWyA0IF0gXSApICYmIGZuc1sgdHVwbGVbIDQgXSBdOwoKCQkJCQkJCS8vIGRlZmVycmVkLnByb2dyZXNzKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLm5vdGlmeSB9KQoJCQkJCQkJLy8gZGVmZXJyZWQuZG9uZShmdW5jdGlvbigpIHsgYmluZCB0byBuZXdEZWZlciBvciBuZXdEZWZlci5yZXNvbHZlIH0pCgkJCQkJCQkvLyBkZWZlcnJlZC5mYWlsKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLnJlamVjdCB9KQoJCQkJCQkJZGVmZXJyZWRbIHR1cGxlWyAxIF0gXSggZnVuY3Rpb24oKSB7CgkJCQkJCQkJdmFyIHJldHVybmVkID0gZm4gJiYgZm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCQkJCQkJCWlmICggcmV0dXJuZWQgJiYgaXNGdW5jdGlvbiggcmV0dXJuZWQucHJvbWlzZSApICkgewoJCQkJCQkJCQlyZXR1cm5lZC5wcm9taXNlKCkKCQkJCQkJCQkJCS5wcm9ncmVzcyggbmV3RGVmZXIubm90aWZ5ICkKCQkJCQkJCQkJCS5kb25lKCBuZXdEZWZlci5yZXNvbHZlICkKCQkJCQkJCQkJCS5mYWlsKCBuZXdEZWZlci5yZWplY3QgKTsKCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQluZXdEZWZlclsgdHVwbGVbIDAgXSArICJXaXRoIiBdKAoJCQkJCQkJCQkJdGhpcywKCQkJCQkJCQkJCWZuID8gWyByZXR1cm5lZCBdIDogYXJndW1lbnRzCgkJCQkJCQkJCSk7CgkJCQkJCQkJfQoJCQkJCQkJfSApOwoJCQkJCQl9ICk7CgkJCQkJCWZucyA9IG51bGw7CgkJCQkJfSApLnByb21pc2UoKTsKCQkJCX0sCgkJCQl0aGVuOiBmdW5jdGlvbiggb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIG9uUHJvZ3Jlc3MgKSB7CgkJCQkJdmFyIG1heERlcHRoID0gMDsKCQkJCQlmdW5jdGlvbiByZXNvbHZlKCBkZXB0aCwgZGVmZXJyZWQsIGhhbmRsZXIsIHNwZWNpYWwgKSB7CgkJCQkJCXJldHVybiBmdW5jdGlvbigpIHsKCQkJCQkJCXZhciB0aGF0ID0gdGhpcywKCQkJCQkJCQlhcmdzID0gYXJndW1lbnRzLAoJCQkJCQkJCW1pZ2h0VGhyb3cgPSBmdW5jdGlvbigpIHsKCQkJCQkJCQkJdmFyIHJldHVybmVkLCB0aGVuOwoKCQkJCQkJCQkJLy8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuMy4zLjMKCQkJCQkJCQkJLy8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTkKCQkJCQkJCQkJLy8gSWdub3JlIGRvdWJsZS1yZXNvbHV0aW9uIGF0dGVtcHRzCgkJCQkJCQkJCWlmICggZGVwdGggPCBtYXhEZXB0aCApIHsKCQkJCQkJCQkJCXJldHVybjsKCQkJCQkJCQkJfQoKCQkJCQkJCQkJcmV0dXJuZWQgPSBoYW5kbGVyLmFwcGx5KCB0aGF0LCBhcmdzICk7CgoJCQkJCQkJCQkvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4xCgkJCQkJCQkJCS8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTQ4CgkJCQkJCQkJCWlmICggcmV0dXJuZWQgPT09IGRlZmVycmVkLnByb21pc2UoKSApIHsKCQkJCQkJCQkJCXRocm93IG5ldyBUeXBlRXJyb3IoICJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb24iICk7CgkJCQkJCQkJCX0KCgkJCQkJCQkJCS8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb25zIDIuMy4zLjEsIDMuNQoJCQkJCQkJCQkvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01NAoJCQkJCQkJCQkvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC03NQoJCQkJCQkJCQkvLyBSZXRyaWV2ZSBgdGhlbmAgb25seSBvbmNlCgkJCQkJCQkJCXRoZW4gPSByZXR1cm5lZCAmJgoKCQkJCQkJCQkJCS8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjQKCQkJCQkJCQkJCS8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTY0CgkJCQkJCQkJCQkvLyBPbmx5IGNoZWNrIG9iamVjdHMgYW5kIGZ1bmN0aW9ucyBmb3IgdGhlbmFiaWxpdHkKCQkJCQkJCQkJCSggdHlwZW9mIHJldHVybmVkID09PSAib2JqZWN0IiB8fAoJCQkJCQkJCQkJCXR5cGVvZiByZXR1cm5lZCA9PT0gImZ1bmN0aW9uIiApICYmCgkJCQkJCQkJCQlyZXR1cm5lZC50aGVuOwoKCQkJCQkJCQkJLy8gSGFuZGxlIGEgcmV0dXJuZWQgdGhlbmFibGUKCQkJCQkJCQkJaWYgKCBpc0Z1bmN0aW9uKCB0aGVuICkgKSB7CgoJCQkJCQkJCQkJLy8gU3BlY2lhbCBwcm9jZXNzb3JzIChub3RpZnkpIGp1c3Qgd2FpdCBmb3IgcmVzb2x1dGlvbgoJCQkJCQkJCQkJaWYgKCBzcGVjaWFsICkgewoJCQkJCQkJCQkJCXRoZW4uY2FsbCgKCQkJCQkJCQkJCQkJcmV0dXJuZWQsCgkJCQkJCQkJCQkJCXJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksIHNwZWNpYWwgKSwKCQkJCQkJCQkJCQkJcmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsICkKCQkJCQkJCQkJCQkpOwoKCQkJCQkJCQkJCS8vIE5vcm1hbCBwcm9jZXNzb3JzIChyZXNvbHZlKSBhbHNvIGhvb2sgaW50byBwcm9ncmVzcwoJCQkJCQkJCQkJfSBlbHNlIHsKCgkJCQkJCQkJCQkJLy8gLi4uYW5kIGRpc3JlZ2FyZCBvbGRlciByZXNvbHV0aW9uIHZhbHVlcwoJCQkJCQkJCQkJCW1heERlcHRoKys7CgoJCQkJCQkJCQkJCXRoZW4uY2FsbCgKCQkJCQkJCQkJCQkJcmV0dXJuZWQsCgkJCQkJCQkJCQkJCXJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksIHNwZWNpYWwgKSwKCQkJCQkJCQkJCQkJcmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsICksCgkJCQkJCQkJCQkJCXJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksCgkJCQkJCQkJCQkJCQlkZWZlcnJlZC5ub3RpZnlXaXRoICkKCQkJCQkJCQkJCQkpOwoJCQkJCQkJCQkJfQoKCQkJCQkJCQkJLy8gSGFuZGxlIGFsbCBvdGhlciByZXR1cm5lZCB2YWx1ZXMKCQkJCQkJCQkJfSBlbHNlIHsKCgkJCQkJCQkJCQkvLyBPbmx5IHN1YnN0aXR1dGUgaGFuZGxlcnMgcGFzcyBvbiBjb250ZXh0CgkJCQkJCQkJCQkvLyBhbmQgbXVsdGlwbGUgdmFsdWVzIChub24tc3BlYyBiZWhhdmlvcikKCQkJCQkJCQkJCWlmICggaGFuZGxlciAhPT0gSWRlbnRpdHkgKSB7CgkJCQkJCQkJCQkJdGhhdCA9IHVuZGVmaW5lZDsKCQkJCQkJCQkJCQlhcmdzID0gWyByZXR1cm5lZCBdOwoJCQkJCQkJCQkJfQoKCQkJCQkJCQkJCS8vIFByb2Nlc3MgdGhlIHZhbHVlKHMpCgkJCQkJCQkJCQkvLyBEZWZhdWx0IHByb2Nlc3MgaXMgcmVzb2x2ZQoJCQkJCQkJCQkJKCBzcGVjaWFsIHx8IGRlZmVycmVkLnJlc29sdmVXaXRoICkoIHRoYXQsIGFyZ3MgKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0sCgoJCQkJCQkJCS8vIE9ubHkgbm9ybWFsIHByb2Nlc3NvcnMgKHJlc29sdmUpIGNhdGNoIGFuZCByZWplY3QgZXhjZXB0aW9ucwoJCQkJCQkJCXByb2Nlc3MgPSBzcGVjaWFsID8KCQkJCQkJCQkJbWlnaHRUaHJvdyA6CgkJCQkJCQkJCWZ1bmN0aW9uKCkgewoJCQkJCQkJCQkJdHJ5IHsKCQkJCQkJCQkJCQltaWdodFRocm93KCk7CgkJCQkJCQkJCQl9IGNhdGNoICggZSApIHsKCgkJCQkJCQkJCQkJaWYgKCBqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayApIHsKCQkJCQkJCQkJCQkJalF1ZXJ5LkRlZmVycmVkLmV4Y2VwdGlvbkhvb2soIGUsCgkJCQkJCQkJCQkJCQlwcm9jZXNzLnN0YWNrVHJhY2UgKTsKCQkJCQkJCQkJCQl9CgoJCQkJCQkJCQkJCS8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjMuMy40LjEKCQkJCQkJCQkJCQkvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC02MQoJCQkJCQkJCQkJCS8vIElnbm9yZSBwb3N0LXJlc29sdXRpb24gZXhjZXB0aW9ucwoJCQkJCQkJCQkJCWlmICggZGVwdGggKyAxID49IG1heERlcHRoICkgewoKCQkJCQkJCQkJCQkJLy8gT25seSBzdWJzdGl0dXRlIGhhbmRsZXJzIHBhc3Mgb24gY29udGV4dAoJCQkJCQkJCQkJCQkvLyBhbmQgbXVsdGlwbGUgdmFsdWVzIChub24tc3BlYyBiZWhhdmlvcikKCQkJCQkJCQkJCQkJaWYgKCBoYW5kbGVyICE9PSBUaHJvd2VyICkgewoJCQkJCQkJCQkJCQkJdGhhdCA9IHVuZGVmaW5lZDsKCQkJCQkJCQkJCQkJCWFyZ3MgPSBbIGUgXTsKCQkJCQkJCQkJCQkJfQoKCQkJCQkJCQkJCQkJZGVmZXJyZWQucmVqZWN0V2l0aCggdGhhdCwgYXJncyApOwoJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCX0KCQkJCQkJCQkJfTsKCgkJCQkJCQkvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuMQoJCQkJCQkJLy8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTcKCQkJCQkJCS8vIFJlLXJlc29sdmUgcHJvbWlzZXMgaW1tZWRpYXRlbHkgdG8gZG9kZ2UgZmFsc2UgcmVqZWN0aW9uIGZyb20KCQkJCQkJCS8vIHN1YnNlcXVlbnQgZXJyb3JzCgkJCQkJCQlpZiAoIGRlcHRoICkgewoJCQkJCQkJCXByb2Nlc3MoKTsKCQkJCQkJCX0gZWxzZSB7CgoJCQkJCQkJCS8vIENhbGwgYW4gb3B0aW9uYWwgaG9vayB0byByZWNvcmQgdGhlIHN0YWNrLCBpbiBjYXNlIG9mIGV4Y2VwdGlvbgoJCQkJCQkJCS8vIHNpbmNlIGl0J3Mgb3RoZXJ3aXNlIGxvc3Qgd2hlbiBleGVjdXRpb24gZ29lcyBhc3luYwoJCQkJCQkJCWlmICggalF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vayApIHsKCQkJCQkJCQkJcHJvY2Vzcy5zdGFja1RyYWNlID0galF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vaygpOwoJCQkJCQkJCX0KCQkJCQkJCQl3aW5kb3cuc2V0VGltZW91dCggcHJvY2VzcyApOwoJCQkJCQkJfQoJCQkJCQl9OwoJCQkJCX0KCgkJCQkJcmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkgewoKCQkJCQkJLy8gcHJvZ3Jlc3NfaGFuZGxlcnMuYWRkKCAuLi4gKQoJCQkJCQl0dXBsZXNbIDAgXVsgMyBdLmFkZCgKCQkJCQkJCXJlc29sdmUoCgkJCQkJCQkJMCwKCQkJCQkJCQluZXdEZWZlciwKCQkJCQkJCQlpc0Z1bmN0aW9uKCBvblByb2dyZXNzICkgPwoJCQkJCQkJCQlvblByb2dyZXNzIDoKCQkJCQkJCQkJSWRlbnRpdHksCgkJCQkJCQkJbmV3RGVmZXIubm90aWZ5V2l0aAoJCQkJCQkJKQoJCQkJCQkpOwoKCQkJCQkJLy8gZnVsZmlsbGVkX2hhbmRsZXJzLmFkZCggLi4uICkKCQkJCQkJdHVwbGVzWyAxIF1bIDMgXS5hZGQoCgkJCQkJCQlyZXNvbHZlKAoJCQkJCQkJCTAsCgkJCQkJCQkJbmV3RGVmZXIsCgkJCQkJCQkJaXNGdW5jdGlvbiggb25GdWxmaWxsZWQgKSA/CgkJCQkJCQkJCW9uRnVsZmlsbGVkIDoKCQkJCQkJCQkJSWRlbnRpdHkKCQkJCQkJCSkKCQkJCQkJKTsKCgkJCQkJCS8vIHJlamVjdGVkX2hhbmRsZXJzLmFkZCggLi4uICkKCQkJCQkJdHVwbGVzWyAyIF1bIDMgXS5hZGQoCgkJCQkJCQlyZXNvbHZlKAoJCQkJCQkJCTAsCgkJCQkJCQkJbmV3RGVmZXIsCgkJCQkJCQkJaXNGdW5jdGlvbiggb25SZWplY3RlZCApID8KCQkJCQkJCQkJb25SZWplY3RlZCA6CgkJCQkJCQkJCVRocm93ZXIKCQkJCQkJCSkKCQkJCQkJKTsKCQkJCQl9ICkucHJvbWlzZSgpOwoJCQkJfSwKCgkJCQkvLyBHZXQgYSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkCgkJCQkvLyBJZiBvYmogaXMgcHJvdmlkZWQsIHRoZSBwcm9taXNlIGFzcGVjdCBpcyBhZGRlZCB0byB0aGUgb2JqZWN0CgkJCQlwcm9taXNlOiBmdW5jdGlvbiggb2JqICkgewoJCQkJCXJldHVybiBvYmogIT0gbnVsbCA/IGpRdWVyeS5leHRlbmQoIG9iaiwgcHJvbWlzZSApIDogcHJvbWlzZTsKCQkJCX0KCQkJfSwKCQkJZGVmZXJyZWQgPSB7fTsKCgkJLy8gQWRkIGxpc3Qtc3BlY2lmaWMgbWV0aG9kcwoJCWpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBsZSApIHsKCQkJdmFyIGxpc3QgPSB0dXBsZVsgMiBdLAoJCQkJc3RhdGVTdHJpbmcgPSB0dXBsZVsgNSBdOwoKCQkJLy8gcHJvbWlzZS5wcm9ncmVzcyA9IGxpc3QuYWRkCgkJCS8vIHByb21pc2UuZG9uZSA9IGxpc3QuYWRkCgkJCS8vIHByb21pc2UuZmFpbCA9IGxpc3QuYWRkCgkJCXByb21pc2VbIHR1cGxlWyAxIF0gXSA9IGxpc3QuYWRkOwoKCQkJLy8gSGFuZGxlIHN0YXRlCgkJCWlmICggc3RhdGVTdHJpbmcgKSB7CgkJCQlsaXN0LmFkZCgKCQkJCQlmdW5jdGlvbigpIHsKCgkJCQkJCS8vIHN0YXRlID0gInJlc29sdmVkIiAoaS5lLiwgZnVsZmlsbGVkKQoJCQkJCQkvLyBzdGF0ZSA9ICJyZWplY3RlZCIKCQkJCQkJc3RhdGUgPSBzdGF0ZVN0cmluZzsKCQkJCQl9LAoKCQkJCQkvLyByZWplY3RlZF9jYWxsYmFja3MuZGlzYWJsZQoJCQkJCS8vIGZ1bGZpbGxlZF9jYWxsYmFja3MuZGlzYWJsZQoJCQkJCXR1cGxlc1sgMyAtIGkgXVsgMiBdLmRpc2FibGUsCgoJCQkJCS8vIHJlamVjdGVkX2hhbmRsZXJzLmRpc2FibGUKCQkJCQkvLyBmdWxmaWxsZWRfaGFuZGxlcnMuZGlzYWJsZQoJCQkJCXR1cGxlc1sgMyAtIGkgXVsgMyBdLmRpc2FibGUsCgoJCQkJCS8vIHByb2dyZXNzX2NhbGxiYWNrcy5sb2NrCgkJCQkJdHVwbGVzWyAwIF1bIDIgXS5sb2NrLAoKCQkJCQkvLyBwcm9ncmVzc19oYW5kbGVycy5sb2NrCgkJCQkJdHVwbGVzWyAwIF1bIDMgXS5sb2NrCgkJCQkpOwoJCQl9CgoJCQkvLyBwcm9ncmVzc19oYW5kbGVycy5maXJlCgkJCS8vIGZ1bGZpbGxlZF9oYW5kbGVycy5maXJlCgkJCS8vIHJlamVjdGVkX2hhbmRsZXJzLmZpcmUKCQkJbGlzdC5hZGQoIHR1cGxlWyAzIF0uZmlyZSApOwoKCQkJLy8gZGVmZXJyZWQubm90aWZ5ID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLm5vdGlmeVdpdGgoLi4uKSB9CgkJCS8vIGRlZmVycmVkLnJlc29sdmUgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVzb2x2ZVdpdGgoLi4uKSB9CgkJCS8vIGRlZmVycmVkLnJlamVjdCA9IGZ1bmN0aW9uKCkgeyBkZWZlcnJlZC5yZWplY3RXaXRoKC4uLikgfQoJCQlkZWZlcnJlZFsgdHVwbGVbIDAgXSBdID0gZnVuY3Rpb24oKSB7CgkJCQlkZWZlcnJlZFsgdHVwbGVbIDAgXSArICJXaXRoIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IHVuZGVmaW5lZCA6IHRoaXMsIGFyZ3VtZW50cyApOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX07CgoJCQkvLyBkZWZlcnJlZC5ub3RpZnlXaXRoID0gbGlzdC5maXJlV2l0aAoJCQkvLyBkZWZlcnJlZC5yZXNvbHZlV2l0aCA9IGxpc3QuZmlyZVdpdGgKCQkJLy8gZGVmZXJyZWQucmVqZWN0V2l0aCA9IGxpc3QuZmlyZVdpdGgKCQkJZGVmZXJyZWRbIHR1cGxlWyAwIF0gKyAiV2l0aCIgXSA9IGxpc3QuZmlyZVdpdGg7CgkJfSApOwoKCQkvLyBNYWtlIHRoZSBkZWZlcnJlZCBhIHByb21pc2UKCQlwcm9taXNlLnByb21pc2UoIGRlZmVycmVkICk7CgoJCS8vIENhbGwgZ2l2ZW4gZnVuYyBpZiBhbnkKCQlpZiAoIGZ1bmMgKSB7CgkJCWZ1bmMuY2FsbCggZGVmZXJyZWQsIGRlZmVycmVkICk7CgkJfQoKCQkvLyBBbGwgZG9uZSEKCQlyZXR1cm4gZGVmZXJyZWQ7Cgl9LAoKCS8vIERlZmVycmVkIGhlbHBlcgoJd2hlbjogZnVuY3Rpb24oIHNpbmdsZVZhbHVlICkgewoJCXZhcgoKCQkJLy8gY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3JkaW5hdGVzCgkJCXJlbWFpbmluZyA9IGFyZ3VtZW50cy5sZW5ndGgsCgoJCQkvLyBjb3VudCBvZiB1bnByb2Nlc3NlZCBhcmd1bWVudHMKCQkJaSA9IHJlbWFpbmluZywKCgkJCS8vIHN1Ym9yZGluYXRlIGZ1bGZpbGxtZW50IGRhdGEKCQkJcmVzb2x2ZUNvbnRleHRzID0gQXJyYXkoIGkgKSwKCQkJcmVzb2x2ZVZhbHVlcyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApLAoKCQkJLy8gdGhlIG1hc3RlciBEZWZlcnJlZAoJCQltYXN0ZXIgPSBqUXVlcnkuRGVmZXJyZWQoKSwKCgkJCS8vIHN1Ym9yZGluYXRlIGNhbGxiYWNrIGZhY3RvcnkKCQkJdXBkYXRlRnVuYyA9IGZ1bmN0aW9uKCBpICkgewoJCQkJcmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJCQlyZXNvbHZlQ29udGV4dHNbIGkgXSA9IHRoaXM7CgkJCQkJcmVzb2x2ZVZhbHVlc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlOwoJCQkJCWlmICggISggLS1yZW1haW5pbmcgKSApIHsKCQkJCQkJbWFzdGVyLnJlc29sdmVXaXRoKCByZXNvbHZlQ29udGV4dHMsIHJlc29sdmVWYWx1ZXMgKTsKCQkJCQl9CgkJCQl9OwoJCQl9OwoKCQkvLyBTaW5nbGUtIGFuZCBlbXB0eSBhcmd1bWVudHMgYXJlIGFkb3B0ZWQgbGlrZSBQcm9taXNlLnJlc29sdmUKCQlpZiAoIHJlbWFpbmluZyA8PSAxICkgewoJCQlhZG9wdFZhbHVlKCBzaW5nbGVWYWx1ZSwgbWFzdGVyLmRvbmUoIHVwZGF0ZUZ1bmMoIGkgKSApLnJlc29sdmUsIG1hc3Rlci5yZWplY3QsCgkJCQkhcmVtYWluaW5nICk7CgoJCQkvLyBVc2UgLnRoZW4oKSB0byB1bndyYXAgc2Vjb25kYXJ5IHRoZW5hYmxlcyAoY2YuIGdoLTMwMDApCgkJCWlmICggbWFzdGVyLnN0YXRlKCkgPT09ICJwZW5kaW5nIiB8fAoJCQkJaXNGdW5jdGlvbiggcmVzb2x2ZVZhbHVlc1sgaSBdICYmIHJlc29sdmVWYWx1ZXNbIGkgXS50aGVuICkgKSB7CgoJCQkJcmV0dXJuIG1hc3Rlci50aGVuKCk7CgkJCX0KCQl9CgoJCS8vIE11bHRpcGxlIGFyZ3VtZW50cyBhcmUgYWdncmVnYXRlZCBsaWtlIFByb21pc2UuYWxsIGFycmF5IGVsZW1lbnRzCgkJd2hpbGUgKCBpLS0gKSB7CgkJCWFkb3B0VmFsdWUoIHJlc29sdmVWYWx1ZXNbIGkgXSwgdXBkYXRlRnVuYyggaSApLCBtYXN0ZXIucmVqZWN0ICk7CgkJfQoKCQlyZXR1cm4gbWFzdGVyLnByb21pc2UoKTsKCX0KfSApOwoKCi8vIFRoZXNlIHVzdWFsbHkgaW5kaWNhdGUgYSBwcm9ncmFtbWVyIG1pc3Rha2UgZHVyaW5nIGRldmVsb3BtZW50LAovLyB3YXJuIGFib3V0IHRoZW0gQVNBUCByYXRoZXIgdGhhbiBzd2FsbG93aW5nIHRoZW0gYnkgZGVmYXVsdC4KdmFyIHJlcnJvck5hbWVzID0gL14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87CgpqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayA9IGZ1bmN0aW9uKCBlcnJvciwgc3RhY2sgKSB7CgoJLy8gU3VwcG9ydDogSUUgOCAtIDkgb25seQoJLy8gQ29uc29sZSBleGlzdHMgd2hlbiBkZXYgdG9vbHMgYXJlIG9wZW4sIHdoaWNoIGNhbiBoYXBwZW4gYXQgYW55IHRpbWUKCWlmICggd2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUud2FybiAmJiBlcnJvciAmJiByZXJyb3JOYW1lcy50ZXN0KCBlcnJvci5uYW1lICkgKSB7CgkJd2luZG93LmNvbnNvbGUud2FybiggImpRdWVyeS5EZWZlcnJlZCBleGNlcHRpb246ICIgKyBlcnJvci5tZXNzYWdlLCBlcnJvci5zdGFjaywgc3RhY2sgKTsKCX0KfTsKCgoKCmpRdWVyeS5yZWFkeUV4Y2VwdGlvbiA9IGZ1bmN0aW9uKCBlcnJvciApIHsKCXdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsKCQl0aHJvdyBlcnJvcjsKCX0gKTsKfTsKCgoKCi8vIFRoZSBkZWZlcnJlZCB1c2VkIG9uIERPTSByZWFkeQp2YXIgcmVhZHlMaXN0ID0galF1ZXJ5LkRlZmVycmVkKCk7CgpqUXVlcnkuZm4ucmVhZHkgPSBmdW5jdGlvbiggZm4gKSB7CgoJcmVhZHlMaXN0CgkJLnRoZW4oIGZuICkKCgkJLy8gV3JhcCBqUXVlcnkucmVhZHlFeGNlcHRpb24gaW4gYSBmdW5jdGlvbiBzbyB0aGF0IHRoZSBsb29rdXAKCQkvLyBoYXBwZW5zIGF0IHRoZSB0aW1lIG9mIGVycm9yIGhhbmRsaW5nIGluc3RlYWQgb2YgY2FsbGJhY2sKCQkvLyByZWdpc3RyYXRpb24uCgkJLmNhdGNoKCBmdW5jdGlvbiggZXJyb3IgKSB7CgkJCWpRdWVyeS5yZWFkeUV4Y2VwdGlvbiggZXJyb3IgKTsKCQl9ICk7CgoJcmV0dXJuIHRoaXM7Cn07CgpqUXVlcnkuZXh0ZW5kKCB7CgoJLy8gSXMgdGhlIERPTSByZWFkeSB0byBiZSB1c2VkPyBTZXQgdG8gdHJ1ZSBvbmNlIGl0IG9jY3Vycy4KCWlzUmVhZHk6IGZhbHNlLAoKCS8vIEEgY291bnRlciB0byB0cmFjayBob3cgbWFueSBpdGVtcyB0byB3YWl0IGZvciBiZWZvcmUKCS8vIHRoZSByZWFkeSBldmVudCBmaXJlcy4gU2VlICM2NzgxCglyZWFkeVdhaXQ6IDEsCgoJLy8gSGFuZGxlIHdoZW4gdGhlIERPTSBpcyByZWFkeQoJcmVhZHk6IGZ1bmN0aW9uKCB3YWl0ICkgewoKCQkvLyBBYm9ydCBpZiB0aGVyZSBhcmUgcGVuZGluZyBob2xkcyBvciB3ZSdyZSBhbHJlYWR5IHJlYWR5CgkJaWYgKCB3YWl0ID09PSB0cnVlID8gLS1qUXVlcnkucmVhZHlXYWl0IDogalF1ZXJ5LmlzUmVhZHkgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeQoJCWpRdWVyeS5pc1JlYWR5ID0gdHJ1ZTsKCgkJLy8gSWYgYSBub3JtYWwgRE9NIFJlYWR5IGV2ZW50IGZpcmVkLCBkZWNyZW1lbnQsIGFuZCB3YWl0IGlmIG5lZWQgYmUKCQlpZiAoIHdhaXQgIT09IHRydWUgJiYgLS1qUXVlcnkucmVhZHlXYWl0ID4gMCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZQoJCXJlYWR5TGlzdC5yZXNvbHZlV2l0aCggZG9jdW1lbnQsIFsgalF1ZXJ5IF0gKTsKCX0KfSApOwoKalF1ZXJ5LnJlYWR5LnRoZW4gPSByZWFkeUxpc3QudGhlbjsKCi8vIFRoZSByZWFkeSBldmVudCBoYW5kbGVyIGFuZCBzZWxmIGNsZWFudXAgbWV0aG9kCmZ1bmN0aW9uIGNvbXBsZXRlZCgpIHsKCWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgY29tcGxldGVkICk7Cgl3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggImxvYWQiLCBjb21wbGV0ZWQgKTsKCWpRdWVyeS5yZWFkeSgpOwp9CgovLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZAovLyBhZnRlciB0aGUgYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC4KLy8gU3VwcG9ydDogSUUgPD05IC0gMTAgb25seQovLyBPbGRlciBJRSBzb21ldGltZXMgc2lnbmFscyAiaW50ZXJhY3RpdmUiIHRvbyBzb29uCmlmICggZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiB8fAoJKCBkb2N1bWVudC5yZWFkeVN0YXRlICE9PSAibG9hZGluZyIgJiYgIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCApICkgewoKCS8vIEhhbmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeQoJd2luZG93LnNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApOwoKfSBlbHNlIHsKCgkvLyBVc2UgdGhlIGhhbmR5IGV2ZW50IGNhbGxiYWNrCglkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIGNvbXBsZXRlZCApOwoKCS8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrCgl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggImxvYWQiLCBjb21wbGV0ZWQgKTsKfQoKCgoKLy8gTXVsdGlmdW5jdGlvbmFsIG1ldGhvZCB0byBnZXQgYW5kIHNldCB2YWx1ZXMgb2YgYSBjb2xsZWN0aW9uCi8vIFRoZSB2YWx1ZS9zIGNhbiBvcHRpb25hbGx5IGJlIGV4ZWN1dGVkIGlmIGl0J3MgYSBmdW5jdGlvbgp2YXIgYWNjZXNzID0gZnVuY3Rpb24oIGVsZW1zLCBmbiwga2V5LCB2YWx1ZSwgY2hhaW5hYmxlLCBlbXB0eUdldCwgcmF3ICkgewoJdmFyIGkgPSAwLAoJCWxlbiA9IGVsZW1zLmxlbmd0aCwKCQlidWxrID0ga2V5ID09IG51bGw7CgoJLy8gU2V0cyBtYW55IHZhbHVlcwoJaWYgKCB0b1R5cGUoIGtleSApID09PSAib2JqZWN0IiApIHsKCQljaGFpbmFibGUgPSB0cnVlOwoJCWZvciAoIGkgaW4ga2V5ICkgewoJCQlhY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5WyBpIF0sIHRydWUsIGVtcHR5R2V0LCByYXcgKTsKCQl9CgoJLy8gU2V0cyBvbmUgdmFsdWUKCX0gZWxzZSBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJY2hhaW5hYmxlID0gdHJ1ZTsKCgkJaWYgKCAhaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKCQkJcmF3ID0gdHJ1ZTsKCQl9CgoJCWlmICggYnVsayApIHsKCgkJCS8vIEJ1bGsgb3BlcmF0aW9ucyBydW4gYWdhaW5zdCB0aGUgZW50aXJlIHNldAoJCQlpZiAoIHJhdyApIHsKCQkJCWZuLmNhbGwoIGVsZW1zLCB2YWx1ZSApOwoJCQkJZm4gPSBudWxsOwoKCQkJLy8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVlcwoJCQl9IGVsc2UgewoJCQkJYnVsayA9IGZuOwoJCQkJZm4gPSBmdW5jdGlvbiggZWxlbSwga2V5LCB2YWx1ZSApIHsKCQkJCQlyZXR1cm4gYnVsay5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdmFsdWUgKTsKCQkJCX07CgkJCX0KCQl9CgoJCWlmICggZm4gKSB7CgkJCWZvciAoIDsgaSA8IGxlbjsgaSsrICkgewoJCQkJZm4oCgkJCQkJZWxlbXNbIGkgXSwga2V5LCByYXcgPwoJCQkJCXZhbHVlIDoKCQkJCQl2YWx1ZS5jYWxsKCBlbGVtc1sgaSBdLCBpLCBmbiggZWxlbXNbIGkgXSwga2V5ICkgKQoJCQkJKTsKCQkJfQoJCX0KCX0KCglpZiAoIGNoYWluYWJsZSApIHsKCQlyZXR1cm4gZWxlbXM7Cgl9CgoJLy8gR2V0cwoJaWYgKCBidWxrICkgewoJCXJldHVybiBmbi5jYWxsKCBlbGVtcyApOwoJfQoKCXJldHVybiBsZW4gPyBmbiggZWxlbXNbIDAgXSwga2V5ICkgOiBlbXB0eUdldDsKfTsKCgovLyBNYXRjaGVzIGRhc2hlZCBzdHJpbmcgZm9yIGNhbWVsaXppbmcKdmFyIHJtc1ByZWZpeCA9IC9eLW1zLS8sCglyZGFzaEFscGhhID0gLy0oW2Etel0pL2c7CgovLyBVc2VkIGJ5IGNhbWVsQ2FzZSBhcyBjYWxsYmFjayB0byByZXBsYWNlKCkKZnVuY3Rpb24gZmNhbWVsQ2FzZSggYWxsLCBsZXR0ZXIgKSB7CglyZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7Cn0KCi8vIENvbnZlcnQgZGFzaGVkIHRvIGNhbWVsQ2FzZTsgdXNlZCBieSB0aGUgY3NzIGFuZCBkYXRhIG1vZHVsZXMKLy8gU3VwcG9ydDogSUUgPD05IC0gMTEsIEVkZ2UgMTIgLSAxNQovLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVuZG9yIHByZWZpeCAoIzk1NzIpCmZ1bmN0aW9uIGNhbWVsQ2FzZSggc3RyaW5nICkgewoJcmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVmaXgsICJtcy0iICkucmVwbGFjZSggcmRhc2hBbHBoYSwgZmNhbWVsQ2FzZSApOwp9CnZhciBhY2NlcHREYXRhID0gZnVuY3Rpb24oIG93bmVyICkgewoKCS8vIEFjY2VwdHMgb25seToKCS8vICAtIE5vZGUKCS8vICAgIC0gTm9kZS5FTEVNRU5UX05PREUKCS8vICAgIC0gTm9kZS5ET0NVTUVOVF9OT0RFCgkvLyAgLSBPYmplY3QKCS8vICAgIC0gQW55CglyZXR1cm4gb3duZXIubm9kZVR5cGUgPT09IDEgfHwgb3duZXIubm9kZVR5cGUgPT09IDkgfHwgISggK293bmVyLm5vZGVUeXBlICk7Cn07CgoKCgpmdW5jdGlvbiBEYXRhKCkgewoJdGhpcy5leHBhbmRvID0galF1ZXJ5LmV4cGFuZG8gKyBEYXRhLnVpZCsrOwp9CgpEYXRhLnVpZCA9IDE7CgpEYXRhLnByb3RvdHlwZSA9IHsKCgljYWNoZTogZnVuY3Rpb24oIG93bmVyICkgewoKCQkvLyBDaGVjayBpZiB0aGUgb3duZXIgb2JqZWN0IGFscmVhZHkgaGFzIGEgY2FjaGUKCQl2YXIgdmFsdWUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07CgoJCS8vIElmIG5vdCwgY3JlYXRlIG9uZQoJCWlmICggIXZhbHVlICkgewoJCQl2YWx1ZSA9IHt9OwoKCQkJLy8gV2UgY2FuIGFjY2VwdCBkYXRhIGZvciBub24tZWxlbWVudCBub2RlcyBpbiBtb2Rlcm4gYnJvd3NlcnMsCgkJCS8vIGJ1dCB3ZSBzaG91bGQgbm90LCBzZWUgIzgzMzUuCgkJCS8vIEFsd2F5cyByZXR1cm4gYW4gZW1wdHkgb2JqZWN0LgoJCQlpZiAoIGFjY2VwdERhdGEoIG93bmVyICkgKSB7CgoJCQkJLy8gSWYgaXQgaXMgYSBub2RlIHVubGlrZWx5IHRvIGJlIHN0cmluZ2lmeS1lZCBvciBsb29wZWQgb3ZlcgoJCQkJLy8gdXNlIHBsYWluIGFzc2lnbm1lbnQKCQkJCWlmICggb3duZXIubm9kZVR5cGUgKSB7CgkJCQkJb3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdmFsdWU7CgoJCQkJLy8gT3RoZXJ3aXNlIHNlY3VyZSBpdCBpbiBhIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5CgkJCQkvLyBjb25maWd1cmFibGUgbXVzdCBiZSB0cnVlIHRvIGFsbG93IHRoZSBwcm9wZXJ0eSB0byBiZQoJCQkJLy8gZGVsZXRlZCB3aGVuIGRhdGEgaXMgcmVtb3ZlZAoJCQkJfSBlbHNlIHsKCQkJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoIG93bmVyLCB0aGlzLmV4cGFuZG8sIHsKCQkJCQkJdmFsdWU6IHZhbHVlLAoJCQkJCQljb25maWd1cmFibGU6IHRydWUKCQkJCQl9ICk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiB2YWx1ZTsKCX0sCglzZXQ6IGZ1bmN0aW9uKCBvd25lciwgZGF0YSwgdmFsdWUgKSB7CgkJdmFyIHByb3AsCgkJCWNhY2hlID0gdGhpcy5jYWNoZSggb3duZXIgKTsKCgkJLy8gSGFuZGxlOiBbIG93bmVyLCBrZXksIHZhbHVlIF0gYXJncwoJCS8vIEFsd2F5cyB1c2UgY2FtZWxDYXNlIGtleSAoZ2gtMjI1NykKCQlpZiAoIHR5cGVvZiBkYXRhID09PSAic3RyaW5nIiApIHsKCQkJY2FjaGVbIGNhbWVsQ2FzZSggZGF0YSApIF0gPSB2YWx1ZTsKCgkJLy8gSGFuZGxlOiBbIG93bmVyLCB7IHByb3BlcnRpZXMgfSBdIGFyZ3MKCQl9IGVsc2UgewoKCQkJLy8gQ29weSB0aGUgcHJvcGVydGllcyBvbmUtYnktb25lIHRvIHRoZSBjYWNoZSBvYmplY3QKCQkJZm9yICggcHJvcCBpbiBkYXRhICkgewoJCQkJY2FjaGVbIGNhbWVsQ2FzZSggcHJvcCApIF0gPSBkYXRhWyBwcm9wIF07CgkJCX0KCQl9CgkJcmV0dXJuIGNhY2hlOwoJfSwKCWdldDogZnVuY3Rpb24oIG93bmVyLCBrZXkgKSB7CgkJcmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkID8KCQkJdGhpcy5jYWNoZSggb3duZXIgKSA6CgoJCQkvLyBBbHdheXMgdXNlIGNhbWVsQ2FzZSBrZXkgKGdoLTIyNTcpCgkJCW93bmVyWyB0aGlzLmV4cGFuZG8gXSAmJiBvd25lclsgdGhpcy5leHBhbmRvIF1bIGNhbWVsQ2FzZSgga2V5ICkgXTsKCX0sCglhY2Nlc3M6IGZ1bmN0aW9uKCBvd25lciwga2V5LCB2YWx1ZSApIHsKCgkJLy8gSW4gY2FzZXMgd2hlcmUgZWl0aGVyOgoJCS8vCgkJLy8gICAxLiBObyBrZXkgd2FzIHNwZWNpZmllZAoJCS8vICAgMi4gQSBzdHJpbmcga2V5IHdhcyBzcGVjaWZpZWQsIGJ1dCBubyB2YWx1ZSBwcm92aWRlZAoJCS8vCgkJLy8gVGFrZSB0aGUgInJlYWQiIHBhdGggYW5kIGFsbG93IHRoZSBnZXQgbWV0aG9kIHRvIGRldGVybWluZQoJCS8vIHdoaWNoIHZhbHVlIHRvIHJldHVybiwgcmVzcGVjdGl2ZWx5IGVpdGhlcjoKCQkvLwoJCS8vICAgMS4gVGhlIGVudGlyZSBjYWNoZSBvYmplY3QKCQkvLyAgIDIuIFRoZSBkYXRhIHN0b3JlZCBhdCB0aGUga2V5CgkJLy8KCQlpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8CgkJCQkoICgga2V5ICYmIHR5cGVvZiBrZXkgPT09ICJzdHJpbmciICkgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCApICkgewoKCQkJcmV0dXJuIHRoaXMuZ2V0KCBvd25lciwga2V5ICk7CgkJfQoKCQkvLyBXaGVuIHRoZSBrZXkgaXMgbm90IGEgc3RyaW5nLCBvciBib3RoIGEga2V5IGFuZCB2YWx1ZQoJCS8vIGFyZSBzcGVjaWZpZWQsIHNldCBvciBleHRlbmQgKGV4aXN0aW5nIG9iamVjdHMpIHdpdGggZWl0aGVyOgoJCS8vCgkJLy8gICAxLiBBbiBvYmplY3Qgb2YgcHJvcGVydGllcwoJCS8vICAgMi4gQSBrZXkgYW5kIHZhbHVlCgkJLy8KCQl0aGlzLnNldCggb3duZXIsIGtleSwgdmFsdWUgKTsKCgkJLy8gU2luY2UgdGhlICJzZXQiIHBhdGggY2FuIGhhdmUgdHdvIHBvc3NpYmxlIGVudHJ5IHBvaW50cwoJCS8vIHJldHVybiB0aGUgZXhwZWN0ZWQgZGF0YSBiYXNlZCBvbiB3aGljaCBwYXRoIHdhcyB0YWtlblsqXQoJCXJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBrZXk7Cgl9LAoJcmVtb3ZlOiBmdW5jdGlvbiggb3duZXIsIGtleSApIHsKCQl2YXIgaSwKCQkJY2FjaGUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07CgoJCWlmICggY2FjaGUgPT09IHVuZGVmaW5lZCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCBrZXkgIT09IHVuZGVmaW5lZCApIHsKCgkJCS8vIFN1cHBvcnQgYXJyYXkgb3Igc3BhY2Ugc2VwYXJhdGVkIHN0cmluZyBvZiBrZXlzCgkJCWlmICggQXJyYXkuaXNBcnJheSgga2V5ICkgKSB7CgoJCQkJLy8gSWYga2V5IGlzIGFuIGFycmF5IG9mIGtleXMuLi4KCQkJCS8vIFdlIGFsd2F5cyBzZXQgY2FtZWxDYXNlIGtleXMsIHNvIHJlbW92ZSB0aGF0LgoJCQkJa2V5ID0ga2V5Lm1hcCggY2FtZWxDYXNlICk7CgkJCX0gZWxzZSB7CgkJCQlrZXkgPSBjYW1lbENhc2UoIGtleSApOwoKCQkJCS8vIElmIGEga2V5IHdpdGggdGhlIHNwYWNlcyBleGlzdHMsIHVzZSBpdC4KCQkJCS8vIE90aGVyd2lzZSwgY3JlYXRlIGFuIGFycmF5IGJ5IG1hdGNoaW5nIG5vbi13aGl0ZXNwYWNlCgkJCQlrZXkgPSBrZXkgaW4gY2FjaGUgPwoJCQkJCVsga2V5IF0gOgoJCQkJCSgga2V5Lm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW10gKTsKCQkJfQoKCQkJaSA9IGtleS5sZW5ndGg7CgoJCQl3aGlsZSAoIGktLSApIHsKCQkJCWRlbGV0ZSBjYWNoZVsga2V5WyBpIF0gXTsKCQkJfQoJCX0KCgkJLy8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIHRoZXJlJ3Mgbm8gbW9yZSBkYXRhCgkJaWYgKCBrZXkgPT09IHVuZGVmaW5lZCB8fCBqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKSApIHsKCgkJCS8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUKCQkJLy8gV2Via2l0ICYgQmxpbmsgcGVyZm9ybWFuY2Ugc3VmZmVycyB3aGVuIGRlbGV0aW5nIHByb3BlcnRpZXMKCQkJLy8gZnJvbSBET00gbm9kZXMsIHNvIHNldCB0byB1bmRlZmluZWQgaW5zdGVhZAoJCQkvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0zNzg2MDcgKGJ1ZyByZXN0cmljdGVkKQoJCQlpZiAoIG93bmVyLm5vZGVUeXBlICkgewoJCQkJb3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdW5kZWZpbmVkOwoJCQl9IGVsc2UgewoJCQkJZGVsZXRlIG93bmVyWyB0aGlzLmV4cGFuZG8gXTsKCQkJfQoJCX0KCX0sCgloYXNEYXRhOiBmdW5jdGlvbiggb3duZXIgKSB7CgkJdmFyIGNhY2hlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdOwoJCXJldHVybiBjYWNoZSAhPT0gdW5kZWZpbmVkICYmICFqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKTsKCX0KfTsKdmFyIGRhdGFQcml2ID0gbmV3IERhdGEoKTsKCnZhciBkYXRhVXNlciA9IG5ldyBEYXRhKCk7CgoKCi8vCUltcGxlbWVudGF0aW9uIFN1bW1hcnkKLy8KLy8JMS4gRW5mb3JjZSBBUEkgc3VyZmFjZSBhbmQgc2VtYW50aWMgY29tcGF0aWJpbGl0eSB3aXRoIDEuOS54IGJyYW5jaAovLwkyLiBJbXByb3ZlIHRoZSBtb2R1bGUncyBtYWludGFpbmFiaWxpdHkgYnkgcmVkdWNpbmcgdGhlIHN0b3JhZ2UKLy8JCXBhdGhzIHRvIGEgc2luZ2xlIG1lY2hhbmlzbS4KLy8JMy4gVXNlIHRoZSBzYW1lIHNpbmdsZSBtZWNoYW5pc20gdG8gc3VwcG9ydCAicHJpdmF0ZSIgYW5kICJ1c2VyIiBkYXRhLgovLwk0LiBfTmV2ZXJfIGV4cG9zZSAicHJpdmF0ZSIgZGF0YSB0byB1c2VyIGNvZGUgKFRPRE86IERyb3AgX2RhdGEsIF9yZW1vdmVEYXRhKQovLwk1LiBBdm9pZCBleHBvc2luZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9uIHVzZXIgb2JqZWN0cyAoZWcuIGV4cGFuZG8gcHJvcGVydGllcykKLy8JNi4gUHJvdmlkZSBhIGNsZWFyIHBhdGggZm9yIGltcGxlbWVudGF0aW9uIHVwZ3JhZGUgdG8gV2Vha01hcCBpbiAyMDE0Cgp2YXIgcmJyYWNlID0gL14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLywKCXJtdWx0aURhc2ggPSAvW0EtWl0vZzsKCmZ1bmN0aW9uIGdldERhdGEoIGRhdGEgKSB7CglpZiAoIGRhdGEgPT09ICJ0cnVlIiApIHsKCQlyZXR1cm4gdHJ1ZTsKCX0KCglpZiAoIGRhdGEgPT09ICJmYWxzZSIgKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCWlmICggZGF0YSA9PT0gIm51bGwiICkgewoJCXJldHVybiBudWxsOwoJfQoKCS8vIE9ubHkgY29udmVydCB0byBhIG51bWJlciBpZiBpdCBkb2Vzbid0IGNoYW5nZSB0aGUgc3RyaW5nCglpZiAoIGRhdGEgPT09ICtkYXRhICsgIiIgKSB7CgkJcmV0dXJuICtkYXRhOwoJfQoKCWlmICggcmJyYWNlLnRlc3QoIGRhdGEgKSApIHsKCQlyZXR1cm4gSlNPTi5wYXJzZSggZGF0YSApOwoJfQoKCXJldHVybiBkYXRhOwp9CgpmdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkgewoJdmFyIG5hbWU7CgoJLy8gSWYgbm90aGluZyB3YXMgZm91bmQgaW50ZXJuYWxseSwgdHJ5IHRvIGZldGNoIGFueQoJLy8gZGF0YSBmcm9tIHRoZSBIVE1MNSBkYXRhLSogYXR0cmlidXRlCglpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCW5hbWUgPSAiZGF0YS0iICsga2V5LnJlcGxhY2UoIHJtdWx0aURhc2gsICItJCYiICkudG9Mb3dlckNhc2UoKTsKCQlkYXRhID0gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTsKCgkJaWYgKCB0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIgKSB7CgkJCXRyeSB7CgkJCQlkYXRhID0gZ2V0RGF0YSggZGF0YSApOwoJCQl9IGNhdGNoICggZSApIHt9CgoJCQkvLyBNYWtlIHN1cmUgd2Ugc2V0IHRoZSBkYXRhIHNvIGl0IGlzbid0IGNoYW5nZWQgbGF0ZXIKCQkJZGF0YVVzZXIuc2V0KCBlbGVtLCBrZXksIGRhdGEgKTsKCQl9IGVsc2UgewoJCQlkYXRhID0gdW5kZWZpbmVkOwoJCX0KCX0KCXJldHVybiBkYXRhOwp9CgpqUXVlcnkuZXh0ZW5kKCB7CgloYXNEYXRhOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZGF0YVVzZXIuaGFzRGF0YSggZWxlbSApIHx8IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKTsKCX0sCgoJZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7CgkJcmV0dXJuIGRhdGFVc2VyLmFjY2VzcyggZWxlbSwgbmFtZSwgZGF0YSApOwoJfSwKCglyZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKCQlkYXRhVXNlci5yZW1vdmUoIGVsZW0sIG5hbWUgKTsKCX0sCgoJLy8gVE9ETzogTm93IHRoYXQgYWxsIGNhbGxzIHRvIF9kYXRhIGFuZCBfcmVtb3ZlRGF0YSBoYXZlIGJlZW4gcmVwbGFjZWQKCS8vIHdpdGggZGlyZWN0IGNhbGxzIHRvIGRhdGFQcml2IG1ldGhvZHMsIHRoZXNlIGNhbiBiZSBkZXByZWNhdGVkLgoJX2RhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkgewoJCXJldHVybiBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIG5hbWUsIGRhdGEgKTsKCX0sCgoJX3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCWRhdGFQcml2LnJlbW92ZSggZWxlbSwgbmFtZSApOwoJfQp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CglkYXRhOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl2YXIgaSwgbmFtZSwgZGF0YSwKCQkJZWxlbSA9IHRoaXNbIDAgXSwKCQkJYXR0cnMgPSBlbGVtICYmIGVsZW0uYXR0cmlidXRlczsKCgkJLy8gR2V0cyBhbGwgdmFsdWVzCgkJaWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHsKCQkJaWYgKCB0aGlzLmxlbmd0aCApIHsKCQkJCWRhdGEgPSBkYXRhVXNlci5nZXQoIGVsZW0gKTsKCgkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgIWRhdGFQcml2LmdldCggZWxlbSwgImhhc0RhdGFBdHRycyIgKSApIHsKCQkJCQlpID0gYXR0cnMubGVuZ3RoOwoJCQkJCXdoaWxlICggaS0tICkgewoKCQkJCQkJLy8gU3VwcG9ydDogSUUgMTEgb25seQoJCQkJCQkvLyBUaGUgYXR0cnMgZWxlbWVudHMgY2FuIGJlIG51bGwgKCMxNDg5NCkKCQkJCQkJaWYgKCBhdHRyc1sgaSBdICkgewoJCQkJCQkJbmFtZSA9IGF0dHJzWyBpIF0ubmFtZTsKCQkJCQkJCWlmICggbmFtZS5pbmRleE9mKCAiZGF0YS0iICkgPT09IDAgKSB7CgkJCQkJCQkJbmFtZSA9IGNhbWVsQ2FzZSggbmFtZS5zbGljZSggNSApICk7CgkJCQkJCQkJZGF0YUF0dHIoIGVsZW0sIG5hbWUsIGRhdGFbIG5hbWUgXSApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJCWRhdGFQcml2LnNldCggZWxlbSwgImhhc0RhdGFBdHRycyIsIHRydWUgKTsKCQkJCX0KCQkJfQoKCQkJcmV0dXJuIGRhdGE7CgkJfQoKCQkvLyBTZXRzIG11bHRpcGxlIHZhbHVlcwoJCWlmICggdHlwZW9mIGtleSA9PT0gIm9iamVjdCIgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQkJZGF0YVVzZXIuc2V0KCB0aGlzLCBrZXkgKTsKCQkJfSApOwoJCX0KCgkJcmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkgewoJCQl2YXIgZGF0YTsKCgkJCS8vIFRoZSBjYWxsaW5nIGpRdWVyeSBvYmplY3QgKGVsZW1lbnQgbWF0Y2hlcykgaXMgbm90IGVtcHR5CgkJCS8vIChhbmQgdGhlcmVmb3JlIGhhcyBhbiBlbGVtZW50IGFwcGVhcnMgYXQgdGhpc1sgMCBdKSBhbmQgdGhlCgkJCS8vIGB2YWx1ZWAgcGFyYW1ldGVyIHdhcyBub3QgdW5kZWZpbmVkLiBBbiBlbXB0eSBqUXVlcnkgb2JqZWN0CgkJCS8vIHdpbGwgcmVzdWx0IGluIGB1bmRlZmluZWRgIGZvciBlbGVtID0gdGhpc1sgMCBdIHdoaWNoIHdpbGwKCQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFuIGF0dGVtcHQgdG8gcmVhZCBhIGRhdGEgY2FjaGUgaXMgbWFkZS4KCQkJaWYgKCBlbGVtICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSB7CgoJCQkJLy8gQXR0ZW1wdCB0byBnZXQgZGF0YSBmcm9tIHRoZSBjYWNoZQoJCQkJLy8gVGhlIGtleSB3aWxsIGFsd2F5cyBiZSBjYW1lbENhc2VkIGluIERhdGEKCQkJCWRhdGEgPSBkYXRhVXNlci5nZXQoIGVsZW0sIGtleSApOwoJCQkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuIGRhdGE7CgkJCQl9CgoJCQkJLy8gQXR0ZW1wdCB0byAiZGlzY292ZXIiIHRoZSBkYXRhIGluCgkJCQkvLyBIVE1MNSBjdXN0b20gZGF0YS0qIGF0dHJzCgkJCQlkYXRhID0gZGF0YUF0dHIoIGVsZW0sIGtleSApOwoJCQkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuIGRhdGE7CgkJCQl9CgoJCQkJLy8gV2UgdHJpZWQgcmVhbGx5IGhhcmQsIGJ1dCB0aGUgZGF0YSBkb2Vzbid0IGV4aXN0LgoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBTZXQgdGhlIGRhdGEuLi4KCQkJdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCgkJCQkvLyBXZSBhbHdheXMgc3RvcmUgdGhlIGNhbWVsQ2FzZWQga2V5CgkJCQlkYXRhVXNlci5zZXQoIHRoaXMsIGtleSwgdmFsdWUgKTsKCQkJfSApOwoJCX0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSwgbnVsbCwgdHJ1ZSApOwoJfSwKCglyZW1vdmVEYXRhOiBmdW5jdGlvbigga2V5ICkgewoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQlkYXRhVXNlci5yZW1vdmUoIHRoaXMsIGtleSApOwoJCX0gKTsKCX0KfSApOwoKCmpRdWVyeS5leHRlbmQoIHsKCXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSwgZGF0YSApIHsKCQl2YXIgcXVldWU7CgoJCWlmICggZWxlbSApIHsKCQkJdHlwZSA9ICggdHlwZSB8fCAiZngiICkgKyAicXVldWUiOwoJCQlxdWV1ZSA9IGRhdGFQcml2LmdldCggZWxlbSwgdHlwZSApOwoKCQkJLy8gU3BlZWQgdXAgZGVxdWV1ZSBieSBnZXR0aW5nIG91dCBxdWlja2x5IGlmIHRoaXMgaXMganVzdCBhIGxvb2t1cAoJCQlpZiAoIGRhdGEgKSB7CgkJCQlpZiAoICFxdWV1ZSB8fCBBcnJheS5pc0FycmF5KCBkYXRhICkgKSB7CgkJCQkJcXVldWUgPSBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEgKSApOwoJCQkJfSBlbHNlIHsKCQkJCQlxdWV1ZS5wdXNoKCBkYXRhICk7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIHF1ZXVlIHx8IFtdOwoJCX0KCX0sCgoJZGVxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7CgkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCgkJdmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCBlbGVtLCB0eXBlICksCgkJCXN0YXJ0TGVuZ3RoID0gcXVldWUubGVuZ3RoLAoJCQlmbiA9IHF1ZXVlLnNoaWZ0KCksCgkJCWhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCB0eXBlICksCgkJCW5leHQgPSBmdW5jdGlvbigpIHsKCQkJCWpRdWVyeS5kZXF1ZXVlKCBlbGVtLCB0eXBlICk7CgkJCX07CgoJCS8vIElmIHRoZSBmeCBxdWV1ZSBpcyBkZXF1ZXVlZCwgYWx3YXlzIHJlbW92ZSB0aGUgcHJvZ3Jlc3Mgc2VudGluZWwKCQlpZiAoIGZuID09PSAiaW5wcm9ncmVzcyIgKSB7CgkJCWZuID0gcXVldWUuc2hpZnQoKTsKCQkJc3RhcnRMZW5ndGgtLTsKCQl9CgoJCWlmICggZm4gKSB7CgoJCQkvLyBBZGQgYSBwcm9ncmVzcyBzZW50aW5lbCB0byBwcmV2ZW50IHRoZSBmeCBxdWV1ZSBmcm9tIGJlaW5nCgkJCS8vIGF1dG9tYXRpY2FsbHkgZGVxdWV1ZWQKCQkJaWYgKCB0eXBlID09PSAiZngiICkgewoJCQkJcXVldWUudW5zaGlmdCggImlucHJvZ3Jlc3MiICk7CgkJCX0KCgkJCS8vIENsZWFyIHVwIHRoZSBsYXN0IHF1ZXVlIHN0b3AgZnVuY3Rpb24KCQkJZGVsZXRlIGhvb2tzLnN0b3A7CgkJCWZuLmNhbGwoIGVsZW0sIG5leHQsIGhvb2tzICk7CgkJfQoKCQlpZiAoICFzdGFydExlbmd0aCAmJiBob29rcyApIHsKCQkJaG9va3MuZW1wdHkuZmlyZSgpOwoJCX0KCX0sCgoJLy8gTm90IHB1YmxpYyAtIGdlbmVyYXRlIGEgcXVldWVIb29rcyBvYmplY3QsIG9yIHJldHVybiB0aGUgY3VycmVudCBvbmUKCV9xdWV1ZUhvb2tzOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHsKCQl2YXIga2V5ID0gdHlwZSArICJxdWV1ZUhvb2tzIjsKCQlyZXR1cm4gZGF0YVByaXYuZ2V0KCBlbGVtLCBrZXkgKSB8fCBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIGtleSwgewoJCQllbXB0eTogalF1ZXJ5LkNhbGxiYWNrcyggIm9uY2UgbWVtb3J5IiApLmFkZCggZnVuY3Rpb24oKSB7CgkJCQlkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFsgdHlwZSArICJxdWV1ZSIsIGtleSBdICk7CgkJCX0gKQoJCX0gKTsKCX0KfSApOwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJcXVldWU6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewoJCXZhciBzZXR0ZXIgPSAyOwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJZGF0YSA9IHR5cGU7CgkJCXR5cGUgPSAiZngiOwoJCQlzZXR0ZXItLTsKCQl9CgoJCWlmICggYXJndW1lbnRzLmxlbmd0aCA8IHNldHRlciApIHsKCQkJcmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1sgMCBdLCB0eXBlICk7CgkJfQoKCQlyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkID8KCQkJdGhpcyA6CgkJCXRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCQl2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIGRhdGEgKTsKCgkJCQkvLyBFbnN1cmUgYSBob29rcyBmb3IgdGhpcyBxdWV1ZQoJCQkJalF1ZXJ5Ll9xdWV1ZUhvb2tzKCB0aGlzLCB0eXBlICk7CgoJCQkJaWYgKCB0eXBlID09PSAiZngiICYmIHF1ZXVlWyAwIF0gIT09ICJpbnByb2dyZXNzIiApIHsKCQkJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOwoJCQkJfQoJCQl9ICk7Cgl9LAoJZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7CgkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7CgkJfSApOwoJfSwKCWNsZWFyUXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgewoJCXJldHVybiB0aGlzLnF1ZXVlKCB0eXBlIHx8ICJmeCIsIFtdICk7Cgl9LAoKCS8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBxdWV1ZXMgb2YgYSBjZXJ0YWluIHR5cGUKCS8vIGFyZSBlbXB0aWVkIChmeCBpcyB0aGUgdHlwZSBieSBkZWZhdWx0KQoJcHJvbWlzZTogZnVuY3Rpb24oIHR5cGUsIG9iaiApIHsKCQl2YXIgdG1wLAoJCQljb3VudCA9IDEsCgkJCWRlZmVyID0galF1ZXJ5LkRlZmVycmVkKCksCgkJCWVsZW1lbnRzID0gdGhpcywKCQkJaSA9IHRoaXMubGVuZ3RoLAoJCQlyZXNvbHZlID0gZnVuY3Rpb24oKSB7CgkJCQlpZiAoICEoIC0tY291bnQgKSApIHsKCQkJCQlkZWZlci5yZXNvbHZlV2l0aCggZWxlbWVudHMsIFsgZWxlbWVudHMgXSApOwoJCQkJfQoJCQl9OwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJb2JqID0gdHlwZTsKCQkJdHlwZSA9IHVuZGVmaW5lZDsKCQl9CgkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCgkJd2hpbGUgKCBpLS0gKSB7CgkJCXRtcCA9IGRhdGFQcml2LmdldCggZWxlbWVudHNbIGkgXSwgdHlwZSArICJxdWV1ZUhvb2tzIiApOwoJCQlpZiAoIHRtcCAmJiB0bXAuZW1wdHkgKSB7CgkJCQljb3VudCsrOwoJCQkJdG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApOwoJCQl9CgkJfQoJCXJlc29sdmUoKTsKCQlyZXR1cm4gZGVmZXIucHJvbWlzZSggb2JqICk7Cgl9Cn0gKTsKdmFyIHBudW0gPSAoIC9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8gKS5zb3VyY2U7Cgp2YXIgcmNzc051bSA9IG5ldyBSZWdFeHAoICJeKD86KFsrLV0pPXwpKCIgKyBwbnVtICsgIikoW2EteiVdKikkIiwgImkiICk7CgoKdmFyIGNzc0V4cGFuZCA9IFsgIlRvcCIsICJSaWdodCIsICJCb3R0b20iLCAiTGVmdCIgXTsKCnZhciBpc0hpZGRlbldpdGhpblRyZWUgPSBmdW5jdGlvbiggZWxlbSwgZWwgKSB7CgoJCS8vIGlzSGlkZGVuV2l0aGluVHJlZSBtaWdodCBiZSBjYWxsZWQgZnJvbSBqUXVlcnkjZmlsdGVyIGZ1bmN0aW9uOwoJCS8vIGluIHRoYXQgY2FzZSwgZWxlbWVudCB3aWxsIGJlIHNlY29uZCBhcmd1bWVudAoJCWVsZW0gPSBlbCB8fCBlbGVtOwoKCQkvLyBJbmxpbmUgc3R5bGUgdHJ1bXBzIGFsbAoJCXJldHVybiBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICJub25lIiB8fAoJCQllbGVtLnN0eWxlLmRpc3BsYXkgPT09ICIiICYmCgoJCQkvLyBPdGhlcndpc2UsIGNoZWNrIGNvbXB1dGVkIHN0eWxlCgkJCS8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00MyAtIDQ1CgkJCS8vIERpc2Nvbm5lY3RlZCBlbGVtZW50cyBjYW4gaGF2ZSBjb21wdXRlZCBkaXNwbGF5OiBub25lLCBzbyBmaXJzdCBjb25maXJtIHRoYXQgZWxlbSBpcwoJCQkvLyBpbiB0aGUgZG9jdW1lbnQuCgkJCWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgJiYKCgkJCWpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApID09PSAibm9uZSI7Cgl9OwoKdmFyIHN3YXAgPSBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2ssIGFyZ3MgKSB7Cgl2YXIgcmV0LCBuYW1lLAoJCW9sZCA9IHt9OwoKCS8vIFJlbWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcgb25lcwoJZm9yICggbmFtZSBpbiBvcHRpb25zICkgewoJCW9sZFsgbmFtZSBdID0gZWxlbS5zdHlsZVsgbmFtZSBdOwoJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9wdGlvbnNbIG5hbWUgXTsKCX0KCglyZXQgPSBjYWxsYmFjay5hcHBseSggZWxlbSwgYXJncyB8fCBbXSApOwoKCS8vIFJldmVydCB0aGUgb2xkIHZhbHVlcwoJZm9yICggbmFtZSBpbiBvcHRpb25zICkgewoJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdOwoJfQoKCXJldHVybiByZXQ7Cn07CgoKCgpmdW5jdGlvbiBhZGp1c3RDU1MoIGVsZW0sIHByb3AsIHZhbHVlUGFydHMsIHR3ZWVuICkgewoJdmFyIGFkanVzdGVkLCBzY2FsZSwKCQltYXhJdGVyYXRpb25zID0gMjAsCgkJY3VycmVudFZhbHVlID0gdHdlZW4gPwoJCQlmdW5jdGlvbigpIHsKCQkJCXJldHVybiB0d2Vlbi5jdXIoKTsKCQkJfSA6CgkJCWZ1bmN0aW9uKCkgewoJCQkJcmV0dXJuIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AsICIiICk7CgkJCX0sCgkJaW5pdGlhbCA9IGN1cnJlbnRWYWx1ZSgpLAoJCXVuaXQgPSB2YWx1ZVBhcnRzICYmIHZhbHVlUGFydHNbIDMgXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/ICIiIDogInB4IiApLAoKCQkvLyBTdGFydGluZyB2YWx1ZSBjb21wdXRhdGlvbiBpcyByZXF1aXJlZCBmb3IgcG90ZW50aWFsIHVuaXQgbWlzbWF0Y2hlcwoJCWluaXRpYWxJblVuaXQgPSAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSB8fCB1bml0ICE9PSAicHgiICYmICtpbml0aWFsICkgJiYKCQkJcmNzc051bS5leGVjKCBqUXVlcnkuY3NzKCBlbGVtLCBwcm9wICkgKTsKCglpZiAoIGluaXRpYWxJblVuaXQgJiYgaW5pdGlhbEluVW5pdFsgMyBdICE9PSB1bml0ICkgewoKCQkvLyBTdXBwb3J0OiBGaXJlZm94IDw9NTQKCQkvLyBIYWx2ZSB0aGUgaXRlcmF0aW9uIHRhcmdldCB2YWx1ZSB0byBwcmV2ZW50IGludGVyZmVyZW5jZSBmcm9tIENTUyB1cHBlciBib3VuZHMgKGdoLTIxNDQpCgkJaW5pdGlhbCA9IGluaXRpYWwgLyAyOwoKCQkvLyBUcnVzdCB1bml0cyByZXBvcnRlZCBieSBqUXVlcnkuY3NzCgkJdW5pdCA9IHVuaXQgfHwgaW5pdGlhbEluVW5pdFsgMyBdOwoKCQkvLyBJdGVyYXRpdmVseSBhcHByb3hpbWF0ZSBmcm9tIGEgbm9uemVybyBzdGFydGluZyBwb2ludAoJCWluaXRpYWxJblVuaXQgPSAraW5pdGlhbCB8fCAxOwoKCQl3aGlsZSAoIG1heEl0ZXJhdGlvbnMtLSApIHsKCgkJCS8vIEV2YWx1YXRlIGFuZCB1cGRhdGUgb3VyIGJlc3QgZ3Vlc3MgKGRvdWJsaW5nIGd1ZXNzZXMgdGhhdCB6ZXJvIG91dCkuCgkJCS8vIEZpbmlzaCBpZiB0aGUgc2NhbGUgZXF1YWxzIG9yIGNyb3NzZXMgMSAobWFraW5nIHRoZSBvbGQqbmV3IHByb2R1Y3Qgbm9uLXBvc2l0aXZlKS4KCQkJalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBpbml0aWFsSW5Vbml0ICsgdW5pdCApOwoJCQlpZiAoICggMSAtIHNjYWxlICkgKiAoIDEgLSAoIHNjYWxlID0gY3VycmVudFZhbHVlKCkgLyBpbml0aWFsIHx8IDAuNSApICkgPD0gMCApIHsKCQkJCW1heEl0ZXJhdGlvbnMgPSAwOwoJCQl9CgkJCWluaXRpYWxJblVuaXQgPSBpbml0aWFsSW5Vbml0IC8gc2NhbGU7CgoJCX0KCgkJaW5pdGlhbEluVW5pdCA9IGluaXRpYWxJblVuaXQgKiAyOwoJCWpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgaW5pdGlhbEluVW5pdCArIHVuaXQgKTsKCgkJLy8gTWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGUgdHdlZW4gcHJvcGVydGllcyBsYXRlciBvbgoJCXZhbHVlUGFydHMgPSB2YWx1ZVBhcnRzIHx8IFtdOwoJfQoKCWlmICggdmFsdWVQYXJ0cyApIHsKCQlpbml0aWFsSW5Vbml0ID0gK2luaXRpYWxJblVuaXQgfHwgK2luaXRpYWwgfHwgMDsKCgkJLy8gQXBwbHkgcmVsYXRpdmUgb2Zmc2V0ICgrPS8tPSkgaWYgc3BlY2lmaWVkCgkJYWRqdXN0ZWQgPSB2YWx1ZVBhcnRzWyAxIF0gPwoJCQlpbml0aWFsSW5Vbml0ICsgKCB2YWx1ZVBhcnRzWyAxIF0gKyAxICkgKiB2YWx1ZVBhcnRzWyAyIF0gOgoJCQkrdmFsdWVQYXJ0c1sgMiBdOwoJCWlmICggdHdlZW4gKSB7CgkJCXR3ZWVuLnVuaXQgPSB1bml0OwoJCQl0d2Vlbi5zdGFydCA9IGluaXRpYWxJblVuaXQ7CgkJCXR3ZWVuLmVuZCA9IGFkanVzdGVkOwoJCX0KCX0KCXJldHVybiBhZGp1c3RlZDsKfQoKCnZhciBkZWZhdWx0RGlzcGxheU1hcCA9IHt9OwoKZnVuY3Rpb24gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKSB7Cgl2YXIgdGVtcCwKCQlkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQsCgkJbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLAoJCWRpc3BsYXkgPSBkZWZhdWx0RGlzcGxheU1hcFsgbm9kZU5hbWUgXTsKCglpZiAoIGRpc3BsYXkgKSB7CgkJcmV0dXJuIGRpc3BsYXk7Cgl9CgoJdGVtcCA9IGRvYy5ib2R5LmFwcGVuZENoaWxkKCBkb2MuY3JlYXRlRWxlbWVudCggbm9kZU5hbWUgKSApOwoJZGlzcGxheSA9IGpRdWVyeS5jc3MoIHRlbXAsICJkaXNwbGF5IiApOwoKCXRlbXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggdGVtcCApOwoKCWlmICggZGlzcGxheSA9PT0gIm5vbmUiICkgewoJCWRpc3BsYXkgPSAiYmxvY2siOwoJfQoJZGVmYXVsdERpc3BsYXlNYXBbIG5vZGVOYW1lIF0gPSBkaXNwbGF5OwoKCXJldHVybiBkaXNwbGF5Owp9CgpmdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cgKSB7Cgl2YXIgZGlzcGxheSwgZWxlbSwKCQl2YWx1ZXMgPSBbXSwKCQlpbmRleCA9IDAsCgkJbGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoOwoKCS8vIERldGVybWluZSBuZXcgZGlzcGxheSB2YWx1ZSBmb3IgZWxlbWVudHMgdGhhdCBuZWVkIHRvIGNoYW5nZQoJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQllbGVtID0gZWxlbWVudHNbIGluZGV4IF07CgkJaWYgKCAhZWxlbS5zdHlsZSApIHsKCQkJY29udGludWU7CgkJfQoKCQlkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5OwoJCWlmICggc2hvdyApIHsKCgkJCS8vIFNpbmNlIHdlIGZvcmNlIHZpc2liaWxpdHkgdXBvbiBjYXNjYWRlLWhpZGRlbiBlbGVtZW50cywgYW4gaW1tZWRpYXRlIChhbmQgc2xvdykKCQkJLy8gY2hlY2sgaXMgcmVxdWlyZWQgaW4gdGhpcyBmaXJzdCBsb29wIHVubGVzcyB3ZSBoYXZlIGEgbm9uZW1wdHkgZGlzcGxheSB2YWx1ZSAoZWl0aGVyCgkJCS8vIGlubGluZSBvciBhYm91dC10by1iZS1yZXN0b3JlZCkKCQkJaWYgKCBkaXNwbGF5ID09PSAibm9uZSIgKSB7CgkJCQl2YWx1ZXNbIGluZGV4IF0gPSBkYXRhUHJpdi5nZXQoIGVsZW0sICJkaXNwbGF5IiApIHx8IG51bGw7CgkJCQlpZiAoICF2YWx1ZXNbIGluZGV4IF0gKSB7CgkJCQkJZWxlbS5zdHlsZS5kaXNwbGF5ID0gIiI7CgkJCQl9CgkJCX0KCQkJaWYgKCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICIiICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApICkgewoJCQkJdmFsdWVzWyBpbmRleCBdID0gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKTsKCQkJfQoJCX0gZWxzZSB7CgkJCWlmICggZGlzcGxheSAhPT0gIm5vbmUiICkgewoJCQkJdmFsdWVzWyBpbmRleCBdID0gIm5vbmUiOwoKCQkJCS8vIFJlbWVtYmVyIHdoYXQgd2UncmUgb3ZlcndyaXRpbmcKCQkJCWRhdGFQcml2LnNldCggZWxlbSwgImRpc3BsYXkiLCBkaXNwbGF5ICk7CgkJCX0KCQl9Cgl9CgoJLy8gU2V0IHRoZSBkaXNwbGF5IG9mIHRoZSBlbGVtZW50cyBpbiBhIHNlY29uZCBsb29wIHRvIGF2b2lkIGNvbnN0YW50IHJlZmxvdwoJZm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQlpZiAoIHZhbHVlc1sgaW5kZXggXSAhPSBudWxsICkgewoJCQllbGVtZW50c1sgaW5kZXggXS5zdHlsZS5kaXNwbGF5ID0gdmFsdWVzWyBpbmRleCBdOwoJCX0KCX0KCglyZXR1cm4gZWxlbWVudHM7Cn0KCmpRdWVyeS5mbi5leHRlbmQoIHsKCXNob3c6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzaG93SGlkZSggdGhpcywgdHJ1ZSApOwoJfSwKCWhpZGU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzaG93SGlkZSggdGhpcyApOwoJfSwKCXRvZ2dsZTogZnVuY3Rpb24oIHN0YXRlICkgewoJCWlmICggdHlwZW9mIHN0YXRlID09PSAiYm9vbGVhbiIgKSB7CgkJCXJldHVybiBzdGF0ZSA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7CgkJfQoKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCQkJaWYgKCBpc0hpZGRlbldpdGhpblRyZWUoIHRoaXMgKSApIHsKCQkJCWpRdWVyeSggdGhpcyApLnNob3coKTsKCQkJfSBlbHNlIHsKCQkJCWpRdWVyeSggdGhpcyApLmhpZGUoKTsKCQkJfQoJCX0gKTsKCX0KfSApOwp2YXIgcmNoZWNrYWJsZVR5cGUgPSAoIC9eKD86Y2hlY2tib3h8cmFkaW8pJC9pICk7Cgp2YXIgcnRhZ05hbWUgPSAoIC88KFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0rKS9pICk7Cgp2YXIgcnNjcmlwdFR5cGUgPSAoIC9eJHxebW9kdWxlJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSApOwoKCgovLyBXZSBoYXZlIHRvIGNsb3NlIHRoZXNlIHRhZ3MgdG8gc3VwcG9ydCBYSFRNTCAoIzEzMjAwKQp2YXIgd3JhcE1hcCA9IHsKCgkvLyBTdXBwb3J0OiBJRSA8PTkgb25seQoJb3B0aW9uOiBbIDEsICI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwgIjwvc2VsZWN0PiIgXSwKCgkvLyBYSFRNTCBwYXJzZXJzIGRvIG5vdCBtYWdpY2FsbHkgaW5zZXJ0IGVsZW1lbnRzIGluIHRoZQoJLy8gc2FtZSB3YXkgdGhhdCB0YWcgc291cCBwYXJzZXJzIGRvLiBTbyB3ZSBjYW5ub3Qgc2hvcnRlbgoJLy8gdGhpcyBieSBvbWl0dGluZyA8dGJvZHk+IG9yIG90aGVyIHJlcXVpcmVkIGVsZW1lbnRzLgoJdGhlYWQ6IFsgMSwgIjx0YWJsZT4iLCAiPC90YWJsZT4iIF0sCgljb2w6IFsgMiwgIjx0YWJsZT48Y29sZ3JvdXA+IiwgIjwvY29sZ3JvdXA+PC90YWJsZT4iIF0sCgl0cjogWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSwKCXRkOiBbIDMsICI8dGFibGU+PHRib2R5Pjx0cj4iLCAiPC90cj48L3Rib2R5PjwvdGFibGU+IiBdLAoKCV9kZWZhdWx0OiBbIDAsICIiLCAiIiBdCn07CgovLyBTdXBwb3J0OiBJRSA8PTkgb25seQp3cmFwTWFwLm9wdGdyb3VwID0gd3JhcE1hcC5vcHRpb247Cgp3cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkOwp3cmFwTWFwLnRoID0gd3JhcE1hcC50ZDsKCgpmdW5jdGlvbiBnZXRBbGwoIGNvbnRleHQsIHRhZyApIHsKCgkvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5CgkvLyBVc2UgdHlwZW9mIHRvIGF2b2lkIHplcm8tYXJndW1lbnQgbWV0aG9kIGludm9jYXRpb24gb24gaG9zdCBvYmplY3RzICgjMTUxNTEpCgl2YXIgcmV0OwoKCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICkgewoJCXJldCA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyB8fCAiKiIgKTsKCgl9IGVsc2UgaWYgKCB0eXBlb2YgY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsICE9PSAidW5kZWZpbmVkIiApIHsKCQlyZXQgPSBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRhZyB8fCAiKiIgKTsKCgl9IGVsc2UgewoJCXJldCA9IFtdOwoJfQoKCWlmICggdGFnID09PSB1bmRlZmluZWQgfHwgdGFnICYmIG5vZGVOYW1lKCBjb250ZXh0LCB0YWcgKSApIHsKCQlyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbIGNvbnRleHQgXSwgcmV0ICk7Cgl9CgoJcmV0dXJuIHJldDsKfQoKCi8vIE1hcmsgc2NyaXB0cyBhcyBoYXZpbmcgYWxyZWFkeSBiZWVuIGV2YWx1YXRlZApmdW5jdGlvbiBzZXRHbG9iYWxFdmFsKCBlbGVtcywgcmVmRWxlbWVudHMgKSB7Cgl2YXIgaSA9IDAsCgkJbCA9IGVsZW1zLmxlbmd0aDsKCglmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJZGF0YVByaXYuc2V0KAoJCQllbGVtc1sgaSBdLAoJCQkiZ2xvYmFsRXZhbCIsCgkJCSFyZWZFbGVtZW50cyB8fCBkYXRhUHJpdi5nZXQoIHJlZkVsZW1lbnRzWyBpIF0sICJnbG9iYWxFdmFsIiApCgkJKTsKCX0KfQoKCnZhciByaHRtbCA9IC88fCYjP1x3KzsvOwoKZnVuY3Rpb24gYnVpbGRGcmFnbWVudCggZWxlbXMsIGNvbnRleHQsIHNjcmlwdHMsIHNlbGVjdGlvbiwgaWdub3JlZCApIHsKCXZhciBlbGVtLCB0bXAsIHRhZywgd3JhcCwgY29udGFpbnMsIGosCgkJZnJhZ21lbnQgPSBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwKCQlub2RlcyA9IFtdLAoJCWkgPSAwLAoJCWwgPSBlbGVtcy5sZW5ndGg7CgoJZm9yICggOyBpIDwgbDsgaSsrICkgewoJCWVsZW0gPSBlbGVtc1sgaSBdOwoKCQlpZiAoIGVsZW0gfHwgZWxlbSA9PT0gMCApIHsKCgkJCS8vIEFkZCBub2RlcyBkaXJlY3RseQoJCQlpZiAoIHRvVHlwZSggZWxlbSApID09PSAib2JqZWN0IiApIHsKCgkJCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHkKCQkJCS8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJCWpRdWVyeS5tZXJnZSggbm9kZXMsIGVsZW0ubm9kZVR5cGUgPyBbIGVsZW0gXSA6IGVsZW0gKTsKCgkJCS8vIENvbnZlcnQgbm9uLWh0bWwgaW50byBhIHRleHQgbm9kZQoJCQl9IGVsc2UgaWYgKCAhcmh0bWwudGVzdCggZWxlbSApICkgewoJCQkJbm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApICk7CgoJCQkvLyBDb252ZXJ0IGh0bWwgaW50byBET00gbm9kZXMKCQkJfSBlbHNlIHsKCQkJCXRtcCA9IHRtcCB8fCBmcmFnbWVudC5hcHBlbmRDaGlsZCggY29udGV4dC5jcmVhdGVFbGVtZW50KCAiZGl2IiApICk7CgoJCQkJLy8gRGVzZXJpYWxpemUgYSBzdGFuZGFyZCByZXByZXNlbnRhdGlvbgoJCQkJdGFnID0gKCBydGFnTmFtZS5leGVjKCBlbGVtICkgfHwgWyAiIiwgIiIgXSApWyAxIF0udG9Mb3dlckNhc2UoKTsKCQkJCXdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZhdWx0OwoJCQkJdG1wLmlubmVySFRNTCA9IHdyYXBbIDEgXSArIGpRdWVyeS5odG1sUHJlZmlsdGVyKCBlbGVtICkgKyB3cmFwWyAyIF07CgoJCQkJLy8gRGVzY2VuZCB0aHJvdWdoIHdyYXBwZXJzIHRvIHRoZSByaWdodCBjb250ZW50CgkJCQlqID0gd3JhcFsgMCBdOwoJCQkJd2hpbGUgKCBqLS0gKSB7CgkJCQkJdG1wID0gdG1wLmxhc3RDaGlsZDsKCQkJCX0KCgkJCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHkKCQkJCS8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJCWpRdWVyeS5tZXJnZSggbm9kZXMsIHRtcC5jaGlsZE5vZGVzICk7CgoJCQkJLy8gUmVtZW1iZXIgdGhlIHRvcC1sZXZlbCBjb250YWluZXIKCQkJCXRtcCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7CgoJCQkJLy8gRW5zdXJlIHRoZSBjcmVhdGVkIG5vZGVzIGFyZSBvcnBoYW5lZCAoIzEyMzkyKQoJCQkJdG1wLnRleHRDb250ZW50ID0gIiI7CgkJCX0KCQl9Cgl9CgoJLy8gUmVtb3ZlIHdyYXBwZXIgZnJvbSBmcmFnbWVudAoJZnJhZ21lbnQudGV4dENvbnRlbnQgPSAiIjsKCglpID0gMDsKCXdoaWxlICggKCBlbGVtID0gbm9kZXNbIGkrKyBdICkgKSB7CgoJCS8vIFNraXAgZWxlbWVudHMgYWxyZWFkeSBpbiB0aGUgY29udGV4dCBjb2xsZWN0aW9uICh0cmFjLTQwODcpCgkJaWYgKCBzZWxlY3Rpb24gJiYgalF1ZXJ5LmluQXJyYXkoIGVsZW0sIHNlbGVjdGlvbiApID4gLTEgKSB7CgkJCWlmICggaWdub3JlZCApIHsKCQkJCWlnbm9yZWQucHVzaCggZWxlbSApOwoJCQl9CgkJCWNvbnRpbnVlOwoJCX0KCgkJY29udGFpbnMgPSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApOwoKCQkvLyBBcHBlbmQgdG8gZnJhZ21lbnQKCQl0bXAgPSBnZXRBbGwoIGZyYWdtZW50LmFwcGVuZENoaWxkKCBlbGVtICksICJzY3JpcHQiICk7CgoJCS8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3RvcnkKCQlpZiAoIGNvbnRhaW5zICkgewoJCQlzZXRHbG9iYWxFdmFsKCB0bXAgKTsKCQl9CgoJCS8vIENhcHR1cmUgZXhlY3V0YWJsZXMKCQlpZiAoIHNjcmlwdHMgKSB7CgkJCWogPSAwOwoJCQl3aGlsZSAoICggZWxlbSA9IHRtcFsgaisrIF0gKSApIHsKCQkJCWlmICggcnNjcmlwdFR5cGUudGVzdCggZWxlbS50eXBlIHx8ICIiICkgKSB7CgkJCQkJc2NyaXB0cy5wdXNoKCBlbGVtICk7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIGZyYWdtZW50Owp9CgoKKCBmdW5jdGlvbigpIHsKCXZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwKCQlkaXYgPSBmcmFnbWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSApLAoJCWlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlucHV0IiApOwoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIC0gNC4zIG9ubHkKCS8vIENoZWNrIHN0YXRlIGxvc3QgaWYgdGhlIG5hbWUgaXMgc2V0ICgjMTEyMTcpCgkvLyBTdXBwb3J0OiBXaW5kb3dzIFdlYiBBcHBzIChXV0EpCgkvLyBgbmFtZWAgYW5kIGB0eXBlYCBtdXN0IHVzZSAuc2V0QXR0cmlidXRlIGZvciBXV0EgKCMxNDkwMSkKCWlucHV0LnNldEF0dHJpYnV0ZSggInR5cGUiLCAicmFkaW8iICk7CglpbnB1dC5zZXRBdHRyaWJ1dGUoICJjaGVja2VkIiwgImNoZWNrZWQiICk7CglpbnB1dC5zZXRBdHRyaWJ1dGUoICJuYW1lIiwgInQiICk7CgoJZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApOwoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjEgb25seQoJLy8gT2xkZXIgV2ViS2l0IGRvZXNuJ3QgY2xvbmUgY2hlY2tlZCBzdGF0ZSBjb3JyZWN0bHkgaW4gZnJhZ21lbnRzCglzdXBwb3J0LmNoZWNrQ2xvbmUgPSBkaXYuY2xvbmVOb2RlKCB0cnVlICkuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmNoZWNrZWQ7CgoJLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5CgkvLyBNYWtlIHN1cmUgdGV4dGFyZWEgKGFuZCBjaGVja2JveCkgZGVmYXVsdFZhbHVlIGlzIHByb3Blcmx5IGNsb25lZAoJZGl2LmlubmVySFRNTCA9ICI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IjsKCXN1cHBvcnQubm9DbG9uZUNoZWNrZWQgPSAhIWRpdi5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlOwp9ICkoKTsKdmFyIGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCgoKdmFyCglya2V5RXZlbnQgPSAvXmtleS8sCglybW91c2VFdmVudCA9IC9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLywKCXJ0eXBlbmFtZXNwYWNlID0gL14oW14uXSopKD86XC4oLispfCkvOwoKZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHsKCXJldHVybiB0cnVlOwp9CgpmdW5jdGlvbiByZXR1cm5GYWxzZSgpIHsKCXJldHVybiBmYWxzZTsKfQoKLy8gU3VwcG9ydDogSUUgPD05IG9ubHkKLy8gU2VlICMxMzM5MyBmb3IgbW9yZSBpbmZvCmZ1bmN0aW9uIHNhZmVBY3RpdmVFbGVtZW50KCkgewoJdHJ5IHsKCQlyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDsKCX0gY2F0Y2ggKCBlcnIgKSB7IH0KfQoKZnVuY3Rpb24gb24oIGVsZW0sIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIG9uZSApIHsKCXZhciBvcmlnRm4sIHR5cGU7CgoJLy8gVHlwZXMgY2FuIGJlIGEgbWFwIG9mIHR5cGVzL2hhbmRsZXJzCglpZiAoIHR5cGVvZiB0eXBlcyA9PT0gIm9iamVjdCIgKSB7CgoJCS8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3RvciwgZGF0YSApCgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewoKCQkJLy8gKCB0eXBlcy1PYmplY3QsIGRhdGEgKQoJCQlkYXRhID0gZGF0YSB8fCBzZWxlY3RvcjsKCQkJc2VsZWN0b3IgPSB1bmRlZmluZWQ7CgkJfQoJCWZvciAoIHR5cGUgaW4gdHlwZXMgKSB7CgkJCW9uKCBlbGVtLCB0eXBlLCBzZWxlY3RvciwgZGF0YSwgdHlwZXNbIHR5cGUgXSwgb25lICk7CgkJfQoJCXJldHVybiBlbGVtOwoJfQoKCWlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7CgoJCS8vICggdHlwZXMsIGZuICkKCQlmbiA9IHNlbGVjdG9yOwoJCWRhdGEgPSBzZWxlY3RvciA9IHVuZGVmaW5lZDsKCX0gZWxzZSBpZiAoIGZuID09IG51bGwgKSB7CgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgewoKCQkJLy8gKCB0eXBlcywgc2VsZWN0b3IsIGZuICkKCQkJZm4gPSBkYXRhOwoJCQlkYXRhID0gdW5kZWZpbmVkOwoJCX0gZWxzZSB7CgoJCQkvLyAoIHR5cGVzLCBkYXRhLCBmbiApCgkJCWZuID0gZGF0YTsKCQkJZGF0YSA9IHNlbGVjdG9yOwoJCQlzZWxlY3RvciA9IHVuZGVmaW5lZDsKCQl9Cgl9CglpZiAoIGZuID09PSBmYWxzZSApIHsKCQlmbiA9IHJldHVybkZhbHNlOwoJfSBlbHNlIGlmICggIWZuICkgewoJCXJldHVybiBlbGVtOwoJfQoKCWlmICggb25lID09PSAxICkgewoJCW9yaWdGbiA9IGZuOwoJCWZuID0gZnVuY3Rpb24oIGV2ZW50ICkgewoKCQkJLy8gQ2FuIHVzZSBhbiBlbXB0eSBzZXQsIHNpbmNlIGV2ZW50IGNvbnRhaW5zIHRoZSBpbmZvCgkJCWpRdWVyeSgpLm9mZiggZXZlbnQgKTsKCQkJcmV0dXJuIG9yaWdGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfTsKCgkJLy8gVXNlIHNhbWUgZ3VpZCBzbyBjYWxsZXIgY2FuIHJlbW92ZSB1c2luZyBvcmlnRm4KCQlmbi5ndWlkID0gb3JpZ0ZuLmd1aWQgfHwgKCBvcmlnRm4uZ3VpZCA9IGpRdWVyeS5ndWlkKysgKTsKCX0KCXJldHVybiBlbGVtLmVhY2goIGZ1bmN0aW9uKCkgewoJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGVzLCBmbiwgZGF0YSwgc2VsZWN0b3IgKTsKCX0gKTsKfQoKLyoKICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgZXZlbnRzIC0tIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLgogKiBQcm9wcyB0byBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkgZm9yIG1hbnkgb2YgdGhlIGlkZWFzLgogKi8KalF1ZXJ5LmV2ZW50ID0gewoKCWdsb2JhbDoge30sCgoJYWRkOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEsIHNlbGVjdG9yICkgewoKCQl2YXIgaGFuZGxlT2JqSW4sIGV2ZW50SGFuZGxlLCB0bXAsCgkJCWV2ZW50cywgdCwgaGFuZGxlT2JqLAoJCQlzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsCgkJCWVsZW1EYXRhID0gZGF0YVByaXYuZ2V0KCBlbGVtICk7CgoJCS8vIERvbid0IGF0dGFjaCBldmVudHMgdG8gbm9EYXRhIG9yIHRleHQvY29tbWVudCBub2RlcyAoYnV0IGFsbG93IHBsYWluIG9iamVjdHMpCgkJaWYgKCAhZWxlbURhdGEgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIENhbGxlciBjYW4gcGFzcyBpbiBhbiBvYmplY3Qgb2YgY3VzdG9tIGRhdGEgaW4gbGlldSBvZiB0aGUgaGFuZGxlcgoJCWlmICggaGFuZGxlci5oYW5kbGVyICkgewoJCQloYW5kbGVPYmpJbiA9IGhhbmRsZXI7CgkJCWhhbmRsZXIgPSBoYW5kbGVPYmpJbi5oYW5kbGVyOwoJCQlzZWxlY3RvciA9IGhhbmRsZU9iakluLnNlbGVjdG9yOwoJCX0KCgkJLy8gRW5zdXJlIHRoYXQgaW52YWxpZCBzZWxlY3RvcnMgdGhyb3cgZXhjZXB0aW9ucyBhdCBhdHRhY2ggdGltZQoJCS8vIEV2YWx1YXRlIGFnYWluc3QgZG9jdW1lbnRFbGVtZW50IGluIGNhc2UgZWxlbSBpcyBhIG5vbi1lbGVtZW50IG5vZGUgKGUuZy4sIGRvY3VtZW50KQoJCWlmICggc2VsZWN0b3IgKSB7CgkJCWpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZG9jdW1lbnRFbGVtZW50LCBzZWxlY3RvciApOwoJCX0KCgkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGhhbmRsZXIgaGFzIGEgdW5pcXVlIElELCB1c2VkIHRvIGZpbmQvcmVtb3ZlIGl0IGxhdGVyCgkJaWYgKCAhaGFuZGxlci5ndWlkICkgewoJCQloYW5kbGVyLmd1aWQgPSBqUXVlcnkuZ3VpZCsrOwoJCX0KCgkJLy8gSW5pdCB0aGUgZWxlbWVudCdzIGV2ZW50IHN0cnVjdHVyZSBhbmQgbWFpbiBoYW5kbGVyLCBpZiB0aGlzIGlzIHRoZSBmaXJzdAoJCWlmICggISggZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzICkgKSB7CgkJCWV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyA9IHt9OwoJCX0KCQlpZiAoICEoIGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlICkgKSB7CgkJCWV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7CgoJCQkJLy8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmQKCQkJCS8vIHdoZW4gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWQKCQkJCXJldHVybiB0eXBlb2YgalF1ZXJ5ICE9PSAidW5kZWZpbmVkIiAmJiBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUgPwoJCQkJCWpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmluZWQ7CgkJCX07CgkJfQoKCQkvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNwYWNlCgkJdHlwZXMgPSAoIHR5cGVzIHx8ICIiICkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbICIiIF07CgkJdCA9IHR5cGVzLmxlbmd0aDsKCQl3aGlsZSAoIHQtLSApIHsKCQkJdG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbIHQgXSApIHx8IFtdOwoJCQl0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTsKCQkJbmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgIiIgKS5zcGxpdCggIi4iICkuc29ydCgpOwoKCQkJLy8gVGhlcmUgKm11c3QqIGJlIGEgdHlwZSwgbm8gYXR0YWNoaW5nIG5hbWVzcGFjZS1vbmx5IGhhbmRsZXJzCgkJCWlmICggIXR5cGUgKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJLy8gSWYgZXZlbnQgY2hhbmdlcyBpdHMgdHlwZSwgdXNlIHRoZSBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgY2hhbmdlZCB0eXBlCgkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9OwoKCQkJLy8gSWYgc2VsZWN0b3IgZGVmaW5lZCwgZGV0ZXJtaW5lIHNwZWNpYWwgZXZlbnQgYXBpIHR5cGUsIG90aGVyd2lzZSBnaXZlbiB0eXBlCgkJCXR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTsKCgkJCS8vIFVwZGF0ZSBzcGVjaWFsIGJhc2VkIG9uIG5ld2x5IHJlc2V0IHR5cGUKCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307CgoJCQkvLyBoYW5kbGVPYmogaXMgcGFzc2VkIHRvIGFsbCBldmVudCBoYW5kbGVycwoJCQloYW5kbGVPYmogPSBqUXVlcnkuZXh0ZW5kKCB7CgkJCQl0eXBlOiB0eXBlLAoJCQkJb3JpZ1R5cGU6IG9yaWdUeXBlLAoJCQkJZGF0YTogZGF0YSwKCQkJCWhhbmRsZXI6IGhhbmRsZXIsCgkJCQlndWlkOiBoYW5kbGVyLmd1aWQsCgkJCQlzZWxlY3Rvcjogc2VsZWN0b3IsCgkJCQluZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLAoJCQkJbmFtZXNwYWNlOiBuYW1lc3BhY2VzLmpvaW4oICIuIiApCgkJCX0sIGhhbmRsZU9iakluICk7CgoJCQkvLyBJbml0IHRoZSBldmVudCBoYW5kbGVyIHF1ZXVlIGlmIHdlJ3JlIHRoZSBmaXJzdAoJCQlpZiAoICEoIGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gKSApIHsKCQkJCWhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gPSBbXTsKCQkJCWhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwOwoKCQkJCS8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZQoJCQkJaWYgKCAhc3BlY2lhbC5zZXR1cCB8fAoJCQkJCXNwZWNpYWwuc2V0dXAuY2FsbCggZWxlbSwgZGF0YSwgbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSA9PT0gZmFsc2UgKSB7CgoJCQkJCWlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkgewoJCQkJCQllbGVtLmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIGV2ZW50SGFuZGxlICk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQlpZiAoIHNwZWNpYWwuYWRkICkgewoJCQkJc3BlY2lhbC5hZGQuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7CgoJCQkJaWYgKCAhaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCApIHsKCQkJCQloYW5kbGVPYmouaGFuZGxlci5ndWlkID0gaGFuZGxlci5ndWlkOwoJCQkJfQoJCQl9CgoJCQkvLyBBZGQgdG8gdGhlIGVsZW1lbnQncyBoYW5kbGVyIGxpc3QsIGRlbGVnYXRlcyBpbiBmcm9udAoJCQlpZiAoIHNlbGVjdG9yICkgewoJCQkJaGFuZGxlcnMuc3BsaWNlKCBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50KyssIDAsIGhhbmRsZU9iaiApOwoJCQl9IGVsc2UgewoJCQkJaGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7CgkJCX0KCgkJCS8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgZXZlciBiZWVuIHVzZWQsIGZvciBldmVudCBvcHRpbWl6YXRpb24KCQkJalF1ZXJ5LmV2ZW50Lmdsb2JhbFsgdHlwZSBdID0gdHJ1ZTsKCQl9CgoJfSwKCgkvLyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnQKCXJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBzZWxlY3RvciwgbWFwcGVkVHlwZXMgKSB7CgoJCXZhciBqLCBvcmlnQ291bnQsIHRtcCwKCQkJZXZlbnRzLCB0LCBoYW5kbGVPYmosCgkJCXNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLCBuYW1lc3BhY2VzLCBvcmlnVHlwZSwKCQkJZWxlbURhdGEgPSBkYXRhUHJpdi5oYXNEYXRhKCBlbGVtICkgJiYgZGF0YVByaXYuZ2V0KCBlbGVtICk7CgoJCWlmICggIWVsZW1EYXRhIHx8ICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBPbmNlIGZvciBlYWNoIHR5cGUubmFtZXNwYWNlIGluIHR5cGVzOyB0eXBlIG1heSBiZSBvbWl0dGVkCgkJdHlwZXMgPSAoIHR5cGVzIHx8ICIiICkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbICIiIF07CgkJdCA9IHR5cGVzLmxlbmd0aDsKCQl3aGlsZSAoIHQtLSApIHsKCQkJdG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbIHQgXSApIHx8IFtdOwoJCQl0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTsKCQkJbmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgIiIgKS5zcGxpdCggIi4iICkuc29ydCgpOwoKCQkJLy8gVW5iaW5kIGFsbCBldmVudHMgKG9uIHRoaXMgbmFtZXNwYWNlLCBpZiBwcm92aWRlZCkgZm9yIHRoZSBlbGVtZW50CgkJCWlmICggIXR5cGUgKSB7CgkJCQlmb3IgKCB0eXBlIGluIGV2ZW50cyApIHsKCQkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICsgdHlwZXNbIHQgXSwgaGFuZGxlciwgc2VsZWN0b3IsIHRydWUgKTsKCQkJCX0KCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKCQkJdHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlOwoJCQloYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8IFtdOwoJCQl0bXAgPSB0bXBbIDIgXSAmJgoJCQkJbmV3IFJlZ0V4cCggIihefFxcLikiICsgbmFtZXNwYWNlcy5qb2luKCAiXFwuKD86LipcXC58KSIgKSArICIoXFwufCQpIiApOwoKCQkJLy8gUmVtb3ZlIG1hdGNoaW5nIGV2ZW50cwoJCQlvcmlnQ291bnQgPSBqID0gaGFuZGxlcnMubGVuZ3RoOwoJCQl3aGlsZSAoIGotLSApIHsKCQkJCWhhbmRsZU9iaiA9IGhhbmRsZXJzWyBqIF07CgoJCQkJaWYgKCAoIG1hcHBlZFR5cGVzIHx8IG9yaWdUeXBlID09PSBoYW5kbGVPYmoub3JpZ1R5cGUgKSAmJgoJCQkJCSggIWhhbmRsZXIgfHwgaGFuZGxlci5ndWlkID09PSBoYW5kbGVPYmouZ3VpZCApICYmCgkJCQkJKCAhdG1wIHx8IHRtcC50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSAmJgoJCQkJCSggIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSBoYW5kbGVPYmouc2VsZWN0b3IgfHwKCQkJCQkJc2VsZWN0b3IgPT09ICIqKiIgJiYgaGFuZGxlT2JqLnNlbGVjdG9yICkgKSB7CgkJCQkJaGFuZGxlcnMuc3BsaWNlKCBqLCAxICk7CgoJCQkJCWlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkgewoJCQkJCQloYW5kbGVycy5kZWxlZ2F0ZUNvdW50LS07CgkJCQkJfQoJCQkJCWlmICggc3BlY2lhbC5yZW1vdmUgKSB7CgkJCQkJCXNwZWNpYWwucmVtb3ZlLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gUmVtb3ZlIGdlbmVyaWMgZXZlbnQgaGFuZGxlciBpZiB3ZSByZW1vdmVkIHNvbWV0aGluZyBhbmQgbm8gbW9yZSBoYW5kbGVycyBleGlzdAoJCQkvLyAoYXZvaWRzIHBvdGVudGlhbCBmb3IgZW5kbGVzcyByZWN1cnNpb24gZHVyaW5nIHJlbW92YWwgb2Ygc3BlY2lhbCBldmVudCBoYW5kbGVycykKCQkJaWYgKCBvcmlnQ291bnQgJiYgIWhhbmRsZXJzLmxlbmd0aCApIHsKCQkJCWlmICggIXNwZWNpYWwudGVhcmRvd24gfHwKCQkJCQlzcGVjaWFsLnRlYXJkb3duLmNhbGwoIGVsZW0sIG5hbWVzcGFjZXMsIGVsZW1EYXRhLmhhbmRsZSApID09PSBmYWxzZSApIHsKCgkJCQkJalF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBlbGVtRGF0YS5oYW5kbGUgKTsKCQkJCX0KCgkJCQlkZWxldGUgZXZlbnRzWyB0eXBlIF07CgkJCX0KCQl9CgoJCS8vIFJlbW92ZSBkYXRhIGFuZCB0aGUgZXhwYW5kbyBpZiBpdCdzIG5vIGxvbmdlciB1c2VkCgkJaWYgKCBqUXVlcnkuaXNFbXB0eU9iamVjdCggZXZlbnRzICkgKSB7CgkJCWRhdGFQcml2LnJlbW92ZSggZWxlbSwgImhhbmRsZSBldmVudHMiICk7CgkJfQoJfSwKCglkaXNwYXRjaDogZnVuY3Rpb24oIG5hdGl2ZUV2ZW50ICkgewoKCQkvLyBNYWtlIGEgd3JpdGFibGUgalF1ZXJ5LkV2ZW50IGZyb20gdGhlIG5hdGl2ZSBldmVudCBvYmplY3QKCQl2YXIgZXZlbnQgPSBqUXVlcnkuZXZlbnQuZml4KCBuYXRpdmVFdmVudCApOwoKCQl2YXIgaSwgaiwgcmV0LCBtYXRjaGVkLCBoYW5kbGVPYmosIGhhbmRsZXJRdWV1ZSwKCQkJYXJncyA9IG5ldyBBcnJheSggYXJndW1lbnRzLmxlbmd0aCApLAoJCQloYW5kbGVycyA9ICggZGF0YVByaXYuZ2V0KCB0aGlzLCAiZXZlbnRzIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSB8fCBbXSwKCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyBldmVudC50eXBlIF0gfHwge307CgoJCS8vIFVzZSB0aGUgZml4LWVkIGpRdWVyeS5FdmVudCByYXRoZXIgdGhhbiB0aGUgKHJlYWQtb25seSkgbmF0aXZlIGV2ZW50CgkJYXJnc1sgMCBdID0gZXZlbnQ7CgoJCWZvciAoIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrICkgewoJCQlhcmdzWyBpIF0gPSBhcmd1bWVudHNbIGkgXTsKCQl9CgoJCWV2ZW50LmRlbGVnYXRlVGFyZ2V0ID0gdGhpczsKCgkJLy8gQ2FsbCB0aGUgcHJlRGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVzaXJlZAoJCWlmICggc3BlY2lhbC5wcmVEaXNwYXRjaCAmJiBzcGVjaWFsLnByZURpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICkgPT09IGZhbHNlICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBEZXRlcm1pbmUgaGFuZGxlcnMKCQloYW5kbGVyUXVldWUgPSBqUXVlcnkuZXZlbnQuaGFuZGxlcnMuY2FsbCggdGhpcywgZXZlbnQsIGhhbmRsZXJzICk7CgoJCS8vIFJ1biBkZWxlZ2F0ZXMgZmlyc3Q7IHRoZXkgbWF5IHdhbnQgdG8gc3RvcCBwcm9wYWdhdGlvbiBiZW5lYXRoIHVzCgkJaSA9IDA7CgkJd2hpbGUgKCAoIG1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CgkJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSBtYXRjaGVkLmVsZW07CgoJCQlqID0gMDsKCQkJd2hpbGUgKCAoIGhhbmRsZU9iaiA9IG1hdGNoZWQuaGFuZGxlcnNbIGorKyBdICkgJiYKCQkJCSFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkgewoKCQkJCS8vIFRyaWdnZXJlZCBldmVudCBtdXN0IGVpdGhlciAxKSBoYXZlIG5vIG5hbWVzcGFjZSwgb3IgMikgaGF2ZSBuYW1lc3BhY2UocykKCQkJCS8vIGEgc3Vic2V0IG9yIGVxdWFsIHRvIHRob3NlIGluIHRoZSBib3VuZCBldmVudCAoYm90aCBjYW4gaGF2ZSBubyBuYW1lc3BhY2UpLgoJCQkJaWYgKCAhZXZlbnQucm5hbWVzcGFjZSB8fCBldmVudC5ybmFtZXNwYWNlLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApIHsKCgkJCQkJZXZlbnQuaGFuZGxlT2JqID0gaGFuZGxlT2JqOwoJCQkJCWV2ZW50LmRhdGEgPSBoYW5kbGVPYmouZGF0YTsKCgkJCQkJcmV0ID0gKCAoIGpRdWVyeS5ldmVudC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSApLmhhbmRsZSB8fAoJCQkJCQloYW5kbGVPYmouaGFuZGxlciApLmFwcGx5KCBtYXRjaGVkLmVsZW0sIGFyZ3MgKTsKCgkJCQkJaWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHsKCQkJCQkJaWYgKCAoIGV2ZW50LnJlc3VsdCA9IHJldCApID09PSBmYWxzZSApIHsKCQkJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJLy8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZQoJCWlmICggc3BlY2lhbC5wb3N0RGlzcGF0Y2ggKSB7CgkJCXNwZWNpYWwucG9zdERpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICk7CgkJfQoKCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJfSwKCgloYW5kbGVyczogZnVuY3Rpb24oIGV2ZW50LCBoYW5kbGVycyApIHsKCQl2YXIgaSwgaGFuZGxlT2JqLCBzZWwsIG1hdGNoZWRIYW5kbGVycywgbWF0Y2hlZFNlbGVjdG9ycywKCQkJaGFuZGxlclF1ZXVlID0gW10sCgkJCWRlbGVnYXRlQ291bnQgPSBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LAoJCQljdXIgPSBldmVudC50YXJnZXQ7CgoJCS8vIEZpbmQgZGVsZWdhdGUgaGFuZGxlcnMKCQlpZiAoIGRlbGVnYXRlQ291bnQgJiYKCgkJCS8vIFN1cHBvcnQ6IElFIDw9OQoJCQkvLyBCbGFjay1ob2xlIFNWRyA8dXNlPiBpbnN0YW5jZSB0cmVlcyAodHJhYy0xMzE4MCkKCQkJY3VyLm5vZGVUeXBlICYmCgoJCQkvLyBTdXBwb3J0OiBGaXJlZm94IDw9NDIKCQkJLy8gU3VwcHJlc3Mgc3BlYy12aW9sYXRpbmcgY2xpY2tzIGluZGljYXRpbmcgYSBub24tcHJpbWFyeSBwb2ludGVyIGJ1dHRvbiAodHJhYy0zODYxKQoJCQkvLyBodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudC10eXBlLWNsaWNrCgkJCS8vIFN1cHBvcnQ6IElFIDExIG9ubHkKCQkJLy8gLi4uYnV0IG5vdCBhcnJvdyBrZXkgImNsaWNrcyIgb2YgcmFkaW8gaW5wdXRzLCB3aGljaCBjYW4gaGF2ZSBgYnV0dG9uYCAtMSAoZ2gtMjM0MykKCQkJISggZXZlbnQudHlwZSA9PT0gImNsaWNrIiAmJiBldmVudC5idXR0b24gPj0gMSApICkgewoKCQkJZm9yICggOyBjdXIgIT09IHRoaXM7IGN1ciA9IGN1ci5wYXJlbnROb2RlIHx8IHRoaXMgKSB7CgoJCQkJLy8gRG9uJ3QgY2hlY2sgbm9uLWVsZW1lbnRzICgjMTMyMDgpCgkJCQkvLyBEb24ndCBwcm9jZXNzIGNsaWNrcyBvbiBkaXNhYmxlZCBlbGVtZW50cyAoIzY5MTEsICM4MTY1LCAjMTEzODIsICMxMTc2NCkKCQkJCWlmICggY3VyLm5vZGVUeXBlID09PSAxICYmICEoIGV2ZW50LnR5cGUgPT09ICJjbGljayIgJiYgY3VyLmRpc2FibGVkID09PSB0cnVlICkgKSB7CgkJCQkJbWF0Y2hlZEhhbmRsZXJzID0gW107CgkJCQkJbWF0Y2hlZFNlbGVjdG9ycyA9IHt9OwoJCQkJCWZvciAoIGkgPSAwOyBpIDwgZGVsZWdhdGVDb3VudDsgaSsrICkgewoJCQkJCQloYW5kbGVPYmogPSBoYW5kbGVyc1sgaSBdOwoKCQkJCQkJLy8gRG9uJ3QgY29uZmxpY3Qgd2l0aCBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKCMxMzIwMykKCQkJCQkJc2VsID0gaGFuZGxlT2JqLnNlbGVjdG9yICsgIiAiOwoKCQkJCQkJaWYgKCBtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSA9PT0gdW5kZWZpbmVkICkgewoJCQkJCQkJbWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gPSBoYW5kbGVPYmoubmVlZHNDb250ZXh0ID8KCQkJCQkJCQlqUXVlcnkoIHNlbCwgdGhpcyApLmluZGV4KCBjdXIgKSA+IC0xIDoKCQkJCQkJCQlqUXVlcnkuZmluZCggc2VsLCB0aGlzLCBudWxsLCBbIGN1ciBdICkubGVuZ3RoOwoJCQkJCQl9CgkJCQkJCWlmICggbWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gKSB7CgkJCQkJCQltYXRjaGVkSGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7CgkJCQkJCX0KCQkJCQl9CgkJCQkJaWYgKCBtYXRjaGVkSGFuZGxlcnMubGVuZ3RoICkgewoJCQkJCQloYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBtYXRjaGVkSGFuZGxlcnMgfSApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJLy8gQWRkIHRoZSByZW1haW5pbmcgKGRpcmVjdGx5LWJvdW5kKSBoYW5kbGVycwoJCWN1ciA9IHRoaXM7CgkJaWYgKCBkZWxlZ2F0ZUNvdW50IDwgaGFuZGxlcnMubGVuZ3RoICkgewoJCQloYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBoYW5kbGVycy5zbGljZSggZGVsZWdhdGVDb3VudCApIH0gKTsKCQl9CgoJCXJldHVybiBoYW5kbGVyUXVldWU7Cgl9LAoKCWFkZFByb3A6IGZ1bmN0aW9uKCBuYW1lLCBob29rICkgewoJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSggalF1ZXJ5LkV2ZW50LnByb3RvdHlwZSwgbmFtZSwgewoJCQllbnVtZXJhYmxlOiB0cnVlLAoJCQljb25maWd1cmFibGU6IHRydWUsCgoJCQlnZXQ6IGlzRnVuY3Rpb24oIGhvb2sgKSA/CgkJCQlmdW5jdGlvbigpIHsKCQkJCQlpZiAoIHRoaXMub3JpZ2luYWxFdmVudCApIHsKCQkJCQkJCXJldHVybiBob29rKCB0aGlzLm9yaWdpbmFsRXZlbnQgKTsKCQkJCQl9CgkJCQl9IDoKCQkJCWZ1bmN0aW9uKCkgewoJCQkJCWlmICggdGhpcy5vcmlnaW5hbEV2ZW50ICkgewoJCQkJCQkJcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFsgbmFtZSBdOwoJCQkJCX0KCQkJCX0sCgoJCQlzZXQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgbmFtZSwgewoJCQkJCWVudW1lcmFibGU6IHRydWUsCgkJCQkJY29uZmlndXJhYmxlOiB0cnVlLAoJCQkJCXdyaXRhYmxlOiB0cnVlLAoJCQkJCXZhbHVlOiB2YWx1ZQoJCQkJfSApOwoJCQl9CgkJfSApOwoJfSwKCglmaXg6IGZ1bmN0aW9uKCBvcmlnaW5hbEV2ZW50ICkgewoJCXJldHVybiBvcmlnaW5hbEV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID8KCQkJb3JpZ2luYWxFdmVudCA6CgkJCW5ldyBqUXVlcnkuRXZlbnQoIG9yaWdpbmFsRXZlbnQgKTsKCX0sCgoJc3BlY2lhbDogewoJCWxvYWQ6IHsKCgkJCS8vIFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZyb20gYnViYmxpbmcgdG8gd2luZG93LmxvYWQKCQkJbm9CdWJibGU6IHRydWUKCQl9LAoJCWZvY3VzOiB7CgoJCQkvLyBGaXJlIG5hdGl2ZSBldmVudCBpZiBwb3NzaWJsZSBzbyBibHVyL2ZvY3VzIHNlcXVlbmNlIGlzIGNvcnJlY3QKCQkJdHJpZ2dlcjogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIHRoaXMgIT09IHNhZmVBY3RpdmVFbGVtZW50KCkgJiYgdGhpcy5mb2N1cyApIHsKCQkJCQl0aGlzLmZvY3VzKCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9LAoJCQlkZWxlZ2F0ZVR5cGU6ICJmb2N1c2luIgoJCX0sCgkJYmx1cjogewoJCQl0cmlnZ2VyOiBmdW5jdGlvbigpIHsKCQkJCWlmICggdGhpcyA9PT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmJsdXIgKSB7CgkJCQkJdGhpcy5ibHVyKCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9LAoJCQlkZWxlZ2F0ZVR5cGU6ICJmb2N1c291dCIKCQl9LAoJCWNsaWNrOiB7CgoJCQkvLyBGb3IgY2hlY2tib3gsIGZpcmUgbmF0aXZlIGV2ZW50IHNvIGNoZWNrZWQgc3RhdGUgd2lsbCBiZSByaWdodAoJCQl0cmlnZ2VyOiBmdW5jdGlvbigpIHsKCQkJCWlmICggdGhpcy50eXBlID09PSAiY2hlY2tib3giICYmIHRoaXMuY2xpY2sgJiYgbm9kZU5hbWUoIHRoaXMsICJpbnB1dCIgKSApIHsKCQkJCQl0aGlzLmNsaWNrKCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9LAoKCQkJLy8gRm9yIGNyb3NzLWJyb3dzZXIgY29uc2lzdGVuY3ksIGRvbid0IGZpcmUgbmF0aXZlIC5jbGljaygpIG9uIGxpbmtzCgkJCV9kZWZhdWx0OiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQlyZXR1cm4gbm9kZU5hbWUoIGV2ZW50LnRhcmdldCwgImEiICk7CgkJCX0KCQl9LAoKCQliZWZvcmV1bmxvYWQ6IHsKCQkJcG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7CgoJCQkJLy8gU3VwcG9ydDogRmlyZWZveCAyMCsKCQkJCS8vIEZpcmVmb3ggZG9lc24ndCBhbGVydCBpZiB0aGUgcmV0dXJuVmFsdWUgZmllbGQgaXMgbm90IHNldC4KCQkJCWlmICggZXZlbnQucmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgZXZlbnQub3JpZ2luYWxFdmVudCApIHsKCQkJCQlldmVudC5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlID0gZXZlbnQucmVzdWx0OwoJCQkJfQoJCQl9CgkJfQoJfQp9OwoKalF1ZXJ5LnJlbW92ZUV2ZW50ID0gZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHsKCgkvLyBUaGlzICJpZiIgaXMgbmVlZGVkIGZvciBwbGFpbiBvYmplY3RzCglpZiAoIGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciApIHsKCQllbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIGhhbmRsZSApOwoJfQp9OwoKalF1ZXJ5LkV2ZW50ID0gZnVuY3Rpb24oIHNyYywgcHJvcHMgKSB7CgoJLy8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkCglpZiAoICEoIHRoaXMgaW5zdGFuY2VvZiBqUXVlcnkuRXZlbnQgKSApIHsKCQlyZXR1cm4gbmV3IGpRdWVyeS5FdmVudCggc3JjLCBwcm9wcyApOwoJfQoKCS8vIEV2ZW50IG9iamVjdAoJaWYgKCBzcmMgJiYgc3JjLnR5cGUgKSB7CgkJdGhpcy5vcmlnaW5hbEV2ZW50ID0gc3JjOwoJCXRoaXMudHlwZSA9IHNyYy50eXBlOwoKCQkvLyBFdmVudHMgYnViYmxpbmcgdXAgdGhlIGRvY3VtZW50IG1heSBoYXZlIGJlZW4gbWFya2VkIGFzIHByZXZlbnRlZAoJCS8vIGJ5IGEgaGFuZGxlciBsb3dlciBkb3duIHRoZSB0cmVlOyByZWZsZWN0IHRoZSBjb3JyZWN0IHZhbHVlLgoJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gc3JjLmRlZmF1bHRQcmV2ZW50ZWQgfHwKCQkJCXNyYy5kZWZhdWx0UHJldmVudGVkID09PSB1bmRlZmluZWQgJiYKCgkJCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9Mi4zIG9ubHkKCQkJCXNyYy5yZXR1cm5WYWx1ZSA9PT0gZmFsc2UgPwoJCQlyZXR1cm5UcnVlIDoKCQkJcmV0dXJuRmFsc2U7CgoJCS8vIENyZWF0ZSB0YXJnZXQgcHJvcGVydGllcwoJCS8vIFN1cHBvcnQ6IFNhZmFyaSA8PTYgLSA3IG9ubHkKCQkvLyBUYXJnZXQgc2hvdWxkIG5vdCBiZSBhIHRleHQgbm9kZSAoIzUwNCwgIzEzMTQzKQoJCXRoaXMudGFyZ2V0ID0gKCBzcmMudGFyZ2V0ICYmIHNyYy50YXJnZXQubm9kZVR5cGUgPT09IDMgKSA/CgkJCXNyYy50YXJnZXQucGFyZW50Tm9kZSA6CgkJCXNyYy50YXJnZXQ7CgoJCXRoaXMuY3VycmVudFRhcmdldCA9IHNyYy5jdXJyZW50VGFyZ2V0OwoJCXRoaXMucmVsYXRlZFRhcmdldCA9IHNyYy5yZWxhdGVkVGFyZ2V0OwoKCS8vIEV2ZW50IHR5cGUKCX0gZWxzZSB7CgkJdGhpcy50eXBlID0gc3JjOwoJfQoKCS8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0CglpZiAoIHByb3BzICkgewoJCWpRdWVyeS5leHRlbmQoIHRoaXMsIHByb3BzICk7Cgl9CgoJLy8gQ3JlYXRlIGEgdGltZXN0YW1wIGlmIGluY29taW5nIGV2ZW50IGRvZXNuJ3QgaGF2ZSBvbmUKCXRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1lU3RhbXAgfHwgRGF0ZS5ub3coKTsKCgkvLyBNYXJrIGl0IGFzIGZpeGVkCgl0aGlzWyBqUXVlcnkuZXhwYW5kbyBdID0gdHJ1ZTsKfTsKCi8vIGpRdWVyeS5FdmVudCBpcyBiYXNlZCBvbiBET00zIEV2ZW50cyBhcyBzcGVjaWZpZWQgYnkgdGhlIEVDTUFTY3JpcHQgTGFuZ3VhZ2UgQmluZGluZwovLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAwMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAwMzAzMzEvZWNtYS1zY3JpcHQtYmluZGluZy5odG1sCmpRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7Cgljb25zdHJ1Y3RvcjogalF1ZXJ5LkV2ZW50LAoJaXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSwKCWlzUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSwKCWlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSwKCWlzU2ltdWxhdGVkOiBmYWxzZSwKCglwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7CgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgoJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTsKCgkJaWYgKCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICkgewoJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJfQoJfSwKCXN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgoJCXRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwoKCQlpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7CgkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CgkJfQoJfSwKCXN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgoJCXRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwoKCQlpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7CgkJCWUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CgkJfQoKCQl0aGlzLnN0b3BQcm9wYWdhdGlvbigpOwoJfQp9OwoKLy8gSW5jbHVkZXMgYWxsIGNvbW1vbiBldmVudCBwcm9wcyBpbmNsdWRpbmcgS2V5RXZlbnQgYW5kIE1vdXNlRXZlbnQgc3BlY2lmaWMgcHJvcHMKalF1ZXJ5LmVhY2goIHsKCWFsdEtleTogdHJ1ZSwKCWJ1YmJsZXM6IHRydWUsCgljYW5jZWxhYmxlOiB0cnVlLAoJY2hhbmdlZFRvdWNoZXM6IHRydWUsCgljdHJsS2V5OiB0cnVlLAoJZGV0YWlsOiB0cnVlLAoJZXZlbnRQaGFzZTogdHJ1ZSwKCW1ldGFLZXk6IHRydWUsCglwYWdlWDogdHJ1ZSwKCXBhZ2VZOiB0cnVlLAoJc2hpZnRLZXk6IHRydWUsCgl2aWV3OiB0cnVlLAoJImNoYXIiOiB0cnVlLAoJY2hhckNvZGU6IHRydWUsCglrZXk6IHRydWUsCglrZXlDb2RlOiB0cnVlLAoJYnV0dG9uOiB0cnVlLAoJYnV0dG9uczogdHJ1ZSwKCWNsaWVudFg6IHRydWUsCgljbGllbnRZOiB0cnVlLAoJb2Zmc2V0WDogdHJ1ZSwKCW9mZnNldFk6IHRydWUsCglwb2ludGVySWQ6IHRydWUsCglwb2ludGVyVHlwZTogdHJ1ZSwKCXNjcmVlblg6IHRydWUsCglzY3JlZW5ZOiB0cnVlLAoJdGFyZ2V0VG91Y2hlczogdHJ1ZSwKCXRvRWxlbWVudDogdHJ1ZSwKCXRvdWNoZXM6IHRydWUsCgoJd2hpY2g6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgYnV0dG9uID0gZXZlbnQuYnV0dG9uOwoKCQkvLyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHMKCQlpZiAoIGV2ZW50LndoaWNoID09IG51bGwgJiYgcmtleUV2ZW50LnRlc3QoIGV2ZW50LnR5cGUgKSApIHsKCQkJcmV0dXJuIGV2ZW50LmNoYXJDb2RlICE9IG51bGwgPyBldmVudC5jaGFyQ29kZSA6IGV2ZW50LmtleUNvZGU7CgkJfQoKCQkvLyBBZGQgd2hpY2ggZm9yIGNsaWNrOiAxID09PSBsZWZ0OyAyID09PSBtaWRkbGU7IDMgPT09IHJpZ2h0CgkJaWYgKCAhZXZlbnQud2hpY2ggJiYgYnV0dG9uICE9PSB1bmRlZmluZWQgJiYgcm1vdXNlRXZlbnQudGVzdCggZXZlbnQudHlwZSApICkgewoJCQlpZiAoIGJ1dHRvbiAmIDEgKSB7CgkJCQlyZXR1cm4gMTsKCQkJfQoKCQkJaWYgKCBidXR0b24gJiAyICkgewoJCQkJcmV0dXJuIDM7CgkJCX0KCgkJCWlmICggYnV0dG9uICYgNCApIHsKCQkJCXJldHVybiAyOwoJCQl9CgoJCQlyZXR1cm4gMDsKCQl9CgoJCXJldHVybiBldmVudC53aGljaDsKCX0KfSwgalF1ZXJ5LmV2ZW50LmFkZFByb3AgKTsKCi8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZlIGV2ZW50cyB1c2luZyBtb3VzZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrcwovLyBzbyB0aGF0IGV2ZW50IGRlbGVnYXRpb24gd29ya3MgaW4galF1ZXJ5LgovLyBEbyB0aGUgc2FtZSBmb3IgcG9pbnRlcmVudGVyL3BvaW50ZXJsZWF2ZSBhbmQgcG9pbnRlcm92ZXIvcG9pbnRlcm91dAovLwovLyBTdXBwb3J0OiBTYWZhcmkgNyBvbmx5Ci8vIFNhZmFyaSBzZW5kcyBtb3VzZWVudGVyIHRvbyBvZnRlbjsgc2VlOgovLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NzAyNTgKLy8gZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYnVnIChpdCBleGlzdGVkIGluIG9sZGVyIENocm9tZSB2ZXJzaW9ucyBhcyB3ZWxsKS4KalF1ZXJ5LmVhY2goIHsKCW1vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLAoJbW91c2VsZWF2ZTogIm1vdXNlb3V0IiwKCXBvaW50ZXJlbnRlcjogInBvaW50ZXJvdmVyIiwKCXBvaW50ZXJsZWF2ZTogInBvaW50ZXJvdXQiCn0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7CglqUXVlcnkuZXZlbnQuc3BlY2lhbFsgb3JpZyBdID0gewoJCWRlbGVnYXRlVHlwZTogZml4LAoJCWJpbmRUeXBlOiBmaXgsCgoJCWhhbmRsZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQl2YXIgcmV0LAoJCQkJdGFyZ2V0ID0gdGhpcywKCQkJCXJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0LAoJCQkJaGFuZGxlT2JqID0gZXZlbnQuaGFuZGxlT2JqOwoKCQkJLy8gRm9yIG1vdXNlZW50ZXIvbGVhdmUgY2FsbCB0aGUgaGFuZGxlciBpZiByZWxhdGVkIGlzIG91dHNpZGUgdGhlIHRhcmdldC4KCQkJLy8gTkI6IE5vIHJlbGF0ZWRUYXJnZXQgaWYgdGhlIG1vdXNlIGxlZnQvZW50ZXJlZCB0aGUgYnJvd3NlciB3aW5kb3cKCQkJaWYgKCAhcmVsYXRlZCB8fCAoIHJlbGF0ZWQgIT09IHRhcmdldCAmJiAhalF1ZXJ5LmNvbnRhaW5zKCB0YXJnZXQsIHJlbGF0ZWQgKSApICkgewoJCQkJZXZlbnQudHlwZSA9IGhhbmRsZU9iai5vcmlnVHlwZTsKCQkJCXJldCA9IGhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJCWV2ZW50LnR5cGUgPSBmaXg7CgkJCX0KCQkJcmV0dXJuIHJldDsKCQl9Cgl9Owp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CgoJb246IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICkgewoJCXJldHVybiBvbiggdGhpcywgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApOwoJfSwKCW9uZTogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7CgkJcmV0dXJuIG9uKCB0aGlzLCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuLCAxICk7Cgl9LAoJb2ZmOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBmbiApIHsKCQl2YXIgaGFuZGxlT2JqLCB0eXBlOwoJCWlmICggdHlwZXMgJiYgdHlwZXMucHJldmVudERlZmF1bHQgJiYgdHlwZXMuaGFuZGxlT2JqICkgewoKCQkJLy8gKCBldmVudCApICBkaXNwYXRjaGVkIGpRdWVyeS5FdmVudAoJCQloYW5kbGVPYmogPSB0eXBlcy5oYW5kbGVPYmo7CgkJCWpRdWVyeSggdHlwZXMuZGVsZWdhdGVUYXJnZXQgKS5vZmYoCgkJCQloYW5kbGVPYmoubmFtZXNwYWNlID8KCQkJCQloYW5kbGVPYmoub3JpZ1R5cGUgKyAiLiIgKyBoYW5kbGVPYmoubmFtZXNwYWNlIDoKCQkJCQloYW5kbGVPYmoub3JpZ1R5cGUsCgkJCQloYW5kbGVPYmouc2VsZWN0b3IsCgkJCQloYW5kbGVPYmouaGFuZGxlcgoJCQkpOwoJCQlyZXR1cm4gdGhpczsKCQl9CgkJaWYgKCB0eXBlb2YgdHlwZXMgPT09ICJvYmplY3QiICkgewoKCQkJLy8gKCB0eXBlcy1vYmplY3QgWywgc2VsZWN0b3JdICkKCQkJZm9yICggdHlwZSBpbiB0eXBlcyApIHsKCQkJCXRoaXMub2ZmKCB0eXBlLCBzZWxlY3RvciwgdHlwZXNbIHR5cGUgXSApOwoJCQl9CgkJCXJldHVybiB0aGlzOwoJCX0KCQlpZiAoIHNlbGVjdG9yID09PSBmYWxzZSB8fCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJmdW5jdGlvbiIgKSB7CgoJCQkvLyAoIHR5cGVzIFssIGZuXSApCgkJCWZuID0gc2VsZWN0b3I7CgkJCXNlbGVjdG9yID0gdW5kZWZpbmVkOwoJCX0KCQlpZiAoIGZuID09PSBmYWxzZSApIHsKCQkJZm4gPSByZXR1cm5GYWxzZTsKCQl9CgkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIHR5cGVzLCBmbiwgc2VsZWN0b3IgKTsKCQl9ICk7Cgl9Cn0gKTsKCgp2YXIKCgkvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovCgoJLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2lzc3Vlcy8zMjI5CglyeGh0bWxUYWcgPSAvPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKilbXj5dKilcLz4vZ2ksCgoJLyogZXNsaW50LWVuYWJsZSAqLwoKCS8vIFN1cHBvcnQ6IElFIDw9MTAgLSAxMSwgRWRnZSAxMiAtIDEzIG9ubHkKCS8vIEluIElFL0VkZ2UgdXNpbmcgcmVnZXggZ3JvdXBzIGhlcmUgY2F1c2VzIHNldmVyZSBzbG93ZG93bnMuCgkvLyBTZWUgaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2svZGV0YWlscy8xNzM2NTEyLwoJcm5vSW5uZXJodG1sID0gLzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksCgoJLy8gY2hlY2tlZD0iY2hlY2tlZCIgb3IgY2hlY2tlZAoJcmNoZWNrZWQgPSAvY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSwKCXJjbGVhblNjcmlwdCA9IC9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZzsKCi8vIFByZWZlciBhIHRib2R5IG92ZXIgaXRzIHBhcmVudCB0YWJsZSBmb3IgY29udGFpbmluZyBuZXcgcm93cwpmdW5jdGlvbiBtYW5pcHVsYXRpb25UYXJnZXQoIGVsZW0sIGNvbnRlbnQgKSB7CglpZiAoIG5vZGVOYW1lKCBlbGVtLCAidGFibGUiICkgJiYKCQlub2RlTmFtZSggY29udGVudC5ub2RlVHlwZSAhPT0gMTEgPyBjb250ZW50IDogY29udGVudC5maXJzdENoaWxkLCAidHIiICkgKSB7CgoJCXJldHVybiBqUXVlcnkoIGVsZW0gKS5jaGlsZHJlbiggInRib2R5IiApWyAwIF0gfHwgZWxlbTsKCX0KCglyZXR1cm4gZWxlbTsKfQoKLy8gUmVwbGFjZS9yZXN0b3JlIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiBzY3JpcHQgZWxlbWVudHMgZm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvbgpmdW5jdGlvbiBkaXNhYmxlU2NyaXB0KCBlbGVtICkgewoJZWxlbS50eXBlID0gKCBlbGVtLmdldEF0dHJpYnV0ZSggInR5cGUiICkgIT09IG51bGwgKSArICIvIiArIGVsZW0udHlwZTsKCXJldHVybiBlbGVtOwp9CmZ1bmN0aW9uIHJlc3RvcmVTY3JpcHQoIGVsZW0gKSB7CglpZiAoICggZWxlbS50eXBlIHx8ICIiICkuc2xpY2UoIDAsIDUgKSA9PT0gInRydWUvIiApIHsKCQllbGVtLnR5cGUgPSBlbGVtLnR5cGUuc2xpY2UoIDUgKTsKCX0gZWxzZSB7CgkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoICJ0eXBlIiApOwoJfQoKCXJldHVybiBlbGVtOwp9CgpmdW5jdGlvbiBjbG9uZUNvcHlFdmVudCggc3JjLCBkZXN0ICkgewoJdmFyIGksIGwsIHR5cGUsIHBkYXRhT2xkLCBwZGF0YUN1ciwgdWRhdGFPbGQsIHVkYXRhQ3VyLCBldmVudHM7CgoJaWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxICkgewoJCXJldHVybjsKCX0KCgkvLyAxLiBDb3B5IHByaXZhdGUgZGF0YTogZXZlbnRzLCBoYW5kbGVycywgZXRjLgoJaWYgKCBkYXRhUHJpdi5oYXNEYXRhKCBzcmMgKSApIHsKCQlwZGF0YU9sZCA9IGRhdGFQcml2LmFjY2Vzcyggc3JjICk7CgkJcGRhdGFDdXIgPSBkYXRhUHJpdi5zZXQoIGRlc3QsIHBkYXRhT2xkICk7CgkJZXZlbnRzID0gcGRhdGFPbGQuZXZlbnRzOwoKCQlpZiAoIGV2ZW50cyApIHsKCQkJZGVsZXRlIHBkYXRhQ3VyLmhhbmRsZTsKCQkJcGRhdGFDdXIuZXZlbnRzID0ge307CgoJCQlmb3IgKCB0eXBlIGluIGV2ZW50cyApIHsKCQkJCWZvciAoIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUsIGV2ZW50c1sgdHlwZSBdWyBpIF0gKTsKCQkJCX0KCQkJfQoJCX0KCX0KCgkvLyAyLiBDb3B5IHVzZXIgZGF0YQoJaWYgKCBkYXRhVXNlci5oYXNEYXRhKCBzcmMgKSApIHsKCQl1ZGF0YU9sZCA9IGRhdGFVc2VyLmFjY2Vzcyggc3JjICk7CgkJdWRhdGFDdXIgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgdWRhdGFPbGQgKTsKCgkJZGF0YVVzZXIuc2V0KCBkZXN0LCB1ZGF0YUN1ciApOwoJfQp9CgovLyBGaXggSUUgYnVncywgc2VlIHN1cHBvcnQgdGVzdHMKZnVuY3Rpb24gZml4SW5wdXQoIHNyYywgZGVzdCApIHsKCXZhciBub2RlTmFtZSA9IGRlc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCgkvLyBGYWlscyB0byBwZXJzaXN0IHRoZSBjaGVja2VkIHN0YXRlIG9mIGEgY2xvbmVkIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvbi4KCWlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgJiYgcmNoZWNrYWJsZVR5cGUudGVzdCggc3JjLnR5cGUgKSApIHsKCQlkZXN0LmNoZWNrZWQgPSBzcmMuY2hlY2tlZDsKCgkvLyBGYWlscyB0byByZXR1cm4gdGhlIHNlbGVjdGVkIG9wdGlvbiB0byB0aGUgZGVmYXVsdCBzZWxlY3RlZCBzdGF0ZSB3aGVuIGNsb25pbmcgb3B0aW9ucwoJfSBlbHNlIGlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgfHwgbm9kZU5hbWUgPT09ICJ0ZXh0YXJlYSIgKSB7CgkJZGVzdC5kZWZhdWx0VmFsdWUgPSBzcmMuZGVmYXVsdFZhbHVlOwoJfQp9CgpmdW5jdGlvbiBkb21NYW5pcCggY29sbGVjdGlvbiwgYXJncywgY2FsbGJhY2ssIGlnbm9yZWQgKSB7CgoJLy8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5cwoJYXJncyA9IGNvbmNhdC5hcHBseSggW10sIGFyZ3MgKTsKCgl2YXIgZnJhZ21lbnQsIGZpcnN0LCBzY3JpcHRzLCBoYXNTY3JpcHRzLCBub2RlLCBkb2MsCgkJaSA9IDAsCgkJbCA9IGNvbGxlY3Rpb24ubGVuZ3RoLAoJCWlOb0Nsb25lID0gbCAtIDEsCgkJdmFsdWUgPSBhcmdzWyAwIF0sCgkJdmFsdWVJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiggdmFsdWUgKTsKCgkvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXQKCWlmICggdmFsdWVJc0Z1bmN0aW9uIHx8CgkJCSggbCA+IDEgJiYgdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiAmJgoJCQkJIXN1cHBvcnQuY2hlY2tDbG9uZSAmJiByY2hlY2tlZC50ZXN0KCB2YWx1ZSApICkgKSB7CgkJcmV0dXJuIGNvbGxlY3Rpb24uZWFjaCggZnVuY3Rpb24oIGluZGV4ICkgewoJCQl2YXIgc2VsZiA9IGNvbGxlY3Rpb24uZXEoIGluZGV4ICk7CgkJCWlmICggdmFsdWVJc0Z1bmN0aW9uICkgewoJCQkJYXJnc1sgMCBdID0gdmFsdWUuY2FsbCggdGhpcywgaW5kZXgsIHNlbGYuaHRtbCgpICk7CgkJCX0KCQkJZG9tTWFuaXAoIHNlbGYsIGFyZ3MsIGNhbGxiYWNrLCBpZ25vcmVkICk7CgkJfSApOwoJfQoKCWlmICggbCApIHsKCQlmcmFnbWVudCA9IGJ1aWxkRnJhZ21lbnQoIGFyZ3MsIGNvbGxlY3Rpb25bIDAgXS5vd25lckRvY3VtZW50LCBmYWxzZSwgY29sbGVjdGlvbiwgaWdub3JlZCApOwoJCWZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsKCgkJaWYgKCBmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSApIHsKCQkJZnJhZ21lbnQgPSBmaXJzdDsKCQl9CgoJCS8vIFJlcXVpcmUgZWl0aGVyIG5ldyBjb250ZW50IG9yIGFuIGludGVyZXN0IGluIGlnbm9yZWQgZWxlbWVudHMgdG8gaW52b2tlIHRoZSBjYWxsYmFjawoJCWlmICggZmlyc3QgfHwgaWdub3JlZCApIHsKCQkJc2NyaXB0cyA9IGpRdWVyeS5tYXAoIGdldEFsbCggZnJhZ21lbnQsICJzY3JpcHQiICksIGRpc2FibGVTY3JpcHQgKTsKCQkJaGFzU2NyaXB0cyA9IHNjcmlwdHMubGVuZ3RoOwoKCQkJLy8gVXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbQoJCQkvLyBpbnN0ZWFkIG9mIHRoZSBmaXJzdCBiZWNhdXNlIGl0IGNhbiBlbmQgdXAKCQkJLy8gYmVpbmcgZW1wdGllZCBpbmNvcnJlY3RseSBpbiBjZXJ0YWluIHNpdHVhdGlvbnMgKCM4MDcwKS4KCQkJZm9yICggOyBpIDwgbDsgaSsrICkgewoJCQkJbm9kZSA9IGZyYWdtZW50OwoKCQkJCWlmICggaSAhPT0gaU5vQ2xvbmUgKSB7CgkJCQkJbm9kZSA9IGpRdWVyeS5jbG9uZSggbm9kZSwgdHJ1ZSwgdHJ1ZSApOwoKCQkJCQkvLyBLZWVwIHJlZmVyZW5jZXMgdG8gY2xvbmVkIHNjcmlwdHMgZm9yIGxhdGVyIHJlc3RvcmF0aW9uCgkJCQkJaWYgKCBoYXNTY3JpcHRzICkgewoKCQkJCQkJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5CgkJCQkJCS8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJCQkJalF1ZXJ5Lm1lcmdlKCBzY3JpcHRzLCBnZXRBbGwoIG5vZGUsICJzY3JpcHQiICkgKTsKCQkJCQl9CgkJCQl9CgoJCQkJY2FsbGJhY2suY2FsbCggY29sbGVjdGlvblsgaSBdLCBub2RlLCBpICk7CgkJCX0KCgkJCWlmICggaGFzU2NyaXB0cyApIHsKCQkJCWRvYyA9IHNjcmlwdHNbIHNjcmlwdHMubGVuZ3RoIC0gMSBdLm93bmVyRG9jdW1lbnQ7CgoJCQkJLy8gUmVlbmFibGUgc2NyaXB0cwoJCQkJalF1ZXJ5Lm1hcCggc2NyaXB0cywgcmVzdG9yZVNjcmlwdCApOwoKCQkJCS8vIEV2YWx1YXRlIGV4ZWN1dGFibGUgc2NyaXB0cyBvbiBmaXJzdCBkb2N1bWVudCBpbnNlcnRpb24KCQkJCWZvciAoIGkgPSAwOyBpIDwgaGFzU2NyaXB0czsgaSsrICkgewoJCQkJCW5vZGUgPSBzY3JpcHRzWyBpIF07CgkJCQkJaWYgKCByc2NyaXB0VHlwZS50ZXN0KCBub2RlLnR5cGUgfHwgIiIgKSAmJgoJCQkJCQkhZGF0YVByaXYuYWNjZXNzKCBub2RlLCAiZ2xvYmFsRXZhbCIgKSAmJgoJCQkJCQlqUXVlcnkuY29udGFpbnMoIGRvYywgbm9kZSApICkgewoKCQkJCQkJaWYgKCBub2RlLnNyYyAmJiAoIG5vZGUudHlwZSB8fCAiIiApLnRvTG93ZXJDYXNlKCkgICE9PSAibW9kdWxlIiApIHsKCgkJCQkJCQkvLyBPcHRpb25hbCBBSkFYIGRlcGVuZGVuY3ksIGJ1dCB3b24ndCBydW4gc2NyaXB0cyBpZiBub3QgcHJlc2VudAoJCQkJCQkJaWYgKCBqUXVlcnkuX2V2YWxVcmwgKSB7CgkJCQkJCQkJalF1ZXJ5Ll9ldmFsVXJsKCBub2RlLnNyYyApOwoJCQkJCQkJfQoJCQkJCQl9IGVsc2UgewoJCQkJCQkJRE9NRXZhbCggbm9kZS50ZXh0Q29udGVudC5yZXBsYWNlKCByY2xlYW5TY3JpcHQsICIiICksIGRvYywgbm9kZSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfQoKCXJldHVybiBjb2xsZWN0aW9uOwp9CgpmdW5jdGlvbiByZW1vdmUoIGVsZW0sIHNlbGVjdG9yLCBrZWVwRGF0YSApIHsKCXZhciBub2RlLAoJCW5vZGVzID0gc2VsZWN0b3IgPyBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgZWxlbSApIDogZWxlbSwKCQlpID0gMDsKCglmb3IgKCA7ICggbm9kZSA9IG5vZGVzWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7CgkJaWYgKCAha2VlcERhdGEgJiYgbm9kZS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBub2RlICkgKTsKCQl9CgoJCWlmICggbm9kZS5wYXJlbnROb2RlICkgewoJCQlpZiAoIGtlZXBEYXRhICYmIGpRdWVyeS5jb250YWlucyggbm9kZS5vd25lckRvY3VtZW50LCBub2RlICkgKSB7CgkJCQlzZXRHbG9iYWxFdmFsKCBnZXRBbGwoIG5vZGUsICJzY3JpcHQiICkgKTsKCQkJfQoJCQlub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIG5vZGUgKTsKCQl9Cgl9CgoJcmV0dXJuIGVsZW07Cn0KCmpRdWVyeS5leHRlbmQoIHsKCWh0bWxQcmVmaWx0ZXI6IGZ1bmN0aW9uKCBodG1sICkgewoJCXJldHVybiBodG1sLnJlcGxhY2UoIHJ4aHRtbFRhZywgIjwkMT48LyQyPiIgKTsKCX0sCgoJY2xvbmU6IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQl2YXIgaSwgbCwgc3JjRWxlbWVudHMsIGRlc3RFbGVtZW50cywKCQkJY2xvbmUgPSBlbGVtLmNsb25lTm9kZSggdHJ1ZSApLAoJCQlpblBhZ2UgPSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApOwoKCQkvLyBGaXggSUUgY2xvbmluZyBpc3N1ZXMKCQlpZiAoICFzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkICYmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBlID09PSAxMSApICYmCgkJCQkhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7CgoJCQkvLyBXZSBlc2NoZXcgU2l6emxlIGhlcmUgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnM6IGh0dHBzOi8vanNwZXJmLmNvbS9nZXRhbGwtdnMtc2l6emxlLzIKCQkJZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSApOwoJCQlzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApOwoKCQkJZm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQlmaXhJbnB1dCggc3JjRWxlbWVudHNbIGkgXSwgZGVzdEVsZW1lbnRzWyBpIF0gKTsKCQkJfQoJCX0KCgkJLy8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZQoJCWlmICggZGF0YUFuZEV2ZW50cyApIHsKCQkJaWYgKCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQkJCXNyY0VsZW1lbnRzID0gc3JjRWxlbWVudHMgfHwgZ2V0QWxsKCBlbGVtICk7CgkJCQlkZXN0RWxlbWVudHMgPSBkZXN0RWxlbWVudHMgfHwgZ2V0QWxsKCBjbG9uZSApOwoKCQkJCWZvciAoIGkgPSAwLCBsID0gc3JjRWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWNsb25lQ29weUV2ZW50KCBzcmNFbGVtZW50c1sgaSBdLCBkZXN0RWxlbWVudHNbIGkgXSApOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJY2xvbmVDb3B5RXZlbnQoIGVsZW0sIGNsb25lICk7CgkJCX0KCQl9CgoJCS8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3RvcnkKCQlkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCAic2NyaXB0IiApOwoJCWlmICggZGVzdEVsZW1lbnRzLmxlbmd0aCA+IDAgKSB7CgkJCXNldEdsb2JhbEV2YWwoIGRlc3RFbGVtZW50cywgIWluUGFnZSAmJiBnZXRBbGwoIGVsZW0sICJzY3JpcHQiICkgKTsKCQl9CgoJCS8vIFJldHVybiB0aGUgY2xvbmVkIHNldAoJCXJldHVybiBjbG9uZTsKCX0sCgoJY2xlYW5EYXRhOiBmdW5jdGlvbiggZWxlbXMgKSB7CgkJdmFyIGRhdGEsIGVsZW0sIHR5cGUsCgkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbCwKCQkJaSA9IDA7CgoJCWZvciAoIDsgKCBlbGVtID0gZWxlbXNbIGkgXSApICE9PSB1bmRlZmluZWQ7IGkrKyApIHsKCQkJaWYgKCBhY2NlcHREYXRhKCBlbGVtICkgKSB7CgkJCQlpZiAoICggZGF0YSA9IGVsZW1bIGRhdGFQcml2LmV4cGFuZG8gXSApICkgewoJCQkJCWlmICggZGF0YS5ldmVudHMgKSB7CgkJCQkJCWZvciAoIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7CgkJCQkJCQlpZiAoIHNwZWNpYWxbIHR5cGUgXSApIHsKCQkJCQkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICk7CgoJCQkJCQkJLy8gVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGF2b2lkIGpRdWVyeS5ldmVudC5yZW1vdmUncyBvdmVyaGVhZAoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQlqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGRhdGEuaGFuZGxlICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUrCgkJCQkJLy8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlCgkJCQkJZWxlbVsgZGF0YVByaXYuZXhwYW5kbyBdID0gdW5kZWZpbmVkOwoJCQkJfQoJCQkJaWYgKCBlbGVtWyBkYXRhVXNlci5leHBhbmRvIF0gKSB7CgoJCQkJCS8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUrCgkJCQkJLy8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlCgkJCQkJZWxlbVsgZGF0YVVzZXIuZXhwYW5kbyBdID0gdW5kZWZpbmVkOwoJCQkJfQoJCQl9CgkJfQoJfQp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CglkZXRhY2g6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlyZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciwgdHJ1ZSApOwoJfSwKCglyZW1vdmU6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlyZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciApOwoJfSwKCgl0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJcmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkgewoJCQlyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/CgkJCQlqUXVlcnkudGV4dCggdGhpcyApIDoKCQkJCXRoaXMuZW1wdHkoKS5lYWNoKCBmdW5jdGlvbigpIHsKCQkJCQlpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCQkJdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlOwoJCQkJCX0KCQkJCX0gKTsKCQl9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApOwoJfSwKCglhcHBlbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJaWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7CgkJCQl2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7CgkJCQl0YXJnZXQuYXBwZW5kQ2hpbGQoIGVsZW0gKTsKCQkJfQoJCX0gKTsKCX0sCgoJcHJlcGVuZDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCXZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTsKCQkJCXRhcmdldC5pbnNlcnRCZWZvcmUoIGVsZW0sIHRhcmdldC5maXJzdENoaWxkICk7CgkJCX0KCQl9ICk7Cgl9LAoKCWJlZm9yZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlpZiAoIHRoaXMucGFyZW50Tm9kZSApIHsKCQkJCXRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMgKTsKCQkJfQoJCX0gKTsKCX0sCgoJYWZ0ZXI6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJaWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7CgkJCQl0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7CgkJCX0KCQl9ICk7Cgl9LAoKCWVtcHR5OiBmdW5jdGlvbigpIHsKCQl2YXIgZWxlbSwKCQkJaSA9IDA7CgoJCWZvciAoIDsgKCBlbGVtID0gdGhpc1sgaSBdICkgIT0gbnVsbDsgaSsrICkgewoJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgoJCQkJLy8gUHJldmVudCBtZW1vcnkgbGVha3MKCQkJCWpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApOwoKCQkJCS8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG5vZGVzCgkJCQllbGVtLnRleHRDb250ZW50ID0gIiI7CgkJCX0KCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgljbG9uZTogZnVuY3Rpb24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkgewoJCWRhdGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRzID09IG51bGwgPyBmYWxzZSA6IGRhdGFBbmRFdmVudHM7CgkJZGVlcERhdGFBbmRFdmVudHMgPSBkZWVwRGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZGF0YUFuZEV2ZW50cyA6IGRlZXBEYXRhQW5kRXZlbnRzOwoKCQlyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4galF1ZXJ5LmNsb25lKCB0aGlzLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApOwoJCX0gKTsKCX0sCgoJaHRtbDogZnVuY3Rpb24oIHZhbHVlICkgewoJCXJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJdmFyIGVsZW0gPSB0aGlzWyAwIF0gfHwge30sCgkJCQlpID0gMCwKCQkJCWwgPSB0aGlzLmxlbmd0aDsKCgkJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJcmV0dXJuIGVsZW0uaW5uZXJIVE1MOwoJCQl9CgoJCQkvLyBTZWUgaWYgd2UgY2FuIHRha2UgYSBzaG9ydGN1dCBhbmQganVzdCB1c2UgaW5uZXJIVE1MCgkJCWlmICggdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiAmJiAhcm5vSW5uZXJodG1sLnRlc3QoIHZhbHVlICkgJiYKCQkJCSF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyAiIiwgIiIgXSApWyAxIF0udG9Mb3dlckNhc2UoKSBdICkgewoKCQkJCXZhbHVlID0galF1ZXJ5Lmh0bWxQcmVmaWx0ZXIoIHZhbHVlICk7CgoJCQkJdHJ5IHsKCQkJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJCQkJCWVsZW0gPSB0aGlzWyBpIF0gfHwge307CgoJCQkJCQkvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3MKCQkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtLCBmYWxzZSApICk7CgkJCQkJCQllbGVtLmlubmVySFRNTCA9IHZhbHVlOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQllbGVtID0gMDsKCgkJCQkvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2QKCQkJCX0gY2F0Y2ggKCBlICkge30KCQkJfQoKCQkJaWYgKCBlbGVtICkgewoJCQkJdGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTsKCQkJfQoJCX0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7Cgl9LAoKCXJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHsKCQl2YXIgaWdub3JlZCA9IFtdOwoKCQkvLyBNYWtlIHRoZSBjaGFuZ2VzLCByZXBsYWNpbmcgZWFjaCBub24taWdub3JlZCBjb250ZXh0IGVsZW1lbnQgd2l0aCB0aGUgbmV3IGNvbnRlbnQKCQlyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CgoJCQlpZiAoIGpRdWVyeS5pbkFycmF5KCB0aGlzLCBpZ25vcmVkICkgPCAwICkgewoJCQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCB0aGlzICkgKTsKCQkJCWlmICggcGFyZW50ICkgewoJCQkJCXBhcmVudC5yZXBsYWNlQ2hpbGQoIGVsZW0sIHRoaXMgKTsKCQkJCX0KCQkJfQoKCQkvLyBGb3JjZSBjYWxsYmFjayBpbnZvY2F0aW9uCgkJfSwgaWdub3JlZCApOwoJfQp9ICk7CgpqUXVlcnkuZWFjaCggewoJYXBwZW5kVG86ICJhcHBlbmQiLAoJcHJlcGVuZFRvOiAicHJlcGVuZCIsCglpbnNlcnRCZWZvcmU6ICJiZWZvcmUiLAoJaW5zZXJ0QWZ0ZXI6ICJhZnRlciIsCglyZXBsYWNlQWxsOiAicmVwbGFjZVdpdGgiCn0sIGZ1bmN0aW9uKCBuYW1lLCBvcmlnaW5hbCApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciBlbGVtcywKCQkJcmV0ID0gW10sCgkJCWluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKSwKCQkJbGFzdCA9IGluc2VydC5sZW5ndGggLSAxLAoJCQlpID0gMDsKCgkJZm9yICggOyBpIDw9IGxhc3Q7IGkrKyApIHsKCQkJZWxlbXMgPSBpID09PSBsYXN0ID8gdGhpcyA6IHRoaXMuY2xvbmUoIHRydWUgKTsKCQkJalF1ZXJ5KCBpbnNlcnRbIGkgXSApWyBvcmlnaW5hbCBdKCBlbGVtcyApOwoKCQkJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5CgkJCS8vIC5nZXQoKSBiZWNhdXNlIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJcHVzaC5hcHBseSggcmV0LCBlbGVtcy5nZXQoKSApOwoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQgKTsKCX07Cn0gKTsKdmFyIHJudW1ub25weCA9IG5ldyBSZWdFeHAoICJeKCIgKyBwbnVtICsgIikoPyFweClbYS16JV0rJCIsICJpIiApOwoKdmFyIGdldFN0eWxlcyA9IGZ1bmN0aW9uKCBlbGVtICkgewoKCQkvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHksIEZpcmVmb3ggPD0zMCAoIzE1MDk4LCAjMTQxNTApCgkJLy8gSUUgdGhyb3dzIG9uIGVsZW1lbnRzIGNyZWF0ZWQgaW4gcG9wdXBzCgkJLy8gRkYgbWVhbndoaWxlIHRocm93cyBvbiBmcmFtZSBlbGVtZW50cyB0aHJvdWdoICJkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlIgoJCXZhciB2aWV3ID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3OwoKCQlpZiAoICF2aWV3IHx8ICF2aWV3Lm9wZW5lciApIHsKCQkJdmlldyA9IHdpbmRvdzsKCQl9CgoJCXJldHVybiB2aWV3LmdldENvbXB1dGVkU3R5bGUoIGVsZW0gKTsKCX07Cgp2YXIgcmJveFN0eWxlID0gbmV3IFJlZ0V4cCggY3NzRXhwYW5kLmpvaW4oICJ8IiApLCAiaSIgKTsKCgoKKCBmdW5jdGlvbigpIHsKCgkvLyBFeGVjdXRpbmcgYm90aCBwaXhlbFBvc2l0aW9uICYgYm94U2l6aW5nUmVsaWFibGUgdGVzdHMgcmVxdWlyZSBvbmx5IG9uZSBsYXlvdXQKCS8vIHNvIHRoZXkncmUgZXhlY3V0ZWQgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHRoZSBzZWNvbmQgY29tcHV0YXRpb24uCglmdW5jdGlvbiBjb21wdXRlU3R5bGVUZXN0cygpIHsKCgkJLy8gVGhpcyBpcyBhIHNpbmdsZXRvbiwgd2UgbmVlZCB0byBleGVjdXRlIGl0IG9ubHkgb25jZQoJCWlmICggIWRpdiApIHsKCQkJcmV0dXJuOwoJCX0KCgkJY29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSAicG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4OyIgKwoJCQkibWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowIjsKCQlkaXYuc3R5bGUuY3NzVGV4dCA9CgkJCSJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7IiArCgkJCSJtYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4OyIgKwoJCQkid2lkdGg6NjAlO3RvcDoxJSI7CgkJZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKCBjb250YWluZXIgKS5hcHBlbmRDaGlsZCggZGl2ICk7CgoJCXZhciBkaXZTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBkaXYgKTsKCQlwaXhlbFBvc2l0aW9uVmFsID0gZGl2U3R5bGUudG9wICE9PSAiMSUiOwoKCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBGaXJlZm94IDw9MyAtIDQ0CgkJcmVsaWFibGVNYXJnaW5MZWZ0VmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS5tYXJnaW5MZWZ0ICkgPT09IDEyOwoKCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBTYWZhcmkgPD05LjEgLSAxMC4xLCBpT1MgPD03LjAgLSA5LjMKCQkvLyBTb21lIHN0eWxlcyBjb21lIGJhY2sgd2l0aCBwZXJjZW50YWdlIHZhbHVlcywgZXZlbiB0aG91Z2ggdGhleSBzaG91bGRuJ3QKCQlkaXYuc3R5bGUucmlnaHQgPSAiNjAlIjsKCQlwaXhlbEJveFN0eWxlc1ZhbCA9IHJvdW5kUGl4ZWxNZWFzdXJlcyggZGl2U3R5bGUucmlnaHQgKSA9PT0gMzY7CgoJCS8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5CgkJLy8gRGV0ZWN0IG1pc3JlcG9ydGluZyBvZiBjb250ZW50IGRpbWVuc2lvbnMgZm9yIGJveC1zaXppbmc6Ym9yZGVyLWJveCBlbGVtZW50cwoJCWJveFNpemluZ1JlbGlhYmxlVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS53aWR0aCApID09PSAzNjsKCgkJLy8gU3VwcG9ydDogSUUgOSBvbmx5CgkJLy8gRGV0ZWN0IG92ZXJmbG93OnNjcm9sbCBzY3Jld2luZXNzIChnaC0zNjk5KQoJCWRpdi5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CgkJc2Nyb2xsYm94U2l6ZVZhbCA9IGRpdi5vZmZzZXRXaWR0aCA9PT0gMzYgfHwgImFic29sdXRlIjsKCgkJZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTsKCgkJLy8gTnVsbGlmeSB0aGUgZGl2IHNvIGl0IHdvdWxkbid0IGJlIHN0b3JlZCBpbiB0aGUgbWVtb3J5IGFuZAoJCS8vIGl0IHdpbGwgYWxzbyBiZSBhIHNpZ24gdGhhdCBjaGVja3MgYWxyZWFkeSBwZXJmb3JtZWQKCQlkaXYgPSBudWxsOwoJfQoKCWZ1bmN0aW9uIHJvdW5kUGl4ZWxNZWFzdXJlcyggbWVhc3VyZSApIHsKCQlyZXR1cm4gTWF0aC5yb3VuZCggcGFyc2VGbG9hdCggbWVhc3VyZSApICk7Cgl9CgoJdmFyIHBpeGVsUG9zaXRpb25WYWwsIGJveFNpemluZ1JlbGlhYmxlVmFsLCBzY3JvbGxib3hTaXplVmFsLCBwaXhlbEJveFN0eWxlc1ZhbCwKCQlyZWxpYWJsZU1hcmdpbkxlZnRWYWwsCgkJY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSwKCQlkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiZGl2IiApOwoKCS8vIEZpbmlzaCBlYXJseSBpbiBsaW1pdGVkIChub24tYnJvd3NlcikgZW52aXJvbm1lbnRzCglpZiAoICFkaXYuc3R5bGUgKSB7CgkJcmV0dXJuOwoJfQoKCS8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHkKCS8vIFN0eWxlIG9mIGNsb25lZCBlbGVtZW50IGFmZmVjdHMgc291cmNlIGVsZW1lbnQgY2xvbmVkICgjODkwOCkKCWRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9ICJjb250ZW50LWJveCI7CglkaXYuY2xvbmVOb2RlKCB0cnVlICkuc3R5bGUuYmFja2dyb3VuZENsaXAgPSAiIjsKCXN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlID0gZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID09PSAiY29udGVudC1ib3giOwoKCWpRdWVyeS5leHRlbmQoIHN1cHBvcnQsIHsKCQlib3hTaXppbmdSZWxpYWJsZTogZnVuY3Rpb24oKSB7CgkJCWNvbXB1dGVTdHlsZVRlc3RzKCk7CgkJCXJldHVybiBib3hTaXppbmdSZWxpYWJsZVZhbDsKCQl9LAoJCXBpeGVsQm94U3R5bGVzOiBmdW5jdGlvbigpIHsKCQkJY29tcHV0ZVN0eWxlVGVzdHMoKTsKCQkJcmV0dXJuIHBpeGVsQm94U3R5bGVzVmFsOwoJCX0sCgkJcGl4ZWxQb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJCWNvbXB1dGVTdHlsZVRlc3RzKCk7CgkJCXJldHVybiBwaXhlbFBvc2l0aW9uVmFsOwoJCX0sCgkJcmVsaWFibGVNYXJnaW5MZWZ0OiBmdW5jdGlvbigpIHsKCQkJY29tcHV0ZVN0eWxlVGVzdHMoKTsKCQkJcmV0dXJuIHJlbGlhYmxlTWFyZ2luTGVmdFZhbDsKCQl9LAoJCXNjcm9sbGJveFNpemU6IGZ1bmN0aW9uKCkgewoJCQljb21wdXRlU3R5bGVUZXN0cygpOwoJCQlyZXR1cm4gc2Nyb2xsYm94U2l6ZVZhbDsKCQl9Cgl9ICk7Cn0gKSgpOwoKCmZ1bmN0aW9uIGN1ckNTUyggZWxlbSwgbmFtZSwgY29tcHV0ZWQgKSB7Cgl2YXIgd2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCwgcmV0LAoKCQkvLyBTdXBwb3J0OiBGaXJlZm94IDUxKwoJCS8vIFJldHJpZXZpbmcgc3R5bGUgYmVmb3JlIGNvbXB1dGVkIHNvbWVob3cKCQkvLyBmaXhlcyBhbiBpc3N1ZSB3aXRoIGdldHRpbmcgd3JvbmcgdmFsdWVzCgkJLy8gb24gZGV0YWNoZWQgZWxlbWVudHMKCQlzdHlsZSA9IGVsZW0uc3R5bGU7CgoJY29tcHV0ZWQgPSBjb21wdXRlZCB8fCBnZXRTdHlsZXMoIGVsZW0gKTsKCgkvLyBnZXRQcm9wZXJ0eVZhbHVlIGlzIG5lZWRlZCBmb3I6CgkvLyAgIC5jc3MoJ2ZpbHRlcicpIChJRSA5IG9ubHksICMxMjUzNykKCS8vICAgLmNzcygnLS1jdXN0b21Qcm9wZXJ0eSkgKCMzMTQ0KQoJaWYgKCBjb21wdXRlZCApIHsKCQlyZXQgPSBjb21wdXRlZC5nZXRQcm9wZXJ0eVZhbHVlKCBuYW1lICkgfHwgY29tcHV0ZWRbIG5hbWUgXTsKCgkJaWYgKCByZXQgPT09ICIiICYmICFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApICkgewoJCQlyZXQgPSBqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUgKTsKCQl9CgoJCS8vIEEgdHJpYnV0ZSB0byB0aGUgImF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHMiCgkJLy8gQW5kcm9pZCBCcm93c2VyIHJldHVybnMgcGVyY2VudGFnZSBmb3Igc29tZSB2YWx1ZXMsCgkJLy8gYnV0IHdpZHRoIHNlZW1zIHRvIGJlIHJlbGlhYmx5IHBpeGVscy4KCQkvLyBUaGlzIGlzIGFnYWluc3QgdGhlIENTU09NIGRyYWZ0IHNwZWM6CgkJLy8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzc29tLyNyZXNvbHZlZC12YWx1ZXMKCQlpZiAoICFzdXBwb3J0LnBpeGVsQm94U3R5bGVzKCkgJiYgcm51bW5vbnB4LnRlc3QoIHJldCApICYmIHJib3hTdHlsZS50ZXN0KCBuYW1lICkgKSB7CgoJCQkvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzCgkJCXdpZHRoID0gc3R5bGUud2lkdGg7CgkJCW1pbldpZHRoID0gc3R5bGUubWluV2lkdGg7CgkJCW1heFdpZHRoID0gc3R5bGUubWF4V2lkdGg7CgoJCQkvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0CgkJCXN0eWxlLm1pbldpZHRoID0gc3R5bGUubWF4V2lkdGggPSBzdHlsZS53aWR0aCA9IHJldDsKCQkJcmV0ID0gY29tcHV0ZWQud2lkdGg7CgoJCQkvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzCgkJCXN0eWxlLndpZHRoID0gd2lkdGg7CgkJCXN0eWxlLm1pbldpZHRoID0gbWluV2lkdGg7CgkJCXN0eWxlLm1heFdpZHRoID0gbWF4V2lkdGg7CgkJfQoJfQoKCXJldHVybiByZXQgIT09IHVuZGVmaW5lZCA/CgoJCS8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHkKCQkvLyBJRSByZXR1cm5zIHpJbmRleCB2YWx1ZSBhcyBhbiBpbnRlZ2VyLgoJCXJldCArICIiIDoKCQlyZXQ7Cn0KCgpmdW5jdGlvbiBhZGRHZXRIb29rSWYoIGNvbmRpdGlvbkZuLCBob29rRm4gKSB7CgoJLy8gRGVmaW5lIHRoZSBob29rLCB3ZSdsbCBjaGVjayBvbiB0aGUgZmlyc3QgcnVuIGlmIGl0J3MgcmVhbGx5IG5lZWRlZC4KCXJldHVybiB7CgkJZ2V0OiBmdW5jdGlvbigpIHsKCQkJaWYgKCBjb25kaXRpb25GbigpICkgewoKCQkJCS8vIEhvb2sgbm90IG5lZWRlZCAob3IgaXQncyBub3QgcG9zc2libGUgdG8gdXNlIGl0IGR1ZQoJCQkJLy8gdG8gbWlzc2luZyBkZXBlbmRlbmN5KSwgcmVtb3ZlIGl0LgoJCQkJZGVsZXRlIHRoaXMuZ2V0OwoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBIb29rIG5lZWRlZDsgcmVkZWZpbmUgaXQgc28gdGhhdCB0aGUgc3VwcG9ydCB0ZXN0IGlzIG5vdCBleGVjdXRlZCBhZ2Fpbi4KCQkJcmV0dXJuICggdGhpcy5nZXQgPSBob29rRm4gKS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfQoJfTsKfQoKCnZhcgoKCS8vIFN3YXBwYWJsZSBpZiBkaXNwbGF5IGlzIG5vbmUgb3Igc3RhcnRzIHdpdGggdGFibGUKCS8vIGV4Y2VwdCAidGFibGUiLCAidGFibGUtY2VsbCIsIG9yICJ0YWJsZS1jYXB0aW9uIgoJLy8gU2VlIGhlcmUgZm9yIGRpc3BsYXkgdmFsdWVzOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0NTUy9kaXNwbGF5CglyZGlzcGxheXN3YXAgPSAvXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sCglyY3VzdG9tUHJvcCA9IC9eLS0vLAoJY3NzU2hvdyA9IHsgcG9zaXRpb246ICJhYnNvbHV0ZSIsIHZpc2liaWxpdHk6ICJoaWRkZW4iLCBkaXNwbGF5OiAiYmxvY2siIH0sCgljc3NOb3JtYWxUcmFuc2Zvcm0gPSB7CgkJbGV0dGVyU3BhY2luZzogIjAiLAoJCWZvbnRXZWlnaHQ6ICI0MDAiCgl9LAoKCWNzc1ByZWZpeGVzID0gWyAiV2Via2l0IiwgIk1veiIsICJtcyIgXSwKCWVtcHR5U3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiZGl2IiApLnN0eWxlOwoKLy8gUmV0dXJuIGEgY3NzIHByb3BlcnR5IG1hcHBlZCB0byBhIHBvdGVudGlhbGx5IHZlbmRvciBwcmVmaXhlZCBwcm9wZXJ0eQpmdW5jdGlvbiB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHsKCgkvLyBTaG9ydGN1dCBmb3IgbmFtZXMgdGhhdCBhcmUgbm90IHZlbmRvciBwcmVmaXhlZAoJaWYgKCBuYW1lIGluIGVtcHR5U3R5bGUgKSB7CgkJcmV0dXJuIG5hbWU7Cgl9CgoJLy8gQ2hlY2sgZm9yIHZlbmRvciBwcmVmaXhlZCBuYW1lcwoJdmFyIGNhcE5hbWUgPSBuYW1lWyAwIF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoIDEgKSwKCQlpID0gY3NzUHJlZml4ZXMubGVuZ3RoOwoKCXdoaWxlICggaS0tICkgewoJCW5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsgY2FwTmFtZTsKCQlpZiAoIG5hbWUgaW4gZW1wdHlTdHlsZSApIHsKCQkJcmV0dXJuIG5hbWU7CgkJfQoJfQp9CgovLyBSZXR1cm4gYSBwcm9wZXJ0eSBtYXBwZWQgYWxvbmcgd2hhdCBqUXVlcnkuY3NzUHJvcHMgc3VnZ2VzdHMgb3IgdG8KLy8gYSB2ZW5kb3IgcHJlZml4ZWQgcHJvcGVydHkuCmZ1bmN0aW9uIGZpbmFsUHJvcE5hbWUoIG5hbWUgKSB7Cgl2YXIgcmV0ID0galF1ZXJ5LmNzc1Byb3BzWyBuYW1lIF07CglpZiAoICFyZXQgKSB7CgkJcmV0ID0galF1ZXJ5LmNzc1Byb3BzWyBuYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHx8IG5hbWU7Cgl9CglyZXR1cm4gcmV0Owp9CgpmdW5jdGlvbiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICkgewoKCS8vIEFueSByZWxhdGl2ZSAoKy8tKSB2YWx1ZXMgaGF2ZSBhbHJlYWR5IGJlZW4KCS8vIG5vcm1hbGl6ZWQgYXQgdGhpcyBwb2ludAoJdmFyIG1hdGNoZXMgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICk7CglyZXR1cm4gbWF0Y2hlcyA/CgoJCS8vIEd1YXJkIGFnYWluc3QgdW5kZWZpbmVkICJzdWJ0cmFjdCIsIGUuZy4sIHdoZW4gdXNlZCBhcyBpbiBjc3NIb29rcwoJCU1hdGgubWF4KCAwLCBtYXRjaGVzWyAyIF0gLSAoIHN1YnRyYWN0IHx8IDAgKSApICsgKCBtYXRjaGVzWyAzIF0gfHwgInB4IiApIDoKCQl2YWx1ZTsKfQoKZnVuY3Rpb24gYm94TW9kZWxBZGp1c3RtZW50KCBlbGVtLCBkaW1lbnNpb24sIGJveCwgaXNCb3JkZXJCb3gsIHN0eWxlcywgY29tcHV0ZWRWYWwgKSB7Cgl2YXIgaSA9IGRpbWVuc2lvbiA9PT0gIndpZHRoIiA/IDEgOiAwLAoJCWV4dHJhID0gMCwKCQlkZWx0YSA9IDA7CgoJLy8gQWRqdXN0bWVudCBtYXkgbm90IGJlIG5lY2Vzc2FyeQoJaWYgKCBib3ggPT09ICggaXNCb3JkZXJCb3ggPyAiYm9yZGVyIiA6ICJjb250ZW50IiApICkgewoJCXJldHVybiAwOwoJfQoKCWZvciAoIDsgaSA8IDQ7IGkgKz0gMiApIHsKCgkJLy8gQm90aCBib3ggbW9kZWxzIGV4Y2x1ZGUgbWFyZ2luCgkJaWYgKCBib3ggPT09ICJtYXJnaW4iICkgewoJCQlkZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCBib3ggKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7CgkJfQoKCQkvLyBJZiB3ZSBnZXQgaGVyZSB3aXRoIGEgY29udGVudC1ib3gsIHdlJ3JlIHNlZWtpbmcgInBhZGRpbmciIG9yICJib3JkZXIiIG9yICJtYXJnaW4iCgkJaWYgKCAhaXNCb3JkZXJCb3ggKSB7CgoJCQkvLyBBZGQgcGFkZGluZwoJCQlkZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCAicGFkZGluZyIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7CgoJCQkvLyBGb3IgImJvcmRlciIgb3IgIm1hcmdpbiIsIGFkZCBib3JkZXIKCQkJaWYgKCBib3ggIT09ICJwYWRkaW5nIiApIHsKCQkJCWRlbHRhICs9IGpRdWVyeS5jc3MoIGVsZW0sICJib3JkZXIiICsgY3NzRXhwYW5kWyBpIF0gKyAiV2lkdGgiLCB0cnVlLCBzdHlsZXMgKTsKCgkJCS8vIEJ1dCBzdGlsbCBrZWVwIHRyYWNrIG9mIGl0IG90aGVyd2lzZQoJCQl9IGVsc2UgewoJCQkJZXh0cmEgKz0galF1ZXJ5LmNzcyggZWxlbSwgImJvcmRlciIgKyBjc3NFeHBhbmRbIGkgXSArICJXaWR0aCIsIHRydWUsIHN0eWxlcyApOwoJCQl9CgoJCS8vIElmIHdlIGdldCBoZXJlIHdpdGggYSBib3JkZXItYm94IChjb250ZW50ICsgcGFkZGluZyArIGJvcmRlciksIHdlJ3JlIHNlZWtpbmcgImNvbnRlbnQiIG9yCgkJLy8gInBhZGRpbmciIG9yICJtYXJnaW4iCgkJfSBlbHNlIHsKCgkJCS8vIEZvciAiY29udGVudCIsIHN1YnRyYWN0IHBhZGRpbmcKCQkJaWYgKCBib3ggPT09ICJjb250ZW50IiApIHsKCQkJCWRlbHRhIC09IGpRdWVyeS5jc3MoIGVsZW0sICJwYWRkaW5nIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTsKCQkJfQoKCQkJLy8gRm9yICJjb250ZW50IiBvciAicGFkZGluZyIsIHN1YnRyYWN0IGJvcmRlcgoJCQlpZiAoIGJveCAhPT0gIm1hcmdpbiIgKSB7CgkJCQlkZWx0YSAtPSBqUXVlcnkuY3NzKCBlbGVtLCAiYm9yZGVyIiArIGNzc0V4cGFuZFsgaSBdICsgIldpZHRoIiwgdHJ1ZSwgc3R5bGVzICk7CgkJCX0KCQl9Cgl9CgoJLy8gQWNjb3VudCBmb3IgcG9zaXRpdmUgY29udGVudC1ib3ggc2Nyb2xsIGd1dHRlciB3aGVuIHJlcXVlc3RlZCBieSBwcm92aWRpbmcgY29tcHV0ZWRWYWwKCWlmICggIWlzQm9yZGVyQm94ICYmIGNvbXB1dGVkVmFsID49IDAgKSB7CgoJCS8vIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBpcyBhIHJvdW5kZWQgc3VtIG9mIGNvbnRlbnQsIHBhZGRpbmcsIHNjcm9sbCBndXR0ZXIsIGFuZCBib3JkZXIKCQkvLyBBc3N1bWluZyBpbnRlZ2VyIHNjcm9sbCBndXR0ZXIsIHN1YnRyYWN0IHRoZSByZXN0IGFuZCByb3VuZCBkb3duCgkJZGVsdGEgKz0gTWF0aC5tYXgoIDAsIE1hdGguY2VpbCgKCQkJZWxlbVsgIm9mZnNldCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtCgkJCWNvbXB1dGVkVmFsIC0KCQkJZGVsdGEgLQoJCQlleHRyYSAtCgkJCTAuNQoJCSkgKTsKCX0KCglyZXR1cm4gZGVsdGE7Cn0KCmZ1bmN0aW9uIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIGRpbWVuc2lvbiwgZXh0cmEgKSB7CgoJLy8gU3RhcnQgd2l0aCBjb21wdXRlZCBzdHlsZQoJdmFyIHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApLAoJCXZhbCA9IGN1ckNTUyggZWxlbSwgZGltZW5zaW9uLCBzdHlsZXMgKSwKCQlpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sICJib3hTaXppbmciLCBmYWxzZSwgc3R5bGVzICkgPT09ICJib3JkZXItYm94IiwKCQl2YWx1ZUlzQm9yZGVyQm94ID0gaXNCb3JkZXJCb3g7CgoJLy8gU3VwcG9ydDogRmlyZWZveCA8PTU0CgkvLyBSZXR1cm4gYSBjb25mb3VuZGluZyBub24tcGl4ZWwgdmFsdWUgb3IgZmVpZ24gaWdub3JhbmNlLCBhcyBhcHByb3ByaWF0ZS4KCWlmICggcm51bW5vbnB4LnRlc3QoIHZhbCApICkgewoJCWlmICggIWV4dHJhICkgewoJCQlyZXR1cm4gdmFsOwoJCX0KCQl2YWwgPSAiYXV0byI7Cgl9CgoJLy8gQ2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2VyIHdoaWNoIHJldHVybnMgdW5yZWxpYWJsZSB2YWx1ZXMKCS8vIGZvciBnZXRDb21wdXRlZFN0eWxlIHNpbGVudGx5IGZhbGxzIGJhY2sgdG8gdGhlIHJlbGlhYmxlIGVsZW0uc3R5bGUKCXZhbHVlSXNCb3JkZXJCb3ggPSB2YWx1ZUlzQm9yZGVyQm94ICYmCgkJKCBzdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlKCkgfHwgdmFsID09PSBlbGVtLnN0eWxlWyBkaW1lbnNpb24gXSApOwoKCS8vIEZhbGwgYmFjayB0byBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgd2hlbiB2YWx1ZSBpcyAiYXV0byIKCS8vIFRoaXMgaGFwcGVucyBmb3IgaW5saW5lIGVsZW1lbnRzIHdpdGggbm8gZXhwbGljaXQgc2V0dGluZyAoZ2gtMzU3MSkKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjEgLSA0LjMgb25seQoJLy8gQWxzbyB1c2Ugb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGZvciBtaXNyZXBvcnRlZCBpbmxpbmUgZGltZW5zaW9ucyAoZ2gtMzYwMikKCWlmICggdmFsID09PSAiYXV0byIgfHwKCQkhcGFyc2VGbG9hdCggdmFsICkgJiYgalF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiLCBmYWxzZSwgc3R5bGVzICkgPT09ICJpbmxpbmUiICkgewoKCQl2YWwgPSBlbGVtWyAib2Zmc2V0IiArIGRpbWVuc2lvblsgMCBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoIDEgKSBdOwoKCQkvLyBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgcHJvdmlkZSBib3JkZXItYm94IHZhbHVlcwoJCXZhbHVlSXNCb3JkZXJCb3ggPSB0cnVlOwoJfQoKCS8vIE5vcm1hbGl6ZSAiIiBhbmQgYXV0bwoJdmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDsKCgkvLyBBZGp1c3QgZm9yIHRoZSBlbGVtZW50J3MgYm94IG1vZGVsCglyZXR1cm4gKCB2YWwgKwoJCWJveE1vZGVsQWRqdXN0bWVudCgKCQkJZWxlbSwKCQkJZGltZW5zaW9uLAoJCQlleHRyYSB8fCAoIGlzQm9yZGVyQm94ID8gImJvcmRlciIgOiAiY29udGVudCIgKSwKCQkJdmFsdWVJc0JvcmRlckJveCwKCQkJc3R5bGVzLAoKCQkJLy8gUHJvdmlkZSB0aGUgY3VycmVudCBjb21wdXRlZCBzaXplIHRvIHJlcXVlc3Qgc2Nyb2xsIGd1dHRlciBjYWxjdWxhdGlvbiAoZ2gtMzU4OSkKCQkJdmFsCgkJKQoJKSArICJweCI7Cn0KCmpRdWVyeS5leHRlbmQoIHsKCgkvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQKCS8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBzdHlsZSBwcm9wZXJ0eQoJY3NzSG9va3M6IHsKCQlvcGFjaXR5OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQkJaWYgKCBjb21wdXRlZCApIHsKCgkJCQkJLy8gV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHkKCQkJCQl2YXIgcmV0ID0gY3VyQ1NTKCBlbGVtLCAib3BhY2l0eSIgKTsKCQkJCQlyZXR1cm4gcmV0ID09PSAiIiA/ICIxIiA6IHJldDsKCQkJCX0KCQkJfQoJCX0KCX0sCgoJLy8gRG9uJ3QgYXV0b21hdGljYWxseSBhZGQgInB4IiB0byB0aGVzZSBwb3NzaWJseS11bml0bGVzcyBwcm9wZXJ0aWVzCgljc3NOdW1iZXI6IHsKCQkiYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQiOiB0cnVlLAoJCSJjb2x1bW5Db3VudCI6IHRydWUsCgkJImZpbGxPcGFjaXR5IjogdHJ1ZSwKCQkiZmxleEdyb3ciOiB0cnVlLAoJCSJmbGV4U2hyaW5rIjogdHJ1ZSwKCQkiZm9udFdlaWdodCI6IHRydWUsCgkJImxpbmVIZWlnaHQiOiB0cnVlLAoJCSJvcGFjaXR5IjogdHJ1ZSwKCQkib3JkZXIiOiB0cnVlLAoJCSJvcnBoYW5zIjogdHJ1ZSwKCQkid2lkb3dzIjogdHJ1ZSwKCQkiekluZGV4IjogdHJ1ZSwKCQkiem9vbSI6IHRydWUKCX0sCgoJLy8gQWRkIGluIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9yZQoJLy8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZQoJY3NzUHJvcHM6IHt9LAoKCS8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBvbiBhIERPTSBOb2RlCglzdHlsZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBleHRyYSApIHsKCgkJLy8gRG9uJ3Qgc2V0IHN0eWxlcyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCgkJaWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggfHwgIWVsZW0uc3R5bGUgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZQoJCXZhciByZXQsIHR5cGUsIGhvb2tzLAoJCQlvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLAoJCQlpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICksCgkJCXN0eWxlID0gZWxlbS5zdHlsZTsKCgkJLy8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lLiBXZSBkb24ndAoJCS8vIHdhbnQgdG8gcXVlcnkgdGhlIHZhbHVlIGlmIGl0IGlzIGEgQ1NTIGN1c3RvbSBwcm9wZXJ0eQoJCS8vIHNpbmNlIHRoZXkgYXJlIHVzZXItZGVmaW5lZC4KCQlpZiAoICFpc0N1c3RvbVByb3AgKSB7CgkJCW5hbWUgPSBmaW5hbFByb3BOYW1lKCBvcmlnTmFtZSApOwoJCX0KCgkJLy8gR2V0cyBob29rIGZvciB0aGUgcHJlZml4ZWQgdmVyc2lvbiwgdGhlbiB1bnByZWZpeGVkIHZlcnNpb24KCQlob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTsKCgkJLy8gQ2hlY2sgaWYgd2UncmUgc2V0dGluZyBhIHZhbHVlCgkJaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgewoJCQl0eXBlID0gdHlwZW9mIHZhbHVlOwoKCQkJLy8gQ29udmVydCAiKz0iIG9yICItPSIgdG8gcmVsYXRpdmUgbnVtYmVycyAoIzczNDUpCgkJCWlmICggdHlwZSA9PT0gInN0cmluZyIgJiYgKCByZXQgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICkgKSAmJiByZXRbIDEgXSApIHsKCQkJCXZhbHVlID0gYWRqdXN0Q1NTKCBlbGVtLCBuYW1lLCByZXQgKTsKCgkJCQkvLyBGaXhlcyBidWcgIzkyMzcKCQkJCXR5cGUgPSAibnVtYmVyIjsKCQkJfQoKCQkJLy8gTWFrZSBzdXJlIHRoYXQgbnVsbCBhbmQgTmFOIHZhbHVlcyBhcmVuJ3Qgc2V0ICgjNzExNikKCQkJaWYgKCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlICE9PSB2YWx1ZSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJLy8gSWYgYSBudW1iZXIgd2FzIHBhc3NlZCBpbiwgYWRkIHRoZSB1bml0IChleGNlcHQgZm9yIGNlcnRhaW4gQ1NTIHByb3BlcnRpZXMpCgkJCWlmICggdHlwZSA9PT0gIm51bWJlciIgKSB7CgkJCQl2YWx1ZSArPSByZXQgJiYgcmV0WyAzIF0gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBvcmlnTmFtZSBdID8gIiIgOiAicHgiICk7CgkJCX0KCgkJCS8vIGJhY2tncm91bmQtKiBwcm9wcyBhZmZlY3Qgb3JpZ2luYWwgY2xvbmUncyB2YWx1ZXMKCQkJaWYgKCAhc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09ICIiICYmIG5hbWUuaW5kZXhPZiggImJhY2tncm91bmQiICkgPT09IDAgKSB7CgkJCQlzdHlsZVsgbmFtZSBdID0gImluaGVyaXQiOwoJCQl9CgoJCQkvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkLCB1c2UgdGhhdCB2YWx1ZSwgb3RoZXJ3aXNlIGp1c3Qgc2V0IHRoZSBzcGVjaWZpZWQgdmFsdWUKCQkJaWYgKCAhaG9va3MgfHwgISggInNldCIgaW4gaG9va3MgKSB8fAoJCQkJKCB2YWx1ZSA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCWlmICggaXNDdXN0b21Qcm9wICkgewoJCQkJCXN0eWxlLnNldFByb3BlcnR5KCBuYW1lLCB2YWx1ZSApOwoJCQkJfSBlbHNlIHsKCQkJCQlzdHlsZVsgbmFtZSBdID0gdmFsdWU7CgkJCQl9CgkJCX0KCgkJfSBlbHNlIHsKCgkJCS8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBub24tY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZQoJCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmCgkJCQkoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgZmFsc2UsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCXJldHVybiByZXQ7CgkJCX0KCgkJCS8vIE90aGVyd2lzZSBqdXN0IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgc3R5bGUgb2JqZWN0CgkJCXJldHVybiBzdHlsZVsgbmFtZSBdOwoJCX0KCX0sCgoJY3NzOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZXh0cmEsIHN0eWxlcyApIHsKCQl2YXIgdmFsLCBudW0sIGhvb2tzLAoJCQlvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLAoJCQlpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICk7CgoJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZS4gV2UgZG9uJ3QKCQkvLyB3YW50IHRvIG1vZGlmeSB0aGUgdmFsdWUgaWYgaXQgaXMgYSBDU1MgY3VzdG9tIHByb3BlcnR5CgkJLy8gc2luY2UgdGhleSBhcmUgdXNlci1kZWZpbmVkLgoJCWlmICggIWlzQ3VzdG9tUHJvcCApIHsKCQkJbmFtZSA9IGZpbmFsUHJvcE5hbWUoIG9yaWdOYW1lICk7CgkJfQoKCQkvLyBUcnkgcHJlZml4ZWQgbmFtZSBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCBuYW1lCgkJaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07CgoJCS8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlCgkJaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyApIHsKCQkJdmFsID0gaG9va3MuZ2V0KCBlbGVtLCB0cnVlLCBleHRyYSApOwoJCX0KCgkJLy8gT3RoZXJ3aXNlLCBpZiBhIHdheSB0byBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGV4aXN0cywgdXNlIHRoYXQKCQlpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkgewoJCQl2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0eWxlcyApOwoJCX0KCgkJLy8gQ29udmVydCAibm9ybWFsIiB0byBjb21wdXRlZCB2YWx1ZQoJCWlmICggdmFsID09PSAibm9ybWFsIiAmJiBuYW1lIGluIGNzc05vcm1hbFRyYW5zZm9ybSApIHsKCQkJdmFsID0gY3NzTm9ybWFsVHJhbnNmb3JtWyBuYW1lIF07CgkJfQoKCQkvLyBNYWtlIG51bWVyaWMgaWYgZm9yY2VkIG9yIGEgcXVhbGlmaWVyIHdhcyBwcm92aWRlZCBhbmQgdmFsIGxvb2tzIG51bWVyaWMKCQlpZiAoIGV4dHJhID09PSAiIiB8fCBleHRyYSApIHsKCQkJbnVtID0gcGFyc2VGbG9hdCggdmFsICk7CgkJCXJldHVybiBleHRyYSA9PT0gdHJ1ZSB8fCBpc0Zpbml0ZSggbnVtICkgPyBudW0gfHwgMCA6IHZhbDsKCQl9CgoJCXJldHVybiB2YWw7Cgl9Cn0gKTsKCmpRdWVyeS5lYWNoKCBbICJoZWlnaHQiLCAid2lkdGgiIF0sIGZ1bmN0aW9uKCBpLCBkaW1lbnNpb24gKSB7CglqUXVlcnkuY3NzSG9va3NbIGRpbWVuc2lvbiBdID0gewoJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHsKCQkJaWYgKCBjb21wdXRlZCApIHsKCgkJCQkvLyBDZXJ0YWluIGVsZW1lbnRzIGNhbiBoYXZlIGRpbWVuc2lvbiBpbmZvIGlmIHdlIGludmlzaWJseSBzaG93IHRoZW0KCQkJCS8vIGJ1dCBpdCBtdXN0IGhhdmUgYSBjdXJyZW50IGRpc3BsYXkgc3R5bGUgdGhhdCB3b3VsZCBiZW5lZml0CgkJCQlyZXR1cm4gcmRpc3BsYXlzd2FwLnRlc3QoIGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApICkgJiYKCgkJCQkJLy8gU3VwcG9ydDogU2FmYXJpIDgrCgkJCQkJLy8gVGFibGUgY29sdW1ucyBpbiBTYWZhcmkgaGF2ZSBub24temVybyBvZmZzZXRXaWR0aCAmIHplcm8KCQkJCQkvLyBnZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCB1bmxlc3MgZGlzcGxheSBpcyBjaGFuZ2VkLgoJCQkJCS8vIFN1cHBvcnQ6IElFIDw9MTEgb25seQoJCQkJCS8vIFJ1bm5pbmcgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IG9uIGEgZGlzY29ubmVjdGVkIG5vZGUKCQkJCQkvLyBpbiBJRSB0aHJvd3MgYW4gZXJyb3IuCgkJCQkJKCAhZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCB8fCAhZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCApID8KCQkJCQkJc3dhcCggZWxlbSwgY3NzU2hvdywgZnVuY3Rpb24oKSB7CgkJCQkJCQlyZXR1cm4gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgZGltZW5zaW9uLCBleHRyYSApOwoJCQkJCQl9ICkgOgoJCQkJCQlnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBkaW1lbnNpb24sIGV4dHJhICk7CgkJCX0KCQl9LAoKCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgZXh0cmEgKSB7CgkJCXZhciBtYXRjaGVzLAoJCQkJc3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksCgkJCQlpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sICJib3hTaXppbmciLCBmYWxzZSwgc3R5bGVzICkgPT09ICJib3JkZXItYm94IiwKCQkJCXN1YnRyYWN0ID0gZXh0cmEgJiYgYm94TW9kZWxBZGp1c3RtZW50KAoJCQkJCWVsZW0sCgkJCQkJZGltZW5zaW9uLAoJCQkJCWV4dHJhLAoJCQkJCWlzQm9yZGVyQm94LAoJCQkJCXN0eWxlcwoJCQkJKTsKCgkJCS8vIEFjY291bnQgZm9yIHVucmVsaWFibGUgYm9yZGVyLWJveCBkaW1lbnNpb25zIGJ5IGNvbXBhcmluZyBvZmZzZXQqIHRvIGNvbXB1dGVkIGFuZAoJCQkvLyBmYWtpbmcgYSBjb250ZW50LWJveCB0byBnZXQgYm9yZGVyIGFuZCBwYWRkaW5nIChnaC0zNjk5KQoJCQlpZiAoIGlzQm9yZGVyQm94ICYmIHN1cHBvcnQuc2Nyb2xsYm94U2l6ZSgpID09PSBzdHlsZXMucG9zaXRpb24gKSB7CgkJCQlzdWJ0cmFjdCAtPSBNYXRoLmNlaWwoCgkJCQkJZWxlbVsgIm9mZnNldCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtCgkJCQkJcGFyc2VGbG9hdCggc3R5bGVzWyBkaW1lbnNpb24gXSApIC0KCQkJCQlib3hNb2RlbEFkanVzdG1lbnQoIGVsZW0sIGRpbWVuc2lvbiwgImJvcmRlciIsIGZhbHNlLCBzdHlsZXMgKSAtCgkJCQkJMC41CgkJCQkpOwoJCQl9CgoJCQkvLyBDb252ZXJ0IHRvIHBpeGVscyBpZiB2YWx1ZSBhZGp1c3RtZW50IGlzIG5lZWRlZAoJCQlpZiAoIHN1YnRyYWN0ICYmICggbWF0Y2hlcyA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKSApICYmCgkJCQkoIG1hdGNoZXNbIDMgXSB8fCAicHgiICkgIT09ICJweCIgKSB7CgoJCQkJZWxlbS5zdHlsZVsgZGltZW5zaW9uIF0gPSB2YWx1ZTsKCQkJCXZhbHVlID0galF1ZXJ5LmNzcyggZWxlbSwgZGltZW5zaW9uICk7CgkJCX0KCgkJCXJldHVybiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICk7CgkJfQoJfTsKfSApOwoKalF1ZXJ5LmNzc0hvb2tzLm1hcmdpbkxlZnQgPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucmVsaWFibGVNYXJnaW5MZWZ0LAoJZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCWlmICggY29tcHV0ZWQgKSB7CgkJCXJldHVybiAoIHBhcnNlRmxvYXQoIGN1ckNTUyggZWxlbSwgIm1hcmdpbkxlZnQiICkgKSB8fAoJCQkJZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0KCQkJCQlzd2FwKCBlbGVtLCB7IG1hcmdpbkxlZnQ6IDAgfSwgZnVuY3Rpb24oKSB7CgkJCQkJCXJldHVybiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7CgkJCQkJfSApCgkJCQkpICsgInB4IjsKCQl9Cgl9Cik7CgovLyBUaGVzZSBob29rcyBhcmUgdXNlZCBieSBhbmltYXRlIHRvIGV4cGFuZCBwcm9wZXJ0aWVzCmpRdWVyeS5lYWNoKCB7CgltYXJnaW46ICIiLAoJcGFkZGluZzogIiIsCglib3JkZXI6ICJXaWR0aCIKfSwgZnVuY3Rpb24oIHByZWZpeCwgc3VmZml4ICkgewoJalF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXSA9IHsKCQlleHBhbmQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJdmFyIGkgPSAwLAoJCQkJZXhwYW5kZWQgPSB7fSwKCgkJCQkvLyBBc3N1bWVzIGEgc2luZ2xlIG51bWJlciBpZiBub3QgYSBzdHJpbmcKCQkJCXBhcnRzID0gdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiA/IHZhbHVlLnNwbGl0KCAiICIgKSA6IFsgdmFsdWUgXTsKCgkJCWZvciAoIDsgaSA8IDQ7IGkrKyApIHsKCQkJCWV4cGFuZGVkWyBwcmVmaXggKyBjc3NFeHBhbmRbIGkgXSArIHN1ZmZpeCBdID0KCQkJCQlwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBdIHx8IHBhcnRzWyAwIF07CgkJCX0KCgkJCXJldHVybiBleHBhbmRlZDsKCQl9Cgl9OwoKCWlmICggcHJlZml4ICE9PSAibWFyZ2luIiApIHsKCQlqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdLnNldCA9IHNldFBvc2l0aXZlTnVtYmVyOwoJfQp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7Cgljc3M6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKCQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7CgkJCXZhciBzdHlsZXMsIGxlbiwKCQkJCW1hcCA9IHt9LAoJCQkJaSA9IDA7CgoJCQlpZiAoIEFycmF5LmlzQXJyYXkoIG5hbWUgKSApIHsKCQkJCXN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApOwoJCQkJbGVuID0gbmFtZS5sZW5ndGg7CgoJCQkJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CgkJCQkJbWFwWyBuYW1lWyBpIF0gXSA9IGpRdWVyeS5jc3MoIGVsZW0sIG5hbWVbIGkgXSwgZmFsc2UsIHN0eWxlcyApOwoJCQkJfQoKCQkJCXJldHVybiBtYXA7CgkJCX0KCgkJCXJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8KCQkJCWpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6CgkJCQlqUXVlcnkuY3NzKCBlbGVtLCBuYW1lICk7CgkJfSwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7Cgl9Cn0gKTsKCgpmdW5jdGlvbiBUd2VlbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKSB7CglyZXR1cm4gbmV3IFR3ZWVuLnByb3RvdHlwZS5pbml0KCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApOwp9CmpRdWVyeS5Ud2VlbiA9IFR3ZWVuOwoKVHdlZW4ucHJvdG90eXBlID0gewoJY29uc3RydWN0b3I6IFR3ZWVuLAoJaW5pdDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nLCB1bml0ICkgewoJCXRoaXMuZWxlbSA9IGVsZW07CgkJdGhpcy5wcm9wID0gcHJvcDsKCQl0aGlzLmVhc2luZyA9IGVhc2luZyB8fCBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0OwoJCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkJdGhpcy5zdGFydCA9IHRoaXMubm93ID0gdGhpcy5jdXIoKTsKCQl0aGlzLmVuZCA9IGVuZDsKCQl0aGlzLnVuaXQgPSB1bml0IHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gIiIgOiAicHgiICk7Cgl9LAoJY3VyOiBmdW5jdGlvbigpIHsKCQl2YXIgaG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdOwoKCQlyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID8KCQkJaG9va3MuZ2V0KCB0aGlzICkgOgoJCQlUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KCB0aGlzICk7Cgl9LAoJcnVuOiBmdW5jdGlvbiggcGVyY2VudCApIHsKCQl2YXIgZWFzZWQsCgkJCWhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTsKCgkJaWYgKCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKSB7CgkJCXRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKAoJCQkJcGVyY2VudCwgdGhpcy5vcHRpb25zLmR1cmF0aW9uICogcGVyY2VudCwgMCwgMSwgdGhpcy5vcHRpb25zLmR1cmF0aW9uCgkJCSk7CgkJfSBlbHNlIHsKCQkJdGhpcy5wb3MgPSBlYXNlZCA9IHBlcmNlbnQ7CgkJfQoJCXRoaXMubm93ID0gKCB0aGlzLmVuZCAtIHRoaXMuc3RhcnQgKSAqIGVhc2VkICsgdGhpcy5zdGFydDsKCgkJaWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApIHsKCQkJdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApOwoJCX0KCgkJaWYgKCBob29rcyAmJiBob29rcy5zZXQgKSB7CgkJCWhvb2tzLnNldCggdGhpcyApOwoJCX0gZWxzZSB7CgkJCVR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTsKCQl9CgkJcmV0dXJuIHRoaXM7Cgl9Cn07CgpUd2Vlbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGUgPSBUd2Vlbi5wcm90b3R5cGU7CgpUd2Vlbi5wcm9wSG9va3MgPSB7CglfZGVmYXVsdDogewoJCWdldDogZnVuY3Rpb24oIHR3ZWVuICkgewoJCQl2YXIgcmVzdWx0OwoKCQkJLy8gVXNlIGEgcHJvcGVydHkgb24gdGhlIGVsZW1lbnQgZGlyZWN0bHkgd2hlbiBpdCBpcyBub3QgYSBET00gZWxlbWVudCwKCQkJLy8gb3Igd2hlbiB0aGVyZSBpcyBubyBtYXRjaGluZyBzdHlsZSBwcm9wZXJ0eSB0aGF0IGV4aXN0cy4KCQkJaWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlICE9PSAxIHx8CgkJCQl0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gIT0gbnVsbCAmJiB0d2Vlbi5lbGVtLnN0eWxlWyB0d2Vlbi5wcm9wIF0gPT0gbnVsbCApIHsKCQkJCXJldHVybiB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF07CgkJCX0KCgkJCS8vIFBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nIGFzIGEgM3JkIHBhcmFtZXRlciB0byAuY3NzIHdpbGwgYXV0b21hdGljYWxseQoJCQkvLyBhdHRlbXB0IGEgcGFyc2VGbG9hdCBhbmQgZmFsbGJhY2sgdG8gYSBzdHJpbmcgaWYgdGhlIHBhcnNlIGZhaWxzLgoJCQkvLyBTaW1wbGUgdmFsdWVzIHN1Y2ggYXMgIjEwcHgiIGFyZSBwYXJzZWQgdG8gRmxvYXQ7CgkJCS8vIGNvbXBsZXggdmFsdWVzIHN1Y2ggYXMgInJvdGF0ZSgxcmFkKSIgYXJlIHJldHVybmVkIGFzLWlzLgoJCQlyZXN1bHQgPSBqUXVlcnkuY3NzKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCAiIiApOwoKCQkJLy8gRW1wdHkgc3RyaW5ncywgbnVsbCwgdW5kZWZpbmVkIGFuZCAiYXV0byIgYXJlIGNvbnZlcnRlZCB0byAwLgoJCQlyZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09ICJhdXRvIiA/IDAgOiByZXN1bHQ7CgkJfSwKCQlzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHsKCgkJCS8vIFVzZSBzdGVwIGhvb2sgZm9yIGJhY2sgY29tcGF0LgoJCQkvLyBVc2UgY3NzSG9vayBpZiBpdHMgdGhlcmUuCgkJCS8vIFVzZSAuc3R5bGUgaWYgYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUuCgkJCWlmICggalF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSApIHsKCQkJCWpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0oIHR3ZWVuICk7CgkJCX0gZWxzZSBpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgPT09IDEgJiYKCQkJCSggdHdlZW4uZWxlbS5zdHlsZVsgalF1ZXJ5LmNzc1Byb3BzWyB0d2Vlbi5wcm9wIF0gXSAhPSBudWxsIHx8CgkJCQkJalF1ZXJ5LmNzc0hvb2tzWyB0d2Vlbi5wcm9wIF0gKSApIHsKCQkJCWpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgdHdlZW4ubm93ICsgdHdlZW4udW5pdCApOwoJCQl9IGVsc2UgewoJCQkJdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93OwoJCQl9CgkJfQoJfQp9OwoKLy8gU3VwcG9ydDogSUUgPD05IG9ubHkKLy8gUGFuaWMgYmFzZWQgYXBwcm9hY2ggdG8gc2V0dGluZyB0aGluZ3Mgb24gZGlzY29ubmVjdGVkIG5vZGVzClR3ZWVuLnByb3BIb29rcy5zY3JvbGxUb3AgPSBUd2Vlbi5wcm9wSG9va3Muc2Nyb2xsTGVmdCA9IHsKCXNldDogZnVuY3Rpb24oIHR3ZWVuICkgewoJCWlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7CgkJCXR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdzsKCQl9Cgl9Cn07CgpqUXVlcnkuZWFzaW5nID0gewoJbGluZWFyOiBmdW5jdGlvbiggcCApIHsKCQlyZXR1cm4gcDsKCX0sCglzd2luZzogZnVuY3Rpb24oIHAgKSB7CgkJcmV0dXJuIDAuNSAtIE1hdGguY29zKCBwICogTWF0aC5QSSApIC8gMjsKCX0sCglfZGVmYXVsdDogInN3aW5nIgp9OwoKalF1ZXJ5LmZ4ID0gVHdlZW4ucHJvdG90eXBlLmluaXQ7CgovLyBCYWNrIGNvbXBhdCA8MS44IGV4dGVuc2lvbiBwb2ludApqUXVlcnkuZnguc3RlcCA9IHt9OwoKCgoKdmFyCglmeE5vdywgaW5Qcm9ncmVzcywKCXJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLAoJcnJ1biA9IC9xdWV1ZUhvb2tzJC87CgpmdW5jdGlvbiBzY2hlZHVsZSgpIHsKCWlmICggaW5Qcm9ncmVzcyApIHsKCQlpZiAoIGRvY3VtZW50LmhpZGRlbiA9PT0gZmFsc2UgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSApIHsKCQkJd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSggc2NoZWR1bGUgKTsKCQl9IGVsc2UgewoJCQl3aW5kb3cuc2V0VGltZW91dCggc2NoZWR1bGUsIGpRdWVyeS5meC5pbnRlcnZhbCApOwoJCX0KCgkJalF1ZXJ5LmZ4LnRpY2soKTsKCX0KfQoKLy8gQW5pbWF0aW9ucyBjcmVhdGVkIHN5bmNocm9ub3VzbHkgd2lsbCBydW4gc3luY2hyb25vdXNseQpmdW5jdGlvbiBjcmVhdGVGeE5vdygpIHsKCXdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsKCQlmeE5vdyA9IHVuZGVmaW5lZDsKCX0gKTsKCXJldHVybiAoIGZ4Tm93ID0gRGF0ZS5ub3coKSApOwp9CgovLyBHZW5lcmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlvbgpmdW5jdGlvbiBnZW5GeCggdHlwZSwgaW5jbHVkZVdpZHRoICkgewoJdmFyIHdoaWNoLAoJCWkgPSAwLAoJCWF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfTsKCgkvLyBJZiB3ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4cGFuZCB2YWx1ZXMsCgkvLyBvdGhlcndpc2Ugc3RlcCB2YWx1ZSBpcyAyIHRvIHNraXAgb3ZlciBMZWZ0IGFuZCBSaWdodAoJaW5jbHVkZVdpZHRoID0gaW5jbHVkZVdpZHRoID8gMSA6IDA7Cglmb3IgKCA7IGkgPCA0OyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7CgkJd2hpY2ggPSBjc3NFeHBhbmRbIGkgXTsKCQlhdHRyc1sgIm1hcmdpbiIgKyB3aGljaCBdID0gYXR0cnNbICJwYWRkaW5nIiArIHdoaWNoIF0gPSB0eXBlOwoJfQoKCWlmICggaW5jbHVkZVdpZHRoICkgewoJCWF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7Cgl9CgoJcmV0dXJuIGF0dHJzOwp9CgpmdW5jdGlvbiBjcmVhdGVUd2VlbiggdmFsdWUsIHByb3AsIGFuaW1hdGlvbiApIHsKCXZhciB0d2VlbiwKCQljb2xsZWN0aW9uID0gKCBBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSB8fCBbXSApLmNvbmNhdCggQW5pbWF0aW9uLnR3ZWVuZXJzWyAiKiIgXSApLAoJCWluZGV4ID0gMCwKCQlsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDsKCWZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7CgkJaWYgKCAoIHR3ZWVuID0gY29sbGVjdGlvblsgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIHByb3AsIHZhbHVlICkgKSApIHsKCgkJCS8vIFdlJ3JlIGRvbmUgd2l0aCB0aGlzIHByb3BlcnR5CgkJCXJldHVybiB0d2VlbjsKCQl9Cgl9Cn0KCmZ1bmN0aW9uIGRlZmF1bHRQcmVmaWx0ZXIoIGVsZW0sIHByb3BzLCBvcHRzICkgewoJdmFyIHByb3AsIHZhbHVlLCB0b2dnbGUsIGhvb2tzLCBvbGRmaXJlLCBwcm9wVHdlZW4sIHJlc3RvcmVEaXNwbGF5LCBkaXNwbGF5LAoJCWlzQm94ID0gIndpZHRoIiBpbiBwcm9wcyB8fCAiaGVpZ2h0IiBpbiBwcm9wcywKCQlhbmltID0gdGhpcywKCQlvcmlnID0ge30sCgkJc3R5bGUgPSBlbGVtLnN0eWxlLAoJCWhpZGRlbiA9IGVsZW0ubm9kZVR5cGUgJiYgaXNIaWRkZW5XaXRoaW5UcmVlKCBlbGVtICksCgkJZGF0YVNob3cgPSBkYXRhUHJpdi5nZXQoIGVsZW0sICJmeHNob3ciICk7CgoJLy8gUXVldWUtc2tpcHBpbmcgYW5pbWF0aW9ucyBoaWphY2sgdGhlIGZ4IGhvb2tzCglpZiAoICFvcHRzLnF1ZXVlICkgewoJCWhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCAiZngiICk7CgkJaWYgKCBob29rcy51bnF1ZXVlZCA9PSBudWxsICkgewoJCQlob29rcy51bnF1ZXVlZCA9IDA7CgkJCW9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlOwoJCQlob29rcy5lbXB0eS5maXJlID0gZnVuY3Rpb24oKSB7CgkJCQlpZiAoICFob29rcy51bnF1ZXVlZCApIHsKCQkJCQlvbGRmaXJlKCk7CgkJCQl9CgkJCX07CgkJfQoJCWhvb2tzLnVucXVldWVkKys7CgoJCWFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHsKCgkJCS8vIEVuc3VyZSB0aGUgY29tcGxldGUgaGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgY29tcGxldGVzCgkJCWFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHsKCQkJCWhvb2tzLnVucXVldWVkLS07CgkJCQlpZiAoICFqUXVlcnkucXVldWUoIGVsZW0sICJmeCIgKS5sZW5ndGggKSB7CgkJCQkJaG9va3MuZW1wdHkuZmlyZSgpOwoJCQkJfQoJCQl9ICk7CgkJfSApOwoJfQoKCS8vIERldGVjdCBzaG93L2hpZGUgYW5pbWF0aW9ucwoJZm9yICggcHJvcCBpbiBwcm9wcyApIHsKCQl2YWx1ZSA9IHByb3BzWyBwcm9wIF07CgkJaWYgKCByZnh0eXBlcy50ZXN0KCB2YWx1ZSApICkgewoJCQlkZWxldGUgcHJvcHNbIHByb3AgXTsKCQkJdG9nZ2xlID0gdG9nZ2xlIHx8IHZhbHVlID09PSAidG9nZ2xlIjsKCQkJaWYgKCB2YWx1ZSA9PT0gKCBoaWRkZW4gPyAiaGlkZSIgOiAic2hvdyIgKSApIHsKCgkJCQkvLyBQcmV0ZW5kIHRvIGJlIGhpZGRlbiBpZiB0aGlzIGlzIGEgInNob3ciIGFuZAoJCQkJLy8gdGhlcmUgaXMgc3RpbGwgZGF0YSBmcm9tIGEgc3RvcHBlZCBzaG93L2hpZGUKCQkJCWlmICggdmFsdWUgPT09ICJzaG93IiAmJiBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJaGlkZGVuID0gdHJ1ZTsKCgkJCQkvLyBJZ25vcmUgYWxsIG90aGVyIG5vLW9wIHNob3cvaGlkZSBkYXRhCgkJCQl9IGVsc2UgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQl9CgkJCW9yaWdbIHByb3AgXSA9IGRhdGFTaG93ICYmIGRhdGFTaG93WyBwcm9wIF0gfHwgalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wICk7CgkJfQoJfQoKCS8vIEJhaWwgb3V0IGlmIHRoaXMgaXMgYSBuby1vcCBsaWtlIC5oaWRlKCkuaGlkZSgpCglwcm9wVHdlZW4gPSAhalF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3BzICk7CglpZiAoICFwcm9wVHdlZW4gJiYgalF1ZXJ5LmlzRW1wdHlPYmplY3QoIG9yaWcgKSApIHsKCQlyZXR1cm47Cgl9CgoJLy8gUmVzdHJpY3QgIm92ZXJmbG93IiBhbmQgImRpc3BsYXkiIHN0eWxlcyBkdXJpbmcgYm94IGFuaW1hdGlvbnMKCWlmICggaXNCb3ggJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCgkJLy8gU3VwcG9ydDogSUUgPD05IC0gMTEsIEVkZ2UgMTIgLSAxNQoJCS8vIFJlY29yZCBhbGwgMyBvdmVyZmxvdyBhdHRyaWJ1dGVzIGJlY2F1c2UgSUUgZG9lcyBub3QgaW5mZXIgdGhlIHNob3J0aGFuZAoJCS8vIGZyb20gaWRlbnRpY2FsbHktdmFsdWVkIG92ZXJmbG93WCBhbmQgb3ZlcmZsb3dZIGFuZCBFZGdlIGp1c3QgbWlycm9ycwoJCS8vIHRoZSBvdmVyZmxvd1ggdmFsdWUgdGhlcmUuCgkJb3B0cy5vdmVyZmxvdyA9IFsgc3R5bGUub3ZlcmZsb3csIHN0eWxlLm92ZXJmbG93WCwgc3R5bGUub3ZlcmZsb3dZIF07CgoJCS8vIElkZW50aWZ5IGEgZGlzcGxheSB0eXBlLCBwcmVmZXJyaW5nIG9sZCBzaG93L2hpZGUgZGF0YSBvdmVyIHRoZSBDU1MgY2FzY2FkZQoJCXJlc3RvcmVEaXNwbGF5ID0gZGF0YVNob3cgJiYgZGF0YVNob3cuZGlzcGxheTsKCQlpZiAoIHJlc3RvcmVEaXNwbGF5ID09IG51bGwgKSB7CgkJCXJlc3RvcmVEaXNwbGF5ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCAiZGlzcGxheSIgKTsKCQl9CgkJZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApOwoJCWlmICggZGlzcGxheSA9PT0gIm5vbmUiICkgewoJCQlpZiAoIHJlc3RvcmVEaXNwbGF5ICkgewoJCQkJZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5OwoJCQl9IGVsc2UgewoKCQkJCS8vIEdldCBub25lbXB0eSB2YWx1ZShzKSBieSB0ZW1wb3JhcmlseSBmb3JjaW5nIHZpc2liaWxpdHkKCQkJCXNob3dIaWRlKCBbIGVsZW0gXSwgdHJ1ZSApOwoJCQkJcmVzdG9yZURpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXkgfHwgcmVzdG9yZURpc3BsYXk7CgkJCQlkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICk7CgkJCQlzaG93SGlkZSggWyBlbGVtIF0gKTsKCQkJfQoJCX0KCgkJLy8gQW5pbWF0ZSBpbmxpbmUgZWxlbWVudHMgYXMgaW5saW5lLWJsb2NrCgkJaWYgKCBkaXNwbGF5ID09PSAiaW5saW5lIiB8fCBkaXNwbGF5ID09PSAiaW5saW5lLWJsb2NrIiAmJiByZXN0b3JlRGlzcGxheSAhPSBudWxsICkgewoJCQlpZiAoIGpRdWVyeS5jc3MoIGVsZW0sICJmbG9hdCIgKSA9PT0gIm5vbmUiICkgewoKCQkJCS8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIGRpc3BsYXkgdmFsdWUgYXQgdGhlIGVuZCBvZiBwdXJlIHNob3cvaGlkZSBhbmltYXRpb25zCgkJCQlpZiAoICFwcm9wVHdlZW4gKSB7CgkJCQkJYW5pbS5kb25lKCBmdW5jdGlvbigpIHsKCQkJCQkJc3R5bGUuZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5OwoJCQkJCX0gKTsKCQkJCQlpZiAoIHJlc3RvcmVEaXNwbGF5ID09IG51bGwgKSB7CgkJCQkJCWRpc3BsYXkgPSBzdHlsZS5kaXNwbGF5OwoJCQkJCQlyZXN0b3JlRGlzcGxheSA9IGRpc3BsYXkgPT09ICJub25lIiA/ICIiIDogZGlzcGxheTsKCQkJCQl9CgkJCQl9CgkJCQlzdHlsZS5kaXNwbGF5ID0gImlubGluZS1ibG9jayI7CgkJCX0KCQl9Cgl9CgoJaWYgKCBvcHRzLm92ZXJmbG93ICkgewoJCXN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CgkJYW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkgewoJCQlzdHlsZS5vdmVyZmxvdyA9IG9wdHMub3ZlcmZsb3dbIDAgXTsKCQkJc3R5bGUub3ZlcmZsb3dYID0gb3B0cy5vdmVyZmxvd1sgMSBdOwoJCQlzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07CgkJfSApOwoJfQoKCS8vIEltcGxlbWVudCBzaG93L2hpZGUgYW5pbWF0aW9ucwoJcHJvcFR3ZWVuID0gZmFsc2U7Cglmb3IgKCBwcm9wIGluIG9yaWcgKSB7CgoJCS8vIEdlbmVyYWwgc2hvdy9oaWRlIHNldHVwIGZvciB0aGlzIGVsZW1lbnQgYW5pbWF0aW9uCgkJaWYgKCAhcHJvcFR3ZWVuICkgewoJCQlpZiAoIGRhdGFTaG93ICkgewoJCQkJaWYgKCAiaGlkZGVuIiBpbiBkYXRhU2hvdyApIHsKCQkJCQloaWRkZW4gPSBkYXRhU2hvdy5oaWRkZW47CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlkYXRhU2hvdyA9IGRhdGFQcml2LmFjY2VzcyggZWxlbSwgImZ4c2hvdyIsIHsgZGlzcGxheTogcmVzdG9yZURpc3BsYXkgfSApOwoJCQl9CgoJCQkvLyBTdG9yZSBoaWRkZW4vdmlzaWJsZSBmb3IgdG9nZ2xlIHNvIGAuc3RvcCgpLnRvZ2dsZSgpYCAicmV2ZXJzZXMiCgkJCWlmICggdG9nZ2xlICkgewoJCQkJZGF0YVNob3cuaGlkZGVuID0gIWhpZGRlbjsKCQkJfQoKCQkJLy8gU2hvdyBlbGVtZW50cyBiZWZvcmUgYW5pbWF0aW5nIHRoZW0KCQkJaWYgKCBoaWRkZW4gKSB7CgkJCQlzaG93SGlkZSggWyBlbGVtIF0sIHRydWUgKTsKCQkJfQoKCQkJLyogZXNsaW50LWRpc2FibGUgbm8tbG9vcC1mdW5jICovCgoJCQlhbmltLmRvbmUoIGZ1bmN0aW9uKCkgewoKCQkJLyogZXNsaW50LWVuYWJsZSBuby1sb29wLWZ1bmMgKi8KCgkJCQkvLyBUaGUgZmluYWwgc3RlcCBvZiBhICJoaWRlIiBhbmltYXRpb24gaXMgYWN0dWFsbHkgaGlkaW5nIHRoZSBlbGVtZW50CgkJCQlpZiAoICFoaWRkZW4gKSB7CgkJCQkJc2hvd0hpZGUoIFsgZWxlbSBdICk7CgkJCQl9CgkJCQlkYXRhUHJpdi5yZW1vdmUoIGVsZW0sICJmeHNob3ciICk7CgkJCQlmb3IgKCBwcm9wIGluIG9yaWcgKSB7CgkJCQkJalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBvcmlnWyBwcm9wIF0gKTsKCQkJCX0KCQkJfSApOwoJCX0KCgkJLy8gUGVyLXByb3BlcnR5IHNldHVwCgkJcHJvcFR3ZWVuID0gY3JlYXRlVHdlZW4oIGhpZGRlbiA/IGRhdGFTaG93WyBwcm9wIF0gOiAwLCBwcm9wLCBhbmltICk7CgkJaWYgKCAhKCBwcm9wIGluIGRhdGFTaG93ICkgKSB7CgkJCWRhdGFTaG93WyBwcm9wIF0gPSBwcm9wVHdlZW4uc3RhcnQ7CgkJCWlmICggaGlkZGVuICkgewoJCQkJcHJvcFR3ZWVuLmVuZCA9IHByb3BUd2Vlbi5zdGFydDsKCQkJCXByb3BUd2Vlbi5zdGFydCA9IDA7CgkJCX0KCQl9Cgl9Cn0KCmZ1bmN0aW9uIHByb3BGaWx0ZXIoIHByb3BzLCBzcGVjaWFsRWFzaW5nICkgewoJdmFyIGluZGV4LCBuYW1lLCBlYXNpbmcsIHZhbHVlLCBob29rczsKCgkvLyBjYW1lbENhc2UsIHNwZWNpYWxFYXNpbmcgYW5kIGV4cGFuZCBjc3NIb29rIHBhc3MKCWZvciAoIGluZGV4IGluIHByb3BzICkgewoJCW5hbWUgPSBjYW1lbENhc2UoIGluZGV4ICk7CgkJZWFzaW5nID0gc3BlY2lhbEVhc2luZ1sgbmFtZSBdOwoJCXZhbHVlID0gcHJvcHNbIGluZGV4IF07CgkJaWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkgewoJCQllYXNpbmcgPSB2YWx1ZVsgMSBdOwoJCQl2YWx1ZSA9IHByb3BzWyBpbmRleCBdID0gdmFsdWVbIDAgXTsKCQl9CgoJCWlmICggaW5kZXggIT09IG5hbWUgKSB7CgkJCXByb3BzWyBuYW1lIF0gPSB2YWx1ZTsKCQkJZGVsZXRlIHByb3BzWyBpbmRleCBdOwoJCX0KCgkJaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXTsKCQlpZiAoIGhvb2tzICYmICJleHBhbmQiIGluIGhvb2tzICkgewoJCQl2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTsKCQkJZGVsZXRlIHByb3BzWyBuYW1lIF07CgoJCQkvLyBOb3QgcXVpdGUgJC5leHRlbmQsIHRoaXMgd29uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGtleXMuCgkJCS8vIFJldXNpbmcgJ2luZGV4JyBiZWNhdXNlIHdlIGhhdmUgdGhlIGNvcnJlY3QgIm5hbWUiCgkJCWZvciAoIGluZGV4IGluIHZhbHVlICkgewoJCQkJaWYgKCAhKCBpbmRleCBpbiBwcm9wcyApICkgewoJCQkJCXByb3BzWyBpbmRleCBdID0gdmFsdWVbIGluZGV4IF07CgkJCQkJc3BlY2lhbEVhc2luZ1sgaW5kZXggXSA9IGVhc2luZzsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCXNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZzsKCQl9Cgl9Cn0KCmZ1bmN0aW9uIEFuaW1hdGlvbiggZWxlbSwgcHJvcGVydGllcywgb3B0aW9ucyApIHsKCXZhciByZXN1bHQsCgkJc3RvcHBlZCwKCQlpbmRleCA9IDAsCgkJbGVuZ3RoID0gQW5pbWF0aW9uLnByZWZpbHRlcnMubGVuZ3RoLAoJCWRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCkuYWx3YXlzKCBmdW5jdGlvbigpIHsKCgkJCS8vIERvbid0IG1hdGNoIGVsZW0gaW4gdGhlIDphbmltYXRlZCBzZWxlY3RvcgoJCQlkZWxldGUgdGljay5lbGVtOwoJCX0gKSwKCQl0aWNrID0gZnVuY3Rpb24oKSB7CgkJCWlmICggc3RvcHBlZCApIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQl2YXIgY3VycmVudFRpbWUgPSBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLAoJCQkJcmVtYWluaW5nID0gTWF0aC5tYXgoIDAsIGFuaW1hdGlvbi5zdGFydFRpbWUgKyBhbmltYXRpb24uZHVyYXRpb24gLSBjdXJyZW50VGltZSApLAoKCQkJCS8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zIG9ubHkKCQkJCS8vIEFyY2hhaWMgY3Jhc2ggYnVnIHdvbid0IGFsbG93IHVzIHRvIHVzZSBgMSAtICggMC41IHx8IDAgKWAgKCMxMjQ5NykKCQkJCXRlbXAgPSByZW1haW5pbmcgLyBhbmltYXRpb24uZHVyYXRpb24gfHwgMCwKCQkJCXBlcmNlbnQgPSAxIC0gdGVtcCwKCQkJCWluZGV4ID0gMCwKCQkJCWxlbmd0aCA9IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoOwoKCQkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQkJCWFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCBwZXJjZW50ICk7CgkJCX0KCgkJCWRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBwZXJjZW50LCByZW1haW5pbmcgXSApOwoKCQkJLy8gSWYgdGhlcmUncyBtb3JlIHRvIGRvLCB5aWVsZAoJCQlpZiAoIHBlcmNlbnQgPCAxICYmIGxlbmd0aCApIHsKCQkJCXJldHVybiByZW1haW5pbmc7CgkJCX0KCgkJCS8vIElmIHRoaXMgd2FzIGFuIGVtcHR5IGFuaW1hdGlvbiwgc3ludGhlc2l6ZSBhIGZpbmFsIHByb2dyZXNzIG5vdGlmaWNhdGlvbgoJCQlpZiAoICFsZW5ndGggKSB7CgkJCQlkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgMSwgMCBdICk7CgkJCX0KCgkJCS8vIFJlc29sdmUgdGhlIGFuaW1hdGlvbiBhbmQgcmVwb3J0IGl0cyBjb25jbHVzaW9uCgkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiBdICk7CgkJCXJldHVybiBmYWxzZTsKCQl9LAoJCWFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2UoIHsKCQkJZWxlbTogZWxlbSwKCQkJcHJvcHM6IGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wZXJ0aWVzICksCgkJCW9wdHM6IGpRdWVyeS5leHRlbmQoIHRydWUsIHsKCQkJCXNwZWNpYWxFYXNpbmc6IHt9LAoJCQkJZWFzaW5nOiBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0CgkJCX0sIG9wdGlvbnMgKSwKCQkJb3JpZ2luYWxQcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLAoJCQlvcmlnaW5hbE9wdGlvbnM6IG9wdGlvbnMsCgkJCXN0YXJ0VGltZTogZnhOb3cgfHwgY3JlYXRlRnhOb3coKSwKCQkJZHVyYXRpb246IG9wdGlvbnMuZHVyYXRpb24sCgkJCXR3ZWVuczogW10sCgkJCWNyZWF0ZVR3ZWVuOiBmdW5jdGlvbiggcHJvcCwgZW5kICkgewoJCQkJdmFyIHR3ZWVuID0galF1ZXJ5LlR3ZWVuKCBlbGVtLCBhbmltYXRpb24ub3B0cywgcHJvcCwgZW5kLAoJCQkJCQlhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nWyBwcm9wIF0gfHwgYW5pbWF0aW9uLm9wdHMuZWFzaW5nICk7CgkJCQlhbmltYXRpb24udHdlZW5zLnB1c2goIHR3ZWVuICk7CgkJCQlyZXR1cm4gdHdlZW47CgkJCX0sCgkJCXN0b3A6IGZ1bmN0aW9uKCBnb3RvRW5kICkgewoJCQkJdmFyIGluZGV4ID0gMCwKCgkJCQkJLy8gSWYgd2UgYXJlIGdvaW5nIHRvIHRoZSBlbmQsIHdlIHdhbnQgdG8gcnVuIGFsbCB0aGUgdHdlZW5zCgkJCQkJLy8gb3RoZXJ3aXNlIHdlIHNraXAgdGhpcyBwYXJ0CgkJCQkJbGVuZ3RoID0gZ290b0VuZCA/IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoIDogMDsKCQkJCWlmICggc3RvcHBlZCApIHsKCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0KCQkJCXN0b3BwZWQgPSB0cnVlOwoJCQkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQkJCQlhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggMSApOwoJCQkJfQoKCQkJCS8vIFJlc29sdmUgd2hlbiB3ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWU7IG90aGVyd2lzZSwgcmVqZWN0CgkJCQlpZiAoIGdvdG9FbmQgKSB7CgkJCQkJZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApOwoJCQkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7CgkJCQl9IGVsc2UgewoJCQkJCWRlZmVycmVkLnJlamVjdFdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTsKCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9CgkJfSApLAoJCXByb3BzID0gYW5pbWF0aW9uLnByb3BzOwoKCXByb3BGaWx0ZXIoIHByb3BzLCBhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nICk7CgoJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQlyZXN1bHQgPSBBbmltYXRpb24ucHJlZmlsdGVyc1sgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIGVsZW0sIHByb3BzLCBhbmltYXRpb24ub3B0cyApOwoJCWlmICggcmVzdWx0ICkgewoJCQlpZiAoIGlzRnVuY3Rpb24oIHJlc3VsdC5zdG9wICkgKSB7CgkJCQlqUXVlcnkuX3F1ZXVlSG9va3MoIGFuaW1hdGlvbi5lbGVtLCBhbmltYXRpb24ub3B0cy5xdWV1ZSApLnN0b3AgPQoJCQkJCXJlc3VsdC5zdG9wLmJpbmQoIHJlc3VsdCApOwoJCQl9CgkJCXJldHVybiByZXN1bHQ7CgkJfQoJfQoKCWpRdWVyeS5tYXAoIHByb3BzLCBjcmVhdGVUd2VlbiwgYW5pbWF0aW9uICk7CgoJaWYgKCBpc0Z1bmN0aW9uKCBhbmltYXRpb24ub3B0cy5zdGFydCApICkgewoJCWFuaW1hdGlvbi5vcHRzLnN0YXJ0LmNhbGwoIGVsZW0sIGFuaW1hdGlvbiApOwoJfQoKCS8vIEF0dGFjaCBjYWxsYmFja3MgZnJvbSBvcHRpb25zCglhbmltYXRpb24KCQkucHJvZ3Jlc3MoIGFuaW1hdGlvbi5vcHRzLnByb2dyZXNzICkKCQkuZG9uZSggYW5pbWF0aW9uLm9wdHMuZG9uZSwgYW5pbWF0aW9uLm9wdHMuY29tcGxldGUgKQoJCS5mYWlsKCBhbmltYXRpb24ub3B0cy5mYWlsICkKCQkuYWx3YXlzKCBhbmltYXRpb24ub3B0cy5hbHdheXMgKTsKCglqUXVlcnkuZngudGltZXIoCgkJalF1ZXJ5LmV4dGVuZCggdGljaywgewoJCQllbGVtOiBlbGVtLAoJCQlhbmltOiBhbmltYXRpb24sCgkJCXF1ZXVlOiBhbmltYXRpb24ub3B0cy5xdWV1ZQoJCX0gKQoJKTsKCglyZXR1cm4gYW5pbWF0aW9uOwp9CgpqUXVlcnkuQW5pbWF0aW9uID0galF1ZXJ5LmV4dGVuZCggQW5pbWF0aW9uLCB7CgoJdHdlZW5lcnM6IHsKCQkiKiI6IFsgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkgewoJCQl2YXIgdHdlZW4gPSB0aGlzLmNyZWF0ZVR3ZWVuKCBwcm9wLCB2YWx1ZSApOwoJCQlhZGp1c3RDU1MoIHR3ZWVuLmVsZW0sIHByb3AsIHJjc3NOdW0uZXhlYyggdmFsdWUgKSwgdHdlZW4gKTsKCQkJcmV0dXJuIHR3ZWVuOwoJCX0gXQoJfSwKCgl0d2VlbmVyOiBmdW5jdGlvbiggcHJvcHMsIGNhbGxiYWNrICkgewoJCWlmICggaXNGdW5jdGlvbiggcHJvcHMgKSApIHsKCQkJY2FsbGJhY2sgPSBwcm9wczsKCQkJcHJvcHMgPSBbICIqIiBdOwoJCX0gZWxzZSB7CgkJCXByb3BzID0gcHJvcHMubWF0Y2goIHJub3RodG1sd2hpdGUgKTsKCQl9CgoJCXZhciBwcm9wLAoJCQlpbmRleCA9IDAsCgkJCWxlbmd0aCA9IHByb3BzLmxlbmd0aDsKCgkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQkJcHJvcCA9IHByb3BzWyBpbmRleCBdOwoJCQlBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSA9IEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdIHx8IFtdOwoJCQlBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXS51bnNoaWZ0KCBjYWxsYmFjayApOwoJCX0KCX0sCgoJcHJlZmlsdGVyczogWyBkZWZhdWx0UHJlZmlsdGVyIF0sCgoJcHJlZmlsdGVyOiBmdW5jdGlvbiggY2FsbGJhY2ssIHByZXBlbmQgKSB7CgkJaWYgKCBwcmVwZW5kICkgewoJCQlBbmltYXRpb24ucHJlZmlsdGVycy51bnNoaWZ0KCBjYWxsYmFjayApOwoJCX0gZWxzZSB7CgkJCUFuaW1hdGlvbi5wcmVmaWx0ZXJzLnB1c2goIGNhbGxiYWNrICk7CgkJfQoJfQp9ICk7CgpqUXVlcnkuc3BlZWQgPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgZm4gKSB7Cgl2YXIgb3B0ID0gc3BlZWQgJiYgdHlwZW9mIHNwZWVkID09PSAib2JqZWN0IiA/IGpRdWVyeS5leHRlbmQoIHt9LCBzcGVlZCApIDogewoJCWNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8CgkJCWlzRnVuY3Rpb24oIHNwZWVkICkgJiYgc3BlZWQsCgkJZHVyYXRpb246IHNwZWVkLAoJCWVhc2luZzogZm4gJiYgZWFzaW5nIHx8IGVhc2luZyAmJiAhaXNGdW5jdGlvbiggZWFzaW5nICkgJiYgZWFzaW5nCgl9OwoKCS8vIEdvIHRvIHRoZSBlbmQgc3RhdGUgaWYgZnggYXJlIG9mZgoJaWYgKCBqUXVlcnkuZngub2ZmICkgewoJCW9wdC5kdXJhdGlvbiA9IDA7CgoJfSBlbHNlIHsKCQlpZiAoIHR5cGVvZiBvcHQuZHVyYXRpb24gIT09ICJudW1iZXIiICkgewoJCQlpZiAoIG9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRzICkgewoJCQkJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4LnNwZWVkc1sgb3B0LmR1cmF0aW9uIF07CgoJCQl9IGVsc2UgewoJCQkJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDsKCQkJfQoJCX0KCX0KCgkvLyBOb3JtYWxpemUgb3B0LnF1ZXVlIC0gdHJ1ZS91bmRlZmluZWQvbnVsbCAtPiAiZngiCglpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9wdC5xdWV1ZSA9PT0gdHJ1ZSApIHsKCQlvcHQucXVldWUgPSAiZngiOwoJfQoKCS8vIFF1ZXVlaW5nCglvcHQub2xkID0gb3B0LmNvbXBsZXRlOwoKCW9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkgewoJCWlmICggaXNGdW5jdGlvbiggb3B0Lm9sZCApICkgewoJCQlvcHQub2xkLmNhbGwoIHRoaXMgKTsKCQl9CgoJCWlmICggb3B0LnF1ZXVlICkgewoJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgb3B0LnF1ZXVlICk7CgkJfQoJfTsKCglyZXR1cm4gb3B0Owp9OwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJZmFkZVRvOiBmdW5jdGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkgewoKCQkvLyBTaG93IGFueSBoaWRkZW4gZWxlbWVudHMgYWZ0ZXIgc2V0dGluZyBvcGFjaXR5IHRvIDAKCQlyZXR1cm4gdGhpcy5maWx0ZXIoIGlzSGlkZGVuV2l0aGluVHJlZSApLmNzcyggIm9wYWNpdHkiLCAwICkuc2hvdygpCgoJCQkvLyBBbmltYXRlIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQKCQkJLmVuZCgpLmFuaW1hdGUoIHsgb3BhY2l0eTogdG8gfSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTsKCX0sCglhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7CgkJdmFyIGVtcHR5ID0galF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3AgKSwKCQkJb3B0YWxsID0galF1ZXJ5LnNwZWVkKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApLAoJCQlkb0FuaW1hdGlvbiA9IGZ1bmN0aW9uKCkgewoKCQkJCS8vIE9wZXJhdGUgb24gYSBjb3B5IG9mIHByb3Agc28gcGVyLXByb3BlcnR5IGVhc2luZyB3b24ndCBiZSBsb3N0CgkJCQl2YXIgYW5pbSA9IEFuaW1hdGlvbiggdGhpcywgalF1ZXJ5LmV4dGVuZCgge30sIHByb3AgKSwgb3B0YWxsICk7CgoJCQkJLy8gRW1wdHkgYW5pbWF0aW9ucywgb3IgZmluaXNoaW5nIHJlc29sdmVzIGltbWVkaWF0ZWx5CgkJCQlpZiAoIGVtcHR5IHx8IGRhdGFQcml2LmdldCggdGhpcywgImZpbmlzaCIgKSApIHsKCQkJCQlhbmltLnN0b3AoIHRydWUgKTsKCQkJCX0KCQkJfTsKCQkJZG9BbmltYXRpb24uZmluaXNoID0gZG9BbmltYXRpb247CgoJCXJldHVybiBlbXB0eSB8fCBvcHRhbGwucXVldWUgPT09IGZhbHNlID8KCQkJdGhpcy5lYWNoKCBkb0FuaW1hdGlvbiApIDoKCQkJdGhpcy5xdWV1ZSggb3B0YWxsLnF1ZXVlLCBkb0FuaW1hdGlvbiApOwoJfSwKCXN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5kICkgewoJCXZhciBzdG9wUXVldWUgPSBmdW5jdGlvbiggaG9va3MgKSB7CgkJCXZhciBzdG9wID0gaG9va3Muc3RvcDsKCQkJZGVsZXRlIGhvb2tzLnN0b3A7CgkJCXN0b3AoIGdvdG9FbmQgKTsKCQl9OwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJZ290b0VuZCA9IGNsZWFyUXVldWU7CgkJCWNsZWFyUXVldWUgPSB0eXBlOwoJCQl0eXBlID0gdW5kZWZpbmVkOwoJCX0KCQlpZiAoIGNsZWFyUXVldWUgJiYgdHlwZSAhPT0gZmFsc2UgKSB7CgkJCXRoaXMucXVldWUoIHR5cGUgfHwgImZ4IiwgW10gKTsKCQl9CgoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQl2YXIgZGVxdWV1ZSA9IHRydWUsCgkJCQlpbmRleCA9IHR5cGUgIT0gbnVsbCAmJiB0eXBlICsgInF1ZXVlSG9va3MiLAoJCQkJdGltZXJzID0galF1ZXJ5LnRpbWVycywKCQkJCWRhdGEgPSBkYXRhUHJpdi5nZXQoIHRoaXMgKTsKCgkJCWlmICggaW5kZXggKSB7CgkJCQlpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICkgewoJCQkJCXN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJZm9yICggaW5kZXggaW4gZGF0YSApIHsKCQkJCQlpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICYmIHJydW4udGVzdCggaW5kZXggKSApIHsKCQkJCQkJc3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQlmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkgewoJCQkJaWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJgoJCQkJCSggdHlwZSA9PSBudWxsIHx8IHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApICkgewoKCQkJCQl0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCBnb3RvRW5kICk7CgkJCQkJZGVxdWV1ZSA9IGZhbHNlOwoJCQkJCXRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7CgkJCQl9CgkJCX0KCgkJCS8vIFN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQuCgkJCS8vIFRpbWVycyBjdXJyZW50bHkgd2lsbCBjYWxsIHRoZWlyIGNvbXBsZXRlIGNhbGxiYWNrcywgd2hpY2gKCQkJLy8gd2lsbCBkZXF1ZXVlIGJ1dCBvbmx5IGlmIHRoZXkgd2VyZSBnb3RvRW5kLgoJCQlpZiAoIGRlcXVldWUgfHwgIWdvdG9FbmQgKSB7CgkJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOwoJCQl9CgkJfSApOwoJfSwKCWZpbmlzaDogZnVuY3Rpb24oIHR5cGUgKSB7CgkJaWYgKCB0eXBlICE9PSBmYWxzZSApIHsKCQkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCQl9CgkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCXZhciBpbmRleCwKCQkJCWRhdGEgPSBkYXRhUHJpdi5nZXQoIHRoaXMgKSwKCQkJCXF1ZXVlID0gZGF0YVsgdHlwZSArICJxdWV1ZSIgXSwKCQkJCWhvb2tzID0gZGF0YVsgdHlwZSArICJxdWV1ZUhvb2tzIiBdLAoJCQkJdGltZXJzID0galF1ZXJ5LnRpbWVycywKCQkJCWxlbmd0aCA9IHF1ZXVlID8gcXVldWUubGVuZ3RoIDogMDsKCgkJCS8vIEVuYWJsZSBmaW5pc2hpbmcgZmxhZyBvbiBwcml2YXRlIGRhdGEKCQkJZGF0YS5maW5pc2ggPSB0cnVlOwoKCQkJLy8gRW1wdHkgdGhlIHF1ZXVlIGZpcnN0CgkJCWpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgW10gKTsKCgkJCWlmICggaG9va3MgJiYgaG9va3Muc3RvcCApIHsKCQkJCWhvb2tzLnN0b3AuY2FsbCggdGhpcywgdHJ1ZSApOwoJCQl9CgoJCQkvLyBMb29rIGZvciBhbnkgYWN0aXZlIGFuaW1hdGlvbnMsIGFuZCBmaW5pc2ggdGhlbQoJCQlmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkgewoJCQkJaWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJiB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSB7CgkJCQkJdGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggdHJ1ZSApOwoJCQkJCXRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7CgkJCQl9CgkJCX0KCgkJCS8vIExvb2sgZm9yIGFueSBhbmltYXRpb25zIGluIHRoZSBvbGQgcXVldWUgYW5kIGZpbmlzaCB0aGVtCgkJCWZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7CgkJCQlpZiAoIHF1ZXVlWyBpbmRleCBdICYmIHF1ZXVlWyBpbmRleCBdLmZpbmlzaCApIHsKCQkJCQlxdWV1ZVsgaW5kZXggXS5maW5pc2guY2FsbCggdGhpcyApOwoJCQkJfQoJCQl9CgoJCQkvLyBUdXJuIG9mZiBmaW5pc2hpbmcgZmxhZwoJCQlkZWxldGUgZGF0YS5maW5pc2g7CgkJfSApOwoJfQp9ICk7CgpqUXVlcnkuZWFjaCggWyAidG9nZ2xlIiwgInNob3ciLCAiaGlkZSIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7Cgl2YXIgY3NzRm4gPSBqUXVlcnkuZm5bIG5hbWUgXTsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiBzcGVlZCA9PSBudWxsIHx8IHR5cGVvZiBzcGVlZCA9PT0gImJvb2xlYW4iID8KCQkJY3NzRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIDoKCQkJdGhpcy5hbmltYXRlKCBnZW5GeCggbmFtZSwgdHJ1ZSApLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwoJfTsKfSApOwoKLy8gR2VuZXJhdGUgc2hvcnRjdXRzIGZvciBjdXN0b20gYW5pbWF0aW9ucwpqUXVlcnkuZWFjaCggewoJc2xpZGVEb3duOiBnZW5GeCggInNob3ciICksCglzbGlkZVVwOiBnZW5GeCggImhpZGUiICksCglzbGlkZVRvZ2dsZTogZ2VuRngoICJ0b2dnbGUiICksCglmYWRlSW46IHsgb3BhY2l0eTogInNob3ciIH0sCglmYWRlT3V0OiB7IG9wYWNpdHk6ICJoaWRlIiB9LAoJZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiAidG9nZ2xlIiB9Cn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLmFuaW1hdGUoIHByb3BzLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwoJfTsKfSApOwoKalF1ZXJ5LnRpbWVycyA9IFtdOwpqUXVlcnkuZngudGljayA9IGZ1bmN0aW9uKCkgewoJdmFyIHRpbWVyLAoJCWkgPSAwLAoJCXRpbWVycyA9IGpRdWVyeS50aW1lcnM7CgoJZnhOb3cgPSBEYXRlLm5vdygpOwoKCWZvciAoIDsgaSA8IHRpbWVycy5sZW5ndGg7IGkrKyApIHsKCQl0aW1lciA9IHRpbWVyc1sgaSBdOwoKCQkvLyBSdW4gdGhlIHRpbWVyIGFuZCBzYWZlbHkgcmVtb3ZlIGl0IHdoZW4gZG9uZSAoYWxsb3dpbmcgZm9yIGV4dGVybmFsIHJlbW92YWwpCgkJaWYgKCAhdGltZXIoKSAmJiB0aW1lcnNbIGkgXSA9PT0gdGltZXIgKSB7CgkJCXRpbWVycy5zcGxpY2UoIGktLSwgMSApOwoJCX0KCX0KCglpZiAoICF0aW1lcnMubGVuZ3RoICkgewoJCWpRdWVyeS5meC5zdG9wKCk7Cgl9CglmeE5vdyA9IHVuZGVmaW5lZDsKfTsKCmpRdWVyeS5meC50aW1lciA9IGZ1bmN0aW9uKCB0aW1lciApIHsKCWpRdWVyeS50aW1lcnMucHVzaCggdGltZXIgKTsKCWpRdWVyeS5meC5zdGFydCgpOwp9OwoKalF1ZXJ5LmZ4LmludGVydmFsID0gMTM7CmpRdWVyeS5meC5zdGFydCA9IGZ1bmN0aW9uKCkgewoJaWYgKCBpblByb2dyZXNzICkgewoJCXJldHVybjsKCX0KCglpblByb2dyZXNzID0gdHJ1ZTsKCXNjaGVkdWxlKCk7Cn07CgpqUXVlcnkuZnguc3RvcCA9IGZ1bmN0aW9uKCkgewoJaW5Qcm9ncmVzcyA9IG51bGw7Cn07CgpqUXVlcnkuZnguc3BlZWRzID0gewoJc2xvdzogNjAwLAoJZmFzdDogMjAwLAoKCS8vIERlZmF1bHQgc3BlZWQKCV9kZWZhdWx0OiA0MDAKfTsKCgovLyBCYXNlZCBvZmYgb2YgdGhlIHBsdWdpbiBieSBDbGludCBIZWxmZXJzLCB3aXRoIHBlcm1pc3Npb24uCi8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDEwMDMyNDAxNDc0Ny9odHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvCmpRdWVyeS5mbi5kZWxheSA9IGZ1bmN0aW9uKCB0aW1lLCB0eXBlICkgewoJdGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1lIDogdGltZTsKCXR5cGUgPSB0eXBlIHx8ICJmeCI7CgoJcmV0dXJuIHRoaXMucXVldWUoIHR5cGUsIGZ1bmN0aW9uKCBuZXh0LCBob29rcyApIHsKCQl2YXIgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCBuZXh0LCB0aW1lICk7CgkJaG9va3Muc3RvcCA9IGZ1bmN0aW9uKCkgewoJCQl3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7CgkJfTsKCX0gKTsKfTsKCgooIGZ1bmN0aW9uKCkgewoJdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlucHV0IiApLAoJCXNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzZWxlY3QiICksCgkJb3B0ID0gc2VsZWN0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAib3B0aW9uIiApICk7CgoJaW5wdXQudHlwZSA9ICJjaGVja2JveCI7CgoJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMyBvbmx5CgkvLyBEZWZhdWx0IHZhbHVlIGZvciBhIGNoZWNrYm94IHNob3VsZCBiZSAib24iCglzdXBwb3J0LmNoZWNrT24gPSBpbnB1dC52YWx1ZSAhPT0gIiI7CgoJLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5CgkvLyBNdXN0IGFjY2VzcyBzZWxlY3RlZEluZGV4IHRvIG1ha2UgZGVmYXVsdCBvcHRpb25zIHNlbGVjdAoJc3VwcG9ydC5vcHRTZWxlY3RlZCA9IG9wdC5zZWxlY3RlZDsKCgkvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHkKCS8vIEFuIGlucHV0IGxvc2VzIGl0cyB2YWx1ZSBhZnRlciBiZWNvbWluZyBhIHJhZGlvCglpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJpbnB1dCIgKTsKCWlucHV0LnZhbHVlID0gInQiOwoJaW5wdXQudHlwZSA9ICJyYWRpbyI7CglzdXBwb3J0LnJhZGlvVmFsdWUgPSBpbnB1dC52YWx1ZSA9PT0gInQiOwp9ICkoKTsKCgp2YXIgYm9vbEhvb2ssCglhdHRySGFuZGxlID0galF1ZXJ5LmV4cHIuYXR0ckhhbmRsZTsKCmpRdWVyeS5mbi5leHRlbmQoIHsKCWF0dHI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKCQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkuYXR0ciwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7Cgl9LAoKCXJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkgewoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkucmVtb3ZlQXR0ciggdGhpcywgbmFtZSApOwoJCX0gKTsKCX0KfSApOwoKalF1ZXJ5LmV4dGVuZCggewoJYXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgewoJCXZhciByZXQsIGhvb2tzLAoJCQluVHlwZSA9IGVsZW0ubm9kZVR5cGU7CgoJCS8vIERvbid0IGdldC9zZXQgYXR0cmlidXRlcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXMKCQlpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBGYWxsYmFjayB0byBwcm9wIHdoZW4gYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZAoJCWlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSAidW5kZWZpbmVkIiApIHsKCQkJcmV0dXJuIGpRdWVyeS5wcm9wKCBlbGVtLCBuYW1lLCB2YWx1ZSApOwoJCX0KCgkJLy8gQXR0cmlidXRlIGhvb2tzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBsb3dlcmNhc2UgdmVyc2lvbgoJCS8vIEdyYWIgbmVjZXNzYXJ5IGhvb2sgaWYgb25lIGlzIGRlZmluZWQKCQlpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHsKCQkJaG9va3MgPSBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSB8fAoJCQkJKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnRlc3QoIG5hbWUgKSA/IGJvb2xIb29rIDogdW5kZWZpbmVkICk7CgkJfQoKCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCWlmICggdmFsdWUgPT09IG51bGwgKSB7CgkJCQlqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOwoJCQkJcmV0dXJuOwoJCQl9CgoJCQlpZiAoIGhvb2tzICYmICJzZXQiIGluIGhvb2tzICYmCgkJCQkoIHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSApICE9PSB1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gcmV0OwoJCQl9CgoJCQllbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgdmFsdWUgKyAiIiApOwoJCQlyZXR1cm4gdmFsdWU7CgkJfQoKCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHsKCQkJcmV0dXJuIHJldDsKCQl9CgoJCXJldCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIG5hbWUgKTsKCgkJLy8gTm9uLWV4aXN0ZW50IGF0dHJpYnV0ZXMgcmV0dXJuIG51bGwsIHdlIG5vcm1hbGl6ZSB0byB1bmRlZmluZWQKCQlyZXR1cm4gcmV0ID09IG51bGwgPyB1bmRlZmluZWQgOiByZXQ7Cgl9LAoKCWF0dHJIb29rczogewoJCXR5cGU6IHsKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCQlpZiAoICFzdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09ICJyYWRpbyIgJiYKCQkJCQlub2RlTmFtZSggZWxlbSwgImlucHV0IiApICkgewoJCQkJCXZhciB2YWwgPSBlbGVtLnZhbHVlOwoJCQkJCWVsZW0uc2V0QXR0cmlidXRlKCAidHlwZSIsIHZhbHVlICk7CgkJCQkJaWYgKCB2YWwgKSB7CgkJCQkJCWVsZW0udmFsdWUgPSB2YWw7CgkJCQkJfQoJCQkJCXJldHVybiB2YWx1ZTsKCQkJCX0KCQkJfQoJCX0KCX0sCgoJcmVtb3ZlQXR0cjogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgewoJCXZhciBuYW1lLAoJCQlpID0gMCwKCgkJCS8vIEF0dHJpYnV0ZSBuYW1lcyBjYW4gY29udGFpbiBub24tSFRNTCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMKCQkJLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjYXR0cmlidXRlcy0yCgkJCWF0dHJOYW1lcyA9IHZhbHVlICYmIHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICk7CgoJCWlmICggYXR0ck5hbWVzICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgkJCXdoaWxlICggKCBuYW1lID0gYXR0ck5hbWVzWyBpKysgXSApICkgewoJCQkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIG5hbWUgKTsKCQkJfQoJCX0KCX0KfSApOwoKLy8gSG9va3MgZm9yIGJvb2xlYW4gYXR0cmlidXRlcwpib29sSG9vayA9IHsKCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkgewoJCWlmICggdmFsdWUgPT09IGZhbHNlICkgewoKCQkJLy8gUmVtb3ZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aGVuIHNldCB0byBmYWxzZQoJCQlqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOwoJCX0gZWxzZSB7CgkJCWVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lICk7CgkJfQoJCXJldHVybiBuYW1lOwoJfQp9OwoKalF1ZXJ5LmVhY2goIGpRdWVyeS5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKCAvXHcrL2cgKSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7Cgl2YXIgZ2V0dGVyID0gYXR0ckhhbmRsZVsgbmFtZSBdIHx8IGpRdWVyeS5maW5kLmF0dHI7CgoJYXR0ckhhbmRsZVsgbmFtZSBdID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkgewoJCXZhciByZXQsIGhhbmRsZSwKCQkJbG93ZXJjYXNlTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKCgkJaWYgKCAhaXNYTUwgKSB7CgoJCQkvLyBBdm9pZCBhbiBpbmZpbml0ZSBsb29wIGJ5IHRlbXBvcmFyaWx5IHJlbW92aW5nIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGUgZ2V0dGVyCgkJCWhhbmRsZSA9IGF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXTsKCQkJYXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdID0gcmV0OwoJCQlyZXQgPSBnZXR0ZXIoIGVsZW0sIG5hbWUsIGlzWE1MICkgIT0gbnVsbCA/CgkJCQlsb3dlcmNhc2VOYW1lIDoKCQkJCW51bGw7CgkJCWF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXSA9IGhhbmRsZTsKCQl9CgkJcmV0dXJuIHJldDsKCX07Cn0gKTsKCgoKCnZhciByZm9jdXNhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSwKCXJjbGlja2FibGUgPSAvXig/OmF8YXJlYSkkL2k7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7Cglwcm9wOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJcmV0dXJuIGFjY2VzcyggdGhpcywgalF1ZXJ5LnByb3AsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApOwoJfSwKCglyZW1vdmVQcm9wOiBmdW5jdGlvbiggbmFtZSApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCQkJZGVsZXRlIHRoaXNbIGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZSBdOwoJCX0gKTsKCX0KfSApOwoKalF1ZXJ5LmV4dGVuZCggewoJcHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgewoJCXZhciByZXQsIGhvb2tzLAoJCQluVHlwZSA9IGVsZW0ubm9kZVR5cGU7CgoJCS8vIERvbid0IGdldC9zZXQgcHJvcGVydGllcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXMKCQlpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHsKCgkJCS8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3MKCQkJbmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTsKCQkJaG9va3MgPSBqUXVlcnkucHJvcEhvb2tzWyBuYW1lIF07CgkJfQoKCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCWlmICggaG9va3MgJiYgInNldCIgaW4gaG9va3MgJiYKCQkJCSggcmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApICkgIT09IHVuZGVmaW5lZCApIHsKCQkJCXJldHVybiByZXQ7CgkJCX0KCgkJCXJldHVybiAoIGVsZW1bIG5hbWUgXSA9IHZhbHVlICk7CgkJfQoKCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHsKCQkJcmV0dXJuIHJldDsKCQl9CgoJCXJldHVybiBlbGVtWyBuYW1lIF07Cgl9LAoKCXByb3BIb29rczogewoJCXRhYkluZGV4OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgoJCQkJLy8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seQoJCQkJLy8gZWxlbS50YWJJbmRleCBkb2Vzbid0IGFsd2F5cyByZXR1cm4gdGhlCgkJCQkvLyBjb3JyZWN0IHZhbHVlIHdoZW4gaXQgaGFzbid0IGJlZW4gZXhwbGljaXRseSBzZXQKCQkJCS8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE0MTExNjIzMzM0Ny9odHRwOi8vZmx1aWRwcm9qZWN0Lm9yZy9ibG9nLzIwMDgvMDEvMDkvZ2V0dGluZy1zZXR0aW5nLWFuZC1yZW1vdmluZy10YWJpbmRleC12YWx1ZXMtd2l0aC1qYXZhc2NyaXB0LwoJCQkJLy8gVXNlIHByb3BlciBhdHRyaWJ1dGUgcmV0cmlldmFsKCMxMjA3MikKCQkJCXZhciB0YWJpbmRleCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sICJ0YWJpbmRleCIgKTsKCgkJCQlpZiAoIHRhYmluZGV4ICkgewoJCQkJCXJldHVybiBwYXJzZUludCggdGFiaW5kZXgsIDEwICk7CgkJCQl9CgoJCQkJaWYgKAoJCQkJCXJmb2N1c2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8CgkJCQkJcmNsaWNrYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgJiYKCQkJCQllbGVtLmhyZWYKCQkJCSkgewoJCQkJCXJldHVybiAwOwoJCQkJfQoKCQkJCXJldHVybiAtMTsKCQkJfQoJCX0KCX0sCgoJcHJvcEZpeDogewoJCSJmb3IiOiAiaHRtbEZvciIsCgkJImNsYXNzIjogImNsYXNzTmFtZSIKCX0KfSApOwoKLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5Ci8vIEFjY2Vzc2luZyB0aGUgc2VsZWN0ZWRJbmRleCBwcm9wZXJ0eQovLyBmb3JjZXMgdGhlIGJyb3dzZXIgdG8gcmVzcGVjdCBzZXR0aW5nIHNlbGVjdGVkCi8vIG9uIHRoZSBvcHRpb24KLy8gVGhlIGdldHRlciBlbnN1cmVzIGEgZGVmYXVsdCBvcHRpb24gaXMgc2VsZWN0ZWQKLy8gd2hlbiBpbiBhbiBvcHRncm91cAovLyBlc2xpbnQgcnVsZSAibm8tdW51c2VkLWV4cHJlc3Npb25zIiBpcyBkaXNhYmxlZCBmb3IgdGhpcyBjb2RlCi8vIHNpbmNlIGl0IGNvbnNpZGVycyBzdWNoIGFjY2Vzc2lvbnMgbm9vcAppZiAoICFzdXBwb3J0Lm9wdFNlbGVjdGVkICkgewoJalF1ZXJ5LnByb3BIb29rcy5zZWxlY3RlZCA9IHsKCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoKCQkJLyogZXNsaW50IG5vLXVudXNlZC1leHByZXNzaW9uczogIm9mZiIgKi8KCgkJCXZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CgkJCWlmICggcGFyZW50ICYmIHBhcmVudC5wYXJlbnROb2RlICkgewoJCQkJcGFyZW50LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKCQkJfQoJCQlyZXR1cm4gbnVsbDsKCQl9LAoJCXNldDogZnVuY3Rpb24oIGVsZW0gKSB7CgoJCQkvKiBlc2xpbnQgbm8tdW51c2VkLWV4cHJlc3Npb25zOiAib2ZmIiAqLwoKCQkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQkJaWYgKCBwYXJlbnQgKSB7CgkJCQlwYXJlbnQuc2VsZWN0ZWRJbmRleDsKCgkJCQlpZiAoIHBhcmVudC5wYXJlbnROb2RlICkgewoJCQkJCXBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7CgkJCQl9CgkJCX0KCQl9Cgl9Owp9CgpqUXVlcnkuZWFjaCggWwoJInRhYkluZGV4IiwKCSJyZWFkT25seSIsCgkibWF4TGVuZ3RoIiwKCSJjZWxsU3BhY2luZyIsCgkiY2VsbFBhZGRpbmciLAoJInJvd1NwYW4iLAoJImNvbFNwYW4iLAoJInVzZU1hcCIsCgkiZnJhbWVCb3JkZXIiLAoJImNvbnRlbnRFZGl0YWJsZSIKXSwgZnVuY3Rpb24oKSB7CglqUXVlcnkucHJvcEZpeFsgdGhpcy50b0xvd2VyQ2FzZSgpIF0gPSB0aGlzOwp9ICk7CgoKCgoJLy8gU3RyaXAgYW5kIGNvbGxhcHNlIHdoaXRlc3BhY2UgYWNjb3JkaW5nIHRvIEhUTUwgc3BlYwoJLy8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS1hc2NpaS13aGl0ZXNwYWNlCglmdW5jdGlvbiBzdHJpcEFuZENvbGxhcHNlKCB2YWx1ZSApIHsKCQl2YXIgdG9rZW5zID0gdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXTsKCQlyZXR1cm4gdG9rZW5zLmpvaW4oICIgIiApOwoJfQoKCmZ1bmN0aW9uIGdldENsYXNzKCBlbGVtICkgewoJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlICYmIGVsZW0uZ2V0QXR0cmlidXRlKCAiY2xhc3MiICkgfHwgIiI7Cn0KCmZ1bmN0aW9uIGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApIHsKCWlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHsKCQlyZXR1cm4gdmFsdWU7Cgl9CglpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgKSB7CgkJcmV0dXJuIHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107Cgl9CglyZXR1cm4gW107Cn0KCmpRdWVyeS5mbi5leHRlbmQoIHsKCWFkZENsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJdmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLAoJCQlpID0gMDsKCgkJaWYgKCBpc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHsKCQkJCWpRdWVyeSggdGhpcyApLmFkZENsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTsKCQkJfSApOwoJCX0KCgkJY2xhc3NlcyA9IGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApOwoKCQlpZiAoIGNsYXNzZXMubGVuZ3RoICkgewoJCQl3aGlsZSAoICggZWxlbSA9IHRoaXNbIGkrKyBdICkgKSB7CgkJCQljdXJWYWx1ZSA9IGdldENsYXNzKCBlbGVtICk7CgkJCQljdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggIiAiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArICIgIiApOwoKCQkJCWlmICggY3VyICkgewoJCQkJCWogPSAwOwoJCQkJCXdoaWxlICggKCBjbGF6eiA9IGNsYXNzZXNbIGorKyBdICkgKSB7CgkJCQkJCWlmICggY3VyLmluZGV4T2YoICIgIiArIGNsYXp6ICsgIiAiICkgPCAwICkgewoJCQkJCQkJY3VyICs9IGNsYXp6ICsgIiAiOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQkvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLgoJCQkJCWZpbmFsVmFsdWUgPSBzdHJpcEFuZENvbGxhcHNlKCBjdXIgKTsKCQkJCQlpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkgewoJCQkJCQllbGVtLnNldEF0dHJpYnV0ZSggImNsYXNzIiwgZmluYWxWYWx1ZSApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCXJlbW92ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJdmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLAoJCQlpID0gMDsKCgkJaWYgKCBpc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHsKCQkJCWpRdWVyeSggdGhpcyApLnJlbW92ZUNsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTsKCQkJfSApOwoJCX0KCgkJaWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHsKCQkJcmV0dXJuIHRoaXMuYXR0ciggImNsYXNzIiwgIiIgKTsKCQl9CgoJCWNsYXNzZXMgPSBjbGFzc2VzVG9BcnJheSggdmFsdWUgKTsKCgkJaWYgKCBjbGFzc2VzLmxlbmd0aCApIHsKCQkJd2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkgewoJCQkJY3VyVmFsdWUgPSBnZXRDbGFzcyggZWxlbSApOwoKCQkJCS8vIFRoaXMgZXhwcmVzc2lvbiBpcyBoZXJlIGZvciBiZXR0ZXIgY29tcHJlc3NpYmlsaXR5IChzZWUgYWRkQ2xhc3MpCgkJCQljdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggIiAiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArICIgIiApOwoKCQkJCWlmICggY3VyICkgewoJCQkJCWogPSAwOwoJCQkJCXdoaWxlICggKCBjbGF6eiA9IGNsYXNzZXNbIGorKyBdICkgKSB7CgoJCQkJCQkvLyBSZW1vdmUgKmFsbCogaW5zdGFuY2VzCgkJCQkJCXdoaWxlICggY3VyLmluZGV4T2YoICIgIiArIGNsYXp6ICsgIiAiICkgPiAtMSApIHsKCQkJCQkJCWN1ciA9IGN1ci5yZXBsYWNlKCAiICIgKyBjbGF6eiArICIgIiwgIiAiICk7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIE9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5lZWRlZCByZW5kZXJpbmcuCgkJCQkJZmluYWxWYWx1ZSA9IHN0cmlwQW5kQ29sbGFwc2UoIGN1ciApOwoJCQkJCWlmICggY3VyVmFsdWUgIT09IGZpbmFsVmFsdWUgKSB7CgkJCQkJCWVsZW0uc2V0QXR0cmlidXRlKCAiY2xhc3MiLCBmaW5hbFZhbHVlICk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSwgc3RhdGVWYWwgKSB7CgkJdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWUsCgkJCWlzVmFsaWRWYWx1ZSA9IHR5cGUgPT09ICJzdHJpbmciIHx8IEFycmF5LmlzQXJyYXkoIHZhbHVlICk7CgoJCWlmICggdHlwZW9mIHN0YXRlVmFsID09PSAiYm9vbGVhbiIgJiYgaXNWYWxpZFZhbHVlICkgewoJCQlyZXR1cm4gc3RhdGVWYWwgPyB0aGlzLmFkZENsYXNzKCB2YWx1ZSApIDogdGhpcy5yZW1vdmVDbGFzcyggdmFsdWUgKTsKCQl9CgoJCWlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7CgkJCQlqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcygKCQkJCQl2YWx1ZS5jYWxsKCB0aGlzLCBpLCBnZXRDbGFzcyggdGhpcyApLCBzdGF0ZVZhbCApLAoJCQkJCXN0YXRlVmFsCgkJCQkpOwoJCQl9ICk7CgkJfQoKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCQkJdmFyIGNsYXNzTmFtZSwgaSwgc2VsZiwgY2xhc3NOYW1lczsKCgkJCWlmICggaXNWYWxpZFZhbHVlICkgewoKCQkJCS8vIFRvZ2dsZSBpbmRpdmlkdWFsIGNsYXNzIG5hbWVzCgkJCQlpID0gMDsKCQkJCXNlbGYgPSBqUXVlcnkoIHRoaXMgKTsKCQkJCWNsYXNzTmFtZXMgPSBjbGFzc2VzVG9BcnJheSggdmFsdWUgKTsKCgkJCQl3aGlsZSAoICggY2xhc3NOYW1lID0gY2xhc3NOYW1lc1sgaSsrIF0gKSApIHsKCgkJCQkJLy8gQ2hlY2sgZWFjaCBjbGFzc05hbWUgZ2l2ZW4sIHNwYWNlIHNlcGFyYXRlZCBsaXN0CgkJCQkJaWYgKCBzZWxmLmhhc0NsYXNzKCBjbGFzc05hbWUgKSApIHsKCQkJCQkJc2VsZi5yZW1vdmVDbGFzcyggY2xhc3NOYW1lICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJc2VsZi5hZGRDbGFzcyggY2xhc3NOYW1lICk7CgkJCQkJfQoJCQkJfQoKCQkJLy8gVG9nZ2xlIHdob2xlIGNsYXNzIG5hbWUKCQkJfSBlbHNlIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlID09PSAiYm9vbGVhbiIgKSB7CgkJCQljbGFzc05hbWUgPSBnZXRDbGFzcyggdGhpcyApOwoJCQkJaWYgKCBjbGFzc05hbWUgKSB7CgoJCQkJCS8vIFN0b3JlIGNsYXNzTmFtZSBpZiBzZXQKCQkJCQlkYXRhUHJpdi5zZXQoIHRoaXMsICJfX2NsYXNzTmFtZV9fIiwgY2xhc3NOYW1lICk7CgkJCQl9CgoJCQkJLy8gSWYgdGhlIGVsZW1lbnQgaGFzIGEgY2xhc3MgbmFtZSBvciBpZiB3ZSdyZSBwYXNzZWQgYGZhbHNlYCwKCQkJCS8vIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBjbGFzc25hbWUgKGlmIHRoZXJlIHdhcyBvbmUsIHRoZSBhYm92ZSBzYXZlZCBpdCkuCgkJCQkvLyBPdGhlcndpc2UgYnJpbmcgYmFjayB3aGF0ZXZlciB3YXMgcHJldmlvdXNseSBzYXZlZCAoaWYgYW55dGhpbmcpLAoJCQkJLy8gZmFsbGluZyBiYWNrIHRvIHRoZSBlbXB0eSBzdHJpbmcgaWYgbm90aGluZyB3YXMgc3RvcmVkLgoJCQkJaWYgKCB0aGlzLnNldEF0dHJpYnV0ZSApIHsKCQkJCQl0aGlzLnNldEF0dHJpYnV0ZSggImNsYXNzIiwKCQkJCQkJY2xhc3NOYW1lIHx8IHZhbHVlID09PSBmYWxzZSA/CgkJCQkJCSIiIDoKCQkJCQkJZGF0YVByaXYuZ2V0KCB0aGlzLCAiX19jbGFzc05hbWVfXyIgKSB8fCAiIgoJCQkJCSk7CgkJCQl9CgkJCX0KCQl9ICk7Cgl9LAoKCWhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJdmFyIGNsYXNzTmFtZSwgZWxlbSwKCQkJaSA9IDA7CgoJCWNsYXNzTmFtZSA9ICIgIiArIHNlbGVjdG9yICsgIiAiOwoJCXdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHsKCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmCgkJCQkoICIgIiArIHN0cmlwQW5kQ29sbGFwc2UoIGdldENsYXNzKCBlbGVtICkgKSArICIgIiApLmluZGV4T2YoIGNsYXNzTmFtZSApID4gLTEgKSB7CgkJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9CgoJCXJldHVybiBmYWxzZTsKCX0KfSApOwoKCgoKdmFyIHJyZXR1cm4gPSAvXHIvZzsKCmpRdWVyeS5mbi5leHRlbmQoIHsKCXZhbDogZnVuY3Rpb24oIHZhbHVlICkgewoJCXZhciBob29rcywgcmV0LCB2YWx1ZUlzRnVuY3Rpb24sCgkJCWVsZW0gPSB0aGlzWyAwIF07CgoJCWlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCWlmICggZWxlbSApIHsKCQkJCWhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyBlbGVtLnR5cGUgXSB8fAoJCQkJCWpRdWVyeS52YWxIb29rc1sgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07CgoJCQkJaWYgKCBob29rcyAmJgoJCQkJCSJnZXQiIGluIGhvb2tzICYmCgkJCQkJKCByZXQgPSBob29rcy5nZXQoIGVsZW0sICJ2YWx1ZSIgKSApICE9PSB1bmRlZmluZWQKCQkJCSkgewoJCQkJCXJldHVybiByZXQ7CgkJCQl9CgoJCQkJcmV0ID0gZWxlbS52YWx1ZTsKCgkJCQkvLyBIYW5kbGUgbW9zdCBjb21tb24gc3RyaW5nIGNhc2VzCgkJCQlpZiAoIHR5cGVvZiByZXQgPT09ICJzdHJpbmciICkgewoJCQkJCXJldHVybiByZXQucmVwbGFjZSggcnJldHVybiwgIiIgKTsKCQkJCX0KCgkJCQkvLyBIYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXIKCQkJCXJldHVybiByZXQgPT0gbnVsbCA/ICIiIDogcmV0OwoJCQl9CgoJCQlyZXR1cm47CgkJfQoKCQl2YWx1ZUlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCB2YWx1ZSApOwoKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHsKCQkJdmFyIHZhbDsKCgkJCWlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJaWYgKCB2YWx1ZUlzRnVuY3Rpb24gKSB7CgkJCQl2YWwgPSB2YWx1ZS5jYWxsKCB0aGlzLCBpLCBqUXVlcnkoIHRoaXMgKS52YWwoKSApOwoJCQl9IGVsc2UgewoJCQkJdmFsID0gdmFsdWU7CgkJCX0KCgkJCS8vIFRyZWF0IG51bGwvdW5kZWZpbmVkIGFzICIiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nCgkJCWlmICggdmFsID09IG51bGwgKSB7CgkJCQl2YWwgPSAiIjsKCgkJCX0gZWxzZSBpZiAoIHR5cGVvZiB2YWwgPT09ICJudW1iZXIiICkgewoJCQkJdmFsICs9ICIiOwoKCQkJfSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggdmFsICkgKSB7CgkJCQl2YWwgPSBqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJCQlyZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUgKyAiIjsKCQkJCX0gKTsKCQkJfQoKCQkJaG9va3MgPSBqUXVlcnkudmFsSG9va3NbIHRoaXMudHlwZSBdIHx8IGpRdWVyeS52YWxIb29rc1sgdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07CgoJCQkvLyBJZiBzZXQgcmV0dXJucyB1bmRlZmluZWQsIGZhbGwgYmFjayB0byBub3JtYWwgc2V0dGluZwoJCQlpZiAoICFob29rcyB8fCAhKCAic2V0IiBpbiBob29rcyApIHx8IGhvb2tzLnNldCggdGhpcywgdmFsLCAidmFsdWUiICkgPT09IHVuZGVmaW5lZCApIHsKCQkJCXRoaXMudmFsdWUgPSB2YWw7CgkJCX0KCQl9ICk7Cgl9Cn0gKTsKCmpRdWVyeS5leHRlbmQoIHsKCXZhbEhvb2tzOiB7CgkJb3B0aW9uOiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgoJCQkJdmFyIHZhbCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sICJ2YWx1ZSIgKTsKCQkJCXJldHVybiB2YWwgIT0gbnVsbCA/CgkJCQkJdmFsIDoKCgkJCQkJLy8gU3VwcG9ydDogSUUgPD0xMCAtIDExIG9ubHkKCQkJCQkvLyBvcHRpb24udGV4dCB0aHJvd3MgZXhjZXB0aW9ucyAoIzE0Njg2LCAjMTQ4NTgpCgkJCQkJLy8gU3RyaXAgYW5kIGNvbGxhcHNlIHdoaXRlc3BhY2UKCQkJCQkvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNzdHJpcC1hbmQtY29sbGFwc2Utd2hpdGVzcGFjZQoJCQkJCXN0cmlwQW5kQ29sbGFwc2UoIGpRdWVyeS50ZXh0KCBlbGVtICkgKTsKCQkJfQoJCX0sCgkJc2VsZWN0OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl2YXIgdmFsdWUsIG9wdGlvbiwgaSwKCQkJCQlvcHRpb25zID0gZWxlbS5vcHRpb25zLAoJCQkJCWluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LAoJCQkJCW9uZSA9IGVsZW0udHlwZSA9PT0gInNlbGVjdC1vbmUiLAoJCQkJCXZhbHVlcyA9IG9uZSA/IG51bGwgOiBbXSwKCQkJCQltYXggPSBvbmUgPyBpbmRleCArIDEgOiBvcHRpb25zLmxlbmd0aDsKCgkJCQlpZiAoIGluZGV4IDwgMCApIHsKCQkJCQlpID0gbWF4OwoKCQkJCX0gZWxzZSB7CgkJCQkJaSA9IG9uZSA/IGluZGV4IDogMDsKCQkJCX0KCgkJCQkvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zCgkJCQlmb3IgKCA7IGkgPCBtYXg7IGkrKyApIHsKCQkJCQlvcHRpb24gPSBvcHRpb25zWyBpIF07CgoJCQkJCS8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5CgkJCQkJLy8gSUU4LTkgZG9lc24ndCB1cGRhdGUgc2VsZWN0ZWQgYWZ0ZXIgZm9ybSByZXNldCAoIzI1NTEpCgkJCQkJaWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCApICYmCgoJCQkJCQkJLy8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cAoJCQkJCQkJIW9wdGlvbi5kaXNhYmxlZCAmJgoJCQkJCQkJKCAhb3B0aW9uLnBhcmVudE5vZGUuZGlzYWJsZWQgfHwKCQkJCQkJCQkhbm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCAib3B0Z3JvdXAiICkgKSApIHsKCgkJCQkJCS8vIEdldCB0aGUgc3BlY2lmaWMgdmFsdWUgZm9yIHRoZSBvcHRpb24KCQkJCQkJdmFsdWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpOwoKCQkJCQkJLy8gV2UgZG9uJ3QgbmVlZCBhbiBhcnJheSBmb3Igb25lIHNlbGVjdHMKCQkJCQkJaWYgKCBvbmUgKSB7CgkJCQkJCQlyZXR1cm4gdmFsdWU7CgkJCQkJCX0KCgkJCQkJCS8vIE11bHRpLVNlbGVjdHMgcmV0dXJuIGFuIGFycmF5CgkJCQkJCXZhbHVlcy5wdXNoKCB2YWx1ZSApOwoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gdmFsdWVzOwoJCQl9LAoKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCQl2YXIgb3B0aW9uU2V0LCBvcHRpb24sCgkJCQkJb3B0aW9ucyA9IGVsZW0ub3B0aW9ucywKCQkJCQl2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApLAoJCQkJCWkgPSBvcHRpb25zLmxlbmd0aDsKCgkJCQl3aGlsZSAoIGktLSApIHsKCQkJCQlvcHRpb24gPSBvcHRpb25zWyBpIF07CgoJCQkJCS8qIGVzbGludC1kaXNhYmxlIG5vLWNvbmQtYXNzaWduICovCgoJCQkJCWlmICggb3B0aW9uLnNlbGVjdGVkID0KCQkJCQkJalF1ZXJ5LmluQXJyYXkoIGpRdWVyeS52YWxIb29rcy5vcHRpb24uZ2V0KCBvcHRpb24gKSwgdmFsdWVzICkgPiAtMQoJCQkJCSkgewoJCQkJCQlvcHRpb25TZXQgPSB0cnVlOwoJCQkJCX0KCgkJCQkJLyogZXNsaW50LWVuYWJsZSBuby1jb25kLWFzc2lnbiAqLwoJCQkJfQoKCQkJCS8vIEZvcmNlIGJyb3dzZXJzIHRvIGJlaGF2ZSBjb25zaXN0ZW50bHkgd2hlbiBub24tbWF0Y2hpbmcgdmFsdWUgaXMgc2V0CgkJCQlpZiAoICFvcHRpb25TZXQgKSB7CgkJCQkJZWxlbS5zZWxlY3RlZEluZGV4ID0gLTE7CgkJCQl9CgkJCQlyZXR1cm4gdmFsdWVzOwoJCQl9CgkJfQoJfQp9ICk7CgovLyBSYWRpb3MgYW5kIGNoZWNrYm94ZXMgZ2V0dGVyL3NldHRlcgpqUXVlcnkuZWFjaCggWyAicmFkaW8iLCAiY2hlY2tib3giIF0sIGZ1bmN0aW9uKCkgewoJalF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7CgkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCWlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHsKCQkJCXJldHVybiAoIGVsZW0uY2hlY2tlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkoIGVsZW0gKS52YWwoKSwgdmFsdWUgKSA+IC0xICk7CgkJCX0KCQl9Cgl9OwoJaWYgKCAhc3VwcG9ydC5jaGVja09uICkgewoJCWpRdWVyeS52YWxIb29rc1sgdGhpcyBdLmdldCA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoICJ2YWx1ZSIgKSA9PT0gbnVsbCA/ICJvbiIgOiBlbGVtLnZhbHVlOwoJCX07Cgl9Cn0gKTsKCgoKCi8vIFJldHVybiBqUXVlcnkgZm9yIGF0dHJpYnV0ZXMtb25seSBpbmNsdXNpb24KCgpzdXBwb3J0LmZvY3VzaW4gPSAib25mb2N1c2luIiBpbiB3aW5kb3c7CgoKdmFyIHJmb2N1c01vcnBoID0gL14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLAoJc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgPSBmdW5jdGlvbiggZSApIHsKCQllLnN0b3BQcm9wYWdhdGlvbigpOwoJfTsKCmpRdWVyeS5leHRlbmQoIGpRdWVyeS5ldmVudCwgewoKCXRyaWdnZXI6IGZ1bmN0aW9uKCBldmVudCwgZGF0YSwgZWxlbSwgb25seUhhbmRsZXJzICkgewoKCQl2YXIgaSwgY3VyLCB0bXAsIGJ1YmJsZVR5cGUsIG9udHlwZSwgaGFuZGxlLCBzcGVjaWFsLCBsYXN0RWxlbWVudCwKCQkJZXZlbnRQYXRoID0gWyBlbGVtIHx8IGRvY3VtZW50IF0sCgkJCXR5cGUgPSBoYXNPd24uY2FsbCggZXZlbnQsICJ0eXBlIiApID8gZXZlbnQudHlwZSA6IGV2ZW50LAoJCQluYW1lc3BhY2VzID0gaGFzT3duLmNhbGwoIGV2ZW50LCAibmFtZXNwYWNlIiApID8gZXZlbnQubmFtZXNwYWNlLnNwbGl0KCAiLiIgKSA6IFtdOwoKCQljdXIgPSBsYXN0RWxlbWVudCA9IHRtcCA9IGVsZW0gPSBlbGVtIHx8IGRvY3VtZW50OwoKCQkvLyBEb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcwoJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4ICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBmb2N1cy9ibHVyIG1vcnBocyB0byBmb2N1c2luL291dDsgZW5zdXJlIHdlJ3JlIG5vdCBmaXJpbmcgdGhlbSByaWdodCBub3cKCQlpZiAoIHJmb2N1c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICkgKSB7CgkJCXJldHVybjsKCQl9CgoJCWlmICggdHlwZS5pbmRleE9mKCAiLiIgKSA+IC0xICkgewoKCQkJLy8gTmFtZXNwYWNlZCB0cmlnZ2VyOyBjcmVhdGUgYSByZWdleHAgdG8gbWF0Y2ggZXZlbnQgdHlwZSBpbiBoYW5kbGUoKQoJCQluYW1lc3BhY2VzID0gdHlwZS5zcGxpdCggIi4iICk7CgkJCXR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CgkJCW5hbWVzcGFjZXMuc29ydCgpOwoJCX0KCQlvbnR5cGUgPSB0eXBlLmluZGV4T2YoICI6IiApIDwgMCAmJiAib24iICsgdHlwZTsKCgkJLy8gQ2FsbGVyIGNhbiBwYXNzIGluIGEgalF1ZXJ5LkV2ZW50IG9iamVjdCwgT2JqZWN0LCBvciBqdXN0IGFuIGV2ZW50IHR5cGUgc3RyaW5nCgkJZXZlbnQgPSBldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSA/CgkJCWV2ZW50IDoKCQkJbmV3IGpRdWVyeS5FdmVudCggdHlwZSwgdHlwZW9mIGV2ZW50ID09PSAib2JqZWN0IiAmJiBldmVudCApOwoKCQkvLyBUcmlnZ2VyIGJpdG1hc2s6ICYgMSBmb3IgbmF0aXZlIGhhbmRsZXJzOyAmIDIgZm9yIGpRdWVyeSAoYWx3YXlzIHRydWUpCgkJZXZlbnQuaXNUcmlnZ2VyID0gb25seUhhbmRsZXJzID8gMiA6IDM7CgkJZXZlbnQubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5qb2luKCAiLiIgKTsKCQlldmVudC5ybmFtZXNwYWNlID0gZXZlbnQubmFtZXNwYWNlID8KCQkJbmV3IFJlZ0V4cCggIihefFxcLikiICsgbmFtZXNwYWNlcy5qb2luKCAiXFwuKD86LipcXC58KSIgKSArICIoXFwufCQpIiApIDoKCQkJbnVsbDsKCgkJLy8gQ2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkCgkJZXZlbnQucmVzdWx0ID0gdW5kZWZpbmVkOwoJCWlmICggIWV2ZW50LnRhcmdldCApIHsKCQkJZXZlbnQudGFyZ2V0ID0gZWxlbTsKCQl9CgoJCS8vIENsb25lIGFueSBpbmNvbWluZyBkYXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcgdGhlIGhhbmRsZXIgYXJnIGxpc3QKCQlkYXRhID0gZGF0YSA9PSBudWxsID8KCQkJWyBldmVudCBdIDoKCQkJalF1ZXJ5Lm1ha2VBcnJheSggZGF0YSwgWyBldmVudCBdICk7CgoJCS8vIEFsbG93IHNwZWNpYWwgZXZlbnRzIHRvIGRyYXcgb3V0c2lkZSB0aGUgbGluZXMKCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKCQlpZiAoICFvbmx5SGFuZGxlcnMgJiYgc3BlY2lhbC50cmlnZ2VyICYmIHNwZWNpYWwudHJpZ2dlci5hcHBseSggZWxlbSwgZGF0YSApID09PSBmYWxzZSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gRGV0ZXJtaW5lIGV2ZW50IHByb3BhZ2F0aW9uIHBhdGggaW4gYWR2YW5jZSwgcGVyIFczQyBldmVudHMgc3BlYyAoIzk5NTEpCgkJLy8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdzsgd2F0Y2ggZm9yIGEgZ2xvYmFsIG93bmVyRG9jdW1lbnQgdmFyICgjOTcyNCkKCQlpZiAoICFvbmx5SGFuZGxlcnMgJiYgIXNwZWNpYWwubm9CdWJibGUgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7CgoJCQlidWJibGVUeXBlID0gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgfHwgdHlwZTsKCQkJaWYgKCAhcmZvY3VzTW9ycGgudGVzdCggYnViYmxlVHlwZSArIHR5cGUgKSApIHsKCQkJCWN1ciA9IGN1ci5wYXJlbnROb2RlOwoJCQl9CgkJCWZvciAoIDsgY3VyOyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHsKCQkJCWV2ZW50UGF0aC5wdXNoKCBjdXIgKTsKCQkJCXRtcCA9IGN1cjsKCQkJfQoKCQkJLy8gT25seSBhZGQgd2luZG93IGlmIHdlIGdvdCB0byBkb2N1bWVudCAoZS5nLiwgbm90IHBsYWluIG9iaiBvciBkZXRhY2hlZCBET00pCgkJCWlmICggdG1wID09PSAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCApICkgewoJCQkJZXZlbnRQYXRoLnB1c2goIHRtcC5kZWZhdWx0VmlldyB8fCB0bXAucGFyZW50V2luZG93IHx8IHdpbmRvdyApOwoJCQl9CgkJfQoKCQkvLyBGaXJlIGhhbmRsZXJzIG9uIHRoZSBldmVudCBwYXRoCgkJaSA9IDA7CgkJd2hpbGUgKCAoIGN1ciA9IGV2ZW50UGF0aFsgaSsrIF0gKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKCQkJbGFzdEVsZW1lbnQgPSBjdXI7CgkJCWV2ZW50LnR5cGUgPSBpID4gMSA/CgkJCQlidWJibGVUeXBlIDoKCQkJCXNwZWNpYWwuYmluZFR5cGUgfHwgdHlwZTsKCgkJCS8vIGpRdWVyeSBoYW5kbGVyCgkJCWhhbmRsZSA9ICggZGF0YVByaXYuZ2V0KCBjdXIsICJldmVudHMiICkgfHwge30gKVsgZXZlbnQudHlwZSBdICYmCgkJCQlkYXRhUHJpdi5nZXQoIGN1ciwgImhhbmRsZSIgKTsKCQkJaWYgKCBoYW5kbGUgKSB7CgkJCQloYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApOwoJCQl9CgoJCQkvLyBOYXRpdmUgaGFuZGxlcgoJCQloYW5kbGUgPSBvbnR5cGUgJiYgY3VyWyBvbnR5cGUgXTsKCQkJaWYgKCBoYW5kbGUgJiYgaGFuZGxlLmFwcGx5ICYmIGFjY2VwdERhdGEoIGN1ciApICkgewoJCQkJZXZlbnQucmVzdWx0ID0gaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTsKCQkJCWlmICggZXZlbnQucmVzdWx0ID09PSBmYWxzZSApIHsKCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJfQoJCQl9CgkJfQoJCWV2ZW50LnR5cGUgPSB0eXBlOwoKCQkvLyBJZiBub2JvZHkgcHJldmVudGVkIHRoZSBkZWZhdWx0IGFjdGlvbiwgZG8gaXQgbm93CgkJaWYgKCAhb25seUhhbmRsZXJzICYmICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHsKCgkJCWlmICggKCAhc3BlY2lhbC5fZGVmYXVsdCB8fAoJCQkJc3BlY2lhbC5fZGVmYXVsdC5hcHBseSggZXZlbnRQYXRoLnBvcCgpLCBkYXRhICkgPT09IGZhbHNlICkgJiYKCQkJCWFjY2VwdERhdGEoIGVsZW0gKSApIHsKCgkJCQkvLyBDYWxsIGEgbmF0aXZlIERPTSBtZXRob2Qgb24gdGhlIHRhcmdldCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGV2ZW50LgoJCQkJLy8gRG9uJ3QgZG8gZGVmYXVsdCBhY3Rpb25zIG9uIHdpbmRvdywgdGhhdCdzIHdoZXJlIGdsb2JhbCB2YXJpYWJsZXMgYmUgKCM2MTcwKQoJCQkJaWYgKCBvbnR5cGUgJiYgaXNGdW5jdGlvbiggZWxlbVsgdHlwZSBdICkgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7CgoJCQkJCS8vIERvbid0IHJlLXRyaWdnZXIgYW4gb25GT08gZXZlbnQgd2hlbiB3ZSBjYWxsIGl0cyBGT08oKSBtZXRob2QKCQkJCQl0bXAgPSBlbGVtWyBvbnR5cGUgXTsKCgkJCQkJaWYgKCB0bXAgKSB7CgkJCQkJCWVsZW1bIG9udHlwZSBdID0gbnVsbDsKCQkJCQl9CgoJCQkJCS8vIFByZXZlbnQgcmUtdHJpZ2dlcmluZyBvZiB0aGUgc2FtZSBldmVudCwgc2luY2Ugd2UgYWxyZWFkeSBidWJibGVkIGl0IGFib3ZlCgkJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHR5cGU7CgoJCQkJCWlmICggZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKCQkJCQkJbGFzdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgKTsKCQkJCQl9CgoJCQkJCWVsZW1bIHR5cGUgXSgpOwoKCQkJCQlpZiAoIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CgkJCQkJCWxhc3RFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrICk7CgkJCQkJfQoKCQkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdW5kZWZpbmVkOwoKCQkJCQlpZiAoIHRtcCApIHsKCQkJCQkJZWxlbVsgb250eXBlIF0gPSB0bXA7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJfSwKCgkvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmUKCS8vIFVzZWQgb25seSBmb3IgYGZvY3VzKGluIHwgb3V0KWAgZXZlbnRzCglzaW11bGF0ZTogZnVuY3Rpb24oIHR5cGUsIGVsZW0sIGV2ZW50ICkgewoJCXZhciBlID0galF1ZXJ5LmV4dGVuZCgKCQkJbmV3IGpRdWVyeS5FdmVudCgpLAoJCQlldmVudCwKCQkJewoJCQkJdHlwZTogdHlwZSwKCQkJCWlzU2ltdWxhdGVkOiB0cnVlCgkJCX0KCQkpOwoKCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggZSwgbnVsbCwgZWxlbSApOwoJfQoKfSApOwoKalF1ZXJ5LmZuLmV4dGVuZCggewoKCXRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApOwoJCX0gKTsKCX0sCgl0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7CgkJdmFyIGVsZW0gPSB0aGlzWyAwIF07CgkJaWYgKCBlbGVtICkgewoJCQlyZXR1cm4galF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUsIGRhdGEsIGVsZW0sIHRydWUgKTsKCQl9Cgl9Cn0gKTsKCgovLyBTdXBwb3J0OiBGaXJlZm94IDw9NDQKLy8gRmlyZWZveCBkb2Vzbid0IGhhdmUgZm9jdXMoaW4gfCBvdXQpIGV2ZW50cwovLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY4Nzc4NwovLwovLyBTdXBwb3J0OiBDaHJvbWUgPD00OCAtIDQ5LCBTYWZhcmkgPD05LjAgLSA5LjEKLy8gZm9jdXMoaW4gfCBvdXQpIGV2ZW50cyBmaXJlIGFmdGVyIGZvY3VzICYgYmx1ciBldmVudHMsCi8vIHdoaWNoIGlzIHNwZWMgdmlvbGF0aW9uIC0gaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudHMtZm9jdXNldmVudC1ldmVudC1vcmRlcgovLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ0OTg1NwppZiAoICFzdXBwb3J0LmZvY3VzaW4gKSB7CglqUXVlcnkuZWFjaCggeyBmb2N1czogImZvY3VzaW4iLCBibHVyOiAiZm9jdXNvdXQiIH0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7CgoJCS8vIEF0dGFjaCBhIHNpbmdsZSBjYXB0dXJpbmcgaGFuZGxlciBvbiB0aGUgZG9jdW1lbnQgd2hpbGUgc29tZW9uZSB3YW50cyBmb2N1c2luL2ZvY3Vzb3V0CgkJdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCWpRdWVyeS5ldmVudC5zaW11bGF0ZSggZml4LCBldmVudC50YXJnZXQsIGpRdWVyeS5ldmVudC5maXgoIGV2ZW50ICkgKTsKCQl9OwoKCQlqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7CgkJCXNldHVwOiBmdW5jdGlvbigpIHsKCQkJCXZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcywKCQkJCQlhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKTsKCgkJCQlpZiAoICFhdHRhY2hlcyApIHsKCQkJCQlkb2MuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApOwoJCQkJfQoJCQkJZGF0YVByaXYuYWNjZXNzKCBkb2MsIGZpeCwgKCBhdHRhY2hlcyB8fCAwICkgKyAxICk7CgkJCX0sCgkJCXRlYXJkb3duOiBmdW5jdGlvbigpIHsKCQkJCXZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcywKCQkJCQlhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKSAtIDE7CgoJCQkJaWYgKCAhYXR0YWNoZXMgKSB7CgkJCQkJZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTsKCQkJCQlkYXRhUHJpdi5yZW1vdmUoIGRvYywgZml4ICk7CgoJCQkJfSBlbHNlIHsKCQkJCQlkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4LCBhdHRhY2hlcyApOwoJCQkJfQoJCQl9CgkJfTsKCX0gKTsKfQp2YXIgbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb247Cgp2YXIgbm9uY2UgPSBEYXRlLm5vdygpOwoKdmFyIHJxdWVyeSA9ICggL1w/LyApOwoKCgovLyBDcm9zcy1icm93c2VyIHhtbCBwYXJzaW5nCmpRdWVyeS5wYXJzZVhNTCA9IGZ1bmN0aW9uKCBkYXRhICkgewoJdmFyIHhtbDsKCWlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09ICJzdHJpbmciICkgewoJCXJldHVybiBudWxsOwoJfQoKCS8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5CgkvLyBJRSB0aHJvd3Mgb24gcGFyc2VGcm9tU3RyaW5nIHdpdGggaW52YWxpZCBpbnB1dC4KCXRyeSB7CgkJeG1sID0gKCBuZXcgd2luZG93LkRPTVBhcnNlcigpICkucGFyc2VGcm9tU3RyaW5nKCBkYXRhLCAidGV4dC94bWwiICk7Cgl9IGNhdGNoICggZSApIHsKCQl4bWwgPSB1bmRlZmluZWQ7Cgl9CgoJaWYgKCAheG1sIHx8IHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSggInBhcnNlcmVycm9yIiApLmxlbmd0aCApIHsKCQlqUXVlcnkuZXJyb3IoICJJbnZhbGlkIFhNTDogIiArIGRhdGEgKTsKCX0KCXJldHVybiB4bWw7Cn07CgoKdmFyCglyYnJhY2tldCA9IC9cW1xdJC8sCglyQ1JMRiA9IC9ccj9cbi9nLAoJcnN1Ym1pdHRlclR5cGVzID0gL14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLAoJcnN1Ym1pdHRhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pOwoKZnVuY3Rpb24gYnVpbGRQYXJhbXMoIHByZWZpeCwgb2JqLCB0cmFkaXRpb25hbCwgYWRkICkgewoJdmFyIG5hbWU7CgoJaWYgKCBBcnJheS5pc0FycmF5KCBvYmogKSApIHsKCgkJLy8gU2VyaWFsaXplIGFycmF5IGl0ZW0uCgkJalF1ZXJ5LmVhY2goIG9iaiwgZnVuY3Rpb24oIGksIHYgKSB7CgkJCWlmICggdHJhZGl0aW9uYWwgfHwgcmJyYWNrZXQudGVzdCggcHJlZml4ICkgKSB7CgoJCQkJLy8gVHJlYXQgZWFjaCBhcnJheSBpdGVtIGFzIGEgc2NhbGFyLgoJCQkJYWRkKCBwcmVmaXgsIHYgKTsKCgkJCX0gZWxzZSB7CgoJCQkJLy8gSXRlbSBpcyBub24tc2NhbGFyIChhcnJheSBvciBvYmplY3QpLCBlbmNvZGUgaXRzIG51bWVyaWMgaW5kZXguCgkJCQlidWlsZFBhcmFtcygKCQkJCQlwcmVmaXggKyAiWyIgKyAoIHR5cGVvZiB2ID09PSAib2JqZWN0IiAmJiB2ICE9IG51bGwgPyBpIDogIiIgKSArICJdIiwKCQkJCQl2LAoJCQkJCXRyYWRpdGlvbmFsLAoJCQkJCWFkZAoJCQkJKTsKCQkJfQoJCX0gKTsKCgl9IGVsc2UgaWYgKCAhdHJhZGl0aW9uYWwgJiYgdG9UeXBlKCBvYmogKSA9PT0gIm9iamVjdCIgKSB7CgoJCS8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS4KCQlmb3IgKCBuYW1lIGluIG9iaiApIHsKCQkJYnVpbGRQYXJhbXMoIHByZWZpeCArICJbIiArIG5hbWUgKyAiXSIsIG9ialsgbmFtZSBdLCB0cmFkaXRpb25hbCwgYWRkICk7CgkJfQoKCX0gZWxzZSB7CgoJCS8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS4KCQlhZGQoIHByZWZpeCwgb2JqICk7Cgl9Cn0KCi8vIFNlcmlhbGl6ZSBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzIG9yIGEgc2V0IG9mCi8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZwpqUXVlcnkucGFyYW0gPSBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7Cgl2YXIgcHJlZml4LAoJCXMgPSBbXSwKCQlhZGQgPSBmdW5jdGlvbigga2V5LCB2YWx1ZU9yRnVuY3Rpb24gKSB7CgoJCQkvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHVzZSBpdHMgcmV0dXJuIHZhbHVlCgkJCXZhciB2YWx1ZSA9IGlzRnVuY3Rpb24oIHZhbHVlT3JGdW5jdGlvbiApID8KCQkJCXZhbHVlT3JGdW5jdGlvbigpIDoKCQkJCXZhbHVlT3JGdW5jdGlvbjsKCgkJCXNbIHMubGVuZ3RoIF0gPSBlbmNvZGVVUklDb21wb25lbnQoIGtleSApICsgIj0iICsKCQkJCWVuY29kZVVSSUNvbXBvbmVudCggdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUgKTsKCQl9OwoKCS8vIElmIGFuIGFycmF5IHdhcyBwYXNzZWQgaW4sIGFzc3VtZSB0aGF0IGl0IGlzIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMuCglpZiAoIEFycmF5LmlzQXJyYXkoIGEgKSB8fCAoIGEuanF1ZXJ5ICYmICFqUXVlcnkuaXNQbGFpbk9iamVjdCggYSApICkgKSB7CgoJCS8vIFNlcmlhbGl6ZSB0aGUgZm9ybSBlbGVtZW50cwoJCWpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpIHsKCQkJYWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTsKCQl9ICk7CgoJfSBlbHNlIHsKCgkJLy8gSWYgdHJhZGl0aW9uYWwsIGVuY29kZSB0aGUgIm9sZCIgd2F5ICh0aGUgd2F5IDEuMy4yIG9yIG9sZGVyCgkJLy8gZGlkIGl0KSwgb3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuCgkJZm9yICggcHJlZml4IGluIGEgKSB7CgkJCWJ1aWxkUGFyYW1zKCBwcmVmaXgsIGFbIHByZWZpeCBdLCB0cmFkaXRpb25hbCwgYWRkICk7CgkJfQoJfQoKCS8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb24KCXJldHVybiBzLmpvaW4oICImIiApOwp9OwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJc2VyaWFsaXplOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4galF1ZXJ5LnBhcmFtKCB0aGlzLnNlcmlhbGl6ZUFycmF5KCkgKTsKCX0sCglzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHsKCgkJCS8vIENhbiBhZGQgcHJvcEhvb2sgZm9yICJlbGVtZW50cyIgdG8gZmlsdGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRzCgkJCXZhciBlbGVtZW50cyA9IGpRdWVyeS5wcm9wKCB0aGlzLCAiZWxlbWVudHMiICk7CgkJCXJldHVybiBlbGVtZW50cyA/IGpRdWVyeS5tYWtlQXJyYXkoIGVsZW1lbnRzICkgOiB0aGlzOwoJCX0gKQoJCS5maWx0ZXIoIGZ1bmN0aW9uKCkgewoJCQl2YXIgdHlwZSA9IHRoaXMudHlwZTsKCgkJCS8vIFVzZSAuaXMoICI6ZGlzYWJsZWQiICkgc28gdGhhdCBmaWVsZHNldFtkaXNhYmxlZF0gd29ya3MKCQkJcmV0dXJuIHRoaXMubmFtZSAmJiAhalF1ZXJ5KCB0aGlzICkuaXMoICI6ZGlzYWJsZWQiICkgJiYKCQkJCXJzdWJtaXR0YWJsZS50ZXN0KCB0aGlzLm5vZGVOYW1lICkgJiYgIXJzdWJtaXR0ZXJUeXBlcy50ZXN0KCB0eXBlICkgJiYKCQkJCSggdGhpcy5jaGVja2VkIHx8ICFyY2hlY2thYmxlVHlwZS50ZXN0KCB0eXBlICkgKTsKCQl9ICkKCQkubWFwKCBmdW5jdGlvbiggaSwgZWxlbSApIHsKCQkJdmFyIHZhbCA9IGpRdWVyeSggdGhpcyApLnZhbCgpOwoKCQkJaWYgKCB2YWwgPT0gbnVsbCApIHsKCQkJCXJldHVybiBudWxsOwoJCQl9CgoJCQlpZiAoIEFycmF5LmlzQXJyYXkoIHZhbCApICkgewoJCQkJcmV0dXJuIGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbCApIHsKCQkJCQlyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsICJcclxuIiApIH07CgkJCQl9ICk7CgkJCX0KCgkJCXJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgIlxyXG4iICkgfTsKCQl9ICkuZ2V0KCk7Cgl9Cn0gKTsKCgp2YXIKCXIyMCA9IC8lMjAvZywKCXJoYXNoID0gLyMuKiQvLAoJcmFudGlDYWNoZSA9IC8oWz8mXSlfPVteJl0qLywKCXJoZWFkZXJzID0gL14oLio/KTpbIFx0XSooW15cclxuXSopJC9tZywKCgkvLyAjNzY1MywgIzgxMjUsICM4MTUyOiBsb2NhbCBwcm90b2NvbCBkZXRlY3Rpb24KCXJsb2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sCglybm9Db250ZW50ID0gL14oPzpHRVR8SEVBRCkkLywKCXJwcm90b2NvbCA9IC9eXC9cLy8sCgoJLyogUHJlZmlsdGVycwoJICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSkKCSAqIDIpIFRoZXNlIGFyZSBjYWxsZWQ6CgkgKiAgICAtIEJFRk9SRSBhc2tpbmcgZm9yIGEgdHJhbnNwb3J0CgkgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpCgkgKiAzKSBrZXkgaXMgdGhlIGRhdGFUeXBlCgkgKiA0KSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAoJICogNSkgZXhlY3V0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gY29udGludWUgZG93biB0byAiKiIgaWYgbmVlZGVkCgkgKi8KCXByZWZpbHRlcnMgPSB7fSwKCgkvKiBUcmFuc3BvcnRzIGJpbmRpbmdzCgkgKiAxKSBrZXkgaXMgdGhlIGRhdGFUeXBlCgkgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAoJICogMykgc2VsZWN0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gZ28gdG8gIioiIGlmIG5lZWRlZAoJICovCgl0cmFuc3BvcnRzID0ge30sCgoJLy8gQXZvaWQgY29tbWVudC1wcm9sb2cgY2hhciBzZXF1ZW5jZSAoIzEwMDk4KTsgbXVzdCBhcHBlYXNlIGxpbnQgYW5kIGV2YWRlIGNvbXByZXNzaW9uCglhbGxUeXBlcyA9ICIqLyIuY29uY2F0KCAiKiIgKSwKCgkvLyBBbmNob3IgdGFnIGZvciBwYXJzaW5nIHRoZSBkb2N1bWVudCBvcmlnaW4KCW9yaWdpbkFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJhIiApOwoJb3JpZ2luQW5jaG9yLmhyZWYgPSBsb2NhdGlvbi5ocmVmOwoKLy8gQmFzZSAiY29uc3RydWN0b3IiIGZvciBqUXVlcnkuYWpheFByZWZpbHRlciBhbmQgalF1ZXJ5LmFqYXhUcmFuc3BvcnQKZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7CgoJLy8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byAiKiIKCXJldHVybiBmdW5jdGlvbiggZGF0YVR5cGVFeHByZXNzaW9uLCBmdW5jICkgewoKCQlpZiAoIHR5cGVvZiBkYXRhVHlwZUV4cHJlc3Npb24gIT09ICJzdHJpbmciICkgewoJCQlmdW5jID0gZGF0YVR5cGVFeHByZXNzaW9uOwoJCQlkYXRhVHlwZUV4cHJlc3Npb24gPSAiKiI7CgkJfQoKCQl2YXIgZGF0YVR5cGUsCgkJCWkgPSAwLAoJCQlkYXRhVHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Npb24udG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdOwoKCQlpZiAoIGlzRnVuY3Rpb24oIGZ1bmMgKSApIHsKCgkJCS8vIEZvciBlYWNoIGRhdGFUeXBlIGluIHRoZSBkYXRhVHlwZUV4cHJlc3Npb24KCQkJd2hpbGUgKCAoIGRhdGFUeXBlID0gZGF0YVR5cGVzWyBpKysgXSApICkgewoKCQkJCS8vIFByZXBlbmQgaWYgcmVxdWVzdGVkCgkJCQlpZiAoIGRhdGFUeXBlWyAwIF0gPT09ICIrIiApIHsKCQkJCQlkYXRhVHlwZSA9IGRhdGFUeXBlLnNsaWNlKCAxICkgfHwgIioiOwoJCQkJCSggc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdICkudW5zaGlmdCggZnVuYyApOwoKCQkJCS8vIE90aGVyd2lzZSBhcHBlbmQKCQkJCX0gZWxzZSB7CgkJCQkJKCBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10gKS5wdXNoKCBmdW5jICk7CgkJCQl9CgkJCX0KCQl9Cgl9Owp9CgovLyBCYXNlIGluc3BlY3Rpb24gZnVuY3Rpb24gZm9yIHByZWZpbHRlcnMgYW5kIHRyYW5zcG9ydHMKZnVuY3Rpb24gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiApIHsKCgl2YXIgaW5zcGVjdGVkID0ge30sCgkJc2Vla2luZ1RyYW5zcG9ydCA9ICggc3RydWN0dXJlID09PSB0cmFuc3BvcnRzICk7CgoJZnVuY3Rpb24gaW5zcGVjdCggZGF0YVR5cGUgKSB7CgkJdmFyIHNlbGVjdGVkOwoJCWluc3BlY3RlZFsgZGF0YVR5cGUgXSA9IHRydWU7CgkJalF1ZXJ5LmVhY2goIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSwgZnVuY3Rpb24oIF8sIHByZWZpbHRlck9yRmFjdG9yeSApIHsKCQkJdmFyIGRhdGFUeXBlT3JUcmFuc3BvcnQgPSBwcmVmaWx0ZXJPckZhY3RvcnkoIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTsKCQkJaWYgKCB0eXBlb2YgZGF0YVR5cGVPclRyYW5zcG9ydCA9PT0gInN0cmluZyIgJiYKCQkJCSFzZWVraW5nVHJhbnNwb3J0ICYmICFpbnNwZWN0ZWRbIGRhdGFUeXBlT3JUcmFuc3BvcnQgXSApIHsKCgkJCQlvcHRpb25zLmRhdGFUeXBlcy51bnNoaWZ0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCQlpbnNwZWN0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0gZWxzZSBpZiAoIHNlZWtpbmdUcmFuc3BvcnQgKSB7CgkJCQlyZXR1cm4gISggc2VsZWN0ZWQgPSBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCX0KCQl9ICk7CgkJcmV0dXJuIHNlbGVjdGVkOwoJfQoKCXJldHVybiBpbnNwZWN0KCBvcHRpb25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgIioiIF0gJiYgaW5zcGVjdCggIioiICk7Cn0KCi8vIEEgc3BlY2lhbCBleHRlbmQgZm9yIGFqYXggb3B0aW9ucwovLyB0aGF0IHRha2VzICJmbGF0IiBvcHRpb25zIChub3QgdG8gYmUgZGVlcCBleHRlbmRlZCkKLy8gRml4ZXMgIzk4ODcKZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7Cgl2YXIga2V5LCBkZWVwLAoJCWZsYXRPcHRpb25zID0galF1ZXJ5LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9ucyB8fCB7fTsKCglmb3IgKCBrZXkgaW4gc3JjICkgewoJCWlmICggc3JjWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkgewoJCQkoIGZsYXRPcHRpb25zWyBrZXkgXSA/IHRhcmdldCA6ICggZGVlcCB8fCAoIGRlZXAgPSB7fSApICkgKVsga2V5IF0gPSBzcmNbIGtleSBdOwoJCX0KCX0KCWlmICggZGVlcCApIHsKCQlqUXVlcnkuZXh0ZW5kKCB0cnVlLCB0YXJnZXQsIGRlZXAgKTsKCX0KCglyZXR1cm4gdGFyZ2V0Owp9CgovKiBIYW5kbGVzIHJlc3BvbnNlcyB0byBhbiBhamF4IHJlcXVlc3Q6CiAqIC0gZmluZHMgdGhlIHJpZ2h0IGRhdGFUeXBlIChtZWRpYXRlcyBiZXR3ZWVuIGNvbnRlbnQtdHlwZSBhbmQgZXhwZWN0ZWQgZGF0YVR5cGUpCiAqIC0gcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZQogKi8KZnVuY3Rpb24gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApIHsKCgl2YXIgY3QsIHR5cGUsIGZpbmFsRGF0YVR5cGUsIGZpcnN0RGF0YVR5cGUsCgkJY29udGVudHMgPSBzLmNvbnRlbnRzLAoJCWRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzOwoKCS8vIFJlbW92ZSBhdXRvIGRhdGFUeXBlIGFuZCBnZXQgY29udGVudC10eXBlIGluIHRoZSBwcm9jZXNzCgl3aGlsZSAoIGRhdGFUeXBlc1sgMCBdID09PSAiKiIgKSB7CgkJZGF0YVR5cGVzLnNoaWZ0KCk7CgkJaWYgKCBjdCA9PT0gdW5kZWZpbmVkICkgewoJCQljdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoICJDb250ZW50LVR5cGUiICk7CgkJfQoJfQoKCS8vIENoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIGtub3duIGNvbnRlbnQtdHlwZQoJaWYgKCBjdCApIHsKCQlmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkgewoJCQlpZiAoIGNvbnRlbnRzWyB0eXBlIF0gJiYgY29udGVudHNbIHR5cGUgXS50ZXN0KCBjdCApICkgewoJCQkJZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoKCS8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlwZQoJaWYgKCBkYXRhVHlwZXNbIDAgXSBpbiByZXNwb25zZXMgKSB7CgkJZmluYWxEYXRhVHlwZSA9IGRhdGFUeXBlc1sgMCBdOwoJfSBlbHNlIHsKCgkJLy8gVHJ5IGNvbnZlcnRpYmxlIGRhdGFUeXBlcwoJCWZvciAoIHR5cGUgaW4gcmVzcG9uc2VzICkgewoJCQlpZiAoICFkYXRhVHlwZXNbIDAgXSB8fCBzLmNvbnZlcnRlcnNbIHR5cGUgKyAiICIgKyBkYXRhVHlwZXNbIDAgXSBdICkgewoJCQkJZmluYWxEYXRhVHlwZSA9IHR5cGU7CgkJCQlicmVhazsKCQkJfQoJCQlpZiAoICFmaXJzdERhdGFUeXBlICkgewoJCQkJZmlyc3REYXRhVHlwZSA9IHR5cGU7CgkJCX0KCQl9CgoJCS8vIE9yIGp1c3QgdXNlIGZpcnN0IG9uZQoJCWZpbmFsRGF0YVR5cGUgPSBmaW5hbERhdGFUeXBlIHx8IGZpcnN0RGF0YVR5cGU7Cgl9CgoJLy8gSWYgd2UgZm91bmQgYSBkYXRhVHlwZQoJLy8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWQKCS8vIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UKCWlmICggZmluYWxEYXRhVHlwZSApIHsKCQlpZiAoIGZpbmFsRGF0YVR5cGUgIT09IGRhdGFUeXBlc1sgMCBdICkgewoJCQlkYXRhVHlwZXMudW5zaGlmdCggZmluYWxEYXRhVHlwZSApOwoJCX0KCQlyZXR1cm4gcmVzcG9uc2VzWyBmaW5hbERhdGFUeXBlIF07Cgl9Cn0KCi8qIENoYWluIGNvbnZlcnNpb25zIGdpdmVuIHRoZSByZXF1ZXN0IGFuZCB0aGUgb3JpZ2luYWwgcmVzcG9uc2UKICogQWxzbyBzZXRzIHRoZSByZXNwb25zZVhYWCBmaWVsZHMgb24gdGhlIGpxWEhSIGluc3RhbmNlCiAqLwpmdW5jdGlvbiBhamF4Q29udmVydCggcywgcmVzcG9uc2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKSB7Cgl2YXIgY29udjIsIGN1cnJlbnQsIGNvbnYsIHRtcCwgcHJldiwKCQljb252ZXJ0ZXJzID0ge30sCgoJCS8vIFdvcmsgd2l0aCBhIGNvcHkgb2YgZGF0YVR5cGVzIGluIGNhc2Ugd2UgbmVlZCB0byBtb2RpZnkgaXQgZm9yIGNvbnZlcnNpb24KCQlkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcy5zbGljZSgpOwoKCS8vIENyZWF0ZSBjb252ZXJ0ZXJzIG1hcCB3aXRoIGxvd2VyY2FzZWQga2V5cwoJaWYgKCBkYXRhVHlwZXNbIDEgXSApIHsKCQlmb3IgKCBjb252IGluIHMuY29udmVydGVycyApIHsKCQkJY29udmVydGVyc1sgY29udi50b0xvd2VyQ2FzZSgpIF0gPSBzLmNvbnZlcnRlcnNbIGNvbnYgXTsKCQl9Cgl9CgoJY3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpOwoKCS8vIENvbnZlcnQgdG8gZWFjaCBzZXF1ZW50aWFsIGRhdGFUeXBlCgl3aGlsZSAoIGN1cnJlbnQgKSB7CgoJCWlmICggcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdICkgewoJCQlqcVhIUlsgcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdIF0gPSByZXNwb25zZTsKCQl9CgoJCS8vIEFwcGx5IHRoZSBkYXRhRmlsdGVyIGlmIHByb3ZpZGVkCgkJaWYgKCAhcHJldiAmJiBpc1N1Y2Nlc3MgJiYgcy5kYXRhRmlsdGVyICkgewoJCQlyZXNwb25zZSA9IHMuZGF0YUZpbHRlciggcmVzcG9uc2UsIHMuZGF0YVR5cGUgKTsKCQl9CgoJCXByZXYgPSBjdXJyZW50OwoJCWN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTsKCgkJaWYgKCBjdXJyZW50ICkgewoKCQkJLy8gVGhlcmUncyBvbmx5IHdvcmsgdG8gZG8gaWYgY3VycmVudCBkYXRhVHlwZSBpcyBub24tYXV0bwoJCQlpZiAoIGN1cnJlbnQgPT09ICIqIiApIHsKCgkJCQljdXJyZW50ID0gcHJldjsKCgkJCS8vIENvbnZlcnQgcmVzcG9uc2UgaWYgcHJldiBkYXRhVHlwZSBpcyBub24tYXV0byBhbmQgZGlmZmVycyBmcm9tIGN1cnJlbnQKCQkJfSBlbHNlIGlmICggcHJldiAhPT0gIioiICYmIHByZXYgIT09IGN1cnJlbnQgKSB7CgoJCQkJLy8gU2VlayBhIGRpcmVjdCBjb252ZXJ0ZXIKCQkJCWNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgIiAiICsgY3VycmVudCBdIHx8IGNvbnZlcnRlcnNbICIqICIgKyBjdXJyZW50IF07CgoJCQkJLy8gSWYgbm9uZSBmb3VuZCwgc2VlayBhIHBhaXIKCQkJCWlmICggIWNvbnYgKSB7CgkJCQkJZm9yICggY29udjIgaW4gY29udmVydGVycyApIHsKCgkJCQkJCS8vIElmIGNvbnYyIG91dHB1dHMgY3VycmVudAoJCQkJCQl0bXAgPSBjb252Mi5zcGxpdCggIiAiICk7CgkJCQkJCWlmICggdG1wWyAxIF0gPT09IGN1cnJlbnQgKSB7CgoJCQkJCQkJLy8gSWYgcHJldiBjYW4gYmUgY29udmVydGVkIHRvIGFjY2VwdGVkIGlucHV0CgkJCQkJCQljb252ID0gY29udmVydGVyc1sgcHJldiArICIgIiArIHRtcFsgMCBdIF0gfHwKCQkJCQkJCQljb252ZXJ0ZXJzWyAiKiAiICsgdG1wWyAwIF0gXTsKCQkJCQkJCWlmICggY29udiApIHsKCgkJCQkJCQkJLy8gQ29uZGVuc2UgZXF1aXZhbGVuY2UgY29udmVydGVycwoJCQkJCQkJCWlmICggY29udiA9PT0gdHJ1ZSApIHsKCQkJCQkJCQkJY29udiA9IGNvbnZlcnRlcnNbIGNvbnYyIF07CgoJCQkJCQkJCS8vIE90aGVyd2lzZSwgaW5zZXJ0IHRoZSBpbnRlcm1lZGlhdGUgZGF0YVR5cGUKCQkJCQkJCQl9IGVsc2UgaWYgKCBjb252ZXJ0ZXJzWyBjb252MiBdICE9PSB0cnVlICkgewoJCQkJCQkJCQljdXJyZW50ID0gdG1wWyAwIF07CgkJCQkJCQkJCWRhdGFUeXBlcy51bnNoaWZ0KCB0bXBbIDEgXSApOwoJCQkJCQkJCX0KCQkJCQkJCQlicmVhazsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQkvLyBBcHBseSBjb252ZXJ0ZXIgKGlmIG5vdCBhbiBlcXVpdmFsZW5jZSkKCQkJCWlmICggY29udiAhPT0gdHJ1ZSApIHsKCgkJCQkJLy8gVW5sZXNzIGVycm9ycyBhcmUgYWxsb3dlZCB0byBidWJibGUsIGNhdGNoIGFuZCByZXR1cm4gdGhlbQoJCQkJCWlmICggY29udiAmJiBzLnRocm93cyApIHsKCQkJCQkJcmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXRyeSB7CgkJCQkJCQlyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7CgkJCQkJCX0gY2F0Y2ggKCBlICkgewoJCQkJCQkJcmV0dXJuIHsKCQkJCQkJCQlzdGF0ZTogInBhcnNlcmVycm9yIiwKCQkJCQkJCQllcnJvcjogY29udiA/IGUgOiAiTm8gY29udmVyc2lvbiBmcm9tICIgKyBwcmV2ICsgIiB0byAiICsgY3VycmVudAoJCQkJCQkJfTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0KCglyZXR1cm4geyBzdGF0ZTogInN1Y2Nlc3MiLCBkYXRhOiByZXNwb25zZSB9Owp9CgpqUXVlcnkuZXh0ZW5kKCB7CgoJLy8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBxdWVyaWVzCglhY3RpdmU6IDAsCgoJLy8gTGFzdC1Nb2RpZmllZCBoZWFkZXIgY2FjaGUgZm9yIG5leHQgcmVxdWVzdAoJbGFzdE1vZGlmaWVkOiB7fSwKCWV0YWc6IHt9LAoKCWFqYXhTZXR0aW5nczogewoJCXVybDogbG9jYXRpb24uaHJlZiwKCQl0eXBlOiAiR0VUIiwKCQlpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBsb2NhdGlvbi5wcm90b2NvbCApLAoJCWdsb2JhbDogdHJ1ZSwKCQlwcm9jZXNzRGF0YTogdHJ1ZSwKCQlhc3luYzogdHJ1ZSwKCQljb250ZW50VHlwZTogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsCgoJCS8qCgkJdGltZW91dDogMCwKCQlkYXRhOiBudWxsLAoJCWRhdGFUeXBlOiBudWxsLAoJCXVzZXJuYW1lOiBudWxsLAoJCXBhc3N3b3JkOiBudWxsLAoJCWNhY2hlOiBudWxsLAoJCXRocm93czogZmFsc2UsCgkJdHJhZGl0aW9uYWw6IGZhbHNlLAoJCWhlYWRlcnM6IHt9LAoJCSovCgoJCWFjY2VwdHM6IHsKCQkJIioiOiBhbGxUeXBlcywKCQkJdGV4dDogInRleHQvcGxhaW4iLAoJCQlodG1sOiAidGV4dC9odG1sIiwKCQkJeG1sOiAiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsCgkJCWpzb246ICJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiCgkJfSwKCgkJY29udGVudHM6IHsKCQkJeG1sOiAvXGJ4bWxcYi8sCgkJCWh0bWw6IC9cYmh0bWwvLAoJCQlqc29uOiAvXGJqc29uXGIvCgkJfSwKCgkJcmVzcG9uc2VGaWVsZHM6IHsKCQkJeG1sOiAicmVzcG9uc2VYTUwiLAoJCQl0ZXh0OiAicmVzcG9uc2VUZXh0IiwKCQkJanNvbjogInJlc3BvbnNlSlNPTiIKCQl9LAoKCQkvLyBEYXRhIGNvbnZlcnRlcnMKCQkvLyBLZXlzIHNlcGFyYXRlIHNvdXJjZSAob3IgY2F0Y2hhbGwgIioiKSBhbmQgZGVzdGluYXRpb24gdHlwZXMgd2l0aCBhIHNpbmdsZSBzcGFjZQoJCWNvbnZlcnRlcnM6IHsKCgkJCS8vIENvbnZlcnQgYW55dGhpbmcgdG8gdGV4dAoJCQkiKiB0ZXh0IjogU3RyaW5nLAoKCQkJLy8gVGV4dCB0byBodG1sICh0cnVlID0gbm8gdHJhbnNmb3JtYXRpb24pCgkJCSJ0ZXh0IGh0bWwiOiB0cnVlLAoKCQkJLy8gRXZhbHVhdGUgdGV4dCBhcyBhIGpzb24gZXhwcmVzc2lvbgoJCQkidGV4dCBqc29uIjogSlNPTi5wYXJzZSwKCgkJCS8vIFBhcnNlIHRleHQgYXMgeG1sCgkJCSJ0ZXh0IHhtbCI6IGpRdWVyeS5wYXJzZVhNTAoJCX0sCgoJCS8vIEZvciBvcHRpb25zIHRoYXQgc2hvdWxkbid0IGJlIGRlZXAgZXh0ZW5kZWQ6CgkJLy8geW91IGNhbiBhZGQgeW91ciBvd24gY3VzdG9tIG9wdGlvbnMgaGVyZSBpZgoJCS8vIGFuZCB3aGVuIHlvdSBjcmVhdGUgb25lIHRoYXQgc2hvdWxkbid0IGJlCgkJLy8gZGVlcCBleHRlbmRlZCAoc2VlIGFqYXhFeHRlbmQpCgkJZmxhdE9wdGlvbnM6IHsKCQkJdXJsOiB0cnVlLAoJCQljb250ZXh0OiB0cnVlCgkJfQoJfSwKCgkvLyBDcmVhdGVzIGEgZnVsbCBmbGVkZ2VkIHNldHRpbmdzIG9iamVjdCBpbnRvIHRhcmdldAoJLy8gd2l0aCBib3RoIGFqYXhTZXR0aW5ncyBhbmQgc2V0dGluZ3MgZmllbGRzLgoJLy8gSWYgdGFyZ2V0IGlzIG9taXR0ZWQsIHdyaXRlcyBpbnRvIGFqYXhTZXR0aW5ncy4KCWFqYXhTZXR1cDogZnVuY3Rpb24oIHRhcmdldCwgc2V0dGluZ3MgKSB7CgkJcmV0dXJuIHNldHRpbmdzID8KCgkJCS8vIEJ1aWxkaW5nIGEgc2V0dGluZ3Mgb2JqZWN0CgkJCWFqYXhFeHRlbmQoIGFqYXhFeHRlbmQoIHRhcmdldCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApLCBzZXR0aW5ncyApIDoKCgkJCS8vIEV4dGVuZGluZyBhamF4U2V0dGluZ3MKCQkJYWpheEV4dGVuZCggalF1ZXJ5LmFqYXhTZXR0aW5ncywgdGFyZ2V0ICk7Cgl9LAoKCWFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLAoJYWpheFRyYW5zcG9ydDogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzICksCgoJLy8gTWFpbiBtZXRob2QKCWFqYXg6IGZ1bmN0aW9uKCB1cmwsIG9wdGlvbnMgKSB7CgoJCS8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRlIHByZS0xLjUgc2lnbmF0dXJlCgkJaWYgKCB0eXBlb2YgdXJsID09PSAib2JqZWN0IiApIHsKCQkJb3B0aW9ucyA9IHVybDsKCQkJdXJsID0gdW5kZWZpbmVkOwoJCX0KCgkJLy8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBvYmplY3QKCQlvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCgkJdmFyIHRyYW5zcG9ydCwKCgkJCS8vIFVSTCB3aXRob3V0IGFudGktY2FjaGUgcGFyYW0KCQkJY2FjaGVVUkwsCgoJCQkvLyBSZXNwb25zZSBoZWFkZXJzCgkJCXJlc3BvbnNlSGVhZGVyc1N0cmluZywKCQkJcmVzcG9uc2VIZWFkZXJzLAoKCQkJLy8gdGltZW91dCBoYW5kbGUKCQkJdGltZW91dFRpbWVyLAoKCQkJLy8gVXJsIGNsZWFudXAgdmFyCgkJCXVybEFuY2hvciwKCgkJCS8vIFJlcXVlc3Qgc3RhdGUgKGJlY29tZXMgZmFsc2UgdXBvbiBzZW5kIGFuZCB0cnVlIHVwb24gY29tcGxldGlvbikKCQkJY29tcGxldGVkLAoKCQkJLy8gVG8ga25vdyBpZiBnbG9iYWwgZXZlbnRzIGFyZSB0byBiZSBkaXNwYXRjaGVkCgkJCWZpcmVHbG9iYWxzLAoKCQkJLy8gTG9vcCB2YXJpYWJsZQoJCQlpLAoKCQkJLy8gdW5jYWNoZWQgcGFydCBvZiB0aGUgdXJsCgkJCXVuY2FjaGVkLAoKCQkJLy8gQ3JlYXRlIHRoZSBmaW5hbCBvcHRpb25zIG9iamVjdAoJCQlzID0galF1ZXJ5LmFqYXhTZXR1cCgge30sIG9wdGlvbnMgKSwKCgkJCS8vIENhbGxiYWNrcyBjb250ZXh0CgkJCWNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLAoKCQkJLy8gQ29udGV4dCBmb3IgZ2xvYmFsIGV2ZW50cyBpcyBjYWxsYmFja0NvbnRleHQgaWYgaXQgaXMgYSBET00gbm9kZSBvciBqUXVlcnkgY29sbGVjdGlvbgoJCQlnbG9iYWxFdmVudENvbnRleHQgPSBzLmNvbnRleHQgJiYKCQkJCSggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNrQ29udGV4dC5qcXVlcnkgKSA/CgkJCQkJalF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6CgkJCQkJalF1ZXJ5LmV2ZW50LAoKCQkJLy8gRGVmZXJyZWRzCgkJCWRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCksCgkJCWNvbXBsZXRlRGVmZXJyZWQgPSBqUXVlcnkuQ2FsbGJhY2tzKCAib25jZSBtZW1vcnkiICksCgoJCQkvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcwoJCQlzdGF0dXNDb2RlID0gcy5zdGF0dXNDb2RlIHx8IHt9LAoKCQkJLy8gSGVhZGVycyAodGhleSBhcmUgc2VudCBhbGwgYXQgb25jZSkKCQkJcmVxdWVzdEhlYWRlcnMgPSB7fSwKCQkJcmVxdWVzdEhlYWRlcnNOYW1lcyA9IHt9LAoKCQkJLy8gRGVmYXVsdCBhYm9ydCBtZXNzYWdlCgkJCXN0ckFib3J0ID0gImNhbmNlbGVkIiwKCgkJCS8vIEZha2UgeGhyCgkJCWpxWEhSID0gewoJCQkJcmVhZHlTdGF0ZTogMCwKCgkJCQkvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkCgkJCQlnZXRSZXNwb25zZUhlYWRlcjogZnVuY3Rpb24oIGtleSApIHsKCQkJCQl2YXIgbWF0Y2g7CgkJCQkJaWYgKCBjb21wbGV0ZWQgKSB7CgkJCQkJCWlmICggIXJlc3BvbnNlSGVhZGVycyApIHsKCQkJCQkJCXJlc3BvbnNlSGVhZGVycyA9IHt9OwoJCQkJCQkJd2hpbGUgKCAoIG1hdGNoID0gcmhlYWRlcnMuZXhlYyggcmVzcG9uc2VIZWFkZXJzU3RyaW5nICkgKSApIHsKCQkJCQkJCQlyZXNwb25zZUhlYWRlcnNbIG1hdGNoWyAxIF0udG9Mb3dlckNhc2UoKSBdID0gbWF0Y2hbIDIgXTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQltYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sga2V5LnRvTG93ZXJDYXNlKCkgXTsKCQkJCQl9CgkJCQkJcmV0dXJuIG1hdGNoID09IG51bGwgPyBudWxsIDogbWF0Y2g7CgkJCQl9LAoKCQkJCS8vIFJhdyBzdHJpbmcKCQkJCWdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7CgkJCQkJcmV0dXJuIGNvbXBsZXRlZCA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7CgkJCQl9LAoKCQkJCS8vIENhY2hlcyB0aGUgaGVhZGVyCgkJCQlzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJCQkJaWYgKCBjb21wbGV0ZWQgPT0gbnVsbCApIHsKCQkJCQkJbmFtZSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIG5hbWUudG9Mb3dlckNhc2UoKSBdID0KCQkJCQkJCXJlcXVlc3RIZWFkZXJzTmFtZXNbIG5hbWUudG9Mb3dlckNhc2UoKSBdIHx8IG5hbWU7CgkJCQkJCXJlcXVlc3RIZWFkZXJzWyBuYW1lIF0gPSB2YWx1ZTsKCQkJCQl9CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIE92ZXJyaWRlcyByZXNwb25zZSBjb250ZW50LXR5cGUgaGVhZGVyCgkJCQlvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHsKCQkJCQlpZiAoIGNvbXBsZXRlZCA9PSBudWxsICkgewoJCQkJCQlzLm1pbWVUeXBlID0gdHlwZTsKCQkJCQl9CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzCgkJCQlzdGF0dXNDb2RlOiBmdW5jdGlvbiggbWFwICkgewoJCQkJCXZhciBjb2RlOwoJCQkJCWlmICggbWFwICkgewoJCQkJCQlpZiAoIGNvbXBsZXRlZCApIHsKCgkJCQkJCQkvLyBFeGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3MKCQkJCQkJCWpxWEhSLmFsd2F5cyggbWFwWyBqcVhIUi5zdGF0dXMgXSApOwoJCQkJCQl9IGVsc2UgewoKCQkJCQkJCS8vIExhenktYWRkIHRoZSBuZXcgY2FsbGJhY2tzIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIG9sZCBvbmVzCgkJCQkJCQlmb3IgKCBjb2RlIGluIG1hcCApIHsKCQkJCQkJCQlzdGF0dXNDb2RlWyBjb2RlIF0gPSBbIHN0YXR1c0NvZGVbIGNvZGUgXSwgbWFwWyBjb2RlIF0gXTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0sCgoJCQkJLy8gQ2FuY2VsIHRoZSByZXF1ZXN0CgkJCQlhYm9ydDogZnVuY3Rpb24oIHN0YXR1c1RleHQgKSB7CgkJCQkJdmFyIGZpbmFsVGV4dCA9IHN0YXR1c1RleHQgfHwgc3RyQWJvcnQ7CgkJCQkJaWYgKCB0cmFuc3BvcnQgKSB7CgkJCQkJCXRyYW5zcG9ydC5hYm9ydCggZmluYWxUZXh0ICk7CgkJCQkJfQoJCQkJCWRvbmUoIDAsIGZpbmFsVGV4dCApOwoJCQkJCXJldHVybiB0aGlzOwoJCQkJfQoJCQl9OwoKCQkvLyBBdHRhY2ggZGVmZXJyZWRzCgkJZGVmZXJyZWQucHJvbWlzZSgganFYSFIgKTsKCgkJLy8gQWRkIHByb3RvY29sIGlmIG5vdCBwcm92aWRlZCAocHJlZmlsdGVycyBtaWdodCBleHBlY3QgaXQpCgkJLy8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0ICgjMTAwOTM6IGNvbnNpc3RlbmN5IHdpdGggb2xkIHNpZ25hdHVyZSkKCQkvLyBXZSBhbHNvIHVzZSB0aGUgdXJsIHBhcmFtZXRlciBpZiBhdmFpbGFibGUKCQlzLnVybCA9ICggKCB1cmwgfHwgcy51cmwgfHwgbG9jYXRpb24uaHJlZiApICsgIiIgKQoJCQkucmVwbGFjZSggcnByb3RvY29sLCBsb2NhdGlvbi5wcm90b2NvbCArICIvLyIgKTsKCgkJLy8gQWxpYXMgbWV0aG9kIG9wdGlvbiB0byB0eXBlIGFzIHBlciB0aWNrZXQgIzEyMDA0CgkJcy50eXBlID0gb3B0aW9ucy5tZXRob2QgfHwgb3B0aW9ucy50eXBlIHx8IHMubWV0aG9kIHx8IHMudHlwZTsKCgkJLy8gRXh0cmFjdCBkYXRhVHlwZXMgbGlzdAoJCXMuZGF0YVR5cGVzID0gKCBzLmRhdGFUeXBlIHx8ICIqIiApLnRvTG93ZXJDYXNlKCkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbICIiIF07CgoJCS8vIEEgY3Jvc3MtZG9tYWluIHJlcXVlc3QgaXMgaW4gb3JkZXIgd2hlbiB0aGUgb3JpZ2luIGRvZXNuJ3QgbWF0Y2ggdGhlIGN1cnJlbnQgb3JpZ2luLgoJCWlmICggcy5jcm9zc0RvbWFpbiA9PSBudWxsICkgewoJCQl1cmxBbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiYSIgKTsKCgkJCS8vIFN1cHBvcnQ6IElFIDw9OCAtIDExLCBFZGdlIDEyIC0gMTUKCQkJLy8gSUUgdGhyb3dzIGV4Y2VwdGlvbiBvbiBhY2Nlc3NpbmcgdGhlIGhyZWYgcHJvcGVydHkgaWYgdXJsIGlzIG1hbGZvcm1lZCwKCQkJLy8gZS5nLiBodHRwOi8vZXhhbXBsZS5jb206ODB4LwoJCQl0cnkgewoJCQkJdXJsQW5jaG9yLmhyZWYgPSBzLnVybDsKCgkJCQkvLyBTdXBwb3J0OiBJRSA8PTggLSAxMSBvbmx5CgkJCQkvLyBBbmNob3IncyBob3N0IHByb3BlcnR5IGlzbid0IGNvcnJlY3RseSBzZXQgd2hlbiBzLnVybCBpcyByZWxhdGl2ZQoJCQkJdXJsQW5jaG9yLmhyZWYgPSB1cmxBbmNob3IuaHJlZjsKCQkJCXMuY3Jvc3NEb21haW4gPSBvcmlnaW5BbmNob3IucHJvdG9jb2wgKyAiLy8iICsgb3JpZ2luQW5jaG9yLmhvc3QgIT09CgkJCQkJdXJsQW5jaG9yLnByb3RvY29sICsgIi8vIiArIHVybEFuY2hvci5ob3N0OwoJCQl9IGNhdGNoICggZSApIHsKCgkJCQkvLyBJZiB0aGVyZSBpcyBhbiBlcnJvciBwYXJzaW5nIHRoZSBVUkwsIGFzc3VtZSBpdCBpcyBjcm9zc0RvbWFpbiwKCQkJCS8vIGl0IGNhbiBiZSByZWplY3RlZCBieSB0aGUgdHJhbnNwb3J0IGlmIGl0IGlzIGludmFsaWQKCQkJCXMuY3Jvc3NEb21haW4gPSB0cnVlOwoJCQl9CgkJfQoKCQkvLyBDb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmcKCQlpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmIHR5cGVvZiBzLmRhdGEgIT09ICJzdHJpbmciICkgewoJCQlzLmRhdGEgPSBqUXVlcnkucGFyYW0oIHMuZGF0YSwgcy50cmFkaXRpb25hbCApOwoJCX0KCgkJLy8gQXBwbHkgcHJlZmlsdGVycwoJCWluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzLCBzLCBvcHRpb25zLCBqcVhIUiApOwoKCQkvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVkIGluc2lkZSBhIHByZWZpbHRlciwgc3RvcCB0aGVyZQoJCWlmICggY29tcGxldGVkICkgewoJCQlyZXR1cm4ganFYSFI7CgkJfQoKCQkvLyBXZSBjYW4gZmlyZSBnbG9iYWwgZXZlbnRzIGFzIG9mIG5vdyBpZiBhc2tlZCB0bwoJCS8vIERvbid0IGZpcmUgZXZlbnRzIGlmIGpRdWVyeS5ldmVudCBpcyB1bmRlZmluZWQgaW4gYW4gQU1ELXVzYWdlIHNjZW5hcmlvICgjMTUxMTgpCgkJZmlyZUdsb2JhbHMgPSBqUXVlcnkuZXZlbnQgJiYgcy5nbG9iYWw7CgoJCS8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHMKCQlpZiAoIGZpcmVHbG9iYWxzICYmIGpRdWVyeS5hY3RpdmUrKyA9PT0gMCApIHsKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RhcnQiICk7CgkJfQoKCQkvLyBVcHBlcmNhc2UgdGhlIHR5cGUKCQlzLnR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTsKCgkJLy8gRGV0ZXJtaW5lIGlmIHJlcXVlc3QgaGFzIGNvbnRlbnQKCQlzLmhhc0NvbnRlbnQgPSAhcm5vQ29udGVudC50ZXN0KCBzLnR5cGUgKTsKCgkJLy8gU2F2ZSB0aGUgVVJMIGluIGNhc2Ugd2UncmUgdG95aW5nIHdpdGggdGhlIElmLU1vZGlmaWVkLVNpbmNlCgkJLy8gYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyIGxhdGVyIG9uCgkJLy8gUmVtb3ZlIGhhc2ggdG8gc2ltcGxpZnkgdXJsIG1hbmlwdWxhdGlvbgoJCWNhY2hlVVJMID0gcy51cmwucmVwbGFjZSggcmhhc2gsICIiICk7CgoJCS8vIE1vcmUgb3B0aW9ucyBoYW5kbGluZyBmb3IgcmVxdWVzdHMgd2l0aCBubyBjb250ZW50CgkJaWYgKCAhcy5oYXNDb250ZW50ICkgewoKCQkJLy8gUmVtZW1iZXIgdGhlIGhhc2ggc28gd2UgY2FuIHB1dCBpdCBiYWNrCgkJCXVuY2FjaGVkID0gcy51cmwuc2xpY2UoIGNhY2hlVVJMLmxlbmd0aCApOwoKCQkJLy8gSWYgZGF0YSBpcyBhdmFpbGFibGUgYW5kIHNob3VsZCBiZSBwcm9jZXNzZWQsIGFwcGVuZCBkYXRhIHRvIHVybAoJCQlpZiAoIHMuZGF0YSAmJiAoIHMucHJvY2Vzc0RhdGEgfHwgdHlwZW9mIHMuZGF0YSA9PT0gInN0cmluZyIgKSApIHsKCQkJCWNhY2hlVVJMICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyAiJiIgOiAiPyIgKSArIHMuZGF0YTsKCgkJCQkvLyAjOTY4MjogcmVtb3ZlIGRhdGEgc28gdGhhdCBpdCdzIG5vdCB1c2VkIGluIGFuIGV2ZW50dWFsIHJldHJ5CgkJCQlkZWxldGUgcy5kYXRhOwoJCQl9CgoJCQkvLyBBZGQgb3IgdXBkYXRlIGFudGktY2FjaGUgcGFyYW0gaWYgbmVlZGVkCgkJCWlmICggcy5jYWNoZSA9PT0gZmFsc2UgKSB7CgkJCQljYWNoZVVSTCA9IGNhY2hlVVJMLnJlcGxhY2UoIHJhbnRpQ2FjaGUsICIkMSIgKTsKCQkJCXVuY2FjaGVkID0gKCBycXVlcnkudGVzdCggY2FjaGVVUkwgKSA/ICImIiA6ICI/IiApICsgIl89IiArICggbm9uY2UrKyApICsgdW5jYWNoZWQ7CgkJCX0KCgkJCS8vIFB1dCBoYXNoIGFuZCBhbnRpLWNhY2hlIG9uIHRoZSBVUkwgdGhhdCB3aWxsIGJlIHJlcXVlc3RlZCAoZ2gtMTczMikKCQkJcy51cmwgPSBjYWNoZVVSTCArIHVuY2FjaGVkOwoKCQkvLyBDaGFuZ2UgJyUyMCcgdG8gJysnIGlmIHRoaXMgaXMgZW5jb2RlZCBmb3JtIGJvZHkgY29udGVudCAoZ2gtMjY1OCkKCQl9IGVsc2UgaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJgoJCQkoIHMuY29udGVudFR5cGUgfHwgIiIgKS5pbmRleE9mKCAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiApID09PSAwICkgewoJCQlzLmRhdGEgPSBzLmRhdGEucmVwbGFjZSggcjIwLCAiKyIgKTsKCQl9CgoJCS8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuCgkJaWYgKCBzLmlmTW9kaWZpZWQgKSB7CgkJCWlmICggalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApIHsKCQkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJZi1Nb2RpZmllZC1TaW5jZSIsIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKTsKCQkJfQoJCQlpZiAoIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICkgewoJCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRlciggIklmLU5vbmUtTWF0Y2giLCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApOwoJCQl9CgkJfQoKCQkvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnQKCQlpZiAoIHMuZGF0YSAmJiBzLmhhc0NvbnRlbnQgJiYgcy5jb250ZW50VHlwZSAhPT0gZmFsc2UgfHwgb3B0aW9ucy5jb250ZW50VHlwZSApIHsKCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRlciggIkNvbnRlbnQtVHlwZSIsIHMuY29udGVudFR5cGUgKTsKCQl9CgoJCS8vIFNldCB0aGUgQWNjZXB0cyBoZWFkZXIgZm9yIHRoZSBzZXJ2ZXIsIGRlcGVuZGluZyBvbiB0aGUgZGF0YVR5cGUKCQlqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKAoJCQkiQWNjZXB0IiwKCQkJcy5kYXRhVHlwZXNbIDAgXSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSA/CgkJCQlzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSArCgkJCQkJKCBzLmRhdGFUeXBlc1sgMCBdICE9PSAiKiIgPyAiLCAiICsgYWxsVHlwZXMgKyAiOyBxPTAuMDEiIDogIiIgKSA6CgkJCQlzLmFjY2VwdHNbICIqIiBdCgkJKTsKCgkJLy8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9uCgkJZm9yICggaSBpbiBzLmhlYWRlcnMgKSB7CgkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIGksIHMuaGVhZGVyc1sgaSBdICk7CgkJfQoKCQkvLyBBbGxvdyBjdXN0b20gaGVhZGVycy9taW1ldHlwZXMgYW5kIGVhcmx5IGFib3J0CgkJaWYgKCBzLmJlZm9yZVNlbmQgJiYKCQkJKCBzLmJlZm9yZVNlbmQuY2FsbCggY2FsbGJhY2tDb250ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBjb21wbGV0ZWQgKSApIHsKCgkJCS8vIEFib3J0IGlmIG5vdCBkb25lIGFscmVhZHkgYW5kIHJldHVybgoJCQlyZXR1cm4ganFYSFIuYWJvcnQoKTsKCQl9CgoJCS8vIEFib3J0aW5nIGlzIG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvbgoJCXN0ckFib3J0ID0gImFib3J0IjsKCgkJLy8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzCgkJY29tcGxldGVEZWZlcnJlZC5hZGQoIHMuY29tcGxldGUgKTsKCQlqcVhIUi5kb25lKCBzLnN1Y2Nlc3MgKTsKCQlqcVhIUi5mYWlsKCBzLmVycm9yICk7CgoJCS8vIEdldCB0cmFuc3BvcnQKCQl0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTsKCgkJLy8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0CgkJaWYgKCAhdHJhbnNwb3J0ICkgewoJCQlkb25lKCAtMSwgIk5vIFRyYW5zcG9ydCIgKTsKCQl9IGVsc2UgewoJCQlqcVhIUi5yZWFkeVN0YXRlID0gMTsKCgkJCS8vIFNlbmQgZ2xvYmFsIGV2ZW50CgkJCWlmICggZmlyZUdsb2JhbHMgKSB7CgkJCQlnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggImFqYXhTZW5kIiwgWyBqcVhIUiwgcyBdICk7CgkJCX0KCgkJCS8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGFqYXhTZW5kLCBzdG9wIHRoZXJlCgkJCWlmICggY29tcGxldGVkICkgewoJCQkJcmV0dXJuIGpxWEhSOwoJCQl9CgoJCQkvLyBUaW1lb3V0CgkJCWlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkgewoJCQkJdGltZW91dFRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgewoJCQkJCWpxWEhSLmFib3J0KCAidGltZW91dCIgKTsKCQkJCX0sIHMudGltZW91dCApOwoJCQl9CgoJCQl0cnkgewoJCQkJY29tcGxldGVkID0gZmFsc2U7CgkJCQl0cmFuc3BvcnQuc2VuZCggcmVxdWVzdEhlYWRlcnMsIGRvbmUgKTsKCQkJfSBjYXRjaCAoIGUgKSB7CgoJCQkJLy8gUmV0aHJvdyBwb3N0LWNvbXBsZXRpb24gZXhjZXB0aW9ucwoJCQkJaWYgKCBjb21wbGV0ZWQgKSB7CgkJCQkJdGhyb3cgZTsKCQkJCX0KCgkJCQkvLyBQcm9wYWdhdGUgb3RoZXJzIGFzIHJlc3VsdHMKCQkJCWRvbmUoIC0xLCBlICk7CgkJCX0KCQl9CgoJCS8vIENhbGxiYWNrIGZvciB3aGVuIGV2ZXJ5dGhpbmcgaXMgZG9uZQoJCWZ1bmN0aW9uIGRvbmUoIHN0YXR1cywgbmF0aXZlU3RhdHVzVGV4dCwgcmVzcG9uc2VzLCBoZWFkZXJzICkgewoJCQl2YXIgaXNTdWNjZXNzLCBzdWNjZXNzLCBlcnJvciwgcmVzcG9uc2UsIG1vZGlmaWVkLAoJCQkJc3RhdHVzVGV4dCA9IG5hdGl2ZVN0YXR1c1RleHQ7CgoJCQkvLyBJZ25vcmUgcmVwZWF0IGludm9jYXRpb25zCgkJCWlmICggY29tcGxldGVkICkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQljb21wbGV0ZWQgPSB0cnVlOwoKCQkJLy8gQ2xlYXIgdGltZW91dCBpZiBpdCBleGlzdHMKCQkJaWYgKCB0aW1lb3V0VGltZXIgKSB7CgkJCQl3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0VGltZXIgKTsKCQkJfQoKCQkJLy8gRGVyZWZlcmVuY2UgdHJhbnNwb3J0IGZvciBlYXJseSBnYXJiYWdlIGNvbGxlY3Rpb24KCQkJLy8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZCkKCQkJdHJhbnNwb3J0ID0gdW5kZWZpbmVkOwoKCQkJLy8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVycwoJCQlyZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJzIHx8ICIiOwoKCQkJLy8gU2V0IHJlYWR5U3RhdGUKCQkJanFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDsKCgkJCS8vIERldGVybWluZSBpZiBzdWNjZXNzZnVsCgkJCWlzU3VjY2VzcyA9IHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1cyA9PT0gMzA0OwoKCQkJLy8gR2V0IHJlc3BvbnNlIGRhdGEKCQkJaWYgKCByZXNwb25zZXMgKSB7CgkJCQlyZXNwb25zZSA9IGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKTsKCQkJfQoKCQkJLy8gQ29udmVydCBubyBtYXR0ZXIgd2hhdCAodGhhdCB3YXkgcmVzcG9uc2VYWFggZmllbGRzIGFyZSBhbHdheXMgc2V0KQoJCQlyZXNwb25zZSA9IGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApOwoKCQkJLy8gSWYgc3VjY2Vzc2Z1bCwgaGFuZGxlIHR5cGUgY2hhaW5pbmcKCQkJaWYgKCBpc1N1Y2Nlc3MgKSB7CgoJCQkJLy8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS4KCQkJCWlmICggcy5pZk1vZGlmaWVkICkgewoJCQkJCW1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoICJMYXN0LU1vZGlmaWVkIiApOwoJCQkJCWlmICggbW9kaWZpZWQgKSB7CgkJCQkJCWpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDsKCQkJCQl9CgkJCQkJbW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggImV0YWciICk7CgkJCQkJaWYgKCBtb2RpZmllZCApIHsKCQkJCQkJalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDsKCQkJCQl9CgkJCQl9CgoJCQkJLy8gaWYgbm8gY29udGVudAoJCQkJaWYgKCBzdGF0dXMgPT09IDIwNCB8fCBzLnR5cGUgPT09ICJIRUFEIiApIHsKCQkJCQlzdGF0dXNUZXh0ID0gIm5vY29udGVudCI7CgoJCQkJLy8gaWYgbm90IG1vZGlmaWVkCgkJCQl9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDMwNCApIHsKCQkJCQlzdGF0dXNUZXh0ID0gIm5vdG1vZGlmaWVkIjsKCgkJCQkvLyBJZiB3ZSBoYXZlIGRhdGEsIGxldCdzIGNvbnZlcnQgaXQKCQkJCX0gZWxzZSB7CgkJCQkJc3RhdHVzVGV4dCA9IHJlc3BvbnNlLnN0YXRlOwoJCQkJCXN1Y2Nlc3MgPSByZXNwb25zZS5kYXRhOwoJCQkJCWVycm9yID0gcmVzcG9uc2UuZXJyb3I7CgkJCQkJaXNTdWNjZXNzID0gIWVycm9yOwoJCQkJfQoJCQl9IGVsc2UgewoKCQkJCS8vIEV4dHJhY3QgZXJyb3IgZnJvbSBzdGF0dXNUZXh0IGFuZCBub3JtYWxpemUgZm9yIG5vbi1hYm9ydHMKCQkJCWVycm9yID0gc3RhdHVzVGV4dDsKCQkJCWlmICggc3RhdHVzIHx8ICFzdGF0dXNUZXh0ICkgewoJCQkJCXN0YXR1c1RleHQgPSAiZXJyb3IiOwoJCQkJCWlmICggc3RhdHVzIDwgMCApIHsKCQkJCQkJc3RhdHVzID0gMDsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCS8vIFNldCBkYXRhIGZvciB0aGUgZmFrZSB4aHIgb2JqZWN0CgkJCWpxWEhSLnN0YXR1cyA9IHN0YXR1czsKCQkJanFYSFIuc3RhdHVzVGV4dCA9ICggbmF0aXZlU3RhdHVzVGV4dCB8fCBzdGF0dXNUZXh0ICkgKyAiIjsKCgkJCS8vIFN1Y2Nlc3MvRXJyb3IKCQkJaWYgKCBpc1N1Y2Nlc3MgKSB7CgkJCQlkZWZlcnJlZC5yZXNvbHZlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIHN1Y2Nlc3MsIHN0YXR1c1RleHQsIGpxWEhSIF0gKTsKCQkJfSBlbHNlIHsKCQkJCWRlZmVycmVkLnJlamVjdFdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCwgZXJyb3IgXSApOwoJCQl9CgoJCQkvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcwoJCQlqcVhIUi5zdGF0dXNDb2RlKCBzdGF0dXNDb2RlICk7CgkJCXN0YXR1c0NvZGUgPSB1bmRlZmluZWQ7CgoJCQlpZiAoIGZpcmVHbG9iYWxzICkgewoJCQkJZ2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIGlzU3VjY2VzcyA/ICJhamF4U3VjY2VzcyIgOiAiYWpheEVycm9yIiwKCQkJCQlbIGpxWEhSLCBzLCBpc1N1Y2Nlc3MgPyBzdWNjZXNzIDogZXJyb3IgXSApOwoJCQl9CgoJCQkvLyBDb21wbGV0ZQoJCQljb21wbGV0ZURlZmVycmVkLmZpcmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQgXSApOwoKCQkJaWYgKCBmaXJlR2xvYmFscyApIHsKCQkJCWdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCAiYWpheENvbXBsZXRlIiwgWyBqcVhIUiwgcyBdICk7CgoJCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCgkJCQlpZiAoICEoIC0talF1ZXJ5LmFjdGl2ZSApICkgewoJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0b3AiICk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBqcVhIUjsKCX0sCgoJZ2V0SlNPTjogZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2sgKSB7CgkJcmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgZGF0YSwgY2FsbGJhY2ssICJqc29uIiApOwoJfSwKCglnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkgewoJCXJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIHVuZGVmaW5lZCwgY2FsbGJhY2ssICJzY3JpcHQiICk7Cgl9Cn0gKTsKCmpRdWVyeS5lYWNoKCBbICJnZXQiLCAicG9zdCIgXSwgZnVuY3Rpb24oIGksIG1ldGhvZCApIHsKCWpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKCgkJLy8gU2hpZnQgYXJndW1lbnRzIGlmIGRhdGEgYXJndW1lbnQgd2FzIG9taXR0ZWQKCQlpZiAoIGlzRnVuY3Rpb24oIGRhdGEgKSApIHsKCQkJdHlwZSA9IHR5cGUgfHwgY2FsbGJhY2s7CgkJCWNhbGxiYWNrID0gZGF0YTsKCQkJZGF0YSA9IHVuZGVmaW5lZDsKCQl9CgoJCS8vIFRoZSB1cmwgY2FuIGJlIGFuIG9wdGlvbnMgb2JqZWN0ICh3aGljaCB0aGVuIG11c3QgaGF2ZSAudXJsKQoJCXJldHVybiBqUXVlcnkuYWpheCggalF1ZXJ5LmV4dGVuZCggewoJCQl1cmw6IHVybCwKCQkJdHlwZTogbWV0aG9kLAoJCQlkYXRhVHlwZTogdHlwZSwKCQkJZGF0YTogZGF0YSwKCQkJc3VjY2VzczogY2FsbGJhY2sKCQl9LCBqUXVlcnkuaXNQbGFpbk9iamVjdCggdXJsICkgJiYgdXJsICkgKTsKCX07Cn0gKTsKCgpqUXVlcnkuX2V2YWxVcmwgPSBmdW5jdGlvbiggdXJsICkgewoJcmV0dXJuIGpRdWVyeS5hamF4KCB7CgkJdXJsOiB1cmwsCgoJCS8vIE1ha2UgdGhpcyBleHBsaWNpdCwgc2luY2UgdXNlciBjYW4gb3ZlcnJpZGUgdGhpcyB0aHJvdWdoIGFqYXhTZXR1cCAoIzExMjY0KQoJCXR5cGU6ICJHRVQiLAoJCWRhdGFUeXBlOiAic2NyaXB0IiwKCQljYWNoZTogdHJ1ZSwKCQlhc3luYzogZmFsc2UsCgkJZ2xvYmFsOiBmYWxzZSwKCQkidGhyb3dzIjogdHJ1ZQoJfSApOwp9OwoKCmpRdWVyeS5mbi5leHRlbmQoIHsKCXdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkgewoJCXZhciB3cmFwOwoKCQlpZiAoIHRoaXNbIDAgXSApIHsKCQkJaWYgKCBpc0Z1bmN0aW9uKCBodG1sICkgKSB7CgkJCQlodG1sID0gaHRtbC5jYWxsKCB0aGlzWyAwIF0gKTsKCQkJfQoKCQkJLy8gVGhlIGVsZW1lbnRzIHRvIHdyYXAgdGhlIHRhcmdldCBhcm91bmQKCQkJd3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1sgMCBdLm93bmVyRG9jdW1lbnQgKS5lcSggMCApLmNsb25lKCB0cnVlICk7CgoJCQlpZiAoIHRoaXNbIDAgXS5wYXJlbnROb2RlICkgewoJCQkJd3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbIDAgXSApOwoJCQl9CgoJCQl3cmFwLm1hcCggZnVuY3Rpb24oKSB7CgkJCQl2YXIgZWxlbSA9IHRoaXM7CgoJCQkJd2hpbGUgKCBlbGVtLmZpcnN0RWxlbWVudENoaWxkICkgewoJCQkJCWVsZW0gPSBlbGVtLmZpcnN0RWxlbWVudENoaWxkOwoJCQkJfQoKCQkJCXJldHVybiBlbGVtOwoJCQl9ICkuYXBwZW5kKCB0aGlzICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJd3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHsKCQlpZiAoIGlzRnVuY3Rpb24oIGh0bWwgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7CgkJCQlqUXVlcnkoIHRoaXMgKS53cmFwSW5uZXIoIGh0bWwuY2FsbCggdGhpcywgaSApICk7CgkJCX0gKTsKCQl9CgoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApLAoJCQkJY29udGVudHMgPSBzZWxmLmNvbnRlbnRzKCk7CgoJCQlpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHsKCQkJCWNvbnRlbnRzLndyYXBBbGwoIGh0bWwgKTsKCgkJCX0gZWxzZSB7CgkJCQlzZWxmLmFwcGVuZCggaHRtbCApOwoJCQl9CgkJfSApOwoJfSwKCgl3cmFwOiBmdW5jdGlvbiggaHRtbCApIHsKCQl2YXIgaHRtbElzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCBodG1sICk7CgoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkgewoJCQlqUXVlcnkoIHRoaXMgKS53cmFwQWxsKCBodG1sSXNGdW5jdGlvbiA/IGh0bWwuY2FsbCggdGhpcywgaSApIDogaHRtbCApOwoJCX0gKTsKCX0sCgoJdW53cmFwOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJdGhpcy5wYXJlbnQoIHNlbGVjdG9yICkubm90KCAiYm9keSIgKS5lYWNoKCBmdW5jdGlvbigpIHsKCQkJalF1ZXJ5KCB0aGlzICkucmVwbGFjZVdpdGgoIHRoaXMuY2hpbGROb2RlcyApOwoJCX0gKTsKCQlyZXR1cm4gdGhpczsKCX0KfSApOwoKCmpRdWVyeS5leHByLnBzZXVkb3MuaGlkZGVuID0gZnVuY3Rpb24oIGVsZW0gKSB7CglyZXR1cm4gIWpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSggZWxlbSApOwp9OwpqUXVlcnkuZXhwci5wc2V1ZG9zLnZpc2libGUgPSBmdW5jdGlvbiggZWxlbSApIHsKCXJldHVybiAhISggZWxlbS5vZmZzZXRXaWR0aCB8fCBlbGVtLm9mZnNldEhlaWdodCB8fCBlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoICk7Cn07CgoKCgpqUXVlcnkuYWpheFNldHRpbmdzLnhociA9IGZ1bmN0aW9uKCkgewoJdHJ5IHsKCQlyZXR1cm4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpOwoJfSBjYXRjaCAoIGUgKSB7fQp9OwoKdmFyIHhoclN1Y2Nlc3NTdGF0dXMgPSB7CgoJCS8vIEZpbGUgcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgY29kZSAwLCBhc3N1bWUgMjAwCgkJMDogMjAwLAoKCQkvLyBTdXBwb3J0OiBJRSA8PTkgb25seQoJCS8vICMxNDUwOiBzb21ldGltZXMgSUUgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNAoJCTEyMjM6IDIwNAoJfSwKCXhoclN1cHBvcnRlZCA9IGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCk7CgpzdXBwb3J0LmNvcnMgPSAhIXhoclN1cHBvcnRlZCAmJiAoICJ3aXRoQ3JlZGVudGlhbHMiIGluIHhoclN1cHBvcnRlZCApOwpzdXBwb3J0LmFqYXggPSB4aHJTdXBwb3J0ZWQgPSAhIXhoclN1cHBvcnRlZDsKCmpRdWVyeS5hamF4VHJhbnNwb3J0KCBmdW5jdGlvbiggb3B0aW9ucyApIHsKCXZhciBjYWxsYmFjaywgZXJyb3JDYWxsYmFjazsKCgkvLyBDcm9zcyBkb21haW4gb25seSBhbGxvd2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0CglpZiAoIHN1cHBvcnQuY29ycyB8fCB4aHJTdXBwb3J0ZWQgJiYgIW9wdGlvbnMuY3Jvc3NEb21haW4gKSB7CgkJcmV0dXJuIHsKCQkJc2VuZDogZnVuY3Rpb24oIGhlYWRlcnMsIGNvbXBsZXRlICkgewoJCQkJdmFyIGksCgkJCQkJeGhyID0gb3B0aW9ucy54aHIoKTsKCgkJCQl4aHIub3BlbigKCQkJCQlvcHRpb25zLnR5cGUsCgkJCQkJb3B0aW9ucy51cmwsCgkJCQkJb3B0aW9ucy5hc3luYywKCQkJCQlvcHRpb25zLnVzZXJuYW1lLAoJCQkJCW9wdGlvbnMucGFzc3dvcmQKCQkJCSk7CgoJCQkJLy8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZAoJCQkJaWYgKCBvcHRpb25zLnhockZpZWxkcyApIHsKCQkJCQlmb3IgKCBpIGluIG9wdGlvbnMueGhyRmllbGRzICkgewoJCQkJCQl4aHJbIGkgXSA9IG9wdGlvbnMueGhyRmllbGRzWyBpIF07CgkJCQkJfQoJCQkJfQoKCQkJCS8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWQKCQkJCWlmICggb3B0aW9ucy5taW1lVHlwZSAmJiB4aHIub3ZlcnJpZGVNaW1lVHlwZSApIHsKCQkJCQl4aHIub3ZlcnJpZGVNaW1lVHlwZSggb3B0aW9ucy5taW1lVHlwZSApOwoJCQkJfQoKCQkJCS8vIFgtUmVxdWVzdGVkLVdpdGggaGVhZGVyCgkJCQkvLyBGb3IgY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzZWVpbmcgYXMgY29uZGl0aW9ucyBmb3IgYSBwcmVmbGlnaHQgYXJlCgkJCQkvLyBha2luIHRvIGEgamlnc2F3IHB1enpsZSwgd2Ugc2ltcGx5IG5ldmVyIHNldCBpdCB0byBiZSBzdXJlLgoJCQkJLy8gKGl0IGNhbiBhbHdheXMgYmUgc2V0IG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgb3IgZXZlbiB1c2luZyBhamF4U2V0dXApCgkJCQkvLyBGb3Igc2FtZS1kb21haW4gcmVxdWVzdHMsIHdvbid0IGNoYW5nZSBoZWFkZXIgaWYgYWxyZWFkeSBwcm92aWRlZC4KCQkJCWlmICggIW9wdGlvbnMuY3Jvc3NEb21haW4gJiYgIWhlYWRlcnNbICJYLVJlcXVlc3RlZC1XaXRoIiBdICkgewoJCQkJCWhlYWRlcnNbICJYLVJlcXVlc3RlZC1XaXRoIiBdID0gIlhNTEh0dHBSZXF1ZXN0IjsKCQkJCX0KCgkJCQkvLyBTZXQgaGVhZGVycwoJCQkJZm9yICggaSBpbiBoZWFkZXJzICkgewoJCQkJCXhoci5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFkZXJzWyBpIF0gKTsKCQkJCX0KCgkJCQkvLyBDYWxsYmFjawoJCQkJY2FsbGJhY2sgPSBmdW5jdGlvbiggdHlwZSApIHsKCQkJCQlyZXR1cm4gZnVuY3Rpb24oKSB7CgkJCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJCQljYWxsYmFjayA9IGVycm9yQ2FsbGJhY2sgPSB4aHIub25sb2FkID0KCQkJCQkJCQl4aHIub25lcnJvciA9IHhoci5vbmFib3J0ID0geGhyLm9udGltZW91dCA9CgkJCQkJCQkJCXhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsOwoKCQkJCQkJCWlmICggdHlwZSA9PT0gImFib3J0IiApIHsKCQkJCQkJCQl4aHIuYWJvcnQoKTsKCQkJCQkJCX0gZWxzZSBpZiAoIHR5cGUgPT09ICJlcnJvciIgKSB7CgoJCQkJCQkJCS8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5CgkJCQkJCQkJLy8gT24gYSBtYW51YWwgbmF0aXZlIGFib3J0LCBJRTkgdGhyb3dzCgkJCQkJCQkJLy8gZXJyb3JzIG9uIGFueSBwcm9wZXJ0eSBhY2Nlc3MgdGhhdCBpcyBub3QgcmVhZHlTdGF0ZQoJCQkJCQkJCWlmICggdHlwZW9mIHhoci5zdGF0dXMgIT09ICJudW1iZXIiICkgewoJCQkJCQkJCQljb21wbGV0ZSggMCwgImVycm9yIiApOwoJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCWNvbXBsZXRlKAoKCQkJCQkJCQkJCS8vIEZpbGU6IHByb3RvY29sIGFsd2F5cyB5aWVsZHMgc3RhdHVzIDA7IHNlZSAjODYwNSwgIzE0MjA3CgkJCQkJCQkJCQl4aHIuc3RhdHVzLAoJCQkJCQkJCQkJeGhyLnN0YXR1c1RleHQKCQkJCQkJCQkJKTsKCQkJCQkJCQl9CgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCWNvbXBsZXRlKAoJCQkJCQkJCQl4aHJTdWNjZXNzU3RhdHVzWyB4aHIuc3RhdHVzIF0gfHwgeGhyLnN0YXR1cywKCQkJCQkJCQkJeGhyLnN0YXR1c1RleHQsCgoJCQkJCQkJCQkvLyBTdXBwb3J0OiBJRSA8PTkgb25seQoJCQkJCQkJCQkvLyBJRTkgaGFzIG5vIFhIUjIgYnV0IHRocm93cyBvbiBiaW5hcnkgKHRyYWMtMTE0MjYpCgkJCQkJCQkJCS8vIEZvciBYSFIyIG5vbi10ZXh0LCBsZXQgdGhlIGNhbGxlciBoYW5kbGUgaXQgKGdoLTI0OTgpCgkJCQkJCQkJCSggeGhyLnJlc3BvbnNlVHlwZSB8fCAidGV4dCIgKSAhPT0gInRleHQiICB8fAoJCQkJCQkJCQl0eXBlb2YgeGhyLnJlc3BvbnNlVGV4dCAhPT0gInN0cmluZyIgPwoJCQkJCQkJCQkJeyBiaW5hcnk6IHhoci5yZXNwb25zZSB9IDoKCQkJCQkJCQkJCXsgdGV4dDogeGhyLnJlc3BvbnNlVGV4dCB9LAoJCQkJCQkJCQl4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkKCQkJCQkJCQkpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfTsKCQkJCX07CgoJCQkJLy8gTGlzdGVuIHRvIGV2ZW50cwoJCQkJeGhyLm9ubG9hZCA9IGNhbGxiYWNrKCk7CgkJCQllcnJvckNhbGxiYWNrID0geGhyLm9uZXJyb3IgPSB4aHIub250aW1lb3V0ID0gY2FsbGJhY2soICJlcnJvciIgKTsKCgkJCQkvLyBTdXBwb3J0OiBJRSA5IG9ubHkKCQkJCS8vIFVzZSBvbnJlYWR5c3RhdGVjaGFuZ2UgdG8gcmVwbGFjZSBvbmFib3J0CgkJCQkvLyB0byBoYW5kbGUgdW5jYXVnaHQgYWJvcnRzCgkJCQlpZiAoIHhoci5vbmFib3J0ICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJeGhyLm9uYWJvcnQgPSBlcnJvckNhbGxiYWNrOwoJCQkJfSBlbHNlIHsKCQkJCQl4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7CgoJCQkJCQkvLyBDaGVjayByZWFkeVN0YXRlIGJlZm9yZSB0aW1lb3V0IGFzIGl0IGNoYW5nZXMKCQkJCQkJaWYgKCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApIHsKCgkJCQkJCQkvLyBBbGxvdyBvbmVycm9yIHRvIGJlIGNhbGxlZCBmaXJzdCwKCQkJCQkJCS8vIGJ1dCB0aGF0IHdpbGwgbm90IGhhbmRsZSBhIG5hdGl2ZSBhYm9ydAoJCQkJCQkJLy8gQWxzbywgc2F2ZSBlcnJvckNhbGxiYWNrIHRvIGEgdmFyaWFibGUKCQkJCQkJCS8vIGFzIHhoci5vbmVycm9yIGNhbm5vdCBiZSBhY2Nlc3NlZAoJCQkJCQkJd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgewoJCQkJCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJCQkJCWVycm9yQ2FsbGJhY2soKTsKCQkJCQkJCQl9CgkJCQkJCQl9ICk7CgkJCQkJCX0KCQkJCQl9OwoJCQkJfQoKCQkJCS8vIENyZWF0ZSB0aGUgYWJvcnQgY2FsbGJhY2sKCQkJCWNhbGxiYWNrID0gY2FsbGJhY2soICJhYm9ydCIgKTsKCgkJCQl0cnkgewoKCQkJCQkvLyBEbyBzZW5kIHRoZSByZXF1ZXN0ICh0aGlzIG1heSByYWlzZSBhbiBleGNlcHRpb24pCgkJCQkJeGhyLnNlbmQoIG9wdGlvbnMuaGFzQ29udGVudCAmJiBvcHRpb25zLmRhdGEgfHwgbnVsbCApOwoJCQkJfSBjYXRjaCAoIGUgKSB7CgoJCQkJCS8vICMxNDY4MzogT25seSByZXRocm93IGlmIHRoaXMgaGFzbid0IGJlZW4gbm90aWZpZWQgYXMgYW4gZXJyb3IgeWV0CgkJCQkJaWYgKCBjYWxsYmFjayApIHsKCQkJCQkJdGhyb3cgZTsKCQkJCQl9CgkJCQl9CgkJCX0sCgoJCQlhYm9ydDogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIGNhbGxiYWNrICkgewoJCQkJCWNhbGxiYWNrKCk7CgkJCQl9CgkJCX0KCQl9OwoJfQp9ICk7CgoKCgovLyBQcmV2ZW50IGF1dG8tZXhlY3V0aW9uIG9mIHNjcmlwdHMgd2hlbiBubyBleHBsaWNpdCBkYXRhVHlwZSB3YXMgcHJvdmlkZWQgKFNlZSBnaC0yNDMyKQpqUXVlcnkuYWpheFByZWZpbHRlciggZnVuY3Rpb24oIHMgKSB7CglpZiAoIHMuY3Jvc3NEb21haW4gKSB7CgkJcy5jb250ZW50cy5zY3JpcHQgPSBmYWxzZTsKCX0KfSApOwoKLy8gSW5zdGFsbCBzY3JpcHQgZGF0YVR5cGUKalF1ZXJ5LmFqYXhTZXR1cCggewoJYWNjZXB0czogewoJCXNjcmlwdDogInRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgIiArCgkJCSJhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiCgl9LAoJY29udGVudHM6IHsKCQlzY3JpcHQ6IC9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi8KCX0sCgljb252ZXJ0ZXJzOiB7CgkJInRleHQgc2NyaXB0IjogZnVuY3Rpb24oIHRleHQgKSB7CgkJCWpRdWVyeS5nbG9iYWxFdmFsKCB0ZXh0ICk7CgkJCXJldHVybiB0ZXh0OwoJCX0KCX0KfSApOwoKLy8gSGFuZGxlIGNhY2hlJ3Mgc3BlY2lhbCBjYXNlIGFuZCBjcm9zc0RvbWFpbgpqUXVlcnkuYWpheFByZWZpbHRlciggInNjcmlwdCIsIGZ1bmN0aW9uKCBzICkgewoJaWYgKCBzLmNhY2hlID09PSB1bmRlZmluZWQgKSB7CgkJcy5jYWNoZSA9IGZhbHNlOwoJfQoJaWYgKCBzLmNyb3NzRG9tYWluICkgewoJCXMudHlwZSA9ICJHRVQiOwoJfQp9ICk7CgovLyBCaW5kIHNjcmlwdCB0YWcgaGFjayB0cmFuc3BvcnQKalF1ZXJ5LmFqYXhUcmFuc3BvcnQoICJzY3JpcHQiLCBmdW5jdGlvbiggcyApIHsKCgkvLyBUaGlzIHRyYW5zcG9ydCBvbmx5IGRlYWxzIHdpdGggY3Jvc3MgZG9tYWluIHJlcXVlc3RzCglpZiAoIHMuY3Jvc3NEb21haW4gKSB7CgkJdmFyIHNjcmlwdCwgY2FsbGJhY2s7CgkJcmV0dXJuIHsKCQkJc2VuZDogZnVuY3Rpb24oIF8sIGNvbXBsZXRlICkgewoJCQkJc2NyaXB0ID0galF1ZXJ5KCAiPHNjcmlwdD4iICkucHJvcCggewoJCQkJCWNoYXJzZXQ6IHMuc2NyaXB0Q2hhcnNldCwKCQkJCQlzcmM6IHMudXJsCgkJCQl9ICkub24oCgkJCQkJImxvYWQgZXJyb3IiLAoJCQkJCWNhbGxiYWNrID0gZnVuY3Rpb24oIGV2dCApIHsKCQkJCQkJc2NyaXB0LnJlbW92ZSgpOwoJCQkJCQljYWxsYmFjayA9IG51bGw7CgkJCQkJCWlmICggZXZ0ICkgewoJCQkJCQkJY29tcGxldGUoIGV2dC50eXBlID09PSAiZXJyb3IiID8gNDA0IDogMjAwLCBldnQudHlwZSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJKTsKCgkJCQkvLyBVc2UgbmF0aXZlIERPTSBtYW5pcHVsYXRpb24gdG8gYXZvaWQgb3VyIGRvbU1hbmlwIEFKQVggdHJpY2tlcnkKCQkJCWRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdFsgMCBdICk7CgkJCX0sCgkJCWFib3J0OiBmdW5jdGlvbigpIHsKCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJY2FsbGJhY2soKTsKCQkJCX0KCQkJfQoJCX07Cgl9Cn0gKTsKCgoKCnZhciBvbGRDYWxsYmFja3MgPSBbXSwKCXJqc29ucCA9IC8oPSlcPyg/PSZ8JCl8XD9cPy87CgovLyBEZWZhdWx0IGpzb25wIHNldHRpbmdzCmpRdWVyeS5hamF4U2V0dXAoIHsKCWpzb25wOiAiY2FsbGJhY2siLAoJanNvbnBDYWxsYmFjazogZnVuY3Rpb24oKSB7CgkJdmFyIGNhbGxiYWNrID0gb2xkQ2FsbGJhY2tzLnBvcCgpIHx8ICggalF1ZXJ5LmV4cGFuZG8gKyAiXyIgKyAoIG5vbmNlKysgKSApOwoJCXRoaXNbIGNhbGxiYWNrIF0gPSB0cnVlOwoJCXJldHVybiBjYWxsYmFjazsKCX0KfSApOwoKLy8gRGV0ZWN0LCBub3JtYWxpemUgb3B0aW9ucyBhbmQgaW5zdGFsbCBjYWxsYmFja3MgZm9yIGpzb25wIHJlcXVlc3RzCmpRdWVyeS5hamF4UHJlZmlsdGVyKCAianNvbiBqc29ucCIsIGZ1bmN0aW9uKCBzLCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHsKCgl2YXIgY2FsbGJhY2tOYW1lLCBvdmVyd3JpdHRlbiwgcmVzcG9uc2VDb250YWluZXIsCgkJanNvblByb3AgPSBzLmpzb25wICE9PSBmYWxzZSAmJiAoIHJqc29ucC50ZXN0KCBzLnVybCApID8KCQkJInVybCIgOgoJCQl0eXBlb2Ygcy5kYXRhID09PSAic3RyaW5nIiAmJgoJCQkJKCBzLmNvbnRlbnRUeXBlIHx8ICIiICkKCQkJCQkuaW5kZXhPZiggImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIgKSA9PT0gMCAmJgoJCQkJcmpzb25wLnRlc3QoIHMuZGF0YSApICYmICJkYXRhIgoJCSk7CgoJLy8gSGFuZGxlIGlmZiB0aGUgZXhwZWN0ZWQgZGF0YSB0eXBlIGlzICJqc29ucCIgb3Igd2UgaGF2ZSBhIHBhcmFtZXRlciB0byBzZXQKCWlmICgganNvblByb3AgfHwgcy5kYXRhVHlwZXNbIDAgXSA9PT0gImpzb25wIiApIHsKCgkJLy8gR2V0IGNhbGxiYWNrIG5hbWUsIHJlbWVtYmVyaW5nIHByZWV4aXN0aW5nIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBpdAoJCWNhbGxiYWNrTmFtZSA9IHMuanNvbnBDYWxsYmFjayA9IGlzRnVuY3Rpb24oIHMuanNvbnBDYWxsYmFjayApID8KCQkJcy5qc29ucENhbGxiYWNrKCkgOgoJCQlzLmpzb25wQ2FsbGJhY2s7CgoJCS8vIEluc2VydCBjYWxsYmFjayBpbnRvIHVybCBvciBmb3JtIGRhdGEKCQlpZiAoIGpzb25Qcm9wICkgewoJCQlzWyBqc29uUHJvcCBdID0gc1sganNvblByb3AgXS5yZXBsYWNlKCByanNvbnAsICIkMSIgKyBjYWxsYmFja05hbWUgKTsKCQl9IGVsc2UgaWYgKCBzLmpzb25wICE9PSBmYWxzZSApIHsKCQkJcy51cmwgKz0gKCBycXVlcnkudGVzdCggcy51cmwgKSA/ICImIiA6ICI/IiApICsgcy5qc29ucCArICI9IiArIGNhbGxiYWNrTmFtZTsKCQl9CgoJCS8vIFVzZSBkYXRhIGNvbnZlcnRlciB0byByZXRyaWV2ZSBqc29uIGFmdGVyIHNjcmlwdCBleGVjdXRpb24KCQlzLmNvbnZlcnRlcnNbICJzY3JpcHQganNvbiIgXSA9IGZ1bmN0aW9uKCkgewoJCQlpZiAoICFyZXNwb25zZUNvbnRhaW5lciApIHsKCQkJCWpRdWVyeS5lcnJvciggY2FsbGJhY2tOYW1lICsgIiB3YXMgbm90IGNhbGxlZCIgKTsKCQkJfQoJCQlyZXR1cm4gcmVzcG9uc2VDb250YWluZXJbIDAgXTsKCQl9OwoKCQkvLyBGb3JjZSBqc29uIGRhdGFUeXBlCgkJcy5kYXRhVHlwZXNbIDAgXSA9ICJqc29uIjsKCgkJLy8gSW5zdGFsbCBjYWxsYmFjawoJCW92ZXJ3cml0dGVuID0gd2luZG93WyBjYWxsYmFja05hbWUgXTsKCQl3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gZnVuY3Rpb24oKSB7CgkJCXJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRzOwoJCX07CgoJCS8vIENsZWFuLXVwIGZ1bmN0aW9uIChmaXJlcyBhZnRlciBjb252ZXJ0ZXJzKQoJCWpxWEhSLmFsd2F5cyggZnVuY3Rpb24oKSB7CgoJCQkvLyBJZiBwcmV2aW91cyB2YWx1ZSBkaWRuJ3QgZXhpc3QgLSByZW1vdmUgaXQKCQkJaWYgKCBvdmVyd3JpdHRlbiA9PT0gdW5kZWZpbmVkICkgewoJCQkJalF1ZXJ5KCB3aW5kb3cgKS5yZW1vdmVQcm9wKCBjYWxsYmFja05hbWUgKTsKCgkJCS8vIE90aGVyd2lzZSByZXN0b3JlIHByZWV4aXN0aW5nIHZhbHVlCgkJCX0gZWxzZSB7CgkJCQl3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gb3ZlcndyaXR0ZW47CgkJCX0KCgkJCS8vIFNhdmUgYmFjayBhcyBmcmVlCgkJCWlmICggc1sgY2FsbGJhY2tOYW1lIF0gKSB7CgoJCQkJLy8gTWFrZSBzdXJlIHRoYXQgcmUtdXNpbmcgdGhlIG9wdGlvbnMgZG9lc24ndCBzY3JldyB0aGluZ3MgYXJvdW5kCgkJCQlzLmpzb25wQ2FsbGJhY2sgPSBvcmlnaW5hbFNldHRpbmdzLmpzb25wQ2FsbGJhY2s7CgoJCQkJLy8gU2F2ZSB0aGUgY2FsbGJhY2sgbmFtZSBmb3IgZnV0dXJlIHVzZQoJCQkJb2xkQ2FsbGJhY2tzLnB1c2goIGNhbGxiYWNrTmFtZSApOwoJCQl9CgoJCQkvLyBDYWxsIGlmIGl0IHdhcyBhIGZ1bmN0aW9uIGFuZCB3ZSBoYXZlIGEgcmVzcG9uc2UKCQkJaWYgKCByZXNwb25zZUNvbnRhaW5lciAmJiBpc0Z1bmN0aW9uKCBvdmVyd3JpdHRlbiApICkgewoJCQkJb3ZlcndyaXR0ZW4oIHJlc3BvbnNlQ29udGFpbmVyWyAwIF0gKTsKCQkJfQoKCQkJcmVzcG9uc2VDb250YWluZXIgPSBvdmVyd3JpdHRlbiA9IHVuZGVmaW5lZDsKCQl9ICk7CgoJCS8vIERlbGVnYXRlIHRvIHNjcmlwdAoJCXJldHVybiAic2NyaXB0IjsKCX0KfSApOwoKCgoKLy8gU3VwcG9ydDogU2FmYXJpIDggb25seQovLyBJbiBTYWZhcmkgOCBkb2N1bWVudHMgY3JlYXRlZCB2aWEgZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50Ci8vIGNvbGxhcHNlIHNpYmxpbmcgZm9ybXM6IHRoZSBzZWNvbmQgb25lIGJlY29tZXMgYSBjaGlsZCBvZiB0aGUgZmlyc3Qgb25lLgovLyBCZWNhdXNlIG9mIHRoYXQsIHRoaXMgc2VjdXJpdHkgbWVhc3VyZSBoYXMgdG8gYmUgZGlzYWJsZWQgaW4gU2FmYXJpIDguCi8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzczMzcKc3VwcG9ydC5jcmVhdGVIVE1MRG9jdW1lbnQgPSAoIGZ1bmN0aW9uKCkgewoJdmFyIGJvZHkgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoICIiICkuYm9keTsKCWJvZHkuaW5uZXJIVE1MID0gIjxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+IjsKCXJldHVybiBib2R5LmNoaWxkTm9kZXMubGVuZ3RoID09PSAyOwp9ICkoKTsKCgovLyBBcmd1bWVudCAiZGF0YSIgc2hvdWxkIGJlIHN0cmluZyBvZiBodG1sCi8vIGNvbnRleHQgKG9wdGlvbmFsKTogSWYgc3BlY2lmaWVkLCB0aGUgZnJhZ21lbnQgd2lsbCBiZSBjcmVhdGVkIGluIHRoaXMgY29udGV4dCwKLy8gZGVmYXVsdHMgdG8gZG9jdW1lbnQKLy8ga2VlcFNjcmlwdHMgKG9wdGlvbmFsKTogSWYgdHJ1ZSwgd2lsbCBpbmNsdWRlIHNjcmlwdHMgcGFzc2VkIGluIHRoZSBodG1sIHN0cmluZwpqUXVlcnkucGFyc2VIVE1MID0gZnVuY3Rpb24oIGRhdGEsIGNvbnRleHQsIGtlZXBTY3JpcHRzICkgewoJaWYgKCB0eXBlb2YgZGF0YSAhPT0gInN0cmluZyIgKSB7CgkJcmV0dXJuIFtdOwoJfQoJaWYgKCB0eXBlb2YgY29udGV4dCA9PT0gImJvb2xlYW4iICkgewoJCWtlZXBTY3JpcHRzID0gY29udGV4dDsKCQljb250ZXh0ID0gZmFsc2U7Cgl9CgoJdmFyIGJhc2UsIHBhcnNlZCwgc2NyaXB0czsKCglpZiAoICFjb250ZXh0ICkgewoKCQkvLyBTdG9wIHNjcmlwdHMgb3IgaW5saW5lIGV2ZW50IGhhbmRsZXJzIGZyb20gYmVpbmcgZXhlY3V0ZWQgaW1tZWRpYXRlbHkKCQkvLyBieSB1c2luZyBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbgoJCWlmICggc3VwcG9ydC5jcmVhdGVIVE1MRG9jdW1lbnQgKSB7CgkJCWNvbnRleHQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoICIiICk7CgoJCQkvLyBTZXQgdGhlIGJhc2UgaHJlZiBmb3IgdGhlIGNyZWF0ZWQgZG9jdW1lbnQKCQkJLy8gc28gYW55IHBhcnNlZCBlbGVtZW50cyB3aXRoIFVSTHMKCQkJLy8gYXJlIGJhc2VkIG9uIHRoZSBkb2N1bWVudCdzIFVSTCAoZ2gtMjk2NSkKCQkJYmFzZSA9IGNvbnRleHQuY3JlYXRlRWxlbWVudCggImJhc2UiICk7CgkJCWJhc2UuaHJlZiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7CgkJCWNvbnRleHQuaGVhZC5hcHBlbmRDaGlsZCggYmFzZSApOwoJCX0gZWxzZSB7CgkJCWNvbnRleHQgPSBkb2N1bWVudDsKCQl9Cgl9CgoJcGFyc2VkID0gcnNpbmdsZVRhZy5leGVjKCBkYXRhICk7CglzY3JpcHRzID0gIWtlZXBTY3JpcHRzICYmIFtdOwoKCS8vIFNpbmdsZSB0YWcKCWlmICggcGFyc2VkICkgewoJCXJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggcGFyc2VkWyAxIF0gKSBdOwoJfQoKCXBhcnNlZCA9IGJ1aWxkRnJhZ21lbnQoIFsgZGF0YSBdLCBjb250ZXh0LCBzY3JpcHRzICk7CgoJaWYgKCBzY3JpcHRzICYmIHNjcmlwdHMubGVuZ3RoICkgewoJCWpRdWVyeSggc2NyaXB0cyApLnJlbW92ZSgpOwoJfQoKCXJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBwYXJzZWQuY2hpbGROb2RlcyApOwp9OwoKCi8qKgogKiBMb2FkIGEgdXJsIGludG8gYSBwYWdlCiAqLwpqUXVlcnkuZm4ubG9hZCA9IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7Cgl2YXIgc2VsZWN0b3IsIHR5cGUsIHJlc3BvbnNlLAoJCXNlbGYgPSB0aGlzLAoJCW9mZiA9IHVybC5pbmRleE9mKCAiICIgKTsKCglpZiAoIG9mZiA+IC0xICkgewoJCXNlbGVjdG9yID0gc3RyaXBBbmRDb2xsYXBzZSggdXJsLnNsaWNlKCBvZmYgKSApOwoJCXVybCA9IHVybC5zbGljZSggMCwgb2ZmICk7Cgl9CgoJLy8gSWYgaXQncyBhIGZ1bmN0aW9uCglpZiAoIGlzRnVuY3Rpb24oIHBhcmFtcyApICkgewoKCQkvLyBXZSBhc3N1bWUgdGhhdCBpdCdzIHRoZSBjYWxsYmFjawoJCWNhbGxiYWNrID0gcGFyYW1zOwoJCXBhcmFtcyA9IHVuZGVmaW5lZDsKCgkvLyBPdGhlcndpc2UsIGJ1aWxkIGEgcGFyYW0gc3RyaW5nCgl9IGVsc2UgaWYgKCBwYXJhbXMgJiYgdHlwZW9mIHBhcmFtcyA9PT0gIm9iamVjdCIgKSB7CgkJdHlwZSA9ICJQT1NUIjsKCX0KCgkvLyBJZiB3ZSBoYXZlIGVsZW1lbnRzIHRvIG1vZGlmeSwgbWFrZSB0aGUgcmVxdWVzdAoJaWYgKCBzZWxmLmxlbmd0aCA+IDAgKSB7CgkJalF1ZXJ5LmFqYXgoIHsKCQkJdXJsOiB1cmwsCgoJCQkvLyBJZiAidHlwZSIgdmFyaWFibGUgaXMgdW5kZWZpbmVkLCB0aGVuICJHRVQiIG1ldGhvZCB3aWxsIGJlIHVzZWQuCgkJCS8vIE1ha2UgdmFsdWUgb2YgdGhpcyBmaWVsZCBleHBsaWNpdCBzaW5jZQoJCQkvLyB1c2VyIGNhbiBvdmVycmlkZSBpdCB0aHJvdWdoIGFqYXhTZXR1cCBtZXRob2QKCQkJdHlwZTogdHlwZSB8fCAiR0VUIiwKCQkJZGF0YVR5cGU6ICJodG1sIiwKCQkJZGF0YTogcGFyYW1zCgkJfSApLmRvbmUoIGZ1bmN0aW9uKCByZXNwb25zZVRleHQgKSB7CgoJCQkvLyBTYXZlIHJlc3BvbnNlIGZvciB1c2UgaW4gY29tcGxldGUgY2FsbGJhY2sKCQkJcmVzcG9uc2UgPSBhcmd1bWVudHM7CgoJCQlzZWxmLmh0bWwoIHNlbGVjdG9yID8KCgkJCQkvLyBJZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQsIGxvY2F0ZSB0aGUgcmlnaHQgZWxlbWVudHMgaW4gYSBkdW1teSBkaXYKCQkJCS8vIEV4Y2x1ZGUgc2NyaXB0cyB0byBhdm9pZCBJRSAnUGVybWlzc2lvbiBEZW5pZWQnIGVycm9ycwoJCQkJalF1ZXJ5KCAiPGRpdj4iICkuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNlbGVjdG9yICkgOgoKCQkJCS8vIE90aGVyd2lzZSB1c2UgdGhlIGZ1bGwgcmVzdWx0CgkJCQlyZXNwb25zZVRleHQgKTsKCgkJLy8gSWYgdGhlIHJlcXVlc3Qgc3VjY2VlZHMsIHRoaXMgZnVuY3Rpb24gZ2V0cyAiZGF0YSIsICJzdGF0dXMiLCAianFYSFIiCgkJLy8gYnV0IHRoZXkgYXJlIGlnbm9yZWQgYmVjYXVzZSByZXNwb25zZSB3YXMgc2V0IGFib3ZlLgoJCS8vIElmIGl0IGZhaWxzLCB0aGlzIGZ1bmN0aW9uIGdldHMgImpxWEhSIiwgInN0YXR1cyIsICJlcnJvciIKCQl9ICkuYWx3YXlzKCBjYWxsYmFjayAmJiBmdW5jdGlvbigganFYSFIsIHN0YXR1cyApIHsKCQkJc2VsZi5lYWNoKCBmdW5jdGlvbigpIHsKCQkJCWNhbGxiYWNrLmFwcGx5KCB0aGlzLCByZXNwb25zZSB8fCBbIGpxWEhSLnJlc3BvbnNlVGV4dCwgc3RhdHVzLCBqcVhIUiBdICk7CgkJCX0gKTsKCQl9ICk7Cgl9CgoJcmV0dXJuIHRoaXM7Cn07CgoKCgovLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFYIGV2ZW50cwpqUXVlcnkuZWFjaCggWwoJImFqYXhTdGFydCIsCgkiYWpheFN0b3AiLAoJImFqYXhDb21wbGV0ZSIsCgkiYWpheEVycm9yIiwKCSJhamF4U3VjY2VzcyIsCgkiYWpheFNlbmQiCl0sIGZ1bmN0aW9uKCBpLCB0eXBlICkgewoJalF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggZm4gKSB7CgkJcmV0dXJuIHRoaXMub24oIHR5cGUsIGZuICk7Cgl9Owp9ICk7CgoKCgpqUXVlcnkuZXhwci5wc2V1ZG9zLmFuaW1hdGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7CglyZXR1cm4galF1ZXJ5LmdyZXAoIGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKCBmbiApIHsKCQlyZXR1cm4gZWxlbSA9PT0gZm4uZWxlbTsKCX0gKS5sZW5ndGg7Cn07CgoKCgpqUXVlcnkub2Zmc2V0ID0gewoJc2V0T2Zmc2V0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgaSApIHsKCQl2YXIgY3VyUG9zaXRpb24sIGN1ckxlZnQsIGN1ckNTU1RvcCwgY3VyVG9wLCBjdXJPZmZzZXQsIGN1ckNTU0xlZnQsIGNhbGN1bGF0ZVBvc2l0aW9uLAoJCQlwb3NpdGlvbiA9IGpRdWVyeS5jc3MoIGVsZW0sICJwb3NpdGlvbiIgKSwKCQkJY3VyRWxlbSA9IGpRdWVyeSggZWxlbSApLAoJCQlwcm9wcyA9IHt9OwoKCQkvLyBTZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtCgkJaWYgKCBwb3NpdGlvbiA9PT0gInN0YXRpYyIgKSB7CgkJCWVsZW0uc3R5bGUucG9zaXRpb24gPSAicmVsYXRpdmUiOwoJCX0KCgkJY3VyT2Zmc2V0ID0gY3VyRWxlbS5vZmZzZXQoKTsKCQljdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVtLCAidG9wIiApOwoJCWN1ckNTU0xlZnQgPSBqUXVlcnkuY3NzKCBlbGVtLCAibGVmdCIgKTsKCQljYWxjdWxhdGVQb3NpdGlvbiA9ICggcG9zaXRpb24gPT09ICJhYnNvbHV0ZSIgfHwgcG9zaXRpb24gPT09ICJmaXhlZCIgKSAmJgoJCQkoIGN1ckNTU1RvcCArIGN1ckNTU0xlZnQgKS5pbmRleE9mKCAiYXV0byIgKSA+IC0xOwoKCQkvLyBOZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlcgoJCS8vIHRvcCBvciBsZWZ0IGlzIGF1dG8gYW5kIHBvc2l0aW9uIGlzIGVpdGhlciBhYnNvbHV0ZSBvciBmaXhlZAoJCWlmICggY2FsY3VsYXRlUG9zaXRpb24gKSB7CgkJCWN1clBvc2l0aW9uID0gY3VyRWxlbS5wb3NpdGlvbigpOwoJCQljdXJUb3AgPSBjdXJQb3NpdGlvbi50b3A7CgkJCWN1ckxlZnQgPSBjdXJQb3NpdGlvbi5sZWZ0OwoKCQl9IGVsc2UgewoJCQljdXJUb3AgPSBwYXJzZUZsb2F0KCBjdXJDU1NUb3AgKSB8fCAwOwoJCQljdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7CgkJfQoKCQlpZiAoIGlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHsKCgkJCS8vIFVzZSBqUXVlcnkuZXh0ZW5kIGhlcmUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIG9mIGNvb3JkaW5hdGVzIGFyZ3VtZW50IChnaC0xODQ4KQoJCQlvcHRpb25zID0gb3B0aW9ucy5jYWxsKCBlbGVtLCBpLCBqUXVlcnkuZXh0ZW5kKCB7fSwgY3VyT2Zmc2V0ICkgKTsKCQl9CgoJCWlmICggb3B0aW9ucy50b3AgIT0gbnVsbCApIHsKCQkJcHJvcHMudG9wID0gKCBvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDsKCQl9CgkJaWYgKCBvcHRpb25zLmxlZnQgIT0gbnVsbCApIHsKCQkJcHJvcHMubGVmdCA9ICggb3B0aW9ucy5sZWZ0IC0gY3VyT2Zmc2V0LmxlZnQgKSArIGN1ckxlZnQ7CgkJfQoKCQlpZiAoICJ1c2luZyIgaW4gb3B0aW9ucyApIHsKCQkJb3B0aW9ucy51c2luZy5jYWxsKCBlbGVtLCBwcm9wcyApOwoKCQl9IGVsc2UgewoJCQljdXJFbGVtLmNzcyggcHJvcHMgKTsKCQl9Cgl9Cn07CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CgoJLy8gb2Zmc2V0KCkgcmVsYXRlcyBhbiBlbGVtZW50J3MgYm9yZGVyIGJveCB0byB0aGUgZG9jdW1lbnQgb3JpZ2luCglvZmZzZXQ6IGZ1bmN0aW9uKCBvcHRpb25zICkgewoKCQkvLyBQcmVzZXJ2ZSBjaGFpbmluZyBmb3Igc2V0dGVyCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoICkgewoJCQlyZXR1cm4gb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8KCQkJCXRoaXMgOgoJCQkJdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHsKCQkJCQlqUXVlcnkub2Zmc2V0LnNldE9mZnNldCggdGhpcywgb3B0aW9ucywgaSApOwoJCQkJfSApOwoJCX0KCgkJdmFyIHJlY3QsIHdpbiwKCQkJZWxlbSA9IHRoaXNbIDAgXTsKCgkJaWYgKCAhZWxlbSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gUmV0dXJuIHplcm9zIGZvciBkaXNjb25uZWN0ZWQgYW5kIGhpZGRlbiAoZGlzcGxheTogbm9uZSkgZWxlbWVudHMgKGdoLTIzMTApCgkJLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5CgkJLy8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYQoJCS8vIGRpc2Nvbm5lY3RlZCBub2RlIGluIElFIHRocm93cyBhbiBlcnJvcgoJCWlmICggIWVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggKSB7CgkJCXJldHVybiB7IHRvcDogMCwgbGVmdDogMCB9OwoJCX0KCgkJLy8gR2V0IGRvY3VtZW50LXJlbGF0aXZlIHBvc2l0aW9uIGJ5IGFkZGluZyB2aWV3cG9ydCBzY3JvbGwgdG8gdmlld3BvcnQtcmVsYXRpdmUgZ0JDUgoJCXJlY3QgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwoJCXdpbiA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldzsKCQlyZXR1cm4gewoJCQl0b3A6IHJlY3QudG9wICsgd2luLnBhZ2VZT2Zmc2V0LAoJCQlsZWZ0OiByZWN0LmxlZnQgKyB3aW4ucGFnZVhPZmZzZXQKCQl9OwoJfSwKCgkvLyBwb3NpdGlvbigpIHJlbGF0ZXMgYW4gZWxlbWVudCdzIG1hcmdpbiBib3ggdG8gaXRzIG9mZnNldCBwYXJlbnQncyBwYWRkaW5nIGJveAoJLy8gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgYmVoYXZpb3Igb2YgQ1NTIGFic29sdXRlIHBvc2l0aW9uaW5nCglwb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJaWYgKCAhdGhpc1sgMCBdICkgewoJCQlyZXR1cm47CgkJfQoKCQl2YXIgb2Zmc2V0UGFyZW50LCBvZmZzZXQsIGRvYywKCQkJZWxlbSA9IHRoaXNbIDAgXSwKCQkJcGFyZW50T2Zmc2V0ID0geyB0b3A6IDAsIGxlZnQ6IDAgfTsKCgkJLy8gcG9zaXRpb246Zml4ZWQgZWxlbWVudHMgYXJlIG9mZnNldCBmcm9tIHRoZSB2aWV3cG9ydCwgd2hpY2ggaXRzZWxmIGFsd2F5cyBoYXMgemVybyBvZmZzZXQKCQlpZiAoIGpRdWVyeS5jc3MoIGVsZW0sICJwb3NpdGlvbiIgKSA9PT0gImZpeGVkIiApIHsKCgkJCS8vIEFzc3VtZSBwb3NpdGlvbjpmaXhlZCBpbXBsaWVzIGF2YWlsYWJpbGl0eSBvZiBnZXRCb3VuZGluZ0NsaWVudFJlY3QKCQkJb2Zmc2V0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKCgkJfSBlbHNlIHsKCQkJb2Zmc2V0ID0gdGhpcy5vZmZzZXQoKTsKCgkJCS8vIEFjY291bnQgZm9yIHRoZSAqcmVhbCogb2Zmc2V0IHBhcmVudCwgd2hpY2ggY2FuIGJlIHRoZSBkb2N1bWVudCBvciBpdHMgcm9vdCBlbGVtZW50CgkJCS8vIHdoZW4gYSBzdGF0aWNhbGx5IHBvc2l0aW9uZWQgZWxlbWVudCBpcyBpZGVudGlmaWVkCgkJCWRvYyA9IGVsZW0ub3duZXJEb2N1bWVudDsKCQkJb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQgfHwgZG9jLmRvY3VtZW50RWxlbWVudDsKCQkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYKCQkJCSggb2Zmc2V0UGFyZW50ID09PSBkb2MuYm9keSB8fCBvZmZzZXRQYXJlbnQgPT09IGRvYy5kb2N1bWVudEVsZW1lbnQgKSAmJgoJCQkJalF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCAicG9zaXRpb24iICkgPT09ICJzdGF0aWMiICkgewoKCQkJCW9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5wYXJlbnROb2RlOwoJCQl9CgkJCWlmICggb2Zmc2V0UGFyZW50ICYmIG9mZnNldFBhcmVudCAhPT0gZWxlbSAmJiBvZmZzZXRQYXJlbnQubm9kZVR5cGUgPT09IDEgKSB7CgoJCQkJLy8gSW5jb3Jwb3JhdGUgYm9yZGVycyBpbnRvIGl0cyBvZmZzZXQsIHNpbmNlIHRoZXkgYXJlIG91dHNpZGUgaXRzIGNvbnRlbnQgb3JpZ2luCgkJCQlwYXJlbnRPZmZzZXQgPSBqUXVlcnkoIG9mZnNldFBhcmVudCApLm9mZnNldCgpOwoJCQkJcGFyZW50T2Zmc2V0LnRvcCArPSBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsICJib3JkZXJUb3BXaWR0aCIsIHRydWUgKTsKCQkJCXBhcmVudE9mZnNldC5sZWZ0ICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgImJvcmRlckxlZnRXaWR0aCIsIHRydWUgKTsKCQkJfQoJCX0KCgkJLy8gU3VidHJhY3QgcGFyZW50IG9mZnNldHMgYW5kIGVsZW1lbnQgbWFyZ2lucwoJCXJldHVybiB7CgkJCXRvcDogb2Zmc2V0LnRvcCAtIHBhcmVudE9mZnNldC50b3AgLSBqUXVlcnkuY3NzKCBlbGVtLCAibWFyZ2luVG9wIiwgdHJ1ZSApLAoJCQlsZWZ0OiBvZmZzZXQubGVmdCAtIHBhcmVudE9mZnNldC5sZWZ0IC0galF1ZXJ5LmNzcyggZWxlbSwgIm1hcmdpbkxlZnQiLCB0cnVlICkKCQl9OwoJfSwKCgkvLyBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBkb2N1bWVudEVsZW1lbnQgaW4gdGhlIGZvbGxvd2luZyBjYXNlczoKCS8vIDEpIEZvciB0aGUgZWxlbWVudCBpbnNpZGUgdGhlIGlmcmFtZSB3aXRob3V0IG9mZnNldFBhcmVudCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4KCS8vICAgIGRvY3VtZW50RWxlbWVudCBvZiB0aGUgcGFyZW50IHdpbmRvdwoJLy8gMikgRm9yIHRoZSBoaWRkZW4gb3IgZGV0YWNoZWQgZWxlbWVudAoJLy8gMykgRm9yIGJvZHkgb3IgaHRtbCBlbGVtZW50LCBpLmUuIGluIGNhc2Ugb2YgdGhlIGh0bWwgbm9kZSAtIGl0IHdpbGwgcmV0dXJuIGl0c2VsZgoJLy8KCS8vIGJ1dCB0aG9zZSBleGNlcHRpb25zIHdlcmUgbmV2ZXIgcHJlc2VudGVkIGFzIGEgcmVhbCBsaWZlIHVzZS1jYXNlcwoJLy8gYW5kIG1pZ2h0IGJlIGNvbnNpZGVyZWQgYXMgbW9yZSBwcmVmZXJhYmxlIHJlc3VsdHMuCgkvLwoJLy8gVGhpcyBsb2dpYywgaG93ZXZlciwgaXMgbm90IGd1YXJhbnRlZWQgYW5kIGNhbiBjaGFuZ2UgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUKCW9mZnNldFBhcmVudDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHsKCQkJdmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50OwoKCQkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYgalF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCAicG9zaXRpb24iICkgPT09ICJzdGF0aWMiICkgewoJCQkJb2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50Lm9mZnNldFBhcmVudDsKCQkJfQoKCQkJcmV0dXJuIG9mZnNldFBhcmVudCB8fCBkb2N1bWVudEVsZW1lbnQ7CgkJfSApOwoJfQp9ICk7CgovLyBDcmVhdGUgc2Nyb2xsTGVmdCBhbmQgc2Nyb2xsVG9wIG1ldGhvZHMKalF1ZXJ5LmVhY2goIHsgc2Nyb2xsTGVmdDogInBhZ2VYT2Zmc2V0Iiwgc2Nyb2xsVG9wOiAicGFnZVlPZmZzZXQiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7Cgl2YXIgdG9wID0gInBhZ2VZT2Zmc2V0IiA9PT0gcHJvcDsKCglqUXVlcnkuZm5bIG1ldGhvZCBdID0gZnVuY3Rpb24oIHZhbCApIHsKCQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbWV0aG9kLCB2YWwgKSB7CgoJCQkvLyBDb2FsZXNjZSBkb2N1bWVudHMgYW5kIHdpbmRvd3MKCQkJdmFyIHdpbjsKCQkJaWYgKCBpc1dpbmRvdyggZWxlbSApICkgewoJCQkJd2luID0gZWxlbTsKCQkJfSBlbHNlIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCXdpbiA9IGVsZW0uZGVmYXVsdFZpZXc7CgkJCX0KCgkJCWlmICggdmFsID09PSB1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gd2luID8gd2luWyBwcm9wIF0gOiBlbGVtWyBtZXRob2QgXTsKCQkJfQoKCQkJaWYgKCB3aW4gKSB7CgkJCQl3aW4uc2Nyb2xsVG8oCgkJCQkJIXRvcCA/IHZhbCA6IHdpbi5wYWdlWE9mZnNldCwKCQkJCQl0b3AgPyB2YWwgOiB3aW4ucGFnZVlPZmZzZXQKCQkJCSk7CgoJCQl9IGVsc2UgewoJCQkJZWxlbVsgbWV0aG9kIF0gPSB2YWw7CgkJCX0KCQl9LCBtZXRob2QsIHZhbCwgYXJndW1lbnRzLmxlbmd0aCApOwoJfTsKfSApOwoKLy8gU3VwcG9ydDogU2FmYXJpIDw9NyAtIDkuMSwgQ2hyb21lIDw9MzcgLSA0OQovLyBBZGQgdGhlIHRvcC9sZWZ0IGNzc0hvb2tzIHVzaW5nIGpRdWVyeS5mbi5wb3NpdGlvbgovLyBXZWJraXQgYnVnOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkwODQKLy8gQmxpbmsgYnVnOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD01ODkzNDcKLy8gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHBlcmNlbnQgd2hlbiBzcGVjaWZpZWQgZm9yIHRvcC9sZWZ0L2JvdHRvbS9yaWdodDsKLy8gcmF0aGVyIHRoYW4gbWFrZSB0aGUgY3NzIG1vZHVsZSBkZXBlbmQgb24gdGhlIG9mZnNldCBtb2R1bGUsIGp1c3QgY2hlY2sgZm9yIGl0IGhlcmUKalF1ZXJ5LmVhY2goIFsgInRvcCIsICJsZWZ0IiBdLCBmdW5jdGlvbiggaSwgcHJvcCApIHsKCWpRdWVyeS5jc3NIb29rc1sgcHJvcCBdID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnBpeGVsUG9zaXRpb24sCgkJZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQlpZiAoIGNvbXB1dGVkICkgewoJCQkJY29tcHV0ZWQgPSBjdXJDU1MoIGVsZW0sIHByb3AgKTsKCgkJCQkvLyBJZiBjdXJDU1MgcmV0dXJucyBwZXJjZW50YWdlLCBmYWxsYmFjayB0byBvZmZzZXQKCQkJCXJldHVybiBybnVtbm9ucHgudGVzdCggY29tcHV0ZWQgKSA/CgkJCQkJalF1ZXJ5KCBlbGVtICkucG9zaXRpb24oKVsgcHJvcCBdICsgInB4IiA6CgkJCQkJY29tcHV0ZWQ7CgkJCX0KCQl9CgkpOwp9ICk7CgoKLy8gQ3JlYXRlIGlubmVySGVpZ2h0LCBpbm5lcldpZHRoLCBoZWlnaHQsIHdpZHRoLCBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aCBtZXRob2RzCmpRdWVyeS5lYWNoKCB7IEhlaWdodDogImhlaWdodCIsIFdpZHRoOiAid2lkdGgiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkgewoJalF1ZXJ5LmVhY2goIHsgcGFkZGluZzogImlubmVyIiArIG5hbWUsIGNvbnRlbnQ6IHR5cGUsICIiOiAib3V0ZXIiICsgbmFtZSB9LAoJCWZ1bmN0aW9uKCBkZWZhdWx0RXh0cmEsIGZ1bmNOYW1lICkgewoKCQkvLyBNYXJnaW4gaXMgb25seSBmb3Igb3V0ZXJIZWlnaHQsIG91dGVyV2lkdGgKCQlqUXVlcnkuZm5bIGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHsKCQkJdmFyIGNoYWluYWJsZSA9IGFyZ3VtZW50cy5sZW5ndGggJiYgKCBkZWZhdWx0RXh0cmEgfHwgdHlwZW9mIG1hcmdpbiAhPT0gImJvb2xlYW4iICksCgkJCQlleHRyYSA9IGRlZmF1bHRFeHRyYSB8fCAoIG1hcmdpbiA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gdHJ1ZSA/ICJtYXJnaW4iIDogImJvcmRlciIgKTsKCgkJCXJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCB2YWx1ZSApIHsKCQkJCXZhciBkb2M7CgoJCQkJaWYgKCBpc1dpbmRvdyggZWxlbSApICkgewoKCQkJCQkvLyAkKCB3aW5kb3cgKS5vdXRlcldpZHRoL0hlaWdodCByZXR1cm4gdy9oIGluY2x1ZGluZyBzY3JvbGxiYXJzIChnaC0xNzI5KQoJCQkJCXJldHVybiBmdW5jTmFtZS5pbmRleE9mKCAib3V0ZXIiICkgPT09IDAgPwoJCQkJCQllbGVtWyAiaW5uZXIiICsgbmFtZSBdIDoKCQkJCQkJZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbICJjbGllbnQiICsgbmFtZSBdOwoJCQkJfQoKCQkJCS8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHQKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCQlkb2MgPSBlbGVtLmRvY3VtZW50RWxlbWVudDsKCgkJCQkJLy8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdIG9yIGNsaWVudFtXaWR0aC9IZWlnaHRdLAoJCQkJCS8vIHdoaWNoZXZlciBpcyBncmVhdGVzdAoJCQkJCXJldHVybiBNYXRoLm1heCgKCQkJCQkJZWxlbS5ib2R5WyAic2Nyb2xsIiArIG5hbWUgXSwgZG9jWyAic2Nyb2xsIiArIG5hbWUgXSwKCQkJCQkJZWxlbS5ib2R5WyAib2Zmc2V0IiArIG5hbWUgXSwgZG9jWyAib2Zmc2V0IiArIG5hbWUgXSwKCQkJCQkJZG9jWyAiY2xpZW50IiArIG5hbWUgXQoJCQkJCSk7CgkJCQl9CgoJCQkJcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPwoKCQkJCQkvLyBHZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50LCByZXF1ZXN0aW5nIGJ1dCBub3QgZm9yY2luZyBwYXJzZUZsb2F0CgkJCQkJalF1ZXJ5LmNzcyggZWxlbSwgdHlwZSwgZXh0cmEgKSA6CgoJCQkJCS8vIFNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQKCQkJCQlqUXVlcnkuc3R5bGUoIGVsZW0sIHR5cGUsIHZhbHVlLCBleHRyYSApOwoJCQl9LCB0eXBlLCBjaGFpbmFibGUgPyBtYXJnaW4gOiB1bmRlZmluZWQsIGNoYWluYWJsZSApOwoJCX07Cgl9ICk7Cn0gKTsKCgpqUXVlcnkuZWFjaCggKCAiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgIiArCgkibW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgIiArCgkiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudSIgKS5zcGxpdCggIiAiICksCglmdW5jdGlvbiggaSwgbmFtZSApIHsKCgkvLyBIYW5kbGUgZXZlbnQgYmluZGluZwoJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggZGF0YSwgZm4gKSB7CgkJcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAwID8KCQkJdGhpcy5vbiggbmFtZSwgbnVsbCwgZGF0YSwgZm4gKSA6CgkJCXRoaXMudHJpZ2dlciggbmFtZSApOwoJfTsKfSApOwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJaG92ZXI6IGZ1bmN0aW9uKCBmbk92ZXIsIGZuT3V0ICkgewoJCXJldHVybiB0aGlzLm1vdXNlZW50ZXIoIGZuT3ZlciApLm1vdXNlbGVhdmUoIGZuT3V0IHx8IGZuT3ZlciApOwoJfQp9ICk7CgoKCgpqUXVlcnkuZm4uZXh0ZW5kKCB7CgoJYmluZDogZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHsKCQlyZXR1cm4gdGhpcy5vbiggdHlwZXMsIG51bGwsIGRhdGEsIGZuICk7Cgl9LAoJdW5iaW5kOiBmdW5jdGlvbiggdHlwZXMsIGZuICkgewoJCXJldHVybiB0aGlzLm9mZiggdHlwZXMsIG51bGwsIGZuICk7Cgl9LAoKCWRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHsKCQlyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApOwoJfSwKCXVuZGVsZWdhdGU6IGZ1bmN0aW9uKCBzZWxlY3RvciwgdHlwZXMsIGZuICkgewoKCQkvLyAoIG5hbWVzcGFjZSApIG9yICggc2VsZWN0b3IsIHR5cGVzIFssIGZuXSApCgkJcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPwoJCQl0aGlzLm9mZiggc2VsZWN0b3IsICIqKiIgKSA6CgkJCXRoaXMub2ZmKCB0eXBlcywgc2VsZWN0b3IgfHwgIioqIiwgZm4gKTsKCX0KfSApOwoKLy8gQmluZCBhIGZ1bmN0aW9uIHRvIGEgY29udGV4dCwgb3B0aW9uYWxseSBwYXJ0aWFsbHkgYXBwbHlpbmcgYW55Ci8vIGFyZ3VtZW50cy4KLy8galF1ZXJ5LnByb3h5IGlzIGRlcHJlY2F0ZWQgdG8gcHJvbW90ZSBzdGFuZGFyZHMgKHNwZWNpZmljYWxseSBGdW5jdGlvbiNiaW5kKQovLyBIb3dldmVyLCBpdCBpcyBub3Qgc2xhdGVkIGZvciByZW1vdmFsIGFueSB0aW1lIHNvb24KalF1ZXJ5LnByb3h5ID0gZnVuY3Rpb24oIGZuLCBjb250ZXh0ICkgewoJdmFyIHRtcCwgYXJncywgcHJveHk7CgoJaWYgKCB0eXBlb2YgY29udGV4dCA9PT0gInN0cmluZyIgKSB7CgkJdG1wID0gZm5bIGNvbnRleHQgXTsKCQljb250ZXh0ID0gZm47CgkJZm4gPSB0bXA7Cgl9CgoJLy8gUXVpY2sgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRhcmdldCBpcyBjYWxsYWJsZSwgaW4gdGhlIHNwZWMKCS8vIHRoaXMgdGhyb3dzIGEgVHlwZUVycm9yLCBidXQgd2Ugd2lsbCBqdXN0IHJldHVybiB1bmRlZmluZWQuCglpZiAoICFpc0Z1bmN0aW9uKCBmbiApICkgewoJCXJldHVybiB1bmRlZmluZWQ7Cgl9CgoJLy8gU2ltdWxhdGVkIGJpbmQKCWFyZ3MgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMsIDIgKTsKCXByb3h5ID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGZuLmFwcGx5KCBjb250ZXh0IHx8IHRoaXMsIGFyZ3MuY29uY2F0KCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7Cgl9OwoKCS8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZAoJcHJveHkuZ3VpZCA9IGZuLmd1aWQgPSBmbi5ndWlkIHx8IGpRdWVyeS5ndWlkKys7CgoJcmV0dXJuIHByb3h5Owp9OwoKalF1ZXJ5LmhvbGRSZWFkeSA9IGZ1bmN0aW9uKCBob2xkICkgewoJaWYgKCBob2xkICkgewoJCWpRdWVyeS5yZWFkeVdhaXQrKzsKCX0gZWxzZSB7CgkJalF1ZXJ5LnJlYWR5KCB0cnVlICk7Cgl9Cn07CmpRdWVyeS5pc0FycmF5ID0gQXJyYXkuaXNBcnJheTsKalF1ZXJ5LnBhcnNlSlNPTiA9IEpTT04ucGFyc2U7CmpRdWVyeS5ub2RlTmFtZSA9IG5vZGVOYW1lOwpqUXVlcnkuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247CmpRdWVyeS5pc1dpbmRvdyA9IGlzV2luZG93OwpqUXVlcnkuY2FtZWxDYXNlID0gY2FtZWxDYXNlOwpqUXVlcnkudHlwZSA9IHRvVHlwZTsKCmpRdWVyeS5ub3cgPSBEYXRlLm5vdzsKCmpRdWVyeS5pc051bWVyaWMgPSBmdW5jdGlvbiggb2JqICkgewoKCS8vIEFzIG9mIGpRdWVyeSAzLjAsIGlzTnVtZXJpYyBpcyBsaW1pdGVkIHRvCgkvLyBzdHJpbmdzIGFuZCBudW1iZXJzIChwcmltaXRpdmVzIG9yIG9iamVjdHMpCgkvLyB0aGF0IGNhbiBiZSBjb2VyY2VkIHRvIGZpbml0ZSBudW1iZXJzIChnaC0yNjYyKQoJdmFyIHR5cGUgPSBqUXVlcnkudHlwZSggb2JqICk7CglyZXR1cm4gKCB0eXBlID09PSAibnVtYmVyIiB8fCB0eXBlID09PSAic3RyaW5nIiApICYmCgoJCS8vIHBhcnNlRmxvYXQgTmFOcyBudW1lcmljLWNhc3QgZmFsc2UgcG9zaXRpdmVzICgiIikKCQkvLyAuLi5idXQgbWlzaW50ZXJwcmV0cyBsZWFkaW5nLW51bWJlciBzdHJpbmdzLCBwYXJ0aWN1bGFybHkgaGV4IGxpdGVyYWxzICgiMHguLi4iKQoJCS8vIHN1YnRyYWN0aW9uIGZvcmNlcyBpbmZpbml0aWVzIHRvIE5hTgoJCSFpc05hTiggb2JqIC0gcGFyc2VGbG9hdCggb2JqICkgKTsKfTsKCgoKCi8vIFJlZ2lzdGVyIGFzIGEgbmFtZWQgQU1EIG1vZHVsZSwgc2luY2UgalF1ZXJ5IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0aCBvdGhlcgovLyBmaWxlcyB0aGF0IG1heSB1c2UgZGVmaW5lLCBidXQgbm90IHZpYSBhIHByb3BlciBjb25jYXRlbmF0aW9uIHNjcmlwdCB0aGF0Ci8vIHVuZGVyc3RhbmRzIGFub255bW91cyBBTUQgbW9kdWxlcy4gQSBuYW1lZCBBTUQgaXMgc2FmZXN0IGFuZCBtb3N0IHJvYnVzdAovLyB3YXkgdG8gcmVnaXN0ZXIuIExvd2VyY2FzZSBqcXVlcnkgaXMgdXNlZCBiZWNhdXNlIEFNRCBtb2R1bGUgbmFtZXMgYXJlCi8vIGRlcml2ZWQgZnJvbSBmaWxlIG5hbWVzLCBhbmQgalF1ZXJ5IGlzIG5vcm1hbGx5IGRlbGl2ZXJlZCBpbiBhIGxvd2VyY2FzZQovLyBmaWxlIG5hbWUuIERvIHRoaXMgYWZ0ZXIgY3JlYXRpbmcgdGhlIGdsb2JhbCBzbyB0aGF0IGlmIGFuIEFNRCBtb2R1bGUgd2FudHMKLy8gdG8gY2FsbCBub0NvbmZsaWN0IHRvIGhpZGUgdGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSwgaXQgd2lsbCB3b3JrLgoKLy8gTm90ZSB0aGF0IGZvciBtYXhpbXVtIHBvcnRhYmlsaXR5LCBsaWJyYXJpZXMgdGhhdCBhcmUgbm90IGpRdWVyeSBzaG91bGQKLy8gZGVjbGFyZSB0aGVtc2VsdmVzIGFzIGFub255bW91cyBtb2R1bGVzLCBhbmQgYXZvaWQgc2V0dGluZyBhIGdsb2JhbCBpZiBhbgovLyBBTUQgbG9hZGVyIGlzIHByZXNlbnQuIGpRdWVyeSBpcyBhIHNwZWNpYWwgY2FzZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQovLyBodHRwczovL2dpdGh1Yi5jb20vanJidXJrZS9yZXF1aXJlanMvd2lraS9VcGRhdGluZy1leGlzdGluZy1saWJyYXJpZXMjd2lraS1hbm9uCgppZiAoIHR5cGVvZiBkZWZpbmUgPT09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCApIHsKCWRlZmluZSggImpxdWVyeSIsIFtdLCBmdW5jdGlvbigpIHsKCQlyZXR1cm4galF1ZXJ5OwoJfSApOwp9CgoKCgp2YXIKCgkvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGUKCV9qUXVlcnkgPSB3aW5kb3cualF1ZXJ5LAoKCS8vIE1hcCBvdmVyIHRoZSAkIGluIGNhc2Ugb2Ygb3ZlcndyaXRlCglfJCA9IHdpbmRvdy4kOwoKalF1ZXJ5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiggZGVlcCApIHsKCWlmICggd2luZG93LiQgPT09IGpRdWVyeSApIHsKCQl3aW5kb3cuJCA9IF8kOwoJfQoKCWlmICggZGVlcCAmJiB3aW5kb3cualF1ZXJ5ID09PSBqUXVlcnkgKSB7CgkJd2luZG93LmpRdWVyeSA9IF9qUXVlcnk7Cgl9CgoJcmV0dXJuIGpRdWVyeTsKfTsKCi8vIEV4cG9zZSBqUXVlcnkgYW5kICQgaWRlbnRpZmllcnMsIGV2ZW4gaW4gQU1ECi8vICgjNzEwMiNjb21tZW50OjEwLCBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9wdWxsLzU1NykKLy8gYW5kIENvbW1vbkpTIGZvciBicm93c2VyIGVtdWxhdG9ycyAoIzEzNTY2KQppZiAoICFub0dsb2JhbCApIHsKCXdpbmRvdy5qUXVlcnkgPSB3aW5kb3cuJCA9IGpRdWVyeTsKfQoKCgoKcmV0dXJuIGpRdWVyeTsKfSApOwo=" ></script>

<!--		<script type="text/javascript" src="js/custom.js"></script> -->
		<script type="text/javascript">
			$(function() {
// grab the file input and bind a change event onto it
				$('#file').bind("change", function() {
					var formData = new FormData();
					for (var i = 0, len = document.getElementById('file').files.length; i < len; i++) {
						formData.append("file" + i, document.getElementById('file').files[i]);
						}
 
//send formdata to server-side
	var ko_kup_url="/ka1.php?q=kup&ko_kup_url";
				$.ajax({
//					url: "file-upload.php", // our php file
//					url: "index_fileupload.php", // our php file
//					url: "http://ka1.php?q=up", // our php file
//					url: "./index_up.php", // our php file
//					url: "./ka1.php?q=up", // our php file
//					url: "./ko0.php?q=up", // our php file
//					url: "./ko2.php?q=up", // our php file
//					bugs     url: "10.0.0.112:/ka1.php?q=up", // our php file

					url: "./ka1.php?q=kup", // our php file
//					url: ko_kup_url,


//					url: "./kup.php?q=kup", // our php file
//					url: "./ka1.php?q=kup", // our php file
//					url: "./ko0.php?q=kup", // our php file
//					url: "./ko1.php?q=kup", // our php file
//					url: "./ko2.php?q=kup", // our php file
					type: 'post',
					data: formData,
					dataType: 'html', // we return html from our php file
					async: true,
					processData: false,  // tell jQuery not to process the data
					contentType: false,   // tell jQuery not to set contentType
					success : function(data) {
						$('#upload-result').append('<div class="alert alert-success"><p>File(s) uploaded successfully!</p><br />');
						$('#upload-result .alert').append(data);
						},
					error : function(request) {
						console.log(request.responseText);
						}
					});
				});
			});
			</script>
	</body>
</html>
HTML_KIN_FTR;

	$html_kin = "";
	$html_kin_style=html_style();
	$html_kin_links=html_links();
#	$html_kin_inputlist=html_inputlist("kin", "ko0 ko1 ko2 ka1 ka2");
#	$html_kin_inputlist=html_kin_inputlist("ka1", "a b c");
#	print( "BUGS_17767 $html_kin_inputlist=".$html_kin_inputlist."<br>" );

	$html_kin .= $html_kin_hdr;
	$html_kin .= $html_kin_style;
	$html_kin .= $html_kin_body;
	$html_kin .= $html_kin_links;
	$html_kin .= $html_kin_input;
#	$html_kin .= $html_kin_inputlist;
	$html_kin .= $html_kin_ftr;
	return($html_kin);
	}



# function html_kin_inputlist( $listid, $inputlist ) {
#	$html_kin_inputlist='BUGS_17783: jkwii
#
#        <label for="input_choctype">chocolates</label>
#                <input id="input_choctype" list="choctypes" type="text">
#                < datalist id="choctypes">
#                        <option value="white" />
#                        <option value="milk" />
#                        <option value="dark" />
#                        <option value="semisweet" />
#                        <option value="herseys" />
#                        </datalist>
#		';
#
#	return( $html_kin_inputlist );
#	}
function html_inputlist( $listid, $inputlist ) {
	$html_inputlist=<<<HTML_INPUTLIST
jjjjjjjjjjjjjjjj
        <label for=\"input_choctype\">chocolates</label>
kkkkkkkkkkkkkkkk
                <input id=\"input_choctype\" list=\"choctypes\" type=\"text\">
                <datalist id=\"choctypes\">
                        <option value="white" />
                        <option value="milk" />
                        <option value="dark" />
                        <option value="semisweet" />
                        <option value="herseys" />
                        </datalist>
HTML_INPUTLIST;
	return( $html_inputlist );
	}


# 
# function html_inputlist_bugs( $listid, $inputlist ) {
#	$kin2=$listid;
#	$kin2="kin2";	
#	$inputlist="ka1 ka2 ko0 ko1 ko2 kon kas ipe"; 
#
#	$values = explode( " ", $inputlist );
#	print( "BUGS_17756 values0=".$values[0]."<br>" );
#	print( "BUGS_17756 values1=".$values[1]."<br>" );
#	print( "BUGS_17756 values2=".$values[2]."<br>" );
#	print( "BUGS_17756 values3=".$values[3]."<br>" );
#	$html_inputlist = '';
#        $html_inputlist .='<label for="'.$kin2.'">'.$kin2.'</label>';
#	print( "BUGS_17765 html_inputlist=".$html_inputlist."<br>" );
#        $html_inputlist .='<input id="'.$kin2.'" list="'.$kin2.'" type="text">';
#	$html_inputlist .= '<datalist id="'.$kin2.'">';
#	$html_inputlist .= '<option value="'.$value.'" />';
#	print( "BUGS_17768 html_inputlist=".$html_inputlist."<br>" );
##	for( $value in $values ){
#	$value1="ko1";
#	$value2="ko2";
#	$value3="ko3";
#	$html_inputlist .= '<option value="'.$value1.'" />';
#	$html_inputlist .= '<option value="'.$value2.'" />';
#	$html_inputlist .= '<option value="'.$value3.'" />';
##		}
#	$html_inputlist .= '</datalist>';
#	print( "BUGS_17778 html_inputlist=".$html_inputlist."<br>" );
#	return( $html_inputlist );
#	}
#

# function html_display( $htmlfile ) {
#
#	$htmlfile="index.html";
#	$html_main="";
#	$fp = fopen( $htmlfile, "r" );
#	|| die  "$progid $dttm ERR_10010; fopen htmlfile=[$htmlfile]<br>\n";
#	while(( $filetext = fgets($fp)) !== false ) {
#		$html_main .= $filetext;
#		print( $filetext );
#		printf( "$progid $dttm MSG_10030:  filetext=[$filetext]<br>\n" );
#		}
#	fclose($fp);
#	return( $html_main );
#
#	$html_main_b64  = "data:/text/plain;base64,PGh0bWw+Cgk8aGVhZD4KCQk8dGl0bGU+aW5kZXguaHRtbCAyMDE4MDA3MDJfMTcwMCBsb3N0IGt1cCBpbnNlcnQgYnVnczwvdGl0bGU+CjwhLS0KCQk8dGl0bGU+aW5kZXguaHRtbCAyMDE4MDYyMV8xMzAwIDwvdGl0bGU+CgkJPHRpdGxlPmluZGV4Lmh0bWwgMjAxODA2MDVfMDUwMCBjc3NfbGFiZWxfaW5wdXQ8L3RpdGxlPgoJCTx0aXRsZT5pbmRleC5odG1sIDIwMTgwNjAzXzA4MDA8L3RpdGxlPgoJCTx0aXRsZT5pbmRleC5odG1sIDIwMTgwNjAzXzA2MDA8L3RpdGxlPgoJCTx0aXRsZT5pbmRleF9saW5rcy5odG1sIDIwMTgwNjAyXzAxMDA8L3RpdGxlPgoJLS0+CgkJPHN0eWxlPgoJCQlib2R5eyBiYWNrZ3JvdW5kLWNvbG9yOnNsYXRlZ3JleTsgfQoJCQk8L3N0eWxlPgoKCgoJPHN0eWxlIGlkPSJzdHlsZV9pbnB1dCI+CgkJLmZpbGVDb250YWluZXIgewoJCSAgICBvdmVyZmxvdzogaGlkZGVuOwoJCSAgICBwb3NpdGlvbjogcmVsYXRpdmU7CgkJCX0KCQkKCQkuZmlsZUNvbnRhaW5lciBbdHlwZT1maWxlXSB7CgkJICAgIGN1cnNvcjogaW5oZXJpdDsKCQkgICAgZGlzcGxheTogYmxvY2s7CgkJICAgIGZvbnQtc2l6ZTogOTk5cHg7CgkJICAgIGZpbHRlcjogYWxwaGEob3BhY2l0eT0wKTsKCQkgICAgbWluLWhlaWdodDogMTAwJTsKCQkgICAgbWluLXdpZHRoOiAxMDAlOwoJCSAgICBvcGFjaXR5OiAwOwoJCSAgICBwb3NpdGlvbjogYWJzb2x1dGU7CgkJICAgIHJpZ2h0OiAwOwoJCSAgICB0ZXh0LWFsaWduOiByaWdodDtgCgkJICAgIHRvcDogMDsKCQkJfQoJCTwvc3R5bGU+Cgo8IS0tCgk8c3R5bGUgaWQ9InN0eWxlX2lucHV0MiI+CgkJaW5wdXRbdHlwZT10ZXh0XSB7CgkJCWJhY2tncm91bmQtY29sb3I6ICNCRkJEQkQ7CgkJCWJvcmRlcjpzb2xpZCAxcHggI0JGQkRCRDsKCQkJY29sb3I6ICM5Nzk3OTc7CgkJCWhlaWdodDogMjhweDsKCQkJcGFkZGluZy1sZWZ0OjEwcHg7CgkJCXdpZHRoOiAxOTFweDsKCQkJYm94LXNoYWRvdzogMnB4IDJweCAwICM4MjgxODEgaW5zZXQ7CgkJCX0KCQlpbnB1dFt0eXBlPWJ1dHRvbl0gewoJCQliYWNrZ3JvdW5kLWNvbG9yOiAjMUUxRTFFOwoJCQljb2xvcjogIzk3OTc5NzsKCQkJaGVpZ2h0OiAyNHB4OwoJCQl3aWR0aDogMTAzcHg7CgkJCWNvbG9yOiAjYmJiYmJiOwoJCQl0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7CgkJCWJveC1zaGFkb3c6LTFweCAycHggIzZFNkI2QSBpbnNldDsKCQkJfQoJCWlucHV0W3R5cGU9YnV0dG9uXSwgaW5wdXRbdHlwZT10ZXh0XQoJCQl7Ym9yZGVyLXJhZGl1czogNXB4OyBmb250LWZhbWlseTogU2Fuc2F0aW9uO30KCQkJe2JvcmRlci1yYWRpdXM6IDVweDsgZm9udC1mYW1pbHk6IHlva2ttb2trT1Q7fQoJCTwvc3R5bGU+CgktLT4KCgoKCgoJPHN0eWxlIGlkPSJzdHlsZV9wb3BvdmVyIiA+CgkJLnBvcG92ZXIgIHsKCQkJcG9zaXRpb246IHJlbGF0aXZlOwoJCQlmbG9hdDogbGVmdDsKCQkJcGFkZGluZzogNXB4OwoJCQkvKnotaW5kZXg6IDA7Ki8KCQkJfQoJCS5wb3BvdmVyOmhvdmVyIHsKCQkJYmFja2dyb3VuZC1jb2xvcjogc2xhdGVncmV5OwovLwkJCWJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTI7CgkJCS8qei1pbmRleDogNTA7Ki8KCQkJY29sb3I6IHdoaXRlOwovLwkJCWNvbG9yOiAjMzM1NTAwOwoJCQl0ZXh0LWRlY29yYXRpb246IG5vbmU7CgkJCX0KLypDU1MgZm9yIGVubGFyZ2VkIGltYWdlKi8KCQkucG9wb3ZlciBzcGFuIHsgCgkJCXBvc2l0aW9uOiBhYnNvbHV0ZTsgCi8vCQkJYmFja2dyb3VuZC1jb2xvcjogI2U1ZTVlNTsKCQkJYmFja2dyb3VuZC1jb2xvcjogc2xhdGVncmV5OwoJCQlwYWRkaW5nOiA1cHg7CgkJCS8qbGVmdDogLTEwMDBweDsqLwoJCQlib3JkZXI6IDFweCBzb2xpZCAjNjY2OwoJCQl2aXNpYmlsaXR5OiBoaWRkZW47CgkJCWNvbG9yOiBibGFjazsKCQkJdGV4dC1kZWNvcmF0aW9uOiBub25lOwoJCQl9Ci8qQ1NTIGZvciBlbmxhcmdlZCBpbWFnZSovCgkJLnBvcG92ZXIgc3BhbiBpbWcgeyAKCQkJYm9yZGVyLXdpZHRoOiAwcHg7IAoJCQkvKnBhZGRpbmc6IDJweDsqLwoJCQl9CgkJCi8qQ1NTIGZvciBlbmxhcmdlZCBpbWFnZSBvbiBob3ZlciovCgkJLnBvcG92ZXI6aG92ZXIgc3BhbiB7IAoJCQl2aXNpYmlsaXR5OiB2aXNpYmxlOyAKLy8JCQl3aWR0aDogMjAwcHg7CgkJCXRvcDogMHB4OyAvKiB1c2UgSUYgSUU2IHN0eWxlIHRvIGNvcnJlY3QgSUU2IHBvc2l0aW9ucyBvZiBsYXJnZXIgaW1hZ2UgcmVsYXRpdmUgdG8gdGh1bWIgKi8KCQkJbGVmdDogMHB4Oy8qcG9zaXRpb24gd2hlcmUgZW5sYXJnZWQgaW1hZ2Ugc2hvdWxkIG9mZnNldCBob3Jpem9udGFsbHkgKi8KCQkJfQoJCTwvc3R5bGU+CgoKCTxzdHlsZSBpZD0ic3R5bGVfdGh1bWJuYWlsIiA+CgkJLnRodW1ibmFpbCAgewoJCQlwb3NpdGlvbjogcmVsYXRpdmU7CgkJCWZsb2F0OiBsZWZ0OwoJCQlwYWRkaW5nOiA1cHg7CgkJCS8qei1pbmRleDogMDsqLwoJCQl9CgkJLnRodW1ibmFpbDpob3ZlciB7CgkJCWJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTI7CgkJCS8qei1pbmRleDogNTA7Ki8KCQkJY29sb3I6ICMzMzU1MDA7CgkJCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKCQkJfQovKkNTUyBmb3IgZW5sYXJnZWQgaW1hZ2UqLwoJCS50aHVtYm5haWwgc3BhbiB7IAoJCQlwb3NpdGlvbjogYWJzb2x1dGU7IAoJCQliYWNrZ3JvdW5kLWNvbG9yOiAjZTVlNWU1OwoJCQlwYWRkaW5nOiA1cHg7CgkJCS8qbGVmdDogLTEwMDBweDsqLwoJCQlib3JkZXI6IDFweCBzb2xpZCAjNjY2OwoJCQl2aXNpYmlsaXR5OiBoaWRkZW47CgkJCWNvbG9yOiBibGFjazsKCQkJdGV4dC1kZWNvcmF0aW9uOiBub25lOwoJCQl9Ci8qQ1NTIGZvciBlbmxhcmdlZCBpbWFnZSovCgkJLnRodW1ibmFpbCBzcGFuIGltZyB7IAoJCQlib3JkZXItd2lkdGg6IDBweDsgCgkJCS8qcGFkZGluZzogMnB4OyovCgkJCX0KCQkKLypDU1MgZm9yIGVubGFyZ2VkIGltYWdlIG9uIGhvdmVyKi8KCQkudGh1bWJuYWlsOmhvdmVyIHNwYW4geyAKCQkJdmlzaWJpbGl0eTogdmlzaWJsZTsgCgkJCXdpZHRoOiAyMDBweDsKCQkJdG9wOiA1cHg7IC8qIHVzZSBJRiBJRTYgc3R5bGUgdG8gY29ycmVjdCBJRTYgcG9zaXRpb25zIG9mIGxhcmdlciBpbWFnZSByZWxhdGl2ZSB0byB0aHVtYiAqLwoJCQlsZWZ0OiAzMDBweDsvKnBvc2l0aW9uIHdoZXJlIGVubGFyZ2VkIGltYWdlIHNob3VsZCBvZmZzZXQgaG9yaXpvbnRhbGx5ICovCgkJCX0KCQkKCQkvKlRIVU1CTkFJTDIgLSB0aHVtYm5haWwyIGhhcyBib3JkZXIgYW5kIGJvcmRlciBvbiBob3ZlciovCgkJLnRodW1ibmFpbDIgewoJCQlwb3NpdGlvbjogcmVsYXRpdmU7CgkJCWZsb2F0OiBsZWZ0OwoJCQlwYWRkaW5nOiA1cHg7CgkJCS8qei1pbmRleDogMDsqLwoJCQl9CgkJLnRodW1ibmFpbDI6aG92ZXIgeyAKCQkJYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllMjsKCQkJLyp6LWluZGV4OiA1MDsqLwoJCQljb2xvcjogIzMzNTUwMDsKCQkJdGV4dC1kZWNvcmF0aW9uOiBub25lOwoJCQl9CgkJLnRodW1ibmFpbDIgc3BhbiB7IC8qQ1NTIGZvciBlbmxhcmdlZCBpbWFnZSovCgkJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQkJYmFja2dyb3VuZC1jb2xvcjogI2U1ZTVlNTsKCQkJcGFkZGluZzogNXB4OwoJCQkvKmxlZnQ6IC0xMDAwcHg7Ki8KCQkJYm9yZGVyOiAxcHggc29saWQgIzY2NjsKCQkJdmlzaWJpbGl0eTogaGlkZGVuOwoJCQljb2xvcjogYmxhY2s7CgkJCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKCQkJfQoJCQovKkNTUyBmb3IgZW5sYXJnZWQgaW1hZ2UqLwoJCS50aHVtYm5haWwyIHNwYW4gaW1nIHsgYm9yZGVyLXdpZHRoOiAwcHg7fQovKkNTUyBmb3IgZW5sYXJnZWQgaW1hZ2Ugb24gaG92ZXIqLwoJCS50aHVtYm5haWwyOmhvdmVyIHNwYW4geyAKCQkJdmlzaWJpbGl0eTogdmlzaWJsZTsgd2lkdGg6IDIwOHB4OwoJCQl0b3A6IDVweDsgLyogdXNlIElGIElFNiBzdHlsZSB0byBjb3JyZWN0IElFNiBwb3NpdGlvbnMgb2YgbGFyZ2VyIGltYWdlIHJlbGF0aXZlIHRvIHRodW1iICovCgkJCWxlZnQ6IDMwMHB4Oy8qcG9zaXRpb24gd2hlcmUgZW5sYXJnZWQgaW1hZ2Ugc2hvdWxkIG9mZnNldCBob3Jpem9udGFsbHkgKi8KCQkJfQoJCWEudGh1bWJuYWlsMiBpbWcgeyB0ZXh0LWRlY29yYXRpb246bm9uZTsgei1pbmRleDogNTA7IH0KCQkKLyppZiBzYW1lIGF0dHJpYnV0ZSBmb3IgYWxsIDQgc3RhdGVzLCB0aGVuIGRlY2xhcmUgaGVyZSBpbiBhLnRodW1ibmFpbDIqLyAKCQlhLnRodW1ibmFpbDIgaW1nOmxpbmsgeyBib3JkZXI6IDJweCBzb2xpZCAjZTllOWUyOyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgfQoJCWEudGh1bWJuYWlsMiBpbWc6dmlzaXRlZCB7IGJvcmRlcjogMnB4IHNvbGlkICNlOWU5ZTI7IGJhY2tncm91bmQgOiB0cmFuc3BhcmVudDsgfQoJCWEudGh1bWJuYWlsMiBpbWc6aG92ZXIgeyBib3JkZXI6IDJweCBzb2xpZCAjZjAwOyBiYWNrZ3JvdW5kIDogdHJhbnNwYXJlbnQ7IH0KCQlhLnRodW1ibmFpbDIgaW1nOmFjdGl2ZSB7IGJvcmRlcjogMnB4IHNvbGlkICNlOWU5ZTI7IGJhY2tncm91bmQgOiB0cmFuc3BhcmVudDsgfQoJCWEudGh1bWJuYWlsMiBpbWcgeyBib3JkZXI6IDJweCBzb2xpZCAjZTllOWUyOyB9CgkJPC9zdHlsZT4KCgk8c3R5bGUgaWQ9InN0eWxlX2J1dHRvbnMiID4KICAgICAgICAgICAgICAgIGJvZHkgeyB0ZXh0LWFsaWduOiBjZW50ZXI7IGJhY2tncm91bmQtY29sb3I6ICJzbGF0ZWdyZXkiOyBjb2xvcjoid2hpdGUiOyB9CiAgICAgICAgICAgICAgICBidXR0b24gewovLwkJCXZpc2liaWxpdHk6IGhpZGRlbjsKLy8JCQliYWNrZ3JvdW5kOiByZ2JhKDcsIDk5LCA1MywgLjEpOwoJCQliYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKLy8JICAgICAgICAgICAgICAgIGJvcmRlcjogM3B4IHNvbGlkIHJnYmEoNywgOTksIDUzLCAxKTsKCSAgICAgICAgICAgICAgICBib3JkZXI6IDNweCBzb2xpZCBzbGF0ZWdyZXk7CgkJCWJvcmRlci1yYWRpdXM6IDVweDsKLy8JCQljb2xvcjogcmdiYSg3LCA5OSwgNTMsIDEpOwoJCQljb2xvcjogc2xhdGVncmV5OwoJCQljdXJzb3I6IHBvaW50ZXI7CgkJCWxpbmUtaGVpZ2h0OiA0MHB4OwoJCQlmb250LXNpemU6IDIwcHg7CgkJCW91dGxpbmU6IG5vbmU7CgkJCXBhZGRpbmc6IDAgMjBweDsKCQkJdHJhbnNpdGlvbjogYWxsIC4zczsKICAgICAgICAgICAgICAgIAl9CgkgICAgICAgIGJ1dHRvbjpob3ZlciB7Ci8vCSAgICAgICAgICAgICAgYmFja2dyb3VuZDogcmdiYSg3LCA5OSwgNTMsIDEpOwogIAkgICAgICAgICAgICAgIGJhY2tncm91bmQ6IGRhcmtncmV5c2xhdGU7Ci8vICAJICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiB5ZWxsb3c7Ci8vICAJICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKLy8gIAkgICAgICAgICAgICAgIGNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDEpOwogIAkgICAgICAgICAgICAgIGNvbG9yOiB3aGl0ZTsKICAJICAgICAgICAgICAgICB9CgkJcCB7Zm9udC1zaXplOiAyMHB4OyBmb250LXdlaWdodDogYm9sZDsKCQk8L3N0eWxlPgoKCTxzdHlsZSBpZD0ic3R5bGVfaW5wdXQiID4KICAgICAgICAgICAgICAgIGJvZHkgeyB0ZXh0LWFsaWduOiBjZW50ZXI7IGJhY2tncm91bmQtY29sb3I6ICJzbGF0ZWdyZXkiOyBjb2xvcjoid2hpdGUiOyB9CiAgICAgICAgICAgICAgICBpbnB1dCB7Ci8vCQkJdmlzaWJpbGl0eTogaGlkZGVuOwovLwkJCWJhY2tncm91bmQ6IHJnYmEoNywgOTksIDUzLCAuMSk7CgkJCWJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwovLwkgICAgICAgICAgICAgICAgYm9yZGVyOiAzcHggc29saWQgcmdiYSg3LCA5OSwgNTMsIDEpOwoJICAgICAgICAgICAgICAgIGJvcmRlcjogM3B4IHNvbGlkIHNsYXRlZ3JleTsKCQkJYm9yZGVyLXJhZGl1czogNXB4OwovLwkJCWNvbG9yOiByZ2JhKDcsIDk5LCA1MywgMSk7CgkJCWNvbG9yOiBzbGF0ZWdyZXk7CgkJCWN1cnNvcjogcG9pbnRlcjsKCQkJbGluZS1oZWlnaHQ6IDQwcHg7CgkJCWZvbnQtc2l6ZTogMTBweDsKCQkJb3V0bGluZTogbm9uZTsKCQkJcGFkZGluZzogMCAyMHB4OwoJCQl0cmFuc2l0aW9uOiBhbGwgLjNzOwogICAgICAgICAgICAgICAgCX0KCSAgICAgICAgYnV0dG9uOmhvdmVyIHsKLy8JICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDcsIDk5LCA1MywgMSk7CiAgCSAgICAgICAgICAgICAgYmFja2dyb3VuZDogZGFya2dyZXlzbGF0ZTsKLy8gIAkgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHllbGxvdzsKLy8gIAkgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwovLyAgCSAgICAgICAgICAgICAgY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsMSk7CiAgCSAgICAgICAgICAgICAgY29sb3I6IHdoaXRlOwogIAkgICAgICAgICAgICAgIH0KCQlwIHtmb250LXNpemU6IDEwcHg7IGZvbnQtd2VpZ2h0OiBib2xkOwoJCTwvc3R5bGU+CgoKCgoKPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KI2Ryb3Agewogd2lkdGg6MjAwcHg7CiBoZWlnaHQ6MTUwcHg7CiBtYXJnaW46M3B4IGF1dG87CiBiYWNrZ3JvdW5kOiNlZGRhYTg7CiBmb250LXNpemU6MTZweDsKfQojZHJvcCAjc3cgeyB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lOyBjdXJzb3I6cG9pbnRlcjsgfQojZHJhZyB7CiB3aWR0aDo0NTBweDsKIGhlaWdodDoxODBweDsKIG1hcmdpbjoxMnB4IGF1dG87CiBib3JkZXI6MXB4IHNvbGlkIHNpbHZlcjsKIGZvbnQtc2l6ZToxNnB4Owp9CiNkcmFnIC5kcmcgeyBtYXJnaW46MTBweCAxMnB4OyB9CiNkcmFnIGRpdi5kcmcgewogd2lkdGg6MTUwcHg7CiBoZWlnaHQ6NTBweDsKIGJhY2tncm91bmQ6IzA3ZGEwODsKIGJvcmRlcjoycHggc29saWQgYmx1ZTsKfQo8L3N0eWxlPgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoKJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CiAgLy8gc2V0cyB0aGUgZHJhZ2dhYmxlCiAgICQoJyNkcmFnIC5kcmcnKS5kcmFnZ2FibGUoewogICAgY3Vyc29yOiAnbW92ZScsICAgICAgICAgIC8vIHNldHMgdGhlIGN1cnNvciBhcHBlcmFuY2UKICAgIHJldmVydDogJ3ZhbGlkJwogIH0pOwoKICAvLyBzZXRzIGRyb3BwYWJsZQogICQoJyNkcm9wJykuZHJvcHBhYmxlKHsKICAgIGRyb3A6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewogICAgICAvLyBhZnRlciB0aGUgZHJhZ2dhYmxlIGlzIGRyb3BlZCwgaGlkZXMgaXQgd2l0aCBhIGhpZGUoKSBlZmZlY3QKICAgICAgdWkuZHJhZ2dhYmxlLmhpZGUoMTAwMCk7CiAgICB9CiAgfSk7CgogICQoJyNkcm9wMScpLmRyb3BwYWJsZSh7CiAgICBkcm9wOiBmdW5jdGlvbihldmVudCwgdWkpIHsKICAgICAgLy8gYWZ0ZXIgdGhlIGRyYWdnYWJsZSBpcyBkcm9wZWQsIGhpZGVzIGl0IHdpdGggYSBoaWRlKCkgZWZmZWN0CiAgICAgIHVpLmRyYWdnYWJsZS5oaWRlKDEwMDApOwogICAgfQogIH0pOwoKICAkKCcjZHJvcDInKS5kcm9wcGFibGUoewogICAgZHJvcDogZnVuY3Rpb24oZXZlbnQsIHVpKSB7CiAgICAgIC8vIGFmdGVyIHRoZSBkcmFnZ2FibGUgaXMgZHJvcGVkLCBoaWRlcyBpdCB3aXRoIGEgaGlkZSgpIGVmZmVjdAogICAgICB1aS5kcmFnZ2FibGUuaGlkZSgxMDAwKTsKICAgIH0KICB9KTsKCiAgLy8gd2hlbiB0aGUgIiNzdyIgZWxlbWVudCAoaW5zaWRlIHRoZSAiI2Ryb3AiKSBpcyBjbGlja2VkCiAgLy8gc2hvdyB0aGUgaXRlbXMgd2l0aCBjbGFzcyAiZHJnIiwgY29udGFpbmVkIGluICIjZHJhZyIKICAkKCcjZHJvcCAjc3cnKS5jbGljayhmdW5jdGlvbigpewogIC8vICAgJCgnI2RyYWcgLmRyZycpLnNsaWRlRG93bigxMDAwKTsKICAgdmFyIHVybCA9ICJodHRwczovL2thNi8va29fY2VudGVyL2tvX2NlbnRlci5waHA/cT1qcXVpL2RyYWdkcm9wMS8iCiAgICQobG9jYXRpb24pLmF0dHIoJ2hyZWYnLHVybCk7CiAgfSk7Cn0pOwo8L3NjcmlwdD4KCgoKCgoKCgoJCTwvaGVhZD4KCjxib2R5PgoKCTxkaXYgbmFtZT0iZGl2X2RkIiBpZD0iZGl2X2RkIiBoaWRkZW4gPgoJCTxkaXYgaWQ9ImRyb3AiPgoJCQk8c3BhbiBpZD0ic3ciPjxoMT5kcm9wIGp0ZmluYzwvaDI+PC9zcGFuPgoJCQk8YSBocmVmPS4va29fanRmL3ptL2p0Zl9wYXJjZWxzL2p0ZmRjX3RoZWF0ZXIuaHRtbCB0YXJnZXQ9X2JsYW5rPgoJCQkJPGltZyBoZWlnaHQ9MjAwIHdpZHRoPTMwMAoJCQkJc3JjPSIuL2tvX2p0Zi96bS9qdGZfcGFyY2Vscy9qdGZkY190aGVhdGVyL1RpbGVHcm91cDAvMC0wLTAucG5nIiBib3JkZXI9MCA+CgkJCQk8L2E+CgkJCTwvZGl2PgoKCQk8ZGl2IGlkPSJkcmFnIj4ganRmZGM6PGJyIC8+CgkJCTxpbWcgc3JjPSIuL2ltZ3MvanRmL2p0Zl90YWtlcy9qdGYyOV9lYWdsZV9ub3J0aC5wbmciIGFsdD0ianRmMjlfZWFnbGVfbm9ydGgiIHdpZHRoPSI1MCIgY2xhc3M9ImRyZyIvPgoJCgkJCTxkaXYgY2xhc3M9ImRyZyI+PGgxPmtvbmV0IGxsYyA8L2gxPgoJCQkJPHByZT50aW1lamFzayBqa3dpaTwvcHJlPgoJCQkJPGltZyBjbGFzcz0iZHJnIiBzcmM9Ii4vaW1ncy9idG4va28ucG5nIiBhbHQ9ImtvLnBuZyIgd2lkdGg9IjUwIiA+CgkJCQk8aW1nIGNsYXNzPSJkcmciIHNyYz0iLi9pbWdzL2J0bi9vay5wbmciIGFsdD0ib2sucG5nIiB3aWR0aD0iNTAiID4KCQkJCTxwcmU+dGltZXNhayBza3dpaTwvcHJlPgoJCQkJPC9kaXY+CgkKCQkJPGRpdiBjbGFzcz0iZHJnIj48aDE+anRmMjkgPC9oMT4KCQkJCTxhIGhyZWY9Li9rb19qdGYvem0vanRmX3BhcmNlbHMvanRmMjkuaHRtbCB0YXJnZXQ9X2JsYW5rPgoJCQkJCTxpbWcgaGVpZ2h0PTIwMCB3aWR0aD0xMDAgc3JjPSIuL2tvX2p0Zi96bS9qdGZfcGFyY2Vscy9qdGYyOS9UaWxlR3JvdXAwLzAtMC0wLnBuZyIgYm9yZGVyPTAgPgoJCQkJCTwvYT4KCQkJCTwvZGl2PgoJCgkKCQkJPGRpdiBjbGFzcz0iZHJnIj48aDE+ZG9naGVhZHM8L2gxPgoJCQkJPGRpdiBpZD0iZGl2X2p0Zl92aWQ1Ij4KCQkJCQk8dmlkZW8gY29udHJvbHM9ImNvbnRyb2xzX2p0ZjUiIGRlZmF1bHRtdXRlZD0iIiBtdXRlZD0idHJ1ZSIgc3R5bGU9IndpZHRoOjMyMHB4O2hlaWdodDoxODBweDsiIHBvc3Rlcj0iaW5kZXg0X21wNC5wbmciPgoJCQkJCTxzb3VyY2Ugc3JjPSIuL2tiL3YvZG9naGVhZF92aWRlby5tcDQiIHR5cGU9InZpZGVvL21wNDtjb2RlY3M9JnF1b3Q7YXZjMS40MkUwMUUsIG1wNGEuNDAuMiZxdW90OyI+CgkJCQkJPC92aWRlbz4KCQkJCQk8L2Rpdj4KCQkJCTwvZGl2PgoJCgkJCTxkaXYgY2xhc3M9ImRyZyI+PGgxPmp0ZmRjIG5pZ2h0IGNvdXJ0IGxpZ2h0cyBhY3Rpb24gMzcyMDwvaDE+CgkJCQk8ZGl2IGlkPSJkaXZfdmlkIj4KCQkJCQk8dmlkZW8gY29udHJvbHM9ImNvbnRyb2xzIiBkZWZhdWx0bXV0ZWQ9IiIgbXV0ZWQ9InRydWUiIHN0eWxlPSJ3aWR0aDozMjBweDtoZWlnaHQ6MTgwcHg7IiBwb3N0ZXI9ImluZGV4X21wNC5wbmciPgoJCQkJCQk8c291cmNlIHNyYz0iaW5kZXgxX2F2cmlsLm1wNCIgdHlwZT0idmlkZW8vbXA0O2NvZGVjcz0mcXVvdDthdmMxLjQyRTAxRSwgbXA0YS40MC4yJnF1b3Q7Ij4KCQkJCQkJPHNvdXJjZSBzcmM9ImluZGV4X2F2cmlsLndlYm0iIHR5cGU9InZpZGVvL3dlYm07Y29kZWNzPSZxdW90O3ZwOCwgdm9yYmlzJnF1b3Q7Ij4KCQkJCQkJPC92aWRlbz4KCQkJCQk8L2Rpdj4KCQkJCTwvZGl2PgoJCQk8L2Rpdj4KCQk8L2Rpdj4KCgoKCgoKCTxzY3JpcHQgaWQ9InNjcmlwdF9sb2FkX2xpa3MiID4KCQl2YXIgc3ZjX2xpbmtzID0gbmV3IEFycmF5KCk7CgkJdmFyIGtvX2xpbmtzID0gbmV3IEFycmF5KCk7CgkJdmFyIHVzX2xpbmtzID0gbmV3IEFycmF5KCk7CgkJdmFyIHVfbGlua3MgPSBuZXcgQXJyYXkoKTsKCQl2YXIgbm93X2xpbmtzID0gbmV3IEFycmF5KCk7CgkJdmFyIHNydl9saW5rcyA9IG5ldyBBcnJheSgpOwoJCWZ1bmN0aW9uIGxvYWRfc3ZjX2xpbmtzKCkgewoJCQl2YXIgaj0wOwoJCQlzdmNfbGlua3NbaisrXT0iLi9pbmRleF9hdi5odG1sfC4vaW1ncy9saW5rcy9pbmRleF9hdi5wbmd8aW5kZXhfYXZ8Li9pbWdzL2J0bi9rb2IucG5nIjsKCQkJc3ZjX2xpbmtzW2orK109Ii4vaW5kZXhfYmIuaHRtbHwuL2ltZ3MvbGlua3MvaW5kZXhfYmIucG5nfGluZGV4X2JifC4vaW1ncy9idG4va29iLnBuZyI7CgkJCXN2Y19saW5rc1tqKytdPSIuL2luZGV4X2JwLmh0bWx8Li9pbWdzL2xpbmtzL2luZGV4X2JwLnBuZ3xpbmRleF9iYnwuL2ltZ3MvYnRuL2tvYi5wbmciOwoJCQlzdmNfbGlua3NbaisrXT0iLi9pbmRleF9kZC5odG1sfC4vaW1ncy9saW5rcy9pbmRleF9kZC5wbmd8aW5kZXhfZGR8Li9pbWdzL2J0bi9rb2IucG5nIjsKCQkJc3ZjX2xpbmtzW2orK109Ii4vaW5kZXhfZmwuaHRtbHwuL2ltZ3MvbGlua3MvaW5kZXhfZmwucG5nfGluZGV4X2ZsfC4vaW1ncy9idG4va29iLnBuZyI7CgkJCXN2Y19saW5rc1tqKytdPSIuL2luZGV4X3BuLmh0bWx8Li9pbWdzL2xpbmtzL2luZGV4X3BuLnBuZ3xpbmRleF9wbnwuL2ltZ3MvYnRuL2tvYi5wbmciOwoJCQlzdmNfbGlua3NbaisrXT0iLi9pbmRleF9zbC5odG1sfC4vaW1ncy9saW5rcy9pbmRleF9zbC5wbmd8aW5kZXhfc2x8Li9pbWdzL2J0bi9rb2IucG5nIjsKCQkJc3ZjX2xpbmtzW2orK109Ii4vaW5kZXhfdGwuaHRtbHwuL2ltZ3MvbGlua3MvaW5kZXhfdGwucG5nfGluZGV4X3RsfC4vaW1ncy9idG4va29iLnBuZyI7CgkJCXN2Y19saW5rc1tqKytdPSIuL2luZGV4X3RtLmh0bWx8Li9pbWdzL2xpbmtzL2luZGV4X3RtLnBuZ3xpbmRleF90bXwuL2ltZ3MvYnRuL2tvYi5wbmciOwoJCQlzdmNfbGlua3NbaisrXT0iLi9pbmRleF91cy5odG1sfC4vaW1ncy9saW5rcy9pbmRleF91cy5wbmd8aW5kZXhfdXN8Li9pbWdzL2J0bi9rb2IucG5nIjsKCQkJc3ZjX2xpbmtzW2orK109Ii4vaW5kZXhfeXQuaHRtbHwuL2ltZ3MvbGlua3MvaW5kZXhfeXQucG5nfGluZGV4X3l0fC4vaW1ncy9idG4va29iLnBuZyI7CgkJCXN2Y19saW5rc1tqKytdPSIuL2luZGV4X3ptLmh0bWx8Li9pbWdzL2xpbmtzL2luZGV4X3ptLnBuZ3xpbmRleF96bXwuL2ltZ3MvYnRuL2tvYi5wbmciOwoJCQlyZXR1cm4oIHN2Y19saW5rcyApOwoJCQl9CgoJCWZ1bmN0aW9uIGxvYWRfc3J2X2xpbmtzKCkgewoJCQlzcnZfbGlua3NbMF09ImtvMC51cy9pbmRleC5odG1sfC4vaW1ncy9idG4va29leWViLnBuZ3xrbzB1c3wuL2ltZ3MvYnRuL2tvYi5wbmciOwoJCQlzcnZfbGlua3NbMV09ImtvMS51cy9pbmRleC5odG1sfC4vaW1ncy9idG4va29leWUucG5nfGtvMXVzfC4vaW1ncy9idG4va29wMTIzNC5wbmciOwoJCQlzcnZfbGlua3NbMl09ImtvMi51cy9pbmRleC5odG1sfC4vaW1ncy9idG4va29leWV3LnBuZ3xrbzJ1c3wuL2ltZ3MvYnRuL2tvdy5wbmciOwoJCQlzcnZfbGlua3NbM109ImtvbmV0Lm9yZy9pbmRleC5odG1sfC4vaW1ncy9idG4va28ucG5nfGtvbmV0LW9yZ3wuL2ltZ3MvYnRuL2tpYi5wbmciOwoJCQlzcnZfbGlua3NbNF09ImlwZXJtcy5jb20vaW5kZXguaHRtbHwuL2ltZ3MvbGlua3MvaXBlcm1zLnBuZ3xpcGVybXMtY29tfC4vaW1ncy9idG4va29wMzQucG5nIjsKCQkJc3J2X2xpbmtzWzVdPSJrYXNzaWwuY29tL2luZGV4Lmh0bWx8Li9pbWdzL2xpbmtzL2thc3NpbC5wbmd8a2Fzc2lsLWNvbXwuL2ltZ3MvYnRuL2tvcDEyLnBuZyI7CgkJCXJldHVybiggc3J2X2xpbmtzICk7CgkJCX0KCgkJZnVuY3Rpb24gbG9hZF9rb19saW5rcygpIHsKCQkJdmFyIGo9MDsKCQkJa29fbGlua3NbaisrXT0iLi9qa3dpaS9ibGFja2JvYXJkLmh0bWx8Li9pbWdzL2xpbmtzL2JsYWNrYm9hcmQucG5nfGJsYWNrYm9hcmR8Li9pbWdzL2J0bi9rb2V5ZS5wbmciOwoJCQlrb19saW5rc1tqKytdPSIuL2prd2lpL2pzL3RocmVlanMvZXhhbXBsZXMvaW5kZXguaHRtbHwuL2ltZ3MvbGlua3MvaW5kZXhfanMzZC5wbmd8aW5kZXhfanMzZHwuL2ltZ3MvYnRuL2tvZXllLnBuZyI7CgkJCWtvX2xpbmtzW2orK109Ii4va28vc3ZjL2pzL3N0ZW1rb3NraWpzL1RocmVlLmpzL2luZGV4Lmh0bWx8Li9pbWdzL2xpbmtzL2luZGV4X2pzM2Qtc3RlbWtvc2tpLnBuZ3xpbmRleF9qczNkLXN0ZW1rb3NraXwuL2ltZ3MvYnRuL2tvZXllLnBuZyI7CgkJCWtvX2xpbmtzW2orK109Ii4vamt3aWkvanMvZ29qcy9pbmRleC5odG1sfC4vaW1ncy9saW5rcy9pbmRleF9qc2dvLnBuZ3xpbmRleF9qc2dvfC4vaW1ncy9idG4va29leWUucG5nIjsKCQkJa29fbGlua3NbaisrXT0iLi9pbmRleF9qc2RrLmh0bWx8Li9pbWdzL2xpbmtzL2luZGV4X2pzZGsucG5nfGluZGV4X2pzZGt8Li9pbWdzL2J0bi9rb2V5ZS5wbmciOwoJCQlrb19saW5rc1tqKytdPSIuL2prd2lpL2tvaDVfZ2xvYmUva29oNV9nbG9iZS5odG1sfC4vaW1ncy9saW5rcy9rb2g1X2dsb2JlLnBuZ3xrb2g1X2dsb2JlfC4vaW1ncy9idG4va29leWUucG5nIjsKCQkJa29fbGlua3NbaisrXT0iLi9qa3dpaS9hdWQva2V5YmQvaW5kZXguaHRtbHwuL2ltZ3MvbGlua3MvaW5kZXhfanNrYi5wbmd8aW5kZXhfanNrYnwuL2ltZ3MvYnRuL2tvZXllLnBuZyI7CgkJCWtvX2xpbmtzW2orK109Ii4vc3ZjL2tva2JkbS9pbmRleC5odG1sfC4vaW1ncy9saW5rcy9pbmRleF9qc2tiLWRtLnBuZ3xpbmRleF9qc2tiLWRtfC4vaW1ncy9idG4va29leWUucG5nIjsKCQkJa29fbGlua3NbaisrXT0iLi9zdmMva29rYmRtcy9pbmRleC5odG1sfC4vaW1ncy9saW5rcy9pbmRleF9qc2tiLWRtcy5wbmd8aW5kZXhfanNrYi1kbXN8Li9pbWdzL2J0bi9rb2V5ZS5wbmciOwoJCQlrb19saW5rc1tqKytdPSIuL3BpYW5vLmh0bWx8Li9pbWdzL2xpbmtzL2luZGV4X3BpYW5vLnBuZ3xpbmRleF9waWFub3wuL2ltZ3MvYnRuL2tvZXllLnBuZyI7CgkJCWtvX2xpbmtzW2orK109Ii4vamt3aWkvYXVkL3BpYW5vX3VyaS9rb2g1X3BpYW5vX3VyaS5odG1sfC4vaW1ncy9saW5rcy9pbmRleF9qc2tiLXVyaS5wbmd8aW5kZXhfanNrYl91cml8Li9pbWdzL2J0bi9rb2V5ZS5wbmciOwoJCQlrb19saW5rc1tqKytdPSIuL2tvL3N2Yy9qcy9zdGVta29za2lqcy9pbmRleC5odG1sfC4vaW1ncy9saW5rcy9pbmRleF9qczNkLXN0ZW1rb3NraS5wbmd8aW5kZXhfanMzZC1zdGVta29za2l8Li9pbWdzL2J0bi9rb2V5ZS5wbmciOwoJCQlrb19saW5rc1tqKytdPSIuL2tvL3N2Yy9hdWQvbXJjb2xlcy9rb2g1X21yY29sZXMuaHRtbHwuL2ltZ3MvbGlua3MvbXJjb2xlcy5wbmd8bXJjb2xlc3wuL2ltZ3MvYnRuL2tvZXllLnBuZyI7CgkJCWtvX2xpbmtzW2orK109Imh0dHA6Ly9lZmZlY3RnYW1lcy5jb20vZGVtb3MvY2FudmFzY3ljbGUvfC4vaW1ncy9saW5rcy9pbmRleF9lZmZlY3RnYW1lcy5wbmd8aW5kZXhfZWZmZWN0Z2FtZXN8Li9pbWdzL2J0bi9rb2V5ZS5wbmciOwoJCQlrb19saW5rc1tqKytdPSJodHRwczovL3d3dy5sZXNoeWxhYnMuY29tL2FwcHMvc2ZNYWtlci98Li9pbWdzL2xpbmtzL2luZGV4X3NmbWFrZXIucG5nfGluZGV4X3NmbWFrZXJ8Li9pbWdzL2J0bi9rb2V5ZS5wbmciOwoJCQlrb19saW5rc1tqKytdPSJodHRwczovL2RyYWdvbmdvc2VydmVyLm5ldC98Li9pbWdzL2xpbmtzL2luZGV4X2Rncy5wbmd8aW5kZXhfZGdzfC4vaW1ncy9idG4va29leWUucG5nIjsKCQkJa29fbGlua3NbaisrXT0iLi9rb19jZW50ZXIva29fY2VudGVyLnBocHwuL2ltZ3MvbGlua3Mva29fY2VudGVyLnBuZ3xrb19jZW50ZXJ8Li9pbWdzL2J0bi9rb2IucG5nIjsKCQkJa29fbGlua3NbaisrXT0iLi9rb19zYWljL2tvX3NhaWMucGhwfC4vaW1ncy9saW5rcy9rb19zYWljLnBuZ3xrb19zYWljfC4vaW1ncy9idG4va29iLnBuZyI7CgkJCWtvX2xpbmtzW2orK109Ii4vaW5kZXhfa3QuaHRtbHwuL2ltZ3MvbGlua3MvaW5kZXhfa3QucG5nfGluZGV4X2t0fC4vaW1ncy9idG4va29iLnBuZyI7CgkJCWtvX2xpbmtzW2orK109Ii4vaW5kZXhfanRmLmh0bWx8Li9pbWdzL2xpbmtzL2luZGV4X2p0Zi5wbmd8aW5kZXhfanRmfC4vaW1ncy9idG4va29iLnBuZyI7CgkJCWtvX2xpbmtzW2orK109Ii4vaW5kZXgyYmlnLmh0bWx8Li9pbWdzL2xpbmtzL2luZGV4MmJpZy5wbmd8aW5kZXgyYmlnfC4vaW1ncy9idG4va29iLnBuZyI7CgkJCWtvX2xpbmtzW2orK109Ii4vaW5kZXgyYmlnLmh0bXwuL2ltZ3MvbGlua3MvaW5kZXgyYmlnX25vZWwucG5nfGluZGV4MmJpZ19ub2VsfC4vaW1ncy9idG4va29iLnBuZyI7CgkJCWtvX2xpbmtzW2orK109Ii4vamt3aWkvd2hpdGVib2FyZC5odG1sfC4vaW1ncy9saW5rcy93aGl0ZWJvYXJkLnBuZ3x3aGl0ZWJvYXJkfC4vaW1ncy9idG4va29leWUucG5nIjsKCQkJcmV0dXJuKCBrb19saW5rcyApOwoJCQl9DQoNCgoKCQlmdW5jdGlvbiBsb2FkX3VzX2xpbmtzKCkgewoJCQl2YXIgaj0wOwoJCQl1c19saW5rc1tqKytdPSJodHRwOi8vbGF3ZG9ub3Zhbi5jb218Li9pbWdzL3VzL2xhd2Rvbm92YW4ucG5nfGxhd19kb25vdmFufC4vaW1ncy9idG4va29leWUucG5nfGxhdyI7CgkJCXVzX2xpbmtzW2orK109Imh0dHA6Ly9uYXRoYW5zY29oZW4uY29tL3wuL2ltZ3MvdXMvbGF3X2NvaGVuX25hdGhhbl9zLnBuZ3xsYXdfX2NvaGVuX25hdGhhbl9zfC4vaW1ncy9idG4va29leWUucG5nfGxhdyI7CgoJCQl1c19saW5rc1tqKytdPSJodHRwczovL3d3dy5saW5rZWRpbi5jb20vaW4vYWxhbi1jb2hlbi0yMzE0NDczYi98Li9pbWdzL3VzL2xhd19jb2hlbl9hbGFuX3cucG5nfGxhd19fY29oZW5fYWxhbl93fC4vaW1ncy9idG4va29leWUucG5nfGxhdyI7CgkJCXVzX2xpbmtzW2orK109Imh0dHBzOi8vdHdpdHRlci5jb20vQWxhbldDb2hlbkVzcXwuL2ltZ3MvdXMvY29oZW5fYWxhbl93X3R3aXR0ZXIucG5nfGNvaGVuX2FsYW5fd190d2l0dGVyfC4vaW1ncy9idG4va29leWUucG5nfGxhdyI7CgkJCXVzX2xpbmtzW2orK109Imh0dHA6Ly93d3cucHJpbWVydXMuY29tL2F0dG9ybmV5cy9hbGV4YW5kZXItaC1rdWVobGluZy1lc3Etcm9zZW5ibHVtLWdvbGRlbmhlcnNoLXN0LWxvdWlzLW1pc3NvdXJpLW1vLmh0bXwuL2ltZ3MvdXMvbGF3X2t1ZWhsaW5nX2FsZXhhbmRlci5wbmd8bGF3X2xhd19rdWVobGluZ19hbGV4YW5kZXJ8Li9pbWdzL2J0bi9rb2V5ZS5wbmd8bGF3IjsKCQkJdXNfbGlua3NbaisrXT0iaHR0cDovL2Vsc3Rlcmxhdy5jb20vaGVucnktZWxzdGVyLWF0dG9ybmV5LW1pc3NvdXJpLWJlc3QvfC4vaW1ncy91cy9sYXdfZWxzdGVyX2hlbnJ5LnBuZ3xsYXdfZWxzdGVyX2hlbnJ5fC4vaW1ncy9idG4va29leWUucG5nfGxhdyI7CgkJCXVzX2xpbmtzW2orK109Imh0dHBzOi8vcHZpZXcuZmluZGxhdy5jb20vdmlldy8yODMwNzIxXzF8Li9pbWdzL3VzL2xhd193YWx0ZXJzX2FsYW4ucG5nfGxhd193YWx0ZXJzX2FsYW58Li9pbWdzL2J0bi9rb2V5ZS5wbmd8bGF3IjsKCQkJdXNfbGlua3NbaisrXT0iaHR0cHM6Ly93d3cudGhvbXBzb25jb2J1cm4uY29tL3wuL2ltZ3MvdXMvbGF3X3Rob21wc29uX2NvYnVybi5wbmd8bGF3X190aG9tcHNvbl9jb2J1cm58Li9pbWdzL2J0bi9rb2V5ZS5wbmd8bGF3IjsKCQkJdXNfbGlua3NbaisrXT0iaHR0cDovL2tvcmVpbnRpbGxlcnkuY29tL3wuL2ltZ3MvdXMvbGF3X2tvcmVpbl90aWxsZXJ5LnBuZ3xsYXdfa29yZWluX3RpbGxlcnl8Li9pbWdzL2J0bi9rb2V5ZS5wbmd8bGF3IjsKCQkJdXNfbGlua3NbaisrXT0iaHR0cDovL3d3dy5zbWl0aGJyb3dubGxjLmNvbS98Li9pbWdzL3VzL2xhd19zbWl0aF9icm93bi5wbmd8bGF3X3NtaXRoX2Jyb3dufC4vaW1ncy9idG4va29leWUucG5nfGxhdyI7CgoJCQl1c19saW5rc1tqKytdPSJodHRwczovL2ptaGFsdW1uaS5jb218Li9pbWdzL3VzL2ptaGFsdW1uaS5wbmd8ZWRfam1oYWx1bW5pfC4vaW1ncy9idG4va29leWUucG5nfGVkdSI7CgkJCXVzX2xpbmtzW2orK109Imh0dHBzOi8vam9obm1hcnNoYWxsaGlnaHNjaG9vbC5jb218Li9pbWdzL3VzL2pvaG5tYXJzaGFsbGhpZ2hzY2hvb2wucG5nfGVkX2pvaG5tYXJzaGFsbGhpZ2hzY2hvb2x8Li9pbWdzL2J0bi9rb2V5ZS5wbmd8ZWR1IjsKCQkJdXNfbGlua3NbaisrXT0iaHR0cHM6Ly93d3cuZ3JlYXRzY2hvb2xzLm9yZy9rZW50dWNreS9icmFuZGVuYnVyZy8xOTkzLUJyYW5kZW5idXJnLUhpZ2gtU2Nob29sL3wuL2ltZ3MvdXMvYnJhbmRlbmJ1cmdfaGlnaHNjaG9vbC5wbmd8ZWRfYnJhbmRlbmJ1cmctaGlnaHNjaG9vbHwuL2ltZ3MvYnRuL2tvZXllLnBuZ3xlZHUiOwoJCQl1c19saW5rc1tqKytdPSJodHRwczovL3d3dy5oYXplbHdvb2RzY2hvb2xzLm9yZy9QYWdlLzMxNDN8Li9pbWdzL3VzL2hhemVsd29vZF9zY2hvb2xzLnBuZ3xlZF9oYXplbHdvb2Rfc2Nob29sc3wuL2ltZ3MvYnRuL2tvZXllLnBuZ3xlZHUiOwoJCQl1c19saW5rc1tqKytdPSJodHRwczovL2J3LmVkdXwuL2ltZ3MvdXMvYncucG5nfGVkX2J3fC4vaW1ncy9idG4va29leWUucG5nfGVkdSI7CgoJCQl1c19saW5rc1tqKytdPSJodHRwOi8vb2xkdG93bmRvbnV0cy5jb218Li9pbWdzL3VzL29sZHRvd25kb251dHMucG5nfGZvb2Rfb2xkdG93bmRvbnV0c3wuL2ltZ3MvYnRuL2tvZXllLnBuZ3xmb29kIjsKCQkJdXNfbGlua3NbaisrXT0iaHR0cDovL2Zhcmthc3Bhc3RyaWVzLmNvbXwuL2ltZ3MvdXMvZmFya2FzcGFzdHJpZXMucG5nfGZvb2RfZmFya2FzcGFzdHJpZXN8Li9pbWdzL2J0bi9rb2V5ZS5wbmd8Zm9vZCI7CgkJCXVzX2xpbmtzW2orK109Imh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9IYW5zYUltcG9ydEhvdXNlfC4vaW1ncy91cy9oYW5zYWltcG9ydGhvdXNlLnBuZ3xmb29kX2hhbnNhaW1wb3J0aG91c2V8Li9pbWdzL2J0bi9rb2V5ZS5wbmd8Zm9vZCI7CgkJCXVzX2xpbmtzW2orK109Imh0dHA6Ly9oYXZhbmFncmlsbGNvLmNvbXwuL2ltZ3MvdXMvaGF2YW5hZ3JpbGxjby5wbmd8Zm9vZF9oYXZhbmFncmlsbGNvfC4vaW1ncy9idG4va29leWUucG5nfGZvb2QiOwoJCQl1c19saW5rc1tqKytdPSJodHRwOi8vc3Bpcm9zLXJlc3RhdXJhbnQuY29tfC4vaW1ncy91cy9zcGlyb3NfcmVzdGF1cmFudC5wbmd8Zm9vZF9zcGlyb3NfcmVzdGF1cmFudHwuL2ltZ3MvYnRuL2tvZXllLnBuZ3xmb29kIjsKCQkJdXNfbGlua3NbaisrXT0iaHR0cDovL2VkZWx3ZWlzc3Jlc3QuY29tfC4vaW1ncy91cy9lZGVsd2Vpc3NyZXN0LnBuZ3xmb29kX2VkZWx3ZWlzc3Jlc3R8Li9pbWdzL2J0bi9rb2V5ZS5wbmd8Zm9vZCI7CgkJCXVzX2xpbmtzW2orK109Imh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS93b29ob29ncmVla2Zvb2QyL3wuL2ltZ3MvdXMvd29vaG9vZ3JlZWtmb29kMi5wbmd8Zm9vZF93b29ob29ncmVla2Zvb2QyfC4vaW1ncy9idG4va29leWUucG5nfGZvb2QiOwoKCQkJdXNfbGlua3NbaisrXT0iaHR0cHM6Ly9iZG8uY29tL2Fib3V0L3VzLWxvY2F0aW9ucy9iZG8tc3QtbG91aXN8Li9pbWdzL3VzL2Jkby1zdGwucG5nfGFjY3RfYmRvLXN0bHwuL2ltZ3MvYnRuL2tvZXllLnBuZ3xhY2N0IjsKCQkJdXNfbGlua3NbaisrXT0iaHR0cHM6Ly9iZG8uY29tL2Fib3V0L3VzLWxvY2F0aW9ucy9iZG8tY2xldmVsYW5kLW9mZmljZXwuL2ltZ3MvdXMvYmRvLWNsZS5wbmd8YWNjdF9iZG8tY2xlfC4vaW1ncy9idG4va29leWUucG5nfGFjY3QiOwoJCQl1c19saW5rc1tqKytdPSJodHRwOi8vd3d3LmdhdGV3YXlsb2FuLmNvbS98Li9pbWdzL3VzL2dhdGV3YXlfbW9ydGdhZ2UucG5nfGdhdGV3YXlfbW9ydGdhZ2V8Li9pbWdzL2J0bi9rb2V5ZS5wbmd8YWNjdCI7CgkJCXVzX2xpbmtzW2orK109Imh0dHBzOi8vY2hlc29uc3VsdGluZy5jb218Li9pbWdzL3VzL2NoZWNvbnN1bHRpbmcucG5nfGJpel9jaGVjb25zdWx0aW5nfC4vaW1ncy9idG4va29leWUucG5nfGJpeiI7CgkJCXVzX2xpbmtzW2orK109Imh0dHA6Ly9zYWljLmNvbXwuL2ltZ3MvdXMvc2FpYy5wbmd8c2FpY3wuL2ltZ3MvYnRuL2tvZXllLnBuZ3xiaXoiOwoJCQl1c19saW5rc1tqKytdPSJodHRwOi8vbGVpZG9zLmNvbXwuL2ltZ3MvdXMvbGVpZG9zLnBuZ3xsZWlkb3N8Li9pbWdzL2J0bi9rb2V5ZS5wbmd8Yml6IjsKCgoJCQl1c19saW5rc1tqKytdPSJodHRwOi8va28yLnVzL2luZGV4X2ZvY3VzLmNvbXwuL2ltZ3MvdXMvZm9jdXNfc29sdXRpb25zLnBuZ3xmb2N1c19zb2x1dGlvbnN8Li9pbWdzL2J0bi9rb2V5ZS5wbmd8Yml6IjsKCQkJdXNfbGlua3NbaisrXT0iaHR0cDovL3d3dy5maW5kdXNsb2NhbC5jb20vaGFyZHdhcmUtc3RvcmVzL2tlbnR1Y2t5L2JyYW5kZW5idXJnL2FsbGVucy1zLXQtaGFyZHdhcmUtaW5jfC4vaW1ncy91cy9iaXpfYWxsZW5zX2hhcmR3YXJlLnBuZ3xiaXpfYWxsZW5zX2hhcmR3YXJlfC4vaW1ncy9idG4va29leWUucG5nfGJpeiI7CgkJCXVzX2xpbmtzW2orK109Imh0dHA6Ly9ncm93d2FyZWhvdXNlLmNvbXwuL2ltZ3MvdXMvZ3Jvd193YXJlaG91c2UucG5nfGdyb3dfd2FyZWhvdXNlfC4vaW1ncy9idG4va29leWUucG5nfGJpeiI7CgkJCXVzX2xpbmtzW2orK109Imh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9hdm9uZGFuY2VhbmRtYXJ0aWFsYXJ0c3wuL2ltZ3MvdXMvYXZvbmRhbmNlYW5kbWFydGlhbGFydHMucG5nfGF2b25kYW5jZWFuZG1hcnRpYWxhcnRzfC4vaW1ncy9idG4va29leWUucG5nfHBoeSI7CgkJCXVzX2xpbmtzW2orK109Imh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9hdm9uZGFuY2VhbmRtYXJ0aWFsYXJ0c3wuL2ltZ3MvdXMvYXZvbmRhbmNlYW5kbWFydGlhbGFydHMucG5nfGF2b25kYW5jZWFuZG1hcnRpYWxhcnRzfC4vaW1ncy9idG4va29leWUucG5nfHBoeSI7CgkJCXVzX2xpbmtzW2orK109Imh0dHA6Ly93d3cuc2F2ZWxsaWRhbmNlYW5kbWFydGlhbGFydHMuY29tLz9sb2FkPWh0bWx8Li9pbWdzL3VzL3NhdmVsbGlfZGFuY2VfbWFydGlhbGFydHMucG5nfHNhdmVsbGlfZGFuY2VfbWFydGlhbGFydHN8Li9pbWdzL2J0bi9rb2V5ZS5wbmd8cGh5IjsKCQkJdXNfbGlua3NbaisrXT0iaHR0cDovL215ZnVzaW9uZGFuY2UuY29tLz9sb2FkPWh0bWx8Li9pbWdzL3VzL2Z1c2lvbl9kYW5jZS5wbmd8ZnVzaW9uX2RhbmNlfC4vaW1ncy9idG4va29leWUucG5nfHBoeSI7CgkJCXVzX2xpbmtzW2orK109Imh0dHA6Ly93d3cuc3VwZXJzZXJpZXNiYXNlYmFsbC5jb20vfC4vaW1ncy91cy9zdXBlcl9zZXJpZXNfYmFzZWJhbGwucG5nfHN1cGVyX3Nlcmllc19iYXNlYmFsbHwuL2ltZ3MvYnRuL2tvZXllLnBuZ3xwaHkiOwoKCQkJdXNfbGlua3NbaisrXT0iaHR0cHM6Ly9mdGtub3guYWZjZWFjaGFwdGVycy5vcmcvfC4vaW1ncy91cy9hZmNlYV9rbm94LnBuZ3xhZmNlYV9rbm94fC4vaW1ncy9idG4va29leWUucG5nfG9yZyI7CgkJCXVzX2xpbmtzW2orK109Imh0dHBzOi8vc2NvdHQuYWZjZWFjaGFwdGVycy5vcmcvfC4vaW1ncy91cy9hZmNlYV9zY290dC5wbmd8YWZjZWFfc2NvdHR8Li9pbWdzL2J0bi9rb2V5ZS5wbmd8b3JnIjsKCQkJdXNfbGlua3NbaisrXT0iaHR0cHM6Ly93d3cuYmxlLXQub3JnL3wuL2ltZ3MvdXMvYmxlLnBuZ3xibGV8Li9pbWdzL2J0bi9rb2V5ZS5wbmd8b3JnIjsKCQkJdXNfbGlua3NbaisrXT0iaHR0cDovL3d3dy5kb2V2YWxsZXkub3JnL3wuL2ltZ3MvdXMvZG9lX3ZhbGxleS5wbmd8ZG9lX3ZhbGxleXwuL2ltZ3MvYnRuL2tvZXllLnBuZ3xvcmciOwoKCQkJdXNfbGlua3NbaisrXT0iaHR0cDovL3d3dy5jaGFwZWxvZnRoZWNyb3NzLm9yZy98Li9pbWdzL3VzL2NoYXBlbF9vZl90aGVfY3Jvc3MucG5nfGNoYXBlbF9vZl90aGVfY3Jvc3N8Li9pbWdzL2J0bi9rb2V5ZS5wbmd8cmVsIjsKCQkJdXNfbGlua3NbaisrXT0iaHR0cHM6Ly93d3cubGRzLm9yZy90ZW1wbGVzL2RldGFpbHMvc3QuLWxvdWlzLW1pc3NvdXJpLXRlbXBsZXwuL2ltZ3MvdXMvbGRzX3N0bC5wbmd8bGRzX3N0bHwuL2ltZ3MvYnRuL2tvZXllLnBuZ3xyZWwiOwoJCQl1c19saW5rc1tqKytdPSJodHRwczovL3d3dy5iZXRoYW55ZW5nbGlzaC5vcmcvfC4vaW1ncy91cy9iZXRoYW55X2VuZ2xpc2hfbHV0aGVyYW4ucG5nfGJldGhhbnlfZW5nbGlzaF9sdXRoZXJhbnwuL2ltZ3MvYnRuL2tvZXllLnBuZ3xyZWwiOwoJCQl1c19saW5rc1tqKytdPSJodHRwczovL3d3dy5tZWFkZWNvdW50eW1lc3Nlbmdlci5jb20vfC4vaW1ncy91cy9tZWFkZV9jb3VudHlfbWVzc2VuZ2VyLnBuZ3xtZWFkZV9jb3VudHlfbWVzc2VuZ2VyfC4vaW1ncy9idG4va29leWUucG5nfG1lZGlhIjsKCQkJdXNfbGlua3NbaisrXT0iLi9pbmRleF9qdGZkY3IuaHRtbHwuL2ltZ3MvdXMvanRmZGNyLnBuZ3xqdGZkY3J8Li9pbWdzL2J0bi9rb2V5ZS5wbmd8bWVkaWEiOwoJCQl1c19saW5rc1tqKytdPSJodHRwczovL21hcnMuanBsLm5hc2EuZ292L21zbC9tdWx0aW1lZGlhL3Jhdy8/cz0jLz9zbGlkZT0yMDg4fC4vaW1ncy91cy9tYXJzX2pwbF9uYXNhLnBuZ3xtYXJzX2pwbF9uYXNhfC4vaW1ncy9idG4va29leWUucG5nfHNjaSI7CgkJCXVzX2xpbmtzW2orK109Imh0dHBzOi8vbWFycy5uYXNhLmdvdi9tZXIvZ2FsbGVyeS9hbGwvb3Bwb3J0dW5pdHkuaHRtbHwuL2ltZ3MvdXMvbWFyc19uYXNhX2dvdi5wbmd8bWFyc19uYXNhX2dvdnwuL2ltZ3MvYnRuL2tvZXllLnBuZ3xzY2kiOwoJCQl1c19saW5rc1tqKytdPSIuL2luZGV4X2p0ZmRjci5odG1sfC4vaW1ncy91cy9qdGZkY3IucG5nfGp0ZmRjcnwuL2ltZ3MvYnRuL2tvZXllLnBuZ3xtZWRpYSI7CgkJCXJldHVybiggdXNfbGlua3MgKTsKCQkJfQoKCgoJCWZ1bmN0aW9uIGxvYWRfdV9saW5rcygpIHsKCQkJdmFyIGo9MDsKCQkJdV9saW5rc1tqKytdPSJodHRwOi8vbGF3ZG9ub3Zhbi5jb218Li9pbWdzL3VzL2xhd2Rvbm92YW4ucG5nfGxhd19kb25vdmFufC4vaW1ncy9idG4va29leWUucG5nfGxhdyI7CgkJCXVfbGlua3NbaisrXT0iaHR0cDovL25hdGhhbnNjb2hlbi5jb20vfC4vaW1ncy91cy9sYXdfY29oZW5fbmF0aGFuX3MucG5nfGxhd19fY29oZW5fbmF0aGFuX3N8Li9pbWdzL2J0bi9rb2V5ZS5wbmd8bGF3IjsKCgkJCXVfbGlua3NbaisrXT0iaHR0cHM6Ly93d3cubGlua2VkaW4uY29tL2luL2FsYW4tY29oZW4tMjMxNDQ3M2IvfC4vaW1ncy91cy9sYXdfY29oZW5fYWxhbl93LnBuZ3xsYXdfX2NvaGVuX2FsYW5fd3wuL2ltZ3MvYnRuL2tvZXllLnBuZ3xsYXciOwoJCQl1X2xpbmtzW2orK109Imh0dHBzOi8vdHdpdHRlci5jb20vQWxhbldDb2hlbkVzcXwuL2ltZ3MvdXMvY29oZW5fYWxhbl93X3R3aXR0ZXIucG5nfGNvaGVuX2FsYW5fd190d2l0dGVyfC4vaW1ncy9idG4va29leWUucG5nfGxhdyI7CgkJCXVfbGlua3NbaisrXT0iaHR0cDovL3d3dy5wcmltZXJ1cy5jb20vYXR0b3JuZXlzL2FsZXhhbmRlci1oLWt1ZWhsaW5nLWVzcS1yb3NlbmJsdW0tZ29sZGVuaGVyc2gtc3QtbG91aXMtbWlzc291cmktbW8uaHRtfC4vaW1ncy91cy9sYXdfa3VlaGxpbmdfYWxleGFuZGVyLnBuZ3xsYXdfbGF3X2t1ZWhsaW5nX2FsZXhhbmRlcnwuL2ltZ3MvYnRuL2tvZXllLnBuZ3xsYXciOwoJCQl1X2xpbmtzW2orK109Imh0dHA6Ly9lbHN0ZXJsYXcuY29tL2hlbnJ5LWVsc3Rlci1hdHRvcm5leS1taXNzb3VyaS1iZXN0L3wuL2ltZ3MvdXMvbGF3X2Vsc3Rlcl9oZW5yeS5wbmd8bGF3X2Vsc3Rlcl9oZW5yeXwuL2ltZ3MvYnRuL2tvZXllLnBuZ3xsYXciOwoJCQl1X2xpbmtzW2orK109Imh0dHBzOi8vcHZpZXcuZmluZGxhdy5jb20vdmlldy8yODMwNzIxXzF8Li9pbWdzL3VzL2xhd193YWx0ZXJzX2FsYW4ucG5nfGxhd193YWx0ZXJzX2FsYW58Li9pbWdzL2J0bi9rb2V5ZS5wbmd8bGF3IjsKCQkJdV9saW5rc1tqKytdPSJodHRwczovL3d3dy50aG9tcHNvbmNvYnVybi5jb20vfC4vaW1ncy91cy9sYXdfdGhvbXBzb25fY29idXJuLnBuZ3xsYXdfX3Rob21wc29uX2NvYnVybnwuL2ltZ3MvYnRuL2tvZXllLnBuZ3xsYXciOwoJCQl1X2xpbmtzW2orK109Imh0dHA6Ly9rb3JlaW50aWxsZXJ5LmNvbS98Li9pbWdzL3VzL2xhd19rb3JlaW5fdGlsbGVyeS5wbmd8bGF3X2tvcmVpbl90aWxsZXJ5fC4vaW1ncy9idG4va29leWUucG5nfGxhdyI7CgkJCXVfbGlua3NbaisrXT0iaHR0cDovL3d3dy5zbWl0aGJyb3dubGxjLmNvbS98Li9pbWdzL3VzL2xhd19zbWl0aF9icm93bi5wbmd8bGF3X3NtaXRoX2Jyb3dufC4vaW1ncy9idG4va29leWUucG5nfGxhdyI7CgkJCXJldHVybiggdV9saW5rcyApOwoJCQl9CgoNCgoJCWZ1bmN0aW9uIGxvYWRfbm93X2xpbmtzKCkgewoJCQl2YXIgaj0wOwoJCQlub3dfbGlua3NbaisrXT0iaHR0cDovL2luZGV4X3BhcnR5Lmh0bWx8Li9pbWdzL3VzL2xhd2Rvbm92YW4ucG5nfGxhd19kb25vdmFufC4vaW1ncy9idG4va29leWUucG5nfGxhdyI7CgkJCW5vd19saW5rc1tqKytdPSJodHRwOi8vaW5kZXhfanRmZGMuY29tL3wuL2ltZ3MvdXMvbGF3X2NvaGVuX25hdGhhbl9zLnBuZ3xsYXdfX2NvaGVuX25hdGhhbl9zfC4vaW1ncy9idG4va29leWUucG5nfGxhdyI7DQoJCQlub3dfbGlua3NbaisrXT0iaHR0cDovL2luZGV4X2p0ZmluYy5jb20vfC4vaW1ncy91cy9sYXdfY29oZW5fbmF0aGFuX3MucG5nfGxhd19fY29oZW5fbmF0aGFuX3N8Li9pbWdzL2J0bi9rb2V5ZS5wbmd8bGF3IjsNCgkJCW5vd19saW5rc1tqKytdPSJodHRwOi8vaW5kZXhfc3RsYy5jb20vfC4vaW1ncy91cy9sYXdfY29oZW5fbmF0aGFuX3MucG5nfGxhd19fY29oZW5fbmF0aGFuX3N8Li9pbWdzL2J0bi9rb2V5ZS5wbmd8bGF3IjsNCgkJCW5vd19saW5rc1tqKytdPSJodHRwOi8vaW5kZXhfanRmZGNyLmNvbS98Li9pbWdzL3VzL2xhd19jb2hlbl9uYXRoYW5fcy5wbmd8bGF3X19jb2hlbl9uYXRoYW5fc3wuL2ltZ3MvYnRuL2tvZXllLnBuZ3xsYXciOw0KCQkJbm93X2xpbmtzW2orK109Imh0dHA6Ly9pbmRleF9ieXJkcHVja2VyLmNvbS98Li9pbWdzL3VzL2xhd19jb2hlbl9uYXRoYW5fcy5wbmd8bGF3X19jb2hlbl9uYXRoYW5fc3wuL2ltZ3MvYnRuL2tvZXllLnBuZ3xsYXciOw0KCQkJcmV0dXJuKCBub3dfbGlua3MgKTsKCQkJfQoKCgkJZnVuY3Rpb24gc2hvd19zdmNfbGlua3MobW9kZSkgewoJCQlzdmNfbGlua3MgPSBsb2FkX3N2Y19saW5rcygpOwoJCQlodG1vdXRfc3ZjX2xpbmtzID0gIiI7CgkJCWh0bW91dF9zdmNfbGlua3ogPSAiIjsKCQkJZm9yIChpID0gMDsgaSA8IHN2Y19saW5rcy5sZW5ndGg7IGkrKykgewoJCQkJbXlfYnRuaW1nID0gIi4vaW1ncy9idG4va2liLnBuZyI7CgkJCQlteV9ocmVmID0gc3ZjX2xpbmtzW2ldLnNwbGl0KCJ8IilbMF07CgkJCQlteV9wb3BpbWcgPSBzdmNfbGlua3NbaV0uc3BsaXQoInwiKVsxXTsKCQkJCW15X2FsdCA9IHN2Y19saW5rc1tpXS5zcGxpdCgifCIpWzJdOwoKLy8JCQkJaHRtb3V0X3N2Y19saW5reiArPSAnPGRpdiAgY2xhc3M9ImRyYWciIG5hbWU9IicrbXlfYWx0KyciID5cbic7CgkJCQlodG1vdXRfc3ZjX2xpbmt6ICs9ICc8YSBjbGFzcz0iZHJhZyIgaHJlZj0iJyArIG15X2hyZWYgKyAnIiB0YXJnZXQ9X2JsYW5rPiInOwoJCQkJaHRtb3V0X3N2Y19saW5reiArPSAnPGltZyBpZD0iZHJnIiBzcmM9IicgKyBteV9wb3BpbWcgKyAnIiBhbHQ9IicgKyBteV9hbHQgKyAnIiBoZWlnaHQ9MTAwPjwvYT4nOwovLwkJCQlodG1vdXRfc3ZjX2xpbmt6ICs9ICc8L2RpdiA+JzsKCi8vCQkJCWh0bW91dF9zdmNfbGlua3MgKz0gJzxkaXYgIGNsYXNzPSJkcmFnIiBuYW1lPSInK215X2FsdCsnIiA+XG4nOwoJCQkJaHRtb3V0X3N2Y19saW5rcyArPSAnPGEgY2xhc3M9InRodW1ibmFpbCIgaHJlZj0iJyArIG15X2hyZWYgKyAnIiB0YXJnZXQ9X2JsYW5rPiInOwoJCQkJaHRtb3V0X3N2Y19saW5rcyArPSAnPGltZyBjbGFzcz0iZHJhZyIgaWQ9ImRyZyIgc3JjPSInICsgbXlfYnRuaW1nICsgJyIgYWx0PSInICsgbXlfYWx0ICsgJyIgd2lkdGg9MjVweCBoZWlnaHQ9MTRweCBib3JkZXI9MD4nOwoJCQkJaHRtb3V0X3N2Y19saW5rcyArPSAnPHNwYW4+PGltZyBzcmM9IicgKyBteV9wb3BpbWcgKyAnIiBhbHQ9IicgKyBteV9hbHQgKyAnIj48L3NwYW4+PC9hPic7Ci8vCQkJCWh0bW91dF9zdmNfbGlua3MgKz0gJzwvZGl2ID4nOwoJCQkJfQoJCQlpZiggbW9kZSA9PT0gJ3BvcCcgKSB7CgkJCQlodG1vdXRfc3ZjX2xpbmtzICs9ICI8YnI+PGJyPlxuIjsKCQkJCXZhciBkaXZfc3ZjX2xpbmtzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpdl9zdmNfbGlua3MnKTsKCQkJCWRpdl9zdmNfbGlua3MuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBodG1vdXRfc3ZjX2xpbmtzKTsKCQkJCXJldHVybiggaHRtb3V0X3N2Y19saW5rcyApOwoJCQkJfQoKCQkJaHRtb3V0X3N2Y19saW5reiArPSAiPGJyPjxicj5cbiI7CgkJCXZhciBkaXZfc3ZjX2xpbmt6ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpdl9zdmNfbGlua3onKTsKCQkJZGl2X3N2Y19saW5rei5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIGh0bW91dF9zdmNfbGlua3opOwoJCQlyZXR1cm4oIGh0bW91dF9zdmNfbGlua3ogKTsKCQkJfQoKCQlmdW5jdGlvbiBzaG93X2tvX2xpbmtzKG1vZGUpIHsKCQkJa29fbGlua3MgPSBsb2FkX2tvX2xpbmtzKCk7CgkJCWh0bW91dF9rb19saW5rcyA9ICIiOwoJCQlodG1vdXRfa29fbGlua3ogPSAiIjsKCQkJZm9yIChpID0gMDsgaSA8IGtvX2xpbmtzLmxlbmd0aDsgaSsrKSB7CgkJCQlteV9idG5pbWcgPSAiLi9pbWdzL2J0bi9rb2V5ZS5wbmciOwoJCQkJbXlfaHJlZiA9IGtvX2xpbmtzW2ldLnNwbGl0KCJ8IilbMF07CgkJCQlteV9wb3BpbWcgPSBrb19saW5rc1tpXS5zcGxpdCgifCIpWzFdOwoJCQkJbXlfYWx0ID0ga29fbGlua3NbaV0uc3BsaXQoInwiKVsyXTsKCgkJCQlodG1vdXRfa29fbGlua3ogKz0gJzxhIGNsYXNzPSJkcmFnIiBocmVmPSInICsgbXlfaHJlZiArICciIHRhcmdldD1fYmxhbms+Iic7CgkJCQlodG1vdXRfa29fbGlua3ogKz0gJzxpbWcgc3JjPSInICsgbXlfcG9waW1nICsgJyIgYWx0PSInICsgbXlfYWx0ICsgJyIgaGVpZ2h0PTEwMD48L2E+JzsKCgkJCQlodG1vdXRfa29fbGlua3MgKz0gJzxhIGNsYXNzPSJ0aHVtYm5haWwiIGhyZWY9IicgKyBteV9ocmVmICsgJyIgdGFyZ2V0PV9ibGFuaz4iJzsKCQkJCWh0bW91dF9rb19saW5rcyArPSAnPGltZyBzcmM9IicgKyBteV9idG5pbWcgKyAnIiBhbHQ9IicgKyBteV9hbHQgKyAnIiB3aWR0aD0yNXB4IGhlaWdodD0xNHB4IGJvcmRlcj0wPic7CgkJCQlodG1vdXRfa29fbGlua3MgKz0gJzxzcGFuPjxpbWcgc3JjPSInICsgbXlfcG9waW1nICsgJyIgYWx0PSInICsgbXlfYWx0ICsgJyI+PC9zcGFuPjwvYT4nOwoJCQkJfQoKCQkJaWYoIG1vZGUgPT09ICdwb3AnICkgewoJCQkJaHRtb3V0X2tvX2xpbmtzICs9ICI8YnI+PGJyPiI7CgkJCQl2YXIgZGl2X2tvX2xpbmtzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpdl9rb19saW5rcycpOwoJCQkJZGl2X2tvX2xpbmtzLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgaHRtb3V0X2tvX2xpbmtzKTsKCQkJCXJldHVybiggaHRtb3V0X2tvX2xpbmtzICk7CgkJCQl9CgoJCQlodG1vdXRfa29fbGlua3ogKz0gIjxicj48YnI+IjsKCQkJdmFyIGRpdl9rb19saW5reiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXZfa29fbGlua3onKTsKCQkJZGl2X2tvX2xpbmt6Lmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgaHRtb3V0X2tvX2xpbmt6KTsKCQkJcmV0dXJuKCBodG1vdXRfa29fbGlua3ogKTsKCQkJfQoNCgoJCWZ1bmN0aW9uIHNob3dfdXNfbGlua3MobW9kZSkgewoJCQl1c19saW5rcyA9IGxvYWRfdXNfbGlua3MoKTsKCQkJaHRtb3V0X3VzX2xpbmtzID0gIiI7CgkJCWh0bW91dF91c19saW5reiA9ICIiOwoJCQlmb3IgKGkgPSAwOyBpIDwgdXNfbGlua3MubGVuZ3RoOyBpKyspIHsKCQkJCW15X2J0bmltZyA9ICIuL2ltZ3MvYnRuL2tvZXllLnBuZyI7CgkJCQlteV9ocmVmID0gdXNfbGlua3NbaV0uc3BsaXQoInwiKVswXTsKCQkJCW15X3BvcGltZyA9IHVzX2xpbmtzW2ldLnNwbGl0KCJ8IilbMV07CgkJCQlteV9hbHQgPSB1c19saW5rc1tpXS5zcGxpdCgifCIpWzJdOwoKCQkJCWh0bW91dF91c19saW5reiArPSAnPGEgY2xhc3M9ImRyYWciIGhyZWY9IicgKyBteV9ocmVmICsgJyIgdGFyZ2V0PV9ibGFuaz4iJzsKCQkJCWh0bW91dF91c19saW5reiArPSAnPGltZyBzcmM9IicgKyBteV9wb3BpbWcgKyAnIiBhbHQ9IicgKyBteV9hbHQgKyAnIiBoZWlnaHQ9MTAwPjwvYT4nOwoKCQkJCWh0bW91dF91c19saW5rcyArPSAnPGEgY2xhc3M9InRodW1ibmFpbCIgaHJlZj0iJyArIG15X2hyZWYgKyAnIiB0YXJnZXQ9X2JsYW5rPiInOwoJCQkJaHRtb3V0X3VzX2xpbmtzICs9ICc8aW1nIHNyYz0iJyArIG15X2J0bmltZyArICciIGFsdD0iJyArIG15X2FsdCArICciIHdpZHRoPTI1cHggaGVpZ2h0PTE0cHggYm9yZGVyPTA+JzsKCQkJCWh0bW91dF91c19saW5rcyArPSAnPHNwYW4+PGltZyBzcmM9IicgKyBteV9wb3BpbWcgKyAnIiBhbHQ9IicgKyBteV9hbHQgKyAnIj48L3NwYW4+PC9hPic7CgkJCQl9CgoJCQlpZiggbW9kZSA9PT0gJ3BvcCcgKSB7CgkJCQlodG1vdXRfdXNfbGlua3MgKz0gIjxicj48YnI+IjsKCQkJCXZhciBkaXZfdXNfbGlua3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGl2X3VzX2xpbmtzJyk7CgkJCQlkaXZfdXNfbGlua3MuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBodG1vdXRfdXNfbGlua3MpOwoJCQkJcmV0dXJuKCBodG1vdXRfdXNfbGlua3MgKTsKCQkJCX0KCgkJCWh0bW91dF91c19saW5reiArPSAiPGJyPjxicj4iOwoJCQl2YXIgZGl2X3VzX2xpbmt6ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpdl91c19saW5reicpOwoJCQlkaXZfdXNfbGlua3ouaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBodG1vdXRfdXNfbGlua3opOwoJCQlyZXR1cm4oIGh0bW91dF91c19saW5reiApOwoJCQl9CgoNCg0KDQoNCg0KCgkJZnVuY3Rpb24gc2hvd191X2xpbmtzKG1vZGUpIHsKCQkJdV9saW5rcyA9IGxvYWRfdV9saW5rcygpOwoJCQlodG1vdXRfdV9saW5rcyA9ICIiOwoJCQlodG1vdXRfdV9saW5reiA9ICIiOwoJCQlmb3IgKGkgPSAwOyBpIDwgdV9saW5rcy5sZW5ndGg7IGkrKykgewoJCQkJbXlfYnRuaW1nID0gIi4vaW1ncy9idG4va29leWUucG5nIjsKCQkJCW15X2hyZWYgPSB1X2xpbmtzW2ldLnNwbGl0KCJ8IilbMF07CgkJCQlteV9wb3BpbWcgPSB1X2xpbmtzW2ldLnNwbGl0KCJ8IilbMV07CgkJCQlteV9hbHQgPSB1X2xpbmtzW2ldLnNwbGl0KCJ8IilbMl07CgoJCQkJaHRtb3V0X3VfbGlua3ogKz0gJzxhIGNsYXNzPSJkcmFnIiBocmVmPSInICsgbXlfaHJlZiArICciIHRhcmdldD1fYmxhbms+Iic7CgkJCQlodG1vdXRfdV9saW5reiArPSAnPGltZyBzcmM9IicgKyBteV9wb3BpbWcgKyAnIiBhbHQ9IicgKyBteV9hbHQgKyAnIiBoZWlnaHQ9MTAwPjwvYT4nOwoKCQkJCWh0bW91dF91X2xpbmtzICs9ICc8YSBjbGFzcz0idGh1bWJuYWlsIiBocmVmPSInICsgbXlfaHJlZiArICciIHRhcmdldD1fYmxhbms+Iic7CgkJCQlodG1vdXRfdV9saW5rcyArPSAnPGltZyBzcmM9IicgKyBteV9idG5pbWcgKyAnIiBhbHQ9IicgKyBteV9hbHQgKyAnIiB3aWR0aD0yNXB4IGhlaWdodD0xNHB4IGJvcmRlcj0wPic7CgkJCQlodG1vdXRfdV9saW5rcyArPSAnPHNwYW4+PGltZyBzcmM9IicgKyBteV9wb3BpbWcgKyAnIiBhbHQ9IicgKyBteV9hbHQgKyAnIj48L3NwYW4+PC9hPic7CgkJCQl9CgoJCQlpZiggbW9kZSA9PT0gJ3BvcCcgKSB7CgkJCQlodG1vdXRfdV9saW5rcyArPSAiPGJyPjxicj4iOwoJCQkJdmFyIGRpdl91X2xpbmtzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpdl91X2xpbmtzJyk7CgkJCQlkaXZfdV9saW5rcy5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIGh0bW91dF91X2xpbmtzKTsKCQkJCXJldHVybiggaHRtb3V0X3VfbGlua3MgKTsKCQkJCX0KCgkJCWh0bW91dF91X2xpbmt6ICs9ICI8YnI+PGJyPiI7CgkJCXZhciBkaXZfdV9saW5reiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXZfdV9saW5reicpOwoJCQlkaXZfdV9saW5rei5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIGh0bW91dF91X2xpbmt6KTsKCQkJcmV0dXJuKCBodG1vdXRfdV9saW5reiApOwoJCQl9CgoNCgoJCWZ1bmN0aW9uIHNob3dfbm93X2xpbmtzKG1vZGUpIHsKCQkJbm93X2xpbmtzID0gbG9hZF9ub3dfbGlua3MoKTsKCQkJaHRtb3V0X25vd19saW5rcyA9ICIiOwoJCQlodG1vdXRfbm93X2xpbmt6ID0gIiI7CgkJCWZvciAoaSA9IDA7IGkgPCBub3dfbGlua3MubGVuZ3RoOyBpKyspIHsKCQkJCW15X2J0bmltZyA9ICIuL2ltZ3MvYnRuL2tvZXllLnBuZyI7CgkJCQlteV9ocmVmID0gbm93X2xpbmtzW2ldLnNwbGl0KCJ8IilbMF07CgkJCQlteV9wb3BpbWcgPSBub3dfbGlua3NbaV0uc3BsaXQoInwiKVsxXTsKCQkJCW15X2FsdCA9IG5vd19saW5rc1tpXS5zcGxpdCgifCIpWzJdOwoKCQkJCWh0bW91dF9ub3dfbGlua3ogKz0gJzxhIGNsYXNzPSJkcmFnIiBocmVmPSInICsgbXlfaHJlZiArICciIHRhcmdldD1fYmxhbms+Iic7CgkJCQlodG1vdXRfbm93X2xpbmt6ICs9ICc8aW1nIHNyYz0iJyArIG15X3BvcGltZyArICciIGFsdD0iJyArIG15X2FsdCArICciIGhlaWdodD0xMDA+PC9hPic7CgoJCQkJaHRtb3V0X25vd19saW5rcyArPSAnPGEgY2xhc3M9InRodW1ibmFpbCIgaHJlZj0iJyArIG15X2hyZWYgKyAnIiB0YXJnZXQ9X2JsYW5rPiInOwoJCQkJaHRtb3V0X25vd19saW5rcyArPSAnPGltZyBzcmM9IicgKyBteV9idG5pbWcgKyAnIiBhbHQ9IicgKyBteV9hbHQgKyAnIiB3aWR0aD0yNXB4IGhlaWdodD0xNHB4IGJvcmRlcj0wPic7CgkJCQlodG1vdXRfbm93X2xpbmtzICs9ICc8c3Bhbj48aW1nIHNyYz0iJyArIG15X3BvcGltZyArICciIGFsdD0iJyArIG15X2FsdCArICciPjwvc3Bhbj48L2E+JzsKCQkJCX0KCgkJCWlmKCBtb2RlID09PSAncG9wJyApIHsKCQkJCWh0bW91dF9ub3dfbGlua3MgKz0gIjxicj48YnI+IjsKCQkJCXZhciBkaXZfbm93X2xpbmtzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpdl9ub3dfbGlua3MnKTsKCQkJCWRpdl9ub3dfbGlua3MuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBodG1vdXRfbm93X2xpbmtzKTsKCQkJCXJldHVybiggaHRtb3V0X25vd19saW5rcyApOwoJCQkJfQoKCQkJaHRtb3V0X25vd19saW5reiArPSAiPGJyPjxicj4iOwoJCQl2YXIgZGl2X25vd19saW5reiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXZfbm93X2xpbmt6Jyk7CgkJCWRpdl9ub3dfbGlua3ouaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBodG1vdXRfbm93X2xpbmt6KTsKCQkJcmV0dXJuKCBodG1vdXRfbm93X2xpbmt6ICk7CgkJCX0KCgkJZnVuY3Rpb24gc2hvd19zcnZfbGlua3MobW9kZSkgewoJCQlzcnZfbGlua3MgPSBsb2FkX3Nydl9saW5rcygpOwoJCQlodG1vdXRfc3J2X2xpbmtzID0gIiI7CgkJCWh0bW91dF9zcnZfbGlua3ogPSAiIjsKCQkJZm9yIChpID0gMDsgaSA8IHNydl9saW5rcy5sZW5ndGg7IGkrKykgewoJCQkJbXlfYnRuaW1nID0gIi4vaW1ncy9idG4va2l3LnBuZyI7CgkJCQlteV9ocmVmID0gc3J2X2xpbmtzW2ldLnNwbGl0KCJ8IilbMF07CgkJCQlteV9wb3BpbWcgPSBzcnZfbGlua3NbaV0uc3BsaXQoInwiKVsxXTsKCQkJCW15X2FsdCA9IHNydl9saW5rc1tpXS5zcGxpdCgifCIpWzJdOwoKCQkJCWh0bW91dF9zcnZfbGlua3ogKz0gJzxhIGNsYXNzPSJkcmFnIiBocmVmPSInICsgbXlfaHJlZiArICciIHRhcmdldD1fYmxhbms+Iic7CgkJCQlodG1vdXRfc3J2X2xpbmt6ICs9ICc8aW1nIHNyYz0iJyArIG15X3BvcGltZyArICciIGFsdD0iJyArIG15X2FsdCArICciIGhlaWdodD0xMDA+PC9hPic7CgoJCQkJaHRtb3V0X3Nydl9saW5rcyArPSAnPGEgY2xhc3M9InRodW1ibmFpbCIgaHJlZj0iJyArIG15X2hyZWYgKyAnIiB0YXJnZXQ9X2JsYW5rPiInOwoJCQkJaHRtb3V0X3Nydl9saW5rcyArPSAnPGltZyBzcmM9IicgKyBteV9idG5pbWcgKyAnIiBhbHQ9IicgKyBteV9hbHQgKyAnIiB3aWR0aD0yNXB4IGhlaWdodD0xNHB4IGJvcmRlcj0wPic7CgkJCQlodG1vdXRfc3J2X2xpbmtzICs9ICc8c3Bhbj48aW1nIHNyYz0iJyArIG15X3BvcGltZyArICciIGFsdD0iJyArIG15X2FsdCArICciPjwvc3Bhbj48L2E+JzsKCQkJCX0KCQkJaWYoIG1vZGUgPT09ICdwb3AnICkgewoJCQkJaHRtb3V0X3Nydl9saW5rcyArPSAiPGJyPjxicj5cbiIKCQkJCXZhciBkaXZfc3J2X2xpbmtzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpdl9zcnZfbGlua3MnKTsKCQkJCWRpdl9zcnZfbGlua3MuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBodG1vdXRfc3J2X2xpbmtzKTsKCQkJCXJldHVybiggaHRtb3V0X3Nydl9saW5rcyApOwoJCQkJfQoKCQkJaHRtb3V0X3Nydl9saW5reiArPSAiPGJyPjxicj5cbiIKCQkJdmFyIGRpdl9zcnZfbGlua3ogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGl2X3Nydl9saW5reicpOwoJCQlkaXZfc3J2X2xpbmt6Lmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgaHRtb3V0X3Nydl9saW5reik7CgkJCXJldHVybiggaHRtb3V0X3Nydl9saW5reiApOwoJCQl9CgovLwkJCWRvY3VtZW50LndyaXRlKCBodG1vdXRfc3ZjX2xpbmtzICk7Ci8vCQkJZG9jdW1lbnQud3JpdGUoIGh0bW91dF9rb19saW5rcyApOwovLwkJCWRvY3VtZW50LndyaXRlKCBodG1vdXRfc3J2X2xpbmtzICk7CgovLwkJCXZhciBkaXZfa29fbGlua3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZGl2X2tvX2xpbmtzIik7Ci8vCQkJdmFyIGRpdl9rb19saW5rc19vcmlnID0gZGl2X2tvX2xpbmtzLmlubmVySFRNTDsKLy8JCQlhbGVydCggIkJVR1NfNTAwIGRpdl9rb19saW5rc19vcmlnPSIrZGl2X2tvX2xpbmtzX29yaWcgKTsKCi8vCQkJZGl2X2tvX2xpbmtzLmlubmVySFRNTCA9ICIiOwovLwkJCWRpdl9rb19saW5rcy5hcHBlbmRDaGlsZCggaHRtb3V0X2tvX2xpbmtzKTsKCgovLyBwcXBxcHFwcXBxcHFwcXBxcHFwcXBxcHFwcXBxcHFwcXBxcHFwcXBxcHFwcXBxcHFwcXBxcHFwcXBxcHFwcXBxcHFwcXBxCi8vCi8vIGdldEVsZW1lbnRCeUlkKCJmb28iKS5pbnNlcnRBZGphY2VudEhUTUwKLy8gPCEtLSBiZWZvcmViZWdpbiAvIGJlZm9yZSAtLT4KLy8gPHA+Ci8vICAgPCEtLSBhZnRlcmJlZ2luIC8gcHJlcGVuZCAtLT4KLy8gICBmb28KLy8gICA8IS0tIGJlZm9yZWVuZCAvIGFwcGVuZCAtLT4KLy8gPC9wPgovLyA8IS0tIGFmdGVyZW5kIC8gYWZ0ZXItLT4KLy8KLy8JCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmb28nKS5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZWJlZ2luIiwgIjxocj4iKQovLwkJJCgnI2ZvbycpLmJlZm9yZSgiPGhyPiIpCi8vCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9vJykuaW5zZXJ0QWRqYWNlbnRIVE1MKCJhZnRlcmVuZCIsICI8aHI+IikKLy8JCSQoJyNmb28nKS5hcHBlbmQoIjxocj4iKQovLwkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZvbycpLmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlZW5kIiwgIjxocj4iKQovLwkJJCgnI2ZvbycpLmFwcGVuZCgiPGhyPiIpCi8vCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9vJykuaW5zZXJ0QWRqYWNlbnRIVE1MKCJhZnRlcmJlZ2luIiwgIjxocj4iKQovLwkJJCgnI2ZvbycpLnByZXBlbmQoIjxocj4iKQovLwovLwl2YXIgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0bicpOyAvLyBUaGUgYnV0dG9uIGl0c2VsZiB3aXRoIGFuIElEIG9mICdidG4nCi8vCXZhciBuZXdCdXR0b24gPSAnPGJ1dHRvbj5OZXcgYnV0dG9uPC9idXR0b24+JzsgLy8gTmV3IGJ1dHRvbiB0byBiZSBpbnNlcnRlZAovLwlidG4uaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmVuZCcsIG5ld0J1dHRvbik7Ci8vCi8vIGJkYmRiZGJkYmRiZGJkYmRiZGJkYmRiZGJkYmRiZGJkYmRiZGJkYmRiZGJkYmRiZGJkYmRiZGJkYmRiZGJkYmRiZGJkYmRiZGJkYgoJCWZ1bmN0aW9uIHNob3dfYWxsX2xpbmtzKG1vZGUpIHsKCQkJc2hvd19zdmNfbGlua3MobW9kZSk7CgkJCXNob3dfa29fbGlua3MobW9kZSk7CgkJCXNob3dfdXNfbGlua3MobW9kZSk7CgkJCXNob3dfdV9saW5rcyhtb2RlKTsKCQkJc2hvd19ub3dfbGlua3MobW9kZSk7CgkJCXNob3dfc3J2X2xpbmtzKG1vZGUpOwoJCQl9CgoJCTwvc2NyaXB0PgoKCTxkaXYgaWQ9ImRpdl9saW5rcyIgPgoJCTxociBjb2xvcj1yZWQ+CgkJPGRpdiBpZD0iZGl2X3N2Y19saW5rcyIgPiA8L2Rpdj4KCQk8aHIgY29sb3I9cmVkPgoJCgkJPGhyIGNvbG9yPXdoaXRlPgoJCTxkaXYgaWQ9ImRpdl9rb19saW5rcyIgPiA8L2Rpdj4KCQk8aHIgY29sb3I9d2hpdGU+CgoJCTxociBjb2xvcj13aGl0ZT4KCQk8ZGl2IGlkPSJkaXZfdXNfbGlua3MiID4gPC9kaXY+CgkJPGhyIGNvbG9yPXdoaXRlPgoKCQk8aHIgY29sb3I9d2hpdGU+CgkJPGRpdiBpZD0iZGl2X3VfbGlua3MiID4gPC9kaXY+CgkJPGhyIGNvbG9yPXdoaXRlPgoKCQk8aHIgY29sb3I9d2hpdGU+CgkJPGRpdiBpZD0iZGl2X25vd19saW5rcyIgPiA8L2Rpdj4KCQk8aHIgY29sb3I9d2hpdGU+CgoJCTxociBjb2xvcj1ibHVlPgoJCTxkaXYgaWQ9ImRpdl9zcnZfbGlua3MiID4gPC9kaXY+CgkJPGhyIGNvbG9yPWJsdWU+CgkJPC9kaXY+CgoJPGRpdiBpZD0iZGl2X2xpbmt6IiA+CgkJPGhyIGNvbG9yPXJlZD4KCQk8ZGl2IGlkPSJkaXZfc3ZjX2xpbmt6IiA+IDwvZGl2PgoJCTxociBjb2xvcj1yZWQ+CgoJCTxociBjb2xvcj1ibGFjaz4KCQk8ZGl2IGlkPSJkaXZfa29fbGlua3oiID4gPC9kaXY+CgkJPGhyIGNvbG9yPWJsYWNrPgoKCQk8aHIgY29sb3I9YmxhY2s+CgkJPGRpdiBpZD0iZGl2X3VzX2xpbmt6IiA+IDwvZGl2PgoJCTxociBjb2xvcj1ibGFjaz4KCgkJPGhyIGNvbG9yPWJsYWNrPgoJCTxkaXYgaWQ9ImRpdl91X2xpbmt6IiA+IDwvZGl2PgoJCTxociBjb2xvcj1ibGFjaz4KCgkJPGhyIGNvbG9yPWJsYWNrPgoJCTxkaXYgaWQ9ImRpdl9ub3dfbGlua3oiID4gPC9kaXY+CgkJPGhyIGNvbG9yPWJsYWNrPgoKCQk8aHIgY29sb3I9Ymx1ZT4KCQk8ZGl2IGlkPSJkaXZfc3J2X2xpbmt6IiA+IDwvZGl2PgoJCTxociBjb2xvcj1ibHVlPgoJCTwvZGl2PgoKCTxkaXYgaWQ9ImRpdl9jZmFhIiBjbGFzcz1rbz4KPCEtLQoJCTxzdHlsZSBpZD1zdHlsZV9jcmFhPgoJCQlib2R5IHsgCi8vCQkJYmFja2dyb3VuZDogdXJsKCJkYXRhOmZvbnQvdHRmO2Jhc2U2NCxBQUVBQUFBUEFEQUFBd0RBVDFNdk1sRmRmUUFBQU5PMEFBQUFWbEJEVEZSSzNzWVpBQURVREFBQUFEWmpiV0Z3SU93eUpRQUF3T3dBQUFoQVkzWjBJRnZaWFFNQUFBUDhBQUFBRkdad1oyMkRNOEpQQUFBRDZBQUFBQlJuYkhsbS9MLytTd0FBQkRnQUFMWWlhR1J0ZUMrTG1ZNEFBTWtzQUFBS2lHaGxZV1RTQTI1ZkFBRFVSQUFBQURab2FHVmhCa1VESmdBQTFId0FBQUFrYUcxMGVBRTBEQ0VBQUx6d0FBQUNrR3h2WTJFQU43V1FBQUM2WEFBQUFwUnRZWGh3QVNJQm1RQUExS0FBQUFBZ2JtRnRaVDRrT1BFQUFBRDhBQUFDNjNCdmMzUWc3eDdlQUFDL2dBQUFBV3B3Y21Wd0NvMFVsUUFBQkJBQUFBQW9BQUFBR0FFbUFBQUFBQUFBQUFBQVhBQXVBQUFBQUFBQUFBRUFFQUNTQUFBQUFBQUFBQUlBRGdDcEFBQUFBQUFBQUFNQVNBRHpBQUFBQUFBQUFBUUFFQUMvQUFBQUFBQUFBQVVBVEFGaEFBQUFBQUFBQUFZQUVBRzFBQUFBQUFBQUFBY0FBQUhGQUFFQUFBQUFBQUFBTGdBQUFBRUFBQUFBQUFFQUNBQ0tBQUVBQUFBQUFBSUFCd0NpQUFFQUFBQUFBQU1BSkFEUEFBRUFBQUFBQUFRQUNBQzNBQUVBQUFBQUFBVUFKZ0U3QUFFQUFBQUFBQVlBQ0FHdEFBRUFBQUFBQUFjQUFBSEZBQU1BQVFRSkFBQUFYQUF1QUFNQUFRUUpBQUVBRUFDU0FBTUFBUVFKQUFJQURnQ3BBQU1BQVFRSkFBTUFTQUR6QUFNQUFRUUpBQVFBRUFDL0FBTUFBUVFKQUFVQVRBRmhBQU1BQVFRSkFBWUFFQUcxQUFNQUFRUUpBQWNBQUFIRlEyOXdjaTR4T1RreklFVnNhMlVnVTNkcGJHeDFjeXdnUm05dWRGTm9iM0FnU1c1MFpYSnVZWFJwYjI1aGJBQkRBRzhBY0FCeUFDNEFNUUE1QURrQU13QWdBRVVBYkFCckFHVUFJQUJUQUhjQWFRQnNBR3dBZFFCekFDd0FJQUJHQUc4QWJnQjBBRk1BYUFCdkFIQUFJQUJKQUc0QWRBQmxBSElBYmdCaEFIUUFhUUJ2QUc0QVlRQnNXVzlyYTIxdmEyc0FXUUJ2QUdzQWF3QnRBRzhBYXdCclVtVm5kV3hoY2dCU0FHVUFad0IxQUd3QVlRQnlXVzlyYTIxdmEyc0FXUUJ2QUdzQWF3QnRBRzhBYXdCclRXRmpjbTl0WldScFlTQkdiMjUwYjJkeVlYQm9aWElnTkM0eElGbHZhMnR0YjJ0ckFFMEFZUUJqQUhJQWJ3QnRBR1VBWkFCcEFHRUFJQUJHQUc4QWJnQjBBRzhBWndCeUFHRUFjQUJvQUdVQWNnQWdBRFFBTGdBeEFDQUFXUUJ2QUdzQWF3QnRBRzhBYXdCclRXRmpjbTl0WldScFlTQkdiMjUwYjJkeVlYQm9aWElnTkM0eElESXdNREV0TVRBdE1EZ0FUUUJoQUdNQWNnQnZBRzBBWlFCa0FHa0FZUUFnQUVZQWJ3QnVBSFFBYndCbkFISUFZUUJ3QUdnQVpRQnlBQ0FBTkFBdUFERUFJQUF5QURBQU1BQXhBQzBBTVFBd0FDMEFNQUE0V1c5cmEyMXZhMnNBV1FCdkFHc0Fhd0J0QUc4QWF3QnJBRUFCQUN4MlJTQ3dBeVZGSTJGb0dDTm9ZRVF0Ly93QTdnRlJBWWNBS0FBb1dtSmFZZ0FDQUFSQUNRTURBZ0lCQVFBQUFZMjRBZitGUldoRVJXaEVSV2hFUldoRXNRUUVSV2hFc1FVRlJXaEVBQUlBUHdBQUFiWURJUUFEQUFjQVZrQWdBUWdJUUFrQ0J3UUVBUUFHQlFRREFnVUVCUUFIQmdVQkFnRURBQUFCQUVaMkx6Y1lBRDg4THp3US9Ud1EvVHdCTHp6OVBDODgvVHdBTVRBQlNXaTVBQUFBQ0Vsb1liQkFVbGc0RVRlNUFBai93RGhaTXhFaEVTVXpFU00vQVhmK3gvcjZBeUg4M3o4Q3BBQUhBQmovOUFFc0FoMEFDUUFUQUIwQUtRQTFBRUVBU2dCOFFEVUJTMHRBVEI0V0RBSkdQQWtGQkFBUERnUVRDa0lFTmlvRUhoMFVCQmtZTUFRa0p3VXRTQVU1UHdWRU13VWhHeEVISVFFa1JuWXZOeGdBTHk4OFBCRDlMLzB2L1MvOUFTLzlMeno5UEMvOUwvMHZQUDA4TGk0dUxpNHVBQzR1TGpFd0FVbG91UUFrQUV0SmFHR3dRRkpZT0JFM3VRQkwvOEE0V1JNVUl5STlBVFF6TWhVSEZDTWlQUUUwTXpJVkJ4UWpJajBCTkRNeUZSTVVCaU1pSmpVME5qTXlGZ2MwSmlNaUJoVVVGak15TmljVUJpTWlKalUwTmpNeUZnYzBJeUlWRkRNeU52c1VGQlFVUlJNVUZCTkhGQlFVRkwxUU9qcFFVRG82VUNnNUtTazVPU2twT1J3cEhSMG9LQjBkS1NnZUhSME1FZ0YvRXhPS0ZCVGFFeFBhRkJTS0V4T0tGQlQrZFRwUVVEbzZVRkE2S1RvNktTazVPU2tkS0NnZEhTZ29IUjBkSGhJQUF3QVhBVHdBeVFHekFBa0FFd0FkQUZSQUhnRWVIa0FmQUFVRUJBa0FFd29FRHc0ZEZBUVpHQnNSQnhZTUFnRVlSbll2TnhnQUx6dzhMenc4QVM4OC9Ud3ZQUDA4THp6OVBBQXhNQUZKYUxrQUdBQWVTV2hoc0VCU1dEZ1JON2tBSHYvQU9Ga1RGQ01pUFFFME16SVZCeFFqSWowQk5ETXlGUWNVSXlJOUFUUXpNaFhKRXhRVUUwVVVGQlFVUlJRVUZCUUJUeE1UVUJRVVVCTVRVQlFVVUJNVFR4UVVBQWdBRFAvaUFXOEJxQUFMQUJVQUh3QXhBRU1BVFFCWEFHTUFra0JBQVdSa1FHVUFWVXN5THlNWURnTmVVMUpOU1VoRVFqb3RKUlVNQUNBRUJoRVFCQ2tHR3hvRUh4WTFCRDVYVGdSWVBtRUZXMUJHT0FNZEV3TUpBd0ZlUm5Zdk54Z0FQejg4UHk4OEwvMEJMeno5UEJEOUx6ejlQQzg4L1R3US9TNHVMaTR1TGk0dUxpNHVMaTR1QUM0dUxpNHVMaTR1TVRBQlNXaTVBRjRBWkVsb1liQkFVbGc0RVRlNUFHVC93RGhaQVJRR0l5SW1OVFEyTXpJV0J4UWpJajBCTkRNeUZRY1VJeUk5QVRRek1oVVRGQVlqSWpVME1qWTFOQ1lpTlRRek1oWW5JaVkxTkRZek1oVVVJZ1lWRkJZeUZSUVhGQ01pUFFFME16SVZCeFFqSWowQk5ETXlGUWNVQmlNaUpqVTBOak15RmdGdkZ4QVJGeGdRRUJkUEZCUVVGRVVVRkJRVWJUUWxFeWNkSFNjVEpUUzhKVFEwSlJRb0hSMG9LQlFVRkJSRkZCUVVGQ2dZRHhFWEZ4RVFGd0ZaRVJjWEVSRVhHRXNURTNZVUZIWVRFM1lVRlA3aUpUUVVFeDRVRkIwVUZEUWdOQ1VsTkJRVUhSUVVIUlFVeFJRVWRoUVVkaFFVZGhRVU94QVhGaEVRRnhjQUFBb0FDdi9mQWRjQnJBQU5BQmtBSndBekFFRUFUd0JiQUdjQWJ3QjNBSkpBUXdGNGVFQjVLRXczSFFOT1FEa21Id1ZXQkVjVVhBUU1LSFFFY0E0RVVHZ0ViQzRFWW1VRksxTUZGMm9GYmpFRlgzWUZjaEVGV1FvWFJTdHVBejRCSkFJQkZFWjJMemNZQUQ4L1B5ODhMend2L1MvOUwvMFEvUkQ5RVAwQkwvMHYvUy85TC8wdlBQMHZQUDB1TGk0dUxpNEFMaTR1TGpFd0FVbG91UUFVQUhoSmFHR3dRRkpZT0JFM3VRQjQvOEE0V1FFSEJpTWlOVFEvQVRZek1oVVVCUlFHSXlJbU5UUTJNeklXRndjR0l5STFORDhCTmpNeUZSUVhGQVlqSWlZMU5EWXpNaFluQndZaklqVTBQd0UyTXpJVkZBOEJCaU1pTlRRL0FUWXpNaFVVSnpRbUl5SUdGUlFXTXpJMkFUUW1JeUlHRlJRV016STJBUlFqSWpVME16SUJGQ01pTlRRek1nSFFmZ1lJRkFaK0JnZ1UvdVkwSlNVME5DVWxORnFEQmdnVUJvSUhDQlM3TkNZbE5EUWxKVFZ5ZmdZSUZRWi9CZ2dWd24wR0NCUUdmUVlJRkJ3ZEZCUWVIaFFVSFFFYkhoUVVIUjBVRkI3K3lCUVVGQlFCR2hRVUZCUUJpWDRHRkFnR2ZnWVVDRDBsTkRRbEpqUTFWWU1HRlFnR2dnY1ZDUEFsTkRRbEpUUTBiWDRHRkFnR2Z3WVVDRzU5QmhRSUJuMEdGQWpwRkI0ZUZCUWRIZjc2RkIwZEZCUWVIZ0V2RkJRVS90RVVGQlFBQUFFQUZBQUFBaFlCUmdCSkFLRkFVUUZLU2tCTE9EczZOalV2TGlvcEQwWS9PQ3dsSGcwd0x5a29JaUViQnhvRVNVTThPelUwQUFkQ0ZnUUdHaGtGQWhNRkNVUkRJUU1nQlVsSUhBTWJRa0VqQXlJRlBUd29BeWN5QWdNQ0FBRUdSbll2TnhnQVB6dy9MeGM4L1JjOEx4YzgvUmM4TC8wUS9Ud0JMLzB2Rnp6OUZ6d3VMaTR1TGk0dUFDNHVMaTR1TGk0dUxqRXdBVWxvdVFBR0FFcEphR0d3UUZKWU9CRTN1UUJLLzhBNFdTVVVJeUVpSmpVME5qTXlGeFlWRkNNaUp5WWpJZ1lWRkJZN0FUVWhJalUwTXlFMUlTSTFORE1oTlNNaU5UUTdBVFUwTXpJZEFUTXlGUlFyQVJVek1oVVVLd0VWTXpJVkZDc0JBY2NVL3ZjK1dGZytPQ29JRkFjR0lpY3RRVUV0OWY3VkV4TUJLLzdWRXhNQkt6d1RFendVRkRzVUZEczdGQlE4UEJRVU94UVVWajQrV1NVSENSTUZHMEV1TFVJMEZCUWRGQlFkRkJRbkZCUW5GQlFkRkJRZEZCUUFBd0FKQUNVQklRRm1BQlFBSmdBN0FGOUFKQUU4UEVBOUxEVXFFQVVDQVRvek1Dd2xJQjBhRGdzSENRUVRBZ0FEQVNJWUF3RUFSbll2TnhnQVB5OEJMeGM4L1M0dUxpNHVMaTR1TGk0dUFDNHVMaTR1TGpFd0FVbG91UUFBQUR4SmFHR3dRRkpZT0JFM3VRQTgvOEE0V1RjMU16YzJNeklWRkFjR0J4Y1dGUlFqSWk4QkpqOEJOak15RlJRUEFSY1dGUlFqSWk4QkpqOEJOak15RlJRSEJnY1hGaFVVSXlJdkFTWTFOQklCUEFjSkZBUVpHelFGRmdrR1BRbGhhd1lKRkFSall3UVVDUVp0Q21NOEJna1ZCQmtiTkFRVkNRWTZCczhDVGdrVUJnWWhJa0lHQmhRSVRnc1FpZ2dVQmdhQmdRWUdFd2lORGdsT0NCUUdCU0VpUWdVSEZBaExCd2dHQUFBREFCRUFKUUVwQVdZQUVnQWtBRGNBVmtBZUFUZzRRRGtsTXlnZ0ZqWXhMU29sSXg0YkdCTU5DZ2NDQlE4REFSaEdkaTgzR0FBL0x3RXVMaTR1TGk0dUxpNHVMaTR1TGdBdUxpNHVNVEFCU1dpNUFCZ0FPRWxvWWJCQVVsZzRFVGU1QURqL3dEaFpOeFlQQVFZaklqVTBQd0VuSmpVME16SVhGZzhCQmlNaU5UUS9BU2NtTlRRek1oOEJGaGNIQmlNaU5UUS9BU1luSmpVME16SWZBUmJKQ3dwdEJnb1VCR1JrQkJVSkJtMWFPd1lKRlFRek13UVVDZ1k3QzZROEJna1ZCRE1OSmdRVkNRWThDdEVMREkwSUV3Y0ZnWUVGQmhVSWpCbE9DQlVHQlVKREJRY1RDRTBMRDAwSUZBWUdRaEl3QlFjVUNFNE5BQVVBRkFBQkFkb0JqQUFKQUJjQUlRQXZBRGtBZ2tBOEFUbzZRRHNXTnljV09UQXZBeUlFTlRRckF5b1JFQVVEQkFRTUN3a0RBQjBjQkNFWUFnVVRKU1FVQXhNRkN3b3lHZzRxS1FFdEh3Y0RBU2RHZGk4M0dBQS9QRHcvUEM4OFBDODgvUmM4RVAwQkx6ejlQQzhYUFAwWFBDOFhQUDBYUEM0dUFDNHhNQUZKYUxrQUp3QTZTV2hoc0VCU1dEZ1JON2tBT3YvQU9Ga0JGQ01pUFFFME16SVZGeU1WRkNNaVBRRTBPd0V5RlJRSEZDTWlOUkUwTXpJVkJ4UXJBU0kxTkRzQk5UUXpNaFVSRkNNaVBRRTBNeklWQVZBVUZCUVVkbllVRkJTS0ZNOFVGQlFVUmhPTEV4TjNGQk1URkJRVEFRRVRFM2NVRk5xSkZCU2RGQlFVaWhNVEFXUVVGSjRVRkJTS0ZCVCtuQk1UZHhRVUFBSUFDdjg1QUx3QUtBQUpBQk1BUjBBWEFSUVVRQlVJRVFnRER3NEVFd29HQlF3QkFBQUJBMFoyTHpjWUFEODhMeTg4QVM4OC9Ud3VMZ0F1TVRBQlNXaTVBQU1BRkVsb1liQkFVbGc0RVRlNUFCVC93RGhaTXlNaU5UUTdBVElWRkFjVUl5STlBVFF6TWhXb2l4TVRpeFJGRkJRVUZCUVVGQlN6RkJTS0ZCUUFBd0FSQUdnQmRRRVpBQWtBRXdBZEFGaEFJQUVlSGtBZkNCd1hFZzBJQXhvWkJSUUJBQVVGRUE4RkN3b0dCUlVVQVExR2RpODNHQUF2UEM4OEx6ejlQQkQ5UEJEOVBBRXVMaTR1TGk0QU1UQUJTV2k1QUEwQUhrbG9ZYkJBVWxnNEVUZTVBQjcvd0RoWkpTTWlOVFE3QVRJVkZBY2hJalUwTXlFeUZSUUhJeUkxTkRzQk1oVVVBV0hGRXhQRkZCVCt4QlFVQVR3VWk4VVVGTVVVOFJRVUZCUkVGQlFVRkVVVUV4TVVBQU1BRnYvekFNa0FwZ0FMQUJjQUh3QlBRQjBCSUNCQUlRQVlCQndNQkFBU0JBWWVCUm9QQlFrVkJRTUpBd0VHUm5Zdk54Z0FMeThRL1JEOUwvMEJMLzB2L1MvOUFERXdBVWxvdVFBR0FDQkphR0d3UUZKWU9CRTN1UUFnLzhBNFdUY1VCaU1pSmpVME5qTXlGZ2MwSmlNaUJoVVVGak15TmljVUl5STFORE15eVRVbEpUUTBKU1kwS0IwVkZCMGRGQlVkSGhRVEV4Uk1KVFEwSlNVMU5DWVZIUjBWRkIwZEZCTVRGQUFFQUJYLzRBSGhBYXNBRFFBYkFDa0FOd0JQUUJzQk9EaEFPUXcwSHhFRE5pOG9JUm9UREFVS0xTWUJHQUlCTDBaMkx6Y1lBRDgvTHk4QkxpNHVMaTR1TGk0QUxpNHVMakV3QVVsb3VRQXZBRGhKYUdHd1FGSllPQkUzdVFBNC84QTRXUUVIQmlNaU5UUS9BVFl6TWhVVUR3RUdJeUkxTkQ4Qk5qTXlGUlFYQndZaklqVTBQd0UyTXpJVkZBOEJCaU1pTlRRL0FUWXpNaFVVQWR0K0JnZ1ZCbjRHQ0JYQmdnWUlGUWFEQndjVVNuOEdDQlVIZmdZSUZjRjlCZ2dWQm4wR0NCVUJpWDRHRkFnR2ZnWVVDRzJEQmhVSUJvSUhGUWhlZmdZVENBZC9CaFVJYlgwR0ZBZ0dmUVlVQ0FBQUJRQWQvL01CdndHWEFBc0FGd0FqQUM4QU53QnFRQzRCT0RoQU9RQU1CQUFTQkFZa0JCZ3FCQjR3QkRRUEJRa25CU0VWQlFNdEJSc3lCVFlETmdFaEFna0RBUVpHZGk4M0dBQS9Qejh2RVAwdi9SRDlFUDBRL1FFdi9TLzlMLzB2L1MvOUFERXdBVWxvdVFBR0FEaEphR0d3UUZKWU9CRTN1UUE0LzhBNFdTVVVCaU1pSmpVME5qTXlGZ2MwSmlNaUJoVVVGak15TmljVUJpTWlKalUwTmpNeUZnYzBKaU1pQmhVVUZqTXlOaWNVSXlJMU5ETXlBYjk2VjFkNmVsZFhlaWRrUmtaa1pFWkdaQzVJTkRSSlNUUTBTQ2d4SXlNeU1pTWpNVFllSGg0ZXhWZDdlMWRYZTN0WFJtUmpSMFprWkVZMFNVazBORWxKTkNNeU1pTWpNaklqSFIwZEFBTUFHd0FCQU0wQmpBQUpBQk1BSFFCWFFDQUJIaDVBSHdBTUFoTUtCQThPR0FVRUJBa0FIUlFFR1JnV0d4RUhBd0VPUm5Zdk54Z0FQenc4THdFdlBQMDgzVHo5UEJEZFBQMDhBQzR1TVRBQlNXaTVBQTRBSGtsb1liQkFVbGc0RVRlNUFCNy93RGhaTnhRaklqMEJORE15RlFjVUl5STlBVFF6TWhVVEZDTWlOUkUwTXpJVnpSUVVGQlNLRkJRVUZFVVVGQlFVN1JNVGl4UVVpeE1UaXhRVS9wd1RFd0ZrRkJRQUF3QVJBQUFCY3dHMEFCY0FLUUEzQUdoQUtRRTRPRUE1S0RRZ0RnSTJMeWdsSWhzRkJBUVhBQXdMQkJFUUNBVVVKaVVGR0JRdEdSZ0FBUzlHZGk4M0dBQS9QRHd2RVAwOEVQMEJMeno5UEM4OC9Ud3VMaTR1TGk0QUxpNHVMakV3QVVsb3VRQXZBRGhKYUdHd1FGSllPQkUzdVFBNC84QTRXUUVVSXlJOUFUUW1JeUlHSFFFVUl5STlBVFEyTXpJV0ZSTWpJalUwUHdFMk16SVZGQThCTXpJVkZBc0JCaU1pTlRRM0V6WXpNaFVVQVVjVUZEa3BLRG9VRkZFNU9WRVkyUmNHV1FZS0ZnUkVzeFIrdmdZS0ZnUy9CZ29WQVI4VUZBb3BPam9wQ2hRVUNqbFNVam4rMXhBSENJRUpGQVlGWWhRVUFSNys2d2tVQmdVQkZRa1VCZ0FBQXdBWi8vUUJNQUdMQUJFQUh3QTVBR0pBSmdFNk9rQTdFRFlvSEJVSkF6UVhFQXNJQlEwSkJDWXdCQ0FlTFFVakl3NE5Bd2dDQVNaR2RpODNHQUEvUHp3dkVQMEJMeno5TC8wOExpNHVMaTR1QUM0dUxpNHVMakV3QVVsb3VRQW1BRHBKYUdHd1FGSllPQkUzdVFBNi84QTRXUUVIQmlNaU5UUS9BU01pTlRRN0FUSVZGQThCQmlNaU5UUS9BVFl6TWhVVUZSUUdJeUltTlRRek1oVVVGak15TmpVMEp5WTFORE15RnhZQkpJNEdCUlFKV1prVEU5a1hESzBHQlJRSnJRVUdGRkE2T2xBVUV6b3BLVGtQQkJVS0JoWUJabUVFRmdvR1BCUVVFZ3RoZFFRVkN3WjFCQllLbFRwUVVEb1VGQ2s1T2lnZkZnWUdGQW9qQUFBRkFDVUFBUUZFQWRzQURRQVhBQ0VBS3dBMUFIdEFNd0UyTmtBM0RETXBIeUVZREFrSUJBTWRIQVFLQURVc0JERXdKeVlFS3lJWERnUVRFZ29KQlJBQkFCVXVKQm9HQWdFU1JuWXZOeGdBUHk4OFBDOHZQRHo5UEFFdlBQMDhMeno5UEM4OC9Ud3ZQUDA4TGk0dUxpNHVMZ0F1TGk0eE1BRkphTGtBRWdBMlNXaGhzRUJTV0RnUk43a0FOdi9BT0ZrbEl5STlBVFF6TWgwQk16SVZGQ2NVSXlJMUVUUXpNaFVURkNNaVBRRTBNeklWQnhRaklqMEJORE15RlFjVUl5STlBVFF6TWhVQk1MRVVGQk9lRlBjVUZCUVU0eFFVRkJSRkZCUVVGRVVVRkJRVW5oU0tGQlIyRkJRVUV4TUJGUlFVL2swVEUyTVVGR01URTJNVUZHTVRFMk1VRkFBQUF3QW4vL1FCUFFHTEFBMEFGd0F5QUdkQUtRRXpNMEEwREM0Z0ZSQUVMQ2dFR0F3WERnUVRFZ0lCQkI0SEJnRUFCUWtsQlJzYkNna0RBUVpHZGk4M0dBQS9QQzhRL1JEOVBBRXZQRHo5UEM4OC9Ud3ZQUDB1QUM0dUxpNHVNVEFCU1dpNUFBWUFNMGxvWWJCQVVsZzRFVGU1QURQL3dEaFpBU01WRkNNaVBRRTBPd0V5RlJRSEZDTWlQUUUwTXpJVkZ4UUdJeUltSnlZek1oY2VBVE15TmpVMEp5WTFORE15Rng0QkFTblZGQlFVNlJTb0ZCUVVGS2hST2pCS0N3WVpEd1FKTkNJcE9rSU9GQVFFS1RNQlkzZ1RFNHdVRkJUUkZCU1VGQlNvT2xBN0xSa1BJQ282S0VZWEJRMFdBaEJIQUFBRkFCZi85QUc0QWRzQURRQWJBQ2tBTlFCQkFGdEFJZ0ZDUWtCRERCOFJBeWdoR2hNTUJUWUVLandFTURrRk16OEZMU1lZQ2kwQk1FWjJMemNZQUM4dlBEd1EvUy85QVMvOUwvMHVMaTR1TGk0QUxpNHVNVEFCU1dpNUFEQUFRa2xvWWJCQVVsZzRFVGU1QUVML3dEaFpBUWNHSXlJMU5EOEJOak15RlJRUEFRWWpJalUwUHdFMk16SVZGQThCQmlNaU5UUS9BVFl6TWhVVUV4UUdJeUltTlRRMk16SVdCelFtSXlJR0ZSUVdNekkyQWJOOUJna1dCWDBHQ1JacGZRWUpGUVI5QmdrVmFYd0dDaFVGZkFZSkZUNVJPVHBSVVRvNVVTZzVLU2s2T2lrcE9RRzVuZ2dWQndhZUNCVUhCSjhJRkFZR253Z1VCZ2FmQ0JRR0JwOElGQWIrdlRwUVVEbzZVRkE2S1RvNktTazVPZ0FEQUJBQUFRRXVBWXdBQ1FBVEFDRUFZRUFtQVNJaVFDTUFGZ0ljRHc0RUV3b0ZCQVFKQUNFVUJCa1lHaGtGQnd3ZkhoRURCd01CSEVaMkx6Y1lBRDhYUEM4US9Ud0JMeno5UEM4OC9Ud3ZQUDA4TGdBdUxqRXdBVWxvdVFBY0FDSkphR0d3UUZKWU9CRTN1UUFpLzhBNFdTVVVJeUk5QVRRek1oVURGQ01pTlJFME16SVZCeFFqSWowQkl5STFORHNCTWhVQkxoUVVGQlJHRXhRVUUwVVVGRmdURTJ3VTdSTVRpeFFVL3B3VEV3RmtGQlNMRXhOM0ZCUVVBQVFBSXYvekFNa0JsZ0FMQUJZQUlRQTlBR3hBTEFFK1BrQS9KRFF3SmlJWkZRQUVQQ2drSHc4R0JEWXlMaHdGT1EwTUJTRVhFZ1VEQ1FVckt6a0RBUzVHZGk4M0dBQS9MeEQ5TC8wdlBQMDhFUDBCTHp3OC9UdzhMenc4L1R3OExpNHVMZ0F4TUFGSmFMa0FMZ0ErU1doaHNFQlNXRGdSTjdrQVB2L0FPRmszTkNZaklnWVZGQll6TWpZbkl3WVZGQll6TWpZMU5DYzJOVFFtSXlJR0ZSUWZBUllWRkFjV0ZSUUdJeUltTlRRM0pqVTBOeVkxTkRZek1oWVZGS0VhRVJJYUdoSVJHaVVOSlJvU0VSb2xKUm9SRWhvbFBCNGRIVEVpSWpJZEhSNGVNU01pTVVjU0dSa1NFaG9hdXdja0Voa1pFaVF2QlNZUkdob1JKZ1VVR3lRbEdob2xJakl5SWljWUdDY21HUmduSWpFeElpWUFCUUFMQUFBQnF3SG5BQXNBR1FBbkFEVUFRUUJrUUNnQlFrSkFRd0F5SkJZMExTWWZHQkU4QkFZMkJBQWZCUTg1QlFrREJUOEpQd0VySFE4QUFTMUdkaTgzR0FBL1BEdy9MeEQ5RVAwUS9RRXYvUy85TGk0dUxpNHVBQzR1TGpFd0FVbG91UUF0QUVKSmFHR3dRRkpZT0JFM3VRQkMvOEE0V1FFVUJpTWlKalUwTmpNeUZnOEJCaU1pTlRRL0FUWXpNaFVVRHdFR0l5STFORDhCTmpNeUZSUVBBUVlqSWpVMFB3RTJNeklWRkRjMEppTWlCaFVVRmpNeU5nR3JVVG81VVZFNU9sRTJmUVlLRkFWOEJna1dhM3dHQ1JZRmZRWUtGR2g4QndrVkJYd0hDUlhTT2lrcE9qc29LVG9CWFRwUlVUbzVVVkh3bmdnVEJ3YWVDQlFHQnA0SUZBWUduZ2dUQndhZENCTUhCcDBJRXdleEtEbzZLQ2c3T3dBR0FDSC85QURVQVdzQUN3QVhBQ01BTHdBM0FEOEFia0F2QVVCQVFFRUFKQmdFREFBNE1BUTBQQjRxQkFZU01nVTJBd1VoUGdVNkd3VUpGUVVuTFFVUER5RUJDUU1CRWtaMkx6Y1lBRDgvTHhEOUwvMFEvUy85RVAwdi9RRXZQUDA4THp6OVBDODgvVHdBTVRBQlNXaTVBQklBUUVsb1liQkFVbGc0RVRlNUFFRC93RGhaRXhRR0l5SW1OVFEyTXpJV0ZSUUdJeUltTlRRMk16SVdKelFtSXlJR0ZSUVdNekkyRlRRbUl5SUdGUlFXTXpJMkp4UWpJalUwTXpJVkZDTWlOVFF6TXRRMEpTVTBOQ1VsTkRRbEpUVTFKU1UwS0IwVUZCMGRGQlFkSFJRVUhoNFVGQjBkRkJNVEZCUVVGQlFCRWlVek15VWxORFRySkRRMEpDWTBOYUVVSFIwVUZCMGRzaFVkSFJVVEhSemFFeE1VMmhNVEZBQUZBQmYvT1FESkFPNEFDd0FWQUI4QUt3QXpBR3BBTEFFME5FQTFBQjBnQkJRQUxCOFdCREFiR2lZRUR3WWpCUWt1QlRJREJTa1NFUVVNR0EwTUFBa0JBUVpHZGk4M0dBQS9Qend2RVAwOEwvMHYvUkQ5QVM4OC9TODhQUDA4UEM4OC9RQXVNVEFCU1dpNUFBWUFORWxvWWJCQVVsZzRFVGU1QURUL3dEaFpOeFFHSXlJbU5UUTJNeklXQnlNaU5UUTdBVElWRkFjVUl5STlBVFF6TWhVM05DWWpJZ1lWRkJZek1qWW5GQ01pTlRRek1zazBKU1UwTkNVbE5CU0xFeE9MRkVVVUZCUVVIaDRVRkIwZEZCUWVIaFFVRkJTVkpUUTBKU1UwTkxvVUZCUVVzeFFVakJNVHZCUWRIUlFVSFIwVUZCUVVBQUFEQUFrQUpRRWhBV1lBRkFBbUFEc0FYMEFrQVR3OFFEMHNOU29RQlFJQk9qTXdMQ1VnSFJvT0N3Y0pCQk1DQUFNQkloZ0RBUUJHZGk4M0dBQS9Md0V2Rnp6OUxpNHVMaTR1TGk0dUxpNEFMaTR1TGk0dU1UQUJTV2k1QUFBQVBFbG9ZYkJBVWxnNEVUZTVBRHovd0RoWk56VXpOell6TWhVVUJ3WUhGeFlWRkNNaUx3RW1Qd0UyTXpJVkZBOEJGeFlWRkNNaUx3RW1Qd0UyTXpJVkZBY0dCeGNXRlJRaklpOEJKalUwRWdFOEJ3a1VCQmtiTkFVV0NRWTlDV0ZyQmdrVUJHTmpCQlFKQm0wS1l6d0dDUlVFR1JzMEJCVUpCam9HendKT0NSUUdCaUVpUWdZR0ZBaE9DeENLQ0JRR0JvR0JCZ1lUQ0kwT0NVNElGQVlGSVNKQ0JRY1VDRXNIQ0FZQUFBTUFFUUJvQVhVQkdRQUpBQk1BSFFCWVFDQUJIaDVBSHdnY0Z4SU5DQU1hR1FVVUFRQUZCUkFQQlFzS0JnVVZGQUVOUm5Zdk54Z0FMend2UEM4OC9Ud1EvVHdRL1R3QkxpNHVMaTR1QURFd0FVbG91UUFOQUI1SmFHR3dRRkpZT0JFM3VRQWUvOEE0V1NVaklqVTBPd0V5RlJRSElTSTFORE1oTWhVVUJ5TWlOVFE3QVRJVkZBRmh4Uk1UeFJRVS9zUVVGQUU4Rkl2RkZCVEZGUEVVRkJRVVJCUVVGQlJGRkJNVEZBQURBQkVBSlFFcEFXWUFFZ0FrQURjQVZrQWVBVGc0UURrbE15Z2dGall4TFNvbEl4NGJHQk1OQ2djQ0JROERBUmhHZGk4M0dBQS9Md0V1TGk0dUxpNHVMaTR1TGk0dUxnQXVMaTR1TVRBQlNXaTVBQmdBT0Vsb1liQkFVbGc0RVRlNUFEai93RGhaTnhZUEFRWWpJalUwUHdFbkpqVTBNeklYRmc4QkJpTWlOVFEvQVNjbU5UUXpNaDhCRmhjSEJpTWlOVFEvQVNZbkpqVTBNeklmQVJiSkN3cHRCZ29VQkdSa0JCVUpCbTFhT3dZSkZRUXpNd1FVQ2dZN0M2UThCZ2tWQkRNTkpnUVZDUVk4Q3RFTERJMElFd2NGZ1lFRkJoVUlqQmxPQ0JVR0JVSkRCUWNUQ0UwTEQwMElGQVlHUWhJd0JRY1VDRTROQUFNQUt2ODVBTndDUkFBTEFCY0FZQUNFUURrQllXRkFZZ3hPS2x0YVVFUkRMRWM2QUFSWEd3eGVJd1lFUURNU1NnVlVXMW9GUkVNOUJSZzNOZ1VnSmdVd0ZRVURDUVVQVkE4QkVrWjJMemNZQUM4dkVQMHYvUy85TC8wOEwvMHZQUDA4RVAwQkx6dzgvVHc4THp3OC9UdzhMaTR1TGk0dUFDNHVNVEFCU1dpNUFCSUFZVWxvWWJCQVVsZzRFVGU1QUdIL3dEaFpGelFtSXlJR0ZSUVdNekkyTnhRR0l5SW1OVFEyTXpJV0F6SVdGUlFHQndZaklnWVZGQll6TWpjMk16SVZGQWNHSXlJbU5UUTJOek15TmpVMEppTWlKalUwTmpNeE1qWTFOQ1lqSWdjR0l5STFORGMyTXpJV0ZSUUdJekVpQmhVVUZyUWRGQlFkSFJRVUhTZzBKU1UwTkNVbE5Ga2xOQzhqQXdRVUhSMFVIZzRHREJVQ0dUZ2xOQzhpQ0JRZEhSUWxORFFsRkIwZEZCa09Cd29WQkJrd0pUUTBKUlFkSFc0VUhSMFVGQjBkRkNVME5DVWxORFFCZVRRbEl6SURBUjBVRkIwY0RCUUZCVEkwSlNJMEF4MFVGQjAwSmlVMEhSUVVIUlFLRkFZR0pUTWxKVFFkRkJVZEFBQUNBQkVBQUFLeUFac0FLd0ExQUZsQUlRRTJOa0EzQWhNUURRb0hOQzhZQWpJeEJTMHNKaUFCS1NNZEF4WUVBQUVZUm5Zdk54Z0FQencvUER3L1BDODgvVHdCTGk0dUxnQXVMaTR1TGpFd0FVbG91UUFZQURaSmFHR3dRRkpZT0JFM3VRQTIvOEE0V1NVV0ZSUWpJaWNEQndZaklpOEJCd1lqSWk4QkF3WWpJalUwTnhNMk16SWZBVGMyTXpJZkFUYzJNeklYQXlFaU5UUXpJVElWRkFLeEFSVU5CV2ROQndzTEIxRlJCd3dMQjB4bkJRNFZBWGdHREF3SFVGRUhEQXNIVUZBSERBMEZFLzUyRXhNQmloUWFBd1FURGdFL293OFBxcW9QRDZQK3dRNFRCQU1CY0JFUHFxb1BENnFxRHhIKzJoUVRFeFFBQUFJQUpQL0ZBUU1CakFBV0FEa0Fia0FyQVRvNlFEc0RPU29uSmgwY0V4SUFOelV6TFN3b0p5TWZHUmNWQ1E4RUF3d0xCUVlIQmpBdkF3RUpSbll2TnhnQVB6d3ZQQkQ5UEFFdi9TNHVMaTR1TGk0dUxpNHVMaTRBTGk0dUxpNHVMaTR1TVRBQlNXaTVBQWtBT2tsb1liQkFVbGc0RVRlNUFEci93RGhaTnhjV0ZSUUdLd0VpTlRRN0FUSTJOVFFtS3dFaU5UUXpNalUwSmlzQklqVTBNekkxTkNZckFSRVVJeUkxRVRRN0FUSVdGUlFIRmhVVUIzTldPanNxWmhRVVpoa2tJeG9yRXhOUkhSVWZGQlE1Rmc4N0ZCUVVUeUF0R0RBamp3a2JRaWs3RkJRakdSb2tGQlF4RkIwVUZDVVFGdjZ3RXhNQlpCUXVJQm9WR1RZZ0dnQURBQi8vOUFOb0FaZ0FEUUE5QUU0QWRrQXhBVTlQUUZBVU1Dd2tGa0krSmhRS0FBVUVOUXhBQkIxS0JBeEVHZ0lGRUUwZ0NBVXFNaTRxUERnUUF6b09Bd0UxUm5Zdk54Z0FQencvUER3dlBEd1EvVHc4RVAwOFBBRXYvZDM5RU4zOUxpNHVMaTR1QUM0dUxpNHhNQUZKYUxrQU5RQlBTV2hoc0VCU1dEZ1JON2tBVC8vQU9Ga0JKaU1pQmhVVUZqTXlOeVkxTkNVMk16SVhGaFVVSXlJbkppTWlCaFVVRmpNeU56WXpNaFVVQndZaklpY0dJeUluQmlNaUpqVTBOak15RnpZek1oTW1OVFEzSmlNaUJ3WWpCaFVVRmpNeUFVY29MMFpqWTBZdktEc0JTRFJDWER3R0ZBZ0dNMGxHWTJOR1N6RUdDQlFHUUZoQk5UZytRRGMxUWxaN2UxWkNORGRCUHhjN095Z3VPeThCQVQ1a1JpNEJXQmhrUjBaakdEMVVWVmdtUWdZSUZBWTJaRWRHWXpRSEZBZ0dRU1VsSlNWN1ZsaDdKaWIrbkR0V1dEc1lKUUUwVVVaakFBWUFIUC8vQWpRQmpBQVRBQ2NBT3dCRkFFOEFXUUNFUUR3QldscEFXd0JYVWtNK0lob09CZ29FQUI0RUZESUVLRVU4QkVFM0xRTkFUMFlFUzBwWlVBUlZWRXBHQlFSTk9TUURFQU5JS3hnREJBQUJWRVoyTHpjWUFEOFhQRDhYUEJEOVBBRXZQUDA4THp6OVBDOFhQUDA4TC8wdi9TLzlMaTR1TGdBdUxpNHVNVEFCU1dpNUFGUUFXa2xvWWJCQVVsZzRFVGU1QUZyL3dEaFpKUlFIQmlNaU5UUTNOalUwSnlZMU5ETXlGeFlIRkFjR0l5STFORGMyTlRRbkpqVTBNeklYRmdjVUJpTWlOVFF6TWpZMU5DWWpJalUwTXpJV0J4UWpJajBCTkRNeUZRTVVJeUkxRVRRek1oVURGQ01pUFFFME16SVZBalEyQmdvVUF5OHdBeFFMQmpaUVN3WUlGQVkvUXdjVkNBWlBUM1JTRXhOQ1hGeENFeE5UYzdNVUZCUVVUeFFVRkJSUEZCUVVGTVZrVndvVEJnVk9XVmxQQlFZVUNsTnJiVkVIRkFnR1JWNWlRd2NJRkFaUmNGSnpGQlJjUVVKY0ZCUnpvUk1UblJRVS93QVRFd0ZrRkJUKy94TVRuUlFVQUFjQUl3QUFBYTRCakFBSkFCTUFIUUFuQURFQU93QkZBSkZBUUFGR1JrQkhDRVEvT2pVd0t5WWhIQmNTRFFnREN3b0ZEeDhlQlNNQkFBVUdCUzR0QlNrb0doa0ZGUlE0TndVek1rSkJCVHc5UEFBa0l3SVFEd01CSVVaMkx6Y1lBRDg4UHp3L1BCRDlQQzg4L1R3dlBQMDhMeno5UEM4OC9Ud1EvVHdRL1R3QkxpNHVMaTR1TGk0dUxpNHVMaTRBTVRBQlNXaTVBQ0VBUmtsb1liQkFVbGc0RVRlNUFFYi93RGhaSlNNaU5UUTdBVElWRkNjaklqVTBPd0V5RlJRWEl5STFORHNCTWhVVUp5TWlOVFE3QVRJVkZBY2pJalUwT3dFeUZSUUhJeUkxTkRzQk1oVVVCeU1pTlRRN0FUSVZGQUdhZHhNVGR4U0w3Qk1UN0JSamR4TVRkeFNMN1JNVDdSUVU3Qk1UN0JRVTdSTVQ3UlFVN0JNVDdCVHJGQlFVRkhrVUZCUVU2eFFVRkJTckZCUVVGSElVRkJRVWNoUVVGQlJBRkJRVUZBQUFCUUFqQUFFQnJnR01BQWtBRXdBZEFDY0FNUUJ6UURFQk1qSkFNd2d2Smh3U0NBTXhLQVF0TENFTkJCY0xDZ1VQRlJRRkdRRUFCUVlGSkNNRkh4NHFHaGtDRUE4REFSZEdkaTgzR0FBL1BEODhMeTg4L1R3dlBQMDhFUDA4RVAwOEFTOFhQUDA4TGk0dUxpNEFMakV3QVVsb3VRQVhBREpKYUdHd1FGSllPQkUzdVFBeS84QTRXU1VqSWpVME93RXlGUlFuSXlJMU5Ec0JNaFVVQnlNaU5UUTdBVElWRkFjaklqVTBPd0V5RlJRSEZDTWlQUUUwTXpJVkFacDNFeE4zRkl2c0V4UHNGQlR0RXhQdEZCVHNFeFBzRk93VUZCUVU2eFFVRkJSNUZCUVVGRUFVRkJRVWNoUVVGQlNlRXhONUZCUUFBQUVBRi8vMEFhSUJsd0EwQUhoQU5BRTFOVUEyRHlJeExpQUtBelFIQmdNQUJCQVBLUVFaQ0FjRkRDWUZIQVlGQlFFQU5ETUZMeTRzQlJZV0hBTU5EQUVCR1VaMkx6Y1lBRDg4UHk4US9TODgvVHd2UFAwOEVQMFEvVHdCTC8wdlBQMFhQQzR1TGk0dUFDNHhNQUZKYUxrQUdRQTFTV2hoc0VCU1dEZ1JON2tBTmYvQU9Ga2xJeUkxTkRzQk5TTWlOVFE3QVRJZEFSUUdGUTRCSXlJbU5UUTJNeklYRmhVVUl5SW5KaU1pQmhVVUZqTXlOeU1pTlRRN0FRRjZzUlFVc2JFVUZNVVVBaHRqT2xkNmVsZElQQWNVQndZdFBVWmpZMFpCTUpBVUZMR09GQlFmRkJNVWZ3SUZBakU3ZWxkWGV5OEdDQlVGSldSR1JtTXJGQlFBQkFBZy83TUJoQUcwQUJFQUd3QWxBRGNBaUVBN0FUZzRRRGttTFN3cktpUWFCRGNtRFF3RUVRQUxDZ1FHQlI4VkJESXhBd0lGQ3hNU0JSZ1hJaUVGSFJ3MU5BVXNLdzhJTHlnTUN3SUJNVVoyTHpjWUFEODhMend2UEM4OC9Ud3ZQUDA4THp6OVBCRDlQQUV2UFAwOEx6ejlQQzg4L1R3dlBQMDhMaTR1TGdBeE1BRkphTGtBTVFBNFNXaGhzRUJTV0RnUk43a0FPUC9BT0ZrQkZDc0JJajBCTkRNeUhRRXpOVFF6TWhVWEl5STFORHNCTWhVVUJ5TWlOVFE3QVRJVkZCY1VJeUk5QVNFVkZDTWlQUUUwTXlFeUZRRTBGSjBVRkJSMUZCUVU3QlFVN0JRVTdCUVU3QlFvRkJUKzdCUVVGQUU4RkFFMkZCUnFGQlJXVmhRVXhSUVVGQlJJRkJRVUZNd1VGSVdGRkJTWkZCUUFCUUFUQUFFQXNnSVdBQXNBRndBaEFDMEFPUUJyUUMwQk9qcEFPd0FmTGlJRURBQWhHQVFkSERRb0JCSUdKUVVKQXdVck1RVVZEd1UzQ1JvM0FTc0RGUUlCQmtaMkx6Y1lBRDgvUHk4dkVQMFEvUkQ5RVAwQkx6ejlQQzg4L1R3dlBQMDhBQzR4TUFGSmFMa0FCZ0E2U1doaHNFQlNXRGdSTjdrQU92L0FPRmtURkFZaklpWTFORFl6TWhZVkZBWWpJaVkxTkRZek1oWURGQ01pUFFFME16SVZFelFtSXlJR0ZSUVdNekkyRlRRbUl5SUdGUlFXTXpJMnNpNGhJUzh2SVNFdUxpRWhMeThoSVM0N0ZCUVVGQk1YRUJFWEZ4RVFGeGNRRUJnWUVCQVhBY2NoTGk0aElTNHUyaUV2THlFaExpNys1Uk1UZXhRVUFUZ1FGeGNRRUJjWHFSQVhGeEFRR0JnQUFBWUFDZi8xQVlVQ0ZnQUxBQmNBTFFCQkFFMEFXUUI2UURVQldscEFXd0JBTmlvaU5Dd2dUa0lFTGd3QUVnWUVWRWhGQlFrREJVdFJCUlVQQlZjbUJSczdCVEVKTVZjQlN3TVZBZ0UwUm5Zdk54Z0FQejgvTHk4US9TLzlFUDBRL1JEOUVQMEJMeno5UEM4OFBQMDhMaTR1QUM0dUxpNHhNQUZKYUxrQU5BQmFTV2hoc0VCU1dEZ1JON2tBV3YvQU9Ga0JGQVlqSWlZMU5EWXpNaFlWRkFZaklpWTFORFl6TWhZSERnRWpJaVluSmpVME16SVhGak15TnpZek1oVVVOdzRCSXlJbUp5WXpNaGNlQVRNeU5qYzJNeklETkNZaklnWVZGQll6TWpZVk5DWWpJZ1lWRkJZek1qWUJnUzRoSVM0dUlTRXVMaUVoTGk0aElTNU1EVHdtSlR3TkFoVU5CUlExTlJVRkRSVkpEV2xFUkdjTkJSZ1FBd3RTTlRaVEN3TVFHQ3NZRUJBWEZ4QVFHQmdRRUJjWEVCQVlBY2NoTGk0aElDOHYyaUV1TGlFaEx5K25JU29xSVFRRUV3d3lNZ3dUQkFGQlZsVkJGeEF6UWtNMEVBRWpFQmNYRUJBWEY2b1FHQmNSRUJjWEFBQUVBQ01BQUFHdEFZd0FEUUFmQUMwQU93QmdRQ1VCUER4QVBRSTVHUkVMTnpBcEloNEpBaGtZQkJRVEFnVXlKQVF5QUNzQkhCWURBUk5HZGk4M0dBQS9QRDgvUER3US9RRXZQUDA4TGk0dUxpNHVMZ0F1TGk0dU1UQUJTV2k1QUJNQVBFbG9ZYkJBVWxnNEVUZTVBRHovd0RoWkpSWVZGQ01pTHdFbU5UUXpNaGMzQndZaklqMEJORE15SFFFM05qTXlGUlFURmhVVUl5SXZBU1kxTkRNeUh3RVdGUlFqSWk4QkpqVTBNeklYQWFrRUZRa0dzQVFWQ0FZSHV3a0lFQlFVbWdZSEZVWUVGUWtHandRVkNBWXpCQlFKQm04RUZRa0dId1VHRXdqN0JRWVVDRXlVQnhlVUZCUnJld1VXQ2Y2eUJRWVRDTXdGQmhRSXpnVUdFd2llQlFZVUNBQUFBd0FoQUFBQklnSEhBQWtBRndBaEFHQkFKUUVpSWtBakZoOGFFQUlXQlFRRUNRQWhHQVFkSEJNU0JBNE5GQk1GQ2djTENnQUJEVVoyTHpjWUFEODhMeEQ5UEFFdlBQMDhMeno5UEM4OC9Ud3VBQzR1TGk0eE1BRkphTGtBRFFBaVNXaGhzRUJTV0RnUk43a0FJdi9BT0ZrM0ZDTWlOUkUwTXpJVkV5TWlQUUUwTXpJZEFUTXlGUlFuRkNNaVBRRTBNeklWMHhRVUZCUTcyUlFVRk1VVWt4UVVGQlJaRXhNQldoUVUvazBVMlJRVXhSUVVXUk1UVHhRVUFBQUJBQ1VBQVFKM0FjMEFKd0JYUUI4QktDaEFLUUFpSEJFT0N3Z0ZCUVFFSndBU0VRUVhGaVVmR1JRQ0FSWkdkaTgzR0FBdlBDODhQQUV2UFAwOEx6ejlQQUF1TGk0dUxpNHVNVEFCU1dpNUFCWUFLRWxvWWJCQVVsZzRFVGU1QUNqL3dEaFpKUlFqSWpVUkJ3WWpJaThCQndZaklpOEJFUlFqSWpVUk5ETXlId0UzTmpNeUh3RTNOak15RlFKM0ZCUmxCd29MQjNsNUJ3c0tCMlVVRkJNTUIzbDVCd3NLQjNoNUJ3d1RGQk1UQVU3TURnN3o4dzRPelA2eUV4TUJvaGNPOWZVT0R2VDBEaGNBQVFBa0FBRUNKZ0hPQUNNQVRFQVpBU1FrUUNVaUlCMFhEQWtHQXlJTkRBUVNFUlFhRHdFUlJuWXZOeGdBTHk4OEFTODgvVHd1QUM0dUxpNHVMaTR4TUFGSmFMa0FFUUFrU1doaHNFQlNXRGdSTjdrQUpQL0FPRmtCQXdZaklpOEJCd1lqSWk4QkVSUWpJalVSTkRNeUh3RTNOak15SHdFM05qTXlGUlFDSkhjR0RBd0daR1FHRFF3R1VCUVVFdzBHWkdVSEN3c0haR1FGRFJVQnJ2N29Edy90N1E4UHZ2N0FFeE1Cb2hZTzdlMFFFTzN0REJNRkFBVUFIZi96QWI4Qmx3QUxBQmNBSXdBdkFEY0Fha0F1QVRnNFFEa0FEQVFBRWdRR0pBUVlLZ1FlTUFRMER3VUpKd1VoRlFVRExRVWJNZ1UyQXpZQklRSUpBd0VHUm5Zdk54Z0FQejgvTHhEOUwvMFEvUkQ5RVAwQkwvMHYvUy85TC8wdi9RQXhNQUZKYUxrQUJnQTRTV2hoc0VCU1dEZ1JON2tBT1AvQU9Ga2xGQVlqSWlZMU5EWXpNaFlITkNZaklnWVZGQll6TWpZbkZBWWpJaVkxTkRZek1oWUhOQ1lqSWdZVkZCWXpNalluRkNNaU5UUXpNZ0cvZWxkWGVucFhWM29uWkVaR1pHUkdSbVF1U0RRMFNVazBORWdvTVNNak1qSWpJekUySGg0ZUhzVlhlM3RYVjN0N1YwWmtZMGRHWkdSR05FbEpORFJKU1RRak1qSWpJekl5SXgwZEhRQURBQ0lBQVFGOUFZd0FFd0F2QURrQWJrQXVBVG82UURzQUp3NEdJQVFVQ2dRQUpTUUVLaG9wT1RBRU5UUWtJd1VRSFJ3RkdBUVhNamN0TEFNUUF3RTBSbll2TnhnQVB4YzhMeTg4UFAwOEVQMDhBUzg4L1R3dlBEejlQQy85TC8wdUxnQXVNVEFCU1dpNUFEUUFPa2xvWWJCQVVsZzRFVGU1QURyL3dEaFpBUlFIQmlNaU5UUTNOalUwSnlZMU5ETXlGeFlIRkFZckFTSTFORHNCTWpZMU5DWXJBUlVVSXlJOUFUUTdBVElXQXhRaklqVVJORE15RlFGOUlnWUtGQU1iR3dNVUNnWWlWa2d5S0JNVEtDSXhNU0lVRkJRVUtESkkzUlFVRkJRQkVUMDBDUlFGQmlzd01Tc0dCUlFKTkQ0elNCUVVNU0lpTVZNVEUyY1VTUDdRRXhNQlpCUVVBQUFDQUIzL2RRSStBWmNBSUFCQkFIeEFOd0ZDUWtCREpERXVIeHdWRWc4c0tTUWFGd1lEQURRekZRTVVCRGs0RUFNUERBUThKeVlCQXdBRklpRUdBd1VKQlQ4MlB3TUJQRVoyTHpjWUFEOHZFUDB2Rnp6OUZ6d0JMLzB2Rnp6OUZ6d3VMaTR1TGk0dUxnQXVMaTR1TGk0dU1UQUJTV2k1QUR3QVFrbG9ZYkJBVWxnNEVUZTVBRUwvd0RoWkpTTWlOVFE3QVM0Qkl5SUdGUlFXRnpVME16SWRBVFkzSnlZMU5ETXlId0UyTnpNeUZSUXJBUVlIRnhZVkZDTWlMd0VHQnhVVUl5STlBUzRCTlRRMk16SVdBWmhCRXhOQkNHQkJSbVJYUHhRVUx5WXRCeFVJQmkwZUxXc1VGR3NHS1V3R0ZRZ0dTekZBRkJSUWJudFhVWGV5RkJOQVZtTkhRV0FJUUJRVVFBWWVMUWNJRkFZdUpsY1RGRDh6VEFZSUZRWk1LUVpyRkJSckNIZFNWM3R1QUFBQ0FDWUFBQUdVQVl3QUNRQS9BSHBBTlFGQVFFQkJEVFVTS0NFZUdCVU5DaTRFUGpNeUJEZzNDUUFFQlFReU1RVUhLeW9GSGgwVkF4UWpHZ0lERHdBN09nY0RBUVJHZGk4M0dBQS9QRHcvRnp3dkZ6ejlQQkQ5UEFFdlBQMDhMeno5UEMvOUxpNHVMaTR1TGdBdUxqRXdBVWxvdVFBRUFFQkphR0d3UUZKWU9CRTN1UUJBLzhBNFdUY1VJeUkxRVRRek1oVWZBUllWRkNNaUx3RUdLd0VYRmhVVUl5SXZBU01YRmhVVUl5SXZBU1kxTkRzQk1qWTFOQ1lyQVJVVUl5STlBVFE3QVRJV0ZSUk9GQlFVRk9OZkJCVUtCbVVLREFwWUJCVUxCbVlmV0FRVkNnZHRCaGQvSUM0dUlHc1VGQlIvTVVVVUV4TUJaQlFVeVpBR0JSUUptQU4vQmdVVUNaVi9CUVlVQ1o0SUJ4QXVJU0F2YnhNVGd4UkdNVU1BQVFBZC96a0EwQUtpQUZzQWRrQXlBVnhjUUYwZlFCSStFREVsR1FSWlRRbFRSd01FTnlzZkZnVU1JZ1VBQmdVY1JBVTZOQVZLVUFVdVZnVW9ERG9CQ1VaMkx6Y1lBQzh2TC8wdi9TLzlFUDB2L1MvOUVQMEJMenc4L1R3OEx6dzgvVHc4TGk0QUxpNHhNQUZKYUxrQUNRQmNTV2hoc0VCU1dEZ1JON2tBWFAvQU9Ga1RNalkxTkNZaklpWTFORFl6TWhjV0ZSUWpJaWNtSXlJR0ZSUVdNeklXRlJRR0l5SUdGUlFXTXpJV0ZSUUdJeUlHRlJRV016SVdGUlFHSXlJbkpqVTBNeklYRmpNeU5qVTBKaU1pSmpVME5qTXlOalUwSmlNaUpqVTBObllVSGgwVUpqUTBKaThhQkJVTEJnNFpGQjhmRkNVME5TUVVIeDRWSlRRMkpSUWRIeFFsTkRRbE9oZ0NGQXdHRGlBVUhSMFVKalEwSmhRZEhSUW1ORFFCakI0VkZCdzBKU1kwSmdZRkZBa1ZIaFVVSFRNbEpqUWVGQlFjTlNVbE5oMFVGQjAxSlNVME13VUZFd3djSFJRVUhqUWxKalFlRkJRZE15WW1Nd0FEQUEwQUFRRndBYUFBQ1FBaEFDc0FlRUEwQVN3c1FDMFpIdzRIS2lVWkZBd0xCQkVRQkNFS0JCMGNDUUFFQlFRY0d4SVJDd1VLQlJZaklnVW5BaWduQXhjV0FnRVVSbll2TnhnQVB6dy9QQzhRL1R3US9SYzhBUzg4L1R6ZFBQMDhFTjA4L1R3dUxpNHVBQzR1TGpFd0FVbG91UUFVQUN4SmFHR3dRRkpZT0JFM3VRQXMvOEE0V1RjVUl5STlBVFF6TWhVM0l4VVVJeUk5QVNNaU5UUXpJVElWRkNzQkZSUWpJalUzSVNJMU5ETWhNaFVVMGhRVUZCUWRZaFFVUlJNVEFUd1VGRVVVRkczK3hCTVRBVHdVRkJNVDdSUVVNbmNURTNjVUV4TVVkeE1UdkJRVUZCUUFBd0FtLy9JQldRR0VBQmNBS3dBL0FHVkFLQUZBUUVCQktqdzBLQ0ErS2g0VEVnUVhBQXdMQkRJSEJnOEZBeVFGR2pnRkxpNFZDUU1CQmtaMkx6Y1lBRDg4THhEOUwvMHYvUUV2UER6OVBDODgvVHd1TGk0QUxpNHVMakV3QVVsb3VRQUdBRUJKYUdHd1FGSllPQkUzdVFCQS84QTRXUUVVQmlNaUpqMEJORE15SFFFVUZqTXlOajBCTkRNeUZRY0dJeUluSmpVME16SVhGak15TnpZek1oVVVCd1lqSWljbU5UUXpNaGNXTXpJM05qTXlGUlFCVmxrL1Axa1VGRUV2TDBJVUV3UTdWbFE5QnhNSEJqUkVSRE1HQnhRTFEwcExRd3NVQlFVN1FENCtCUVFUQVN0QVdWbEFSUlFVUlM5Q1FpOUZGQlQ3TXpRR0NSUUZLaWtGRkFsbUl5TUdDeFlESHg0Q0ZBc0FBZ0FJLys4QmpBR01BQk1BSndCSFFCZ0JLQ2hBS1NZaEF5WWNFZ2dYRFFFa0hoQURDZ01CSEVaMkx6Y1lBRDhYUEQ4dkFTNHVMaTRBTGk0eE1BRkphTGtBSEFBb1NXaGhzRUJTV0RnUk43a0FLUC9BT0ZrQkJ3WWpJaThCSmpVME16SWZBVGMyTXpJVkZCY0RCaU1pSndNbU5UUXpNaGNiQVRZek1oVVVBVFZZQndzTUIxZ0NGUXNHUmtZR0RCVlRyZ2NNQ3dldEFoVUxCcHVjQmd3VkFXNjZEdys2QlFVVURKU1VEQlFGQmY2UUR3OEJjQVVGRkF6K3R3RkpEQlFGQUFBQkFBNy84QUt2QVlvQUt3QkxRQmtCTEN4QUxTb2xIeGtNQmlvVUR3a0RJaHdCS0JZREFSUkdkaTgzR0FBL1BEODhMenc4QVM0dUFDNHVMaTR1TVRBQlNXaTVBQlFBTEVsb1liQkFVbGc0RVRlNUFDei93RGhaQVFNR0l5SXZBUWNHSXlJdkFRY0dJeUluQXlZMU5ETXlGeE0zTmpNeUh3RTNOak15SHdFVE5qTXlGUlFDcm5jR0RRd0hUMUVIQ3dzSFVWQUhDdzBHZUFFVkRnUm9UQWNMREFkUlVRY0xDd2ROWndRT0ZRRncvcEVSRHFxcURnNnFxZzRSQVc4REJCTU4vc0dqRHcrcnF3NE9vd0UvRFJNRUFBQUNBQkwvOHdJSkFaY0FLd0JYQUdoQUtBRllXRUJaS2xWU1QweEpQemt6SlI4WkR3d0pCZ05FTGlvVVBEWkNNQUFpSEFNb0ZnTUJGRVoyTHpjWUFEODhQencvUEM4OEFTNHVMaTRBTGk0dUxpNHVMaTR1TGk0dUxpNHVMakV3QVVsb3VRQVVBRmhKYUdHd1FGSllPQkUzdVFCWS84QTRXUUVIQmlNaUx3RUhCaU1pTHdFSEJpTWlMd0VtTlRRek1oOEJOell6TWg4Qk56WXpNaDhCTnpZek1oVVVBeFlWRkNNaUx3RUhCaU1pTHdFSEJpTWlMd0VIQmlNaU5UUS9BVFl6TWg4Qk56WXpNaDhCTnpZek1oY0NCMG9IQ2dzSFBqMEhDd29IUFQ0SEN3b0hTZ0lVREFVNFB3Y0xDZ2M5UEFjS0N3Yy9PQVVNRkFJQ0ZRc0ZPRDhIQ3dvSFBEMEhDZ3NIUHpnRkN4VUNTZ2NLQ3djK1BRY0tDd2M5UGdjTENnY0JicFFPRG50N0RnNTdldzRPbEFVRUZBdHhlZzRPZW5vT0RucHhDeFFFL3FrRkJCUUxjbnNPRG50N0RnNTdjZ3NVQkFXVkRnNThmQTRPZkh3T0RnQUFBUUFGQUFFQm5nR3pBQ3NBWDBBbEFTd3NRQzBOSmg0YkN3Z0FJUjRaRFFnRkt4RVFBd0FFSnlZV0F4VXBFeU1EQXdFWlJuWXZOeGdBUHp3dkx3RXZGeno5Rnp3dUxpNHVMaTRBTGk0dUxpNHVNVEFCU1dpNUFCa0FMRWxvWWJCQVVsZzRFVGU1QUN6L3dEaFpFemMyTXpJVkZBOEJOell6TWhVVUR3RVZGQ01pUFFFbkpqVTBNeklmQVNjbU5UUXpNaDhCTlRRek1oWGxUZ1lKRkFSTmZnUUVFdzJzRkJTckRSTUVCSDFOQkJVSkJrMFVGQUVZYmdnVEJRWnVNQUlWRFFWQXVSTVR1VUFGRFJVQ0wyMEZCaE1JYm9jVUZBQUFBUUFQLzlnQkJBSGFBQzBBYjBBc0FTNHVRQzhnQWl3cEppTWdHeGdWRWc4TUNRUUJHUmdGSFJNU0JTUWpLaWtGRFF3ZUhRY0dBUUFCQ1VaMkx6Y1lBRDh2UEM4OEx6ejlQQzg4L1R3US9Ud0JMaTR1TGk0dUxpNHVMaTR1TGk0QUxqRXdBVWxvdVFBSkFDNUphR0d3UUZKWU9CRTN1UUF1LzhBNFdUY0hNeklWRkNzQklqVTBQd0VqSWpVMFB3RWpJalUwUHdFaklqVTBPd0V5RlJRUEFUTXlGUlFQQVRNeUZSVDVtWTBVRk1jWENwbU1Gd3FhalJjS21Zd1RFOFlZQzVtTUdBdVpqQmg2ZWhRVUVnb0llaElLQ0hvU0NnaDZGQlFTQ2doNkVnb0llaElLQUFBQ0FBY0J2Z0RkQXA4QUZBQW1BRWRBRmdFbkowQW9HQ0FkR2dvQUloZ1FCU1VWRGdjQkVFWjJMemNZQUM4OEx6d0JMaTR1TGdBdUxpNHVMakV3QVVsb3VRQVFBQ2RKYUdHd1FGSllPQkUzdVFBbi84QTRXUk15SHdFV0ZSUWpJaThCQmdjR0l5STFORDhCTmpjWEZoVVVJeUl2QVFjR0l5STFORDhCTm5FSkJsWUdGQWdHU0JRMUJnZ1VCbFlHRmxjSEZRZ0dTVWdHQ0JRR1ZnNENQUVpXQmdnVkJrZ1ROUVlWQ0FaV0JsUlhCd2dVQmtsSUJoVUlCbFlPQUFFQUFmK3hBTy8vMlFBSkFEbEFEd0VLQ2tBTENBZ0RCZ1VCQUFFRFJuWXZOeGdBTHp3dlBBRXVMZ0F4TUFGSmFMa0FBd0FLU1doaHNFQlNXRGdSTjdrQUN2L0FPRmtYSXlJMU5Ec0JNaFVVMjhZVUZNWVVUeFFVRkJRQUF3QUJBYjRBK2dLM0FBMEFHd0FwQUVWQUZRRXFLa0FyQWljU0N3UWxIaGNRQ1FJWklBRVhSbll2TnhnQUx5OEJMaTR1TGk0dUFDNHVMaTR4TUFGSmFMa0FGd0FxU1doaHNFQlNXRGdSTjdrQUt2L0FPRmtURmhVVUl5SXZBU1kxTkRNeUZ3Y1dGUlFqSWk4QkpqVTBNeklmQVJZVkZDTWlMd0VtTlRRek1oZjBCaFVJQmtjR0ZRZ0dNd1lWQ0FaV0JoUUlCNWNHRlFnR1J3WVVDQVlDR3dZSUZRWkhCZ2dWQmdZR0NCVUdWZ1lJRkFiUUJnZ1ZCa2dHQ0JVR0FBUUFGUC96QWI4QklBQUpBQk1BSHdBckFHQkFKZ0VzTEVBdEFCRUhCUVFFQ1FBUERnUVRDaUFFRkNZRUdpTUZIU2tGRngwWERBSUFBUnBHZGk4M0dBQS9QQzh2RVAwUS9RRXYvUy85THp6OVBDODgvVHdBTGk0eE1BRkphTGtBR2dBc1NXaGhzRUJTV0RnUk43a0FMUC9BT0ZrbEZDTWlQUUUwTXpJVkJ4UWpJajBCTkRNeUZRY1VCaU1pSmpVME5qTXlGZ2MwSmlNaUJoVVVGak15TmdHL0V4UVVFMFVVRkJRVU9WaytQbGhZUGo1WktFRXVMVUZCTFM1QkV4UVU3UlFVN1JRVTdSUVVkajVaV1Q0K1dGZytMVUZCTFM1QlFRQUFBUUFpQUFBQkJnSVZBRGNBYzBBd0FUZzRRRGtDSVNBMk5Dd2pIaGdBRWdRQ0p3UXlEZzBFQ1FnYUJSWVZLaWtGTGc4T0JRVUxMeTREQmdVQUFRaEdkaTgzR0FBL1BEODhMeEQ5UEJEOVBDODgvUUV2UFAwOEwvMHYvUzR1TGk0dUxpNEFMaTR4TUFGSmFMa0FDQUE0U1doaHNFQlNXRGdSTjdrQU9QL0FPRmszRmhVVUJpc0JJalVSTkRNeUZSRXpNalkxTkNZckFRWTFORE15TnpZMU5Dc0JJalUwTXpJMU5Dc0JJalUwT3dFeUZoVVVCeFlWRk5FMU9pcHNGQlFVV0Jna0pCZ25FeE1hRmh3eEdoTVRNeVVPRXhNT0lTd1RLNmdhTlNVMEZBSHRGQlQrSnh3VkZSMEVGaFVKQ3hNb0ZCUWRIUlFVS1J3V0V4Y3RIZ0FEQUJYLzh3SzNBVWdBRFFBOUFFd0FjMEF2QVUxTlFFNFVPakFzSkJZT1JFQW1GQW9BU1FRTVFnUWRCUVExUmhvQ0JSQStDQ0FGS2pJdUtqdzRFQUlCTlVaMkx6Y1lBRDg4UEM4OFBCRDlQRHdRL1R3OEFTLzlMLzB2L1M0dUxpNHVMZ0F1TGk0dUxpNHhNQUZKYUxrQU5RQk5TV2hoc0VCU1dEZ1JON2tBVGYvQU9Ga1RKaU1pQmhVVUZqTXlOeVkxTkNVMk16SVhGaFVVSXlJbkppTWlCaFVVRmpNeU56WXpNaFVVQndZaklpY0dJeUluQmlNaUpqVTBOak15RnpZek1nTXlOeVkxTkRjbUl5SUdGUlFYRnZ3YklqWk1URFlpR3lzQkJpazJSelFHRkFnR0p6ZzJURXcyT0NjR0NCUUdOVVl5TFNnMU5TZ3FORVprWkVZMEtDczBOVFVqR3l3c0dpUTFUVFluQVJBUVRUVTJUQTh3UTBKTEhUVUdDQk1HS0UwMU5rMHBCaFFIQmpZZEhCd2NaRVpIWXgwZC90UVBMMFJETHhCTk5VSWxHd0FFQUJqLzlBSERBZHNBQ1FBVEFCOEFLd0JkUUNRQkxDeEFMUUFNQWdVRUJBa0FEdzRFRXdvZ0JCUW1CQm9qQlIwcEJSY1JCeGNCR2taMkx6Y1lBQzh2UEJEOUwvMEJMLzB2L1M4OC9Ud3ZQUDA4QUM0dU1UQUJTV2k1QUJvQUxFbG9ZYkJBVWxnNEVUZTVBQ3ovd0RoWkpSUWpJalVSTkRNeUZRTVVJeUkxRVRRek1oVURGQVlqSWlZMU5EWXpNaFlITkNZaklnWVZGQll6TWpZQnd4TVVGQk5GRkJRVUZEbFpQajVZV1QwK1dTaEJMaTFCUVMwdVFSUVRFd0d6RkJUK1RSTVRBYk1VRlA3RVBsbFpQajVZV0Q0dFFVRXRMa0ZCQUFNQUZmL3pBYTBCSUFBSkFCTUFNd0JpUUNZQk5EUkFOUWd3SWpJZ0VnMElBeWtFR1FFQUJRWUZKZ1VjRUE4RkN3b3NCUlljRmdFWlJuWXZOeGdBTHk4US9TODgvVHdRL1M4OC9Ud0JMLzB1TGk0dUxpNEFMaTR4TUFGSmFMa0FHUUEwU1doaHNFQlNXRGdSTjdrQU5QL0FPRmtsSVNJMU5ETWhNaFVVQnlFaU5UUXpJVElWRkFjR0l5SW1OVFEyTXpJWEZoVVVJeUluSmlNaUJoVVVGak15TnpZek1oVVVBWm4rMkJNVEFTZ1VGUDdZRXhNQktCU1RMRUkrV1ZrK09pZ0hGQWNHSVNjdVFVRXVMeUlHQ0JTZUZCTVRGRVlVRkJRVU5ERlpQajVZSkFZSkZRVWJRUzB1UVNRR0ZBY0FBQUVBRGY5K0FPb0I0d0ErQUpKQVNnRS9QMEJBRGhBN05DZ2hHZzRETENzbEpCNGRGd2NXQkQ0NE56RXdCd1lIQUJNRkNoMGNBUU1BQlJnWEJnTUZQajBmQXg0Rk9UZ2tBeU0zTmlZREpRVXlNU3NES2dvdUFRTkdkaTgzR0FBdkx5OFhQUDBYUEM4WFBQMFhQQzhYUFAwWFBCRDlBUzhYUFAwWFBDNHVMaTR1TGk0QUxqRXdBVWxvdVFBREFEOUphR0d3UUZKWU9CRTN1UUEvLzhBNFdUY2pJalUwT3dFMU5EWXpNaGNXRlJRaklpWWpJZ1lkQVRNeUZSUXJBUlV6TWhVVUt3RVZNeklWRkNzQkZSUWpJajBCSXlJMU5Ec0JOU01pTlRRN0FWdzdGQlE3TGlFZ0dBY1VCaGNPRUJjN0ZCUTdPeFFVT3pzVUZEc1VGRHNVRkRzN0ZCUTc0aFFVaWlBdkZ3WUpFeEVYRUlvVUZCMFVGQjBVRk1ZVUZNWVVGQjBVRkFBRUFBbi9PUUd0QVNBQUN3QWtBRUlBVGdCZlFDVUJUMDlBVUVFL01TRVVMeU1TUXdSQkFFa0VCa1lGQ1V3RkF4c0ZEamdGS0Frb0FTOUdkaTgzR0FBdkx4RDlMLzB2L1JEOUFTLzlMeno5TGk0dUFDNHVMaTR4TUFGSmFMa0FMd0JQU1doaHNFQlNXRGdSTjdrQVQvL0FPRmtsRkFZaklpWTFORFl6TWhZREJpTWlKeVkxTkRNeUZ4NEJGeFl6TWpjMk56WXpNaFVVRnc0Qkl5SW1KeVluSmpVME16SVhGaGNlQVRNeU5qYzJOell6TWhVVUp6UW1JeUlHRlJRV016STJBYXhZUGo1WVdENCtXRll2UzB3d0RCSUxCd0lGQVNNNU9pSUdBUWdLRTBNYmJrSkNiaHdCQkFJVURRWUJCQlphTnpaYUZ3SURCZzBTS0VFdUxrQkFMaTVCaWo1WldUNCtXRmorN2pzOUR3b1NDUUlIQVMwdUJnTUxGUWtNTzBkSU93UUlCUVFVRGdNSk1EbzdNQVVGRGhRTHhTMUJRUzB1UVVFQUFnQWkvemtDSlFIYkFBa0FPQUJlUUNNQk9UbEFPaGc0TlRBckppRVZFeEVQRFFJZUhSa1lPQW9KQXdBRUJRUUhHd0VFUm5Zdk54Z0FMeThCTHp6OUZ6d3VMaTR1QUM0dUxpNHVMaTR1TGk0dUxqRXdBVWxvdVFBRUFEbEphR0d3UUZKWU9CRTN1UUE1LzhBNFdUY1VJeUkxRVRRek1oMEJORFl6TWhjMk16SVhOak15RmhVUkZDTWlOUkUwSmlNaUJoVVVJeUkxTkNZaklnWVZGQ01pTlRRbUl5SUdGVW9VRkJRVUl4Z3dJQnd5TWgwZ0x5azdGQlFqR1JnakZCUWlHUmdqRXhRakdSZ2pGQk1UQWJNVUZNRU1GeWdvS0NnNktmNkhGQlFCZVJnakl4Z1RFeGdqSXhnVEV4Z2pJeGdBQlFBVi84Z0Fzd0h5QUFzQUZ3QWhBQzBBT1FCblFDb0JPanBBT3dBZk5DZ0VFZ1ljTGlJRURBQWhHQVFkSENVRkNRTUZLekVGRlRjRkR3a2FLd01CQmtaMkx6Y1lBRDh2THkvOUwvMFEvUkQ5QVM4OC9UemRQUDA4RU4wOC9Ud0FMakV3QVVsb3VRQUdBRHBKYUdHd1FGSllPQkUzdVFBNi84QTRXUk1VQmlNaUpqVTBOak15RmhVVUJpTWlKalUwTmpNeUZnTVVJeUk5QVRRek1oVVROQ1lqSWdZVkZCWXpNallWTkNZaklnWVZGQll6TWphekxpRWdMeThnSVM0dUlTRXVMaUVoTGpzVUZCUVVFeGNRRUJjWEVCQVhGaEVRRnhjUUVCY0JveUV2THlFaExpN2ZJQzh2SUNFdUx2N1dGQlNNRkJRQk94QVhGeEFRR0JldEVSWVdFUkFYRndBQUJnQUsvOE1CZlFIa0FBc0FGd0FyQUVFQVRRQlpBSFJBTVFGYVdrQmJBRDgxS0NBeUxDb2VUa0lFREFBR0VnUklWQU1GUzBVRkNWRUZGVmNGRHlRRkdqb0ZMd2t2U3dNQk1rWjJMemNZQUQ4dkx4RDlMLzB2L1MvOUVQMFEvUUV2UFAwOEx6ejlQQzR1TGk0QUxpNHVMakV3QVVsb3VRQXlBRnBKYUdHd1FGSllPQkUzdVFCYS84QTRXUUVVQmlNaUpqVTBOak15RmhVVUJpTWlKalUwTmpNeUZnY0dJeUluSmpVME16SVhGak15TnpZek1oVVVGdzRCSXlJbUp5WTJNeklYSGdFek1qWTNOak15RmdNMEppTWlCaFVVRmpNeU5oVTBKaU1pQmhVVUZqTXlOZ0Y5TGlBaExpNGhJQzR1SUNFdkx5RWdMazRnVFU0ZkFoVU5CUlV6TXhZRkRSUklEMlpDUW1ZT0FnMEpEZ1FNVVRNMFR3MEVEZ29OSlJjUUVCY1hFQkFYRnhBUUdCY1JFQmNCbENBdUxpQWhMeS9lSVM0dUlTRXZMNmxIUndRRkV3d3ZMd3dUQkFJK1VWRStDdzBPTVVCQU1RNE5BVGNRR0JjUkVCY1hyUkFZR0JBUUZ4Y0FBQVFBSi8vL0FZUUJvQUFOQUI4QUxRQTdBRnBBSVFFOFBFQTlBamtySEJrUkN6Y3dLU0llQ1FJWkdBUVVFeFlETWlRRUFBRVRSbll2TnhnQVB6dzhQd0V2UFAwOExpNHVMaTR1TGdBdUxpNHVMaTR4TUFGSmFMa0FFd0E4U1doaHNFQlNXRGdSTjdrQVBQL0FPRmtsRmhVVUl5SXZBU1kxTkRNeUZ5Y0hCaU1pUFFFME16SWRBVGMyTXpJVkZCY1dGUlFqSWk4QkpqVTBGeklYQnhZVkZDTWlMd0VtTlRRek1oY0JnQVFWQ1FaOEJCVUpCak9LQ1FnUEZCUnJCZ1lVUkFRVkNRWmJCQlVKQmdjRUZRa0dPUVFVQ2dZZ0JnWVVDSzBHQmhRSUpHSUdGZTRVRk1kTUJCVUoxd1lHRlFsL0JnWVZBUWgvQmdZVkNWQUdCaFVKQUFBQ0FDUUFBUUNhQWFBQUNRQVRBRWhBR0FFVUZFQVZDaEVQRGdRVENna0FCQVVFREFJSEF3RUVSbll2TnhnQVB5ODhBUzg4L1R3dlBQMDhBQzR4TUFGSmFMa0FCQUFVU1doaHNFQlNXRGdSTjdrQUZQL0FPRmszRkNNaU5SRTBNeklWRXhRaklqMEJORE15RlV3VUZCUVVUaFFVRkJRVUV4TUJlQlFVL29nVEU5a1VGQUFGQUNVQUFRSmpBVkFBQ1FBVEFCMEFKd0JkQUpsQVJBRmVYa0JmTFZKSFBEQWxGaEVIUlVRUERnUVRDaDBVQkJrWU16SUVMaTBGQkFRSkFDY2VCQ01pVUU4RVZWUStCRG81VEVFMkJWeFlLaUFNQWxvb0FSc0NBUmhHZGk4M0dBQS9Qend2UER3dlBEejlQRHdCTHp6OUx6ejlQQzg4L1R3dlBQMDhMeno5UEM4OC9Ud3ZQUDA4TGk0QUxpNHVMaTR1TGk0eE1BRkphTGtBR0FCZVNXaGhzRUJTV0RnUk43a0FYdi9BT0ZrbEZDTWlQUUUwTXpJVkJ4UWpJajBCTkRNeUZRVVVJeUk5QVRRek1oVVRGQ01pUFFFME16SVZOell6TWhZZEFSUWpJajBCTkNZaklnWWRBUlFqSWpVMEppTWlCaDBCRkNNaU5UUW1JeUlHSFFFVUl5STlBVFEyTXpJWE5qTXlBaFFVRkJRVW54TVVGQlArMXhNVUZCT0xGQlFVRk5jZE5DazdGQlFqR1JnakZCUWpGeGtpRkJRa0dCZ2pGQlE3S0M0Zkh6TXRGQk1UbmhRVW5oTVRuaFFVRkJNVG5oUVUvdGdURTU0VUZFd3JPaWtLRXhNS0dDTWpHQXNURXhrdEl4Z0xFeE1aTFNNWUNoTVRDaWs2S3lzQUJBQWRBQUVCd1FGVEFBa0FFd0FkQUVNQWVrQXpBVVJFUUVVNlBEVXRJUllSQnpvRkJBUUpBQ1FqQkI4ZUV3b0VEdzRyS2dRd0x4MFVCQmtZUVNjRk56TU1BaHNDQVJoR2RpODNHQUEvTHp3dlBQMDhBUzg4L1R3dlBQMDhMeno5UEM4OC9Ud3ZQUDA4TGdBdUxpNHVMaTR1TVRBQlNXaTVBQmdBUkVsb1liQkFVbGc0RVRlNUFFVC93RGhaSlJRaklqMEJORE15RlFjVUl5STlBVFF6TWhVSEZDTWlQUUUwTXpJVkZ4VVVJeUk5QVRRbUl5SUdIUUVVSXlJOUFUUTJNeklYTmpNeUZoVVVJeUkxTkNZaklnWUJjaFFVRkJTZ0ZCUVVGSTBVRkJRVTJ4TVZKQllaSXhRVU95a3VJQnMzS0RzVUZDUVhHU1VVRXhPZkZCU2ZFeE9mRkJRVEV4T2ZGQlIyREJNVENoY21KQmdMRXhNTEtUb3FLa1FxRXhNYUxTTUFBQVFBR2YvekFVVUJJQUFMQUJjQUl3QXZBRnhBSlFFd01FQXhBQ29FSGhJRUJnd0VBQ1FFR0E4RkNTY0ZJUzBGR3hVRkF3a0RJUUVCQmtaMkx6Y1lBRDh2THhEOUwvMFEvUkQ5QVMvOUwvMHYvUy85QURFd0FVbG91UUFHQURCSmFHR3dRRkpZT0JFM3VRQXcvOEE0V1NVVUJpTWlKalUwTmpNeUZnYzBKaU1pQmhVVUZqTXlOaWNVQmlNaUpqVTBOak15RmdjMEppTWlCaFVVRmpNeU5nRkZXRDg5V0ZjK1AxZ29RUzR0UVVFdExrRWJNU01pTURBaUl6RW9HaElTR1JrU0VocUtQbGxaUGo1WVdENHRRVUV0TGtGQkxpTXdNQ01qTURBakVoa1pFaElaR1FBQUJBQW0vem9CMFFFZ0FBc0FGUUFmQUNzQVhVQWtBU3dzUUMwQUhSTVZEQVFSRUNZRUJpQUVBQjhXQkJzYUl3VUpLUVVEQ1JnT0FScEdkaTgzR0FBdlBDOHYvUkQ5QVM4OC9Ud3YvUy85THp6OVBBQXVMakV3QVVsb3VRQWFBQ3hKYUdHd1FGSllPQkUzdVFBcy84QTRXU1VVQmlNaUpqVTBOak15RmdFVUl5STFFVFF6TWhVREZDTWlOUkUwTXpJVkJUUW1JeUlHRlJRV016STJBZEZZUHo1WVdENC9XUDdCRXhRVUUwUVVGQlFVQVZ0QkxpMUJRUzB1UVlvK1dGZytQbGhZL29ZVUZBR3lGQlQrVGhRVUFiSVVGSFl1UUVBdUxrQkFBQVFBR2Y4NkFjUUJJQUFKQUJNQUh3QXJBRjFBSkFFc0xFQXRBQkVIQlFRRUNRQVBEZ1FUQ2lBRUZDWUVHaU1GSFNrRkZ4ME1BZ0VhUm5Zdk54Z0FMend2TC8wUS9RRXYvUy85THp6OVBDODgvVHdBTGk0eE1BRkphTGtBR2dBc1NXaGhzRUJTV0RnUk43a0FMUC9BT0ZrRkZDTWlOUkUwTXpJVkF4UWpJalVSTkRNeUZRY1VCaU1pSmpVME5qTXlGZ2MwSmlNaUJoVVVGak15TmdIRUZCUVVGRVVVRkJRVU9WZy9QbGhZUGo5WUtFRXVMVUZCTFM1QnNoUVVBYklVRlA1T0ZCUUJzaFFVZGo1WVdENCtXRmcrTGtCQUxpNUFRQUFBQWdBaEFBRUJ3QUZRQUFrQUx3QmNRQ0lCTURCQU1TUXNKeUVkRnhFTUx5VWtHaGtWRkFvSkFBUUZCQUlmQVFjQ0FRUkdkaTgzR0FBL1B5OEJMeno5UEM0dUxpNHVMaTR1QUM0dUxpNHVMaTR4TUFGSmFMa0FCQUF3U1doaHNFQlNXRGdSTjdrQU1QL0FPRmszRkNNaU5SRTBNeklWRnhRaklqVTBKaU1pQmgwQkZDTWlQUUUwTmpNeUZ6WXpNaFlkQVJRaklqVTBKaU1pQmhkSUV4UVVFOXNVRkNRWUdDTVVGRHNvTGg4Zk15ZzZGQlFqRnhrakFSUVRFd0VvRkJTQkV4TVpMU01ZQ2hNVENpazZLeXRES2dFVEV4a3RJeGdBQVFBYS8zVUF6UUhHQUVjQVpFQW9BVWhJUUVrRE1Bd3VDaUVUQkQwRFJUY0VKeGtRQlFZa0JUbzBCU29BQlJZZUJVSXFCZ0VaUm5Zdk54Z0FMeTh2L1MvOUVQMHYvUkQ5QVM4OC9Ud3ZQUDA4TGk0QUxpNHhNQUZKYUxrQUdRQklTV2hoc0VCU1dEZ1JON2tBU1AvQU9GazNNaFlWRkFZaklpY21OVFF6TWhjV016STJOVFFtSXlJbU5UUTJOell6TWpZMU5DWWpJaVkxTkRZek1oY1dGUlFqSWljbUl5SUdGUlFXTXpJV0ZSUUdCd1lqSWdZVkZCWnpKVFUwSmpnWkFoVU5CUTBmRlIwZEZTVTBMeU1EQkJVZEhSVWxORFFsTFJ3RUZBa0hFQmtVSFIwVUpUVXZJd01GRkIwZEp6UWxKVFF6QlFRVURCMGVGQlFkTkNVak13TUJIQlFVSFRVbEpUUW1CZ1lVQ1JVZEZCUWVOQ1VqTWdNQkhSUVVIUUFBQVFBUkFBRUExd0ZQQURNQWlrQkdBVFEwUURVUE1Da2RGZzhESVNBYUdSTVNEQWNMQkRNdExDWWxCd1lIQUJJUkFRTUFCUTBNQmdNRkxpMFpBeGdGTXpJVUF4TXNLeHNER2dVbkppQURIeU1KQWdFRFJuWXZOeGdBUHk4dkZ6ejlGend2Rnp6OUZ6d3ZGeno5Rnp3Qkx4YzgvUmM4TGk0dUxpNHVBREV3QVVsb3VRQURBRFJKYUdHd1FGSllPQkUzdVFBMC84QTRXVGNqSWpVME93RTFORE15SFFFek1oVVVLd0VWTXpJVkZDc0JGVE15RlJRckFSVVVJeUk5QVNNaU5UUTdBVFVqSWpVME93RmdPeFFVT3hRVU94UVVPenNVRkRzN0ZCUTdGQlE3RkJRN094UVVPK3dVRkNjVUZDY1VGQjBVRkJ3VUZFOFRFMDhVRkJ3VUZBQUFBZ0FnLy9RQkRnRVNBQmNBS3dCWFFDQUJMQ3hBTFNvb0lCTVNCQ29YQUF3TEJCNEhCZzhGQXlRRkdoVUpHZ0VHUm5Zdk54Z0FMeTg4RVAwdi9RRXZQRHo5UEM4OFBQMDhBQzR1TVRBQlNXaTVBQVlBTEVsb1liQkFVbGc0RVRlNUFDei93RGhaSlJRR0l5SW1QUUUwTXpJZEFSUVdNekkyUFFFME16SVZCd1lqSWljbU5UUXpNaGNXTXpJM05qTXlGUlFCRFVVeU1VVVVGQzRnSVM0VUZBZ3pQRHd4Q1JNR0JpWXhNaWNGQmhTNk1rVkZNa1FVRkVRaExpNGhSQlFVNlNFaEJnb1ZCQm9iQkJZS0FBQUNBQW4vOFFFeUFSVUFFd0FuQUVWQUZnRW9LRUFwSmlFTkF5WWNFZ2drSGhBRENoY0JIRVoyTHpjWUFDOHZGendCTGk0dUxnQXVMaTR4TUFGSmFMa0FIQUFvU1doaHNFQlNXRGdSTjdrQUtQL0FPRmszQndZaklpOEJKalUwTXpJZkFUYzJNeklWRkJjSEJpTWlMd0VtTlRRek1oOEJOell6TWhVVTRqSUhDd29ITXdNVkN3WWhJUVlMRkV5QUJ3c0tCNEVERlFzR2IyOEdDeFQ0WWc0TllnVUZGQXRCUUFzVEJBWDVEZzM1QlFVVUM5ZldDeE1FQUFBQkFBai84UUpaQVJ3QUt3QkpRQmNCTEN4QUxTb2xJaDhjR1F3R0toUW9GZzhKQXdFVVJuWXZOeGdBTHp3OEx6d0JMaTRBTGk0dUxpNHVMakV3QVVsb3VRQVVBQ3hKYUdHd1FGSllPQkUzdVFBcy84QTRXUUVEQmlNaUx3RUhCaU1pTHdFSEJpTWlKd01tTlRRek1oOEJOell6TWg4Qk56WXpNaDhCTnpZek1oVVVBbGhqQmd3TEIwZElCd3NLQjBaSUJ3c01CbU1DRkEwRlZVUUlDUW9JUjBnSUNna0lRMVFGRFJRQkFmOEFFQTEvZncwTmYzOE5FQUVBQkFRVERkbDVEUTErZmc0T2Vka05Fd1FBQUFJQUN2L3hBZjRCUHdBckFGY0FhRUFvQVZoWVFGa3FWVkpQVEVrL09UTW9GZzhNQ1FZRFJDNHFGRHcyUWpBQUlod0NKUjhaQVFFVVJuWXZOeGdBUHp3OFB6dy9QQzg4QVM0dUxpNEFMaTR1TGk0dUxpNHVMaTR1TGk0dU1UQUJTV2k1QUJRQVdFbG9ZYkJBVWxnNEVUZTVBRmovd0RoWkFRY0dJeUl2QVFjR0l5SXZBUWNHSXlJdkFTWTFORE15SHdFM05qTXlId0UzTmpNeUh3RTNOak15RlJRSEZoVVVJeUl2QVFjR0l5SXZBUWNHSXlJdkFRY0dJeUkxTkQ4Qk5qTXlId0UzTmpNeUh3RTNOak15RndINlNBZ0lDQWhBUHdjSkNBYy9RQWdJQ0FoSEJCUUpCamhBQ0FnSUNEOCtDQWdJQ0VBNEJna1ZCUVFVQ2dZNFB3Z0lDQWcrUUFnSUNBZy9PQVlLRXdSSENBZ0lDRDlBQ0FnSENEOC9DQWdJQ0FFVFpBb0tWMWNLQ2xkWEN3dGtCZ1lVQ0U1WEN3dFhWd3NMVjA0SUZBYjhCZ1lVQ1V4V0N3dFhWd29LVmt3SkZBWUdZd3NMVjFjS0NsZFhDd3NBQVFBSi80a0Jvd0U4QUN3QVhrQWtBUzB0UUM0T0p5UWZIQXdKQXdBaUh4b09DUVVzRWhFREFBUW9KeGNERmlvVUFScEdkaTgzR0FBdkx3RXZGeno5Rnp3dUxpNHVMaTRBTGk0dUxpNHVMaTR4TUFGSmFMa0FHZ0F0U1doaHNFQlNXRGdSTjdrQUxmL0FPRmsvQVRZek1oVVVCd1lITnpZek1oVVVEd0VWRkNNaVBRRW5KalUwTXpJZkFTY21OVFF6TWg4Qk5UUXpNaFhxVFFZSkZRUW1LSDhFQkJNTnJCUVVyQTBVQkFSOVRRUVZDUVpORkJTaWJnZ1RCZ1UzT0RBQkZBMEZRTGtVRkxsQUJRMFZBakJ2QlFZVENHNkdGQlFBQVFBUi8vOEJCQUdMQUNFQVlFQWxBU0lpUUNNYUV5QWRHaFVTRHd3SkJBRUNBUVVHSGgwRkRRd1lGd01TQWdjR0FBRUpSbll2TnhnQVB6dy9Qend2UFAwOEVQMDhBUzR1TGk0dUxpNHVMaTRBTGpFd0FVbG91UUFKQUNKSmFHR3dRRkpZT0JFM3VRQWkvOEE0V1RjSE16SVZGQ3NCSWpVMFB3RWpJalUwUHdFaklqVTBPd0V5RlJRUEFUTXlGUlQ3bjVFVUZNVVhDWitSRndtZmtSTVR4UmNKbjVFWHRvOFVGQkVLQ0pBUkNnaU9GQlFSQ2dpUEVRb0FCd0FZLy84QkxBSXBBQXNBRlFBZkFDa0FOUUJCQUVrQWprQkNBVXBLUUVzQUp4TkdQQlVSRUF3YkdnUWZGa0lFTmlvRUFDa2dCQ1VrTUFRR0pDQWFGaEFGREFVT09RVklSQVUvTFFVSkF3VXpDVWdESFFFaUdBNEFBUVpHZGk4M0dBQS9QRHcvUHk4di9SRDlMLzBRL1JEOUZ6d0JMLzB2UFAwOEwvMHYvUzg4L1R3dUxpNHVMaTRBTGk0eE1BRkphTGtBQmdCS1NXaGhzRUJTV0RnUk43a0FTdi9BT0ZrQkZBWWpJaVkxTkRZek1oWURGQ01pUFFFME16SVZCeFFqSWowQk5ETXlGUWNVSXlJOUFUUXpNaFVUTkNZaklnWVZGQll6TWpZbkZBWWpJaVkxTkRZek1oWUhOQ01pRlJRek1nRXNVRG82VUZBNk9sQXhGQlFVRkVVVEZCUVRSeFFVRkJTVk9Ta3BPVGtwS1RrY0tSMGRLQ2dkSFNrb0hoMGRIZ0dmT2xGUk9qbFJVZjQ3RkJTTEZCU0xGQlRaRkJUWkZCU0xGQlFCQVNrNU9Ta3BPam9wSFNnb0hSMG9LQjBkSFI0QUFBVUFCUC8vQVVZQmx3QVRBQjBBSndBeEFEc0FkMEF5QVR3OFFEMDZMeW9NQWpvMUppRWNGdzRBTVNnRUxTd0hCUkVWRkFVWkpDTUZIeDQ0TndVeU16SUFHaGtCRVFNQkRrWjJMemNZQUQ4L1BEODhFUDA4THp6OVBCRDlQQkQ5QVM4OC9Ud3VMaTR1TGk0dUxnQXVMaTR1TVRBQlNXaTVBQTRBUEVsb1liQkFVbGc0RVRlNUFEei93RGhaQVJZaklpY3VBU01pQmdjR0l5STNQZ0V6TWhZSEl5STFORHNCTWhVVUJ5TWlOVFE3QVRJVkZBY1VJeUk5QVRRek1oVVRJU0kxTkRNaE1oVVVBUllHR1E4RUNEWWlJalFKQkE4YUJndExNREJLT3lnVEV5Z1VGQ2dURXlnVVl4UVVGQlN5L3VzVEV3RVZGQUV2R1E4Z0tpb2dEeGt0T3p1WEZCUVVGRU1VRkJRVU14TVR4UlFVL3VzVUZCUVVBQWtBQVFHb0Fqd0NXZ0FMQUJjQUl3QXZBRHNBUndCUEFGY0FYd0NGUURzQllHQkFZUUFrQkFCWUJGd1lCRHhNQkVoUUJGUTJCQklHQkNvd0JBeENCQjVGT1MwRkExNVdUZ1ZhVWtvL015Y0ZDU0VWQ1JzUEF3RWVSbll2TnhnQUx6dzhMenc4RVAwOFBDODhQUDA4UEJEOVBEd0JMLzB2L1MvOUwvMHYvUy85TC8wdi9TLzlBREV3QVVsb3VRQWVBR0JKYUdHd1FGSllPQkUzdVFCZy84QTRXUUVVQmlNaUpqVTBOak15RmdjVUJpTWlKalUwTmpNeUZnY1VCaU1pSmpVME5qTXlGZ1UwSmlNaUJoVVVGak15TmljMEppTWlCaFVVRmpNeU5pYzBKaU1pQmhVVUZqTXlOaVVVSXlJMU5ETXlCeFFqSWpVME16SUhGQ01pTlRRek1nSThNeVlsTkRRbEpUVEVOQ1VtTkRVbEpUVEdNeVlsTXpNbEpUUUJZeDRVRkIwZEZCUWV4UjBVRkI0ZUZCUWR4UjRVRkJ3Y0ZCUWVBV3dVRkJRVXhCUVVGQlRHRkJNVEZBSUJKVFEwSlNVME5DVWxORFFsSlRRMEpTVTBOQ1VsTkRRbEZCMGRGQlFkSFJRVUhSMFVGQjBkRkJRZEhSUVVIUjBVRXhNVUZCTVRGQlFURXhRQUEvLy9BYjRBK0FLM0FBMEFHd0FwQUVWQUZRRXFLa0FyRENZWUVRTW9JUm9UREFVS0h3RVRSbll2TnhnQUx5OEJMaTR1TGk0dUFDNHVMaTR4TUFGSmFMa0FFd0FxU1doaHNFQlNXRGdSTjdrQUt2L0FPRmtUQndZaklqVTBQd0UyTXpJVkZBOEJCaU1pTlRRL0FUWXpNaFVVRndjR0l5STFORDhCTmpNeUZSVHlWd1lJRlFkV0JnZ1ZrRVlIQ0JRSFJnWUlGRFJIQmdjV0JrY0dDQlVDbEZZR0ZBZ0hWZ1lWQ0ZaR0J4UUlCMFlHRkFoQVJnWVdCd1pHQmhVSUFBSUFFUDlxQU1JQUhBQVhBQjhBUzBBYUFTQWdRQ0VBQmc4RUFCZ0VFeHdNQlFNSUhnVWFGUU1CQmtaMkx6Y1lBQzh2TC8wOEVQMEJMeno5TC8wdUFERXdBVWxvdVFBR0FDQkphR0d3UUZKWU9CRTN1UUFnLzhBNFdSY1VCaU1pSmpVME16SVVGak15TmpVMEppSTFORE15RmdjVUl5STFORE15d2pRbEpUUVVGQjBVRkIwZEp4TWxORVVVRkJRVVBTVTBOQ1VUSng0ZUZCUWRGQlEwSlJRVUZBQUFBd0F0L3prQTNnSkVBQXNBRndCY0FIdEFOUUZkWFVCZUFFY2tSU0phVGhJRVBqSUdPQ3NNQkZRYkFBOEZDUU1GRlVzRlFUc0ZVVFVGVnhnRkx5NG9CUjRKSGtFREFRWkdkaTgzR0FBL0x5OFEvUzg4L1MvOUwvMFEvUy85RVAwQkx6dzgvVHc4THp3OC9UdzhMaTRBTGk0eE1BRkphTGtBQmdCZFNXaGhzRUJTV0RnUk43a0FYZi9BT0ZrVEZBWWpJaVkxTkRZek1oWUhOQ1lqSWdZVkZCWXpNallETWhZVkZBWWpJaWNtTlRRek1oY1dNekkyTlRRbUt3RWlKalUwTmpNeU5qVTBKaU1pSmpVME5qTXlGeFlWRkNNaUp5WWpJZ1lWRkJZek1oWVZGQVlqSWdZVkZCYmVNeVVsTkRRbEpUTW9IQlFVSGg0VUZCd3hKVFEwSkM4YUJCUUxCZzRhRkJ3Y0ZBRWxNek1rRkI0ZEZDVXpNeVU1R0FJVURBWU5JQlFkSFJRbE5EUWtGQjRkQWV3bE5EUWxKVE16SlJRZEhSUVVIUjMrRXpRbEpUUW1CZ1lVQ2hRZEZCUWROQ1VsTkIwVUZCNDBKU1UwTXdVRkV3d2NIUlFVSFRVbEpUUWRGQlFkQUFVQUVRQUFBcklDdUFBTkFCc0FLUUJWQUY4QWNVQXRBV0JnUUdFc1BUbzNOREVuSUJJTEJGNVpRaXdsSGhjUUNRSmNXd1ZYVmhsUVNnRlRUVWNEUUM0QUFVSkdkaTgzR0FBL1BEODhQRDg4THk4OC9Ud0JMaTR1TGk0dUxpNHVMZ0F1TGk0dUxpNHVMaTR1TVRBQlNXaTVBRUlBWUVsb1liQkFVbGc0RVRlNUFHRC93RGhaQVJZVkZDTWlMd0VtTlRRek1oY0hGaFVVSXlJdkFTWTFORE15SHdFV0ZSUWpJaThCSmpVME16SVhBUllWRkNNaUp3TUhCaU1pTHdFSEJpTWlMd0VEQmlNaU5UUTNFell6TWg4Qk56WXpNaDhCTnpZek1oY0RJU0kxTkRNaE1oVVVBYWNHRlFnR1J3WVZDQVl6QmhVSUJsWUdGUWdHbHdZVUNBWklCaFFJQndHS0FSVU9CV2RNQndzTUIxQlNCd3NMQjAxbkJRMFZBWGNGRFF3SFVGRUhEQXNIVUZBSERBd0dFLzUyRXhNQmloUUNIQVlJRlFaSEJnZ1ZCZ2NHQ0JRR1ZnWUlGQWJRQmdnVkJrZ0dDQlVIL2ZFREJCTU9BVCtqRHcrcXFnOFBvLzdCRGhNRUF3RndFUStxcWc4UHFxb1BFZjdhRkJNVEZBQUZBQkFBQUFLeEFyY0FEUUFiQUNrQVZRQmZBSEZBTFFGZ1lFQmhMRDA2TnpReEpoOFlFUU5lV1VJc0tDRWFFd3dGWEZzRlYxWUtVRW9CVTAxSEEwQXVBQUZDUm5Zdk54Z0FQencvUER3L1BDOHZQUDA4QVM0dUxpNHVMaTR1TGk0QUxpNHVMaTR1TGk0dUxqRXdBVWxvdVFCQ0FHQkphR0d3UUZKWU9CRTN1UUJnLzhBNFdRRUhCaU1pTlRRL0FUWXpNaFVVRHdFR0l5STFORDhCTmpNeUZSUVhCd1lqSWpVMFB3RTJNeklWRkJNV0ZSUWpJaWNEQndZaklpOEJCd1lqSWk4QkF3WWpJalUwTnhNMk16SWZBVGMyTXpJZkFUYzJNeklYQXlFaU5UUXpJVElWRkFJR1ZnWUlGZ2RYQndnVGowWUdDQlVHUmdZSUZUTkhCZ2dWQmtjR0J4YjBBUlVOQldoTUJ3c01CMUJTQndzTEIwMW5CUTBWQVhjR0RRd0hUMUVIREFzSFVGQUhEQXdHRS81MkV4TUJpaFFDbFZZR0ZRZ0dWUVlVQ0ZkR0JoVUlCa1lHRlFnL1JnWVZDQVpHQmhZSC9na0VBeE1PQVQrakR3K3FxZzhQby83QkRoTUVBd0Z3RVErcXFnOFBxcW9QRWY3YUZCTVRGQUFBQkFBUkFBQUNzZ0toQUFrQU5RQkpBRndBZFVBdkFWMWRRRjRNV0ZWU1EwQTlOaDBhRnhRUldsQk5SVHNpREFnREJnVUZBUUJOU2pBcUFUTXRKd01nRGdBQklrWjJMemNZQUQ4OFB6dzhQend2UEM4OC9Ud0JMaTR1TGk0dUxpNHVBQzR1TGk0dUxpNHVMaTR1TGpFd0FVbG91UUFpQUYxSmFHR3dRRkpZT0JFM3VRQmQvOEE0V1NVaElqVTBNeUV5RlJRWEZoVVVJeUluQXdjR0l5SXZBUWNHSXlJdkFRTUdJeUkxTkRjVE5qTXlId0UzTmpNeUh3RTNOak15RnljeUh3RVdGUlFqSWk4QkJ3WWpJalUwUHdFMkp6WVhNUmNXRlJRaklpOEJCd1lqSWpVME53SW0vbllURXdHS0ZIY0JGUTRGWjB3SEN3d0hVRklIQ3dzSFRXY0ZEUlVCZHdVTkRBZFFVUWNNQ3dkUVVBY01EQWJZQ0FkV0JoVUlCa2RKQmdnVkJsWUlDQThPVndZVkNBWklTQVlJRlFaa0ZCTVRGRW9EQkJNT0FUK2pEdytxcWc4UG8vN0JEaE1FQXdGd0VRK3FxZzhQcXFvUEViUUdWZ1lJRlFaSVNBWVZDQVpXQmxRUEQxY0dDQlVHU1VnR0ZRZ0dBQVFBRVFBQUFySUNMUUFSQUNNQVR3QlpBSFZBTUFGYVdrQmJKamMwTVM0cldGTThKaDRTQmdBY0ZBTUZERlpWQlZGUUdBVWhFQWdoU2tRQlRVZEJBem9vQUFFOFJuWXZOeGdBUHp3L1BEdy9QQzg4UEJEOUx6ejlQQy85UER3QkxpNHVMaTR1TGk0QUxpNHVMaTR4TUFGSmFMa0FQQUJhU1doaHNFQlNXRGdSTjdrQVd2L0FPRmtCRkFZaklpWTFORE15RkJZek1qWTBNeklIRkNNaU5DWWpJZ1lVSXlJMU5EWXpNaFlCRmhVVUl5SW5Bd2NHSXlJdkFRY0dJeUl2QVFNR0l5STFORGNUTmpNeUh3RTNOak15SHdFM05qTXlGd01oSWpVME15RXlGUlFDSkRRbEpUUVVGQjBVRkIwVUZNOFVGQjBVRkI0VUZEVWxKVFFCWEFFVkRRVm5UUWNMQ3dkUlVRY01Dd2RNWndVT0ZRRjRCZ3dNQjFCUkJ3d0xCMUJRQnd3TkJSUCtkaE1UQVlvVUFoZ2xORFFsRkNnZUhpaFpFeWNlSGljVEpqUTEvaUlEQkJNT0FUK2pEdytxcWc4UG8vN0JEaE1FQXdGd0VRK3FxZzhQcXFvUEVmN2FGQk1URkFBTEFCRUFBQUt5QWxzQUN3QVhBQ01BVHdCWkFHVUFjUUI5QUlVQWpRQ1ZBSzlBVWdHV2xrQ1hKamMwTVM0clBDYUtCSVptQkF5T0JKSlRCZ1JnV2dRQWdnUitXQmdFY213RUVuZ0VIcENJZ0FXVWpJUldWUVZSVUhWcFhRVUpHdzhEQlh0dll5RVZDVXBFQVUxSFFRTTZLQUFCUEVaMkx6Y1lBRDg4UHp3OFB6d3ZQRHd2UER6OVBEd1EvVHc4THp6OVBDODhQUDA4UEFFdi9TLzlMLzB2UFAwdi9TLzlMeno5TC8wdi9TNHVBQzR1TGk0dU1UQUJTV2k1QUR3QWxrbG9ZYkJBVWxnNEVUZTVBSmIvd0RoWkFSUUdJeUltTlRRMk16SVdCeFFHSXlJbU5UUTJNeklXQnhRR0l5SW1OVFEyTXpJV0FSWVZGQ01pSndNSEJpTWlMd0VIQmlNaUx3RURCaU1pTlRRM0V6WXpNaDhCTnpZek1oOEJOell6TWhjRElTSTFORE1oTWhVVUV6UW1JeUlHRlJRV016STJKelFtSXlJR0ZSUVdNekkySnpRbUl5SUdGUlFXTXpJMkpSUWpJalUwTXpJSEZDTWlOVFF6TWdjVUl5STFORE15QW9BMEpTVTBOQ1VsTk1VekppVTBOQ1VsTk1VMEpTVTBOQ1VsTkFHN0FSVU5CV2ROQndzTEIxRlJCd3dMQjB4bkJRNFZBWGdHREF3SFVGRUhEQXNIVUZBSERBMEZFLzUyRXhNQmloUWRIUlFVSFIwVUZCM0VIaFFVSFIwVUZSM0dIUlFVSFIwVUZCMEJiUlFVRkJURkZCTVRGTVVVRXhNVUFnSWxORFFsSlRRMEpTVTBOQ1VsTkRRbEpUUTBKU1UwTlAzekF3UVREZ0Uvb3c4UHFxb1BENlArd1E0VEJBTUJjQkVQcXFvUEQ2cXFEeEgrMmhRVEV4UUJuaFFkSFJRVkhCd1ZGQjBkRkJVY0hCVVVIUjBVRlJ3Y0ZSUVVFeE1VRkJNVEZCUVRBQUFGQUJBQUFBS3hBbG9BQ3dBM0FFRUFUUUJWQUhsQU5BRldWa0JYRGg4Y0dSWVRRRHNrRGtnRUJrSUVBRTRFVWo0OUJUazRSUVVKQXdWTFVBVlVDVElzQVRVdktRTWlFQUFCSkVaMkx6Y1lBRDg4UHp3OFB6d3ZMLzB2L1JEOUx6ejlQQUV2L1MvOUwvMHVMaTR1QUM0dUxpNHVNVEFCU1dpNUFDUUFWa2xvWWJCQVVsZzRFVGU1QUZiL3dEaFpBUlFHSXlJbU5UUTJNeklXRXhZVkZDTWlKd01IQmlNaUx3RUhCaU1pTHdFREJpTWlOVFEzRXpZek1oOEJOell6TWg4Qk56WXpNaGNESVNJMU5ETWhNaFVVQXpRbUl5SUdGUlFXTXpJMkp4UWpJalUwTXpJQnVqUWxKVFEwSlNVMDlnRVZEUVZvVEFjTERBZFFVZ2NMQ3dkTlp3VU5GUUYzQmcwTUIwOVJCd3dMQjFCUUJ3d01CaFArZGhNVEFZb1VweDBVRkI0ZUZCUWRIUlFVRkJRQ0FTVTBOQ1VsTkRUOTlBUURFdzRCUDZNUEQ2cXFEdytqL3NFT0V3UURBWEFSRDZxcUR3K3FxZzhSL3RvVUV4TVVBWjBVSFIwVUZCMGRGUlVWRXdBQUNnQUpBQUFEVlFHY0FBa0FFd0FkQUNjQU1RQTdBRVVBVHdCcEFITUF2RUJaQVhSMFFIVUljRzlyYWxaVGNtMW9XMFEvT2pVd0t5WWhIQmNTRFFnRFQwWUVTMG9MQ2dVUEFRQUZCZ1V1TFFVcEtCb1pCUlVVSHg0Rkl6ZzNCVE15UWtFRlBHTUJZQU5aU0QwRFBBQWtJd0ptVFJBRER3TUJXMFoyTHpjWUFEOFhQRDg4UHhjOFB6OFEvVHd2UFAwOEVQMDhMeno5UEM4OC9Ud3ZQUDA4RVAwOEFTODgvVHd1TGk0dUxpNHVMaTR1TGk0dUxpNHVMaTRBTGk0dUxpNHVNVEFCU1dpNUFGc0FkRWxvWWJCQVVsZzRFVGU1QUhUL3dEaFpKU01pTlRRN0FUSVZGQ2NqSWpVME93RXlGUlFYSXlJMU5Ec0JNaFVVSnlNaU5UUTdBVElWRkFjaklqVTBPd0V5RlJRSEl5STFORHNCTWhVVUJ5TWlOVFE3QVRJVkZDVVVJeUkxRVRRek1oVVBBUVlqSWk4QkF3WWpJalUwTnhNMk16SWZBVGMyTXpJVkZBTWpJalUwT3dFeUZSUURRWGNURTNjVWkrd1VGT3dVWTNZVEUzWVVpKzBURSswVUZPd1VGT3dVRk8wVEUrMFVGT3dVRk93VS9zNFRGQlFUUjEwSEN3c0hUbVlGRFJVQmRnWU5EQWRRU3dZTEZSVEFFeFBBRk9zVUZCUVVlUlFVRkJUckZCUVVGS3NVRkJRVWNoUVVGQlJ5RkJRVUZFQVVGQlFVRkJNVEFXUVVGQW5GRHcrai9zRU9Fd1FEQVhBU0VLcWZEQlFGL3ZBVUV4TVVBQUFFQUNIL2FnTnJBWmNBQndBVkFDTUFhQUNMUUQwQmFXbEFhanBVVER3bVhsWk9Rem9pR0JZTUNBUUVBR2NFV0IwRUNoRUVLMlFGVzBBYURnVXVZQVlGQWtnZ0ZBVlNLRnMwTUFNMk1pNERBU3RHZGk4M0dBQS9QRHcvUEM4dlBQMDhQQy85UEJEOVBEd1EvUUV2L1MvOUwvMHYvUzR1TGk0dUxpNHVMaTRBTGk0dUxqRXdBVWxvdVFBckFHbEphR0d3UUZKWU9CRTN1UUJwLzhBNFdRVVVJeUkxTkRNeUp5WTFORGNtSXlJR0ZSUVdNekkzTkRjbUl5SUdGUlFXTXpJM0pnY2lKd1lqSWlZMU5EWXpNaGMyTXpJWE5qTXlGeFlWRkNNaUp5WWpJZ1lWRkI4QkZqTXlOell6TWhVVUJ3WWpJaWNHQnhZVkZBWWpJaVkxTkRNeUZCWXpNalkxTkFIMkZCTVRGS3c3T3lndlJtUmtSaS9aUENzc1JtTmpSaXdyUEJzL09EVkJWM3Q3Vno4M04wQkJOalZCWER3R0ZRZ0dNa2xHWkQ0Q0xUMUtNUVlJRlFZL1dVRTFGUjRZTkNZbE14UVVIQlFWSFQwVUZCUmRPMVpYT3hoa1JrWmpxVlUrRjJOSFJtTVhPbmtsSlh0V1Yzc2xKU1VsUVFZSEZRWTFZMGRQTkFJa05BY1ZCd1pCSlE0TUdpSWxORFFsRXljZUhoUXhBQUFLQUFELy93R3ZBcXdBRFFBYkFDa0FNd0E5QUVjQVVRQmJBR1VBYndDcFFFd0JjSEJBY1RJbklCSUxCRzVwWkY5YVZWQkxSa0U4TnpJdEpSNFhFQWtDV0ZjRlUxSkpTQVZOTUM4Rkt5bzFOQVU1UkVNRlB6NWlZUVZkWEd4ckJXWVpaMllBVGswQ09qa0RBUmRHZGk4M0dBQS9QRDg4UHp3dkVQMDhMeno5UEM4OC9Ud1EvVHd2UFAwOEVQMDhMeno5UEFFdUxpNHVMaTR1TGk0dUxpNHVMaTR1TGk0dUxnQXVMaTR1TGpFd0FVbG91UUFYQUhCSmFHR3dRRkpZT0JFM3VRQncvOEE0V1JNV0ZSUWpJaThCSmpVME16SVhCeFlWRkNNaUx3RW1OVFF6TWg4QkZoVVVJeUl2QVNZMU5ETXlGd0VqSWpVME93RXlGUlFuSXlJMU5Ec0JNaFVVRnlNaU5UUTdBVElWRkNjaklqVTBPd0V5RlJRSEl5STFORHNCTWhVVUJ5TWlOVFE3QVRJVkZBY2pJalUwT3dFeUZSVHpCaFVJQmtZR0ZRZ0dNd1lWQ0FaWEJoVUlCcGdHRlFnR1J3WVVDQVlCS0hjVEUzY1VpK3dVRk93VVkzY1RFM2NVaSswVEUrMFVGT3dVRk93VUZPMFRFKzBVRk93VUZPd1VBZzRHQnhVR1JnWUlGUVlHQmdnVkJsY0dDQlVHMFFZSUZRWkhCZ2dWQnY3T0ZCUVVGSGtVRkJRVTZ4UVVGQlNyRkJRVUZIRVVFeE1VY3hRVUZCUkFGQlFVRkFBQUNnQWpBQUFCcmdLckFBMEFHd0FwQURNQVBRQkhBRkVBV3dCbEFHOEFxVUJNQVhCd1FIRXlKaDhZRVFOdWFXUmZXbFZRUzBaQlBEY3lMU2doR2hNTUJUVTBCVGxKU0FWTk1DOEZLeXBZVndWVFVrUkRCVDgrWW1FRlhWeHNhd1ZtQ21kbUFFNU5Bam81QXdGTFJuWXZOeGdBUHp3L1BEODhMeEQ5UEM4OC9Ud3ZQUDA4THp6OVBDODgvVHdRL1R3US9Ud0JMaTR1TGk0dUxpNHVMaTR1TGk0dUxpNHVMaTRBTGk0dUxpNHhNQUZKYUxrQVN3QndTV2hoc0VCU1dEZ1JON2tBY1AvQU9Ga0JCd1lqSWpVMFB3RTJNeklWRkE4QkJpTWlOVFEvQVRZek1oVVVGd2NHSXlJMU5EOEJOak15RlJRVEl5STFORHNCTWhVVUp5TWlOVFE3QVRJVkZCY2pJalUwT3dFeUZSUW5JeUkxTkRzQk1oVVVCeU1pTlRRN0FUSVZGQWNqSWpVME93RXlGUlFISXlJMU5Ec0JNaFVVQVZGWEJnZ1ZCbGNHQ0JXUVJnWUlGUVpHQmdnVk0wWUdDQlVHUndZSUZKUjNFeE4zRkl2c0V4UHNGR04zRXhOM0ZJdnRFeFB0RkJUc0V4UHNGQlR0RXhQdEZCVHNFeFBzRkFLSVZnWVZDQVpXQmhVSVZrWUdGUWNHUndZVkNFQkdCaFVJQmtZR0ZRais1eFFVRkJSNUZCUVVGT3NVRkJRVXF4UVVGQlJ5RkJRVUZISVVGQlFVUUJRVUZCUUFBQWtBSXdBQUFhNENpd0FKQUJNQUhRQW5BREVBT3dCRkFGZ0FiUUNwUUV3QmJtNUFid2huWTJCWFVrNUxhVjVVU1VRL09qVXdLeVloSEJjU0RRZ0RDd29GRHg4ZUJTTUdCUVVCQUM0dEJTa29HaGtGRlJRNE53VXpNa0pCQlR4WlBUd0FKQ01DRUE4REFTRkdkaTgzR0FBL1BEODhQend2RVAwOEx6ejlQQzg4L1R3dlBQMDhMeno5UEJEOVBCRDlQQUV1TGk0dUxpNHVMaTR1TGk0dUxpNHVMaTRBTGk0dUxpNHVMakV3QVVsb3VRQWhBRzVKYUdHd1FGSllPQkUzdVFCdS84QTRXU1VqSWpVME93RXlGUlFuSXlJMU5Ec0JNaFVVRnlNaU5UUTdBVElWRkNjaklqVTBPd0V5RlJRSEl5STFORHNCTWhVVUJ5TWlOVFE3QVRJVkZBY2pJalUwT3dFeUZSUURGeFlWRkNNaUx3RUdCd1lqSWpVMFB3RTJKeklmQVJZVkZDTWlMd0VHQndZaklqVTBQd0UyQVpwM0V4TjNGSXZzRXhQc0ZHTjNFeE4zRkl2dEV4UHRGQlRzRXhQc0ZCVHRFeFB0RkJUc0V4UHNGSHBUQmhRSUJrZ1ROUVlJRlFaWEVBTUtCVllHRkFnR1NCTTFCZ2dWQmxZRzZ4UVVGQlI1RkJRVUZPc1VGQlFVcXhRVUZCUnlGQlFVRkhJVUZCUVVRQlFVRkJRQ0tWUUdDQlVHU0JNMUJoVUlCbGNRVHdaV0JnZ1ZCa2dUTlFZVkNBWldCZ0FBQnYrNC8vOEFzd0tNQUEwQUd3QXBBRFVBUHdCTEFIWkFNZ0ZNVEVCTktqMG5JQklMQkNVWEVBbEdCREE2UUFRQ0tqOGVOZ1E3T2pvMkJUaERCVE10QlVrWlNRRTRBRE1EQVJkR2RpODNHQUEvUHo4dkVQMFEvUkQ5UEFFdlBQMDhQTjA4L1JEZC9TNHVMaTRBTGk0dUxpNHVNVEFCU1dpNUFCY0FURWxvWWJCQVVsZzRFVGU1QUV6L3dEaFpFeFlWRkNNaUx3RW1OVFF6TWhjSEZoVVVJeUl2QVNZMU5ETXlId0VXRlJRaklpOEJKalUwTXpJZkFSUUdJeUltTlRRMk16SVdBeFFqSWowQk5ETXlGVGMwSmlNaUJoVVVGak15TnFzR0ZBZ0dSd1lVQ0FZekJoUUlCbGNHRlFnR21BWVZDQVpJQmhVSUJvZ3VJU0V1TGlFaExqc1VGQlFVRXhZUkVCY1hFQkFYQWU0R0NCUUdSd1lJRkFZR0JnZ1ZCbGNHQ0JVRzBRWUlGUVpIQmdnVkJ1QWhMaTRoSVM0dS90WVVGSXNVRkg0UkZoWVJFQmNYQUFBR0FCUC8vd0VPQW9zQURRQWJBQ2tBTlFBL0FFc0FkRUF4QVV4TVFFME1QU1lmR0JFREtCb01CVUFFS2o4MkJEc2hPa1lFRXpBNk5nVTRRd1V6TFFWSkNra0JPQUF6QXdFd1JuWXZOeGdBUHo4L0x4RDlFUDBRL1R3Qkx6ejlMenc4L1R3di9TNHVMaTRBTGk0dUxpNHVNVEFCU1dpNUFEQUFURWxvWWJCQVVsZzRFVGU1QUV6L3dEaFpBUWNHSXlJMU5EOEJOak15RlJRUEFRWWpJalUwUHdFMk16SVZGQmNIQmlNaU5UUS9BVFl6TWhVVUJ4UUdJeUltTlRRMk16SVdBeFFqSWowQk5ETXlGVGMwSmlNaUJoVVVGak15TmdFSVZnWUlGUVpXQmdnVmtFWUdDQlVHUmdZSUZUTkdCZ2dWQmtZSENCUUxMaUloTGk0aElpNDdGQlFVRkJNWEVSQVhGeEFRR0FKb1Z3WVZDQVpYQmhVSVZrY0dGUWdHUmdZVUNFQkdCaFVJQmtVR0ZBaklJUzR1SVNFdUx2N1dGQlNMRkJSK0VCY1dFUkFYRndBRi8vai8vd0RPQW1zQUN3QVhBQ0VBTmdCSUFIbEFOQUZKU1VCS0owUkJQamszTUNrZlJqd3lKd0FFREIwY0JDRVlCZ1FTSEJnRkdnTUZGUThGQ1MwRklpSWFBQlVEQ1FFQk1rWjJMemNZQUQ4L1B5OFEvUkQ5RVAwUS9Ud0JMLzB2UFAwOEwvMHVMaTR1QUM0dUxpNHVMaTR1TVRBQlNXaTVBRElBU1Vsb1liQkFVbGc0RVRlNUFFbi93RGhaRXpRbUl5SUdGUlFXTXpJMk54UUdJeUltTlRRMk16SVdBeFFqSWowQk5ETXlGUU15SHdFV0ZSUWpJaWNtSndjR0l5STFORDhCTmdjMkh3RVdGUlFqSWk4QkJ3WWpJalUwTjRzWEVCRVhGeEVRRnljdUlDSXVMaUlnTGpzVEZCUVRGQWtHVmdZVkNBWWpKVWdHQ0JVR1ZnWUZEdzVXQmhVSUJrZEpCZ2dWQmdFY0VCY1dFUkFYRnhBaExpNGhJUzR1L3RZVUZJc1VGQUhOQmxjR0NCUUdKQ1JJQmhVSUJsWUdZQTRPVndZSUZBWklTQVlWQ0FZQUFBTUFJd0FCQWlVQ1h3QVJBQ01BUndCb1FDZ0JTRWhBU1VaRVFUNDdPREF0S2lkR0hoSUdBREV3QkRZMUdBVUlIQlFEQlF3aEVBZ3pBVFZHZGk4M0dBQXZMenc4TC8wOFBCRDlBUzg4L1R3dUxpNHVMZ0F1TGk0dUxpNHVMaTR4TUFGSmFMa0FOUUJJU1doaHNFQlNXRGdSTjdrQVNQL0FPRmtCRkFZaklpWTFORE15RkJZek1qWTBNeklIRkNNaU5DWWpJZ1lVSXlJMU5EWXpNaFlGQXdZaklpOEJCd1lqSWk4QkVSUWpJalVSTkRNeUh3RTNOak15SHdFM05qTXlGUlFCNHpRbEpUUVVGQjBVRkIwVUZNOFVGQjBVRkIwVUZEUWxKVFFCRDNjR0RBd0daR1FHRFF3R1VCUVVFdzBHWldRSERBc0hZMlFGRFJVQ1N5VTBOQ1VVS0I0ZUtGa1RKeDRlSnhNbE5EUjkvdWdQRCszdER3Kysvc0FURXdHaUZnN3Q3UkFRN2UwTkZBVUFBQWdBSGYvekFiOEN1QUFOQUJzQUtRQTFBRUVBVFFCWkFHRUFna0E2QVdKaVFHTXFKeUFTQ3dRbEhoY1FDUUkyQkNvOEJEQk9CRUpVQkVoYUJGNDVCVE5SQlVzL0JTMVhCVVZjQldBWkxXQUJTd0l6QXdFd1JuWXZOeGdBUHo4L0x5OFEvUy85RVAwUS9SRDlBUy85TC8wdi9TLzlMLzB1TGk0dUxpNEFMaTR1TGk0eE1BRkphTGtBTUFCaVNXaGhzRUJTV0RnUk43a0FZdi9BT0ZrQkZoVVVJeUl2QVNZMU5ETXlGd2NXRlJRaklpOEJKalUwTXpJZkFSWVZGQ01pTHdFbU5UUXpNaGNCRkFZaklpWTFORFl6TWhZSE5DWWpJZ1lWRkJZek1qWW5GQVlqSWlZMU5EWXpNaFlITkNZaklnWVZGQll6TWpZbkZDTWlOVFF6TWdFMUJoUUlCMGNHRlFnR013WVZDQVpXQmhNSUI1Z0dGQWdHU0FZVkNBWUJDbnBYVjNwNlYxZDZKMlJHUm1Sa1JrWmtMa2cwTkVsSk5EUklLREVqSXpJeUl5TXhOaDRlSGg0Q0dnWUlGQVpHQmdnVkJnWUdDQlVHVndZSUZRZlJCZ2dWQmtnR0NCVUcvcDFYZTN0WFYzdDdWMFprWTBkR1pHUkdORWxKTkRSSlNUUWpNaklqSXpJeUl4MGRIUUFBQ0FBZC8vTUJ2d0szQUEwQUd3QXBBRFVBUVFCTkFGa0FZUUNDUURvQlltSkFZeW9tSHhnUkF5Z2hHaE1NQlRZRUtqd0VNRTRFUWxRRVNGb0VYamtGTTFFRlN6OEZMVmNGUlZ3RllBb3RZQUZMQWpNREFUQkdkaTgzR0FBL1B6OHZMeEQ5TC8wUS9SRDlFUDBCTC8wdi9TLzlMLzB2L1M0dUxpNHVMZ0F1TGk0dUxqRXdBVWxvdVFBd0FHSkphR0d3UUZKWU9CRTN1UUJpLzhBNFdRRUhCaU1pTlRRL0FUWXpNaFVVRHdFR0l5STFORDhCTmpNeUZSUVhCd1lqSWpVMFB3RTJNeklWRkJNVUJpTWlKalUwTmpNeUZnYzBKaU1pQmhVVUZqTXlOaWNVQmlNaUpqVTBOak15RmdjMEppTWlCaFVVRmpNeU5pY1VJeUkxTkRNeUFaUlhCZ2dWQmxjR0NCV1FSZ2NJRkFaR0JnZ1ZNMGNHQnhVR1J3WUlGSFo2VjFkNmVsZFhlaWRrUmtaa1pFWkdaQzVJTkRSSlNUUTBTQ2d4SXlNeU1pTWpNVFllSGg0ZUFwUldCaFVJQmxZR0ZRaFdSZ2NWQ0FaR0JoUUlRRVlHRlFnR1JnWVZDUDYxVjN0N1YxZDdlMWRHWkdOSFJtUmtSalJKU1RRMFNVazBJekl5SXlNeU1pTWRIUjBBQndBYy8vTUJ2d0tXQUFzQUZ3QWpBQzhBTndCTUFHQUFoVUE4QVdGaFFHSUFXbFJMUkVBOVhGSkdPeVFFR0F3RUFCSUVCaW9FSGpBRU5BOEZDU2NGSVMwRkd4VUZBMWNGVFRJRk5rMEROZ0VoQWdrREFRWkdkaTgzR0FBL1B6OHZMeEQ5RVAwUS9TLzlFUDBRL1FFdi9TLzlMLzB2L1MvOUxpNHVMZ0F1TGk0dUxpNHhNQUZKYUxrQUJnQmhTV2hoc0VCU1dEZ1JON2tBWWYvQU9Ga2xGQVlqSWlZMU5EWXpNaFlITkNZaklnWVZGQll6TWpZbkZBWWpJaVkxTkRZek1oWUhOQ1lqSWdZVkZCWXpNalluRkNNaU5UUXpNZ01YRmhVVUl5SXZBUVlIQmlNaU5UUS9BVFlYRmljeUh3RVdGUlFqSWk4QkJ3WWpJalUwUHdFMkFiOTdWMWQ2ZWxkWGV5aGtSa1pqWTBaR1pDNUlORFJKU1RRMFNDY3lJeU15TWlNak1qY2VIaDRlRFZRR0ZRZ0dTQk0xQmdnVkJsY0hDZ2tOQ2daV0JoUUlCMGxIQmdnVkJsWUd4VmQ3ZTFkWGUzdFhSbVJqUjBaa1pFWTBTVWswTkVsSk5DTXlNaU1qTWpJakhSMGRBVkpVQmdnVkJrZ1ROUVlWQ0FaWEJ3RUNXd1pYQmdnVkIwaElCaFVJQmxZR0FBY0FIUC96QWI4Q1V3QVJBQ01BTHdBN0FFY0FVd0JiQUlSQU93RmNYRUJkSkZoVU1DUWVFZ1lBU0FROFRnUkNOZ1FxR0FVaEhCUURCUXd6QlMxTEJVVlJCVDg1QlNkV0JWb1FDQ0VuV2dGRkFpMERBU3BHZGk4M0dBQS9Qejh2THp3OEVQMFEvUy85RVAwUS9TLzlQRHdRL1FFdi9TLzlMLzB1TGk0dUxpNHVMZ0F4TUFGSmFMa0FLZ0JjU1doaHNFQlNXRGdSTjdrQVhQL0FPRmtCRkFZaklpWTFORE15RkJZek1qWTBNeklIRkNNaU5DWWpJZ1lVSXlJMU5EWXpNaFlURkFZaklpWTFORFl6TWhZSE5DWWpJZ1lWRkJZek1qWW5GQVlqSWlZMU5EWXpNaFlITkNZaklnWVZGQll6TWpZbkZDTWlOVFF6TWdHdE5DVWxOQlFVSFJRVUhSUVUwQk1VSFJRVUhSUVVOQ1VsTStKN1YxZDZlbGRYZXloa1JrWmpZMFpHWkM1SU5EUkpTVFEwU0NjeUl5TXlNaU1qTWpjZUhoNGVBajRsTkRRbEZDZ2RIU2hZRkNnZEhTZ1VKVFEwL3FaWGUzdFhWM3Q3VjBaa1kwZEdaR1JHTkVsSk5EUkpTVFFqTWpJakl6SXlJeDBkSFFBTEFCMy84d0hBQXlFQUN3QVhBQ01BTHdBN0FFY0FUd0JYQUdNQWJ3QjNBS0pBVFFGNGVFQjVHSFJ3TmpBcUpCSU1CZ0E4QkJocUJGNWtCRmhDQkI1UVNBUlVURklGVmtvRlRpY0ZDVE1GRlFNRkxROEZPVDhGSVdjRllVVUZHMjBGVzNJRmRna2JkZ0ZoQWlFREFSNUdkaTgzR0FBL1B6OHZMeEQ5TC8wUS9SRDlFUDB2L1MvOUwvMFEvUy85TC8wQkx6ejlQQy85TC8wdi9TLzlMaTR1TGk0dUxpNHVMZ0F4TUFGSmFMa0FIZ0I0U1doaHNFQlNXRGdSTjdrQWVQL0FPRmtCRkFZaklpWTFORFl6TWhZSEZBWWpJaVkxTkRZek1oWVRGQVlqSWlZMU5EWXpNaFlETkNZaklnWVZGQll6TWpZSE5DWWpJZ1lWRkJZek1qWVROQ1lqSWdZVkZCWXpNallERkNNaU5UUXpNZ2NVSXlJMU5ETXlFeFFHSXlJbU5UUTJNeklXQnpRbUl5SUdGUlFXTXpJMkp4UWpJalUwTXpJQlNEUWxKVFEwSlNVMEFUUWtKVFEwSlNRMGVYdFdWM3Q3VjFaN29CMFVGQjRlRkJRZEFSMFRGQjRlRkJRY2VXTkdSbVJrUmtaamxSUVVGQlFCRXhRVUUybEpNelJKU1RRelNTZ3hJeU15TWlNak1UY2RIaDRkQXNrbE5UUW1KVE16NnlVME5DVWxORFQrblZkN2UxZFhlM3NCclJRY0hCUVVIaDZ5RkIwZEZCUWRIZjdXUm1SalIwWmtaQUpLRkJRVDJSUVVFLzZ2TkVsSk5EUkpTVFFqTWpJakl6SXlJeDBkSFFBR0FBMy80QUhaQWFzQURRQW5BRFVBVHdCZEFHc0Fka0F4QVd4c1FHME1hRk5NUHlzZkVnTnFZMXhWU2owMExSMFFEQVZHQkRZWkJDTVdCU1pEQlRrS1lWb0JNZ0ltQXdGalJuWXZOeGdBUHo4L0x5OHYvUkQ5QVMvOUwvMHVMaTR1TGk0dUxpNHVMaTRBTGk0dUxpNHVMaTR4TUFGSmFMa0FZd0JzU1doaHNFQlNXRGdSTjdrQWJQL0FPRmtCQndZaklqVTBQd0UyTXpJVkZBY1dGUlFqSWljbUl5SUdGUlFYRmhVVUl5SW5KalUwTmpNeUR3RUdJeUkxTkQ4Qk5qTXlGUlFYRkFZaklpY21OVFF6TWhjV016STJOVFFuSmpVME16SVhGZzhCQmlNaU5UUS9BVFl6TWhVVUR3RUdJeUkxTkQ4Qk5qTXlGUlFCMDM0R0NCVUdmZ1lJRllnTEZBUUZKaVpHWkJJQ0ZBc0dGM3RYTVF5Q0JnZ1ZCb01IQnhTbWUxWXhMZ3NUQlFVbEtFWmpFZ01WQ3dZWFhIOEdDQlFHZmdZSUZjRjlCZ2dWQm4wR0NCVUJpWDRHRkFnR2ZnWVVDQThHQ3hRQ0VtTkhKeVlGQkJNTEt6TlhlM1dEQmhVSUJvSUhGUWhqVjNzWEJnc1VBaEprUmlzaEJRVVVDeXN2ZmdZVUNBWi9CaFVJYlgwR0ZBZ0dmUVlVQ0FBQUJnQVAvL01CVmdLbEFBMEFHd0FwQUVFQVZRQnBBSDFBTkFGcWFrQnJWR1plVWtvbklCSUxCR2hVU0NVZUZ4QUpBajA4QkVFcU5qVUVYREV3T1FVdFRnVkVZZ1ZZR1ZnL013TUJGMFoyTHpjWUFEODhMeThRL1MvOUwvMEJMenc4L1R3dlBQMDhMaTR1TGk0dUxpNHVBQzR1TGk0dUxpNHVMakV3QVVsb3VRQVhBR3BKYUdHd1FGSllPQkUzdVFCcS84QTRXUUVXRlJRaklpOEJKalUwTXpJWEJ4WVZGQ01pTHdFbU5UUXpNaDhCRmhVVUl5SXZBU1kxTkRNeUh3RVVCaU1pSmowQk5ETXlIUUVVRmpNeU5qMEJORE15RlFjR0l5SW5KalUwTXpJWEZqTXlOell6TWhVVUJ3WWpJaWNtTlRRek1oY1dNekkzTmpNeUZSUUJBUVlVQ0FaSEJoVUhCak1HRkFjSFZnWVVDQWFZQnhZSUJrZ0dGQWdIMGxrL1Axa1VGRUl1TGtJVUZBVThWRkkvQnhNSEJqVkRSRE1HQnhRTFEwcExRd3NVQlFVNVFqNCtCUVFUQWdrR0NCVUdSZ1lJRlFZR0JnZ1ZCMVlHQ0JRRzBBWUlGUVpIQmdnVUJ1by9XbG8vUmhRVVJpOUNReTVHRkJUN016UUdDUlFGS2lrRkZBbG5JaU1HQ3hVREhoNENGUXNBQmdBbC8vTUJhQUtrQUEwQUd3QXBBRUVBVlFCcEFIMUFOUUZxYWtCckRHWmVVa29tSHhnUkEyZ29JUm9UREFVMk5RUmNTREVETUQwOEJGUkJLamtGTFU0RlJHSUZXQXBZUHpNREFUQkdkaTgzR0FBL1BDOHZFUDB2L1MvOUFTODhQUDA4THhjOC9Ud3VMaTR1TGk0dUFDNHVMaTR1TGk0dUxqRXdBVWxvdVFBd0FHcEphR0d3UUZKWU9CRTN1UUJxLzhBNFdRRUhCaU1pTlRRL0FUWXpNaFVVRHdFR0l5STFORDhCTmpNeUZSUVhCd1lqSWpVMFB3RTJNeklWRkJjVUJpTWlKajBCTkRNeUhRRVVGak15TmowQk5ETXlGUWNHSXlJbkpqVTBNeklYRmpNeU56WXpNaFVVQndZaklpY21OVFF6TWhjV016STNOak15RlJRQllsY0dDQlVHVndZSUZaQkdCZ2dWQmtZR0J4WXpSd1lJRkFaR0JnZ1ZQbG8rUDFrVUUwTXVMa0lVRkFVOFZGTS9CeFFIQmpSRVJETUdCeE1LUTBwTVF3c1VCUVU0UkQ0OUJRUVVBb0pYQmhVSUJsWUdGQWhYUndZVkNBWkhCaFlIUDBZR0ZRZ0dSZ1lWQ05NL1dsby9SaFFVUmk1RFF5NUdGQlQ3TXpRR0NCVUZLaWtGRkFsbklpTUdDeFVESGg0Q0ZRc0FCUUFrLy9NQlZ3S0ZBQk1BSndBL0FGTUFad0I5UURVQmFHaEFhUkpsWGx0WVMwaEZKQndRQ0dCV1RVTVNPem9FUHlZb05ETUVMeG9HQXk0M0JTc2dCUllNQlFKU0FqMHhBd0V1Um5Zdk54Z0FQend2THhEOUwvMHYvUUV2Rnp6OVBDODhQUDA4TGk0dUxpNEFMaTR1TGk0dUxpNHVMaTR4TUFGSmFMa0FMZ0JvU1doaHNFQlNXRGdSTjdrQWFQL0FPRmtsQmlNaUp5WTFORE15RnhZek1qYzJNeklWRkNjR0l5SW5KalUwTXpJWEZqTXlOell6TWhVVUp4UUdJeUltUFFFME16SWRBUlFXTXpJMlBRRTBNeklWQXhjV0ZSUWpJaThCQndZaklqVTBQd0UyTXpJWEZoVVVJeUl2QVFjR0l5STFORDhCTmpNeUZ3Rk1RMHBMUXdzVUJRVTRRejQ5QlFRVUNEeFVVejhIRkFjR05VTkVNd1lIRXdKYVBqOVpGQlJDTGk1Q0ZCU0lVd2NWQ0FaSVNBWUlGUVpYQmdnS1d3Y1ZDQVpKU0FZSUZRWlhDQWNJQnhVaUl3WUxGUU1lSGdJVkMxc3pOQVlJRlFVcUtRVVVDYTgvV2xvL1JoUVVSaTlDUXk1R0ZCUUJDMU1IQ0JRR1NFZ0dGUWdHVmdhMkJ3Z1VCa2hJQmhVSUJsWUhDUUFKQUNYLzlBRlpBdFVBQ3dBWEFDOEFRd0JYQUdNQWJ3QjNBSDhBb2tCTEFZQ0FRSUZDVkV4QU9GWkNObmh3Qkh4MFpGZ0VEQUFyS2dRdkdHcGVCQklHSkNNRVNoOGVXd1VKY2dWMkF3Vmhad1VWZWdWK0R3VWhKd1ViUEFVeVVBVkdDVVp0TFNFREFSNUdkaTgzR0FBL1BEd3ZMeEQ5TC8wdi9SRDlMLzB2L1MvOUwvMFEvUUV2UER6OVBDODgvVHd2UFAwOEx6ejlQQzg4L1R3dUxpNEFMaTR1TGpFd0FVbG91UUFlQUlCSmFHR3dRRkpZT0JFM3VRQ0EvOEE0V1FFVUJpTWlKalUwTmpNeUZoVVVCaU1pSmpVME5qTXlGaGNVQmlNaUpqMEJORE15SFFFVUZqTXlOajBCTkRNeUZRY0dJeUluSmpVME16SVhGak15TnpZek1oVVVCd1lqSWljbU5UUXpNaGNXTXpJM05qTXlGUlFETkNZaklnWVZGQll6TWpZVk5DWWpJZ1lWRkJZek1qWW5GQ01pTlRRek1oVVVJeUkxTkRNeUFSYzFKU1UwTkNVbU5EVWxKVFEwSlNVMVAxby9QMWtVRkVJdUwwSVVGQVZBVUZNL0J4TUhCalJGUVRVR0J4VUxRVXhPUVFzVUJRVTNSVVEyQlFVVWFoMFZGQjBkRkJVZEhSVVVIUjBVRlIwZUZCTVRGQlFURXhRQ2V5VTBOQ1VsTlRUckpUUTBKU1UwTkxBL1dWay9SaFFVUmk1Q1FpNUdGQlQ4TWpRR0NSUUZLaW9GRmdsbElpSUdDeFVESFIwREZRc0NYeFFlSGhRVUhSMnhGQjBkRkJRZEhka1VGQlRaRkJRVUFBQUJBQ1gvZFFFSUFZc0FOd0J6UURBQk9EaEFPU1EwTXpZcUlpQWVDQUlSRUFRV0ZUQUVKQXdFSEJBUEJSZ0dCUVVLTFN3Rkp4TW9Kd0FaR0FNQkZVWjJMemNZQUQ4OFB6d3ZFUDA4TC8wOEVQMDhBUy85TC8wdlBQMDhMaTR1TGk0dUxnQXVMakV3QVVsb3VRQVZBRGhKYUdHd1FGSllPQkUzdVFBNC84QTRXVGN5TlRRbUt3RWlOVFF6TWpVMEppc0JFUlFqSWpVUk5Ec0JNaFlWRkFjV0ZSUUhGaFVVQmlzQklqVTBPd0V5TmpVMEppc0JJalUwZlV3ZEZSa1RFek1YRHo4VEZCUlNJUzBVS3g0Mk9pc2xFeE1sR1NRa0dTWVRzaWNTRmhRVUhRd1IvaVlVRkFIdUZDa2NGUlFXTGhzV0dUWWxOQlFVSEJVVkhSUVRBQWNBRVAvMEFic0NRUUFOQUJzQUtRQXpBRDBBU1FCVkFIVkFNQUZXVmtCWEtqczJNU3duSUJJTEJDVWVGeEFKQWk4dUJETXFPVGdFUFRSS0JENVFCRVJIQlUxVEJVRVpRUUZFUm5Zdk54Z0FMeThRL1MvOUFTLzlMLzB2UFAwOEx6ejlQQzR1TGk0dUxnQXVMaTR1TGk0dUxpNHhNQUZKYUxrQVJBQldTV2hoc0VCU1dEZ1JON2tBVnYvQU9Ga0JGaFVVSXlJdkFTWTFORE15RndjV0ZSUWpJaThCSmpVME16SWZBUllWRkNNaUx3RW1OVFF6TWhjQkZDTWlQUUUwTXpJVkJ4UWpJajBCTkRNeUZRY1VCaU1pSmpVME5qTXlGZ2MwSmlNaUJoVVVGak15TmdFbkJoUUlCa1lHRkFnR013WVZDQVpXQmhVSUJwY0dGQWdIUndZVkNBWUJFeE1VRkJORkZCUVVGRGxaUGo1WVdUMCtXU2hCTGkxQlFTMHVRUUdrQmdnVkJrY0dDQlFHQmdZSUZRWlhCZ2dWQnRFR0NCUUdSZ1lJRlFiK1l4TVQ3UlFVN1JNVDdSUVVkajVaV1Q0K1dGZytMVUZCTFM1QlFRQUFCd0FVLy9RQnZ3SkJBQTBBR3dBcEFETUFQUUJKQUZVQWRVQXdBVlpXUUZjcU96WXhMQ1lmR0JFREtDRWFFd3dGTHk0RU15bzVPQVE5TkVvRVBsQUVSRWNGVFZNRlFRcEJBVVJHZGk4M0dBQXZMeEQ5TC8wQkwvMHYvUzg4L1R3dlBQMDhMaTR1TGk0dUFDNHVMaTR1TGk0dUxqRXdBVWxvdVFCRUFGWkphR0d3UUZKWU9CRTN1UUJXLzhBNFdRRUhCaU1pTlRRL0FUWXpNaFVVRHdFR0l5STFORDhCTmpNeUZSUW5Cd1lqSWpVMFB3RTJNeklWRkJNVUl5STlBVFF6TWhVSEZDTWlQUUUwTXpJVkJ4UUdJeUltTlRRMk16SVdCelFtSXlJR0ZSUVdNekkyQVU5V0JnZ1VCbFlHQ0JSVlJ3WUhGZ1pIQmdnVlFVWUdDQlFHUmdZSUZQUVRGQlFUUlJRVUZCUTVXVDQrV0ZrOVBsa29RUzR0UVVFdExrRUNIbGNHRkFnSFZ3WVZDSkJHQmhZSEJrWUdGUWcwUndZVkNBWkdCaFFJL2tBVEUrMFVGTzBURSswVUZIWStXVmsrUGxoWVBpMUJRUzB1UVVFQUJnQVMvL1FCdmdJcEFBc0FGd0FoQUNzQVFBQlVBSDlBTlFGVlZVQldJbEJOU2tOQlBEazJLU1FmR2xKSVJFTStOREFuSmdRckloMGNCQ0VZQUFRTUJnUVNBd1VWQ1FVUE1Dd1BBUkpHZGk4M0dBQXZMendRL1MvOUFTLzlMLzB2UFAwOEx6ejlQQzR1TGk0dUxpNEFMaTR1TGk0dUxpNHVMaTR1TVRBQlNXaTVBQklBVlVsb1liQkFVbGc0RVRlNUFGWC93RGhaSlRRbUl5SUdGUlFXTXpJMk54UUdJeUltTlRRMk16SVdGeFFqSWowQk5ETXlGUmNVSXlJOUFUUXpNaFVCTmhjbUZSWVhGaFVVSXlJdkFRY0dJeUkxTkRjWE5oY1ZGaGNXRlJRaklpOEJCd1lqSWpVME53RVhRUzB1UVVFdUxVRW9XRDQrV1ZrK1BsZzZGQlFVRkVVVUZCUVUvdHdQRGdFRFZBWVVDQWRIU1FjSUV3WldEdzREVkFZVUNBZElTUWNJRXdhTExVRkJMUzVCUVM0K1dWaytQbGhZdFJNVDdSUVU3Uk1UN1JRVUFSa1BEd0VCQVZZR0NCVUhTRWNHRkFnR0JBOFBBUUZVQmdnVUJrZEhCaFFJQmdBQUJnQVIvL1FCdXdHMUFCRUFHd0F0QURjQVF3QlBBSHhBTlFGUVVFQlJBRFV3R1JRb0hBWVhGZ1FiRWdCRUJEZ3pNZ1EzTGo0RVNpSUZDQ1llQXdVTVJ3VkJUUVU3S3hBSU93d0RBVDVHZGk4M0dBQS9MeTg4UEJEOUwvMFEvVHc4RVAwQkwvMHZQUDA4TC8wdlBEejlQQzR1TGdBdUxpNHVNVEFCU1dpNUFENEFVRWxvWWJCQVVsZzRFVGU1QUZEL3dEaFpBUlFHSXlJbU5UUXpNaFFXTXpJMk5ETXlFUlFqSWowQk5ETXlGU2NVSXlJMEppTWlCaFFqSWpVME5qTXlGaE1VSXlJOUFUUXpNaFVIRkFZaklpWTFORFl6TWhZSE5DWWpJZ1lWRkJZek1qWUJ1elFsSlRRVUZCMFVGQjRVRXhNVUZCUFBFeFFlRkJRZEZCUTBKU1UwaWhRVUZCUTVXRDQrV0ZnK1BsZ29RQzR1UUVBdUxrQUJvU1UwTkNVVUtCMGRLUDVmRXhQdEZCUmJFeWNkSFNjVEpUUTAvcE1URSswVUZIWStXVmsrUGxoWVBpMUJRUzB1UVVFQUFBZ0FFZi8wQWJ3Q2xBQUxBQlVBSVFBckFEY0FRd0JQQUZzQWhVQTdBVnhjUUYwTUtTUVREaEVRQkJVTUp5WUVLeUpRQkN3V0FBUkVPRW8rQkJ3R1ZnUXlBd1ZCT3dVSlJ3VWZHUVZOTlFWVFdRVXZDUzhCTWtaMkx6Y1lBQzh2RVAwdi9TLzlMLzBRL1MvOUFTLzlMeno5UEM4OC9Ud3YvUzg4L1R3dlBQMDhBQzR1TGk0eE1BRkphTGtBTWdCY1NXaGhzRUJTV0RnUk43a0FYUC9BT0ZrVEZBWWpJaVkxTkRZek1oWVRGQ01pUFFFME16SVZKeFFHSXlJbU5UUTJNeklXRXhRaklqMEJORE15RlFjVUJpTWlKalUwTmpNeUZnTTBKaU1pQmhVVUZqTXlOaFUwSmlNaUJoVVVGak15TmhjMEppTWlCaFVVRmpNeU52Y3ZJU0V1TGlFaEw4VVVGQlFVeFM0aUlTNHVJU0l1Z0JRVUZCUTVXVDQrV0ZnK1BsbHZGeEVRRnhjUUVCZ1lFQkFYRnhBUkYwZEJMaTFCUVMwdVFRSkVJQzR1SUNFdkwvMnZFeFB0RkJTTElpNHVJaUF2THY1bkV4UHRGQlIyUGxsWlBqNVlXQUY3RVJjWUVCQVhGNmdRRnhjUUVSY1g4QzFCUVMwdVFVRUFCZ0FTLy9RQnZRSGJBQWtBRlFBZkFDc0FOd0JEQUhOQU1RRkVSRUJGQUIwWUJ3STRCQ0ErQkNZRkJBUUpBQnNhQkI4V0NnUXNNZ1FRTHdVVERRVTFPd1VwUVFVakV5TUJKa1oyTHpjWUFDOHZFUDB2L1MvOUVQMEJMLzB2L1M4OC9Ud3ZQUDA4TC8wdi9RQXVMaTR1TVRBQlNXaTVBQ1lBUkVsb1liQkFVbGc0RVRlNUFFVC93RGhaSlJRaklqMEJORE15RlNjVUJpTWlKalUwTmpNeUZoTVVJeUk5QVRRek1oVUhGQVlqSWlZMU5EWXpNaFluTkNZaklnWVZGQll6TWpZWE5DWWpJZ1lWRkJZek1qWUJ2UlFVRkJURkxpSWhMaTRoSWk2QUZCUVVGRHBZUGo1WVdENCtXRzRZRUJBWEZoRVJGMGRCTGk1QlFTNHVRUlFURSswVUZJc2lMaTRpSUM4dS9tY1RFKzBVRkhZK1dWaytQbGhZd3hBWEZ4QVJGeGZ3TFVGQkxTNUJRUUFBQlFBVi8vTUREUUVnQUFrQUV3QXpBRDBBWFFDRVFEZ0JYbDVBWHdoYVREczJNQ0pjU2pJZ0VnMElBeWtFR1QwMEJEazRVd1JEQVFBRkJnVlFKZ1VjRUE4RkN3b3NWZ1ZBUmh3V1FBRkRSbll2TnhnQUx6d3ZQQkQ5UEM4OC9Ud1EvVHd2UFAwOEFTLzlMeno5UEMvOUxpNHVMaTR1TGk0QUxpNHVMaTR1TVRBQlNXaTVBRU1BWGtsb1liQkFVbGc0RVRlNUFGNy93RGhaSlNFaU5UUXpJVElWRkFjaElqVTBNeUV5RlJRSEJpTWlKalUwTmpNeUZ4WVZGQ01pSnlZaklnWVZGQll6TWpjMk16SVZGQVVVSXlJOUFUUXpNaFVIQmlNaUpqVTBOak15RnhZVkZDTWlKeVlqSWdZVkZCWXpNamMyTXpJVkZBTDUvdGNURXdFcEZCVCsxeE1UQVNrVWt5dERQMWhZUHpncEJ4UUdCaDhwTGtGQkxqQWhCZ2dVL3RrVUZCUVVTeW80UGxoWVBqb29CeFVIQmgwcUxrQkFMaW9kQmdnVW5oUVRFeFJGRkJRVUZEVXdXRDQrV0NRR0NSUUZHa0F1TGtBakJoUUhGaE1UN0JRVTZDVlpQajVZSkFjSUZnWWJRUzB1UVJzR0ZRa0FBQVFBRmY5cUFyZ0JTQUFIQUUwQVd3QnBBSXBBUEFGcWFrQnJIRFFzSGhZU0NHWmNXbEJPUGpZdUpSeEhCRGdFQkFCVkJHaGhCQTFBQmdVQ1JBVTdYbElpQlJCa1dDZ0ZDakk3R0JRUUFnRU5Sbll2TnhnQVB6dzhMeTg4L1R3OEVQMDhQQkQ5TC8wOEFTLzlMLzB2L1MvOUxpNHVMaTR1TGk0dUxnQXVMaTR1TGk0eE1BRkphTGtBRFFCcVNXaGhzRUJTV0RnUk43a0Fhdi9BT0ZrRkZDTWlOVFF6TWljR0l5SW1OVFEyTXpJWE5qTXlGell6TWhjV0ZSUWpJaWNtSXlJR0ZSUVdNekkzTmpNeUZSUUhCaU1pSndZSEZoVVVCaU1pSmpVME16SVVGak15TmpVMEppTWlKeVkzTkRjbUl5SUdGUlFXTXpJM0ppY21JeUlHRlJRV016STNKalUwQVpBVUZCUVVjaW8wUjJSa1J6UW9LVFkxS0NrMlJqVUdGQWdHSnpnMlRVMDJPQ2NHQ0JRR05rVXpMQThPR2pRbEpUUVVFeDRVRkIwZEZBVUNNRWN0R2lRMlRFdzJJeHN0anhzaU5rMU5OaUliTEQwVUZCTTZIR1JHUm1RZEhSMGROUVlJRXdZb1RUVTJUU2tHRkFjR05oMEtCUm9rSlRRekpoTW5IaDRVRkJ3QkFxaENNQkJOTlRaTUR6QzFFRTAxTmt3UE1VSkJBQVlBRnYvekFhNENRUUFOQUJzQUtRQXpBRDBBWFFCNFFERUJYbDVBWHpKYVRDY2dFZ3NFWEVvOE56SXRKUjRYRUFrQ1V3UkRNQzhGS3lwR0JWQTZPUVUxTkZZRlFCbEFBVU5HZGk4M0dBQXZMeEQ5THp6OVBDLzlMeno5UEFFdi9TNHVMaTR1TGk0dUxpNHVMZ0F1TGk0dUxpNHVNVEFCU1dpNUFFTUFYa2xvWWJCQVVsZzRFVGU1QUY3L3dEaFpBUllWRkNNaUx3RW1OVFF6TWhjSEZoVVVJeUl2QVNZMU5ETXlId0VXRlJRaklpOEJKalUwTXpJWEV5RWlOVFF6SVRJVkZBY2hJalUwTXlFeUZSUUhCaU1pSmpVME5qTXlGeFlWRkNNaUp5WWpJZ1lWRkJZek1qYzJNeklWRkFFc0JoUUlCMFlHRkFnSE13WVZDQVpXQmhRSUJwZ0hGQWdIU0FjV0NBYnQvdGdURXdFb0ZCVCsyQk1UQVNnVWt5eENQbGxaUGprcEJ4UUhCaUltTGtGQkxqQWhCZ2dVQWFRR0NCVUhSZ1lJRlFjRkJnZ1ZCbFlHQ0JVRzBRY0lFd1pHQmdnVkJ2N3RGQk1URkVZVUZCUVVOREZaUGo1WUpBWUpGUVViUVMwdVFTUUdGQWNBQUFZQUZmL3pBYTBDUHdBTkFCc0FLUUF6QUQwQVhRQjRRREVCWGw1QVh6SmFUQ1lmR0JFRFhFbzhOekl0S0NFYUV3d0ZVd1JETUM4Rkt5cEdCVkE2T1FVMU5GWUZRQXBBQVVOR2RpODNHQUF2THhEOUx6ejlQQy85THp6OVBBRXYvUzR1TGk0dUxpNHVMaTR1TGdBdUxpNHVMaTR1TVRBQlNXaTVBRU1BWGtsb1liQkFVbGc0RVRlNUFGNy93RGhaQVFjR0l5STFORDhCTmpNeUZSUVBBUVlqSWpVMFB3RTJNeklWRkJjSEJpTWlOVFEvQVRZek1oVVVGeUVpTlRReklUSVZGQWNoSWpVME15RXlGUlFIQmlNaUpqVTBOak15RnhZVkZDTWlKeVlqSWdZVkZCWXpNamMyTXpJVkZBRlNWd1lJRlFaWEJnZ1ZrRVlHQ0JVR1JnWUhGak5IQmdnVUJrY0dCeFdTL3RnVEV3RW9GQlQrMkJNVEFTZ1VreXhDUGxsWlBqb29CeFFIQmlFbkxrRkJMaThpQmdnVUFoMVhCaFFJQmxjR0ZBaFhSd1lWQ0FaSEJoWUhQMFlHRkFnR1J3WVZDUHNVRXhNVVJoUVVGQlEwTVZrK1BsZ2tCZ2tWQlJ0QkxTNUJKQVlVQndBRkFCWC84d0d0QWg4QUh3QXBBRE1BUndCWkFIcEFNZ0ZhV2tCYktGbFhVazlNUHp3NUhBNVVTa0UzTWkwb0l4NE1GUVFGTUM4Rkt5b1NCUWdtSlFVaElCZ0ZBa1lDQVFWR2RpODNHQUF2THhEOUx6ejlQQy85THp6OVBBRXYvUzR1TGk0dUxpNHVMaTRBTGk0dUxpNHVMaTR1TGpFd0FVbG91UUFGQUZwSmFHR3dRRkpZT0JFM3VRQmEvOEE0V1NVR0l5SW1OVFEyTXpJWEZoVVVJeUluSmlNaUJoVVVGak15TnpZek1oVVVOeUVpTlRReklUSVZGQ2NoSWpVME15RXlGUlFERnhZVkZDTWlMd0VIQmlNaU5UUS9BVFl6TWhjV0ZSUWpJaThCQndZaklqVTBQd0UyRndFYUxFSStXVmsrT2lnSEZBY0dJU2N1UVVFdUx5SUdDQlI2L3RnVEV3RW9GQlQrMkJNVEFTZ1U4Rk1HRkFnR1NFZ0dDQlVHVndZSUNsc0dGUWdHU0VnR0NCVUdWeEVNSkRGWlBqNVlKQVlKRlFVYlFTMHVRU1FHRkFjdUZCUVVGRVlVRXhNVUFYaFRCZ2dWQmtoSUJoVUlCbFlHdGdZSUZRWklTQVlWQ0FaV0VCQUFCdisyLzdvQXNnSkdBQTBBR3dBcEFEVUFQd0JMQUdaQUtBRk1URUJOS2owbklCSUxCQ1VYRUFsQUJBSXFPem9FUHpZZVJnUXdRd1V6U1FVdEdUZ0JGMFoyTHpjWUFDOHZMLzB2L1FFdi9TODhQUDA4THp6OUxpNHVMZ0F1TGk0dUxpNHhNQUZKYUxrQUZ3Qk1TV2hoc0VCU1dEZ1JON2tBVFAvQU9Ga1RGaFVVSXlJdkFTWTFORE15RndjV0ZSUWpJaThCSmpVME16SWZBUllWRkNNaUx3RW1OVFF6TWg4QkZBWWpJaVkxTkRZek1oWURGQ01pUFFFME16SVZOelFtSXlJR0ZSUVdNekkycWdZVkNBWkhCaFVJQmpNR0ZRZ0dWd1lVQ0FlWUJoVUlCa2NHRkFnR2lTNGhJaTR1SWlFdU94UVVGQlFURnhBUkZ4Y1JFQmNCcVFZSUZRWkhCZ2dWQmdZR0NCVUdWd1lJRkFiUUJnZ1ZCa2NHQ0JVRzRDRXVMaUVoTGk3KzFoUVVpeFFVZmhBWEZ4QVJGaGNBQUFZQUZQKzZBUTRDUlFBTkFCc0FLUUExQUQ4QVN3Qm1RQ2dCVEV4QVRRdzlKaDhZRVFNb0dnd0ZRQVFxUHpZRU95RTZSZ1FUTUVNRk0wa0ZMUW80QVRCR2RpODNHQUF2THkvOUwvMEJMeno5THp3OC9Ud3YvUzR1TGk0QUxpNHVMaTR1TVRBQlNXaTVBREFBVEVsb1liQkFVbGc0RVRlNUFFei93RGhaQVFjR0l5STFORDhCTmpNeUZSUVBBUVlqSWpVMFB3RTJNeklWRkJjSEJpTWlOVFEvQVRZek1oVVVCeFFHSXlJbU5UUTJNeklXQXhRaklqMEJORE15RlRjMEppTWlCaFVVRmpNeU5nRUlWZ1lJRkFaV0JnZ1VqMFlHQ0JVR1JnWUlGVE5HQmdnVkJrWUdDQlVNTGlBaUxpNGlJQzQ3RXhRVUV4UVhFQkVYRnhFUUZ3SWlWZ1lWQ0FaV0JoVUlWVWNHRkFnR1J3WVZCMEZGQmhVSUJrVUdGUWpISVM0dUlTRXVMdjdXRkJTTEZCUitFQmNYRUJFV0Z3QUYvL2ovdWdETkFpWUFDd0FYQUNFQU5nQkpBR3RBS3dGS1NrQkxKMGhHUVQ0N01Da2ZRemt5SndBRURDRVlCQjBjQmdRU0F3VVZDUVVQTFFVaUlob0JNa1oyTHpjWUFDOHZFUDB2L1MvOUFTLzlMeno5UEMvOUxpNHVMZ0F1TGk0dUxpNHVMakV3QVVsb3VRQXlBRXBKYUdHd1FGSllPQkUzdVFCSy84QTRXVGMwSmlNaUJoVVVGak15TmpjVUJpTWlKalUwTmpNeUZnTVVJeUk5QVRRek1oVURNaDhCRmhVVUl5SW5KaWNIQmlNaU5UUS9BVFlYRmhVVUl5SXZBUWNHSXlJMU5EOEJOaGNXaWhjUUVSY1hFUkFYS0M0aElpNHVJaUV1T3hRVUZCUVZDUVpXQmhVSUJpTWxTQVlJRkFaV0JXNEdGUWdHUjBrR0NCUUdWZzBPRXRjUUZ4Y1FFUllYRUNFdUxpRWhMaTcrMWhRVWl4UVVBYzBHVndZSUZRWWxKRWdHRlFnR1ZnYTNCZ2dWQmtsSUJoVUlCbFlORFJFQUFBWUFIUUFCQWNFQndnQVJBQnNBSlFBdkFFRUFad0NjUUVZQmFHaEFhVjVnV1ZGRktDTVpOakFNQUdJRVhoY1dCQnNTU0VjRVEwSWxIQVFoSUU5T0JGUlRMeVlFS3lwbFN3VmJWd1lGRHdvQ013VThRRGdQSGhROEF5MENBU3BHZGk4M0dBQS9QeTg4THp3OEVQMDhQQkQ5THp6OVBBRXZQUDA4THp6OVBDODgvVHd2UFAwOEx6ejlQQy85TGk0dUxnQXVMaTR1TGk0dU1UQUJTV2k1QUNvQWFFbG9ZYkJBVWxnNEVUZTVBR2ovd0RoWkV4UWpJalFtSXlJR0ZDTWlOVFEyTXpJV0V4UWpJajBCTkRNeUZRY1VJeUk5QVRRek1oVUhGQ01pUFFFME16SVZKUlFHSXlJbU5UUXpNaFFXTXpJMk5ETXlCeFVVSXlJOUFUUW1JeUlHSFFFVUl5STlBVFEyTXpJWE5qTXlGaFVVSXlJMU5DWWpJZ2JtRkJRZUZCVWRGQlExSlNVMWpCUVVGQlNnRkJRVUZJMFVGQlFVQVhJMEpTVTFGQlFkRlJRZUZCT1hFeFVrRmhrakZCUTdLUzRnR3pjb094UVVKQmNaSlFGb0V5Z2RIU2dUSmpRMS9vY1RFNThVRko4VEU1OFVGQk1URTU4VUZHOG1ORFVsRkNrZEhTbjVEQk1UQ2hjbUpCZ0xFeE1MS1RvcUtrUXFFeE1hTFNNQUFBY0FBdi96QVVRQ1ZRQU5BQnNBS1FBMUFFRUFUUUJaQUhKQU1BRmFXa0JiS2ljZ0Vnc0VKUjRYQ1FJMkJDcE9CRUlRVkFSSVBBUXdNd1U1VVFWTFZ3VkZQd1V0R1MxTEFRRVhSbll2TnhnQVB5OHZFUDB2L1JEOUwvMEJMLzB2L1R3di9TLzlMaTR1TGk0QUxpNHVMaTR4TUFGSmFMa0FGd0JhU1doaHNFQlNXRGdSTjdrQVd2L0FPRmtURmhVVUl5SXZBU1kxTkRNeUZ3Y1dGUlFqSWk4QkpqVTBNeklmQVJZVkZDTWlMd0VtTlRRek1oY1RGQVlqSWlZMU5EWXpNaFlITkNZaklnWVZGQll6TWpZbkZBWWpJaVkxTkRZek1oWUhOQ1lqSWdZVkZCWXpNamIxQmhRSUJrY0dGQWdHTXdZVUNBWlhCaFVJQnBnR0ZBZ0hTQVlWQ0FiUFdENCtXRmcrUGxnb1FDNHVRRUF1TGtBYk1DTWpNREFqSXpBb0doRVNHUmtTRVJvQnR3WUlGQVpIQmdnVUJnWUhDQlFHVndZSUZRYlJCZ2dVQmtZR0NCVUcvc1UrV1ZrK1BsaFlQaTFCUVMwdVFVRXVJakV3SXlNd01DTVNHUmtTRWhrWkFBY0FHZi96QVZzQ1ZBQU5BQnNBS1FBMUFFRUFUUUJaQUhKQU1BRmFXa0JiRENZZkdCRURLQ0VhRXd4VUJFZzhCREEyQkNvRlRnUkNNd1U1VVFWTFZ3VkZQd1V0Q2kxTEFRRXdSbll2TnhnQVB5OHZFUDB2L1JEOUwvMEJMLzA4TC8wdi9TLzlMaTR1TGk0QUxpNHVMaTR4TUFGSmFMa0FNQUJhU1doaHNFQlNXRGdSTjdrQVd2L0FPRmtCQndZaklqVTBQd0UyTXpJVkZBOEJCaU1pTlRRL0FUWXpNaFVVRndjR0l5STFORDhCTmpNeUZSUVRGQVlqSWlZMU5EWXpNaFlITkNZaklnWVZGQll6TWpZbkZBWWpJaVkxTkRZek1oWUhOQ1lqSWdZVkZCWXpNallCVlZjSENCUUdWd1lJRlpCR0JnY1dCa1lHQ0JVelJ3WUlGQVpIQmdnVU8xZy9QVmhYUGo5WUtFRXVMVUZCTFM1Qkd6RWpJakF3SWlNeEtCb1NFaGtaRWhJYUFqRldCaFFJQmxjR0ZRaFdSd1lXQndaSEJoVUlQMFlHRkFnR1JnWVVDUDdjUGxsWlBqNVlXRDR0UVVFdExrRkJMaU13TUNNak1EQWpFaGtaRWhJWkdRQUFCZ0FYLy9NQlF3STBBQXNBRndBakFDOEFSQUJaQUhKQU1BRmFXa0JiQUZGTlNrTThPRFZUU0Q0ekpBUVlEQVFBS2dRZUVnUUdDUVVQSndVaExRVWJGUVVEV0FNaEFRRUdSbll2TnhnQVB5OHZFUDB2L1JEOUwvMEJMLzB2L1MvOUwvMHVMaTR1QUM0dUxpNHVMaTR4TUFGSmFMa0FCZ0JhU1doaHNFQlNXRGdSTjdrQVd2L0FPRmtsRkFZaklpWTFORFl6TWhZSE5DWWpJZ1lWRkJZek1qWW5GQVlqSWlZMU5EWXpNaFlITkNZaklnWVZGQll6TWpZREZ4WVZGQ01pTHdFR0J3WWpJalUwUHdFMk16STNGeFlWRkNNaUx3RUdCd1lqSWpVMFB3RTJNeklCUTFnK1BsaFlQajVZS0VBdUxrQkFMaTVBR3pBaklqRXhJaU13SnhvU0Voa1pFaElhRzFRR0ZRZ0dSeFExQmdnVkJsY0hDQW9HVkFZVkNBWkhGRFVHQ0JVR1Z3WUlDNG8rV1ZrK1BsaFlQaTFCUVMwdVFVRXVJakV4SWlNd01DTVNHUmtTRWhrWkFWbFVCZ2dVQmtjVE5BWVVDQVpYQjFCVUJnZ1VCa2NUTkFZVUNBWlhCZ0FHLys3Lzh3RndBYlFBRVFBakFDOEFPd0JIQUZNQWVFQTBBVlJVUUZVQVNEd2VFZ1lBTUFRa1RnUkNOZ1FxR0FVSUhCUURCUXd6QlMxTEJVVlJCVDg1QlNjaEVBZ25SUUVNQXdFZVJuWXZOeGdBUHo4dkx6dzhFUDB2L1JEOUwvMFEvVHc4RVAwQkwvMHYvUy85TGk0dUxpNHVBREV3QVVsb3VRQWVBRlJKYUdHd1FGSllPQkUzdVFCVS84QTRXUUVVQmlNaUpqVTBNeklVRmpNeU5qUXpNZ2NVSXlJMEppTWlCaFFqSWpVME5qTXlGaGNVQmlNaUpqVTBOak15RmdjMEppTWlCaFVVRmpNeU5pY1VCaU1pSmpVME5qTXlGZ2MwSmlNaUJoVVVGak15TmdGd05DVWxOUlFVSGhRVUhSUVV6eFFVSFJRVUhoUVVOU1VsTktOWVBqOVlXRDgrV0NoQkxTNUJRUzR0UVJ3d0lpTXhNU01pTUNjYUVSSWFHaElSR2dHZ0pUUTBKUlFvSFIwb1dSTW5IUjBuRXlVME5QWStXVmsrUGxoWVBpMUJRUzB1UVVFdUl6QXdJeU13TUNNU0dSa1NFaGtaQUFnQUdmL3pBVVlDandBTEFCY0FJd0F2QURzQVJ3QlRBRjhBZzBBN0FXQmdRR0VZVkVnMktoSUdQQVFZTUNRRURBQmFCRTVDQkI0bkJRa0RCUzB6QlJVUEJUa2hCVDlYQlZGZEJVdEZCUnNKRzFFQk9RSUJIa1oyTHpjWUFEOC9MeThRL1MvOUVQMHYvUkQ5TC8wdi9SRDlBUy85TC8wdlBQMDhMLzB1TGk0dUxpNEFNVEFCU1dpNUFCNEFZRWxvWWJCQVVsZzRFVGU1QUdEL3dEaFpFeFFHSXlJbU5UUTJNeklXRlJRR0l5SW1OVFEyTXpJV0V4UUdJeUltTlRRMk16SVdBelFtSXlJR0ZSUVdNekkyRlRRbUl5SUdGUlFXTXpJMkZ6UW1JeUlHRlJRV016STJKeFFHSXlJbU5UUTJNeklXQnpRbUl5SUdGUlFXTXpJMi95NGhJaTR1SWlFdUxpRWhMeThoSVM1SFdEOCtXRmcrUDFodkZ4QVJGeGNSRUJjWEVCQVlHQkFRRjBkQkxpMUJRUzB1UVJzeEl5SXhNU0lqTVNnYUVoSVpHUklTR2dKQUlTNHVJU0V1THRvaEx5OGhJUzR1L3VJK1dWaytQbGhZQVhnUUZ4Y1FFQmNYcVJBWEZ4QVFHQmp0TFVGQkxTNUJRUzRpTVRFaUl6QXhJaElaR1JJU0dSa0FCZ0FOLytZQlZnRXZBQTBBR3dBekFFRUFXUUJuQUhKQUxnRm9hRUJwREdSV1N6NDNLeUFSQTJaZlZFbEFPU2tlR2hNTUJWRUVRaVlFTHlNRk1rNEZSUXBkR0FFQlgwWjJMemNZQUQ4dkx5LzlMLzBCTC8wdi9TNHVMaTR1TGk0dUxpNHVMZ0F1TGk0dUxpNHVMaTR4TUFGSmFMa0FYd0JvU1doaHNFQlNXRGdSTjdrQWFQL0FPRmtCQndZaklqVTBQd0UyTXpJVkZBOEJCaU1pTlRRL0FUWXpNaFVVTnhZVkZDTWlKaU1pQmhVVUZoVVVJeUluSmpVME5qTXlGd2NHSXlJMU5EOEJOak15RlJRM0ZBWWpJaWNtTlRRek1oWXpNalkxTkNZMU5ETXlGeFlQQVFZaklqVTBQd0UyTXpJVkZBRlFWd2NJRkFkV0JnZ1ZrRVlHQ0JRR1JnWUlGQlFORXdZYUNDNUJCaFFPQlFkWlBoNHdSZ2NJRkFaR0J3Z1VRbGcrR2hRUEV3Y2NCeTFCQmhRT0JRZkJWd1lJRlFaWEJnZ1ZBUXhXQnhRSUIxY0dGUWhXUmdZVENBZEhCaFVJV0FVT0ZBVkFMUWNjQnhNUEZCbzlXSjVGQnhVSUJrVUdGQWdEUDFnSEJRNFVCa0V1QnhzSEV3OFVZbFlHRlFnR1ZnWVZDQUFBQmYvcC8vUUJEZ0l6QUEwQUd3QXBBRUVBVlFCdlFDd0JWbFpBVjFSU1NqOHpKeUFTQ3dRbEhoY1FDUUk5UEFSVVFTbzJOUVJJTVRBNUJTMU9CVVFaUkFFWFJuWXZOeGdBTHk4US9TLzlBUzg4UFAwOEx6dzgvVHd1TGk0dUxpNEFMaTR1TGk0dUxpNHVNVEFCU1dpNUFCY0FWa2xvWWJCQVVsZzRFVGU1QUZiL3dEaFpFeFlWRkNNaUx3RW1OVFF6TWhjSEZoVVVJeUl2QVNZMU5ETXlId0VXRlJRaklpOEJKalUwTXpJZkFSUUdJeUltUFFFME16SWRBUlFXTXpJMlBRRTBNeklWQndZaklpY21OVFF6TWhjV016STNOak15RlJUY0JoWUhCa1lHRlFnR05BWVZDQVpXQmhVSUJwY0dGQWdHU0FZVkNBYXdSREl5UlJRVUx5QWdMeFFUQ0RNN1BURUpGQVlGSlRNeUpnVUdGUUdXQmdjV0JrY0dDQlVHQmdZSUZRWldCZ2dWQnRFR0NCVUdSd1lJRlFicE1rVkZNa1FVRkVRaExpNGhSQlFVNlNFaEJnb1ZCQm9iQkJZS0FBQUZBQ0QvOUFGQUFqTUFEUUFiQUNrQVFRQlZBRzlBTEFGV1ZrQlhERkpLUHpNbUh4Z1JBelkxS0JvVERBVTlQQVJVUVNvaEJFZ3hNRGtGTFU0RlJBcEVBVEJHZGk4M0dBQXZMeEQ5TC8wQkx6dzgvUzg4UFAwOExpNHVMaTR1TGdBdUxpNHVMaTR1TGk0eE1BRkphTGtBTUFCV1NXaGhzRUJTV0RnUk43a0FWdi9BT0ZrQkJ3WWpJalUwUHdFMk16SVZGQThCQmlNaU5UUS9BVFl6TWhVVUp3Y0dJeUkxTkQ4Qk5qTXlGUlFURkFZaklpWTlBVFF6TWgwQkZCWXpNalk5QVRRek1oVUhCaU1pSnlZMU5ETXlGeFl6TWpjMk16SVZGQUU2VlFZSUZRWldCZ2dVVmtZR0NCVUdSZ1lJRlQ5R0JnZ1ZCa1lHQ0JWV1JUSXhSUlFVTGlBaExoUVVDRE04UERFSkV3WUdKakV5SndVR0ZBSVFWd2NXQ0FaWEJoUUlrVVlHRlFnR1JnWVZDRE5HQmhRSUJrY0dGUWorOVRKRlJUSkVGQlJFSVM0dUlVUVVGT2toSVFZS0ZRUWFHd1FXQ2dBQUJBQWUvL1FCRFFJYUFCY0FLd0E5QUZFQWQwQXdBVkpTUUZNcVRVcEhQVHMyTXpBb0lCVUpUMFZCUURndUV4SUVLaGNBREFzRUhnY0dEd1VESkFVYVFENGFBUVpHZGk4M0dBQXZMendRL1MvOUFTODhQUDA4THp3OC9Ud3VMaTR1TGk0QUxpNHVMaTR1TGk0dUxpNHVNVEFCU1dpNUFBWUFVa2xvWWJCQVVsZzRFVGU1QUZML3dEaFpKUlFHSXlJbVBRRTBNeklkQVJRV016STJQUUUwTXpJVkJ3WWpJaWNtTlRRek1oY1dNekkzTmpNeUZSUURGaFVVSXlJdkFRY0dJeUkxTkQ4Qk5oY25OaGNWRmhjV0ZSUWpJaThCQndZaklqVTBOd0VNUlRJeFJoUVVMeUFoTGhRVUNETThQVEVKRkFZRkpUTXhKd1lHRkJRR0ZBZ0dTVWdHQ0JRR1ZnNE9IQTRPQmxFR0ZBZ0dTVWdHQ0JVR3VqSkZSVEpFRkJSRUlTNHVJVVFVRk9raElRWUtGUVFhR3dRV0NnRkFCZ2dWQmtsSUJoVUlCbFlPRGxvT0RnRUZVUVlJRlFaSlNBWVZDQVlBQUFZQUgvLzBBUTRDWGdBTEFCY0FMd0JEQUU4QVd3Q0dRRHNCWEZ4QVhVSkFPQzBoS3lva0kwSXZHQVFBVUVRRURBQldTZ1FHRWdZRU5oOGVVd1VWUndVSkF3Vk5XUVVQSndVYlBBVXlDVElWQXdFZVJuWXZOeGdBUHk4dkVQMHYvUy85TC8wUS9SRDlBUzg4UFAwOEVQMDhMeno5UEJEOVBEd3VMaTR1QUM0dUxpNHhNQUZKYUxrQUhnQmNTV2hoc0VCU1dEZ1JON2tBWFAvQU9Ga1RGQVlqSWlZMU5EWXpNaFlWRkFZaklpWTFORFl6TWhZWEZBWWpJaVk5QVRRek1oMEJGQll6TWpZOUFUUXpNaFVIQmlNaUp5WTFORE15RnhZek1qYzJNeklWRkFNMEppTWlCaFVVRmpNeU5oVTBKaU1pQmhVVUZqTXlOdVV2SUNFdUxpRWhMaThnSVM0dUlTQXZKMFF5TWtVVUZDOGdJQzhVRXdnek96MHhDUlFHQlNVek1pWUZCaFZSRnhBUkZoY1FFQmNYRUJBWEZ4QVFGd0lPSVM0dUlTSXVMdG9oTHk4aElDNHV2REpGUlRKRUZCUkVJUzR1SVVRVUZPa2hJUVlLRlFRYUd3UVdDZ0h6RVJjWEVSQVhGNmdRRnhjUUVSY1lBQUFNQUJuLzJnTkxBWDBBQ1FBVEFCMEFKd0F4QURzQVJRQlJBRjBBYVFCMUFIMEF2a0JaQVg1K1FIOElmSGhWUWtFOVBEZzNNeklrSXg4ZVJEODZOVEFySmlFY0Z4SU5DQU5HQkZKWUJFeGVCR3B3QkdSMkJIb0JBQVVGYlFWbkN3b0ZEeG9aQlJVVWN3VmhXd1ZKTGkwRktTaEpUd01RRHdNR0JRRUJURVoyTHpjWUFEODhQencvTHk4OC9Ud1EvUy85THp6OVBCRDlQQy85RVAwOEFTLzlMLzB2L1MvOUwvMHVMaTR1TGk0dUxpNHVMaTR1TGdBdUxpNHVMaTR1TGk0dUxpNHVMaTR4TUFGSmFMa0FUQUIrU1doaHNFQlNXRGdSTjdrQWZ2L0FPRmtsSXlJMU5Ec0JNaFVVSnlFaU5UUXpJVElWRkJjaklqVTBPd0V5RlJRbkl5STFORHNCTWhVVUJ5TWlOVFE3QVRJVkZBY2pJalUwT3dFeUZSUUhJU0kxTkRNaE1oVVVKUlFHSXlJbU5UUTJNeklXQnpRbUl5SUdGUlFXTXpJMkp4UUdJeUltTlRRMk16SVdCelFtSXlJR0ZSUVdNekkySnhRaklqVTBNeklETjNZVUZIWVVpdjd5RkJRQkRoUmlkaE1UZGhTSzVCTVQ1QlFVeXhNVHl4UVU1Qk1UNUJRVS92TVRFd0VORlA3bWVsZFhlbnBYVjNvblpFWkdaR1JHUm1RdVNEUTBTVWswTkVnb01TTWpNaklqSXpFMkhoNGVIdEVVRXhNVWVCUVVGQlRyRkJRVUZLd1VGQlFVY3hRVUZCUnlGQlFVRkQ4VUZCUVV4Vlo3ZTFaWGUzdFhSbVJqUjBaalkwWXpTVWt6TkVsSk5DTXlNaU1qTVRJakhSMGRBQVlBRXYvekFxNEJJQUFMQUJjQUl3QXRBRGNBWHdCK1FEUUJZR0JBWVN4WVZFNUtRamcwTXk4dUd3a0RXbEZJUFRZeExDY0dBQXdFR0I0RUVpVWtCU29wSVFVUFJFQmVPaFVCQVQxR2RpODNHQUEvTHp3dlBDLzlMeno5UEFFdi9TLzlMaTR1TGk0dUxpNHVMZ0F1TGk0dUxpNHVMaTR1TGk0dU1UQUJTV2k1QUQwQVlFbG9ZYkJBVWxnNEVUZTVBR0Qvd0RoWkpUUW1JeUlHRlJRV016STJKeFFHSXlJbU5UUTJNeklXQnpRbUl5SUdGUlFXTXpJMkpTRWlOVFF6SVRJVkZBY2hJalUwTXlFeUZSUUZCaU1pSmpVME5qTXlGell6TWhjV0ZSUWpJaWNtSXlJR0ZSUVdNekkzTmpNeUZSUUhCaU1pQVJkQkxpNUJRUzR1UVJ3d0l5TXhNU01qTUNnWkVoSWFHaElTR1FISC90Y1RFd0VwRkJUKzF4TVRBU2tVL24wdVZUOVhWejlXTFNwWU9pY0hGQVlHSVNjdVFVRXVNQ0FHQ1JVR0xFSllpaTFCUVMwdVFVRXVJakV4SWlJeE1DTVNHUmtTRWhrWkpSUVVGQlJGRkJRVUZCbE1XRDgrV0V4TEl3Y0lGUVViUVMwdVFTTUhGUWNHTUFBREFBci8yQUQrQXRvQUxRQS9BRkVBaFVBM0FWSlNRRk1nVVVjOU9ERXVBa3hDT3pNc0tTWWpJQnNZRlJJUERBa0VBUmtZQlI0ZEpDTUZFeElxS1FVTkRFUktCd1lCQUFFSlJuWXZOeGdBUHk4OEx6d3ZQUDA4THp6OVBDODgvVHdCTGk0dUxpNHVMaTR1TGk0dUxpNHVMaTR1QUM0dUxpNHVMaTR4TUFGSmFMa0FDUUJTU1doaHNFQlNXRGdSTjdrQVV2L0FPRmszQnpNeUZSUXJBU0kxTkQ4Qkl5STFORDhCSXlJMU5EOEJJeUkxTkRzQk1oVVVEd0V6TWhVVUR3RXpNaFVVQXpjMk16SVZGQThCQmk4QkpqVTBNeklYSnlZMU5ETXlId0UzTmpNeUZSUVBBUVluOUptTkZCVEhGd3FaakJjS21vMFhDcG1NRkJUR0Z3cVpqQmNLbW8wWGVra0dDQlFHVmc4T1ZnWVZDQVlkQmhVSUJraElCZ2dVQmxVUERucDZGQlFTQ2doNkVnb0llaElLQ0hvVUZCSUtDSG9TQ2doNkVnb0JzRWdHRlFnR1ZnOE9Wd1lJRlFZOEJnZ1ZCa2hKQmhVSUJsWVBEZ0FEQUFyLy93RCtBb3NBSVFBMUFFb0FlVUF5QVV0TFFFd2FNeXdsSWhOR1BERW5JQjBhRlJJUERBa0VBUjRkQlEwTUFnRUZCa0VGTmpwSUdCY0RFZ0lIQmdBQkNVWjJMemNZQUQ4OFB6ODhMend2L1JEOVBDODgvVHdCTGk0dUxpNHVMaTR1TGk0dUxpNEFMaTR1TGk0eE1BRkphTGtBQ1FCTFNXaGhzRUJTV0RnUk43a0FTLy9BT0ZrM0J6TXlGUlFyQVNJMU5EOEJJeUkxTkQ4Qkl5STFORHNCTWhVVUR3RXpNaFVVQXpjMk16SVZGQThCQmlNaUx3RW1OVFF6TWhjM05qYzJNeklWRkE4QkJpTWlMd0VtTlRRek1oZjBucEVVRk1ZWENwNlJGd3Fla1JNVHhoY0tucEVYZWtrR0NCVUhWZ1lJQndoV0JoVUlCa2NVTlFZSUZRZFZCd2NKQmxjR0ZRZ0d0bzhVRkJFSkNaQVJDUW1PRkJRUkNRbVBFUWtCSTBnR0ZBZ0hWZ1lHVmdZSUZnY1NGRFFHRkFnSFZRZ0hWZ1lJRmdjQUFBSUFCd0cvQU53Q29BQVRBQ1lBU1VBWEFTY25RQ2dGSWg4Y0NnQWtHaGNQQlJjVURRY0JEMFoyTHpjWUFDODhMendCTGk0dUxpNEFMaTR1TGk0eE1BRkphTGtBRHdBblNXaGhzRUJTV0RnUk43a0FKLy9BT0ZrVE1oOEJGaFVVSXlJdkFRY0dJeUkxTkQ4Qk5pYzJGekVYRmhVVUl5SXZBUWNHSXlJMU5EZHhDQWRXQmhRSUJraEpCZ2dVQmxZSUNBNE9Wd1lVQ0FaSlNBWUlGQVlDUGdaV0JnZ1ZCa2hJQmhVSUJsWUdWQTRPVndZSUZRWkpTQVlWQ0FZQUFnQURBZmtBMlFMYkFCRUFJd0JGUUJVQkpDUkFKUVVjRkE4REFDRVhEUVVaSHdvQkYwWjJMemNZQUM4dlBBRXVMaTR1QUM0dUxpNHVNVEFCU1dpNUFCY0FKRWxvWWJCQVVsZzRFVGU1QUNUL3dEaFpFemMyTXpJVkZBOEJCaThCSmpVME16SWZBUVl2QVNZMU5ETXlId0UzTmpNeUZSUUhia2dHQ0JVR1ZnOE9WZ1lVQ0FaWER3NVdCeFVJQmtsSEJnZ1ZCZ0l6U0FZVkNBWldEdzVYQndnVUJoa1BEbFlIQ0JRR1NFa0dGUWdHQUFFQUJRRy9BUElCNWdBSkFEbEFEd0VLQ2tBTENBZ0RCZ1VCQUFFRFJuWXZOeGdBTHp3dlBBRXVMZ0F4TUFGSmFMa0FBd0FLU1doaHNFQlNXRGdSTjdrQUN2L0FPRmtUSXlJMU5Ec0JNaFVVM3NZVEU4WVVBYjhVRXhNVUFBQUJBQVVCcUFDM0FoVUFFUUE4UUJFQkVoSkFFd0FHQUF3RkF4QUlBd0VHUm5Zdk54Z0FMeTg4RVAwQkxpNEFNVEFCU1dpNUFBWUFFa2xvWWJCQVVsZzRFVGU1QUJML3dEaFpFeFFHSXlJbU5UUXpNaFFXTXpJMk5ETXl0elFsSlRRVUZCMFVGQjBVRkFJQkpUUTBKUlFvSFIwb0FBRUFEUUhhQUZ3Q0tRQUxBRFpBRGdFTURFQU5BQUFFQmdrREFRWkdkaTgzR0FBdkx3RXYvUUF4TUFGSmFMa0FCZ0FNU1doaHNFQlNXRGdSTjdrQURQL0FPRmtURkFZaklpWTFORFl6TWhaY0Z4QVJGeGNSRUJjQ0FSQVhGeEFSRnhjQUF3QVBBYWdBd1FKYUFBc0FGd0FmQUU5QUhRRWdJRUFoQUF3RUFCZ0VIQklFQmhVRkF4NEZHZzhGQ1FrREFRWkdkaTgzR0FBdkx4RDlMLzBRL1FFdi9TLzlMLzBBTVRBQlNXaTVBQVlBSUVsb1liQkFVbGc0RVRlNUFDRC93RGhaRXhRR0l5SW1OVFEyTXpJV0J6UW1JeUlHRlJRV016STJKeFFqSWpVME16TEJOQ1VsTkRRbEpUUW5IaFFVSFIwVUZCNGVGQlFVRkFJQkpUUTBKU1UwTkNVVUhSMFVGQjBkRlJVVkV3QUFBZ0FWLzJvQXh3QWNBQWNBSHdCTFFCb0JJQ0JBSVFnSUZ3UU9Fd0FFQkJvRkN4NEdCUUlSQ3dFT1JuWXZOeGdBTHk4di9Ud1EvUUV2L1R3di9TNEFNVEFCU1dpNUFBNEFJRWxvWWJCQVVsZzRFVGU1QUNEL3dEaFpGeFFqSWpVME16SVhGQVlqSWlZMU5EWXpNaFVVSWdZVkZCWXpNalkwTXpLQ0ZCUVVGRVUwSlNVME5DVVVLQjBkRkJRZEZCUTlGQlFVRkNVME5DVWxOQlFVSFJRVUhoNG5BQUFDQUFZQnZ3R0lBaTBBRVFBakFFdEFHUUVrSkVBbEFCNFNCZ0FNQlFNWUJTRVFDQ0VjRkFNQkhrWjJMemNZQUM4OFBDODhQQkQ5RVAwQkxpNHVMZ0F4TUFGSmFMa0FIZ0FrU1doaHNFQlNXRGdSTjdrQUpQL0FPRmtCRkFZaklpWTFORE15RkJZek1qWTBNeklIRkNNaU5DWWpJZ1lVSXlJMU5EWXpNaFlCaURRbEpUUVVGQjBVRkIwVUZNOFVGQjBVRlIwVUZEVWxKVFFDR0NVME5DVVVLQjRlS0ZrVEp4NGVKeE1tTkRVQUFBTUFGd0FGQU1rQWZBQUpBQk1BSFFCVVFCNEJIaDVBSHdBRkJBUUpBQk1LQkE4T0hSUUVHUmdiRVFjV0RBSUJHRVoyTHpjWUFDODhQQzg4UEFFdlBQMDhMeno5UEM4OC9Ud0FNVEFCU1dpNUFCZ0FIa2xvWWJCQVVsZzRFVGU1QUI3L3dEaFpOeFFqSWowQk5ETXlGUWNVSXlJOUFUUXpNaFVIRkNNaVBRRTBNeklWeVJNVUZCTkZGQlFVRkVVVUZCUVVHUlFVVHhRVVR4UVVUeFFVVUJNVFVCUVVBQUFEQUJZQlBBREpBYk1BQ1FBVEFCMEFWRUFlQVI0ZVFCOEFFd29FRHc0RkJBUUpBQjBVQkJrWUd4RUhGZ3dDQVJoR2RpODNHQUF2UER3dlBEd0JMeno5UEM4OC9Ud3ZQUDA4QURFd0FVbG91UUFZQUI1SmFHR3dRRkpZT0JFM3VRQWUvOEE0V1JNVUl5STlBVFF6TWhVSEZDTWlQUUUwTXpJVkJ4UWpJajBCTkRNeUZja1VGQlFVUmhNVUZCTkZGQlFVRkFGUEV4TlFGQlJRRXhOUUZCUlFFeE5QRkJRQUF3QVdBSFlBeUFFb0FBc0FGd0FmQUZSQUlBRWdJRUFoQUJJRUJod01CQUFZQkJ3VkJRTWFCUjRQQlFrSkF4NEJBUVpHZGk4M0dBQS9MeThRL1JEOUVQMEJMLzNkL1JEZC9RQXhNQUZKYUxrQUJnQWdTV2hoc0VCU1dEZ1JON2tBSVAvQU9GazNGQVlqSWlZMU5EWXpNaFlITkNZaklnWVZGQll6TWpZbkZDTWlOVFF6TXNnMEpTVTBOQ1VsTkNnY0ZSUWRIUlFWSEIwVUV4TVV6eVUwTkNVbE5EUWxGQjBkRkJRZEhSUVVGQlFBQUEwQUJ2L2ZBcU1CckFBTkFCa0FKd0F6QUVFQVR3QmJBR2NBYndCM0FJTUFqd0NYQUsxQVVnR1ltRUNaZUV3M0hRTk9RRGttSHdWV0JFY1VsQVNRZmdTS1hBUU1LSVFFZUdJRUxnNEVVR2dFYkhRRWNJMWxCU3RUQlJkcUJXNkJNUVdIWDVaMkJaSnlFUVZaQ2hkN1JTdHVBejRCSkFJQkZFWjJMemNZQUQ4L1B5ODhQQzg4TC8wdlBQMDhMeno5UEJEOUVQMFEvVHdCTC8wdi9TLzlMLzB2L1M4OC9TLzlMLzB2UFAwdUxpNHVMaTRBTGk0dUxqRXdBVWxvdVFBVUFKaEphR0d3UUZKWU9CRTN1UUNZLzhBNFdRRUhCaU1pTlRRL0FUWXpNaFVVQlJRR0l5SW1OVFEyTXpJV0Z3Y0dJeUkxTkQ4Qk5qTXlGUlFYRkFZaklpWTFORFl6TWhZbkJ3WWpJalUwUHdFMk16SVZGQThCQmlNaU5UUS9BVFl6TWhVVUp6UW1JeUlHRlJRV016STJBVFFtSXlJR0ZSUVdNekkyQVJRaklqVTBNeklCRkNNaU5UUXpNZ1VVQmlNaUpqVTBOak15RmdjMEppTWlCaFVVRmpNeU5pY1VJeUkxTkRNeUFjeCtCZ2dVQm40R0NCVCs1alFsSlRRMEpTVTBXb01HQ0JRR2dnY0lGTHMwSmlVME5DVWxOWEYvQmdnVkJuOEdDQlhDZlFZSUZBWjlCZ2dWSFIwVUZCNGVGQlFkQVJzZUZCUWRIUlFVSHY3SUZCUVVGQUVhRkJRVUZBRVdOQ1VsTkRRbEpUUW9IUlFVSFIwVUZCMGRGQlFVRkFHSmZnWVVDQVorQmhRSVBTVTBOQ1VtTkRWVmd3WVZDQWFDQnhVSThDVTBOQ1VsTkRSdGZnWVVDQVovQmhVSWJYMEdGQWdHZlFZVUIrZ1VIaDRVRkIwZC92b1VIUjBVRkI0ZUFTOFVGQlQrMFJRVUZCUWxORFFsSlRRMEpSUWRIUlFVSGg0VUZCUVVBQVFBRmYvZ0FlRUJxd0FOQUJzQUtRQTNBRTlBR3dFNE9FQTVERFFmRVFNMkx5Z2hHaE1NQlFvdEpnRVlBZ0V2Um5Zdk54Z0FQejh2THdFdUxpNHVMaTR1TGdBdUxpNHVNVEFCU1dpNUFDOEFPRWxvWWJCQVVsZzRFVGU1QURqL3dEaFpBUWNHSXlJMU5EOEJOak15RlJRUEFRWWpJalUwUHdFMk16SVZGQmNIQmlNaU5UUS9BVFl6TWhVVUR3RUdJeUkxTkQ4Qk5qTXlGUlFCMjM0R0NCVUdmZ1lJRmNHQ0JnZ1ZCb01IQnhSS2Z3WUlGUWQrQmdnVndYMEdDQlVHZlFZSUZRR0pmZ1lVQ0FaK0JoUUliWU1HRlFnR2dnY1ZDRjUrQmhNSUIzOEdGUWh0ZlFZVUNBWjlCaFFJQUFBQ0FBd0FvQUJ2QVFJQUN3QVRBRUpBRlFFVUZFQVZBQVlBREFRUURnVVNBd2tTQVFFR1JuWXZOeGdBUHk4dkVQMEJMLzB1TGdBeE1BRkphTGtBQmdBVVNXaGhzRUJTV0RnUk43a0FGUC9BT0ZrM05DWWpJZ1lWRkJZek1qWW5GQ01pTlRRek1tOGVGQlFkSFJRVUhoNFVGQlFVMFJRZEhSUVVIUjBVRkJRVUFBQUFBQUFBQUFBQWZBQUFBSHdBQUFCOEFBQUFmQUFBQWI0QUFBSmtBQUFEOWdBQUJkQUFBQWNpQUFBSUxBQUFDU1FBQUFvNEFBQUt1QUFBQzJRQUFBd1FBQUFNL2dBQURnUUFBQTZ1QUFBUHNBQUFFSzRBQUJHMEFBQVNwZ0FBRTdvQUFCUjJBQUFWakFBQUZxZ0FBQmZDQUFBWXVBQUFHY0lBQUJwdUFBQWJaZ0FBSE9RQUFCM2NBQUFlM0FBQUlDZ0FBQ0dXQUFBaTFnQUFJOG9BQUNUSUFBQWwzQUFBSnVnQUFDaGFBQUFwWUFBQUtod0FBQ3JtQUFBcm5nQUFMS1FBQUMyc0FBQXUyQUFBTC9ZQUFERlVBQUF5UEFBQU0wb0FBRFFNQUFBMDNnQUFOajRBQURjV0FBQTMvQUFBT0xnQUFEa1VBQUE1MGdBQU9xd0FBRHVxQUFBODdnQUFQY2dBQUQ2NEFBQS8zQUFBUVJnQUFFSUlBQUJERUFBQVJId0FBRVY4QUFCR0FBQUFSMzRBQUVpaUFBQkppQUFBU21RQUFFcytBQUJNRmdBQVRUWUFBRTQ0QUFCUEJnQUFUOEFBQUZDT0FBQlI3QUFBVXNRQUFGTitBQUJVMGdBQVZld0FBRmQwQUFCWU1nQUFXTllBQUZwQ0FBQmJ3QUFBWFQ0QUFGNjJBQUJnSWdBQVltZ0FBR1BVQUFCbHRnQUFaMVFBQUdrYUFBQnE0QUFBYktRQUFHM3FBQUJ2TGdBQWNIUUFBSEdnQUFCekxnQUFkTG9BQUhaS0FBQjN3Z0FBZWFnQUFIcytBQUI4MEFBQWZtSUFBSC93QUFDQjNBQUFndG9BQUlRNEFBQ0ZsQUFBaHZ3QUFJaEtBQUNKeGdBQWl2SUFBSXhxQUFDT0NBQUFqM3dBQUpEdUFBQ1NXZ0FBazVBQUFKVEdBQUNXQUFBQWw1NEFBSmtHQUFDYWNBQUFtOW9BQUoweUFBQ2V1Z0FBb0VBQUFLR1NBQUNpNWdBQXBEb0FBS1d5QUFDbnNnQUFxVEFBQUtxTUFBQ3J6QUFBcklnQUFLMDZBQUN0bUFBQXJnd0FBSzV1QUFDdkhBQUFyOEFBQUxCd0FBQ3hGZ0FBc2J3QUFMSnVBQUMwdEFBQXRhSUFBTFlpQUFDMklnQUF0aUlCOUFBL0FBQUFBQUNMQUFBQWl3QUFBVVVBR0FEZEFCY0JkUUFNQWVVQUNnSXFBQlFCTWdBSkFUSUFFUUh1QUJRQXhRQUtBWWNBRVFEZkFCWUI5QUFWQWR3QUhRRG5BQnNCZ0FBUkFVWUFHUUZjQUNVQllnQW5BY29BRndGU0FCQUE2Z0FpQWJVQUN3RDBBQ0VBM3dBWEFUSUFDUUdIQUJFQk1nQVJBUTBBS2dMQUFCRUJJd0FrQTNrQUh3SkZBQndCdEFBakFiUUFJd0hEQUJjQm93QWdBTVlBRXdHV0FBa0J1d0FqQVMwQUlRS2FBQ1VDTlFBa0Fkd0FIUUdRQUNJQ1NBQWRBYUFBSmdEckFCMEJmQUFOQVhrQUpnR1VBQWdDdXdBT0Foa0FFZ0drQUFVQkZ3QVBBT0lBQndEMkFBRUErd0FCQWQ4QUZBRWNBQ0lDeGdBVkFlb0FHQUcwQUJVQTdBQU5BY1lBQ1FKSEFDSUF4Z0FWQVpjQUNnR05BQ2NBdWdBa0FuVUFKUUhSQUIwQlhRQVpBZWtBSmdIcEFCa0IwUUFoQU9vQUdnRG9BQkVCTFFBZ0FUNEFDUUpvQUFnQ0JnQUtBYXdBQ1FFWEFCRUJSUUFZQVUwQUJBSThBQUVBK3YvL0FOSUFFQUVOQUMwQ3dBQVJBc0FBRUFMQUFCRUN3QUFSQXNBQUVRTEFBQkFEV2dBSkE1QUFJUUcwQUFBQnZRQWpBYlFBSXdERy83Z0F4Z0FUQU1iLytBSTFBQ01CM0FBZEFkd0FIUUhjQUJ3QjNBQWNBZHdBSFFIbEFBMEJlUUFQQVhrQUpRRjVBQ1FCZVFBbEFSd0FKUUhmQUJBQjN3QVVBZDhBRWdIZkFCRUIzd0FSQWQ4QUVnTVRBQlVDeGdBVkFiUUFGZ0cwQUJVQnRBQVZBTWIvdGdER0FCUUF4di80QWRFQUhRRmRBQUlCWFFBWkFWMEFGd0ZkLys0QlhRQVpBV0lBRFFFdC8ra0JMUUFnQVMwQUhnRXRBQjhEVUFBWkFySUFFZ0VKQUFvQkNRQUtBT0lBQndEaUFBTUE5Z0FGQUxzQUJRQm9BQTBBMFFBUEFOSUFGUUdPQUFZQTRRQVhBT0VBRmdEZkFCWUNvd0FHQWZRQUZRQjZBQXdCOUFBQUFmUUFBQUFDQUFBQUFBQUEvNVlBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFLUUFBQUFCQUFJQUF3QUVBQVVBQndBSUFBa0FDd0FNQUE0QUR3QVFBQkVBRWdBVEFCUUFGUUFXQUJjQUdBQVpBQm9BR3dBY0FCMEFIZ0FmQUNBQUlRQWlBQ1FBSlFBbUFDY0FLQUFwQUNvQUt3QXNBQzBBTGdBdkFEQUFNUUF5QURNQU5BQTFBRFlBTndBNEFEa0FPZ0E3QUR3QVBRQkJBRUlBUXdCRUFFVUFSZ0JIQUVnQVNRQktBRXNBVEFCTkFFNEFUd0JRQUZFQVVnQlRBRlFBVlFCV0FGY0FXQUJaQUZvQVd3QmNBRjBBb3dDRkFJNEFqUURlQUtJQXJRREpBTWNBcmdCaUFHTUFrQUJrQU1zQVpRRElBTThBekFETkFHWUEwd0RRQU5FQXJ3Qm5BSkVBMWdEVUFOVUFhQUNKQUdvQWFRQnJBRzBBYkFCdUFLQUFid0J4QUhBQWNnQjFBSFFBZGdCNEFIb0FlUUI3QUgwQWZBQ2hBSDhBZmdDQUFJRUFzQUN4QU9ZQTV3RFlBT0VBMmdEYkFOd0EzUURnQU5rQXRBQzFBSWNBeGdDOEFNTUFBQUNzQUFBQUFBQURBQUFBQUFBQUJlZ0FBUUFBQUFBQUhBQURBQUVBQUFYb0FBWUZ6QUFBQUFBQzRRQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFRQURBQUFBQUFBQUFBSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVFBQUFBQUFBd0FFQUFVQUFBQUdBQWNBQ0FBQUFBa0FDZ0FBQUFzQURBQU5BQTRBRHdBUUFCRUFFZ0FUQUJRQUZRQVdBQmNBR0FBWkFCb0FHd0FjQUIwQUhnQWZBQUFBSUFBaEFDSUFJd0FrQUNVQUpnQW5BQ2dBS1FBcUFDc0FMQUF0QUM0QUx3QXdBREVBTWdBekFEUUFOUUEyQURjQU9BQTVBQUFBQUFBQUFEb0FPd0E4QUQwQVBnQS9BRUFBUVFCQ0FFTUFSQUJGQUVZQVJ3QklBRWtBU2dCTEFFd0FUUUJPQUU4QVVBQlJBRklBVXdCVUFGVUFWZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVZ3QUFBRmdBQUFBQUFBQUFBQUJaQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQmFBQUFBQUFBQUFGc0FBQUFBQUFBQUFBQUFBQUFBWEFCZEFGNEFYd0JnQUdFQVlnQmpBR1FBWlFCbUFHY0FBQUJvQUdrQWFnQUFBQUFBYXdCc0FHMEFiZ0J2QUhBQUFBQnhBSElBY3dCMEFIVUFBQUFBQUhZQWR3QjRBSGtBZWdCN0FId0FmUUIrQUg4QWdBQ0JBQUFBZ2dDREFJUUFBQUFBQUlVQWhnQ0hBSWdBaVFDS0FBQUFpd0NNQUkwQWpnQ1BBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFrQUNSQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDU0FKTUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFsQUNWQUpZQWx3Q1lBSmtBbWdDYkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbkFDZEFBQUFBQUFBQUFBQW5nQUFBSjhBQUFBQUFBQUFBQUFBQUFBQW9BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFvUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNqQUtJQUJBSllBQUFBUUFCQUFBVUFBQUFpQUNZQUtRQS9BRm9BZWdDaEFLTUFxQUN2QUxRQXVBREtBTTRBMWdEY0FPb0E3Z0QyQVB3QlV3RitBc2NDeVFMY0lCQWdIU0FpSURBZ1JDSVovLzhBQUFBZ0FDUUFLQUFyQUVFQVhnQ2dBS01BcUFDdkFMUUF0d0MvQU13QTBRRFlBTjhBN0FEeEFQZ0JVZ0Y5QXNZQ3lRTFlJQkFnSENBaUlEQWdSQ0laLy84QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFFQUFSQUJJQUVvQWNnQ2tBTndBM2dEZUFONEEzZ0RlQU9BQTlnRDZBUVFCREFFaUFTWUJNQUU0QVRvQlBBRStBVDRCUmdGR0FVZ0JTQUZJQVVqLy93QURBQVFBQlFBR0FBY0FDQUFKQUFvQUN3QU1BQTBBRGdBUEFCQUFFUUFTQUJNQUZBQVZBQllBRndBWUFCa0FHZ0FiQUJ3QUhRQWVBQjhBSUFBaEFDSUFJd0FrQUNVQUpnQW5BQ2dBS1FBcUFDc0FMQUF0QUM0QUx3QXdBREVBTWdBekFEUUFOUUEyQURjQU9BQTVBRG9BT3dBOEFEMEFQZ0EvQUVBQVFRQkNBRU1BUkFCRkFFWUFSd0JJQUVrQVNnQkxBRXdBVFFCT0FFOEFVQUJSQUZJQVV3QlVBRlVBVmdDakFGY0FXQUJaQUpZQVdnQ2hBRnNBWEFCZEFGNEFYd0JnQUdFQVlnQmpBR1FBWlFCbUFHY0FhQUJwQUdvQWF3QnNBRzBBYmdCdkFIQUFjUUJ5QUhNQWRBQjFBSFlBZHdCNEFIa0FlZ0I3QUh3QWZRQitBSDhBZ0FDQkFJSUFnd0NFQUlVQWhnQ0hBSWdBaVFDS0FJc0FqQUNOQUk0QWp3Q1FBSkVBa2dDVEFKUUFsUUNXQUpjQW1BQ1pBSm9BbXdBTkFKd0FuUUNlQUo4QW9BQ2hBQUFBQUFBUUFBQUFxQWtJQlFBQkFRTUNBd1FGQXdNRUFnUUNCUVFDQXdNREF3UURBZ1FDQWdNRUF3SUdBd2dGQkFRRUJBSUVCQU1HQlFRRUJRUUNBd01FQmdVRUF3SUNBZ1FEQmdRRUFnUUZBZ1FFQWdZRUF3UUVCQUlDQXdNR0JRUURBd01GQWdJQ0JnWUdCZ1lHQ0FnRUJBUUNBZ0lGQkFRRUJBUUVBd01EQXdNRUJBUUVCQVFIQmdRRUJBSUNBZ1FEQXdNREF3TURBd01EQ0FZQ0FnSUNBZ0lCQWdJRUFnSUNCZ1VCQlFVQUFBb0pCUUFCQVFNQ0JBVUdBd01GQWdRQ0JRVUNCQU1EQkFVREFnUUNBZ01FQXdNSEF3a0dCQVFGQkFJRUJBTUhCZ1VFQmdRQ0JBUUVCd1VFQXdJQ0F3VURCd1VFQWdVR0FnUUVBZ1lGQXdVRkJRSUNBd01HQlFRREF3TUdBd0lEQndjSEJ3Y0hDUWtFQkFRQ0FnSUdCUVVGQlFVRkJBUUVCQU1GQlFVRkJRVUlCd1FFQkFJQ0FnVURBd01EQXdRREF3TURDQWNEQXdJQ0FnSUJBZ0lFQWdJQ0J3VUJCUVVBQUFzS0JnQUNBZ1FDQkFVR0F3TUZBZ1FDQmdVREJBUUVCQVVFQXdVREFnTUVBd01JQXdvR0JRVUZCUUlFQlFNSEJnVUVCZ1VEQkFRRUNBWUZBd0lEQXdVRENBVUZBd1VHQWdRRUFnY0ZCQVVGQlFNREF3TUhCZ1VEQkFRR0F3SURDQWdJQ0FnSUNRb0ZCUVVDQWdJR0JRVUZCUVVGQkFRRUJBTUZCUVVGQlFVSkNBVUZCUUlDQWdVRUJBUUVCQVFEQXdNRENRZ0RBd0lDQXdJQkFnSUVBZ0lDQndZQkJnWUFBQXdMQmdBQ0FnUURCQVlIQkFRR0FnVURCZ1lEQlFRRUJBVUVBd1VEQXdRRkJBTUlBd3NIQlFVRkJRSUZCUVFJQndZRkJ3VURCUVVGQ0FZRkF3TURBd1lEQ1FZRkF3VUhBZ1VGQWdnR0JBWUdCZ01EQkFRSEJnVURCQVFIQXdNRENBZ0lDQWdJQ2dzRkJRVUNBZ0lIQmdZR0JnWUdCUVVGQlFNR0JnWUdCZ1lKQ1FVRkJRSUNBZ1lFQkFRRUJBUUVCQVFFQ2dnREF3TURBd0lCQXdNRkF3TURDQVlCQmdZQUFBME1Cd0FDQWdRREJRWUhCQVFHQXdVREJ3WURCUVFGQlFZRUF3WURBd1FGQkFNSkJBd0lCZ1lHQlFNRkJnUUpCd1lGQ0FVREJRVUZDUWNGQkFNREF3WUVDUVlHQXdZSUF3VUZBZ2dHQlFZR0JnTURCQVFJQndZRUJBUUhBd01EQ1FrSkNRa0pDd3dHQmdZREF3TUhCZ1lHQmdZR0JRVUZCUVFHQmdZR0JnWUtDUVlHQmdNREF3WUZCUVVGQlFVRUJBUUVDd2tEQXdNREF3SUJBd01GQXdNRENRY0NCd2NBQUE0TkJ3QUNBZ1VEQlFjSUJBUUhBd1VEQndjREJRVUZCUVlGQXdZREF3UUZCQVFLQkF3SUJnWUdCZ01HQmdRSkNBY0dDQVlEQlFVR0NnZ0dCQU1EQkFjRUNnY0dBd1lJQXdZR0F3a0hCUWNIQndNREJBUUpCd1lFQlFVSUJBTUVDZ29LQ2dvS0RBMEdCZ1lEQXdNSUJ3Y0hCd2NIQlFVRkJRUUhCd2NIQndjTENnWUdCZ01EQXdjRkJRVUZCUVVFQkFRRURBb0VCQU1EQXdNQkF3TUdBd01EQ1FjQ0J3Y0FBQThPQ0FBQ0FnVURCZ2NJQlFVSEF3WURDQWNEQmdVRkJRY0ZCQWNFQXdVR0JRUUxCQTBKQndjSEJnTUdCd1VLQ0FjR0NRWUVCZ1lHQ2dnR0JBTUVCQWNFQ3djSEJBY0pBd1lHQXdrSEJRY0hCd1FEQlFVSkNBWUVCUVVKQkFNRUN3c0xDd3NMRFE0SEJ3Y0RBd01JQndjSEJ3Y0hCZ1lHQmdRSEJ3Y0hCd2NNQ3djSEJ3TURBd2NGQlFVRkJRVUZCUVVGRFFvRUJBTURCQU1DQXdNR0F3TURDZ2dDQ0FnQUFCQVBDQUFDQWdVRUJnZ0pCUVVJQXdZRUNBZ0VCZ1VHQmdjRkJBY0VCQVVHQlFRTEJRNEpCd2NIQndNR0J3VUxDUWdHQ1FjRUJnWUdDd2tIQkFRRUJBZ0ZDd2dIQkFjSkF3Y0dBd29IQmdnSUJ3UUVCUVVLQ0FjRUJRVUpCQU1FQ3dzTEN3c0xEZzhIQndjREF3TUpDQWdJQ0FnSUJnWUdCZ1VJQ0FnSUNBZ05Dd2NIQndNREF3Y0dCZ1lHQmdZRkJRVUZEZ3NFQkFRRUJBTUNBd01HQkFRRUN3Z0NDQWdBQUJFUUNRQUNBZ1lFQmdnSkJRVUlBd2NFQ1FnRUJ3WUdCZ2dHQkFjRUJBVUhCUVVNQlE4S0J3Y0lCd01IQ0FVTENnZ0hDZ2NFQmdZSERBa0hCUVFFQkFnRkRBZ0hCQWdLQXdjSEF3c0lCZ2dJQ0FRRUJRVUtDUWNGQmdZS0JBUUZEQXdNREF3TUR4QUhDQWNEQXdNS0NBZ0lDQWdJQmdZR0JnVUlDQWdJQ0FnTkRBY0hCd01EQXdnR0JnWUdCZ1lGQlFVRkRnd0ZCUVFFQkFNQ0JBUUhCQVFFQ3drQ0NRa0FBQklRQ1FBREF3WUVCd2tLQmdZSkJBY0VDUWtFQndZR0JnZ0dCQWdFQkFZSEJnVU5CUkFLQ0FnSUNBUUhDQVVNQ2drSEN3Y0VCd2NIRFFvSUJRUUVCUWtGRFFrSUJBZ0tCQWNIQXdzSUJna0pDQVFFQlFZTENRZ0ZCZ1lLQlFRRkRRME5EUTBORHhBSUNBZ0VCQVFLQ1FrSkNRa0pCd2NIQndVSkNRa0pDUWtPRFFnSUNBUUVCQWdHQmdZR0JnWUZCUVVGRHd3RkJRUUVCQU1DQkFRSEJBUUVEQWtDQ1FrQUFCTVJDZ0FEQXdZRUJ3a0xCZ1lKQkFjRUNna0VCd1lIQndrR0JBZ0ZCQVlIQmdVTkJoRUxDQWdKQ0FRSUNBWU5Dd2tJQ3dnRUJ3Y0lEUW9JQlFRRkJRa0ZEUWtJQkFrTEJBZ0lCQXdKQndrSkNRUUVCZ1lNQ2dnRkJnWUxCUVFGRFEwTkRRME5FQkVJQ0FnRUJBUUxDUWtKQ1FrSkJ3Y0hCd1VKQ1FrSkNRa1BEUWdJQ0FRRUJBa0hCd2NIQndjR0JnWUdFQTBGQlFRRUJRUUNCQVFJQkFRRURRb0NDZ29BQUJRU0NnQURBd2NFQndvTEJnWUtCQWdFQ2dvRkNBY0hCd2tIQlFrRkJBWUlCZ1VPQmhJTUNRa0pDQVFJQ1FZTkN3b0lEQWdGQ0FnSURnc0lCZ1VGQlFvR0Rnb0pCUWtNQkFnSUJBMEpCd29LQ1FVRkJnWU1DZ2tHQndjTEJRUUZEZzRPRGc0T0VSSUpDUWtFQkFRTENnb0tDZ29LQ0FnSUNBWUtDZ29LQ2dvUURna0pDUVFFQkFrSEJ3Y0hCd2NHQmdZR0VRNEZCUVVGQlFRQ0JBUUlCUVVFRGdvQ0Nnb0FBQlVUQ3dBREF3Y0ZDQW9NQmdZS0JBZ0ZDd29GQ0FjSEJ3b0hCUWtGQlFZSUJnWVBCaE1NQ1FrSkNRUUpDUVlPREFvSURBa0ZDQWdJRHdzSkJnVUZCUW9HRHdvSkJRb01CQWtJQkEwS0J3b0tDZ1VGQmdjTkN3a0dCd2NNQlFRR0R3OFBEdzhQRWhNSkNRa0VCQVFNQ2dvS0Nnb0tDQWdJQ0FZS0Nnb0tDZ29SRHdrSkNRUUVCQW9IQndjSEJ3Y0dCZ1lHRWc0R0JnVUZCUVFDQkFRSUJRVUZEZ3NEQ3dzQUFCWVVDd0FEQXdjRkNBc01Cd2NMQkFrRkN3b0ZDQWNJQ0FvSEJRb0ZCUWNKQndZUEJoUU5DZ29LQ1FRSkNnY1BEQW9KRFFrRkNBZ0pEd3dKQmdVRkJnc0dFQXNLQlFvTkJBa0pCQTRLQ0FzTENnVUZCd2NPQ3drR0J3Y05CZ1VHRHc4UER3OFBFeFFLQ2dvRUJBUU1DZ29LQ2dvTENBZ0lDQVlMQ3dzTEN3c1JFQW9LQ2dRRUJBb0lDQWdJQ0FnSEJ3Y0hFdzhHQmdVRkJRUUNCUVVKQlFVRkR3c0RDd3NBQUJjVkRBQURBd2NGQ1FzTkJ3Y0xCUWtGREFzRkNRY0lDQXNJQlFvR0JRY0pCd1lRQnhRTkNnb0tDZ1VKQ2djUERRc0pEUW9GQ1FrSkVBd0tCZ1VHQmdzSEVBc0tCUW9OQlFrSkJBNExDQXNMQ3dVRkJ3Y09EQW9HQndnTkJnVUdFQkFRRUJBUUZCVUtDZ29GQlFVTkN3c0xDd3NMQ1FrSkNRY0xDd3NMQ3dzU0VBb0tDZ1VGQlFzSUNBZ0lDQWdIQndjSEZCQUdCZ1VGQmdRQ0JRVUpCUVVGRUF3RERBd0FBQmdXREFBREF3Z0ZDUXdOQndjTUJRa0ZEQXNHQ1FnSUNBc0lCZ29HQlFjSkJ3WVJCeFVPQ2dvTENnVUtDd2NRRGdzS0Rnb0dDUWtLRVEwS0J3VUdCZ3NIRVF3S0Jnc09CUW9LQkE4TENBd01Dd1lHQndnUERBb0hDQWdPQmdVR0VSRVJFUkVSRlJZS0N3b0ZCUVVPQ3dzTEN3c01DUWtKQ1FjTEN3c0xDd3NURVFvS0NnVUZCUXNJQ0FnSUNBZ0hCd2NIRkJFR0JnVUZCZ1FDQlFVS0JRVUZFQXdEREF3QUFBQUJBVjBCa0FBRkFBSUN2QUtLQUFBQWp3SzhBb29BQUFIRkFESUJBd0FBQUFBRUFBQUFBQUFBQUFBQUFBTUFBQUFBQUFBQUFBQUFBQUJOUVVOU0FFQUFJQ0laQXlIL09RQUFBeUVBeHdBQUFBRUFBQUFBQUFBQUFRQUFnQUFBQUFDTEFUOEFBR0FBQWJRQ2RWbHZhMnR0YjJ0cklDQWdJQ0FnSUNELy8vLy9OLy8vL2xsUFMxSXdNQUFBQUFBQUFBQUJBQUFBQVFBQW1KcEw5VjhQUFBVQUFBUG9BQUFBQUxmbkZaSUFBQUFBdCtjVmt2KzIvemtEYXdNaEFBQUFBd0FDQUFFQUFBQUFBQUVBQUFNaC96a0FBQU9RLzdiL3VBTnJBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQ2tBQUVBQUFDa0FKZ0FEUUFBQUFBQUFnQUlBRUFBQ2dBQUFGMEF2Z0FCQUFFPSIpOwoJCQliYWNrZ3JvdW5kLWNvbG9yOiBkYXJrc2xhdGVncmV5OwoJCQljb2xvcjogd2hpdGU7CgkJCWZvbnQtc2l6ZTo2Mi41JTsgCi8vCQkJZm9udC1mYW1pbHk6IHlva2ttb2trT1Q7CgkJCWZvbnQtc2l6ZTogMzhwdDsKCQkJfQoKCQk8L3N0eWxlPgoKCgkJPHNjcmlwdCBpZD1zY3JpcHRfaHRtPgoJCQlpZiggdXJsLnBhdGhuYW1lID09ICIvaW5kZXguaHRtIiApIHsKCQkJCWJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOiBzbGF0ZWdyZXk7IGNvbG9yOiB3aGl0ZTsgfQoJCQkJfQoJCQk8L3NjcmlwdD4KCgkJPHNjcmlwdCBpZD1zY3JpcHRfY2ZhYT4KCgkJCTwvc2NyaXB0PgoJLS0+CgoJPHNjcmlwdCBpZD0ic2NyaXB0X2NmYWEiPgoJCXZhciB0ZXh0X2NmYWEgPSAKYApwcXBxcHFwcXBxcHFwcXBxcHFwcSBXYXJuaW5nIHBxcHFwcXBxcHFwcXBxcHFwcXBxPGJyPgo8YnI+ClRoaXMgc2l0ZSBtYXkgYmUgcHJvdGVjdGVkIHVuZGVyIHRoZSAKPGJyPgo8YnI+CjxiPkNGQUE8L2I+IAo8YnI+CkNvbXB1dGVyIEZyYXVkIGFuZCBBYnVzZSBBY3QgCjxicj4KPGJyPgp5b3VyIGF0dGVtcGVkIGFjY2VzcyBoYXMgYmVlbiBsb2dnZWQgCjxicj4KcmVwZWF0ZWQgYXR0ZW1wcyBieSB1bmF1dGhvcml6ZWQgZ3Vlc3RzIHdpbGwgYmUgcmVwb3J0ZWQgCjxicj4KPGJyPgpCeSBjb250aW51aW5nIFlvdSBhcmUgYWNrbm93bGVkZ2luZyAKPGJyPgp5b3UgYXJlIGZ1bGx5IGF1dGhvcml6ZWQgYW5kIAo8YnI+CnVuZGVyc3RhbmQgdGhlIHJlc3BvbnNpYmlsaXRlcyB0byBhY2Nlc3MgdGhlIGNvbnRlbnQgb24gdGhlIHNpdGUgCjxicj4KPGJyPgpUaGlzIHBhZ2UgbXVzdCBub3QgYmUgcmVtb3ZlZCAKPGJyPgpiZGJkYmRiZGJkYmRiZGJkYmRiZCBXYXJuaW5nIGJkYmRiZGJkYmRiZGJkYmRiZGJkCjxicj4KPGJyPgp1bmF1dGhvcmljZWQgdXNlcnMgc2hvdWxkCjxicj4KY29uc2lkZXIgYnJvd3NpbmcgZWxzZXdoZXJlOiAKCgo8aHIgY29sb3I9YmxhY2s+CjxociBjb2xvcj1pdm9yeT4KPGhyIGNvbG9yPXJlZD4KPGhyIGNvbG9yPWJsdWU+CjxociBjb2xvcj1lYm9ueT4KPGhyIGNvbG9yPXdoaXRlPgoKPGEgaHJlZj1kdWNrZHVja2dvLmNvbSA+IDxpbWcgc3JjPSJvay5wbmciIGFsdD0iZHVja2R1Y2tnbyIgaGVpZ2h0PTEwIGJvcmRlcj0wPjwvYT4KJm5ic3AgJm5ic3AgJm5ic3AKPGEgaHJlZj1iaW5nLmNvbSA+IDxpbWcgc3JjPSJvay5wbmciIGFsdD0iYmluZyIgaGVpZ2h0PTEwIGJvcmRlcj0wPjwvYT4KJm5ic3AgJm5ic3AgJm5ic3AKPGEgaHJlZj1nb29nbGUuY29tID4gPGltZyBzcmM9Im9rLnBuZyIgYWx0PSJnb29nbGUiIGhlaWdodD0xMCBib3JkZXI9MD48L2E+CiZuYnNwICZuYnNwICZuYnNwCjxhIGhyZWY9eWFob28uY29tID4gPGltZyBzcmM9Im9rLnBuZyIgYWx0PSJ5YWhvbyIgaGVpZ2h0PTEwIGJvcmRlcj0wPjwvYT4KJm5ic3AgJm5ic3AgJm5ic3AKCTxhIGhyZWY9aHR0cHM6Ly9tYXJzLmpwbC5uYXNhLmdvdi9tc2wvbXVsdGltZWRpYS9yYXcgdGFyZ2V0PV9ibGFuaz4KCQk8aW1nIHNyYz0ib2sucG5nIiBib3JkZXI9MCBoZWlnaHQ9MTA+CgkJPC9hPgombmJzcCAmbmJzcCAmbmJzcAoJPGEgaHJlZj1odHRwOi8veW91dHViZS5jb20gdGFyZ2V0PV9ibGFuaz4KCQk8aW1nIHNyYz0ib2sucG5nIiBib3JkZXI9MCBoZWlnaHQ9MTA+CgkJPC9hPgoKPGhyIGNvbG9yPXdoaXRlPgo8aHIgY29sb3I9ZWJvbnk+CjxociBjb2xvcj1ibHVlPgo8aHIgY29sb3I9cmVkPgo8aHIgY29sb3I9aXZvcnk+CjxociBjb2xvcj1ibGFjaz4KCgk8ZGl2IGlkPXdhcm4yIGNsYXNzPWtvPiAKCQk8cCBpZD1wX3dhcm4yIGNsYXNzPWtvPgoJCQk8aHIgY29sb3I9YmxhY2s+CgkJCTxociBjb2xvcj13aGl0ZT4KCQkJPGhyIGNvbG9yPXJlZD4KCQkJCUlmIHlvdSBhcmUgc2VlaW5nIHRoaXMgcGFnZQoJCQkJPGJyPgoJCQkJeW91IGFyZSBwcm9iYWJseSB1bmF1dGhvcml6ZWQgCgkJCQk8YnI+CgkJCQl5b3Ugc2hvdWxkIDxiPk5PVDwvYj4gY29udGludWUgCgkJCQk8YnI+CgkJCQlhY2Nlc3Npbmcgc2l0ZSBjb250ZW50IGhlcmUgbWF5IGJlIAoJCQkJPGJyPgoJCQkJcHJvdGVjdGVkIHVuZGVyIDxiPkNGQUE8L2I+CgkJCTxociBjb2xvcj1yZWQ+CgkJCTxociBjb2xvcj13aGl0ZT4KCQkJPGhyIGNvbG9yPWJsYWNrPgoJCQk8L3A+CgoJCWF1dGhvcml6ZWQgc2l0ZXMgYXJlIGF2YWlsYWJsZSBmcm9tIGJsdWVob3N0IAoKCQk8YSBocmVmPWh0dHA6Ly9ibHVlaG9zdC5jb20vdHJhY2sva29uZXQva28yLnVzIHRhcmdldD1fYmxhbms+CgkJPGltZyBzcmM9Li9pbWdzL2JoL2JoX2FuaW0uZ2lmIGhlaWdodD0zMCBib3JkZXI9MCBhbHQ9Ymx1ZWhvc3QuY29tIGFmZmlsaWF0ZT48L2E+CgkJPGRpdiBpZD1rb2JoX29mZmVyIGNsYXNzPWtvPgoJCQlibHVlaG9zdCBvZmZlcnMgCgkJCTUwIGdiIHNwYWNlIAoJCQk5OTkgZ2IgYmFuZHdpZHRoIAoKCQkJNiBkb21haW5zIG9uIDEgYWNjb3VudCAKCQkJYW5kIG1vcmUgZm9yIG9ubHkgJDYuOTUvbW9udGggCgkJCTwvZGl2PgoJCTwvZGl2PgoKCgk8c2NyaXB0IGlkPSJzY3JpcHRfdXJsIj4KCQkJdmFyIHVybCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKCQkJdXJsLmhyZWY9bG9jYXRpb24uaHJlZgoJCQl2YXIgb3V0cHV0ID0gIm91dHB1dCIKCQkJdXJsLnBhdGhuYW1lID0gdXJsLnBhdGhuYW1lLnJlcGxhY2UoLyheXC8/KS8sIi8iKTsKLy8JCQlhbGVydChsb2NhdGlvbi5ocmVmKQovLwkJCWFsZXJ0KHVybC5wcm90b2NvbCkKLy8JCQlhbGVydCh1cmwuaG9zdG5hbWUpCi8vCQkJYWxlcnQodXJsLnBhdGhuYW1lKQovLwkJCWFsZXJ0KHVybC5zZWFyY2gpCi8vCQkJYWxlcnQodXJsLmhhc2gpCgoJCQlpZiggdXJsLnNlYXJjaCA9PSAiIiApIHtkb2N1bWVudC53cml0ZSggdGV4dF9jZmFhICk7fQoJCQlpZiggdXJsLnNlYXJjaCA9PSAiP3E9Y2ZhYSIgKSB7ZG9jdW1lbnQud3JpdGUoIHRleHRfY2ZhYSApOyB9CgkJCTwvc2NyaXB0PgoJCTwvZGl2PgoKCgo8IS0tCgkJPGlmcmFtZSBpZD0ibXlmcmFtZSIgc3JjPSIuL3N2Yy9rb2tiZG0vaW5kZXguaHRtbCIgd2lkdGg9IjEwMDAiIGhlaWdodD0iNTAwIgogICAgICAgIAkJZnJhbWVib3JkZXI9IjAiIHNjcm9sbGluZz0ieWVzIj48L2lmcmFtZT4KCS0tPgoKCTxociBjb2xvcj1yZWQ+PGhyIGNvbG9yPWJsYWNrPjxociBjb2xvcj13aGl0ZT4KCSAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIG9uY2xpY2s9InNob3dfYWxsX2xpbmtzKCdwb3AnKSI+c2hvd19hbGxfbGlua3M8L2J1dHRvbj4KPCEtLQkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGlkPSJ1cGxvYWQiIHZhbHVlPSJVcGxvYWQiIG9uY2xpY2s9IlVwbG9hZCgpIj51cGxvYWQ8L2J1dHRvbj4gLS0+Cgk8aHIgY29sb3I9cmVkPjxociBjb2xvcj13aGl0ZT48aHIgY29sb3I9Ymx1ZT4KCSAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIG9uY2xpY2s9InNob3dfc3ZjX2xpbmtzKCdwb3AnKSI+c2hvd19zdmNfbGlua3M8L2J1dHRvbj4KCSAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIG9uY2xpY2s9InNob3dfa29fbGlua3MoJ3BvcCcpIj5zaG93X2tvX2xpbmtzPC9idXR0b24+CgkgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSJzaG93X3VzX2xpbmtzKCdwb3AnKSI+c2hvd191c19saW5rczwvYnV0dG9uPgoJICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgb25jbGljaz0ic2hvd191X2xpbmtzKCdwb3AnKSI+c2hvd191X2xpbmtzPC9idXR0b24+CgkgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSJzaG93X25vd19saW5rcygncG9wJykiPnNob3dfbm93X2xpbmtzPC9idXR0b24+CgkgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSJzaG93X3Nydl9saW5rcygncG9wJykiPnNob3dfc3J2X2xpbmtzPC9idXR0b24+Cgk8aHIgY29sb3I9Ymx1ZT48aHIgY29sb3I9d2hpdGU+PGhyIGNvbG9yPWJsYWNrPgoKPCEtLQoJPGltZyBzcmM9Ii4vaW1ncy9idG4va2liLnBuZyIgaGVpZ2h0PSI1MCIgc2l6ZT0iMTUwIiBhbHQ9ImtvZXllIiBvbmNsaWNrPSJzaG93X3N2Y19saW5rcygpIj4gCiAgICAgICAgPGltZyBzcmM9Ii4vaW1ncy9idG4va28ucG5nIiBoZWlnaHQ9IjUwIiBzaXplPSIxNTAiIGFsdD0ia29leWViIiBvbmNsaWNrPSJzaG93X2tvX2xpbmtzKCkiPiAKICAgICAgICA8aW1nIHNyYz0iLi9pbWdzL2J0bi9rby5wbmciIGhlaWdodD0iNTAiIHNpemU9IjE1MCIgYWx0PSJrb2V5ZWIiIG9uY2xpY2s9InNob3dfdXNfbGlua3MoKSI+IAogICAgICAgIDxpbWcgc3JjPSIuL2ltZ3MvYnRuL2tvLnBuZyIgaGVpZ2h0PSI1MCIgc2l6ZT0iMTUwIiBhbHQ9ImtvZXllYiIgb25jbGljaz0ic2hvd191X2xpbmtzKCkiPiAKICAgICAgICA8aW1nIHNyYz0iLi9pbWdzL2J0bi9rby5wbmciIGhlaWdodD0iNTAiIHNpemU9IjE1MCIgYWx0PSJrb2V5ZWIiIG9uY2xpY2s9InNob3dfbm93X2xpbmtzKCkiPiAKICAgICAgICA8aW1nIHNyYz0iLi9pbWdzL2J0bi9raXcucG5nIiBoZWlnaHQ9IjUwIiBzaXplPSIxNTAiIGFsdD0ia29leWV3IiBvbmNsaWNrPSJzaG93X3Nydl9saW5rcygpIj4KCS0tPgoKCgk8YSBocmVmPSMgY2xhc3M9InBvcG92ZXIiIG9uY2xpY2s9InNob3dfc3ZjX2xpbmtzKCk7Ij4KCSAgICAgICAgPGltZyBzcmM9Ii4vaW1ncy9idG4va2liLnBuZyIgaGVpZ2h0PSIxMDAiIHdpZHRoPSIyMDAiIGFsdD0ia29leWV3IiA+CgkgICAgICAgIDxzcGFuPjxpbWcgc3JjPSIuL2ltZ3MvYnRuL2tpdy5wbmciIGhlaWdodD0iMTAwIiB3aWR0aD0iMjAwIiBhbHQ9ImtvZXlldyIgPjwvc3Bhbj4KCQk8L2E+CgoJPGEgaHJlZj0jIGNsYXNzPSJwb3BvdmVyIiBvbmNsaWNrPSJzaG93X2tvX2xpbmtzKCk7Ij4KICAgICAgICAJPGltZyBzcmM9Ii4vaW1ncy9idG4va28ucG5nIiBoZWlnaHQ9IjEwMCIgc2l6ZT0iMjAwIiBhbHQ9ImtvZXllYiIgPiAKICAgICAgICAJPHNwYW4+PGltZyBzcmM9Ii4vaW1ncy9idG4vb2sucG5nIiBoZWlnaHQ9IjEwMCIgc2l6ZT0iMjAwIiBhbHQ9ImtvZXllYiIgPjwvc3Bhbj4KCQk8L2E+CgoJPGEgaHJlZj0jIGNsYXNzPSJwb3BvdmVyIiBvbmNsaWNrPSJzaG93X3VzX2xpbmtzKCk7Ij4KICAgICAgICAJPGltZyBzcmM9Ii4vaW1ncy9idG4va28ucG5nIiBoZWlnaHQ9IjEwMCIgc2l6ZT0iMjAwIiBhbHQ9ImtvZXllYiIgPiAKICAgICAgICAJPHNwYW4+PGltZyBzcmM9Ii4vaW1ncy9idG4vb2sucG5nIiBoZWlnaHQ9IjEwMCIgc2l6ZT0iMjAwIiBhbHQ9ImtvZXllYiIgPjwvc3Bhbj4KCQk8L2E+CgoJPGEgaHJlZj0jIGNsYXNzPSJwb3BvdmVyIiBvbmNsaWNrPSJzaG93X3VfbGlua3MoKTsiPgogICAgICAgIAk8aW1nIHNyYz0iLi9pbWdzL2J0bi9rby5wbmciIGhlaWdodD0iMTAwIiBzaXplPSIyMDAiIGFsdD0ia29leWViIiA+IAogICAgICAgIAk8c3Bhbj48aW1nIHNyYz0iLi9pbWdzL2J0bi9vay5wbmciIGhlaWdodD0iMTAwIiBzaXplPSIyMDAiIGFsdD0ia29leWViIiA+PC9zcGFuPgoJCTwvYT4KCgk8YSBocmVmPSMgY2xhc3M9InBvcG92ZXIiIG9uY2xpY2s9InNob3dfbm93X2xpbmtzKCk7Ij4KICAgICAgICAJPGltZyBzcmM9Ii4vaW1ncy9idG4va28ucG5nIiBoZWlnaHQ9IjEwMCIgc2l6ZT0iMjAwIiBhbHQ9ImtvZXllYiIgPiAKICAgICAgICAJPHNwYW4+PGltZyBzcmM9Ii4vaW1ncy9idG4vb2sucG5nIiBoZWlnaHQ9IjEwMCIgc2l6ZT0iMjAwIiBhbHQ9ImtvZXllYiIgPjwvc3Bhbj4KCQk8L2E+CgoJPGEgaHJlZj0jIGNsYXNzPSJwb3BvdmVyIiBvbmNsaWNrPSJzaG93X3Nydl9saW5rcygpOyI+CgkgICAgICAgIDxpbWcgc3JjPSIuL2ltZ3MvYnRuL2tpdy5wbmciIGhlaWdodD0iMTAwIiB3aWR0aD0iMjAwIiBhbHQ9ImtvZXlldyIgPgoJICAgICAgICA8c3Bhbj48aW1nIHNyYz0iLi9pbWdzL2J0bi9raWIucG5nIiBoZWlnaHQ9IjEwMCIgd2lkdGg9IjIwMCIgYWx0PSJrb2V5ZXciID48L3NwYW4+CgkJPC9hPgoKCTxociBjb2xvcj1ibHVlPjxociBjb2xvcj13aGl0ZT48aHIgY29sb3I9cmVkPgoKCTxkaXYgaWQ9ImRpdl9uZWF2ZV9pbSIgPgoJCTxpZnJhbWUgZnJhbWVib3JkZXI9JzAnIGhlaWdodD0nMjUwJyAgbWFyZ2luaGVpZ2h0PScwJyBtYXJnaW53aWR0aD0nMCcgc2Nyb2xsaW5nPSdubycgCgkJCXNyYz0nLi9pbmRleF9uZWF2ZV9pbS5odG1sJwoJCQlzdHlsZT0nbWFyZ2luLWJvdHRvbTogMjBweDsgYm94LXNoYWRvdzogMCAycHggMnB4IHJnYmEoMCwwLDAsMC4zKScgd2lkdGg9JzEwMCUnPgoJCQk8L2lmcmFtZT4KCQk8YSBjbGFzcz0icG9wb3ZlciIgaHJlZj0iLi9pbmRleF9uZWF2ZV9pbS5odG1sIiAgdGFyZ2V0PV9ibGFuaz4KCQkJPGltZyBoZWlnaHQ9NTAgd2lkdGg9MTYwMCBzcmM9Ii4vaW1ncy9saW5rcy9pbmRleF9uZWF2ZV9pbS5wbmciIGFsdD0iaW5kZXhfbmVhdmVfaW0iICBib3JkZXI9MD4KCQkJPHNwYW4+PGltZyBoZWlnaHQ9NTAgd2lkdGg9MTYwMCBzcmM9Ii4vaW1ncy9saW5rcy9pbmRleF9uZWF2ZV9pbV9wb3AucG5nIiBib3JkZXI9MD48L3NwYW4+CgkJCTwvYT4KCQkJCgkJPC9kaXY+Cgk8ZGl2IGlkPSJkaXZfbmVhdmVfd29iYmxlIiA+CgkJCQoJCTxhIGNsYXNzPSJwb3BvdmVyIiBocmVmPSIuL2luZGV4X25lYXZlX3dvYmJsZS5odG1sIiB0YXJnZXQ9X2JsYW5rPgoJCQk8aW1nIGhlaWdodD01MCB3aWR0aD0xNjAwIHNyYz0iLi9pbWdzL2xpbmtzL2luZGV4X25lYXZlX3dvYmJsZS5wbmciIGFsdD0iaW5kZXhfbmVhdmVfd29iYmxlIiAgYm9yZGVyPTA+CgkJCTxzcGFuPjxpbWcgIGhlaWdodD01MCB3aWR0aD0xNjAwIHNyYz0iLi9pbWdzL2xpbmtzL2luZGV4X25lYXZlX3dvYmJsZV9wb3AucG5nIiBib3JkZXI9MD48L3NwYW4+CgkJCTwvYT4KCQk8aWZyYW1lIGZyYW1lYm9yZGVyPScwJyBoZWlnaHQ9JzE1MCcgbWFyZ2luaGVpZ2h0PScwJyBtYXJnaW53aWR0aD0nMCcgc2Nyb2xsaW5nPSdubycgCgkJCXNyYz0nLi9pbmRleF9uZWF2ZV93b2JibGUuaHRtbCcgCgkJCXN0eWxlPSdtYXJnaW4tYm90dG9tOiAyMHB4OyBib3gtc2hhZG93OiAwIDJweCAycHggcmdiYSgwLDAsMCwwLjMpJyB3aWR0aD0nMTAwJSc+CgkJCTwvaWZyYW1lPgoJCTwvZGl2PgoKCgoKCgk8ZGl2IGlkPSJkaXZfZmlsZXMiID4KCQk8b3V0cHV0IGlkPSJ6b25lbGlzdCI+PC9vdXRwdXQ+CgkJPGRpdiBpZD0iZHJvcHpvbmUiPgoJCQlkcm9wem9uZQoJCQk8ZGl2IGlkPSJkaXZfY2FudmFzIiBzdHlsZT0icG9zaXRpb246cmVsYXRpdmU7IHdpZHRoOjQwMHB4OyBoZWlnaHQ6MjAwcHggYmFja2dyb3VuZDp3aGl0ZSI+CgkJCQk8Y2FudmFzIGlkPSJjYW52YXNfZHJvcHpvbmUiIHN0eWxlPSJ6LWluZGV4OiAxOwoJCQkJCXBvc2l0aW9uOmFic29sdXRlOwoJCQkJCWxlZnQ6MHB4OwoJCQkJCXRvcDowcHg7CgkJCQkJIiBoZWlnaHQ9IjEwMHB4IiB3aWR0aD0iMjAwIiBiYWNrZ3JvdW5kLWNvbG9yPSJ3aGl0ZSIgY29sb3I9IndoaXRlIj4KCQkJCQlXQVJOXzEzODcgdW5hdXRob3JpemVkIGFjY2VzcyBoYXMgYmVlbiBsb2dnZWQKCQkJCQk8L2NhbnZhcz4KCQkJPC9kaXY+CgoJCTxzY3JpcHQgbmFtZT0ic2NyaXB0X2ZpbGVzZWxlY3QiPgoJCQlmdW5jdGlvbiBoYW5kbGVGaWxlU2VsZWN0KGV2dCkgewoJCQkJZXZ0LnN0b3BQcm9wYWdhdGlvbigpOwoJCQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7CgoJCQkJdmFyIGZpbGVzID0gZXZ0LmRhdGFUcmFuc2Zlci5maWxlczsgLy8gRmlsZUxpc3Qgb2JqZWN0LgoKLy8gZmlsZXMgaXMgYSBGaWxlTGlzdCBvZiBGaWxlIG9iamVjdHMuIExpc3Qgc29tZSBwcm9wZXJ0aWVzLgogICAgdmFyIG91dHB1dCA9IFtdOwogICAgZm9yICh2YXIgaSA9IDAsIGY7IGYgPSBmaWxlc1tpXTsgaSsrKSB7CiAgICAgIG91dHB1dC5wdXNoKCc8bGk+PHN0cm9uZz4nLCBlc2NhcGUoZi5uYW1lKSwgJzwvc3Ryb25nPiAoJywgZi50eXBlIHx8ICduL2EnLCAnKSAtICcsCiAgICAgICAgICAgICAgICAgIGYuc2l6ZSwgJyBieXRlcywgbGFzdCBtb2RpZmllZDogJywKICAgICAgICAgICAgICAgICAgZi5sYXN0TW9kaWZpZWREYXRlID8gZi5sYXN0TW9kaWZpZWREYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygpIDogJ24vYScsCiAgICAgICAgICAgICAgICAgICc8L2xpPicpOwogICAgfQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3pvbmVsaXN0JykuaW5uZXJIVE1MID0gJzx1bD4nICsgb3V0cHV0LmpvaW4oJycpICsgJzwvdWw+JzsKICB9CgogIGZ1bmN0aW9uIGhhbmRsZURyYWdPdmVyKGV2dCkgewogICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpOwogICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7CiAgICBldnQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSc7IC8vIEV4cGxpY2l0bHkgc2hvdyB0aGlzIGlzIGEgY29weS4KICB9CgogIC8vIFNldHVwIHRoZSBkbmQgbGlzdGVuZXJzLgogIHZhciBkcm9wWm9uZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkcm9wem9uZScpOwogIGRyb3Bab25lLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgaGFuZGxlRHJhZ092ZXIsIGZhbHNlKTsKICBkcm9wWm9uZS5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgaGFuZGxlRmlsZVNlbGVjdCwgZmFsc2UpOwo8L3NjcmlwdD4KCjxocj48aHI+PGhyPgo8c3R5bGU+CiAgLnRodW1iIHsKICAgIGhlaWdodDogNzVweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkICMwMDA7CiAgICBtYXJnaW46IDEwcHggNXB4IDAgMDsKICB9Cjwvc3R5bGU+CgoKCTxsYWJlbCBjbGFzcz0iZmlsZUNvbnRhaW5lciI+CgkJZmlsZXMKCQk8aW5wdXQgaWQ9ImZpbGVzIiBuYW1lPSJmaWxlc1tdIiBtdWx0aXBsZT0iIiB0eXBlPSJmaWxlIj4KCQk8L2xhYmVsPgoKCjxvdXRwdXQgaWQ9InpvbmVsaXN0Ij48L291dHB1dD4KCjxzY3JpcHQ+CiAgZnVuY3Rpb24gaGFuZGxlRmlsZVNlbGVjdChldnQpIHsKICAgIHZhciBmaWxlcyA9IGV2dC50YXJnZXQuZmlsZXM7IC8vIEZpbGVMaXN0IG9iamVjdAoKICAgIC8vIGZpbGVzIGlzIGEgRmlsZUxpc3Qgb2YgRmlsZSBvYmplY3RzLiBMaXN0IHNvbWUgcHJvcGVydGllcy4KICAgIHZhciBvdXRwdXQgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwLCBmOyBmID0gZmlsZXNbaV07IGkrKykgewogICAgICBvdXRwdXQucHVzaCgnPGxpPjxzdHJvbmc+JywgZXNjYXBlKGYubmFtZSksICc8L3N0cm9uZz4gKCcsIGYudHlwZSB8fCAnbi9hJywgJykgLSAnLAogICAgICAgICAgICAgICAgICBmLnNpemUsICcgYnl0ZXMsIGxhc3QgbW9kaWZpZWQ6ICcsCiAgICAgICAgICAgICAgICAgIGYubGFzdE1vZGlmaWVkRGF0ZSA/IGYubGFzdE1vZGlmaWVkRGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoKSA6ICduL2EnLAogICAgICAgICAgICAgICAgICAnPC9saT4nKTsKICAgIH0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6b25lbGlzdCcpLmlubmVySFRNTCA9ICc8dWw+JyArIG91dHB1dC5qb2luKCcnKSArICc8L3VsPic7CiAgfQoKCSAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGVzJykuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgaGFuZGxlRmlsZVNlbGVjdCwgZmFsc2UpOwoJPC9zY3JpcHQ+CgoJPGRpdiBpZD0iZGl2X2ZpbGVzMiIgaGlkZGVuID4KCQk8bGFiZWwgY2xhc3M9ImZpbGVDb250YWluZXIiPgoJCQlmaWxlczIKCQkJPGlucHV0IGlkPSJmaWxlcyIgbmFtZT0iZmlsZXNbXSIgbXVsdGlwbGU9IiIgdHlwZT0iZmlsZSI+CgkJCTwvbGFiZWw+CgkJPG91dHB1dCBpZD0iem9uZWxpc3QiPjwvb3V0cHV0PgoJCTwvZGl2PgoKPHNjcmlwdD4KICBmdW5jdGlvbiBoYW5kbGVGaWxlU2VsZWN0KGV2dCkgewogICAgdmFyIGZpbGVzID0gZXZ0LnRhcmdldC5maWxlczsgLy8gRmlsZUxpc3Qgb2JqZWN0CgogICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBGaWxlTGlzdCBhbmQgcmVuZGVyIGltYWdlIGZpbGVzIGFzIHRodW1ibmFpbHMuCiAgICBmb3IgKHZhciBpID0gMCwgZjsgZiA9IGZpbGVzW2ldOyBpKyspIHsKCi8vIE9ubHkgcHJvY2VzcyBpbWFnZSBmaWxlcy4KCWlmICghZi50eXBlLm1hdGNoKCdpbWFnZS4qJykpIHsgY29udGludWU7IH0KCiAgICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpOwoKICAgICAgLy8gQ2xvc3VyZSB0byBjYXB0dXJlIHRoZSBmaWxlIGluZm9ybWF0aW9uLgogICAgICByZWFkZXIub25sb2FkID0gKGZ1bmN0aW9uKHRoZUZpbGUpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oZSkgewogICAgICAgICAgLy8gUmVuZGVyIHRodW1ibmFpbC4KICAgICAgICAgIHZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgICAgICAgc3Bhbi5pbm5lckhUTUwgPSBbJzxpbWcgY2xhc3M9InRodW1iIiBzcmM9IicsIGUudGFyZ2V0LnJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICciIHRpdGxlPSInLCBlc2NhcGUodGhlRmlsZS5uYW1lKSwgJyIvPiddLmpvaW4oJycpOwogICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3pvbmVsaXN0JykuaW5zZXJ0QmVmb3JlKHNwYW4sIG51bGwpOwogICAgICAgIH07CiAgICAgIH0pKGYpOwoKICAgICAgLy8gUmVhZCBpbiB0aGUgaW1hZ2UgZmlsZSBhcyBhIGRhdGEgVVJMLgogICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmKTsKICAgIH0KICB9CgogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlcycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGhhbmRsZUZpbGVTZWxlY3QsIGZhbHNlKTsKPC9zY3JpcHQ+Cgo8aHIgY29sb3I9YmxhY2s+PGhyIGNvbG9yPWJsYWNrPjxociBjb2xvcj1ibGFjaz4KCjxzdHlsZT4KICAjYnl0ZV9jb250ZW50IHsKICAgIG1hcmdpbjogNXB4IDA7CiAgICBtYXgtaGVpZ2h0OiAxMDBweDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgfQogICNieXRlX3JhbmdlIHsgbWFyZ2luLXRvcDogNXB4OyB9Cjwvc3R5bGU+CjxzY3JpcHQgaWQ9InNjcmlwdF9wcmV2aWV3ZmlsZSI+CgkJCWZ1bmN0aW9uIHByZXZpZXdmaWxlKGZpbGUpIHsKCQkJCWlmICh0ZXN0cy5maWxlcmVhZGVyID09PSB0cnVlICYmIGFjY2VwdGVkVHlwZXNbZmlsZS50eXBlXSA9PT0gdHJ1ZSkgewoJCQkJCXZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpOwoJCQkJCXJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbiAoZXZlbnQpIHsKCQkJCQkJdmFyIGltYWdlID0gbmV3IEltYWdlKCk7CgkJCQkJCWltYWdlLnNyYyA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7CgkJCQkJCWltYWdlLndpZHRoID0gMjUwOyAvLyBhIGZha2UgcmVzaXplCgkJCQkJCWhvbGRlci5hcHBlbmRDaGlsZChpbWFnZSk7CgkJCQkJCX07CgoJCQkJCXJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpOwoJCQkJCX0gIAoJCQkJZWxzZSB7CgkJCQkJaG9sZGVyLmlubmVySFRNTCArPSAKCQkJCQkJJzxwPmRvbmU6ICBrb3VwbG9hZCcgCgkJCQkJCQkrIGZpbGUubmFtZSAKCQkJCQkJCSsgJyAnIAoJCQkJCQkJKyAoZmlsZS5zaXplID8gKGZpbGUuc2l6ZS8xMDI0fDApICsgJ0snIDogJycpOyAKCQkJCQkJY29uc29sZS5sb2coZmlsZSk7CgkJCQkJfQoJCQkJfQoKCQkJZnVuY3Rpb24gcmVhZGZpbGVzKGZpbGVzKSB7CgkJCQlkZWJ1Z2dlcjsKCQkJCXZhciBmb3JtRGF0YSA9IHRlc3RzLmZvcm1kYXRhID8gbmV3IEZvcm1EYXRhKCkgOiBudWxsOwoJCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewoJCQkJCWlmICh0ZXN0cy5mb3JtZGF0YSkgZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgZmlsZXNbaV0pOwoJCQkJCXByZXZpZXdmaWxlKGZpbGVzW2ldKTsKCQkJCQl9CgovLyBub3cgcG9zdCBhIG5ldyBYSFIgcmVxdWVzdAoJCQkJaWYgKHRlc3RzLmZvcm1kYXRhKSB7CgkJCQkJdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwoJCQkJCXhoci5vcGVuKCdQT1NUJywgJ2h0dHA6Ly9rYTYva28vYmluL3BocC9rby5waHA/a289YWpheCx1cGxvYWQsZmlsZW5hbWVzLHBocGksb2snKTsKLy8JCQkJCXhoci5vcGVuKCdQT1NUJywgJ2thNi9rby9iaW4vcGhwL2luZGV4LnBocD9xPXVwbG9hZCxmaWxlbmFtZXMnKTsKCQkJCQl4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7CgkJCQkJCXByb2dyZXNzLnZhbHVlID0gcHJvZ3Jlc3MuaW5uZXJIVE1MID0gMTAwOwoJCQkJCQl9OwoKCQkJCWlmICh0ZXN0cy5wcm9ncmVzcykgewoJCQkJCXhoci51cGxvYWQub25wcm9ncmVzcyA9IGZ1bmN0aW9uIChldmVudCkgewoJCQkJCQlpZiAoZXZlbnQubGVuZ3RoQ29tcHV0YWJsZSkgewoJCQkJCQkJdmFyIGNvbXBsZXRlID0gKGV2ZW50LmxvYWRlZCAvIGV2ZW50LnRvdGFsICogMTAwIHwgMCk7CgkJCQkJCQlwcm9ncmVzcy52YWx1ZSA9IHByb2dyZXNzLmlubmVySFRNTCA9IGNvbXBsZXRlOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoKCQkJCXhoci5zZW5kKGZvcm1EYXRhKTsKCQkJCX0KCQkJfQoKCQkJaWYgKHRlc3RzLmRuZCkgeyAKCQkJCWhvbGRlci5vbmRyYWdvdmVyID0gZnVuY3Rpb24gKCkgeyB0aGlzLmNsYXNzTmFtZSA9ICdob3Zlcic7IHJldHVybiBmYWxzZTsgfTsKCQkJCWhvbGRlci5vbmRyYWdlbmQgPSBmdW5jdGlvbiAoKSB7IHRoaXMuY2xhc3NOYW1lID0gJyc7IHJldHVybiBmYWxzZTsgfTsKCQkJCWhvbGRlci5vbmRyb3AgPSBmdW5jdGlvbiAoZSkgewoJCQkJCXRoaXMuY2xhc3NOYW1lID0gJyc7CgkJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJCXJlYWRmaWxlcyhlLmRhdGFUcmFuc2Zlci5maWxlcyk7CgkJCQkJfQoJCQkJfSAKCQkJZWxzZSB7CgkJCQlmaWxldXBsb2FkLmNsYXNzTmFtZSA9ICdoaWRkZW4nOwoJCQkJZmlsZXVwbG9hZC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpLm9uY2hhbmdlID0gZnVuY3Rpb24gKCkgewoJCQkJcmVhZGZpbGVzKHRoaXMuZmlsZXMpOwoJCQkJfTsKCQkJfQoJCTwvc2NyaXB0PgoKCTxzY3JpcHQgaWQ9InNjcmlwdF9teWZpbGV3b3JrPgoKCQlmdW50aW9uIG15ZmlsZXdvcmsoIGosIGZpbGUgKSB7CgoJCQlhbGVydCggaisiIGZpbGU9IitmaWxlICk7CgkJCX0KCgkJPC9zY3JpcHQ+CgoKCgoKCQk8c2NyaXB0IGlkPSJzY3JpcHRfdXBsb2FkX2lucHV0Ij4+CgkJCXZhciB1cGxvYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXSwKCQkJaG9sZGVyMiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdob2xkZXIyJyksCgkJCXN0YXRlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXR1cycpOwoKCQkJaWYgKHR5cGVvZiB3aW5kb3cuRmlsZVJlYWRlciA9PT0gJ3VuZGVmaW5lZCcpIHsKCQkJCXN0YXRlLmNsYXNzTmFtZSA9ICdmYWlsJzsKCQkJCX0gCgkJCWVsc2UgewoJCQkJc3RhdGUuY2xhc3NOYW1lID0gJ3N1Y2Nlc3MnOwoJCQkJc3RhdGUuaW5uZXJIVE1MID0gJ0ZpbGUgQVBJICYgRmlsZVJlYWRlciBhdmFpbGFibGUnOwoJCQkJfQogCgkJCXVwbG9hZC5vbmNoYW5nZSA9IGZ1bmN0aW9uIChlKSB7CgkJCQllLnByZXZlbnREZWZhdWx0KCk7CgoJCQkJdmFyIGZpbGUgPSB1cGxvYWQuZmlsZXNbMF0sCgkJCQlyZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpOwoJCQkJcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uIChldmVudCkgewoJCQkJCXZhciBpbWcgPSBuZXcgSW1hZ2UoKTsKCQkJCQlpbWcuc3JjID0gZXZlbnQudGFyZ2V0LnJlc3VsdDsKLy8gbm90ZTogbm8gb25sb2FkIHJlcXVpcmVkIHNpbmNlIHdlJ3ZlIGdvdCB0aGUgZGF0YXVybC4uLkkgdGhpbmshIDopCgkJCQkJaWYgKGltZy53aWR0aCA+IDU2MCkgeyAvLyBob2xkZXIgd2lkdGgKCQkJCQkJaW1nLndpZHRoID0gNTYwOwoJCQkJCQl9CgkJCQkJaG9sZGVyMi5pbm5lckhUTUwgPSAnJzsKCQkJCQlob2xkZXIuYXBwZW5kQ2hpbGQoaW1nKTsKCQkJCQl9OwoJCQkJcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7CgoJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfTsKCi8vCQkJdmFyIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci8vCQkJZm9ybURhdGEuYXBwZW5kKCJwYXJ0X251bSIsICIxMjNBQkMiKTsgCi8vCQkJZm9ybURhdGEuYXBwZW5kKCJwYXJ0X3ByaWNlIiwgNy45NSk7Ci8vCQkJCWZvcm1EYXRhLmFwcGVuZCgicGFydF9pbWFnZSIsIHNvbWVmaWxlKQovLwovLwkJCXZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKLy8JCQl4aHIub3BlbigiUE9TVCIsICJodHRwOi8va2E2L2tvL2Jpbi9waHAva28ucGhwP2tvPWFqYXgsdXBsb2FkLyIpOyAgCi8vCQkJeGhyLnNlbmQoZm9ybURhdGEpOwoJCQk8L3NjcmlwdD4KCgk8Y2FudmFzIGNvbG9yPSJkYXJrc2xhdGdyZXkiIGhlaWdodD0iMTAwIiB3aWR0aD0iNDAwIj48L2NhbnZhcz4KCTxzY3JpcHQ+CgkJdmFyIGNhbnZhcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdjYW52YXMnKVswXSwKICAgIGN0eCA9IG51bGwsCiAgICBncmFkID0gbnVsbCwKICAgIGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYm9keScpWzBdLAogICAgY29sb3IgPSAyNTU7CiAgICBjb2xvciA9IGxpZ2h0Ymx1ZTsKICAgIAppZiAoY2FudmFzLmdldENvbnRleHQoJzJkJykpIHsKICBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTsKICBjdHguY2xlYXJSZWN0KDAsIDAsIDYwMCwgNjAwKTsKICBjdHguc2F2ZSgpOwoKLy8gQ3JlYXRlIHJhZGlhbCBncmFkaWVudAovLyAgZ3JhZCA9IGN0eC5jcmVhdGVSYWRpYWxHcmFkaWVudCgwLDAsMCwwLDAsNjAwKTsgCi8vICBncmFkLmFkZENvbG9yU3RvcCgwLCAnIzAwMCcpOwovLyAgZ3JhZC5hZGRDb2xvclN0b3AoMSwgJ3JnYignICsgY29sb3IgKyAnLCAnICsgY29sb3IgKyAnLCAnICsgY29sb3IgKyAnKScpOwoKICAvLyBhc3NpZ24gZ3JhZGllbnRzIHRvIGZpbGwKLy8gIGN0eC5maWxsU3R5bGUgPSBncmFkOwoJY3R4LmZpbGxzdHlsZSA9ICJsaWdodGJsdWUiOwoKICAvLyBkcmF3IDYwMHg2MDAgZmlsbAogIGN0eC5maWxsUmVjdCgwLDAsNjAwLDYwMCk7CiAgY3R4LnNhdmUoKTsKICAKICBib2R5Lm9ubW91c2Vtb3ZlID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgICB2YXIgd2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aCwgCiAgICAgICAgaGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0LCAKICAgICAgICB4ID0gZXZlbnQuY2xpZW50WCwgCiAgICAgICAgeSA9IGV2ZW50LmNsaWVudFksCiAgICAgICAgcnggPSA2MDAgKiB4IC8gd2lkdGgsCiAgICAgICAgcnkgPSA2MDAgKiB5IC8gaGVpZ2h0OwogICAgICAgIAogICAgdmFyIHhjID0gfn4oMjU2ICogeCAvIHdpZHRoKTsKICAgIHZhciB5YyA9IH5+KDI1NiAqIHkgLyBoZWlnaHQpOwoKICAgIGdyYWQgPSBjdHguY3JlYXRlUmFkaWFsR3JhZGllbnQocngsIHJ5LCAwLCByeCwgcnksIDYwMCk7IAogICAgZ3JhZC5hZGRDb2xvclN0b3AoMCwgJyMwMDAnKTsKICAgIGdyYWQuYWRkQ29sb3JTdG9wKDEsIFsncmdiKCcsIHhjLCAnLCAnLCAoMjU1IC0geGMpLCAnLCAnLCB5YywgJyknXS5qb2luKCcnKSk7CiAgICAvLyBjdHgucmVzdG9yZSgpOwovLyAgICBjdHguZmlsbFN0eWxlID0gZ3JhZDsKCWN0eC5maWxsc3R5bGU9ImxpZ2h0Ymx1ZSI7CiAgICBjdHguZmlsbFJlY3QoMCwwLDYwMCw2MDApOwogICAgLy8gY3R4LnNhdmUoKTsKICB9Owp9Cgk8L3NjcmlwdD4KCgk8ZGl2IGlkPSJkaXZfY3N2Ij4KCTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CgkJYm9keSB7CgkJCWZvbnQtZmFtaWx5OiBBcmlhbDsKCQkJZm9udC1zaXplOiAxMHB0OwoJCQl9CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQl9CgkJdGFibGUgdGggewoJCQliYWNrZ3JvdW5kLWNvbG9yOiAjRjdGN0Y3OwoJCQljb2xvcjogIzMzMzsKCQkJZm9udC13ZWlnaHQ6IGJvbGQ7CgkJCX0KCQl0YWJsZSB0aCwgdGFibGUgdGQgewoJCQlwYWRkaW5nOiA1cHg7CgkJCWJvcmRlci1jb2xvcjogI2NjYzsKCQkJfQoJCTwvc3R5bGU+CgkKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlmdW5jdGlvbiBVcGxvYWQoKSB7CgkJCXZhciBmaWxlVXBsb2FkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImZpbGVVcGxvYWQiKTsKCQkJdmFyIHJlZ2V4ID0gL14oW2EtekEtWjAtOVxzX1xcLlwtOl0pKyguY3N2fC50eHR8LnBzdnwucHl8Lmh0bXwuaHRtbHwucGhwKSQvOwoJCQlpZiAocmVnZXgudGVzdChmaWxlVXBsb2FkLnZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7CgkJCQlpZiAodHlwZW9mIChGaWxlUmVhZGVyKSAhPSAidW5kZWZpbmVkIikgewoJCQkJCXZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpOwoJCQkJCXJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbiAoZSkgewoJCQkJCQl2YXIgdGFibGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0YWJsZSIpOwoJCQkJCQl2YXIgcm93cyA9IGUudGFyZ2V0LnJlc3VsdC5zcGxpdCgiXG4iKTsKCQkJCQkJZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7CgkJCQkJCQl2YXIgcm93ID0gdGFibGUuaW5zZXJ0Um93KC0xKTsKCQkJCQkKLy8JCQkJCQkJdmFyIGNlbGxzID0gcm93c1tpXS5zcGxpdCgifCIpOwoJCQkJCQkJdmFyIGNlbGxzID0gcm93c1tpXS5zcGxpdCgiLCIpOwoJCQkJCQkJZm9yICh2YXIgaiA9IDA7IGogPCBjZWxscy5sZW5ndGg7IGorKykgewoJCQkJCQkJCXZhciBjZWxsID0gcm93Lmluc2VydENlbGwoLTEpOwoJCQkJCQkJCWNlbGwuaW5uZXJIVE1MID0gY2VsbHNbal07CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl2YXIgY3N2MnRibCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjc3YydGJsIik7CgkJCQkJCWNzdjJ0YmwuaW5uZXJIVE1MID0gIiI7CgkJCQkJCWNzdjJ0YmwuYXBwZW5kQ2hpbGQodGFibGUpOwoJCQkJCQl9CgkJCQkJcmVhZGVyLnJlYWRBc1RleHQoZmlsZVVwbG9hZC5maWxlc1swXSk7CgkJCQkJfSAKCQkJCWVsc2UgewoJCQkJCWFsZXJ0KCJjc3YydGJsIHdhcm46ICB1bmF1dGhvcml6ZWQgYWNjZXNzIG5vdGVkIik7CgkJCQkJfQoJCQkJfSAKCQkJZWxzZSB7CgkJCQlhbGVydCgiY3N2MnRibCBmYWlsOiAgdW5zdXBwb3RlZCBmb3JtYXQiKTsKCQkJCX0KCQkJfQoJCQk8L3NjcmlwdD4KCQkJCTxsYWJlbCBjbGFzcz0iZmlsZUNvbnRhaW5lciI+CgkJCQkJZmlsZXNfY3N2X3Bzdl9zc3ZfdHN2CgkJCQkJPGlucHV0IGlkPSJmaWxlVXBsb2FkIiB0eXBlPSJmaWxlIj4KCQkJCQk8L2xhYmVsPgoKCQkJCSZuYnNwICZuYnNwICZuYnNwCgkJCQk8bGFiZWwgY2xhc3M9ImZpbGVDb250YWluZXIiPgoJCQkJCXBhcnNlX2Nzdl9wc3Zfc3N2X3RzdgoJCQkJCTxpbnB1dCBpZD0idXBsb2FkIiB2YWx1ZT0iVXBsb2FkIiBvbmNsaWNrPSJVcGxvYWQoKSIgdHlwZT0iYnV0dG9uIj4KCQkJCQk8L2xhYmVsPgoJCQkJPC9kaXY+CgkJCTxkaXYgaWQ9ImNzdjJ0YmwiPiA8L2Rpdj4KPCEtLSAgICAgICAgCQk8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgaWQ9ImZpbGVVcGxvYWQiIHR5cGU9ImZpbGUiID5zZWxlY3Q8L2J1dHRvbj4gLS0+CjwhLS0gICAgICAgIAkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGlkPSJ1cGxvYWQiIHZhbHVlPSJVcGxvYWQiIG9uY2xpY2s9IlVwbG9hZCgpIj51cGxvYWQ8L2J1dHRvbj4gLS0+CgkJCTwvZGl2PgoJCTwvZGl2PgoKCTxkaXYgaWQ9ImRpdl9zaG93aGlkZSIgaGlkZGVuPgoJCTxzY3JpcHQgaWQ9InNjcmlwdF9zaG93aGlkZSIgPgoJCQlmdW5jdGlvbiBzaG93X2ZpbGVzKCkgewoJCQkJdmFyIGRpdl9maWxlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRieUlEKCJkaXZfZmlsZXMiKTsKCQkJCWRpdl9maWxlcy5zaG93KCk7CgkJCQl9CgkJCWZ1bmN0aW9uIGhpZGVfZmlsZXMoKSB7CgkJCQl2YXIgZGl2X2ZpbGVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudGJ5SUQoImRpdl9maWxlcyIpOwoJCQkJZGl2X2ZpbGVzLmhpZGUoKTsKCQkJCX0KCQkJPC9zY3JpcHQ+CgkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGlkPSJzaG93Ij5zaG93PC9idXR0b24+CgkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGlkPSJoaWRlIj5oaWRlPC9idXR0b24+CgkJPGJ1dHRvbiB0eXBlPSJzaG93X2ZpbGVzIiBpZD0ic2hvd19maWxlcyIgb25jbGljaz0ic2hvd19maWxlcygpIj5TaG93X2ZpbGVzPC9idXR0b24+CgkJPGJ1dHRvbiB0eXBlPSJoaWRlX2ZpbGVzIiBpZD0iaGlkZV9maWxlcyIgb25jbGljaz0iaGlkZV9maWxlcygpIj5IaWRlX2ZpbGVzPC9idXR0b24+CgkJPGJ1dHRvbiB0eXBlPSJzaG93X25lYXZlX3dvYmJsZSIgaWQ9InNob3dfbmVhdmVfd29iYmxlIj5TaG93X25lYXZlX3dvYmJsZTwvYnV0dG9uPgoJCTxidXR0b24gdHlwZT0iaGlkZV9uZWF2ZV93b2JibGUiIGlkPSJoaWRlX25lYXZlX3dvYmJsZSI+SGlkZV9uZWF2ZV93b2JibGU8L2J1dHRvbj4KPCEtLQoJCTxidXR0b24gdHlwZT0ic2hvd19kZCIgaWQ9InNob3dfZGQiPlNob3dfZGQ8L2J1dHRvbj4KCQk8YnV0dG9uIHR5cGU9ImhpZGVfZGQiIGlkPSJoaWRlX2RkIj5IaWRlX2RkPC9idXR0b24+CgkJPGJ1dHRvbiB0eXBlPSJzaG93X2JiIiBpZD0ic2hvd19iYiI+U2hvd19iYjwvYnV0dG9uPgoJCTxidXR0b24gdHlwZT0iaGlkZV9iYiIgaWQ9ImhpZGVfYmIiPkhpZGVfYmI8L2J1dHRvbj4KCQk8YnV0dG9uIHR5cGU9InNob3dfdGwiIGlkPSJzaG93X3RsIj5TaG93X3RsPC9idXR0b24+CgkJPGJ1dHRvbiB0eXBlPSJoaWRlX3RsIiBpZD0iaGlkZV90bCI+SGlkZV90bDwvYnV0dG9uPgoJCTxidXR0b24gdHlwZT0ic2hvd19jb2xvcnMiIGlkPSJzaG93X2NvbG9ycyI+U2hvd19jb2xvcnM8L2J1dHRvbj4KCQk8YnV0dG9uIHR5cGU9ImhpZGVfY29sb3JzIiBpZD0iaGlkZV9jb2xvcnMiPkhpZGVfY29sb3JzPC9idXR0b24+CgkJPGJ1dHRvbiB0eXBlPSJzaG93X2ZvbnRzIiBpZD0ic2hvd19mb250cyI+U2hvd19mb250czwvYnV0dG9uPgoJCTxidXR0b24gdHlwZT0iaGlkZV9mb250cyIgaWQ9ImhpZGVfZm9udHMiPkhpZGVfZm9udHM8L2J1dHRvbj4KCQk8YnV0dG9uIHR5cGU9InNob3dfYWxsZGl2cyIgaWQ9InNob3dfYWxsZGl2cyI+U2hvd19hbGxkaXZzPC9idXR0b24+CgkJPGJ1dHRvbiB0eXBlPSJoaWRlX2FsbGRpdnMiIGlkPSJoaWRlX2FsbGRpdnMiPkhpZGVfYWxsZGl2czwvYnV0dG9uPgoJCS0tPgoJCTwvZGl2PgoJPGRpdiBpZD0iaXRlbSIgPiA8L2Rpdj4KCgk8c2NyaXB0IGlkPSJzY3JpcHRfc2hvd2hpZGUiPgoJCSQoICIjc2hvdyIgKS5jbGljayhmdW5jdGlvbigpIHskKCcjaXRlbScpLnNob3coKTsgfSk7CgkJJCggIiNoaWRlIiApLmNsaWNrKGZ1bmN0aW9uKCkgeyQoJyNpdGVtJykuaGlkZSgpO30pOwoJCSQoICIjc2hvd19maWxlcyIgKS5jbGljayhmdW5jdGlvbigpIHskKCcjZGl2X2ZpbGVzJykuc2hvdygpOyB9KTsKCQkkKCAiI2hpZGVfZmlsZXMiICkuY2xpY2soZnVuY3Rpb24oKSB7JCgnI2Rpdl9maWxlcycpLmhpZGUoKTt9KTsKCQkkKCAiI3Nob3dfbmVhdmVfd29iYmxlIiApLmNsaWNrKGZ1bmN0aW9uKCkgeyQoJyNkaXZfbmVhdmVfd29iYmxlJykuc2hvdygpOyB9KTsKCQkkKCAiI2hpZGVfbmVhdmVfd29iYmxlIiApLmNsaWNrKGZ1bmN0aW9uKCkgeyQoJyNkaXZfbmVhdmVfd29iYmxlJykuaGlkZSgpO30pOwovLwkJJCggIiNzaG93X2RkIiApLmNsaWNrKGZ1bmN0aW9uKCkgeyQoJyNkaXZfZGQnKS5zaG93KCk7IH0pOwovLwkJJCggIiNoaWRlX2RkIiApLmNsaWNrKGZ1bmN0aW9uKCkgeyQoJyNkaXZfZGQnKS5oaWRlKCk7fSk7Ci8vCQkkKCAiI3Nob3dfYmIiICkuY2xpY2soZnVuY3Rpb24oKSB7JCgnI2Rpdl9iYicpLnNob3coKTsgfSk7Ci8vCQkkKCAiI2hpZGVfYmIiICkuY2xpY2soZnVuY3Rpb24oKSB7JCgnI2Rpdl9iYicpLmhpZGUoKTt9KTsKLy8JCSQoICIjc2hvd190bCIgKS5jbGljayhmdW5jdGlvbigpIHskKCcjZGl2X3RsJykuc2hvdygpOyB9KTsKLy8JCSQoICIjaGlkZV90bCIgKS5jbGljayhmdW5jdGlvbigpIHskKCcjZGl2X3RsJykuaGlkZSgpO30pOwovLwkJJCggIiNzaG93X2prd2lpIiApLmNsaWNrKGZ1bmN0aW9uKCkgeyQoJyNkaXZfamt3aWknKS5zaG93KCk7IH0pOwovLwkJJCggIiNoaWRlX2prd2lpIiApLmNsaWNrKGZ1bmN0aW9uKCkgeyQoJyNkaXZfamt3aWknKS5oaWRlKCk7fSk7Ci8vCQkkKCAiI3Nob3dfY29sb3JzIiApLmNsaWNrKGZ1bmN0aW9uKCkgeyQoJyNkaXZfY29sb3JzJykuc2hvdygpOyB9KTsKLy8JCSQoICIjaGlkZV9jb2xvcnMiICkuY2xpY2soZnVuY3Rpb24oKSB7JCgnI2Rpdl9jb2xvcnMnKS5oaWRlKCk7fSk7Ci8vCQkkKCAiI3Nob3dfZm9udHMiICkuY2xpY2soZnVuY3Rpb24oKSB7JCgnI2Rpdl9mb250cycpLnNob3coKTsgfSk7Ci8vCQkkKCAiI2hpZGVfZm9udHMiICkuY2xpY2soZnVuY3Rpb24oKSB7JCgnI2Rpdl9mb250cycpLmhpZGUoKTt9KTsKLy8JCSQoICIjc2hvd19hbGxkaXZzIiApLmNsaWNrKGZ1bmN0aW9uKCkgeyQoJyNkaXZfYWxsZGl2cycpLnNob3coKTsgfSk7Ci8vCQkkKCAiI2hpZGVfYWxsZGl2cyIgKS5jbGljayhmdW5jdGlvbigpIHskKCcjZGl2X2FsbGRpdnMnKS5oaWRlKCk7fSk7CgkJPC9zY3JpcHQ+Cgk8L2Rpdj4KCgoKCQk8IS0tW2lmIElFXT4KPCEtLQkJCTxzY3JpcHQgc3JjPSJodHRwczovL2h0bWw1c2hpdi5nb29nbGVjb2RlLmNvbS9zdm4vdHJ1bmsvaHRtbDUuanMiPjwvc2NyaXB0PiAtLT4KCQk8IVtlbmRpZl0tLT4KCQk8ZGl2IGNsYXNzPSJsYS1hbmltLTEwIiBoaWRkZW4+PC9kaXY+Cgo8IS0tIC5jb3JuZXItcHJlbG9hZGVyIC0tPgoJCTxkaXYgaWQ9IndyYXBwZXIiIGhpZGRlbj4KCQkJPGRpdiBpZD0idXBsb2FkLXdpZGdldCI+CgkJCQk8aDE+CgkJCQkJPGkgY2xhc3M9ImZhIGZhLWNsb3VkLXVwbG9hZCI+PC9pPiBGaWxlIFVwbG9hZGVyCgkJCQk8L2gxPgogCgkJCQk8Zm9ybSBpZD0iZmlsZS11cGxvYWQtZm9ybSI+CgkJCQkJPGRpdiBjbGFzcz0iZmlsZS1pbnB1dC13cmFwIj4KCQkJCQkJZnVwcwoJCQkJCQk8aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0iZmlsZSIgaWQ9ImZpbGUiIG11bHRpcGxlPgoJCQkJCTwvZGl2PjwhLS0gLmZpbGUtaW5wdXQtd3JhcCAtLT4KCQkJCTwvZm9ybT48IS0tICNmaWxlLXVwbG9hZC1mb3JtIC0tPgoJCQk8L2Rpdj48IS0tICN1cGxvYWQtd2lkZ2V0IC0tPgogCgkJCTxkaXYgaWQ9InVwbG9hZC1yZXN1bHQiPgoJCQk8L2Rpdj48IS0tICN1cGxvYWQtcmVzdWx0IC0tPgoJCTwvZGl2PjwhLS0gI3dyYXBwZXIgLS0+CiAKCQk8ZGl2IGlkPSJwcmVsb2FkZXIiPgoJCQkJPGltZyBoZWlnaHQ9NTAgc3JjPSIuL2ltZ3MvYnRuL2tvYi5wbmciIGFsdD0icHJlbG9hZGVyX3VwIiAvPgoJCQkJPC9hPgoJCQk8L2Rpdj4KCQkKCQk8IS0tIFNDUklQVFMgLS0+CjwhLS0JCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImpzL2xpYnJhcmllcy9qcXVlcnktMi4xLjEubWluLmpzIj48L3NjcmlwdD4gLS0+CjwhLS0JCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4vanF1ZXJ5LTMuMy4xLmpzIiA+IC0tPgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImRhdGE6L3RleHQvcGxhaW47YmFzZTY0LEx5b2hDaUFxSUdwUmRXVnllU0JLWVhaaFUyTnlhWEIwSUV4cFluSmhjbmtnZGpNdU15NHhDaUFxSUdoMGRIQnpPaTh2YW5GMVpYSjVMbU52YlM4S0lDb0tJQ29nU1c1amJIVmtaWE1nVTJsNmVteGxMbXB6Q2lBcUlHaDBkSEJ6T2k4dmMybDZlbXhsYW5NdVkyOXRMd29nS2dvZ0tpQkRiM0I1Y21sbmFIUWdTbE1nUm05MWJtUmhkR2x2YmlCaGJtUWdiM1JvWlhJZ1kyOXVkSEpwWW5WMGIzSnpDaUFxSUZKbGJHVmhjMlZrSUhWdVpHVnlJSFJvWlNCTlNWUWdiR2xqWlc1elpRb2dLaUJvZEhSd2N6b3ZMMnB4ZFdWeWVTNXZjbWN2YkdsalpXNXpaUW9nS2dvZ0tpQkVZWFJsT2lBeU1ERTRMVEF4TFRJd1ZERTNPakkwV2dvZ0tpOEtLQ0JtZFc1amRHbHZiaWdnWjJ4dlltRnNMQ0JtWVdOMGIzSjVJQ2tnZXdvS0NTSjFjMlVnYzNSeWFXTjBJanNLQ2dscFppQW9JSFI1Y0dWdlppQnRiMlIxYkdVZ1BUMDlJQ0p2WW1wbFkzUWlJQ1ltSUhSNWNHVnZaaUJ0YjJSMWJHVXVaWGh3YjNKMGN5QTlQVDBnSW05aWFtVmpkQ0lnS1NCN0Nnb0pDUzh2SUVadmNpQkRiMjF0YjI1S1V5QmhibVFnUTI5dGJXOXVTbE10YkdsclpTQmxiblpwY205dWJXVnVkSE1nZDJobGNtVWdZU0J3Y205d1pYSWdZSGRwYm1SdmQyQUtDUWt2THlCcGN5QndjbVZ6Wlc1MExDQmxlR1ZqZFhSbElIUm9aU0JtWVdOMGIzSjVJR0Z1WkNCblpYUWdhbEYxWlhKNUxnb0pDUzh2SUVadmNpQmxiblpwY205dWJXVnVkSE1nZEdoaGRDQmtieUJ1YjNRZ2FHRjJaU0JoSUdCM2FXNWtiM2RnSUhkcGRHZ2dZU0JnWkc5amRXMWxiblJnQ2drSkx5OGdLSE4xWTJnZ1lYTWdUbTlrWlM1cWN5a3NJR1Y0Y0c5elpTQmhJR1poWTNSdmNua2dZWE1nYlc5a2RXeGxMbVY0Y0c5eWRITXVDZ2tKTHk4Z1ZHaHBjeUJoWTJObGJuUjFZWFJsY3lCMGFHVWdibVZsWkNCbWIzSWdkR2hsSUdOeVpXRjBhVzl1SUc5bUlHRWdjbVZoYkNCZ2QybHVaRzkzWUM0S0NRa3ZMeUJsTG1jdUlIWmhjaUJxVVhWbGNua2dQU0J5WlhGMWFYSmxLQ0pxY1hWbGNua2lLU2gzYVc1a2IzY3BPd29KQ1M4dklGTmxaU0IwYVdOclpYUWdJekUwTlRRNUlHWnZjaUJ0YjNKbElHbHVabTh1Q2drSmJXOWtkV3hsTG1WNGNHOXlkSE1nUFNCbmJHOWlZV3d1Wkc5amRXMWxiblFnUHdvSkNRbG1ZV04wYjNKNUtDQm5iRzlpWVd3c0lIUnlkV1VnS1NBNkNna0pDV1oxYm1OMGFXOXVLQ0IzSUNrZ2V3b0pDUWtKYVdZZ0tDQWhkeTVrYjJOMWJXVnVkQ0FwSUhzS0NRa0pDUWwwYUhKdmR5QnVaWGNnUlhKeWIzSW9JQ0pxVVhWbGNua2djbVZ4ZFdseVpYTWdZU0IzYVc1a2IzY2dkMmwwYUNCaElHUnZZM1Z0Wlc1MElpQXBPd29KQ1FrSmZRb0pDUWtKY21WMGRYSnVJR1poWTNSdmNua29JSGNnS1RzS0NRa0pmVHNLQ1gwZ1pXeHpaU0I3Q2drSlptRmpkRzl5ZVNnZ1oyeHZZbUZzSUNrN0NnbDlDZ292THlCUVlYTnpJSFJvYVhNZ2FXWWdkMmx1Wkc5M0lHbHpJRzV2ZENCa1pXWnBibVZrSUhsbGRBcDlJQ2tvSUhSNWNHVnZaaUIzYVc1a2IzY2dJVDA5SUNKMWJtUmxabWx1WldRaUlEOGdkMmx1Wkc5M0lEb2dkR2hwY3l3Z1puVnVZM1JwYjI0b0lIZHBibVJ2ZHl3Z2JtOUhiRzlpWVd3Z0tTQjdDZ292THlCRlpHZGxJRHc5SURFeUlDMGdNVE1yTENCR2FYSmxabTk0SUR3OU1UZ2dMU0EwTlNzc0lFbEZJREV3SUMwZ01URXNJRk5oWm1GeWFTQTFMakVnTFNBNUt5d2dhVTlUSURZZ0xTQTVMakVLTHk4Z2RHaHliM2NnWlhoalpYQjBhVzl1Y3lCM2FHVnVJRzV2YmkxemRISnBZM1FnWTI5a1pTQW9aUzVuTGl3Z1FWTlFMazVGVkNBMExqVXBJR0ZqWTJWemMyVnpJSE4wY21samRDQnRiMlJsQ2k4dklHRnlaM1Z0Wlc1MGN5NWpZV3hzWldVdVkyRnNiR1Z5SUNoMGNtRmpMVEV6TXpNMUtTNGdRblYwSUdGeklHOW1JR3BSZFdWeWVTQXpMakFnS0RJd01UWXBMQ0J6ZEhKcFkzUWdiVzlrWlNCemFHOTFiR1FnWW1VZ1kyOXRiVzl1Q2k4dklHVnViM1ZuYUNCMGFHRjBJR0ZzYkNCemRXTm9JR0YwZEdWdGNIUnpJR0Z5WlNCbmRXRnlaR1ZrSUdsdUlHRWdkSEo1SUdKc2IyTnJMZ29pZFhObElITjBjbWxqZENJN0NncDJZWElnWVhKeUlEMGdXMTA3Q2dwMllYSWdaRzlqZFcxbGJuUWdQU0IzYVc1a2IzY3VaRzlqZFcxbGJuUTdDZ3AyWVhJZ1oyVjBVSEp2ZEc4Z1BTQlBZbXBsWTNRdVoyVjBVSEp2ZEc5MGVYQmxUMlk3Q2dwMllYSWdjMnhwWTJVZ1BTQmhjbkl1YzJ4cFkyVTdDZ3AyWVhJZ1kyOXVZMkYwSUQwZ1lYSnlMbU52Ym1OaGREc0tDblpoY2lCd2RYTm9JRDBnWVhKeUxuQjFjMmc3Q2dwMllYSWdhVzVrWlhoUFppQTlJR0Z5Y2k1cGJtUmxlRTltT3dvS2RtRnlJR05zWVhOek1uUjVjR1VnUFNCN2ZUc0tDblpoY2lCMGIxTjBjbWx1WnlBOUlHTnNZWE56TW5SNWNHVXVkRzlUZEhKcGJtYzdDZ3AyWVhJZ2FHRnpUM2R1SUQwZ1kyeGhjM015ZEhsd1pTNW9ZWE5QZDI1UWNtOXdaWEowZVRzS0NuWmhjaUJtYmxSdlUzUnlhVzVuSUQwZ2FHRnpUM2R1TG5SdlUzUnlhVzVuT3dvS2RtRnlJRTlpYW1WamRFWjFibU4wYVc5dVUzUnlhVzVuSUQwZ1ptNVViMU4wY21sdVp5NWpZV3hzS0NCUFltcGxZM1FnS1RzS0NuWmhjaUJ6ZFhCd2IzSjBJRDBnZTMwN0NncDJZWElnYVhOR2RXNWpkR2x2YmlBOUlHWjFibU4wYVc5dUlHbHpSblZ1WTNScGIyNG9JRzlpYWlBcElIc0tDaUFnSUNBZ0lDOHZJRk4xY0hCdmNuUTZJRU5vY205dFpTQThQVFUzTENCR2FYSmxabTk0SUR3OU5USUtJQ0FnSUNBZ0x5OGdTVzRnYzI5dFpTQmljbTkzYzJWeWN5d2dkSGx3Wlc5bUlISmxkSFZ5Ym5NZ0ltWjFibU4wYVc5dUlpQm1iM0lnU0ZSTlRDQThiMkpxWldOMFBpQmxiR1Z0Wlc1MGN3b2dJQ0FnSUNBdkx5QW9hUzVsTGl3Z1lIUjVjR1Z2WmlCa2IyTjFiV1Z1ZEM1amNtVmhkR1ZGYkdWdFpXNTBLQ0FpYjJKcVpXTjBJaUFwSUQwOVBTQWlablZ1WTNScGIyNGlZQ2t1Q2lBZ0lDQWdJQzh2SUZkbElHUnZiaWQwSUhkaGJuUWdkRzhnWTJ4aGMzTnBabmtnS21GdWVTb2dSRTlOSUc1dlpHVWdZWE1nWVNCbWRXNWpkR2x2Ymk0S0lDQWdJQ0FnY21WMGRYSnVJSFI1Y0dWdlppQnZZbW9nUFQwOUlDSm1kVzVqZEdsdmJpSWdKaVlnZEhsd1pXOW1JRzlpYWk1dWIyUmxWSGx3WlNBaFBUMGdJbTUxYldKbGNpSTdDaUFnZlRzS0NncDJZWElnYVhOWGFXNWtiM2NnUFNCbWRXNWpkR2x2YmlCcGMxZHBibVJ2ZHlnZ2IySnFJQ2tnZXdvSkNYSmxkSFZ5YmlCdlltb2dJVDBnYm5Wc2JDQW1KaUJ2WW1vZ1BUMDlJRzlpYWk1M2FXNWtiM2M3Q2dsOU93b0tDZ29LQ1haaGNpQndjbVZ6WlhKMlpXUlRZM0pwY0hSQmRIUnlhV0oxZEdWeklEMGdld29KQ1hSNWNHVTZJSFJ5ZFdVc0Nna0pjM0pqT2lCMGNuVmxMQW9KQ1c1dlRXOWtkV3hsT2lCMGNuVmxDZ2w5T3dvS0NXWjFibU4wYVc5dUlFUlBUVVYyWVd3b0lHTnZaR1VzSUdSdll5d2dibTlrWlNBcElIc0tDUWxrYjJNZ1BTQmtiMk1nZkh3Z1pHOWpkVzFsYm5RN0Nnb0pDWFpoY2lCcExBb0pDUWx6WTNKcGNIUWdQU0JrYjJNdVkzSmxZWFJsUld4bGJXVnVkQ2dnSW5OamNtbHdkQ0lnS1RzS0Nna0pjMk55YVhCMExuUmxlSFFnUFNCamIyUmxPd29KQ1dsbUlDZ2dibTlrWlNBcElIc0tDUWtKWm05eUlDZ2dhU0JwYmlCd2NtVnpaWEoyWldSVFkzSnBjSFJCZEhSeWFXSjFkR1Z6SUNrZ2V3b0pDUWtKYVdZZ0tDQnViMlJsV3lCcElGMGdLU0I3Q2drSkNRa0pjMk55YVhCMFd5QnBJRjBnUFNCdWIyUmxXeUJwSUYwN0Nna0pDUWw5Q2drSkNYMEtDUWw5Q2drSlpHOWpMbWhsWVdRdVlYQndaVzVrUTJocGJHUW9JSE5qY21sd2RDQXBMbkJoY21WdWRFNXZaR1V1Y21WdGIzWmxRMmhwYkdRb0lITmpjbWx3ZENBcE93b0pmUW9LQ21aMWJtTjBhVzl1SUhSdlZIbHdaU2dnYjJKcUlDa2dld29KYVdZZ0tDQnZZbW9nUFQwZ2JuVnNiQ0FwSUhzS0NRbHlaWFIxY200Z2IySnFJQ3NnSWlJN0NnbDlDZ29KTHk4Z1UzVndjRzl5ZERvZ1FXNWtjbTlwWkNBOFBUSXVNeUJ2Ym14NUlDaG1kVzVqZEdsdmJtbHphQ0JTWldkRmVIQXBDZ2x5WlhSMWNtNGdkSGx3Wlc5bUlHOWlhaUE5UFQwZ0ltOWlhbVZqZENJZ2ZId2dkSGx3Wlc5bUlHOWlhaUE5UFQwZ0ltWjFibU4wYVc5dUlpQS9DZ2tKWTJ4aGMzTXlkSGx3WlZzZ2RHOVRkSEpwYm1jdVkyRnNiQ2dnYjJKcUlDa2dYU0I4ZkNBaWIySnFaV04wSWlBNkNna0pkSGx3Wlc5bUlHOWlhanNLZlFvdktpQm5iRzlpWVd3Z1UzbHRZbTlzSUNvdkNpOHZJRVJsWm1sdWFXNW5JSFJvYVhNZ1oyeHZZbUZzSUdsdUlDNWxjMnhwYm5SeVl5NXFjMjl1SUhkdmRXeGtJR055WldGMFpTQmhJR1JoYm1kbGNpQnZaaUIxYzJsdVp5QjBhR1VnWjJ4dlltRnNDaTh2SUhWdVozVmhjbVJsWkNCcGJpQmhibTkwYUdWeUlIQnNZV05sTENCcGRDQnpaV1Z0Y3lCellXWmxjaUIwYnlCa1pXWnBibVVnWjJ4dlltRnNJRzl1YkhrZ1ptOXlJSFJvYVhNZ2JXOWtkV3hsQ2dvS0NuWmhjZ29KZG1WeWMybHZiaUE5SUNJekxqTXVNU0lzQ2dvSkx5OGdSR1ZtYVc1bElHRWdiRzlqWVd3Z1kyOXdlU0J2WmlCcVVYVmxjbmtLQ1dwUmRXVnllU0E5SUdaMWJtTjBhVzl1S0NCelpXeGxZM1J2Y2l3Z1kyOXVkR1Y0ZENBcElIc0tDZ2tKTHk4Z1ZHaGxJR3BSZFdWeWVTQnZZbXBsWTNRZ2FYTWdZV04wZFdGc2JIa2dhblZ6ZENCMGFHVWdhVzVwZENCamIyNXpkSEoxWTNSdmNpQW5aVzVvWVc1alpXUW5DZ2tKTHk4Z1RtVmxaQ0JwYm1sMElHbG1JR3BSZFdWeWVTQnBjeUJqWVd4c1pXUWdLR3AxYzNRZ1lXeHNiM2NnWlhKeWIzSWdkRzhnWW1VZ2RHaHliM2R1SUdsbUlHNXZkQ0JwYm1Oc2RXUmxaQ2tLQ1FseVpYUjFjbTRnYm1WM0lHcFJkV1Z5ZVM1bWJpNXBibWwwS0NCelpXeGxZM1J2Y2l3Z1kyOXVkR1Y0ZENBcE93b0pmU3dLQ2drdkx5QlRkWEJ3YjNKME9pQkJibVJ5YjJsa0lEdzlOQzR3SUc5dWJIa0tDUzh2SUUxaGEyVWdjM1Z5WlNCM1pTQjBjbWx0SUVKUFRTQmhibVFnVGtKVFVBb0pjblJ5YVcwZ1BTQXZYbHRjYzF4MVJrVkdSbHg0UVRCZEszeGJYSE5jZFVaRlJrWmNlRUV3WFNza0wyYzdDZ3BxVVhWbGNua3VabTRnUFNCcVVYVmxjbmt1Y0hKdmRHOTBlWEJsSUQwZ2V3b0tDUzh2SUZSb1pTQmpkWEp5Wlc1MElIWmxjbk5wYjI0Z2IyWWdhbEYxWlhKNUlHSmxhVzVuSUhWelpXUUtDV3B4ZFdWeWVUb2dkbVZ5YzJsdmJpd0tDZ2xqYjI1emRISjFZM1J2Y2pvZ2FsRjFaWEo1TEFvS0NTOHZJRlJvWlNCa1pXWmhkV3gwSUd4bGJtZDBhQ0J2WmlCaElHcFJkV1Z5ZVNCdlltcGxZM1FnYVhNZ01Bb0piR1Z1WjNSb09pQXdMQW9LQ1hSdlFYSnlZWGs2SUdaMWJtTjBhVzl1S0NrZ2V3b0pDWEpsZEhWeWJpQnpiR2xqWlM1allXeHNLQ0IwYUdseklDazdDZ2w5TEFvS0NTOHZJRWRsZENCMGFHVWdUblJvSUdWc1pXMWxiblFnYVc0Z2RHaGxJRzFoZEdOb1pXUWdaV3hsYldWdWRDQnpaWFFnVDFJS0NTOHZJRWRsZENCMGFHVWdkMmh2YkdVZ2JXRjBZMmhsWkNCbGJHVnRaVzUwSUhObGRDQmhjeUJoSUdOc1pXRnVJR0Z5Y21GNUNnbG5aWFE2SUdaMWJtTjBhVzl1S0NCdWRXMGdLU0I3Q2dvSkNTOHZJRkpsZEhWeWJpQmhiR3dnZEdobElHVnNaVzFsYm5SeklHbHVJR0VnWTJ4bFlXNGdZWEp5WVhrS0NRbHBaaUFvSUc1MWJTQTlQU0J1ZFd4c0lDa2dld29KQ1FseVpYUjFjbTRnYzJ4cFkyVXVZMkZzYkNnZ2RHaHBjeUFwT3dvSkNYMEtDZ2tKTHk4Z1VtVjBkWEp1SUdwMWMzUWdkR2hsSUc5dVpTQmxiR1Z0Wlc1MElHWnliMjBnZEdobElITmxkQW9KQ1hKbGRIVnliaUJ1ZFcwZ1BDQXdJRDhnZEdocGMxc2diblZ0SUNzZ2RHaHBjeTVzWlc1bmRHZ2dYU0E2SUhSb2FYTmJJRzUxYlNCZE93b0pmU3dLQ2drdkx5QlVZV3RsSUdGdUlHRnljbUY1SUc5bUlHVnNaVzFsYm5SeklHRnVaQ0J3ZFhOb0lHbDBJRzl1ZEc4Z2RHaGxJSE4wWVdOckNna3ZMeUFvY21WMGRYSnVhVzVuSUhSb1pTQnVaWGNnYldGMFkyaGxaQ0JsYkdWdFpXNTBJSE5sZENrS0NYQjFjMmhUZEdGamF6b2dablZ1WTNScGIyNG9JR1ZzWlcxeklDa2dld29LQ1Frdkx5QkNkV2xzWkNCaElHNWxkeUJxVVhWbGNua2diV0YwWTJobFpDQmxiR1Z0Wlc1MElITmxkQW9KQ1haaGNpQnlaWFFnUFNCcVVYVmxjbmt1YldWeVoyVW9JSFJvYVhNdVkyOXVjM1J5ZFdOMGIzSW9LU3dnWld4bGJYTWdLVHNLQ2drSkx5OGdRV1JrSUhSb1pTQnZiR1FnYjJKcVpXTjBJRzl1ZEc4Z2RHaGxJSE4wWVdOcklDaGhjeUJoSUhKbFptVnlaVzVqWlNrS0NRbHlaWFF1Y0hKbGRrOWlhbVZqZENBOUlIUm9hWE03Q2dvSkNTOHZJRkpsZEhWeWJpQjBhR1VnYm1WM2JIa3RabTl5YldWa0lHVnNaVzFsYm5RZ2MyVjBDZ2tKY21WMGRYSnVJSEpsZERzS0NYMHNDZ29KTHk4Z1JYaGxZM1YwWlNCaElHTmhiR3hpWVdOcklHWnZjaUJsZG1WeWVTQmxiR1Z0Wlc1MElHbHVJSFJvWlNCdFlYUmphR1ZrSUhObGRDNEtDV1ZoWTJnNklHWjFibU4wYVc5dUtDQmpZV3hzWW1GamF5QXBJSHNLQ1FseVpYUjFjbTRnYWxGMVpYSjVMbVZoWTJnb0lIUm9hWE1zSUdOaGJHeGlZV05ySUNrN0NnbDlMQW9LQ1cxaGNEb2dablZ1WTNScGIyNG9JR05oYkd4aVlXTnJJQ2tnZXdvSkNYSmxkSFZ5YmlCMGFHbHpMbkIxYzJoVGRHRmpheWdnYWxGMVpYSjVMbTFoY0NnZ2RHaHBjeXdnWm5WdVkzUnBiMjRvSUdWc1pXMHNJR2tnS1NCN0Nna0pDWEpsZEhWeWJpQmpZV3hzWW1GamF5NWpZV3hzS0NCbGJHVnRMQ0JwTENCbGJHVnRJQ2s3Q2drSmZTQXBJQ2s3Q2dsOUxBb0tDWE5zYVdObE9pQm1kVzVqZEdsdmJpZ3BJSHNLQ1FseVpYUjFjbTRnZEdocGN5NXdkWE5vVTNSaFkyc29JSE5zYVdObExtRndjR3g1S0NCMGFHbHpMQ0JoY21kMWJXVnVkSE1nS1NBcE93b0pmU3dLQ2dsbWFYSnpkRG9nWm5WdVkzUnBiMjRvS1NCN0Nna0pjbVYwZFhKdUlIUm9hWE11WlhFb0lEQWdLVHNLQ1gwc0Nnb0piR0Z6ZERvZ1puVnVZM1JwYjI0b0tTQjdDZ2tKY21WMGRYSnVJSFJvYVhNdVpYRW9JQzB4SUNrN0NnbDlMQW9LQ1dWeE9pQm1kVzVqZEdsdmJpZ2dhU0FwSUhzS0NRbDJZWElnYkdWdUlEMGdkR2hwY3k1c1pXNW5kR2dzQ2drSkNXb2dQU0FyYVNBcklDZ2dhU0E4SURBZ1B5QnNaVzRnT2lBd0lDazdDZ2tKY21WMGRYSnVJSFJvYVhNdWNIVnphRk4wWVdOcktDQnFJRDQ5SURBZ0ppWWdhaUE4SUd4bGJpQS9JRnNnZEdocGMxc2dhaUJkSUYwZ09pQmJYU0FwT3dvSmZTd0tDZ2xsYm1RNklHWjFibU4wYVc5dUtDa2dld29KQ1hKbGRIVnliaUIwYUdsekxuQnlaWFpQWW1wbFkzUWdmSHdnZEdocGN5NWpiMjV6ZEhKMVkzUnZjaWdwT3dvSmZTd0tDZ2t2THlCR2IzSWdhVzUwWlhKdVlXd2dkWE5sSUc5dWJIa3VDZ2t2THlCQ1pXaGhkbVZ6SUd4cGEyVWdZVzRnUVhKeVlYa25jeUJ0WlhSb2IyUXNJRzV2ZENCc2FXdGxJR0VnYWxGMVpYSjVJRzFsZEdodlpDNEtDWEIxYzJnNklIQjFjMmdzQ2dsemIzSjBPaUJoY25JdWMyOXlkQ3dLQ1hOd2JHbGpaVG9nWVhKeUxuTndiR2xqWlFwOU93b0thbEYxWlhKNUxtVjRkR1Z1WkNBOUlHcFJkV1Z5ZVM1bWJpNWxlSFJsYm1RZ1BTQm1kVzVqZEdsdmJpZ3BJSHNLQ1haaGNpQnZjSFJwYjI1ekxDQnVZVzFsTENCemNtTXNJR052Y0hrc0lHTnZjSGxKYzBGeWNtRjVMQ0JqYkc5dVpTd0tDUWwwWVhKblpYUWdQU0JoY21kMWJXVnVkSE5iSURBZ1hTQjhmQ0I3ZlN3S0NRbHBJRDBnTVN3S0NRbHNaVzVuZEdnZ1BTQmhjbWQxYldWdWRITXViR1Z1WjNSb0xBb0pDV1JsWlhBZ1BTQm1ZV3h6WlRzS0Nna3ZMeUJJWVc1a2JHVWdZU0JrWldWd0lHTnZjSGtnYzJsMGRXRjBhVzl1Q2dscFppQW9JSFI1Y0dWdlppQjBZWEpuWlhRZ1BUMDlJQ0ppYjI5c1pXRnVJaUFwSUhzS0NRbGtaV1Z3SUQwZ2RHRnlaMlYwT3dvS0NRa3ZMeUJUYTJsd0lIUm9aU0JpYjI5c1pXRnVJR0Z1WkNCMGFHVWdkR0Z5WjJWMENna0pkR0Z5WjJWMElEMGdZWEpuZFcxbGJuUnpXeUJwSUYwZ2ZId2dlMzA3Q2drSmFTc3JPd29KZlFvS0NTOHZJRWhoYm1Sc1pTQmpZWE5sSUhkb1pXNGdkR0Z5WjJWMElHbHpJR0VnYzNSeWFXNW5JRzl5SUhOdmJXVjBhR2x1WnlBb2NHOXpjMmxpYkdVZ2FXNGdaR1ZsY0NCamIzQjVLUW9KYVdZZ0tDQjBlWEJsYjJZZ2RHRnlaMlYwSUNFOVBTQWliMkpxWldOMElpQW1KaUFoYVhOR2RXNWpkR2x2YmlnZ2RHRnlaMlYwSUNrZ0tTQjdDZ2tKZEdGeVoyVjBJRDBnZTMwN0NnbDlDZ29KTHk4Z1JYaDBaVzVrSUdwUmRXVnllU0JwZEhObGJHWWdhV1lnYjI1c2VTQnZibVVnWVhKbmRXMWxiblFnYVhNZ2NHRnpjMlZrQ2dscFppQW9JR2tnUFQwOUlHeGxibWQwYUNBcElIc0tDUWwwWVhKblpYUWdQU0IwYUdsek93b0pDV2t0TFRzS0NYMEtDZ2xtYjNJZ0tDQTdJR2tnUENCc1pXNW5kR2c3SUdrckt5QXBJSHNLQ2drSkx5OGdUMjVzZVNCa1pXRnNJSGRwZEdnZ2JtOXVMVzUxYkd3dmRXNWtaV1pwYm1Wa0lIWmhiSFZsY3dvSkNXbG1JQ2dnS0NCdmNIUnBiMjV6SUQwZ1lYSm5kVzFsYm5Seld5QnBJRjBnS1NBaFBTQnVkV3hzSUNrZ2V3b0tDUWtKTHk4Z1JYaDBaVzVrSUhSb1pTQmlZWE5sSUc5aWFtVmpkQW9KQ1FsbWIzSWdLQ0J1WVcxbElHbHVJRzl3ZEdsdmJuTWdLU0I3Q2drSkNRbHpjbU1nUFNCMFlYSm5aWFJiSUc1aGJXVWdYVHNLQ1FrSkNXTnZjSGtnUFNCdmNIUnBiMjV6V3lCdVlXMWxJRjA3Q2dvSkNRa0pMeThnVUhKbGRtVnVkQ0J1WlhabGNpMWxibVJwYm1jZ2JHOXZjQW9KQ1FrSmFXWWdLQ0IwWVhKblpYUWdQVDA5SUdOdmNIa2dLU0I3Q2drSkNRa0pZMjl1ZEdsdWRXVTdDZ2tKQ1FsOUNnb0pDUWtKTHk4Z1VtVmpkWEp6WlNCcFppQjNaU2R5WlNCdFpYSm5hVzVuSUhCc1lXbHVJRzlpYW1WamRITWdiM0lnWVhKeVlYbHpDZ2tKQ1FscFppQW9JR1JsWlhBZ0ppWWdZMjl3ZVNBbUppQW9JR3BSZFdWeWVTNXBjMUJzWVdsdVQySnFaV04wS0NCamIzQjVJQ2tnZkh3S0NRa0pDUWtvSUdOdmNIbEpjMEZ5Y21GNUlEMGdRWEp5WVhrdWFYTkJjbkpoZVNnZ1kyOXdlU0FwSUNrZ0tTQXBJSHNLQ2drSkNRa0phV1lnS0NCamIzQjVTWE5CY25KaGVTQXBJSHNLQ1FrSkNRa0pZMjl3ZVVselFYSnlZWGtnUFNCbVlXeHpaVHNLQ1FrSkNRa0pZMnh2Ym1VZ1BTQnpjbU1nSmlZZ1FYSnlZWGt1YVhOQmNuSmhlU2dnYzNKaklDa2dQeUJ6Y21NZ09pQmJYVHNLQ2drSkNRa0pmU0JsYkhObElIc0tDUWtKQ1FrSlkyeHZibVVnUFNCemNtTWdKaVlnYWxGMVpYSjVMbWx6VUd4aGFXNVBZbXBsWTNRb0lITnlZeUFwSUQ4Z2MzSmpJRG9nZTMwN0Nna0pDUWtKZlFvS0NRa0pDUWt2THlCT1pYWmxjaUJ0YjNabElHOXlhV2RwYm1Gc0lHOWlhbVZqZEhNc0lHTnNiMjVsSUhSb1pXMEtDUWtKQ1FsMFlYSm5aWFJiSUc1aGJXVWdYU0E5SUdwUmRXVnllUzVsZUhSbGJtUW9JR1JsWlhBc0lHTnNiMjVsTENCamIzQjVJQ2s3Q2dvSkNRa0pMeThnUkc5dUozUWdZbkpwYm1jZ2FXNGdkVzVrWldacGJtVmtJSFpoYkhWbGN3b0pDUWtKZlNCbGJITmxJR2xtSUNnZ1kyOXdlU0FoUFQwZ2RXNWtaV1pwYm1Wa0lDa2dld29KQ1FrSkNYUmhjbWRsZEZzZ2JtRnRaU0JkSUQwZ1kyOXdlVHNLQ1FrSkNYMEtDUWtKZlFvSkNYMEtDWDBLQ2drdkx5QlNaWFIxY200Z2RHaGxJRzF2WkdsbWFXVmtJRzlpYW1WamRBb0pjbVYwZFhKdUlIUmhjbWRsZERzS2ZUc0tDbXBSZFdWeWVTNWxlSFJsYm1Rb0lIc0tDZ2t2THlCVmJtbHhkV1VnWm05eUlHVmhZMmdnWTI5d2VTQnZaaUJxVVhWbGNua2diMjRnZEdobElIQmhaMlVLQ1dWNGNHRnVaRzg2SUNKcVVYVmxjbmtpSUNzZ0tDQjJaWEp6YVc5dUlDc2dUV0YwYUM1eVlXNWtiMjBvS1NBcExuSmxjR3hoWTJVb0lDOWNSQzluTENBaUlpQXBMQW9LQ1M4dklFRnpjM1Z0WlNCcVVYVmxjbmtnYVhNZ2NtVmhaSGtnZDJsMGFHOTFkQ0IwYUdVZ2NtVmhaSGtnYlc5a2RXeGxDZ2xwYzFKbFlXUjVPaUIwY25WbExBb0tDV1Z5Y205eU9pQm1kVzVqZEdsdmJpZ2diWE5uSUNrZ2V3b0pDWFJvY205M0lHNWxkeUJGY25KdmNpZ2diWE5uSUNrN0NnbDlMQW9LQ1c1dmIzQTZJR1oxYm1OMGFXOXVLQ2tnZTMwc0Nnb0phWE5RYkdGcGJrOWlhbVZqZERvZ1puVnVZM1JwYjI0b0lHOWlhaUFwSUhzS0NRbDJZWElnY0hKdmRHOHNJRU4wYjNJN0Nnb0pDUzh2SUVSbGRHVmpkQ0J2WW5acGIzVnpJRzVsWjJGMGFYWmxjd29KQ1M4dklGVnpaU0IwYjFOMGNtbHVaeUJwYm5OMFpXRmtJRzltSUdwUmRXVnllUzUwZVhCbElIUnZJR05oZEdOb0lHaHZjM1FnYjJKcVpXTjBjd29KQ1dsbUlDZ2dJVzlpYWlCOGZDQjBiMU4wY21sdVp5NWpZV3hzS0NCdlltb2dLU0FoUFQwZ0lsdHZZbXBsWTNRZ1QySnFaV04wWFNJZ0tTQjdDZ2tKQ1hKbGRIVnliaUJtWVd4elpUc0tDUWw5Q2dvSkNYQnliM1J2SUQwZ1oyVjBVSEp2ZEc4b0lHOWlhaUFwT3dvS0NRa3ZMeUJQWW1wbFkzUnpJSGRwZEdnZ2JtOGdjSEp2ZEc5MGVYQmxJQ2hsTG1jdUxDQmdUMkpxWldOMExtTnlaV0YwWlNnZ2JuVnNiQ0FwWUNrZ1lYSmxJSEJzWVdsdUNna0phV1lnS0NBaGNISnZkRzhnS1NCN0Nna0pDWEpsZEhWeWJpQjBjblZsT3dvSkNYMEtDZ2tKTHk4Z1QySnFaV04wY3lCM2FYUm9JSEJ5YjNSdmRIbHdaU0JoY21VZ2NHeGhhVzRnYVdabUlIUm9aWGtnZDJWeVpTQmpiMjV6ZEhKMVkzUmxaQ0JpZVNCaElHZHNiMkpoYkNCUFltcGxZM1FnWm5WdVkzUnBiMjRLQ1FsRGRHOXlJRDBnYUdGelQzZHVMbU5oYkd3b0lIQnliM1J2TENBaVkyOXVjM1J5ZFdOMGIzSWlJQ2tnSmlZZ2NISnZkRzh1WTI5dWMzUnlkV04wYjNJN0Nna0pjbVYwZFhKdUlIUjVjR1Z2WmlCRGRHOXlJRDA5UFNBaVpuVnVZM1JwYjI0aUlDWW1JR1p1Vkc5VGRISnBibWN1WTJGc2JDZ2dRM1J2Y2lBcElEMDlQU0JQWW1wbFkzUkdkVzVqZEdsdmJsTjBjbWx1WnpzS0NYMHNDZ29KYVhORmJYQjBlVTlpYW1WamREb2dablZ1WTNScGIyNG9JRzlpYWlBcElIc0tDZ2tKTHlvZ1pYTnNhVzUwTFdScGMyRmliR1VnYm04dGRXNTFjMlZrTFhaaGNuTWdLaThLQ1Frdkx5QlRaV1VnYUhSMGNITTZMeTluYVhSb2RXSXVZMjl0TDJWemJHbHVkQzlsYzJ4cGJuUXZhWE56ZFdWekx6WXhNalVLQ1FsMllYSWdibUZ0WlRzS0Nna0pabTl5SUNnZ2JtRnRaU0JwYmlCdlltb2dLU0I3Q2drSkNYSmxkSFZ5YmlCbVlXeHpaVHNLQ1FsOUNna0pjbVYwZFhKdUlIUnlkV1U3Q2dsOUxBb0tDUzh2SUVWMllXeDFZWFJsY3lCaElITmpjbWx3ZENCcGJpQmhJR2RzYjJKaGJDQmpiMjUwWlhoMENnbG5iRzlpWVd4RmRtRnNPaUJtZFc1amRHbHZiaWdnWTI5a1pTQXBJSHNLQ1FsRVQwMUZkbUZzS0NCamIyUmxJQ2s3Q2dsOUxBb0tDV1ZoWTJnNklHWjFibU4wYVc5dUtDQnZZbW9zSUdOaGJHeGlZV05ySUNrZ2V3b0pDWFpoY2lCc1pXNW5kR2dzSUdrZ1BTQXdPd29LQ1FscFppQW9JR2x6UVhKeVlYbE1hV3RsS0NCdlltb2dLU0FwSUhzS0NRa0piR1Z1WjNSb0lEMGdiMkpxTG14bGJtZDBhRHNLQ1FrSlptOXlJQ2dnT3lCcElEd2diR1Z1WjNSb095QnBLeXNnS1NCN0Nna0pDUWxwWmlBb0lHTmhiR3hpWVdOckxtTmhiR3dvSUc5aWFsc2dhU0JkTENCcExDQnZZbXBiSUdrZ1hTQXBJRDA5UFNCbVlXeHpaU0FwSUhzS0NRa0pDUWxpY21WaGF6c0tDUWtKQ1gwS0NRa0pmUW9KQ1gwZ1pXeHpaU0I3Q2drSkNXWnZjaUFvSUdrZ2FXNGdiMkpxSUNrZ2V3b0pDUWtKYVdZZ0tDQmpZV3hzWW1GamF5NWpZV3hzS0NCdlltcGJJR2tnWFN3Z2FTd2diMkpxV3lCcElGMGdLU0E5UFQwZ1ptRnNjMlVnS1NCN0Nna0pDUWtKWW5KbFlXczdDZ2tKQ1FsOUNna0pDWDBLQ1FsOUNnb0pDWEpsZEhWeWJpQnZZbW83Q2dsOUxBb0tDUzh2SUZOMWNIQnZjblE2SUVGdVpISnZhV1FnUEQwMExqQWdiMjVzZVFvSmRISnBiVG9nWm5WdVkzUnBiMjRvSUhSbGVIUWdLU0I3Q2drSmNtVjBkWEp1SUhSbGVIUWdQVDBnYm5Wc2JDQS9DZ2tKQ1NJaUlEb0tDUWtKS0NCMFpYaDBJQ3NnSWlJZ0tTNXlaWEJzWVdObEtDQnlkSEpwYlN3Z0lpSWdLVHNLQ1gwc0Nnb0pMeThnY21WemRXeDBjeUJwY3lCbWIzSWdhVzUwWlhKdVlXd2dkWE5oWjJVZ2IyNXNlUW9KYldGclpVRnljbUY1T2lCbWRXNWpkR2x2YmlnZ1lYSnlMQ0J5WlhOMWJIUnpJQ2tnZXdvSkNYWmhjaUJ5WlhRZ1BTQnlaWE4xYkhSeklIeDhJRnRkT3dvS0NRbHBaaUFvSUdGeWNpQWhQU0J1ZFd4c0lDa2dld29KQ1FscFppQW9JR2x6UVhKeVlYbE1hV3RsS0NCUFltcGxZM1FvSUdGeWNpQXBJQ2tnS1NCN0Nna0pDUWxxVVhWbGNua3ViV1Z5WjJVb0lISmxkQ3dLQ1FrSkNRbDBlWEJsYjJZZ1lYSnlJRDA5UFNBaWMzUnlhVzVuSWlBL0Nna0pDUWtKV3lCaGNuSWdYU0E2SUdGeWNnb0pDUWtKS1RzS0NRa0pmU0JsYkhObElIc0tDUWtKQ1hCMWMyZ3VZMkZzYkNnZ2NtVjBMQ0JoY25JZ0tUc0tDUWtKZlFvSkNYMEtDZ2tKY21WMGRYSnVJSEpsZERzS0NYMHNDZ29KYVc1QmNuSmhlVG9nWm5WdVkzUnBiMjRvSUdWc1pXMHNJR0Z5Y2l3Z2FTQXBJSHNLQ1FseVpYUjFjbTRnWVhKeUlEMDlJRzUxYkd3Z1B5QXRNU0E2SUdsdVpHVjRUMll1WTJGc2JDZ2dZWEp5TENCbGJHVnRMQ0JwSUNrN0NnbDlMQW9LQ1M4dklGTjFjSEJ2Y25RNklFRnVaSEp2YVdRZ1BEMDBMakFnYjI1c2VTd2dVR2hoYm5SdmJVcFRJREVnYjI1c2VRb0pMeThnY0hWemFDNWhjSEJzZVNoZkxDQmhjbkpoZVd4cGEyVXBJSFJvY205M2N5QnZiaUJoYm1OcFpXNTBJRmRsWWt0cGRBb0piV1Z5WjJVNklHWjFibU4wYVc5dUtDQm1hWEp6ZEN3Z2MyVmpiMjVrSUNrZ2V3b0pDWFpoY2lCc1pXNGdQU0FyYzJWamIyNWtMbXhsYm1kMGFDd0tDUWtKYWlBOUlEQXNDZ2tKQ1drZ1BTQm1hWEp6ZEM1c1pXNW5kR2c3Q2dvSkNXWnZjaUFvSURzZ2FpQThJR3hsYmpzZ2Fpc3JJQ2tnZXdvSkNRbG1hWEp6ZEZzZ2FTc3JJRjBnUFNCelpXTnZibVJiSUdvZ1hUc0tDUWw5Q2dvSkNXWnBjbk4wTG14bGJtZDBhQ0E5SUdrN0Nnb0pDWEpsZEhWeWJpQm1hWEp6ZERzS0NYMHNDZ29KWjNKbGNEb2dablZ1WTNScGIyNG9JR1ZzWlcxekxDQmpZV3hzWW1GamF5d2dhVzUyWlhKMElDa2dld29KQ1haaGNpQmpZV3hzWW1GamEwbHVkbVZ5YzJVc0Nna0pDVzFoZEdOb1pYTWdQU0JiWFN3S0NRa0phU0E5SURBc0Nna0pDV3hsYm1kMGFDQTlJR1ZzWlcxekxteGxibWQwYUN3S0NRa0pZMkZzYkdKaFkydEZlSEJsWTNRZ1BTQWhhVzUyWlhKME93b0tDUWt2THlCSGJ5QjBhSEp2ZFdkb0lIUm9aU0JoY25KaGVTd2diMjVzZVNCellYWnBibWNnZEdobElHbDBaVzF6Q2drSkx5OGdkR2hoZENCd1lYTnpJSFJvWlNCMllXeHBaR0YwYjNJZ1puVnVZM1JwYjI0S0NRbG1iM0lnS0NBN0lHa2dQQ0JzWlc1bmRHZzdJR2tyS3lBcElIc0tDUWtKWTJGc2JHSmhZMnRKYm5abGNuTmxJRDBnSVdOaGJHeGlZV05yS0NCbGJHVnRjMXNnYVNCZExDQnBJQ2s3Q2drSkNXbG1JQ2dnWTJGc2JHSmhZMnRKYm5abGNuTmxJQ0U5UFNCallXeHNZbUZqYTBWNGNHVmpkQ0FwSUhzS0NRa0pDVzFoZEdOb1pYTXVjSFZ6YUNnZ1pXeGxiWE5iSUdrZ1hTQXBPd29KQ1FsOUNna0pmUW9LQ1FseVpYUjFjbTRnYldGMFkyaGxjenNLQ1gwc0Nnb0pMeThnWVhKbklHbHpJR1p2Y2lCcGJuUmxjbTVoYkNCMWMyRm5aU0J2Ym14NUNnbHRZWEE2SUdaMWJtTjBhVzl1S0NCbGJHVnRjeXdnWTJGc2JHSmhZMnNzSUdGeVp5QXBJSHNLQ1FsMllYSWdiR1Z1WjNSb0xDQjJZV3gxWlN3S0NRa0phU0E5SURBc0Nna0pDWEpsZENBOUlGdGRPd29LQ1Frdkx5QkhieUIwYUhKdmRXZG9JSFJvWlNCaGNuSmhlU3dnZEhKaGJuTnNZWFJwYm1jZ1pXRmphQ0J2WmlCMGFHVWdhWFJsYlhNZ2RHOGdkR2hsYVhJZ2JtVjNJSFpoYkhWbGN3b0pDV2xtSUNnZ2FYTkJjbkpoZVV4cGEyVW9JR1ZzWlcxeklDa2dLU0I3Q2drSkNXeGxibWQwYUNBOUlHVnNaVzF6TG14bGJtZDBhRHNLQ1FrSlptOXlJQ2dnT3lCcElEd2diR1Z1WjNSb095QnBLeXNnS1NCN0Nna0pDUWwyWVd4MVpTQTlJR05oYkd4aVlXTnJLQ0JsYkdWdGMxc2dhU0JkTENCcExDQmhjbWNnS1RzS0Nna0pDUWxwWmlBb0lIWmhiSFZsSUNFOUlHNTFiR3dnS1NCN0Nna0pDUWtKY21WMExuQjFjMmdvSUhaaGJIVmxJQ2s3Q2drSkNRbDlDZ2tKQ1gwS0Nna0pMeThnUjI4Z2RHaHliM1ZuYUNCbGRtVnllU0JyWlhrZ2IyNGdkR2hsSUc5aWFtVmpkQ3dLQ1FsOUlHVnNjMlVnZXdvSkNRbG1iM0lnS0NCcElHbHVJR1ZzWlcxeklDa2dld29KQ1FrSmRtRnNkV1VnUFNCallXeHNZbUZqYXlnZ1pXeGxiWE5iSUdrZ1hTd2dhU3dnWVhKbklDazdDZ29KQ1FrSmFXWWdLQ0IyWVd4MVpTQWhQU0J1ZFd4c0lDa2dld29KQ1FrSkNYSmxkQzV3ZFhOb0tDQjJZV3gxWlNBcE93b0pDUWtKZlFvSkNRbDlDZ2tKZlFvS0NRa3ZMeUJHYkdGMGRHVnVJR0Z1ZVNCdVpYTjBaV1FnWVhKeVlYbHpDZ2tKY21WMGRYSnVJR052Ym1OaGRDNWhjSEJzZVNnZ1cxMHNJSEpsZENBcE93b0pmU3dLQ2drdkx5QkJJR2RzYjJKaGJDQkhWVWxFSUdOdmRXNTBaWElnWm05eUlHOWlhbVZqZEhNS0NXZDFhV1E2SURFc0Nnb0pMeThnYWxGMVpYSjVMbk4xY0hCdmNuUWdhWE1nYm05MElIVnpaV1FnYVc0Z1EyOXlaU0JpZFhRZ2IzUm9aWElnY0hKdmFtVmpkSE1nWVhSMFlXTm9JSFJvWldseUNna3ZMeUJ3Y205d1pYSjBhV1Z6SUhSdklHbDBJSE52SUdsMElHNWxaV1J6SUhSdklHVjRhWE4wTGdvSmMzVndjRzl5ZERvZ2MzVndjRzl5ZEFwOUlDazdDZ3BwWmlBb0lIUjVjR1Z2WmlCVGVXMWliMndnUFQwOUlDSm1kVzVqZEdsdmJpSWdLU0I3Q2dscVVYVmxjbmt1Wm01YklGTjViV0p2YkM1cGRHVnlZWFJ2Y2lCZElEMGdZWEp5V3lCVGVXMWliMnd1YVhSbGNtRjBiM0lnWFRzS2ZRb0tMeThnVUc5d2RXeGhkR1VnZEdobElHTnNZWE56TW5SNWNHVWdiV0Z3Q21wUmRXVnllUzVsWVdOb0tDQWlRbTl2YkdWaGJpQk9kVzFpWlhJZ1UzUnlhVzVuSUVaMWJtTjBhVzl1SUVGeWNtRjVJRVJoZEdVZ1VtVm5SWGh3SUU5aWFtVmpkQ0JGY25KdmNpQlRlVzFpYjJ3aUxuTndiR2wwS0NBaUlDSWdLU3dLWm5WdVkzUnBiMjRvSUdrc0lHNWhiV1VnS1NCN0NnbGpiR0Z6Y3pKMGVYQmxXeUFpVzI5aWFtVmpkQ0FpSUNzZ2JtRnRaU0FySUNKZElpQmRJRDBnYm1GdFpTNTBiMHh2ZDJWeVEyRnpaU2dwT3dwOUlDazdDZ3BtZFc1amRHbHZiaUJwYzBGeWNtRjVUR2xyWlNnZ2IySnFJQ2tnZXdvS0NTOHZJRk4xY0hCdmNuUTZJSEpsWVd3Z2FVOVRJRGd1TWlCdmJteDVJQ2h1YjNRZ2NtVndjbTlrZFdOcFlteGxJR2x1SUhOcGJYVnNZWFJ2Y2lrS0NTOHZJR0JwYm1BZ1kyaGxZMnNnZFhObFpDQjBieUJ3Y21WMlpXNTBJRXBKVkNCbGNuSnZjaUFvWjJndE1qRTBOU2tLQ1M4dklHaGhjMDkzYmlCcGMyNG5kQ0IxYzJWa0lHaGxjbVVnWkhWbElIUnZJR1poYkhObElHNWxaMkYwYVhabGN3b0pMeThnY21WbllYSmthVzVuSUU1dlpHVnNhWE4wSUd4bGJtZDBhQ0JwYmlCSlJRb0pkbUZ5SUd4bGJtZDBhQ0E5SUNFaGIySnFJQ1ltSUNKc1pXNW5kR2dpSUdsdUlHOWlhaUFtSmlCdlltb3ViR1Z1WjNSb0xBb0pDWFI1Y0dVZ1BTQjBiMVI1Y0dVb0lHOWlhaUFwT3dvS0NXbG1JQ2dnYVhOR2RXNWpkR2x2YmlnZ2IySnFJQ2tnZkh3Z2FYTlhhVzVrYjNjb0lHOWlhaUFwSUNrZ2V3b0pDWEpsZEhWeWJpQm1ZV3h6WlRzS0NYMEtDZ2x5WlhSMWNtNGdkSGx3WlNBOVBUMGdJbUZ5Y21GNUlpQjhmQ0JzWlc1bmRHZ2dQVDA5SURBZ2ZId0tDUWwwZVhCbGIyWWdiR1Z1WjNSb0lEMDlQU0FpYm5WdFltVnlJaUFtSmlCc1pXNW5kR2dnUGlBd0lDWW1JQ2dnYkdWdVozUm9JQzBnTVNBcElHbHVJRzlpYWpzS2ZRcDJZWElnVTJsNmVteGxJRDBLTHlvaENpQXFJRk5wZW5wc1pTQkRVMU1nVTJWc1pXTjBiM0lnUlc1bmFXNWxJSFl5TGpNdU13b2dLaUJvZEhSd2N6b3ZMM05wZW5wc1pXcHpMbU52YlM4S0lDb0tJQ29nUTI5d2VYSnBaMmgwSUdwUmRXVnllU0JHYjNWdVpHRjBhVzl1SUdGdVpDQnZkR2hsY2lCamIyNTBjbWxpZFhSdmNuTUtJQ29nVW1Wc1pXRnpaV1FnZFc1a1pYSWdkR2hsSUUxSlZDQnNhV05sYm5ObENpQXFJR2gwZEhBNkx5OXFjWFZsY25rdWIzSm5MMnhwWTJWdWMyVUtJQ29LSUNvZ1JHRjBaVG9nTWpBeE5pMHdPQzB3T0FvZ0tpOEtLR1oxYm1OMGFXOXVLQ0IzYVc1a2IzY2dLU0I3Q2dwMllYSWdhU3dLQ1hOMWNIQnZjblFzQ2dsRmVIQnlMQW9KWjJWMFZHVjRkQ3dLQ1dseldFMU1MQW9KZEc5clpXNXBlbVVzQ2dsamIyMXdhV3hsTEFvSmMyVnNaV04wTEFvSmIzVjBaWEp0YjNOMFEyOXVkR1Y0ZEN3S0NYTnZjblJKYm5CMWRDd0tDV2hoYzBSMWNHeHBZMkYwWlN3S0Nna3ZMeUJNYjJOaGJDQmtiMk4xYldWdWRDQjJZWEp6Q2dselpYUkViMk4xYldWdWRDd0tDV1J2WTNWdFpXNTBMQW9KWkc5alJXeGxiU3dLQ1dSdlkzVnRaVzUwU1hOSVZFMU1MQW9KY21KMVoyZDVVVk5CTEFvSmNtSjFaMmQ1VFdGMFkyaGxjeXdLQ1cxaGRHTm9aWE1zQ2dsamIyNTBZV2x1Y3l3S0Nna3ZMeUJKYm5OMFlXNWpaUzF6Y0dWamFXWnBZeUJrWVhSaENnbGxlSEJoYm1SdklEMGdJbk5wZW5wc1pTSWdLeUF4SUNvZ2JtVjNJRVJoZEdVb0tTd0tDWEJ5WldabGNuSmxaRVJ2WXlBOUlIZHBibVJ2ZHk1a2IyTjFiV1Z1ZEN3S0NXUnBjbkoxYm5NZ1BTQXdMQW9KWkc5dVpTQTlJREFzQ2dsamJHRnpjME5oWTJobElEMGdZM0psWVhSbFEyRmphR1VvS1N3S0NYUnZhMlZ1UTJGamFHVWdQU0JqY21WaGRHVkRZV05vWlNncExBb0pZMjl0Y0dsc1pYSkRZV05vWlNBOUlHTnlaV0YwWlVOaFkyaGxLQ2tzQ2dsemIzSjBUM0prWlhJZ1BTQm1kVzVqZEdsdmJpZ2dZU3dnWWlBcElIc0tDUWxwWmlBb0lHRWdQVDA5SUdJZ0tTQjdDZ2tKQ1doaGMwUjFjR3hwWTJGMFpTQTlJSFJ5ZFdVN0Nna0pmUW9KQ1hKbGRIVnliaUF3T3dvSmZTd0tDZ2t2THlCSmJuTjBZVzVqWlNCdFpYUm9iMlJ6Q2dsb1lYTlBkMjRnUFNBb2UzMHBMbWhoYzA5M2JsQnliM0JsY25SNUxBb0pZWEp5SUQwZ1cxMHNDZ2x3YjNBZ1BTQmhjbkl1Y0c5d0xBb0pjSFZ6YUY5dVlYUnBkbVVnUFNCaGNuSXVjSFZ6YUN3S0NYQjFjMmdnUFNCaGNuSXVjSFZ6YUN3S0NYTnNhV05sSUQwZ1lYSnlMbk5zYVdObExBb0pMeThnVlhObElHRWdjM1J5YVhCd1pXUXRaRzkzYmlCcGJtUmxlRTltSUdGeklHbDBKM01nWm1GemRHVnlJSFJvWVc0Z2JtRjBhWFpsQ2drdkx5Qm9kSFJ3Y3pvdkwycHpjR1Z5Wmk1amIyMHZkR2h2Y2kxcGJtUmxlRzltTFhaekxXWnZjaTgxQ2dscGJtUmxlRTltSUQwZ1puVnVZM1JwYjI0b0lHeHBjM1FzSUdWc1pXMGdLU0I3Q2drSmRtRnlJR2tnUFNBd0xBb0pDUWxzWlc0Z1BTQnNhWE4wTG14bGJtZDBhRHNLQ1FsbWIzSWdLQ0E3SUdrZ1BDQnNaVzQ3SUdrckt5QXBJSHNLQ1FrSmFXWWdLQ0JzYVhOMFcybGRJRDA5UFNCbGJHVnRJQ2tnZXdvSkNRa0pjbVYwZFhKdUlHazdDZ2tKQ1gwS0NRbDlDZ2tKY21WMGRYSnVJQzB4T3dvSmZTd0tDZ2xpYjI5c1pXRnVjeUE5SUNKamFHVmphMlZrZkhObGJHVmpkR1ZrZkdGemVXNWpmR0YxZEc5bWIyTjFjM3hoZFhSdmNHeGhlWHhqYjI1MGNtOXNjM3hrWldabGNueGthWE5oWW14bFpIeG9hV1JrWlc1OGFYTnRZWEI4Ykc5dmNIeHRkV3gwYVhCc1pYeHZjR1Z1ZkhKbFlXUnZibXg1ZkhKbGNYVnBjbVZrZkhOamIzQmxaQ0lzQ2dvSkx5OGdVbVZuZFd4aGNpQmxlSEJ5WlhOemFXOXVjd29LQ1M4dklHaDBkSEE2THk5M2QzY3Vkek11YjNKbkwxUlNMMk56Y3pNdGMyVnNaV04wYjNKekx5TjNhR2wwWlhOd1lXTmxDZ2wzYUdsMFpYTndZV05sSUQwZ0lsdGNYSGd5TUZ4Y2RGeGNjbHhjYmx4Y1psMGlMQW9LQ1M4dklHaDBkSEE2THk5M2QzY3Vkek11YjNKbkwxUlNMME5UVXpJeEwzTjVibVJoZEdFdWFIUnRiQ04yWVd4MVpTMWtaV1l0YVdSbGJuUnBabWxsY2dvSmFXUmxiblJwWm1sbGNpQTlJQ0lvUHpwY1hGeGNMbnhiWEZ4M0xWMThXMTVjTUMxY1hIaGhNRjBwS3lJc0Nnb0pMeThnUVhSMGNtbGlkWFJsSUhObGJHVmpkRzl5Y3pvZ2FIUjBjRG92TDNkM2R5NTNNeTV2Y21jdlZGSXZjMlZzWldOMGIzSnpMeU5oZEhSeWFXSjFkR1V0YzJWc1pXTjBiM0p6Q2dsaGRIUnlhV0oxZEdWeklEMGdJbHhjV3lJZ0t5QjNhR2wwWlhOd1lXTmxJQ3NnSWlvb0lpQXJJR2xrWlc1MGFXWnBaWElnS3lBaUtTZy9PaUlnS3lCM2FHbDBaWE53WVdObElDc0tDUWt2THlCUGNHVnlZWFJ2Y2lBb1kyRndkSFZ5WlNBeUtRb0pDU0lxS0ZzcVhpUjhJWDVkUHowcElpQXJJSGRvYVhSbGMzQmhZMlVnS3dvSkNTOHZJQ0pCZEhSeWFXSjFkR1VnZG1Gc2RXVnpJRzExYzNRZ1ltVWdRMU5USUdsa1pXNTBhV1pwWlhKeklGdGpZWEIwZFhKbElEVmRJRzl5SUhOMGNtbHVaM01nVzJOaGNIUjFjbVVnTXlCdmNpQmpZWEIwZFhKbElEUmRJZ29KQ1NJcUtEODZKeWdvUHpwY1hGeGNMbnhiWGx4Y1hGd25YU2txS1NkOFhDSW9LRDg2WEZ4Y1hDNThXMTVjWEZ4Y1hDSmRLU29wWENKOEtDSWdLeUJwWkdWdWRHbG1hV1Z5SUNzZ0lpa3BmQ2tpSUNzZ2QyaHBkR1Z6Y0dGalpTQXJDZ2tKSWlwY1hGMGlMQW9LQ1hCelpYVmtiM01nUFNBaU9pZ2lJQ3NnYVdSbGJuUnBabWxsY2lBcklDSXBLRDg2WEZ3b0tDSWdLd29KQ1M4dklGUnZJSEpsWkhWalpTQjBhR1VnYm5WdFltVnlJRzltSUhObGJHVmpkRzl5Y3lCdVpXVmthVzVuSUhSdmEyVnVhWHBsSUdsdUlIUm9aU0J3Y21WR2FXeDBaWElzSUhCeVpXWmxjaUJoY21kMWJXVnVkSE02Q2drSkx5OGdNUzRnY1hWdmRHVmtJQ2hqWVhCMGRYSmxJRE03SUdOaGNIUjFjbVVnTkNCdmNpQmpZWEIwZFhKbElEVXBDZ2tKSWlnbktDZy9PbHhjWEZ3dWZGdGVYRnhjWENkZEtTb3BKM3hjSWlnb1B6cGNYRnhjTG54YlhseGNYRnhjSWwwcEtpbGNJaWw4SWlBckNna0pMeThnTWk0Z2MybHRjR3hsSUNoallYQjBkWEpsSURZcENna0pJaWdvUHpwY1hGeGNMbnhiWGx4Y1hGd29LVnRjWEYxZGZDSWdLeUJoZEhSeWFXSjFkR1Z6SUNzZ0lpa3FLWHdpSUNzS0NRa3ZMeUF6TGlCaGJubDBhR2x1WnlCbGJITmxJQ2hqWVhCMGRYSmxJRElwQ2drSklpNHFJaUFyQ2drSklpbGNYQ2w4S1NJc0Nnb0pMeThnVEdWaFpHbHVaeUJoYm1RZ2JtOXVMV1Z6WTJGd1pXUWdkSEpoYVd4cGJtY2dkMmhwZEdWemNHRmpaU3dnWTJGd2RIVnlhVzVuSUhOdmJXVWdibTl1TFhkb2FYUmxjM0JoWTJVZ1kyaGhjbUZqZEdWeWN5QndjbVZqWldScGJtY2dkR2hsSUd4aGRIUmxjZ29KY25kb2FYUmxjM0JoWTJVZ1BTQnVaWGNnVW1WblJYaHdLQ0IzYUdsMFpYTndZV05sSUNzZ0lpc2lMQ0FpWnlJZ0tTd0tDWEowY21sdElEMGdibVYzSUZKbFowVjRjQ2dnSWw0aUlDc2dkMmhwZEdWemNHRmpaU0FySUNJcmZDZ29QenBlZkZ0ZVhGeGNYRjBwS0Q4NlhGeGNYQzRwS2lraUlDc2dkMmhwZEdWemNHRmpaU0FySUNJckpDSXNJQ0puSWlBcExBb0tDWEpqYjIxdFlTQTlJRzVsZHlCU1pXZEZlSEFvSUNKZUlpQXJJSGRvYVhSbGMzQmhZMlVnS3lBaUtpd2lJQ3NnZDJocGRHVnpjR0ZqWlNBcklDSXFJaUFwTEFvSmNtTnZiV0pwYm1GMGIzSnpJRDBnYm1WM0lGSmxaMFY0Y0NnZ0lsNGlJQ3NnZDJocGRHVnpjR0ZqWlNBcklDSXFLRnMrSzM1ZGZDSWdLeUIzYUdsMFpYTndZV05sSUNzZ0lpa2lJQ3NnZDJocGRHVnpjR0ZqWlNBcklDSXFJaUFwTEFvS0NYSmhkSFJ5YVdKMWRHVlJkVzkwWlhNZ1BTQnVaWGNnVW1WblJYaHdLQ0FpUFNJZ0t5QjNhR2wwWlhOd1lXTmxJQ3NnSWlvb1cxNWNYRjBuWENKZEtqOHBJaUFySUhkb2FYUmxjM0JoWTJVZ0t5QWlLbHhjWFNJc0lDSm5JaUFwTEFvS0NYSndjMlYxWkc4Z1BTQnVaWGNnVW1WblJYaHdLQ0J3YzJWMVpHOXpJQ2tzQ2dseWFXUmxiblJwWm1sbGNpQTlJRzVsZHlCU1pXZEZlSEFvSUNKZUlpQXJJR2xrWlc1MGFXWnBaWElnS3lBaUpDSWdLU3dLQ2dsdFlYUmphRVY0Y0hJZ1BTQjdDZ2tKSWtsRUlqb2dibVYzSUZKbFowVjRjQ2dnSWw0aktDSWdLeUJwWkdWdWRHbG1hV1Z5SUNzZ0lpa2lJQ2tzQ2drSklrTk1RVk5USWpvZ2JtVjNJRkpsWjBWNGNDZ2dJbDVjWEM0b0lpQXJJR2xrWlc1MGFXWnBaWElnS3lBaUtTSWdLU3dLQ1FraVZFRkhJam9nYm1WM0lGSmxaMFY0Y0NnZ0lsNG9JaUFySUdsa1pXNTBhV1pwWlhJZ0t5QWlmRnNxWFNraUlDa3NDZ2tKSWtGVVZGSWlPaUJ1WlhjZ1VtVm5SWGh3S0NBaVhpSWdLeUJoZEhSeWFXSjFkR1Z6SUNrc0Nna0pJbEJUUlZWRVR5STZJRzVsZHlCU1pXZEZlSEFvSUNKZUlpQXJJSEJ6WlhWa2IzTWdLU3dLQ1FraVEwaEpURVFpT2lCdVpYY2dVbVZuUlhod0tDQWlYam9vYjI1c2VYeG1hWEp6ZEh4c1lYTjBmRzUwYUh4dWRHZ3RiR0Z6ZENrdEtHTm9hV3hrZkc5bUxYUjVjR1VwS0Q4NlhGd29JaUFySUhkb2FYUmxjM0JoWTJVZ0t3b0pDUWtpS2lobGRtVnVmRzlrWkh3b0tGc3JMVjE4S1NoY1hHUXFLVzU4S1NJZ0t5QjNhR2wwWlhOd1lXTmxJQ3NnSWlvb1B6b29XeXN0WFh3cElpQXJJSGRvYVhSbGMzQmhZMlVnS3dvSkNRa2lLaWhjWEdRcktYd3BLU0lnS3lCM2FHbDBaWE53WVdObElDc2dJaXBjWENsOEtTSXNJQ0pwSWlBcExBb0pDU0ppYjI5c0lqb2dibVYzSUZKbFowVjRjQ2dnSWw0b1B6b2lJQ3NnWW05dmJHVmhibk1nS3lBaUtTUWlMQ0FpYVNJZ0tTd0tDUWt2THlCR2IzSWdkWE5sSUdsdUlHeHBZbkpoY21sbGN5QnBiWEJzWlcxbGJuUnBibWNnTG1sektDa0tDUWt2THlCWFpTQjFjMlVnZEdocGN5Qm1iM0lnVUU5VElHMWhkR05vYVc1bklHbHVJR0J6Wld4bFkzUmdDZ2tKSW01bFpXUnpRMjl1ZEdWNGRDSTZJRzVsZHlCU1pXZEZlSEFvSUNKZUlpQXJJSGRvYVhSbGMzQmhZMlVnS3lBaUtscytLMzVkZkRvb1pYWmxibnh2WkdSOFpYRjhaM1I4YkhSOGJuUm9mR1pwY25OMGZHeGhjM1FwS0Q4NlhGd29JaUFyQ2drSkNYZG9hWFJsYzNCaFkyVWdLeUFpS2lnb1B6b3RYRnhrS1Q5Y1hHUXFLU0lnS3lCM2FHbDBaWE53WVdObElDc2dJaXBjWENsOEtTZy9QVnRlTFYxOEpDa2lMQ0FpYVNJZ0tRb0pmU3dLQ2dseWFXNXdkWFJ6SUQwZ0wxNG9QenBwYm5CMWRIeHpaV3hsWTNSOGRHVjRkR0Z5WldGOFluVjBkRzl1S1NRdmFTd0tDWEpvWldGa1pYSWdQU0F2WG1oY1pDUXZhU3dLQ2dseWJtRjBhWFpsSUQwZ0wxNWJYbnRkSzF4N1hITXFYRnR1WVhScGRtVWdYSGN2TEFvS0NTOHZJRVZoYzJsc2VTMXdZWEp6WldGaWJHVXZjbVYwY21sbGRtRmliR1VnU1VRZ2IzSWdWRUZISUc5eUlFTk1RVk5USUhObGJHVmpkRzl5Y3dvSmNuRjFhV05yUlhod2NpQTlJQzllS0Q4Nkl5aGJYSGN0WFNzcGZDaGNkeXNwZkZ3dUtGdGNkeTFkS3lrcEpDOHNDZ29KY25OcFlteHBibWNnUFNBdld5dCtYUzhzQ2dvSkx5OGdRMU5USUdWelkyRndaWE1LQ1M4dklHaDBkSEE2THk5M2QzY3Vkek11YjNKbkwxUlNMME5UVXpJeEwzTjVibVJoZEdFdWFIUnRiQ05sYzJOaGNHVmtMV05vWVhKaFkzUmxjbk1LQ1hKMWJtVnpZMkZ3WlNBOUlHNWxkeUJTWldkRmVIQW9JQ0pjWEZ4Y0tGdGNYR1JoTFdaZGV6RXNObjBpSUNzZ2QyaHBkR1Z6Y0dGalpTQXJJQ0kvZkNnaUlDc2dkMmhwZEdWemNHRmpaU0FySUNJcGZDNHBJaXdnSW1sbklpQXBMQW9KWm5WdVpYTmpZWEJsSUQwZ1puVnVZM1JwYjI0b0lGOHNJR1Z6WTJGd1pXUXNJR1Z6WTJGd1pXUlhhR2wwWlhOd1lXTmxJQ2tnZXdvSkNYWmhjaUJvYVdkb0lEMGdJakI0SWlBcklHVnpZMkZ3WldRZ0xTQXdlREV3TURBd093b0pDUzh2SUU1aFRpQnRaV0Z1Y3lCdWIyNHRZMjlrWlhCdmFXNTBDZ2tKTHk4Z1UzVndjRzl5ZERvZ1JtbHlaV1p2ZUR3eU5Bb0pDUzh2SUZkdmNtdGhjbTkxYm1RZ1pYSnliMjVsYjNWeklHNTFiV1Z5YVdNZ2FXNTBaWEp3Y21WMFlYUnBiMjRnYjJZZ0t5SXdlQ0lLQ1FseVpYUjFjbTRnYUdsbmFDQWhQVDBnYUdsbmFDQjhmQ0JsYzJOaGNHVmtWMmhwZEdWemNHRmpaU0EvQ2drSkNXVnpZMkZ3WldRZ09nb0pDUWxvYVdkb0lEd2dNQ0EvQ2drSkNRa3ZMeUJDVFZBZ1kyOWtaWEJ2YVc1MENna0pDUWxUZEhKcGJtY3Vabkp2YlVOb1lYSkRiMlJsS0NCb2FXZG9JQ3NnTUhneE1EQXdNQ0FwSURvS0NRa0pDUzh2SUZOMWNIQnNaVzFsYm5SaGJDQlFiR0Z1WlNCamIyUmxjRzlwYm5RZ0tITjFjbkp2WjJGMFpTQndZV2x5S1FvSkNRa0pVM1J5YVc1bkxtWnliMjFEYUdGeVEyOWtaU2dnYUdsbmFDQStQaUF4TUNCOElEQjRSRGd3TUN3Z2FHbG5hQ0FtSURCNE0wWkdJSHdnTUhoRVF6QXdJQ2s3Q2dsOUxBb0tDUzh2SUVOVFV5QnpkSEpwYm1jdmFXUmxiblJwWm1sbGNpQnpaWEpwWVd4cGVtRjBhVzl1Q2drdkx5Qm9kSFJ3Y3pvdkwyUnlZV1owY3k1amMzTjNaeTV2Y21jdlkzTnpiMjB2STJOdmJXMXZiaTF6WlhKcFlXeHBlbWx1WnkxcFpHbHZiWE1LQ1hKamMzTmxjMk5oY0dVZ1BTQXZLRnRjTUMxY2VERm1YSGczWmwxOFhpMC9YR1FwZkY0dEpIeGJYbHd3TFZ4NE1XWmNlRGRtTFZ4MVJrWkdSbHgzTFYwdlp5d0tDV1pqYzNObGMyTmhjR1VnUFNCbWRXNWpkR2x2YmlnZ1kyZ3NJR0Z6UTI5a1pWQnZhVzUwSUNrZ2V3b0pDV2xtSUNnZ1lYTkRiMlJsVUc5cGJuUWdLU0I3Q2dvSkNRa3ZMeUJWS3pBd01EQWdUbFZNVENCaVpXTnZiV1Z6SUZVclJrWkdSQ0JTUlZCTVFVTkZUVVZPVkNCRFNFRlNRVU5VUlZJS0NRa0phV1lnS0NCamFDQTlQVDBnSWx3d0lpQXBJSHNLQ1FrSkNYSmxkSFZ5YmlBaVhIVkdSa1pFSWpzS0NRa0pmUW9LQ1FrSkx5OGdRMjl1ZEhKdmJDQmphR0Z5WVdOMFpYSnpJR0Z1WkNBb1pHVndaVzVrWlc1MElIVndiMjRnY0c5emFYUnBiMjRwSUc1MWJXSmxjbk1nWjJWMElHVnpZMkZ3WldRZ1lYTWdZMjlrWlNCd2IybHVkSE1LQ1FrSmNtVjBkWEp1SUdOb0xuTnNhV05sS0NBd0xDQXRNU0FwSUNzZ0lseGNJaUFySUdOb0xtTm9ZWEpEYjJSbFFYUW9JR05vTG14bGJtZDBhQ0F0SURFZ0tTNTBiMU4wY21sdVp5Z2dNVFlnS1NBcklDSWdJanNLQ1FsOUNnb0pDUzh2SUU5MGFHVnlJSEJ2ZEdWdWRHbGhiR3g1TFhOd1pXTnBZV3dnUVZORFNVa2dZMmhoY21GamRHVnljeUJuWlhRZ1ltRmphM05zWVhOb0xXVnpZMkZ3WldRS0NRbHlaWFIxY200Z0lseGNJaUFySUdOb093b0pmU3dLQ2drdkx5QlZjMlZrSUdadmNpQnBabkpoYldWekNna3ZMeUJUWldVZ2MyVjBSRzlqZFcxbGJuUW9LUW9KTHk4Z1VtVnRiM1pwYm1jZ2RHaGxJR1oxYm1OMGFXOXVJSGR5WVhCd1pYSWdZMkYxYzJWeklHRWdJbEJsY20xcGMzTnBiMjRnUkdWdWFXVmtJZ29KTHk4Z1pYSnliM0lnYVc0Z1NVVUtDWFZ1Ykc5aFpFaGhibVJzWlhJZ1BTQm1kVzVqZEdsdmJpZ3BJSHNLQ1FselpYUkViMk4xYldWdWRDZ3BPd29KZlN3S0NnbGthWE5oWW14bFpFRnVZMlZ6ZEc5eUlEMGdZV1JrUTI5dFltbHVZWFJ2Y2lnS0NRbG1kVzVqZEdsdmJpZ2daV3hsYlNBcElIc0tDUWtKY21WMGRYSnVJR1ZzWlcwdVpHbHpZV0pzWldRZ1BUMDlJSFJ5ZFdVZ0ppWWdLQ0ptYjNKdElpQnBiaUJsYkdWdElIeDhJQ0pzWVdKbGJDSWdhVzRnWld4bGJTazdDZ2tKZlN3S0NRbDdJR1JwY2pvZ0luQmhjbVZ1ZEU1dlpHVWlMQ0J1WlhoME9pQWliR1ZuWlc1a0lpQjlDZ2twT3dvS0x5OGdUM0IwYVcxcGVtVWdabTl5SUhCMWMyZ3VZWEJ3Ykhrb0lGOHNJRTV2WkdWTWFYTjBJQ2tLZEhKNUlIc0tDWEIxYzJndVlYQndiSGtvQ2drSktHRnljaUE5SUhOc2FXTmxMbU5oYkd3b0lIQnlaV1psY25KbFpFUnZZeTVqYUdsc1pFNXZaR1Z6SUNrcExBb0pDWEJ5WldabGNuSmxaRVJ2WXk1amFHbHNaRTV2WkdWekNna3BPd29KTHk4Z1UzVndjRzl5ZERvZ1FXNWtjbTlwWkR3MExqQUtDUzh2SUVSbGRHVmpkQ0J6YVd4bGJuUnNlU0JtWVdsc2FXNW5JSEIxYzJndVlYQndiSGtLQ1dGeWNsc2djSEpsWm1WeWNtVmtSRzlqTG1Ob2FXeGtUbTlrWlhNdWJHVnVaM1JvSUYwdWJtOWtaVlI1Y0dVN0NuMGdZMkYwWTJnZ0tDQmxJQ2tnZXdvSmNIVnphQ0E5SUhzZ1lYQndiSGs2SUdGeWNpNXNaVzVuZEdnZ1B3b0tDUWt2THlCTVpYWmxjbUZuWlNCemJHbGpaU0JwWmlCd2IzTnphV0pzWlFvSkNXWjFibU4wYVc5dUtDQjBZWEpuWlhRc0lHVnNjeUFwSUhzS0NRa0pjSFZ6YUY5dVlYUnBkbVV1WVhCd2JIa29JSFJoY21kbGRDd2djMnhwWTJVdVkyRnNiQ2hsYkhNcElDazdDZ2tKZlNBNkNnb0pDUzh2SUZOMWNIQnZjblE2SUVsRlBEa0tDUWt2THlCUGRHaGxjbmRwYzJVZ1lYQndaVzVrSUdScGNtVmpkR3g1Q2drSlpuVnVZM1JwYjI0b0lIUmhjbWRsZEN3Z1pXeHpJQ2tnZXdvSkNRbDJZWElnYWlBOUlIUmhjbWRsZEM1c1pXNW5kR2dzQ2drSkNRbHBJRDBnTURzS0NRa0pMeThnUTJGdUozUWdkSEoxYzNRZ1RtOWtaVXhwYzNRdWJHVnVaM1JvQ2drSkNYZG9hV3hsSUNnZ0tIUmhjbWRsZEZ0cUt5dGRJRDBnWld4elcya3JLMTBwSUNrZ2UzMEtDUWtKZEdGeVoyVjBMbXhsYm1kMGFDQTlJR29nTFNBeE93b0pDWDBLQ1gwN0NuMEtDbVoxYm1OMGFXOXVJRk5wZW5wc1pTZ2djMlZzWldOMGIzSXNJR052Ym5SbGVIUXNJSEpsYzNWc2RITXNJSE5sWldRZ0tTQjdDZ2wyWVhJZ2JTd2dhU3dnWld4bGJTd2dibWxrTENCdFlYUmphQ3dnWjNKdmRYQnpMQ0J1WlhkVFpXeGxZM1J2Y2l3S0NRbHVaWGREYjI1MFpYaDBJRDBnWTI5dWRHVjRkQ0FtSmlCamIyNTBaWGgwTG05M2JtVnlSRzlqZFcxbGJuUXNDZ29KQ1M4dklHNXZaR1ZVZVhCbElHUmxabUYxYkhSeklIUnZJRGtzSUhOcGJtTmxJR052Ym5SbGVIUWdaR1ZtWVhWc2RITWdkRzhnWkc5amRXMWxiblFLQ1FsdWIyUmxWSGx3WlNBOUlHTnZiblJsZUhRZ1B5QmpiMjUwWlhoMExtNXZaR1ZVZVhCbElEb2dPVHNLQ2dseVpYTjFiSFJ6SUQwZ2NtVnpkV3gwY3lCOGZDQmJYVHNLQ2drdkx5QlNaWFIxY200Z1pXRnliSGtnWm5KdmJTQmpZV3hzY3lCM2FYUm9JR2x1ZG1Gc2FXUWdjMlZzWldOMGIzSWdiM0lnWTI5dWRHVjRkQW9KYVdZZ0tDQjBlWEJsYjJZZ2MyVnNaV04wYjNJZ0lUMDlJQ0p6ZEhKcGJtY2lJSHg4SUNGelpXeGxZM1J2Y2lCOGZBb0pDVzV2WkdWVWVYQmxJQ0U5UFNBeElDWW1JRzV2WkdWVWVYQmxJQ0U5UFNBNUlDWW1JRzV2WkdWVWVYQmxJQ0U5UFNBeE1TQXBJSHNLQ2drSmNtVjBkWEp1SUhKbGMzVnNkSE03Q2dsOUNnb0pMeThnVkhKNUlIUnZJSE5vYjNKMFkzVjBJR1pwYm1RZ2IzQmxjbUYwYVc5dWN5QW9ZWE1nYjNCd2IzTmxaQ0IwYnlCbWFXeDBaWEp6S1NCcGJpQklWRTFNSUdSdlkzVnRaVzUwY3dvSmFXWWdLQ0FoYzJWbFpDQXBJSHNLQ2drSmFXWWdLQ0FvSUdOdmJuUmxlSFFnUHlCamIyNTBaWGgwTG05M2JtVnlSRzlqZFcxbGJuUWdmSHdnWTI5dWRHVjRkQ0E2SUhCeVpXWmxjbkpsWkVSdll5QXBJQ0U5UFNCa2IyTjFiV1Z1ZENBcElIc0tDUWtKYzJWMFJHOWpkVzFsYm5Rb0lHTnZiblJsZUhRZ0tUc0tDUWw5Q2drSlkyOXVkR1Y0ZENBOUlHTnZiblJsZUhRZ2ZId2daRzlqZFcxbGJuUTdDZ29KQ1dsbUlDZ2daRzlqZFcxbGJuUkpjMGhVVFV3Z0tTQjdDZ29KQ1Frdkx5QkpaaUIwYUdVZ2MyVnNaV04wYjNJZ2FYTWdjM1ZtWm1samFXVnVkR3g1SUhOcGJYQnNaU3dnZEhKNUlIVnphVzVuSUdFZ0ltZGxkQ3BDZVNvaUlFUlBUU0J0WlhSb2IyUUtDUWtKTHk4Z0tHVjRZMlZ3ZEdsdVp5QkViMk4xYldWdWRFWnlZV2R0Wlc1MElHTnZiblJsZUhRc0lIZG9aWEpsSUhSb1pTQnRaWFJvYjJSeklHUnZiaWQwSUdWNGFYTjBLUW9KQ1FscFppQW9JRzV2WkdWVWVYQmxJQ0U5UFNBeE1TQW1KaUFvYldGMFkyZ2dQU0J5Y1hWcFkydEZlSEJ5TG1WNFpXTW9JSE5sYkdWamRHOXlJQ2twSUNrZ2V3b0tDUWtKQ1M4dklFbEVJSE5sYkdWamRHOXlDZ2tKQ1FscFppQW9JQ2h0SUQwZ2JXRjBZMmhiTVYwcElDa2dld29LQ1FrSkNRa3ZMeUJFYjJOMWJXVnVkQ0JqYjI1MFpYaDBDZ2tKQ1FrSmFXWWdLQ0J1YjJSbFZIbHdaU0E5UFQwZ09TQXBJSHNLQ1FrSkNRa0phV1lnS0NBb1pXeGxiU0E5SUdOdmJuUmxlSFF1WjJWMFJXeGxiV1Z1ZEVKNVNXUW9JRzBnS1NrZ0tTQjdDZ29KQ1FrSkNRa0pMeThnVTNWd2NHOXlkRG9nU1VVc0lFOXdaWEpoTENCWFpXSnJhWFFLQ1FrSkNRa0pDUzh2SUZSUFJFODZJR2xrWlc1MGFXWjVJSFpsY25OcGIyNXpDZ2tKQ1FrSkNRa3ZMeUJuWlhSRmJHVnRaVzUwUW5sSlpDQmpZVzRnYldGMFkyZ2daV3hsYldWdWRITWdZbmtnYm1GdFpTQnBibk4wWldGa0lHOW1JRWxFQ2drSkNRa0pDUWxwWmlBb0lHVnNaVzB1YVdRZ1BUMDlJRzBnS1NCN0Nna0pDUWtKQ1FrSmNtVnpkV3gwY3k1d2RYTm9LQ0JsYkdWdElDazdDZ2tKQ1FrSkNRa0pjbVYwZFhKdUlISmxjM1ZzZEhNN0Nna0pDUWtKQ1FsOUNna0pDUWtKQ1gwZ1pXeHpaU0I3Q2drSkNRa0pDUWx5WlhSMWNtNGdjbVZ6ZFd4MGN6c0tDUWtKQ1FrSmZRb0tDUWtKQ1Frdkx5QkZiR1Z0Wlc1MElHTnZiblJsZUhRS0NRa0pDUWw5SUdWc2MyVWdld29LQ1FrSkNRa0pMeThnVTNWd2NHOXlkRG9nU1VVc0lFOXdaWEpoTENCWFpXSnJhWFFLQ1FrSkNRa0pMeThnVkU5RVR6b2dhV1JsYm5ScFpua2dkbVZ5YzJsdmJuTUtDUWtKQ1FrSkx5OGdaMlYwUld4bGJXVnVkRUo1U1dRZ1kyRnVJRzFoZEdOb0lHVnNaVzFsYm5SeklHSjVJRzVoYldVZ2FXNXpkR1ZoWkNCdlppQkpSQW9KQ1FrSkNRbHBaaUFvSUc1bGQwTnZiblJsZUhRZ0ppWWdLR1ZzWlcwZ1BTQnVaWGREYjI1MFpYaDBMbWRsZEVWc1pXMWxiblJDZVVsa0tDQnRJQ2twSUNZbUNna0pDUWtKQ1FsamIyNTBZV2x1Y3lnZ1kyOXVkR1Y0ZEN3Z1pXeGxiU0FwSUNZbUNna0pDUWtKQ1FsbGJHVnRMbWxrSUQwOVBTQnRJQ2tnZXdvS0NRa0pDUWtKQ1hKbGMzVnNkSE11Y0hWemFDZ2daV3hsYlNBcE93b0pDUWtKQ1FrSmNtVjBkWEp1SUhKbGMzVnNkSE03Q2drSkNRa0pDWDBLQ1FrSkNRbDlDZ29KQ1FrSkx5OGdWSGx3WlNCelpXeGxZM1J2Y2dvSkNRa0pmU0JsYkhObElHbG1JQ2dnYldGMFkyaGJNbDBnS1NCN0Nna0pDUWtKY0hWemFDNWhjSEJzZVNnZ2NtVnpkV3gwY3l3Z1kyOXVkR1Y0ZEM1blpYUkZiR1Z0Wlc1MGMwSjVWR0ZuVG1GdFpTZ2djMlZzWldOMGIzSWdLU0FwT3dvSkNRa0pDWEpsZEhWeWJpQnlaWE4xYkhSek93b0tDUWtKQ1M4dklFTnNZWE56SUhObGJHVmpkRzl5Q2drSkNRbDlJR1ZzYzJVZ2FXWWdLQ0FvYlNBOUlHMWhkR05vV3pOZEtTQW1KaUJ6ZFhCd2IzSjBMbWRsZEVWc1pXMWxiblJ6UW5sRGJHRnpjMDVoYldVZ0ppWUtDUWtKQ1FsamIyNTBaWGgwTG1kbGRFVnNaVzFsYm5SelFubERiR0Z6YzA1aGJXVWdLU0I3Q2dvSkNRa0pDWEIxYzJndVlYQndiSGtvSUhKbGMzVnNkSE1zSUdOdmJuUmxlSFF1WjJWMFJXeGxiV1Z1ZEhOQ2VVTnNZWE56VG1GdFpTZ2diU0FwSUNrN0Nna0pDUWtKY21WMGRYSnVJSEpsYzNWc2RITTdDZ2tKQ1FsOUNna0pDWDBLQ2drSkNTOHZJRlJoYTJVZ1lXUjJZVzUwWVdkbElHOW1JSEYxWlhKNVUyVnNaV04wYjNKQmJHd0tDUWtKYVdZZ0tDQnpkWEJ3YjNKMExuRnpZU0FtSmdvSkNRa0pJV052YlhCcGJHVnlRMkZqYUdWYklITmxiR1ZqZEc5eUlDc2dJaUFpSUYwZ0ppWUtDUWtKQ1NnaGNtSjFaMmQ1VVZOQklIeDhJQ0Z5WW5WblozbFJVMEV1ZEdWemRDZ2djMlZzWldOMGIzSWdLU2tnS1NCN0Nnb0pDUWtKYVdZZ0tDQnViMlJsVkhsd1pTQWhQVDBnTVNBcElIc0tDUWtKQ1FsdVpYZERiMjUwWlhoMElEMGdZMjl1ZEdWNGREc0tDUWtKQ1FsdVpYZFRaV3hsWTNSdmNpQTlJSE5sYkdWamRHOXlPd29LQ1FrSkNTOHZJSEZUUVNCc2IyOXJjeUJ2ZFhSemFXUmxJRVZzWlcxbGJuUWdZMjl1ZEdWNGRDd2dkMmhwWTJnZ2FYTWdibTkwSUhkb1lYUWdkMlVnZDJGdWRBb0pDUWtKTHk4Z1ZHaGhibXR6SUhSdklFRnVaSEpsZHlCRWRYQnZiblFnWm05eUlIUm9hWE1nZDI5eWEyRnliM1Z1WkNCMFpXTm9ibWx4ZFdVS0NRa0pDUzh2SUZOMWNIQnZjblE2SUVsRklEdzlPQW9KQ1FrSkx5OGdSWGhqYkhWa1pTQnZZbXBsWTNRZ1pXeGxiV1Z1ZEhNS0NRa0pDWDBnWld4elpTQnBaaUFvSUdOdmJuUmxlSFF1Ym05a1pVNWhiV1V1ZEc5TWIzZGxja05oYzJVb0tTQWhQVDBnSW05aWFtVmpkQ0lnS1NCN0Nnb0pDUWtKQ1M4dklFTmhjSFIxY21VZ2RHaGxJR052Ym5SbGVIUWdTVVFzSUhObGRIUnBibWNnYVhRZ1ptbHljM1FnYVdZZ2JtVmpaWE56WVhKNUNna0pDUWtKYVdZZ0tDQW9ibWxrSUQwZ1kyOXVkR1Y0ZEM1blpYUkJkSFJ5YVdKMWRHVW9JQ0pwWkNJZ0tTa2dLU0I3Q2drSkNRa0pDVzVwWkNBOUlHNXBaQzV5WlhCc1lXTmxLQ0J5WTNOelpYTmpZWEJsTENCbVkzTnpaWE5qWVhCbElDazdDZ2tKQ1FrSmZTQmxiSE5sSUhzS0NRa0pDUWtKWTI5dWRHVjRkQzV6WlhSQmRIUnlhV0oxZEdVb0lDSnBaQ0lzSUNodWFXUWdQU0JsZUhCaGJtUnZLU0FwT3dvSkNRa0pDWDBLQ2drSkNRa0pMeThnVUhKbFptbDRJR1YyWlhKNUlITmxiR1ZqZEc5eUlHbHVJSFJvWlNCc2FYTjBDZ2tKQ1FrSlozSnZkWEJ6SUQwZ2RHOXJaVzVwZW1Vb0lITmxiR1ZqZEc5eUlDazdDZ2tKQ1FrSmFTQTlJR2R5YjNWd2N5NXNaVzVuZEdnN0Nna0pDUWtKZDJocGJHVWdLQ0JwTFMwZ0tTQjdDZ2tKQ1FrSkNXZHliM1Z3YzF0cFhTQTlJQ0lqSWlBcklHNXBaQ0FySUNJZ0lpQXJJSFJ2VTJWc1pXTjBiM0lvSUdkeWIzVndjMXRwWFNBcE93b0pDUWtKQ1gwS0NRa0pDUWx1WlhkVFpXeGxZM1J2Y2lBOUlHZHliM1Z3Y3k1cWIybHVLQ0FpTENJZ0tUc0tDZ2tKQ1FrSkx5OGdSWGh3WVc1a0lHTnZiblJsZUhRZ1ptOXlJSE5wWW14cGJtY2djMlZzWldOMGIzSnpDZ2tKQ1FrSmJtVjNRMjl1ZEdWNGRDQTlJSEp6YVdKc2FXNW5MblJsYzNRb0lITmxiR1ZqZEc5eUlDa2dKaVlnZEdWemRFTnZiblJsZUhRb0lHTnZiblJsZUhRdWNHRnlaVzUwVG05a1pTQXBJSHg4Q2drSkNRa0pDV052Ym5SbGVIUTdDZ2tKQ1FsOUNnb0pDUWtKYVdZZ0tDQnVaWGRUWld4bFkzUnZjaUFwSUhzS0NRa0pDUWwwY25rZ2V3b0pDUWtKQ1Fsd2RYTm9MbUZ3Y0d4NUtDQnlaWE4xYkhSekxBb0pDUWtKQ1FrSmJtVjNRMjl1ZEdWNGRDNXhkV1Z5ZVZObGJHVmpkRzl5UVd4c0tDQnVaWGRUWld4bFkzUnZjaUFwQ2drSkNRa0pDU2s3Q2drSkNRa0pDWEpsZEhWeWJpQnlaWE4xYkhSek93b0pDUWtKQ1gwZ1kyRjBZMmdnS0NCeGMyRkZjbkp2Y2lBcElIc0tDUWtKQ1FsOUlHWnBibUZzYkhrZ2V3b0pDUWtKQ1FscFppQW9JRzVwWkNBOVBUMGdaWGh3WVc1a2J5QXBJSHNLQ1FrSkNRa0pDV052Ym5SbGVIUXVjbVZ0YjNabFFYUjBjbWxpZFhSbEtDQWlhV1FpSUNrN0Nna0pDUWtKQ1gwS0NRa0pDUWw5Q2drSkNRbDlDZ2tKQ1gwS0NRbDlDZ2w5Q2dvSkx5OGdRV3hzSUc5MGFHVnljd29KY21WMGRYSnVJSE5sYkdWamRDZ2djMlZzWldOMGIzSXVjbVZ3YkdGalpTZ2djblJ5YVcwc0lDSWtNU0lnS1N3Z1kyOXVkR1Y0ZEN3Z2NtVnpkV3gwY3l3Z2MyVmxaQ0FwT3dwOUNnb3ZLaW9LSUNvZ1EzSmxZWFJsSUd0bGVTMTJZV3gxWlNCallXTm9aWE1nYjJZZ2JHbHRhWFJsWkNCemFYcGxDaUFxSUVCeVpYUjFjbTV6SUh0bWRXNWpkR2x2YmloemRISnBibWNzSUc5aWFtVmpkQ2w5SUZKbGRIVnlibk1nZEdobElFOWlhbVZqZENCa1lYUmhJR0ZtZEdWeUlITjBiM0pwYm1jZ2FYUWdiMjRnYVhSelpXeG1JSGRwZEdnS0lDb0pjSEp2Y0dWeWRIa2dibUZ0WlNCMGFHVWdLSE53WVdObExYTjFabVpwZUdWa0tTQnpkSEpwYm1jZ1lXNWtJQ2hwWmlCMGFHVWdZMkZqYUdVZ2FYTWdiR0Z5WjJWeUlIUm9ZVzRnUlhod2NpNWpZV05vWlV4bGJtZDBhQ2tLSUNvSlpHVnNaWFJwYm1jZ2RHaGxJRzlzWkdWemRDQmxiblJ5ZVFvZ0tpOEtablZ1WTNScGIyNGdZM0psWVhSbFEyRmphR1VvS1NCN0NnbDJZWElnYTJWNWN5QTlJRnRkT3dvS0NXWjFibU4wYVc5dUlHTmhZMmhsS0NCclpYa3NJSFpoYkhWbElDa2dld29KQ1M4dklGVnpaU0FvYTJWNUlDc2dJaUFpS1NCMGJ5QmhkbTlwWkNCamIyeHNhWE5wYjI0Z2QybDBhQ0J1WVhScGRtVWdjSEp2ZEc5MGVYQmxJSEJ5YjNCbGNuUnBaWE1nS0hObFpTQkpjM04xWlNBak1UVTNLUW9KQ1dsbUlDZ2dhMlY1Y3k1d2RYTm9LQ0JyWlhrZ0t5QWlJQ0lnS1NBK0lFVjRjSEl1WTJGamFHVk1aVzVuZEdnZ0tTQjdDZ2tKQ1M4dklFOXViSGtnYTJWbGNDQjBhR1VnYlc5emRDQnlaV05sYm5RZ1pXNTBjbWxsY3dvSkNRbGtaV3hsZEdVZ1kyRmphR1ZiSUd0bGVYTXVjMmhwWm5Rb0tTQmRPd29KQ1gwS0NRbHlaWFIxY200Z0tHTmhZMmhsV3lCclpYa2dLeUFpSUNJZ1hTQTlJSFpoYkhWbEtUc0tDWDBLQ1hKbGRIVnliaUJqWVdOb1pUc0tmUW9LTHlvcUNpQXFJRTFoY21zZ1lTQm1kVzVqZEdsdmJpQm1iM0lnYzNCbFkybGhiQ0IxYzJVZ1lua2dVMmw2ZW14bENpQXFJRUJ3WVhKaGJTQjdSblZ1WTNScGIyNTlJR1p1SUZSb1pTQm1kVzVqZEdsdmJpQjBieUJ0WVhKckNpQXFMd3BtZFc1amRHbHZiaUJ0WVhKclJuVnVZM1JwYjI0b0lHWnVJQ2tnZXdvSlptNWJJR1Y0Y0dGdVpHOGdYU0E5SUhSeWRXVTdDZ2x5WlhSMWNtNGdabTQ3Q24wS0NpOHFLZ29nS2lCVGRYQndiM0owSUhSbGMzUnBibWNnZFhOcGJtY2dZVzRnWld4bGJXVnVkQW9nS2lCQWNHRnlZVzBnZTBaMWJtTjBhVzl1ZlNCbWJpQlFZWE56WldRZ2RHaGxJR055WldGMFpXUWdaV3hsYldWdWRDQmhibVFnY21WMGRYSnVjeUJoSUdKdmIyeGxZVzRnY21WemRXeDBDaUFxTHdwbWRXNWpkR2x2YmlCaGMzTmxjblFvSUdadUlDa2dld29KZG1GeUlHVnNJRDBnWkc5amRXMWxiblF1WTNKbFlYUmxSV3hsYldWdWRDZ2labWxsYkdSelpYUWlLVHNLQ2dsMGNua2dld29KQ1hKbGRIVnliaUFoSVdadUtDQmxiQ0FwT3dvSmZTQmpZWFJqYUNBb1pTa2dld29KQ1hKbGRIVnliaUJtWVd4elpUc0tDWDBnWm1sdVlXeHNlU0I3Q2drSkx5OGdVbVZ0YjNabElHWnliMjBnYVhSeklIQmhjbVZ1ZENCaWVTQmtaV1poZFd4MENna0phV1lnS0NCbGJDNXdZWEpsYm5ST2IyUmxJQ2tnZXdvSkNRbGxiQzV3WVhKbGJuUk9iMlJsTG5KbGJXOTJaVU5vYVd4a0tDQmxiQ0FwT3dvSkNYMEtDUWt2THlCeVpXeGxZWE5sSUcxbGJXOXllU0JwYmlCSlJRb0pDV1ZzSUQwZ2JuVnNiRHNLQ1gwS2ZRb0tMeW9xQ2lBcUlFRmtaSE1nZEdobElITmhiV1VnYUdGdVpHeGxjaUJtYjNJZ1lXeHNJRzltSUhSb1pTQnpjR1ZqYVdacFpXUWdZWFIwY25NS0lDb2dRSEJoY21GdElIdFRkSEpwYm1kOUlHRjBkSEp6SUZCcGNHVXRjMlZ3WVhKaGRHVmtJR3hwYzNRZ2IyWWdZWFIwY21saWRYUmxjd29nS2lCQWNHRnlZVzBnZTBaMWJtTjBhVzl1ZlNCb1lXNWtiR1Z5SUZSb1pTQnRaWFJvYjJRZ2RHaGhkQ0IzYVd4c0lHSmxJR0Z3Y0d4cFpXUUtJQ292Q21aMWJtTjBhVzl1SUdGa1pFaGhibVJzWlNnZ1lYUjBjbk1zSUdoaGJtUnNaWElnS1NCN0NnbDJZWElnWVhKeUlEMGdZWFIwY25NdWMzQnNhWFFvSW53aUtTd0tDUWxwSUQwZ1lYSnlMbXhsYm1kMGFEc0tDZ2wzYUdsc1pTQW9JR2t0TFNBcElIc0tDUWxGZUhCeUxtRjBkSEpJWVc1a2JHVmJJR0Z5Y2x0cFhTQmRJRDBnYUdGdVpHeGxjanNLQ1gwS2ZRb0tMeW9xQ2lBcUlFTm9aV05yY3lCa2IyTjFiV1Z1ZENCdmNtUmxjaUJ2WmlCMGQyOGdjMmxpYkdsdVozTUtJQ29nUUhCaGNtRnRJSHRGYkdWdFpXNTBmU0JoQ2lBcUlFQndZWEpoYlNCN1JXeGxiV1Z1ZEgwZ1lnb2dLaUJBY21WMGRYSnVjeUI3VG5WdFltVnlmU0JTWlhSMWNtNXpJR3hsYzNNZ2RHaGhiaUF3SUdsbUlHRWdjSEpsWTJWa1pYTWdZaXdnWjNKbFlYUmxjaUIwYUdGdUlEQWdhV1lnWVNCbWIyeHNiM2R6SUdJS0lDb3ZDbVoxYm1OMGFXOXVJSE5wWW14cGJtZERhR1ZqYXlnZ1lTd2dZaUFwSUhzS0NYWmhjaUJqZFhJZ1BTQmlJQ1ltSUdFc0Nna0paR2xtWmlBOUlHTjFjaUFtSmlCaExtNXZaR1ZVZVhCbElEMDlQU0F4SUNZbUlHSXVibTlrWlZSNWNHVWdQVDA5SURFZ0ppWUtDUWtKWVM1emIzVnlZMlZKYm1SbGVDQXRJR0l1YzI5MWNtTmxTVzVrWlhnN0Nnb0pMeThnVlhObElFbEZJSE52ZFhKalpVbHVaR1Y0SUdsbUlHRjJZV2xzWVdKc1pTQnZiaUJpYjNSb0lHNXZaR1Z6Q2dscFppQW9JR1JwWm1ZZ0tTQjdDZ2tKY21WMGRYSnVJR1JwWm1ZN0NnbDlDZ29KTHk4Z1EyaGxZMnNnYVdZZ1lpQm1iMnhzYjNkeklHRUtDV2xtSUNnZ1kzVnlJQ2tnZXdvSkNYZG9hV3hsSUNnZ0tHTjFjaUE5SUdOMWNpNXVaWGgwVTJsaWJHbHVaeWtnS1NCN0Nna0pDV2xtSUNnZ1kzVnlJRDA5UFNCaUlDa2dld29KQ1FrSmNtVjBkWEp1SUMweE93b0pDUWw5Q2drSmZRb0pmUW9LQ1hKbGRIVnliaUJoSUQ4Z01TQTZJQzB4T3dwOUNnb3ZLaW9LSUNvZ1VtVjBkWEp1Y3lCaElHWjFibU4wYVc5dUlIUnZJSFZ6WlNCcGJpQndjMlYxWkc5eklHWnZjaUJwYm5CMWRDQjBlWEJsY3dvZ0tpQkFjR0Z5WVcwZ2UxTjBjbWx1WjMwZ2RIbHdaUW9nS2k4S1puVnVZM1JwYjI0Z1kzSmxZWFJsU1c1d2RYUlFjMlYxWkc4b0lIUjVjR1VnS1NCN0NnbHlaWFIxY200Z1puVnVZM1JwYjI0b0lHVnNaVzBnS1NCN0Nna0pkbUZ5SUc1aGJXVWdQU0JsYkdWdExtNXZaR1ZPWVcxbExuUnZURzkzWlhKRFlYTmxLQ2s3Q2drSmNtVjBkWEp1SUc1aGJXVWdQVDA5SUNKcGJuQjFkQ0lnSmlZZ1pXeGxiUzUwZVhCbElEMDlQU0IwZVhCbE93b0pmVHNLZlFvS0x5b3FDaUFxSUZKbGRIVnlibk1nWVNCbWRXNWpkR2x2YmlCMGJ5QjFjMlVnYVc0Z2NITmxkV1J2Y3lCbWIzSWdZblYwZEc5dWN3b2dLaUJBY0dGeVlXMGdlMU4wY21sdVozMGdkSGx3WlFvZ0tpOEtablZ1WTNScGIyNGdZM0psWVhSbFFuVjBkRzl1VUhObGRXUnZLQ0IwZVhCbElDa2dld29KY21WMGRYSnVJR1oxYm1OMGFXOXVLQ0JsYkdWdElDa2dld29KQ1haaGNpQnVZVzFsSUQwZ1pXeGxiUzV1YjJSbFRtRnRaUzUwYjB4dmQyVnlRMkZ6WlNncE93b0pDWEpsZEhWeWJpQW9ibUZ0WlNBOVBUMGdJbWx1Y0hWMElpQjhmQ0J1WVcxbElEMDlQU0FpWW5WMGRHOXVJaWtnSmlZZ1pXeGxiUzUwZVhCbElEMDlQU0IwZVhCbE93b0pmVHNLZlFvS0x5b3FDaUFxSUZKbGRIVnlibk1nWVNCbWRXNWpkR2x2YmlCMGJ5QjFjMlVnYVc0Z2NITmxkV1J2Y3lCbWIzSWdPbVZ1WVdKc1pXUXZPbVJwYzJGaWJHVmtDaUFxSUVCd1lYSmhiU0I3UW05dmJHVmhibjBnWkdsellXSnNaV1FnZEhKMVpTQm1iM0lnT21ScGMyRmliR1ZrT3lCbVlXeHpaU0JtYjNJZ09tVnVZV0pzWldRS0lDb3ZDbVoxYm1OMGFXOXVJR055WldGMFpVUnBjMkZpYkdWa1VITmxkV1J2S0NCa2FYTmhZbXhsWkNBcElIc0tDZ2t2THlCTGJtOTNiaUE2WkdsellXSnNaV1FnWm1Gc2MyVWdjRzl6YVhScGRtVnpPaUJtYVdWc1pITmxkRnRrYVhOaFlteGxaRjBnUGlCc1pXZGxibVE2Ym5Sb0xXOW1MWFI1Y0dVb2Jpc3lLU0E2WTJGdUxXUnBjMkZpYkdVS0NYSmxkSFZ5YmlCbWRXNWpkR2x2YmlnZ1pXeGxiU0FwSUhzS0Nna0pMeThnVDI1c2VTQmpaWEowWVdsdUlHVnNaVzFsYm5SeklHTmhiaUJ0WVhSamFDQTZaVzVoWW14bFpDQnZjaUE2WkdsellXSnNaV1FLQ1Frdkx5Qm9kSFJ3Y3pvdkwyaDBiV3d1YzNCbFl5NTNhR0YwZDJjdWIzSm5MMjExYkhScGNHRm5aUzl6WTNKcGNIUnBibWN1YUhSdGJDTnpaV3hsWTNSdmNpMWxibUZpYkdWa0Nna0pMeThnYUhSMGNITTZMeTlvZEcxc0xuTndaV011ZDJoaGRIZG5MbTl5Wnk5dGRXeDBhWEJoWjJVdmMyTnlhWEIwYVc1bkxtaDBiV3dqYzJWc1pXTjBiM0l0WkdsellXSnNaV1FLQ1FscFppQW9JQ0ptYjNKdElpQnBiaUJsYkdWdElDa2dld29LQ1FrSkx5OGdRMmhsWTJzZ1ptOXlJR2x1YUdWeWFYUmxaQ0JrYVhOaFlteGxaRzVsYzNNZ2IyNGdjbVZzWlhaaGJuUWdibTl1TFdScGMyRmliR1ZrSUdWc1pXMWxiblJ6T2dvSkNRa3ZMeUFxSUd4cGMzUmxaQ0JtYjNKdExXRnpjMjlqYVdGMFpXUWdaV3hsYldWdWRITWdhVzRnWVNCa2FYTmhZbXhsWkNCbWFXVnNaSE5sZEFvSkNRa3ZMeUFnSUdoMGRIQnpPaTh2YUhSdGJDNXpjR1ZqTG5kb1lYUjNaeTV2Y21jdmJYVnNkR2x3WVdkbEwyWnZjbTF6TG1oMGJXd2pZMkYwWldkdmNua3RiR2x6ZEdWa0Nna0pDUzh2SUNBZ2FIUjBjSE02THk5b2RHMXNMbk53WldNdWQyaGhkSGRuTG05eVp5OXRkV3gwYVhCaFoyVXZabTl5YlhNdWFIUnRiQ05qYjI1alpYQjBMV1psTFdScGMyRmliR1ZrQ2drSkNTOHZJQ29nYjNCMGFXOXVJR1ZzWlcxbGJuUnpJR2x1SUdFZ1pHbHpZV0pzWldRZ2IzQjBaM0p2ZFhBS0NRa0pMeThnSUNCb2RIUndjem92TDJoMGJXd3VjM0JsWXk1M2FHRjBkMmN1YjNKbkwyMTFiSFJwY0dGblpTOW1iM0p0Y3k1b2RHMXNJMk52Ym1ObGNIUXRiM0IwYVc5dUxXUnBjMkZpYkdWa0Nna0pDUzh2SUVGc2JDQnpkV05vSUdWc1pXMWxiblJ6SUdoaGRtVWdZU0FpWm05eWJTSWdjSEp2Y0dWeWRIa3VDZ2tKQ1dsbUlDZ2daV3hsYlM1d1lYSmxiblJPYjJSbElDWW1JR1ZzWlcwdVpHbHpZV0pzWldRZ1BUMDlJR1poYkhObElDa2dld29LQ1FrSkNTOHZJRTl3ZEdsdmJpQmxiR1Z0Wlc1MGN5QmtaV1psY2lCMGJ5QmhJSEJoY21WdWRDQnZjSFJuY205MWNDQnBaaUJ3Y21WelpXNTBDZ2tKQ1FscFppQW9JQ0pzWVdKbGJDSWdhVzRnWld4bGJTQXBJSHNLQ1FrSkNRbHBaaUFvSUNKc1lXSmxiQ0lnYVc0Z1pXeGxiUzV3WVhKbGJuUk9iMlJsSUNrZ2V3b0pDUWtKQ1FseVpYUjFjbTRnWld4bGJTNXdZWEpsYm5ST2IyUmxMbVJwYzJGaWJHVmtJRDA5UFNCa2FYTmhZbXhsWkRzS0NRa0pDUWw5SUdWc2MyVWdld29KQ1FrSkNRbHlaWFIxY200Z1pXeGxiUzVrYVhOaFlteGxaQ0E5UFQwZ1pHbHpZV0pzWldRN0Nna0pDUWtKZlFvSkNRa0pmUW9LQ1FrSkNTOHZJRk4xY0hCdmNuUTZJRWxGSURZZ0xTQXhNUW9KQ1FrSkx5OGdWWE5sSUhSb1pTQnBjMFJwYzJGaWJHVmtJSE5vYjNKMFkzVjBJSEJ5YjNCbGNuUjVJSFJ2SUdOb1pXTnJJR1p2Y2lCa2FYTmhZbXhsWkNCbWFXVnNaSE5sZENCaGJtTmxjM1J2Y25NS0NRa0pDWEpsZEhWeWJpQmxiR1Z0TG1selJHbHpZV0pzWldRZ1BUMDlJR1JwYzJGaWJHVmtJSHg4Q2dvSkNRa0pDUzh2SUZkb1pYSmxJSFJvWlhKbElHbHpJRzV2SUdselJHbHpZV0pzWldRc0lHTm9aV05ySUcxaGJuVmhiR3g1Q2drSkNRa0pMeW9nYW5Ob2FXNTBJQzFYTURFNElDb3ZDZ2tKQ1FrSlpXeGxiUzVwYzBScGMyRmliR1ZrSUNFOVBTQWhaR2x6WVdKc1pXUWdKaVlLQ1FrSkNRa0paR2x6WVdKc1pXUkJibU5sYzNSdmNpZ2daV3hsYlNBcElEMDlQU0JrYVhOaFlteGxaRHNLQ1FrSmZRb0tDUWtKY21WMGRYSnVJR1ZzWlcwdVpHbHpZV0pzWldRZ1BUMDlJR1JwYzJGaWJHVmtPd29LQ1Frdkx5QlVjbmtnZEc4Z2QybHVibTkzSUc5MWRDQmxiR1Z0Wlc1MGN5QjBhR0YwSUdOaGJpZDBJR0psSUdScGMyRmliR1ZrSUdKbFptOXlaU0IwY25WemRHbHVaeUIwYUdVZ1pHbHpZV0pzWldRZ2NISnZjR1Z5ZEhrdUNna0pMeThnVTI5dFpTQjJhV04wYVcxeklHZGxkQ0JqWVhWbmFIUWdhVzRnYjNWeUlHNWxkQ0FvYkdGaVpXd3NJR3hsWjJWdVpDd2diV1Z1ZFN3Z2RISmhZMnNwTENCaWRYUWdhWFFnYzJodmRXeGtiaWQwQ2drSkx5OGdaWFpsYmlCbGVHbHpkQ0J2YmlCMGFHVnRMQ0JzWlhRZ1lXeHZibVVnYUdGMlpTQmhJR0p2YjJ4bFlXNGdkbUZzZFdVdUNna0pmU0JsYkhObElHbG1JQ2dnSW14aFltVnNJaUJwYmlCbGJHVnRJQ2tnZXdvSkNRbHlaWFIxY200Z1pXeGxiUzVrYVhOaFlteGxaQ0E5UFQwZ1pHbHpZV0pzWldRN0Nna0pmUW9LQ1Frdkx5QlNaVzFoYVc1cGJtY2daV3hsYldWdWRITWdZWEpsSUc1bGFYUm9aWElnT21WdVlXSnNaV1FnYm05eUlEcGthWE5oWW14bFpBb0pDWEpsZEhWeWJpQm1ZV3h6WlRzS0NYMDdDbjBLQ2k4cUtnb2dLaUJTWlhSMWNtNXpJR0VnWm5WdVkzUnBiMjRnZEc4Z2RYTmxJR2x1SUhCelpYVmtiM01nWm05eUlIQnZjMmwwYVc5dVlXeHpDaUFxSUVCd1lYSmhiU0I3Um5WdVkzUnBiMjU5SUdadUNpQXFMd3BtZFc1amRHbHZiaUJqY21WaGRHVlFiM05wZEdsdmJtRnNVSE5sZFdSdktDQm1iaUFwSUhzS0NYSmxkSFZ5YmlCdFlYSnJSblZ1WTNScGIyNG9ablZ1WTNScGIyNG9JR0Z5WjNWdFpXNTBJQ2tnZXdvSkNXRnlaM1Z0Wlc1MElEMGdLMkZ5WjNWdFpXNTBPd29KQ1hKbGRIVnliaUJ0WVhKclJuVnVZM1JwYjI0b1puVnVZM1JwYjI0b0lITmxaV1FzSUcxaGRHTm9aWE1nS1NCN0Nna0pDWFpoY2lCcUxBb0pDUWtKYldGMFkyaEpibVJsZUdWeklEMGdabTRvSUZ0ZExDQnpaV1ZrTG14bGJtZDBhQ3dnWVhKbmRXMWxiblFnS1N3S0NRa0pDV2tnUFNCdFlYUmphRWx1WkdWNFpYTXViR1Z1WjNSb093b0tDUWtKTHk4Z1RXRjBZMmdnWld4bGJXVnVkSE1nWm05MWJtUWdZWFFnZEdobElITndaV05wWm1sbFpDQnBibVJsZUdWekNna0pDWGRvYVd4bElDZ2dhUzB0SUNrZ2V3b0pDUWtKYVdZZ0tDQnpaV1ZrV3lBb2FpQTlJRzFoZEdOb1NXNWtaWGhsYzF0cFhTa2dYU0FwSUhzS0NRa0pDUWx6WldWa1cycGRJRDBnSVNodFlYUmphR1Z6VzJwZElEMGdjMlZsWkZ0cVhTazdDZ2tKQ1FsOUNna0pDWDBLQ1FsOUtUc0tDWDBwT3dwOUNnb3ZLaW9LSUNvZ1EyaGxZMnR6SUdFZ2JtOWtaU0JtYjNJZ2RtRnNhV1JwZEhrZ1lYTWdZU0JUYVhwNmJHVWdZMjl1ZEdWNGRBb2dLaUJBY0dGeVlXMGdlMFZzWlcxbGJuUjhUMkpxWldOMFBYMGdZMjl1ZEdWNGRBb2dLaUJBY21WMGRYSnVjeUI3Uld4bGJXVnVkSHhQWW1wbFkzUjhRbTl2YkdWaGJuMGdWR2hsSUdsdWNIVjBJRzV2WkdVZ2FXWWdZV05qWlhCMFlXSnNaU3dnYjNSb1pYSjNhWE5sSUdFZ1ptRnNjM2tnZG1Gc2RXVUtJQ292Q21aMWJtTjBhVzl1SUhSbGMzUkRiMjUwWlhoMEtDQmpiMjUwWlhoMElDa2dld29KY21WMGRYSnVJR052Ym5SbGVIUWdKaVlnZEhsd1pXOW1JR052Ym5SbGVIUXVaMlYwUld4bGJXVnVkSE5DZVZSaFowNWhiV1VnSVQwOUlDSjFibVJsWm1sdVpXUWlJQ1ltSUdOdmJuUmxlSFE3Q24wS0NpOHZJRVY0Y0c5elpTQnpkWEJ3YjNKMElIWmhjbk1nWm05eUlHTnZiblpsYm1sbGJtTmxDbk4xY0hCdmNuUWdQU0JUYVhwNmJHVXVjM1Z3Y0c5eWRDQTlJSHQ5T3dvS0x5b3FDaUFxSUVSbGRHVmpkSE1nV0UxTUlHNXZaR1Z6Q2lBcUlFQndZWEpoYlNCN1JXeGxiV1Z1ZEh4UFltcGxZM1I5SUdWc1pXMGdRVzRnWld4bGJXVnVkQ0J2Y2lCaElHUnZZM1Z0Wlc1MENpQXFJRUJ5WlhSMWNtNXpJSHRDYjI5c1pXRnVmU0JVY25WbElHbG1aaUJsYkdWdElHbHpJR0VnYm05dUxVaFVUVXdnV0UxTUlHNXZaR1VLSUNvdkNtbHpXRTFNSUQwZ1UybDZlbXhsTG1seldFMU1JRDBnWm5WdVkzUnBiMjRvSUdWc1pXMGdLU0I3Q2drdkx5QmtiMk4xYldWdWRFVnNaVzFsYm5RZ2FYTWdkbVZ5YVdacFpXUWdabTl5SUdOaGMyVnpJSGRvWlhKbElHbDBJR1J2WlhOdUozUWdlV1YwSUdWNGFYTjBDZ2t2THlBb2MzVmphQ0JoY3lCc2IyRmthVzVuSUdsbWNtRnRaWE1nYVc0Z1NVVWdMU0FqTkRnek15a0tDWFpoY2lCa2IyTjFiV1Z1ZEVWc1pXMWxiblFnUFNCbGJHVnRJQ1ltSUNobGJHVnRMbTkzYm1WeVJHOWpkVzFsYm5RZ2ZId2daV3hsYlNrdVpHOWpkVzFsYm5SRmJHVnRaVzUwT3dvSmNtVjBkWEp1SUdSdlkzVnRaVzUwUld4bGJXVnVkQ0EvSUdSdlkzVnRaVzUwUld4bGJXVnVkQzV1YjJSbFRtRnRaU0FoUFQwZ0lraFVUVXdpSURvZ1ptRnNjMlU3Q24wN0Nnb3ZLaW9LSUNvZ1UyVjBjeUJrYjJOMWJXVnVkQzF5Wld4aGRHVmtJSFpoY21saFlteGxjeUJ2Ym1ObElHSmhjMlZrSUc5dUlIUm9aU0JqZFhKeVpXNTBJR1J2WTNWdFpXNTBDaUFxSUVCd1lYSmhiU0I3Uld4bGJXVnVkSHhQWW1wbFkzUjlJRnRrYjJOZElFRnVJR1ZzWlcxbGJuUWdiM0lnWkc5amRXMWxiblFnYjJKcVpXTjBJSFJ2SUhWelpTQjBieUJ6WlhRZ2RHaGxJR1J2WTNWdFpXNTBDaUFxSUVCeVpYUjFjbTV6SUh0UFltcGxZM1I5SUZKbGRIVnlibk1nZEdobElHTjFjbkpsYm5RZ1pHOWpkVzFsYm5RS0lDb3ZDbk5sZEVSdlkzVnRaVzUwSUQwZ1UybDZlbXhsTG5ObGRFUnZZM1Z0Wlc1MElEMGdablZ1WTNScGIyNG9JRzV2WkdVZ0tTQjdDZ2wyWVhJZ2FHRnpRMjl0Y0dGeVpTd2djM1ZpVjJsdVpHOTNMQW9KQ1dSdll5QTlJRzV2WkdVZ1B5QnViMlJsTG05M2JtVnlSRzlqZFcxbGJuUWdmSHdnYm05a1pTQTZJSEJ5WldabGNuSmxaRVJ2WXpzS0Nna3ZMeUJTWlhSMWNtNGdaV0Z5YkhrZ2FXWWdaRzlqSUdseklHbHVkbUZzYVdRZ2IzSWdZV3h5WldGa2VTQnpaV3hsWTNSbFpBb0phV1lnS0NCa2IyTWdQVDA5SUdSdlkzVnRaVzUwSUh4OElHUnZZeTV1YjJSbFZIbHdaU0FoUFQwZ09TQjhmQ0FoWkc5akxtUnZZM1Z0Wlc1MFJXeGxiV1Z1ZENBcElIc0tDUWx5WlhSMWNtNGdaRzlqZFcxbGJuUTdDZ2w5Q2dvSkx5OGdWWEJrWVhSbElHZHNiMkpoYkNCMllYSnBZV0pzWlhNS0NXUnZZM1Z0Wlc1MElEMGdaRzlqT3dvSlpHOWpSV3hsYlNBOUlHUnZZM1Z0Wlc1MExtUnZZM1Z0Wlc1MFJXeGxiV1Z1ZERzS0NXUnZZM1Z0Wlc1MFNYTklWRTFNSUQwZ0lXbHpXRTFNS0NCa2IyTjFiV1Z1ZENBcE93b0tDUzh2SUZOMWNIQnZjblE2SUVsRklEa3RNVEVzSUVWa1oyVUtDUzh2SUVGalkyVnpjMmx1WnlCcFpuSmhiV1VnWkc5amRXMWxiblJ6SUdGbWRHVnlJSFZ1Ykc5aFpDQjBhSEp2ZDNNZ0luQmxjbTFwYzNOcGIyNGdaR1Z1YVdWa0lpQmxjbkp2Y25NZ0tHcFJkV1Z5ZVNBak1UTTVNellwQ2dscFppQW9JSEJ5WldabGNuSmxaRVJ2WXlBaFBUMGdaRzlqZFcxbGJuUWdKaVlLQ1Frb2MzVmlWMmx1Wkc5M0lEMGdaRzlqZFcxbGJuUXVaR1ZtWVhWc2RGWnBaWGNwSUNZbUlITjFZbGRwYm1SdmR5NTBiM0FnSVQwOUlITjFZbGRwYm1SdmR5QXBJSHNLQ2drSkx5OGdVM1Z3Y0c5eWREb2dTVVVnTVRFc0lFVmtaMlVLQ1FscFppQW9JSE4xWWxkcGJtUnZkeTVoWkdSRmRtVnVkRXhwYzNSbGJtVnlJQ2tnZXdvSkNRbHpkV0pYYVc1a2IzY3VZV1JrUlhabGJuUk1hWE4wWlc1bGNpZ2dJblZ1Ykc5aFpDSXNJSFZ1Ykc5aFpFaGhibVJzWlhJc0lHWmhiSE5sSUNrN0Nnb0pDUzh2SUZOMWNIQnZjblE2SUVsRklEa2dMU0F4TUNCdmJteDVDZ2tKZlNCbGJITmxJR2xtSUNnZ2MzVmlWMmx1Wkc5M0xtRjBkR0ZqYUVWMlpXNTBJQ2tnZXdvSkNRbHpkV0pYYVc1a2IzY3VZWFIwWVdOb1JYWmxiblFvSUNKdmJuVnViRzloWkNJc0lIVnViRzloWkVoaGJtUnNaWElnS1RzS0NRbDlDZ2w5Q2dvSkx5b2dRWFIwY21saWRYUmxjd29KTFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMU0FxTHdvS0NTOHZJRk4xY0hCdmNuUTZJRWxGUERnS0NTOHZJRlpsY21sbWVTQjBhR0YwSUdkbGRFRjBkSEpwWW5WMFpTQnlaV0ZzYkhrZ2NtVjBkWEp1Y3lCaGRIUnlhV0oxZEdWeklHRnVaQ0J1YjNRZ2NISnZjR1Z5ZEdsbGN3b0pMeThnS0dWNFkyVndkR2x1WnlCSlJUZ2dZbTl2YkdWaGJuTXBDZ2x6ZFhCd2IzSjBMbUYwZEhKcFluVjBaWE1nUFNCaGMzTmxjblFvWm5WdVkzUnBiMjRvSUdWc0lDa2dld29KQ1dWc0xtTnNZWE56VG1GdFpTQTlJQ0pwSWpzS0NRbHlaWFIxY200Z0lXVnNMbWRsZEVGMGRISnBZblYwWlNnaVkyeGhjM05PWVcxbElpazdDZ2w5S1RzS0Nna3ZLaUJuWlhSRmJHVnRaVzUwS0hNcFFua3FDZ2t0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRJQ292Q2dvSkx5OGdRMmhsWTJzZ2FXWWdaMlYwUld4bGJXVnVkSE5DZVZSaFowNWhiV1VvSWlvaUtTQnlaWFIxY201eklHOXViSGtnWld4bGJXVnVkSE1LQ1hOMWNIQnZjblF1WjJWMFJXeGxiV1Z1ZEhOQ2VWUmhaMDVoYldVZ1BTQmhjM05sY25Rb1puVnVZM1JwYjI0b0lHVnNJQ2tnZXdvSkNXVnNMbUZ3Y0dWdVpFTm9hV3hrS0NCa2IyTjFiV1Z1ZEM1amNtVmhkR1ZEYjIxdFpXNTBLQ0lpS1NBcE93b0pDWEpsZEhWeWJpQWhaV3d1WjJWMFJXeGxiV1Z1ZEhOQ2VWUmhaMDVoYldVb0lpb2lLUzVzWlc1bmRHZzdDZ2w5S1RzS0Nna3ZMeUJUZFhCd2IzSjBPaUJKUlR3NUNnbHpkWEJ3YjNKMExtZGxkRVZzWlcxbGJuUnpRbmxEYkdGemMwNWhiV1VnUFNCeWJtRjBhWFpsTG5SbGMzUW9JR1J2WTNWdFpXNTBMbWRsZEVWc1pXMWxiblJ6UW5sRGJHRnpjMDVoYldVZ0tUc0tDZ2t2THlCVGRYQndiM0owT2lCSlJUd3hNQW9KTHk4Z1EyaGxZMnNnYVdZZ1oyVjBSV3hsYldWdWRFSjVTV1FnY21WMGRYSnVjeUJsYkdWdFpXNTBjeUJpZVNCdVlXMWxDZ2t2THlCVWFHVWdZbkp2YTJWdUlHZGxkRVZzWlcxbGJuUkNlVWxrSUcxbGRHaHZaSE1nWkc5dUozUWdjR2xqYXlCMWNDQndjbTluY21GdGJXRjBhV05oYkd4NUxYTmxkQ0J1WVcxbGN5d0tDUzh2SUhOdklIVnpaU0JoSUhKdmRXNWtZV0p2ZFhRZ1oyVjBSV3hsYldWdWRITkNlVTVoYldVZ2RHVnpkQW9KYzNWd2NHOXlkQzVuWlhSQ2VVbGtJRDBnWVhOelpYSjBLR1oxYm1OMGFXOXVLQ0JsYkNBcElIc0tDUWxrYjJORmJHVnRMbUZ3Y0dWdVpFTm9hV3hrS0NCbGJDQXBMbWxrSUQwZ1pYaHdZVzVrYnpzS0NRbHlaWFIxY200Z0lXUnZZM1Z0Wlc1MExtZGxkRVZzWlcxbGJuUnpRbmxPWVcxbElIeDhJQ0ZrYjJOMWJXVnVkQzVuWlhSRmJHVnRaVzUwYzBKNVRtRnRaU2dnWlhod1lXNWtieUFwTG14bGJtZDBhRHNLQ1gwcE93b0tDUzh2SUVsRUlHWnBiSFJsY2lCaGJtUWdabWx1WkFvSmFXWWdLQ0J6ZFhCd2IzSjBMbWRsZEVKNVNXUWdLU0I3Q2drSlJYaHdjaTVtYVd4MFpYSmJJa2xFSWwwZ1BTQm1kVzVqZEdsdmJpZ2dhV1FnS1NCN0Nna0pDWFpoY2lCaGRIUnlTV1FnUFNCcFpDNXlaWEJzWVdObEtDQnlkVzVsYzJOaGNHVXNJR1oxYm1WelkyRndaU0FwT3dvSkNRbHlaWFIxY200Z1puVnVZM1JwYjI0b0lHVnNaVzBnS1NCN0Nna0pDUWx5WlhSMWNtNGdaV3hsYlM1blpYUkJkSFJ5YVdKMWRHVW9JbWxrSWlrZ1BUMDlJR0YwZEhKSlpEc0tDUWtKZlRzS0NRbDlPd29KQ1VWNGNISXVabWx1WkZzaVNVUWlYU0E5SUdaMWJtTjBhVzl1S0NCcFpDd2dZMjl1ZEdWNGRDQXBJSHNLQ1FrSmFXWWdLQ0IwZVhCbGIyWWdZMjl1ZEdWNGRDNW5aWFJGYkdWdFpXNTBRbmxKWkNBaFBUMGdJblZ1WkdWbWFXNWxaQ0lnSmlZZ1pHOWpkVzFsYm5SSmMwaFVUVXdnS1NCN0Nna0pDUWwyWVhJZ1pXeGxiU0E5SUdOdmJuUmxlSFF1WjJWMFJXeGxiV1Z1ZEVKNVNXUW9JR2xrSUNrN0Nna0pDUWx5WlhSMWNtNGdaV3hsYlNBL0lGc2daV3hsYlNCZElEb2dXMTA3Q2drSkNYMEtDUWw5T3dvSmZTQmxiSE5sSUhzS0NRbEZlSEJ5TG1acGJIUmxjbHNpU1VRaVhTQTlJQ0JtZFc1amRHbHZiaWdnYVdRZ0tTQjdDZ2tKQ1haaGNpQmhkSFJ5U1dRZ1BTQnBaQzV5WlhCc1lXTmxLQ0J5ZFc1bGMyTmhjR1VzSUdaMWJtVnpZMkZ3WlNBcE93b0pDUWx5WlhSMWNtNGdablZ1WTNScGIyNG9JR1ZzWlcwZ0tTQjdDZ2tKQ1FsMllYSWdibTlrWlNBOUlIUjVjR1Z2WmlCbGJHVnRMbWRsZEVGMGRISnBZblYwWlU1dlpHVWdJVDA5SUNKMWJtUmxabWx1WldRaUlDWW1DZ2tKQ1FrSlpXeGxiUzVuWlhSQmRIUnlhV0oxZEdWT2IyUmxLQ0pwWkNJcE93b0pDUWtKY21WMGRYSnVJRzV2WkdVZ0ppWWdibTlrWlM1MllXeDFaU0E5UFQwZ1lYUjBja2xrT3dvSkNRbDlPd29KQ1gwN0Nnb0pDUzh2SUZOMWNIQnZjblE2SUVsRklEWWdMU0EzSUc5dWJIa0tDUWt2THlCblpYUkZiR1Z0Wlc1MFFubEpaQ0JwY3lCdWIzUWdjbVZzYVdGaWJHVWdZWE1nWVNCbWFXNWtJSE5vYjNKMFkzVjBDZ2tKUlhod2NpNW1hVzVrV3lKSlJDSmRJRDBnWm5WdVkzUnBiMjRvSUdsa0xDQmpiMjUwWlhoMElDa2dld29KQ1FscFppQW9JSFI1Y0dWdlppQmpiMjUwWlhoMExtZGxkRVZzWlcxbGJuUkNlVWxrSUNFOVBTQWlkVzVrWldacGJtVmtJaUFtSmlCa2IyTjFiV1Z1ZEVselNGUk5UQ0FwSUhzS0NRa0pDWFpoY2lCdWIyUmxMQ0JwTENCbGJHVnRjeXdLQ1FrSkNRbGxiR1Z0SUQwZ1kyOXVkR1Y0ZEM1blpYUkZiR1Z0Wlc1MFFubEpaQ2dnYVdRZ0tUc0tDZ2tKQ1FscFppQW9JR1ZzWlcwZ0tTQjdDZ29KQ1FrSkNTOHZJRlpsY21sbWVTQjBhR1VnYVdRZ1lYUjBjbWxpZFhSbENna0pDUWtKYm05a1pTQTlJR1ZzWlcwdVoyVjBRWFIwY21saWRYUmxUbTlrWlNnaWFXUWlLVHNLQ1FrSkNRbHBaaUFvSUc1dlpHVWdKaVlnYm05a1pTNTJZV3gxWlNBOVBUMGdhV1FnS1NCN0Nna0pDUWtKQ1hKbGRIVnliaUJiSUdWc1pXMGdYVHNLQ1FrSkNRbDlDZ29KQ1FrSkNTOHZJRVpoYkd3Z1ltRmpheUJ2YmlCblpYUkZiR1Z0Wlc1MGMwSjVUbUZ0WlFvSkNRa0pDV1ZzWlcxeklEMGdZMjl1ZEdWNGRDNW5aWFJGYkdWdFpXNTBjMEo1VG1GdFpTZ2dhV1FnS1RzS0NRa0pDUWxwSUQwZ01Ec0tDUWtKQ1FsM2FHbHNaU0FvSUNobGJHVnRJRDBnWld4bGJYTmJhU3NyWFNrZ0tTQjdDZ2tKQ1FrSkNXNXZaR1VnUFNCbGJHVnRMbWRsZEVGMGRISnBZblYwWlU1dlpHVW9JbWxrSWlrN0Nna0pDUWtKQ1dsbUlDZ2dibTlrWlNBbUppQnViMlJsTG5aaGJIVmxJRDA5UFNCcFpDQXBJSHNLQ1FrSkNRa0pDWEpsZEhWeWJpQmJJR1ZzWlcwZ1hUc0tDUWtKQ1FrSmZRb0pDUWtKQ1gwS0NRa0pDWDBLQ2drSkNRbHlaWFIxY200Z1cxMDdDZ2tKQ1gwS0NRbDlPd29KZlFvS0NTOHZJRlJoWndvSlJYaHdjaTVtYVc1a1d5SlVRVWNpWFNBOUlITjFjSEJ2Y25RdVoyVjBSV3hsYldWdWRITkNlVlJoWjA1aGJXVWdQd29KQ1daMWJtTjBhVzl1S0NCMFlXY3NJR052Ym5SbGVIUWdLU0I3Q2drSkNXbG1JQ2dnZEhsd1pXOW1JR052Ym5SbGVIUXVaMlYwUld4bGJXVnVkSE5DZVZSaFowNWhiV1VnSVQwOUlDSjFibVJsWm1sdVpXUWlJQ2tnZXdvSkNRa0pjbVYwZFhKdUlHTnZiblJsZUhRdVoyVjBSV3hsYldWdWRITkNlVlJoWjA1aGJXVW9JSFJoWnlBcE93b0tDUWtKTHk4Z1JHOWpkVzFsYm5SR2NtRm5iV1Z1ZENCdWIyUmxjeUJrYjI0bmRDQm9ZWFpsSUdkRlFsUk9DZ2tKQ1gwZ1pXeHpaU0JwWmlBb0lITjFjSEJ2Y25RdWNYTmhJQ2tnZXdvSkNRa0pjbVYwZFhKdUlHTnZiblJsZUhRdWNYVmxjbmxUWld4bFkzUnZja0ZzYkNnZ2RHRm5JQ2s3Q2drSkNYMEtDUWw5SURvS0Nna0pablZ1WTNScGIyNG9JSFJoWnl3Z1kyOXVkR1Y0ZENBcElIc0tDUWtKZG1GeUlHVnNaVzBzQ2drSkNRbDBiWEFnUFNCYlhTd0tDUWtKQ1drZ1BTQXdMQW9KQ1FrSkx5OGdRbmtnYUdGd2NIa2dZMjlwYm1OcFpHVnVZMlVzSUdFZ0tHSnliMnRsYmlrZ1owVkNWRTRnWVhCd1pXRnljeUJ2YmlCRWIyTjFiV1Z1ZEVaeVlXZHRaVzUwSUc1dlpHVnpJSFJ2YndvSkNRa0pjbVZ6ZFd4MGN5QTlJR052Ym5SbGVIUXVaMlYwUld4bGJXVnVkSE5DZVZSaFowNWhiV1VvSUhSaFp5QXBPd29LQ1FrSkx5OGdSbWxzZEdWeUlHOTFkQ0J3YjNOemFXSnNaU0JqYjIxdFpXNTBjd29KQ1FscFppQW9JSFJoWnlBOVBUMGdJaW9pSUNrZ2V3b0pDUWtKZDJocGJHVWdLQ0FvWld4bGJTQTlJSEpsYzNWc2RITmJhU3NyWFNrZ0tTQjdDZ2tKQ1FrSmFXWWdLQ0JsYkdWdExtNXZaR1ZVZVhCbElEMDlQU0F4SUNrZ2V3b0pDUWtKQ1FsMGJYQXVjSFZ6YUNnZ1pXeGxiU0FwT3dvSkNRa0pDWDBLQ1FrSkNYMEtDZ2tKQ1FseVpYUjFjbTRnZEcxd093b0pDUWw5Q2drSkNYSmxkSFZ5YmlCeVpYTjFiSFJ6T3dvSkNYMDdDZ29KTHk4Z1EyeGhjM01LQ1VWNGNISXVabWx1WkZzaVEweEJVMU1pWFNBOUlITjFjSEJ2Y25RdVoyVjBSV3hsYldWdWRITkNlVU5zWVhOelRtRnRaU0FtSmlCbWRXNWpkR2x2YmlnZ1kyeGhjM05PWVcxbExDQmpiMjUwWlhoMElDa2dld29KQ1dsbUlDZ2dkSGx3Wlc5bUlHTnZiblJsZUhRdVoyVjBSV3hsYldWdWRITkNlVU5zWVhOelRtRnRaU0FoUFQwZ0luVnVaR1ZtYVc1bFpDSWdKaVlnWkc5amRXMWxiblJKYzBoVVRVd2dLU0I3Q2drSkNYSmxkSFZ5YmlCamIyNTBaWGgwTG1kbGRFVnNaVzFsYm5SelFubERiR0Z6YzA1aGJXVW9JR05zWVhOelRtRnRaU0FwT3dvSkNYMEtDWDA3Q2dvSkx5b2dVVk5CTDIxaGRHTm9aWE5UWld4bFkzUnZjZ29KTFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMU0FxTHdvS0NTOHZJRkZUUVNCaGJtUWdiV0YwWTJobGMxTmxiR1ZqZEc5eUlITjFjSEJ2Y25RS0Nna3ZMeUJ0WVhSamFHVnpVMlZzWldOMGIzSW9PbUZqZEdsMlpTa2djbVZ3YjNKMGN5Qm1ZV3h6WlNCM2FHVnVJSFJ5ZFdVZ0tFbEZPUzlQY0dWeVlTQXhNUzQxS1FvSmNtSjFaMmQ1VFdGMFkyaGxjeUE5SUZ0ZE93b0tDUzh2SUhGVFlTZzZabTlqZFhNcElISmxjRzl5ZEhNZ1ptRnNjMlVnZDJobGJpQjBjblZsSUNoRGFISnZiV1VnTWpFcENna3ZMeUJYWlNCaGJHeHZkeUIwYUdseklHSmxZMkYxYzJVZ2IyWWdZU0JpZFdjZ2FXNGdTVVU0THprZ2RHaGhkQ0IwYUhKdmQzTWdZVzRnWlhKeWIzSUtDUzh2SUhkb1pXNWxkbVZ5SUdCa2IyTjFiV1Z1ZEM1aFkzUnBkbVZGYkdWdFpXNTBZQ0JwY3lCaFkyTmxjM05sWkNCdmJpQmhiaUJwWm5KaGJXVUtDUzh2SUZOdkxDQjNaU0JoYkd4dmR5QTZabTlqZFhNZ2RHOGdjR0Z6Y3lCMGFISnZkV2RvSUZGVFFTQmhiR3dnZEdobElIUnBiV1VnZEc4Z1lYWnZhV1FnZEdobElFbEZJR1Z5Y205eUNna3ZMeUJUWldVZ2FIUjBjSE02THk5aWRXZHpMbXB4ZFdWeWVTNWpiMjB2ZEdsamEyVjBMekV6TXpjNENnbHlZblZuWjNsUlUwRWdQU0JiWFRzS0NnbHBaaUFvSUNoemRYQndiM0owTG5GellTQTlJSEp1WVhScGRtVXVkR1Z6ZENnZ1pHOWpkVzFsYm5RdWNYVmxjbmxUWld4bFkzUnZja0ZzYkNBcEtTQXBJSHNLQ1Frdkx5QkNkV2xzWkNCUlUwRWdjbVZuWlhnS0NRa3ZMeUJTWldkbGVDQnpkSEpoZEdWbmVTQmhaRzl3ZEdWa0lHWnliMjBnUkdsbFoyOGdVR1Z5YVc1cENna0pZWE56WlhKMEtHWjFibU4wYVc5dUtDQmxiQ0FwSUhzS0NRa0pMeThnVTJWc1pXTjBJR2x6SUhObGRDQjBieUJsYlhCMGVTQnpkSEpwYm1jZ2IyNGdjSFZ5Y0c5elpRb0pDUWt2THlCVWFHbHpJR2x6SUhSdklIUmxjM1FnU1VVbmN5QjBjbVZoZEcxbGJuUWdiMllnYm05MElHVjRjR3hwWTJsMGJIa0tDUWtKTHk4Z2MyVjBkR2x1WnlCaElHSnZiMnhsWVc0Z1kyOXVkR1Z1ZENCaGRIUnlhV0oxZEdVc0Nna0pDUzh2SUhOcGJtTmxJR2wwY3lCd2NtVnpaVzVqWlNCemFHOTFiR1FnWW1VZ1pXNXZkV2RvQ2drSkNTOHZJR2gwZEhCek9pOHZZblZuY3k1cWNYVmxjbmt1WTI5dEwzUnBZMnRsZEM4eE1qTTFPUW9KQ1Fsa2IyTkZiR1Z0TG1Gd2NHVnVaRU5vYVd4a0tDQmxiQ0FwTG1sdWJtVnlTRlJOVENBOUlDSThZU0JwWkQwbklpQXJJR1Y0Y0dGdVpHOGdLeUFpSno0OEwyRStJaUFyQ2drSkNRa2lQSE5sYkdWamRDQnBaRDBuSWlBcklHVjRjR0Z1Wkc4Z0t5QWlMVnh5WEZ3bklHMXpZV3hzYjNkallYQjBkWEpsUFNjblBpSWdLd29KQ1FrSklqeHZjSFJwYjI0Z2MyVnNaV04wWldROUp5YytQQzl2Y0hScGIyNCtQQzl6Wld4bFkzUStJanNLQ2drSkNTOHZJRk4xY0hCdmNuUTZJRWxGT0N3Z1QzQmxjbUVnTVRFdE1USXVNVFlLQ1FrSkx5OGdUbTkwYUdsdVp5QnphRzkxYkdRZ1ltVWdjMlZzWldOMFpXUWdkMmhsYmlCbGJYQjBlU0J6ZEhKcGJtZHpJR1p2Ykd4dmR5QmVQU0J2Y2lBa1BTQnZjaUFxUFFvSkNRa3ZMeUJVYUdVZ2RHVnpkQ0JoZEhSeWFXSjFkR1VnYlhWemRDQmlaU0IxYm10dWIzZHVJR2x1SUU5d1pYSmhJR0oxZENBaWMyRm1aU0lnWm05eUlGZHBibEpVQ2drSkNTOHZJR2gwZEhCek9pOHZiWE5rYmk1dGFXTnliM052Wm5RdVkyOXRMMlZ1TFhWekwyeHBZbkpoY25rdmFXVXZhR2cwTmpVek9EZ3VZWE53ZUNOaGRIUnlhV0oxZEdWZmMyVmpkR2x2YmdvSkNRbHBaaUFvSUdWc0xuRjFaWEo1VTJWc1pXTjBiM0pCYkd3b0lsdHRjMkZzYkc5M1kyRndkSFZ5WlY0OUp5ZGRJaWt1YkdWdVozUm9JQ2tnZXdvSkNRa0pjbUoxWjJkNVVWTkJMbkIxYzJnb0lDSmJLbDRrWFQwaUlDc2dkMmhwZEdWemNHRmpaU0FySUNJcUtEODZKeWQ4WENKY0lpa2lJQ2s3Q2drSkNYMEtDZ2tKQ1M4dklGTjFjSEJ2Y25RNklFbEZPQW9KQ1Frdkx5QkNiMjlzWldGdUlHRjBkSEpwWW5WMFpYTWdZVzVrSUNKMllXeDFaU0lnWVhKbElHNXZkQ0IwY21WaGRHVmtJR052Y25KbFkzUnNlUW9KQ1FscFppQW9JQ0ZsYkM1eGRXVnllVk5sYkdWamRHOXlRV3hzS0NKYmMyVnNaV04wWldSZElpa3ViR1Z1WjNSb0lDa2dld29KQ1FrSmNtSjFaMmQ1VVZOQkxuQjFjMmdvSUNKY1hGc2lJQ3NnZDJocGRHVnpjR0ZqWlNBcklDSXFLRDg2ZG1Gc2RXVjhJaUFySUdKdmIyeGxZVzV6SUNzZ0lpa2lJQ2s3Q2drSkNYMEtDZ2tKQ1M4dklGTjFjSEJ2Y25RNklFTm9jbTl0WlR3eU9Td2dRVzVrY205cFpEdzBMalFzSUZOaFptRnlhVHczTGpBckxDQnBUMU04Tnk0d0t5d2dVR2hoYm5SdmJVcFRQREV1T1M0NEt3b0pDUWxwWmlBb0lDRmxiQzV4ZFdWeWVWTmxiR1ZqZEc5eVFXeHNLQ0FpVzJsa2ZqMGlJQ3NnWlhod1lXNWtieUFySUNJdFhTSWdLUzVzWlc1bmRHZ2dLU0I3Q2drSkNRbHlZblZuWjNsUlUwRXVjSFZ6YUNnaWZqMGlLVHNLQ1FrSmZRb0tDUWtKTHk4Z1YyVmlhMmwwTDA5d1pYSmhJQzBnT21Ob1pXTnJaV1FnYzJodmRXeGtJSEpsZEhWeWJpQnpaV3hsWTNSbFpDQnZjSFJwYjI0Z1pXeGxiV1Z1ZEhNS0NRa0pMeThnYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2VkZJdk1qQXhNUzlTUlVNdFkzTnpNeTF6Wld4bFkzUnZjbk10TWpBeE1UQTVNamt2STJOb1pXTnJaV1FLQ1FrSkx5OGdTVVU0SUhSb2NtOTNjeUJsY25KdmNpQm9aWEpsSUdGdVpDQjNhV3hzSUc1dmRDQnpaV1VnYkdGMFpYSWdkR1Z6ZEhNS0NRa0phV1lnS0NBaFpXd3VjWFZsY25sVFpXeGxZM1J2Y2tGc2JDZ2lPbU5vWldOclpXUWlLUzVzWlc1bmRHZ2dLU0I3Q2drSkNRbHlZblZuWjNsUlUwRXVjSFZ6YUNnaU9tTm9aV05yWldRaUtUc0tDUWtKZlFvS0NRa0pMeThnVTNWd2NHOXlkRG9nVTJGbVlYSnBJRGdyTENCcFQxTWdPQ3NLQ1FrSkx5OGdhSFIwY0hNNkx5OWlkV2R6TG5kbFltdHBkQzV2Y21jdmMyaHZkMTlpZFdjdVkyZHBQMmxrUFRFek5qZzFNUW9KQ1Frdkx5QkpiaTF3WVdkbElHQnpaV3hsWTNSdmNpTnBaQ0J6YVdKc2FXNW5MV052YldKcGJtRjBiM0lnYzJWc1pXTjBiM0pnSUdaaGFXeHpDZ2tKQ1dsbUlDZ2dJV1ZzTG5GMVpYSjVVMlZzWldOMGIzSkJiR3dvSUNKaEl5SWdLeUJsZUhCaGJtUnZJQ3NnSWlzcUlpQXBMbXhsYm1kMGFDQXBJSHNLQ1FrSkNYSmlkV2RuZVZGVFFTNXdkWE5vS0NJdUl5NHJXeXQrWFNJcE93b0pDUWw5Q2drSmZTazdDZ29KQ1dGemMyVnlkQ2htZFc1amRHbHZiaWdnWld3Z0tTQjdDZ2tKQ1dWc0xtbHVibVZ5U0ZSTlRDQTlJQ0k4WVNCb2NtVm1QU2NuSUdScGMyRmliR1ZrUFNka2FYTmhZbXhsWkNjK1BDOWhQaUlnS3dvSkNRa0pJanh6Wld4bFkzUWdaR2x6WVdKc1pXUTlKMlJwYzJGaWJHVmtKejQ4YjNCMGFXOXVMejQ4TDNObGJHVmpkRDRpT3dvS0NRa0pMeThnVTNWd2NHOXlkRG9nVjJsdVpHOTNjeUE0SUU1aGRHbDJaU0JCY0hCekNna0pDUzh2SUZSb1pTQjBlWEJsSUdGdVpDQnVZVzFsSUdGMGRISnBZblYwWlhNZ1lYSmxJSEpsYzNSeWFXTjBaV1FnWkhWeWFXNW5JQzVwYm01bGNraFVUVXdnWVhOemFXZHViV1Z1ZEFvSkNRbDJZWElnYVc1d2RYUWdQU0JrYjJOMWJXVnVkQzVqY21WaGRHVkZiR1Z0Wlc1MEtDSnBibkIxZENJcE93b0pDUWxwYm5CMWRDNXpaWFJCZEhSeWFXSjFkR1VvSUNKMGVYQmxJaXdnSW1ocFpHUmxiaUlnS1RzS0NRa0paV3d1WVhCd1pXNWtRMmhwYkdRb0lHbHVjSFYwSUNrdWMyVjBRWFIwY21saWRYUmxLQ0FpYm1GdFpTSXNJQ0pFSWlBcE93b0tDUWtKTHk4Z1UzVndjRzl5ZERvZ1NVVTRDZ2tKQ1M4dklFVnVabTl5WTJVZ1kyRnpaUzF6Wlc1emFYUnBkbWwwZVNCdlppQnVZVzFsSUdGMGRISnBZblYwWlFvSkNRbHBaaUFvSUdWc0xuRjFaWEo1VTJWc1pXTjBiM0pCYkd3b0lsdHVZVzFsUFdSZElpa3ViR1Z1WjNSb0lDa2dld29KQ1FrSmNtSjFaMmQ1VVZOQkxuQjFjMmdvSUNKdVlXMWxJaUFySUhkb2FYUmxjM0JoWTJVZ0t5QWlLbHNxWGlSOElYNWRQejBpSUNrN0Nna0pDWDBLQ2drSkNTOHZJRVpHSURNdU5TQXRJRHBsYm1GaWJHVmtMenBrYVhOaFlteGxaQ0JoYm1RZ2FHbGtaR1Z1SUdWc1pXMWxiblJ6SUNob2FXUmtaVzRnWld4bGJXVnVkSE1nWVhKbElITjBhV3hzSUdWdVlXSnNaV1FwQ2drSkNTOHZJRWxGT0NCMGFISnZkM01nWlhKeWIzSWdhR1Z5WlNCaGJtUWdkMmxzYkNCdWIzUWdjMlZsSUd4aGRHVnlJSFJsYzNSekNna0pDV2xtSUNnZ1pXd3VjWFZsY25sVFpXeGxZM1J2Y2tGc2JDZ2lPbVZ1WVdKc1pXUWlLUzVzWlc1bmRHZ2dJVDA5SURJZ0tTQjdDZ2tKQ1FseVluVm5aM2xSVTBFdWNIVnphQ2dnSWpwbGJtRmliR1ZrSWl3Z0lqcGthWE5oWW14bFpDSWdLVHNLQ1FrSmZRb0tDUWtKTHk4Z1UzVndjRzl5ZERvZ1NVVTVMVEV4S3dvSkNRa3ZMeUJKUlNkeklEcGthWE5oWW14bFpDQnpaV3hsWTNSdmNpQmtiMlZ6SUc1dmRDQndhV05ySUhWd0lIUm9aU0JqYUdsc1pISmxiaUJ2WmlCa2FYTmhZbXhsWkNCbWFXVnNaSE5sZEhNS0NRa0paRzlqUld4bGJTNWhjSEJsYm1SRGFHbHNaQ2dnWld3Z0tTNWthWE5oWW14bFpDQTlJSFJ5ZFdVN0Nna0pDV2xtSUNnZ1pXd3VjWFZsY25sVFpXeGxZM1J2Y2tGc2JDZ2lPbVJwYzJGaWJHVmtJaWt1YkdWdVozUm9JQ0U5UFNBeUlDa2dld29KQ1FrSmNtSjFaMmQ1VVZOQkxuQjFjMmdvSUNJNlpXNWhZbXhsWkNJc0lDSTZaR2x6WVdKc1pXUWlJQ2s3Q2drSkNYMEtDZ2tKQ1M4dklFOXdaWEpoSURFd0xURXhJR1J2WlhNZ2JtOTBJSFJvY205M0lHOXVJSEJ2YzNRdFkyOXRiV0VnYVc1MllXeHBaQ0J3YzJWMVpHOXpDZ2tKQ1dWc0xuRjFaWEo1VTJWc1pXTjBiM0pCYkd3b0lpb3NPbmdpS1RzS0NRa0pjbUoxWjJkNVVWTkJMbkIxYzJnb0lpd3VLam9pS1RzS0NRbDlLVHNLQ1gwS0NnbHBaaUFvSUNoemRYQndiM0owTG0xaGRHTm9aWE5UWld4bFkzUnZjaUE5SUhKdVlYUnBkbVV1ZEdWemRDZ2dLRzFoZEdOb1pYTWdQU0JrYjJORmJHVnRMbTFoZEdOb1pYTWdmSHdLQ1Fsa2IyTkZiR1Z0TG5kbFltdHBkRTFoZEdOb1pYTlRaV3hsWTNSdmNpQjhmQW9KQ1dSdlkwVnNaVzB1Ylc5NlRXRjBZMmhsYzFObGJHVmpkRzl5SUh4OENna0paRzlqUld4bGJTNXZUV0YwWTJobGMxTmxiR1ZqZEc5eUlIeDhDZ2tKWkc5alJXeGxiUzV0YzAxaGRHTm9aWE5UWld4bFkzUnZjaWtnS1NrZ0tTQjdDZ29KQ1dGemMyVnlkQ2htZFc1amRHbHZiaWdnWld3Z0tTQjdDZ2tKQ1M4dklFTm9aV05ySUhSdklITmxaU0JwWmlCcGRDZHpJSEJ2YzNOcFlteGxJSFJ2SUdSdklHMWhkR05vWlhOVFpXeGxZM1J2Y2dvSkNRa3ZMeUJ2YmlCaElHUnBjMk52Ym01bFkzUmxaQ0J1YjJSbElDaEpSU0E1S1FvSkNRbHpkWEJ3YjNKMExtUnBjMk52Ym01bFkzUmxaRTFoZEdOb0lEMGdiV0YwWTJobGN5NWpZV3hzS0NCbGJDd2dJaW9pSUNrN0Nnb0pDUWt2THlCVWFHbHpJSE5vYjNWc1pDQm1ZV2xzSUhkcGRHZ2dZVzRnWlhoalpYQjBhVzl1Q2drSkNTOHZJRWRsWTJ0dklHUnZaWE1nYm05MElHVnljbTl5TENCeVpYUjFjbTV6SUdaaGJITmxJR2x1YzNSbFlXUUtDUWtKYldGMFkyaGxjeTVqWVd4c0tDQmxiQ3dnSWx0eklUMG5KMTA2ZUNJZ0tUc0tDUWtKY21KMVoyZDVUV0YwWTJobGN5NXdkWE5vS0NBaUlUMGlMQ0J3YzJWMVpHOXpJQ2s3Q2drSmZTazdDZ2w5Q2dvSmNtSjFaMmQ1VVZOQklEMGdjbUoxWjJkNVVWTkJMbXhsYm1kMGFDQW1KaUJ1WlhjZ1VtVm5SWGh3S0NCeVluVm5aM2xSVTBFdWFtOXBiaWdpZkNJcElDazdDZ2x5WW5WblozbE5ZWFJqYUdWeklEMGdjbUoxWjJkNVRXRjBZMmhsY3k1c1pXNW5kR2dnSmlZZ2JtVjNJRkpsWjBWNGNDZ2djbUoxWjJkNVRXRjBZMmhsY3k1cWIybHVLQ0o4SWlrZ0tUc0tDZ2t2S2lCRGIyNTBZV2x1Y3dvSkxTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFNBcUx3b0phR0Z6UTI5dGNHRnlaU0E5SUhKdVlYUnBkbVV1ZEdWemRDZ2daRzlqUld4bGJTNWpiMjF3WVhKbFJHOWpkVzFsYm5SUWIzTnBkR2x2YmlBcE93b0tDUzh2SUVWc1pXMWxiblFnWTI5dWRHRnBibk1nWVc1dmRHaGxjZ29KTHk4Z1VIVnljRzl6WldaMWJHeDVJSE5sYkdZdFpYaGpiSFZ6YVhabENna3ZMeUJCY3lCcGJpd2dZVzRnWld4bGJXVnVkQ0JrYjJWeklHNXZkQ0JqYjI1MFlXbHVJR2wwYzJWc1pnb0pZMjl1ZEdGcGJuTWdQU0JvWVhORGIyMXdZWEpsSUh4OElISnVZWFJwZG1VdWRHVnpkQ2dnWkc5alJXeGxiUzVqYjI1MFlXbHVjeUFwSUQ4S0NRbG1kVzVqZEdsdmJpZ2dZU3dnWWlBcElIc0tDUWtKZG1GeUlHRmtiM2R1SUQwZ1lTNXViMlJsVkhsd1pTQTlQVDBnT1NBL0lHRXVaRzlqZFcxbGJuUkZiR1Z0Wlc1MElEb2dZU3dLQ1FrSkNXSjFjQ0E5SUdJZ0ppWWdZaTV3WVhKbGJuUk9iMlJsT3dvSkNRbHlaWFIxY200Z1lTQTlQVDBnWW5Wd0lIeDhJQ0VoS0NCaWRYQWdKaVlnWW5Wd0xtNXZaR1ZVZVhCbElEMDlQU0F4SUNZbUlDZ0tDUWtKQ1dGa2IzZHVMbU52Ym5SaGFXNXpJRDhLQ1FrSkNRbGhaRzkzYmk1amIyNTBZV2x1Y3lnZ1luVndJQ2tnT2dvSkNRa0pDV0V1WTI5dGNHRnlaVVJ2WTNWdFpXNTBVRzl6YVhScGIyNGdKaVlnWVM1amIyMXdZWEpsUkc5amRXMWxiblJRYjNOcGRHbHZiaWdnWW5Wd0lDa2dKaUF4TmdvSkNRa3BLVHNLQ1FsOUlEb0tDUWxtZFc1amRHbHZiaWdnWVN3Z1lpQXBJSHNLQ1FrSmFXWWdLQ0JpSUNrZ2V3b0pDUWtKZDJocGJHVWdLQ0FvWWlBOUlHSXVjR0Z5Wlc1MFRtOWtaU2tnS1NCN0Nna0pDUWtKYVdZZ0tDQmlJRDA5UFNCaElDa2dld29KQ1FrSkNRbHlaWFIxY200Z2RISjFaVHNLQ1FrSkNRbDlDZ2tKQ1FsOUNna0pDWDBLQ1FrSmNtVjBkWEp1SUdaaGJITmxPd29KQ1gwN0Nnb0pMeW9nVTI5eWRHbHVad29KTFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMU0FxTHdvS0NTOHZJRVJ2WTNWdFpXNTBJRzl5WkdWeUlITnZjblJwYm1jS0NYTnZjblJQY21SbGNpQTlJR2hoYzBOdmJYQmhjbVVnUHdvSlpuVnVZM1JwYjI0b0lHRXNJR0lnS1NCN0Nnb0pDUzh2SUVac1lXY2dabTl5SUdSMWNHeHBZMkYwWlNCeVpXMXZkbUZzQ2drSmFXWWdLQ0JoSUQwOVBTQmlJQ2tnZXdvSkNRbG9ZWE5FZFhCc2FXTmhkR1VnUFNCMGNuVmxPd29KQ1FseVpYUjFjbTRnTURzS0NRbDlDZ29KQ1M4dklGTnZjblFnYjI0Z2JXVjBhRzlrSUdWNGFYTjBaVzVqWlNCcFppQnZibXg1SUc5dVpTQnBibkIxZENCb1lYTWdZMjl0Y0dGeVpVUnZZM1Z0Wlc1MFVHOXphWFJwYjI0S0NRbDJZWElnWTI5dGNHRnlaU0E5SUNGaExtTnZiWEJoY21WRWIyTjFiV1Z1ZEZCdmMybDBhVzl1SUMwZ0lXSXVZMjl0Y0dGeVpVUnZZM1Z0Wlc1MFVHOXphWFJwYjI0N0Nna0phV1lnS0NCamIyMXdZWEpsSUNrZ2V3b0pDUWx5WlhSMWNtNGdZMjl0Y0dGeVpUc0tDUWw5Q2dvSkNTOHZJRU5oYkdOMWJHRjBaU0J3YjNOcGRHbHZiaUJwWmlCaWIzUm9JR2x1Y0hWMGN5QmlaV3h2Ym1jZ2RHOGdkR2hsSUhOaGJXVWdaRzlqZFcxbGJuUUtDUWxqYjIxd1lYSmxJRDBnS0NCaExtOTNibVZ5Ukc5amRXMWxiblFnZkh3Z1lTQXBJRDA5UFNBb0lHSXViM2R1WlhKRWIyTjFiV1Z1ZENCOGZDQmlJQ2tnUHdvSkNRbGhMbU52YlhCaGNtVkViMk4xYldWdWRGQnZjMmwwYVc5dUtDQmlJQ2tnT2dvS0NRa0pMeThnVDNSb1pYSjNhWE5sSUhkbElHdHViM2NnZEdobGVTQmhjbVVnWkdselkyOXVibVZqZEdWa0Nna0pDVEU3Q2dvSkNTOHZJRVJwYzJOdmJtNWxZM1JsWkNCdWIyUmxjd29KQ1dsbUlDZ2dZMjl0Y0dGeVpTQW1JREVnZkh3S0NRa0pLQ0Z6ZFhCd2IzSjBMbk52Y25SRVpYUmhZMmhsWkNBbUppQmlMbU52YlhCaGNtVkViMk4xYldWdWRGQnZjMmwwYVc5dUtDQmhJQ2tnUFQwOUlHTnZiWEJoY21VcElDa2dld29LQ1FrSkx5OGdRMmh2YjNObElIUm9aU0JtYVhKemRDQmxiR1Z0Wlc1MElIUm9ZWFFnYVhNZ2NtVnNZWFJsWkNCMGJ5QnZkWElnY0hKbFptVnljbVZrSUdSdlkzVnRaVzUwQ2drSkNXbG1JQ2dnWVNBOVBUMGdaRzlqZFcxbGJuUWdmSHdnWVM1dmQyNWxja1J2WTNWdFpXNTBJRDA5UFNCd2NtVm1aWEp5WldSRWIyTWdKaVlnWTI5dWRHRnBibk1vY0hKbFptVnljbVZrUkc5akxDQmhLU0FwSUhzS0NRa0pDWEpsZEhWeWJpQXRNVHNLQ1FrSmZRb0pDUWxwWmlBb0lHSWdQVDA5SUdSdlkzVnRaVzUwSUh4OElHSXViM2R1WlhKRWIyTjFiV1Z1ZENBOVBUMGdjSEpsWm1WeWNtVmtSRzlqSUNZbUlHTnZiblJoYVc1ektIQnlaV1psY25KbFpFUnZZeXdnWWlrZ0tTQjdDZ2tKQ1FseVpYUjFjbTRnTVRzS0NRa0pmUW9LQ1FrSkx5OGdUV0ZwYm5SaGFXNGdiM0pwWjJsdVlXd2diM0prWlhJS0NRa0pjbVYwZFhKdUlITnZjblJKYm5CMWRDQS9DZ2tKQ1Frb0lHbHVaR1Y0VDJZb0lITnZjblJKYm5CMWRDd2dZU0FwSUMwZ2FXNWtaWGhQWmlnZ2MyOXlkRWx1Y0hWMExDQmlJQ2tnS1NBNkNna0pDUWt3T3dvSkNYMEtDZ2tKY21WMGRYSnVJR052YlhCaGNtVWdKaUEwSUQ4Z0xURWdPaUF4T3dvSmZTQTZDZ2xtZFc1amRHbHZiaWdnWVN3Z1lpQXBJSHNLQ1Frdkx5QkZlR2wwSUdWaGNteDVJR2xtSUhSb1pTQnViMlJsY3lCaGNtVWdhV1JsYm5ScFkyRnNDZ2tKYVdZZ0tDQmhJRDA5UFNCaUlDa2dld29KQ1Fsb1lYTkVkWEJzYVdOaGRHVWdQU0IwY25WbE93b0pDUWx5WlhSMWNtNGdNRHNLQ1FsOUNnb0pDWFpoY2lCamRYSXNDZ2tKQ1drZ1BTQXdMQW9KQ1FsaGRYQWdQU0JoTG5CaGNtVnVkRTV2WkdVc0Nna0pDV0oxY0NBOUlHSXVjR0Z5Wlc1MFRtOWtaU3dLQ1FrSllYQWdQU0JiSUdFZ1hTd0tDUWtKWW5BZ1BTQmJJR0lnWFRzS0Nna0pMeThnVUdGeVpXNTBiR1Z6Y3lCdWIyUmxjeUJoY21VZ1pXbDBhR1Z5SUdSdlkzVnRaVzUwY3lCdmNpQmthWE5qYjI1dVpXTjBaV1FLQ1FscFppQW9JQ0ZoZFhBZ2ZId2dJV0oxY0NBcElIc0tDUWtKY21WMGRYSnVJR0VnUFQwOUlHUnZZM1Z0Wlc1MElEOGdMVEVnT2dvSkNRa0pZaUE5UFQwZ1pHOWpkVzFsYm5RZ1B5QXhJRG9LQ1FrSkNXRjFjQ0EvSUMweElEb0tDUWtKQ1dKMWNDQS9JREVnT2dvSkNRa0pjMjl5ZEVsdWNIVjBJRDhLQ1FrSkNTZ2dhVzVrWlhoUFppZ2djMjl5ZEVsdWNIVjBMQ0JoSUNrZ0xTQnBibVJsZUU5bUtDQnpiM0owU1c1d2RYUXNJR0lnS1NBcElEb0tDUWtKQ1RBN0Nnb0pDUzh2SUVsbUlIUm9aU0J1YjJSbGN5QmhjbVVnYzJsaWJHbHVaM01zSUhkbElHTmhiaUJrYnlCaElIRjFhV05ySUdOb1pXTnJDZ2tKZlNCbGJITmxJR2xtSUNnZ1lYVndJRDA5UFNCaWRYQWdLU0I3Q2drSkNYSmxkSFZ5YmlCemFXSnNhVzVuUTJobFkyc29JR0VzSUdJZ0tUc0tDUWw5Q2dvSkNTOHZJRTkwYUdWeWQybHpaU0IzWlNCdVpXVmtJR1oxYkd3Z2JHbHpkSE1nYjJZZ2RHaGxhWElnWVc1alpYTjBiM0p6SUdadmNpQmpiMjF3WVhKcGMyOXVDZ2tKWTNWeUlEMGdZVHNLQ1FsM2FHbHNaU0FvSUNoamRYSWdQU0JqZFhJdWNHRnlaVzUwVG05a1pTa2dLU0I3Q2drSkNXRndMblZ1YzJocFpuUW9JR04xY2lBcE93b0pDWDBLQ1FsamRYSWdQU0JpT3dvSkNYZG9hV3hsSUNnZ0tHTjFjaUE5SUdOMWNpNXdZWEpsYm5ST2IyUmxLU0FwSUhzS0NRa0pZbkF1ZFc1emFHbG1kQ2dnWTNWeUlDazdDZ2tKZlFvS0NRa3ZMeUJYWVd4cklHUnZkMjRnZEdobElIUnlaV1VnYkc5dmEybHVaeUJtYjNJZ1lTQmthWE5qY21Wd1lXNWplUW9KQ1hkb2FXeGxJQ2dnWVhCYmFWMGdQVDA5SUdKd1cybGRJQ2tnZXdvSkNRbHBLeXM3Q2drSmZRb0tDUWx5WlhSMWNtNGdhU0EvQ2drSkNTOHZJRVJ2SUdFZ2MybGliR2x1WnlCamFHVmpheUJwWmlCMGFHVWdibTlrWlhNZ2FHRjJaU0JoSUdOdmJXMXZiaUJoYm1ObGMzUnZjZ29KQ1FsemFXSnNhVzVuUTJobFkyc29JR0Z3VzJsZExDQmljRnRwWFNBcElEb0tDZ2tKQ1M4dklFOTBhR1Z5ZDJselpTQnViMlJsY3lCcGJpQnZkWElnWkc5amRXMWxiblFnYzI5eWRDQm1hWEp6ZEFvSkNRbGhjRnRwWFNBOVBUMGdjSEpsWm1WeWNtVmtSRzlqSUQ4Z0xURWdPZ29KQ1FsaWNGdHBYU0E5UFQwZ2NISmxabVZ5Y21Wa1JHOWpJRDhnTVNBNkNna0pDVEE3Q2dsOU93b0tDWEpsZEhWeWJpQmtiMk4xYldWdWREc0tmVHNLQ2xOcGVucHNaUzV0WVhSamFHVnpJRDBnWm5WdVkzUnBiMjRvSUdWNGNISXNJR1ZzWlcxbGJuUnpJQ2tnZXdvSmNtVjBkWEp1SUZOcGVucHNaU2dnWlhod2Npd2diblZzYkN3Z2JuVnNiQ3dnWld4bGJXVnVkSE1nS1RzS2ZUc0tDbE5wZW5wc1pTNXRZWFJqYUdWelUyVnNaV04wYjNJZ1BTQm1kVzVqZEdsdmJpZ2daV3hsYlN3Z1pYaHdjaUFwSUhzS0NTOHZJRk5sZENCa2IyTjFiV1Z1ZENCMllYSnpJR2xtSUc1bFpXUmxaQW9KYVdZZ0tDQW9JR1ZzWlcwdWIzZHVaWEpFYjJOMWJXVnVkQ0I4ZkNCbGJHVnRJQ2tnSVQwOUlHUnZZM1Z0Wlc1MElDa2dld29KQ1hObGRFUnZZM1Z0Wlc1MEtDQmxiR1Z0SUNrN0NnbDlDZ29KTHk4Z1RXRnJaU0J6ZFhKbElIUm9ZWFFnWVhSMGNtbGlkWFJsSUhObGJHVmpkRzl5Y3lCaGNtVWdjWFZ2ZEdWa0NnbGxlSEJ5SUQwZ1pYaHdjaTV5WlhCc1lXTmxLQ0J5WVhSMGNtbGlkWFJsVVhWdmRHVnpMQ0FpUFNja01TZGRJaUFwT3dvS0NXbG1JQ2dnYzNWd2NHOXlkQzV0WVhSamFHVnpVMlZzWldOMGIzSWdKaVlnWkc5amRXMWxiblJKYzBoVVRVd2dKaVlLQ1FraFkyOXRjR2xzWlhKRFlXTm9aVnNnWlhod2NpQXJJQ0lnSWlCZElDWW1DZ2tKS0NBaGNtSjFaMmQ1VFdGMFkyaGxjeUI4ZkNBaGNtSjFaMmQ1VFdGMFkyaGxjeTUwWlhOMEtDQmxlSEJ5SUNrZ0tTQW1KZ29KQ1NnZ0lYSmlkV2RuZVZGVFFTQWdJQ0FnZkh3Z0lYSmlkV2RuZVZGVFFTNTBaWE4wS0NCbGVIQnlJQ2tnS1NBcElIc0tDZ2tKZEhKNUlIc0tDUWtKZG1GeUlISmxkQ0E5SUcxaGRHTm9aWE11WTJGc2JDZ2daV3hsYlN3Z1pYaHdjaUFwT3dvS0NRa0pMeThnU1VVZ09TZHpJRzFoZEdOb1pYTlRaV3hsWTNSdmNpQnlaWFIxY201eklHWmhiSE5sSUc5dUlHUnBjMk52Ym01bFkzUmxaQ0J1YjJSbGN3b0pDUWxwWmlBb0lISmxkQ0I4ZkNCemRYQndiM0owTG1ScGMyTnZibTVsWTNSbFpFMWhkR05vSUh4OENna0pDUWtKTHk4Z1FYTWdkMlZzYkN3Z1pHbHpZMjl1Ym1WamRHVmtJRzV2WkdWeklHRnlaU0J6WVdsa0lIUnZJR0psSUdsdUlHRWdaRzlqZFcxbGJuUUtDUWtKQ1Frdkx5Qm1jbUZuYldWdWRDQnBiaUJKUlNBNUNna0pDUWtKWld4bGJTNWtiMk4xYldWdWRDQW1KaUJsYkdWdExtUnZZM1Z0Wlc1MExtNXZaR1ZVZVhCbElDRTlQU0F4TVNBcElIc0tDUWtKQ1hKbGRIVnliaUJ5WlhRN0Nna0pDWDBLQ1FsOUlHTmhkR05vSUNobEtTQjdmUW9KZlFvS0NYSmxkSFZ5YmlCVGFYcDZiR1VvSUdWNGNISXNJR1J2WTNWdFpXNTBMQ0J1ZFd4c0xDQmJJR1ZzWlcwZ1hTQXBMbXhsYm1kMGFDQStJREE3Q24wN0NncFRhWHA2YkdVdVkyOXVkR0ZwYm5NZ1BTQm1kVzVqZEdsdmJpZ2dZMjl1ZEdWNGRDd2daV3hsYlNBcElIc0tDUzh2SUZObGRDQmtiMk4xYldWdWRDQjJZWEp6SUdsbUlHNWxaV1JsWkFvSmFXWWdLQ0FvSUdOdmJuUmxlSFF1YjNkdVpYSkViMk4xYldWdWRDQjhmQ0JqYjI1MFpYaDBJQ2tnSVQwOUlHUnZZM1Z0Wlc1MElDa2dld29KQ1hObGRFUnZZM1Z0Wlc1MEtDQmpiMjUwWlhoMElDazdDZ2w5Q2dseVpYUjFjbTRnWTI5dWRHRnBibk1vSUdOdmJuUmxlSFFzSUdWc1pXMGdLVHNLZlRzS0NsTnBlbnBzWlM1aGRIUnlJRDBnWm5WdVkzUnBiMjRvSUdWc1pXMHNJRzVoYldVZ0tTQjdDZ2t2THlCVFpYUWdaRzlqZFcxbGJuUWdkbUZ5Y3lCcFppQnVaV1ZrWldRS0NXbG1JQ2dnS0NCbGJHVnRMbTkzYm1WeVJHOWpkVzFsYm5RZ2ZId2daV3hsYlNBcElDRTlQU0JrYjJOMWJXVnVkQ0FwSUhzS0NRbHpaWFJFYjJOMWJXVnVkQ2dnWld4bGJTQXBPd29KZlFvS0NYWmhjaUJtYmlBOUlFVjRjSEl1WVhSMGNraGhibVJzWlZzZ2JtRnRaUzUwYjB4dmQyVnlRMkZ6WlNncElGMHNDZ2tKTHk4Z1JHOXVKM1FnWjJWMElHWnZiMnhsWkNCaWVTQlBZbXBsWTNRdWNISnZkRzkwZVhCbElIQnliM0JsY25ScFpYTWdLR3BSZFdWeWVTQWpNVE00TURjcENna0pkbUZzSUQwZ1ptNGdKaVlnYUdGelQzZHVMbU5oYkd3b0lFVjRjSEl1WVhSMGNraGhibVJzWlN3Z2JtRnRaUzUwYjB4dmQyVnlRMkZ6WlNncElDa2dQd29KQ1FsbWJpZ2daV3hsYlN3Z2JtRnRaU3dnSVdSdlkzVnRaVzUwU1hOSVZFMU1JQ2tnT2dvSkNRbDFibVJsWm1sdVpXUTdDZ29KY21WMGRYSnVJSFpoYkNBaFBUMGdkVzVrWldacGJtVmtJRDhLQ1FsMllXd2dPZ29KQ1hOMWNIQnZjblF1WVhSMGNtbGlkWFJsY3lCOGZDQWhaRzlqZFcxbGJuUkpjMGhVVFV3Z1B3b0pDUWxsYkdWdExtZGxkRUYwZEhKcFluVjBaU2dnYm1GdFpTQXBJRG9LQ1FrSktIWmhiQ0E5SUdWc1pXMHVaMlYwUVhSMGNtbGlkWFJsVG05a1pTaHVZVzFsS1NrZ0ppWWdkbUZzTG5Od1pXTnBabWxsWkNBL0Nna0pDUWwyWVd3dWRtRnNkV1VnT2dvSkNRa0piblZzYkRzS2ZUc0tDbE5wZW5wc1pTNWxjMk5oY0dVZ1BTQm1kVzVqZEdsdmJpZ2djMlZzSUNrZ2V3b0pjbVYwZFhKdUlDaHpaV3dnS3lBaUlpa3VjbVZ3YkdGalpTZ2djbU56YzJWelkyRndaU3dnWm1OemMyVnpZMkZ3WlNBcE93cDlPd29LVTJsNmVteGxMbVZ5Y205eUlEMGdablZ1WTNScGIyNG9JRzF6WnlBcElIc0tDWFJvY205M0lHNWxkeUJGY25KdmNpZ2dJbE41Ym5SaGVDQmxjbkp2Y2l3Z2RXNXlaV052WjI1cGVtVmtJR1Y0Y0hKbGMzTnBiMjQ2SUNJZ0t5QnRjMmNnS1RzS2ZUc0tDaThxS2dvZ0tpQkViMk4xYldWdWRDQnpiM0owYVc1bklHRnVaQ0J5WlcxdmRtbHVaeUJrZFhCc2FXTmhkR1Z6Q2lBcUlFQndZWEpoYlNCN1FYSnlZWGxNYVd0bGZTQnlaWE4xYkhSekNpQXFMd3BUYVhwNmJHVXVkVzVwY1hWbFUyOXlkQ0E5SUdaMWJtTjBhVzl1S0NCeVpYTjFiSFJ6SUNrZ2V3b0pkbUZ5SUdWc1pXMHNDZ2tKWkhWd2JHbGpZWFJsY3lBOUlGdGRMQW9KQ1dvZ1BTQXdMQW9KQ1drZ1BTQXdPd29LQ1M4dklGVnViR1Z6Y3lCM1pTQXFhMjV2ZHlvZ2QyVWdZMkZ1SUdSbGRHVmpkQ0JrZFhCc2FXTmhkR1Z6TENCaGMzTjFiV1VnZEdobGFYSWdjSEpsYzJWdVkyVUtDV2hoYzBSMWNHeHBZMkYwWlNBOUlDRnpkWEJ3YjNKMExtUmxkR1ZqZEVSMWNHeHBZMkYwWlhNN0NnbHpiM0owU1c1d2RYUWdQU0FoYzNWd2NHOXlkQzV6YjNKMFUzUmhZbXhsSUNZbUlISmxjM1ZzZEhNdWMyeHBZMlVvSURBZ0tUc0tDWEpsYzNWc2RITXVjMjl5ZENnZ2MyOXlkRTl5WkdWeUlDazdDZ29KYVdZZ0tDQm9ZWE5FZFhCc2FXTmhkR1VnS1NCN0Nna0pkMmhwYkdVZ0tDQW9aV3hsYlNBOUlISmxjM1ZzZEhOYmFTc3JYU2tnS1NCN0Nna0pDV2xtSUNnZ1pXeGxiU0E5UFQwZ2NtVnpkV3gwYzFzZ2FTQmRJQ2tnZXdvSkNRa0phaUE5SUdSMWNHeHBZMkYwWlhNdWNIVnphQ2dnYVNBcE93b0pDUWw5Q2drSmZRb0pDWGRvYVd4bElDZ2dhaTB0SUNrZ2V3b0pDUWx5WlhOMWJIUnpMbk53YkdsalpTZ2daSFZ3YkdsallYUmxjMXNnYWlCZExDQXhJQ2s3Q2drSmZRb0pmUW9LQ1M4dklFTnNaV0Z5SUdsdWNIVjBJR0ZtZEdWeUlITnZjblJwYm1jZ2RHOGdjbVZzWldGelpTQnZZbXBsWTNSekNna3ZMeUJUWldVZ2FIUjBjSE02THk5bmFYUm9kV0l1WTI5dEwycHhkV1Z5ZVM5emFYcDZiR1V2Y0hWc2JDOHlNalVLQ1hOdmNuUkpibkIxZENBOUlHNTFiR3c3Q2dvSmNtVjBkWEp1SUhKbGMzVnNkSE03Q24wN0Nnb3ZLaW9LSUNvZ1ZYUnBiR2wwZVNCbWRXNWpkR2x2YmlCbWIzSWdjbVYwY21sbGRtbHVaeUIwYUdVZ2RHVjRkQ0IyWVd4MVpTQnZaaUJoYmlCaGNuSmhlU0J2WmlCRVQwMGdibTlrWlhNS0lDb2dRSEJoY21GdElIdEJjbkpoZVh4RmJHVnRaVzUwZlNCbGJHVnRDaUFxTHdwblpYUlVaWGgwSUQwZ1UybDZlbXhsTG1kbGRGUmxlSFFnUFNCbWRXNWpkR2x2YmlnZ1pXeGxiU0FwSUhzS0NYWmhjaUJ1YjJSbExBb0pDWEpsZENBOUlDSWlMQW9KQ1drZ1BTQXdMQW9KQ1c1dlpHVlVlWEJsSUQwZ1pXeGxiUzV1YjJSbFZIbHdaVHNLQ2dscFppQW9JQ0Z1YjJSbFZIbHdaU0FwSUhzS0NRa3ZMeUJKWmlCdWJ5QnViMlJsVkhsd1pTd2dkR2hwY3lCcGN5QmxlSEJsWTNSbFpDQjBieUJpWlNCaGJpQmhjbkpoZVFvSkNYZG9hV3hsSUNnZ0tHNXZaR1VnUFNCbGJHVnRXMmtySzEwcElDa2dld29KQ1Frdkx5QkVieUJ1YjNRZ2RISmhkbVZ5YzJVZ1kyOXRiV1Z1ZENCdWIyUmxjd29KQ1FseVpYUWdLejBnWjJWMFZHVjRkQ2dnYm05a1pTQXBPd29KQ1gwS0NYMGdaV3h6WlNCcFppQW9JRzV2WkdWVWVYQmxJRDA5UFNBeElIeDhJRzV2WkdWVWVYQmxJRDA5UFNBNUlIeDhJRzV2WkdWVWVYQmxJRDA5UFNBeE1TQXBJSHNLQ1Frdkx5QlZjMlVnZEdWNGRFTnZiblJsYm5RZ1ptOXlJR1ZzWlcxbGJuUnpDZ2tKTHk4Z2FXNXVaWEpVWlhoMElIVnpZV2RsSUhKbGJXOTJaV1FnWm05eUlHTnZibk5wYzNSbGJtTjVJRzltSUc1bGR5QnNhVzVsY3lBb2FsRjFaWEo1SUNNeE1URTFNeWtLQ1FscFppQW9JSFI1Y0dWdlppQmxiR1Z0TG5SbGVIUkRiMjUwWlc1MElEMDlQU0FpYzNSeWFXNW5JaUFwSUhzS0NRa0pjbVYwZFhKdUlHVnNaVzB1ZEdWNGRFTnZiblJsYm5RN0Nna0pmU0JsYkhObElIc0tDUWtKTHk4Z1ZISmhkbVZ5YzJVZ2FYUnpJR05vYVd4a2NtVnVDZ2tKQ1dadmNpQW9JR1ZzWlcwZ1BTQmxiR1Z0TG1acGNuTjBRMmhwYkdRN0lHVnNaVzA3SUdWc1pXMGdQU0JsYkdWdExtNWxlSFJUYVdKc2FXNW5JQ2tnZXdvSkNRa0pjbVYwSUNzOUlHZGxkRlJsZUhRb0lHVnNaVzBnS1RzS0NRa0pmUW9KQ1gwS0NYMGdaV3h6WlNCcFppQW9JRzV2WkdWVWVYQmxJRDA5UFNBeklIeDhJRzV2WkdWVWVYQmxJRDA5UFNBMElDa2dld29KQ1hKbGRIVnliaUJsYkdWdExtNXZaR1ZXWVd4MVpUc0tDWDBLQ1M4dklFUnZJRzV2ZENCcGJtTnNkV1JsSUdOdmJXMWxiblFnYjNJZ2NISnZZMlZ6YzJsdVp5QnBibk4wY25WamRHbHZiaUJ1YjJSbGN3b0tDWEpsZEhWeWJpQnlaWFE3Q24wN0NncEZlSEJ5SUQwZ1UybDZlbXhsTG5ObGJHVmpkRzl5Y3lBOUlIc0tDZ2t2THlCRFlXNGdZbVVnWVdScWRYTjBaV1FnWW5rZ2RHaGxJSFZ6WlhJS0NXTmhZMmhsVEdWdVozUm9PaUExTUN3S0NnbGpjbVZoZEdWUWMyVjFaRzg2SUcxaGNtdEdkVzVqZEdsdmJpd0tDZ2x0WVhSamFEb2diV0YwWTJoRmVIQnlMQW9LQ1dGMGRISklZVzVrYkdVNklIdDlMQW9LQ1dacGJtUTZJSHQ5TEFvS0NYSmxiR0YwYVhabE9pQjdDZ2tKSWo0aU9pQjdJR1JwY2pvZ0luQmhjbVZ1ZEU1dlpHVWlMQ0JtYVhKemREb2dkSEoxWlNCOUxBb0pDU0lnSWpvZ2V5QmthWEk2SUNKd1lYSmxiblJPYjJSbElpQjlMQW9KQ1NJcklqb2dleUJrYVhJNklDSndjbVYyYVc5MWMxTnBZbXhwYm1jaUxDQm1hWEp6ZERvZ2RISjFaU0I5TEFvSkNTSitJam9nZXlCa2FYSTZJQ0p3Y21WMmFXOTFjMU5wWW14cGJtY2lJSDBLQ1gwc0Nnb0pjSEpsUm1sc2RHVnlPaUI3Q2drSklrRlVWRklpT2lCbWRXNWpkR2x2YmlnZ2JXRjBZMmdnS1NCN0Nna0pDVzFoZEdOb1d6RmRJRDBnYldGMFkyaGJNVjB1Y21Wd2JHRmpaU2dnY25WdVpYTmpZWEJsTENCbWRXNWxjMk5oY0dVZ0tUc0tDZ2tKQ1M4dklFMXZkbVVnZEdobElHZHBkbVZ1SUhaaGJIVmxJSFJ2SUcxaGRHTm9Xek5kSUhkb1pYUm9aWElnY1hWdmRHVmtJRzl5SUhWdWNYVnZkR1ZrQ2drSkNXMWhkR05vV3pOZElEMGdLQ0J0WVhSamFGc3pYU0I4ZkNCdFlYUmphRnMwWFNCOGZDQnRZWFJqYUZzMVhTQjhmQ0FpSWlBcExuSmxjR3hoWTJVb0lISjFibVZ6WTJGd1pTd2dablZ1WlhOallYQmxJQ2s3Q2dvSkNRbHBaaUFvSUcxaGRHTm9XekpkSUQwOVBTQWlmajBpSUNrZ2V3b0pDUWtKYldGMFkyaGJNMTBnUFNBaUlDSWdLeUJ0WVhSamFGc3pYU0FySUNJZ0lqc0tDUWtKZlFvS0NRa0pjbVYwZFhKdUlHMWhkR05vTG5Oc2FXTmxLQ0F3TENBMElDazdDZ2tKZlN3S0Nna0pJa05JU1V4RUlqb2dablZ1WTNScGIyNG9JRzFoZEdOb0lDa2dld29KQ1FrdktpQnRZWFJqYUdWeklHWnliMjBnYldGMFkyaEZlSEJ5V3lKRFNFbE1SQ0pkQ2drSkNRa3hJSFI1Y0dVZ0tHOXViSGw4Ym5Sb2ZDNHVMaWtLQ1FrSkNUSWdkMmhoZENBb1kyaHBiR1I4YjJZdGRIbHdaU2tLQ1FrSkNUTWdZWEpuZFcxbGJuUWdLR1YyWlc1OGIyUmtmRnhrS254Y1pDcHVLRnNyTFYxY1pDc3BQM3d1TGk0cENna0pDUWswSUhodUxXTnZiWEJ2Ym1WdWRDQnZaaUI0Yml0NUlHRnlaM1Z0Wlc1MElDaGJLeTFkUDF4a0ttNThLUW9KQ1FrSk5TQnphV2R1SUc5bUlIaHVMV052YlhCdmJtVnVkQW9KQ1FrSk5pQjRJRzltSUhodUxXTnZiWEJ2Ym1WdWRBb0pDUWtKTnlCemFXZHVJRzltSUhrdFkyOXRjRzl1Wlc1MENna0pDUWs0SUhrZ2IyWWdlUzFqYjIxd2IyNWxiblFLQ1FrSktpOEtDUWtKYldGMFkyaGJNVjBnUFNCdFlYUmphRnN4WFM1MGIweHZkMlZ5UTJGelpTZ3BPd29LQ1FrSmFXWWdLQ0J0WVhSamFGc3hYUzV6YkdsalpTZ2dNQ3dnTXlBcElEMDlQU0FpYm5Sb0lpQXBJSHNLQ1FrSkNTOHZJRzUwYUMwcUlISmxjWFZwY21WeklHRnlaM1Z0Wlc1MENna0pDUWxwWmlBb0lDRnRZWFJqYUZzelhTQXBJSHNLQ1FrSkNRbFRhWHA2YkdVdVpYSnliM0lvSUcxaGRHTm9XekJkSUNrN0Nna0pDUWw5Q2dvSkNRa0pMeThnYm5WdFpYSnBZeUI0SUdGdVpDQjVJSEJoY21GdFpYUmxjbk1nWm05eUlFVjRjSEl1Wm1sc2RHVnlMa05JU1V4RUNna0pDUWt2THlCeVpXMWxiV0psY2lCMGFHRjBJR1poYkhObEwzUnlkV1VnWTJGemRDQnlaWE53WldOMGFYWmxiSGtnZEc4Z01DOHhDZ2tKQ1FsdFlYUmphRnMwWFNBOUlDc29JRzFoZEdOb1d6UmRJRDhnYldGMFkyaGJOVjBnS3lBb2JXRjBZMmhiTmwwZ2ZId2dNU2tnT2lBeUlDb2dLQ0J0WVhSamFGc3pYU0E5UFQwZ0ltVjJaVzRpSUh4OElHMWhkR05vV3pOZElEMDlQU0FpYjJSa0lpQXBJQ2s3Q2drSkNRbHRZWFJqYUZzMVhTQTlJQ3NvSUNnZ2JXRjBZMmhiTjEwZ0t5QnRZWFJqYUZzNFhTQXBJSHg4SUcxaGRHTm9Xek5kSUQwOVBTQWliMlJrSWlBcE93b0tDUWtKTHk4Z2IzUm9aWElnZEhsd1pYTWdjSEp2YUdsaWFYUWdZWEpuZFcxbGJuUnpDZ2tKQ1gwZ1pXeHpaU0JwWmlBb0lHMWhkR05vV3pOZElDa2dld29KQ1FrSlUybDZlbXhsTG1WeWNtOXlLQ0J0WVhSamFGc3dYU0FwT3dvSkNRbDlDZ29KQ1FseVpYUjFjbTRnYldGMFkyZzdDZ2tKZlN3S0Nna0pJbEJUUlZWRVR5STZJR1oxYm1OMGFXOXVLQ0J0WVhSamFDQXBJSHNLQ1FrSmRtRnlJR1Y0WTJWemN5d0tDUWtKQ1hWdWNYVnZkR1ZrSUQwZ0lXMWhkR05vV3paZElDWW1JRzFoZEdOb1d6SmRPd29LQ1FrSmFXWWdLQ0J0WVhSamFFVjRjSEpiSWtOSVNVeEVJbDB1ZEdWemRDZ2diV0YwWTJoYk1GMGdLU0FwSUhzS0NRa0pDWEpsZEhWeWJpQnVkV3hzT3dvSkNRbDlDZ29KQ1Frdkx5QkJZMk5sY0hRZ2NYVnZkR1ZrSUdGeVozVnRaVzUwY3lCaGN5MXBjd29KQ1FscFppQW9JRzFoZEdOb1d6TmRJQ2tnZXdvSkNRa0piV0YwWTJoYk1sMGdQU0J0WVhSamFGczBYU0I4ZkNCdFlYUmphRnMxWFNCOGZDQWlJanNLQ2drSkNTOHZJRk4wY21sd0lHVjRZMlZ6Y3lCamFHRnlZV04wWlhKeklHWnliMjBnZFc1eGRXOTBaV1FnWVhKbmRXMWxiblJ6Q2drSkNYMGdaV3h6WlNCcFppQW9JSFZ1Y1hWdmRHVmtJQ1ltSUhKd2MyVjFaRzh1ZEdWemRDZ2dkVzV4ZFc5MFpXUWdLU0FtSmdvSkNRa0pMeThnUjJWMElHVjRZMlZ6Y3lCbWNtOXRJSFJ2YTJWdWFYcGxJQ2h5WldOMWNuTnBkbVZzZVNrS0NRa0pDU2hsZUdObGMzTWdQU0IwYjJ0bGJtbDZaU2dnZFc1eGRXOTBaV1FzSUhSeWRXVWdLU2tnSmlZS0NRa0pDUzh2SUdGa2RtRnVZMlVnZEc4Z2RHaGxJRzVsZUhRZ1kyeHZjMmx1WnlCd1lYSmxiblJvWlhOcGN3b0pDUWtKS0dWNFkyVnpjeUE5SUhWdWNYVnZkR1ZrTG1sdVpHVjRUMllvSUNJcElpd2dkVzV4ZFc5MFpXUXViR1Z1WjNSb0lDMGdaWGhqWlhOeklDa2dMU0IxYm5GMWIzUmxaQzVzWlc1bmRHZ3BJQ2tnZXdvS0NRa0pDUzh2SUdWNFkyVnpjeUJwY3lCaElHNWxaMkYwYVhabElHbHVaR1Y0Q2drSkNRbHRZWFJqYUZzd1hTQTlJRzFoZEdOb1d6QmRMbk5zYVdObEtDQXdMQ0JsZUdObGMzTWdLVHNLQ1FrSkNXMWhkR05vV3pKZElEMGdkVzV4ZFc5MFpXUXVjMnhwWTJVb0lEQXNJR1Y0WTJWemN5QXBPd29KQ1FsOUNnb0pDUWt2THlCU1pYUjFjbTRnYjI1c2VTQmpZWEIwZFhKbGN5QnVaV1ZrWldRZ1lua2dkR2hsSUhCelpYVmtieUJtYVd4MFpYSWdiV1YwYUc5a0lDaDBlWEJsSUdGdVpDQmhjbWQxYldWdWRDa0tDUWtKY21WMGRYSnVJRzFoZEdOb0xuTnNhV05sS0NBd0xDQXpJQ2s3Q2drSmZRb0pmU3dLQ2dsbWFXeDBaWEk2SUhzS0Nna0pJbFJCUnlJNklHWjFibU4wYVc5dUtDQnViMlJsVG1GdFpWTmxiR1ZqZEc5eUlDa2dld29KQ1FsMllYSWdibTlrWlU1aGJXVWdQU0J1YjJSbFRtRnRaVk5sYkdWamRHOXlMbkpsY0d4aFkyVW9JSEoxYm1WelkyRndaU3dnWm5WdVpYTmpZWEJsSUNrdWRHOU1iM2RsY2tOaGMyVW9LVHNLQ1FrSmNtVjBkWEp1SUc1dlpHVk9ZVzFsVTJWc1pXTjBiM0lnUFQwOUlDSXFJaUEvQ2drSkNRbG1kVzVqZEdsdmJpZ3BJSHNnY21WMGRYSnVJSFJ5ZFdVN0lIMGdPZ29KQ1FrSlpuVnVZM1JwYjI0b0lHVnNaVzBnS1NCN0Nna0pDUWtKY21WMGRYSnVJR1ZzWlcwdWJtOWtaVTVoYldVZ0ppWWdaV3hsYlM1dWIyUmxUbUZ0WlM1MGIweHZkMlZ5UTJGelpTZ3BJRDA5UFNCdWIyUmxUbUZ0WlRzS0NRa0pDWDA3Q2drSmZTd0tDZ2tKSWtOTVFWTlRJam9nWm5WdVkzUnBiMjRvSUdOc1lYTnpUbUZ0WlNBcElIc0tDUWtKZG1GeUlIQmhkSFJsY200Z1BTQmpiR0Z6YzBOaFkyaGxXeUJqYkdGemMwNWhiV1VnS3lBaUlDSWdYVHNLQ2drSkNYSmxkSFZ5YmlCd1lYUjBaWEp1SUh4OENna0pDUWtvY0dGMGRHVnliaUE5SUc1bGR5QlNaV2RGZUhBb0lDSW9YbndpSUNzZ2QyaHBkR1Z6Y0dGalpTQXJJQ0lwSWlBcklHTnNZWE56VG1GdFpTQXJJQ0lvSWlBcklIZG9hWFJsYzNCaFkyVWdLeUFpZkNRcElpQXBLU0FtSmdvSkNRa0pZMnhoYzNORFlXTm9aU2dnWTJ4aGMzTk9ZVzFsTENCbWRXNWpkR2x2YmlnZ1pXeGxiU0FwSUhzS0NRa0pDUWx5WlhSMWNtNGdjR0YwZEdWeWJpNTBaWE4wS0NCMGVYQmxiMllnWld4bGJTNWpiR0Z6YzA1aGJXVWdQVDA5SUNKemRISnBibWNpSUNZbUlHVnNaVzB1WTJ4aGMzTk9ZVzFsSUh4OElIUjVjR1Z2WmlCbGJHVnRMbWRsZEVGMGRISnBZblYwWlNBaFBUMGdJblZ1WkdWbWFXNWxaQ0lnSmlZZ1pXeGxiUzVuWlhSQmRIUnlhV0oxZEdVb0ltTnNZWE56SWlrZ2ZId2dJaUlnS1RzS0NRa0pDWDBwT3dvSkNYMHNDZ29KQ1NKQlZGUlNJam9nWm5WdVkzUnBiMjRvSUc1aGJXVXNJRzl3WlhKaGRHOXlMQ0JqYUdWamF5QXBJSHNLQ1FrSmNtVjBkWEp1SUdaMWJtTjBhVzl1S0NCbGJHVnRJQ2tnZXdvSkNRa0pkbUZ5SUhKbGMzVnNkQ0E5SUZOcGVucHNaUzVoZEhSeUtDQmxiR1Z0TENCdVlXMWxJQ2s3Q2dvSkNRa0phV1lnS0NCeVpYTjFiSFFnUFQwZ2JuVnNiQ0FwSUhzS0NRa0pDUWx5WlhSMWNtNGdiM0JsY21GMGIzSWdQVDA5SUNJaFBTSTdDZ2tKQ1FsOUNna0pDUWxwWmlBb0lDRnZjR1Z5WVhSdmNpQXBJSHNLQ1FrSkNRbHlaWFIxY200Z2RISjFaVHNLQ1FrSkNYMEtDZ2tKQ1FseVpYTjFiSFFnS3owZ0lpSTdDZ29KQ1FrSmNtVjBkWEp1SUc5d1pYSmhkRzl5SUQwOVBTQWlQU0lnUHlCeVpYTjFiSFFnUFQwOUlHTm9aV05ySURvS0NRa0pDUWx2Y0dWeVlYUnZjaUE5UFQwZ0lpRTlJaUEvSUhKbGMzVnNkQ0FoUFQwZ1kyaGxZMnNnT2dvSkNRa0pDVzl3WlhKaGRHOXlJRDA5UFNBaVhqMGlJRDhnWTJobFkyc2dKaVlnY21WemRXeDBMbWx1WkdWNFQyWW9JR05vWldOcklDa2dQVDA5SURBZ09nb0pDUWtKQ1c5d1pYSmhkRzl5SUQwOVBTQWlLajBpSUQ4Z1kyaGxZMnNnSmlZZ2NtVnpkV3gwTG1sdVpHVjRUMllvSUdOb1pXTnJJQ2tnUGlBdE1TQTZDZ2tKQ1FrSmIzQmxjbUYwYjNJZ1BUMDlJQ0lrUFNJZ1B5QmphR1ZqYXlBbUppQnlaWE4xYkhRdWMyeHBZMlVvSUMxamFHVmpheTVzWlc1bmRHZ2dLU0E5UFQwZ1kyaGxZMnNnT2dvSkNRa0pDVzl3WlhKaGRHOXlJRDA5UFNBaWZqMGlJRDhnS0NBaUlDSWdLeUJ5WlhOMWJIUXVjbVZ3YkdGalpTZ2djbmRvYVhSbGMzQmhZMlVzSUNJZ0lpQXBJQ3NnSWlBaUlDa3VhVzVrWlhoUFppZ2dZMmhsWTJzZ0tTQStJQzB4SURvS0NRa0pDUWx2Y0dWeVlYUnZjaUE5UFQwZ0ludzlJaUEvSUhKbGMzVnNkQ0E5UFQwZ1kyaGxZMnNnZkh3Z2NtVnpkV3gwTG5Oc2FXTmxLQ0F3TENCamFHVmpheTVzWlc1bmRHZ2dLeUF4SUNrZ1BUMDlJR05vWldOcklDc2dJaTBpSURvS0NRa0pDUWxtWVd4elpUc0tDUWtKZlRzS0NRbDlMQW9LQ1FraVEwaEpURVFpT2lCbWRXNWpkR2x2YmlnZ2RIbHdaU3dnZDJoaGRDd2dZWEpuZFcxbGJuUXNJR1pwY25OMExDQnNZWE4wSUNrZ2V3b0pDUWwyWVhJZ2MybHRjR3hsSUQwZ2RIbHdaUzV6YkdsalpTZ2dNQ3dnTXlBcElDRTlQU0FpYm5Sb0lpd0tDUWtKQ1dadmNuZGhjbVFnUFNCMGVYQmxMbk5zYVdObEtDQXROQ0FwSUNFOVBTQWliR0Z6ZENJc0Nna0pDUWx2WmxSNWNHVWdQU0IzYUdGMElEMDlQU0FpYjJZdGRIbHdaU0k3Q2dvSkNRbHlaWFIxY200Z1ptbHljM1FnUFQwOUlERWdKaVlnYkdGemRDQTlQVDBnTUNBL0Nnb0pDUWtKTHk4Z1UyaHZjblJqZFhRZ1ptOXlJRHB1ZEdndEtpaHVLUW9KQ1FrSlpuVnVZM1JwYjI0b0lHVnNaVzBnS1NCN0Nna0pDUWtKY21WMGRYSnVJQ0VoWld4bGJTNXdZWEpsYm5ST2IyUmxPd29KQ1FrSmZTQTZDZ29KQ1FrSlpuVnVZM1JwYjI0b0lHVnNaVzBzSUdOdmJuUmxlSFFzSUhodGJDQXBJSHNLQ1FrSkNRbDJZWElnWTJGamFHVXNJSFZ1YVhGMVpVTmhZMmhsTENCdmRYUmxja05oWTJobExDQnViMlJsTENCdWIyUmxTVzVrWlhnc0lITjBZWEowTEFvSkNRa0pDUWxrYVhJZ1BTQnphVzF3YkdVZ0lUMDlJR1p2Y25kaGNtUWdQeUFpYm1WNGRGTnBZbXhwYm1jaUlEb2dJbkJ5WlhacGIzVnpVMmxpYkdsdVp5SXNDZ2tKQ1FrSkNYQmhjbVZ1ZENBOUlHVnNaVzB1Y0dGeVpXNTBUbTlrWlN3S0NRa0pDUWtKYm1GdFpTQTlJRzltVkhsd1pTQW1KaUJsYkdWdExtNXZaR1ZPWVcxbExuUnZURzkzWlhKRFlYTmxLQ2tzQ2drSkNRa0pDWFZ6WlVOaFkyaGxJRDBnSVhodGJDQW1KaUFoYjJaVWVYQmxMQW9KQ1FrSkNRbGthV1ptSUQwZ1ptRnNjMlU3Q2dvSkNRa0pDV2xtSUNnZ2NHRnlaVzUwSUNrZ2V3b0tDUWtKQ1FrSkx5OGdPaWhtYVhKemRIeHNZWE4wZkc5dWJIa3BMU2hqYUdsc1pIeHZaaTEwZVhCbEtRb0pDUWtKQ1FscFppQW9JSE5wYlhCc1pTQXBJSHNLQ1FrSkNRa0pDWGRvYVd4bElDZ2daR2x5SUNrZ2V3b0pDUWtKQ1FrSkNXNXZaR1VnUFNCbGJHVnRPd29KQ1FrSkNRa0pDWGRvYVd4bElDZ2dLRzV2WkdVZ1BTQnViMlJsV3lCa2FYSWdYU2tnS1NCN0Nna0pDUWtKQ1FrSkNXbG1JQ2dnYjJaVWVYQmxJRDhLQ1FrSkNRa0pDUWtKQ1c1dlpHVXVibTlrWlU1aGJXVXVkRzlNYjNkbGNrTmhjMlVvS1NBOVBUMGdibUZ0WlNBNkNna0pDUWtKQ1FrSkNRbHViMlJsTG01dlpHVlVlWEJsSUQwOVBTQXhJQ2tnZXdvS0NRa0pDUWtKQ1FrSkNYSmxkSFZ5YmlCbVlXeHpaVHNLQ1FrSkNRa0pDUWtKZlFvSkNRa0pDUWtKQ1gwS0NRa0pDUWtKQ1Frdkx5QlNaWFpsY25ObElHUnBjbVZqZEdsdmJpQm1iM0lnT205dWJIa3RLaUFvYVdZZ2QyVWdhR0YyWlc0bmRDQjVaWFFnWkc5dVpTQnpieWtLQ1FrSkNRa0pDUWx6ZEdGeWRDQTlJR1JwY2lBOUlIUjVjR1VnUFQwOUlDSnZibXg1SWlBbUppQWhjM1JoY25RZ0ppWWdJbTVsZUhSVGFXSnNhVzVuSWpzS0NRa0pDUWtKQ1gwS0NRa0pDUWtKQ1hKbGRIVnliaUIwY25WbE93b0pDUWtKQ1FsOUNnb0pDUWtKQ1FsemRHRnlkQ0E5SUZzZ1ptOXlkMkZ5WkNBL0lIQmhjbVZ1ZEM1bWFYSnpkRU5vYVd4a0lEb2djR0Z5Wlc1MExteGhjM1JEYUdsc1pDQmRPd29LQ1FrSkNRa0pMeThnYm05dUxYaHRiQ0E2Ym5Sb0xXTm9hV3hrS0M0dUxpa2djM1J2Y21WeklHTmhZMmhsSUdSaGRHRWdiMjRnWUhCaGNtVnVkR0FLQ1FrSkNRa0phV1lnS0NCbWIzSjNZWEprSUNZbUlIVnpaVU5oWTJobElDa2dld29LQ1FrSkNRa0pDUzh2SUZObFpXc2dZR1ZzWlcxZ0lHWnliMjBnWVNCd2NtVjJhVzkxYzJ4NUxXTmhZMmhsWkNCcGJtUmxlQW9LQ1FrSkNRa0pDUzh2SUM0dUxtbHVJR0VnWjNwcGNDMW1jbWxsYm1Sc2VTQjNZWGtLQ1FrSkNRa0pDVzV2WkdVZ1BTQndZWEpsYm5RN0Nna0pDUWtKQ1FsdmRYUmxja05oWTJobElEMGdibTlrWlZzZ1pYaHdZVzVrYnlCZElIeDhJQ2h1YjJSbFd5QmxlSEJoYm1SdklGMGdQU0I3ZlNrN0Nnb0pDUWtKQ1FrSkx5OGdVM1Z3Y0c5eWREb2dTVVVnUERrZ2IyNXNlUW9KQ1FrSkNRa0pMeThnUkdWbVpXNWtJR0ZuWVdsdWMzUWdZMnh2Ym1Wa0lHRjBkSEp2Y0dWeWRHbGxjeUFvYWxGMVpYSjVJR2RvTFRFM01Ea3BDZ2tKQ1FrSkNRbDFibWx4ZFdWRFlXTm9aU0E5SUc5MWRHVnlRMkZqYUdWYklHNXZaR1V1ZFc1cGNYVmxTVVFnWFNCOGZBb0pDUWtKQ1FrSkNTaHZkWFJsY2tOaFkyaGxXeUJ1YjJSbExuVnVhWEYxWlVsRUlGMGdQU0I3ZlNrN0Nnb0pDUWtKQ1FrSlkyRmphR1VnUFNCMWJtbHhkV1ZEWVdOb1pWc2dkSGx3WlNCZElIeDhJRnRkT3dvSkNRa0pDUWtKYm05a1pVbHVaR1Y0SUQwZ1kyRmphR1ZiSURBZ1hTQTlQVDBnWkdseWNuVnVjeUFtSmlCallXTm9aVnNnTVNCZE93b0pDUWtKQ1FrSlpHbG1aaUE5SUc1dlpHVkpibVJsZUNBbUppQmpZV05vWlZzZ01pQmRPd29KQ1FrSkNRa0pibTlrWlNBOUlHNXZaR1ZKYm1SbGVDQW1KaUJ3WVhKbGJuUXVZMmhwYkdST2IyUmxjMXNnYm05a1pVbHVaR1Y0SUYwN0Nnb0pDUWtKQ1FrSmQyaHBiR1VnS0NBb2JtOWtaU0E5SUNzcmJtOWtaVWx1WkdWNElDWW1JRzV2WkdVZ0ppWWdibTlrWlZzZ1pHbHlJRjBnZkh3S0Nna0pDUWtKQ1FrSkx5OGdSbUZzYkdKaFkyc2dkRzhnYzJWbGEybHVaeUJnWld4bGJXQWdabkp2YlNCMGFHVWdjM1JoY25RS0NRa0pDUWtKQ1Frb1pHbG1aaUE5SUc1dlpHVkpibVJsZUNBOUlEQXBJSHg4SUhOMFlYSjBMbkJ2Y0NncEtTQXBJSHNLQ2drSkNRa0pDUWtKTHk4Z1YyaGxiaUJtYjNWdVpDd2dZMkZqYUdVZ2FXNWtaWGhsY3lCdmJpQmdjR0Z5Wlc1MFlDQmhibVFnWW5KbFlXc0tDUWtKQ1FrSkNRbHBaaUFvSUc1dlpHVXVibTlrWlZSNWNHVWdQVDA5SURFZ0ppWWdLeXRrYVdabUlDWW1JRzV2WkdVZ1BUMDlJR1ZzWlcwZ0tTQjdDZ2tKQ1FrSkNRa0pDWFZ1YVhGMVpVTmhZMmhsV3lCMGVYQmxJRjBnUFNCYklHUnBjbkoxYm5Nc0lHNXZaR1ZKYm1SbGVDd2daR2xtWmlCZE93b0pDUWtKQ1FrSkNRbGljbVZoYXpzS0NRa0pDUWtKQ1FsOUNna0pDUWtKQ1FsOUNnb0pDUWtKQ1FsOUlHVnNjMlVnZXdvSkNRa0pDUWtKTHk4Z1ZYTmxJSEJ5WlhacGIzVnpiSGt0WTJGamFHVmtJR1ZzWlcxbGJuUWdhVzVrWlhnZ2FXWWdZWFpoYVd4aFlteGxDZ2tKQ1FrSkNRbHBaaUFvSUhWelpVTmhZMmhsSUNrZ2V3b0pDUWtKQ1FrSkNTOHZJQzR1TG1sdUlHRWdaM3BwY0MxbWNtbGxibVJzZVNCM1lYa0tDUWtKQ1FrSkNRbHViMlJsSUQwZ1pXeGxiVHNLQ1FrSkNRa0pDUWx2ZFhSbGNrTmhZMmhsSUQwZ2JtOWtaVnNnWlhod1lXNWtieUJkSUh4OElDaHViMlJsV3lCbGVIQmhibVJ2SUYwZ1BTQjdmU2s3Q2dvSkNRa0pDUWtKQ1M4dklGTjFjSEJ2Y25RNklFbEZJRHc1SUc5dWJIa0tDUWtKQ1FrSkNRa3ZMeUJFWldabGJtUWdZV2RoYVc1emRDQmpiRzl1WldRZ1lYUjBjbTl3WlhKMGFXVnpJQ2hxVVhWbGNua2daMmd0TVRjd09Ta0tDUWtKQ1FrSkNRbDFibWx4ZFdWRFlXTm9aU0E5SUc5MWRHVnlRMkZqYUdWYklHNXZaR1V1ZFc1cGNYVmxTVVFnWFNCOGZBb0pDUWtKQ1FrSkNRa29iM1YwWlhKRFlXTm9aVnNnYm05a1pTNTFibWx4ZFdWSlJDQmRJRDBnZTMwcE93b0tDUWtKQ1FrSkNRbGpZV05vWlNBOUlIVnVhWEYxWlVOaFkyaGxXeUIwZVhCbElGMGdmSHdnVzEwN0Nna0pDUWtKQ1FrSmJtOWtaVWx1WkdWNElEMGdZMkZqYUdWYklEQWdYU0E5UFQwZ1pHbHljblZ1Y3lBbUppQmpZV05vWlZzZ01TQmRPd29KQ1FrSkNRa0pDV1JwWm1ZZ1BTQnViMlJsU1c1a1pYZzdDZ2tKQ1FrSkNRbDlDZ29KQ1FrSkNRa0pMeThnZUcxc0lEcHVkR2d0WTJocGJHUW9MaTR1S1FvSkNRa0pDUWtKTHk4Z2IzSWdPbTUwYUMxc1lYTjBMV05vYVd4a0tDNHVMaWtnYjNJZ09tNTBhQ2d0YkdGemRDay9MVzltTFhSNWNHVW9MaTR1S1FvSkNRa0pDUWtKYVdZZ0tDQmthV1ptSUQwOVBTQm1ZV3h6WlNBcElIc0tDUWtKQ1FrSkNRa3ZMeUJWYzJVZ2RHaGxJSE5oYldVZ2JHOXZjQ0JoY3lCaFltOTJaU0IwYnlCelpXVnJJR0JsYkdWdFlDQm1jbTl0SUhSb1pTQnpkR0Z5ZEFvSkNRa0pDUWtKQ1hkb2FXeGxJQ2dnS0c1dlpHVWdQU0FySzI1dlpHVkpibVJsZUNBbUppQnViMlJsSUNZbUlHNXZaR1ZiSUdScGNpQmRJSHg4Q2drSkNRa0pDUWtKQ1Noa2FXWm1JRDBnYm05a1pVbHVaR1Y0SUQwZ01Da2dmSHdnYzNSaGNuUXVjRzl3S0NrcElDa2dld29LQ1FrSkNRa0pDUWtKYVdZZ0tDQW9JRzltVkhsd1pTQS9DZ2tKQ1FrSkNRa0pDUWx1YjJSbExtNXZaR1ZPWVcxbExuUnZURzkzWlhKRFlYTmxLQ2tnUFQwOUlHNWhiV1VnT2dvSkNRa0pDUWtKQ1FrSmJtOWtaUzV1YjJSbFZIbHdaU0E5UFQwZ01TQXBJQ1ltQ2drSkNRa0pDUWtKQ1FrcksyUnBabVlnS1NCN0Nnb0pDUWtKQ1FrSkNRa0pMeThnUTJGamFHVWdkR2hsSUdsdVpHVjRJRzltSUdWaFkyZ2daVzVqYjNWdWRHVnlaV1FnWld4bGJXVnVkQW9KQ1FrSkNRa0pDUWtKYVdZZ0tDQjFjMlZEWVdOb1pTQXBJSHNLQ1FrSkNRa0pDUWtKQ1FsdmRYUmxja05oWTJobElEMGdibTlrWlZzZ1pYaHdZVzVrYnlCZElIeDhJQ2h1YjJSbFd5QmxlSEJoYm1SdklGMGdQU0I3ZlNrN0Nnb0pDUWtKQ1FrSkNRa0pDUzh2SUZOMWNIQnZjblE2SUVsRklEdzVJRzl1YkhrS0NRa0pDUWtKQ1FrSkNRa3ZMeUJFWldabGJtUWdZV2RoYVc1emRDQmpiRzl1WldRZ1lYUjBjbTl3WlhKMGFXVnpJQ2hxVVhWbGNua2daMmd0TVRjd09Ta0tDUWtKQ1FrSkNRa0pDUWwxYm1seGRXVkRZV05vWlNBOUlHOTFkR1Z5UTJGamFHVmJJRzV2WkdVdWRXNXBjWFZsU1VRZ1hTQjhmQW9KQ1FrSkNRa0pDUWtKQ1Frb2IzVjBaWEpEWVdOb1pWc2dibTlrWlM1MWJtbHhkV1ZKUkNCZElEMGdlMzBwT3dvS0NRa0pDUWtKQ1FrSkNRbDFibWx4ZFdWRFlXTm9aVnNnZEhsd1pTQmRJRDBnV3lCa2FYSnlkVzV6TENCa2FXWm1JRjA3Q2drSkNRa0pDUWtKQ1FsOUNnb0pDUWtKQ1FrSkNRa0phV1lnS0NCdWIyUmxJRDA5UFNCbGJHVnRJQ2tnZXdvSkNRa0pDUWtKQ1FrSkNXSnlaV0ZyT3dvSkNRa0pDUWtKQ1FrSmZRb0pDUWtKQ1FrSkNRbDlDZ2tKQ1FrSkNRa0pmUW9KQ1FrSkNRa0pmUW9KQ1FrSkNRbDlDZ29KQ1FrSkNRa3ZMeUJKYm1OdmNuQnZjbUYwWlNCMGFHVWdiMlptYzJWMExDQjBhR1Z1SUdOb1pXTnJJR0ZuWVdsdWMzUWdZM2xqYkdVZ2MybDZaUW9KQ1FrSkNRbGthV1ptSUMwOUlHeGhjM1E3Q2drSkNRa0pDWEpsZEhWeWJpQmthV1ptSUQwOVBTQm1hWEp6ZENCOGZDQW9JR1JwWm1ZZ0pTQm1hWEp6ZENBOVBUMGdNQ0FtSmlCa2FXWm1JQzhnWm1seWMzUWdQajBnTUNBcE93b0pDUWtKQ1gwS0NRa0pDWDA3Q2drSmZTd0tDZ2tKSWxCVFJWVkVUeUk2SUdaMWJtTjBhVzl1S0NCd2MyVjFaRzhzSUdGeVozVnRaVzUwSUNrZ2V3b0pDUWt2THlCd2MyVjFaRzh0WTJ4aGMzTWdibUZ0WlhNZ1lYSmxJR05oYzJVdGFXNXpaVzV6YVhScGRtVUtDUWtKTHk4Z2FIUjBjRG92TDNkM2R5NTNNeTV2Y21jdlZGSXZjMlZzWldOMGIzSnpMeU53YzJWMVpHOHRZMnhoYzNObGN3b0pDUWt2THlCUWNtbHZjbWwwYVhwbElHSjVJR05oYzJVZ2MyVnVjMmwwYVhacGRIa2dhVzRnWTJGelpTQmpkWE4wYjIwZ2NITmxkV1J2Y3lCaGNtVWdZV1JrWldRZ2QybDBhQ0IxY0hCbGNtTmhjMlVnYkdWMGRHVnljd29KQ1Frdkx5QlNaVzFsYldKbGNpQjBhR0YwSUhObGRFWnBiSFJsY25NZ2FXNW9aWEpwZEhNZ1puSnZiU0J3YzJWMVpHOXpDZ2tKQ1haaGNpQmhjbWR6TEFvSkNRa0pabTRnUFNCRmVIQnlMbkJ6WlhWa2IzTmJJSEJ6WlhWa2J5QmRJSHg4SUVWNGNISXVjMlYwUm1sc2RHVnljMXNnY0hObGRXUnZMblJ2VEc5M1pYSkRZWE5sS0NrZ1hTQjhmQW9KQ1FrSkNWTnBlbnBzWlM1bGNuSnZjaWdnSW5WdWMzVndjRzl5ZEdWa0lIQnpaWFZrYnpvZ0lpQXJJSEJ6WlhWa2J5QXBPd29LQ1FrSkx5OGdWR2hsSUhWelpYSWdiV0Y1SUhWelpTQmpjbVZoZEdWUWMyVjFaRzhnZEc4Z2FXNWthV05oZEdVZ2RHaGhkQW9KQ1Frdkx5QmhjbWQxYldWdWRITWdZWEpsSUc1bFpXUmxaQ0IwYnlCamNtVmhkR1VnZEdobElHWnBiSFJsY2lCbWRXNWpkR2x2YmdvSkNRa3ZMeUJxZFhOMElHRnpJRk5wZW5wc1pTQmtiMlZ6Q2drSkNXbG1JQ2dnWm01YklHVjRjR0Z1Wkc4Z1hTQXBJSHNLQ1FrSkNYSmxkSFZ5YmlCbWJpZ2dZWEpuZFcxbGJuUWdLVHNLQ1FrSmZRb0tDUWtKTHk4Z1FuVjBJRzFoYVc1MFlXbHVJSE4xY0hCdmNuUWdabTl5SUc5c1pDQnphV2R1WVhSMWNtVnpDZ2tKQ1dsbUlDZ2dabTR1YkdWdVozUm9JRDRnTVNBcElIc0tDUWtKQ1dGeVozTWdQU0JiSUhCelpYVmtieXdnY0hObGRXUnZMQ0FpSWl3Z1lYSm5kVzFsYm5RZ1hUc0tDUWtKQ1hKbGRIVnliaUJGZUhCeUxuTmxkRVpwYkhSbGNuTXVhR0Z6VDNkdVVISnZjR1Z5ZEhrb0lIQnpaWFZrYnk1MGIweHZkMlZ5UTJGelpTZ3BJQ2tnUHdvSkNRa0pDVzFoY210R2RXNWpkR2x2YmlobWRXNWpkR2x2YmlnZ2MyVmxaQ3dnYldGMFkyaGxjeUFwSUhzS0NRa0pDUWtKZG1GeUlHbGtlQ3dLQ1FrSkNRa0pDVzFoZEdOb1pXUWdQU0JtYmlnZ2MyVmxaQ3dnWVhKbmRXMWxiblFnS1N3S0NRa0pDUWtKQ1drZ1BTQnRZWFJqYUdWa0xteGxibWQwYURzS0NRa0pDUWtKZDJocGJHVWdLQ0JwTFMwZ0tTQjdDZ2tKQ1FrSkNRbHBaSGdnUFNCcGJtUmxlRTltS0NCelpXVmtMQ0J0WVhSamFHVmtXMmxkSUNrN0Nna0pDUWtKQ1FselpXVmtXeUJwWkhnZ1hTQTlJQ0VvSUcxaGRHTm9aWE5iSUdsa2VDQmRJRDBnYldGMFkyaGxaRnRwWFNBcE93b0pDUWtKQ1FsOUNna0pDUWtKZlNrZ09nb0pDUWtKQ1daMWJtTjBhVzl1S0NCbGJHVnRJQ2tnZXdvSkNRa0pDUWx5WlhSMWNtNGdabTRvSUdWc1pXMHNJREFzSUdGeVozTWdLVHNLQ1FrSkNRbDlPd29KQ1FsOUNnb0pDUWx5WlhSMWNtNGdabTQ3Q2drSmZRb0pmU3dLQ2dsd2MyVjFaRzl6T2lCN0Nna0pMeThnVUc5MFpXNTBhV0ZzYkhrZ1kyOXRjR3hsZUNCd2MyVjFaRzl6Q2drSkltNXZkQ0k2SUcxaGNtdEdkVzVqZEdsdmJpaG1kVzVqZEdsdmJpZ2djMlZzWldOMGIzSWdLU0I3Q2drSkNTOHZJRlJ5YVcwZ2RHaGxJSE5sYkdWamRHOXlJSEJoYzNObFpDQjBieUJqYjIxd2FXeGxDZ2tKQ1M4dklIUnZJR0YyYjJsa0lIUnlaV0YwYVc1bklHeGxZV1JwYm1jZ1lXNWtJSFJ5WVdsc2FXNW5DZ2tKQ1M4dklITndZV05sY3lCaGN5QmpiMjFpYVc1aGRHOXljd29KQ1FsMllYSWdhVzV3ZFhRZ1BTQmJYU3dLQ1FrSkNYSmxjM1ZzZEhNZ1BTQmJYU3dLQ1FrSkNXMWhkR05vWlhJZ1BTQmpiMjF3YVd4bEtDQnpaV3hsWTNSdmNpNXlaWEJzWVdObEtDQnlkSEpwYlN3Z0lpUXhJaUFwSUNrN0Nnb0pDUWx5WlhSMWNtNGdiV0YwWTJobGNsc2daWGh3WVc1a2J5QmRJRDhLQ1FrSkNXMWhjbXRHZFc1amRHbHZiaWhtZFc1amRHbHZiaWdnYzJWbFpDd2diV0YwWTJobGN5d2dZMjl1ZEdWNGRDd2dlRzFzSUNrZ2V3b0pDUWtKQ1haaGNpQmxiR1Z0TEFvSkNRa0pDUWwxYm0xaGRHTm9aV1FnUFNCdFlYUmphR1Z5S0NCelpXVmtMQ0J1ZFd4c0xDQjRiV3dzSUZ0ZElDa3NDZ2tKQ1FrSkNXa2dQU0J6WldWa0xteGxibWQwYURzS0Nna0pDUWtKTHk4Z1RXRjBZMmdnWld4bGJXVnVkSE1nZFc1dFlYUmphR1ZrSUdKNUlHQnRZWFJqYUdWeVlBb0pDUWtKQ1hkb2FXeGxJQ2dnYVMwdElDa2dld29KQ1FrSkNRbHBaaUFvSUNobGJHVnRJRDBnZFc1dFlYUmphR1ZrVzJsZEtTQXBJSHNLQ1FrSkNRa0pDWE5sWldSYmFWMGdQU0FoS0cxaGRHTm9aWE5iYVYwZ1BTQmxiR1Z0S1RzS0NRa0pDUWtKZlFvSkNRa0pDWDBLQ1FrSkNYMHBJRG9LQ1FrSkNXWjFibU4wYVc5dUtDQmxiR1Z0TENCamIyNTBaWGgwTENCNGJXd2dLU0I3Q2drSkNRa0phVzV3ZFhSYk1GMGdQU0JsYkdWdE93b0pDUWtKQ1cxaGRHTm9aWElvSUdsdWNIVjBMQ0J1ZFd4c0xDQjRiV3dzSUhKbGMzVnNkSE1nS1RzS0NRa0pDUWt2THlCRWIyNG5kQ0JyWldWd0lIUm9aU0JsYkdWdFpXNTBJQ2hwYzNOMVpTQWpNams1S1FvSkNRa0pDV2x1Y0hWMFd6QmRJRDBnYm5Wc2JEc0tDUWtKQ1FseVpYUjFjbTRnSVhKbGMzVnNkSE11Y0c5d0tDazdDZ2tKQ1FsOU93b0pDWDBwTEFvS0NRa2lhR0Z6SWpvZ2JXRnlhMFoxYm1OMGFXOXVLR1oxYm1OMGFXOXVLQ0J6Wld4bFkzUnZjaUFwSUhzS0NRa0pjbVYwZFhKdUlHWjFibU4wYVc5dUtDQmxiR1Z0SUNrZ2V3b0pDUWtKY21WMGRYSnVJRk5wZW5wc1pTZ2djMlZzWldOMGIzSXNJR1ZzWlcwZ0tTNXNaVzVuZEdnZ1BpQXdPd29KQ1FsOU93b0pDWDBwTEFvS0NRa2lZMjl1ZEdGcGJuTWlPaUJ0WVhKclJuVnVZM1JwYjI0b1puVnVZM1JwYjI0b0lIUmxlSFFnS1NCN0Nna0pDWFJsZUhRZ1BTQjBaWGgwTG5KbGNHeGhZMlVvSUhKMWJtVnpZMkZ3WlN3Z1puVnVaWE5qWVhCbElDazdDZ2tKQ1hKbGRIVnliaUJtZFc1amRHbHZiaWdnWld4bGJTQXBJSHNLQ1FrSkNYSmxkSFZ5YmlBb0lHVnNaVzB1ZEdWNGRFTnZiblJsYm5RZ2ZId2daV3hsYlM1cGJtNWxjbFJsZUhRZ2ZId2daMlYwVkdWNGRDZ2daV3hsYlNBcElDa3VhVzVrWlhoUFppZ2dkR1Y0ZENBcElENGdMVEU3Q2drSkNYMDdDZ2tKZlNrc0Nnb0pDUzh2SUNKWGFHVjBhR1Z5SUdGdUlHVnNaVzFsYm5RZ2FYTWdjbVZ3Y21WelpXNTBaV1FnWW5rZ1lTQTZiR0Z1WnlncElITmxiR1ZqZEc5eUNna0pMeThnYVhNZ1ltRnpaV1FnYzI5c1pXeDVJRzl1SUhSb1pTQmxiR1Z0Wlc1MEozTWdiR0Z1WjNWaFoyVWdkbUZzZFdVS0NRa3ZMeUJpWldsdVp5QmxjWFZoYkNCMGJ5QjBhR1VnYVdSbGJuUnBabWxsY2lCRExBb0pDUzh2SUc5eUlHSmxaMmx1Ym1sdVp5QjNhWFJvSUhSb1pTQnBaR1Z1ZEdsbWFXVnlJRU1nYVcxdFpXUnBZWFJsYkhrZ1ptOXNiRzkzWldRZ1lua2dJaTBpTGdvSkNTOHZJRlJvWlNCdFlYUmphR2x1WnlCdlppQkRJR0ZuWVdsdWMzUWdkR2hsSUdWc1pXMWxiblFuY3lCc1lXNW5kV0ZuWlNCMllXeDFaU0JwY3lCd1pYSm1iM0p0WldRZ1kyRnpaUzFwYm5ObGJuTnBkR2wyWld4NUxnb0pDUzh2SUZSb1pTQnBaR1Z1ZEdsbWFXVnlJRU1nWkc5bGN5QnViM1FnYUdGMlpTQjBieUJpWlNCaElIWmhiR2xrSUd4aGJtZDFZV2RsSUc1aGJXVXVJZ29KQ1M4dklHaDBkSEE2THk5M2QzY3Vkek11YjNKbkwxUlNMM05sYkdWamRHOXljeThqYkdGdVp5MXdjMlYxWkc4S0NRa2liR0Z1WnlJNklHMWhjbXRHZFc1amRHbHZiaWdnWm5WdVkzUnBiMjRvSUd4aGJtY2dLU0I3Q2drSkNTOHZJR3hoYm1jZ2RtRnNkV1VnYlhWemRDQmlaU0JoSUhaaGJHbGtJR2xrWlc1MGFXWnBaWElLQ1FrSmFXWWdLQ0FoY21sa1pXNTBhV1pwWlhJdWRHVnpkQ2hzWVc1bklIeDhJQ0lpS1NBcElIc0tDUWtKQ1ZOcGVucHNaUzVsY25KdmNpZ2dJblZ1YzNWd2NHOXlkR1ZrSUd4aGJtYzZJQ0lnS3lCc1lXNW5JQ2s3Q2drSkNYMEtDUWtKYkdGdVp5QTlJR3hoYm1jdWNtVndiR0ZqWlNnZ2NuVnVaWE5qWVhCbExDQm1kVzVsYzJOaGNHVWdLUzUwYjB4dmQyVnlRMkZ6WlNncE93b0pDUWx5WlhSMWNtNGdablZ1WTNScGIyNG9JR1ZzWlcwZ0tTQjdDZ2tKQ1FsMllYSWdaV3hsYlV4aGJtYzdDZ2tKQ1Fsa2J5QjdDZ2tKQ1FrSmFXWWdLQ0FvWld4bGJVeGhibWNnUFNCa2IyTjFiV1Z1ZEVselNGUk5UQ0EvQ2drSkNRa0pDV1ZzWlcwdWJHRnVaeUE2Q2drSkNRa0pDV1ZzWlcwdVoyVjBRWFIwY21saWRYUmxLQ0o0Yld3NmJHRnVaeUlwSUh4OElHVnNaVzB1WjJWMFFYUjBjbWxpZFhSbEtDSnNZVzVuSWlrcElDa2dld29LQ1FrSkNRa0paV3hsYlV4aGJtY2dQU0JsYkdWdFRHRnVaeTUwYjB4dmQyVnlRMkZ6WlNncE93b0pDUWtKQ1FseVpYUjFjbTRnWld4bGJVeGhibWNnUFQwOUlHeGhibWNnZkh3Z1pXeGxiVXhoYm1jdWFXNWtaWGhQWmlnZ2JHRnVaeUFySUNJdElpQXBJRDA5UFNBd093b0pDUWtKQ1gwS0NRa0pDWDBnZDJocGJHVWdLQ0FvWld4bGJTQTlJR1ZzWlcwdWNHRnlaVzUwVG05a1pTa2dKaVlnWld4bGJTNXViMlJsVkhsd1pTQTlQVDBnTVNBcE93b0pDUWtKY21WMGRYSnVJR1poYkhObE93b0pDUWw5T3dvSkNYMHBMQW9LQ1Frdkx5Qk5hWE5qWld4c1lXNWxiM1Z6Q2drSkluUmhjbWRsZENJNklHWjFibU4wYVc5dUtDQmxiR1Z0SUNrZ2V3b0pDUWwyWVhJZ2FHRnphQ0E5SUhkcGJtUnZkeTVzYjJOaGRHbHZiaUFtSmlCM2FXNWtiM2N1Ykc5allYUnBiMjR1YUdGemFEc0tDUWtKY21WMGRYSnVJR2hoYzJnZ0ppWWdhR0Z6YUM1emJHbGpaU2dnTVNBcElEMDlQU0JsYkdWdExtbGtPd29KQ1gwc0Nnb0pDU0p5YjI5MElqb2dablZ1WTNScGIyNG9JR1ZzWlcwZ0tTQjdDZ2tKQ1hKbGRIVnliaUJsYkdWdElEMDlQU0JrYjJORmJHVnRPd29KQ1gwc0Nnb0pDU0ptYjJOMWN5STZJR1oxYm1OMGFXOXVLQ0JsYkdWdElDa2dld29KQ1FseVpYUjFjbTRnWld4bGJTQTlQVDBnWkc5amRXMWxiblF1WVdOMGFYWmxSV3hsYldWdWRDQW1KaUFvSVdSdlkzVnRaVzUwTG1oaGMwWnZZM1Z6SUh4OElHUnZZM1Z0Wlc1MExtaGhjMFp2WTNWektDa3BJQ1ltSUNFaEtHVnNaVzB1ZEhsd1pTQjhmQ0JsYkdWdExtaHlaV1lnZkh3Z2ZtVnNaVzB1ZEdGaVNXNWtaWGdwT3dvSkNYMHNDZ29KQ1M4dklFSnZiMnhsWVc0Z2NISnZjR1Z5ZEdsbGN3b0pDU0psYm1GaWJHVmtJam9nWTNKbFlYUmxSR2x6WVdKc1pXUlFjMlYxWkc4b0lHWmhiSE5sSUNrc0Nna0pJbVJwYzJGaWJHVmtJam9nWTNKbFlYUmxSR2x6WVdKc1pXUlFjMlYxWkc4b0lIUnlkV1VnS1N3S0Nna0pJbU5vWldOclpXUWlPaUJtZFc1amRHbHZiaWdnWld4bGJTQXBJSHNLQ1FrSkx5OGdTVzRnUTFOVE15d2dPbU5vWldOclpXUWdjMmh2ZFd4a0lISmxkSFZ5YmlCaWIzUm9JR05vWldOclpXUWdZVzVrSUhObGJHVmpkR1ZrSUdWc1pXMWxiblJ6Q2drSkNTOHZJR2gwZEhBNkx5OTNkM2N1ZHpNdWIzSm5MMVJTTHpJd01URXZVa1ZETFdOemN6TXRjMlZzWldOMGIzSnpMVEl3TVRFd09USTVMeU5qYUdWamEyVmtDZ2tKQ1haaGNpQnViMlJsVG1GdFpTQTlJR1ZzWlcwdWJtOWtaVTVoYldVdWRHOU1iM2RsY2tOaGMyVW9LVHNLQ1FrSmNtVjBkWEp1SUNodWIyUmxUbUZ0WlNBOVBUMGdJbWx1Y0hWMElpQW1KaUFoSVdWc1pXMHVZMmhsWTJ0bFpDa2dmSHdnS0c1dlpHVk9ZVzFsSUQwOVBTQWliM0IwYVc5dUlpQW1KaUFoSVdWc1pXMHVjMlZzWldOMFpXUXBPd29KQ1gwc0Nnb0pDU0p6Wld4bFkzUmxaQ0k2SUdaMWJtTjBhVzl1S0NCbGJHVnRJQ2tnZXdvSkNRa3ZMeUJCWTJObGMzTnBibWNnZEdocGN5QndjbTl3WlhKMGVTQnRZV3RsY3lCelpXeGxZM1JsWkMxaWVTMWtaV1poZFd4MENna0pDUzh2SUc5d2RHbHZibk1nYVc0Z1UyRm1ZWEpwSUhkdmNtc2djSEp2Y0dWeWJIa0tDUWtKYVdZZ0tDQmxiR1Z0TG5CaGNtVnVkRTV2WkdVZ0tTQjdDZ2tKQ1FsbGJHVnRMbkJoY21WdWRFNXZaR1V1YzJWc1pXTjBaV1JKYm1SbGVEc0tDUWtKZlFvS0NRa0pjbVYwZFhKdUlHVnNaVzB1YzJWc1pXTjBaV1FnUFQwOUlIUnlkV1U3Q2drSmZTd0tDZ2tKTHk4Z1EyOXVkR1Z1ZEhNS0NRa2laVzF3ZEhraU9pQm1kVzVqZEdsdmJpZ2daV3hsYlNBcElIc0tDUWtKTHk4Z2FIUjBjRG92TDNkM2R5NTNNeTV2Y21jdlZGSXZjMlZzWldOMGIzSnpMeU5sYlhCMGVTMXdjMlYxWkc4S0NRa0pMeThnT21WdGNIUjVJR2x6SUc1bFoyRjBaV1FnWW5rZ1pXeGxiV1Z1ZENBb01Ta2diM0lnWTI5dWRHVnVkQ0J1YjJSbGN5QW9kR1Y0ZERvZ016c2dZMlJoZEdFNklEUTdJR1Z1ZEdsMGVTQnlaV1k2SURVcExBb0pDUWt2THlBZ0lHSjFkQ0J1YjNRZ1lua2diM1JvWlhKeklDaGpiMjF0Wlc1ME9pQTRPeUJ3Y205alpYTnphVzVuSUdsdWMzUnlkV04wYVc5dU9pQTNPeUJsZEdNdUtRb0pDUWt2THlCdWIyUmxWSGx3WlNBOElEWWdkMjl5YTNNZ1ltVmpZWFZ6WlNCaGRIUnlhV0oxZEdWeklDZ3lLU0JrYnlCdWIzUWdZWEJ3WldGeUlHRnpJR05vYVd4a2NtVnVDZ2tKQ1dadmNpQW9JR1ZzWlcwZ1BTQmxiR1Z0TG1acGNuTjBRMmhwYkdRN0lHVnNaVzA3SUdWc1pXMGdQU0JsYkdWdExtNWxlSFJUYVdKc2FXNW5JQ2tnZXdvSkNRa0phV1lnS0NCbGJHVnRMbTV2WkdWVWVYQmxJRHdnTmlBcElIc0tDUWtKQ1FseVpYUjFjbTRnWm1Gc2MyVTdDZ2tKQ1FsOUNna0pDWDBLQ1FrSmNtVjBkWEp1SUhSeWRXVTdDZ2tKZlN3S0Nna0pJbkJoY21WdWRDSTZJR1oxYm1OMGFXOXVLQ0JsYkdWdElDa2dld29KQ1FseVpYUjFjbTRnSVVWNGNISXVjSE5sZFdSdmMxc2laVzF3ZEhraVhTZ2daV3hsYlNBcE93b0pDWDBzQ2dvSkNTOHZJRVZzWlcxbGJuUXZhVzV3ZFhRZ2RIbHdaWE1LQ1FraWFHVmhaR1Z5SWpvZ1puVnVZM1JwYjI0b0lHVnNaVzBnS1NCN0Nna0pDWEpsZEhWeWJpQnlhR1ZoWkdWeUxuUmxjM1FvSUdWc1pXMHVibTlrWlU1aGJXVWdLVHNLQ1FsOUxBb0tDUWtpYVc1d2RYUWlPaUJtZFc1amRHbHZiaWdnWld4bGJTQXBJSHNLQ1FrSmNtVjBkWEp1SUhKcGJuQjFkSE11ZEdWemRDZ2daV3hsYlM1dWIyUmxUbUZ0WlNBcE93b0pDWDBzQ2dvSkNTSmlkWFIwYjI0aU9pQm1kVzVqZEdsdmJpZ2daV3hsYlNBcElIc0tDUWtKZG1GeUlHNWhiV1VnUFNCbGJHVnRMbTV2WkdWT1lXMWxMblJ2VEc5M1pYSkRZWE5sS0NrN0Nna0pDWEpsZEhWeWJpQnVZVzFsSUQwOVBTQWlhVzV3ZFhRaUlDWW1JR1ZzWlcwdWRIbHdaU0E5UFQwZ0ltSjFkSFJ2YmlJZ2ZId2dibUZ0WlNBOVBUMGdJbUoxZEhSdmJpSTdDZ2tKZlN3S0Nna0pJblJsZUhRaU9pQm1kVzVqZEdsdmJpZ2daV3hsYlNBcElIc0tDUWtKZG1GeUlHRjBkSEk3Q2drSkNYSmxkSFZ5YmlCbGJHVnRMbTV2WkdWT1lXMWxMblJ2VEc5M1pYSkRZWE5sS0NrZ1BUMDlJQ0pwYm5CMWRDSWdKaVlLQ1FrSkNXVnNaVzB1ZEhsd1pTQTlQVDBnSW5SbGVIUWlJQ1ltQ2dvSkNRa0pMeThnVTNWd2NHOXlkRG9nU1VVOE9Bb0pDUWtKTHk4Z1RtVjNJRWhVVFV3MUlHRjBkSEpwWW5WMFpTQjJZV3gxWlhNZ0tHVXVaeTRzSUNKelpXRnlZMmdpS1NCaGNIQmxZWElnZDJsMGFDQmxiR1Z0TG5SNWNHVWdQVDA5SUNKMFpYaDBJZ29KQ1FrSktDQW9ZWFIwY2lBOUlHVnNaVzB1WjJWMFFYUjBjbWxpZFhSbEtDSjBlWEJsSWlrcElEMDlJRzUxYkd3Z2ZId2dZWFIwY2k1MGIweHZkMlZ5UTJGelpTZ3BJRDA5UFNBaWRHVjRkQ0lnS1RzS0NRbDlMQW9LQ1Frdkx5QlFiM05wZEdsdmJpMXBiaTFqYjJ4c1pXTjBhVzl1Q2drSkltWnBjbk4wSWpvZ1kzSmxZWFJsVUc5emFYUnBiMjVoYkZCelpYVmtieWhtZFc1amRHbHZiaWdwSUhzS0NRa0pjbVYwZFhKdUlGc2dNQ0JkT3dvSkNYMHBMQW9LQ1FraWJHRnpkQ0k2SUdOeVpXRjBaVkJ2YzJsMGFXOXVZV3hRYzJWMVpHOG9ablZ1WTNScGIyNG9JRzFoZEdOb1NXNWtaWGhsY3l3Z2JHVnVaM1JvSUNrZ2V3b0pDUWx5WlhSMWNtNGdXeUJzWlc1bmRHZ2dMU0F4SUYwN0Nna0pmU2tzQ2dvSkNTSmxjU0k2SUdOeVpXRjBaVkJ2YzJsMGFXOXVZV3hRYzJWMVpHOG9ablZ1WTNScGIyNG9JRzFoZEdOb1NXNWtaWGhsY3l3Z2JHVnVaM1JvTENCaGNtZDFiV1Z1ZENBcElIc0tDUWtKY21WMGRYSnVJRnNnWVhKbmRXMWxiblFnUENBd0lEOGdZWEpuZFcxbGJuUWdLeUJzWlc1bmRHZ2dPaUJoY21kMWJXVnVkQ0JkT3dvSkNYMHBMQW9LQ1FraVpYWmxiaUk2SUdOeVpXRjBaVkJ2YzJsMGFXOXVZV3hRYzJWMVpHOG9ablZ1WTNScGIyNG9JRzFoZEdOb1NXNWtaWGhsY3l3Z2JHVnVaM1JvSUNrZ2V3b0pDUWwyWVhJZ2FTQTlJREE3Q2drSkNXWnZjaUFvSURzZ2FTQThJR3hsYm1kMGFEc2dhU0FyUFNBeUlDa2dld29KQ1FrSmJXRjBZMmhKYm1SbGVHVnpMbkIxYzJnb0lHa2dLVHNLQ1FrSmZRb0pDUWx5WlhSMWNtNGdiV0YwWTJoSmJtUmxlR1Z6T3dvSkNYMHBMQW9LQ1FraWIyUmtJam9nWTNKbFlYUmxVRzl6YVhScGIyNWhiRkJ6WlhWa2J5aG1kVzVqZEdsdmJpZ2diV0YwWTJoSmJtUmxlR1Z6TENCc1pXNW5kR2dnS1NCN0Nna0pDWFpoY2lCcElEMGdNVHNLQ1FrSlptOXlJQ2dnT3lCcElEd2diR1Z1WjNSb095QnBJQ3M5SURJZ0tTQjdDZ2tKQ1FsdFlYUmphRWx1WkdWNFpYTXVjSFZ6YUNnZ2FTQXBPd29KQ1FsOUNna0pDWEpsZEhWeWJpQnRZWFJqYUVsdVpHVjRaWE03Q2drSmZTa3NDZ29KQ1NKc2RDSTZJR055WldGMFpWQnZjMmwwYVc5dVlXeFFjMlYxWkc4b1puVnVZM1JwYjI0b0lHMWhkR05vU1c1a1pYaGxjeXdnYkdWdVozUm9MQ0JoY21kMWJXVnVkQ0FwSUhzS0NRa0pkbUZ5SUdrZ1BTQmhjbWQxYldWdWRDQThJREFnUHlCaGNtZDFiV1Z1ZENBcklHeGxibWQwYUNBNklHRnlaM1Z0Wlc1ME93b0pDUWxtYjNJZ0tDQTdJQzB0YVNBK1BTQXdPeUFwSUhzS0NRa0pDVzFoZEdOb1NXNWtaWGhsY3k1d2RYTm9LQ0JwSUNrN0Nna0pDWDBLQ1FrSmNtVjBkWEp1SUcxaGRHTm9TVzVrWlhobGN6c0tDUWw5S1N3S0Nna0pJbWQwSWpvZ1kzSmxZWFJsVUc5emFYUnBiMjVoYkZCelpYVmtieWhtZFc1amRHbHZiaWdnYldGMFkyaEpibVJsZUdWekxDQnNaVzVuZEdnc0lHRnlaM1Z0Wlc1MElDa2dld29KQ1FsMllYSWdhU0E5SUdGeVozVnRaVzUwSUR3Z01DQS9JR0Z5WjNWdFpXNTBJQ3NnYkdWdVozUm9JRG9nWVhKbmRXMWxiblE3Q2drSkNXWnZjaUFvSURzZ0t5dHBJRHdnYkdWdVozUm9PeUFwSUhzS0NRa0pDVzFoZEdOb1NXNWtaWGhsY3k1d2RYTm9LQ0JwSUNrN0Nna0pDWDBLQ1FrSmNtVjBkWEp1SUcxaGRHTm9TVzVrWlhobGN6c0tDUWw5S1FvSmZRcDlPd29LUlhod2NpNXdjMlYxWkc5eld5SnVkR2dpWFNBOUlFVjRjSEl1Y0hObGRXUnZjMXNpWlhFaVhUc0tDaTh2SUVGa1pDQmlkWFIwYjI0dmFXNXdkWFFnZEhsd1pTQndjMlYxWkc5ekNtWnZjaUFvSUdrZ2FXNGdleUJ5WVdScGJ6b2dkSEoxWlN3Z1kyaGxZMnRpYjNnNklIUnlkV1VzSUdacGJHVTZJSFJ5ZFdVc0lIQmhjM04zYjNKa09pQjBjblZsTENCcGJXRm5aVG9nZEhKMVpTQjlJQ2tnZXdvSlJYaHdjaTV3YzJWMVpHOXpXeUJwSUYwZ1BTQmpjbVZoZEdWSmJuQjFkRkJ6WlhWa2J5Z2dhU0FwT3dwOUNtWnZjaUFvSUdrZ2FXNGdleUJ6ZFdKdGFYUTZJSFJ5ZFdVc0lISmxjMlYwT2lCMGNuVmxJSDBnS1NCN0NnbEZlSEJ5TG5CelpYVmtiM05iSUdrZ1hTQTlJR055WldGMFpVSjFkSFJ2YmxCelpYVmtieWdnYVNBcE93cDlDZ292THlCRllYTjVJRUZRU1NCbWIzSWdZM0psWVhScGJtY2dibVYzSUhObGRFWnBiSFJsY25NS1puVnVZM1JwYjI0Z2MyVjBSbWxzZEdWeWN5Z3BJSHQ5Q25ObGRFWnBiSFJsY25NdWNISnZkRzkwZVhCbElEMGdSWGh3Y2k1bWFXeDBaWEp6SUQwZ1JYaHdjaTV3YzJWMVpHOXpPd3BGZUhCeUxuTmxkRVpwYkhSbGNuTWdQU0J1WlhjZ2MyVjBSbWxzZEdWeWN5Z3BPd29LZEc5clpXNXBlbVVnUFNCVGFYcDZiR1V1ZEc5clpXNXBlbVVnUFNCbWRXNWpkR2x2YmlnZ2MyVnNaV04wYjNJc0lIQmhjbk5sVDI1c2VTQXBJSHNLQ1haaGNpQnRZWFJqYUdWa0xDQnRZWFJqYUN3Z2RHOXJaVzV6TENCMGVYQmxMQW9KQ1hOdlJtRnlMQ0JuY205MWNITXNJSEJ5WlVacGJIUmxjbk1zQ2drSlkyRmphR1ZrSUQwZ2RHOXJaVzVEWVdOb1pWc2djMlZzWldOMGIzSWdLeUFpSUNJZ1hUc0tDZ2xwWmlBb0lHTmhZMmhsWkNBcElIc0tDUWx5WlhSMWNtNGdjR0Z5YzJWUGJteDVJRDhnTUNBNklHTmhZMmhsWkM1emJHbGpaU2dnTUNBcE93b0pmUW9LQ1hOdlJtRnlJRDBnYzJWc1pXTjBiM0k3Q2dsbmNtOTFjSE1nUFNCYlhUc0tDWEJ5WlVacGJIUmxjbk1nUFNCRmVIQnlMbkJ5WlVacGJIUmxjanNLQ2dsM2FHbHNaU0FvSUhOdlJtRnlJQ2tnZXdvS0NRa3ZMeUJEYjIxdFlTQmhibVFnWm1seWMzUWdjblZ1Q2drSmFXWWdLQ0FoYldGMFkyaGxaQ0I4ZkNBb2JXRjBZMmdnUFNCeVkyOXRiV0V1WlhobFl5Z2djMjlHWVhJZ0tTa2dLU0I3Q2drSkNXbG1JQ2dnYldGMFkyZ2dLU0I3Q2drSkNRa3ZMeUJFYjI0bmRDQmpiMjV6ZFcxbElIUnlZV2xzYVc1bklHTnZiVzFoY3lCaGN5QjJZV3hwWkFvSkNRa0pjMjlHWVhJZ1BTQnpiMFpoY2k1emJHbGpaU2dnYldGMFkyaGJNRjB1YkdWdVozUm9JQ2tnZkh3Z2MyOUdZWEk3Q2drSkNYMEtDUWtKWjNKdmRYQnpMbkIxYzJnb0lDaDBiMnRsYm5NZ1BTQmJYU2tnS1RzS0NRbDlDZ29KQ1cxaGRHTm9aV1FnUFNCbVlXeHpaVHNLQ2drSkx5OGdRMjl0WW1sdVlYUnZjbk1LQ1FscFppQW9JQ2h0WVhSamFDQTlJSEpqYjIxaWFXNWhkRzl5Y3k1bGVHVmpLQ0J6YjBaaGNpQXBLU0FwSUhzS0NRa0piV0YwWTJobFpDQTlJRzFoZEdOb0xuTm9hV1owS0NrN0Nna0pDWFJ2YTJWdWN5NXdkWE5vS0hzS0NRa0pDWFpoYkhWbE9pQnRZWFJqYUdWa0xBb0pDUWtKTHk4Z1EyRnpkQ0JrWlhOalpXNWtZVzUwSUdOdmJXSnBibUYwYjNKeklIUnZJSE53WVdObENna0pDUWwwZVhCbE9pQnRZWFJqYUZzd1hTNXlaWEJzWVdObEtDQnlkSEpwYlN3Z0lpQWlJQ2tLQ1FrSmZTazdDZ2tKQ1hOdlJtRnlJRDBnYzI5R1lYSXVjMnhwWTJVb0lHMWhkR05vWldRdWJHVnVaM1JvSUNrN0Nna0pmUW9LQ1Frdkx5QkdhV3gwWlhKekNna0pabTl5SUNnZ2RIbHdaU0JwYmlCRmVIQnlMbVpwYkhSbGNpQXBJSHNLQ1FrSmFXWWdLQ0FvYldGMFkyZ2dQU0J0WVhSamFFVjRjSEpiSUhSNWNHVWdYUzVsZUdWaktDQnpiMFpoY2lBcEtTQW1KaUFvSVhCeVpVWnBiSFJsY25OYklIUjVjR1VnWFNCOGZBb0pDUWtKS0cxaGRHTm9JRDBnY0hKbFJtbHNkR1Z5YzFzZ2RIbHdaU0JkS0NCdFlYUmphQ0FwS1NrZ0tTQjdDZ2tKQ1FsdFlYUmphR1ZrSUQwZ2JXRjBZMmd1YzJocFpuUW9LVHNLQ1FrSkNYUnZhMlZ1Y3k1d2RYTm9LSHNLQ1FrSkNRbDJZV3gxWlRvZ2JXRjBZMmhsWkN3S0NRa0pDUWwwZVhCbE9pQjBlWEJsTEFvSkNRa0pDVzFoZEdOb1pYTTZJRzFoZEdOb0Nna0pDUWw5S1RzS0NRa0pDWE52Um1GeUlEMGdjMjlHWVhJdWMyeHBZMlVvSUcxaGRHTm9aV1F1YkdWdVozUm9JQ2s3Q2drSkNYMEtDUWw5Q2dvSkNXbG1JQ2dnSVcxaGRHTm9aV1FnS1NCN0Nna0pDV0p5WldGck93b0pDWDBLQ1gwS0Nna3ZMeUJTWlhSMWNtNGdkR2hsSUd4bGJtZDBhQ0J2WmlCMGFHVWdhVzUyWVd4cFpDQmxlR05sYzNNS0NTOHZJR2xtSUhkbEozSmxJR3AxYzNRZ2NHRnljMmx1WndvSkx5OGdUM1JvWlhKM2FYTmxMQ0IwYUhKdmR5QmhiaUJsY25KdmNpQnZjaUJ5WlhSMWNtNGdkRzlyWlc1ekNnbHlaWFIxY200Z2NHRnljMlZQYm14NUlEOEtDUWx6YjBaaGNpNXNaVzVuZEdnZ09nb0pDWE52Um1GeUlEOEtDUWtKVTJsNmVteGxMbVZ5Y205eUtDQnpaV3hsWTNSdmNpQXBJRG9LQ1FrSkx5OGdRMkZqYUdVZ2RHaGxJSFJ2YTJWdWN3b0pDUWwwYjJ0bGJrTmhZMmhsS0NCelpXeGxZM1J2Y2l3Z1ozSnZkWEJ6SUNrdWMyeHBZMlVvSURBZ0tUc0tmVHNLQ21aMWJtTjBhVzl1SUhSdlUyVnNaV04wYjNJb0lIUnZhMlZ1Y3lBcElIc0tDWFpoY2lCcElEMGdNQ3dLQ1Fsc1pXNGdQU0IwYjJ0bGJuTXViR1Z1WjNSb0xBb0pDWE5sYkdWamRHOXlJRDBnSWlJN0NnbG1iM0lnS0NBN0lHa2dQQ0JzWlc0N0lHa3JLeUFwSUhzS0NRbHpaV3hsWTNSdmNpQXJQU0IwYjJ0bGJuTmJhVjB1ZG1Gc2RXVTdDZ2w5Q2dseVpYUjFjbTRnYzJWc1pXTjBiM0k3Q24wS0NtWjFibU4wYVc5dUlHRmtaRU52YldKcGJtRjBiM0lvSUcxaGRHTm9aWElzSUdOdmJXSnBibUYwYjNJc0lHSmhjMlVnS1NCN0NnbDJZWElnWkdseUlEMGdZMjl0WW1sdVlYUnZjaTVrYVhJc0Nna0pjMnRwY0NBOUlHTnZiV0pwYm1GMGIzSXVibVY0ZEN3S0NRbHJaWGtnUFNCemEybHdJSHg4SUdScGNpd0tDUWxqYUdWamEwNXZia1ZzWlcxbGJuUnpJRDBnWW1GelpTQW1KaUJyWlhrZ1BUMDlJQ0p3WVhKbGJuUk9iMlJsSWl3S0NRbGtiMjVsVG1GdFpTQTlJR1J2Ym1Vckt6c0tDZ2x5WlhSMWNtNGdZMjl0WW1sdVlYUnZjaTVtYVhKemRDQS9DZ2tKTHk4Z1EyaGxZMnNnWVdkaGFXNXpkQ0JqYkc5elpYTjBJR0Z1WTJWemRHOXlMM0J5WldObFpHbHVaeUJsYkdWdFpXNTBDZ2tKWm5WdVkzUnBiMjRvSUdWc1pXMHNJR052Ym5SbGVIUXNJSGh0YkNBcElIc0tDUWtKZDJocGJHVWdLQ0FvWld4bGJTQTlJR1ZzWlcxYklHUnBjaUJkS1NBcElIc0tDUWtKQ1dsbUlDZ2daV3hsYlM1dWIyUmxWSGx3WlNBOVBUMGdNU0I4ZkNCamFHVmphMDV2YmtWc1pXMWxiblJ6SUNrZ2V3b0pDUWtKQ1hKbGRIVnliaUJ0WVhSamFHVnlLQ0JsYkdWdExDQmpiMjUwWlhoMExDQjRiV3dnS1RzS0NRa0pDWDBLQ1FrSmZRb0pDUWx5WlhSMWNtNGdabUZzYzJVN0Nna0pmU0E2Q2dvSkNTOHZJRU5vWldOcklHRm5ZV2x1YzNRZ1lXeHNJR0Z1WTJWemRHOXlMM0J5WldObFpHbHVaeUJsYkdWdFpXNTBjd29KQ1daMWJtTjBhVzl1S0NCbGJHVnRMQ0JqYjI1MFpYaDBMQ0I0Yld3Z0tTQjdDZ2tKQ1haaGNpQnZiR1JEWVdOb1pTd2dkVzVwY1hWbFEyRmphR1VzSUc5MWRHVnlRMkZqYUdVc0Nna0pDUWx1WlhkRFlXTm9aU0E5SUZzZ1pHbHljblZ1Y3l3Z1pHOXVaVTVoYldVZ1hUc0tDZ2tKQ1M4dklGZGxJR05oYmlkMElITmxkQ0JoY21KcGRISmhjbmtnWkdGMFlTQnZiaUJZVFV3Z2JtOWtaWE1zSUhOdklIUm9aWGtnWkc5dUozUWdZbVZ1WldacGRDQm1jbTl0SUdOdmJXSnBibUYwYjNJZ1kyRmphR2x1WndvSkNRbHBaaUFvSUhodGJDQXBJSHNLQ1FrSkNYZG9hV3hsSUNnZ0tHVnNaVzBnUFNCbGJHVnRXeUJrYVhJZ1hTa2dLU0I3Q2drSkNRa0phV1lnS0NCbGJHVnRMbTV2WkdWVWVYQmxJRDA5UFNBeElIeDhJR05vWldOclRtOXVSV3hsYldWdWRITWdLU0I3Q2drSkNRa0pDV2xtSUNnZ2JXRjBZMmhsY2lnZ1pXeGxiU3dnWTI5dWRHVjRkQ3dnZUcxc0lDa2dLU0I3Q2drSkNRa0pDUWx5WlhSMWNtNGdkSEoxWlRzS0NRa0pDUWtKZlFvSkNRa0pDWDBLQ1FrSkNYMEtDUWtKZlNCbGJITmxJSHNLQ1FrSkNYZG9hV3hsSUNnZ0tHVnNaVzBnUFNCbGJHVnRXeUJrYVhJZ1hTa2dLU0I3Q2drSkNRa0phV1lnS0NCbGJHVnRMbTV2WkdWVWVYQmxJRDA5UFNBeElIeDhJR05vWldOclRtOXVSV3hsYldWdWRITWdLU0I3Q2drSkNRa0pDVzkxZEdWeVEyRmphR1VnUFNCbGJHVnRXeUJsZUhCaGJtUnZJRjBnZkh3Z0tHVnNaVzFiSUdWNGNHRnVaRzhnWFNBOUlIdDlLVHNLQ2drSkNRa0pDUzh2SUZOMWNIQnZjblE2SUVsRklEdzVJRzl1YkhrS0NRa0pDUWtKTHk4Z1JHVm1aVzVrSUdGbllXbHVjM1FnWTJ4dmJtVmtJR0YwZEhKdmNHVnlkR2xsY3lBb2FsRjFaWEo1SUdkb0xURTNNRGtwQ2drSkNRa0pDWFZ1YVhGMVpVTmhZMmhsSUQwZ2IzVjBaWEpEWVdOb1pWc2daV3hsYlM1MWJtbHhkV1ZKUkNCZElIeDhJQ2h2ZFhSbGNrTmhZMmhsV3lCbGJHVnRMblZ1YVhGMVpVbEVJRjBnUFNCN2ZTazdDZ29KQ1FrSkNRbHBaaUFvSUhOcmFYQWdKaVlnYzJ0cGNDQTlQVDBnWld4bGJTNXViMlJsVG1GdFpTNTBiMHh2ZDJWeVEyRnpaU2dwSUNrZ2V3b0pDUWtKQ1FrSlpXeGxiU0E5SUdWc1pXMWJJR1JwY2lCZElIeDhJR1ZzWlcwN0Nna0pDUWtKQ1gwZ1pXeHpaU0JwWmlBb0lDaHZiR1JEWVdOb1pTQTlJSFZ1YVhGMVpVTmhZMmhsV3lCclpYa2dYU2tnSmlZS0NRa0pDUWtKQ1c5c1pFTmhZMmhsV3lBd0lGMGdQVDA5SUdScGNuSjFibk1nSmlZZ2IyeGtRMkZqYUdWYklERWdYU0E5UFQwZ1pHOXVaVTVoYldVZ0tTQjdDZ29KQ1FrSkNRa0pMeThnUVhOemFXZHVJSFJ2SUc1bGQwTmhZMmhsSUhOdklISmxjM1ZzZEhNZ1ltRmpheTF3Y205d1lXZGhkR1VnZEc4Z2NISmxkbWx2ZFhNZ1pXeGxiV1Z1ZEhNS0NRa0pDUWtKQ1hKbGRIVnliaUFvYm1WM1EyRmphR1ZiSURJZ1hTQTlJRzlzWkVOaFkyaGxXeUF5SUYwcE93b0pDUWtKQ1FsOUlHVnNjMlVnZXdvSkNRa0pDUWtKTHk4Z1VtVjFjMlVnYm1WM1kyRmphR1VnYzI4Z2NtVnpkV3gwY3lCaVlXTnJMWEJ5YjNCaFoyRjBaU0IwYnlCd2NtVjJhVzkxY3lCbGJHVnRaVzUwY3dvSkNRa0pDUWtKZFc1cGNYVmxRMkZqYUdWYklHdGxlU0JkSUQwZ2JtVjNRMkZqYUdVN0Nnb0pDUWtKQ1FrSkx5OGdRU0J0WVhSamFDQnRaV0Z1Y3lCM1pTZHlaU0JrYjI1bE95QmhJR1poYVd3Z2JXVmhibk1nZDJVZ2FHRjJaU0IwYnlCclpXVndJR05vWldOcmFXNW5DZ2tKQ1FrSkNRbHBaaUFvSUNodVpYZERZV05vWlZzZ01pQmRJRDBnYldGMFkyaGxjaWdnWld4bGJTd2dZMjl1ZEdWNGRDd2dlRzFzSUNrcElDa2dld29KQ1FrSkNRa0pDWEpsZEhWeWJpQjBjblZsT3dvSkNRa0pDUWtKZlFvSkNRa0pDUWw5Q2drSkNRa0pmUW9KQ1FrSmZRb0pDUWw5Q2drSkNYSmxkSFZ5YmlCbVlXeHpaVHNLQ1FsOU93cDlDZ3BtZFc1amRHbHZiaUJsYkdWdFpXNTBUV0YwWTJobGNpZ2diV0YwWTJobGNuTWdLU0I3Q2dseVpYUjFjbTRnYldGMFkyaGxjbk11YkdWdVozUm9JRDRnTVNBL0Nna0pablZ1WTNScGIyNG9JR1ZzWlcwc0lHTnZiblJsZUhRc0lIaHRiQ0FwSUhzS0NRa0pkbUZ5SUdrZ1BTQnRZWFJqYUdWeWN5NXNaVzVuZEdnN0Nna0pDWGRvYVd4bElDZ2dhUzB0SUNrZ2V3b0pDUWtKYVdZZ0tDQWhiV0YwWTJobGNuTmJhVjBvSUdWc1pXMHNJR052Ym5SbGVIUXNJSGh0YkNBcElDa2dld29KQ1FrSkNYSmxkSFZ5YmlCbVlXeHpaVHNLQ1FrSkNYMEtDUWtKZlFvSkNRbHlaWFIxY200Z2RISjFaVHNLQ1FsOUlEb0tDUWx0WVhSamFHVnljMXN3WFRzS2ZRb0tablZ1WTNScGIyNGdiWFZzZEdsd2JHVkRiMjUwWlhoMGN5Z2djMlZzWldOMGIzSXNJR052Ym5SbGVIUnpMQ0J5WlhOMWJIUnpJQ2tnZXdvSmRtRnlJR2tnUFNBd0xBb0pDV3hsYmlBOUlHTnZiblJsZUhSekxteGxibWQwYURzS0NXWnZjaUFvSURzZ2FTQThJR3hsYmpzZ2FTc3JJQ2tnZXdvSkNWTnBlbnBzWlNnZ2MyVnNaV04wYjNJc0lHTnZiblJsZUhSelcybGRMQ0J5WlhOMWJIUnpJQ2s3Q2dsOUNnbHlaWFIxY200Z2NtVnpkV3gwY3pzS2ZRb0tablZ1WTNScGIyNGdZMjl1WkdWdWMyVW9JSFZ1YldGMFkyaGxaQ3dnYldGd0xDQm1hV3gwWlhJc0lHTnZiblJsZUhRc0lIaHRiQ0FwSUhzS0NYWmhjaUJsYkdWdExBb0pDVzVsZDFWdWJXRjBZMmhsWkNBOUlGdGRMQW9KQ1drZ1BTQXdMQW9KQ1d4bGJpQTlJSFZ1YldGMFkyaGxaQzVzWlc1bmRHZ3NDZ2tKYldGd2NHVmtJRDBnYldGd0lDRTlJRzUxYkd3N0Nnb0pabTl5SUNnZ095QnBJRHdnYkdWdU95QnBLeXNnS1NCN0Nna0phV1lnS0NBb1pXeGxiU0E5SUhWdWJXRjBZMmhsWkZ0cFhTa2dLU0I3Q2drSkNXbG1JQ2dnSVdacGJIUmxjaUI4ZkNCbWFXeDBaWElvSUdWc1pXMHNJR052Ym5SbGVIUXNJSGh0YkNBcElDa2dld29KQ1FrSmJtVjNWVzV0WVhSamFHVmtMbkIxYzJnb0lHVnNaVzBnS1RzS0NRa0pDV2xtSUNnZ2JXRndjR1ZrSUNrZ2V3b0pDUWtKQ1cxaGNDNXdkWE5vS0NCcElDazdDZ2tKQ1FsOUNna0pDWDBLQ1FsOUNnbDlDZ29KY21WMGRYSnVJRzVsZDFWdWJXRjBZMmhsWkRzS2ZRb0tablZ1WTNScGIyNGdjMlYwVFdGMFkyaGxjaWdnY0hKbFJtbHNkR1Z5TENCelpXeGxZM1J2Y2l3Z2JXRjBZMmhsY2l3Z2NHOXpkRVpwYkhSbGNpd2djRzl6ZEVacGJtUmxjaXdnY0c5emRGTmxiR1ZqZEc5eUlDa2dld29KYVdZZ0tDQndiM04wUm1sc2RHVnlJQ1ltSUNGd2IzTjBSbWxzZEdWeVd5QmxlSEJoYm1SdklGMGdLU0I3Q2drSmNHOXpkRVpwYkhSbGNpQTlJSE5sZEUxaGRHTm9aWElvSUhCdmMzUkdhV3gwWlhJZ0tUc0tDWDBLQ1dsbUlDZ2djRzl6ZEVacGJtUmxjaUFtSmlBaGNHOXpkRVpwYm1SbGNsc2daWGh3WVc1a2J5QmRJQ2tnZXdvSkNYQnZjM1JHYVc1a1pYSWdQU0J6WlhSTllYUmphR1Z5S0NCd2IzTjBSbWx1WkdWeUxDQndiM04wVTJWc1pXTjBiM0lnS1RzS0NYMEtDWEpsZEhWeWJpQnRZWEpyUm5WdVkzUnBiMjRvWm5WdVkzUnBiMjRvSUhObFpXUXNJSEpsYzNWc2RITXNJR052Ym5SbGVIUXNJSGh0YkNBcElIc0tDUWwyWVhJZ2RHVnRjQ3dnYVN3Z1pXeGxiU3dLQ1FrSmNISmxUV0Z3SUQwZ1cxMHNDZ2tKQ1hCdmMzUk5ZWEFnUFNCYlhTd0tDUWtKY0hKbFpYaHBjM1JwYm1jZ1BTQnlaWE4xYkhSekxteGxibWQwYUN3S0Nna0pDUzh2SUVkbGRDQnBibWwwYVdGc0lHVnNaVzFsYm5SeklHWnliMjBnYzJWbFpDQnZjaUJqYjI1MFpYaDBDZ2tKQ1dWc1pXMXpJRDBnYzJWbFpDQjhmQ0J0ZFd4MGFYQnNaVU52Ym5SbGVIUnpLQ0J6Wld4bFkzUnZjaUI4ZkNBaUtpSXNJR052Ym5SbGVIUXVibTlrWlZSNWNHVWdQeUJiSUdOdmJuUmxlSFFnWFNBNklHTnZiblJsZUhRc0lGdGRJQ2tzQ2dvSkNRa3ZMeUJRY21WbWFXeDBaWElnZEc4Z1oyVjBJRzFoZEdOb1pYSWdhVzV3ZFhRc0lIQnlaWE5sY25acGJtY2dZU0J0WVhBZ1ptOXlJSE5sWldRdGNtVnpkV3gwY3lCemVXNWphSEp2Ym1sNllYUnBiMjRLQ1FrSmJXRjBZMmhsY2tsdUlEMGdjSEpsUm1sc2RHVnlJQ1ltSUNnZ2MyVmxaQ0I4ZkNBaGMyVnNaV04wYjNJZ0tTQS9DZ2tKQ1FsamIyNWtaVzV6WlNnZ1pXeGxiWE1zSUhCeVpVMWhjQ3dnY0hKbFJtbHNkR1Z5TENCamIyNTBaWGgwTENCNGJXd2dLU0E2Q2drSkNRbGxiR1Z0Y3l3S0Nna0pDVzFoZEdOb1pYSlBkWFFnUFNCdFlYUmphR1Z5SUQ4S0NRa0pDUzh2SUVsbUlIZGxJR2hoZG1VZ1lTQndiM04wUm1sdVpHVnlMQ0J2Y2lCbWFXeDBaWEpsWkNCelpXVmtMQ0J2Y2lCdWIyNHRjMlZsWkNCd2IzTjBSbWxzZEdWeUlHOXlJSEJ5WldWNGFYTjBhVzVuSUhKbGMzVnNkSE1zQ2drSkNRbHdiM04wUm1sdVpHVnlJSHg4SUNnZ2MyVmxaQ0EvSUhCeVpVWnBiSFJsY2lBNklIQnlaV1Y0YVhOMGFXNW5JSHg4SUhCdmMzUkdhV3gwWlhJZ0tTQS9DZ29KQ1FrSkNTOHZJQzR1TG1sdWRHVnliV1ZrYVdGMFpTQndjbTlqWlhOemFXNW5JR2x6SUc1bFkyVnpjMkZ5ZVFvSkNRa0pDVnRkSURvS0Nna0pDUWtKTHk4Z0xpNHViM1JvWlhKM2FYTmxJSFZ6WlNCeVpYTjFiSFJ6SUdScGNtVmpkR3g1Q2drSkNRa0pjbVZ6ZFd4MGN5QTZDZ2tKQ1FsdFlYUmphR1Z5U1c0N0Nnb0pDUzh2SUVacGJtUWdjSEpwYldGeWVTQnRZWFJqYUdWekNna0phV1lnS0NCdFlYUmphR1Z5SUNrZ2V3b0pDUWx0WVhSamFHVnlLQ0J0WVhSamFHVnlTVzRzSUcxaGRHTm9aWEpQZFhRc0lHTnZiblJsZUhRc0lIaHRiQ0FwT3dvSkNYMEtDZ2tKTHk4Z1FYQndiSGtnY0c5emRFWnBiSFJsY2dvSkNXbG1JQ2dnY0c5emRFWnBiSFJsY2lBcElIc0tDUWtKZEdWdGNDQTlJR052Ym1SbGJuTmxLQ0J0WVhSamFHVnlUM1YwTENCd2IzTjBUV0Z3SUNrN0Nna0pDWEJ2YzNSR2FXeDBaWElvSUhSbGJYQXNJRnRkTENCamIyNTBaWGgwTENCNGJXd2dLVHNLQ2drSkNTOHZJRlZ1TFcxaGRHTm9JR1poYVd4cGJtY2daV3hsYldWdWRITWdZbmtnYlc5MmFXNW5JSFJvWlcwZ1ltRmpheUIwYnlCdFlYUmphR1Z5U1c0S0NRa0phU0E5SUhSbGJYQXViR1Z1WjNSb093b0pDUWwzYUdsc1pTQW9JR2t0TFNBcElIc0tDUWtKQ1dsbUlDZ2dLR1ZzWlcwZ1BTQjBaVzF3VzJsZEtTQXBJSHNLQ1FrSkNRbHRZWFJqYUdWeVQzVjBXeUJ3YjNOMFRXRndXMmxkSUYwZ1BTQWhLRzFoZEdOb1pYSkpibHNnY0c5emRFMWhjRnRwWFNCZElEMGdaV3hsYlNrN0Nna0pDUWw5Q2drSkNYMEtDUWw5Q2dvSkNXbG1JQ2dnYzJWbFpDQXBJSHNLQ1FrSmFXWWdLQ0J3YjNOMFJtbHVaR1Z5SUh4OElIQnlaVVpwYkhSbGNpQXBJSHNLQ1FrSkNXbG1JQ2dnY0c5emRFWnBibVJsY2lBcElIc0tDUWtKQ1Frdkx5QkhaWFFnZEdobElHWnBibUZzSUcxaGRHTm9aWEpQZFhRZ1lua2dZMjl1WkdWdWMybHVaeUIwYUdseklHbHVkR1Z5YldWa2FXRjBaU0JwYm5SdklIQnZjM1JHYVc1a1pYSWdZMjl1ZEdWNGRITUtDUWtKQ1FsMFpXMXdJRDBnVzEwN0Nna0pDUWtKYVNBOUlHMWhkR05vWlhKUGRYUXViR1Z1WjNSb093b0pDUWtKQ1hkb2FXeGxJQ2dnYVMwdElDa2dld29KQ1FrSkNRbHBaaUFvSUNobGJHVnRJRDBnYldGMFkyaGxjazkxZEZ0cFhTa2dLU0I3Q2drSkNRa0pDUWt2THlCU1pYTjBiM0psSUcxaGRHTm9aWEpKYmlCemFXNWpaU0JsYkdWdElHbHpJRzV2ZENCNVpYUWdZU0JtYVc1aGJDQnRZWFJqYUFvSkNRa0pDUWtKZEdWdGNDNXdkWE5vS0NBb2JXRjBZMmhsY2tsdVcybGRJRDBnWld4bGJTa2dLVHNLQ1FrSkNRa0pmUW9KQ1FrSkNYMEtDUWtKQ1Fsd2IzTjBSbWx1WkdWeUtDQnVkV3hzTENBb2JXRjBZMmhsY2s5MWRDQTlJRnRkS1N3Z2RHVnRjQ3dnZUcxc0lDazdDZ2tKQ1FsOUNnb0pDUWtKTHk4Z1RXOTJaU0J0WVhSamFHVmtJR1ZzWlcxbGJuUnpJR1p5YjIwZ2MyVmxaQ0IwYnlCeVpYTjFiSFJ6SUhSdklHdGxaWEFnZEdobGJTQnplVzVqYUhKdmJtbDZaV1FLQ1FrSkNXa2dQU0J0WVhSamFHVnlUM1YwTG14bGJtZDBhRHNLQ1FrSkNYZG9hV3hsSUNnZ2FTMHRJQ2tnZXdvSkNRa0pDV2xtSUNnZ0tHVnNaVzBnUFNCdFlYUmphR1Z5VDNWMFcybGRLU0FtSmdvSkNRa0pDUWtvZEdWdGNDQTlJSEJ2YzNSR2FXNWtaWElnUHlCcGJtUmxlRTltS0NCelpXVmtMQ0JsYkdWdElDa2dPaUJ3Y21WTllYQmJhVjBwSUQ0Z0xURWdLU0I3Q2dvSkNRa0pDUWx6WldWa1czUmxiWEJkSUQwZ0lTaHlaWE4xYkhSelczUmxiWEJkSUQwZ1pXeGxiU2s3Q2drSkNRa0pmUW9KQ1FrSmZRb0pDUWw5Q2dvSkNTOHZJRUZrWkNCbGJHVnRaVzUwY3lCMGJ5QnlaWE4xYkhSekxDQjBhSEp2ZFdkb0lIQnZjM1JHYVc1a1pYSWdhV1lnWkdWbWFXNWxaQW9KQ1gwZ1pXeHpaU0I3Q2drSkNXMWhkR05vWlhKUGRYUWdQU0JqYjI1a1pXNXpaU2dLQ1FrSkNXMWhkR05vWlhKUGRYUWdQVDA5SUhKbGMzVnNkSE1nUHdvSkNRa0pDVzFoZEdOb1pYSlBkWFF1YzNCc2FXTmxLQ0J3Y21WbGVHbHpkR2x1Wnl3Z2JXRjBZMmhsY2s5MWRDNXNaVzVuZEdnZ0tTQTZDZ2tKQ1FrSmJXRjBZMmhsY2s5MWRBb0pDUWtwT3dvSkNRbHBaaUFvSUhCdmMzUkdhVzVrWlhJZ0tTQjdDZ2tKQ1Fsd2IzTjBSbWx1WkdWeUtDQnVkV3hzTENCeVpYTjFiSFJ6TENCdFlYUmphR1Z5VDNWMExDQjRiV3dnS1RzS0NRa0pmU0JsYkhObElIc0tDUWtKQ1hCMWMyZ3VZWEJ3Ykhrb0lISmxjM1ZzZEhNc0lHMWhkR05vWlhKUGRYUWdLVHNLQ1FrSmZRb0pDWDBLQ1gwcE93cDlDZ3BtZFc1amRHbHZiaUJ0WVhSamFHVnlSbkp2YlZSdmEyVnVjeWdnZEc5clpXNXpJQ2tnZXdvSmRtRnlJR05vWldOclEyOXVkR1Y0ZEN3Z2JXRjBZMmhsY2l3Z2Fpd0tDUWxzWlc0Z1BTQjBiMnRsYm5NdWJHVnVaM1JvTEFvSkNXeGxZV1JwYm1kU1pXeGhkR2wyWlNBOUlFVjRjSEl1Y21Wc1lYUnBkbVZiSUhSdmEyVnVjMXN3WFM1MGVYQmxJRjBzQ2drSmFXMXdiR2xqYVhSU1pXeGhkR2wyWlNBOUlHeGxZV1JwYm1kU1pXeGhkR2wyWlNCOGZDQkZlSEJ5TG5KbGJHRjBhWFpsV3lJZ0lsMHNDZ2tKYVNBOUlHeGxZV1JwYm1kU1pXeGhkR2wyWlNBL0lERWdPaUF3TEFvS0NRa3ZMeUJVYUdVZ1ptOTFibVJoZEdsdmJtRnNJRzFoZEdOb1pYSWdaVzV6ZFhKbGN5QjBhR0YwSUdWc1pXMWxiblJ6SUdGeVpTQnlaV0ZqYUdGaWJHVWdabkp2YlNCMGIzQXRiR1YyWld3Z1kyOXVkR1Y0ZENoektRb0pDVzFoZEdOb1EyOXVkR1Y0ZENBOUlHRmtaRU52YldKcGJtRjBiM0lvSUdaMWJtTjBhVzl1S0NCbGJHVnRJQ2tnZXdvSkNRbHlaWFIxY200Z1pXeGxiU0E5UFQwZ1kyaGxZMnREYjI1MFpYaDBPd29KQ1gwc0lHbHRjR3hwWTJsMFVtVnNZWFJwZG1Vc0lIUnlkV1VnS1N3S0NRbHRZWFJqYUVGdWVVTnZiblJsZUhRZ1BTQmhaR1JEYjIxaWFXNWhkRzl5S0NCbWRXNWpkR2x2YmlnZ1pXeGxiU0FwSUhzS0NRa0pjbVYwZFhKdUlHbHVaR1Y0VDJZb0lHTm9aV05yUTI5dWRHVjRkQ3dnWld4bGJTQXBJRDRnTFRFN0Nna0pmU3dnYVcxd2JHbGphWFJTWld4aGRHbDJaU3dnZEhKMVpTQXBMQW9KQ1cxaGRHTm9aWEp6SUQwZ1d5Qm1kVzVqZEdsdmJpZ2daV3hsYlN3Z1kyOXVkR1Y0ZEN3Z2VHMXNJQ2tnZXdvSkNRbDJZWElnY21WMElEMGdLQ0FoYkdWaFpHbHVaMUpsYkdGMGFYWmxJQ1ltSUNnZ2VHMXNJSHg4SUdOdmJuUmxlSFFnSVQwOUlHOTFkR1Z5Ylc5emRFTnZiblJsZUhRZ0tTQXBJSHg4SUNnS0NRa0pDU2hqYUdWamEwTnZiblJsZUhRZ1BTQmpiMjUwWlhoMEtTNXViMlJsVkhsd1pTQS9DZ2tKQ1FrSmJXRjBZMmhEYjI1MFpYaDBLQ0JsYkdWdExDQmpiMjUwWlhoMExDQjRiV3dnS1NBNkNna0pDUWtKYldGMFkyaEJibmxEYjI1MFpYaDBLQ0JsYkdWdExDQmpiMjUwWlhoMExDQjRiV3dnS1NBcE93b0pDUWt2THlCQmRtOXBaQ0JvWVc1bmFXNW5JRzl1ZEc4Z1pXeGxiV1Z1ZENBb2FYTnpkV1VnSXpJNU9Ta0tDUWtKWTJobFkydERiMjUwWlhoMElEMGdiblZzYkRzS0NRa0pjbVYwZFhKdUlISmxkRHNLQ1FsOUlGMDdDZ29KWm05eUlDZ2dPeUJwSUR3Z2JHVnVPeUJwS3lzZ0tTQjdDZ2tKYVdZZ0tDQW9iV0YwWTJobGNpQTlJRVY0Y0hJdWNtVnNZWFJwZG1WYklIUnZhMlZ1YzF0cFhTNTBlWEJsSUYwcElDa2dld29KQ1FsdFlYUmphR1Z5Y3lBOUlGc2dZV1JrUTI5dFltbHVZWFJ2Y2lobGJHVnRaVzUwVFdGMFkyaGxjaWdnYldGMFkyaGxjbk1nS1N3Z2JXRjBZMmhsY2lrZ1hUc0tDUWw5SUdWc2MyVWdld29KQ1FsdFlYUmphR1Z5SUQwZ1JYaHdjaTVtYVd4MFpYSmJJSFJ2YTJWdWMxdHBYUzUwZVhCbElGMHVZWEJ3Ykhrb0lHNTFiR3dzSUhSdmEyVnVjMXRwWFM1dFlYUmphR1Z6SUNrN0Nnb0pDUWt2THlCU1pYUjFjbTRnYzNCbFkybGhiQ0IxY0c5dUlITmxaV2x1WnlCaElIQnZjMmwwYVc5dVlXd2diV0YwWTJobGNnb0pDUWxwWmlBb0lHMWhkR05vWlhKYklHVjRjR0Z1Wkc4Z1hTQXBJSHNLQ1FrSkNTOHZJRVpwYm1RZ2RHaGxJRzVsZUhRZ2NtVnNZWFJwZG1VZ2IzQmxjbUYwYjNJZ0tHbG1JR0Z1ZVNrZ1ptOXlJSEJ5YjNCbGNpQm9ZVzVrYkdsdVp3b0pDUWtKYWlBOUlDc3JhVHNLQ1FrSkNXWnZjaUFvSURzZ2FpQThJR3hsYmpzZ2Fpc3JJQ2tnZXdvSkNRa0pDV2xtSUNnZ1JYaHdjaTV5Wld4aGRHbDJaVnNnZEc5clpXNXpXMnBkTG5SNWNHVWdYU0FwSUhzS0NRa0pDUWtKWW5KbFlXczdDZ2tKQ1FrSmZRb0pDUWtKZlFvSkNRa0pjbVYwZFhKdUlITmxkRTFoZEdOb1pYSW9DZ2tKQ1FrSmFTQStJREVnSmlZZ1pXeGxiV1Z1ZEUxaGRHTm9aWElvSUcxaGRHTm9aWEp6SUNrc0Nna0pDUWtKYVNBK0lERWdKaVlnZEc5VFpXeGxZM1J2Y2lnS0NRa0pDUWtKTHk4Z1NXWWdkR2hsSUhCeVpXTmxaR2x1WnlCMGIydGxiaUIzWVhNZ1lTQmtaWE5qWlc1a1lXNTBJR052YldKcGJtRjBiM0lzSUdsdWMyVnlkQ0JoYmlCcGJYQnNhV05wZENCaGJua3RaV3hsYldWdWRDQmdLbUFLQ1FrSkNRa0pkRzlyWlc1ekxuTnNhV05sS0NBd0xDQnBJQzBnTVNBcExtTnZibU5oZENoN0lIWmhiSFZsT2lCMGIydGxibk5iSUdrZ0xTQXlJRjB1ZEhsd1pTQTlQVDBnSWlBaUlEOGdJaW9pSURvZ0lpSWdmU2tLQ1FrSkNRa3BMbkpsY0d4aFkyVW9JSEowY21sdExDQWlKREVpSUNrc0Nna0pDUWtKYldGMFkyaGxjaXdLQ1FrSkNRbHBJRHdnYWlBbUppQnRZWFJqYUdWeVJuSnZiVlJ2YTJWdWN5Z2dkRzlyWlc1ekxuTnNhV05sS0NCcExDQnFJQ2tnS1N3S0NRa0pDUWxxSUR3Z2JHVnVJQ1ltSUcxaGRHTm9aWEpHY205dFZHOXJaVzV6S0NBb2RHOXJaVzV6SUQwZ2RHOXJaVzV6TG5Oc2FXTmxLQ0JxSUNrcElDa3NDZ2tKQ1FrSmFpQThJR3hsYmlBbUppQjBiMU5sYkdWamRHOXlLQ0IwYjJ0bGJuTWdLUW9KQ1FrSktUc0tDUWtKZlFvSkNRbHRZWFJqYUdWeWN5NXdkWE5vS0NCdFlYUmphR1Z5SUNrN0Nna0pmUW9KZlFvS0NYSmxkSFZ5YmlCbGJHVnRaVzUwVFdGMFkyaGxjaWdnYldGMFkyaGxjbk1nS1RzS2ZRb0tablZ1WTNScGIyNGdiV0YwWTJobGNrWnliMjFIY205MWNFMWhkR05vWlhKektDQmxiR1Z0Wlc1MFRXRjBZMmhsY25Nc0lITmxkRTFoZEdOb1pYSnpJQ2tnZXdvSmRtRnlJR0o1VTJWMElEMGdjMlYwVFdGMFkyaGxjbk11YkdWdVozUm9JRDRnTUN3S0NRbGllVVZzWlcxbGJuUWdQU0JsYkdWdFpXNTBUV0YwWTJobGNuTXViR1Z1WjNSb0lENGdNQ3dLQ1FsemRYQmxjazFoZEdOb1pYSWdQU0JtZFc1amRHbHZiaWdnYzJWbFpDd2dZMjl1ZEdWNGRDd2dlRzFzTENCeVpYTjFiSFJ6TENCdmRYUmxjbTF2YzNRZ0tTQjdDZ2tKQ1haaGNpQmxiR1Z0TENCcUxDQnRZWFJqYUdWeUxBb0pDUWtKYldGMFkyaGxaRU52ZFc1MElEMGdNQ3dLQ1FrSkNXa2dQU0FpTUNJc0Nna0pDUWwxYm0xaGRHTm9aV1FnUFNCelpXVmtJQ1ltSUZ0ZExBb0pDUWtKYzJWMFRXRjBZMmhsWkNBOUlGdGRMQW9KQ1FrSlkyOXVkR1Y0ZEVKaFkydDFjQ0E5SUc5MWRHVnliVzl6ZEVOdmJuUmxlSFFzQ2drSkNRa3ZMeUJYWlNCdGRYTjBJR0ZzZDJGNWN5Qm9ZWFpsSUdWcGRHaGxjaUJ6WldWa0lHVnNaVzFsYm5SeklHOXlJRzkxZEdWeWJXOXpkQ0JqYjI1MFpYaDBDZ2tKQ1FsbGJHVnRjeUE5SUhObFpXUWdmSHdnWW5sRmJHVnRaVzUwSUNZbUlFVjRjSEl1Wm1sdVpGc2lWRUZISWwwb0lDSXFJaXdnYjNWMFpYSnRiM04wSUNrc0Nna0pDUWt2THlCVmMyVWdhVzUwWldkbGNpQmthWEp5ZFc1eklHbG1aaUIwYUdseklHbHpJSFJvWlNCdmRYUmxjbTF2YzNRZ2JXRjBZMmhsY2dvSkNRa0paR2x5Y25WdWMxVnVhWEYxWlNBOUlDaGthWEp5ZFc1eklDczlJR052Ym5SbGVIUkNZV05yZFhBZ1BUMGdiblZzYkNBL0lERWdPaUJOWVhSb0xuSmhibVJ2YlNncElIeDhJREF1TVNrc0Nna0pDUWxzWlc0Z1BTQmxiR1Z0Y3k1c1pXNW5kR2c3Q2dvSkNRbHBaaUFvSUc5MWRHVnliVzl6ZENBcElIc0tDUWtKQ1c5MWRHVnliVzl6ZEVOdmJuUmxlSFFnUFNCamIyNTBaWGgwSUQwOVBTQmtiMk4xYldWdWRDQjhmQ0JqYjI1MFpYaDBJSHg4SUc5MWRHVnliVzl6ZERzS0NRa0pmUW9LQ1FrSkx5OGdRV1JrSUdWc1pXMWxiblJ6SUhCaGMzTnBibWNnWld4bGJXVnVkRTFoZEdOb1pYSnpJR1JwY21WamRHeDVJSFJ2SUhKbGMzVnNkSE1LQ1FrSkx5OGdVM1Z3Y0c5eWREb2dTVVU4T1N3Z1UyRm1ZWEpwQ2drSkNTOHZJRlJ2YkdWeVlYUmxJRTV2WkdWTWFYTjBJSEJ5YjNCbGNuUnBaWE1nS0VsRk9pQWliR1Z1WjNSb0lqc2dVMkZtWVhKcE9pQThiblZ0WW1WeVBpa2diV0YwWTJocGJtY2daV3hsYldWdWRITWdZbmtnYVdRS0NRa0pabTl5SUNnZ095QnBJQ0U5UFNCc1pXNGdKaVlnS0dWc1pXMGdQU0JsYkdWdGMxdHBYU2tnSVQwZ2JuVnNiRHNnYVNzcklDa2dld29KQ1FrSmFXWWdLQ0JpZVVWc1pXMWxiblFnSmlZZ1pXeGxiU0FwSUhzS0NRa0pDUWxxSUQwZ01Ec0tDUWtKQ1FscFppQW9JQ0ZqYjI1MFpYaDBJQ1ltSUdWc1pXMHViM2R1WlhKRWIyTjFiV1Z1ZENBaFBUMGdaRzlqZFcxbGJuUWdLU0I3Q2drSkNRa0pDWE5sZEVSdlkzVnRaVzUwS0NCbGJHVnRJQ2s3Q2drSkNRa0pDWGh0YkNBOUlDRmtiMk4xYldWdWRFbHpTRlJOVERzS0NRa0pDUWw5Q2drSkNRa0pkMmhwYkdVZ0tDQW9iV0YwWTJobGNpQTlJR1ZzWlcxbGJuUk5ZWFJqYUdWeWMxdHFLeXRkS1NBcElIc0tDUWtKQ1FrSmFXWWdLQ0J0WVhSamFHVnlLQ0JsYkdWdExDQmpiMjUwWlhoMElIeDhJR1J2WTNWdFpXNTBMQ0I0Yld3cElDa2dld29KQ1FrSkNRa0pjbVZ6ZFd4MGN5NXdkWE5vS0NCbGJHVnRJQ2s3Q2drSkNRa0pDUWxpY21WaGF6c0tDUWtKQ1FrSmZRb0pDUWtKQ1gwS0NRa0pDUWxwWmlBb0lHOTFkR1Z5Ylc5emRDQXBJSHNLQ1FrSkNRa0paR2x5Y25WdWN5QTlJR1JwY25KMWJuTlZibWx4ZFdVN0Nna0pDUWtKZlFvSkNRa0pmUW9LQ1FrSkNTOHZJRlJ5WVdOcklIVnViV0YwWTJobFpDQmxiR1Z0Wlc1MGN5Qm1iM0lnYzJWMElHWnBiSFJsY25NS0NRa0pDV2xtSUNnZ1lubFRaWFFnS1NCN0Nna0pDUWtKTHk4Z1ZHaGxlU0IzYVd4c0lHaGhkbVVnWjI5dVpTQjBhSEp2ZFdkb0lHRnNiQ0J3YjNOemFXSnNaU0J0WVhSamFHVnljd29KQ1FrSkNXbG1JQ2dnS0dWc1pXMGdQU0FoYldGMFkyaGxjaUFtSmlCbGJHVnRLU0FwSUhzS0NRa0pDUWtKYldGMFkyaGxaRU52ZFc1MExTMDdDZ2tKQ1FrSmZRb0tDUWtKQ1Frdkx5Qk1aVzVuZEdobGJpQjBhR1VnWVhKeVlYa2dabTl5SUdWMlpYSjVJR1ZzWlcxbGJuUXNJRzFoZEdOb1pXUWdiM0lnYm05MENna0pDUWtKYVdZZ0tDQnpaV1ZrSUNrZ2V3b0pDUWtKQ1FsMWJtMWhkR05vWldRdWNIVnphQ2dnWld4bGJTQXBPd29KQ1FrSkNYMEtDUWtKQ1gwS0NRa0pmUW9LQ1FrSkx5OGdZR2xnSUdseklHNXZkeUIwYUdVZ1kyOTFiblFnYjJZZ1pXeGxiV1Z1ZEhNZ2RtbHphWFJsWkNCaFltOTJaU3dnWVc1a0lHRmtaR2x1WnlCcGRDQjBieUJnYldGMFkyaGxaRU52ZFc1MFlBb0pDUWt2THlCdFlXdGxjeUIwYUdVZ2JHRjBkR1Z5SUc1dmJtNWxaMkYwYVhabExnb0pDUWx0WVhSamFHVmtRMjkxYm5RZ0t6MGdhVHNLQ2drSkNTOHZJRUZ3Y0d4NUlITmxkQ0JtYVd4MFpYSnpJSFJ2SUhWdWJXRjBZMmhsWkNCbGJHVnRaVzUwY3dvSkNRa3ZMeUJPVDFSRk9pQlVhR2x6SUdOaGJpQmlaU0J6YTJsd2NHVmtJR2xtSUhSb1pYSmxJR0Z5WlNCdWJ5QjFibTFoZEdOb1pXUWdaV3hsYldWdWRITWdLR2t1WlM0c0lHQnRZWFJqYUdWa1EyOTFiblJnQ2drSkNTOHZJR1Z4ZFdGc2N5QmdhV0FwTENCMWJteGxjM01nZDJVZ1pHbGtiaWQwSUhacGMybDBJRjloYm5sZklHVnNaVzFsYm5SeklHbHVJSFJvWlNCaFltOTJaU0JzYjI5d0lHSmxZMkYxYzJVZ2QyVWdhR0YyWlFvSkNRa3ZMeUJ1YnlCbGJHVnRaVzUwSUcxaGRHTm9aWEp6SUdGdVpDQnVieUJ6WldWa0xnb0pDUWt2THlCSmJtTnlaVzFsYm5ScGJtY2dZVzRnYVc1cGRHbGhiR3g1TFhOMGNtbHVaeUFpTUNJZ1lHbGdJR0ZzYkc5M2N5QmdhV0FnZEc4Z2NtVnRZV2x1SUdFZ2MzUnlhVzVuSUc5dWJIa2dhVzRnZEdoaGRBb0pDUWt2THlCallYTmxMQ0IzYUdsamFDQjNhV3hzSUhKbGMzVnNkQ0JwYmlCaElDSXdNQ0lnWUcxaGRHTm9aV1JEYjNWdWRHQWdkR2hoZENCa2FXWm1aWEp6SUdaeWIyMGdZR2xnSUdKMWRDQnBjeUJoYkhOdkNna0pDUzh2SUc1MWJXVnlhV05oYkd4NUlIcGxjbTh1Q2drSkNXbG1JQ2dnWW5sVFpYUWdKaVlnYVNBaFBUMGdiV0YwWTJobFpFTnZkVzUwSUNrZ2V3b0pDUWtKYWlBOUlEQTdDZ2tKQ1FsM2FHbHNaU0FvSUNodFlYUmphR1Z5SUQwZ2MyVjBUV0YwWTJobGNuTmJhaXNyWFNrZ0tTQjdDZ2tKQ1FrSmJXRjBZMmhsY2lnZ2RXNXRZWFJqYUdWa0xDQnpaWFJOWVhSamFHVmtMQ0JqYjI1MFpYaDBMQ0I0Yld3Z0tUc0tDUWtKQ1gwS0Nna0pDUWxwWmlBb0lITmxaV1FnS1NCN0Nna0pDUWtKTHk4Z1VtVnBiblJsWjNKaGRHVWdaV3hsYldWdWRDQnRZWFJqYUdWeklIUnZJR1ZzYVcxcGJtRjBaU0IwYUdVZ2JtVmxaQ0JtYjNJZ2MyOXlkR2x1WndvSkNRa0pDV2xtSUNnZ2JXRjBZMmhsWkVOdmRXNTBJRDRnTUNBcElIc0tDUWtKQ1FrSmQyaHBiR1VnS0NCcExTMGdLU0I3Q2drSkNRa0pDUWxwWmlBb0lDRW9kVzV0WVhSamFHVmtXMmxkSUh4OElITmxkRTFoZEdOb1pXUmJhVjBwSUNrZ2V3b0pDUWtKQ1FrSkNYTmxkRTFoZEdOb1pXUmJhVjBnUFNCd2IzQXVZMkZzYkNnZ2NtVnpkV3gwY3lBcE93b0pDUWtKQ1FrSmZRb0pDUWtKQ1FsOUNna0pDUWtKZlFvS0NRa0pDUWt2THlCRWFYTmpZWEprSUdsdVpHVjRJSEJzWVdObGFHOXNaR1Z5SUhaaGJIVmxjeUIwYnlCblpYUWdiMjVzZVNCaFkzUjFZV3dnYldGMFkyaGxjd29KQ1FrSkNYTmxkRTFoZEdOb1pXUWdQU0JqYjI1a1pXNXpaU2dnYzJWMFRXRjBZMmhsWkNBcE93b0pDUWtKZlFvS0NRa0pDUzh2SUVGa1pDQnRZWFJqYUdWeklIUnZJSEpsYzNWc2RITUtDUWtKQ1hCMWMyZ3VZWEJ3Ykhrb0lISmxjM1ZzZEhNc0lITmxkRTFoZEdOb1pXUWdLVHNLQ2drSkNRa3ZMeUJUWldWa2JHVnpjeUJ6WlhRZ2JXRjBZMmhsY3lCemRXTmpaV1ZrYVc1bklHMTFiSFJwY0d4bElITjFZMk5sYzNObWRXd2diV0YwWTJobGNuTWdjM1JwY0hWc1lYUmxJSE52Y25ScGJtY0tDUWtKQ1dsbUlDZ2diM1YwWlhKdGIzTjBJQ1ltSUNGelpXVmtJQ1ltSUhObGRFMWhkR05vWldRdWJHVnVaM1JvSUQ0Z01DQW1KZ29KQ1FrSkNTZ2diV0YwWTJobFpFTnZkVzUwSUNzZ2MyVjBUV0YwWTJobGNuTXViR1Z1WjNSb0lDa2dQaUF4SUNrZ2V3b0tDUWtKQ1FsVGFYcDZiR1V1ZFc1cGNYVmxVMjl5ZENnZ2NtVnpkV3gwY3lBcE93b0pDUWtKZlFvSkNRbDlDZ29KQ1Frdkx5QlBkbVZ5Y21sa1pTQnRZVzVwY0hWc1lYUnBiMjRnYjJZZ1oyeHZZbUZzY3lCaWVTQnVaWE4wWldRZ2JXRjBZMmhsY25NS0NRa0phV1lnS0NCdmRYUmxjbTF2YzNRZ0tTQjdDZ2tKQ1Fsa2FYSnlkVzV6SUQwZ1pHbHljblZ1YzFWdWFYRjFaVHNLQ1FrSkNXOTFkR1Z5Ylc5emRFTnZiblJsZUhRZ1BTQmpiMjUwWlhoMFFtRmphM1Z3T3dvSkNRbDlDZ29KQ1FseVpYUjFjbTRnZFc1dFlYUmphR1ZrT3dvSkNYMDdDZ29KY21WMGRYSnVJR0o1VTJWMElEOEtDUWx0WVhKclJuVnVZM1JwYjI0b0lITjFjR1Z5VFdGMFkyaGxjaUFwSURvS0NRbHpkWEJsY2sxaGRHTm9aWEk3Q24wS0NtTnZiWEJwYkdVZ1BTQlRhWHA2YkdVdVkyOXRjR2xzWlNBOUlHWjFibU4wYVc5dUtDQnpaV3hsWTNSdmNpd2diV0YwWTJnZ0x5b2dTVzUwWlhKdVlXd2dWWE5sSUU5dWJIa2dLaThnS1NCN0NnbDJZWElnYVN3S0NRbHpaWFJOWVhSamFHVnljeUE5SUZ0ZExBb0pDV1ZzWlcxbGJuUk5ZWFJqYUdWeWN5QTlJRnRkTEFvSkNXTmhZMmhsWkNBOUlHTnZiWEJwYkdWeVEyRmphR1ZiSUhObGJHVmpkRzl5SUNzZ0lpQWlJRjA3Q2dvSmFXWWdLQ0FoWTJGamFHVmtJQ2tnZXdvSkNTOHZJRWRsYm1WeVlYUmxJR0VnWm5WdVkzUnBiMjRnYjJZZ2NtVmpkWEp6YVhabElHWjFibU4wYVc5dWN5QjBhR0YwSUdOaGJpQmlaU0IxYzJWa0lIUnZJR05vWldOcklHVmhZMmdnWld4bGJXVnVkQW9KQ1dsbUlDZ2dJVzFoZEdOb0lDa2dld29KQ1FsdFlYUmphQ0E5SUhSdmEyVnVhWHBsS0NCelpXeGxZM1J2Y2lBcE93b0pDWDBLQ1FscElEMGdiV0YwWTJndWJHVnVaM1JvT3dvSkNYZG9hV3hsSUNnZ2FTMHRJQ2tnZXdvSkNRbGpZV05vWldRZ1BTQnRZWFJqYUdWeVJuSnZiVlJ2YTJWdWN5Z2diV0YwWTJoYmFWMGdLVHNLQ1FrSmFXWWdLQ0JqWVdOb1pXUmJJR1Y0Y0dGdVpHOGdYU0FwSUhzS0NRa0pDWE5sZEUxaGRHTm9aWEp6TG5CMWMyZ29JR05oWTJobFpDQXBPd29KQ1FsOUlHVnNjMlVnZXdvSkNRa0paV3hsYldWdWRFMWhkR05vWlhKekxuQjFjMmdvSUdOaFkyaGxaQ0FwT3dvSkNRbDlDZ2tKZlFvS0NRa3ZMeUJEWVdOb1pTQjBhR1VnWTI5dGNHbHNaV1FnWm5WdVkzUnBiMjRLQ1FsallXTm9aV1FnUFNCamIyMXdhV3hsY2tOaFkyaGxLQ0J6Wld4bFkzUnZjaXdnYldGMFkyaGxja1p5YjIxSGNtOTFjRTFoZEdOb1pYSnpLQ0JsYkdWdFpXNTBUV0YwWTJobGNuTXNJSE5sZEUxaGRHTm9aWEp6SUNrZ0tUc0tDZ2tKTHk4Z1UyRjJaU0J6Wld4bFkzUnZjaUJoYm1RZ2RHOXJaVzVwZW1GMGFXOXVDZ2tKWTJGamFHVmtMbk5sYkdWamRHOXlJRDBnYzJWc1pXTjBiM0k3Q2dsOUNnbHlaWFIxY200Z1kyRmphR1ZrT3dwOU93b0tMeW9xQ2lBcUlFRWdiRzkzTFd4bGRtVnNJSE5sYkdWamRHbHZiaUJtZFc1amRHbHZiaUIwYUdGMElIZHZjbXR6SUhkcGRHZ2dVMmw2ZW14bEozTWdZMjl0Y0dsc1pXUUtJQ29nSUhObGJHVmpkRzl5SUdaMWJtTjBhVzl1Y3dvZ0tpQkFjR0Z5WVcwZ2UxTjBjbWx1WjN4R2RXNWpkR2x2Ym4wZ2MyVnNaV04wYjNJZ1FTQnpaV3hsWTNSdmNpQnZjaUJoSUhCeVpTMWpiMjF3YVd4bFpBb2dLaUFnYzJWc1pXTjBiM0lnWm5WdVkzUnBiMjRnWW5WcGJIUWdkMmwwYUNCVGFYcDZiR1V1WTI5dGNHbHNaUW9nS2lCQWNHRnlZVzBnZTBWc1pXMWxiblI5SUdOdmJuUmxlSFFLSUNvZ1FIQmhjbUZ0SUh0QmNuSmhlWDBnVzNKbGMzVnNkSE5kQ2lBcUlFQndZWEpoYlNCN1FYSnlZWGw5SUZ0elpXVmtYU0JCSUhObGRDQnZaaUJsYkdWdFpXNTBjeUIwYnlCdFlYUmphQ0JoWjJGcGJuTjBDaUFxTHdwelpXeGxZM1FnUFNCVGFYcDZiR1V1YzJWc1pXTjBJRDBnWm5WdVkzUnBiMjRvSUhObGJHVmpkRzl5TENCamIyNTBaWGgwTENCeVpYTjFiSFJ6TENCelpXVmtJQ2tnZXdvSmRtRnlJR2tzSUhSdmEyVnVjeXdnZEc5clpXNHNJSFI1Y0dVc0lHWnBibVFzQ2drSlkyOXRjR2xzWldRZ1BTQjBlWEJsYjJZZ2MyVnNaV04wYjNJZ1BUMDlJQ0ptZFc1amRHbHZiaUlnSmlZZ2MyVnNaV04wYjNJc0Nna0piV0YwWTJnZ1BTQWhjMlZsWkNBbUppQjBiMnRsYm1sNlpTZ2dLSE5sYkdWamRHOXlJRDBnWTI5dGNHbHNaV1F1YzJWc1pXTjBiM0lnZkh3Z2MyVnNaV04wYjNJcElDazdDZ29KY21WemRXeDBjeUE5SUhKbGMzVnNkSE1nZkh3Z1cxMDdDZ29KTHk4Z1ZISjVJSFJ2SUcxcGJtbHRhWHBsSUc5d1pYSmhkR2x2Ym5NZ2FXWWdkR2hsY21VZ2FYTWdiMjVzZVNCdmJtVWdjMlZzWldOMGIzSWdhVzRnZEdobElHeHBjM1FnWVc1a0lHNXZJSE5sWldRS0NTOHZJQ2gwYUdVZ2JHRjBkR1Z5SUc5bUlIZG9hV05vSUdkMVlYSmhiblJsWlhNZ2RYTWdZMjl1ZEdWNGRDa0tDV2xtSUNnZ2JXRjBZMmd1YkdWdVozUm9JRDA5UFNBeElDa2dld29LQ1Frdkx5QlNaV1IxWTJVZ1kyOXVkR1Y0ZENCcFppQjBhR1VnYkdWaFpHbHVaeUJqYjIxd2IzVnVaQ0J6Wld4bFkzUnZjaUJwY3lCaGJpQkpSQW9KQ1hSdmEyVnVjeUE5SUcxaGRHTm9XekJkSUQwZ2JXRjBZMmhiTUYwdWMyeHBZMlVvSURBZ0tUc0tDUWxwWmlBb0lIUnZhMlZ1Y3k1c1pXNW5kR2dnUGlBeUlDWW1JQ2gwYjJ0bGJpQTlJSFJ2YTJWdWMxc3dYU2t1ZEhsd1pTQTlQVDBnSWtsRUlpQW1KZ29KQ1FrSlkyOXVkR1Y0ZEM1dWIyUmxWSGx3WlNBOVBUMGdPU0FtSmlCa2IyTjFiV1Z1ZEVselNGUk5UQ0FtSmlCRmVIQnlMbkpsYkdGMGFYWmxXeUIwYjJ0bGJuTmJNVjB1ZEhsd1pTQmRJQ2tnZXdvS0NRa0pZMjl1ZEdWNGRDQTlJQ2dnUlhod2NpNW1hVzVrV3lKSlJDSmRLQ0IwYjJ0bGJpNXRZWFJqYUdWeld6QmRMbkpsY0d4aFkyVW9jblZ1WlhOallYQmxMQ0JtZFc1bGMyTmhjR1VwTENCamIyNTBaWGgwSUNrZ2ZId2dXMTBnS1Zzd1hUc0tDUWtKYVdZZ0tDQWhZMjl1ZEdWNGRDQXBJSHNLQ1FrSkNYSmxkSFZ5YmlCeVpYTjFiSFJ6T3dvS0NRa0pMeThnVUhKbFkyOXRjR2xzWldRZ2JXRjBZMmhsY25NZ2QybHNiQ0J6ZEdsc2JDQjJaWEpwWm5rZ1lXNWpaWE4wY25rc0lITnZJSE4wWlhBZ2RYQWdZU0JzWlhabGJBb0pDUWw5SUdWc2MyVWdhV1lnS0NCamIyMXdhV3hsWkNBcElIc0tDUWtKQ1dOdmJuUmxlSFFnUFNCamIyNTBaWGgwTG5CaGNtVnVkRTV2WkdVN0Nna0pDWDBLQ2drSkNYTmxiR1ZqZEc5eUlEMGdjMlZzWldOMGIzSXVjMnhwWTJVb0lIUnZhMlZ1Y3k1emFHbG1kQ2dwTG5aaGJIVmxMbXhsYm1kMGFDQXBPd29KQ1gwS0Nna0pMeThnUm1WMFkyZ2dZU0J6WldWa0lITmxkQ0JtYjNJZ2NtbG5hSFF0ZEc4dGJHVm1kQ0J0WVhSamFHbHVad29KQ1drZ1BTQnRZWFJqYUVWNGNISmJJbTVsWldSelEyOXVkR1Y0ZENKZExuUmxjM1FvSUhObGJHVmpkRzl5SUNrZ1B5QXdJRG9nZEc5clpXNXpMbXhsYm1kMGFEc0tDUWwzYUdsc1pTQW9JR2t0TFNBcElIc0tDUWtKZEc5clpXNGdQU0IwYjJ0bGJuTmJhVjA3Q2dvSkNRa3ZMeUJCWW05eWRDQnBaaUIzWlNCb2FYUWdZU0JqYjIxaWFXNWhkRzl5Q2drSkNXbG1JQ2dnUlhod2NpNXlaV3hoZEdsMlpWc2dLSFI1Y0dVZ1BTQjBiMnRsYmk1MGVYQmxLU0JkSUNrZ2V3b0pDUWtKWW5KbFlXczdDZ2tKQ1gwS0NRa0phV1lnS0NBb1ptbHVaQ0E5SUVWNGNISXVabWx1WkZzZ2RIbHdaU0JkS1NBcElIc0tDUWtKQ1M4dklGTmxZWEpqYUN3Z1pYaHdZVzVrYVc1bklHTnZiblJsZUhRZ1ptOXlJR3hsWVdScGJtY2djMmxpYkdsdVp5QmpiMjFpYVc1aGRHOXljd29KQ1FrSmFXWWdLQ0FvYzJWbFpDQTlJR1pwYm1Rb0Nna0pDUWtKZEc5clpXNHViV0YwWTJobGMxc3dYUzV5WlhCc1lXTmxLQ0J5ZFc1bGMyTmhjR1VzSUdaMWJtVnpZMkZ3WlNBcExBb0pDUWtKQ1hKemFXSnNhVzVuTG5SbGMzUW9JSFJ2YTJWdWMxc3dYUzUwZVhCbElDa2dKaVlnZEdWemRFTnZiblJsZUhRb0lHTnZiblJsZUhRdWNHRnlaVzUwVG05a1pTQXBJSHg4SUdOdmJuUmxlSFFLQ1FrSkNTa3BJQ2tnZXdvS0NRa0pDUWt2THlCSlppQnpaV1ZrSUdseklHVnRjSFI1SUc5eUlHNXZJSFJ2YTJWdWN5QnlaVzFoYVc0c0lIZGxJR05oYmlCeVpYUjFjbTRnWldGeWJIa0tDUWtKQ1FsMGIydGxibk11YzNCc2FXTmxLQ0JwTENBeElDazdDZ2tKQ1FrSmMyVnNaV04wYjNJZ1BTQnpaV1ZrTG14bGJtZDBhQ0FtSmlCMGIxTmxiR1ZqZEc5eUtDQjBiMnRsYm5NZ0tUc0tDUWtKQ1FscFppQW9JQ0Z6Wld4bFkzUnZjaUFwSUhzS0NRa0pDUWtKY0hWemFDNWhjSEJzZVNnZ2NtVnpkV3gwY3l3Z2MyVmxaQ0FwT3dvSkNRa0pDUWx5WlhSMWNtNGdjbVZ6ZFd4MGN6c0tDUWtKQ1FsOUNnb0pDUWtKQ1dKeVpXRnJPd29KQ1FrSmZRb0pDUWw5Q2drSmZRb0pmUW9LQ1M4dklFTnZiWEJwYkdVZ1lXNWtJR1Y0WldOMWRHVWdZU0JtYVd4MFpYSnBibWNnWm5WdVkzUnBiMjRnYVdZZ2IyNWxJR2x6SUc1dmRDQndjbTkyYVdSbFpBb0pMeThnVUhKdmRtbGtaU0JnYldGMFkyaGdJSFJ2SUdGMmIybGtJSEpsZEc5clpXNXBlbUYwYVc5dUlHbG1JSGRsSUcxdlpHbG1hV1ZrSUhSb1pTQnpaV3hsWTNSdmNpQmhZbTkyWlFvSktDQmpiMjF3YVd4bFpDQjhmQ0JqYjIxd2FXeGxLQ0J6Wld4bFkzUnZjaXdnYldGMFkyZ2dLU0FwS0FvSkNYTmxaV1FzQ2drSlkyOXVkR1Y0ZEN3S0NRa2haRzlqZFcxbGJuUkpjMGhVVFV3c0Nna0pjbVZ6ZFd4MGN5d0tDUWtoWTI5dWRHVjRkQ0I4ZkNCeWMybGliR2x1Wnk1MFpYTjBLQ0J6Wld4bFkzUnZjaUFwSUNZbUlIUmxjM1JEYjI1MFpYaDBLQ0JqYjI1MFpYaDBMbkJoY21WdWRFNXZaR1VnS1NCOGZDQmpiMjUwWlhoMENna3BPd29KY21WMGRYSnVJSEpsYzNWc2RITTdDbjA3Q2dvdkx5QlBibVV0ZEdsdFpTQmhjM05wWjI1dFpXNTBjd29LTHk4Z1UyOXlkQ0J6ZEdGaWFXeHBkSGtLYzNWd2NHOXlkQzV6YjNKMFUzUmhZbXhsSUQwZ1pYaHdZVzVrYnk1emNHeHBkQ2dpSWlrdWMyOXlkQ2dnYzI5eWRFOXlaR1Z5SUNrdWFtOXBiaWdpSWlrZ1BUMDlJR1Y0Y0dGdVpHODdDZ292THlCVGRYQndiM0owT2lCRGFISnZiV1VnTVRRdE16VXJDaTh2SUVGc2QyRjVjeUJoYzNOMWJXVWdaSFZ3YkdsallYUmxjeUJwWmlCMGFHVjVJR0Z5Wlc0bmRDQndZWE56WldRZ2RHOGdkR2hsSUdOdmJYQmhjbWx6YjI0Z1puVnVZM1JwYjI0S2MzVndjRzl5ZEM1a1pYUmxZM1JFZFhCc2FXTmhkR1Z6SUQwZ0lTRm9ZWE5FZFhCc2FXTmhkR1U3Q2dvdkx5QkpibWwwYVdGc2FYcGxJR0ZuWVdsdWMzUWdkR2hsSUdSbFptRjFiSFFnWkc5amRXMWxiblFLYzJWMFJHOWpkVzFsYm5Rb0tUc0tDaTh2SUZOMWNIQnZjblE2SUZkbFltdHBkRHcxTXpjdU16SWdMU0JUWVdaaGNta2dOaTR3TGpNdlEyaHliMjFsSURJMUlDaG1hWGhsWkNCcGJpQkRhSEp2YldVZ01qY3BDaTh2SUVSbGRHRmphR1ZrSUc1dlpHVnpJR052Ym1admRXNWthVzVuYkhrZ1ptOXNiRzkzSUNwbFlXTm9JRzkwYUdWeUtncHpkWEJ3YjNKMExuTnZjblJFWlhSaFkyaGxaQ0E5SUdGemMyVnlkQ2htZFc1amRHbHZiaWdnWld3Z0tTQjdDZ2t2THlCVGFHOTFiR1FnY21WMGRYSnVJREVzSUdKMWRDQnlaWFIxY201eklEUWdLR1p2Ykd4dmQybHVaeWtLQ1hKbGRIVnliaUJsYkM1amIyMXdZWEpsUkc5amRXMWxiblJRYjNOcGRHbHZiaWdnWkc5amRXMWxiblF1WTNKbFlYUmxSV3hsYldWdWRDZ2labWxsYkdSelpYUWlLU0FwSUNZZ01Uc0tmU2s3Q2dvdkx5QlRkWEJ3YjNKME9pQkpSVHc0Q2k4dklGQnlaWFpsYm5RZ1lYUjBjbWxpZFhSbEwzQnliM0JsY25SNUlDSnBiblJsY25CdmJHRjBhVzl1SWdvdkx5Qm9kSFJ3Y3pvdkwyMXpaRzR1YldsamNtOXpiMlowTG1OdmJTOWxiaTExY3k5c2FXSnlZWEo1TDIxek5UTTJOREk1SlRJNFZsTXVPRFVsTWprdVlYTndlQXBwWmlBb0lDRmhjM05sY25Rb1puVnVZM1JwYjI0b0lHVnNJQ2tnZXdvSlpXd3VhVzV1WlhKSVZFMU1JRDBnSWp4aElHaHlaV1k5SnlNblBqd3ZZVDRpT3dvSmNtVjBkWEp1SUdWc0xtWnBjbk4wUTJocGJHUXVaMlYwUVhSMGNtbGlkWFJsS0NKb2NtVm1JaWtnUFQwOUlDSWpJaUE3Q24wcElDa2dld29KWVdSa1NHRnVaR3hsS0NBaWRIbHdaWHhvY21WbWZHaGxhV2RvZEh4M2FXUjBhQ0lzSUdaMWJtTjBhVzl1S0NCbGJHVnRMQ0J1WVcxbExDQnBjMWhOVENBcElIc0tDUWxwWmlBb0lDRnBjMWhOVENBcElIc0tDUWtKY21WMGRYSnVJR1ZzWlcwdVoyVjBRWFIwY21saWRYUmxLQ0J1WVcxbExDQnVZVzFsTG5SdlRHOTNaWEpEWVhObEtDa2dQVDA5SUNKMGVYQmxJaUEvSURFZ09pQXlJQ2s3Q2drSmZRb0pmU2s3Q24wS0NpOHZJRk4xY0hCdmNuUTZJRWxGUERrS0x5OGdWWE5sSUdSbFptRjFiSFJXWVd4MVpTQnBiaUJ3YkdGalpTQnZaaUJuWlhSQmRIUnlhV0oxZEdVb0luWmhiSFZsSWlrS2FXWWdLQ0FoYzNWd2NHOXlkQzVoZEhSeWFXSjFkR1Z6SUh4OElDRmhjM05sY25Rb1puVnVZM1JwYjI0b0lHVnNJQ2tnZXdvSlpXd3VhVzV1WlhKSVZFMU1JRDBnSWp4cGJuQjFkQzgrSWpzS0NXVnNMbVpwY25OMFEyaHBiR1F1YzJWMFFYUjBjbWxpZFhSbEtDQWlkbUZzZFdVaUxDQWlJaUFwT3dvSmNtVjBkWEp1SUdWc0xtWnBjbk4wUTJocGJHUXVaMlYwUVhSMGNtbGlkWFJsS0NBaWRtRnNkV1VpSUNrZ1BUMDlJQ0lpT3dwOUtTQXBJSHNLQ1dGa1pFaGhibVJzWlNnZ0luWmhiSFZsSWl3Z1puVnVZM1JwYjI0b0lHVnNaVzBzSUc1aGJXVXNJR2x6V0UxTUlDa2dld29KQ1dsbUlDZ2dJV2x6V0UxTUlDWW1JR1ZzWlcwdWJtOWtaVTVoYldVdWRHOU1iM2RsY2tOaGMyVW9LU0E5UFQwZ0ltbHVjSFYwSWlBcElIc0tDUWtKY21WMGRYSnVJR1ZzWlcwdVpHVm1ZWFZzZEZaaGJIVmxPd29KQ1gwS0NYMHBPd3A5Q2dvdkx5QlRkWEJ3YjNKME9pQkpSVHc1Q2k4dklGVnpaU0JuWlhSQmRIUnlhV0oxZEdWT2IyUmxJSFJ2SUdabGRHTm9JR0p2YjJ4bFlXNXpJSGRvWlc0Z1oyVjBRWFIwY21saWRYUmxJR3hwWlhNS2FXWWdLQ0FoWVhOelpYSjBLR1oxYm1OMGFXOXVLQ0JsYkNBcElIc0tDWEpsZEhWeWJpQmxiQzVuWlhSQmRIUnlhV0oxZEdVb0ltUnBjMkZpYkdWa0lpa2dQVDBnYm5Wc2JEc0tmU2tnS1NCN0NnbGhaR1JJWVc1a2JHVW9JR0p2YjJ4bFlXNXpMQ0JtZFc1amRHbHZiaWdnWld4bGJTd2dibUZ0WlN3Z2FYTllUVXdnS1NCN0Nna0pkbUZ5SUhaaGJEc0tDUWxwWmlBb0lDRnBjMWhOVENBcElIc0tDUWtKY21WMGRYSnVJR1ZzWlcxYklHNWhiV1VnWFNBOVBUMGdkSEoxWlNBL0lHNWhiV1V1ZEc5TWIzZGxja05oYzJVb0tTQTZDZ2tKQ1FrSktIWmhiQ0E5SUdWc1pXMHVaMlYwUVhSMGNtbGlkWFJsVG05a1pTZ2dibUZ0WlNBcEtTQW1KaUIyWVd3dWMzQmxZMmxtYVdWa0lEOEtDUWtKQ1FsMllXd3VkbUZzZFdVZ09nb0pDUWtKYm5Wc2JEc0tDUWw5Q2dsOUtUc0tmUW9LY21WMGRYSnVJRk5wZW5wc1pUc0tDbjBwS0NCM2FXNWtiM2NnS1RzS0Nnb0thbEYxWlhKNUxtWnBibVFnUFNCVGFYcDZiR1U3Q21wUmRXVnllUzVsZUhCeUlEMGdVMmw2ZW14bExuTmxiR1ZqZEc5eWN6c0tDaTh2SUVSbGNISmxZMkYwWldRS2FsRjFaWEo1TG1WNGNISmJJQ0k2SWlCZElEMGdhbEYxWlhKNUxtVjRjSEl1Y0hObGRXUnZjenNLYWxGMVpYSjVMblZ1YVhGMVpWTnZjblFnUFNCcVVYVmxjbmt1ZFc1cGNYVmxJRDBnVTJsNmVteGxMblZ1YVhGMVpWTnZjblE3Q21wUmRXVnllUzUwWlhoMElEMGdVMmw2ZW14bExtZGxkRlJsZUhRN0NtcFJkV1Z5ZVM1cGMxaE5URVJ2WXlBOUlGTnBlbnBzWlM1cGMxaE5URHNLYWxGMVpYSjVMbU52Ym5SaGFXNXpJRDBnVTJsNmVteGxMbU52Ym5SaGFXNXpPd3BxVVhWbGNua3VaWE5qWVhCbFUyVnNaV04wYjNJZ1BTQlRhWHA2YkdVdVpYTmpZWEJsT3dvS0Nnb0tkbUZ5SUdScGNpQTlJR1oxYm1OMGFXOXVLQ0JsYkdWdExDQmthWElzSUhWdWRHbHNJQ2tnZXdvSmRtRnlJRzFoZEdOb1pXUWdQU0JiWFN3S0NRbDBjblZ1WTJGMFpTQTlJSFZ1ZEdsc0lDRTlQU0IxYm1SbFptbHVaV1E3Q2dvSmQyaHBiR1VnS0NBb0lHVnNaVzBnUFNCbGJHVnRXeUJrYVhJZ1hTQXBJQ1ltSUdWc1pXMHVibTlrWlZSNWNHVWdJVDA5SURrZ0tTQjdDZ2tKYVdZZ0tDQmxiR1Z0TG01dlpHVlVlWEJsSUQwOVBTQXhJQ2tnZXdvSkNRbHBaaUFvSUhSeWRXNWpZWFJsSUNZbUlHcFJkV1Z5ZVNnZ1pXeGxiU0FwTG1sektDQjFiblJwYkNBcElDa2dld29KQ1FrSlluSmxZV3M3Q2drSkNYMEtDUWtKYldGMFkyaGxaQzV3ZFhOb0tDQmxiR1Z0SUNrN0Nna0pmUW9KZlFvSmNtVjBkWEp1SUcxaGRHTm9aV1E3Q24wN0Nnb0tkbUZ5SUhOcFlteHBibWR6SUQwZ1puVnVZM1JwYjI0b0lHNHNJR1ZzWlcwZ0tTQjdDZ2wyWVhJZ2JXRjBZMmhsWkNBOUlGdGRPd29LQ1dadmNpQW9JRHNnYmpzZ2JpQTlJRzR1Ym1WNGRGTnBZbXhwYm1jZ0tTQjdDZ2tKYVdZZ0tDQnVMbTV2WkdWVWVYQmxJRDA5UFNBeElDWW1JRzRnSVQwOUlHVnNaVzBnS1NCN0Nna0pDVzFoZEdOb1pXUXVjSFZ6YUNnZ2JpQXBPd29KQ1gwS0NYMEtDZ2x5WlhSMWNtNGdiV0YwWTJobFpEc0tmVHNLQ2dwMllYSWdjbTVsWldSelEyOXVkR1Y0ZENBOUlHcFJkV1Z5ZVM1bGVIQnlMbTFoZEdOb0xtNWxaV1J6UTI5dWRHVjRkRHNLQ2dvS1puVnVZM1JwYjI0Z2JtOWtaVTVoYldVb0lHVnNaVzBzSUc1aGJXVWdLU0I3Q2dvZ0lISmxkSFZ5YmlCbGJHVnRMbTV2WkdWT1lXMWxJQ1ltSUdWc1pXMHVibTlrWlU1aGJXVXVkRzlNYjNkbGNrTmhjMlVvS1NBOVBUMGdibUZ0WlM1MGIweHZkMlZ5UTJGelpTZ3BPd29LZlRzS2RtRnlJSEp6YVc1bmJHVlVZV2NnUFNBb0lDOWVQQ2hiWVMxNlhWdGVYQzljTUQ0NlhIZ3lNRngwWEhKY2JseG1YU29wVzF4NE1qQmNkRnh5WEc1Y1psMHFYQzgvUGlnL09qeGNMMXd4UG53cEpDOXBJQ2s3Q2dvS0NpOHZJRWx0Y0d4bGJXVnVkQ0IwYUdVZ2FXUmxiblJwWTJGc0lHWjFibU4wYVc5dVlXeHBkSGtnWm05eUlHWnBiSFJsY2lCaGJtUWdibTkwQ21aMWJtTjBhVzl1SUhkcGJtNXZkeWdnWld4bGJXVnVkSE1zSUhGMVlXeHBabWxsY2l3Z2JtOTBJQ2tnZXdvSmFXWWdLQ0JwYzBaMWJtTjBhVzl1S0NCeGRXRnNhV1pwWlhJZ0tTQXBJSHNLQ1FseVpYUjFjbTRnYWxGMVpYSjVMbWR5WlhBb0lHVnNaVzFsYm5SekxDQm1kVzVqZEdsdmJpZ2daV3hsYlN3Z2FTQXBJSHNLQ1FrSmNtVjBkWEp1SUNFaGNYVmhiR2xtYVdWeUxtTmhiR3dvSUdWc1pXMHNJR2tzSUdWc1pXMGdLU0FoUFQwZ2JtOTBPd29KQ1gwZ0tUc0tDWDBLQ2drdkx5QlRhVzVuYkdVZ1pXeGxiV1Z1ZEFvSmFXWWdLQ0J4ZFdGc2FXWnBaWEl1Ym05a1pWUjVjR1VnS1NCN0Nna0pjbVYwZFhKdUlHcFJkV1Z5ZVM1bmNtVndLQ0JsYkdWdFpXNTBjeXdnWm5WdVkzUnBiMjRvSUdWc1pXMGdLU0I3Q2drSkNYSmxkSFZ5YmlBb0lHVnNaVzBnUFQwOUlIRjFZV3hwWm1sbGNpQXBJQ0U5UFNCdWIzUTdDZ2tKZlNBcE93b0pmUW9LQ1M4dklFRnljbUY1YkdsclpTQnZaaUJsYkdWdFpXNTBjeUFvYWxGMVpYSjVMQ0JoY21kMWJXVnVkSE1zSUVGeWNtRjVLUW9KYVdZZ0tDQjBlWEJsYjJZZ2NYVmhiR2xtYVdWeUlDRTlQU0FpYzNSeWFXNW5JaUFwSUhzS0NRbHlaWFIxY200Z2FsRjFaWEo1TG1keVpYQW9JR1ZzWlcxbGJuUnpMQ0JtZFc1amRHbHZiaWdnWld4bGJTQXBJSHNLQ1FrSmNtVjBkWEp1SUNnZ2FXNWtaWGhQWmk1allXeHNLQ0J4ZFdGc2FXWnBaWElzSUdWc1pXMGdLU0ErSUMweElDa2dJVDA5SUc1dmREc0tDUWw5SUNrN0NnbDlDZ29KTHk4Z1JtbHNkR1Z5WldRZ1pHbHlaV04wYkhrZ1ptOXlJR0p2ZEdnZ2MybHRjR3hsSUdGdVpDQmpiMjF3YkdWNElITmxiR1ZqZEc5eWN3b0pjbVYwZFhKdUlHcFJkV1Z5ZVM1bWFXeDBaWElvSUhGMVlXeHBabWxsY2l3Z1pXeGxiV1Z1ZEhNc0lHNXZkQ0FwT3dwOUNncHFVWFZsY25rdVptbHNkR1Z5SUQwZ1puVnVZM1JwYjI0b0lHVjRjSElzSUdWc1pXMXpMQ0J1YjNRZ0tTQjdDZ2wyWVhJZ1pXeGxiU0E5SUdWc1pXMXpXeUF3SUYwN0Nnb0phV1lnS0NCdWIzUWdLU0I3Q2drSlpYaHdjaUE5SUNJNmJtOTBLQ0lnS3lCbGVIQnlJQ3NnSWlraU93b0pmUW9LQ1dsbUlDZ2daV3hsYlhNdWJHVnVaM1JvSUQwOVBTQXhJQ1ltSUdWc1pXMHVibTlrWlZSNWNHVWdQVDA5SURFZ0tTQjdDZ2tKY21WMGRYSnVJR3BSZFdWeWVTNW1hVzVrTG0xaGRHTm9aWE5UWld4bFkzUnZjaWdnWld4bGJTd2daWGh3Y2lBcElEOGdXeUJsYkdWdElGMGdPaUJiWFRzS0NYMEtDZ2x5WlhSMWNtNGdhbEYxWlhKNUxtWnBibVF1YldGMFkyaGxjeWdnWlhod2Npd2dhbEYxWlhKNUxtZHlaWEFvSUdWc1pXMXpMQ0JtZFc1amRHbHZiaWdnWld4bGJTQXBJSHNLQ1FseVpYUjFjbTRnWld4bGJTNXViMlJsVkhsd1pTQTlQVDBnTVRzS0NYMGdLU0FwT3dwOU93b0thbEYxWlhKNUxtWnVMbVY0ZEdWdVpDZ2dld29KWm1sdVpEb2dablZ1WTNScGIyNG9JSE5sYkdWamRHOXlJQ2tnZXdvSkNYWmhjaUJwTENCeVpYUXNDZ2tKQ1d4bGJpQTlJSFJvYVhNdWJHVnVaM1JvTEFvSkNRbHpaV3htSUQwZ2RHaHBjenNLQ2drSmFXWWdLQ0IwZVhCbGIyWWdjMlZzWldOMGIzSWdJVDA5SUNKemRISnBibWNpSUNrZ2V3b0pDUWx5WlhSMWNtNGdkR2hwY3k1d2RYTm9VM1JoWTJzb0lHcFJkV1Z5ZVNnZ2MyVnNaV04wYjNJZ0tTNW1hV3gwWlhJb0lHWjFibU4wYVc5dUtDa2dld29KQ1FrSlptOXlJQ2dnYVNBOUlEQTdJR2tnUENCc1pXNDdJR2tyS3lBcElIc0tDUWtKQ1FscFppQW9JR3BSZFdWeWVTNWpiMjUwWVdsdWN5Z2djMlZzWmxzZ2FTQmRMQ0IwYUdseklDa2dLU0I3Q2drSkNRa0pDWEpsZEhWeWJpQjBjblZsT3dvSkNRa0pDWDBLQ1FrSkNYMEtDUWtKZlNBcElDazdDZ2tKZlFvS0NRbHlaWFFnUFNCMGFHbHpMbkIxYzJoVGRHRmpheWdnVzEwZ0tUc0tDZ2tKWm05eUlDZ2dhU0E5SURBN0lHa2dQQ0JzWlc0N0lHa3JLeUFwSUhzS0NRa0phbEYxWlhKNUxtWnBibVFvSUhObGJHVmpkRzl5TENCelpXeG1XeUJwSUYwc0lISmxkQ0FwT3dvSkNYMEtDZ2tKY21WMGRYSnVJR3hsYmlBK0lERWdQeUJxVVhWbGNua3VkVzVwY1hWbFUyOXlkQ2dnY21WMElDa2dPaUJ5WlhRN0NnbDlMQW9KWm1sc2RHVnlPaUJtZFc1amRHbHZiaWdnYzJWc1pXTjBiM0lnS1NCN0Nna0pjbVYwZFhKdUlIUm9hWE11Y0hWemFGTjBZV05yS0NCM2FXNXViM2NvSUhSb2FYTXNJSE5sYkdWamRHOXlJSHg4SUZ0ZExDQm1ZV3h6WlNBcElDazdDZ2w5TEFvSmJtOTBPaUJtZFc1amRHbHZiaWdnYzJWc1pXTjBiM0lnS1NCN0Nna0pjbVYwZFhKdUlIUm9hWE11Y0hWemFGTjBZV05yS0NCM2FXNXViM2NvSUhSb2FYTXNJSE5sYkdWamRHOXlJSHg4SUZ0ZExDQjBjblZsSUNrZ0tUc0tDWDBzQ2dscGN6b2dablZ1WTNScGIyNG9JSE5sYkdWamRHOXlJQ2tnZXdvSkNYSmxkSFZ5YmlBaElYZHBibTV2ZHlnS0NRa0pkR2hwY3l3S0Nna0pDUzh2SUVsbUlIUm9hWE1nYVhNZ1lTQndiM05wZEdsdmJtRnNMM0psYkdGMGFYWmxJSE5sYkdWamRHOXlMQ0JqYUdWamF5QnRaVzFpWlhKemFHbHdJR2x1SUhSb1pTQnlaWFIxY201bFpDQnpaWFFLQ1FrSkx5OGdjMjhnSkNnaWNEcG1hWEp6ZENJcExtbHpLQ0p3T214aGMzUWlLU0IzYjI0bmRDQnlaWFIxY200Z2RISjFaU0JtYjNJZ1lTQmtiMk1nZDJsMGFDQjBkMjhnSW5BaUxnb0pDUWwwZVhCbGIyWWdjMlZzWldOMGIzSWdQVDA5SUNKemRISnBibWNpSUNZbUlISnVaV1ZrYzBOdmJuUmxlSFF1ZEdWemRDZ2djMlZzWldOMGIzSWdLU0EvQ2drSkNRbHFVWFZsY25rb0lITmxiR1ZqZEc5eUlDa2dPZ29KQ1FrSmMyVnNaV04wYjNJZ2ZId2dXMTBzQ2drSkNXWmhiSE5sQ2drSktTNXNaVzVuZEdnN0NnbDlDbjBnS1RzS0Nnb3ZMeUJKYm1sMGFXRnNhWHBsSUdFZ2FsRjFaWEo1SUc5aWFtVmpkQW9LQ2k4dklFRWdZMlZ1ZEhKaGJDQnlaV1psY21WdVkyVWdkRzhnZEdobElISnZiM1FnYWxGMVpYSjVLR1J2WTNWdFpXNTBLUXAyWVhJZ2NtOXZkR3BSZFdWeWVTd0tDZ2t2THlCQklITnBiWEJzWlNCM1lYa2dkRzhnWTJobFkyc2dabTl5SUVoVVRVd2djM1J5YVc1bmN3b0pMeThnVUhKcGIzSnBkR2w2WlNBamFXUWdiM1psY2lBOGRHRm5QaUIwYnlCaGRtOXBaQ0JZVTFNZ2RtbGhJR3h2WTJGMGFXOXVMbWhoYzJnZ0tDTTVOVEl4S1FvSkx5OGdVM1J5YVdOMElFaFVUVXdnY21WamIyZHVhWFJwYjI0Z0tDTXhNVEk1TURvZ2JYVnpkQ0J6ZEdGeWRDQjNhWFJvSUR3cENna3ZMeUJUYUc5eWRHTjFkQ0J6YVcxd2JHVWdJMmxrSUdOaGMyVWdabTl5SUhOd1pXVmtDZ2x5Y1hWcFkydEZlSEJ5SUQwZ0wxNG9QenBjY3lvb1BGdGNkMXhYWFNzK0tWdGVQbDBxZkNNb1cxeDNMVjByS1Nra0x5d0tDZ2xwYm1sMElEMGdhbEYxWlhKNUxtWnVMbWx1YVhRZ1BTQm1kVzVqZEdsdmJpZ2djMlZzWldOMGIzSXNJR052Ym5SbGVIUXNJSEp2YjNRZ0tTQjdDZ2tKZG1GeUlHMWhkR05vTENCbGJHVnRPd29LQ1Frdkx5QklRVTVFVEVVNklDUW9JaUlwTENBa0tHNTFiR3dwTENBa0tIVnVaR1ZtYVc1bFpDa3NJQ1FvWm1Gc2MyVXBDZ2tKYVdZZ0tDQWhjMlZzWldOMGIzSWdLU0I3Q2drSkNYSmxkSFZ5YmlCMGFHbHpPd29KQ1gwS0Nna0pMeThnVFdWMGFHOWtJR2x1YVhRb0tTQmhZMk5sY0hSeklHRnVJR0ZzZEdWeWJtRjBaU0J5YjI5MGFsRjFaWEo1Q2drSkx5OGdjMjhnYldsbmNtRjBaU0JqWVc0Z2MzVndjRzl5ZENCcVVYVmxjbmt1YzNWaUlDaG5hQzB5TVRBeEtRb0pDWEp2YjNRZ1BTQnliMjkwSUh4OElISnZiM1JxVVhWbGNuazdDZ29KQ1M4dklFaGhibVJzWlNCSVZFMU1JSE4wY21sdVozTUtDUWxwWmlBb0lIUjVjR1Z2WmlCelpXeGxZM1J2Y2lBOVBUMGdJbk4wY21sdVp5SWdLU0I3Q2drSkNXbG1JQ2dnYzJWc1pXTjBiM0piSURBZ1hTQTlQVDBnSWp3aUlDWW1DZ2tKQ1FselpXeGxZM1J2Y2xzZ2MyVnNaV04wYjNJdWJHVnVaM1JvSUMwZ01TQmRJRDA5UFNBaVBpSWdKaVlLQ1FrSkNYTmxiR1ZqZEc5eUxteGxibWQwYUNBK1BTQXpJQ2tnZXdvS0NRa0pDUzh2SUVGemMzVnRaU0IwYUdGMElITjBjbWx1WjNNZ2RHaGhkQ0J6ZEdGeWRDQmhibVFnWlc1a0lIZHBkR2dnUEQ0Z1lYSmxJRWhVVFV3Z1lXNWtJSE5yYVhBZ2RHaGxJSEpsWjJWNElHTm9aV05yQ2drSkNRbHRZWFJqYUNBOUlGc2diblZzYkN3Z2MyVnNaV04wYjNJc0lHNTFiR3dnWFRzS0Nna0pDWDBnWld4elpTQjdDZ2tKQ1FsdFlYUmphQ0E5SUhKeGRXbGphMFY0Y0hJdVpYaGxZeWdnYzJWc1pXTjBiM0lnS1RzS0NRa0pmUW9LQ1FrSkx5OGdUV0YwWTJnZ2FIUnRiQ0J2Y2lCdFlXdGxJSE4xY21VZ2JtOGdZMjl1ZEdWNGRDQnBjeUJ6Y0dWamFXWnBaV1FnWm05eUlDTnBaQW9KQ1FscFppQW9JRzFoZEdOb0lDWW1JQ2dnYldGMFkyaGJJREVnWFNCOGZDQWhZMjl1ZEdWNGRDQXBJQ2tnZXdvS0NRa0pDUzh2SUVoQlRrUk1SVG9nSkNob2RHMXNLU0F0UGlBa0tHRnljbUY1S1FvSkNRa0phV1lnS0NCdFlYUmphRnNnTVNCZElDa2dld29KQ1FrSkNXTnZiblJsZUhRZ1BTQmpiMjUwWlhoMElHbHVjM1JoYm1ObGIyWWdhbEYxWlhKNUlEOGdZMjl1ZEdWNGRGc2dNQ0JkSURvZ1kyOXVkR1Y0ZERzS0Nna0pDUWtKTHk4Z1QzQjBhVzl1SUhSdklISjFiaUJ6WTNKcGNIUnpJR2x6SUhSeWRXVWdabTl5SUdKaFkyc3RZMjl0Y0dGMENna0pDUWtKTHk4Z1NXNTBaVzUwYVc5dVlXeHNlU0JzWlhRZ2RHaGxJR1Z5Y205eUlHSmxJSFJvY205M2JpQnBaaUJ3WVhKelpVaFVUVXdnYVhNZ2JtOTBJSEJ5WlhObGJuUUtDUWtKQ1FscVVYVmxjbmt1YldWeVoyVW9JSFJvYVhNc0lHcFJkV1Z5ZVM1d1lYSnpaVWhVVFV3b0Nna0pDUWtKQ1cxaGRHTm9XeUF4SUYwc0Nna0pDUWtKQ1dOdmJuUmxlSFFnSmlZZ1kyOXVkR1Y0ZEM1dWIyUmxWSGx3WlNBL0lHTnZiblJsZUhRdWIzZHVaWEpFYjJOMWJXVnVkQ0I4ZkNCamIyNTBaWGgwSURvZ1pHOWpkVzFsYm5Rc0Nna0pDUWtKQ1hSeWRXVUtDUWtKQ1FrcElDazdDZ29KQ1FrSkNTOHZJRWhCVGtSTVJUb2dKQ2hvZEcxc0xDQndjbTl3Y3lrS0NRa0pDUWxwWmlBb0lISnphVzVuYkdWVVlXY3VkR1Z6ZENnZ2JXRjBZMmhiSURFZ1hTQXBJQ1ltSUdwUmRXVnllUzVwYzFCc1lXbHVUMkpxWldOMEtDQmpiMjUwWlhoMElDa2dLU0I3Q2drSkNRa0pDV1p2Y2lBb0lHMWhkR05vSUdsdUlHTnZiblJsZUhRZ0tTQjdDZ29KQ1FrSkNRa0pMeThnVUhKdmNHVnlkR2xsY3lCdlppQmpiMjUwWlhoMElHRnlaU0JqWVd4c1pXUWdZWE1nYldWMGFHOWtjeUJwWmlCd2IzTnphV0pzWlFvSkNRa0pDUWtKYVdZZ0tDQnBjMFoxYm1OMGFXOXVLQ0IwYUdseld5QnRZWFJqYUNCZElDa2dLU0I3Q2drSkNRa0pDUWtKZEdocGMxc2diV0YwWTJnZ1hTZ2dZMjl1ZEdWNGRGc2diV0YwWTJnZ1hTQXBPd29LQ1FrSkNRa0pDUzh2SUM0dUxtRnVaQ0J2ZEdobGNuZHBjMlVnYzJWMElHRnpJR0YwZEhKcFluVjBaWE1LQ1FrSkNRa0pDWDBnWld4elpTQjdDZ2tKQ1FrSkNRa0pkR2hwY3k1aGRIUnlLQ0J0WVhSamFDd2dZMjl1ZEdWNGRGc2diV0YwWTJnZ1hTQXBPd29KQ1FrSkNRa0pmUW9KQ1FrSkNRbDlDZ2tKQ1FrSmZRb0tDUWtKQ1FseVpYUjFjbTRnZEdocGN6c0tDZ2tKQ1Frdkx5QklRVTVFVEVVNklDUW9JMmxrS1FvSkNRa0pmU0JsYkhObElIc0tDUWtKQ1FsbGJHVnRJRDBnWkc5amRXMWxiblF1WjJWMFJXeGxiV1Z1ZEVKNVNXUW9JRzFoZEdOb1d5QXlJRjBnS1RzS0Nna0pDUWtKYVdZZ0tDQmxiR1Z0SUNrZ2V3b0tDUWtKQ1FrSkx5OGdTVzVxWldOMElIUm9aU0JsYkdWdFpXNTBJR1JwY21WamRHeDVJR2x1ZEc4Z2RHaGxJR3BSZFdWeWVTQnZZbXBsWTNRS0NRa0pDUWtKZEdocGMxc2dNQ0JkSUQwZ1pXeGxiVHNLQ1FrSkNRa0pkR2hwY3k1c1pXNW5kR2dnUFNBeE93b0pDUWtKQ1gwS0NRa0pDUWx5WlhSMWNtNGdkR2hwY3pzS0NRa0pDWDBLQ2drSkNTOHZJRWhCVGtSTVJUb2dKQ2hsZUhCeUxDQWtLQzR1TGlrcENna0pDWDBnWld4elpTQnBaaUFvSUNGamIyNTBaWGgwSUh4OElHTnZiblJsZUhRdWFuRjFaWEo1SUNrZ2V3b0pDUWtKY21WMGRYSnVJQ2dnWTI5dWRHVjRkQ0I4ZkNCeWIyOTBJQ2t1Wm1sdVpDZ2djMlZzWldOMGIzSWdLVHNLQ2drSkNTOHZJRWhCVGtSTVJUb2dKQ2hsZUhCeUxDQmpiMjUwWlhoMEtRb0pDUWt2THlBb2QyaHBZMmdnYVhNZ2FuVnpkQ0JsY1hWcGRtRnNaVzUwSUhSdk9pQWtLR052Ym5SbGVIUXBMbVpwYm1Rb1pYaHdjaWtLQ1FrSmZTQmxiSE5sSUhzS0NRa0pDWEpsZEhWeWJpQjBhR2x6TG1OdmJuTjBjblZqZEc5eUtDQmpiMjUwWlhoMElDa3VabWx1WkNnZ2MyVnNaV04wYjNJZ0tUc0tDUWtKZlFvS0NRa3ZMeUJJUVU1RVRFVTZJQ1FvUkU5TlJXeGxiV1Z1ZENrS0NRbDlJR1ZzYzJVZ2FXWWdLQ0J6Wld4bFkzUnZjaTV1YjJSbFZIbHdaU0FwSUhzS0NRa0pkR2hwYzFzZ01DQmRJRDBnYzJWc1pXTjBiM0k3Q2drSkNYUm9hWE11YkdWdVozUm9JRDBnTVRzS0NRa0pjbVYwZFhKdUlIUm9hWE03Q2dvSkNTOHZJRWhCVGtSTVJUb2dKQ2htZFc1amRHbHZiaWtLQ1Frdkx5QlRhRzl5ZEdOMWRDQm1iM0lnWkc5amRXMWxiblFnY21WaFpIa0tDUWw5SUdWc2MyVWdhV1lnS0NCcGMwWjFibU4wYVc5dUtDQnpaV3hsWTNSdmNpQXBJQ2tnZXdvSkNRbHlaWFIxY200Z2NtOXZkQzV5WldGa2VTQWhQVDBnZFc1a1pXWnBibVZrSUQ4S0NRa0pDWEp2YjNRdWNtVmhaSGtvSUhObGJHVmpkRzl5SUNrZ09nb0tDUWtKQ1M4dklFVjRaV04xZEdVZ2FXMXRaV1JwWVhSbGJIa2dhV1lnY21WaFpIa2dhWE1nYm05MElIQnlaWE5sYm5RS0NRa0pDWE5sYkdWamRHOXlLQ0JxVVhWbGNua2dLVHNLQ1FsOUNnb0pDWEpsZEhWeWJpQnFVWFZsY25rdWJXRnJaVUZ5Y21GNUtDQnpaV3hsWTNSdmNpd2dkR2hwY3lBcE93b0pmVHNLQ2k4dklFZHBkbVVnZEdobElHbHVhWFFnWm5WdVkzUnBiMjRnZEdobElHcFJkV1Z5ZVNCd2NtOTBiM1I1Y0dVZ1ptOXlJR3hoZEdWeUlHbHVjM1JoYm5ScFlYUnBiMjRLYVc1cGRDNXdjbTkwYjNSNWNHVWdQU0JxVVhWbGNua3VabTQ3Q2dvdkx5QkpibWwwYVdGc2FYcGxJR05sYm5SeVlXd2djbVZtWlhKbGJtTmxDbkp2YjNScVVYVmxjbmtnUFNCcVVYVmxjbmtvSUdSdlkzVnRaVzUwSUNrN0Nnb0tkbUZ5SUhKd1lYSmxiblJ6Y0hKbGRpQTlJQzllS0Q4NmNHRnlaVzUwYzN4d2NtVjJLRDg2Vlc1MGFXeDhRV3hzS1NrdkxBb0tDUzh2SUUxbGRHaHZaSE1nWjNWaGNtRnVkR1ZsWkNCMGJ5QndjbTlrZFdObElHRWdkVzVwY1hWbElITmxkQ0IzYUdWdUlITjBZWEowYVc1bklHWnliMjBnWVNCMWJtbHhkV1VnYzJWMENnbG5kV0Z5WVc1MFpXVmtWVzVwY1hWbElEMGdld29KQ1dOb2FXeGtjbVZ1T2lCMGNuVmxMQW9KQ1dOdmJuUmxiblJ6T2lCMGNuVmxMQW9KQ1c1bGVIUTZJSFJ5ZFdVc0Nna0pjSEpsZGpvZ2RISjFaUW9KZlRzS0NtcFJkV1Z5ZVM1bWJpNWxlSFJsYm1Rb0lIc0tDV2hoY3pvZ1puVnVZM1JwYjI0b0lIUmhjbWRsZENBcElIc0tDUWwyWVhJZ2RHRnlaMlYwY3lBOUlHcFJkV1Z5ZVNnZ2RHRnlaMlYwTENCMGFHbHpJQ2tzQ2drSkNXd2dQU0IwWVhKblpYUnpMbXhsYm1kMGFEc0tDZ2tKY21WMGRYSnVJSFJvYVhNdVptbHNkR1Z5S0NCbWRXNWpkR2x2YmlncElIc0tDUWtKZG1GeUlHa2dQU0F3T3dvSkNRbG1iM0lnS0NBN0lHa2dQQ0JzT3lCcEt5c2dLU0I3Q2drSkNRbHBaaUFvSUdwUmRXVnllUzVqYjI1MFlXbHVjeWdnZEdocGN5d2dkR0Z5WjJWMGMxc2dhU0JkSUNrZ0tTQjdDZ2tKQ1FrSmNtVjBkWEp1SUhSeWRXVTdDZ2tKQ1FsOUNna0pDWDBLQ1FsOUlDazdDZ2w5TEFvS0NXTnNiM05sYzNRNklHWjFibU4wYVc5dUtDQnpaV3hsWTNSdmNuTXNJR052Ym5SbGVIUWdLU0I3Q2drSmRtRnlJR04xY2l3S0NRa0phU0E5SURBc0Nna0pDV3dnUFNCMGFHbHpMbXhsYm1kMGFDd0tDUWtKYldGMFkyaGxaQ0E5SUZ0ZExBb0pDUWwwWVhKblpYUnpJRDBnZEhsd1pXOW1JSE5sYkdWamRHOXljeUFoUFQwZ0luTjBjbWx1WnlJZ0ppWWdhbEYxWlhKNUtDQnpaV3hsWTNSdmNuTWdLVHNLQ2drSkx5OGdVRzl6YVhScGIyNWhiQ0J6Wld4bFkzUnZjbk1nYm1WMlpYSWdiV0YwWTJnc0lITnBibU5sSUhSb1pYSmxKM01nYm04Z1gzTmxiR1ZqZEdsdmJsOGdZMjl1ZEdWNGRBb0pDV2xtSUNnZ0lYSnVaV1ZrYzBOdmJuUmxlSFF1ZEdWemRDZ2djMlZzWldOMGIzSnpJQ2tnS1NCN0Nna0pDV1p2Y2lBb0lEc2dhU0E4SUd3N0lHa3JLeUFwSUhzS0NRa0pDV1p2Y2lBb0lHTjFjaUE5SUhSb2FYTmJJR2tnWFRzZ1kzVnlJQ1ltSUdOMWNpQWhQVDBnWTI5dWRHVjRkRHNnWTNWeUlEMGdZM1Z5TG5CaGNtVnVkRTV2WkdVZ0tTQjdDZ29KQ1FrSkNTOHZJRUZzZDJGNWN5QnphMmx3SUdSdlkzVnRaVzUwSUdaeVlXZHRaVzUwY3dvSkNRa0pDV2xtSUNnZ1kzVnlMbTV2WkdWVWVYQmxJRHdnTVRFZ0ppWWdLQ0IwWVhKblpYUnpJRDhLQ1FrSkNRa0pkR0Z5WjJWMGN5NXBibVJsZUNnZ1kzVnlJQ2tnUGlBdE1TQTZDZ29KQ1FrSkNRa3ZMeUJFYjI0bmRDQndZWE56SUc1dmJpMWxiR1Z0Wlc1MGN5QjBieUJUYVhwNmJHVUtDUWtKQ1FrSlkzVnlMbTV2WkdWVWVYQmxJRDA5UFNBeElDWW1DZ2tKQ1FrSkNRbHFVWFZsY25rdVptbHVaQzV0WVhSamFHVnpVMlZzWldOMGIzSW9JR04xY2l3Z2MyVnNaV04wYjNKeklDa2dLU0FwSUhzS0Nna0pDUWtKQ1cxaGRHTm9aV1F1Y0hWemFDZ2dZM1Z5SUNrN0Nna0pDUWtKQ1dKeVpXRnJPd29KQ1FrSkNYMEtDUWtKQ1gwS0NRa0pmUW9KQ1gwS0Nna0pjbVYwZFhKdUlIUm9hWE11Y0hWemFGTjBZV05yS0NCdFlYUmphR1ZrTG14bGJtZDBhQ0ErSURFZ1B5QnFVWFZsY25rdWRXNXBjWFZsVTI5eWRDZ2diV0YwWTJobFpDQXBJRG9nYldGMFkyaGxaQ0FwT3dvSmZTd0tDZ2t2THlCRVpYUmxjbTFwYm1VZ2RHaGxJSEJ2YzJsMGFXOXVJRzltSUdGdUlHVnNaVzFsYm5RZ2QybDBhR2x1SUhSb1pTQnpaWFFLQ1dsdVpHVjRPaUJtZFc1amRHbHZiaWdnWld4bGJTQXBJSHNLQ2drSkx5OGdUbThnWVhKbmRXMWxiblFzSUhKbGRIVnliaUJwYm1SbGVDQnBiaUJ3WVhKbGJuUUtDUWxwWmlBb0lDRmxiR1Z0SUNrZ2V3b0pDUWx5WlhSMWNtNGdLQ0IwYUdseld5QXdJRjBnSmlZZ2RHaHBjMXNnTUNCZExuQmhjbVZ1ZEU1dlpHVWdLU0EvSUhSb2FYTXVabWx5YzNRb0tTNXdjbVYyUVd4c0tDa3ViR1Z1WjNSb0lEb2dMVEU3Q2drSmZRb0tDUWt2THlCSmJtUmxlQ0JwYmlCelpXeGxZM1J2Y2dvSkNXbG1JQ2dnZEhsd1pXOW1JR1ZzWlcwZ1BUMDlJQ0p6ZEhKcGJtY2lJQ2tnZXdvSkNRbHlaWFIxY200Z2FXNWtaWGhQWmk1allXeHNLQ0JxVVhWbGNua29JR1ZzWlcwZ0tTd2dkR2hwYzFzZ01DQmRJQ2s3Q2drSmZRb0tDUWt2THlCTWIyTmhkR1VnZEdobElIQnZjMmwwYVc5dUlHOW1JSFJvWlNCa1pYTnBjbVZrSUdWc1pXMWxiblFLQ1FseVpYUjFjbTRnYVc1a1pYaFBaaTVqWVd4c0tDQjBhR2x6TEFvS0NRa0pMeThnU1dZZ2FYUWdjbVZqWldsMlpYTWdZU0JxVVhWbGNua2diMkpxWldOMExDQjBhR1VnWm1seWMzUWdaV3hsYldWdWRDQnBjeUIxYzJWa0Nna0pDV1ZzWlcwdWFuRjFaWEo1SUQ4Z1pXeGxiVnNnTUNCZElEb2daV3hsYlFvSkNTazdDZ2w5TEFvS0NXRmtaRG9nWm5WdVkzUnBiMjRvSUhObGJHVmpkRzl5TENCamIyNTBaWGgwSUNrZ2V3b0pDWEpsZEhWeWJpQjBhR2x6TG5CMWMyaFRkR0ZqYXlnS0NRa0phbEYxWlhKNUxuVnVhWEYxWlZOdmNuUW9DZ2tKQ1FscVVYVmxjbmt1YldWeVoyVW9JSFJvYVhNdVoyVjBLQ2tzSUdwUmRXVnllU2dnYzJWc1pXTjBiM0lzSUdOdmJuUmxlSFFnS1NBcENna0pDU2tLQ1FrcE93b0pmU3dLQ2dsaFpHUkNZV05yT2lCbWRXNWpkR2x2YmlnZ2MyVnNaV04wYjNJZ0tTQjdDZ2tKY21WMGRYSnVJSFJvYVhNdVlXUmtLQ0J6Wld4bFkzUnZjaUE5UFNCdWRXeHNJRDhLQ1FrSmRHaHBjeTV3Y21WMlQySnFaV04wSURvZ2RHaHBjeTV3Y21WMlQySnFaV04wTG1acGJIUmxjaWdnYzJWc1pXTjBiM0lnS1FvSkNTazdDZ2w5Q24wZ0tUc0tDbVoxYm1OMGFXOXVJSE5wWW14cGJtY29JR04xY2l3Z1pHbHlJQ2tnZXdvSmQyaHBiR1VnS0NBb0lHTjFjaUE5SUdOMWNsc2daR2x5SUYwZ0tTQW1KaUJqZFhJdWJtOWtaVlI1Y0dVZ0lUMDlJREVnS1NCN2ZRb0pjbVYwZFhKdUlHTjFjanNLZlFvS2FsRjFaWEo1TG1WaFkyZ29JSHNLQ1hCaGNtVnVkRG9nWm5WdVkzUnBiMjRvSUdWc1pXMGdLU0I3Q2drSmRtRnlJSEJoY21WdWRDQTlJR1ZzWlcwdWNHRnlaVzUwVG05a1pUc0tDUWx5WlhSMWNtNGdjR0Z5Wlc1MElDWW1JSEJoY21WdWRDNXViMlJsVkhsd1pTQWhQVDBnTVRFZ1B5QndZWEpsYm5RZ09pQnVkV3hzT3dvSmZTd0tDWEJoY21WdWRITTZJR1oxYm1OMGFXOXVLQ0JsYkdWdElDa2dld29KQ1hKbGRIVnliaUJrYVhJb0lHVnNaVzBzSUNKd1lYSmxiblJPYjJSbElpQXBPd29KZlN3S0NYQmhjbVZ1ZEhOVmJuUnBiRG9nWm5WdVkzUnBiMjRvSUdWc1pXMHNJR2tzSUhWdWRHbHNJQ2tnZXdvSkNYSmxkSFZ5YmlCa2FYSW9JR1ZzWlcwc0lDSndZWEpsYm5ST2IyUmxJaXdnZFc1MGFXd2dLVHNLQ1gwc0NnbHVaWGgwT2lCbWRXNWpkR2x2YmlnZ1pXeGxiU0FwSUhzS0NRbHlaWFIxY200Z2MybGliR2x1WnlnZ1pXeGxiU3dnSW01bGVIUlRhV0pzYVc1bklpQXBPd29KZlN3S0NYQnlaWFk2SUdaMWJtTjBhVzl1S0NCbGJHVnRJQ2tnZXdvSkNYSmxkSFZ5YmlCemFXSnNhVzVuS0NCbGJHVnRMQ0FpY0hKbGRtbHZkWE5UYVdKc2FXNW5JaUFwT3dvSmZTd0tDVzVsZUhSQmJHdzZJR1oxYm1OMGFXOXVLQ0JsYkdWdElDa2dld29KQ1hKbGRIVnliaUJrYVhJb0lHVnNaVzBzSUNKdVpYaDBVMmxpYkdsdVp5SWdLVHNLQ1gwc0NnbHdjbVYyUVd4c09pQm1kVzVqZEdsdmJpZ2daV3hsYlNBcElIc0tDUWx5WlhSMWNtNGdaR2x5S0NCbGJHVnRMQ0FpY0hKbGRtbHZkWE5UYVdKc2FXNW5JaUFwT3dvSmZTd0tDVzVsZUhSVmJuUnBiRG9nWm5WdVkzUnBiMjRvSUdWc1pXMHNJR2tzSUhWdWRHbHNJQ2tnZXdvSkNYSmxkSFZ5YmlCa2FYSW9JR1ZzWlcwc0lDSnVaWGgwVTJsaWJHbHVaeUlzSUhWdWRHbHNJQ2s3Q2dsOUxBb0pjSEpsZGxWdWRHbHNPaUJtZFc1amRHbHZiaWdnWld4bGJTd2dhU3dnZFc1MGFXd2dLU0I3Q2drSmNtVjBkWEp1SUdScGNpZ2daV3hsYlN3Z0luQnlaWFpwYjNWelUybGliR2x1WnlJc0lIVnVkR2xzSUNrN0NnbDlMQW9KYzJsaWJHbHVaM002SUdaMWJtTjBhVzl1S0NCbGJHVnRJQ2tnZXdvSkNYSmxkSFZ5YmlCemFXSnNhVzVuY3lnZ0tDQmxiR1Z0TG5CaGNtVnVkRTV2WkdVZ2ZId2dlMzBnS1M1bWFYSnpkRU5vYVd4a0xDQmxiR1Z0SUNrN0NnbDlMQW9KWTJocGJHUnlaVzQ2SUdaMWJtTjBhVzl1S0NCbGJHVnRJQ2tnZXdvSkNYSmxkSFZ5YmlCemFXSnNhVzVuY3lnZ1pXeGxiUzVtYVhKemRFTm9hV3hrSUNrN0NnbDlMQW9KWTI5dWRHVnVkSE02SUdaMWJtTjBhVzl1S0NCbGJHVnRJQ2tnZXdvZ0lDQWdJQ0FnSUdsbUlDZ2dibTlrWlU1aGJXVW9JR1ZzWlcwc0lDSnBabkpoYldVaUlDa2dLU0I3Q2lBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCbGJHVnRMbU52Ym5SbGJuUkViMk4xYldWdWREc0tJQ0FnSUNBZ0lDQjlDZ29nSUNBZ0lDQWdJQzh2SUZOMWNIQnZjblE2SUVsRklEa2dMU0F4TVNCdmJteDVMQ0JwVDFNZ055QnZibXg1TENCQmJtUnliMmxrSUVKeWIzZHpaWElnUEQwMExqTWdiMjVzZVFvZ0lDQWdJQ0FnSUM4dklGUnlaV0YwSUhSb1pTQjBaVzF3YkdGMFpTQmxiR1Z0Wlc1MElHRnpJR0VnY21WbmRXeGhjaUJ2Ym1VZ2FXNGdZbkp2ZDNObGNuTWdkR2hoZEFvZ0lDQWdJQ0FnSUM4dklHUnZiaWQwSUhOMWNIQnZjblFnYVhRdUNpQWdJQ0FnSUNBZ2FXWWdLQ0J1YjJSbFRtRnRaU2dnWld4bGJTd2dJblJsYlhCc1lYUmxJaUFwSUNrZ2V3b2dJQ0FnSUNBZ0lDQWdJQ0JsYkdWdElEMGdaV3hsYlM1amIyNTBaVzUwSUh4OElHVnNaVzA3Q2lBZ0lDQWdJQ0FnZlFvS0lDQWdJQ0FnSUNCeVpYUjFjbTRnYWxGMVpYSjVMbTFsY21kbEtDQmJYU3dnWld4bGJTNWphR2xzWkU1dlpHVnpJQ2s3Q2dsOUNuMHNJR1oxYm1OMGFXOXVLQ0J1WVcxbExDQm1iaUFwSUhzS0NXcFJkV1Z5ZVM1bWJsc2dibUZ0WlNCZElEMGdablZ1WTNScGIyNG9JSFZ1ZEdsc0xDQnpaV3hsWTNSdmNpQXBJSHNLQ1FsMllYSWdiV0YwWTJobFpDQTlJR3BSZFdWeWVTNXRZWEFvSUhSb2FYTXNJR1p1TENCMWJuUnBiQ0FwT3dvS0NRbHBaaUFvSUc1aGJXVXVjMnhwWTJVb0lDMDFJQ2tnSVQwOUlDSlZiblJwYkNJZ0tTQjdDZ2tKQ1hObGJHVmpkRzl5SUQwZ2RXNTBhV3c3Q2drSmZRb0tDUWxwWmlBb0lITmxiR1ZqZEc5eUlDWW1JSFI1Y0dWdlppQnpaV3hsWTNSdmNpQTlQVDBnSW5OMGNtbHVaeUlnS1NCN0Nna0pDVzFoZEdOb1pXUWdQU0JxVVhWbGNua3VabWxzZEdWeUtDQnpaV3hsWTNSdmNpd2diV0YwWTJobFpDQXBPd29KQ1gwS0Nna0phV1lnS0NCMGFHbHpMbXhsYm1kMGFDQStJREVnS1NCN0Nnb0pDUWt2THlCU1pXMXZkbVVnWkhWd2JHbGpZWFJsY3dvSkNRbHBaaUFvSUNGbmRXRnlZVzUwWldWa1ZXNXBjWFZsV3lCdVlXMWxJRjBnS1NCN0Nna0pDUWxxVVhWbGNua3VkVzVwY1hWbFUyOXlkQ2dnYldGMFkyaGxaQ0FwT3dvSkNRbDlDZ29KQ1Frdkx5QlNaWFpsY25ObElHOXlaR1Z5SUdadmNpQndZWEpsYm5SektpQmhibVFnY0hKbGRpMWtaWEpwZG1GMGFYWmxjd29KQ1FscFppQW9JSEp3WVhKbGJuUnpjSEpsZGk1MFpYTjBLQ0J1WVcxbElDa2dLU0I3Q2drSkNRbHRZWFJqYUdWa0xuSmxkbVZ5YzJVb0tUc0tDUWtKZlFvSkNYMEtDZ2tKY21WMGRYSnVJSFJvYVhNdWNIVnphRk4wWVdOcktDQnRZWFJqYUdWa0lDazdDZ2w5T3dwOUlDazdDblpoY2lCeWJtOTBhSFJ0Ykhkb2FYUmxJRDBnS0NBdlcxNWNlREl3WEhSY2NseHVYR1pkS3k5bklDazdDZ29LQ2k4dklFTnZiblpsY25RZ1UzUnlhVzVuTFdadmNtMWhkSFJsWkNCdmNIUnBiMjV6SUdsdWRHOGdUMkpxWldOMExXWnZjbTFoZEhSbFpDQnZibVZ6Q21aMWJtTjBhVzl1SUdOeVpXRjBaVTl3ZEdsdmJuTW9JRzl3ZEdsdmJuTWdLU0I3Q2dsMllYSWdiMkpxWldOMElEMGdlMzA3Q2dscVVYVmxjbmt1WldGamFDZ2diM0IwYVc5dWN5NXRZWFJqYUNnZ2NtNXZkR2gwYld4M2FHbDBaU0FwSUh4OElGdGRMQ0JtZFc1amRHbHZiaWdnWHl3Z1pteGhaeUFwSUhzS0NRbHZZbXBsWTNSYklHWnNZV2NnWFNBOUlIUnlkV1U3Q2dsOUlDazdDZ2x5WlhSMWNtNGdiMkpxWldOME93cDlDZ292S2dvZ0tpQkRjbVZoZEdVZ1lTQmpZV3hzWW1GamF5QnNhWE4wSUhWemFXNW5JSFJvWlNCbWIyeHNiM2RwYm1jZ2NHRnlZVzFsZEdWeWN6b0tJQ29LSUNvSmIzQjBhVzl1Y3pvZ1lXNGdiM0IwYVc5dVlXd2diR2x6ZENCdlppQnpjR0ZqWlMxelpYQmhjbUYwWldRZ2IzQjBhVzl1Y3lCMGFHRjBJSGRwYkd3Z1kyaGhibWRsSUdodmR3b2dLZ2tKQ1hSb1pTQmpZV3hzWW1GamF5QnNhWE4wSUdKbGFHRjJaWE1nYjNJZ1lTQnRiM0psSUhSeVlXUnBkR2x2Ym1Gc0lHOXdkR2x2YmlCdlltcGxZM1FLSUNvS0lDb2dRbmtnWkdWbVlYVnNkQ0JoSUdOaGJHeGlZV05ySUd4cGMzUWdkMmxzYkNCaFkzUWdiR2xyWlNCaGJpQmxkbVZ1ZENCallXeHNZbUZqYXlCc2FYTjBJR0Z1WkNCallXNGdZbVVLSUNvZ0ltWnBjbVZrSWlCdGRXeDBhWEJzWlNCMGFXMWxjeTRLSUNvS0lDb2dVRzl6YzJsaWJHVWdiM0IwYVc5dWN6b0tJQ29LSUNvSmIyNWpaVG9KQ1FsM2FXeHNJR1Z1YzNWeVpTQjBhR1VnWTJGc2JHSmhZMnNnYkdsemRDQmpZVzRnYjI1c2VTQmlaU0JtYVhKbFpDQnZibU5sSUNoc2FXdGxJR0VnUkdWbVpYSnlaV1FwQ2lBcUNpQXFDVzFsYlc5eWVUb0pDUWwzYVd4c0lHdGxaWEFnZEhKaFkyc2diMllnY0hKbGRtbHZkWE1nZG1Gc2RXVnpJR0Z1WkNCM2FXeHNJR05oYkd3Z1lXNTVJR05oYkd4aVlXTnJJR0ZrWkdWa0NpQXFDUWtKQ1FsaFpuUmxjaUIwYUdVZ2JHbHpkQ0JvWVhNZ1ltVmxiaUJtYVhKbFpDQnlhV2RvZENCaGQyRjVJSGRwZEdnZ2RHaGxJR3hoZEdWemRDQWliV1Z0YjNKcGVtVmtJZ29nS2drSkNRa0pkbUZzZFdWeklDaHNhV3RsSUdFZ1JHVm1aWEp5WldRcENpQXFDaUFxQ1hWdWFYRjFaVG9KQ1FsM2FXeHNJR1Z1YzNWeVpTQmhJR05oYkd4aVlXTnJJR05oYmlCdmJteDVJR0psSUdGa1pHVmtJRzl1WTJVZ0tHNXZJR1IxY0d4cFkyRjBaU0JwYmlCMGFHVWdiR2x6ZENrS0lDb0tJQ29KYzNSdmNFOXVSbUZzYzJVNkNXbHVkR1Z5Y25Wd2RDQmpZV3hzYVc1bmN5QjNhR1Z1SUdFZ1kyRnNiR0poWTJzZ2NtVjBkWEp1Y3lCbVlXeHpaUW9nS2dvZ0tpOEthbEYxWlhKNUxrTmhiR3hpWVdOcmN5QTlJR1oxYm1OMGFXOXVLQ0J2Y0hScGIyNXpJQ2tnZXdvS0NTOHZJRU52Ym5abGNuUWdiM0IwYVc5dWN5Qm1jbTl0SUZOMGNtbHVaeTFtYjNKdFlYUjBaV1FnZEc4Z1QySnFaV04wTFdadmNtMWhkSFJsWkNCcFppQnVaV1ZrWldRS0NTOHZJQ2gzWlNCamFHVmpheUJwYmlCallXTm9aU0JtYVhKemRDa0tDVzl3ZEdsdmJuTWdQU0IwZVhCbGIyWWdiM0IwYVc5dWN5QTlQVDBnSW5OMGNtbHVaeUlnUHdvSkNXTnlaV0YwWlU5d2RHbHZibk1vSUc5d2RHbHZibk1nS1NBNkNna0phbEYxWlhKNUxtVjRkR1Z1WkNnZ2UzMHNJRzl3ZEdsdmJuTWdLVHNLQ2dsMllYSWdMeThnUm14aFp5QjBieUJyYm05M0lHbG1JR3hwYzNRZ2FYTWdZM1Z5Y21WdWRHeDVJR1pwY21sdVp3b0pDV1pwY21sdVp5d0tDZ2tKTHk4Z1RHRnpkQ0JtYVhKbElIWmhiSFZsSUdadmNpQnViMjR0Wm05eVoyVjBkR0ZpYkdVZ2JHbHpkSE1LQ1FsdFpXMXZjbmtzQ2dvSkNTOHZJRVpzWVdjZ2RHOGdhMjV2ZHlCcFppQnNhWE4wSUhkaGN5QmhiSEpsWVdSNUlHWnBjbVZrQ2drSlptbHlaV1FzQ2dvSkNTOHZJRVpzWVdjZ2RHOGdjSEpsZG1WdWRDQm1hWEpwYm1jS0NRbHNiMk5yWldRc0Nnb0pDUzh2SUVGamRIVmhiQ0JqWVd4c1ltRmpheUJzYVhOMENna0piR2x6ZENBOUlGdGRMQW9LQ1Frdkx5QlJkV1YxWlNCdlppQmxlR1ZqZFhScGIyNGdaR0YwWVNCbWIzSWdjbVZ3WldGMFlXSnNaU0JzYVhOMGN3b0pDWEYxWlhWbElEMGdXMTBzQ2dvSkNTOHZJRWx1WkdWNElHOW1JR04xY25KbGJuUnNlU0JtYVhKcGJtY2dZMkZzYkdKaFkyc2dLRzF2WkdsbWFXVmtJR0o1SUdGa1pDOXlaVzF2ZG1VZ1lYTWdibVZsWkdWa0tRb0pDV1pwY21sdVowbHVaR1Y0SUQwZ0xURXNDZ29KQ1M4dklFWnBjbVVnWTJGc2JHSmhZMnR6Q2drSlptbHlaU0E5SUdaMWJtTjBhVzl1S0NrZ2V3b0tDUWtKTHk4Z1JXNW1iM0pqWlNCemFXNW5iR1V0Wm1seWFXNW5DZ2tKQ1d4dlkydGxaQ0E5SUd4dlkydGxaQ0I4ZkNCdmNIUnBiMjV6TG05dVkyVTdDZ29KQ1Frdkx5QkZlR1ZqZFhSbElHTmhiR3hpWVdOcmN5Qm1iM0lnWVd4c0lIQmxibVJwYm1jZ1pYaGxZM1YwYVc5dWN5d0tDUWtKTHk4Z2NtVnpjR1ZqZEdsdVp5Qm1hWEpwYm1kSmJtUmxlQ0J2ZG1WeWNtbGtaWE1nWVc1a0lISjFiblJwYldVZ1kyaGhibWRsY3dvSkNRbG1hWEpsWkNBOUlHWnBjbWx1WnlBOUlIUnlkV1U3Q2drSkNXWnZjaUFvSURzZ2NYVmxkV1V1YkdWdVozUm9PeUJtYVhKcGJtZEpibVJsZUNBOUlDMHhJQ2tnZXdvSkNRa0piV1Z0YjNKNUlEMGdjWFZsZFdVdWMyaHBablFvS1RzS0NRa0pDWGRvYVd4bElDZ2dLeXRtYVhKcGJtZEpibVJsZUNBOElHeHBjM1F1YkdWdVozUm9JQ2tnZXdvS0NRa0pDUWt2THlCU2RXNGdZMkZzYkdKaFkyc2dZVzVrSUdOb1pXTnJJR1p2Y2lCbFlYSnNlU0IwWlhKdGFXNWhkR2x2YmdvSkNRa0pDV2xtSUNnZ2JHbHpkRnNnWm1seWFXNW5TVzVrWlhnZ1hTNWhjSEJzZVNnZ2JXVnRiM0o1V3lBd0lGMHNJRzFsYlc5eWVWc2dNU0JkSUNrZ1BUMDlJR1poYkhObElDWW1DZ2tKQ1FrSkNXOXdkR2x2Ym5NdWMzUnZjRTl1Um1Gc2MyVWdLU0I3Q2dvSkNRa0pDUWt2THlCS2RXMXdJSFJ2SUdWdVpDQmhibVFnWm05eVoyVjBJSFJvWlNCa1lYUmhJSE52SUM1aFpHUWdaRzlsYzI0bmRDQnlaUzFtYVhKbENna0pDUWtKQ1dacGNtbHVaMGx1WkdWNElEMGdiR2x6ZEM1c1pXNW5kR2c3Q2drSkNRa0pDVzFsYlc5eWVTQTlJR1poYkhObE93b0pDUWtKQ1gwS0NRa0pDWDBLQ1FrSmZRb0tDUWtKTHk4Z1JtOXlaMlYwSUhSb1pTQmtZWFJoSUdsbUlIZGxKM0psSUdSdmJtVWdkMmwwYUNCcGRBb0pDUWxwWmlBb0lDRnZjSFJwYjI1ekxtMWxiVzl5ZVNBcElIc0tDUWtKQ1cxbGJXOXllU0E5SUdaaGJITmxPd29KQ1FsOUNnb0pDUWxtYVhKcGJtY2dQU0JtWVd4elpUc0tDZ2tKQ1M4dklFTnNaV0Z1SUhWd0lHbG1JSGRsSjNKbElHUnZibVVnWm1seWFXNW5JR1p2Y2lCbmIyOWtDZ2tKQ1dsbUlDZ2diRzlqYTJWa0lDa2dld29LQ1FrSkNTOHZJRXRsWlhBZ1lXNGdaVzF3ZEhrZ2JHbHpkQ0JwWmlCM1pTQm9ZWFpsSUdSaGRHRWdabTl5SUdaMWRIVnlaU0JoWkdRZ1kyRnNiSE1LQ1FrSkNXbG1JQ2dnYldWdGIzSjVJQ2tnZXdvSkNRa0pDV3hwYzNRZ1BTQmJYVHNLQ2drSkNRa3ZMeUJQZEdobGNuZHBjMlVzSUhSb2FYTWdiMkpxWldOMElHbHpJSE53Wlc1MENna0pDUWw5SUdWc2MyVWdld29KQ1FrSkNXeHBjM1FnUFNBaUlqc0tDUWtKQ1gwS0NRa0pmUW9KQ1gwc0Nnb0pDUzh2SUVGamRIVmhiQ0JEWVd4c1ltRmphM01nYjJKcVpXTjBDZ2tKYzJWc1ppQTlJSHNLQ2drSkNTOHZJRUZrWkNCaElHTmhiR3hpWVdOcklHOXlJR0VnWTI5c2JHVmpkR2x2YmlCdlppQmpZV3hzWW1GamEzTWdkRzhnZEdobElHeHBjM1FLQ1FrSllXUmtPaUJtZFc1amRHbHZiaWdwSUhzS0NRa0pDV2xtSUNnZ2JHbHpkQ0FwSUhzS0Nna0pDUWtKTHk4Z1NXWWdkMlVnYUdGMlpTQnRaVzF2Y25rZ1puSnZiU0JoSUhCaGMzUWdjblZ1TENCM1pTQnphRzkxYkdRZ1ptbHlaU0JoWm5SbGNpQmhaR1JwYm1jS0NRa0pDUWxwWmlBb0lHMWxiVzl5ZVNBbUppQWhabWx5YVc1bklDa2dld29KQ1FrSkNRbG1hWEpwYm1kSmJtUmxlQ0E5SUd4cGMzUXViR1Z1WjNSb0lDMGdNVHNLQ1FrSkNRa0pjWFZsZFdVdWNIVnphQ2dnYldWdGIzSjVJQ2s3Q2drSkNRa0pmUW9LQ1FrSkNRa29JR1oxYm1OMGFXOXVJR0ZrWkNnZ1lYSm5jeUFwSUhzS0NRa0pDUWtKYWxGMVpYSjVMbVZoWTJnb0lHRnlaM01zSUdaMWJtTjBhVzl1S0NCZkxDQmhjbWNnS1NCN0Nna0pDUWtKQ1FscFppQW9JR2x6Um5WdVkzUnBiMjRvSUdGeVp5QXBJQ2tnZXdvSkNRa0pDUWtKQ1dsbUlDZ2dJVzl3ZEdsdmJuTXVkVzVwY1hWbElIeDhJQ0Z6Wld4bUxtaGhjeWdnWVhKbklDa2dLU0I3Q2drSkNRa0pDUWtKQ1d4cGMzUXVjSFZ6YUNnZ1lYSm5JQ2s3Q2drSkNRa0pDUWtKZlFvSkNRa0pDUWtKZlNCbGJITmxJR2xtSUNnZ1lYSm5JQ1ltSUdGeVp5NXNaVzVuZEdnZ0ppWWdkRzlVZVhCbEtDQmhjbWNnS1NBaFBUMGdJbk4wY21sdVp5SWdLU0I3Q2dvSkNRa0pDUWtKQ1M4dklFbHVjM0JsWTNRZ2NtVmpkWEp6YVhabGJIa0tDUWtKQ1FrSkNRbGhaR1FvSUdGeVp5QXBPd29KQ1FrSkNRa0pmUW9KQ1FrSkNRbDlJQ2s3Q2drSkNRa0pmU0FwS0NCaGNtZDFiV1Z1ZEhNZ0tUc0tDZ2tKQ1FrSmFXWWdLQ0J0WlcxdmNua2dKaVlnSVdacGNtbHVaeUFwSUhzS0NRa0pDUWtKWm1seVpTZ3BPd29KQ1FrSkNYMEtDUWtKQ1gwS0NRa0pDWEpsZEhWeWJpQjBhR2x6T3dvSkNRbDlMQW9LQ1FrSkx5OGdVbVZ0YjNabElHRWdZMkZzYkdKaFkyc2dabkp2YlNCMGFHVWdiR2x6ZEFvSkNRbHlaVzF2ZG1VNklHWjFibU4wYVc5dUtDa2dld29KQ1FrSmFsRjFaWEo1TG1WaFkyZ29JR0Z5WjNWdFpXNTBjeXdnWm5WdVkzUnBiMjRvSUY4c0lHRnlaeUFwSUhzS0NRa0pDUWwyWVhJZ2FXNWtaWGc3Q2drSkNRa0pkMmhwYkdVZ0tDQW9JR2x1WkdWNElEMGdhbEYxWlhKNUxtbHVRWEp5WVhrb0lHRnlaeXdnYkdsemRDd2dhVzVrWlhnZ0tTQXBJRDRnTFRFZ0tTQjdDZ2tKQ1FrSkNXeHBjM1F1YzNCc2FXTmxLQ0JwYm1SbGVDd2dNU0FwT3dvS0NRa0pDUWtKTHk4Z1NHRnVaR3hsSUdacGNtbHVaeUJwYm1SbGVHVnpDZ2tKQ1FrSkNXbG1JQ2dnYVc1a1pYZ2dQRDBnWm1seWFXNW5TVzVrWlhnZ0tTQjdDZ2tKQ1FrSkNRbG1hWEpwYm1kSmJtUmxlQzB0T3dvSkNRa0pDUWw5Q2drSkNRa0pmUW9KQ1FrSmZTQXBPd29KQ1FrSmNtVjBkWEp1SUhSb2FYTTdDZ2tKQ1gwc0Nnb0pDUWt2THlCRGFHVmpheUJwWmlCaElHZHBkbVZ1SUdOaGJHeGlZV05ySUdseklHbHVJSFJvWlNCc2FYTjBMZ29KQ1Frdkx5QkpaaUJ1YnlCaGNtZDFiV1Z1ZENCcGN5Qm5hWFpsYml3Z2NtVjBkWEp1SUhkb1pYUm9aWElnYjNJZ2JtOTBJR3hwYzNRZ2FHRnpJR05oYkd4aVlXTnJjeUJoZEhSaFkyaGxaQzRLQ1FrSmFHRnpPaUJtZFc1amRHbHZiaWdnWm00Z0tTQjdDZ2tKQ1FseVpYUjFjbTRnWm00Z1B3b0pDUWtKQ1dwUmRXVnllUzVwYmtGeWNtRjVLQ0JtYml3Z2JHbHpkQ0FwSUQ0Z0xURWdPZ29KQ1FrSkNXeHBjM1F1YkdWdVozUm9JRDRnTURzS0NRa0pmU3dLQ2drSkNTOHZJRkpsYlc5MlpTQmhiR3dnWTJGc2JHSmhZMnR6SUdaeWIyMGdkR2hsSUd4cGMzUUtDUWtKWlcxd2RIazZJR1oxYm1OMGFXOXVLQ2tnZXdvSkNRa0phV1lnS0NCc2FYTjBJQ2tnZXdvSkNRa0pDV3hwYzNRZ1BTQmJYVHNLQ1FrSkNYMEtDUWtKQ1hKbGRIVnliaUIwYUdsek93b0pDUWw5TEFvS0NRa0pMeThnUkdsellXSnNaU0F1Wm1seVpTQmhibVFnTG1Ga1pBb0pDUWt2THlCQlltOXlkQ0JoYm5rZ1kzVnljbVZ1ZEM5d1pXNWthVzVuSUdWNFpXTjFkR2x2Ym5NS0NRa0pMeThnUTJ4bFlYSWdZV3hzSUdOaGJHeGlZV05yY3lCaGJtUWdkbUZzZFdWekNna0pDV1JwYzJGaWJHVTZJR1oxYm1OMGFXOXVLQ2tnZXdvSkNRa0piRzlqYTJWa0lEMGdjWFZsZFdVZ1BTQmJYVHNLQ1FrSkNXeHBjM1FnUFNCdFpXMXZjbmtnUFNBaUlqc0tDUWtKQ1hKbGRIVnliaUIwYUdsek93b0pDUWw5TEFvSkNRbGthWE5oWW14bFpEb2dablZ1WTNScGIyNG9LU0I3Q2drSkNRbHlaWFIxY200Z0lXeHBjM1E3Q2drSkNYMHNDZ29KQ1Frdkx5QkVhWE5oWW14bElDNW1hWEpsQ2drSkNTOHZJRUZzYzI4Z1pHbHpZV0pzWlNBdVlXUmtJSFZ1YkdWemN5QjNaU0JvWVhabElHMWxiVzl5ZVNBb2MybHVZMlVnYVhRZ2QyOTFiR1FnYUdGMlpTQnVieUJsWm1abFkzUXBDZ2tKQ1M4dklFRmliM0owSUdGdWVTQndaVzVrYVc1bklHVjRaV04xZEdsdmJuTUtDUWtKYkc5amF6b2dablZ1WTNScGIyNG9LU0I3Q2drSkNRbHNiMk5yWldRZ1BTQnhkV1YxWlNBOUlGdGRPd29KQ1FrSmFXWWdLQ0FoYldWdGIzSjVJQ1ltSUNGbWFYSnBibWNnS1NCN0Nna0pDUWtKYkdsemRDQTlJRzFsYlc5eWVTQTlJQ0lpT3dvSkNRa0pmUW9KQ1FrSmNtVjBkWEp1SUhSb2FYTTdDZ2tKQ1gwc0Nna0pDV3h2WTJ0bFpEb2dablZ1WTNScGIyNG9LU0I3Q2drSkNRbHlaWFIxY200Z0lTRnNiMk5yWldRN0Nna0pDWDBzQ2dvSkNRa3ZMeUJEWVd4c0lHRnNiQ0JqWVd4c1ltRmphM01nZDJsMGFDQjBhR1VnWjJsMlpXNGdZMjl1ZEdWNGRDQmhibVFnWVhKbmRXMWxiblJ6Q2drSkNXWnBjbVZYYVhSb09pQm1kVzVqZEdsdmJpZ2dZMjl1ZEdWNGRDd2dZWEpuY3lBcElIc0tDUWtKQ1dsbUlDZ2dJV3h2WTJ0bFpDQXBJSHNLQ1FrSkNRbGhjbWR6SUQwZ1lYSm5jeUI4ZkNCYlhUc0tDUWtKQ1FsaGNtZHpJRDBnV3lCamIyNTBaWGgwTENCaGNtZHpMbk5zYVdObElEOGdZWEpuY3k1emJHbGpaU2dwSURvZ1lYSm5jeUJkT3dvSkNRa0pDWEYxWlhWbExuQjFjMmdvSUdGeVozTWdLVHNLQ1FrSkNRbHBaaUFvSUNGbWFYSnBibWNnS1NCN0Nna0pDUWtKQ1dacGNtVW9LVHNLQ1FrSkNRbDlDZ2tKQ1FsOUNna0pDUWx5WlhSMWNtNGdkR2hwY3pzS0NRa0pmU3dLQ2drSkNTOHZJRU5oYkd3Z1lXeHNJSFJvWlNCallXeHNZbUZqYTNNZ2QybDBhQ0IwYUdVZ1oybDJaVzRnWVhKbmRXMWxiblJ6Q2drSkNXWnBjbVU2SUdaMWJtTjBhVzl1S0NrZ2V3b0pDUWtKYzJWc1ppNW1hWEpsVjJsMGFDZ2dkR2hwY3l3Z1lYSm5kVzFsYm5SeklDazdDZ2tKQ1FseVpYUjFjbTRnZEdocGN6c0tDUWtKZlN3S0Nna0pDUzh2SUZSdklHdHViM2NnYVdZZ2RHaGxJR05oYkd4aVlXTnJjeUJvWVhabElHRnNjbVZoWkhrZ1ltVmxiaUJqWVd4c1pXUWdZWFFnYkdWaGMzUWdiMjVqWlFvSkNRbG1hWEpsWkRvZ1puVnVZM1JwYjI0b0tTQjdDZ2tKQ1FseVpYUjFjbTRnSVNGbWFYSmxaRHNLQ1FrSmZRb0pDWDA3Q2dvSmNtVjBkWEp1SUhObGJHWTdDbjA3Q2dvS1puVnVZM1JwYjI0Z1NXUmxiblJwZEhrb0lIWWdLU0I3Q2dseVpYUjFjbTRnZGpzS2ZRcG1kVzVqZEdsdmJpQlVhSEp2ZDJWeUtDQmxlQ0FwSUhzS0NYUm9jbTkzSUdWNE93cDlDZ3BtZFc1amRHbHZiaUJoWkc5d2RGWmhiSFZsS0NCMllXeDFaU3dnY21WemIyeDJaU3dnY21WcVpXTjBMQ0J1YjFaaGJIVmxJQ2tnZXdvSmRtRnlJRzFsZEdodlpEc0tDZ2wwY25rZ2V3b0tDUWt2THlCRGFHVmpheUJtYjNJZ2NISnZiV2x6WlNCaGMzQmxZM1FnWm1seWMzUWdkRzhnY0hKcGRtbHNaV2RsSUhONWJtTm9jbTl1YjNWeklHSmxhR0YyYVc5eUNna0phV1lnS0NCMllXeDFaU0FtSmlCcGMwWjFibU4wYVc5dUtDQW9JRzFsZEdodlpDQTlJSFpoYkhWbExuQnliMjFwYzJVZ0tTQXBJQ2tnZXdvSkNRbHRaWFJvYjJRdVkyRnNiQ2dnZG1Gc2RXVWdLUzVrYjI1bEtDQnlaWE52YkhabElDa3VabUZwYkNnZ2NtVnFaV04wSUNrN0Nnb0pDUzh2SUU5MGFHVnlJSFJvWlc1aFlteGxjd29KQ1gwZ1pXeHpaU0JwWmlBb0lIWmhiSFZsSUNZbUlHbHpSblZ1WTNScGIyNG9JQ2dnYldWMGFHOWtJRDBnZG1Gc2RXVXVkR2hsYmlBcElDa2dLU0I3Q2drSkNXMWxkR2h2WkM1allXeHNLQ0IyWVd4MVpTd2djbVZ6YjJ4MlpTd2djbVZxWldOMElDazdDZ29KQ1M4dklFOTBhR1Z5SUc1dmJpMTBhR1Z1WVdKc1pYTUtDUWw5SUdWc2MyVWdld29LQ1FrSkx5OGdRMjl1ZEhKdmJDQmdjbVZ6YjJ4MlpXQWdZWEpuZFcxbGJuUnpJR0o1SUd4bGRIUnBibWNnUVhKeVlYa2pjMnhwWTJVZ1kyRnpkQ0JpYjI5c1pXRnVJR0J1YjFaaGJIVmxZQ0IwYnlCcGJuUmxaMlZ5T2dvSkNRa3ZMeUFxSUdaaGJITmxPaUJiSUhaaGJIVmxJRjB1YzJ4cFkyVW9JREFnS1NBOVBpQnlaWE52YkhabEtDQjJZV3gxWlNBcENna0pDUzh2SUNvZ2RISjFaVG9nV3lCMllXeDFaU0JkTG5Oc2FXTmxLQ0F4SUNrZ1BUNGdjbVZ6YjJ4MlpTZ3BDZ2tKQ1hKbGMyOXNkbVV1WVhCd2JIa29JSFZ1WkdWbWFXNWxaQ3dnV3lCMllXeDFaU0JkTG5Oc2FXTmxLQ0J1YjFaaGJIVmxJQ2tnS1RzS0NRbDlDZ29KTHk4Z1JtOXlJRkJ5YjIxcGMyVnpMMEVyTENCamIyNTJaWEowSUdWNFkyVndkR2x2Ym5NZ2FXNTBieUJ5WldwbFkzUnBiMjV6Q2drdkx5QlRhVzVqWlNCcVVYVmxjbmt1ZDJobGJpQmtiMlZ6YmlkMElIVnVkM0poY0NCMGFHVnVZV0pzWlhNc0lIZGxJR05oYmlCemEybHdJSFJvWlNCbGVIUnlZU0JqYUdWamEzTWdZWEJ3WldGeWFXNW5JR2x1Q2drdkx5QkVaV1psY25KbFpDTjBhR1Z1SUhSdklHTnZibVJwZEdsdmJtRnNiSGtnYzNWd2NISmxjM01nY21WcVpXTjBhVzl1TGdvSmZTQmpZWFJqYUNBb0lIWmhiSFZsSUNrZ2V3b0tDUWt2THlCVGRYQndiM0owT2lCQmJtUnliMmxrSURRdU1DQnZibXg1Q2drSkx5OGdVM1J5YVdOMElHMXZaR1VnWm5WdVkzUnBiMjV6SUdsdWRtOXJaV1FnZDJsMGFHOTFkQ0F1WTJGc2JDOHVZWEJ3YkhrZ1oyVjBJR2RzYjJKaGJDMXZZbXBsWTNRZ1kyOXVkR1Y0ZEFvSkNYSmxhbVZqZEM1aGNIQnNlU2dnZFc1a1pXWnBibVZrTENCYklIWmhiSFZsSUYwZ0tUc0tDWDBLZlFvS2FsRjFaWEo1TG1WNGRHVnVaQ2dnZXdvS0NVUmxabVZ5Y21Wa09pQm1kVzVqZEdsdmJpZ2dablZ1WXlBcElIc0tDUWwyWVhJZ2RIVndiR1Z6SUQwZ1d3b0tDUWtKQ1M4dklHRmpkR2x2Yml3Z1lXUmtJR3hwYzNSbGJtVnlMQ0JqWVd4c1ltRmphM01zQ2drSkNRa3ZMeUF1TGk0Z0xuUm9aVzRnYUdGdVpHeGxjbk1zSUdGeVozVnRaVzUwSUdsdVpHVjRMQ0JiWm1sdVlXd2djM1JoZEdWZENna0pDUWxiSUNKdWIzUnBabmtpTENBaWNISnZaM0psYzNNaUxDQnFVWFZsY25rdVEyRnNiR0poWTJ0ektDQWliV1Z0YjNKNUlpQXBMQW9KQ1FrSkNXcFJkV1Z5ZVM1RFlXeHNZbUZqYTNNb0lDSnRaVzF2Y25raUlDa3NJRElnWFN3S0NRa0pDVnNnSW5KbGMyOXNkbVVpTENBaVpHOXVaU0lzSUdwUmRXVnllUzVEWVd4c1ltRmphM01vSUNKdmJtTmxJRzFsYlc5eWVTSWdLU3dLQ1FrSkNRbHFVWFZsY25rdVEyRnNiR0poWTJ0ektDQWliMjVqWlNCdFpXMXZjbmtpSUNrc0lEQXNJQ0p5WlhOdmJIWmxaQ0lnWFN3S0NRa0pDVnNnSW5KbGFtVmpkQ0lzSUNKbVlXbHNJaXdnYWxGMVpYSjVMa05oYkd4aVlXTnJjeWdnSW05dVkyVWdiV1Z0YjNKNUlpQXBMQW9KQ1FrSkNXcFJkV1Z5ZVM1RFlXeHNZbUZqYTNNb0lDSnZibU5sSUcxbGJXOXllU0lnS1N3Z01Td2dJbkpsYW1WamRHVmtJaUJkQ2drSkNWMHNDZ2tKQ1hOMFlYUmxJRDBnSW5CbGJtUnBibWNpTEFvSkNRbHdjbTl0YVhObElEMGdld29KQ1FrSmMzUmhkR1U2SUdaMWJtTjBhVzl1S0NrZ2V3b0pDUWtKQ1hKbGRIVnliaUJ6ZEdGMFpUc0tDUWtKQ1gwc0Nna0pDUWxoYkhkaGVYTTZJR1oxYm1OMGFXOXVLQ2tnZXdvSkNRa0pDV1JsWm1WeWNtVmtMbVJ2Ym1Vb0lHRnlaM1Z0Wlc1MGN5QXBMbVpoYVd3b0lHRnlaM1Z0Wlc1MGN5QXBPd29KQ1FrSkNYSmxkSFZ5YmlCMGFHbHpPd29KQ1FrSmZTd0tDUWtKQ1NKallYUmphQ0k2SUdaMWJtTjBhVzl1S0NCbWJpQXBJSHNLQ1FrSkNRbHlaWFIxY200Z2NISnZiV2x6WlM1MGFHVnVLQ0J1ZFd4c0xDQm1iaUFwT3dvSkNRa0pmU3dLQ2drSkNRa3ZMeUJMWldWd0lIQnBjR1VnWm05eUlHSmhZMnN0WTI5dGNHRjBDZ2tKQ1Fsd2FYQmxPaUJtZFc1amRHbHZiaWdnTHlvZ1ptNUViMjVsTENCbWJrWmhhV3dzSUdadVVISnZaM0psYzNNZ0tpOGdLU0I3Q2drSkNRa0pkbUZ5SUdadWN5QTlJR0Z5WjNWdFpXNTBjenNLQ2drSkNRa0pjbVYwZFhKdUlHcFJkV1Z5ZVM1RVpXWmxjbkpsWkNnZ1puVnVZM1JwYjI0b0lHNWxkMFJsWm1WeUlDa2dld29KQ1FrSkNRbHFVWFZsY25rdVpXRmphQ2dnZEhWd2JHVnpMQ0JtZFc1amRHbHZiaWdnYVN3Z2RIVndiR1VnS1NCN0Nnb0pDUWtKQ1FrSkx5OGdUV0Z3SUhSMWNHeGxjeUFvY0hKdlozSmxjM01zSUdSdmJtVXNJR1poYVd3cElIUnZJR0Z5WjNWdFpXNTBjeUFvWkc5dVpTd2dabUZwYkN3Z2NISnZaM0psYzNNcENna0pDUWtKQ1FsMllYSWdabTRnUFNCcGMwWjFibU4wYVc5dUtDQm1ibk5iSUhSMWNHeGxXeUEwSUYwZ1hTQXBJQ1ltSUdadWMxc2dkSFZ3YkdWYklEUWdYU0JkT3dvS0NRa0pDUWtKQ1M4dklHUmxabVZ5Y21Wa0xuQnliMmR5WlhOektHWjFibU4wYVc5dUtDa2dleUJpYVc1a0lIUnZJRzVsZDBSbFptVnlJRzl5SUc1bGQwUmxabVZ5TG01dmRHbG1lU0I5S1FvSkNRa0pDUWtKTHk4Z1pHVm1aWEp5WldRdVpHOXVaU2htZFc1amRHbHZiaWdwSUhzZ1ltbHVaQ0IwYnlCdVpYZEVaV1psY2lCdmNpQnVaWGRFWldabGNpNXlaWE52YkhabElIMHBDZ2tKQ1FrSkNRa3ZMeUJrWldabGNuSmxaQzVtWVdsc0tHWjFibU4wYVc5dUtDa2dleUJpYVc1a0lIUnZJRzVsZDBSbFptVnlJRzl5SUc1bGQwUmxabVZ5TG5KbGFtVmpkQ0I5S1FvSkNRa0pDUWtKWkdWbVpYSnlaV1JiSUhSMWNHeGxXeUF4SUYwZ1hTZ2dablZ1WTNScGIyNG9LU0I3Q2drSkNRa0pDUWtKZG1GeUlISmxkSFZ5Ym1Wa0lEMGdabTRnSmlZZ1ptNHVZWEJ3Ykhrb0lIUm9hWE1zSUdGeVozVnRaVzUwY3lBcE93b0pDUWtKQ1FrSkNXbG1JQ2dnY21WMGRYSnVaV1FnSmlZZ2FYTkdkVzVqZEdsdmJpZ2djbVYwZFhKdVpXUXVjSEp2YldselpTQXBJQ2tnZXdvSkNRa0pDUWtKQ1FseVpYUjFjbTVsWkM1d2NtOXRhWE5sS0NrS0NRa0pDUWtKQ1FrSkNTNXdjbTluY21WemN5Z2dibVYzUkdWbVpYSXVibTkwYVdaNUlDa0tDUWtKQ1FrSkNRa0pDUzVrYjI1bEtDQnVaWGRFWldabGNpNXlaWE52YkhabElDa0tDUWtKQ1FrSkNRa0pDUzVtWVdsc0tDQnVaWGRFWldabGNpNXlaV3BsWTNRZ0tUc0tDUWtKQ1FrSkNRbDlJR1ZzYzJVZ2V3b0pDUWtKQ1FrSkNRbHVaWGRFWldabGNsc2dkSFZ3YkdWYklEQWdYU0FySUNKWGFYUm9JaUJkS0FvSkNRa0pDUWtKQ1FrSmRHaHBjeXdLQ1FrSkNRa0pDUWtKQ1dadUlEOGdXeUJ5WlhSMWNtNWxaQ0JkSURvZ1lYSm5kVzFsYm5SekNna0pDUWtKQ1FrSkNTazdDZ2tKQ1FrSkNRa0pmUW9KQ1FrSkNRa0pmU0FwT3dvSkNRa0pDUWw5SUNrN0Nna0pDUWtKQ1dadWN5QTlJRzUxYkd3N0Nna0pDUWtKZlNBcExuQnliMjFwYzJVb0tUc0tDUWtKQ1gwc0Nna0pDUWwwYUdWdU9pQm1kVzVqZEdsdmJpZ2diMjVHZFd4bWFXeHNaV1FzSUc5dVVtVnFaV04wWldRc0lHOXVVSEp2WjNKbGMzTWdLU0I3Q2drSkNRa0pkbUZ5SUcxaGVFUmxjSFJvSUQwZ01Ec0tDUWtKQ1FsbWRXNWpkR2x2YmlCeVpYTnZiSFpsS0NCa1pYQjBhQ3dnWkdWbVpYSnlaV1FzSUdoaGJtUnNaWElzSUhOd1pXTnBZV3dnS1NCN0Nna0pDUWtKQ1hKbGRIVnliaUJtZFc1amRHbHZiaWdwSUhzS0NRa0pDUWtKQ1haaGNpQjBhR0YwSUQwZ2RHaHBjeXdLQ1FrSkNRa0pDUWxoY21keklEMGdZWEpuZFcxbGJuUnpMQW9KQ1FrSkNRa0pDVzFwWjJoMFZHaHliM2NnUFNCbWRXNWpkR2x2YmlncElIc0tDUWtKQ1FrSkNRa0pkbUZ5SUhKbGRIVnlibVZrTENCMGFHVnVPd29LQ1FrSkNRa0pDUWtKTHk4Z1UzVndjRzl5ZERvZ1VISnZiV2x6WlhNdlFTc2djMlZqZEdsdmJpQXlMak11TXk0ekxqTUtDUWtKQ1FrSkNRa0pMeThnYUhSMGNITTZMeTl3Y205dGFYTmxjMkZ3YkhWekxtTnZiUzhqY0c5cGJuUXROVGtLQ1FrSkNRa0pDUWtKTHk4Z1NXZHViM0psSUdSdmRXSnNaUzF5WlhOdmJIVjBhVzl1SUdGMGRHVnRjSFJ6Q2drSkNRa0pDUWtKQ1dsbUlDZ2daR1Z3ZEdnZ1BDQnRZWGhFWlhCMGFDQXBJSHNLQ1FrSkNRa0pDUWtKQ1hKbGRIVnlianNLQ1FrSkNRa0pDUWtKZlFvS0NRa0pDUWtKQ1FrSmNtVjBkWEp1WldRZ1BTQm9ZVzVrYkdWeUxtRndjR3g1S0NCMGFHRjBMQ0JoY21keklDazdDZ29KQ1FrSkNRa0pDUWt2THlCVGRYQndiM0owT2lCUWNtOXRhWE5sY3k5Qkt5QnpaV04wYVc5dUlESXVNeTR4Q2drSkNRa0pDUWtKQ1M4dklHaDBkSEJ6T2k4dmNISnZiV2x6WlhOaGNHeDFjeTVqYjIwdkkzQnZhVzUwTFRRNENna0pDUWtKQ1FrSkNXbG1JQ2dnY21WMGRYSnVaV1FnUFQwOUlHUmxabVZ5Y21Wa0xuQnliMjFwYzJVb0tTQXBJSHNLQ1FrSkNRa0pDUWtKQ1hSb2NtOTNJRzVsZHlCVWVYQmxSWEp5YjNJb0lDSlVhR1Z1WVdKc1pTQnpaV3htTFhKbGMyOXNkWFJwYjI0aUlDazdDZ2tKQ1FrSkNRa0pDWDBLQ2drSkNRa0pDUWtKQ1M4dklGTjFjSEJ2Y25RNklGQnliMjFwYzJWekwwRXJJSE5sWTNScGIyNXpJREl1TXk0ekxqRXNJRE11TlFvSkNRa0pDUWtKQ1Frdkx5Qm9kSFJ3Y3pvdkwzQnliMjFwYzJWellYQnNkWE11WTI5dEx5TndiMmx1ZEMwMU5Bb0pDUWtKQ1FrSkNRa3ZMeUJvZEhSd2N6b3ZMM0J5YjIxcGMyVnpZWEJzZFhNdVkyOXRMeU53YjJsdWRDMDNOUW9KQ1FrSkNRa0pDUWt2THlCU1pYUnlhV1YyWlNCZ2RHaGxibUFnYjI1c2VTQnZibU5sQ2drSkNRa0pDUWtKQ1hSb1pXNGdQU0J5WlhSMWNtNWxaQ0FtSmdvS0NRa0pDUWtKQ1FrSkNTOHZJRk4xY0hCdmNuUTZJRkJ5YjIxcGMyVnpMMEVySUhObFkzUnBiMjRnTWk0ekxqUUtDUWtKQ1FrSkNRa0pDUzh2SUdoMGRIQnpPaTh2Y0hKdmJXbHpaWE5oY0d4MWN5NWpiMjB2STNCdmFXNTBMVFkwQ2drSkNRa0pDUWtKQ1Frdkx5QlBibXg1SUdOb1pXTnJJRzlpYW1WamRITWdZVzVrSUdaMWJtTjBhVzl1Y3lCbWIzSWdkR2hsYm1GaWFXeHBkSGtLQ1FrSkNRa0pDUWtKQ1NnZ2RIbHdaVzltSUhKbGRIVnlibVZrSUQwOVBTQWliMkpxWldOMElpQjhmQW9KQ1FrSkNRa0pDUWtKQ1hSNWNHVnZaaUJ5WlhSMWNtNWxaQ0E5UFQwZ0ltWjFibU4wYVc5dUlpQXBJQ1ltQ2drSkNRa0pDUWtKQ1FseVpYUjFjbTVsWkM1MGFHVnVPd29LQ1FrSkNRa0pDUWtKTHk4Z1NHRnVaR3hsSUdFZ2NtVjBkWEp1WldRZ2RHaGxibUZpYkdVS0NRa0pDUWtKQ1FrSmFXWWdLQ0JwYzBaMWJtTjBhVzl1S0NCMGFHVnVJQ2tnS1NCN0Nnb0pDUWtKQ1FrSkNRa0pMeThnVTNCbFkybGhiQ0J3Y205alpYTnpiM0p6SUNodWIzUnBabmtwSUdwMWMzUWdkMkZwZENCbWIzSWdjbVZ6YjJ4MWRHbHZiZ29KQ1FrSkNRa0pDUWtKYVdZZ0tDQnpjR1ZqYVdGc0lDa2dld29KQ1FrSkNRa0pDUWtKQ1hSb1pXNHVZMkZzYkNnS0NRa0pDUWtKQ1FrSkNRa0pjbVYwZFhKdVpXUXNDZ2tKQ1FrSkNRa0pDUWtKQ1hKbGMyOXNkbVVvSUcxaGVFUmxjSFJvTENCa1pXWmxjbkpsWkN3Z1NXUmxiblJwZEhrc0lITndaV05wWVd3Z0tTd0tDUWtKQ1FrSkNRa0pDUWtKY21WemIyeDJaU2dnYldGNFJHVndkR2dzSUdSbFptVnljbVZrTENCVWFISnZkMlZ5TENCemNHVmphV0ZzSUNrS0NRa0pDUWtKQ1FrSkNRa3BPd29LQ1FrSkNRa0pDUWtKQ1M4dklFNXZjbTFoYkNCd2NtOWpaWE56YjNKeklDaHlaWE52YkhabEtTQmhiSE52SUdodmIyc2dhVzUwYnlCd2NtOW5jbVZ6Y3dvSkNRa0pDUWtKQ1FrSmZTQmxiSE5sSUhzS0Nna0pDUWtKQ1FrSkNRa0pMeThnTGk0dVlXNWtJR1JwYzNKbFoyRnlaQ0J2YkdSbGNpQnlaWE52YkhWMGFXOXVJSFpoYkhWbGN3b0pDUWtKQ1FrSkNRa0pDVzFoZUVSbGNIUm9LeXM3Q2dvSkNRa0pDUWtKQ1FrSkNYUm9aVzR1WTJGc2JDZ0tDUWtKQ1FrSkNRa0pDUWtKY21WMGRYSnVaV1FzQ2drSkNRa0pDUWtKQ1FrSkNYSmxjMjlzZG1Vb0lHMWhlRVJsY0hSb0xDQmtaV1psY25KbFpDd2dTV1JsYm5ScGRIa3NJSE53WldOcFlXd2dLU3dLQ1FrSkNRa0pDUWtKQ1FrSmNtVnpiMngyWlNnZ2JXRjRSR1Z3ZEdnc0lHUmxabVZ5Y21Wa0xDQlVhSEp2ZDJWeUxDQnpjR1ZqYVdGc0lDa3NDZ2tKQ1FrSkNRa0pDUWtKQ1hKbGMyOXNkbVVvSUcxaGVFUmxjSFJvTENCa1pXWmxjbkpsWkN3Z1NXUmxiblJwZEhrc0Nna0pDUWtKQ1FrSkNRa0pDUWxrWldabGNuSmxaQzV1YjNScFpubFhhWFJvSUNrS0NRa0pDUWtKQ1FrSkNRa3BPd29KQ1FrSkNRa0pDUWtKZlFvS0NRa0pDUWtKQ1FrSkx5OGdTR0Z1Wkd4bElHRnNiQ0J2ZEdobGNpQnlaWFIxY201bFpDQjJZV3gxWlhNS0NRa0pDUWtKQ1FrSmZTQmxiSE5sSUhzS0Nna0pDUWtKQ1FrSkNRa3ZMeUJQYm14NUlITjFZbk4wYVhSMWRHVWdhR0Z1Wkd4bGNuTWdjR0Z6Y3lCdmJpQmpiMjUwWlhoMENna0pDUWtKQ1FrSkNRa3ZMeUJoYm1RZ2JYVnNkR2x3YkdVZ2RtRnNkV1Z6SUNodWIyNHRjM0JsWXlCaVpXaGhkbWx2Y2lrS0NRa0pDUWtKQ1FrSkNXbG1JQ2dnYUdGdVpHeGxjaUFoUFQwZ1NXUmxiblJwZEhrZ0tTQjdDZ2tKQ1FrSkNRa0pDUWtKZEdoaGRDQTlJSFZ1WkdWbWFXNWxaRHNLQ1FrSkNRa0pDUWtKQ1FsaGNtZHpJRDBnV3lCeVpYUjFjbTVsWkNCZE93b0pDUWtKQ1FrSkNRa0pmUW9LQ1FrSkNRa0pDUWtKQ1M4dklGQnliMk5sYzNNZ2RHaGxJSFpoYkhWbEtITXBDZ2tKQ1FrSkNRa0pDUWt2THlCRVpXWmhkV3gwSUhCeWIyTmxjM01nYVhNZ2NtVnpiMngyWlFvSkNRa0pDUWtKQ1FrSktDQnpjR1ZqYVdGc0lIeDhJR1JsWm1WeWNtVmtMbkpsYzI5c2RtVlhhWFJvSUNrb0lIUm9ZWFFzSUdGeVozTWdLVHNLQ1FrSkNRa0pDUWtKZlFvSkNRa0pDUWtKQ1gwc0Nnb0pDUWtKQ1FrSkNTOHZJRTl1YkhrZ2JtOXliV0ZzSUhCeWIyTmxjM052Y25NZ0tISmxjMjlzZG1VcElHTmhkR05vSUdGdVpDQnlaV3BsWTNRZ1pYaGpaWEIwYVc5dWN3b0pDUWtKQ1FrSkNYQnliMk5sYzNNZ1BTQnpjR1ZqYVdGc0lEOEtDUWtKQ1FrSkNRa0piV2xuYUhSVWFISnZkeUE2Q2drSkNRa0pDUWtKQ1daMWJtTjBhVzl1S0NrZ2V3b0pDUWtKQ1FrSkNRa0pkSEo1SUhzS0NRa0pDUWtKQ1FrSkNRbHRhV2RvZEZSb2NtOTNLQ2s3Q2drSkNRa0pDUWtKQ1FsOUlHTmhkR05vSUNnZ1pTQXBJSHNLQ2drSkNRa0pDUWtKQ1FrSmFXWWdLQ0JxVVhWbGNua3VSR1ZtWlhKeVpXUXVaWGhqWlhCMGFXOXVTRzl2YXlBcElIc0tDUWtKQ1FrSkNRa0pDUWtKYWxGMVpYSjVMa1JsWm1WeWNtVmtMbVY0WTJWd2RHbHZia2h2YjJzb0lHVXNDZ2tKQ1FrSkNRa0pDUWtKQ1Fsd2NtOWpaWE56TG5OMFlXTnJWSEpoWTJVZ0tUc0tDUWtKQ1FrSkNRa0pDUWw5Q2dvSkNRa0pDUWtKQ1FrSkNTOHZJRk4xY0hCdmNuUTZJRkJ5YjIxcGMyVnpMMEVySUhObFkzUnBiMjRnTWk0ekxqTXVNeTQwTGpFS0NRa0pDUWtKQ1FrSkNRa3ZMeUJvZEhSd2N6b3ZMM0J5YjIxcGMyVnpZWEJzZFhNdVkyOXRMeU53YjJsdWRDMDJNUW9KQ1FrSkNRa0pDUWtKQ1M4dklFbG5ibTl5WlNCd2IzTjBMWEpsYzI5c2RYUnBiMjRnWlhoalpYQjBhVzl1Y3dvSkNRa0pDUWtKQ1FrSkNXbG1JQ2dnWkdWd2RHZ2dLeUF4SUQ0OUlHMWhlRVJsY0hSb0lDa2dld29LQ1FrSkNRa0pDUWtKQ1FrSkx5OGdUMjVzZVNCemRXSnpkR2wwZFhSbElHaGhibVJzWlhKeklIQmhjM01nYjI0Z1kyOXVkR1Y0ZEFvSkNRa0pDUWtKQ1FrSkNRa3ZMeUJoYm1RZ2JYVnNkR2x3YkdVZ2RtRnNkV1Z6SUNodWIyNHRjM0JsWXlCaVpXaGhkbWx2Y2lrS0NRa0pDUWtKQ1FrSkNRa0phV1lnS0NCb1lXNWtiR1Z5SUNFOVBTQlVhSEp2ZDJWeUlDa2dld29KQ1FrSkNRa0pDUWtKQ1FrSmRHaGhkQ0E5SUhWdVpHVm1hVzVsWkRzS0NRa0pDUWtKQ1FrSkNRa0pDV0Z5WjNNZ1BTQmJJR1VnWFRzS0NRa0pDUWtKQ1FrSkNRa0pmUW9LQ1FrSkNRa0pDUWtKQ1FrSlpHVm1aWEp5WldRdWNtVnFaV04wVjJsMGFDZ2dkR2hoZEN3Z1lYSm5jeUFwT3dvSkNRa0pDUWtKQ1FrSkNYMEtDUWtKQ1FrSkNRa0pDWDBLQ1FrSkNRa0pDUWtKZlRzS0Nna0pDUWtKQ1Frdkx5QlRkWEJ3YjNKME9pQlFjbTl0YVhObGN5OUJLeUJ6WldOMGFXOXVJREl1TXk0ekxqTXVNUW9KQ1FrSkNRa0pMeThnYUhSMGNITTZMeTl3Y205dGFYTmxjMkZ3YkhWekxtTnZiUzhqY0c5cGJuUXROVGNLQ1FrSkNRa0pDUzh2SUZKbExYSmxjMjlzZG1VZ2NISnZiV2x6WlhNZ2FXMXRaV1JwWVhSbGJIa2dkRzhnWkc5a1oyVWdabUZzYzJVZ2NtVnFaV04wYVc5dUlHWnliMjBLQ1FrSkNRa0pDUzh2SUhOMVluTmxjWFZsYm5RZ1pYSnliM0p6Q2drSkNRa0pDUWxwWmlBb0lHUmxjSFJvSUNrZ2V3b0pDUWtKQ1FrSkNYQnliMk5sYzNNb0tUc0tDUWtKQ1FrSkNYMGdaV3h6WlNCN0Nnb0pDUWtKQ1FrSkNTOHZJRU5oYkd3Z1lXNGdiM0IwYVc5dVlXd2dhRzl2YXlCMGJ5QnlaV052Y21RZ2RHaGxJSE4wWVdOckxDQnBiaUJqWVhObElHOW1JR1Y0WTJWd2RHbHZiZ29KQ1FrSkNRa0pDUzh2SUhOcGJtTmxJR2wwSjNNZ2IzUm9aWEozYVhObElHeHZjM1FnZDJobGJpQmxlR1ZqZFhScGIyNGdaMjlsY3lCaGMzbHVZd29KQ1FrSkNRa0pDV2xtSUNnZ2FsRjFaWEo1TGtSbFptVnljbVZrTG1kbGRGTjBZV05yU0c5dmF5QXBJSHNLQ1FrSkNRa0pDUWtKY0hKdlkyVnpjeTV6ZEdGamExUnlZV05sSUQwZ2FsRjFaWEo1TGtSbFptVnljbVZrTG1kbGRGTjBZV05yU0c5dmF5Z3BPd29KQ1FrSkNRa0pDWDBLQ1FrSkNRa0pDUWwzYVc1a2IzY3VjMlYwVkdsdFpXOTFkQ2dnY0hKdlkyVnpjeUFwT3dvSkNRa0pDUWtKZlFvSkNRa0pDUWw5T3dvSkNRa0pDWDBLQ2drSkNRa0pjbVYwZFhKdUlHcFJkV1Z5ZVM1RVpXWmxjbkpsWkNnZ1puVnVZM1JwYjI0b0lHNWxkMFJsWm1WeUlDa2dld29LQ1FrSkNRa0pMeThnY0hKdlozSmxjM05mYUdGdVpHeGxjbk11WVdSa0tDQXVMaTRnS1FvSkNRa0pDUWwwZFhCc1pYTmJJREFnWFZzZ015QmRMbUZrWkNnS0NRa0pDUWtKQ1hKbGMyOXNkbVVvQ2drSkNRa0pDUWtKTUN3S0NRa0pDUWtKQ1FsdVpYZEVaV1psY2l3S0NRa0pDUWtKQ1FscGMwWjFibU4wYVc5dUtDQnZibEJ5YjJkeVpYTnpJQ2tnUHdvSkNRa0pDUWtKQ1FsdmJsQnliMmR5WlhOeklEb0tDUWtKQ1FrSkNRa0pTV1JsYm5ScGRIa3NDZ2tKQ1FrSkNRa0pibVYzUkdWbVpYSXVibTkwYVdaNVYybDBhQW9KQ1FrSkNRa0pLUW9KQ1FrSkNRa3BPd29LQ1FrSkNRa0pMeThnWm5Wc1ptbHNiR1ZrWDJoaGJtUnNaWEp6TG1Ga1pDZ2dMaTR1SUNrS0NRa0pDUWtKZEhWd2JHVnpXeUF4SUYxYklETWdYUzVoWkdRb0Nna0pDUWtKQ1FseVpYTnZiSFpsS0FvSkNRa0pDUWtKQ1RBc0Nna0pDUWtKQ1FrSmJtVjNSR1ZtWlhJc0Nna0pDUWtKQ1FrSmFYTkdkVzVqZEdsdmJpZ2diMjVHZFd4bWFXeHNaV1FnS1NBL0Nna0pDUWtKQ1FrSkNXOXVSblZzWm1sc2JHVmtJRG9LQ1FrSkNRa0pDUWtKU1dSbGJuUnBkSGtLQ1FrSkNRa0pDU2tLQ1FrSkNRa0pLVHNLQ2drSkNRa0pDUzh2SUhKbGFtVmpkR1ZrWDJoaGJtUnNaWEp6TG1Ga1pDZ2dMaTR1SUNrS0NRa0pDUWtKZEhWd2JHVnpXeUF5SUYxYklETWdYUzVoWkdRb0Nna0pDUWtKQ1FseVpYTnZiSFpsS0FvSkNRa0pDUWtKQ1RBc0Nna0pDUWtKQ1FrSmJtVjNSR1ZtWlhJc0Nna0pDUWtKQ1FrSmFYTkdkVzVqZEdsdmJpZ2diMjVTWldwbFkzUmxaQ0FwSUQ4S0NRa0pDUWtKQ1FrSmIyNVNaV3BsWTNSbFpDQTZDZ2tKQ1FrSkNRa0pDVlJvY205M1pYSUtDUWtKQ1FrSkNTa0tDUWtKQ1FrSktUc0tDUWtKQ1FsOUlDa3VjSEp2YldselpTZ3BPd29KQ1FrSmZTd0tDZ2tKQ1Frdkx5QkhaWFFnWVNCd2NtOXRhWE5sSUdadmNpQjBhR2x6SUdSbFptVnljbVZrQ2drSkNRa3ZMeUJKWmlCdlltb2dhWE1nY0hKdmRtbGtaV1FzSUhSb1pTQndjbTl0YVhObElHRnpjR1ZqZENCcGN5QmhaR1JsWkNCMGJ5QjBhR1VnYjJKcVpXTjBDZ2tKQ1Fsd2NtOXRhWE5sT2lCbWRXNWpkR2x2YmlnZ2IySnFJQ2tnZXdvSkNRa0pDWEpsZEhWeWJpQnZZbW9nSVQwZ2JuVnNiQ0EvSUdwUmRXVnllUzVsZUhSbGJtUW9JRzlpYWl3Z2NISnZiV2x6WlNBcElEb2djSEp2YldselpUc0tDUWtKQ1gwS0NRa0pmU3dLQ1FrSlpHVm1aWEp5WldRZ1BTQjdmVHNLQ2drSkx5OGdRV1JrSUd4cGMzUXRjM0JsWTJsbWFXTWdiV1YwYUc5a2N3b0pDV3BSZFdWeWVTNWxZV05vS0NCMGRYQnNaWE1zSUdaMWJtTjBhVzl1S0NCcExDQjBkWEJzWlNBcElIc0tDUWtKZG1GeUlHeHBjM1FnUFNCMGRYQnNaVnNnTWlCZExBb0pDUWtKYzNSaGRHVlRkSEpwYm1jZ1BTQjBkWEJzWlZzZ05TQmRPd29LQ1FrSkx5OGdjSEp2YldselpTNXdjbTluY21WemN5QTlJR3hwYzNRdVlXUmtDZ2tKQ1M4dklIQnliMjFwYzJVdVpHOXVaU0E5SUd4cGMzUXVZV1JrQ2drSkNTOHZJSEJ5YjIxcGMyVXVabUZwYkNBOUlHeHBjM1F1WVdSa0Nna0pDWEJ5YjIxcGMyVmJJSFIxY0d4bFd5QXhJRjBnWFNBOUlHeHBjM1F1WVdSa093b0tDUWtKTHk4Z1NHRnVaR3hsSUhOMFlYUmxDZ2tKQ1dsbUlDZ2djM1JoZEdWVGRISnBibWNnS1NCN0Nna0pDUWxzYVhOMExtRmtaQ2dLQ1FrSkNRbG1kVzVqZEdsdmJpZ3BJSHNLQ2drSkNRa0pDUzh2SUhOMFlYUmxJRDBnSW5KbGMyOXNkbVZrSWlBb2FTNWxMaXdnWm5Wc1ptbHNiR1ZrS1FvSkNRa0pDUWt2THlCemRHRjBaU0E5SUNKeVpXcGxZM1JsWkNJS0NRa0pDUWtKYzNSaGRHVWdQU0J6ZEdGMFpWTjBjbWx1WnpzS0NRa0pDUWw5TEFvS0NRa0pDUWt2THlCeVpXcGxZM1JsWkY5allXeHNZbUZqYTNNdVpHbHpZV0pzWlFvSkNRa0pDUzh2SUdaMWJHWnBiR3hsWkY5allXeHNZbUZqYTNNdVpHbHpZV0pzWlFvSkNRa0pDWFIxY0d4bGMxc2dNeUF0SUdrZ1hWc2dNaUJkTG1ScGMyRmliR1VzQ2dvSkNRa0pDUzh2SUhKbGFtVmpkR1ZrWDJoaGJtUnNaWEp6TG1ScGMyRmliR1VLQ1FrSkNRa3ZMeUJtZFd4bWFXeHNaV1JmYUdGdVpHeGxjbk11WkdsellXSnNaUW9KQ1FrSkNYUjFjR3hsYzFzZ015QXRJR2tnWFZzZ015QmRMbVJwYzJGaWJHVXNDZ29KQ1FrSkNTOHZJSEJ5YjJkeVpYTnpYMk5oYkd4aVlXTnJjeTVzYjJOckNna0pDUWtKZEhWd2JHVnpXeUF3SUYxYklESWdYUzVzYjJOckxBb0tDUWtKQ1Frdkx5QndjbTluY21WemMxOW9ZVzVrYkdWeWN5NXNiMk5yQ2drSkNRa0pkSFZ3YkdWeld5QXdJRjFiSURNZ1hTNXNiMk5yQ2drSkNRa3BPd29KQ1FsOUNnb0pDUWt2THlCd2NtOW5jbVZ6YzE5b1lXNWtiR1Z5Y3k1bWFYSmxDZ2tKQ1M4dklHWjFiR1pwYkd4bFpGOW9ZVzVrYkdWeWN5NW1hWEpsQ2drSkNTOHZJSEpsYW1WamRHVmtYMmhoYm1Sc1pYSnpMbVpwY21VS0NRa0piR2x6ZEM1aFpHUW9JSFIxY0d4bFd5QXpJRjB1Wm1seVpTQXBPd29LQ1FrSkx5OGdaR1ZtWlhKeVpXUXVibTkwYVdaNUlEMGdablZ1WTNScGIyNG9LU0I3SUdSbFptVnljbVZrTG01dmRHbG1lVmRwZEdnb0xpNHVLU0I5Q2drSkNTOHZJR1JsWm1WeWNtVmtMbkpsYzI5c2RtVWdQU0JtZFc1amRHbHZiaWdwSUhzZ1pHVm1aWEp5WldRdWNtVnpiMngyWlZkcGRHZ29MaTR1S1NCOUNna0pDUzh2SUdSbFptVnljbVZrTG5KbGFtVmpkQ0E5SUdaMWJtTjBhVzl1S0NrZ2V5QmtaV1psY25KbFpDNXlaV3BsWTNSWGFYUm9LQzR1TGlrZ2ZRb0pDUWxrWldabGNuSmxaRnNnZEhWd2JHVmJJREFnWFNCZElEMGdablZ1WTNScGIyNG9LU0I3Q2drSkNRbGtaV1psY25KbFpGc2dkSFZ3YkdWYklEQWdYU0FySUNKWGFYUm9JaUJkS0NCMGFHbHpJRDA5UFNCa1pXWmxjbkpsWkNBL0lIVnVaR1ZtYVc1bFpDQTZJSFJvYVhNc0lHRnlaM1Z0Wlc1MGN5QXBPd29KQ1FrSmNtVjBkWEp1SUhSb2FYTTdDZ2tKQ1gwN0Nnb0pDUWt2THlCa1pXWmxjbkpsWkM1dWIzUnBabmxYYVhSb0lEMGdiR2x6ZEM1bWFYSmxWMmwwYUFvSkNRa3ZMeUJrWldabGNuSmxaQzV5WlhOdmJIWmxWMmwwYUNBOUlHeHBjM1F1Wm1seVpWZHBkR2dLQ1FrSkx5OGdaR1ZtWlhKeVpXUXVjbVZxWldOMFYybDBhQ0E5SUd4cGMzUXVabWx5WlZkcGRHZ0tDUWtKWkdWbVpYSnlaV1JiSUhSMWNHeGxXeUF3SUYwZ0t5QWlWMmwwYUNJZ1hTQTlJR3hwYzNRdVptbHlaVmRwZEdnN0Nna0pmU0FwT3dvS0NRa3ZMeUJOWVd0bElIUm9aU0JrWldabGNuSmxaQ0JoSUhCeWIyMXBjMlVLQ1Fsd2NtOXRhWE5sTG5CeWIyMXBjMlVvSUdSbFptVnljbVZrSUNrN0Nnb0pDUzh2SUVOaGJHd2daMmwyWlc0Z1puVnVZeUJwWmlCaGJua0tDUWxwWmlBb0lHWjFibU1nS1NCN0Nna0pDV1oxYm1NdVkyRnNiQ2dnWkdWbVpYSnlaV1FzSUdSbFptVnljbVZrSUNrN0Nna0pmUW9LQ1Frdkx5QkJiR3dnWkc5dVpTRUtDUWx5WlhSMWNtNGdaR1ZtWlhKeVpXUTdDZ2w5TEFvS0NTOHZJRVJsWm1WeWNtVmtJR2hsYkhCbGNnb0pkMmhsYmpvZ1puVnVZM1JwYjI0b0lITnBibWRzWlZaaGJIVmxJQ2tnZXdvSkNYWmhjZ29LQ1FrSkx5OGdZMjkxYm5RZ2IyWWdkVzVqYjIxd2JHVjBaV1FnYzNWaWIzSmthVzVoZEdWekNna0pDWEpsYldGcGJtbHVaeUE5SUdGeVozVnRaVzUwY3k1c1pXNW5kR2dzQ2dvSkNRa3ZMeUJqYjNWdWRDQnZaaUIxYm5CeWIyTmxjM05sWkNCaGNtZDFiV1Z1ZEhNS0NRa0phU0E5SUhKbGJXRnBibWx1Wnl3S0Nna0pDUzh2SUhOMVltOXlaR2x1WVhSbElHWjFiR1pwYkd4dFpXNTBJR1JoZEdFS0NRa0pjbVZ6YjJ4MlpVTnZiblJsZUhSeklEMGdRWEp5WVhrb0lHa2dLU3dLQ1FrSmNtVnpiMngyWlZaaGJIVmxjeUE5SUhOc2FXTmxMbU5oYkd3b0lHRnlaM1Z0Wlc1MGN5QXBMQW9LQ1FrSkx5OGdkR2hsSUcxaGMzUmxjaUJFWldabGNuSmxaQW9KQ1FsdFlYTjBaWElnUFNCcVVYVmxjbmt1UkdWbVpYSnlaV1FvS1N3S0Nna0pDUzh2SUhOMVltOXlaR2x1WVhSbElHTmhiR3hpWVdOcklHWmhZM1J2Y25rS0NRa0pkWEJrWVhSbFJuVnVZeUE5SUdaMWJtTjBhVzl1S0NCcElDa2dld29KQ1FrSmNtVjBkWEp1SUdaMWJtTjBhVzl1S0NCMllXeDFaU0FwSUhzS0NRa0pDUWx5WlhOdmJIWmxRMjl1ZEdWNGRITmJJR2tnWFNBOUlIUm9hWE03Q2drSkNRa0pjbVZ6YjJ4MlpWWmhiSFZsYzFzZ2FTQmRJRDBnWVhKbmRXMWxiblJ6TG14bGJtZDBhQ0ErSURFZ1B5QnpiR2xqWlM1allXeHNLQ0JoY21kMWJXVnVkSE1nS1NBNklIWmhiSFZsT3dvSkNRa0pDV2xtSUNnZ0lTZ2dMUzF5WlcxaGFXNXBibWNnS1NBcElIc0tDUWtKQ1FrSmJXRnpkR1Z5TG5KbGMyOXNkbVZYYVhSb0tDQnlaWE52YkhabFEyOXVkR1Y0ZEhNc0lISmxjMjlzZG1WV1lXeDFaWE1nS1RzS0NRa0pDUWw5Q2drSkNRbDlPd29KQ1FsOU93b0tDUWt2THlCVGFXNW5iR1V0SUdGdVpDQmxiWEIwZVNCaGNtZDFiV1Z1ZEhNZ1lYSmxJR0ZrYjNCMFpXUWdiR2xyWlNCUWNtOXRhWE5sTG5KbGMyOXNkbVVLQ1FscFppQW9JSEpsYldGcGJtbHVaeUE4UFNBeElDa2dld29KQ1FsaFpHOXdkRlpoYkhWbEtDQnphVzVuYkdWV1lXeDFaU3dnYldGemRHVnlMbVJ2Ym1Vb0lIVndaR0YwWlVaMWJtTW9JR2tnS1NBcExuSmxjMjlzZG1Vc0lHMWhjM1JsY2k1eVpXcGxZM1FzQ2drSkNRa2hjbVZ0WVdsdWFXNW5JQ2s3Q2dvSkNRa3ZMeUJWYzJVZ0xuUm9aVzRvS1NCMGJ5QjFibmR5WVhBZ2MyVmpiMjVrWVhKNUlIUm9aVzVoWW14bGN5QW9ZMll1SUdkb0xUTXdNREFwQ2drSkNXbG1JQ2dnYldGemRHVnlMbk4wWVhSbEtDa2dQVDA5SUNKd1pXNWthVzVuSWlCOGZBb0pDUWtKYVhOR2RXNWpkR2x2YmlnZ2NtVnpiMngyWlZaaGJIVmxjMXNnYVNCZElDWW1JSEpsYzI5c2RtVldZV3gxWlhOYklHa2dYUzUwYUdWdUlDa2dLU0I3Q2dvSkNRa0pjbVYwZFhKdUlHMWhjM1JsY2k1MGFHVnVLQ2s3Q2drSkNYMEtDUWw5Q2dvSkNTOHZJRTExYkhScGNHeGxJR0Z5WjNWdFpXNTBjeUJoY21VZ1lXZG5jbVZuWVhSbFpDQnNhV3RsSUZCeWIyMXBjMlV1WVd4c0lHRnljbUY1SUdWc1pXMWxiblJ6Q2drSmQyaHBiR1VnS0NCcExTMGdLU0I3Q2drSkNXRmtiM0IwVm1Gc2RXVW9JSEpsYzI5c2RtVldZV3gxWlhOYklHa2dYU3dnZFhCa1lYUmxSblZ1WXlnZ2FTQXBMQ0J0WVhOMFpYSXVjbVZxWldOMElDazdDZ2tKZlFvS0NRbHlaWFIxY200Z2JXRnpkR1Z5TG5CeWIyMXBjMlVvS1RzS0NYMEtmU0FwT3dvS0NpOHZJRlJvWlhObElIVnpkV0ZzYkhrZ2FXNWthV05oZEdVZ1lTQndjbTluY21GdGJXVnlJRzFwYzNSaGEyVWdaSFZ5YVc1bklHUmxkbVZzYjNCdFpXNTBMQW92THlCM1lYSnVJR0ZpYjNWMElIUm9aVzBnUVZOQlVDQnlZWFJvWlhJZ2RHaGhiaUJ6ZDJGc2JHOTNhVzVuSUhSb1pXMGdZbmtnWkdWbVlYVnNkQzRLZG1GeUlISmxjbkp2Y2s1aGJXVnpJRDBnTDE0b1JYWmhiSHhKYm5SbGNtNWhiSHhTWVc1blpYeFNaV1psY21WdVkyVjhVM2x1ZEdGNGZGUjVjR1Y4VlZKSktVVnljbTl5SkM4N0NncHFVWFZsY25rdVJHVm1aWEp5WldRdVpYaGpaWEIwYVc5dVNHOXZheUE5SUdaMWJtTjBhVzl1S0NCbGNuSnZjaXdnYzNSaFkyc2dLU0I3Q2dvSkx5OGdVM1Z3Y0c5eWREb2dTVVVnT0NBdElEa2diMjVzZVFvSkx5OGdRMjl1YzI5c1pTQmxlR2x6ZEhNZ2QyaGxiaUJrWlhZZ2RHOXZiSE1nWVhKbElHOXdaVzRzSUhkb2FXTm9JR05oYmlCb1lYQndaVzRnWVhRZ1lXNTVJSFJwYldVS0NXbG1JQ2dnZDJsdVpHOTNMbU52Ym5OdmJHVWdKaVlnZDJsdVpHOTNMbU52Ym5OdmJHVXVkMkZ5YmlBbUppQmxjbkp2Y2lBbUppQnlaWEp5YjNKT1lXMWxjeTUwWlhOMEtDQmxjbkp2Y2k1dVlXMWxJQ2tnS1NCN0Nna0pkMmx1Wkc5M0xtTnZibk52YkdVdWQyRnliaWdnSW1wUmRXVnllUzVFWldabGNuSmxaQ0JsZUdObGNIUnBiMjQ2SUNJZ0t5Qmxjbkp2Y2k1dFpYTnpZV2RsTENCbGNuSnZjaTV6ZEdGamF5d2djM1JoWTJzZ0tUc0tDWDBLZlRzS0Nnb0tDbXBSZFdWeWVTNXlaV0ZrZVVWNFkyVndkR2x2YmlBOUlHWjFibU4wYVc5dUtDQmxjbkp2Y2lBcElIc0tDWGRwYm1SdmR5NXpaWFJVYVcxbGIzVjBLQ0JtZFc1amRHbHZiaWdwSUhzS0NRbDBhSEp2ZHlCbGNuSnZjanNLQ1gwZ0tUc0tmVHNLQ2dvS0NpOHZJRlJvWlNCa1pXWmxjbkpsWkNCMWMyVmtJRzl1SUVSUFRTQnlaV0ZrZVFwMllYSWdjbVZoWkhsTWFYTjBJRDBnYWxGMVpYSjVMa1JsWm1WeWNtVmtLQ2s3Q2dwcVVYVmxjbmt1Wm00dWNtVmhaSGtnUFNCbWRXNWpkR2x2YmlnZ1ptNGdLU0I3Q2dvSmNtVmhaSGxNYVhOMENna0pMblJvWlc0b0lHWnVJQ2tLQ2drSkx5OGdWM0poY0NCcVVYVmxjbmt1Y21WaFpIbEZlR05sY0hScGIyNGdhVzRnWVNCbWRXNWpkR2x2YmlCemJ5QjBhR0YwSUhSb1pTQnNiMjlyZFhBS0NRa3ZMeUJvWVhCd1pXNXpJR0YwSUhSb1pTQjBhVzFsSUc5bUlHVnljbTl5SUdoaGJtUnNhVzVuSUdsdWMzUmxZV1FnYjJZZ1kyRnNiR0poWTJzS0NRa3ZMeUJ5WldkcGMzUnlZWFJwYjI0dUNna0pMbU5oZEdOb0tDQm1kVzVqZEdsdmJpZ2daWEp5YjNJZ0tTQjdDZ2tKQ1dwUmRXVnllUzV5WldGa2VVVjRZMlZ3ZEdsdmJpZ2daWEp5YjNJZ0tUc0tDUWw5SUNrN0Nnb0pjbVYwZFhKdUlIUm9hWE03Q24wN0NncHFVWFZsY25rdVpYaDBaVzVrS0NCN0Nnb0pMeThnU1hNZ2RHaGxJRVJQVFNCeVpXRmtlU0IwYnlCaVpTQjFjMlZrUHlCVFpYUWdkRzhnZEhKMVpTQnZibU5sSUdsMElHOWpZM1Z5Y3k0S0NXbHpVbVZoWkhrNklHWmhiSE5sTEFvS0NTOHZJRUVnWTI5MWJuUmxjaUIwYnlCMGNtRmpheUJvYjNjZ2JXRnVlU0JwZEdWdGN5QjBieUIzWVdsMElHWnZjaUJpWldadmNtVUtDUzh2SUhSb1pTQnlaV0ZrZVNCbGRtVnVkQ0JtYVhKbGN5NGdVMlZsSUNNMk56Z3hDZ2x5WldGa2VWZGhhWFE2SURFc0Nnb0pMeThnU0dGdVpHeGxJSGRvWlc0Z2RHaGxJRVJQVFNCcGN5QnlaV0ZrZVFvSmNtVmhaSGs2SUdaMWJtTjBhVzl1S0NCM1lXbDBJQ2tnZXdvS0NRa3ZMeUJCWW05eWRDQnBaaUIwYUdWeVpTQmhjbVVnY0dWdVpHbHVaeUJvYjJ4a2N5QnZjaUIzWlNkeVpTQmhiSEpsWVdSNUlISmxZV1I1Q2drSmFXWWdLQ0IzWVdsMElEMDlQU0IwY25WbElEOGdMUzFxVVhWbGNua3VjbVZoWkhsWFlXbDBJRG9nYWxGMVpYSjVMbWx6VW1WaFpIa2dLU0I3Q2drSkNYSmxkSFZ5YmpzS0NRbDlDZ29KQ1M4dklGSmxiV1Z0WW1WeUlIUm9ZWFFnZEdobElFUlBUU0JwY3lCeVpXRmtlUW9KQ1dwUmRXVnllUzVwYzFKbFlXUjVJRDBnZEhKMVpUc0tDZ2tKTHk4Z1NXWWdZU0J1YjNKdFlXd2dSRTlOSUZKbFlXUjVJR1YyWlc1MElHWnBjbVZrTENCa1pXTnlaVzFsYm5Rc0lHRnVaQ0IzWVdsMElHbG1JRzVsWldRZ1ltVUtDUWxwWmlBb0lIZGhhWFFnSVQwOUlIUnlkV1VnSmlZZ0xTMXFVWFZsY25rdWNtVmhaSGxYWVdsMElENGdNQ0FwSUhzS0NRa0pjbVYwZFhKdU93b0pDWDBLQ2drSkx5OGdTV1lnZEdobGNtVWdZWEpsSUdaMWJtTjBhVzl1Y3lCaWIzVnVaQ3dnZEc4Z1pYaGxZM1YwWlFvSkNYSmxZV1I1VEdsemRDNXlaWE52YkhabFYybDBhQ2dnWkc5amRXMWxiblFzSUZzZ2FsRjFaWEo1SUYwZ0tUc0tDWDBLZlNBcE93b0thbEYxWlhKNUxuSmxZV1I1TG5Sb1pXNGdQU0J5WldGa2VVeHBjM1F1ZEdobGJqc0tDaTh2SUZSb1pTQnlaV0ZrZVNCbGRtVnVkQ0JvWVc1a2JHVnlJR0Z1WkNCelpXeG1JR05zWldGdWRYQWdiV1YwYUc5a0NtWjFibU4wYVc5dUlHTnZiWEJzWlhSbFpDZ3BJSHNLQ1dSdlkzVnRaVzUwTG5KbGJXOTJaVVYyWlc1MFRHbHpkR1Z1WlhJb0lDSkVUMDFEYjI1MFpXNTBURzloWkdWa0lpd2dZMjl0Y0d4bGRHVmtJQ2s3Q2dsM2FXNWtiM2N1Y21WdGIzWmxSWFpsYm5STWFYTjBaVzVsY2lnZ0lteHZZV1FpTENCamIyMXdiR1YwWldRZ0tUc0tDV3BSZFdWeWVTNXlaV0ZrZVNncE93cDlDZ292THlCRFlYUmphQ0JqWVhObGN5QjNhR1Z5WlNBa0tHUnZZM1Z0Wlc1MEtTNXlaV0ZrZVNncElHbHpJR05oYkd4bFpBb3ZMeUJoWm5SbGNpQjBhR1VnWW5KdmQzTmxjaUJsZG1WdWRDQm9ZWE1nWVd4eVpXRmtlU0J2WTJOMWNuSmxaQzRLTHk4Z1UzVndjRzl5ZERvZ1NVVWdQRDA1SUMwZ01UQWdiMjVzZVFvdkx5QlBiR1JsY2lCSlJTQnpiMjFsZEdsdFpYTWdjMmxuYm1Gc2N5QWlhVzUwWlhKaFkzUnBkbVVpSUhSdmJ5QnpiMjl1Q21sbUlDZ2daRzlqZFcxbGJuUXVjbVZoWkhsVGRHRjBaU0E5UFQwZ0ltTnZiWEJzWlhSbElpQjhmQW9KS0NCa2IyTjFiV1Z1ZEM1eVpXRmtlVk4wWVhSbElDRTlQU0FpYkc5aFpHbHVaeUlnSmlZZ0lXUnZZM1Z0Wlc1MExtUnZZM1Z0Wlc1MFJXeGxiV1Z1ZEM1a2IxTmpjbTlzYkNBcElDa2dld29LQ1M4dklFaGhibVJzWlNCcGRDQmhjM2x1WTJoeWIyNXZkWE5zZVNCMGJ5QmhiR3h2ZHlCelkzSnBjSFJ6SUhSb1pTQnZjSEJ2Y25SMWJtbDBlU0IwYnlCa1pXeGhlU0J5WldGa2VRb0pkMmx1Wkc5M0xuTmxkRlJwYldWdmRYUW9JR3BSZFdWeWVTNXlaV0ZrZVNBcE93b0tmU0JsYkhObElIc0tDZ2t2THlCVmMyVWdkR2hsSUdoaGJtUjVJR1YyWlc1MElHTmhiR3hpWVdOckNnbGtiMk4xYldWdWRDNWhaR1JGZG1WdWRFeHBjM1JsYm1WeUtDQWlSRTlOUTI5dWRHVnVkRXh2WVdSbFpDSXNJR052YlhCc1pYUmxaQ0FwT3dvS0NTOHZJRUVnWm1Gc2JHSmhZMnNnZEc4Z2QybHVaRzkzTG05dWJHOWhaQ3dnZEdoaGRDQjNhV3hzSUdGc2QyRjVjeUIzYjNKckNnbDNhVzVrYjNjdVlXUmtSWFpsYm5STWFYTjBaVzVsY2lnZ0lteHZZV1FpTENCamIyMXdiR1YwWldRZ0tUc0tmUW9LQ2dvS0x5OGdUWFZzZEdsbWRXNWpkR2x2Ym1Gc0lHMWxkR2h2WkNCMGJ5Qm5aWFFnWVc1a0lITmxkQ0IyWVd4MVpYTWdiMllnWVNCamIyeHNaV04wYVc5dUNpOHZJRlJvWlNCMllXeDFaUzl6SUdOaGJpQnZjSFJwYjI1aGJHeDVJR0psSUdWNFpXTjFkR1ZrSUdsbUlHbDBKM01nWVNCbWRXNWpkR2x2YmdwMllYSWdZV05qWlhOeklEMGdablZ1WTNScGIyNG9JR1ZzWlcxekxDQm1iaXdnYTJWNUxDQjJZV3gxWlN3Z1kyaGhhVzVoWW14bExDQmxiWEIwZVVkbGRDd2djbUYzSUNrZ2V3b0pkbUZ5SUdrZ1BTQXdMQW9KQ1d4bGJpQTlJR1ZzWlcxekxteGxibWQwYUN3S0NRbGlkV3hySUQwZ2EyVjVJRDA5SUc1MWJHdzdDZ29KTHk4Z1UyVjBjeUJ0WVc1NUlIWmhiSFZsY3dvSmFXWWdLQ0IwYjFSNWNHVW9JR3RsZVNBcElEMDlQU0FpYjJKcVpXTjBJaUFwSUhzS0NRbGphR0ZwYm1GaWJHVWdQU0IwY25WbE93b0pDV1p2Y2lBb0lHa2dhVzRnYTJWNUlDa2dld29KQ1FsaFkyTmxjM01vSUdWc1pXMXpMQ0JtYml3Z2FTd2dhMlY1V3lCcElGMHNJSFJ5ZFdVc0lHVnRjSFI1UjJWMExDQnlZWGNnS1RzS0NRbDlDZ29KTHk4Z1UyVjBjeUJ2Ym1VZ2RtRnNkV1VLQ1gwZ1pXeHpaU0JwWmlBb0lIWmhiSFZsSUNFOVBTQjFibVJsWm1sdVpXUWdLU0I3Q2drSlkyaGhhVzVoWW14bElEMGdkSEoxWlRzS0Nna0phV1lnS0NBaGFYTkdkVzVqZEdsdmJpZ2dkbUZzZFdVZ0tTQXBJSHNLQ1FrSmNtRjNJRDBnZEhKMVpUc0tDUWw5Q2dvSkNXbG1JQ2dnWW5Wc2F5QXBJSHNLQ2drSkNTOHZJRUoxYkdzZ2IzQmxjbUYwYVc5dWN5QnlkVzRnWVdkaGFXNXpkQ0IwYUdVZ1pXNTBhWEpsSUhObGRBb0pDUWxwWmlBb0lISmhkeUFwSUhzS0NRa0pDV1p1TG1OaGJHd29JR1ZzWlcxekxDQjJZV3gxWlNBcE93b0pDUWtKWm00Z1BTQnVkV3hzT3dvS0NRa0pMeThnTGk0dVpYaGpaWEIwSUhkb1pXNGdaWGhsWTNWMGFXNW5JR1oxYm1OMGFXOXVJSFpoYkhWbGN3b0pDUWw5SUdWc2MyVWdld29KQ1FrSlluVnNheUE5SUdadU93b0pDUWtKWm00Z1BTQm1kVzVqZEdsdmJpZ2daV3hsYlN3Z2EyVjVMQ0IyWVd4MVpTQXBJSHNLQ1FrSkNRbHlaWFIxY200Z1luVnNheTVqWVd4c0tDQnFVWFZsY25rb0lHVnNaVzBnS1N3Z2RtRnNkV1VnS1RzS0NRa0pDWDA3Q2drSkNYMEtDUWw5Q2dvSkNXbG1JQ2dnWm00Z0tTQjdDZ2tKQ1dadmNpQW9JRHNnYVNBOElHeGxianNnYVNzcklDa2dld29KQ1FrSlptNG9DZ2tKQ1FrSlpXeGxiWE5iSUdrZ1hTd2dhMlY1TENCeVlYY2dQd29KQ1FrSkNYWmhiSFZsSURvS0NRa0pDUWwyWVd4MVpTNWpZV3hzS0NCbGJHVnRjMXNnYVNCZExDQnBMQ0JtYmlnZ1pXeGxiWE5iSUdrZ1hTd2dhMlY1SUNrZ0tRb0pDUWtKS1RzS0NRa0pmUW9KQ1gwS0NYMEtDZ2xwWmlBb0lHTm9ZV2x1WVdKc1pTQXBJSHNLQ1FseVpYUjFjbTRnWld4bGJYTTdDZ2w5Q2dvSkx5OGdSMlYwY3dvSmFXWWdLQ0JpZFd4cklDa2dld29KQ1hKbGRIVnliaUJtYmk1allXeHNLQ0JsYkdWdGN5QXBPd29KZlFvS0NYSmxkSFZ5YmlCc1pXNGdQeUJtYmlnZ1pXeGxiWE5iSURBZ1hTd2dhMlY1SUNrZ09pQmxiWEIwZVVkbGREc0tmVHNLQ2dvdkx5Qk5ZWFJqYUdWeklHUmhjMmhsWkNCemRISnBibWNnWm05eUlHTmhiV1ZzYVhwcGJtY0tkbUZ5SUhKdGMxQnlaV1pwZUNBOUlDOWVMVzF6TFM4c0NnbHlaR0Z6YUVGc2NHaGhJRDBnTHkwb1cyRXRlbDBwTDJjN0Nnb3ZMeUJWYzJWa0lHSjVJR05oYldWc1EyRnpaU0JoY3lCallXeHNZbUZqYXlCMGJ5QnlaWEJzWVdObEtDa0tablZ1WTNScGIyNGdabU5oYldWc1EyRnpaU2dnWVd4c0xDQnNaWFIwWlhJZ0tTQjdDZ2x5WlhSMWNtNGdiR1YwZEdWeUxuUnZWWEJ3WlhKRFlYTmxLQ2s3Q24wS0NpOHZJRU52Ym5abGNuUWdaR0Z6YUdWa0lIUnZJR05oYldWc1EyRnpaVHNnZFhObFpDQmllU0IwYUdVZ1kzTnpJR0Z1WkNCa1lYUmhJRzF2WkhWc1pYTUtMeThnVTNWd2NHOXlkRG9nU1VVZ1BEMDVJQzBnTVRFc0lFVmtaMlVnTVRJZ0xTQXhOUW92THlCTmFXTnliM052Wm5RZ1ptOXlaMjkwSUhSdklHaDFiWEFnZEdobGFYSWdkbVZ1Wkc5eUlIQnlaV1pwZUNBb0l6azFOeklwQ21aMWJtTjBhVzl1SUdOaGJXVnNRMkZ6WlNnZ2MzUnlhVzVuSUNrZ2V3b0pjbVYwZFhKdUlITjBjbWx1Wnk1eVpYQnNZV05sS0NCeWJYTlFjbVZtYVhnc0lDSnRjeTBpSUNrdWNtVndiR0ZqWlNnZ2NtUmhjMmhCYkhCb1lTd2dabU5oYldWc1EyRnpaU0FwT3dwOUNuWmhjaUJoWTJObGNIUkVZWFJoSUQwZ1puVnVZM1JwYjI0b0lHOTNibVZ5SUNrZ2V3b0tDUzh2SUVGalkyVndkSE1nYjI1c2VUb0tDUzh2SUNBdElFNXZaR1VLQ1M4dklDQWdJQzBnVG05a1pTNUZURVZOUlU1VVgwNVBSRVVLQ1M4dklDQWdJQzBnVG05a1pTNUVUME5WVFVWT1ZGOU9UMFJGQ2drdkx5QWdMU0JQWW1wbFkzUUtDUzh2SUNBZ0lDMGdRVzU1Q2dseVpYUjFjbTRnYjNkdVpYSXVibTlrWlZSNWNHVWdQVDA5SURFZ2ZId2diM2R1WlhJdWJtOWtaVlI1Y0dVZ1BUMDlJRGtnZkh3Z0lTZ2dLMjkzYm1WeUxtNXZaR1ZVZVhCbElDazdDbjA3Q2dvS0NncG1kVzVqZEdsdmJpQkVZWFJoS0NrZ2V3b0pkR2hwY3k1bGVIQmhibVJ2SUQwZ2FsRjFaWEo1TG1WNGNHRnVaRzhnS3lCRVlYUmhMblZwWkNzck93cDlDZ3BFWVhSaExuVnBaQ0E5SURFN0NncEVZWFJoTG5CeWIzUnZkSGx3WlNBOUlIc0tDZ2xqWVdOb1pUb2dablZ1WTNScGIyNG9JRzkzYm1WeUlDa2dld29LQ1Frdkx5QkRhR1ZqYXlCcFppQjBhR1VnYjNkdVpYSWdiMkpxWldOMElHRnNjbVZoWkhrZ2FHRnpJR0VnWTJGamFHVUtDUWwyWVhJZ2RtRnNkV1VnUFNCdmQyNWxjbHNnZEdocGN5NWxlSEJoYm1SdklGMDdDZ29KQ1M4dklFbG1JRzV2ZEN3Z1kzSmxZWFJsSUc5dVpRb0pDV2xtSUNnZ0lYWmhiSFZsSUNrZ2V3b0pDUWwyWVd4MVpTQTlJSHQ5T3dvS0NRa0pMeThnVjJVZ1kyRnVJR0ZqWTJWd2RDQmtZWFJoSUdadmNpQnViMjR0Wld4bGJXVnVkQ0J1YjJSbGN5QnBiaUJ0YjJSbGNtNGdZbkp2ZDNObGNuTXNDZ2tKQ1M4dklHSjFkQ0IzWlNCemFHOTFiR1FnYm05MExDQnpaV1VnSXpnek16VXVDZ2tKQ1M4dklFRnNkMkY1Y3lCeVpYUjFjbTRnWVc0Z1pXMXdkSGtnYjJKcVpXTjBMZ29KQ1FscFppQW9JR0ZqWTJWd2RFUmhkR0VvSUc5M2JtVnlJQ2tnS1NCN0Nnb0pDUWtKTHk4Z1NXWWdhWFFnYVhNZ1lTQnViMlJsSUhWdWJHbHJaV3g1SUhSdklHSmxJSE4wY21sdVoybG1lUzFsWkNCdmNpQnNiMjl3WldRZ2IzWmxjZ29KQ1FrSkx5OGdkWE5sSUhCc1lXbHVJR0Z6YzJsbmJtMWxiblFLQ1FrSkNXbG1JQ2dnYjNkdVpYSXVibTlrWlZSNWNHVWdLU0I3Q2drSkNRa0piM2R1WlhKYklIUm9hWE11Wlhod1lXNWtieUJkSUQwZ2RtRnNkV1U3Q2dvSkNRa0pMeThnVDNSb1pYSjNhWE5sSUhObFkzVnlaU0JwZENCcGJpQmhJRzV2YmkxbGJuVnRaWEpoWW14bElIQnliM0JsY25SNUNna0pDUWt2THlCamIyNW1hV2QxY21GaWJHVWdiWFZ6ZENCaVpTQjBjblZsSUhSdklHRnNiRzkzSUhSb1pTQndjbTl3WlhKMGVTQjBieUJpWlFvSkNRa0pMeThnWkdWc1pYUmxaQ0IzYUdWdUlHUmhkR0VnYVhNZ2NtVnRiM1psWkFvSkNRa0pmU0JsYkhObElIc0tDUWtKQ1FsUFltcGxZM1F1WkdWbWFXNWxVSEp2Y0dWeWRIa29JRzkzYm1WeUxDQjBhR2x6TG1WNGNHRnVaRzhzSUhzS0NRa0pDUWtKZG1Gc2RXVTZJSFpoYkhWbExBb0pDUWtKQ1FsamIyNW1hV2QxY21GaWJHVTZJSFJ5ZFdVS0NRa0pDUWw5SUNrN0Nna0pDUWw5Q2drSkNYMEtDUWw5Q2dvSkNYSmxkSFZ5YmlCMllXeDFaVHNLQ1gwc0NnbHpaWFE2SUdaMWJtTjBhVzl1S0NCdmQyNWxjaXdnWkdGMFlTd2dkbUZzZFdVZ0tTQjdDZ2tKZG1GeUlIQnliM0FzQ2drSkNXTmhZMmhsSUQwZ2RHaHBjeTVqWVdOb1pTZ2diM2R1WlhJZ0tUc0tDZ2tKTHk4Z1NHRnVaR3hsT2lCYklHOTNibVZ5TENCclpYa3NJSFpoYkhWbElGMGdZWEpuY3dvSkNTOHZJRUZzZDJGNWN5QjFjMlVnWTJGdFpXeERZWE5sSUd0bGVTQW9aMmd0TWpJMU55a0tDUWxwWmlBb0lIUjVjR1Z2WmlCa1lYUmhJRDA5UFNBaWMzUnlhVzVuSWlBcElIc0tDUWtKWTJGamFHVmJJR05oYldWc1EyRnpaU2dnWkdGMFlTQXBJRjBnUFNCMllXeDFaVHNLQ2drSkx5OGdTR0Z1Wkd4bE9pQmJJRzkzYm1WeUxDQjdJSEJ5YjNCbGNuUnBaWE1nZlNCZElHRnlaM01LQ1FsOUlHVnNjMlVnZXdvS0NRa0pMeThnUTI5d2VTQjBhR1VnY0hKdmNHVnlkR2xsY3lCdmJtVXRZbmt0YjI1bElIUnZJSFJvWlNCallXTm9aU0J2WW1wbFkzUUtDUWtKWm05eUlDZ2djSEp2Y0NCcGJpQmtZWFJoSUNrZ2V3b0pDUWtKWTJGamFHVmJJR05oYldWc1EyRnpaU2dnY0hKdmNDQXBJRjBnUFNCa1lYUmhXeUJ3Y205d0lGMDdDZ2tKQ1gwS0NRbDlDZ2tKY21WMGRYSnVJR05oWTJobE93b0pmU3dLQ1dkbGREb2dablZ1WTNScGIyNG9JRzkzYm1WeUxDQnJaWGtnS1NCN0Nna0pjbVYwZFhKdUlHdGxlU0E5UFQwZ2RXNWtaV1pwYm1Wa0lEOEtDUWtKZEdocGN5NWpZV05vWlNnZ2IzZHVaWElnS1NBNkNnb0pDUWt2THlCQmJIZGhlWE1nZFhObElHTmhiV1ZzUTJGelpTQnJaWGtnS0dkb0xUSXlOVGNwQ2drSkNXOTNibVZ5V3lCMGFHbHpMbVY0Y0dGdVpHOGdYU0FtSmlCdmQyNWxjbHNnZEdocGN5NWxlSEJoYm1SdklGMWJJR05oYldWc1EyRnpaU2dnYTJWNUlDa2dYVHNLQ1gwc0NnbGhZMk5sYzNNNklHWjFibU4wYVc5dUtDQnZkMjVsY2l3Z2EyVjVMQ0IyWVd4MVpTQXBJSHNLQ2drSkx5OGdTVzRnWTJGelpYTWdkMmhsY21VZ1pXbDBhR1Z5T2dvSkNTOHZDZ2tKTHk4Z0lDQXhMaUJPYnlCclpYa2dkMkZ6SUhOd1pXTnBabWxsWkFvSkNTOHZJQ0FnTWk0Z1FTQnpkSEpwYm1jZ2EyVjVJSGRoY3lCemNHVmphV1pwWldRc0lHSjFkQ0J1YnlCMllXeDFaU0J3Y205MmFXUmxaQW9KQ1M4dkNna0pMeThnVkdGclpTQjBhR1VnSW5KbFlXUWlJSEJoZEdnZ1lXNWtJR0ZzYkc5M0lIUm9aU0JuWlhRZ2JXVjBhRzlrSUhSdklHUmxkR1Z5YldsdVpRb0pDUzh2SUhkb2FXTm9JSFpoYkhWbElIUnZJSEpsZEhWeWJpd2djbVZ6Y0dWamRHbDJaV3g1SUdWcGRHaGxjam9LQ1Frdkx3b0pDUzh2SUNBZ01TNGdWR2hsSUdWdWRHbHlaU0JqWVdOb1pTQnZZbXBsWTNRS0NRa3ZMeUFnSURJdUlGUm9aU0JrWVhSaElITjBiM0psWkNCaGRDQjBhR1VnYTJWNUNna0pMeThLQ1FscFppQW9JR3RsZVNBOVBUMGdkVzVrWldacGJtVmtJSHg4Q2drSkNRa29JQ2dnYTJWNUlDWW1JSFI1Y0dWdlppQnJaWGtnUFQwOUlDSnpkSEpwYm1jaUlDa2dKaVlnZG1Gc2RXVWdQVDA5SUhWdVpHVm1hVzVsWkNBcElDa2dld29LQ1FrSmNtVjBkWEp1SUhSb2FYTXVaMlYwS0NCdmQyNWxjaXdnYTJWNUlDazdDZ2tKZlFvS0NRa3ZMeUJYYUdWdUlIUm9aU0JyWlhrZ2FYTWdibTkwSUdFZ2MzUnlhVzVuTENCdmNpQmliM1JvSUdFZ2EyVjVJR0Z1WkNCMllXeDFaUW9KQ1M4dklHRnlaU0J6Y0dWamFXWnBaV1FzSUhObGRDQnZjaUJsZUhSbGJtUWdLR1Y0YVhOMGFXNW5JRzlpYW1WamRITXBJSGRwZEdnZ1pXbDBhR1Z5T2dvSkNTOHZDZ2tKTHk4Z0lDQXhMaUJCYmlCdlltcGxZM1FnYjJZZ2NISnZjR1Z5ZEdsbGN3b0pDUzh2SUNBZ01pNGdRU0JyWlhrZ1lXNWtJSFpoYkhWbENna0pMeThLQ1FsMGFHbHpMbk5sZENnZ2IzZHVaWElzSUd0bGVTd2dkbUZzZFdVZ0tUc0tDZ2tKTHk4Z1UybHVZMlVnZEdobElDSnpaWFFpSUhCaGRHZ2dZMkZ1SUdoaGRtVWdkSGR2SUhCdmMzTnBZbXhsSUdWdWRISjVJSEJ2YVc1MGN3b0pDUzh2SUhKbGRIVnliaUIwYUdVZ1pYaHdaV04wWldRZ1pHRjBZU0JpWVhObFpDQnZiaUIzYUdsamFDQndZWFJvSUhkaGN5QjBZV3RsYmxzcVhRb0pDWEpsZEhWeWJpQjJZV3gxWlNBaFBUMGdkVzVrWldacGJtVmtJRDhnZG1Gc2RXVWdPaUJyWlhrN0NnbDlMQW9KY21WdGIzWmxPaUJtZFc1amRHbHZiaWdnYjNkdVpYSXNJR3RsZVNBcElIc0tDUWwyWVhJZ2FTd0tDUWtKWTJGamFHVWdQU0J2ZDI1bGNsc2dkR2hwY3k1bGVIQmhibVJ2SUYwN0Nnb0pDV2xtSUNnZ1kyRmphR1VnUFQwOUlIVnVaR1ZtYVc1bFpDQXBJSHNLQ1FrSmNtVjBkWEp1T3dvSkNYMEtDZ2tKYVdZZ0tDQnJaWGtnSVQwOUlIVnVaR1ZtYVc1bFpDQXBJSHNLQ2drSkNTOHZJRk4xY0hCdmNuUWdZWEp5WVhrZ2IzSWdjM0JoWTJVZ2MyVndZWEpoZEdWa0lITjBjbWx1WnlCdlppQnJaWGx6Q2drSkNXbG1JQ2dnUVhKeVlYa3VhWE5CY25KaGVTZ2dhMlY1SUNrZ0tTQjdDZ29KQ1FrSkx5OGdTV1lnYTJWNUlHbHpJR0Z1SUdGeWNtRjVJRzltSUd0bGVYTXVMaTRLQ1FrSkNTOHZJRmRsSUdGc2QyRjVjeUJ6WlhRZ1kyRnRaV3hEWVhObElHdGxlWE1zSUhOdklISmxiVzkyWlNCMGFHRjBMZ29KQ1FrSmEyVjVJRDBnYTJWNUxtMWhjQ2dnWTJGdFpXeERZWE5sSUNrN0Nna0pDWDBnWld4elpTQjdDZ2tKQ1FsclpYa2dQU0JqWVcxbGJFTmhjMlVvSUd0bGVTQXBPd29LQ1FrSkNTOHZJRWxtSUdFZ2EyVjVJSGRwZEdnZ2RHaGxJSE53WVdObGN5QmxlR2x6ZEhNc0lIVnpaU0JwZEM0S0NRa0pDUzh2SUU5MGFHVnlkMmx6WlN3Z1kzSmxZWFJsSUdGdUlHRnljbUY1SUdKNUlHMWhkR05vYVc1bklHNXZiaTEzYUdsMFpYTndZV05sQ2drSkNRbHJaWGtnUFNCclpYa2dhVzRnWTJGamFHVWdQd29KQ1FrSkNWc2dhMlY1SUYwZ09nb0pDUWtKQ1NnZ2EyVjVMbTFoZEdOb0tDQnlibTkwYUhSdGJIZG9hWFJsSUNrZ2ZId2dXMTBnS1RzS0NRa0pmUW9LQ1FrSmFTQTlJR3RsZVM1c1pXNW5kR2c3Q2dvSkNRbDNhR2xzWlNBb0lHa3RMU0FwSUhzS0NRa0pDV1JsYkdWMFpTQmpZV05vWlZzZ2EyVjVXeUJwSUYwZ1hUc0tDUWtKZlFvSkNYMEtDZ2tKTHk4Z1VtVnRiM1psSUhSb1pTQmxlSEJoYm1SdklHbG1JSFJvWlhKbEozTWdibThnYlc5eVpTQmtZWFJoQ2drSmFXWWdLQ0JyWlhrZ1BUMDlJSFZ1WkdWbWFXNWxaQ0I4ZkNCcVVYVmxjbmt1YVhORmJYQjBlVTlpYW1WamRDZ2dZMkZqYUdVZ0tTQXBJSHNLQ2drSkNTOHZJRk4xY0hCdmNuUTZJRU5vY205dFpTQThQVE0xSUMwZ05EVUtDUWtKTHk4Z1YyVmlhMmwwSUNZZ1FteHBibXNnY0dWeVptOXliV0Z1WTJVZ2MzVm1abVZ5Y3lCM2FHVnVJR1JsYkdWMGFXNW5JSEJ5YjNCbGNuUnBaWE1LQ1FrSkx5OGdabkp2YlNCRVQwMGdibTlrWlhNc0lITnZJSE5sZENCMGJ5QjFibVJsWm1sdVpXUWdhVzV6ZEdWaFpBb0pDUWt2THlCb2RIUndjem92TDJKMVozTXVZMmh5YjIxcGRXMHViM0puTDNBdlkyaHliMjFwZFcwdmFYTnpkV1Z6TDJSbGRHRnBiRDlwWkQwek56ZzJNRGNnS0dKMVp5QnlaWE4wY21samRHVmtLUW9KQ1FscFppQW9JRzkzYm1WeUxtNXZaR1ZVZVhCbElDa2dld29KQ1FrSmIzZHVaWEpiSUhSb2FYTXVaWGh3WVc1a2J5QmRJRDBnZFc1a1pXWnBibVZrT3dvSkNRbDlJR1ZzYzJVZ2V3b0pDUWtKWkdWc1pYUmxJRzkzYm1WeVd5QjBhR2x6TG1WNGNHRnVaRzhnWFRzS0NRa0pmUW9KQ1gwS0NYMHNDZ2xvWVhORVlYUmhPaUJtZFc1amRHbHZiaWdnYjNkdVpYSWdLU0I3Q2drSmRtRnlJR05oWTJobElEMGdiM2R1WlhKYklIUm9hWE11Wlhod1lXNWtieUJkT3dvSkNYSmxkSFZ5YmlCallXTm9aU0FoUFQwZ2RXNWtaV1pwYm1Wa0lDWW1JQ0ZxVVhWbGNua3VhWE5GYlhCMGVVOWlhbVZqZENnZ1kyRmphR1VnS1RzS0NYMEtmVHNLZG1GeUlHUmhkR0ZRY21sMklEMGdibVYzSUVSaGRHRW9LVHNLQ25aaGNpQmtZWFJoVlhObGNpQTlJRzVsZHlCRVlYUmhLQ2s3Q2dvS0NpOHZDVWx0Y0d4bGJXVnVkR0YwYVc5dUlGTjFiVzFoY25rS0x5OEtMeThKTVM0Z1JXNW1iM0pqWlNCQlVFa2djM1Z5Wm1GalpTQmhibVFnYzJWdFlXNTBhV01nWTI5dGNHRjBhV0pwYkdsMGVTQjNhWFJvSURFdU9TNTRJR0p5WVc1amFBb3ZMd2t5TGlCSmJYQnliM1psSUhSb1pTQnRiMlIxYkdVbmN5QnRZV2x1ZEdGcGJtRmlhV3hwZEhrZ1lua2djbVZrZFdOcGJtY2dkR2hsSUhOMGIzSmhaMlVLTHk4SkNYQmhkR2h6SUhSdklHRWdjMmx1WjJ4bElHMWxZMmhoYm1semJTNEtMeThKTXk0Z1ZYTmxJSFJvWlNCellXMWxJSE5wYm1kc1pTQnRaV05vWVc1cGMyMGdkRzhnYzNWd2NHOXlkQ0FpY0hKcGRtRjBaU0lnWVc1a0lDSjFjMlZ5SWlCa1lYUmhMZ292THdrMExpQmZUbVYyWlhKZklHVjRjRzl6WlNBaWNISnBkbUYwWlNJZ1pHRjBZU0IwYnlCMWMyVnlJR052WkdVZ0tGUlBSRTg2SUVSeWIzQWdYMlJoZEdFc0lGOXlaVzF2ZG1WRVlYUmhLUW92THdrMUxpQkJkbTlwWkNCbGVIQnZjMmx1WnlCcGJYQnNaVzFsYm5SaGRHbHZiaUJrWlhSaGFXeHpJRzl1SUhWelpYSWdiMkpxWldOMGN5QW9aV2N1SUdWNGNHRnVaRzhnY0hKdmNHVnlkR2xsY3lrS0x5OEpOaTRnVUhKdmRtbGtaU0JoSUdOc1pXRnlJSEJoZEdnZ1ptOXlJR2x0Y0d4bGJXVnVkR0YwYVc5dUlIVndaM0poWkdVZ2RHOGdWMlZoYTAxaGNDQnBiaUF5TURFMENncDJZWElnY21KeVlXTmxJRDBnTDE0b1B6cGNlMXRjZDF4WFhTcGNmWHhjVzF0Y2QxeFhYU3BjWFNra0x5d0tDWEp0ZFd4MGFVUmhjMmdnUFNBdlcwRXRXbDB2WnpzS0NtWjFibU4wYVc5dUlHZGxkRVJoZEdFb0lHUmhkR0VnS1NCN0NnbHBaaUFvSUdSaGRHRWdQVDA5SUNKMGNuVmxJaUFwSUhzS0NRbHlaWFIxY200Z2RISjFaVHNLQ1gwS0NnbHBaaUFvSUdSaGRHRWdQVDA5SUNKbVlXeHpaU0lnS1NCN0Nna0pjbVYwZFhKdUlHWmhiSE5sT3dvSmZRb0tDV2xtSUNnZ1pHRjBZU0E5UFQwZ0ltNTFiR3dpSUNrZ2V3b0pDWEpsZEhWeWJpQnVkV3hzT3dvSmZRb0tDUzh2SUU5dWJIa2dZMjl1ZG1WeWRDQjBieUJoSUc1MWJXSmxjaUJwWmlCcGRDQmtiMlZ6YmlkMElHTm9ZVzVuWlNCMGFHVWdjM1J5YVc1bkNnbHBaaUFvSUdSaGRHRWdQVDA5SUN0a1lYUmhJQ3NnSWlJZ0tTQjdDZ2tKY21WMGRYSnVJQ3RrWVhSaE93b0pmUW9LQ1dsbUlDZ2djbUp5WVdObExuUmxjM1FvSUdSaGRHRWdLU0FwSUhzS0NRbHlaWFIxY200Z1NsTlBUaTV3WVhKelpTZ2daR0YwWVNBcE93b0pmUW9LQ1hKbGRIVnliaUJrWVhSaE93cDlDZ3BtZFc1amRHbHZiaUJrWVhSaFFYUjBjaWdnWld4bGJTd2dhMlY1TENCa1lYUmhJQ2tnZXdvSmRtRnlJRzVoYldVN0Nnb0pMeThnU1dZZ2JtOTBhR2x1WnlCM1lYTWdabTkxYm1RZ2FXNTBaWEp1WVd4c2VTd2dkSEo1SUhSdklHWmxkR05vSUdGdWVRb0pMeThnWkdGMFlTQm1jbTl0SUhSb1pTQklWRTFNTlNCa1lYUmhMU29nWVhSMGNtbGlkWFJsQ2dscFppQW9JR1JoZEdFZ1BUMDlJSFZ1WkdWbWFXNWxaQ0FtSmlCbGJHVnRMbTV2WkdWVWVYQmxJRDA5UFNBeElDa2dld29KQ1c1aGJXVWdQU0FpWkdGMFlTMGlJQ3NnYTJWNUxuSmxjR3hoWTJVb0lISnRkV3gwYVVSaGMyZ3NJQ0l0SkNZaUlDa3VkRzlNYjNkbGNrTmhjMlVvS1RzS0NRbGtZWFJoSUQwZ1pXeGxiUzVuWlhSQmRIUnlhV0oxZEdVb0lHNWhiV1VnS1RzS0Nna0phV1lnS0NCMGVYQmxiMllnWkdGMFlTQTlQVDBnSW5OMGNtbHVaeUlnS1NCN0Nna0pDWFJ5ZVNCN0Nna0pDUWxrWVhSaElEMGdaMlYwUkdGMFlTZ2daR0YwWVNBcE93b0pDUWw5SUdOaGRHTm9JQ2dnWlNBcElIdDlDZ29KQ1Frdkx5Qk5ZV3RsSUhOMWNtVWdkMlVnYzJWMElIUm9aU0JrWVhSaElITnZJR2wwSUdsemJpZDBJR05vWVc1blpXUWdiR0YwWlhJS0NRa0paR0YwWVZWelpYSXVjMlYwS0NCbGJHVnRMQ0JyWlhrc0lHUmhkR0VnS1RzS0NRbDlJR1ZzYzJVZ2V3b0pDUWxrWVhSaElEMGdkVzVrWldacGJtVmtPd29KQ1gwS0NYMEtDWEpsZEhWeWJpQmtZWFJoT3dwOUNncHFVWFZsY25rdVpYaDBaVzVrS0NCN0NnbG9ZWE5FWVhSaE9pQm1kVzVqZEdsdmJpZ2daV3hsYlNBcElIc0tDUWx5WlhSMWNtNGdaR0YwWVZWelpYSXVhR0Z6UkdGMFlTZ2daV3hsYlNBcElIeDhJR1JoZEdGUWNtbDJMbWhoYzBSaGRHRW9JR1ZzWlcwZ0tUc0tDWDBzQ2dvSlpHRjBZVG9nWm5WdVkzUnBiMjRvSUdWc1pXMHNJRzVoYldVc0lHUmhkR0VnS1NCN0Nna0pjbVYwZFhKdUlHUmhkR0ZWYzJWeUxtRmpZMlZ6Y3lnZ1pXeGxiU3dnYm1GdFpTd2daR0YwWVNBcE93b0pmU3dLQ2dseVpXMXZkbVZFWVhSaE9pQm1kVzVqZEdsdmJpZ2daV3hsYlN3Z2JtRnRaU0FwSUhzS0NRbGtZWFJoVlhObGNpNXlaVzF2ZG1Vb0lHVnNaVzBzSUc1aGJXVWdLVHNLQ1gwc0Nnb0pMeThnVkU5RVR6b2dUbTkzSUhSb1lYUWdZV3hzSUdOaGJHeHpJSFJ2SUY5a1lYUmhJR0Z1WkNCZmNtVnRiM1psUkdGMFlTQm9ZWFpsSUdKbFpXNGdjbVZ3YkdGalpXUUtDUzh2SUhkcGRHZ2daR2x5WldOMElHTmhiR3h6SUhSdklHUmhkR0ZRY21sMklHMWxkR2h2WkhNc0lIUm9aWE5sSUdOaGJpQmlaU0JrWlhCeVpXTmhkR1ZrTGdvSlgyUmhkR0U2SUdaMWJtTjBhVzl1S0NCbGJHVnRMQ0J1WVcxbExDQmtZWFJoSUNrZ2V3b0pDWEpsZEhWeWJpQmtZWFJoVUhKcGRpNWhZMk5sYzNNb0lHVnNaVzBzSUc1aGJXVXNJR1JoZEdFZ0tUc0tDWDBzQ2dvSlgzSmxiVzkyWlVSaGRHRTZJR1oxYm1OMGFXOXVLQ0JsYkdWdExDQnVZVzFsSUNrZ2V3b0pDV1JoZEdGUWNtbDJMbkpsYlc5MlpTZ2daV3hsYlN3Z2JtRnRaU0FwT3dvSmZRcDlJQ2s3Q2dwcVVYVmxjbmt1Wm00dVpYaDBaVzVrS0NCN0NnbGtZWFJoT2lCbWRXNWpkR2x2YmlnZ2EyVjVMQ0IyWVd4MVpTQXBJSHNLQ1FsMllYSWdhU3dnYm1GdFpTd2daR0YwWVN3S0NRa0paV3hsYlNBOUlIUm9hWE5iSURBZ1hTd0tDUWtKWVhSMGNuTWdQU0JsYkdWdElDWW1JR1ZzWlcwdVlYUjBjbWxpZFhSbGN6c0tDZ2tKTHk4Z1IyVjBjeUJoYkd3Z2RtRnNkV1Z6Q2drSmFXWWdLQ0JyWlhrZ1BUMDlJSFZ1WkdWbWFXNWxaQ0FwSUhzS0NRa0phV1lnS0NCMGFHbHpMbXhsYm1kMGFDQXBJSHNLQ1FrSkNXUmhkR0VnUFNCa1lYUmhWWE5sY2k1blpYUW9JR1ZzWlcwZ0tUc0tDZ2tKQ1FscFppQW9JR1ZzWlcwdWJtOWtaVlI1Y0dVZ1BUMDlJREVnSmlZZ0lXUmhkR0ZRY21sMkxtZGxkQ2dnWld4bGJTd2dJbWhoYzBSaGRHRkJkSFJ5Y3lJZ0tTQXBJSHNLQ1FrSkNRbHBJRDBnWVhSMGNuTXViR1Z1WjNSb093b0pDUWtKQ1hkb2FXeGxJQ2dnYVMwdElDa2dld29LQ1FrSkNRa0pMeThnVTNWd2NHOXlkRG9nU1VVZ01URWdiMjVzZVFvSkNRa0pDUWt2THlCVWFHVWdZWFIwY25NZ1pXeGxiV1Z1ZEhNZ1kyRnVJR0psSUc1MWJHd2dLQ014TkRnNU5Da0tDUWtKQ1FrSmFXWWdLQ0JoZEhSeWMxc2dhU0JkSUNrZ2V3b0pDUWtKQ1FrSmJtRnRaU0E5SUdGMGRISnpXeUJwSUYwdWJtRnRaVHNLQ1FrSkNRa0pDV2xtSUNnZ2JtRnRaUzVwYm1SbGVFOW1LQ0FpWkdGMFlTMGlJQ2tnUFQwOUlEQWdLU0I3Q2drSkNRa0pDUWtKYm1GdFpTQTlJR05oYldWc1EyRnpaU2dnYm1GdFpTNXpiR2xqWlNnZ05TQXBJQ2s3Q2drSkNRa0pDUWtKWkdGMFlVRjBkSElvSUdWc1pXMHNJRzVoYldVc0lHUmhkR0ZiSUc1aGJXVWdYU0FwT3dvSkNRa0pDUWtKZlFvSkNRa0pDUWw5Q2drSkNRa0pmUW9KQ1FrSkNXUmhkR0ZRY21sMkxuTmxkQ2dnWld4bGJTd2dJbWhoYzBSaGRHRkJkSFJ5Y3lJc0lIUnlkV1VnS1RzS0NRa0pDWDBLQ1FrSmZRb0tDUWtKY21WMGRYSnVJR1JoZEdFN0Nna0pmUW9LQ1Frdkx5QlRaWFJ6SUcxMWJIUnBjR3hsSUhaaGJIVmxjd29KQ1dsbUlDZ2dkSGx3Wlc5bUlHdGxlU0E5UFQwZ0ltOWlhbVZqZENJZ0tTQjdDZ2tKQ1hKbGRIVnliaUIwYUdsekxtVmhZMmdvSUdaMWJtTjBhVzl1S0NrZ2V3b0pDUWtKWkdGMFlWVnpaWEl1YzJWMEtDQjBhR2x6TENCclpYa2dLVHNLQ1FrSmZTQXBPd29KQ1gwS0Nna0pjbVYwZFhKdUlHRmpZMlZ6Y3lnZ2RHaHBjeXdnWm5WdVkzUnBiMjRvSUhaaGJIVmxJQ2tnZXdvSkNRbDJZWElnWkdGMFlUc0tDZ2tKQ1M4dklGUm9aU0JqWVd4c2FXNW5JR3BSZFdWeWVTQnZZbXBsWTNRZ0tHVnNaVzFsYm5RZ2JXRjBZMmhsY3lrZ2FYTWdibTkwSUdWdGNIUjVDZ2tKQ1M4dklDaGhibVFnZEdobGNtVm1iM0psSUdoaGN5QmhiaUJsYkdWdFpXNTBJR0Z3Y0dWaGNuTWdZWFFnZEdocGMxc2dNQ0JkS1NCaGJtUWdkR2hsQ2drSkNTOHZJR0IyWVd4MVpXQWdjR0Z5WVcxbGRHVnlJSGRoY3lCdWIzUWdkVzVrWldacGJtVmtMaUJCYmlCbGJYQjBlU0JxVVhWbGNua2diMkpxWldOMENna0pDUzh2SUhkcGJHd2djbVZ6ZFd4MElHbHVJR0IxYm1SbFptbHVaV1JnSUdadmNpQmxiR1Z0SUQwZ2RHaHBjMXNnTUNCZElIZG9hV05vSUhkcGJHd0tDUWtKTHk4Z2RHaHliM2NnWVc0Z1pYaGpaWEIwYVc5dUlHbG1JR0Z1SUdGMGRHVnRjSFFnZEc4Z2NtVmhaQ0JoSUdSaGRHRWdZMkZqYUdVZ2FYTWdiV0ZrWlM0S0NRa0phV1lnS0NCbGJHVnRJQ1ltSUhaaGJIVmxJRDA5UFNCMWJtUmxabWx1WldRZ0tTQjdDZ29KQ1FrSkx5OGdRWFIwWlcxd2RDQjBieUJuWlhRZ1pHRjBZU0JtY205dElIUm9aU0JqWVdOb1pRb0pDUWtKTHk4Z1ZHaGxJR3RsZVNCM2FXeHNJR0ZzZDJGNWN5QmlaU0JqWVcxbGJFTmhjMlZrSUdsdUlFUmhkR0VLQ1FrSkNXUmhkR0VnUFNCa1lYUmhWWE5sY2k1blpYUW9JR1ZzWlcwc0lHdGxlU0FwT3dvSkNRa0phV1lnS0NCa1lYUmhJQ0U5UFNCMWJtUmxabWx1WldRZ0tTQjdDZ2tKQ1FrSmNtVjBkWEp1SUdSaGRHRTdDZ2tKQ1FsOUNnb0pDUWtKTHk4Z1FYUjBaVzF3ZENCMGJ5QWlaR2x6WTI5MlpYSWlJSFJvWlNCa1lYUmhJR2x1Q2drSkNRa3ZMeUJJVkUxTU5TQmpkWE4wYjIwZ1pHRjBZUzBxSUdGMGRISnpDZ2tKQ1Fsa1lYUmhJRDBnWkdGMFlVRjBkSElvSUdWc1pXMHNJR3RsZVNBcE93b0pDUWtKYVdZZ0tDQmtZWFJoSUNFOVBTQjFibVJsWm1sdVpXUWdLU0I3Q2drSkNRa0pjbVYwZFhKdUlHUmhkR0U3Q2drSkNRbDlDZ29KQ1FrSkx5OGdWMlVnZEhKcFpXUWdjbVZoYkd4NUlHaGhjbVFzSUdKMWRDQjBhR1VnWkdGMFlTQmtiMlZ6YmlkMElHVjRhWE4wTGdvSkNRa0pjbVYwZFhKdU93b0pDUWw5Q2dvSkNRa3ZMeUJUWlhRZ2RHaGxJR1JoZEdFdUxpNEtDUWtKZEdocGN5NWxZV05vS0NCbWRXNWpkR2x2YmlncElIc0tDZ2tKQ1Frdkx5QlhaU0JoYkhkaGVYTWdjM1J2Y21VZ2RHaGxJR05oYldWc1EyRnpaV1FnYTJWNUNna0pDUWxrWVhSaFZYTmxjaTV6WlhRb0lIUm9hWE1zSUd0bGVTd2dkbUZzZFdVZ0tUc0tDUWtKZlNBcE93b0pDWDBzSUc1MWJHd3NJSFpoYkhWbExDQmhjbWQxYldWdWRITXViR1Z1WjNSb0lENGdNU3dnYm5Wc2JDd2dkSEoxWlNBcE93b0pmU3dLQ2dseVpXMXZkbVZFWVhSaE9pQm1kVzVqZEdsdmJpZ2dhMlY1SUNrZ2V3b0pDWEpsZEhWeWJpQjBhR2x6TG1WaFkyZ29JR1oxYm1OMGFXOXVLQ2tnZXdvSkNRbGtZWFJoVlhObGNpNXlaVzF2ZG1Vb0lIUm9hWE1zSUd0bGVTQXBPd29KQ1gwZ0tUc0tDWDBLZlNBcE93b0tDbXBSZFdWeWVTNWxlSFJsYm1Rb0lIc0tDWEYxWlhWbE9pQm1kVzVqZEdsdmJpZ2daV3hsYlN3Z2RIbHdaU3dnWkdGMFlTQXBJSHNLQ1FsMllYSWdjWFZsZFdVN0Nnb0pDV2xtSUNnZ1pXeGxiU0FwSUhzS0NRa0pkSGx3WlNBOUlDZ2dkSGx3WlNCOGZDQWlabmdpSUNrZ0t5QWljWFZsZFdVaU93b0pDUWx4ZFdWMVpTQTlJR1JoZEdGUWNtbDJMbWRsZENnZ1pXeGxiU3dnZEhsd1pTQXBPd29LQ1FrSkx5OGdVM0JsWldRZ2RYQWdaR1Z4ZFdWMVpTQmllU0JuWlhSMGFXNW5JRzkxZENCeGRXbGphMng1SUdsbUlIUm9hWE1nYVhNZ2FuVnpkQ0JoSUd4dmIydDFjQW9KQ1FscFppQW9JR1JoZEdFZ0tTQjdDZ2tKQ1FscFppQW9JQ0Z4ZFdWMVpTQjhmQ0JCY25KaGVTNXBjMEZ5Y21GNUtDQmtZWFJoSUNrZ0tTQjdDZ2tKQ1FrSmNYVmxkV1VnUFNCa1lYUmhVSEpwZGk1aFkyTmxjM01vSUdWc1pXMHNJSFI1Y0dVc0lHcFJkV1Z5ZVM1dFlXdGxRWEp5WVhrb0lHUmhkR0VnS1NBcE93b0pDUWtKZlNCbGJITmxJSHNLQ1FrSkNRbHhkV1YxWlM1d2RYTm9LQ0JrWVhSaElDazdDZ2tKQ1FsOUNna0pDWDBLQ1FrSmNtVjBkWEp1SUhGMVpYVmxJSHg4SUZ0ZE93b0pDWDBLQ1gwc0Nnb0paR1Z4ZFdWMVpUb2dablZ1WTNScGIyNG9JR1ZzWlcwc0lIUjVjR1VnS1NCN0Nna0pkSGx3WlNBOUlIUjVjR1VnZkh3Z0ltWjRJanNLQ2drSmRtRnlJSEYxWlhWbElEMGdhbEYxWlhKNUxuRjFaWFZsS0NCbGJHVnRMQ0IwZVhCbElDa3NDZ2tKQ1hOMFlYSjBUR1Z1WjNSb0lEMGdjWFZsZFdVdWJHVnVaM1JvTEFvSkNRbG1iaUE5SUhGMVpYVmxMbk5vYVdaMEtDa3NDZ2tKQ1dodmIydHpJRDBnYWxGMVpYSjVMbDl4ZFdWMVpVaHZiMnR6S0NCbGJHVnRMQ0IwZVhCbElDa3NDZ2tKQ1c1bGVIUWdQU0JtZFc1amRHbHZiaWdwSUhzS0NRa0pDV3BSZFdWeWVTNWtaWEYxWlhWbEtDQmxiR1Z0TENCMGVYQmxJQ2s3Q2drSkNYMDdDZ29KQ1M4dklFbG1JSFJvWlNCbWVDQnhkV1YxWlNCcGN5QmtaWEYxWlhWbFpDd2dZV3gzWVhseklISmxiVzkyWlNCMGFHVWdjSEp2WjNKbGMzTWdjMlZ1ZEdsdVpXd0tDUWxwWmlBb0lHWnVJRDA5UFNBaWFXNXdjbTluY21WemN5SWdLU0I3Q2drSkNXWnVJRDBnY1hWbGRXVXVjMmhwWm5Rb0tUc0tDUWtKYzNSaGNuUk1aVzVuZEdndExUc0tDUWw5Q2dvSkNXbG1JQ2dnWm00Z0tTQjdDZ29KQ1Frdkx5QkJaR1FnWVNCd2NtOW5jbVZ6Y3lCelpXNTBhVzVsYkNCMGJ5QndjbVYyWlc1MElIUm9aU0JtZUNCeGRXVjFaU0JtY205dElHSmxhVzVuQ2drSkNTOHZJR0YxZEc5dFlYUnBZMkZzYkhrZ1pHVnhkV1YxWldRS0NRa0phV1lnS0NCMGVYQmxJRDA5UFNBaVpuZ2lJQ2tnZXdvSkNRa0pjWFZsZFdVdWRXNXphR2xtZENnZ0ltbHVjSEp2WjNKbGMzTWlJQ2s3Q2drSkNYMEtDZ2tKQ1M4dklFTnNaV0Z5SUhWd0lIUm9aU0JzWVhOMElIRjFaWFZsSUhOMGIzQWdablZ1WTNScGIyNEtDUWtKWkdWc1pYUmxJR2h2YjJ0ekxuTjBiM0E3Q2drSkNXWnVMbU5oYkd3b0lHVnNaVzBzSUc1bGVIUXNJR2h2YjJ0eklDazdDZ2tKZlFvS0NRbHBaaUFvSUNGemRHRnlkRXhsYm1kMGFDQW1KaUJvYjI5cmN5QXBJSHNLQ1FrSmFHOXZhM011Wlcxd2RIa3VabWx5WlNncE93b0pDWDBLQ1gwc0Nnb0pMeThnVG05MElIQjFZbXhwWXlBdElHZGxibVZ5WVhSbElHRWdjWFZsZFdWSWIyOXJjeUJ2WW1wbFkzUXNJRzl5SUhKbGRIVnliaUIwYUdVZ1kzVnljbVZ1ZENCdmJtVUtDVjl4ZFdWMVpVaHZiMnR6T2lCbWRXNWpkR2x2YmlnZ1pXeGxiU3dnZEhsd1pTQXBJSHNLQ1FsMllYSWdhMlY1SUQwZ2RIbHdaU0FySUNKeGRXVjFaVWh2YjJ0eklqc0tDUWx5WlhSMWNtNGdaR0YwWVZCeWFYWXVaMlYwS0NCbGJHVnRMQ0JyWlhrZ0tTQjhmQ0JrWVhSaFVISnBkaTVoWTJObGMzTW9JR1ZzWlcwc0lHdGxlU3dnZXdvSkNRbGxiWEIwZVRvZ2FsRjFaWEo1TGtOaGJHeGlZV05yY3lnZ0ltOXVZMlVnYldWdGIzSjVJaUFwTG1Ga1pDZ2dablZ1WTNScGIyNG9LU0I3Q2drSkNRbGtZWFJoVUhKcGRpNXlaVzF2ZG1Vb0lHVnNaVzBzSUZzZ2RIbHdaU0FySUNKeGRXVjFaU0lzSUd0bGVTQmRJQ2s3Q2drSkNYMGdLUW9KQ1gwZ0tUc0tDWDBLZlNBcE93b0thbEYxWlhKNUxtWnVMbVY0ZEdWdVpDZ2dld29KY1hWbGRXVTZJR1oxYm1OMGFXOXVLQ0IwZVhCbExDQmtZWFJoSUNrZ2V3b0pDWFpoY2lCelpYUjBaWElnUFNBeU93b0tDUWxwWmlBb0lIUjVjR1Z2WmlCMGVYQmxJQ0U5UFNBaWMzUnlhVzVuSWlBcElIc0tDUWtKWkdGMFlTQTlJSFI1Y0dVN0Nna0pDWFI1Y0dVZ1BTQWlabmdpT3dvSkNRbHpaWFIwWlhJdExUc0tDUWw5Q2dvSkNXbG1JQ2dnWVhKbmRXMWxiblJ6TG14bGJtZDBhQ0E4SUhObGRIUmxjaUFwSUhzS0NRa0pjbVYwZFhKdUlHcFJkV1Z5ZVM1eGRXVjFaU2dnZEdocGMxc2dNQ0JkTENCMGVYQmxJQ2s3Q2drSmZRb0tDUWx5WlhSMWNtNGdaR0YwWVNBOVBUMGdkVzVrWldacGJtVmtJRDhLQ1FrSmRHaHBjeUE2Q2drSkNYUm9hWE11WldGamFDZ2dablZ1WTNScGIyNG9LU0I3Q2drSkNRbDJZWElnY1hWbGRXVWdQU0JxVVhWbGNua3VjWFZsZFdVb0lIUm9hWE1zSUhSNWNHVXNJR1JoZEdFZ0tUc0tDZ2tKQ1Frdkx5QkZibk4xY21VZ1lTQm9iMjlyY3lCbWIzSWdkR2hwY3lCeGRXVjFaUW9KQ1FrSmFsRjFaWEo1TGw5eGRXVjFaVWh2YjJ0ektDQjBhR2x6TENCMGVYQmxJQ2s3Q2dvSkNRa0phV1lnS0NCMGVYQmxJRDA5UFNBaVpuZ2lJQ1ltSUhGMVpYVmxXeUF3SUYwZ0lUMDlJQ0pwYm5CeWIyZHlaWE56SWlBcElIc0tDUWtKQ1FscVVYVmxjbmt1WkdWeGRXVjFaU2dnZEdocGN5d2dkSGx3WlNBcE93b0pDUWtKZlFvSkNRbDlJQ2s3Q2dsOUxBb0paR1Z4ZFdWMVpUb2dablZ1WTNScGIyNG9JSFI1Y0dVZ0tTQjdDZ2tKY21WMGRYSnVJSFJvYVhNdVpXRmphQ2dnWm5WdVkzUnBiMjRvS1NCN0Nna0pDV3BSZFdWeWVTNWtaWEYxWlhWbEtDQjBhR2x6TENCMGVYQmxJQ2s3Q2drSmZTQXBPd29KZlN3S0NXTnNaV0Z5VVhWbGRXVTZJR1oxYm1OMGFXOXVLQ0IwZVhCbElDa2dld29KQ1hKbGRIVnliaUIwYUdsekxuRjFaWFZsS0NCMGVYQmxJSHg4SUNKbWVDSXNJRnRkSUNrN0NnbDlMQW9LQ1M4dklFZGxkQ0JoSUhCeWIyMXBjMlVnY21WemIyeDJaV1FnZDJobGJpQnhkV1YxWlhNZ2IyWWdZU0JqWlhKMFlXbHVJSFI1Y0dVS0NTOHZJR0Z5WlNCbGJYQjBhV1ZrSUNobWVDQnBjeUIwYUdVZ2RIbHdaU0JpZVNCa1pXWmhkV3gwS1FvSmNISnZiV2x6WlRvZ1puVnVZM1JwYjI0b0lIUjVjR1VzSUc5aWFpQXBJSHNLQ1FsMllYSWdkRzF3TEFvSkNRbGpiM1Z1ZENBOUlERXNDZ2tKQ1dSbFptVnlJRDBnYWxGMVpYSjVMa1JsWm1WeWNtVmtLQ2tzQ2drSkNXVnNaVzFsYm5SeklEMGdkR2hwY3l3S0NRa0phU0E5SUhSb2FYTXViR1Z1WjNSb0xBb0pDUWx5WlhOdmJIWmxJRDBnWm5WdVkzUnBiMjRvS1NCN0Nna0pDUWxwWmlBb0lDRW9JQzB0WTI5MWJuUWdLU0FwSUhzS0NRa0pDUWxrWldabGNpNXlaWE52YkhabFYybDBhQ2dnWld4bGJXVnVkSE1zSUZzZ1pXeGxiV1Z1ZEhNZ1hTQXBPd29KQ1FrSmZRb0pDUWw5T3dvS0NRbHBaaUFvSUhSNWNHVnZaaUIwZVhCbElDRTlQU0FpYzNSeWFXNW5JaUFwSUhzS0NRa0piMkpxSUQwZ2RIbHdaVHNLQ1FrSmRIbHdaU0E5SUhWdVpHVm1hVzVsWkRzS0NRbDlDZ2tKZEhsd1pTQTlJSFI1Y0dVZ2ZId2dJbVo0SWpzS0Nna0pkMmhwYkdVZ0tDQnBMUzBnS1NCN0Nna0pDWFJ0Y0NBOUlHUmhkR0ZRY21sMkxtZGxkQ2dnWld4bGJXVnVkSE5iSUdrZ1hTd2dkSGx3WlNBcklDSnhkV1YxWlVodmIydHpJaUFwT3dvSkNRbHBaaUFvSUhSdGNDQW1KaUIwYlhBdVpXMXdkSGtnS1NCN0Nna0pDUWxqYjNWdWRDc3JPd29KQ1FrSmRHMXdMbVZ0Y0hSNUxtRmtaQ2dnY21WemIyeDJaU0FwT3dvSkNRbDlDZ2tKZlFvSkNYSmxjMjlzZG1Vb0tUc0tDUWx5WlhSMWNtNGdaR1ZtWlhJdWNISnZiV2x6WlNnZ2IySnFJQ2s3Q2dsOUNuMGdLVHNLZG1GeUlIQnVkVzBnUFNBb0lDOWJLeTFkUHlnL09seGtLbHd1ZkNsY1pDc29QenBiWlVWZFd5c3RYVDljWkN0OEtTOGdLUzV6YjNWeVkyVTdDZ3AyWVhJZ2NtTnpjMDUxYlNBOUlHNWxkeUJTWldkRmVIQW9JQ0plS0Q4NktGc3JMVjBwUFh3cEtDSWdLeUJ3Ym5WdElDc2dJaWtvVzJFdGVpVmRLaWtrSWl3Z0lta2lJQ2s3Q2dvS2RtRnlJR056YzBWNGNHRnVaQ0E5SUZzZ0lsUnZjQ0lzSUNKU2FXZG9kQ0lzSUNKQ2IzUjBiMjBpTENBaVRHVm1kQ0lnWFRzS0NuWmhjaUJwYzBocFpHUmxibGRwZEdocGJsUnlaV1VnUFNCbWRXNWpkR2x2YmlnZ1pXeGxiU3dnWld3Z0tTQjdDZ29KQ1M4dklHbHpTR2xrWkdWdVYybDBhR2x1VkhKbFpTQnRhV2RvZENCaVpTQmpZV3hzWldRZ1puSnZiU0JxVVhWbGNua2pabWxzZEdWeUlHWjFibU4wYVc5dU93b0pDUzh2SUdsdUlIUm9ZWFFnWTJGelpTd2daV3hsYldWdWRDQjNhV3hzSUdKbElITmxZMjl1WkNCaGNtZDFiV1Z1ZEFvSkNXVnNaVzBnUFNCbGJDQjhmQ0JsYkdWdE93b0tDUWt2THlCSmJteHBibVVnYzNSNWJHVWdkSEoxYlhCeklHRnNiQW9KQ1hKbGRIVnliaUJsYkdWdExuTjBlV3hsTG1ScGMzQnNZWGtnUFQwOUlDSnViMjVsSWlCOGZBb0pDUWxsYkdWdExuTjBlV3hsTG1ScGMzQnNZWGtnUFQwOUlDSWlJQ1ltQ2dvSkNRa3ZMeUJQZEdobGNuZHBjMlVzSUdOb1pXTnJJR052YlhCMWRHVmtJSE4wZVd4bENna0pDUzh2SUZOMWNIQnZjblE2SUVacGNtVm1iM2dnUEQwME15QXRJRFExQ2drSkNTOHZJRVJwYzJOdmJtNWxZM1JsWkNCbGJHVnRaVzUwY3lCallXNGdhR0YyWlNCamIyMXdkWFJsWkNCa2FYTndiR0Y1T2lCdWIyNWxMQ0J6YnlCbWFYSnpkQ0JqYjI1bWFYSnRJSFJvWVhRZ1pXeGxiU0JwY3dvSkNRa3ZMeUJwYmlCMGFHVWdaRzlqZFcxbGJuUXVDZ2tKQ1dwUmRXVnllUzVqYjI1MFlXbHVjeWdnWld4bGJTNXZkMjVsY2tSdlkzVnRaVzUwTENCbGJHVnRJQ2tnSmlZS0Nna0pDV3BSZFdWeWVTNWpjM01vSUdWc1pXMHNJQ0prYVhOd2JHRjVJaUFwSUQwOVBTQWlibTl1WlNJN0NnbDlPd29LZG1GeUlITjNZWEFnUFNCbWRXNWpkR2x2YmlnZ1pXeGxiU3dnYjNCMGFXOXVjeXdnWTJGc2JHSmhZMnNzSUdGeVozTWdLU0I3Q2dsMllYSWdjbVYwTENCdVlXMWxMQW9KQ1c5c1pDQTlJSHQ5T3dvS0NTOHZJRkpsYldWdFltVnlJSFJvWlNCdmJHUWdkbUZzZFdWekxDQmhibVFnYVc1elpYSjBJSFJvWlNCdVpYY2diMjVsY3dvSlptOXlJQ2dnYm1GdFpTQnBiaUJ2Y0hScGIyNXpJQ2tnZXdvSkNXOXNaRnNnYm1GdFpTQmRJRDBnWld4bGJTNXpkSGxzWlZzZ2JtRnRaU0JkT3dvSkNXVnNaVzB1YzNSNWJHVmJJRzVoYldVZ1hTQTlJRzl3ZEdsdmJuTmJJRzVoYldVZ1hUc0tDWDBLQ2dseVpYUWdQU0JqWVd4c1ltRmpheTVoY0hCc2VTZ2daV3hsYlN3Z1lYSm5jeUI4ZkNCYlhTQXBPd29LQ1M4dklGSmxkbVZ5ZENCMGFHVWdiMnhrSUhaaGJIVmxjd29KWm05eUlDZ2dibUZ0WlNCcGJpQnZjSFJwYjI1eklDa2dld29KQ1dWc1pXMHVjM1I1YkdWYklHNWhiV1VnWFNBOUlHOXNaRnNnYm1GdFpTQmRPd29KZlFvS0NYSmxkSFZ5YmlCeVpYUTdDbjA3Q2dvS0NncG1kVzVqZEdsdmJpQmhaR3AxYzNSRFUxTW9JR1ZzWlcwc0lIQnliM0FzSUhaaGJIVmxVR0Z5ZEhNc0lIUjNaV1Z1SUNrZ2V3b0pkbUZ5SUdGa2FuVnpkR1ZrTENCelkyRnNaU3dLQ1FsdFlYaEpkR1Z5WVhScGIyNXpJRDBnTWpBc0Nna0pZM1Z5Y21WdWRGWmhiSFZsSUQwZ2RIZGxaVzRnUHdvSkNRbG1kVzVqZEdsdmJpZ3BJSHNLQ1FrSkNYSmxkSFZ5YmlCMGQyVmxiaTVqZFhJb0tUc0tDUWtKZlNBNkNna0pDV1oxYm1OMGFXOXVLQ2tnZXdvSkNRa0pjbVYwZFhKdUlHcFJkV1Z5ZVM1amMzTW9JR1ZzWlcwc0lIQnliM0FzSUNJaUlDazdDZ2tKQ1gwc0Nna0phVzVwZEdsaGJDQTlJR04xY25KbGJuUldZV3gxWlNncExBb0pDWFZ1YVhRZ1BTQjJZV3gxWlZCaGNuUnpJQ1ltSUhaaGJIVmxVR0Z5ZEhOYklETWdYU0I4ZkNBb0lHcFJkV1Z5ZVM1amMzTk9kVzFpWlhKYklIQnliM0FnWFNBL0lDSWlJRG9nSW5CNElpQXBMQW9LQ1Frdkx5QlRkR0Z5ZEdsdVp5QjJZV3gxWlNCamIyMXdkWFJoZEdsdmJpQnBjeUJ5WlhGMWFYSmxaQ0JtYjNJZ2NHOTBaVzUwYVdGc0lIVnVhWFFnYldsemJXRjBZMmhsY3dvSkNXbHVhWFJwWVd4SmJsVnVhWFFnUFNBb0lHcFJkV1Z5ZVM1amMzTk9kVzFpWlhKYklIQnliM0FnWFNCOGZDQjFibWwwSUNFOVBTQWljSGdpSUNZbUlDdHBibWwwYVdGc0lDa2dKaVlLQ1FrSmNtTnpjMDUxYlM1bGVHVmpLQ0JxVVhWbGNua3VZM056S0NCbGJHVnRMQ0J3Y205d0lDa2dLVHNLQ2dscFppQW9JR2x1YVhScFlXeEpibFZ1YVhRZ0ppWWdhVzVwZEdsaGJFbHVWVzVwZEZzZ015QmRJQ0U5UFNCMWJtbDBJQ2tnZXdvS0NRa3ZMeUJUZFhCd2IzSjBPaUJHYVhKbFptOTRJRHc5TlRRS0NRa3ZMeUJJWVd4MlpTQjBhR1VnYVhSbGNtRjBhVzl1SUhSaGNtZGxkQ0IyWVd4MVpTQjBieUJ3Y21WMlpXNTBJR2x1ZEdWeVptVnlaVzVqWlNCbWNtOXRJRU5UVXlCMWNIQmxjaUJpYjNWdVpITWdLR2RvTFRJeE5EUXBDZ2tKYVc1cGRHbGhiQ0E5SUdsdWFYUnBZV3dnTHlBeU93b0tDUWt2THlCVWNuVnpkQ0IxYm1sMGN5QnlaWEJ2Y25SbFpDQmllU0JxVVhWbGNua3VZM056Q2drSmRXNXBkQ0E5SUhWdWFYUWdmSHdnYVc1cGRHbGhiRWx1Vlc1cGRGc2dNeUJkT3dvS0NRa3ZMeUJKZEdWeVlYUnBkbVZzZVNCaGNIQnliM2hwYldGMFpTQm1jbTl0SUdFZ2JtOXVlbVZ5YnlCemRHRnlkR2x1WnlCd2IybHVkQW9KQ1dsdWFYUnBZV3hKYmxWdWFYUWdQU0FyYVc1cGRHbGhiQ0I4ZkNBeE93b0tDUWwzYUdsc1pTQW9JRzFoZUVsMFpYSmhkR2x2Ym5NdExTQXBJSHNLQ2drSkNTOHZJRVYyWVd4MVlYUmxJR0Z1WkNCMWNHUmhkR1VnYjNWeUlHSmxjM1FnWjNWbGMzTWdLR1J2ZFdKc2FXNW5JR2QxWlhOelpYTWdkR2hoZENCNlpYSnZJRzkxZENrdUNna0pDUzh2SUVacGJtbHphQ0JwWmlCMGFHVWdjMk5oYkdVZ1pYRjFZV3h6SUc5eUlHTnliM056WlhNZ01TQW9iV0ZyYVc1bklIUm9aU0J2YkdRcWJtVjNJSEJ5YjJSMVkzUWdibTl1TFhCdmMybDBhWFpsS1M0S0NRa0phbEYxWlhKNUxuTjBlV3hsS0NCbGJHVnRMQ0J3Y205d0xDQnBibWwwYVdGc1NXNVZibWwwSUNzZ2RXNXBkQ0FwT3dvSkNRbHBaaUFvSUNnZ01TQXRJSE5qWVd4bElDa2dLaUFvSURFZ0xTQW9JSE5qWVd4bElEMGdZM1Z5Y21WdWRGWmhiSFZsS0NrZ0x5QnBibWwwYVdGc0lIeDhJREF1TlNBcElDa2dQRDBnTUNBcElIc0tDUWtKQ1cxaGVFbDBaWEpoZEdsdmJuTWdQU0F3T3dvSkNRbDlDZ2tKQ1dsdWFYUnBZV3hKYmxWdWFYUWdQU0JwYm1sMGFXRnNTVzVWYm1sMElDOGdjMk5oYkdVN0Nnb0pDWDBLQ2drSmFXNXBkR2xoYkVsdVZXNXBkQ0E5SUdsdWFYUnBZV3hKYmxWdWFYUWdLaUF5T3dvSkNXcFJkV1Z5ZVM1emRIbHNaU2dnWld4bGJTd2djSEp2Y0N3Z2FXNXBkR2xoYkVsdVZXNXBkQ0FySUhWdWFYUWdLVHNLQ2drSkx5OGdUV0ZyWlNCemRYSmxJSGRsSUhWd1pHRjBaU0IwYUdVZ2RIZGxaVzRnY0hKdmNHVnlkR2xsY3lCc1lYUmxjaUJ2YmdvSkNYWmhiSFZsVUdGeWRITWdQU0IyWVd4MVpWQmhjblJ6SUh4OElGdGRPd29KZlFvS0NXbG1JQ2dnZG1Gc2RXVlFZWEowY3lBcElIc0tDUWxwYm1sMGFXRnNTVzVWYm1sMElEMGdLMmx1YVhScFlXeEpibFZ1YVhRZ2ZId2dLMmx1YVhScFlXd2dmSHdnTURzS0Nna0pMeThnUVhCd2JIa2djbVZzWVhScGRtVWdiMlptYzJWMElDZ3JQUzh0UFNrZ2FXWWdjM0JsWTJsbWFXVmtDZ2tKWVdScWRYTjBaV1FnUFNCMllXeDFaVkJoY25Seld5QXhJRjBnUHdvSkNRbHBibWwwYVdGc1NXNVZibWwwSUNzZ0tDQjJZV3gxWlZCaGNuUnpXeUF4SUYwZ0t5QXhJQ2tnS2lCMllXeDFaVkJoY25Seld5QXlJRjBnT2dvSkNRa3JkbUZzZFdWUVlYSjBjMXNnTWlCZE93b0pDV2xtSUNnZ2RIZGxaVzRnS1NCN0Nna0pDWFIzWldWdUxuVnVhWFFnUFNCMWJtbDBPd29KQ1FsMGQyVmxiaTV6ZEdGeWRDQTlJR2x1YVhScFlXeEpibFZ1YVhRN0Nna0pDWFIzWldWdUxtVnVaQ0E5SUdGa2FuVnpkR1ZrT3dvSkNYMEtDWDBLQ1hKbGRIVnliaUJoWkdwMWMzUmxaRHNLZlFvS0NuWmhjaUJrWldaaGRXeDBSR2x6Y0d4aGVVMWhjQ0E5SUh0OU93b0tablZ1WTNScGIyNGdaMlYwUkdWbVlYVnNkRVJwYzNCc1lYa29JR1ZzWlcwZ0tTQjdDZ2wyWVhJZ2RHVnRjQ3dLQ1Fsa2IyTWdQU0JsYkdWdExtOTNibVZ5Ukc5amRXMWxiblFzQ2drSmJtOWtaVTVoYldVZ1BTQmxiR1Z0TG01dlpHVk9ZVzFsTEFvSkNXUnBjM0JzWVhrZ1BTQmtaV1poZFd4MFJHbHpjR3hoZVUxaGNGc2dibTlrWlU1aGJXVWdYVHNLQ2dscFppQW9JR1JwYzNCc1lYa2dLU0I3Q2drSmNtVjBkWEp1SUdScGMzQnNZWGs3Q2dsOUNnb0pkR1Z0Y0NBOUlHUnZZeTVpYjJSNUxtRndjR1Z1WkVOb2FXeGtLQ0JrYjJNdVkzSmxZWFJsUld4bGJXVnVkQ2dnYm05a1pVNWhiV1VnS1NBcE93b0paR2x6Y0d4aGVTQTlJR3BSZFdWeWVTNWpjM01vSUhSbGJYQXNJQ0prYVhOd2JHRjVJaUFwT3dvS0NYUmxiWEF1Y0dGeVpXNTBUbTlrWlM1eVpXMXZkbVZEYUdsc1pDZ2dkR1Z0Y0NBcE93b0tDV2xtSUNnZ1pHbHpjR3hoZVNBOVBUMGdJbTV2Ym1VaUlDa2dld29KQ1dScGMzQnNZWGtnUFNBaVlteHZZMnNpT3dvSmZRb0paR1ZtWVhWc2RFUnBjM0JzWVhsTllYQmJJRzV2WkdWT1lXMWxJRjBnUFNCa2FYTndiR0Y1T3dvS0NYSmxkSFZ5YmlCa2FYTndiR0Y1T3dwOUNncG1kVzVqZEdsdmJpQnphRzkzU0dsa1pTZ2daV3hsYldWdWRITXNJSE5vYjNjZ0tTQjdDZ2wyWVhJZ1pHbHpjR3hoZVN3Z1pXeGxiU3dLQ1FsMllXeDFaWE1nUFNCYlhTd0tDUWxwYm1SbGVDQTlJREFzQ2drSmJHVnVaM1JvSUQwZ1pXeGxiV1Z1ZEhNdWJHVnVaM1JvT3dvS0NTOHZJRVJsZEdWeWJXbHVaU0J1WlhjZ1pHbHpjR3hoZVNCMllXeDFaU0JtYjNJZ1pXeGxiV1Z1ZEhNZ2RHaGhkQ0J1WldWa0lIUnZJR05vWVc1blpRb0pabTl5SUNnZ095QnBibVJsZUNBOElHeGxibWQwYURzZ2FXNWtaWGdyS3lBcElIc0tDUWxsYkdWdElEMGdaV3hsYldWdWRITmJJR2x1WkdWNElGMDdDZ2tKYVdZZ0tDQWhaV3hsYlM1emRIbHNaU0FwSUhzS0NRa0pZMjl1ZEdsdWRXVTdDZ2tKZlFvS0NRbGthWE53YkdGNUlEMGdaV3hsYlM1emRIbHNaUzVrYVhOd2JHRjVPd29KQ1dsbUlDZ2djMmh2ZHlBcElIc0tDZ2tKQ1M4dklGTnBibU5sSUhkbElHWnZjbU5sSUhacGMybGlhV3hwZEhrZ2RYQnZiaUJqWVhOallXUmxMV2hwWkdSbGJpQmxiR1Z0Wlc1MGN5d2dZVzRnYVcxdFpXUnBZWFJsSUNoaGJtUWdjMnh2ZHlrS0NRa0pMeThnWTJobFkyc2dhWE1nY21WeGRXbHlaV1FnYVc0Z2RHaHBjeUJtYVhKemRDQnNiMjl3SUhWdWJHVnpjeUIzWlNCb1lYWmxJR0VnYm05dVpXMXdkSGtnWkdsemNHeGhlU0IyWVd4MVpTQW9aV2wwYUdWeUNna0pDUzh2SUdsdWJHbHVaU0J2Y2lCaFltOTFkQzEwYnkxaVpTMXlaWE4wYjNKbFpDa0tDUWtKYVdZZ0tDQmthWE53YkdGNUlEMDlQU0FpYm05dVpTSWdLU0I3Q2drSkNRbDJZV3gxWlhOYklHbHVaR1Y0SUYwZ1BTQmtZWFJoVUhKcGRpNW5aWFFvSUdWc1pXMHNJQ0prYVhOd2JHRjVJaUFwSUh4OElHNTFiR3c3Q2drSkNRbHBaaUFvSUNGMllXeDFaWE5iSUdsdVpHVjRJRjBnS1NCN0Nna0pDUWtKWld4bGJTNXpkSGxzWlM1a2FYTndiR0Y1SUQwZ0lpSTdDZ2tKQ1FsOUNna0pDWDBLQ1FrSmFXWWdLQ0JsYkdWdExuTjBlV3hsTG1ScGMzQnNZWGtnUFQwOUlDSWlJQ1ltSUdselNHbGtaR1Z1VjJsMGFHbHVWSEpsWlNnZ1pXeGxiU0FwSUNrZ2V3b0pDUWtKZG1Gc2RXVnpXeUJwYm1SbGVDQmRJRDBnWjJWMFJHVm1ZWFZzZEVScGMzQnNZWGtvSUdWc1pXMGdLVHNLQ1FrSmZRb0pDWDBnWld4elpTQjdDZ2tKQ1dsbUlDZ2daR2x6Y0d4aGVTQWhQVDBnSW01dmJtVWlJQ2tnZXdvSkNRa0pkbUZzZFdWeld5QnBibVJsZUNCZElEMGdJbTV2Ym1VaU93b0tDUWtKQ1M4dklGSmxiV1Z0WW1WeUlIZG9ZWFFnZDJVbmNtVWdiM1psY25keWFYUnBibWNLQ1FrSkNXUmhkR0ZRY21sMkxuTmxkQ2dnWld4bGJTd2dJbVJwYzNCc1lYa2lMQ0JrYVhOd2JHRjVJQ2s3Q2drSkNYMEtDUWw5Q2dsOUNnb0pMeThnVTJWMElIUm9aU0JrYVhOd2JHRjVJRzltSUhSb1pTQmxiR1Z0Wlc1MGN5QnBiaUJoSUhObFkyOXVaQ0JzYjI5d0lIUnZJR0YyYjJsa0lHTnZibk4wWVc1MElISmxabXh2ZHdvSlptOXlJQ2dnYVc1a1pYZ2dQU0F3T3lCcGJtUmxlQ0E4SUd4bGJtZDBhRHNnYVc1a1pYZ3JLeUFwSUhzS0NRbHBaaUFvSUhaaGJIVmxjMXNnYVc1a1pYZ2dYU0FoUFNCdWRXeHNJQ2tnZXdvSkNRbGxiR1Z0Wlc1MGMxc2dhVzVrWlhnZ1hTNXpkSGxzWlM1a2FYTndiR0Y1SUQwZ2RtRnNkV1Z6V3lCcGJtUmxlQ0JkT3dvSkNYMEtDWDBLQ2dseVpYUjFjbTRnWld4bGJXVnVkSE03Q24wS0NtcFJkV1Z5ZVM1bWJpNWxlSFJsYm1Rb0lIc0tDWE5vYjNjNklHWjFibU4wYVc5dUtDa2dld29KQ1hKbGRIVnliaUJ6YUc5M1NHbGtaU2dnZEdocGN5d2dkSEoxWlNBcE93b0pmU3dLQ1docFpHVTZJR1oxYm1OMGFXOXVLQ2tnZXdvSkNYSmxkSFZ5YmlCemFHOTNTR2xrWlNnZ2RHaHBjeUFwT3dvSmZTd0tDWFJ2WjJkc1pUb2dablZ1WTNScGIyNG9JSE4wWVhSbElDa2dld29KQ1dsbUlDZ2dkSGx3Wlc5bUlITjBZWFJsSUQwOVBTQWlZbTl2YkdWaGJpSWdLU0I3Q2drSkNYSmxkSFZ5YmlCemRHRjBaU0EvSUhSb2FYTXVjMmh2ZHlncElEb2dkR2hwY3k1b2FXUmxLQ2s3Q2drSmZRb0tDUWx5WlhSMWNtNGdkR2hwY3k1bFlXTm9LQ0JtZFc1amRHbHZiaWdwSUhzS0NRa0phV1lnS0NCcGMwaHBaR1JsYmxkcGRHaHBibFJ5WldVb0lIUm9hWE1nS1NBcElIc0tDUWtKQ1dwUmRXVnllU2dnZEdocGN5QXBMbk5vYjNjb0tUc0tDUWtKZlNCbGJITmxJSHNLQ1FrSkNXcFJkV1Z5ZVNnZ2RHaHBjeUFwTG1ocFpHVW9LVHNLQ1FrSmZRb0pDWDBnS1RzS0NYMEtmU0FwT3dwMllYSWdjbU5vWldOcllXSnNaVlI1Y0dVZ1BTQW9JQzllS0Q4NlkyaGxZMnRpYjNoOGNtRmthVzhwSkM5cElDazdDZ3AyWVhJZ2NuUmhaMDVoYldVZ1BTQW9JQzg4S0Z0aExYcGRXMTVjTDF3d1BseDRNakJjZEZ4eVhHNWNabDByS1M5cElDazdDZ3AyWVhJZ2NuTmpjbWx3ZEZSNWNHVWdQU0FvSUM5ZUpIeGViVzlrZFd4bEpIeGNMeWcvT21waGRtRjhaV050WVNselkzSnBjSFF2YVNBcE93b0tDZ292THlCWFpTQm9ZWFpsSUhSdklHTnNiM05sSUhSb1pYTmxJSFJoWjNNZ2RHOGdjM1Z3Y0c5eWRDQllTRlJOVENBb0l6RXpNakF3S1FwMllYSWdkM0poY0UxaGNDQTlJSHNLQ2drdkx5QlRkWEJ3YjNKME9pQkpSU0E4UFRrZ2IyNXNlUW9KYjNCMGFXOXVPaUJiSURFc0lDSThjMlZzWldOMElHMTFiSFJwY0d4bFBTZHRkV3gwYVhCc1pTYytJaXdnSWp3dmMyVnNaV04wUGlJZ1hTd0tDZ2t2THlCWVNGUk5UQ0J3WVhKelpYSnpJR1J2SUc1dmRDQnRZV2RwWTJGc2JIa2dhVzV6WlhKMElHVnNaVzFsYm5SeklHbHVJSFJvWlFvSkx5OGdjMkZ0WlNCM1lYa2dkR2hoZENCMFlXY2djMjkxY0NCd1lYSnpaWEp6SUdSdkxpQlRieUIzWlNCallXNXViM1FnYzJodmNuUmxiZ29KTHk4Z2RHaHBjeUJpZVNCdmJXbDBkR2x1WnlBOGRHSnZaSGsrSUc5eUlHOTBhR1Z5SUhKbGNYVnBjbVZrSUdWc1pXMWxiblJ6TGdvSmRHaGxZV1E2SUZzZ01Td2dJangwWVdKc1pUNGlMQ0FpUEM5MFlXSnNaVDRpSUYwc0NnbGpiMnc2SUZzZ01pd2dJangwWVdKc1pUNDhZMjlzWjNKdmRYQStJaXdnSWp3dlkyOXNaM0p2ZFhBK1BDOTBZV0pzWlQ0aUlGMHNDZ2wwY2pvZ1d5QXlMQ0FpUEhSaFlteGxQangwWW05a2VUNGlMQ0FpUEM5MFltOWtlVDQ4TDNSaFlteGxQaUlnWFN3S0NYUmtPaUJiSURNc0lDSThkR0ZpYkdVK1BIUmliMlI1UGp4MGNqNGlMQ0FpUEM5MGNqNDhMM1JpYjJSNVBqd3ZkR0ZpYkdVK0lpQmRMQW9LQ1Y5a1pXWmhkV3gwT2lCYklEQXNJQ0lpTENBaUlpQmRDbjA3Q2dvdkx5QlRkWEJ3YjNKME9pQkpSU0E4UFRrZ2IyNXNlUXAzY21Gd1RXRndMbTl3ZEdkeWIzVndJRDBnZDNKaGNFMWhjQzV2Y0hScGIyNDdDZ3AzY21Gd1RXRndMblJpYjJSNUlEMGdkM0poY0UxaGNDNTBabTl2ZENBOUlIZHlZWEJOWVhBdVkyOXNaM0p2ZFhBZ1BTQjNjbUZ3VFdGd0xtTmhjSFJwYjI0Z1BTQjNjbUZ3VFdGd0xuUm9aV0ZrT3dwM2NtRndUV0Z3TG5Sb0lEMGdkM0poY0UxaGNDNTBaRHNLQ2dwbWRXNWpkR2x2YmlCblpYUkJiR3dvSUdOdmJuUmxlSFFzSUhSaFp5QXBJSHNLQ2drdkx5QlRkWEJ3YjNKME9pQkpSU0E4UFRrZ0xTQXhNU0J2Ym14NUNna3ZMeUJWYzJVZ2RIbHdaVzltSUhSdklHRjJiMmxrSUhwbGNtOHRZWEpuZFcxbGJuUWdiV1YwYUc5a0lHbHVkbTlqWVhScGIyNGdiMjRnYUc5emRDQnZZbXBsWTNSeklDZ2pNVFV4TlRFcENnbDJZWElnY21WME93b0tDV2xtSUNnZ2RIbHdaVzltSUdOdmJuUmxlSFF1WjJWMFJXeGxiV1Z1ZEhOQ2VWUmhaMDVoYldVZ0lUMDlJQ0oxYm1SbFptbHVaV1FpSUNrZ2V3b0pDWEpsZENBOUlHTnZiblJsZUhRdVoyVjBSV3hsYldWdWRITkNlVlJoWjA1aGJXVW9JSFJoWnlCOGZDQWlLaUlnS1RzS0NnbDlJR1ZzYzJVZ2FXWWdLQ0IwZVhCbGIyWWdZMjl1ZEdWNGRDNXhkV1Z5ZVZObGJHVmpkRzl5UVd4c0lDRTlQU0FpZFc1a1pXWnBibVZrSWlBcElIc0tDUWx5WlhRZ1BTQmpiMjUwWlhoMExuRjFaWEo1VTJWc1pXTjBiM0pCYkd3b0lIUmhaeUI4ZkNBaUtpSWdLVHNLQ2dsOUlHVnNjMlVnZXdvSkNYSmxkQ0E5SUZ0ZE93b0pmUW9LQ1dsbUlDZ2dkR0ZuSUQwOVBTQjFibVJsWm1sdVpXUWdmSHdnZEdGbklDWW1JRzV2WkdWT1lXMWxLQ0JqYjI1MFpYaDBMQ0IwWVdjZ0tTQXBJSHNLQ1FseVpYUjFjbTRnYWxGMVpYSjVMbTFsY21kbEtDQmJJR052Ym5SbGVIUWdYU3dnY21WMElDazdDZ2w5Q2dvSmNtVjBkWEp1SUhKbGREc0tmUW9LQ2k4dklFMWhjbXNnYzJOeWFYQjBjeUJoY3lCb1lYWnBibWNnWVd4eVpXRmtlU0JpWldWdUlHVjJZV3gxWVhSbFpBcG1kVzVqZEdsdmJpQnpaWFJIYkc5aVlXeEZkbUZzS0NCbGJHVnRjeXdnY21WbVJXeGxiV1Z1ZEhNZ0tTQjdDZ2wyWVhJZ2FTQTlJREFzQ2drSmJDQTlJR1ZzWlcxekxteGxibWQwYURzS0NnbG1iM0lnS0NBN0lHa2dQQ0JzT3lCcEt5c2dLU0I3Q2drSlpHRjBZVkJ5YVhZdWMyVjBLQW9KQ1FsbGJHVnRjMXNnYVNCZExBb0pDUWtpWjJ4dlltRnNSWFpoYkNJc0Nna0pDU0Z5WldaRmJHVnRaVzUwY3lCOGZDQmtZWFJoVUhKcGRpNW5aWFFvSUhKbFprVnNaVzFsYm5Seld5QnBJRjBzSUNKbmJHOWlZV3hGZG1Gc0lpQXBDZ2tKS1RzS0NYMEtmUW9LQ25aaGNpQnlhSFJ0YkNBOUlDODhmQ1lqUDF4M0t6c3ZPd29LWm5WdVkzUnBiMjRnWW5WcGJHUkdjbUZuYldWdWRDZ2daV3hsYlhNc0lHTnZiblJsZUhRc0lITmpjbWx3ZEhNc0lITmxiR1ZqZEdsdmJpd2dhV2R1YjNKbFpDQXBJSHNLQ1haaGNpQmxiR1Z0TENCMGJYQXNJSFJoWnl3Z2QzSmhjQ3dnWTI5dWRHRnBibk1zSUdvc0Nna0pabkpoWjIxbGJuUWdQU0JqYjI1MFpYaDBMbU55WldGMFpVUnZZM1Z0Wlc1MFJuSmhaMjFsYm5Rb0tTd0tDUWx1YjJSbGN5QTlJRnRkTEFvSkNXa2dQU0F3TEFvSkNXd2dQU0JsYkdWdGN5NXNaVzVuZEdnN0Nnb0pabTl5SUNnZ095QnBJRHdnYkRzZ2FTc3JJQ2tnZXdvSkNXVnNaVzBnUFNCbGJHVnRjMXNnYVNCZE93b0tDUWxwWmlBb0lHVnNaVzBnZkh3Z1pXeGxiU0E5UFQwZ01DQXBJSHNLQ2drSkNTOHZJRUZrWkNCdWIyUmxjeUJrYVhKbFkzUnNlUW9KQ1FscFppQW9JSFJ2Vkhsd1pTZ2daV3hsYlNBcElEMDlQU0FpYjJKcVpXTjBJaUFwSUhzS0Nna0pDUWt2THlCVGRYQndiM0owT2lCQmJtUnliMmxrSUR3OU5DNHdJRzl1Ykhrc0lGQm9ZVzUwYjIxS1V5QXhJRzl1YkhrS0NRa0pDUzh2SUhCMWMyZ3VZWEJ3Ykhrb1h5d2dZWEp5WVhsc2FXdGxLU0IwYUhKdmQzTWdiMjRnWVc1amFXVnVkQ0JYWldKTGFYUUtDUWtKQ1dwUmRXVnllUzV0WlhKblpTZ2dibTlrWlhNc0lHVnNaVzB1Ym05a1pWUjVjR1VnUHlCYklHVnNaVzBnWFNBNklHVnNaVzBnS1RzS0Nna0pDUzh2SUVOdmJuWmxjblFnYm05dUxXaDBiV3dnYVc1MGJ5QmhJSFJsZUhRZ2JtOWtaUW9KQ1FsOUlHVnNjMlVnYVdZZ0tDQWhjbWgwYld3dWRHVnpkQ2dnWld4bGJTQXBJQ2tnZXdvSkNRa0pibTlrWlhNdWNIVnphQ2dnWTI5dWRHVjRkQzVqY21WaGRHVlVaWGgwVG05a1pTZ2daV3hsYlNBcElDazdDZ29KQ1Frdkx5QkRiMjUyWlhKMElHaDBiV3dnYVc1MGJ5QkVUMDBnYm05a1pYTUtDUWtKZlNCbGJITmxJSHNLQ1FrSkNYUnRjQ0E5SUhSdGNDQjhmQ0JtY21GbmJXVnVkQzVoY0hCbGJtUkRhR2xzWkNnZ1kyOXVkR1Y0ZEM1amNtVmhkR1ZGYkdWdFpXNTBLQ0FpWkdsMklpQXBJQ2s3Q2dvSkNRa0pMeThnUkdWelpYSnBZV3hwZW1VZ1lTQnpkR0Z1WkdGeVpDQnlaWEJ5WlhObGJuUmhkR2x2YmdvSkNRa0pkR0ZuSUQwZ0tDQnlkR0ZuVG1GdFpTNWxlR1ZqS0NCbGJHVnRJQ2tnZkh3Z1d5QWlJaXdnSWlJZ1hTQXBXeUF4SUYwdWRHOU1iM2RsY2tOaGMyVW9LVHNLQ1FrSkNYZHlZWEFnUFNCM2NtRndUV0Z3V3lCMFlXY2dYU0I4ZkNCM2NtRndUV0Z3TGw5a1pXWmhkV3gwT3dvSkNRa0pkRzF3TG1sdWJtVnlTRlJOVENBOUlIZHlZWEJiSURFZ1hTQXJJR3BSZFdWeWVTNW9kRzFzVUhKbFptbHNkR1Z5S0NCbGJHVnRJQ2tnS3lCM2NtRndXeUF5SUYwN0Nnb0pDUWtKTHk4Z1JHVnpZMlZ1WkNCMGFISnZkV2RvSUhkeVlYQndaWEp6SUhSdklIUm9aU0J5YVdkb2RDQmpiMjUwWlc1MENna0pDUWxxSUQwZ2QzSmhjRnNnTUNCZE93b0pDUWtKZDJocGJHVWdLQ0JxTFMwZ0tTQjdDZ2tKQ1FrSmRHMXdJRDBnZEcxd0xteGhjM1JEYUdsc1pEc0tDUWtKQ1gwS0Nna0pDUWt2THlCVGRYQndiM0owT2lCQmJtUnliMmxrSUR3OU5DNHdJRzl1Ykhrc0lGQm9ZVzUwYjIxS1V5QXhJRzl1YkhrS0NRa0pDUzh2SUhCMWMyZ3VZWEJ3Ykhrb1h5d2dZWEp5WVhsc2FXdGxLU0IwYUhKdmQzTWdiMjRnWVc1amFXVnVkQ0JYWldKTGFYUUtDUWtKQ1dwUmRXVnllUzV0WlhKblpTZ2dibTlrWlhNc0lIUnRjQzVqYUdsc1pFNXZaR1Z6SUNrN0Nnb0pDUWtKTHk4Z1VtVnRaVzFpWlhJZ2RHaGxJSFJ2Y0Mxc1pYWmxiQ0JqYjI1MFlXbHVaWElLQ1FrSkNYUnRjQ0E5SUdaeVlXZHRaVzUwTG1acGNuTjBRMmhwYkdRN0Nnb0pDUWtKTHk4Z1JXNXpkWEpsSUhSb1pTQmpjbVZoZEdWa0lHNXZaR1Z6SUdGeVpTQnZjbkJvWVc1bFpDQW9JekV5TXpreUtRb0pDUWtKZEcxd0xuUmxlSFJEYjI1MFpXNTBJRDBnSWlJN0Nna0pDWDBLQ1FsOUNnbDlDZ29KTHk4Z1VtVnRiM1psSUhkeVlYQndaWElnWm5KdmJTQm1jbUZuYldWdWRBb0pabkpoWjIxbGJuUXVkR1Y0ZEVOdmJuUmxiblFnUFNBaUlqc0tDZ2xwSUQwZ01Ec0tDWGRvYVd4bElDZ2dLQ0JsYkdWdElEMGdibTlrWlhOYklHa3JLeUJkSUNrZ0tTQjdDZ29KQ1M4dklGTnJhWEFnWld4bGJXVnVkSE1nWVd4eVpXRmtlU0JwYmlCMGFHVWdZMjl1ZEdWNGRDQmpiMnhzWldOMGFXOXVJQ2gwY21GakxUUXdPRGNwQ2drSmFXWWdLQ0J6Wld4bFkzUnBiMjRnSmlZZ2FsRjFaWEo1TG1sdVFYSnlZWGtvSUdWc1pXMHNJSE5sYkdWamRHbHZiaUFwSUQ0Z0xURWdLU0I3Q2drSkNXbG1JQ2dnYVdkdWIzSmxaQ0FwSUhzS0NRa0pDV2xuYm05eVpXUXVjSFZ6YUNnZ1pXeGxiU0FwT3dvSkNRbDlDZ2tKQ1dOdmJuUnBiblZsT3dvSkNYMEtDZ2tKWTI5dWRHRnBibk1nUFNCcVVYVmxjbmt1WTI5dWRHRnBibk1vSUdWc1pXMHViM2R1WlhKRWIyTjFiV1Z1ZEN3Z1pXeGxiU0FwT3dvS0NRa3ZMeUJCY0hCbGJtUWdkRzhnWm5KaFoyMWxiblFLQ1FsMGJYQWdQU0JuWlhSQmJHd29JR1p5WVdkdFpXNTBMbUZ3Y0dWdVpFTm9hV3hrS0NCbGJHVnRJQ2tzSUNKelkzSnBjSFFpSUNrN0Nnb0pDUzh2SUZCeVpYTmxjblpsSUhOamNtbHdkQ0JsZG1Gc2RXRjBhVzl1SUdocGMzUnZjbmtLQ1FscFppQW9JR052Ym5SaGFXNXpJQ2tnZXdvSkNRbHpaWFJIYkc5aVlXeEZkbUZzS0NCMGJYQWdLVHNLQ1FsOUNnb0pDUzh2SUVOaGNIUjFjbVVnWlhobFkzVjBZV0pzWlhNS0NRbHBaaUFvSUhOamNtbHdkSE1nS1NCN0Nna0pDV29nUFNBd093b0pDUWwzYUdsc1pTQW9JQ2dnWld4bGJTQTlJSFJ0Y0ZzZ2Fpc3JJRjBnS1NBcElIc0tDUWtKQ1dsbUlDZ2djbk5qY21sd2RGUjVjR1V1ZEdWemRDZ2daV3hsYlM1MGVYQmxJSHg4SUNJaUlDa2dLU0I3Q2drSkNRa0pjMk55YVhCMGN5NXdkWE5vS0NCbGJHVnRJQ2s3Q2drSkNRbDlDZ2tKQ1gwS0NRbDlDZ2w5Q2dvSmNtVjBkWEp1SUdaeVlXZHRaVzUwT3dwOUNnb0tLQ0JtZFc1amRHbHZiaWdwSUhzS0NYWmhjaUJtY21GbmJXVnVkQ0E5SUdSdlkzVnRaVzUwTG1OeVpXRjBaVVJ2WTNWdFpXNTBSbkpoWjIxbGJuUW9LU3dLQ1Fsa2FYWWdQU0JtY21GbmJXVnVkQzVoY0hCbGJtUkRhR2xzWkNnZ1pHOWpkVzFsYm5RdVkzSmxZWFJsUld4bGJXVnVkQ2dnSW1ScGRpSWdLU0FwTEFvSkNXbHVjSFYwSUQwZ1pHOWpkVzFsYm5RdVkzSmxZWFJsUld4bGJXVnVkQ2dnSW1sdWNIVjBJaUFwT3dvS0NTOHZJRk4xY0hCdmNuUTZJRUZ1WkhKdmFXUWdOQzR3SUMwZ05DNHpJRzl1YkhrS0NTOHZJRU5vWldOcklITjBZWFJsSUd4dmMzUWdhV1lnZEdobElHNWhiV1VnYVhNZ2MyVjBJQ2dqTVRFeU1UY3BDZ2t2THlCVGRYQndiM0owT2lCWGFXNWtiM2R6SUZkbFlpQkJjSEJ6SUNoWFYwRXBDZ2t2THlCZ2JtRnRaV0FnWVc1a0lHQjBlWEJsWUNCdGRYTjBJSFZ6WlNBdWMyVjBRWFIwY21saWRYUmxJR1p2Y2lCWFYwRWdLQ014TkRrd01Ta0tDV2x1Y0hWMExuTmxkRUYwZEhKcFluVjBaU2dnSW5SNWNHVWlMQ0FpY21Ga2FXOGlJQ2s3Q2dscGJuQjFkQzV6WlhSQmRIUnlhV0oxZEdVb0lDSmphR1ZqYTJWa0lpd2dJbU5vWldOclpXUWlJQ2s3Q2dscGJuQjFkQzV6WlhSQmRIUnlhV0oxZEdVb0lDSnVZVzFsSWl3Z0luUWlJQ2s3Q2dvSlpHbDJMbUZ3Y0dWdVpFTm9hV3hrS0NCcGJuQjFkQ0FwT3dvS0NTOHZJRk4xY0hCdmNuUTZJRUZ1WkhKdmFXUWdQRDAwTGpFZ2IyNXNlUW9KTHk4Z1QyeGtaWElnVjJWaVMybDBJR1J2WlhOdUozUWdZMnh2Ym1VZ1kyaGxZMnRsWkNCemRHRjBaU0JqYjNKeVpXTjBiSGtnYVc0Z1puSmhaMjFsYm5SekNnbHpkWEJ3YjNKMExtTm9aV05yUTJ4dmJtVWdQU0JrYVhZdVkyeHZibVZPYjJSbEtDQjBjblZsSUNrdVkyeHZibVZPYjJSbEtDQjBjblZsSUNrdWJHRnpkRU5vYVd4a0xtTm9aV05yWldRN0Nnb0pMeThnVTNWd2NHOXlkRG9nU1VVZ1BEMHhNU0J2Ym14NUNna3ZMeUJOWVd0bElITjFjbVVnZEdWNGRHRnlaV0VnS0dGdVpDQmphR1ZqYTJKdmVDa2daR1ZtWVhWc2RGWmhiSFZsSUdseklIQnliM0JsY214NUlHTnNiMjVsWkFvSlpHbDJMbWx1Ym1WeVNGUk5UQ0E5SUNJOGRHVjRkR0Z5WldFK2VEd3ZkR1Y0ZEdGeVpXRStJanNLQ1hOMWNIQnZjblF1Ym05RGJHOXVaVU5vWldOclpXUWdQU0FoSVdScGRpNWpiRzl1WlU1dlpHVW9JSFJ5ZFdVZ0tTNXNZWE4wUTJocGJHUXVaR1ZtWVhWc2RGWmhiSFZsT3dwOUlDa29LVHNLZG1GeUlHUnZZM1Z0Wlc1MFJXeGxiV1Z1ZENBOUlHUnZZM1Z0Wlc1MExtUnZZM1Z0Wlc1MFJXeGxiV1Z1ZERzS0Nnb0tkbUZ5Q2dseWEyVjVSWFpsYm5RZ1BTQXZYbXRsZVM4c0NnbHliVzkxYzJWRmRtVnVkQ0E5SUM5ZUtEODZiVzkxYzJWOGNHOXBiblJsY254amIyNTBaWGgwYldWdWRYeGtjbUZuZkdSeWIzQXBmR05zYVdOckx5d0tDWEowZVhCbGJtRnRaWE53WVdObElEMGdMMTRvVzE0dVhTb3BLRDg2WEM0b0xpc3BmQ2t2T3dvS1puVnVZM1JwYjI0Z2NtVjBkWEp1VkhKMVpTZ3BJSHNLQ1hKbGRIVnliaUIwY25WbE93cDlDZ3BtZFc1amRHbHZiaUJ5WlhSMWNtNUdZV3h6WlNncElIc0tDWEpsZEhWeWJpQm1ZV3h6WlRzS2ZRb0tMeThnVTNWd2NHOXlkRG9nU1VVZ1BEMDVJRzl1YkhrS0x5OGdVMlZsSUNNeE16TTVNeUJtYjNJZ2JXOXlaU0JwYm1adkNtWjFibU4wYVc5dUlITmhabVZCWTNScGRtVkZiR1Z0Wlc1MEtDa2dld29KZEhKNUlIc0tDUWx5WlhSMWNtNGdaRzlqZFcxbGJuUXVZV04wYVhabFJXeGxiV1Z1ZERzS0NYMGdZMkYwWTJnZ0tDQmxjbklnS1NCN0lIMEtmUW9LWm5WdVkzUnBiMjRnYjI0b0lHVnNaVzBzSUhSNWNHVnpMQ0J6Wld4bFkzUnZjaXdnWkdGMFlTd2dabTRzSUc5dVpTQXBJSHNLQ1haaGNpQnZjbWxuUm00c0lIUjVjR1U3Q2dvSkx5OGdWSGx3WlhNZ1kyRnVJR0psSUdFZ2JXRndJRzltSUhSNWNHVnpMMmhoYm1Sc1pYSnpDZ2xwWmlBb0lIUjVjR1Z2WmlCMGVYQmxjeUE5UFQwZ0ltOWlhbVZqZENJZ0tTQjdDZ29KQ1M4dklDZ2dkSGx3WlhNdFQySnFaV04wTENCelpXeGxZM1J2Y2l3Z1pHRjBZU0FwQ2drSmFXWWdLQ0IwZVhCbGIyWWdjMlZzWldOMGIzSWdJVDA5SUNKemRISnBibWNpSUNrZ2V3b0tDUWtKTHk4Z0tDQjBlWEJsY3kxUFltcGxZM1FzSUdSaGRHRWdLUW9KQ1Fsa1lYUmhJRDBnWkdGMFlTQjhmQ0J6Wld4bFkzUnZjanNLQ1FrSmMyVnNaV04wYjNJZ1BTQjFibVJsWm1sdVpXUTdDZ2tKZlFvSkNXWnZjaUFvSUhSNWNHVWdhVzRnZEhsd1pYTWdLU0I3Q2drSkNXOXVLQ0JsYkdWdExDQjBlWEJsTENCelpXeGxZM1J2Y2l3Z1pHRjBZU3dnZEhsd1pYTmJJSFI1Y0dVZ1hTd2diMjVsSUNrN0Nna0pmUW9KQ1hKbGRIVnliaUJsYkdWdE93b0pmUW9LQ1dsbUlDZ2daR0YwWVNBOVBTQnVkV3hzSUNZbUlHWnVJRDA5SUc1MWJHd2dLU0I3Q2dvSkNTOHZJQ2dnZEhsd1pYTXNJR1p1SUNrS0NRbG1iaUE5SUhObGJHVmpkRzl5T3dvSkNXUmhkR0VnUFNCelpXeGxZM1J2Y2lBOUlIVnVaR1ZtYVc1bFpEc0tDWDBnWld4elpTQnBaaUFvSUdadUlEMDlJRzUxYkd3Z0tTQjdDZ2tKYVdZZ0tDQjBlWEJsYjJZZ2MyVnNaV04wYjNJZ1BUMDlJQ0p6ZEhKcGJtY2lJQ2tnZXdvS0NRa0pMeThnS0NCMGVYQmxjeXdnYzJWc1pXTjBiM0lzSUdadUlDa0tDUWtKWm00Z1BTQmtZWFJoT3dvSkNRbGtZWFJoSUQwZ2RXNWtaV1pwYm1Wa093b0pDWDBnWld4elpTQjdDZ29KQ1Frdkx5QW9JSFI1Y0dWekxDQmtZWFJoTENCbWJpQXBDZ2tKQ1dadUlEMGdaR0YwWVRzS0NRa0paR0YwWVNBOUlITmxiR1ZqZEc5eU93b0pDUWx6Wld4bFkzUnZjaUE5SUhWdVpHVm1hVzVsWkRzS0NRbDlDZ2w5Q2dscFppQW9JR1p1SUQwOVBTQm1ZV3h6WlNBcElIc0tDUWxtYmlBOUlISmxkSFZ5YmtaaGJITmxPd29KZlNCbGJITmxJR2xtSUNnZ0lXWnVJQ2tnZXdvSkNYSmxkSFZ5YmlCbGJHVnRPd29KZlFvS0NXbG1JQ2dnYjI1bElEMDlQU0F4SUNrZ2V3b0pDVzl5YVdkR2JpQTlJR1p1T3dvSkNXWnVJRDBnWm5WdVkzUnBiMjRvSUdWMlpXNTBJQ2tnZXdvS0NRa0pMeThnUTJGdUlIVnpaU0JoYmlCbGJYQjBlU0J6WlhRc0lITnBibU5sSUdWMlpXNTBJR052Ym5SaGFXNXpJSFJvWlNCcGJtWnZDZ2tKQ1dwUmRXVnllU2dwTG05bVppZ2daWFpsYm5RZ0tUc0tDUWtKY21WMGRYSnVJRzl5YVdkR2JpNWhjSEJzZVNnZ2RHaHBjeXdnWVhKbmRXMWxiblJ6SUNrN0Nna0pmVHNLQ2drSkx5OGdWWE5sSUhOaGJXVWdaM1ZwWkNCemJ5QmpZV3hzWlhJZ1kyRnVJSEpsYlc5MlpTQjFjMmx1WnlCdmNtbG5SbTRLQ1FsbWJpNW5kV2xrSUQwZ2IzSnBaMFp1TG1kMWFXUWdmSHdnS0NCdmNtbG5SbTR1WjNWcFpDQTlJR3BSZFdWeWVTNW5kV2xrS3lzZ0tUc0tDWDBLQ1hKbGRIVnliaUJsYkdWdExtVmhZMmdvSUdaMWJtTjBhVzl1S0NrZ2V3b0pDV3BSZFdWeWVTNWxkbVZ1ZEM1aFpHUW9JSFJvYVhNc0lIUjVjR1Z6TENCbWJpd2daR0YwWVN3Z2MyVnNaV04wYjNJZ0tUc0tDWDBnS1RzS2ZRb0tMeW9LSUNvZ1NHVnNjR1Z5SUdaMWJtTjBhVzl1Y3lCbWIzSWdiV0Z1WVdkcGJtY2daWFpsYm5SeklDMHRJRzV2ZENCd1lYSjBJRzltSUhSb1pTQndkV0pzYVdNZ2FXNTBaWEptWVdObExnb2dLaUJRY205d2N5QjBieUJFWldGdUlFVmtkMkZ5WkhNbklHRmtaRVYyWlc1MElHeHBZbkpoY25rZ1ptOXlJRzFoYm5rZ2IyWWdkR2hsSUdsa1pXRnpMZ29nS2k4S2FsRjFaWEo1TG1WMlpXNTBJRDBnZXdvS0NXZHNiMkpoYkRvZ2UzMHNDZ29KWVdSa09pQm1kVzVqZEdsdmJpZ2daV3hsYlN3Z2RIbHdaWE1zSUdoaGJtUnNaWElzSUdSaGRHRXNJSE5sYkdWamRHOXlJQ2tnZXdvS0NRbDJZWElnYUdGdVpHeGxUMkpxU1c0c0lHVjJaVzUwU0dGdVpHeGxMQ0IwYlhBc0Nna0pDV1YyWlc1MGN5d2dkQ3dnYUdGdVpHeGxUMkpxTEFvSkNRbHpjR1ZqYVdGc0xDQm9ZVzVrYkdWeWN5d2dkSGx3WlN3Z2JtRnRaWE53WVdObGN5d2diM0pwWjFSNWNHVXNDZ2tKQ1dWc1pXMUVZWFJoSUQwZ1pHRjBZVkJ5YVhZdVoyVjBLQ0JsYkdWdElDazdDZ29KQ1M4dklFUnZiaWQwSUdGMGRHRmphQ0JsZG1WdWRITWdkRzhnYm05RVlYUmhJRzl5SUhSbGVIUXZZMjl0YldWdWRDQnViMlJsY3lBb1luVjBJR0ZzYkc5M0lIQnNZV2x1SUc5aWFtVmpkSE1wQ2drSmFXWWdLQ0FoWld4bGJVUmhkR0VnS1NCN0Nna0pDWEpsZEhWeWJqc0tDUWw5Q2dvSkNTOHZJRU5oYkd4bGNpQmpZVzRnY0dGemN5QnBiaUJoYmlCdlltcGxZM1FnYjJZZ1kzVnpkRzl0SUdSaGRHRWdhVzRnYkdsbGRTQnZaaUIwYUdVZ2FHRnVaR3hsY2dvSkNXbG1JQ2dnYUdGdVpHeGxjaTVvWVc1a2JHVnlJQ2tnZXdvSkNRbG9ZVzVrYkdWUFltcEpiaUE5SUdoaGJtUnNaWEk3Q2drSkNXaGhibVJzWlhJZ1BTQm9ZVzVrYkdWUFltcEpiaTVvWVc1a2JHVnlPd29KQ1FselpXeGxZM1J2Y2lBOUlHaGhibVJzWlU5aWFrbHVMbk5sYkdWamRHOXlPd29KQ1gwS0Nna0pMeThnUlc1emRYSmxJSFJvWVhRZ2FXNTJZV3hwWkNCelpXeGxZM1J2Y25NZ2RHaHliM2NnWlhoalpYQjBhVzl1Y3lCaGRDQmhkSFJoWTJnZ2RHbHRaUW9KQ1M4dklFVjJZV3gxWVhSbElHRm5ZV2x1YzNRZ1pHOWpkVzFsYm5SRmJHVnRaVzUwSUdsdUlHTmhjMlVnWld4bGJTQnBjeUJoSUc1dmJpMWxiR1Z0Wlc1MElHNXZaR1VnS0dVdVp5NHNJR1J2WTNWdFpXNTBLUW9KQ1dsbUlDZ2djMlZzWldOMGIzSWdLU0I3Q2drSkNXcFJkV1Z5ZVM1bWFXNWtMbTFoZEdOb1pYTlRaV3hsWTNSdmNpZ2daRzlqZFcxbGJuUkZiR1Z0Wlc1MExDQnpaV3hsWTNSdmNpQXBPd29KQ1gwS0Nna0pMeThnVFdGclpTQnpkWEpsSUhSb1lYUWdkR2hsSUdoaGJtUnNaWElnYUdGeklHRWdkVzVwY1hWbElFbEVMQ0IxYzJWa0lIUnZJR1pwYm1RdmNtVnRiM1psSUdsMElHeGhkR1Z5Q2drSmFXWWdLQ0FoYUdGdVpHeGxjaTVuZFdsa0lDa2dld29KQ1Fsb1lXNWtiR1Z5TG1kMWFXUWdQU0JxVVhWbGNua3VaM1ZwWkNzck93b0pDWDBLQ2drSkx5OGdTVzVwZENCMGFHVWdaV3hsYldWdWRDZHpJR1YyWlc1MElITjBjblZqZEhWeVpTQmhibVFnYldGcGJpQm9ZVzVrYkdWeUxDQnBaaUIwYUdseklHbHpJSFJvWlNCbWFYSnpkQW9KQ1dsbUlDZ2dJU2dnWlhabGJuUnpJRDBnWld4bGJVUmhkR0V1WlhabGJuUnpJQ2tnS1NCN0Nna0pDV1YyWlc1MGN5QTlJR1ZzWlcxRVlYUmhMbVYyWlc1MGN5QTlJSHQ5T3dvSkNYMEtDUWxwWmlBb0lDRW9JR1YyWlc1MFNHRnVaR3hsSUQwZ1pXeGxiVVJoZEdFdWFHRnVaR3hsSUNrZ0tTQjdDZ2tKQ1dWMlpXNTBTR0Z1Wkd4bElEMGdaV3hsYlVSaGRHRXVhR0Z1Wkd4bElEMGdablZ1WTNScGIyNG9JR1VnS1NCN0Nnb0pDUWtKTHk4Z1JHbHpZMkZ5WkNCMGFHVWdjMlZqYjI1a0lHVjJaVzUwSUc5bUlHRWdhbEYxWlhKNUxtVjJaVzUwTG5SeWFXZG5aWElvS1NCaGJtUUtDUWtKQ1M4dklIZG9aVzRnWVc0Z1pYWmxiblFnYVhNZ1kyRnNiR1ZrSUdGbWRHVnlJR0VnY0dGblpTQm9ZWE1nZFc1c2IyRmtaV1FLQ1FrSkNYSmxkSFZ5YmlCMGVYQmxiMllnYWxGMVpYSjVJQ0U5UFNBaWRXNWtaV1pwYm1Wa0lpQW1KaUJxVVhWbGNua3VaWFpsYm5RdWRISnBaMmRsY21Wa0lDRTlQU0JsTG5SNWNHVWdQd29KQ1FrSkNXcFJkV1Z5ZVM1bGRtVnVkQzVrYVhOd1lYUmphQzVoY0hCc2VTZ2daV3hsYlN3Z1lYSm5kVzFsYm5SeklDa2dPaUIxYm1SbFptbHVaV1E3Q2drSkNYMDdDZ2tKZlFvS0NRa3ZMeUJJWVc1a2JHVWdiWFZzZEdsd2JHVWdaWFpsYm5SeklITmxjR0Z5WVhSbFpDQmllU0JoSUhOd1lXTmxDZ2tKZEhsd1pYTWdQU0FvSUhSNWNHVnpJSHg4SUNJaUlDa3ViV0YwWTJnb0lISnViM1JvZEcxc2QyaHBkR1VnS1NCOGZDQmJJQ0lpSUYwN0Nna0pkQ0E5SUhSNWNHVnpMbXhsYm1kMGFEc0tDUWwzYUdsc1pTQW9JSFF0TFNBcElIc0tDUWtKZEcxd0lEMGdjblI1Y0dWdVlXMWxjM0JoWTJVdVpYaGxZeWdnZEhsd1pYTmJJSFFnWFNBcElIeDhJRnRkT3dvSkNRbDBlWEJsSUQwZ2IzSnBaMVI1Y0dVZ1BTQjBiWEJiSURFZ1hUc0tDUWtKYm1GdFpYTndZV05sY3lBOUlDZ2dkRzF3V3lBeUlGMGdmSHdnSWlJZ0tTNXpjR3hwZENnZ0lpNGlJQ2t1YzI5eWRDZ3BPd29LQ1FrSkx5OGdWR2hsY21VZ0ttMTFjM1FxSUdKbElHRWdkSGx3WlN3Z2JtOGdZWFIwWVdOb2FXNW5JRzVoYldWemNHRmpaUzF2Ym14NUlHaGhibVJzWlhKekNna0pDV2xtSUNnZ0lYUjVjR1VnS1NCN0Nna0pDUWxqYjI1MGFXNTFaVHNLQ1FrSmZRb0tDUWtKTHk4Z1NXWWdaWFpsYm5RZ1kyaGhibWRsY3lCcGRITWdkSGx3WlN3Z2RYTmxJSFJvWlNCemNHVmphV0ZzSUdWMlpXNTBJR2hoYm1Sc1pYSnpJR1p2Y2lCMGFHVWdZMmhoYm1kbFpDQjBlWEJsQ2drSkNYTndaV05wWVd3Z1BTQnFVWFZsY25rdVpYWmxiblF1YzNCbFkybGhiRnNnZEhsd1pTQmRJSHg4SUh0OU93b0tDUWtKTHk4Z1NXWWdjMlZzWldOMGIzSWdaR1ZtYVc1bFpDd2daR1YwWlhKdGFXNWxJSE53WldOcFlXd2daWFpsYm5RZ1lYQnBJSFI1Y0dVc0lHOTBhR1Z5ZDJselpTQm5hWFpsYmlCMGVYQmxDZ2tKQ1hSNWNHVWdQU0FvSUhObGJHVmpkRzl5SUQ4Z2MzQmxZMmxoYkM1a1pXeGxaMkYwWlZSNWNHVWdPaUJ6Y0dWamFXRnNMbUpwYm1SVWVYQmxJQ2tnZkh3Z2RIbHdaVHNLQ2drSkNTOHZJRlZ3WkdGMFpTQnpjR1ZqYVdGc0lHSmhjMlZrSUc5dUlHNWxkMng1SUhKbGMyVjBJSFI1Y0dVS0NRa0pjM0JsWTJsaGJDQTlJR3BSZFdWeWVTNWxkbVZ1ZEM1emNHVmphV0ZzV3lCMGVYQmxJRjBnZkh3Z2UzMDdDZ29KQ1Frdkx5Qm9ZVzVrYkdWUFltb2dhWE1nY0dGemMyVmtJSFJ2SUdGc2JDQmxkbVZ1ZENCb1lXNWtiR1Z5Y3dvSkNRbG9ZVzVrYkdWUFltb2dQU0JxVVhWbGNua3VaWGgwWlc1a0tDQjdDZ2tKQ1FsMGVYQmxPaUIwZVhCbExBb0pDUWtKYjNKcFoxUjVjR1U2SUc5eWFXZFVlWEJsTEFvSkNRa0paR0YwWVRvZ1pHRjBZU3dLQ1FrSkNXaGhibVJzWlhJNklHaGhibVJzWlhJc0Nna0pDUWxuZFdsa09pQm9ZVzVrYkdWeUxtZDFhV1FzQ2drSkNRbHpaV3hsWTNSdmNqb2djMlZzWldOMGIzSXNDZ2tKQ1FsdVpXVmtjME52Ym5SbGVIUTZJSE5sYkdWamRHOXlJQ1ltSUdwUmRXVnllUzVsZUhCeUxtMWhkR05vTG01bFpXUnpRMjl1ZEdWNGRDNTBaWE4wS0NCelpXeGxZM1J2Y2lBcExBb0pDUWtKYm1GdFpYTndZV05sT2lCdVlXMWxjM0JoWTJWekxtcHZhVzRvSUNJdUlpQXBDZ2tKQ1gwc0lHaGhibVJzWlU5aWFrbHVJQ2s3Q2dvSkNRa3ZMeUJKYm1sMElIUm9aU0JsZG1WdWRDQm9ZVzVrYkdWeUlIRjFaWFZsSUdsbUlIZGxKM0psSUhSb1pTQm1hWEp6ZEFvSkNRbHBaaUFvSUNFb0lHaGhibVJzWlhKeklEMGdaWFpsYm5Seld5QjBlWEJsSUYwZ0tTQXBJSHNLQ1FrSkNXaGhibVJzWlhKeklEMGdaWFpsYm5Seld5QjBlWEJsSUYwZ1BTQmJYVHNLQ1FrSkNXaGhibVJzWlhKekxtUmxiR1ZuWVhSbFEyOTFiblFnUFNBd093b0tDUWtKQ1M4dklFOXViSGtnZFhObElHRmtaRVYyWlc1MFRHbHpkR1Z1WlhJZ2FXWWdkR2hsSUhOd1pXTnBZV3dnWlhabGJuUnpJR2hoYm1Sc1pYSWdjbVYwZFhKdWN5Qm1ZV3h6WlFvSkNRa0phV1lnS0NBaGMzQmxZMmxoYkM1elpYUjFjQ0I4ZkFvSkNRa0pDWE53WldOcFlXd3VjMlYwZFhBdVkyRnNiQ2dnWld4bGJTd2daR0YwWVN3Z2JtRnRaWE53WVdObGN5d2daWFpsYm5SSVlXNWtiR1VnS1NBOVBUMGdabUZzYzJVZ0tTQjdDZ29KQ1FrSkNXbG1JQ2dnWld4bGJTNWhaR1JGZG1WdWRFeHBjM1JsYm1WeUlDa2dld29KQ1FrSkNRbGxiR1Z0TG1Ga1pFVjJaVzUwVEdsemRHVnVaWElvSUhSNWNHVXNJR1YyWlc1MFNHRnVaR3hsSUNrN0Nna0pDUWtKZlFvSkNRa0pmUW9KQ1FsOUNnb0pDUWxwWmlBb0lITndaV05wWVd3dVlXUmtJQ2tnZXdvSkNRa0pjM0JsWTJsaGJDNWhaR1F1WTJGc2JDZ2daV3hsYlN3Z2FHRnVaR3hsVDJKcUlDazdDZ29KQ1FrSmFXWWdLQ0FoYUdGdVpHeGxUMkpxTG1oaGJtUnNaWEl1WjNWcFpDQXBJSHNLQ1FrSkNRbG9ZVzVrYkdWUFltb3VhR0Z1Wkd4bGNpNW5kV2xrSUQwZ2FHRnVaR3hsY2k1bmRXbGtPd29KQ1FrSmZRb0pDUWw5Q2dvSkNRa3ZMeUJCWkdRZ2RHOGdkR2hsSUdWc1pXMWxiblFuY3lCb1lXNWtiR1Z5SUd4cGMzUXNJR1JsYkdWbllYUmxjeUJwYmlCbWNtOXVkQW9KQ1FscFppQW9JSE5sYkdWamRHOXlJQ2tnZXdvSkNRa0phR0Z1Wkd4bGNuTXVjM0JzYVdObEtDQm9ZVzVrYkdWeWN5NWtaV3hsWjJGMFpVTnZkVzUwS3lzc0lEQXNJR2hoYm1Sc1pVOWlhaUFwT3dvSkNRbDlJR1ZzYzJVZ2V3b0pDUWtKYUdGdVpHeGxjbk11Y0hWemFDZ2dhR0Z1Wkd4bFQySnFJQ2s3Q2drSkNYMEtDZ2tKQ1M4dklFdGxaWEFnZEhKaFkyc2diMllnZDJocFkyZ2daWFpsYm5SeklHaGhkbVVnWlhabGNpQmlaV1Z1SUhWelpXUXNJR1p2Y2lCbGRtVnVkQ0J2Y0hScGJXbDZZWFJwYjI0S0NRa0phbEYxWlhKNUxtVjJaVzUwTG1kc2IySmhiRnNnZEhsd1pTQmRJRDBnZEhKMVpUc0tDUWw5Q2dvSmZTd0tDZ2t2THlCRVpYUmhZMmdnWVc0Z1pYWmxiblFnYjNJZ2MyVjBJRzltSUdWMlpXNTBjeUJtY205dElHRnVJR1ZzWlcxbGJuUUtDWEpsYlc5MlpUb2dablZ1WTNScGIyNG9JR1ZzWlcwc0lIUjVjR1Z6TENCb1lXNWtiR1Z5TENCelpXeGxZM1J2Y2l3Z2JXRndjR1ZrVkhsd1pYTWdLU0I3Q2dvSkNYWmhjaUJxTENCdmNtbG5RMjkxYm5Rc0lIUnRjQ3dLQ1FrSlpYWmxiblJ6TENCMExDQm9ZVzVrYkdWUFltb3NDZ2tKQ1hOd1pXTnBZV3dzSUdoaGJtUnNaWEp6TENCMGVYQmxMQ0J1WVcxbGMzQmhZMlZ6TENCdmNtbG5WSGx3WlN3S0NRa0paV3hsYlVSaGRHRWdQU0JrWVhSaFVISnBkaTVvWVhORVlYUmhLQ0JsYkdWdElDa2dKaVlnWkdGMFlWQnlhWFl1WjJWMEtDQmxiR1Z0SUNrN0Nnb0pDV2xtSUNnZ0lXVnNaVzFFWVhSaElIeDhJQ0VvSUdWMlpXNTBjeUE5SUdWc1pXMUVZWFJoTG1WMlpXNTBjeUFwSUNrZ2V3b0pDUWx5WlhSMWNtNDdDZ2tKZlFvS0NRa3ZMeUJQYm1ObElHWnZjaUJsWVdOb0lIUjVjR1V1Ym1GdFpYTndZV05sSUdsdUlIUjVjR1Z6T3lCMGVYQmxJRzFoZVNCaVpTQnZiV2wwZEdWa0Nna0pkSGx3WlhNZ1BTQW9JSFI1Y0dWeklIeDhJQ0lpSUNrdWJXRjBZMmdvSUhKdWIzUm9kRzFzZDJocGRHVWdLU0I4ZkNCYklDSWlJRjA3Q2drSmRDQTlJSFI1Y0dWekxteGxibWQwYURzS0NRbDNhR2xzWlNBb0lIUXRMU0FwSUhzS0NRa0pkRzF3SUQwZ2NuUjVjR1Z1WVcxbGMzQmhZMlV1WlhobFl5Z2dkSGx3WlhOYklIUWdYU0FwSUh4OElGdGRPd29KQ1FsMGVYQmxJRDBnYjNKcFoxUjVjR1VnUFNCMGJYQmJJREVnWFRzS0NRa0pibUZ0WlhOd1lXTmxjeUE5SUNnZ2RHMXdXeUF5SUYwZ2ZId2dJaUlnS1M1emNHeHBkQ2dnSWk0aUlDa3VjMjl5ZENncE93b0tDUWtKTHk4Z1ZXNWlhVzVrSUdGc2JDQmxkbVZ1ZEhNZ0tHOXVJSFJvYVhNZ2JtRnRaWE53WVdObExDQnBaaUJ3Y205MmFXUmxaQ2tnWm05eUlIUm9aU0JsYkdWdFpXNTBDZ2tKQ1dsbUlDZ2dJWFI1Y0dVZ0tTQjdDZ2tKQ1FsbWIzSWdLQ0IwZVhCbElHbHVJR1YyWlc1MGN5QXBJSHNLQ1FrSkNRbHFVWFZsY25rdVpYWmxiblF1Y21WdGIzWmxLQ0JsYkdWdExDQjBlWEJsSUNzZ2RIbHdaWE5iSUhRZ1hTd2dhR0Z1Wkd4bGNpd2djMlZzWldOMGIzSXNJSFJ5ZFdVZ0tUc0tDUWtKQ1gwS0NRa0pDV052Ym5ScGJuVmxPd29KQ1FsOUNnb0pDUWx6Y0dWamFXRnNJRDBnYWxGMVpYSjVMbVYyWlc1MExuTndaV05wWVd4YklIUjVjR1VnWFNCOGZDQjdmVHNLQ1FrSmRIbHdaU0E5SUNnZ2MyVnNaV04wYjNJZ1B5QnpjR1ZqYVdGc0xtUmxiR1ZuWVhSbFZIbHdaU0E2SUhOd1pXTnBZV3d1WW1sdVpGUjVjR1VnS1NCOGZDQjBlWEJsT3dvSkNRbG9ZVzVrYkdWeWN5QTlJR1YyWlc1MGMxc2dkSGx3WlNCZElIeDhJRnRkT3dvSkNRbDBiWEFnUFNCMGJYQmJJRElnWFNBbUpnb0pDUWtKYm1WM0lGSmxaMFY0Y0NnZ0lpaGVmRnhjTGlraUlDc2dibUZ0WlhOd1lXTmxjeTVxYjJsdUtDQWlYRnd1S0Q4NkxpcGNYQzU4S1NJZ0tTQXJJQ0lvWEZ3dWZDUXBJaUFwT3dvS0NRa0pMeThnVW1WdGIzWmxJRzFoZEdOb2FXNW5JR1YyWlc1MGN3b0pDUWx2Y21sblEyOTFiblFnUFNCcUlEMGdhR0Z1Wkd4bGNuTXViR1Z1WjNSb093b0pDUWwzYUdsc1pTQW9JR290TFNBcElIc0tDUWtKQ1doaGJtUnNaVTlpYWlBOUlHaGhibVJzWlhKeld5QnFJRjA3Q2dvSkNRa0phV1lnS0NBb0lHMWhjSEJsWkZSNWNHVnpJSHg4SUc5eWFXZFVlWEJsSUQwOVBTQm9ZVzVrYkdWUFltb3ViM0pwWjFSNWNHVWdLU0FtSmdvSkNRa0pDU2dnSVdoaGJtUnNaWElnZkh3Z2FHRnVaR3hsY2k1bmRXbGtJRDA5UFNCb1lXNWtiR1ZQWW1vdVozVnBaQ0FwSUNZbUNna0pDUWtKS0NBaGRHMXdJSHg4SUhSdGNDNTBaWE4wS0NCb1lXNWtiR1ZQWW1vdWJtRnRaWE53WVdObElDa2dLU0FtSmdvSkNRa0pDU2dnSVhObGJHVmpkRzl5SUh4OElITmxiR1ZqZEc5eUlEMDlQU0JvWVc1a2JHVlBZbW91YzJWc1pXTjBiM0lnZkh3S0NRa0pDUWtKYzJWc1pXTjBiM0lnUFQwOUlDSXFLaUlnSmlZZ2FHRnVaR3hsVDJKcUxuTmxiR1ZqZEc5eUlDa2dLU0I3Q2drSkNRa0phR0Z1Wkd4bGNuTXVjM0JzYVdObEtDQnFMQ0F4SUNrN0Nnb0pDUWtKQ1dsbUlDZ2dhR0Z1Wkd4bFQySnFMbk5sYkdWamRHOXlJQ2tnZXdvSkNRa0pDUWxvWVc1a2JHVnljeTVrWld4bFoyRjBaVU52ZFc1MExTMDdDZ2tKQ1FrSmZRb0pDUWtKQ1dsbUlDZ2djM0JsWTJsaGJDNXlaVzF2ZG1VZ0tTQjdDZ2tKQ1FrSkNYTndaV05wWVd3dWNtVnRiM1psTG1OaGJHd29JR1ZzWlcwc0lHaGhibVJzWlU5aWFpQXBPd29KQ1FrSkNYMEtDUWtKQ1gwS0NRa0pmUW9LQ1FrSkx5OGdVbVZ0YjNabElHZGxibVZ5YVdNZ1pYWmxiblFnYUdGdVpHeGxjaUJwWmlCM1pTQnlaVzF2ZG1Wa0lITnZiV1YwYUdsdVp5QmhibVFnYm04Z2JXOXlaU0JvWVc1a2JHVnljeUJsZUdsemRBb0pDUWt2THlBb1lYWnZhV1J6SUhCdmRHVnVkR2xoYkNCbWIzSWdaVzVrYkdWemN5QnlaV04xY25OcGIyNGdaSFZ5YVc1bklISmxiVzkyWVd3Z2IyWWdjM0JsWTJsaGJDQmxkbVZ1ZENCb1lXNWtiR1Z5Y3lrS0NRa0phV1lnS0NCdmNtbG5RMjkxYm5RZ0ppWWdJV2hoYm1Sc1pYSnpMbXhsYm1kMGFDQXBJSHNLQ1FrSkNXbG1JQ2dnSVhOd1pXTnBZV3d1ZEdWaGNtUnZkMjRnZkh3S0NRa0pDUWx6Y0dWamFXRnNMblJsWVhKa2IzZHVMbU5oYkd3b0lHVnNaVzBzSUc1aGJXVnpjR0ZqWlhNc0lHVnNaVzFFWVhSaExtaGhibVJzWlNBcElEMDlQU0JtWVd4elpTQXBJSHNLQ2drSkNRa0phbEYxWlhKNUxuSmxiVzkyWlVWMlpXNTBLQ0JsYkdWdExDQjBlWEJsTENCbGJHVnRSR0YwWVM1b1lXNWtiR1VnS1RzS0NRa0pDWDBLQ2drSkNRbGtaV3hsZEdVZ1pYWmxiblJ6V3lCMGVYQmxJRjA3Q2drSkNYMEtDUWw5Q2dvSkNTOHZJRkpsYlc5MlpTQmtZWFJoSUdGdVpDQjBhR1VnWlhod1lXNWtieUJwWmlCcGRDZHpJRzV2SUd4dmJtZGxjaUIxYzJWa0Nna0phV1lnS0NCcVVYVmxjbmt1YVhORmJYQjBlVTlpYW1WamRDZ2daWFpsYm5SeklDa2dLU0I3Q2drSkNXUmhkR0ZRY21sMkxuSmxiVzkyWlNnZ1pXeGxiU3dnSW1oaGJtUnNaU0JsZG1WdWRITWlJQ2s3Q2drSmZRb0pmU3dLQ2dsa2FYTndZWFJqYURvZ1puVnVZM1JwYjI0b0lHNWhkR2wyWlVWMlpXNTBJQ2tnZXdvS0NRa3ZMeUJOWVd0bElHRWdkM0pwZEdGaWJHVWdhbEYxWlhKNUxrVjJaVzUwSUdaeWIyMGdkR2hsSUc1aGRHbDJaU0JsZG1WdWRDQnZZbXBsWTNRS0NRbDJZWElnWlhabGJuUWdQU0JxVVhWbGNua3VaWFpsYm5RdVptbDRLQ0J1WVhScGRtVkZkbVZ1ZENBcE93b0tDUWwyWVhJZ2FTd2dhaXdnY21WMExDQnRZWFJqYUdWa0xDQm9ZVzVrYkdWUFltb3NJR2hoYm1Sc1pYSlJkV1YxWlN3S0NRa0pZWEpuY3lBOUlHNWxkeUJCY25KaGVTZ2dZWEpuZFcxbGJuUnpMbXhsYm1kMGFDQXBMQW9KQ1Fsb1lXNWtiR1Z5Y3lBOUlDZ2daR0YwWVZCeWFYWXVaMlYwS0NCMGFHbHpMQ0FpWlhabGJuUnpJaUFwSUh4OElIdDlJQ2xiSUdWMlpXNTBMblI1Y0dVZ1hTQjhmQ0JiWFN3S0NRa0pjM0JsWTJsaGJDQTlJR3BSZFdWeWVTNWxkbVZ1ZEM1emNHVmphV0ZzV3lCbGRtVnVkQzUwZVhCbElGMGdmSHdnZTMwN0Nnb0pDUzh2SUZWelpTQjBhR1VnWm1sNExXVmtJR3BSZFdWeWVTNUZkbVZ1ZENCeVlYUm9aWElnZEdoaGJpQjBhR1VnS0hKbFlXUXRiMjVzZVNrZ2JtRjBhWFpsSUdWMlpXNTBDZ2tKWVhKbmMxc2dNQ0JkSUQwZ1pYWmxiblE3Q2dvSkNXWnZjaUFvSUdrZ1BTQXhPeUJwSUR3Z1lYSm5kVzFsYm5SekxteGxibWQwYURzZ2FTc3JJQ2tnZXdvSkNRbGhjbWR6V3lCcElGMGdQU0JoY21kMWJXVnVkSE5iSUdrZ1hUc0tDUWw5Q2dvSkNXVjJaVzUwTG1SbGJHVm5ZWFJsVkdGeVoyVjBJRDBnZEdocGN6c0tDZ2tKTHk4Z1EyRnNiQ0IwYUdVZ2NISmxSR2x6Y0dGMFkyZ2dhRzl2YXlCbWIzSWdkR2hsSUcxaGNIQmxaQ0IwZVhCbExDQmhibVFnYkdWMElHbDBJR0poYVd3Z2FXWWdaR1Z6YVhKbFpBb0pDV2xtSUNnZ2MzQmxZMmxoYkM1d2NtVkVhWE53WVhSamFDQW1KaUJ6Y0dWamFXRnNMbkJ5WlVScGMzQmhkR05vTG1OaGJHd29JSFJvYVhNc0lHVjJaVzUwSUNrZ1BUMDlJR1poYkhObElDa2dld29KQ1FseVpYUjFjbTQ3Q2drSmZRb0tDUWt2THlCRVpYUmxjbTFwYm1VZ2FHRnVaR3hsY25NS0NRbG9ZVzVrYkdWeVVYVmxkV1VnUFNCcVVYVmxjbmt1WlhabGJuUXVhR0Z1Wkd4bGNuTXVZMkZzYkNnZ2RHaHBjeXdnWlhabGJuUXNJR2hoYm1Sc1pYSnpJQ2s3Q2dvSkNTOHZJRkoxYmlCa1pXeGxaMkYwWlhNZ1ptbHljM1E3SUhSb1pYa2diV0Y1SUhkaGJuUWdkRzhnYzNSdmNDQndjbTl3WVdkaGRHbHZiaUJpWlc1bFlYUm9JSFZ6Q2drSmFTQTlJREE3Q2drSmQyaHBiR1VnS0NBb0lHMWhkR05vWldRZ1BTQm9ZVzVrYkdWeVVYVmxkV1ZiSUdrckt5QmRJQ2tnSmlZZ0lXVjJaVzUwTG1selVISnZjR0ZuWVhScGIyNVRkRzl3Y0dWa0tDa2dLU0I3Q2drSkNXVjJaVzUwTG1OMWNuSmxiblJVWVhKblpYUWdQU0J0WVhSamFHVmtMbVZzWlcwN0Nnb0pDUWxxSUQwZ01Ec0tDUWtKZDJocGJHVWdLQ0FvSUdoaGJtUnNaVTlpYWlBOUlHMWhkR05vWldRdWFHRnVaR3hsY25OYklHb3JLeUJkSUNrZ0ppWUtDUWtKQ1NGbGRtVnVkQzVwYzBsdGJXVmthV0YwWlZCeWIzQmhaMkYwYVc5dVUzUnZjSEJsWkNncElDa2dld29LQ1FrSkNTOHZJRlJ5YVdkblpYSmxaQ0JsZG1WdWRDQnRkWE4wSUdWcGRHaGxjaUF4S1NCb1lYWmxJRzV2SUc1aGJXVnpjR0ZqWlN3Z2IzSWdNaWtnYUdGMlpTQnVZVzFsYzNCaFkyVW9jeWtLQ1FrSkNTOHZJR0VnYzNWaWMyVjBJRzl5SUdWeGRXRnNJSFJ2SUhSb2IzTmxJR2x1SUhSb1pTQmliM1Z1WkNCbGRtVnVkQ0FvWW05MGFDQmpZVzRnYUdGMlpTQnVieUJ1WVcxbGMzQmhZMlVwTGdvSkNRa0phV1lnS0NBaFpYWmxiblF1Y201aGJXVnpjR0ZqWlNCOGZDQmxkbVZ1ZEM1eWJtRnRaWE53WVdObExuUmxjM1FvSUdoaGJtUnNaVTlpYWk1dVlXMWxjM0JoWTJVZ0tTQXBJSHNLQ2drSkNRa0paWFpsYm5RdWFHRnVaR3hsVDJKcUlEMGdhR0Z1Wkd4bFQySnFPd29KQ1FrSkNXVjJaVzUwTG1SaGRHRWdQU0JvWVc1a2JHVlBZbW91WkdGMFlUc0tDZ2tKQ1FrSmNtVjBJRDBnS0NBb0lHcFJkV1Z5ZVM1bGRtVnVkQzV6Y0dWamFXRnNXeUJvWVc1a2JHVlBZbW91YjNKcFoxUjVjR1VnWFNCOGZDQjdmU0FwTG1oaGJtUnNaU0I4ZkFvSkNRa0pDUWxvWVc1a2JHVlBZbW91YUdGdVpHeGxjaUFwTG1Gd2NHeDVLQ0J0WVhSamFHVmtMbVZzWlcwc0lHRnlaM01nS1RzS0Nna0pDUWtKYVdZZ0tDQnlaWFFnSVQwOUlIVnVaR1ZtYVc1bFpDQXBJSHNLQ1FrSkNRa0phV1lnS0NBb0lHVjJaVzUwTG5KbGMzVnNkQ0E5SUhKbGRDQXBJRDA5UFNCbVlXeHpaU0FwSUhzS0NRa0pDUWtKQ1dWMlpXNTBMbkJ5WlhabGJuUkVaV1poZFd4MEtDazdDZ2tKQ1FrSkNRbGxkbVZ1ZEM1emRHOXdVSEp2Y0dGbllYUnBiMjRvS1RzS0NRa0pDUWtKZlFvSkNRa0pDWDBLQ1FrSkNYMEtDUWtKZlFvSkNYMEtDZ2tKTHk4Z1EyRnNiQ0IwYUdVZ2NHOXpkRVJwYzNCaGRHTm9JR2h2YjJzZ1ptOXlJSFJvWlNCdFlYQndaV1FnZEhsd1pRb0pDV2xtSUNnZ2MzQmxZMmxoYkM1d2IzTjBSR2x6Y0dGMFkyZ2dLU0I3Q2drSkNYTndaV05wWVd3dWNHOXpkRVJwYzNCaGRHTm9MbU5oYkd3b0lIUm9hWE1zSUdWMlpXNTBJQ2s3Q2drSmZRb0tDUWx5WlhSMWNtNGdaWFpsYm5RdWNtVnpkV3gwT3dvSmZTd0tDZ2xvWVc1a2JHVnljem9nWm5WdVkzUnBiMjRvSUdWMlpXNTBMQ0JvWVc1a2JHVnljeUFwSUhzS0NRbDJZWElnYVN3Z2FHRnVaR3hsVDJKcUxDQnpaV3dzSUcxaGRHTm9aV1JJWVc1a2JHVnljeXdnYldGMFkyaGxaRk5sYkdWamRHOXljeXdLQ1FrSmFHRnVaR3hsY2xGMVpYVmxJRDBnVzEwc0Nna0pDV1JsYkdWbllYUmxRMjkxYm5RZ1BTQm9ZVzVrYkdWeWN5NWtaV3hsWjJGMFpVTnZkVzUwTEFvSkNRbGpkWElnUFNCbGRtVnVkQzUwWVhKblpYUTdDZ29KQ1M4dklFWnBibVFnWkdWc1pXZGhkR1VnYUdGdVpHeGxjbk1LQ1FscFppQW9JR1JsYkdWbllYUmxRMjkxYm5RZ0ppWUtDZ2tKQ1M4dklGTjFjSEJ2Y25RNklFbEZJRHc5T1FvSkNRa3ZMeUJDYkdGamF5MW9iMnhsSUZOV1J5QThkWE5sUGlCcGJuTjBZVzVqWlNCMGNtVmxjeUFvZEhKaFl5MHhNekU0TUNrS0NRa0pZM1Z5TG01dlpHVlVlWEJsSUNZbUNnb0pDUWt2THlCVGRYQndiM0owT2lCR2FYSmxabTk0SUR3OU5ESUtDUWtKTHk4Z1UzVndjSEpsYzNNZ2MzQmxZeTEyYVc5c1lYUnBibWNnWTJ4cFkydHpJR2x1WkdsallYUnBibWNnWVNCdWIyNHRjSEpwYldGeWVTQndiMmx1ZEdWeUlHSjFkSFJ2YmlBb2RISmhZeTB6T0RZeEtRb0pDUWt2THlCb2RIUndjem92TDNkM2R5NTNNeTV2Y21jdlZGSXZSRTlOTFV4bGRtVnNMVE10UlhabGJuUnpMeU5sZG1WdWRDMTBlWEJsTFdOc2FXTnJDZ2tKQ1M4dklGTjFjSEJ2Y25RNklFbEZJREV4SUc5dWJIa0tDUWtKTHk4Z0xpNHVZblYwSUc1dmRDQmhjbkp2ZHlCclpYa2dJbU5zYVdOcmN5SWdiMllnY21Ga2FXOGdhVzV3ZFhSekxDQjNhR2xqYUNCallXNGdhR0YyWlNCZ1luVjBkRzl1WUNBdE1TQW9aMmd0TWpNME15a0tDUWtKSVNnZ1pYWmxiblF1ZEhsd1pTQTlQVDBnSW1Oc2FXTnJJaUFtSmlCbGRtVnVkQzVpZFhSMGIyNGdQajBnTVNBcElDa2dld29LQ1FrSlptOXlJQ2dnT3lCamRYSWdJVDA5SUhSb2FYTTdJR04xY2lBOUlHTjFjaTV3WVhKbGJuUk9iMlJsSUh4OElIUm9hWE1nS1NCN0Nnb0pDUWtKTHk4Z1JHOXVKM1FnWTJobFkyc2dibTl1TFdWc1pXMWxiblJ6SUNnak1UTXlNRGdwQ2drSkNRa3ZMeUJFYjI0bmRDQndjbTlqWlhOeklHTnNhV05yY3lCdmJpQmthWE5oWW14bFpDQmxiR1Z0Wlc1MGN5QW9Jelk1TVRFc0lDTTRNVFkxTENBak1URXpPRElzSUNNeE1UYzJOQ2tLQ1FrSkNXbG1JQ2dnWTNWeUxtNXZaR1ZVZVhCbElEMDlQU0F4SUNZbUlDRW9JR1YyWlc1MExuUjVjR1VnUFQwOUlDSmpiR2xqYXlJZ0ppWWdZM1Z5TG1ScGMyRmliR1ZrSUQwOVBTQjBjblZsSUNrZ0tTQjdDZ2tKQ1FrSmJXRjBZMmhsWkVoaGJtUnNaWEp6SUQwZ1cxMDdDZ2tKQ1FrSmJXRjBZMmhsWkZObGJHVmpkRzl5Y3lBOUlIdDlPd29KQ1FrSkNXWnZjaUFvSUdrZ1BTQXdPeUJwSUR3Z1pHVnNaV2RoZEdWRGIzVnVkRHNnYVNzcklDa2dld29KQ1FrSkNRbG9ZVzVrYkdWUFltb2dQU0JvWVc1a2JHVnljMXNnYVNCZE93b0tDUWtKQ1FrSkx5OGdSRzl1SjNRZ1kyOXVabXhwWTNRZ2QybDBhQ0JQWW1wbFkzUXVjSEp2ZEc5MGVYQmxJSEJ5YjNCbGNuUnBaWE1nS0NNeE16SXdNeWtLQ1FrSkNRa0pjMlZzSUQwZ2FHRnVaR3hsVDJKcUxuTmxiR1ZqZEc5eUlDc2dJaUFpT3dvS0NRa0pDUWtKYVdZZ0tDQnRZWFJqYUdWa1UyVnNaV04wYjNKeld5QnpaV3dnWFNBOVBUMGdkVzVrWldacGJtVmtJQ2tnZXdvSkNRa0pDUWtKYldGMFkyaGxaRk5sYkdWamRHOXljMXNnYzJWc0lGMGdQU0JvWVc1a2JHVlBZbW91Ym1WbFpITkRiMjUwWlhoMElEOEtDUWtKQ1FrSkNRbHFVWFZsY25rb0lITmxiQ3dnZEdocGN5QXBMbWx1WkdWNEtDQmpkWElnS1NBK0lDMHhJRG9LQ1FrSkNRa0pDUWxxVVhWbGNua3VabWx1WkNnZ2MyVnNMQ0IwYUdsekxDQnVkV3hzTENCYklHTjFjaUJkSUNrdWJHVnVaM1JvT3dvSkNRa0pDUWw5Q2drSkNRa0pDV2xtSUNnZ2JXRjBZMmhsWkZObGJHVmpkRzl5YzFzZ2MyVnNJRjBnS1NCN0Nna0pDUWtKQ1FsdFlYUmphR1ZrU0dGdVpHeGxjbk11Y0hWemFDZ2dhR0Z1Wkd4bFQySnFJQ2s3Q2drSkNRa0pDWDBLQ1FrSkNRbDlDZ2tKQ1FrSmFXWWdLQ0J0WVhSamFHVmtTR0Z1Wkd4bGNuTXViR1Z1WjNSb0lDa2dld29KQ1FrSkNRbG9ZVzVrYkdWeVVYVmxkV1V1Y0hWemFDZ2dleUJsYkdWdE9pQmpkWElzSUdoaGJtUnNaWEp6T2lCdFlYUmphR1ZrU0dGdVpHeGxjbk1nZlNBcE93b0pDUWtKQ1gwS0NRa0pDWDBLQ1FrSmZRb0pDWDBLQ2drSkx5OGdRV1JrSUhSb1pTQnlaVzFoYVc1cGJtY2dLR1JwY21WamRHeDVMV0p2ZFc1a0tTQm9ZVzVrYkdWeWN3b0pDV04xY2lBOUlIUm9hWE03Q2drSmFXWWdLQ0JrWld4bFoyRjBaVU52ZFc1MElEd2dhR0Z1Wkd4bGNuTXViR1Z1WjNSb0lDa2dld29KQ1Fsb1lXNWtiR1Z5VVhWbGRXVXVjSFZ6YUNnZ2V5QmxiR1Z0T2lCamRYSXNJR2hoYm1Sc1pYSnpPaUJvWVc1a2JHVnljeTV6YkdsalpTZ2daR1ZzWldkaGRHVkRiM1Z1ZENBcElIMGdLVHNLQ1FsOUNnb0pDWEpsZEhWeWJpQm9ZVzVrYkdWeVVYVmxkV1U3Q2dsOUxBb0tDV0ZrWkZCeWIzQTZJR1oxYm1OMGFXOXVLQ0J1WVcxbExDQm9iMjlySUNrZ2V3b0pDVTlpYW1WamRDNWtaV1pwYm1WUWNtOXdaWEowZVNnZ2FsRjFaWEo1TGtWMlpXNTBMbkJ5YjNSdmRIbHdaU3dnYm1GdFpTd2dld29KQ1FsbGJuVnRaWEpoWW14bE9pQjBjblZsTEFvSkNRbGpiMjVtYVdkMWNtRmliR1U2SUhSeWRXVXNDZ29KQ1FsblpYUTZJR2x6Um5WdVkzUnBiMjRvSUdodmIyc2dLU0EvQ2drSkNRbG1kVzVqZEdsdmJpZ3BJSHNLQ1FrSkNRbHBaaUFvSUhSb2FYTXViM0pwWjJsdVlXeEZkbVZ1ZENBcElIc0tDUWtKQ1FrSkNYSmxkSFZ5YmlCb2IyOXJLQ0IwYUdsekxtOXlhV2RwYm1Gc1JYWmxiblFnS1RzS0NRa0pDUWw5Q2drSkNRbDlJRG9LQ1FrSkNXWjFibU4wYVc5dUtDa2dld29KQ1FrSkNXbG1JQ2dnZEdocGN5NXZjbWxuYVc1aGJFVjJaVzUwSUNrZ2V3b0pDUWtKQ1FrSmNtVjBkWEp1SUhSb2FYTXViM0pwWjJsdVlXeEZkbVZ1ZEZzZ2JtRnRaU0JkT3dvSkNRa0pDWDBLQ1FrSkNYMHNDZ29KQ1FselpYUTZJR1oxYm1OMGFXOXVLQ0IyWVd4MVpTQXBJSHNLQ1FrSkNVOWlhbVZqZEM1a1pXWnBibVZRY205d1pYSjBlU2dnZEdocGN5d2dibUZ0WlN3Z2V3b0pDUWtKQ1dWdWRXMWxjbUZpYkdVNklIUnlkV1VzQ2drSkNRa0pZMjl1Wm1sbmRYSmhZbXhsT2lCMGNuVmxMQW9KQ1FrSkNYZHlhWFJoWW14bE9pQjBjblZsTEFvSkNRa0pDWFpoYkhWbE9pQjJZV3gxWlFvSkNRa0pmU0FwT3dvSkNRbDlDZ2tKZlNBcE93b0pmU3dLQ2dsbWFYZzZJR1oxYm1OMGFXOXVLQ0J2Y21sbmFXNWhiRVYyWlc1MElDa2dld29KQ1hKbGRIVnliaUJ2Y21sbmFXNWhiRVYyWlc1MFd5QnFVWFZsY25rdVpYaHdZVzVrYnlCZElEOEtDUWtKYjNKcFoybHVZV3hGZG1WdWRDQTZDZ2tKQ1c1bGR5QnFVWFZsY25rdVJYWmxiblFvSUc5eWFXZHBibUZzUlhabGJuUWdLVHNLQ1gwc0Nnb0pjM0JsWTJsaGJEb2dld29KQ1d4dllXUTZJSHNLQ2drSkNTOHZJRkJ5WlhabGJuUWdkSEpwWjJkbGNtVmtJR2x0WVdkbExteHZZV1FnWlhabGJuUnpJR1p5YjIwZ1luVmlZbXhwYm1jZ2RHOGdkMmx1Wkc5M0xteHZZV1FLQ1FrSmJtOUNkV0ppYkdVNklIUnlkV1VLQ1FsOUxBb0pDV1p2WTNWek9pQjdDZ29KQ1Frdkx5QkdhWEpsSUc1aGRHbDJaU0JsZG1WdWRDQnBaaUJ3YjNOemFXSnNaU0J6YnlCaWJIVnlMMlp2WTNWeklITmxjWFZsYm1ObElHbHpJR052Y25KbFkzUUtDUWtKZEhKcFoyZGxjam9nWm5WdVkzUnBiMjRvS1NCN0Nna0pDUWxwWmlBb0lIUm9hWE1nSVQwOUlITmhabVZCWTNScGRtVkZiR1Z0Wlc1MEtDa2dKaVlnZEdocGN5NW1iMk4xY3lBcElIc0tDUWtKQ1FsMGFHbHpMbVp2WTNWektDazdDZ2tKQ1FrSmNtVjBkWEp1SUdaaGJITmxPd29KQ1FrSmZRb0pDUWw5TEFvSkNRbGtaV3hsWjJGMFpWUjVjR1U2SUNKbWIyTjFjMmx1SWdvSkNYMHNDZ2tKWW14MWNqb2dld29KQ1FsMGNtbG5aMlZ5T2lCbWRXNWpkR2x2YmlncElIc0tDUWtKQ1dsbUlDZ2dkR2hwY3lBOVBUMGdjMkZtWlVGamRHbDJaVVZzWlcxbGJuUW9LU0FtSmlCMGFHbHpMbUpzZFhJZ0tTQjdDZ2tKQ1FrSmRHaHBjeTVpYkhWeUtDazdDZ2tKQ1FrSmNtVjBkWEp1SUdaaGJITmxPd29KQ1FrSmZRb0pDUWw5TEFvSkNRbGtaV3hsWjJGMFpWUjVjR1U2SUNKbWIyTjFjMjkxZENJS0NRbDlMQW9KQ1dOc2FXTnJPaUI3Q2dvSkNRa3ZMeUJHYjNJZ1kyaGxZMnRpYjNnc0lHWnBjbVVnYm1GMGFYWmxJR1YyWlc1MElITnZJR05vWldOclpXUWdjM1JoZEdVZ2QybHNiQ0JpWlNCeWFXZG9kQW9KQ1FsMGNtbG5aMlZ5T2lCbWRXNWpkR2x2YmlncElIc0tDUWtKQ1dsbUlDZ2dkR2hwY3k1MGVYQmxJRDA5UFNBaVkyaGxZMnRpYjNnaUlDWW1JSFJvYVhNdVkyeHBZMnNnSmlZZ2JtOWtaVTVoYldVb0lIUm9hWE1zSUNKcGJuQjFkQ0lnS1NBcElIc0tDUWtKQ1FsMGFHbHpMbU5zYVdOcktDazdDZ2tKQ1FrSmNtVjBkWEp1SUdaaGJITmxPd29KQ1FrSmZRb0pDUWw5TEFvS0NRa0pMeThnUm05eUlHTnliM056TFdKeWIzZHpaWElnWTI5dWMybHpkR1Z1WTNrc0lHUnZiaWQwSUdacGNtVWdibUYwYVhabElDNWpiR2xqYXlncElHOXVJR3hwYm10ekNna0pDVjlrWldaaGRXeDBPaUJtZFc1amRHbHZiaWdnWlhabGJuUWdLU0I3Q2drSkNRbHlaWFIxY200Z2JtOWtaVTVoYldVb0lHVjJaVzUwTG5SaGNtZGxkQ3dnSW1FaUlDazdDZ2tKQ1gwS0NRbDlMQW9LQ1FsaVpXWnZjbVYxYm14dllXUTZJSHNLQ1FrSmNHOXpkRVJwYzNCaGRHTm9PaUJtZFc1amRHbHZiaWdnWlhabGJuUWdLU0I3Q2dvSkNRa0pMeThnVTNWd2NHOXlkRG9nUm1seVpXWnZlQ0F5TUNzS0NRa0pDUzh2SUVacGNtVm1iM2dnWkc5bGMyNG5kQ0JoYkdWeWRDQnBaaUIwYUdVZ2NtVjBkWEp1Vm1Gc2RXVWdabWxsYkdRZ2FYTWdibTkwSUhObGRDNEtDUWtKQ1dsbUlDZ2daWFpsYm5RdWNtVnpkV3gwSUNFOVBTQjFibVJsWm1sdVpXUWdKaVlnWlhabGJuUXViM0pwWjJsdVlXeEZkbVZ1ZENBcElIc0tDUWtKQ1FsbGRtVnVkQzV2Y21sbmFXNWhiRVYyWlc1MExuSmxkSFZ5YmxaaGJIVmxJRDBnWlhabGJuUXVjbVZ6ZFd4ME93b0pDUWtKZlFvSkNRbDlDZ2tKZlFvSmZRcDlPd29LYWxGMVpYSjVMbkpsYlc5MlpVVjJaVzUwSUQwZ1puVnVZM1JwYjI0b0lHVnNaVzBzSUhSNWNHVXNJR2hoYm1Sc1pTQXBJSHNLQ2drdkx5QlVhR2x6SUNKcFppSWdhWE1nYm1WbFpHVmtJR1p2Y2lCd2JHRnBiaUJ2WW1wbFkzUnpDZ2xwWmlBb0lHVnNaVzB1Y21WdGIzWmxSWFpsYm5STWFYTjBaVzVsY2lBcElIc0tDUWxsYkdWdExuSmxiVzkyWlVWMlpXNTBUR2x6ZEdWdVpYSW9JSFI1Y0dVc0lHaGhibVJzWlNBcE93b0pmUXA5T3dvS2FsRjFaWEo1TGtWMlpXNTBJRDBnWm5WdVkzUnBiMjRvSUhOeVl5d2djSEp2Y0hNZ0tTQjdDZ29KTHk4Z1FXeHNiM2NnYVc1emRHRnVkR2xoZEdsdmJpQjNhWFJvYjNWMElIUm9aU0FuYm1WM0p5QnJaWGwzYjNKa0NnbHBaaUFvSUNFb0lIUm9hWE1nYVc1emRHRnVZMlZ2WmlCcVVYVmxjbmt1UlhabGJuUWdLU0FwSUhzS0NRbHlaWFIxY200Z2JtVjNJR3BSZFdWeWVTNUZkbVZ1ZENnZ2MzSmpMQ0J3Y205d2N5QXBPd29KZlFvS0NTOHZJRVYyWlc1MElHOWlhbVZqZEFvSmFXWWdLQ0J6Y21NZ0ppWWdjM0pqTG5SNWNHVWdLU0I3Q2drSmRHaHBjeTV2Y21sbmFXNWhiRVYyWlc1MElEMGdjM0pqT3dvSkNYUm9hWE11ZEhsd1pTQTlJSE55WXk1MGVYQmxPd29LQ1Frdkx5QkZkbVZ1ZEhNZ1luVmlZbXhwYm1jZ2RYQWdkR2hsSUdSdlkzVnRaVzUwSUcxaGVTQm9ZWFpsSUdKbFpXNGdiV0Z5YTJWa0lHRnpJSEJ5WlhabGJuUmxaQW9KQ1M4dklHSjVJR0VnYUdGdVpHeGxjaUJzYjNkbGNpQmtiM2R1SUhSb1pTQjBjbVZsT3lCeVpXWnNaV04wSUhSb1pTQmpiM0p5WldOMElIWmhiSFZsTGdvSkNYUm9hWE11YVhORVpXWmhkV3gwVUhKbGRtVnVkR1ZrSUQwZ2MzSmpMbVJsWm1GMWJIUlFjbVYyWlc1MFpXUWdmSHdLQ1FrSkNYTnlZeTVrWldaaGRXeDBVSEpsZG1WdWRHVmtJRDA5UFNCMWJtUmxabWx1WldRZ0ppWUtDZ2tKQ1Frdkx5QlRkWEJ3YjNKME9pQkJibVJ5YjJsa0lEdzlNaTR6SUc5dWJIa0tDUWtKQ1hOeVl5NXlaWFIxY201V1lXeDFaU0E5UFQwZ1ptRnNjMlVnUHdvSkNRbHlaWFIxY201VWNuVmxJRG9LQ1FrSmNtVjBkWEp1Um1Gc2MyVTdDZ29KQ1M4dklFTnlaV0YwWlNCMFlYSm5aWFFnY0hKdmNHVnlkR2xsY3dvSkNTOHZJRk4xY0hCdmNuUTZJRk5oWm1GeWFTQThQVFlnTFNBM0lHOXViSGtLQ1Frdkx5QlVZWEpuWlhRZ2MyaHZkV3hrSUc1dmRDQmlaU0JoSUhSbGVIUWdibTlrWlNBb0l6VXdOQ3dnSXpFek1UUXpLUW9KQ1hSb2FYTXVkR0Z5WjJWMElEMGdLQ0J6Y21NdWRHRnlaMlYwSUNZbUlITnlZeTUwWVhKblpYUXVibTlrWlZSNWNHVWdQVDA5SURNZ0tTQS9DZ2tKQ1hOeVl5NTBZWEpuWlhRdWNHRnlaVzUwVG05a1pTQTZDZ2tKQ1hOeVl5NTBZWEpuWlhRN0Nnb0pDWFJvYVhNdVkzVnljbVZ1ZEZSaGNtZGxkQ0E5SUhOeVl5NWpkWEp5Wlc1MFZHRnlaMlYwT3dvSkNYUm9hWE11Y21Wc1lYUmxaRlJoY21kbGRDQTlJSE55WXk1eVpXeGhkR1ZrVkdGeVoyVjBPd29LQ1M4dklFVjJaVzUwSUhSNWNHVUtDWDBnWld4elpTQjdDZ2tKZEdocGN5NTBlWEJsSUQwZ2MzSmpPd29KZlFvS0NTOHZJRkIxZENCbGVIQnNhV05wZEd4NUlIQnliM1pwWkdWa0lIQnliM0JsY25ScFpYTWdiMjUwYnlCMGFHVWdaWFpsYm5RZ2IySnFaV04wQ2dscFppQW9JSEJ5YjNCeklDa2dld29KQ1dwUmRXVnllUzVsZUhSbGJtUW9JSFJvYVhNc0lIQnliM0J6SUNrN0NnbDlDZ29KTHk4Z1EzSmxZWFJsSUdFZ2RHbHRaWE4wWVcxd0lHbG1JR2x1WTI5dGFXNW5JR1YyWlc1MElHUnZaWE51SjNRZ2FHRjJaU0J2Ym1VS0NYUm9hWE11ZEdsdFpWTjBZVzF3SUQwZ2MzSmpJQ1ltSUhOeVl5NTBhVzFsVTNSaGJYQWdmSHdnUkdGMFpTNXViM2NvS1RzS0Nna3ZMeUJOWVhKcklHbDBJR0Z6SUdacGVHVmtDZ2wwYUdseld5QnFVWFZsY25rdVpYaHdZVzVrYnlCZElEMGdkSEoxWlRzS2ZUc0tDaTh2SUdwUmRXVnllUzVGZG1WdWRDQnBjeUJpWVhObFpDQnZiaUJFVDAweklFVjJaVzUwY3lCaGN5QnpjR1ZqYVdacFpXUWdZbmtnZEdobElFVkRUVUZUWTNKcGNIUWdUR0Z1WjNWaFoyVWdRbWx1WkdsdVp3b3ZMeUJvZEhSd2N6b3ZMM2QzZHk1M015NXZjbWN2VkZJdk1qQXdNeTlYUkMxRVQwMHRUR1YyWld3dE15MUZkbVZ1ZEhNdE1qQXdNekF6TXpFdlpXTnRZUzF6WTNKcGNIUXRZbWx1WkdsdVp5NW9kRzFzQ21wUmRXVnllUzVGZG1WdWRDNXdjbTkwYjNSNWNHVWdQU0I3Q2dsamIyNXpkSEoxWTNSdmNqb2dhbEYxWlhKNUxrVjJaVzUwTEFvSmFYTkVaV1poZFd4MFVISmxkbVZ1ZEdWa09pQnlaWFIxY201R1lXeHpaU3dLQ1dselVISnZjR0ZuWVhScGIyNVRkRzl3Y0dWa09pQnlaWFIxY201R1lXeHpaU3dLQ1dselNXMXRaV1JwWVhSbFVISnZjR0ZuWVhScGIyNVRkRzl3Y0dWa09pQnlaWFIxY201R1lXeHpaU3dLQ1dselUybHRkV3hoZEdWa09pQm1ZV3h6WlN3S0NnbHdjbVYyWlc1MFJHVm1ZWFZzZERvZ1puVnVZM1JwYjI0b0tTQjdDZ2tKZG1GeUlHVWdQU0IwYUdsekxtOXlhV2RwYm1Gc1JYWmxiblE3Q2dvSkNYUm9hWE11YVhORVpXWmhkV3gwVUhKbGRtVnVkR1ZrSUQwZ2NtVjBkWEp1VkhKMVpUc0tDZ2tKYVdZZ0tDQmxJQ1ltSUNGMGFHbHpMbWx6VTJsdGRXeGhkR1ZrSUNrZ2V3b0pDUWxsTG5CeVpYWmxiblJFWldaaGRXeDBLQ2s3Q2drSmZRb0pmU3dLQ1hOMGIzQlFjbTl3WVdkaGRHbHZiam9nWm5WdVkzUnBiMjRvS1NCN0Nna0pkbUZ5SUdVZ1BTQjBhR2x6TG05eWFXZHBibUZzUlhabGJuUTdDZ29KQ1hSb2FYTXVhWE5RY205d1lXZGhkR2x2YmxOMGIzQndaV1FnUFNCeVpYUjFjbTVVY25WbE93b0tDUWxwWmlBb0lHVWdKaVlnSVhSb2FYTXVhWE5UYVcxMWJHRjBaV1FnS1NCN0Nna0pDV1V1YzNSdmNGQnliM0JoWjJGMGFXOXVLQ2s3Q2drSmZRb0pmU3dLQ1hOMGIzQkpiVzFsWkdsaGRHVlFjbTl3WVdkaGRHbHZiam9nWm5WdVkzUnBiMjRvS1NCN0Nna0pkbUZ5SUdVZ1BTQjBhR2x6TG05eWFXZHBibUZzUlhabGJuUTdDZ29KQ1hSb2FYTXVhWE5KYlcxbFpHbGhkR1ZRY205d1lXZGhkR2x2YmxOMGIzQndaV1FnUFNCeVpYUjFjbTVVY25WbE93b0tDUWxwWmlBb0lHVWdKaVlnSVhSb2FYTXVhWE5UYVcxMWJHRjBaV1FnS1NCN0Nna0pDV1V1YzNSdmNFbHRiV1ZrYVdGMFpWQnliM0JoWjJGMGFXOXVLQ2s3Q2drSmZRb0tDUWwwYUdsekxuTjBiM0JRY205d1lXZGhkR2x2YmlncE93b0pmUXA5T3dvS0x5OGdTVzVqYkhWa1pYTWdZV3hzSUdOdmJXMXZiaUJsZG1WdWRDQndjbTl3Y3lCcGJtTnNkV1JwYm1jZ1MyVjVSWFpsYm5RZ1lXNWtJRTF2ZFhObFJYWmxiblFnYzNCbFkybG1hV01nY0hKdmNITUthbEYxWlhKNUxtVmhZMmdvSUhzS0NXRnNkRXRsZVRvZ2RISjFaU3dLQ1dKMVltSnNaWE02SUhSeWRXVXNDZ2xqWVc1alpXeGhZbXhsT2lCMGNuVmxMQW9KWTJoaGJtZGxaRlJ2ZFdOb1pYTTZJSFJ5ZFdVc0NnbGpkSEpzUzJWNU9pQjBjblZsTEFvSlpHVjBZV2xzT2lCMGNuVmxMQW9KWlhabGJuUlFhR0Z6WlRvZ2RISjFaU3dLQ1cxbGRHRkxaWGs2SUhSeWRXVXNDZ2x3WVdkbFdEb2dkSEoxWlN3S0NYQmhaMlZaT2lCMGNuVmxMQW9KYzJocFpuUkxaWGs2SUhSeWRXVXNDZ2wyYVdWM09pQjBjblZsTEFvSkltTm9ZWElpT2lCMGNuVmxMQW9KWTJoaGNrTnZaR1U2SUhSeWRXVXNDZ2xyWlhrNklIUnlkV1VzQ2dsclpYbERiMlJsT2lCMGNuVmxMQW9KWW5WMGRHOXVPaUIwY25WbExBb0pZblYwZEc5dWN6b2dkSEoxWlN3S0NXTnNhV1Z1ZEZnNklIUnlkV1VzQ2dsamJHbGxiblJaT2lCMGNuVmxMQW9KYjJabWMyVjBXRG9nZEhKMVpTd0tDVzltWm5ObGRGazZJSFJ5ZFdVc0NnbHdiMmx1ZEdWeVNXUTZJSFJ5ZFdVc0NnbHdiMmx1ZEdWeVZIbHdaVG9nZEhKMVpTd0tDWE5qY21WbGJsZzZJSFJ5ZFdVc0NnbHpZM0psWlc1Wk9pQjBjblZsTEFvSmRHRnlaMlYwVkc5MVkyaGxjem9nZEhKMVpTd0tDWFJ2Uld4bGJXVnVkRG9nZEhKMVpTd0tDWFJ2ZFdOb1pYTTZJSFJ5ZFdVc0Nnb0pkMmhwWTJnNklHWjFibU4wYVc5dUtDQmxkbVZ1ZENBcElIc0tDUWwyWVhJZ1luVjBkRzl1SUQwZ1pYWmxiblF1WW5WMGRHOXVPd29LQ1Frdkx5QkJaR1FnZDJocFkyZ2dabTl5SUd0bGVTQmxkbVZ1ZEhNS0NRbHBaaUFvSUdWMlpXNTBMbmRvYVdOb0lEMDlJRzUxYkd3Z0ppWWdjbXRsZVVWMlpXNTBMblJsYzNRb0lHVjJaVzUwTG5SNWNHVWdLU0FwSUhzS0NRa0pjbVYwZFhKdUlHVjJaVzUwTG1Ob1lYSkRiMlJsSUNFOUlHNTFiR3dnUHlCbGRtVnVkQzVqYUdGeVEyOWtaU0E2SUdWMlpXNTBMbXRsZVVOdlpHVTdDZ2tKZlFvS0NRa3ZMeUJCWkdRZ2QyaHBZMmdnWm05eUlHTnNhV05yT2lBeElEMDlQU0JzWldaME95QXlJRDA5UFNCdGFXUmtiR1U3SURNZ1BUMDlJSEpwWjJoMENna0phV1lnS0NBaFpYWmxiblF1ZDJocFkyZ2dKaVlnWW5WMGRHOXVJQ0U5UFNCMWJtUmxabWx1WldRZ0ppWWdjbTF2ZFhObFJYWmxiblF1ZEdWemRDZ2daWFpsYm5RdWRIbHdaU0FwSUNrZ2V3b0pDUWxwWmlBb0lHSjFkSFJ2YmlBbUlERWdLU0I3Q2drSkNRbHlaWFIxY200Z01Uc0tDUWtKZlFvS0NRa0phV1lnS0NCaWRYUjBiMjRnSmlBeUlDa2dld29KQ1FrSmNtVjBkWEp1SURNN0Nna0pDWDBLQ2drSkNXbG1JQ2dnWW5WMGRHOXVJQ1lnTkNBcElIc0tDUWtKQ1hKbGRIVnliaUF5T3dvSkNRbDlDZ29KQ1FseVpYUjFjbTRnTURzS0NRbDlDZ29KQ1hKbGRIVnliaUJsZG1WdWRDNTNhR2xqYURzS0NYMEtmU3dnYWxGMVpYSjVMbVYyWlc1MExtRmtaRkJ5YjNBZ0tUc0tDaTh2SUVOeVpXRjBaU0J0YjNWelpXVnVkR1Z5TDJ4bFlYWmxJR1YyWlc1MGN5QjFjMmx1WnlCdGIzVnpaVzkyWlhJdmIzVjBJR0Z1WkNCbGRtVnVkQzEwYVcxbElHTm9aV05yY3dvdkx5QnpieUIwYUdGMElHVjJaVzUwSUdSbGJHVm5ZWFJwYjI0Z2QyOXlhM01nYVc0Z2FsRjFaWEo1TGdvdkx5QkVieUIwYUdVZ2MyRnRaU0JtYjNJZ2NHOXBiblJsY21WdWRHVnlMM0J2YVc1MFpYSnNaV0YyWlNCaGJtUWdjRzlwYm5SbGNtOTJaWEl2Y0c5cGJuUmxjbTkxZEFvdkx3b3ZMeUJUZFhCd2IzSjBPaUJUWVdaaGNta2dOeUJ2Ym14NUNpOHZJRk5oWm1GeWFTQnpaVzVrY3lCdGIzVnpaV1Z1ZEdWeUlIUnZieUJ2Wm5SbGJqc2djMlZsT2dvdkx5Qm9kSFJ3Y3pvdkwySjFaM011WTJoeWIyMXBkVzB1YjNKbkwzQXZZMmh5YjIxcGRXMHZhWE56ZFdWekwyUmxkR0ZwYkQ5cFpEMDBOekF5TlRnS0x5OGdabTl5SUhSb1pTQmtaWE5qY21sd2RHbHZiaUJ2WmlCMGFHVWdZblZuSUNocGRDQmxlR2x6ZEdWa0lHbHVJRzlzWkdWeUlFTm9jbTl0WlNCMlpYSnphVzl1Y3lCaGN5QjNaV3hzS1M0S2FsRjFaWEo1TG1WaFkyZ29JSHNLQ1cxdmRYTmxaVzUwWlhJNklDSnRiM1Z6Wlc5MlpYSWlMQW9KYlc5MWMyVnNaV0YyWlRvZ0ltMXZkWE5sYjNWMElpd0tDWEJ2YVc1MFpYSmxiblJsY2pvZ0luQnZhVzUwWlhKdmRtVnlJaXdLQ1hCdmFXNTBaWEpzWldGMlpUb2dJbkJ2YVc1MFpYSnZkWFFpQ24wc0lHWjFibU4wYVc5dUtDQnZjbWxuTENCbWFYZ2dLU0I3Q2dscVVYVmxjbmt1WlhabGJuUXVjM0JsWTJsaGJGc2diM0pwWnlCZElEMGdld29KQ1dSbGJHVm5ZWFJsVkhsd1pUb2dabWw0TEFvSkNXSnBibVJVZVhCbE9pQm1hWGdzQ2dvSkNXaGhibVJzWlRvZ1puVnVZM1JwYjI0b0lHVjJaVzUwSUNrZ2V3b0pDUWwyWVhJZ2NtVjBMQW9KQ1FrSmRHRnlaMlYwSUQwZ2RHaHBjeXdLQ1FrSkNYSmxiR0YwWldRZ1BTQmxkbVZ1ZEM1eVpXeGhkR1ZrVkdGeVoyVjBMQW9KQ1FrSmFHRnVaR3hsVDJKcUlEMGdaWFpsYm5RdWFHRnVaR3hsVDJKcU93b0tDUWtKTHk4Z1JtOXlJRzF2ZFhObFpXNTBaWEl2YkdWaGRtVWdZMkZzYkNCMGFHVWdhR0Z1Wkd4bGNpQnBaaUJ5Wld4aGRHVmtJR2x6SUc5MWRITnBaR1VnZEdobElIUmhjbWRsZEM0S0NRa0pMeThnVGtJNklFNXZJSEpsYkdGMFpXUlVZWEpuWlhRZ2FXWWdkR2hsSUcxdmRYTmxJR3hsWm5RdlpXNTBaWEpsWkNCMGFHVWdZbkp2ZDNObGNpQjNhVzVrYjNjS0NRa0phV1lnS0NBaGNtVnNZWFJsWkNCOGZDQW9JSEpsYkdGMFpXUWdJVDA5SUhSaGNtZGxkQ0FtSmlBaGFsRjFaWEo1TG1OdmJuUmhhVzV6S0NCMFlYSm5aWFFzSUhKbGJHRjBaV1FnS1NBcElDa2dld29KQ1FrSlpYWmxiblF1ZEhsd1pTQTlJR2hoYm1Sc1pVOWlhaTV2Y21sblZIbHdaVHNLQ1FrSkNYSmxkQ0E5SUdoaGJtUnNaVTlpYWk1b1lXNWtiR1Z5TG1Gd2NHeDVLQ0IwYUdsekxDQmhjbWQxYldWdWRITWdLVHNLQ1FrSkNXVjJaVzUwTG5SNWNHVWdQU0JtYVhnN0Nna0pDWDBLQ1FrSmNtVjBkWEp1SUhKbGREc0tDUWw5Q2dsOU93cDlJQ2s3Q2dwcVVYVmxjbmt1Wm00dVpYaDBaVzVrS0NCN0Nnb0piMjQ2SUdaMWJtTjBhVzl1S0NCMGVYQmxjeXdnYzJWc1pXTjBiM0lzSUdSaGRHRXNJR1p1SUNrZ2V3b0pDWEpsZEhWeWJpQnZiaWdnZEdocGN5d2dkSGx3WlhNc0lITmxiR1ZqZEc5eUxDQmtZWFJoTENCbWJpQXBPd29KZlN3S0NXOXVaVG9nWm5WdVkzUnBiMjRvSUhSNWNHVnpMQ0J6Wld4bFkzUnZjaXdnWkdGMFlTd2dabTRnS1NCN0Nna0pjbVYwZFhKdUlHOXVLQ0IwYUdsekxDQjBlWEJsY3l3Z2MyVnNaV04wYjNJc0lHUmhkR0VzSUdadUxDQXhJQ2s3Q2dsOUxBb0piMlptT2lCbWRXNWpkR2x2YmlnZ2RIbHdaWE1zSUhObGJHVmpkRzl5TENCbWJpQXBJSHNLQ1FsMllYSWdhR0Z1Wkd4bFQySnFMQ0IwZVhCbE93b0pDV2xtSUNnZ2RIbHdaWE1nSmlZZ2RIbHdaWE11Y0hKbGRtVnVkRVJsWm1GMWJIUWdKaVlnZEhsd1pYTXVhR0Z1Wkd4bFQySnFJQ2tnZXdvS0NRa0pMeThnS0NCbGRtVnVkQ0FwSUNCa2FYTndZWFJqYUdWa0lHcFJkV1Z5ZVM1RmRtVnVkQW9KQ1Fsb1lXNWtiR1ZQWW1vZ1BTQjBlWEJsY3k1b1lXNWtiR1ZQWW1vN0Nna0pDV3BSZFdWeWVTZ2dkSGx3WlhNdVpHVnNaV2RoZEdWVVlYSm5aWFFnS1M1dlptWW9DZ2tKQ1Fsb1lXNWtiR1ZQWW1vdWJtRnRaWE53WVdObElEOEtDUWtKQ1Fsb1lXNWtiR1ZQWW1vdWIzSnBaMVI1Y0dVZ0t5QWlMaUlnS3lCb1lXNWtiR1ZQWW1vdWJtRnRaWE53WVdObElEb0tDUWtKQ1Fsb1lXNWtiR1ZQWW1vdWIzSnBaMVI1Y0dVc0Nna0pDUWxvWVc1a2JHVlBZbW91YzJWc1pXTjBiM0lzQ2drSkNRbG9ZVzVrYkdWUFltb3VhR0Z1Wkd4bGNnb0pDUWtwT3dvSkNRbHlaWFIxY200Z2RHaHBjenNLQ1FsOUNna0phV1lnS0NCMGVYQmxiMllnZEhsd1pYTWdQVDA5SUNKdlltcGxZM1FpSUNrZ2V3b0tDUWtKTHk4Z0tDQjBlWEJsY3kxdlltcGxZM1FnV3l3Z2MyVnNaV04wYjNKZElDa0tDUWtKWm05eUlDZ2dkSGx3WlNCcGJpQjBlWEJsY3lBcElIc0tDUWtKQ1hSb2FYTXViMlptS0NCMGVYQmxMQ0J6Wld4bFkzUnZjaXdnZEhsd1pYTmJJSFI1Y0dVZ1hTQXBPd29KQ1FsOUNna0pDWEpsZEhWeWJpQjBhR2x6T3dvSkNYMEtDUWxwWmlBb0lITmxiR1ZqZEc5eUlEMDlQU0JtWVd4elpTQjhmQ0IwZVhCbGIyWWdjMlZzWldOMGIzSWdQVDA5SUNKbWRXNWpkR2x2YmlJZ0tTQjdDZ29KQ1Frdkx5QW9JSFI1Y0dWeklGc3NJR1p1WFNBcENna0pDV1p1SUQwZ2MyVnNaV04wYjNJN0Nna0pDWE5sYkdWamRHOXlJRDBnZFc1a1pXWnBibVZrT3dvSkNYMEtDUWxwWmlBb0lHWnVJRDA5UFNCbVlXeHpaU0FwSUhzS0NRa0pabTRnUFNCeVpYUjFjbTVHWVd4elpUc0tDUWw5Q2drSmNtVjBkWEp1SUhSb2FYTXVaV0ZqYUNnZ1puVnVZM1JwYjI0b0tTQjdDZ2tKQ1dwUmRXVnllUzVsZG1WdWRDNXlaVzF2ZG1Vb0lIUm9hWE1zSUhSNWNHVnpMQ0JtYml3Z2MyVnNaV04wYjNJZ0tUc0tDUWw5SUNrN0NnbDlDbjBnS1RzS0NncDJZWElLQ2drdktpQmxjMnhwYm5RdFpHbHpZV0pzWlNCdFlYZ3RiR1Z1SUNvdkNnb0pMeThnVTJWbElHaDBkSEJ6T2k4dloybDBhSFZpTG1OdmJTOWxjMnhwYm5RdlpYTnNhVzUwTDJsemMzVmxjeTh6TWpJNUNnbHllR2gwYld4VVlXY2dQU0F2UENnL0lXRnlaV0Y4WW5KOFkyOXNmR1Z0WW1Wa2ZHaHlmR2x0WjN4cGJuQjFkSHhzYVc1cmZHMWxkR0Y4Y0dGeVlXMHBLQ2hiWVMxNlhWdGVYQzljTUQ1Y2VESXdYSFJjY2x4dVhHWmRLaWxiWGo1ZEtpbGNMejR2WjJrc0Nnb0pMeW9nWlhOc2FXNTBMV1Z1WVdKc1pTQXFMd29LQ1M4dklGTjFjSEJ2Y25RNklFbEZJRHc5TVRBZ0xTQXhNU3dnUldSblpTQXhNaUF0SURFeklHOXViSGtLQ1M4dklFbHVJRWxGTDBWa1oyVWdkWE5wYm1jZ2NtVm5aWGdnWjNKdmRYQnpJR2hsY21VZ1kyRjFjMlZ6SUhObGRtVnlaU0J6Ykc5M1pHOTNibk11Q2drdkx5QlRaV1VnYUhSMGNITTZMeTlqYjI1dVpXTjBMbTFwWTNKdmMyOW1kQzVqYjIwdlNVVXZabVZsWkdKaFkyc3ZaR1YwWVdsc2N5OHhOek0yTlRFeUx3b0pjbTV2U1c1dVpYSm9kRzFzSUQwZ0x6eHpZM0pwY0hSOFBITjBlV3hsZkR4c2FXNXJMMmtzQ2dvSkx5OGdZMmhsWTJ0bFpEMGlZMmhsWTJ0bFpDSWdiM0lnWTJobFkydGxaQW9KY21Ob1pXTnJaV1FnUFNBdlkyaGxZMnRsWkZ4ektpZy9PbHRlUFYxOFBWeHpLaTVqYUdWamEyVmtMaWt2YVN3S0NYSmpiR1ZoYmxOamNtbHdkQ0E5SUM5ZVhITXFQQ0VvUHpwY1cwTkVRVlJCWEZ0OExTMHBmQ2cvT2x4ZFhGMThMUzBwUGx4ektpUXZaenNLQ2k4dklGQnlaV1psY2lCaElIUmliMlI1SUc5MlpYSWdhWFJ6SUhCaGNtVnVkQ0IwWVdKc1pTQm1iM0lnWTI5dWRHRnBibWx1WnlCdVpYY2djbTkzY3dwbWRXNWpkR2x2YmlCdFlXNXBjSFZzWVhScGIyNVVZWEpuWlhRb0lHVnNaVzBzSUdOdmJuUmxiblFnS1NCN0NnbHBaaUFvSUc1dlpHVk9ZVzFsS0NCbGJHVnRMQ0FpZEdGaWJHVWlJQ2tnSmlZS0NRbHViMlJsVG1GdFpTZ2dZMjl1ZEdWdWRDNXViMlJsVkhsd1pTQWhQVDBnTVRFZ1B5QmpiMjUwWlc1MElEb2dZMjl1ZEdWdWRDNW1hWEp6ZEVOb2FXeGtMQ0FpZEhJaUlDa2dLU0I3Q2dvSkNYSmxkSFZ5YmlCcVVYVmxjbmtvSUdWc1pXMGdLUzVqYUdsc1pISmxiaWdnSW5SaWIyUjVJaUFwV3lBd0lGMGdmSHdnWld4bGJUc0tDWDBLQ2dseVpYUjFjbTRnWld4bGJUc0tmUW9LTHk4Z1VtVndiR0ZqWlM5eVpYTjBiM0psSUhSb1pTQjBlWEJsSUdGMGRISnBZblYwWlNCdlppQnpZM0pwY0hRZ1pXeGxiV1Z1ZEhNZ1ptOXlJSE5oWm1VZ1JFOU5JRzFoYm1sd2RXeGhkR2x2YmdwbWRXNWpkR2x2YmlCa2FYTmhZbXhsVTJOeWFYQjBLQ0JsYkdWdElDa2dld29KWld4bGJTNTBlWEJsSUQwZ0tDQmxiR1Z0TG1kbGRFRjBkSEpwWW5WMFpTZ2dJblI1Y0dVaUlDa2dJVDA5SUc1MWJHd2dLU0FySUNJdklpQXJJR1ZzWlcwdWRIbHdaVHNLQ1hKbGRIVnliaUJsYkdWdE93cDlDbVoxYm1OMGFXOXVJSEpsYzNSdmNtVlRZM0pwY0hRb0lHVnNaVzBnS1NCN0NnbHBaaUFvSUNnZ1pXeGxiUzUwZVhCbElIeDhJQ0lpSUNrdWMyeHBZMlVvSURBc0lEVWdLU0E5UFQwZ0luUnlkV1V2SWlBcElIc0tDUWxsYkdWdExuUjVjR1VnUFNCbGJHVnRMblI1Y0dVdWMyeHBZMlVvSURVZ0tUc0tDWDBnWld4elpTQjdDZ2tKWld4bGJTNXlaVzF2ZG1WQmRIUnlhV0oxZEdVb0lDSjBlWEJsSWlBcE93b0pmUW9LQ1hKbGRIVnliaUJsYkdWdE93cDlDZ3BtZFc1amRHbHZiaUJqYkc5dVpVTnZjSGxGZG1WdWRDZ2djM0pqTENCa1pYTjBJQ2tnZXdvSmRtRnlJR2tzSUd3c0lIUjVjR1VzSUhCa1lYUmhUMnhrTENCd1pHRjBZVU4xY2l3Z2RXUmhkR0ZQYkdRc0lIVmtZWFJoUTNWeUxDQmxkbVZ1ZEhNN0Nnb0phV1lnS0NCa1pYTjBMbTV2WkdWVWVYQmxJQ0U5UFNBeElDa2dld29KQ1hKbGRIVnlianNLQ1gwS0Nna3ZMeUF4TGlCRGIzQjVJSEJ5YVhaaGRHVWdaR0YwWVRvZ1pYWmxiblJ6TENCb1lXNWtiR1Z5Y3l3Z1pYUmpMZ29KYVdZZ0tDQmtZWFJoVUhKcGRpNW9ZWE5FWVhSaEtDQnpjbU1nS1NBcElIc0tDUWx3WkdGMFlVOXNaQ0E5SUdSaGRHRlFjbWwyTG1GalkyVnpjeWdnYzNKaklDazdDZ2tKY0dSaGRHRkRkWElnUFNCa1lYUmhVSEpwZGk1elpYUW9JR1JsYzNRc0lIQmtZWFJoVDJ4a0lDazdDZ2tKWlhabGJuUnpJRDBnY0dSaGRHRlBiR1F1WlhabGJuUnpPd29LQ1FscFppQW9JR1YyWlc1MGN5QXBJSHNLQ1FrSlpHVnNaWFJsSUhCa1lYUmhRM1Z5TG1oaGJtUnNaVHNLQ1FrSmNHUmhkR0ZEZFhJdVpYWmxiblJ6SUQwZ2UzMDdDZ29KQ1FsbWIzSWdLQ0IwZVhCbElHbHVJR1YyWlc1MGN5QXBJSHNLQ1FrSkNXWnZjaUFvSUdrZ1BTQXdMQ0JzSUQwZ1pYWmxiblJ6V3lCMGVYQmxJRjB1YkdWdVozUm9PeUJwSUR3Z2JEc2dhU3NySUNrZ2V3b0pDUWtKQ1dwUmRXVnllUzVsZG1WdWRDNWhaR1FvSUdSbGMzUXNJSFI1Y0dVc0lHVjJaVzUwYzFzZ2RIbHdaU0JkV3lCcElGMGdLVHNLQ1FrSkNYMEtDUWtKZlFvSkNYMEtDWDBLQ2drdkx5QXlMaUJEYjNCNUlIVnpaWElnWkdGMFlRb0phV1lnS0NCa1lYUmhWWE5sY2k1b1lYTkVZWFJoS0NCemNtTWdLU0FwSUhzS0NRbDFaR0YwWVU5c1pDQTlJR1JoZEdGVmMyVnlMbUZqWTJWemN5Z2djM0pqSUNrN0Nna0pkV1JoZEdGRGRYSWdQU0JxVVhWbGNua3VaWGgwWlc1a0tDQjdmU3dnZFdSaGRHRlBiR1FnS1RzS0Nna0paR0YwWVZWelpYSXVjMlYwS0NCa1pYTjBMQ0IxWkdGMFlVTjFjaUFwT3dvSmZRcDlDZ292THlCR2FYZ2dTVVVnWW5WbmN5d2djMlZsSUhOMWNIQnZjblFnZEdWemRITUtablZ1WTNScGIyNGdabWw0U1c1d2RYUW9JSE55WXl3Z1pHVnpkQ0FwSUhzS0NYWmhjaUJ1YjJSbFRtRnRaU0E5SUdSbGMzUXVibTlrWlU1aGJXVXVkRzlNYjNkbGNrTmhjMlVvS1RzS0Nna3ZMeUJHWVdsc2N5QjBieUJ3WlhKemFYTjBJSFJvWlNCamFHVmphMlZrSUhOMFlYUmxJRzltSUdFZ1kyeHZibVZrSUdOb1pXTnJZbTk0SUc5eUlISmhaR2x2SUdKMWRIUnZiaTRLQ1dsbUlDZ2dibTlrWlU1aGJXVWdQVDA5SUNKcGJuQjFkQ0lnSmlZZ2NtTm9aV05yWVdKc1pWUjVjR1V1ZEdWemRDZ2djM0pqTG5SNWNHVWdLU0FwSUhzS0NRbGtaWE4wTG1Ob1pXTnJaV1FnUFNCemNtTXVZMmhsWTJ0bFpEc0tDZ2t2THlCR1lXbHNjeUIwYnlCeVpYUjFjbTRnZEdobElITmxiR1ZqZEdWa0lHOXdkR2x2YmlCMGJ5QjBhR1VnWkdWbVlYVnNkQ0J6Wld4bFkzUmxaQ0J6ZEdGMFpTQjNhR1Z1SUdOc2IyNXBibWNnYjNCMGFXOXVjd29KZlNCbGJITmxJR2xtSUNnZ2JtOWtaVTVoYldVZ1BUMDlJQ0pwYm5CMWRDSWdmSHdnYm05a1pVNWhiV1VnUFQwOUlDSjBaWGgwWVhKbFlTSWdLU0I3Q2drSlpHVnpkQzVrWldaaGRXeDBWbUZzZFdVZ1BTQnpjbU11WkdWbVlYVnNkRlpoYkhWbE93b0pmUXA5Q2dwbWRXNWpkR2x2YmlCa2IyMU5ZVzVwY0NnZ1kyOXNiR1ZqZEdsdmJpd2dZWEpuY3l3Z1kyRnNiR0poWTJzc0lHbG5ibTl5WldRZ0tTQjdDZ29KTHk4Z1JteGhkSFJsYmlCaGJua2dibVZ6ZEdWa0lHRnljbUY1Y3dvSllYSm5jeUE5SUdOdmJtTmhkQzVoY0hCc2VTZ2dXMTBzSUdGeVozTWdLVHNLQ2dsMllYSWdabkpoWjIxbGJuUXNJR1pwY25OMExDQnpZM0pwY0hSekxDQm9ZWE5UWTNKcGNIUnpMQ0J1YjJSbExDQmtiMk1zQ2drSmFTQTlJREFzQ2drSmJDQTlJR052Ykd4bFkzUnBiMjR1YkdWdVozUm9MQW9KQ1dsT2IwTnNiMjVsSUQwZ2JDQXRJREVzQ2drSmRtRnNkV1VnUFNCaGNtZHpXeUF3SUYwc0Nna0pkbUZzZFdWSmMwWjFibU4wYVc5dUlEMGdhWE5HZFc1amRHbHZiaWdnZG1Gc2RXVWdLVHNLQ2drdkx5QlhaU0JqWVc0bmRDQmpiRzl1WlU1dlpHVWdabkpoWjIxbGJuUnpJSFJvWVhRZ1kyOXVkR0ZwYmlCamFHVmphMlZrTENCcGJpQlhaV0pMYVhRS0NXbG1JQ2dnZG1Gc2RXVkpjMFoxYm1OMGFXOXVJSHg4Q2drSkNTZ2diQ0ErSURFZ0ppWWdkSGx3Wlc5bUlIWmhiSFZsSUQwOVBTQWljM1J5YVc1bklpQW1KZ29KQ1FrSklYTjFjSEJ2Y25RdVkyaGxZMnREYkc5dVpTQW1KaUJ5WTJobFkydGxaQzUwWlhOMEtDQjJZV3gxWlNBcElDa2dLU0I3Q2drSmNtVjBkWEp1SUdOdmJHeGxZM1JwYjI0dVpXRmphQ2dnWm5WdVkzUnBiMjRvSUdsdVpHVjRJQ2tnZXdvSkNRbDJZWElnYzJWc1ppQTlJR052Ykd4bFkzUnBiMjR1WlhFb0lHbHVaR1Y0SUNrN0Nna0pDV2xtSUNnZ2RtRnNkV1ZKYzBaMWJtTjBhVzl1SUNrZ2V3b0pDUWtKWVhKbmMxc2dNQ0JkSUQwZ2RtRnNkV1V1WTJGc2JDZ2dkR2hwY3l3Z2FXNWtaWGdzSUhObGJHWXVhSFJ0YkNncElDazdDZ2tKQ1gwS0NRa0paRzl0VFdGdWFYQW9JSE5sYkdZc0lHRnlaM01zSUdOaGJHeGlZV05yTENCcFoyNXZjbVZrSUNrN0Nna0pmU0FwT3dvSmZRb0tDV2xtSUNnZ2JDQXBJSHNLQ1FsbWNtRm5iV1Z1ZENBOUlHSjFhV3hrUm5KaFoyMWxiblFvSUdGeVozTXNJR052Ykd4bFkzUnBiMjViSURBZ1hTNXZkMjVsY2tSdlkzVnRaVzUwTENCbVlXeHpaU3dnWTI5c2JHVmpkR2x2Yml3Z2FXZHViM0psWkNBcE93b0pDV1pwY25OMElEMGdabkpoWjIxbGJuUXVabWx5YzNSRGFHbHNaRHNLQ2drSmFXWWdLQ0JtY21GbmJXVnVkQzVqYUdsc1pFNXZaR1Z6TG14bGJtZDBhQ0E5UFQwZ01TQXBJSHNLQ1FrSlpuSmhaMjFsYm5RZ1BTQm1hWEp6ZERzS0NRbDlDZ29KQ1M4dklGSmxjWFZwY21VZ1pXbDBhR1Z5SUc1bGR5QmpiMjUwWlc1MElHOXlJR0Z1SUdsdWRHVnlaWE4wSUdsdUlHbG5ibTl5WldRZ1pXeGxiV1Z1ZEhNZ2RHOGdhVzUyYjJ0bElIUm9aU0JqWVd4c1ltRmphd29KQ1dsbUlDZ2dabWx5YzNRZ2ZId2dhV2R1YjNKbFpDQXBJSHNLQ1FrSmMyTnlhWEIwY3lBOUlHcFJkV1Z5ZVM1dFlYQW9JR2RsZEVGc2JDZ2dabkpoWjIxbGJuUXNJQ0p6WTNKcGNIUWlJQ2tzSUdScGMyRmliR1ZUWTNKcGNIUWdLVHNLQ1FrSmFHRnpVMk55YVhCMGN5QTlJSE5qY21sd2RITXViR1Z1WjNSb093b0tDUWtKTHk4Z1ZYTmxJSFJvWlNCdmNtbG5hVzVoYkNCbWNtRm5iV1Z1ZENCbWIzSWdkR2hsSUd4aGMzUWdhWFJsYlFvSkNRa3ZMeUJwYm5OMFpXRmtJRzltSUhSb1pTQm1hWEp6ZENCaVpXTmhkWE5sSUdsMElHTmhiaUJsYm1RZ2RYQUtDUWtKTHk4Z1ltVnBibWNnWlcxd2RHbGxaQ0JwYm1OdmNuSmxZM1JzZVNCcGJpQmpaWEowWVdsdUlITnBkSFZoZEdsdmJuTWdLQ000TURjd0tTNEtDUWtKWm05eUlDZ2dPeUJwSUR3Z2JEc2dhU3NySUNrZ2V3b0pDUWtKYm05a1pTQTlJR1p5WVdkdFpXNTBPd29LQ1FrSkNXbG1JQ2dnYVNBaFBUMGdhVTV2UTJ4dmJtVWdLU0I3Q2drSkNRa0pibTlrWlNBOUlHcFJkV1Z5ZVM1amJHOXVaU2dnYm05a1pTd2dkSEoxWlN3Z2RISjFaU0FwT3dvS0NRa0pDUWt2THlCTFpXVndJSEpsWm1WeVpXNWpaWE1nZEc4Z1kyeHZibVZrSUhOamNtbHdkSE1nWm05eUlHeGhkR1Z5SUhKbGMzUnZjbUYwYVc5dUNna0pDUWtKYVdZZ0tDQm9ZWE5UWTNKcGNIUnpJQ2tnZXdvS0NRa0pDUWtKTHk4Z1UzVndjRzl5ZERvZ1FXNWtjbTlwWkNBOFBUUXVNQ0J2Ym14NUxDQlFhR0Z1ZEc5dFNsTWdNU0J2Ym14NUNna0pDUWtKQ1M4dklIQjFjMmd1WVhCd2JIa29YeXdnWVhKeVlYbHNhV3RsS1NCMGFISnZkM01nYjI0Z1lXNWphV1Z1ZENCWFpXSkxhWFFLQ1FrSkNRa0phbEYxWlhKNUxtMWxjbWRsS0NCelkzSnBjSFJ6TENCblpYUkJiR3dvSUc1dlpHVXNJQ0p6WTNKcGNIUWlJQ2tnS1RzS0NRa0pDUWw5Q2drSkNRbDlDZ29KQ1FrSlkyRnNiR0poWTJzdVkyRnNiQ2dnWTI5c2JHVmpkR2x2YmxzZ2FTQmRMQ0J1YjJSbExDQnBJQ2s3Q2drSkNYMEtDZ2tKQ1dsbUlDZ2dhR0Z6VTJOeWFYQjBjeUFwSUhzS0NRa0pDV1J2WXlBOUlITmpjbWx3ZEhOYklITmpjbWx3ZEhNdWJHVnVaM1JvSUMwZ01TQmRMbTkzYm1WeVJHOWpkVzFsYm5RN0Nnb0pDUWtKTHk4Z1VtVmxibUZpYkdVZ2MyTnlhWEIwY3dvSkNRa0phbEYxWlhKNUxtMWhjQ2dnYzJOeWFYQjBjeXdnY21WemRHOXlaVk5qY21sd2RDQXBPd29LQ1FrSkNTOHZJRVYyWVd4MVlYUmxJR1Y0WldOMWRHRmliR1VnYzJOeWFYQjBjeUJ2YmlCbWFYSnpkQ0JrYjJOMWJXVnVkQ0JwYm5ObGNuUnBiMjRLQ1FrSkNXWnZjaUFvSUdrZ1BTQXdPeUJwSUR3Z2FHRnpVMk55YVhCMGN6c2dhU3NySUNrZ2V3b0pDUWtKQ1c1dlpHVWdQU0J6WTNKcGNIUnpXeUJwSUYwN0Nna0pDUWtKYVdZZ0tDQnljMk55YVhCMFZIbHdaUzUwWlhOMEtDQnViMlJsTG5SNWNHVWdmSHdnSWlJZ0tTQW1KZ29KQ1FrSkNRa2haR0YwWVZCeWFYWXVZV05qWlhOektDQnViMlJsTENBaVoyeHZZbUZzUlhaaGJDSWdLU0FtSmdvSkNRa0pDUWxxVVhWbGNua3VZMjl1ZEdGcGJuTW9JR1J2WXl3Z2JtOWtaU0FwSUNrZ2V3b0tDUWtKQ1FrSmFXWWdLQ0J1YjJSbExuTnlZeUFtSmlBb0lHNXZaR1V1ZEhsd1pTQjhmQ0FpSWlBcExuUnZURzkzWlhKRFlYTmxLQ2tnSUNFOVBTQWliVzlrZFd4bElpQXBJSHNLQ2drSkNRa0pDUWt2THlCUGNIUnBiMjVoYkNCQlNrRllJR1JsY0dWdVpHVnVZM2tzSUdKMWRDQjNiMjRuZENCeWRXNGdjMk55YVhCMGN5QnBaaUJ1YjNRZ2NISmxjMlZ1ZEFvSkNRa0pDUWtKYVdZZ0tDQnFVWFZsY25rdVgyVjJZV3hWY213Z0tTQjdDZ2tKQ1FrSkNRa0phbEYxWlhKNUxsOWxkbUZzVlhKc0tDQnViMlJsTG5OeVl5QXBPd29KQ1FrSkNRa0pmUW9KQ1FrSkNRbDlJR1ZzYzJVZ2V3b0pDUWtKQ1FrSlJFOU5SWFpoYkNnZ2JtOWtaUzUwWlhoMFEyOXVkR1Z1ZEM1eVpYQnNZV05sS0NCeVkyeGxZVzVUWTNKcGNIUXNJQ0lpSUNrc0lHUnZZeXdnYm05a1pTQXBPd29KQ1FrSkNRbDlDZ2tKQ1FrSmZRb0pDUWtKZlFvSkNRbDlDZ2tKZlFvSmZRb0tDWEpsZEhWeWJpQmpiMnhzWldOMGFXOXVPd3A5Q2dwbWRXNWpkR2x2YmlCeVpXMXZkbVVvSUdWc1pXMHNJSE5sYkdWamRHOXlMQ0JyWldWd1JHRjBZU0FwSUhzS0NYWmhjaUJ1YjJSbExBb0pDVzV2WkdWeklEMGdjMlZzWldOMGIzSWdQeUJxVVhWbGNua3VabWxzZEdWeUtDQnpaV3hsWTNSdmNpd2daV3hsYlNBcElEb2daV3hsYlN3S0NRbHBJRDBnTURzS0NnbG1iM0lnS0NBN0lDZ2dibTlrWlNBOUlHNXZaR1Z6V3lCcElGMGdLU0FoUFNCdWRXeHNPeUJwS3lzZ0tTQjdDZ2tKYVdZZ0tDQWhhMlZsY0VSaGRHRWdKaVlnYm05a1pTNXViMlJsVkhsd1pTQTlQVDBnTVNBcElIc0tDUWtKYWxGMVpYSjVMbU5zWldGdVJHRjBZU2dnWjJWMFFXeHNLQ0J1YjJSbElDa2dLVHNLQ1FsOUNnb0pDV2xtSUNnZ2JtOWtaUzV3WVhKbGJuUk9iMlJsSUNrZ2V3b0pDUWxwWmlBb0lHdGxaWEJFWVhSaElDWW1JR3BSZFdWeWVTNWpiMjUwWVdsdWN5Z2dibTlrWlM1dmQyNWxja1J2WTNWdFpXNTBMQ0J1YjJSbElDa2dLU0I3Q2drSkNRbHpaWFJIYkc5aVlXeEZkbUZzS0NCblpYUkJiR3dvSUc1dlpHVXNJQ0p6WTNKcGNIUWlJQ2tnS1RzS0NRa0pmUW9KQ1FsdWIyUmxMbkJoY21WdWRFNXZaR1V1Y21WdGIzWmxRMmhwYkdRb0lHNXZaR1VnS1RzS0NRbDlDZ2w5Q2dvSmNtVjBkWEp1SUdWc1pXMDdDbjBLQ21wUmRXVnllUzVsZUhSbGJtUW9JSHNLQ1doMGJXeFFjbVZtYVd4MFpYSTZJR1oxYm1OMGFXOXVLQ0JvZEcxc0lDa2dld29KQ1hKbGRIVnliaUJvZEcxc0xuSmxjR3hoWTJVb0lISjRhSFJ0YkZSaFp5d2dJandrTVQ0OEx5UXlQaUlnS1RzS0NYMHNDZ29KWTJ4dmJtVTZJR1oxYm1OMGFXOXVLQ0JsYkdWdExDQmtZWFJoUVc1a1JYWmxiblJ6TENCa1pXVndSR0YwWVVGdVpFVjJaVzUwY3lBcElIc0tDUWwyWVhJZ2FTd2diQ3dnYzNKalJXeGxiV1Z1ZEhNc0lHUmxjM1JGYkdWdFpXNTBjeXdLQ1FrSlkyeHZibVVnUFNCbGJHVnRMbU5zYjI1bFRtOWtaU2dnZEhKMVpTQXBMQW9KQ1FscGJsQmhaMlVnUFNCcVVYVmxjbmt1WTI5dWRHRnBibk1vSUdWc1pXMHViM2R1WlhKRWIyTjFiV1Z1ZEN3Z1pXeGxiU0FwT3dvS0NRa3ZMeUJHYVhnZ1NVVWdZMnh2Ym1sdVp5QnBjM04xWlhNS0NRbHBaaUFvSUNGemRYQndiM0owTG01dlEyeHZibVZEYUdWamEyVmtJQ1ltSUNnZ1pXeGxiUzV1YjJSbFZIbHdaU0E5UFQwZ01TQjhmQ0JsYkdWdExtNXZaR1ZVZVhCbElEMDlQU0F4TVNBcElDWW1DZ2tKQ1FraGFsRjFaWEo1TG1seldFMU1SRzlqS0NCbGJHVnRJQ2tnS1NCN0Nnb0pDUWt2THlCWFpTQmxjMk5vWlhjZ1UybDZlbXhsSUdobGNtVWdabTl5SUhCbGNtWnZjbTFoYm1ObElISmxZWE52Ym5NNklHaDBkSEJ6T2k4dmFuTndaWEptTG1OdmJTOW5aWFJoYkd3dGRuTXRjMmw2ZW14bEx6SUtDUWtKWkdWemRFVnNaVzFsYm5SeklEMGdaMlYwUVd4c0tDQmpiRzl1WlNBcE93b0pDUWx6Y21ORmJHVnRaVzUwY3lBOUlHZGxkRUZzYkNnZ1pXeGxiU0FwT3dvS0NRa0pabTl5SUNnZ2FTQTlJREFzSUd3Z1BTQnpjbU5GYkdWdFpXNTBjeTVzWlc1bmRHZzdJR2tnUENCc095QnBLeXNnS1NCN0Nna0pDUWxtYVhoSmJuQjFkQ2dnYzNKalJXeGxiV1Z1ZEhOYklHa2dYU3dnWkdWemRFVnNaVzFsYm5Seld5QnBJRjBnS1RzS0NRa0pmUW9KQ1gwS0Nna0pMeThnUTI5d2VTQjBhR1VnWlhabGJuUnpJR1p5YjIwZ2RHaGxJRzl5YVdkcGJtRnNJSFJ2SUhSb1pTQmpiRzl1WlFvSkNXbG1JQ2dnWkdGMFlVRnVaRVYyWlc1MGN5QXBJSHNLQ1FrSmFXWWdLQ0JrWldWd1JHRjBZVUZ1WkVWMlpXNTBjeUFwSUhzS0NRa0pDWE55WTBWc1pXMWxiblJ6SUQwZ2MzSmpSV3hsYldWdWRITWdmSHdnWjJWMFFXeHNLQ0JsYkdWdElDazdDZ2tKQ1Fsa1pYTjBSV3hsYldWdWRITWdQU0JrWlhOMFJXeGxiV1Z1ZEhNZ2ZId2daMlYwUVd4c0tDQmpiRzl1WlNBcE93b0tDUWtKQ1dadmNpQW9JR2tnUFNBd0xDQnNJRDBnYzNKalJXeGxiV1Z1ZEhNdWJHVnVaM1JvT3lCcElEd2diRHNnYVNzcklDa2dld29KQ1FrSkNXTnNiMjVsUTI5d2VVVjJaVzUwS0NCemNtTkZiR1Z0Wlc1MGMxc2dhU0JkTENCa1pYTjBSV3hsYldWdWRITmJJR2tnWFNBcE93b0pDUWtKZlFvSkNRbDlJR1ZzYzJVZ2V3b0pDUWtKWTJ4dmJtVkRiM0I1UlhabGJuUW9JR1ZzWlcwc0lHTnNiMjVsSUNrN0Nna0pDWDBLQ1FsOUNnb0pDUzh2SUZCeVpYTmxjblpsSUhOamNtbHdkQ0JsZG1Gc2RXRjBhVzl1SUdocGMzUnZjbmtLQ1Fsa1pYTjBSV3hsYldWdWRITWdQU0JuWlhSQmJHd29JR05zYjI1bExDQWljMk55YVhCMElpQXBPd29KQ1dsbUlDZ2daR1Z6ZEVWc1pXMWxiblJ6TG14bGJtZDBhQ0ErSURBZ0tTQjdDZ2tKQ1hObGRFZHNiMkpoYkVWMllXd29JR1JsYzNSRmJHVnRaVzUwY3l3Z0lXbHVVR0ZuWlNBbUppQm5aWFJCYkd3b0lHVnNaVzBzSUNKelkzSnBjSFFpSUNrZ0tUc0tDUWw5Q2dvSkNTOHZJRkpsZEhWeWJpQjBhR1VnWTJ4dmJtVmtJSE5sZEFvSkNYSmxkSFZ5YmlCamJHOXVaVHNLQ1gwc0Nnb0pZMnhsWVc1RVlYUmhPaUJtZFc1amRHbHZiaWdnWld4bGJYTWdLU0I3Q2drSmRtRnlJR1JoZEdFc0lHVnNaVzBzSUhSNWNHVXNDZ2tKQ1hOd1pXTnBZV3dnUFNCcVVYVmxjbmt1WlhabGJuUXVjM0JsWTJsaGJDd0tDUWtKYVNBOUlEQTdDZ29KQ1dadmNpQW9JRHNnS0NCbGJHVnRJRDBnWld4bGJYTmJJR2tnWFNBcElDRTlQU0IxYm1SbFptbHVaV1E3SUdrckt5QXBJSHNLQ1FrSmFXWWdLQ0JoWTJObGNIUkVZWFJoS0NCbGJHVnRJQ2tnS1NCN0Nna0pDUWxwWmlBb0lDZ2daR0YwWVNBOUlHVnNaVzFiSUdSaGRHRlFjbWwyTG1WNGNHRnVaRzhnWFNBcElDa2dld29KQ1FrSkNXbG1JQ2dnWkdGMFlTNWxkbVZ1ZEhNZ0tTQjdDZ2tKQ1FrSkNXWnZjaUFvSUhSNWNHVWdhVzRnWkdGMFlTNWxkbVZ1ZEhNZ0tTQjdDZ2tKQ1FrSkNRbHBaaUFvSUhOd1pXTnBZV3hiSUhSNWNHVWdYU0FwSUhzS0NRa0pDUWtKQ1FscVVYVmxjbmt1WlhabGJuUXVjbVZ0YjNabEtDQmxiR1Z0TENCMGVYQmxJQ2s3Q2dvSkNRa0pDUWtKTHk4Z1ZHaHBjeUJwY3lCaElITm9iM0owWTNWMElIUnZJR0YyYjJsa0lHcFJkV1Z5ZVM1bGRtVnVkQzV5WlcxdmRtVW5jeUJ2ZG1WeWFHVmhaQW9KQ1FrSkNRa0pmU0JsYkhObElIc0tDUWtKQ1FrSkNRbHFVWFZsY25rdWNtVnRiM1psUlhabGJuUW9JR1ZzWlcwc0lIUjVjR1VzSUdSaGRHRXVhR0Z1Wkd4bElDazdDZ2tKQ1FrSkNRbDlDZ2tKQ1FrSkNYMEtDUWtKQ1FsOUNnb0pDUWtKQ1M4dklGTjFjSEJ2Y25RNklFTm9jbTl0WlNBOFBUTTFJQzBnTkRVckNna0pDUWtKTHk4Z1FYTnphV2R1SUhWdVpHVm1hVzVsWkNCcGJuTjBaV0ZrSUc5bUlIVnphVzVuSUdSbGJHVjBaU3dnYzJWbElFUmhkR0VqY21WdGIzWmxDZ2tKQ1FrSlpXeGxiVnNnWkdGMFlWQnlhWFl1Wlhod1lXNWtieUJkSUQwZ2RXNWtaV1pwYm1Wa093b0pDUWtKZlFvSkNRa0phV1lnS0NCbGJHVnRXeUJrWVhSaFZYTmxjaTVsZUhCaGJtUnZJRjBnS1NCN0Nnb0pDUWtKQ1M4dklGTjFjSEJ2Y25RNklFTm9jbTl0WlNBOFBUTTFJQzBnTkRVckNna0pDUWtKTHk4Z1FYTnphV2R1SUhWdVpHVm1hVzVsWkNCcGJuTjBaV0ZrSUc5bUlIVnphVzVuSUdSbGJHVjBaU3dnYzJWbElFUmhkR0VqY21WdGIzWmxDZ2tKQ1FrSlpXeGxiVnNnWkdGMFlWVnpaWEl1Wlhod1lXNWtieUJkSUQwZ2RXNWtaV1pwYm1Wa093b0pDUWtKZlFvSkNRbDlDZ2tKZlFvSmZRcDlJQ2s3Q2dwcVVYVmxjbmt1Wm00dVpYaDBaVzVrS0NCN0NnbGtaWFJoWTJnNklHWjFibU4wYVc5dUtDQnpaV3hsWTNSdmNpQXBJSHNLQ1FseVpYUjFjbTRnY21WdGIzWmxLQ0IwYUdsekxDQnpaV3hsWTNSdmNpd2dkSEoxWlNBcE93b0pmU3dLQ2dseVpXMXZkbVU2SUdaMWJtTjBhVzl1S0NCelpXeGxZM1J2Y2lBcElIc0tDUWx5WlhSMWNtNGdjbVZ0YjNabEtDQjBhR2x6TENCelpXeGxZM1J2Y2lBcE93b0pmU3dLQ2dsMFpYaDBPaUJtZFc1amRHbHZiaWdnZG1Gc2RXVWdLU0I3Q2drSmNtVjBkWEp1SUdGalkyVnpjeWdnZEdocGN5d2dablZ1WTNScGIyNG9JSFpoYkhWbElDa2dld29KQ1FseVpYUjFjbTRnZG1Gc2RXVWdQVDA5SUhWdVpHVm1hVzVsWkNBL0Nna0pDUWxxVVhWbGNua3VkR1Y0ZENnZ2RHaHBjeUFwSURvS0NRa0pDWFJvYVhNdVpXMXdkSGtvS1M1bFlXTm9LQ0JtZFc1amRHbHZiaWdwSUhzS0NRa0pDUWxwWmlBb0lIUm9hWE11Ym05a1pWUjVjR1VnUFQwOUlERWdmSHdnZEdocGN5NXViMlJsVkhsd1pTQTlQVDBnTVRFZ2ZId2dkR2hwY3k1dWIyUmxWSGx3WlNBOVBUMGdPU0FwSUhzS0NRa0pDUWtKZEdocGN5NTBaWGgwUTI5dWRHVnVkQ0E5SUhaaGJIVmxPd29KQ1FrSkNYMEtDUWtKQ1gwZ0tUc0tDUWw5TENCdWRXeHNMQ0IyWVd4MVpTd2dZWEpuZFcxbGJuUnpMbXhsYm1kMGFDQXBPd29KZlN3S0NnbGhjSEJsYm1RNklHWjFibU4wYVc5dUtDa2dld29KQ1hKbGRIVnliaUJrYjIxTllXNXBjQ2dnZEdocGN5d2dZWEpuZFcxbGJuUnpMQ0JtZFc1amRHbHZiaWdnWld4bGJTQXBJSHNLQ1FrSmFXWWdLQ0IwYUdsekxtNXZaR1ZVZVhCbElEMDlQU0F4SUh4OElIUm9hWE11Ym05a1pWUjVjR1VnUFQwOUlERXhJSHg4SUhSb2FYTXVibTlrWlZSNWNHVWdQVDA5SURrZ0tTQjdDZ2tKQ1FsMllYSWdkR0Z5WjJWMElEMGdiV0Z1YVhCMWJHRjBhVzl1VkdGeVoyVjBLQ0IwYUdsekxDQmxiR1Z0SUNrN0Nna0pDUWwwWVhKblpYUXVZWEJ3Wlc1a1EyaHBiR1FvSUdWc1pXMGdLVHNLQ1FrSmZRb0pDWDBnS1RzS0NYMHNDZ29KY0hKbGNHVnVaRG9nWm5WdVkzUnBiMjRvS1NCN0Nna0pjbVYwZFhKdUlHUnZiVTFoYm1sd0tDQjBhR2x6TENCaGNtZDFiV1Z1ZEhNc0lHWjFibU4wYVc5dUtDQmxiR1Z0SUNrZ2V3b0pDUWxwWmlBb0lIUm9hWE11Ym05a1pWUjVjR1VnUFQwOUlERWdmSHdnZEdocGN5NXViMlJsVkhsd1pTQTlQVDBnTVRFZ2ZId2dkR2hwY3k1dWIyUmxWSGx3WlNBOVBUMGdPU0FwSUhzS0NRa0pDWFpoY2lCMFlYSm5aWFFnUFNCdFlXNXBjSFZzWVhScGIyNVVZWEpuWlhRb0lIUm9hWE1zSUdWc1pXMGdLVHNLQ1FrSkNYUmhjbWRsZEM1cGJuTmxjblJDWldadmNtVW9JR1ZzWlcwc0lIUmhjbWRsZEM1bWFYSnpkRU5vYVd4a0lDazdDZ2tKQ1gwS0NRbDlJQ2s3Q2dsOUxBb0tDV0psWm05eVpUb2dablZ1WTNScGIyNG9LU0I3Q2drSmNtVjBkWEp1SUdSdmJVMWhibWx3S0NCMGFHbHpMQ0JoY21kMWJXVnVkSE1zSUdaMWJtTjBhVzl1S0NCbGJHVnRJQ2tnZXdvSkNRbHBaaUFvSUhSb2FYTXVjR0Z5Wlc1MFRtOWtaU0FwSUhzS0NRa0pDWFJvYVhNdWNHRnlaVzUwVG05a1pTNXBibk5sY25SQ1pXWnZjbVVvSUdWc1pXMHNJSFJvYVhNZ0tUc0tDUWtKZlFvSkNYMGdLVHNLQ1gwc0Nnb0pZV1owWlhJNklHWjFibU4wYVc5dUtDa2dld29KQ1hKbGRIVnliaUJrYjIxTllXNXBjQ2dnZEdocGN5d2dZWEpuZFcxbGJuUnpMQ0JtZFc1amRHbHZiaWdnWld4bGJTQXBJSHNLQ1FrSmFXWWdLQ0IwYUdsekxuQmhjbVZ1ZEU1dlpHVWdLU0I3Q2drSkNRbDBhR2x6TG5CaGNtVnVkRTV2WkdVdWFXNXpaWEowUW1WbWIzSmxLQ0JsYkdWdExDQjBhR2x6TG01bGVIUlRhV0pzYVc1bklDazdDZ2tKQ1gwS0NRbDlJQ2s3Q2dsOUxBb0tDV1Z0Y0hSNU9pQm1kVzVqZEdsdmJpZ3BJSHNLQ1FsMllYSWdaV3hsYlN3S0NRa0phU0E5SURBN0Nnb0pDV1p2Y2lBb0lEc2dLQ0JsYkdWdElEMGdkR2hwYzFzZ2FTQmRJQ2tnSVQwZ2JuVnNiRHNnYVNzcklDa2dld29KQ1FscFppQW9JR1ZzWlcwdWJtOWtaVlI1Y0dVZ1BUMDlJREVnS1NCN0Nnb0pDUWtKTHk4Z1VISmxkbVZ1ZENCdFpXMXZjbmtnYkdWaGEzTUtDUWtKQ1dwUmRXVnllUzVqYkdWaGJrUmhkR0VvSUdkbGRFRnNiQ2dnWld4bGJTd2dabUZzYzJVZ0tTQXBPd29LQ1FrSkNTOHZJRkpsYlc5MlpTQmhibmtnY21WdFlXbHVhVzVuSUc1dlpHVnpDZ2tKQ1FsbGJHVnRMblJsZUhSRGIyNTBaVzUwSUQwZ0lpSTdDZ2tKQ1gwS0NRbDlDZ29KQ1hKbGRIVnliaUIwYUdsek93b0pmU3dLQ2dsamJHOXVaVG9nWm5WdVkzUnBiMjRvSUdSaGRHRkJibVJGZG1WdWRITXNJR1JsWlhCRVlYUmhRVzVrUlhabGJuUnpJQ2tnZXdvSkNXUmhkR0ZCYm1SRmRtVnVkSE1nUFNCa1lYUmhRVzVrUlhabGJuUnpJRDA5SUc1MWJHd2dQeUJtWVd4elpTQTZJR1JoZEdGQmJtUkZkbVZ1ZEhNN0Nna0paR1ZsY0VSaGRHRkJibVJGZG1WdWRITWdQU0JrWldWd1JHRjBZVUZ1WkVWMlpXNTBjeUE5UFNCdWRXeHNJRDhnWkdGMFlVRnVaRVYyWlc1MGN5QTZJR1JsWlhCRVlYUmhRVzVrUlhabGJuUnpPd29LQ1FseVpYUjFjbTRnZEdocGN5NXRZWEFvSUdaMWJtTjBhVzl1S0NrZ2V3b0pDUWx5WlhSMWNtNGdhbEYxWlhKNUxtTnNiMjVsS0NCMGFHbHpMQ0JrWVhSaFFXNWtSWFpsYm5SekxDQmtaV1Z3UkdGMFlVRnVaRVYyWlc1MGN5QXBPd29KQ1gwZ0tUc0tDWDBzQ2dvSmFIUnRiRG9nWm5WdVkzUnBiMjRvSUhaaGJIVmxJQ2tnZXdvSkNYSmxkSFZ5YmlCaFkyTmxjM01vSUhSb2FYTXNJR1oxYm1OMGFXOXVLQ0IyWVd4MVpTQXBJSHNLQ1FrSmRtRnlJR1ZzWlcwZ1BTQjBhR2x6V3lBd0lGMGdmSHdnZTMwc0Nna0pDUWxwSUQwZ01Dd0tDUWtKQ1d3Z1BTQjBhR2x6TG14bGJtZDBhRHNLQ2drSkNXbG1JQ2dnZG1Gc2RXVWdQVDA5SUhWdVpHVm1hVzVsWkNBbUppQmxiR1Z0TG01dlpHVlVlWEJsSUQwOVBTQXhJQ2tnZXdvSkNRa0pjbVYwZFhKdUlHVnNaVzB1YVc1dVpYSklWRTFNT3dvSkNRbDlDZ29KQ1Frdkx5QlRaV1VnYVdZZ2QyVWdZMkZ1SUhSaGEyVWdZU0J6YUc5eWRHTjFkQ0JoYm1RZ2FuVnpkQ0IxYzJVZ2FXNXVaWEpJVkUxTUNna0pDV2xtSUNnZ2RIbHdaVzltSUhaaGJIVmxJRDA5UFNBaWMzUnlhVzVuSWlBbUppQWhjbTV2U1c1dVpYSm9kRzFzTG5SbGMzUW9JSFpoYkhWbElDa2dKaVlLQ1FrSkNTRjNjbUZ3VFdGd1d5QW9JSEowWVdkT1lXMWxMbVY0WldNb0lIWmhiSFZsSUNrZ2ZId2dXeUFpSWl3Z0lpSWdYU0FwV3lBeElGMHVkRzlNYjNkbGNrTmhjMlVvS1NCZElDa2dld29LQ1FrSkNYWmhiSFZsSUQwZ2FsRjFaWEo1TG1oMGJXeFFjbVZtYVd4MFpYSW9JSFpoYkhWbElDazdDZ29KQ1FrSmRISjVJSHNLQ1FrSkNRbG1iM0lnS0NBN0lHa2dQQ0JzT3lCcEt5c2dLU0I3Q2drSkNRa0pDV1ZzWlcwZ1BTQjBhR2x6V3lCcElGMGdmSHdnZTMwN0Nnb0pDUWtKQ1Frdkx5QlNaVzF2ZG1VZ1pXeGxiV1Z1ZENCdWIyUmxjeUJoYm1RZ2NISmxkbVZ1ZENCdFpXMXZjbmtnYkdWaGEzTUtDUWtKQ1FrSmFXWWdLQ0JsYkdWdExtNXZaR1ZVZVhCbElEMDlQU0F4SUNrZ2V3b0pDUWtKQ1FrSmFsRjFaWEo1TG1Oc1pXRnVSR0YwWVNnZ1oyVjBRV3hzS0NCbGJHVnRMQ0JtWVd4elpTQXBJQ2s3Q2drSkNRa0pDUWxsYkdWdExtbHVibVZ5U0ZSTlRDQTlJSFpoYkhWbE93b0pDUWtKQ1FsOUNna0pDUWtKZlFvS0NRa0pDUWxsYkdWdElEMGdNRHNLQ2drSkNRa3ZMeUJKWmlCMWMybHVaeUJwYm01bGNraFVUVXdnZEdoeWIzZHpJR0Z1SUdWNFkyVndkR2x2Yml3Z2RYTmxJSFJvWlNCbVlXeHNZbUZqYXlCdFpYUm9iMlFLQ1FrSkNYMGdZMkYwWTJnZ0tDQmxJQ2tnZTMwS0NRa0pmUW9LQ1FrSmFXWWdLQ0JsYkdWdElDa2dld29KQ1FrSmRHaHBjeTVsYlhCMGVTZ3BMbUZ3Y0dWdVpDZ2dkbUZzZFdVZ0tUc0tDUWtKZlFvSkNYMHNJRzUxYkd3c0lIWmhiSFZsTENCaGNtZDFiV1Z1ZEhNdWJHVnVaM1JvSUNrN0NnbDlMQW9LQ1hKbGNHeGhZMlZYYVhSb09pQm1kVzVqZEdsdmJpZ3BJSHNLQ1FsMllYSWdhV2R1YjNKbFpDQTlJRnRkT3dvS0NRa3ZMeUJOWVd0bElIUm9aU0JqYUdGdVoyVnpMQ0J5WlhCc1lXTnBibWNnWldGamFDQnViMjR0YVdkdWIzSmxaQ0JqYjI1MFpYaDBJR1ZzWlcxbGJuUWdkMmwwYUNCMGFHVWdibVYzSUdOdmJuUmxiblFLQ1FseVpYUjFjbTRnWkc5dFRXRnVhWEFvSUhSb2FYTXNJR0Z5WjNWdFpXNTBjeXdnWm5WdVkzUnBiMjRvSUdWc1pXMGdLU0I3Q2drSkNYWmhjaUJ3WVhKbGJuUWdQU0IwYUdsekxuQmhjbVZ1ZEU1dlpHVTdDZ29KQ1FscFppQW9JR3BSZFdWeWVTNXBia0Z5Y21GNUtDQjBhR2x6TENCcFoyNXZjbVZrSUNrZ1BDQXdJQ2tnZXdvSkNRa0phbEYxWlhKNUxtTnNaV0Z1UkdGMFlTZ2daMlYwUVd4c0tDQjBhR2x6SUNrZ0tUc0tDUWtKQ1dsbUlDZ2djR0Z5Wlc1MElDa2dld29KQ1FrSkNYQmhjbVZ1ZEM1eVpYQnNZV05sUTJocGJHUW9JR1ZzWlcwc0lIUm9hWE1nS1RzS0NRa0pDWDBLQ1FrSmZRb0tDUWt2THlCR2IzSmpaU0JqWVd4c1ltRmpheUJwYm5adlkyRjBhVzl1Q2drSmZTd2dhV2R1YjNKbFpDQXBPd29KZlFwOUlDazdDZ3BxVVhWbGNua3VaV0ZqYUNnZ2V3b0pZWEJ3Wlc1a1ZHODZJQ0poY0hCbGJtUWlMQW9KY0hKbGNHVnVaRlJ2T2lBaWNISmxjR1Z1WkNJc0NnbHBibk5sY25SQ1pXWnZjbVU2SUNKaVpXWnZjbVVpTEFvSmFXNXpaWEowUVdaMFpYSTZJQ0poWm5SbGNpSXNDZ2x5WlhCc1lXTmxRV3hzT2lBaWNtVndiR0ZqWlZkcGRHZ2lDbjBzSUdaMWJtTjBhVzl1S0NCdVlXMWxMQ0J2Y21sbmFXNWhiQ0FwSUhzS0NXcFJkV1Z5ZVM1bWJsc2dibUZ0WlNCZElEMGdablZ1WTNScGIyNG9JSE5sYkdWamRHOXlJQ2tnZXdvSkNYWmhjaUJsYkdWdGN5d0tDUWtKY21WMElEMGdXMTBzQ2drSkNXbHVjMlZ5ZENBOUlHcFJkV1Z5ZVNnZ2MyVnNaV04wYjNJZ0tTd0tDUWtKYkdGemRDQTlJR2x1YzJWeWRDNXNaVzVuZEdnZ0xTQXhMQW9KQ1FscElEMGdNRHNLQ2drSlptOXlJQ2dnT3lCcElEdzlJR3hoYzNRN0lHa3JLeUFwSUhzS0NRa0paV3hsYlhNZ1BTQnBJRDA5UFNCc1lYTjBJRDhnZEdocGN5QTZJSFJvYVhNdVkyeHZibVVvSUhSeWRXVWdLVHNLQ1FrSmFsRjFaWEo1S0NCcGJuTmxjblJiSUdrZ1hTQXBXeUJ2Y21sbmFXNWhiQ0JkS0NCbGJHVnRjeUFwT3dvS0NRa0pMeThnVTNWd2NHOXlkRG9nUVc1a2NtOXBaQ0E4UFRRdU1DQnZibXg1TENCUWFHRnVkRzl0U2xNZ01TQnZibXg1Q2drSkNTOHZJQzVuWlhRb0tTQmlaV05oZFhObElIQjFjMmd1WVhCd2JIa29YeXdnWVhKeVlYbHNhV3RsS1NCMGFISnZkM01nYjI0Z1lXNWphV1Z1ZENCWFpXSkxhWFFLQ1FrSmNIVnphQzVoY0hCc2VTZ2djbVYwTENCbGJHVnRjeTVuWlhRb0tTQXBPd29KQ1gwS0Nna0pjbVYwZFhKdUlIUm9hWE11Y0hWemFGTjBZV05yS0NCeVpYUWdLVHNLQ1gwN0NuMGdLVHNLZG1GeUlISnVkVzF1YjI1d2VDQTlJRzVsZHlCU1pXZEZlSEFvSUNKZUtDSWdLeUJ3Ym5WdElDc2dJaWtvUHlGd2VDbGJZUzE2SlYwckpDSXNJQ0pwSWlBcE93b0tkbUZ5SUdkbGRGTjBlV3hsY3lBOUlHWjFibU4wYVc5dUtDQmxiR1Z0SUNrZ2V3b0tDUWt2THlCVGRYQndiM0owT2lCSlJTQThQVEV4SUc5dWJIa3NJRVpwY21WbWIzZ2dQRDB6TUNBb0l6RTFNRGs0TENBak1UUXhOVEFwQ2drSkx5OGdTVVVnZEdoeWIzZHpJRzl1SUdWc1pXMWxiblJ6SUdOeVpXRjBaV1FnYVc0Z2NHOXdkWEJ6Q2drSkx5OGdSa1lnYldWaGJuZG9hV3hsSUhSb2NtOTNjeUJ2YmlCbWNtRnRaU0JsYkdWdFpXNTBjeUIwYUhKdmRXZG9JQ0prWldaaGRXeDBWbWxsZHk1blpYUkRiMjF3ZFhSbFpGTjBlV3hsSWdvSkNYWmhjaUIyYVdWM0lEMGdaV3hsYlM1dmQyNWxja1J2WTNWdFpXNTBMbVJsWm1GMWJIUldhV1YzT3dvS0NRbHBaaUFvSUNGMmFXVjNJSHg4SUNGMmFXVjNMbTl3Wlc1bGNpQXBJSHNLQ1FrSmRtbGxkeUE5SUhkcGJtUnZkenNLQ1FsOUNnb0pDWEpsZEhWeWJpQjJhV1YzTG1kbGRFTnZiWEIxZEdWa1UzUjViR1VvSUdWc1pXMGdLVHNLQ1gwN0NncDJZWElnY21KdmVGTjBlV3hsSUQwZ2JtVjNJRkpsWjBWNGNDZ2dZM056Ulhod1lXNWtMbXB2YVc0b0lDSjhJaUFwTENBaWFTSWdLVHNLQ2dvS0tDQm1kVzVqZEdsdmJpZ3BJSHNLQ2drdkx5QkZlR1ZqZFhScGJtY2dZbTkwYUNCd2FYaGxiRkJ2YzJsMGFXOXVJQ1lnWW05NFUybDZhVzVuVW1Wc2FXRmliR1VnZEdWemRITWdjbVZ4ZFdseVpTQnZibXg1SUc5dVpTQnNZWGx2ZFhRS0NTOHZJSE52SUhSb1pYa25jbVVnWlhobFkzVjBaV1FnWVhRZ2RHaGxJSE5oYldVZ2RHbHRaU0IwYnlCellYWmxJSFJvWlNCelpXTnZibVFnWTI5dGNIVjBZWFJwYjI0dUNnbG1kVzVqZEdsdmJpQmpiMjF3ZFhSbFUzUjViR1ZVWlhOMGN5Z3BJSHNLQ2drSkx5OGdWR2hwY3lCcGN5QmhJSE5wYm1kc1pYUnZiaXdnZDJVZ2JtVmxaQ0IwYnlCbGVHVmpkWFJsSUdsMElHOXViSGtnYjI1alpRb0pDV2xtSUNnZ0lXUnBkaUFwSUhzS0NRa0pjbVYwZFhKdU93b0pDWDBLQ2drSlkyOXVkR0ZwYm1WeUxuTjBlV3hsTG1OemMxUmxlSFFnUFNBaWNHOXphWFJwYjI0NllXSnpiMngxZEdVN2JHVm1kRG90TVRFeE1URndlRHQzYVdSMGFEbzJNSEI0T3lJZ0t3b0pDUWtpYldGeVoybHVMWFJ2Y0RveGNIZzdjR0ZrWkdsdVp6b3dPMkp2Y21SbGNqb3dJanNLQ1Fsa2FYWXVjM1I1YkdVdVkzTnpWR1Y0ZENBOUNna0pDU0p3YjNOcGRHbHZianB5Wld4aGRHbDJaVHRrYVhOd2JHRjVPbUpzYjJOck8ySnZlQzF6YVhwcGJtYzZZbTl5WkdWeUxXSnZlRHR2ZG1WeVpteHZkenB6WTNKdmJHdzdJaUFyQ2drSkNTSnRZWEpuYVc0NllYVjBienRpYjNKa1pYSTZNWEI0TzNCaFpHUnBibWM2TVhCNE95SWdLd29KQ1FraWQybGtkR2c2TmpBbE8zUnZjRG94SlNJN0Nna0paRzlqZFcxbGJuUkZiR1Z0Wlc1MExtRndjR1Z1WkVOb2FXeGtLQ0JqYjI1MFlXbHVaWElnS1M1aGNIQmxibVJEYUdsc1pDZ2daR2wySUNrN0Nnb0pDWFpoY2lCa2FYWlRkSGxzWlNBOUlIZHBibVJ2ZHk1blpYUkRiMjF3ZFhSbFpGTjBlV3hsS0NCa2FYWWdLVHNLQ1Fsd2FYaGxiRkJ2YzJsMGFXOXVWbUZzSUQwZ1pHbDJVM1I1YkdVdWRHOXdJQ0U5UFNBaU1TVWlPd29LQ1Frdkx5QlRkWEJ3YjNKME9pQkJibVJ5YjJsa0lEUXVNQ0F0SURRdU15QnZibXg1TENCR2FYSmxabTk0SUR3OU15QXRJRFEwQ2drSmNtVnNhV0ZpYkdWTllYSm5hVzVNWldaMFZtRnNJRDBnY205MWJtUlFhWGhsYkUxbFlYTjFjbVZ6S0NCa2FYWlRkSGxzWlM1dFlYSm5hVzVNWldaMElDa2dQVDA5SURFeU93b0tDUWt2THlCVGRYQndiM0owT2lCQmJtUnliMmxrSURRdU1DQXRJRFF1TXlCdmJteDVMQ0JUWVdaaGNta2dQRDA1TGpFZ0xTQXhNQzR4TENCcFQxTWdQRDAzTGpBZ0xTQTVMak1LQ1Frdkx5QlRiMjFsSUhOMGVXeGxjeUJqYjIxbElHSmhZMnNnZDJsMGFDQndaWEpqWlc1MFlXZGxJSFpoYkhWbGN5d2daWFpsYmlCMGFHOTFaMmdnZEdobGVTQnphRzkxYkdSdUozUUtDUWxrYVhZdWMzUjViR1V1Y21sbmFIUWdQU0FpTmpBbElqc0tDUWx3YVhobGJFSnZlRk4wZVd4bGMxWmhiQ0E5SUhKdmRXNWtVR2w0Wld4TlpXRnpkWEpsY3lnZ1pHbDJVM1I1YkdVdWNtbG5hSFFnS1NBOVBUMGdNelk3Q2dvSkNTOHZJRk4xY0hCdmNuUTZJRWxGSURrZ0xTQXhNU0J2Ym14NUNna0pMeThnUkdWMFpXTjBJRzFwYzNKbGNHOXlkR2x1WnlCdlppQmpiMjUwWlc1MElHUnBiV1Z1YzJsdmJuTWdabTl5SUdKdmVDMXphWHBwYm1jNlltOXlaR1Z5TFdKdmVDQmxiR1Z0Wlc1MGN3b0pDV0p2ZUZOcGVtbHVaMUpsYkdsaFlteGxWbUZzSUQwZ2NtOTFibVJRYVhobGJFMWxZWE4xY21WektDQmthWFpUZEhsc1pTNTNhV1IwYUNBcElEMDlQU0F6TmpzS0Nna0pMeThnVTNWd2NHOXlkRG9nU1VVZ09TQnZibXg1Q2drSkx5OGdSR1YwWldOMElHOTJaWEptYkc5M09uTmpjbTlzYkNCelkzSmxkMmx1WlhOeklDaG5hQzB6TmprNUtRb0pDV1JwZGk1emRIbHNaUzV3YjNOcGRHbHZiaUE5SUNKaFluTnZiSFYwWlNJN0Nna0pjMk55YjJ4c1ltOTRVMmw2WlZaaGJDQTlJR1JwZGk1dlptWnpaWFJYYVdSMGFDQTlQVDBnTXpZZ2ZId2dJbUZpYzI5c2RYUmxJanNLQ2drSlpHOWpkVzFsYm5SRmJHVnRaVzUwTG5KbGJXOTJaVU5vYVd4a0tDQmpiMjUwWVdsdVpYSWdLVHNLQ2drSkx5OGdUblZzYkdsbWVTQjBhR1VnWkdsMklITnZJR2wwSUhkdmRXeGtiaWQwSUdKbElITjBiM0psWkNCcGJpQjBhR1VnYldWdGIzSjVJR0Z1WkFvSkNTOHZJR2wwSUhkcGJHd2dZV3h6YnlCaVpTQmhJSE5wWjI0Z2RHaGhkQ0JqYUdWamEzTWdZV3h5WldGa2VTQndaWEptYjNKdFpXUUtDUWxrYVhZZ1BTQnVkV3hzT3dvSmZRb0tDV1oxYm1OMGFXOXVJSEp2ZFc1a1VHbDRaV3hOWldGemRYSmxjeWdnYldWaGMzVnlaU0FwSUhzS0NRbHlaWFIxY200Z1RXRjBhQzV5YjNWdVpDZ2djR0Z5YzJWR2JHOWhkQ2dnYldWaGMzVnlaU0FwSUNrN0NnbDlDZ29KZG1GeUlIQnBlR1ZzVUc5emFYUnBiMjVXWVd3c0lHSnZlRk5wZW1sdVoxSmxiR2xoWW14bFZtRnNMQ0J6WTNKdmJHeGliM2hUYVhwbFZtRnNMQ0J3YVhobGJFSnZlRk4wZVd4bGMxWmhiQ3dLQ1FseVpXeHBZV0pzWlUxaGNtZHBia3hsWm5SV1lXd3NDZ2tKWTI5dWRHRnBibVZ5SUQwZ1pHOWpkVzFsYm5RdVkzSmxZWFJsUld4bGJXVnVkQ2dnSW1ScGRpSWdLU3dLQ1Fsa2FYWWdQU0JrYjJOMWJXVnVkQzVqY21WaGRHVkZiR1Z0Wlc1MEtDQWlaR2wySWlBcE93b0tDUzh2SUVacGJtbHphQ0JsWVhKc2VTQnBiaUJzYVcxcGRHVmtJQ2h1YjI0dFluSnZkM05sY2lrZ1pXNTJhWEp2Ym0xbGJuUnpDZ2xwWmlBb0lDRmthWFl1YzNSNWJHVWdLU0I3Q2drSmNtVjBkWEp1T3dvSmZRb0tDUzh2SUZOMWNIQnZjblE2SUVsRklEdzlPU0F0SURFeElHOXViSGtLQ1M4dklGTjBlV3hsSUc5bUlHTnNiMjVsWkNCbGJHVnRaVzUwSUdGbVptVmpkSE1nYzI5MWNtTmxJR1ZzWlcxbGJuUWdZMnh2Ym1Wa0lDZ2pPRGt3T0NrS0NXUnBkaTV6ZEhsc1pTNWlZV05yWjNKdmRXNWtRMnhwY0NBOUlDSmpiMjUwWlc1MExXSnZlQ0k3Q2dsa2FYWXVZMnh2Ym1WT2IyUmxLQ0IwY25WbElDa3VjM1I1YkdVdVltRmphMmR5YjNWdVpFTnNhWEFnUFNBaUlqc0tDWE4xY0hCdmNuUXVZMnhsWVhKRGJHOXVaVk4wZVd4bElEMGdaR2wyTG5OMGVXeGxMbUpoWTJ0bmNtOTFibVJEYkdsd0lEMDlQU0FpWTI5dWRHVnVkQzFpYjNnaU93b0tDV3BSZFdWeWVTNWxlSFJsYm1Rb0lITjFjSEJ2Y25Rc0lIc0tDUWxpYjNoVGFYcHBibWRTWld4cFlXSnNaVG9nWm5WdVkzUnBiMjRvS1NCN0Nna0pDV052YlhCMWRHVlRkSGxzWlZSbGMzUnpLQ2s3Q2drSkNYSmxkSFZ5YmlCaWIzaFRhWHBwYm1kU1pXeHBZV0pzWlZaaGJEc0tDUWw5TEFvSkNYQnBlR1ZzUW05NFUzUjViR1Z6T2lCbWRXNWpkR2x2YmlncElIc0tDUWtKWTI5dGNIVjBaVk4wZVd4bFZHVnpkSE1vS1RzS0NRa0pjbVYwZFhKdUlIQnBlR1ZzUW05NFUzUjViR1Z6Vm1Gc093b0pDWDBzQ2drSmNHbDRaV3hRYjNOcGRHbHZiam9nWm5WdVkzUnBiMjRvS1NCN0Nna0pDV052YlhCMWRHVlRkSGxzWlZSbGMzUnpLQ2s3Q2drSkNYSmxkSFZ5YmlCd2FYaGxiRkJ2YzJsMGFXOXVWbUZzT3dvSkNYMHNDZ2tKY21Wc2FXRmliR1ZOWVhKbmFXNU1aV1owT2lCbWRXNWpkR2x2YmlncElIc0tDUWtKWTI5dGNIVjBaVk4wZVd4bFZHVnpkSE1vS1RzS0NRa0pjbVYwZFhKdUlISmxiR2xoWW14bFRXRnlaMmx1VEdWbWRGWmhiRHNLQ1FsOUxBb0pDWE5qY205c2JHSnZlRk5wZW1VNklHWjFibU4wYVc5dUtDa2dld29KQ1FsamIyMXdkWFJsVTNSNWJHVlVaWE4wY3lncE93b0pDUWx5WlhSMWNtNGdjMk55YjJ4c1ltOTRVMmw2WlZaaGJEc0tDUWw5Q2dsOUlDazdDbjBnS1NncE93b0tDbVoxYm1OMGFXOXVJR04xY2tOVFV5Z2daV3hsYlN3Z2JtRnRaU3dnWTI5dGNIVjBaV1FnS1NCN0NnbDJZWElnZDJsa2RHZ3NJRzFwYmxkcFpIUm9MQ0J0WVhoWGFXUjBhQ3dnY21WMExBb0tDUWt2THlCVGRYQndiM0owT2lCR2FYSmxabTk0SURVeEt3b0pDUzh2SUZKbGRISnBaWFpwYm1jZ2MzUjViR1VnWW1WbWIzSmxJR052YlhCMWRHVmtJSE52YldWb2IzY0tDUWt2THlCbWFYaGxjeUJoYmlCcGMzTjFaU0IzYVhSb0lHZGxkSFJwYm1jZ2QzSnZibWNnZG1Gc2RXVnpDZ2tKTHk4Z2IyNGdaR1YwWVdOb1pXUWdaV3hsYldWdWRITUtDUWx6ZEhsc1pTQTlJR1ZzWlcwdWMzUjViR1U3Q2dvSlkyOXRjSFYwWldRZ1BTQmpiMjF3ZFhSbFpDQjhmQ0JuWlhSVGRIbHNaWE1vSUdWc1pXMGdLVHNLQ2drdkx5Qm5aWFJRY205d1pYSjBlVlpoYkhWbElHbHpJRzVsWldSbFpDQm1iM0k2Q2drdkx5QWdJQzVqYzNNb0oyWnBiSFJsY2ljcElDaEpSU0E1SUc5dWJIa3NJQ014TWpVek55a0tDUzh2SUNBZ0xtTnpjeWduTFMxamRYTjBiMjFRY205d1pYSjBlU2tnS0NNek1UUTBLUW9KYVdZZ0tDQmpiMjF3ZFhSbFpDQXBJSHNLQ1FseVpYUWdQU0JqYjIxd2RYUmxaQzVuWlhSUWNtOXdaWEowZVZaaGJIVmxLQ0J1WVcxbElDa2dmSHdnWTI5dGNIVjBaV1JiSUc1aGJXVWdYVHNLQ2drSmFXWWdLQ0J5WlhRZ1BUMDlJQ0lpSUNZbUlDRnFVWFZsY25rdVkyOXVkR0ZwYm5Nb0lHVnNaVzB1YjNkdVpYSkViMk4xYldWdWRDd2daV3hsYlNBcElDa2dld29KQ1FseVpYUWdQU0JxVVhWbGNua3VjM1I1YkdVb0lHVnNaVzBzSUc1aGJXVWdLVHNLQ1FsOUNnb0pDUzh2SUVFZ2RISnBZblYwWlNCMGJ5QjBhR1VnSW1GM1pYTnZiV1VnYUdGamF5QmllU0JFWldGdUlFVmtkMkZ5WkhNaUNna0pMeThnUVc1a2NtOXBaQ0JDY205M2MyVnlJSEpsZEhWeWJuTWdjR1Z5WTJWdWRHRm5aU0JtYjNJZ2MyOXRaU0IyWVd4MVpYTXNDZ2tKTHk4Z1luVjBJSGRwWkhSb0lITmxaVzF6SUhSdklHSmxJSEpsYkdsaFlteDVJSEJwZUdWc2N5NEtDUWt2THlCVWFHbHpJR2x6SUdGbllXbHVjM1FnZEdobElFTlRVMDlOSUdSeVlXWjBJSE53WldNNkNna0pMeThnYUhSMGNITTZMeTlrY21GbWRITXVZM056ZDJjdWIzSm5MMk56YzI5dEx5TnlaWE52YkhabFpDMTJZV3gxWlhNS0NRbHBaaUFvSUNGemRYQndiM0owTG5CcGVHVnNRbTk0VTNSNWJHVnpLQ2tnSmlZZ2NtNTFiVzV2Ym5CNExuUmxjM1FvSUhKbGRDQXBJQ1ltSUhKaWIzaFRkSGxzWlM1MFpYTjBLQ0J1WVcxbElDa2dLU0I3Q2dvSkNRa3ZMeUJTWlcxbGJXSmxjaUIwYUdVZ2IzSnBaMmx1WVd3Z2RtRnNkV1Z6Q2drSkNYZHBaSFJvSUQwZ2MzUjViR1V1ZDJsa2RHZzdDZ2tKQ1cxcGJsZHBaSFJvSUQwZ2MzUjViR1V1YldsdVYybGtkR2c3Q2drSkNXMWhlRmRwWkhSb0lEMGdjM1I1YkdVdWJXRjRWMmxrZEdnN0Nnb0pDUWt2THlCUWRYUWdhVzRnZEdobElHNWxkeUIyWVd4MVpYTWdkRzhnWjJWMElHRWdZMjl0Y0hWMFpXUWdkbUZzZFdVZ2IzVjBDZ2tKQ1hOMGVXeGxMbTFwYmxkcFpIUm9JRDBnYzNSNWJHVXViV0Y0VjJsa2RHZ2dQU0J6ZEhsc1pTNTNhV1IwYUNBOUlISmxkRHNLQ1FrSmNtVjBJRDBnWTI5dGNIVjBaV1F1ZDJsa2RHZzdDZ29KQ1Frdkx5QlNaWFpsY25RZ2RHaGxJR05vWVc1blpXUWdkbUZzZFdWekNna0pDWE4wZVd4bExuZHBaSFJvSUQwZ2QybGtkR2c3Q2drSkNYTjBlV3hsTG0xcGJsZHBaSFJvSUQwZ2JXbHVWMmxrZEdnN0Nna0pDWE4wZVd4bExtMWhlRmRwWkhSb0lEMGdiV0Y0VjJsa2RHZzdDZ2tKZlFvSmZRb0tDWEpsZEhWeWJpQnlaWFFnSVQwOUlIVnVaR1ZtYVc1bFpDQS9DZ29KQ1M4dklGTjFjSEJ2Y25RNklFbEZJRHc5T1NBdElERXhJRzl1YkhrS0NRa3ZMeUJKUlNCeVpYUjFjbTV6SUhwSmJtUmxlQ0IyWVd4MVpTQmhjeUJoYmlCcGJuUmxaMlZ5TGdvSkNYSmxkQ0FySUNJaUlEb0tDUWx5WlhRN0NuMEtDZ3BtZFc1amRHbHZiaUJoWkdSSFpYUkliMjlyU1dZb0lHTnZibVJwZEdsdmJrWnVMQ0JvYjI5clJtNGdLU0I3Q2dvSkx5OGdSR1ZtYVc1bElIUm9aU0JvYjI5ckxDQjNaU2RzYkNCamFHVmpheUJ2YmlCMGFHVWdabWx5YzNRZ2NuVnVJR2xtSUdsMEozTWdjbVZoYkd4NUlHNWxaV1JsWkM0S0NYSmxkSFZ5YmlCN0Nna0paMlYwT2lCbWRXNWpkR2x2YmlncElIc0tDUWtKYVdZZ0tDQmpiMjVrYVhScGIyNUdiaWdwSUNrZ2V3b0tDUWtKQ1M4dklFaHZiMnNnYm05MElHNWxaV1JsWkNBb2IzSWdhWFFuY3lCdWIzUWdjRzl6YzJsaWJHVWdkRzhnZFhObElHbDBJR1IxWlFvSkNRa0pMeThnZEc4Z2JXbHpjMmx1WnlCa1pYQmxibVJsYm1ONUtTd2djbVZ0YjNabElHbDBMZ29KQ1FrSlpHVnNaWFJsSUhSb2FYTXVaMlYwT3dvSkNRa0pjbVYwZFhKdU93b0pDUWw5Q2dvSkNRa3ZMeUJJYjI5cklHNWxaV1JsWkRzZ2NtVmtaV1pwYm1VZ2FYUWdjMjhnZEdoaGRDQjBhR1VnYzNWd2NHOXlkQ0IwWlhOMElHbHpJRzV2ZENCbGVHVmpkWFJsWkNCaFoyRnBiaTRLQ1FrSmNtVjBkWEp1SUNnZ2RHaHBjeTVuWlhRZ1BTQm9iMjlyUm00Z0tTNWhjSEJzZVNnZ2RHaHBjeXdnWVhKbmRXMWxiblJ6SUNrN0Nna0pmUW9KZlRzS2ZRb0tDblpoY2dvS0NTOHZJRk4zWVhCd1lXSnNaU0JwWmlCa2FYTndiR0Y1SUdseklHNXZibVVnYjNJZ2MzUmhjblJ6SUhkcGRHZ2dkR0ZpYkdVS0NTOHZJR1Y0WTJWd2RDQWlkR0ZpYkdVaUxDQWlkR0ZpYkdVdFkyVnNiQ0lzSUc5eUlDSjBZV0pzWlMxallYQjBhVzl1SWdvSkx5OGdVMlZsSUdobGNtVWdabTl5SUdScGMzQnNZWGtnZG1Gc2RXVnpPaUJvZEhSd2N6b3ZMMlJsZG1Wc2IzQmxjaTV0YjNwcGJHeGhMbTl5Wnk5bGJpMVZVeTlrYjJOekwwTlRVeTlrYVhOd2JHRjVDZ2x5WkdsemNHeGhlWE4zWVhBZ1BTQXZYaWh1YjI1bGZIUmhZbXhsS0Q4aExXTmJaV0ZkS1M0cktTOHNDZ2x5WTNWemRHOXRVSEp2Y0NBOUlDOWVMUzB2TEFvSlkzTnpVMmh2ZHlBOUlIc2djRzl6YVhScGIyNDZJQ0poWW5OdmJIVjBaU0lzSUhacGMybGlhV3hwZEhrNklDSm9hV1JrWlc0aUxDQmthWE53YkdGNU9pQWlZbXh2WTJzaUlIMHNDZ2xqYzNOT2IzSnRZV3hVY21GdWMyWnZjbTBnUFNCN0Nna0piR1YwZEdWeVUzQmhZMmx1WnpvZ0lqQWlMQW9KQ1dadmJuUlhaV2xuYUhRNklDSTBNREFpQ2dsOUxBb0tDV056YzFCeVpXWnBlR1Z6SUQwZ1d5QWlWMlZpYTJsMElpd2dJazF2ZWlJc0lDSnRjeUlnWFN3S0NXVnRjSFI1VTNSNWJHVWdQU0JrYjJOMWJXVnVkQzVqY21WaGRHVkZiR1Z0Wlc1MEtDQWlaR2wySWlBcExuTjBlV3hsT3dvS0x5OGdVbVYwZFhKdUlHRWdZM056SUhCeWIzQmxjblI1SUcxaGNIQmxaQ0IwYnlCaElIQnZkR1Z1ZEdsaGJHeDVJSFpsYm1SdmNpQndjbVZtYVhobFpDQndjbTl3WlhKMGVRcG1kVzVqZEdsdmJpQjJaVzVrYjNKUWNtOXdUbUZ0WlNnZ2JtRnRaU0FwSUhzS0Nna3ZMeUJUYUc5eWRHTjFkQ0JtYjNJZ2JtRnRaWE1nZEdoaGRDQmhjbVVnYm05MElIWmxibVJ2Y2lCd2NtVm1hWGhsWkFvSmFXWWdLQ0J1WVcxbElHbHVJR1Z0Y0hSNVUzUjViR1VnS1NCN0Nna0pjbVYwZFhKdUlHNWhiV1U3Q2dsOUNnb0pMeThnUTJobFkyc2dabTl5SUhabGJtUnZjaUJ3Y21WbWFYaGxaQ0J1WVcxbGN3b0pkbUZ5SUdOaGNFNWhiV1VnUFNCdVlXMWxXeUF3SUYwdWRHOVZjSEJsY2tOaGMyVW9LU0FySUc1aGJXVXVjMnhwWTJVb0lERWdLU3dLQ1FscElEMGdZM056VUhKbFptbDRaWE11YkdWdVozUm9Pd29LQ1hkb2FXeGxJQ2dnYVMwdElDa2dld29KQ1c1aGJXVWdQU0JqYzNOUWNtVm1hWGhsYzFzZ2FTQmRJQ3NnWTJGd1RtRnRaVHNLQ1FscFppQW9JRzVoYldVZ2FXNGdaVzF3ZEhsVGRIbHNaU0FwSUhzS0NRa0pjbVYwZFhKdUlHNWhiV1U3Q2drSmZRb0pmUXA5Q2dvdkx5QlNaWFIxY200Z1lTQndjbTl3WlhKMGVTQnRZWEJ3WldRZ1lXeHZibWNnZDJoaGRDQnFVWFZsY25rdVkzTnpVSEp2Y0hNZ2MzVm5aMlZ6ZEhNZ2IzSWdkRzhLTHk4Z1lTQjJaVzVrYjNJZ2NISmxabWw0WldRZ2NISnZjR1Z5ZEhrdUNtWjFibU4wYVc5dUlHWnBibUZzVUhKdmNFNWhiV1VvSUc1aGJXVWdLU0I3Q2dsMllYSWdjbVYwSUQwZ2FsRjFaWEo1TG1OemMxQnliM0J6V3lCdVlXMWxJRjA3Q2dscFppQW9JQ0Z5WlhRZ0tTQjdDZ2tKY21WMElEMGdhbEYxWlhKNUxtTnpjMUJ5YjNCeld5QnVZVzFsSUYwZ1BTQjJaVzVrYjNKUWNtOXdUbUZ0WlNnZ2JtRnRaU0FwSUh4OElHNWhiV1U3Q2dsOUNnbHlaWFIxY200Z2NtVjBPd3A5Q2dwbWRXNWpkR2x2YmlCelpYUlFiM05wZEdsMlpVNTFiV0psY2lnZ1pXeGxiU3dnZG1Gc2RXVXNJSE4xWW5SeVlXTjBJQ2tnZXdvS0NTOHZJRUZ1ZVNCeVpXeGhkR2wyWlNBb0t5OHRLU0IyWVd4MVpYTWdhR0YyWlNCaGJISmxZV1I1SUdKbFpXNEtDUzh2SUc1dmNtMWhiR2w2WldRZ1lYUWdkR2hwY3lCd2IybHVkQW9KZG1GeUlHMWhkR05vWlhNZ1BTQnlZM056VG5WdExtVjRaV01vSUhaaGJIVmxJQ2s3Q2dseVpYUjFjbTRnYldGMFkyaGxjeUEvQ2dvSkNTOHZJRWQxWVhKa0lHRm5ZV2x1YzNRZ2RXNWtaV1pwYm1Wa0lDSnpkV0owY21GamRDSXNJR1V1Wnk0c0lIZG9aVzRnZFhObFpDQmhjeUJwYmlCamMzTkliMjlyY3dvSkNVMWhkR2d1YldGNEtDQXdMQ0J0WVhSamFHVnpXeUF5SUYwZ0xTQW9JSE4xWW5SeVlXTjBJSHg4SURBZ0tTQXBJQ3NnS0NCdFlYUmphR1Z6V3lBeklGMGdmSHdnSW5CNElpQXBJRG9LQ1FsMllXeDFaVHNLZlFvS1puVnVZM1JwYjI0Z1ltOTRUVzlrWld4QlpHcDFjM1J0Wlc1MEtDQmxiR1Z0TENCa2FXMWxibk5wYjI0c0lHSnZlQ3dnYVhOQ2IzSmtaWEpDYjNnc0lITjBlV3hsY3l3Z1kyOXRjSFYwWldSV1lXd2dLU0I3Q2dsMllYSWdhU0E5SUdScGJXVnVjMmx2YmlBOVBUMGdJbmRwWkhSb0lpQS9JREVnT2lBd0xBb0pDV1Y0ZEhKaElEMGdNQ3dLQ1Fsa1pXeDBZU0E5SURBN0Nnb0pMeThnUVdScWRYTjBiV1Z1ZENCdFlYa2dibTkwSUdKbElHNWxZMlZ6YzJGeWVRb0phV1lnS0NCaWIzZ2dQVDA5SUNnZ2FYTkNiM0prWlhKQ2IzZ2dQeUFpWW05eVpHVnlJaUE2SUNKamIyNTBaVzUwSWlBcElDa2dld29KQ1hKbGRIVnliaUF3T3dvSmZRb0tDV1p2Y2lBb0lEc2dhU0E4SURRN0lHa2dLejBnTWlBcElIc0tDZ2tKTHk4Z1FtOTBhQ0JpYjNnZ2JXOWtaV3h6SUdWNFkyeDFaR1VnYldGeVoybHVDZ2tKYVdZZ0tDQmliM2dnUFQwOUlDSnRZWEpuYVc0aUlDa2dld29KQ1Fsa1pXeDBZU0FyUFNCcVVYVmxjbmt1WTNOektDQmxiR1Z0TENCaWIzZ2dLeUJqYzNORmVIQmhibVJiSUdrZ1hTd2dkSEoxWlN3Z2MzUjViR1Z6SUNrN0Nna0pmUW9LQ1Frdkx5QkpaaUIzWlNCblpYUWdhR1Z5WlNCM2FYUm9JR0VnWTI5dWRHVnVkQzFpYjNnc0lIZGxKM0psSUhObFpXdHBibWNnSW5CaFpHUnBibWNpSUc5eUlDSmliM0prWlhJaUlHOXlJQ0p0WVhKbmFXNGlDZ2tKYVdZZ0tDQWhhWE5DYjNKa1pYSkNiM2dnS1NCN0Nnb0pDUWt2THlCQlpHUWdjR0ZrWkdsdVp3b0pDUWxrWld4MFlTQXJQU0JxVVhWbGNua3VZM056S0NCbGJHVnRMQ0FpY0dGa1pHbHVaeUlnS3lCamMzTkZlSEJoYm1SYklHa2dYU3dnZEhKMVpTd2djM1I1YkdWeklDazdDZ29KQ1Frdkx5QkdiM0lnSW1KdmNtUmxjaUlnYjNJZ0ltMWhjbWRwYmlJc0lHRmtaQ0JpYjNKa1pYSUtDUWtKYVdZZ0tDQmliM2dnSVQwOUlDSndZV1JrYVc1bklpQXBJSHNLQ1FrSkNXUmxiSFJoSUNzOUlHcFJkV1Z5ZVM1amMzTW9JR1ZzWlcwc0lDSmliM0prWlhJaUlDc2dZM056Ulhod1lXNWtXeUJwSUYwZ0t5QWlWMmxrZEdnaUxDQjBjblZsTENCemRIbHNaWE1nS1RzS0Nna0pDUzh2SUVKMWRDQnpkR2xzYkNCclpXVndJSFJ5WVdOcklHOW1JR2wwSUc5MGFHVnlkMmx6WlFvSkNRbDlJR1ZzYzJVZ2V3b0pDUWtKWlhoMGNtRWdLejBnYWxGMVpYSjVMbU56Y3lnZ1pXeGxiU3dnSW1KdmNtUmxjaUlnS3lCamMzTkZlSEJoYm1SYklHa2dYU0FySUNKWGFXUjBhQ0lzSUhSeWRXVXNJSE4wZVd4bGN5QXBPd29KQ1FsOUNnb0pDUzh2SUVsbUlIZGxJR2RsZENCb1pYSmxJSGRwZEdnZ1lTQmliM0prWlhJdFltOTRJQ2hqYjI1MFpXNTBJQ3NnY0dGa1pHbHVaeUFySUdKdmNtUmxjaWtzSUhkbEozSmxJSE5sWld0cGJtY2dJbU52Ym5SbGJuUWlJRzl5Q2drSkx5OGdJbkJoWkdScGJtY2lJRzl5SUNKdFlYSm5hVzRpQ2drSmZTQmxiSE5sSUhzS0Nna0pDUzh2SUVadmNpQWlZMjl1ZEdWdWRDSXNJSE4xWW5SeVlXTjBJSEJoWkdScGJtY0tDUWtKYVdZZ0tDQmliM2dnUFQwOUlDSmpiMjUwWlc1MElpQXBJSHNLQ1FrSkNXUmxiSFJoSUMwOUlHcFJkV1Z5ZVM1amMzTW9JR1ZzWlcwc0lDSndZV1JrYVc1bklpQXJJR056YzBWNGNHRnVaRnNnYVNCZExDQjBjblZsTENCemRIbHNaWE1nS1RzS0NRa0pmUW9LQ1FrSkx5OGdSbTl5SUNKamIyNTBaVzUwSWlCdmNpQWljR0ZrWkdsdVp5SXNJSE4xWW5SeVlXTjBJR0p2Y21SbGNnb0pDUWxwWmlBb0lHSnZlQ0FoUFQwZ0ltMWhjbWRwYmlJZ0tTQjdDZ2tKQ1Fsa1pXeDBZU0F0UFNCcVVYVmxjbmt1WTNOektDQmxiR1Z0TENBaVltOXlaR1Z5SWlBcklHTnpjMFY0Y0dGdVpGc2dhU0JkSUNzZ0lsZHBaSFJvSWl3Z2RISjFaU3dnYzNSNWJHVnpJQ2s3Q2drSkNYMEtDUWw5Q2dsOUNnb0pMeThnUVdOamIzVnVkQ0JtYjNJZ2NHOXphWFJwZG1VZ1kyOXVkR1Z1ZEMxaWIzZ2djMk55YjJ4c0lHZDFkSFJsY2lCM2FHVnVJSEpsY1hWbGMzUmxaQ0JpZVNCd2NtOTJhV1JwYm1jZ1kyOXRjSFYwWldSV1lXd0tDV2xtSUNnZ0lXbHpRbTl5WkdWeVFtOTRJQ1ltSUdOdmJYQjFkR1ZrVm1Gc0lENDlJREFnS1NCN0Nnb0pDUzh2SUc5bVpuTmxkRmRwWkhSb0wyOW1abk5sZEVobGFXZG9kQ0JwY3lCaElISnZkVzVrWldRZ2MzVnRJRzltSUdOdmJuUmxiblFzSUhCaFpHUnBibWNzSUhOamNtOXNiQ0JuZFhSMFpYSXNJR0Z1WkNCaWIzSmtaWElLQ1Frdkx5QkJjM04xYldsdVp5QnBiblJsWjJWeUlITmpjbTlzYkNCbmRYUjBaWElzSUhOMVluUnlZV04wSUhSb1pTQnlaWE4wSUdGdVpDQnliM1Z1WkNCa2IzZHVDZ2tKWkdWc2RHRWdLejBnVFdGMGFDNXRZWGdvSURBc0lFMWhkR2d1WTJWcGJDZ0tDUWtKWld4bGJWc2dJbTltWm5ObGRDSWdLeUJrYVcxbGJuTnBiMjViSURBZ1hTNTBiMVZ3Y0dWeVEyRnpaU2dwSUNzZ1pHbHRaVzV6YVc5dUxuTnNhV05sS0NBeElDa2dYU0F0Q2drSkNXTnZiWEIxZEdWa1ZtRnNJQzBLQ1FrSlpHVnNkR0VnTFFvSkNRbGxlSFJ5WVNBdENna0pDVEF1TlFvSkNTa2dLVHNLQ1gwS0NnbHlaWFIxY200Z1pHVnNkR0U3Q24wS0NtWjFibU4wYVc5dUlHZGxkRmRwWkhSb1QzSklaV2xuYUhRb0lHVnNaVzBzSUdScGJXVnVjMmx2Yml3Z1pYaDBjbUVnS1NCN0Nnb0pMeThnVTNSaGNuUWdkMmwwYUNCamIyMXdkWFJsWkNCemRIbHNaUW9KZG1GeUlITjBlV3hsY3lBOUlHZGxkRk4wZVd4bGN5Z2daV3hsYlNBcExBb0pDWFpoYkNBOUlHTjFja05UVXlnZ1pXeGxiU3dnWkdsdFpXNXphVzl1TENCemRIbHNaWE1nS1N3S0NRbHBjMEp2Y21SbGNrSnZlQ0E5SUdwUmRXVnllUzVqYzNNb0lHVnNaVzBzSUNKaWIzaFRhWHBwYm1jaUxDQm1ZV3h6WlN3Z2MzUjViR1Z6SUNrZ1BUMDlJQ0ppYjNKa1pYSXRZbTk0SWl3S0NRbDJZV3gxWlVselFtOXlaR1Z5UW05NElEMGdhWE5DYjNKa1pYSkNiM2c3Q2dvSkx5OGdVM1Z3Y0c5eWREb2dSbWx5WldadmVDQThQVFUwQ2drdkx5QlNaWFIxY200Z1lTQmpiMjVtYjNWdVpHbHVaeUJ1YjI0dGNHbDRaV3dnZG1Gc2RXVWdiM0lnWm1WcFoyNGdhV2R1YjNKaGJtTmxMQ0JoY3lCaGNIQnliM0J5YVdGMFpTNEtDV2xtSUNnZ2NtNTFiVzV2Ym5CNExuUmxjM1FvSUhaaGJDQXBJQ2tnZXdvSkNXbG1JQ2dnSVdWNGRISmhJQ2tnZXdvSkNRbHlaWFIxY200Z2RtRnNPd29KQ1gwS0NRbDJZV3dnUFNBaVlYVjBieUk3Q2dsOUNnb0pMeThnUTJobFkyc2dabTl5SUhOMGVXeGxJR2x1SUdOaGMyVWdZU0JpY205M2MyVnlJSGRvYVdOb0lISmxkSFZ5Ym5NZ2RXNXlaV3hwWVdKc1pTQjJZV3gxWlhNS0NTOHZJR1p2Y2lCblpYUkRiMjF3ZFhSbFpGTjBlV3hsSUhOcGJHVnVkR3g1SUdaaGJHeHpJR0poWTJzZ2RHOGdkR2hsSUhKbGJHbGhZbXhsSUdWc1pXMHVjM1I1YkdVS0NYWmhiSFZsU1hOQ2IzSmtaWEpDYjNnZ1BTQjJZV3gxWlVselFtOXlaR1Z5UW05NElDWW1DZ2tKS0NCemRYQndiM0owTG1KdmVGTnBlbWx1WjFKbGJHbGhZbXhsS0NrZ2ZId2dkbUZzSUQwOVBTQmxiR1Z0TG5OMGVXeGxXeUJrYVcxbGJuTnBiMjRnWFNBcE93b0tDUzh2SUVaaGJHd2dZbUZqYXlCMGJ5QnZabVp6WlhSWGFXUjBhQzl2Wm1aelpYUklaV2xuYUhRZ2QyaGxiaUIyWVd4MVpTQnBjeUFpWVhWMGJ5SUtDUzh2SUZSb2FYTWdhR0Z3Y0dWdWN5Qm1iM0lnYVc1c2FXNWxJR1ZzWlcxbGJuUnpJSGRwZEdnZ2JtOGdaWGh3YkdsamFYUWdjMlYwZEdsdVp5QW9aMmd0TXpVM01Ta0tDUzh2SUZOMWNIQnZjblE2SUVGdVpISnZhV1FnUEQwMExqRWdMU0EwTGpNZ2IyNXNlUW9KTHk4Z1FXeHpieUIxYzJVZ2IyWm1jMlYwVjJsa2RHZ3ZiMlptYzJWMFNHVnBaMmgwSUdadmNpQnRhWE55WlhCdmNuUmxaQ0JwYm14cGJtVWdaR2x0Wlc1emFXOXVjeUFvWjJndE16WXdNaWtLQ1dsbUlDZ2dkbUZzSUQwOVBTQWlZWFYwYnlJZ2ZId0tDUWtoY0dGeWMyVkdiRzloZENnZ2RtRnNJQ2tnSmlZZ2FsRjFaWEo1TG1OemN5Z2daV3hsYlN3Z0ltUnBjM0JzWVhraUxDQm1ZV3h6WlN3Z2MzUjViR1Z6SUNrZ1BUMDlJQ0pwYm14cGJtVWlJQ2tnZXdvS0NRbDJZV3dnUFNCbGJHVnRXeUFpYjJabWMyVjBJaUFySUdScGJXVnVjMmx2YmxzZ01DQmRMblJ2VlhCd1pYSkRZWE5sS0NrZ0t5QmthVzFsYm5OcGIyNHVjMnhwWTJVb0lERWdLU0JkT3dvS0NRa3ZMeUJ2Wm1aelpYUlhhV1IwYUM5dlptWnpaWFJJWldsbmFIUWdjSEp2ZG1sa1pTQmliM0prWlhJdFltOTRJSFpoYkhWbGN3b0pDWFpoYkhWbFNYTkNiM0prWlhKQ2IzZ2dQU0IwY25WbE93b0pmUW9LQ1M4dklFNXZjbTFoYkdsNlpTQWlJaUJoYm1RZ1lYVjBid29KZG1Gc0lEMGdjR0Z5YzJWR2JHOWhkQ2dnZG1Gc0lDa2dmSHdnTURzS0Nna3ZMeUJCWkdwMWMzUWdabTl5SUhSb1pTQmxiR1Z0Wlc1MEozTWdZbTk0SUcxdlpHVnNDZ2x5WlhSMWNtNGdLQ0IyWVd3Z0t3b0pDV0p2ZUUxdlpHVnNRV1JxZFhOMGJXVnVkQ2dLQ1FrSlpXeGxiU3dLQ1FrSlpHbHRaVzV6YVc5dUxBb0pDUWxsZUhSeVlTQjhmQ0FvSUdselFtOXlaR1Z5UW05NElEOGdJbUp2Y21SbGNpSWdPaUFpWTI5dWRHVnVkQ0lnS1N3S0NRa0pkbUZzZFdWSmMwSnZjbVJsY2tKdmVDd0tDUWtKYzNSNWJHVnpMQW9LQ1FrSkx5OGdVSEp2ZG1sa1pTQjBhR1VnWTNWeWNtVnVkQ0JqYjIxd2RYUmxaQ0J6YVhwbElIUnZJSEpsY1hWbGMzUWdjMk55YjJ4c0lHZDFkSFJsY2lCallXeGpkV3hoZEdsdmJpQW9aMmd0TXpVNE9Ta0tDUWtKZG1Gc0Nna0pLUW9KS1NBcklDSndlQ0k3Q24wS0NtcFJkV1Z5ZVM1bGVIUmxibVFvSUhzS0Nna3ZMeUJCWkdRZ2FXNGdjM1I1YkdVZ2NISnZjR1Z5ZEhrZ2FHOXZhM01nWm05eUlHOTJaWEp5YVdScGJtY2dkR2hsSUdSbFptRjFiSFFLQ1M4dklHSmxhR0YyYVc5eUlHOW1JR2RsZEhScGJtY2dZVzVrSUhObGRIUnBibWNnWVNCemRIbHNaU0J3Y205d1pYSjBlUW9KWTNOelNHOXZhM002SUhzS0NRbHZjR0ZqYVhSNU9pQjdDZ2tKQ1dkbGREb2dablZ1WTNScGIyNG9JR1ZzWlcwc0lHTnZiWEIxZEdWa0lDa2dld29KQ1FrSmFXWWdLQ0JqYjIxd2RYUmxaQ0FwSUhzS0Nna0pDUWtKTHk4Z1YyVWdjMmh2ZFd4a0lHRnNkMkY1Y3lCblpYUWdZU0J1ZFcxaVpYSWdZbUZqYXlCbWNtOXRJRzl3WVdOcGRIa0tDUWtKQ1FsMllYSWdjbVYwSUQwZ1kzVnlRMU5US0NCbGJHVnRMQ0FpYjNCaFkybDBlU0lnS1RzS0NRa0pDUWx5WlhSMWNtNGdjbVYwSUQwOVBTQWlJaUEvSUNJeElpQTZJSEpsZERzS0NRa0pDWDBLQ1FrSmZRb0pDWDBLQ1gwc0Nnb0pMeThnUkc5dUozUWdZWFYwYjIxaGRHbGpZV3hzZVNCaFpHUWdJbkI0SWlCMGJ5QjBhR1Z6WlNCd2IzTnphV0pzZVMxMWJtbDBiR1Z6Y3lCd2NtOXdaWEowYVdWekNnbGpjM05PZFcxaVpYSTZJSHNLQ1FraVlXNXBiV0YwYVc5dVNYUmxjbUYwYVc5dVEyOTFiblFpT2lCMGNuVmxMQW9KQ1NKamIyeDFiVzVEYjNWdWRDSTZJSFJ5ZFdVc0Nna0pJbVpwYkd4UGNHRmphWFI1SWpvZ2RISjFaU3dLQ1FraVpteGxlRWR5YjNjaU9pQjBjblZsTEFvSkNTSm1iR1Y0VTJoeWFXNXJJam9nZEhKMVpTd0tDUWtpWm05dWRGZGxhV2RvZENJNklIUnlkV1VzQ2drSklteHBibVZJWldsbmFIUWlPaUIwY25WbExBb0pDU0p2Y0dGamFYUjVJam9nZEhKMVpTd0tDUWtpYjNKa1pYSWlPaUIwY25WbExBb0pDU0p2Y25Cb1lXNXpJam9nZEhKMVpTd0tDUWtpZDJsa2IzZHpJam9nZEhKMVpTd0tDUWtpZWtsdVpHVjRJam9nZEhKMVpTd0tDUWtpZW05dmJTSTZJSFJ5ZFdVS0NYMHNDZ29KTHk4Z1FXUmtJR2x1SUhCeWIzQmxjblJwWlhNZ2QyaHZjMlVnYm1GdFpYTWdlVzkxSUhkcGMyZ2dkRzhnWm1sNElHSmxabTl5WlFvSkx5OGdjMlYwZEdsdVp5QnZjaUJuWlhSMGFXNW5JSFJvWlNCMllXeDFaUW9KWTNOelVISnZjSE02SUh0OUxBb0tDUzh2SUVkbGRDQmhibVFnYzJWMElIUm9aU0J6ZEhsc1pTQndjbTl3WlhKMGVTQnZiaUJoSUVSUFRTQk9iMlJsQ2dsemRIbHNaVG9nWm5WdVkzUnBiMjRvSUdWc1pXMHNJRzVoYldVc0lIWmhiSFZsTENCbGVIUnlZU0FwSUhzS0Nna0pMeThnUkc5dUozUWdjMlYwSUhOMGVXeGxjeUJ2YmlCMFpYaDBJR0Z1WkNCamIyMXRaVzUwSUc1dlpHVnpDZ2tKYVdZZ0tDQWhaV3hsYlNCOGZDQmxiR1Z0TG01dlpHVlVlWEJsSUQwOVBTQXpJSHg4SUdWc1pXMHVibTlrWlZSNWNHVWdQVDA5SURnZ2ZId2dJV1ZzWlcwdWMzUjViR1VnS1NCN0Nna0pDWEpsZEhWeWJqc0tDUWw5Q2dvSkNTOHZJRTFoYTJVZ2MzVnlaU0IwYUdGMElIZGxKM0psSUhkdmNtdHBibWNnZDJsMGFDQjBhR1VnY21sbmFIUWdibUZ0WlFvSkNYWmhjaUJ5WlhRc0lIUjVjR1VzSUdodmIydHpMQW9KQ1FsdmNtbG5UbUZ0WlNBOUlHTmhiV1ZzUTJGelpTZ2dibUZ0WlNBcExBb0pDUWxwYzBOMWMzUnZiVkJ5YjNBZ1BTQnlZM1Z6ZEc5dFVISnZjQzUwWlhOMEtDQnVZVzFsSUNrc0Nna0pDWE4wZVd4bElEMGdaV3hsYlM1emRIbHNaVHNLQ2drSkx5OGdUV0ZyWlNCemRYSmxJSFJvWVhRZ2QyVW5jbVVnZDI5eWEybHVaeUIzYVhSb0lIUm9aU0J5YVdkb2RDQnVZVzFsTGlCWFpTQmtiMjRuZEFvSkNTOHZJSGRoYm5RZ2RHOGdjWFZsY25rZ2RHaGxJSFpoYkhWbElHbG1JR2wwSUdseklHRWdRMU5USUdOMWMzUnZiU0J3Y205d1pYSjBlUW9KQ1M4dklITnBibU5sSUhSb1pYa2dZWEpsSUhWelpYSXRaR1ZtYVc1bFpDNEtDUWxwWmlBb0lDRnBjME4xYzNSdmJWQnliM0FnS1NCN0Nna0pDVzVoYldVZ1BTQm1hVzVoYkZCeWIzQk9ZVzFsS0NCdmNtbG5UbUZ0WlNBcE93b0pDWDBLQ2drSkx5OGdSMlYwY3lCb2IyOXJJR1p2Y2lCMGFHVWdjSEpsWm1sNFpXUWdkbVZ5YzJsdmJpd2dkR2hsYmlCMWJuQnlaV1pwZUdWa0lIWmxjbk5wYjI0S0NRbG9iMjlyY3lBOUlHcFJkV1Z5ZVM1amMzTkliMjlyYzFzZ2JtRnRaU0JkSUh4OElHcFJkV1Z5ZVM1amMzTkliMjlyYzFzZ2IzSnBaMDVoYldVZ1hUc0tDZ2tKTHk4Z1EyaGxZMnNnYVdZZ2QyVW5jbVVnYzJWMGRHbHVaeUJoSUhaaGJIVmxDZ2tKYVdZZ0tDQjJZV3gxWlNBaFBUMGdkVzVrWldacGJtVmtJQ2tnZXdvSkNRbDBlWEJsSUQwZ2RIbHdaVzltSUhaaGJIVmxPd29LQ1FrSkx5OGdRMjl1ZG1WeWRDQWlLejBpSUc5eUlDSXRQU0lnZEc4Z2NtVnNZWFJwZG1VZ2JuVnRZbVZ5Y3lBb0l6Y3pORFVwQ2drSkNXbG1JQ2dnZEhsd1pTQTlQVDBnSW5OMGNtbHVaeUlnSmlZZ0tDQnlaWFFnUFNCeVkzTnpUblZ0TG1WNFpXTW9JSFpoYkhWbElDa2dLU0FtSmlCeVpYUmJJREVnWFNBcElIc0tDUWtKQ1haaGJIVmxJRDBnWVdScWRYTjBRMU5US0NCbGJHVnRMQ0J1WVcxbExDQnlaWFFnS1RzS0Nna0pDUWt2THlCR2FYaGxjeUJpZFdjZ0l6a3lNemNLQ1FrSkNYUjVjR1VnUFNBaWJuVnRZbVZ5SWpzS0NRa0pmUW9LQ1FrSkx5OGdUV0ZyWlNCemRYSmxJSFJvWVhRZ2JuVnNiQ0JoYm1RZ1RtRk9JSFpoYkhWbGN5QmhjbVZ1SjNRZ2MyVjBJQ2dqTnpFeE5pa0tDUWtKYVdZZ0tDQjJZV3gxWlNBOVBTQnVkV3hzSUh4OElIWmhiSFZsSUNFOVBTQjJZV3gxWlNBcElIc0tDUWtKQ1hKbGRIVnlianNLQ1FrSmZRb0tDUWtKTHk4Z1NXWWdZU0J1ZFcxaVpYSWdkMkZ6SUhCaGMzTmxaQ0JwYml3Z1lXUmtJSFJvWlNCMWJtbDBJQ2hsZUdObGNIUWdabTl5SUdObGNuUmhhVzRnUTFOVElIQnliM0JsY25ScFpYTXBDZ2tKQ1dsbUlDZ2dkSGx3WlNBOVBUMGdJbTUxYldKbGNpSWdLU0I3Q2drSkNRbDJZV3gxWlNBclBTQnlaWFFnSmlZZ2NtVjBXeUF6SUYwZ2ZId2dLQ0JxVVhWbGNua3VZM056VG5WdFltVnlXeUJ2Y21sblRtRnRaU0JkSUQ4Z0lpSWdPaUFpY0hnaUlDazdDZ2tKQ1gwS0Nna0pDUzh2SUdKaFkydG5jbTkxYm1RdEtpQndjbTl3Y3lCaFptWmxZM1FnYjNKcFoybHVZV3dnWTJ4dmJtVW5jeUIyWVd4MVpYTUtDUWtKYVdZZ0tDQWhjM1Z3Y0c5eWRDNWpiR1ZoY2tOc2IyNWxVM1I1YkdVZ0ppWWdkbUZzZFdVZ1BUMDlJQ0lpSUNZbUlHNWhiV1V1YVc1a1pYaFBaaWdnSW1KaFkydG5jbTkxYm1RaUlDa2dQVDA5SURBZ0tTQjdDZ2tKQ1FsemRIbHNaVnNnYm1GdFpTQmRJRDBnSW1sdWFHVnlhWFFpT3dvSkNRbDlDZ29KQ1Frdkx5QkpaaUJoSUdodmIyc2dkMkZ6SUhCeWIzWnBaR1ZrTENCMWMyVWdkR2hoZENCMllXeDFaU3dnYjNSb1pYSjNhWE5sSUdwMWMzUWdjMlYwSUhSb1pTQnpjR1ZqYVdacFpXUWdkbUZzZFdVS0NRa0phV1lnS0NBaGFHOXZhM01nZkh3Z0lTZ2dJbk5sZENJZ2FXNGdhRzl2YTNNZ0tTQjhmQW9KQ1FrSktDQjJZV3gxWlNBOUlHaHZiMnR6TG5ObGRDZ2daV3hsYlN3Z2RtRnNkV1VzSUdWNGRISmhJQ2tnS1NBaFBUMGdkVzVrWldacGJtVmtJQ2tnZXdvS0NRa0pDV2xtSUNnZ2FYTkRkWE4wYjIxUWNtOXdJQ2tnZXdvSkNRa0pDWE4wZVd4bExuTmxkRkJ5YjNCbGNuUjVLQ0J1WVcxbExDQjJZV3gxWlNBcE93b0pDUWtKZlNCbGJITmxJSHNLQ1FrSkNRbHpkSGxzWlZzZ2JtRnRaU0JkSUQwZ2RtRnNkV1U3Q2drSkNRbDlDZ2tKQ1gwS0Nna0pmU0JsYkhObElIc0tDZ2tKQ1M4dklFbG1JR0VnYUc5dmF5QjNZWE1nY0hKdmRtbGtaV1FnWjJWMElIUm9aU0J1YjI0dFkyOXRjSFYwWldRZ2RtRnNkV1VnWm5KdmJTQjBhR1Z5WlFvSkNRbHBaaUFvSUdodmIydHpJQ1ltSUNKblpYUWlJR2x1SUdodmIydHpJQ1ltQ2drSkNRa29JSEpsZENBOUlHaHZiMnR6TG1kbGRDZ2daV3hsYlN3Z1ptRnNjMlVzSUdWNGRISmhJQ2tnS1NBaFBUMGdkVzVrWldacGJtVmtJQ2tnZXdvS0NRa0pDWEpsZEhWeWJpQnlaWFE3Q2drSkNYMEtDZ2tKQ1M4dklFOTBhR1Z5ZDJselpTQnFkWE4wSUdkbGRDQjBhR1VnZG1Gc2RXVWdabkp2YlNCMGFHVWdjM1I1YkdVZ2IySnFaV04wQ2drSkNYSmxkSFZ5YmlCemRIbHNaVnNnYm1GdFpTQmRPd29KQ1gwS0NYMHNDZ29KWTNOek9pQm1kVzVqZEdsdmJpZ2daV3hsYlN3Z2JtRnRaU3dnWlhoMGNtRXNJSE4wZVd4bGN5QXBJSHNLQ1FsMllYSWdkbUZzTENCdWRXMHNJR2h2YjJ0ekxBb0pDUWx2Y21sblRtRnRaU0E5SUdOaGJXVnNRMkZ6WlNnZ2JtRnRaU0FwTEFvSkNRbHBjME4xYzNSdmJWQnliM0FnUFNCeVkzVnpkRzl0VUhKdmNDNTBaWE4wS0NCdVlXMWxJQ2s3Q2dvSkNTOHZJRTFoYTJVZ2MzVnlaU0IwYUdGMElIZGxKM0psSUhkdmNtdHBibWNnZDJsMGFDQjBhR1VnY21sbmFIUWdibUZ0WlM0Z1YyVWdaRzl1SjNRS0NRa3ZMeUIzWVc1MElIUnZJRzF2WkdsbWVTQjBhR1VnZG1Gc2RXVWdhV1lnYVhRZ2FYTWdZU0JEVTFNZ1kzVnpkRzl0SUhCeWIzQmxjblI1Q2drSkx5OGdjMmx1WTJVZ2RHaGxlU0JoY21VZ2RYTmxjaTFrWldacGJtVmtMZ29KQ1dsbUlDZ2dJV2x6UTNWemRHOXRVSEp2Y0NBcElIc0tDUWtKYm1GdFpTQTlJR1pwYm1Gc1VISnZjRTVoYldVb0lHOXlhV2RPWVcxbElDazdDZ2tKZlFvS0NRa3ZMeUJVY25rZ2NISmxabWw0WldRZ2JtRnRaU0JtYjJ4c2IzZGxaQ0JpZVNCMGFHVWdkVzV3Y21WbWFYaGxaQ0J1WVcxbENna0phRzl2YTNNZ1BTQnFVWFZsY25rdVkzTnpTRzl2YTNOYklHNWhiV1VnWFNCOGZDQnFVWFZsY25rdVkzTnpTRzl2YTNOYklHOXlhV2RPWVcxbElGMDdDZ29KQ1M4dklFbG1JR0VnYUc5dmF5QjNZWE1nY0hKdmRtbGtaV1FnWjJWMElIUm9aU0JqYjIxd2RYUmxaQ0IyWVd4MVpTQm1jbTl0SUhSb1pYSmxDZ2tKYVdZZ0tDQm9iMjlyY3lBbUppQWlaMlYwSWlCcGJpQm9iMjlyY3lBcElIc0tDUWtKZG1Gc0lEMGdhRzl2YTNNdVoyVjBLQ0JsYkdWdExDQjBjblZsTENCbGVIUnlZU0FwT3dvSkNYMEtDZ2tKTHk4Z1QzUm9aWEozYVhObExDQnBaaUJoSUhkaGVTQjBieUJuWlhRZ2RHaGxJR052YlhCMWRHVmtJSFpoYkhWbElHVjRhWE4wY3l3Z2RYTmxJSFJvWVhRS0NRbHBaaUFvSUhaaGJDQTlQVDBnZFc1a1pXWnBibVZrSUNrZ2V3b0pDUWwyWVd3Z1BTQmpkWEpEVTFNb0lHVnNaVzBzSUc1aGJXVXNJSE4wZVd4bGN5QXBPd29KQ1gwS0Nna0pMeThnUTI5dWRtVnlkQ0FpYm05eWJXRnNJaUIwYnlCamIyMXdkWFJsWkNCMllXeDFaUW9KQ1dsbUlDZ2dkbUZzSUQwOVBTQWlibTl5YldGc0lpQW1KaUJ1WVcxbElHbHVJR056YzA1dmNtMWhiRlJ5WVc1elptOXliU0FwSUhzS0NRa0pkbUZzSUQwZ1kzTnpUbTl5YldGc1ZISmhibk5tYjNKdFd5QnVZVzFsSUYwN0Nna0pmUW9LQ1Frdkx5Qk5ZV3RsSUc1MWJXVnlhV01nYVdZZ1ptOXlZMlZrSUc5eUlHRWdjWFZoYkdsbWFXVnlJSGRoY3lCd2NtOTJhV1JsWkNCaGJtUWdkbUZzSUd4dmIydHpJRzUxYldWeWFXTUtDUWxwWmlBb0lHVjRkSEpoSUQwOVBTQWlJaUI4ZkNCbGVIUnlZU0FwSUhzS0NRa0piblZ0SUQwZ2NHRnljMlZHYkc5aGRDZ2dkbUZzSUNrN0Nna0pDWEpsZEhWeWJpQmxlSFJ5WVNBOVBUMGdkSEoxWlNCOGZDQnBjMFpwYm1sMFpTZ2diblZ0SUNrZ1B5QnVkVzBnZkh3Z01DQTZJSFpoYkRzS0NRbDlDZ29KQ1hKbGRIVnliaUIyWVd3N0NnbDlDbjBnS1RzS0NtcFJkV1Z5ZVM1bFlXTm9LQ0JiSUNKb1pXbG5hSFFpTENBaWQybGtkR2dpSUYwc0lHWjFibU4wYVc5dUtDQnBMQ0JrYVcxbGJuTnBiMjRnS1NCN0NnbHFVWFZsY25rdVkzTnpTRzl2YTNOYklHUnBiV1Z1YzJsdmJpQmRJRDBnZXdvSkNXZGxkRG9nWm5WdVkzUnBiMjRvSUdWc1pXMHNJR052YlhCMWRHVmtMQ0JsZUhSeVlTQXBJSHNLQ1FrSmFXWWdLQ0JqYjIxd2RYUmxaQ0FwSUhzS0Nna0pDUWt2THlCRFpYSjBZV2x1SUdWc1pXMWxiblJ6SUdOaGJpQm9ZWFpsSUdScGJXVnVjMmx2YmlCcGJtWnZJR2xtSUhkbElHbHVkbWx6YVdKc2VTQnphRzkzSUhSb1pXMEtDUWtKQ1M4dklHSjFkQ0JwZENCdGRYTjBJR2hoZG1VZ1lTQmpkWEp5Wlc1MElHUnBjM0JzWVhrZ2MzUjViR1VnZEdoaGRDQjNiM1ZzWkNCaVpXNWxabWwwQ2drSkNRbHlaWFIxY200Z2NtUnBjM0JzWVhsemQyRndMblJsYzNRb0lHcFJkV1Z5ZVM1amMzTW9JR1ZzWlcwc0lDSmthWE53YkdGNUlpQXBJQ2tnSmlZS0Nna0pDUWtKTHk4Z1UzVndjRzl5ZERvZ1UyRm1ZWEpwSURnckNna0pDUWtKTHk4Z1ZHRmliR1VnWTI5c2RXMXVjeUJwYmlCVFlXWmhjbWtnYUdGMlpTQnViMjR0ZW1WeWJ5QnZabVp6WlhSWGFXUjBhQ0FtSUhwbGNtOEtDUWtKQ1Frdkx5Qm5aWFJDYjNWdVpHbHVaME5zYVdWdWRGSmxZM1FvS1M1M2FXUjBhQ0IxYm14bGMzTWdaR2x6Y0d4aGVTQnBjeUJqYUdGdVoyVmtMZ29KQ1FrSkNTOHZJRk4xY0hCdmNuUTZJRWxGSUR3OU1URWdiMjVzZVFvSkNRa0pDUzh2SUZKMWJtNXBibWNnWjJWMFFtOTFibVJwYm1kRGJHbGxiblJTWldOMElHOXVJR0VnWkdselkyOXVibVZqZEdWa0lHNXZaR1VLQ1FrSkNRa3ZMeUJwYmlCSlJTQjBhSEp2ZDNNZ1lXNGdaWEp5YjNJdUNna0pDUWtKS0NBaFpXeGxiUzVuWlhSRGJHbGxiblJTWldOMGN5Z3BMbXhsYm1kMGFDQjhmQ0FoWld4bGJTNW5aWFJDYjNWdVpHbHVaME5zYVdWdWRGSmxZM1FvS1M1M2FXUjBhQ0FwSUQ4S0NRa0pDUWtKYzNkaGNDZ2daV3hsYlN3Z1kzTnpVMmh2ZHl3Z1puVnVZM1JwYjI0b0tTQjdDZ2tKQ1FrSkNRbHlaWFIxY200Z1oyVjBWMmxrZEdoUGNraGxhV2RvZENnZ1pXeGxiU3dnWkdsdFpXNXphVzl1TENCbGVIUnlZU0FwT3dvSkNRa0pDUWw5SUNrZ09nb0pDUWtKQ1FsblpYUlhhV1IwYUU5eVNHVnBaMmgwS0NCbGJHVnRMQ0JrYVcxbGJuTnBiMjRzSUdWNGRISmhJQ2s3Q2drSkNYMEtDUWw5TEFvS0NRbHpaWFE2SUdaMWJtTjBhVzl1S0NCbGJHVnRMQ0IyWVd4MVpTd2daWGgwY21FZ0tTQjdDZ2tKQ1haaGNpQnRZWFJqYUdWekxBb0pDUWtKYzNSNWJHVnpJRDBnWjJWMFUzUjViR1Z6S0NCbGJHVnRJQ2tzQ2drSkNRbHBjMEp2Y21SbGNrSnZlQ0E5SUdwUmRXVnllUzVqYzNNb0lHVnNaVzBzSUNKaWIzaFRhWHBwYm1jaUxDQm1ZV3h6WlN3Z2MzUjViR1Z6SUNrZ1BUMDlJQ0ppYjNKa1pYSXRZbTk0SWl3S0NRa0pDWE4xWW5SeVlXTjBJRDBnWlhoMGNtRWdKaVlnWW05NFRXOWtaV3hCWkdwMWMzUnRaVzUwS0FvSkNRa0pDV1ZzWlcwc0Nna0pDUWtKWkdsdFpXNXphVzl1TEFvSkNRa0pDV1Y0ZEhKaExBb0pDUWtKQ1dselFtOXlaR1Z5UW05NExBb0pDUWtKQ1hOMGVXeGxjd29KQ1FrSktUc0tDZ2tKQ1M4dklFRmpZMjkxYm5RZ1ptOXlJSFZ1Y21Wc2FXRmliR1VnWW05eVpHVnlMV0p2ZUNCa2FXMWxibk5wYjI1eklHSjVJR052YlhCaGNtbHVaeUJ2Wm1aelpYUXFJSFJ2SUdOdmJYQjFkR1ZrSUdGdVpBb0pDUWt2THlCbVlXdHBibWNnWVNCamIyNTBaVzUwTFdKdmVDQjBieUJuWlhRZ1ltOXlaR1Z5SUdGdVpDQndZV1JrYVc1bklDaG5hQzB6TmprNUtRb0pDUWxwWmlBb0lHbHpRbTl5WkdWeVFtOTRJQ1ltSUhOMWNIQnZjblF1YzJOeWIyeHNZbTk0VTJsNlpTZ3BJRDA5UFNCemRIbHNaWE11Y0c5emFYUnBiMjRnS1NCN0Nna0pDUWx6ZFdKMGNtRmpkQ0F0UFNCTllYUm9MbU5sYVd3b0Nna0pDUWtKWld4bGJWc2dJbTltWm5ObGRDSWdLeUJrYVcxbGJuTnBiMjViSURBZ1hTNTBiMVZ3Y0dWeVEyRnpaU2dwSUNzZ1pHbHRaVzV6YVc5dUxuTnNhV05sS0NBeElDa2dYU0F0Q2drSkNRa0pjR0Z5YzJWR2JHOWhkQ2dnYzNSNWJHVnpXeUJrYVcxbGJuTnBiMjRnWFNBcElDMEtDUWtKQ1FsaWIzaE5iMlJsYkVGa2FuVnpkRzFsYm5Rb0lHVnNaVzBzSUdScGJXVnVjMmx2Yml3Z0ltSnZjbVJsY2lJc0lHWmhiSE5sTENCemRIbHNaWE1nS1NBdENna0pDUWtKTUM0MUNna0pDUWtwT3dvSkNRbDlDZ29KQ1Frdkx5QkRiMjUyWlhKMElIUnZJSEJwZUdWc2N5QnBaaUIyWVd4MVpTQmhaR3AxYzNSdFpXNTBJR2x6SUc1bFpXUmxaQW9KQ1FscFppQW9JSE4xWW5SeVlXTjBJQ1ltSUNnZ2JXRjBZMmhsY3lBOUlISmpjM05PZFcwdVpYaGxZeWdnZG1Gc2RXVWdLU0FwSUNZbUNna0pDUWtvSUcxaGRHTm9aWE5iSURNZ1hTQjhmQ0FpY0hnaUlDa2dJVDA5SUNKd2VDSWdLU0I3Q2dvSkNRa0paV3hsYlM1emRIbHNaVnNnWkdsdFpXNXphVzl1SUYwZ1BTQjJZV3gxWlRzS0NRa0pDWFpoYkhWbElEMGdhbEYxWlhKNUxtTnpjeWdnWld4bGJTd2daR2x0Wlc1emFXOXVJQ2s3Q2drSkNYMEtDZ2tKQ1hKbGRIVnliaUJ6WlhSUWIzTnBkR2wyWlU1MWJXSmxjaWdnWld4bGJTd2dkbUZzZFdVc0lITjFZblJ5WVdOMElDazdDZ2tKZlFvSmZUc0tmU0FwT3dvS2FsRjFaWEo1TG1OemMwaHZiMnR6TG0xaGNtZHBia3hsWm5RZ1BTQmhaR1JIWlhSSWIyOXJTV1lvSUhOMWNIQnZjblF1Y21Wc2FXRmliR1ZOWVhKbmFXNU1aV1owTEFvSlpuVnVZM1JwYjI0b0lHVnNaVzBzSUdOdmJYQjFkR1ZrSUNrZ2V3b0pDV2xtSUNnZ1kyOXRjSFYwWldRZ0tTQjdDZ2tKQ1hKbGRIVnliaUFvSUhCaGNuTmxSbXh2WVhRb0lHTjFja05UVXlnZ1pXeGxiU3dnSW0xaGNtZHBia3hsWm5RaUlDa2dLU0I4ZkFvSkNRa0paV3hsYlM1blpYUkNiM1Z1WkdsdVowTnNhV1Z1ZEZKbFkzUW9LUzVzWldaMElDMEtDUWtKQ1FsemQyRndLQ0JsYkdWdExDQjdJRzFoY21kcGJreGxablE2SURBZ2ZTd2dablZ1WTNScGIyNG9LU0I3Q2drSkNRa0pDWEpsZEhWeWJpQmxiR1Z0TG1kbGRFSnZkVzVrYVc1blEyeHBaVzUwVW1WamRDZ3BMbXhsWm5RN0Nna0pDUWtKZlNBcENna0pDUWtwSUNzZ0luQjRJanNLQ1FsOUNnbDlDaWs3Q2dvdkx5QlVhR1Z6WlNCb2IyOXJjeUJoY21VZ2RYTmxaQ0JpZVNCaGJtbHRZWFJsSUhSdklHVjRjR0Z1WkNCd2NtOXdaWEowYVdWekNtcFJkV1Z5ZVM1bFlXTm9LQ0I3Q2dsdFlYSm5hVzQ2SUNJaUxBb0pjR0ZrWkdsdVp6b2dJaUlzQ2dsaWIzSmtaWEk2SUNKWGFXUjBhQ0lLZlN3Z1puVnVZM1JwYjI0b0lIQnlaV1pwZUN3Z2MzVm1abWw0SUNrZ2V3b0phbEYxWlhKNUxtTnpjMGh2YjJ0eld5QndjbVZtYVhnZ0t5QnpkV1ptYVhnZ1hTQTlJSHNLQ1FsbGVIQmhibVE2SUdaMWJtTjBhVzl1S0NCMllXeDFaU0FwSUhzS0NRa0pkbUZ5SUdrZ1BTQXdMQW9KQ1FrSlpYaHdZVzVrWldRZ1BTQjdmU3dLQ2drSkNRa3ZMeUJCYzNOMWJXVnpJR0VnYzJsdVoyeGxJRzUxYldKbGNpQnBaaUJ1YjNRZ1lTQnpkSEpwYm1jS0NRa0pDWEJoY25SeklEMGdkSGx3Wlc5bUlIWmhiSFZsSUQwOVBTQWljM1J5YVc1bklpQS9JSFpoYkhWbExuTndiR2wwS0NBaUlDSWdLU0E2SUZzZ2RtRnNkV1VnWFRzS0Nna0pDV1p2Y2lBb0lEc2dhU0E4SURRN0lHa3JLeUFwSUhzS0NRa0pDV1Y0Y0dGdVpHVmtXeUJ3Y21WbWFYZ2dLeUJqYzNORmVIQmhibVJiSUdrZ1hTQXJJSE4xWm1acGVDQmRJRDBLQ1FrSkNRbHdZWEowYzFzZ2FTQmRJSHg4SUhCaGNuUnpXeUJwSUMwZ01pQmRJSHg4SUhCaGNuUnpXeUF3SUYwN0Nna0pDWDBLQ2drSkNYSmxkSFZ5YmlCbGVIQmhibVJsWkRzS0NRbDlDZ2w5T3dvS0NXbG1JQ2dnY0hKbFptbDRJQ0U5UFNBaWJXRnlaMmx1SWlBcElIc0tDUWxxVVhWbGNua3VZM056U0c5dmEzTmJJSEJ5WldacGVDQXJJSE4xWm1acGVDQmRMbk5sZENBOUlITmxkRkJ2YzJsMGFYWmxUblZ0WW1WeU93b0pmUXA5SUNrN0NncHFVWFZsY25rdVptNHVaWGgwWlc1a0tDQjdDZ2xqYzNNNklHWjFibU4wYVc5dUtDQnVZVzFsTENCMllXeDFaU0FwSUhzS0NRbHlaWFIxY200Z1lXTmpaWE56S0NCMGFHbHpMQ0JtZFc1amRHbHZiaWdnWld4bGJTd2dibUZ0WlN3Z2RtRnNkV1VnS1NCN0Nna0pDWFpoY2lCemRIbHNaWE1zSUd4bGJpd0tDUWtKQ1cxaGNDQTlJSHQ5TEFvSkNRa0phU0E5SURBN0Nnb0pDUWxwWmlBb0lFRnljbUY1TG1selFYSnlZWGtvSUc1aGJXVWdLU0FwSUhzS0NRa0pDWE4wZVd4bGN5QTlJR2RsZEZOMGVXeGxjeWdnWld4bGJTQXBPd29KQ1FrSmJHVnVJRDBnYm1GdFpTNXNaVzVuZEdnN0Nnb0pDUWtKWm05eUlDZ2dPeUJwSUR3Z2JHVnVPeUJwS3lzZ0tTQjdDZ2tKQ1FrSmJXRndXeUJ1WVcxbFd5QnBJRjBnWFNBOUlHcFJkV1Z5ZVM1amMzTW9JR1ZzWlcwc0lHNWhiV1ZiSUdrZ1hTd2dabUZzYzJVc0lITjBlV3hsY3lBcE93b0pDUWtKZlFvS0NRa0pDWEpsZEhWeWJpQnRZWEE3Q2drSkNYMEtDZ2tKQ1hKbGRIVnliaUIyWVd4MVpTQWhQVDBnZFc1a1pXWnBibVZrSUQ4S0NRa0pDV3BSZFdWeWVTNXpkSGxzWlNnZ1pXeGxiU3dnYm1GdFpTd2dkbUZzZFdVZ0tTQTZDZ2tKQ1FscVVYVmxjbmt1WTNOektDQmxiR1Z0TENCdVlXMWxJQ2s3Q2drSmZTd2dibUZ0WlN3Z2RtRnNkV1VzSUdGeVozVnRaVzUwY3k1c1pXNW5kR2dnUGlBeElDazdDZ2w5Q24wZ0tUc0tDZ3BtZFc1amRHbHZiaUJVZDJWbGJpZ2daV3hsYlN3Z2IzQjBhVzl1Y3l3Z2NISnZjQ3dnWlc1a0xDQmxZWE5wYm1jZ0tTQjdDZ2x5WlhSMWNtNGdibVYzSUZSM1pXVnVMbkJ5YjNSdmRIbHdaUzVwYm1sMEtDQmxiR1Z0TENCdmNIUnBiMjV6TENCd2NtOXdMQ0JsYm1Rc0lHVmhjMmx1WnlBcE93cDlDbXBSZFdWeWVTNVVkMlZsYmlBOUlGUjNaV1Z1T3dvS1ZIZGxaVzR1Y0hKdmRHOTBlWEJsSUQwZ2V3b0pZMjl1YzNSeWRXTjBiM0k2SUZSM1pXVnVMQW9KYVc1cGREb2dablZ1WTNScGIyNG9JR1ZzWlcwc0lHOXdkR2x2Ym5Nc0lIQnliM0FzSUdWdVpDd2daV0Z6YVc1bkxDQjFibWwwSUNrZ2V3b0pDWFJvYVhNdVpXeGxiU0E5SUdWc1pXMDdDZ2tKZEdocGN5NXdjbTl3SUQwZ2NISnZjRHNLQ1FsMGFHbHpMbVZoYzJsdVp5QTlJR1ZoYzJsdVp5QjhmQ0JxVVhWbGNua3VaV0Z6YVc1bkxsOWtaV1poZFd4ME93b0pDWFJvYVhNdWIzQjBhVzl1Y3lBOUlHOXdkR2x2Ym5NN0Nna0pkR2hwY3k1emRHRnlkQ0E5SUhSb2FYTXVibTkzSUQwZ2RHaHBjeTVqZFhJb0tUc0tDUWwwYUdsekxtVnVaQ0E5SUdWdVpEc0tDUWwwYUdsekxuVnVhWFFnUFNCMWJtbDBJSHg4SUNnZ2FsRjFaWEo1TG1OemMwNTFiV0psY2xzZ2NISnZjQ0JkSUQ4Z0lpSWdPaUFpY0hnaUlDazdDZ2w5TEFvSlkzVnlPaUJtZFc1amRHbHZiaWdwSUhzS0NRbDJZWElnYUc5dmEzTWdQU0JVZDJWbGJpNXdjbTl3U0c5dmEzTmJJSFJvYVhNdWNISnZjQ0JkT3dvS0NRbHlaWFIxY200Z2FHOXZhM01nSmlZZ2FHOXZhM011WjJWMElEOEtDUWtKYUc5dmEzTXVaMlYwS0NCMGFHbHpJQ2tnT2dvSkNRbFVkMlZsYmk1d2NtOXdTRzl2YTNNdVgyUmxabUYxYkhRdVoyVjBLQ0IwYUdseklDazdDZ2w5TEFvSmNuVnVPaUJtZFc1amRHbHZiaWdnY0dWeVkyVnVkQ0FwSUhzS0NRbDJZWElnWldGelpXUXNDZ2tKQ1dodmIydHpJRDBnVkhkbFpXNHVjSEp2Y0VodmIydHpXeUIwYUdsekxuQnliM0FnWFRzS0Nna0phV1lnS0NCMGFHbHpMbTl3ZEdsdmJuTXVaSFZ5WVhScGIyNGdLU0I3Q2drSkNYUm9hWE11Y0c5eklEMGdaV0Z6WldRZ1BTQnFVWFZsY25rdVpXRnphVzVuV3lCMGFHbHpMbVZoYzJsdVp5QmRLQW9KQ1FrSmNHVnlZMlZ1ZEN3Z2RHaHBjeTV2Y0hScGIyNXpMbVIxY21GMGFXOXVJQ29nY0dWeVkyVnVkQ3dnTUN3Z01Td2dkR2hwY3k1dmNIUnBiMjV6TG1SMWNtRjBhVzl1Q2drSkNTazdDZ2tKZlNCbGJITmxJSHNLQ1FrSmRHaHBjeTV3YjNNZ1BTQmxZWE5sWkNBOUlIQmxjbU5sYm5RN0Nna0pmUW9KQ1hSb2FYTXVibTkzSUQwZ0tDQjBhR2x6TG1WdVpDQXRJSFJvYVhNdWMzUmhjblFnS1NBcUlHVmhjMlZrSUNzZ2RHaHBjeTV6ZEdGeWREc0tDZ2tKYVdZZ0tDQjBhR2x6TG05d2RHbHZibk11YzNSbGNDQXBJSHNLQ1FrSmRHaHBjeTV2Y0hScGIyNXpMbk4wWlhBdVkyRnNiQ2dnZEdocGN5NWxiR1Z0TENCMGFHbHpMbTV2ZHl3Z2RHaHBjeUFwT3dvSkNYMEtDZ2tKYVdZZ0tDQm9iMjlyY3lBbUppQm9iMjlyY3k1elpYUWdLU0I3Q2drSkNXaHZiMnR6TG5ObGRDZ2dkR2hwY3lBcE93b0pDWDBnWld4elpTQjdDZ2tKQ1ZSM1pXVnVMbkJ5YjNCSWIyOXJjeTVmWkdWbVlYVnNkQzV6WlhRb0lIUm9hWE1nS1RzS0NRbDlDZ2tKY21WMGRYSnVJSFJvYVhNN0NnbDlDbjA3Q2dwVWQyVmxiaTV3Y205MGIzUjVjR1V1YVc1cGRDNXdjbTkwYjNSNWNHVWdQU0JVZDJWbGJpNXdjbTkwYjNSNWNHVTdDZ3BVZDJWbGJpNXdjbTl3U0c5dmEzTWdQU0I3Q2dsZlpHVm1ZWFZzZERvZ2V3b0pDV2RsZERvZ1puVnVZM1JwYjI0b0lIUjNaV1Z1SUNrZ2V3b0pDUWwyWVhJZ2NtVnpkV3gwT3dvS0NRa0pMeThnVlhObElHRWdjSEp2Y0dWeWRIa2diMjRnZEdobElHVnNaVzFsYm5RZ1pHbHlaV04wYkhrZ2QyaGxiaUJwZENCcGN5QnViM1FnWVNCRVQwMGdaV3hsYldWdWRDd0tDUWtKTHk4Z2IzSWdkMmhsYmlCMGFHVnlaU0JwY3lCdWJ5QnRZWFJqYUdsdVp5QnpkSGxzWlNCd2NtOXdaWEowZVNCMGFHRjBJR1Y0YVhOMGN5NEtDUWtKYVdZZ0tDQjBkMlZsYmk1bGJHVnRMbTV2WkdWVWVYQmxJQ0U5UFNBeElIeDhDZ2tKQ1FsMGQyVmxiaTVsYkdWdFd5QjBkMlZsYmk1d2NtOXdJRjBnSVQwZ2JuVnNiQ0FtSmlCMGQyVmxiaTVsYkdWdExuTjBlV3hsV3lCMGQyVmxiaTV3Y205d0lGMGdQVDBnYm5Wc2JDQXBJSHNLQ1FrSkNYSmxkSFZ5YmlCMGQyVmxiaTVsYkdWdFd5QjBkMlZsYmk1d2NtOXdJRjA3Q2drSkNYMEtDZ2tKQ1M4dklGQmhjM05wYm1jZ1lXNGdaVzF3ZEhrZ2MzUnlhVzVuSUdGeklHRWdNM0prSUhCaGNtRnRaWFJsY2lCMGJ5QXVZM056SUhkcGJHd2dZWFYwYjIxaGRHbGpZV3hzZVFvSkNRa3ZMeUJoZEhSbGJYQjBJR0VnY0dGeWMyVkdiRzloZENCaGJtUWdabUZzYkdKaFkyc2dkRzhnWVNCemRISnBibWNnYVdZZ2RHaGxJSEJoY25ObElHWmhhV3h6TGdvSkNRa3ZMeUJUYVcxd2JHVWdkbUZzZFdWeklITjFZMmdnWVhNZ0lqRXdjSGdpSUdGeVpTQndZWEp6WldRZ2RHOGdSbXh2WVhRN0Nna0pDUzh2SUdOdmJYQnNaWGdnZG1Gc2RXVnpJSE4xWTJnZ1lYTWdJbkp2ZEdGMFpTZ3hjbUZrS1NJZ1lYSmxJSEpsZEhWeWJtVmtJR0Z6TFdsekxnb0pDUWx5WlhOMWJIUWdQU0JxVVhWbGNua3VZM056S0NCMGQyVmxiaTVsYkdWdExDQjBkMlZsYmk1d2NtOXdMQ0FpSWlBcE93b0tDUWtKTHk4Z1JXMXdkSGtnYzNSeWFXNW5jeXdnYm5Wc2JDd2dkVzVrWldacGJtVmtJR0Z1WkNBaVlYVjBieUlnWVhKbElHTnZiblpsY25SbFpDQjBieUF3TGdvSkNRbHlaWFIxY200Z0lYSmxjM1ZzZENCOGZDQnlaWE4xYkhRZ1BUMDlJQ0poZFhSdklpQS9JREFnT2lCeVpYTjFiSFE3Q2drSmZTd0tDUWx6WlhRNklHWjFibU4wYVc5dUtDQjBkMlZsYmlBcElIc0tDZ2tKQ1M4dklGVnpaU0J6ZEdWd0lHaHZiMnNnWm05eUlHSmhZMnNnWTI5dGNHRjBMZ29KQ1Frdkx5QlZjMlVnWTNOelNHOXZheUJwWmlCcGRITWdkR2hsY21VdUNna0pDUzh2SUZWelpTQXVjM1I1YkdVZ2FXWWdZWFpoYVd4aFlteGxJR0Z1WkNCMWMyVWdjR3hoYVc0Z2NISnZjR1Z5ZEdsbGN5QjNhR1Z5WlNCaGRtRnBiR0ZpYkdVdUNna0pDV2xtSUNnZ2FsRjFaWEo1TG1aNExuTjBaWEJiSUhSM1pXVnVMbkJ5YjNBZ1hTQXBJSHNLQ1FrSkNXcFJkV1Z5ZVM1bWVDNXpkR1Z3V3lCMGQyVmxiaTV3Y205d0lGMG9JSFIzWldWdUlDazdDZ2tKQ1gwZ1pXeHpaU0JwWmlBb0lIUjNaV1Z1TG1Wc1pXMHVibTlrWlZSNWNHVWdQVDA5SURFZ0ppWUtDUWtKQ1NnZ2RIZGxaVzR1Wld4bGJTNXpkSGxzWlZzZ2FsRjFaWEo1TG1OemMxQnliM0J6V3lCMGQyVmxiaTV3Y205d0lGMGdYU0FoUFNCdWRXeHNJSHg4Q2drSkNRa0phbEYxWlhKNUxtTnpjMGh2YjJ0eld5QjBkMlZsYmk1d2NtOXdJRjBnS1NBcElIc0tDUWtKQ1dwUmRXVnllUzV6ZEhsc1pTZ2dkSGRsWlc0dVpXeGxiU3dnZEhkbFpXNHVjSEp2Y0N3Z2RIZGxaVzR1Ym05M0lDc2dkSGRsWlc0dWRXNXBkQ0FwT3dvSkNRbDlJR1ZzYzJVZ2V3b0pDUWtKZEhkbFpXNHVaV3hsYlZzZ2RIZGxaVzR1Y0hKdmNDQmRJRDBnZEhkbFpXNHVibTkzT3dvSkNRbDlDZ2tKZlFvSmZRcDlPd29LTHk4Z1UzVndjRzl5ZERvZ1NVVWdQRDA1SUc5dWJIa0tMeThnVUdGdWFXTWdZbUZ6WldRZ1lYQndjbTloWTJnZ2RHOGdjMlYwZEdsdVp5QjBhR2x1WjNNZ2IyNGdaR2x6WTI5dWJtVmpkR1ZrSUc1dlpHVnpDbFIzWldWdUxuQnliM0JJYjI5cmN5NXpZM0p2Ykd4VWIzQWdQU0JVZDJWbGJpNXdjbTl3U0c5dmEzTXVjMk55YjJ4c1RHVm1kQ0E5SUhzS0NYTmxkRG9nWm5WdVkzUnBiMjRvSUhSM1pXVnVJQ2tnZXdvSkNXbG1JQ2dnZEhkbFpXNHVaV3hsYlM1dWIyUmxWSGx3WlNBbUppQjBkMlZsYmk1bGJHVnRMbkJoY21WdWRFNXZaR1VnS1NCN0Nna0pDWFIzWldWdUxtVnNaVzFiSUhSM1pXVnVMbkJ5YjNBZ1hTQTlJSFIzWldWdUxtNXZkenNLQ1FsOUNnbDlDbjA3Q2dwcVVYVmxjbmt1WldGemFXNW5JRDBnZXdvSmJHbHVaV0Z5T2lCbWRXNWpkR2x2YmlnZ2NDQXBJSHNLQ1FseVpYUjFjbTRnY0RzS0NYMHNDZ2x6ZDJsdVp6b2dablZ1WTNScGIyNG9JSEFnS1NCN0Nna0pjbVYwZFhKdUlEQXVOU0F0SUUxaGRHZ3VZMjl6S0NCd0lDb2dUV0YwYUM1UVNTQXBJQzhnTWpzS0NYMHNDZ2xmWkdWbVlYVnNkRG9nSW5OM2FXNW5JZ3A5T3dvS2FsRjFaWEo1TG1aNElEMGdWSGRsWlc0dWNISnZkRzkwZVhCbExtbHVhWFE3Q2dvdkx5QkNZV05ySUdOdmJYQmhkQ0E4TVM0NElHVjRkR1Z1YzJsdmJpQndiMmx1ZEFwcVVYVmxjbmt1Wm5ndWMzUmxjQ0E5SUh0OU93b0tDZ29LZG1GeUNnbG1lRTV2ZHl3Z2FXNVFjbTluY21WemN5d0tDWEptZUhSNWNHVnpJRDBnTDE0b1B6cDBiMmRuYkdWOGMyaHZkM3hvYVdSbEtTUXZMQW9KY25KMWJpQTlJQzl4ZFdWMVpVaHZiMnR6SkM4N0NncG1kVzVqZEdsdmJpQnpZMmhsWkhWc1pTZ3BJSHNLQ1dsbUlDZ2dhVzVRY205bmNtVnpjeUFwSUhzS0NRbHBaaUFvSUdSdlkzVnRaVzUwTG1ocFpHUmxiaUE5UFQwZ1ptRnNjMlVnSmlZZ2QybHVaRzkzTG5KbGNYVmxjM1JCYm1sdFlYUnBiMjVHY21GdFpTQXBJSHNLQ1FrSmQybHVaRzkzTG5KbGNYVmxjM1JCYm1sdFlYUnBiMjVHY21GdFpTZ2djMk5vWldSMWJHVWdLVHNLQ1FsOUlHVnNjMlVnZXdvSkNRbDNhVzVrYjNjdWMyVjBWR2x0Wlc5MWRDZ2djMk5vWldSMWJHVXNJR3BSZFdWeWVTNW1lQzVwYm5SbGNuWmhiQ0FwT3dvSkNYMEtDZ2tKYWxGMVpYSjVMbVo0TG5ScFkyc29LVHNLQ1gwS2ZRb0tMeThnUVc1cGJXRjBhVzl1Y3lCamNtVmhkR1ZrSUhONWJtTm9jbTl1YjNWemJIa2dkMmxzYkNCeWRXNGdjM2x1WTJoeWIyNXZkWE5zZVFwbWRXNWpkR2x2YmlCamNtVmhkR1ZHZUU1dmR5Z3BJSHNLQ1hkcGJtUnZkeTV6WlhSVWFXMWxiM1YwS0NCbWRXNWpkR2x2YmlncElIc0tDUWxtZUU1dmR5QTlJSFZ1WkdWbWFXNWxaRHNLQ1gwZ0tUc0tDWEpsZEhWeWJpQW9JR1o0VG05M0lEMGdSR0YwWlM1dWIzY29LU0FwT3dwOUNnb3ZMeUJIWlc1bGNtRjBaU0J3WVhKaGJXVjBaWEp6SUhSdklHTnlaV0YwWlNCaElITjBZVzVrWVhKa0lHRnVhVzFoZEdsdmJncG1kVzVqZEdsdmJpQm5aVzVHZUNnZ2RIbHdaU3dnYVc1amJIVmtaVmRwWkhSb0lDa2dld29KZG1GeUlIZG9hV05vTEFvSkNXa2dQU0F3TEFvSkNXRjBkSEp6SUQwZ2V5Qm9aV2xuYUhRNklIUjVjR1VnZlRzS0Nna3ZMeUJKWmlCM1pTQnBibU5zZFdSbElIZHBaSFJvTENCemRHVndJSFpoYkhWbElHbHpJREVnZEc4Z1pHOGdZV3hzSUdOemMwVjRjR0Z1WkNCMllXeDFaWE1zQ2drdkx5QnZkR2hsY25kcGMyVWdjM1JsY0NCMllXeDFaU0JwY3lBeUlIUnZJSE5yYVhBZ2IzWmxjaUJNWldaMElHRnVaQ0JTYVdkb2RBb0phVzVqYkhWa1pWZHBaSFJvSUQwZ2FXNWpiSFZrWlZkcFpIUm9JRDhnTVNBNklEQTdDZ2xtYjNJZ0tDQTdJR2tnUENBME95QnBJQ3M5SURJZ0xTQnBibU5zZFdSbFYybGtkR2dnS1NCN0Nna0pkMmhwWTJnZ1BTQmpjM05GZUhCaGJtUmJJR2tnWFRzS0NRbGhkSFJ5YzFzZ0ltMWhjbWRwYmlJZ0t5QjNhR2xqYUNCZElEMGdZWFIwY25OYklDSndZV1JrYVc1bklpQXJJSGRvYVdOb0lGMGdQU0IwZVhCbE93b0pmUW9LQ1dsbUlDZ2dhVzVqYkhWa1pWZHBaSFJvSUNrZ2V3b0pDV0YwZEhKekxtOXdZV05wZEhrZ1BTQmhkSFJ5Y3k1M2FXUjBhQ0E5SUhSNWNHVTdDZ2w5Q2dvSmNtVjBkWEp1SUdGMGRISnpPd3A5Q2dwbWRXNWpkR2x2YmlCamNtVmhkR1ZVZDJWbGJpZ2dkbUZzZFdVc0lIQnliM0FzSUdGdWFXMWhkR2x2YmlBcElIc0tDWFpoY2lCMGQyVmxiaXdLQ1FsamIyeHNaV04wYVc5dUlEMGdLQ0JCYm1sdFlYUnBiMjR1ZEhkbFpXNWxjbk5iSUhCeWIzQWdYU0I4ZkNCYlhTQXBMbU52Ym1OaGRDZ2dRVzVwYldGMGFXOXVMblIzWldWdVpYSnpXeUFpS2lJZ1hTQXBMQW9KQ1dsdVpHVjRJRDBnTUN3S0NRbHNaVzVuZEdnZ1BTQmpiMnhzWldOMGFXOXVMbXhsYm1kMGFEc0tDV1p2Y2lBb0lEc2dhVzVrWlhnZ1BDQnNaVzVuZEdnN0lHbHVaR1Y0S3lzZ0tTQjdDZ2tKYVdZZ0tDQW9JSFIzWldWdUlEMGdZMjlzYkdWamRHbHZibHNnYVc1a1pYZ2dYUzVqWVd4c0tDQmhibWx0WVhScGIyNHNJSEJ5YjNBc0lIWmhiSFZsSUNrZ0tTQXBJSHNLQ2drSkNTOHZJRmRsSjNKbElHUnZibVVnZDJsMGFDQjBhR2x6SUhCeWIzQmxjblI1Q2drSkNYSmxkSFZ5YmlCMGQyVmxianNLQ1FsOUNnbDlDbjBLQ21aMWJtTjBhVzl1SUdSbFptRjFiSFJRY21WbWFXeDBaWElvSUdWc1pXMHNJSEJ5YjNCekxDQnZjSFJ6SUNrZ2V3b0pkbUZ5SUhCeWIzQXNJSFpoYkhWbExDQjBiMmRuYkdVc0lHaHZiMnR6TENCdmJHUm1hWEpsTENCd2NtOXdWSGRsWlc0c0lISmxjM1J2Y21WRWFYTndiR0Y1TENCa2FYTndiR0Y1TEFvSkNXbHpRbTk0SUQwZ0luZHBaSFJvSWlCcGJpQndjbTl3Y3lCOGZDQWlhR1ZwWjJoMElpQnBiaUJ3Y205d2N5d0tDUWxoYm1sdElEMGdkR2hwY3l3S0NRbHZjbWxuSUQwZ2UzMHNDZ2tKYzNSNWJHVWdQU0JsYkdWdExuTjBlV3hsTEFvSkNXaHBaR1JsYmlBOUlHVnNaVzB1Ym05a1pWUjVjR1VnSmlZZ2FYTklhV1JrWlc1WGFYUm9hVzVVY21WbEtDQmxiR1Z0SUNrc0Nna0paR0YwWVZOb2IzY2dQU0JrWVhSaFVISnBkaTVuWlhRb0lHVnNaVzBzSUNKbWVITm9iM2NpSUNrN0Nnb0pMeThnVVhWbGRXVXRjMnRwY0hCcGJtY2dZVzVwYldGMGFXOXVjeUJvYVdwaFkyc2dkR2hsSUdaNElHaHZiMnR6Q2dscFppQW9JQ0Z2Y0hSekxuRjFaWFZsSUNrZ2V3b0pDV2h2YjJ0eklEMGdhbEYxWlhKNUxsOXhkV1YxWlVodmIydHpLQ0JsYkdWdExDQWlabmdpSUNrN0Nna0phV1lnS0NCb2IyOXJjeTUxYm5GMVpYVmxaQ0E5UFNCdWRXeHNJQ2tnZXdvSkNRbG9iMjlyY3k1MWJuRjFaWFZsWkNBOUlEQTdDZ2tKQ1c5c1pHWnBjbVVnUFNCb2IyOXJjeTVsYlhCMGVTNW1hWEpsT3dvSkNRbG9iMjlyY3k1bGJYQjBlUzVtYVhKbElEMGdablZ1WTNScGIyNG9LU0I3Q2drSkNRbHBaaUFvSUNGb2IyOXJjeTUxYm5GMVpYVmxaQ0FwSUhzS0NRa0pDUWx2YkdSbWFYSmxLQ2s3Q2drSkNRbDlDZ2tKQ1gwN0Nna0pmUW9KQ1dodmIydHpMblZ1Y1hWbGRXVmtLeXM3Q2dvSkNXRnVhVzB1WVd4M1lYbHpLQ0JtZFc1amRHbHZiaWdwSUhzS0Nna0pDUzh2SUVWdWMzVnlaU0IwYUdVZ1kyOXRjR3hsZEdVZ2FHRnVaR3hsY2lCcGN5QmpZV3hzWldRZ1ltVm1iM0psSUhSb2FYTWdZMjl0Y0d4bGRHVnpDZ2tKQ1dGdWFXMHVZV3gzWVhsektDQm1kVzVqZEdsdmJpZ3BJSHNLQ1FrSkNXaHZiMnR6TG5WdWNYVmxkV1ZrTFMwN0Nna0pDUWxwWmlBb0lDRnFVWFZsY25rdWNYVmxkV1VvSUdWc1pXMHNJQ0ptZUNJZ0tTNXNaVzVuZEdnZ0tTQjdDZ2tKQ1FrSmFHOXZhM011Wlcxd2RIa3VabWx5WlNncE93b0pDUWtKZlFvSkNRbDlJQ2s3Q2drSmZTQXBPd29KZlFvS0NTOHZJRVJsZEdWamRDQnphRzkzTDJocFpHVWdZVzVwYldGMGFXOXVjd29KWm05eUlDZ2djSEp2Y0NCcGJpQndjbTl3Y3lBcElIc0tDUWwyWVd4MVpTQTlJSEJ5YjNCeld5QndjbTl3SUYwN0Nna0phV1lnS0NCeVpuaDBlWEJsY3k1MFpYTjBLQ0IyWVd4MVpTQXBJQ2tnZXdvSkNRbGtaV3hsZEdVZ2NISnZjSE5iSUhCeWIzQWdYVHNLQ1FrSmRHOW5aMnhsSUQwZ2RHOW5aMnhsSUh4OElIWmhiSFZsSUQwOVBTQWlkRzluWjJ4bElqc0tDUWtKYVdZZ0tDQjJZV3gxWlNBOVBUMGdLQ0JvYVdSa1pXNGdQeUFpYUdsa1pTSWdPaUFpYzJodmR5SWdLU0FwSUhzS0Nna0pDUWt2THlCUWNtVjBaVzVrSUhSdklHSmxJR2hwWkdSbGJpQnBaaUIwYUdseklHbHpJR0VnSW5Ob2IzY2lJR0Z1WkFvSkNRa0pMeThnZEdobGNtVWdhWE1nYzNScGJHd2daR0YwWVNCbWNtOXRJR0VnYzNSdmNIQmxaQ0J6YUc5M0wyaHBaR1VLQ1FrSkNXbG1JQ2dnZG1Gc2RXVWdQVDA5SUNKemFHOTNJaUFtSmlCa1lYUmhVMmh2ZHlBbUppQmtZWFJoVTJodmQxc2djSEp2Y0NCZElDRTlQU0IxYm1SbFptbHVaV1FnS1NCN0Nna0pDUWtKYUdsa1pHVnVJRDBnZEhKMVpUc0tDZ2tKQ1Frdkx5QkpaMjV2Y21VZ1lXeHNJRzkwYUdWeUlHNXZMVzl3SUhOb2IzY3ZhR2xrWlNCa1lYUmhDZ2tKQ1FsOUlHVnNjMlVnZXdvSkNRa0pDV052Ym5ScGJuVmxPd29KQ1FrSmZRb0pDUWw5Q2drSkNXOXlhV2RiSUhCeWIzQWdYU0E5SUdSaGRHRlRhRzkzSUNZbUlHUmhkR0ZUYUc5M1d5QndjbTl3SUYwZ2ZId2dhbEYxWlhKNUxuTjBlV3hsS0NCbGJHVnRMQ0J3Y205d0lDazdDZ2tKZlFvSmZRb0tDUzh2SUVKaGFXd2diM1YwSUdsbUlIUm9hWE1nYVhNZ1lTQnVieTF2Y0NCc2FXdGxJQzVvYVdSbEtDa3VhR2xrWlNncENnbHdjbTl3VkhkbFpXNGdQU0FoYWxGMVpYSjVMbWx6Ulcxd2RIbFBZbXBsWTNRb0lIQnliM0J6SUNrN0NnbHBaaUFvSUNGd2NtOXdWSGRsWlc0Z0ppWWdhbEYxWlhKNUxtbHpSVzF3ZEhsUFltcGxZM1FvSUc5eWFXY2dLU0FwSUhzS0NRbHlaWFIxY200N0NnbDlDZ29KTHk4Z1VtVnpkSEpwWTNRZ0ltOTJaWEptYkc5M0lpQmhibVFnSW1ScGMzQnNZWGtpSUhOMGVXeGxjeUJrZFhKcGJtY2dZbTk0SUdGdWFXMWhkR2x2Ym5NS0NXbG1JQ2dnYVhOQ2IzZ2dKaVlnWld4bGJTNXViMlJsVkhsd1pTQTlQVDBnTVNBcElIc0tDZ2tKTHk4Z1UzVndjRzl5ZERvZ1NVVWdQRDA1SUMwZ01URXNJRVZrWjJVZ01USWdMU0F4TlFvSkNTOHZJRkpsWTI5eVpDQmhiR3dnTXlCdmRtVnlabXh2ZHlCaGRIUnlhV0oxZEdWeklHSmxZMkYxYzJVZ1NVVWdaRzlsY3lCdWIzUWdhVzVtWlhJZ2RHaGxJSE5vYjNKMGFHRnVaQW9KQ1M4dklHWnliMjBnYVdSbGJuUnBZMkZzYkhrdGRtRnNkV1ZrSUc5MlpYSm1iRzkzV0NCaGJtUWdiM1psY21ac2IzZFpJR0Z1WkNCRlpHZGxJR3AxYzNRZ2JXbHljbTl5Y3dvSkNTOHZJSFJvWlNCdmRtVnlabXh2ZDFnZ2RtRnNkV1VnZEdobGNtVXVDZ2tKYjNCMGN5NXZkbVZ5Wm14dmR5QTlJRnNnYzNSNWJHVXViM1psY21ac2IzY3NJSE4wZVd4bExtOTJaWEptYkc5M1dDd2djM1I1YkdVdWIzWmxjbVpzYjNkWklGMDdDZ29KQ1M4dklFbGtaVzUwYVdaNUlHRWdaR2x6Y0d4aGVTQjBlWEJsTENCd2NtVm1aWEp5YVc1bklHOXNaQ0J6YUc5M0wyaHBaR1VnWkdGMFlTQnZkbVZ5SUhSb1pTQkRVMU1nWTJGelkyRmtaUW9KQ1hKbGMzUnZjbVZFYVhOd2JHRjVJRDBnWkdGMFlWTm9iM2NnSmlZZ1pHRjBZVk5vYjNjdVpHbHpjR3hoZVRzS0NRbHBaaUFvSUhKbGMzUnZjbVZFYVhOd2JHRjVJRDA5SUc1MWJHd2dLU0I3Q2drSkNYSmxjM1J2Y21WRWFYTndiR0Y1SUQwZ1pHRjBZVkJ5YVhZdVoyVjBLQ0JsYkdWdExDQWlaR2x6Y0d4aGVTSWdLVHNLQ1FsOUNna0paR2x6Y0d4aGVTQTlJR3BSZFdWeWVTNWpjM01vSUdWc1pXMHNJQ0prYVhOd2JHRjVJaUFwT3dvSkNXbG1JQ2dnWkdsemNHeGhlU0E5UFQwZ0ltNXZibVVpSUNrZ2V3b0pDUWxwWmlBb0lISmxjM1J2Y21WRWFYTndiR0Y1SUNrZ2V3b0pDUWtKWkdsemNHeGhlU0E5SUhKbGMzUnZjbVZFYVhOd2JHRjVPd29KQ1FsOUlHVnNjMlVnZXdvS0NRa0pDUzh2SUVkbGRDQnViMjVsYlhCMGVTQjJZV3gxWlNoektTQmllU0IwWlcxd2IzSmhjbWxzZVNCbWIzSmphVzVuSUhacGMybGlhV3hwZEhrS0NRa0pDWE5vYjNkSWFXUmxLQ0JiSUdWc1pXMGdYU3dnZEhKMVpTQXBPd29KQ1FrSmNtVnpkRzl5WlVScGMzQnNZWGtnUFNCbGJHVnRMbk4wZVd4bExtUnBjM0JzWVhrZ2ZId2djbVZ6ZEc5eVpVUnBjM0JzWVhrN0Nna0pDUWxrYVhOd2JHRjVJRDBnYWxGMVpYSjVMbU56Y3lnZ1pXeGxiU3dnSW1ScGMzQnNZWGtpSUNrN0Nna0pDUWx6YUc5M1NHbGtaU2dnV3lCbGJHVnRJRjBnS1RzS0NRa0pmUW9KQ1gwS0Nna0pMeThnUVc1cGJXRjBaU0JwYm14cGJtVWdaV3hsYldWdWRITWdZWE1nYVc1c2FXNWxMV0pzYjJOckNna0phV1lnS0NCa2FYTndiR0Y1SUQwOVBTQWlhVzVzYVc1bElpQjhmQ0JrYVhOd2JHRjVJRDA5UFNBaWFXNXNhVzVsTFdKc2IyTnJJaUFtSmlCeVpYTjBiM0psUkdsemNHeGhlU0FoUFNCdWRXeHNJQ2tnZXdvSkNRbHBaaUFvSUdwUmRXVnllUzVqYzNNb0lHVnNaVzBzSUNKbWJHOWhkQ0lnS1NBOVBUMGdJbTV2Ym1VaUlDa2dld29LQ1FrSkNTOHZJRkpsYzNSdmNtVWdkR2hsSUc5eWFXZHBibUZzSUdScGMzQnNZWGtnZG1Gc2RXVWdZWFFnZEdobElHVnVaQ0J2WmlCd2RYSmxJSE5vYjNjdmFHbGtaU0JoYm1sdFlYUnBiMjV6Q2drSkNRbHBaaUFvSUNGd2NtOXdWSGRsWlc0Z0tTQjdDZ2tKQ1FrSllXNXBiUzVrYjI1bEtDQm1kVzVqZEdsdmJpZ3BJSHNLQ1FrSkNRa0pjM1I1YkdVdVpHbHpjR3hoZVNBOUlISmxjM1J2Y21WRWFYTndiR0Y1T3dvSkNRa0pDWDBnS1RzS0NRa0pDUWxwWmlBb0lISmxjM1J2Y21WRWFYTndiR0Y1SUQwOUlHNTFiR3dnS1NCN0Nna0pDUWtKQ1dScGMzQnNZWGtnUFNCemRIbHNaUzVrYVhOd2JHRjVPd29KQ1FrSkNRbHlaWE4wYjNKbFJHbHpjR3hoZVNBOUlHUnBjM0JzWVhrZ1BUMDlJQ0p1YjI1bElpQS9JQ0lpSURvZ1pHbHpjR3hoZVRzS0NRa0pDUWw5Q2drSkNRbDlDZ2tKQ1FsemRIbHNaUzVrYVhOd2JHRjVJRDBnSW1sdWJHbHVaUzFpYkc5amF5STdDZ2tKQ1gwS0NRbDlDZ2w5Q2dvSmFXWWdLQ0J2Y0hSekxtOTJaWEptYkc5M0lDa2dld29KQ1hOMGVXeGxMbTkyWlhKbWJHOTNJRDBnSW1ocFpHUmxiaUk3Q2drSllXNXBiUzVoYkhkaGVYTW9JR1oxYm1OMGFXOXVLQ2tnZXdvSkNRbHpkSGxzWlM1dmRtVnlabXh2ZHlBOUlHOXdkSE11YjNabGNtWnNiM2RiSURBZ1hUc0tDUWtKYzNSNWJHVXViM1psY21ac2IzZFlJRDBnYjNCMGN5NXZkbVZ5Wm14dmQxc2dNU0JkT3dvSkNRbHpkSGxzWlM1dmRtVnlabXh2ZDFrZ1BTQnZjSFJ6TG05MlpYSm1iRzkzV3lBeUlGMDdDZ2tKZlNBcE93b0pmUW9LQ1M4dklFbHRjR3hsYldWdWRDQnphRzkzTDJocFpHVWdZVzVwYldGMGFXOXVjd29KY0hKdmNGUjNaV1Z1SUQwZ1ptRnNjMlU3Q2dsbWIzSWdLQ0J3Y205d0lHbHVJRzl5YVdjZ0tTQjdDZ29KQ1M4dklFZGxibVZ5WVd3Z2MyaHZkeTlvYVdSbElITmxkSFZ3SUdadmNpQjBhR2x6SUdWc1pXMWxiblFnWVc1cGJXRjBhVzl1Q2drSmFXWWdLQ0FoY0hKdmNGUjNaV1Z1SUNrZ2V3b0pDUWxwWmlBb0lHUmhkR0ZUYUc5M0lDa2dld29KQ1FrSmFXWWdLQ0FpYUdsa1pHVnVJaUJwYmlCa1lYUmhVMmh2ZHlBcElIc0tDUWtKQ1Fsb2FXUmtaVzRnUFNCa1lYUmhVMmh2ZHk1b2FXUmtaVzQ3Q2drSkNRbDlDZ2tKQ1gwZ1pXeHpaU0I3Q2drSkNRbGtZWFJoVTJodmR5QTlJR1JoZEdGUWNtbDJMbUZqWTJWemN5Z2daV3hsYlN3Z0ltWjRjMmh2ZHlJc0lIc2daR2x6Y0d4aGVUb2djbVZ6ZEc5eVpVUnBjM0JzWVhrZ2ZTQXBPd29KQ1FsOUNnb0pDUWt2THlCVGRHOXlaU0JvYVdSa1pXNHZkbWx6YVdKc1pTQm1iM0lnZEc5bloyeGxJSE52SUdBdWMzUnZjQ2dwTG5SdloyZHNaU2dwWUNBaWNtVjJaWEp6WlhNaUNna0pDV2xtSUNnZ2RHOW5aMnhsSUNrZ2V3b0pDUWtKWkdGMFlWTm9iM2N1YUdsa1pHVnVJRDBnSVdocFpHUmxianNLQ1FrSmZRb0tDUWtKTHk4Z1UyaHZkeUJsYkdWdFpXNTBjeUJpWldadmNtVWdZVzVwYldGMGFXNW5JSFJvWlcwS0NRa0phV1lnS0NCb2FXUmtaVzRnS1NCN0Nna0pDUWx6YUc5M1NHbGtaU2dnV3lCbGJHVnRJRjBzSUhSeWRXVWdLVHNLQ1FrSmZRb0tDUWtKTHlvZ1pYTnNhVzUwTFdScGMyRmliR1VnYm04dGJHOXZjQzFtZFc1aklDb3ZDZ29KQ1FsaGJtbHRMbVJ2Ym1Vb0lHWjFibU4wYVc5dUtDa2dld29LQ1FrSkx5b2daWE5zYVc1MExXVnVZV0pzWlNCdWJ5MXNiMjl3TFdaMWJtTWdLaThLQ2drSkNRa3ZMeUJVYUdVZ1ptbHVZV3dnYzNSbGNDQnZaaUJoSUNKb2FXUmxJaUJoYm1sdFlYUnBiMjRnYVhNZ1lXTjBkV0ZzYkhrZ2FHbGthVzVuSUhSb1pTQmxiR1Z0Wlc1MENna0pDUWxwWmlBb0lDRm9hV1JrWlc0Z0tTQjdDZ2tKQ1FrSmMyaHZkMGhwWkdVb0lGc2daV3hsYlNCZElDazdDZ2tKQ1FsOUNna0pDUWxrWVhSaFVISnBkaTV5WlcxdmRtVW9JR1ZzWlcwc0lDSm1lSE5vYjNjaUlDazdDZ2tKQ1FsbWIzSWdLQ0J3Y205d0lHbHVJRzl5YVdjZ0tTQjdDZ2tKQ1FrSmFsRjFaWEo1TG5OMGVXeGxLQ0JsYkdWdExDQndjbTl3TENCdmNtbG5XeUJ3Y205d0lGMGdLVHNLQ1FrSkNYMEtDUWtKZlNBcE93b0pDWDBLQ2drSkx5OGdVR1Z5TFhCeWIzQmxjblI1SUhObGRIVndDZ2tKY0hKdmNGUjNaV1Z1SUQwZ1kzSmxZWFJsVkhkbFpXNG9JR2hwWkdSbGJpQS9JR1JoZEdGVGFHOTNXeUJ3Y205d0lGMGdPaUF3TENCd2NtOXdMQ0JoYm1sdElDazdDZ2tKYVdZZ0tDQWhLQ0J3Y205d0lHbHVJR1JoZEdGVGFHOTNJQ2tnS1NCN0Nna0pDV1JoZEdGVGFHOTNXeUJ3Y205d0lGMGdQU0J3Y205d1ZIZGxaVzR1YzNSaGNuUTdDZ2tKQ1dsbUlDZ2dhR2xrWkdWdUlDa2dld29KQ1FrSmNISnZjRlIzWldWdUxtVnVaQ0E5SUhCeWIzQlVkMlZsYmk1emRHRnlkRHNLQ1FrSkNYQnliM0JVZDJWbGJpNXpkR0Z5ZENBOUlEQTdDZ2tKQ1gwS0NRbDlDZ2w5Q24wS0NtWjFibU4wYVc5dUlIQnliM0JHYVd4MFpYSW9JSEJ5YjNCekxDQnpjR1ZqYVdGc1JXRnphVzVuSUNrZ2V3b0pkbUZ5SUdsdVpHVjRMQ0J1WVcxbExDQmxZWE5wYm1jc0lIWmhiSFZsTENCb2IyOXJjenNLQ2drdkx5QmpZVzFsYkVOaGMyVXNJSE53WldOcFlXeEZZWE5wYm1jZ1lXNWtJR1Y0Y0dGdVpDQmpjM05JYjI5cklIQmhjM01LQ1dadmNpQW9JR2x1WkdWNElHbHVJSEJ5YjNCeklDa2dld29KQ1c1aGJXVWdQU0JqWVcxbGJFTmhjMlVvSUdsdVpHVjRJQ2s3Q2drSlpXRnphVzVuSUQwZ2MzQmxZMmxoYkVWaGMybHVaMXNnYm1GdFpTQmRPd29KQ1haaGJIVmxJRDBnY0hKdmNITmJJR2x1WkdWNElGMDdDZ2tKYVdZZ0tDQkJjbkpoZVM1cGMwRnljbUY1S0NCMllXeDFaU0FwSUNrZ2V3b0pDUWxsWVhOcGJtY2dQU0IyWVd4MVpWc2dNU0JkT3dvSkNRbDJZV3gxWlNBOUlIQnliM0J6V3lCcGJtUmxlQ0JkSUQwZ2RtRnNkV1ZiSURBZ1hUc0tDUWw5Q2dvSkNXbG1JQ2dnYVc1a1pYZ2dJVDA5SUc1aGJXVWdLU0I3Q2drSkNYQnliM0J6V3lCdVlXMWxJRjBnUFNCMllXeDFaVHNLQ1FrSlpHVnNaWFJsSUhCeWIzQnpXeUJwYm1SbGVDQmRPd29KQ1gwS0Nna0phRzl2YTNNZ1BTQnFVWFZsY25rdVkzTnpTRzl2YTNOYklHNWhiV1VnWFRzS0NRbHBaaUFvSUdodmIydHpJQ1ltSUNKbGVIQmhibVFpSUdsdUlHaHZiMnR6SUNrZ2V3b0pDUWwyWVd4MVpTQTlJR2h2YjJ0ekxtVjRjR0Z1WkNnZ2RtRnNkV1VnS1RzS0NRa0paR1ZzWlhSbElIQnliM0J6V3lCdVlXMWxJRjA3Q2dvSkNRa3ZMeUJPYjNRZ2NYVnBkR1VnSkM1bGVIUmxibVFzSUhSb2FYTWdkMjl1SjNRZ2IzWmxjbmR5YVhSbElHVjRhWE4wYVc1bklHdGxlWE11Q2drSkNTOHZJRkpsZFhOcGJtY2dKMmx1WkdWNEp5QmlaV05oZFhObElIZGxJR2hoZG1VZ2RHaGxJR052Y25KbFkzUWdJbTVoYldVaUNna0pDV1p2Y2lBb0lHbHVaR1Y0SUdsdUlIWmhiSFZsSUNrZ2V3b0pDUWtKYVdZZ0tDQWhLQ0JwYm1SbGVDQnBiaUJ3Y205d2N5QXBJQ2tnZXdvSkNRa0pDWEJ5YjNCeld5QnBibVJsZUNCZElEMGdkbUZzZFdWYklHbHVaR1Y0SUYwN0Nna0pDUWtKYzNCbFkybGhiRVZoYzJsdVoxc2dhVzVrWlhnZ1hTQTlJR1ZoYzJsdVp6c0tDUWtKQ1gwS0NRa0pmUW9KQ1gwZ1pXeHpaU0I3Q2drSkNYTndaV05wWVd4RllYTnBibWRiSUc1aGJXVWdYU0E5SUdWaGMybHVaenNLQ1FsOUNnbDlDbjBLQ21aMWJtTjBhVzl1SUVGdWFXMWhkR2x2YmlnZ1pXeGxiU3dnY0hKdmNHVnlkR2xsY3l3Z2IzQjBhVzl1Y3lBcElIc0tDWFpoY2lCeVpYTjFiSFFzQ2drSmMzUnZjSEJsWkN3S0NRbHBibVJsZUNBOUlEQXNDZ2tKYkdWdVozUm9JRDBnUVc1cGJXRjBhVzl1TG5CeVpXWnBiSFJsY25NdWJHVnVaM1JvTEFvSkNXUmxabVZ5Y21Wa0lEMGdhbEYxWlhKNUxrUmxabVZ5Y21Wa0tDa3VZV3gzWVhsektDQm1kVzVqZEdsdmJpZ3BJSHNLQ2drSkNTOHZJRVJ2YmlkMElHMWhkR05vSUdWc1pXMGdhVzRnZEdobElEcGhibWx0WVhSbFpDQnpaV3hsWTNSdmNnb0pDUWxrWld4bGRHVWdkR2xqYXk1bGJHVnRPd29KQ1gwZ0tTd0tDUWwwYVdOcklEMGdablZ1WTNScGIyNG9LU0I3Q2drSkNXbG1JQ2dnYzNSdmNIQmxaQ0FwSUhzS0NRa0pDWEpsZEhWeWJpQm1ZV3h6WlRzS0NRa0pmUW9KQ1FsMllYSWdZM1Z5Y21WdWRGUnBiV1VnUFNCbWVFNXZkeUI4ZkNCamNtVmhkR1ZHZUU1dmR5Z3BMQW9KQ1FrSmNtVnRZV2x1YVc1bklEMGdUV0YwYUM1dFlYZ29JREFzSUdGdWFXMWhkR2x2Ymk1emRHRnlkRlJwYldVZ0t5QmhibWx0WVhScGIyNHVaSFZ5WVhScGIyNGdMU0JqZFhKeVpXNTBWR2x0WlNBcExBb0tDUWtKQ1M4dklGTjFjSEJ2Y25RNklFRnVaSEp2YVdRZ01pNHpJRzl1YkhrS0NRa0pDUzh2SUVGeVkyaGhhV01nWTNKaGMyZ2dZblZuSUhkdmJpZDBJR0ZzYkc5M0lIVnpJSFJ2SUhWelpTQmdNU0F0SUNnZ01DNDFJSHg4SURBZ0tXQWdLQ014TWpRNU55a0tDUWtKQ1hSbGJYQWdQU0J5WlcxaGFXNXBibWNnTHlCaGJtbHRZWFJwYjI0dVpIVnlZWFJwYjI0Z2ZId2dNQ3dLQ1FrSkNYQmxjbU5sYm5RZ1BTQXhJQzBnZEdWdGNDd0tDUWtKQ1dsdVpHVjRJRDBnTUN3S0NRa0pDV3hsYm1kMGFDQTlJR0Z1YVcxaGRHbHZiaTUwZDJWbGJuTXViR1Z1WjNSb093b0tDUWtKWm05eUlDZ2dPeUJwYm1SbGVDQThJR3hsYm1kMGFEc2dhVzVrWlhnckt5QXBJSHNLQ1FrSkNXRnVhVzFoZEdsdmJpNTBkMlZsYm5OYklHbHVaR1Y0SUYwdWNuVnVLQ0J3WlhKalpXNTBJQ2s3Q2drSkNYMEtDZ2tKQ1dSbFptVnljbVZrTG01dmRHbG1lVmRwZEdnb0lHVnNaVzBzSUZzZ1lXNXBiV0YwYVc5dUxDQndaWEpqWlc1MExDQnlaVzFoYVc1cGJtY2dYU0FwT3dvS0NRa0pMeThnU1dZZ2RHaGxjbVVuY3lCdGIzSmxJSFJ2SUdSdkxDQjVhV1ZzWkFvSkNRbHBaaUFvSUhCbGNtTmxiblFnUENBeElDWW1JR3hsYm1kMGFDQXBJSHNLQ1FrSkNYSmxkSFZ5YmlCeVpXMWhhVzVwYm1jN0Nna0pDWDBLQ2drSkNTOHZJRWxtSUhSb2FYTWdkMkZ6SUdGdUlHVnRjSFI1SUdGdWFXMWhkR2x2Yml3Z2MzbHVkR2hsYzJsNlpTQmhJR1pwYm1Gc0lIQnliMmR5WlhOeklHNXZkR2xtYVdOaGRHbHZiZ29KQ1FscFppQW9JQ0ZzWlc1bmRHZ2dLU0I3Q2drSkNRbGtaV1psY25KbFpDNXViM1JwWm5sWGFYUm9LQ0JsYkdWdExDQmJJR0Z1YVcxaGRHbHZiaXdnTVN3Z01DQmRJQ2s3Q2drSkNYMEtDZ2tKQ1M4dklGSmxjMjlzZG1VZ2RHaGxJR0Z1YVcxaGRHbHZiaUJoYm1RZ2NtVndiM0owSUdsMGN5QmpiMjVqYkhWemFXOXVDZ2tKQ1dSbFptVnljbVZrTG5KbGMyOXNkbVZYYVhSb0tDQmxiR1Z0TENCYklHRnVhVzFoZEdsdmJpQmRJQ2s3Q2drSkNYSmxkSFZ5YmlCbVlXeHpaVHNLQ1FsOUxBb0pDV0Z1YVcxaGRHbHZiaUE5SUdSbFptVnljbVZrTG5CeWIyMXBjMlVvSUhzS0NRa0paV3hsYlRvZ1pXeGxiU3dLQ1FrSmNISnZjSE02SUdwUmRXVnllUzVsZUhSbGJtUW9JSHQ5TENCd2NtOXdaWEowYVdWeklDa3NDZ2tKQ1c5d2RITTZJR3BSZFdWeWVTNWxlSFJsYm1Rb0lIUnlkV1VzSUhzS0NRa0pDWE53WldOcFlXeEZZWE5wYm1jNklIdDlMQW9KQ1FrSlpXRnphVzVuT2lCcVVYVmxjbmt1WldGemFXNW5MbDlrWldaaGRXeDBDZ2tKQ1gwc0lHOXdkR2x2Ym5NZ0tTd0tDUWtKYjNKcFoybHVZV3hRY205d1pYSjBhV1Z6T2lCd2NtOXdaWEowYVdWekxBb0pDUWx2Y21sbmFXNWhiRTl3ZEdsdmJuTTZJRzl3ZEdsdmJuTXNDZ2tKQ1hOMFlYSjBWR2x0WlRvZ1puaE9iM2NnZkh3Z1kzSmxZWFJsUm5oT2IzY29LU3dLQ1FrSlpIVnlZWFJwYjI0NklHOXdkR2x2Ym5NdVpIVnlZWFJwYjI0c0Nna0pDWFIzWldWdWN6b2dXMTBzQ2drSkNXTnlaV0YwWlZSM1pXVnVPaUJtZFc1amRHbHZiaWdnY0hKdmNDd2daVzVrSUNrZ2V3b0pDUWtKZG1GeUlIUjNaV1Z1SUQwZ2FsRjFaWEo1TGxSM1pXVnVLQ0JsYkdWdExDQmhibWx0WVhScGIyNHViM0IwY3l3Z2NISnZjQ3dnWlc1a0xBb0pDUWtKQ1FsaGJtbHRZWFJwYjI0dWIzQjBjeTV6Y0dWamFXRnNSV0Z6YVc1bld5QndjbTl3SUYwZ2ZId2dZVzVwYldGMGFXOXVMbTl3ZEhNdVpXRnphVzVuSUNrN0Nna0pDUWxoYm1sdFlYUnBiMjR1ZEhkbFpXNXpMbkIxYzJnb0lIUjNaV1Z1SUNrN0Nna0pDUWx5WlhSMWNtNGdkSGRsWlc0N0Nna0pDWDBzQ2drSkNYTjBiM0E2SUdaMWJtTjBhVzl1S0NCbmIzUnZSVzVrSUNrZ2V3b0pDUWtKZG1GeUlHbHVaR1Y0SUQwZ01Dd0tDZ2tKQ1FrSkx5OGdTV1lnZDJVZ1lYSmxJR2R2YVc1bklIUnZJSFJvWlNCbGJtUXNJSGRsSUhkaGJuUWdkRzhnY25WdUlHRnNiQ0IwYUdVZ2RIZGxaVzV6Q2drSkNRa0pMeThnYjNSb1pYSjNhWE5sSUhkbElITnJhWEFnZEdocGN5QndZWEowQ2drSkNRa0piR1Z1WjNSb0lEMGdaMjkwYjBWdVpDQS9JR0Z1YVcxaGRHbHZiaTUwZDJWbGJuTXViR1Z1WjNSb0lEb2dNRHNLQ1FrSkNXbG1JQ2dnYzNSdmNIQmxaQ0FwSUhzS0NRa0pDUWx5WlhSMWNtNGdkR2hwY3pzS0NRa0pDWDBLQ1FrSkNYTjBiM0J3WldRZ1BTQjBjblZsT3dvSkNRa0pabTl5SUNnZ095QnBibVJsZUNBOElHeGxibWQwYURzZ2FXNWtaWGdyS3lBcElIc0tDUWtKQ1FsaGJtbHRZWFJwYjI0dWRIZGxaVzV6V3lCcGJtUmxlQ0JkTG5KMWJpZ2dNU0FwT3dvSkNRa0pmUW9LQ1FrSkNTOHZJRkpsYzI5c2RtVWdkMmhsYmlCM1pTQndiR0Y1WldRZ2RHaGxJR3hoYzNRZ1puSmhiV1U3SUc5MGFHVnlkMmx6WlN3Z2NtVnFaV04wQ2drSkNRbHBaaUFvSUdkdmRHOUZibVFnS1NCN0Nna0pDUWtKWkdWbVpYSnlaV1F1Ym05MGFXWjVWMmwwYUNnZ1pXeGxiU3dnV3lCaGJtbHRZWFJwYjI0c0lERXNJREFnWFNBcE93b0pDUWtKQ1dSbFptVnljbVZrTG5KbGMyOXNkbVZYYVhSb0tDQmxiR1Z0TENCYklHRnVhVzFoZEdsdmJpd2daMjkwYjBWdVpDQmRJQ2s3Q2drSkNRbDlJR1ZzYzJVZ2V3b0pDUWtKQ1dSbFptVnljbVZrTG5KbGFtVmpkRmRwZEdnb0lHVnNaVzBzSUZzZ1lXNXBiV0YwYVc5dUxDQm5iM1J2Ulc1a0lGMGdLVHNLQ1FrSkNYMEtDUWtKQ1hKbGRIVnliaUIwYUdsek93b0pDUWw5Q2drSmZTQXBMQW9KQ1hCeWIzQnpJRDBnWVc1cGJXRjBhVzl1TG5CeWIzQnpPd29LQ1hCeWIzQkdhV3gwWlhJb0lIQnliM0J6TENCaGJtbHRZWFJwYjI0dWIzQjBjeTV6Y0dWamFXRnNSV0Z6YVc1bklDazdDZ29KWm05eUlDZ2dPeUJwYm1SbGVDQThJR3hsYm1kMGFEc2dhVzVrWlhnckt5QXBJSHNLQ1FseVpYTjFiSFFnUFNCQmJtbHRZWFJwYjI0dWNISmxabWxzZEdWeWMxc2dhVzVrWlhnZ1hTNWpZV3hzS0NCaGJtbHRZWFJwYjI0c0lHVnNaVzBzSUhCeWIzQnpMQ0JoYm1sdFlYUnBiMjR1YjNCMGN5QXBPd29KQ1dsbUlDZ2djbVZ6ZFd4MElDa2dld29KQ1FscFppQW9JR2x6Um5WdVkzUnBiMjRvSUhKbGMzVnNkQzV6ZEc5d0lDa2dLU0I3Q2drSkNRbHFVWFZsY25rdVgzRjFaWFZsU0c5dmEzTW9JR0Z1YVcxaGRHbHZiaTVsYkdWdExDQmhibWx0WVhScGIyNHViM0IwY3k1eGRXVjFaU0FwTG5OMGIzQWdQUW9KQ1FrSkNYSmxjM1ZzZEM1emRHOXdMbUpwYm1Rb0lISmxjM1ZzZENBcE93b0pDUWw5Q2drSkNYSmxkSFZ5YmlCeVpYTjFiSFE3Q2drSmZRb0pmUW9LQ1dwUmRXVnllUzV0WVhBb0lIQnliM0J6TENCamNtVmhkR1ZVZDJWbGJpd2dZVzVwYldGMGFXOXVJQ2s3Q2dvSmFXWWdLQ0JwYzBaMWJtTjBhVzl1S0NCaGJtbHRZWFJwYjI0dWIzQjBjeTV6ZEdGeWRDQXBJQ2tnZXdvSkNXRnVhVzFoZEdsdmJpNXZjSFJ6TG5OMFlYSjBMbU5oYkd3b0lHVnNaVzBzSUdGdWFXMWhkR2x2YmlBcE93b0pmUW9LQ1M4dklFRjBkR0ZqYUNCallXeHNZbUZqYTNNZ1puSnZiU0J2Y0hScGIyNXpDZ2xoYm1sdFlYUnBiMjRLQ1FrdWNISnZaM0psYzNNb0lHRnVhVzFoZEdsdmJpNXZjSFJ6TG5CeWIyZHlaWE56SUNrS0NRa3VaRzl1WlNnZ1lXNXBiV0YwYVc5dUxtOXdkSE11Wkc5dVpTd2dZVzVwYldGMGFXOXVMbTl3ZEhNdVkyOXRjR3hsZEdVZ0tRb0pDUzVtWVdsc0tDQmhibWx0WVhScGIyNHViM0IwY3k1bVlXbHNJQ2tLQ1FrdVlXeDNZWGx6S0NCaGJtbHRZWFJwYjI0dWIzQjBjeTVoYkhkaGVYTWdLVHNLQ2dscVVYVmxjbmt1Wm5ndWRHbHRaWElvQ2drSmFsRjFaWEo1TG1WNGRHVnVaQ2dnZEdsamF5d2dld29KQ1FsbGJHVnRPaUJsYkdWdExBb0pDUWxoYm1sdE9pQmhibWx0WVhScGIyNHNDZ2tKQ1hGMVpYVmxPaUJoYm1sdFlYUnBiMjR1YjNCMGN5NXhkV1YxWlFvSkNYMGdLUW9KS1RzS0NnbHlaWFIxY200Z1lXNXBiV0YwYVc5dU93cDlDZ3BxVVhWbGNua3VRVzVwYldGMGFXOXVJRDBnYWxGMVpYSjVMbVY0ZEdWdVpDZ2dRVzVwYldGMGFXOXVMQ0I3Q2dvSmRIZGxaVzVsY25NNklIc0tDUWtpS2lJNklGc2dablZ1WTNScGIyNG9JSEJ5YjNBc0lIWmhiSFZsSUNrZ2V3b0pDUWwyWVhJZ2RIZGxaVzRnUFNCMGFHbHpMbU55WldGMFpWUjNaV1Z1S0NCd2NtOXdMQ0IyWVd4MVpTQXBPd29KQ1FsaFpHcDFjM1JEVTFNb0lIUjNaV1Z1TG1Wc1pXMHNJSEJ5YjNBc0lISmpjM05PZFcwdVpYaGxZeWdnZG1Gc2RXVWdLU3dnZEhkbFpXNGdLVHNLQ1FrSmNtVjBkWEp1SUhSM1pXVnVPd29KQ1gwZ1hRb0pmU3dLQ2dsMGQyVmxibVZ5T2lCbWRXNWpkR2x2YmlnZ2NISnZjSE1zSUdOaGJHeGlZV05ySUNrZ2V3b0pDV2xtSUNnZ2FYTkdkVzVqZEdsdmJpZ2djSEp2Y0hNZ0tTQXBJSHNLQ1FrSlkyRnNiR0poWTJzZ1BTQndjbTl3Y3pzS0NRa0pjSEp2Y0hNZ1BTQmJJQ0lxSWlCZE93b0pDWDBnWld4elpTQjdDZ2tKQ1hCeWIzQnpJRDBnY0hKdmNITXViV0YwWTJnb0lISnViM1JvZEcxc2QyaHBkR1VnS1RzS0NRbDlDZ29KQ1haaGNpQndjbTl3TEFvSkNRbHBibVJsZUNBOUlEQXNDZ2tKQ1d4bGJtZDBhQ0E5SUhCeWIzQnpMbXhsYm1kMGFEc0tDZ2tKWm05eUlDZ2dPeUJwYm1SbGVDQThJR3hsYm1kMGFEc2dhVzVrWlhnckt5QXBJSHNLQ1FrSmNISnZjQ0E5SUhCeWIzQnpXeUJwYm1SbGVDQmRPd29KQ1FsQmJtbHRZWFJwYjI0dWRIZGxaVzVsY25OYklIQnliM0FnWFNBOUlFRnVhVzFoZEdsdmJpNTBkMlZsYm1WeWMxc2djSEp2Y0NCZElIeDhJRnRkT3dvSkNRbEJibWx0WVhScGIyNHVkSGRsWlc1bGNuTmJJSEJ5YjNBZ1hTNTFibk5vYVdaMEtDQmpZV3hzWW1GamF5QXBPd29KQ1gwS0NYMHNDZ29KY0hKbFptbHNkR1Z5Y3pvZ1d5QmtaV1poZFd4MFVISmxabWxzZEdWeUlGMHNDZ29KY0hKbFptbHNkR1Z5T2lCbWRXNWpkR2x2YmlnZ1kyRnNiR0poWTJzc0lIQnlaWEJsYm1RZ0tTQjdDZ2tKYVdZZ0tDQndjbVZ3Wlc1a0lDa2dld29KQ1FsQmJtbHRZWFJwYjI0dWNISmxabWxzZEdWeWN5NTFibk5vYVdaMEtDQmpZV3hzWW1GamF5QXBPd29KQ1gwZ1pXeHpaU0I3Q2drSkNVRnVhVzFoZEdsdmJpNXdjbVZtYVd4MFpYSnpMbkIxYzJnb0lHTmhiR3hpWVdOcklDazdDZ2tKZlFvSmZRcDlJQ2s3Q2dwcVVYVmxjbmt1YzNCbFpXUWdQU0JtZFc1amRHbHZiaWdnYzNCbFpXUXNJR1ZoYzJsdVp5d2dabTRnS1NCN0NnbDJZWElnYjNCMElEMGdjM0JsWldRZ0ppWWdkSGx3Wlc5bUlITndaV1ZrSUQwOVBTQWliMkpxWldOMElpQS9JR3BSZFdWeWVTNWxlSFJsYm1Rb0lIdDlMQ0J6Y0dWbFpDQXBJRG9nZXdvSkNXTnZiWEJzWlhSbE9pQm1iaUI4ZkNBaFptNGdKaVlnWldGemFXNW5JSHg4Q2drSkNXbHpSblZ1WTNScGIyNG9JSE53WldWa0lDa2dKaVlnYzNCbFpXUXNDZ2tKWkhWeVlYUnBiMjQ2SUhOd1pXVmtMQW9KQ1dWaGMybHVaem9nWm00Z0ppWWdaV0Z6YVc1bklIeDhJR1ZoYzJsdVp5QW1KaUFoYVhOR2RXNWpkR2x2YmlnZ1pXRnphVzVuSUNrZ0ppWWdaV0Z6YVc1bkNnbDlPd29LQ1M4dklFZHZJSFJ2SUhSb1pTQmxibVFnYzNSaGRHVWdhV1lnWm5nZ1lYSmxJRzltWmdvSmFXWWdLQ0JxVVhWbGNua3Vabmd1YjJabUlDa2dld29KQ1c5d2RDNWtkWEpoZEdsdmJpQTlJREE3Q2dvSmZTQmxiSE5sSUhzS0NRbHBaaUFvSUhSNWNHVnZaaUJ2Y0hRdVpIVnlZWFJwYjI0Z0lUMDlJQ0p1ZFcxaVpYSWlJQ2tnZXdvSkNRbHBaaUFvSUc5d2RDNWtkWEpoZEdsdmJpQnBiaUJxVVhWbGNua3Vabmd1YzNCbFpXUnpJQ2tnZXdvSkNRa0piM0IwTG1SMWNtRjBhVzl1SUQwZ2FsRjFaWEo1TG1aNExuTndaV1ZrYzFzZ2IzQjBMbVIxY21GMGFXOXVJRjA3Q2dvSkNRbDlJR1ZzYzJVZ2V3b0pDUWtKYjNCMExtUjFjbUYwYVc5dUlEMGdhbEYxWlhKNUxtWjRMbk53WldWa2N5NWZaR1ZtWVhWc2REc0tDUWtKZlFvSkNYMEtDWDBLQ2drdkx5Qk9iM0p0WVd4cGVtVWdiM0IwTG5GMVpYVmxJQzBnZEhKMVpTOTFibVJsWm1sdVpXUXZiblZzYkNBdFBpQWlabmdpQ2dscFppQW9JRzl3ZEM1eGRXVjFaU0E5UFNCdWRXeHNJSHg4SUc5d2RDNXhkV1YxWlNBOVBUMGdkSEoxWlNBcElIc0tDUWx2Y0hRdWNYVmxkV1VnUFNBaVpuZ2lPd29KZlFvS0NTOHZJRkYxWlhWbGFXNW5DZ2x2Y0hRdWIyeGtJRDBnYjNCMExtTnZiWEJzWlhSbE93b0tDVzl3ZEM1amIyMXdiR1YwWlNBOUlHWjFibU4wYVc5dUtDa2dld29KQ1dsbUlDZ2dhWE5HZFc1amRHbHZiaWdnYjNCMExtOXNaQ0FwSUNrZ2V3b0pDUWx2Y0hRdWIyeGtMbU5oYkd3b0lIUm9hWE1nS1RzS0NRbDlDZ29KQ1dsbUlDZ2diM0IwTG5GMVpYVmxJQ2tnZXdvSkNRbHFVWFZsY25rdVpHVnhkV1YxWlNnZ2RHaHBjeXdnYjNCMExuRjFaWFZsSUNrN0Nna0pmUW9KZlRzS0NnbHlaWFIxY200Z2IzQjBPd3A5T3dvS2FsRjFaWEo1TG1adUxtVjRkR1Z1WkNnZ2V3b0pabUZrWlZSdk9pQm1kVzVqZEdsdmJpZ2djM0JsWldRc0lIUnZMQ0JsWVhOcGJtY3NJR05oYkd4aVlXTnJJQ2tnZXdvS0NRa3ZMeUJUYUc5M0lHRnVlU0JvYVdSa1pXNGdaV3hsYldWdWRITWdZV1owWlhJZ2MyVjBkR2x1WnlCdmNHRmphWFI1SUhSdklEQUtDUWx5WlhSMWNtNGdkR2hwY3k1bWFXeDBaWElvSUdselNHbGtaR1Z1VjJsMGFHbHVWSEpsWlNBcExtTnpjeWdnSW05d1lXTnBkSGtpTENBd0lDa3VjMmh2ZHlncENnb0pDUWt2THlCQmJtbHRZWFJsSUhSdklIUm9aU0IyWVd4MVpTQnpjR1ZqYVdacFpXUUtDUWtKTG1WdVpDZ3BMbUZ1YVcxaGRHVW9JSHNnYjNCaFkybDBlVG9nZEc4Z2ZTd2djM0JsWldRc0lHVmhjMmx1Wnl3Z1kyRnNiR0poWTJzZ0tUc0tDWDBzQ2dsaGJtbHRZWFJsT2lCbWRXNWpkR2x2YmlnZ2NISnZjQ3dnYzNCbFpXUXNJR1ZoYzJsdVp5d2dZMkZzYkdKaFkyc2dLU0I3Q2drSmRtRnlJR1Z0Y0hSNUlEMGdhbEYxWlhKNUxtbHpSVzF3ZEhsUFltcGxZM1FvSUhCeWIzQWdLU3dLQ1FrSmIzQjBZV3hzSUQwZ2FsRjFaWEo1TG5Od1pXVmtLQ0J6Y0dWbFpDd2daV0Z6YVc1bkxDQmpZV3hzWW1GamF5QXBMQW9KQ1Fsa2IwRnVhVzFoZEdsdmJpQTlJR1oxYm1OMGFXOXVLQ2tnZXdvS0NRa0pDUzh2SUU5d1pYSmhkR1VnYjI0Z1lTQmpiM0I1SUc5bUlIQnliM0FnYzI4Z2NHVnlMWEJ5YjNCbGNuUjVJR1ZoYzJsdVp5QjNiMjRuZENCaVpTQnNiM04wQ2drSkNRbDJZWElnWVc1cGJTQTlJRUZ1YVcxaGRHbHZiaWdnZEdocGN5d2dhbEYxWlhKNUxtVjRkR1Z1WkNnZ2UzMHNJSEJ5YjNBZ0tTd2diM0IwWVd4c0lDazdDZ29KQ1FrSkx5OGdSVzF3ZEhrZ1lXNXBiV0YwYVc5dWN5d2diM0lnWm1sdWFYTm9hVzVuSUhKbGMyOXNkbVZ6SUdsdGJXVmthV0YwWld4NUNna0pDUWxwWmlBb0lHVnRjSFI1SUh4OElHUmhkR0ZRY21sMkxtZGxkQ2dnZEdocGN5d2dJbVpwYm1semFDSWdLU0FwSUhzS0NRa0pDUWxoYm1sdExuTjBiM0FvSUhSeWRXVWdLVHNLQ1FrSkNYMEtDUWtKZlRzS0NRa0paRzlCYm1sdFlYUnBiMjR1Wm1sdWFYTm9JRDBnWkc5QmJtbHRZWFJwYjI0N0Nnb0pDWEpsZEhWeWJpQmxiWEIwZVNCOGZDQnZjSFJoYkd3dWNYVmxkV1VnUFQwOUlHWmhiSE5sSUQ4S0NRa0pkR2hwY3k1bFlXTm9LQ0JrYjBGdWFXMWhkR2x2YmlBcElEb0tDUWtKZEdocGN5NXhkV1YxWlNnZ2IzQjBZV3hzTG5GMVpYVmxMQ0JrYjBGdWFXMWhkR2x2YmlBcE93b0pmU3dLQ1hOMGIzQTZJR1oxYm1OMGFXOXVLQ0IwZVhCbExDQmpiR1ZoY2xGMVpYVmxMQ0JuYjNSdlJXNWtJQ2tnZXdvSkNYWmhjaUJ6ZEc5d1VYVmxkV1VnUFNCbWRXNWpkR2x2YmlnZ2FHOXZhM01nS1NCN0Nna0pDWFpoY2lCemRHOXdJRDBnYUc5dmEzTXVjM1J2Y0RzS0NRa0paR1ZzWlhSbElHaHZiMnR6TG5OMGIzQTdDZ2tKQ1hOMGIzQW9JR2R2ZEc5RmJtUWdLVHNLQ1FsOU93b0tDUWxwWmlBb0lIUjVjR1Z2WmlCMGVYQmxJQ0U5UFNBaWMzUnlhVzVuSWlBcElIc0tDUWtKWjI5MGIwVnVaQ0E5SUdOc1pXRnlVWFZsZFdVN0Nna0pDV05zWldGeVVYVmxkV1VnUFNCMGVYQmxPd29KQ1FsMGVYQmxJRDBnZFc1a1pXWnBibVZrT3dvSkNYMEtDUWxwWmlBb0lHTnNaV0Z5VVhWbGRXVWdKaVlnZEhsd1pTQWhQVDBnWm1Gc2MyVWdLU0I3Q2drSkNYUm9hWE11Y1hWbGRXVW9JSFI1Y0dVZ2ZId2dJbVo0SWl3Z1cxMGdLVHNLQ1FsOUNnb0pDWEpsZEhWeWJpQjBhR2x6TG1WaFkyZ29JR1oxYm1OMGFXOXVLQ2tnZXdvSkNRbDJZWElnWkdWeGRXVjFaU0E5SUhSeWRXVXNDZ2tKQ1FscGJtUmxlQ0E5SUhSNWNHVWdJVDBnYm5Wc2JDQW1KaUIwZVhCbElDc2dJbkYxWlhWbFNHOXZhM01pTEFvSkNRa0pkR2x0WlhKeklEMGdhbEYxWlhKNUxuUnBiV1Z5Y3l3S0NRa0pDV1JoZEdFZ1BTQmtZWFJoVUhKcGRpNW5aWFFvSUhSb2FYTWdLVHNLQ2drSkNXbG1JQ2dnYVc1a1pYZ2dLU0I3Q2drSkNRbHBaaUFvSUdSaGRHRmJJR2x1WkdWNElGMGdKaVlnWkdGMFlWc2dhVzVrWlhnZ1hTNXpkRzl3SUNrZ2V3b0pDUWtKQ1hOMGIzQlJkV1YxWlNnZ1pHRjBZVnNnYVc1a1pYZ2dYU0FwT3dvSkNRa0pmUW9KQ1FsOUlHVnNjMlVnZXdvSkNRa0pabTl5SUNnZ2FXNWtaWGdnYVc0Z1pHRjBZU0FwSUhzS0NRa0pDUWxwWmlBb0lHUmhkR0ZiSUdsdVpHVjRJRjBnSmlZZ1pHRjBZVnNnYVc1a1pYZ2dYUzV6ZEc5d0lDWW1JSEp5ZFc0dWRHVnpkQ2dnYVc1a1pYZ2dLU0FwSUhzS0NRa0pDUWtKYzNSdmNGRjFaWFZsS0NCa1lYUmhXeUJwYm1SbGVDQmRJQ2s3Q2drSkNRa0pmUW9KQ1FrSmZRb0pDUWw5Q2dvSkNRbG1iM0lnS0NCcGJtUmxlQ0E5SUhScGJXVnljeTVzWlc1bmRHZzdJR2x1WkdWNExTMDdJQ2tnZXdvSkNRa0phV1lnS0NCMGFXMWxjbk5iSUdsdVpHVjRJRjB1Wld4bGJTQTlQVDBnZEdocGN5QW1KZ29KQ1FrSkNTZ2dkSGx3WlNBOVBTQnVkV3hzSUh4OElIUnBiV1Z5YzFzZ2FXNWtaWGdnWFM1eGRXVjFaU0E5UFQwZ2RIbHdaU0FwSUNrZ2V3b0tDUWtKQ1FsMGFXMWxjbk5iSUdsdVpHVjRJRjB1WVc1cGJTNXpkRzl3S0NCbmIzUnZSVzVrSUNrN0Nna0pDUWtKWkdWeGRXVjFaU0E5SUdaaGJITmxPd29KQ1FrSkNYUnBiV1Z5Y3k1emNHeHBZMlVvSUdsdVpHVjRMQ0F4SUNrN0Nna0pDUWw5Q2drSkNYMEtDZ2tKQ1M4dklGTjBZWEowSUhSb1pTQnVaWGgwSUdsdUlIUm9aU0J4ZFdWMVpTQnBaaUIwYUdVZ2JHRnpkQ0J6ZEdWd0lIZGhjMjRuZENCbWIzSmpaV1F1Q2drSkNTOHZJRlJwYldWeWN5QmpkWEp5Wlc1MGJIa2dkMmxzYkNCallXeHNJSFJvWldseUlHTnZiWEJzWlhSbElHTmhiR3hpWVdOcmN5d2dkMmhwWTJnS0NRa0pMeThnZDJsc2JDQmtaWEYxWlhWbElHSjFkQ0J2Ym14NUlHbG1JSFJvWlhrZ2QyVnlaU0JuYjNSdlJXNWtMZ29KQ1FscFppQW9JR1JsY1hWbGRXVWdmSHdnSVdkdmRHOUZibVFnS1NCN0Nna0pDUWxxVVhWbGNua3VaR1Z4ZFdWMVpTZ2dkR2hwY3l3Z2RIbHdaU0FwT3dvSkNRbDlDZ2tKZlNBcE93b0pmU3dLQ1dacGJtbHphRG9nWm5WdVkzUnBiMjRvSUhSNWNHVWdLU0I3Q2drSmFXWWdLQ0IwZVhCbElDRTlQU0JtWVd4elpTQXBJSHNLQ1FrSmRIbHdaU0E5SUhSNWNHVWdmSHdnSW1aNElqc0tDUWw5Q2drSmNtVjBkWEp1SUhSb2FYTXVaV0ZqYUNnZ1puVnVZM1JwYjI0b0tTQjdDZ2tKQ1haaGNpQnBibVJsZUN3S0NRa0pDV1JoZEdFZ1BTQmtZWFJoVUhKcGRpNW5aWFFvSUhSb2FYTWdLU3dLQ1FrSkNYRjFaWFZsSUQwZ1pHRjBZVnNnZEhsd1pTQXJJQ0p4ZFdWMVpTSWdYU3dLQ1FrSkNXaHZiMnR6SUQwZ1pHRjBZVnNnZEhsd1pTQXJJQ0p4ZFdWMVpVaHZiMnR6SWlCZExBb0pDUWtKZEdsdFpYSnpJRDBnYWxGMVpYSjVMblJwYldWeWN5d0tDUWtKQ1d4bGJtZDBhQ0E5SUhGMVpYVmxJRDhnY1hWbGRXVXViR1Z1WjNSb0lEb2dNRHNLQ2drSkNTOHZJRVZ1WVdKc1pTQm1hVzVwYzJocGJtY2dabXhoWnlCdmJpQndjbWwyWVhSbElHUmhkR0VLQ1FrSlpHRjBZUzVtYVc1cGMyZ2dQU0IwY25WbE93b0tDUWtKTHk4Z1JXMXdkSGtnZEdobElIRjFaWFZsSUdacGNuTjBDZ2tKQ1dwUmRXVnllUzV4ZFdWMVpTZ2dkR2hwY3l3Z2RIbHdaU3dnVzEwZ0tUc0tDZ2tKQ1dsbUlDZ2dhRzl2YTNNZ0ppWWdhRzl2YTNNdWMzUnZjQ0FwSUhzS0NRa0pDV2h2YjJ0ekxuTjBiM0F1WTJGc2JDZ2dkR2hwY3l3Z2RISjFaU0FwT3dvSkNRbDlDZ29KQ1Frdkx5Qk1iMjlySUdadmNpQmhibmtnWVdOMGFYWmxJR0Z1YVcxaGRHbHZibk1zSUdGdVpDQm1hVzVwYzJnZ2RHaGxiUW9KQ1FsbWIzSWdLQ0JwYm1SbGVDQTlJSFJwYldWeWN5NXNaVzVuZEdnN0lHbHVaR1Y0TFMwN0lDa2dld29KQ1FrSmFXWWdLQ0IwYVcxbGNuTmJJR2x1WkdWNElGMHVaV3hsYlNBOVBUMGdkR2hwY3lBbUppQjBhVzFsY25OYklHbHVaR1Y0SUYwdWNYVmxkV1VnUFQwOUlIUjVjR1VnS1NCN0Nna0pDUWtKZEdsdFpYSnpXeUJwYm1SbGVDQmRMbUZ1YVcwdWMzUnZjQ2dnZEhKMVpTQXBPd29KQ1FrSkNYUnBiV1Z5Y3k1emNHeHBZMlVvSUdsdVpHVjRMQ0F4SUNrN0Nna0pDUWw5Q2drSkNYMEtDZ2tKQ1M4dklFeHZiMnNnWm05eUlHRnVlU0JoYm1sdFlYUnBiMjV6SUdsdUlIUm9aU0J2YkdRZ2NYVmxkV1VnWVc1a0lHWnBibWx6YUNCMGFHVnRDZ2tKQ1dadmNpQW9JR2x1WkdWNElEMGdNRHNnYVc1a1pYZ2dQQ0JzWlc1bmRHZzdJR2x1WkdWNEt5c2dLU0I3Q2drSkNRbHBaaUFvSUhGMVpYVmxXeUJwYm1SbGVDQmRJQ1ltSUhGMVpYVmxXeUJwYm1SbGVDQmRMbVpwYm1semFDQXBJSHNLQ1FrSkNRbHhkV1YxWlZzZ2FXNWtaWGdnWFM1bWFXNXBjMmd1WTJGc2JDZ2dkR2hwY3lBcE93b0pDUWtKZlFvSkNRbDlDZ29KQ1Frdkx5QlVkWEp1SUc5bVppQm1hVzVwYzJocGJtY2dabXhoWndvSkNRbGtaV3hsZEdVZ1pHRjBZUzVtYVc1cGMyZzdDZ2tKZlNBcE93b0pmUXA5SUNrN0NncHFVWFZsY25rdVpXRmphQ2dnV3lBaWRHOW5aMnhsSWl3Z0luTm9iM2NpTENBaWFHbGtaU0lnWFN3Z1puVnVZM1JwYjI0b0lHa3NJRzVoYldVZ0tTQjdDZ2wyWVhJZ1kzTnpSbTRnUFNCcVVYVmxjbmt1Wm01YklHNWhiV1VnWFRzS0NXcFJkV1Z5ZVM1bWJsc2dibUZ0WlNCZElEMGdablZ1WTNScGIyNG9JSE53WldWa0xDQmxZWE5wYm1jc0lHTmhiR3hpWVdOcklDa2dld29KQ1hKbGRIVnliaUJ6Y0dWbFpDQTlQU0J1ZFd4c0lIeDhJSFI1Y0dWdlppQnpjR1ZsWkNBOVBUMGdJbUp2YjJ4bFlXNGlJRDhLQ1FrSlkzTnpSbTR1WVhCd2JIa29JSFJvYVhNc0lHRnlaM1Z0Wlc1MGN5QXBJRG9LQ1FrSmRHaHBjeTVoYm1sdFlYUmxLQ0JuWlc1R2VDZ2dibUZ0WlN3Z2RISjFaU0FwTENCemNHVmxaQ3dnWldGemFXNW5MQ0JqWVd4c1ltRmpheUFwT3dvSmZUc0tmU0FwT3dvS0x5OGdSMlZ1WlhKaGRHVWdjMmh2Y25SamRYUnpJR1p2Y2lCamRYTjBiMjBnWVc1cGJXRjBhVzl1Y3dwcVVYVmxjbmt1WldGamFDZ2dld29KYzJ4cFpHVkViM2R1T2lCblpXNUdlQ2dnSW5Ob2IzY2lJQ2tzQ2dsemJHbGtaVlZ3T2lCblpXNUdlQ2dnSW1ocFpHVWlJQ2tzQ2dsemJHbGtaVlJ2WjJkc1pUb2daMlZ1Um5nb0lDSjBiMmRuYkdVaUlDa3NDZ2xtWVdSbFNXNDZJSHNnYjNCaFkybDBlVG9nSW5Ob2IzY2lJSDBzQ2dsbVlXUmxUM1YwT2lCN0lHOXdZV05wZEhrNklDSm9hV1JsSWlCOUxBb0pabUZrWlZSdloyZHNaVG9nZXlCdmNHRmphWFI1T2lBaWRHOW5aMnhsSWlCOUNuMHNJR1oxYm1OMGFXOXVLQ0J1WVcxbExDQndjbTl3Y3lBcElIc0tDV3BSZFdWeWVTNW1ibHNnYm1GdFpTQmRJRDBnWm5WdVkzUnBiMjRvSUhOd1pXVmtMQ0JsWVhOcGJtY3NJR05oYkd4aVlXTnJJQ2tnZXdvSkNYSmxkSFZ5YmlCMGFHbHpMbUZ1YVcxaGRHVW9JSEJ5YjNCekxDQnpjR1ZsWkN3Z1pXRnphVzVuTENCallXeHNZbUZqYXlBcE93b0pmVHNLZlNBcE93b0thbEYxWlhKNUxuUnBiV1Z5Y3lBOUlGdGRPd3BxVVhWbGNua3Vabmd1ZEdsamF5QTlJR1oxYm1OMGFXOXVLQ2tnZXdvSmRtRnlJSFJwYldWeUxBb0pDV2tnUFNBd0xBb0pDWFJwYldWeWN5QTlJR3BSZFdWeWVTNTBhVzFsY25NN0Nnb0pabmhPYjNjZ1BTQkVZWFJsTG01dmR5Z3BPd29LQ1dadmNpQW9JRHNnYVNBOElIUnBiV1Z5Y3k1c1pXNW5kR2c3SUdrckt5QXBJSHNLQ1FsMGFXMWxjaUE5SUhScGJXVnljMXNnYVNCZE93b0tDUWt2THlCU2RXNGdkR2hsSUhScGJXVnlJR0Z1WkNCellXWmxiSGtnY21WdGIzWmxJR2wwSUhkb1pXNGdaRzl1WlNBb1lXeHNiM2RwYm1jZ1ptOXlJR1Y0ZEdWeWJtRnNJSEpsYlc5MllXd3BDZ2tKYVdZZ0tDQWhkR2x0WlhJb0tTQW1KaUIwYVcxbGNuTmJJR2tnWFNBOVBUMGdkR2x0WlhJZ0tTQjdDZ2tKQ1hScGJXVnljeTV6Y0d4cFkyVW9JR2t0TFN3Z01TQXBPd29KQ1gwS0NYMEtDZ2xwWmlBb0lDRjBhVzFsY25NdWJHVnVaM1JvSUNrZ2V3b0pDV3BSZFdWeWVTNW1lQzV6ZEc5d0tDazdDZ2w5Q2dsbWVFNXZkeUE5SUhWdVpHVm1hVzVsWkRzS2ZUc0tDbXBSZFdWeWVTNW1lQzUwYVcxbGNpQTlJR1oxYm1OMGFXOXVLQ0IwYVcxbGNpQXBJSHNLQ1dwUmRXVnllUzUwYVcxbGNuTXVjSFZ6YUNnZ2RHbHRaWElnS1RzS0NXcFJkV1Z5ZVM1bWVDNXpkR0Z5ZENncE93cDlPd29LYWxGMVpYSjVMbVo0TG1sdWRHVnlkbUZzSUQwZ01UTTdDbXBSZFdWeWVTNW1lQzV6ZEdGeWRDQTlJR1oxYm1OMGFXOXVLQ2tnZXdvSmFXWWdLQ0JwYmxCeWIyZHlaWE56SUNrZ2V3b0pDWEpsZEhWeWJqc0tDWDBLQ2dscGJsQnliMmR5WlhOeklEMGdkSEoxWlRzS0NYTmphR1ZrZFd4bEtDazdDbjA3Q2dwcVVYVmxjbmt1Wm5ndWMzUnZjQ0E5SUdaMWJtTjBhVzl1S0NrZ2V3b0phVzVRY205bmNtVnpjeUE5SUc1MWJHdzdDbjA3Q2dwcVVYVmxjbmt1Wm5ndWMzQmxaV1J6SUQwZ2V3b0pjMnh2ZHpvZ05qQXdMQW9KWm1GemREb2dNakF3TEFvS0NTOHZJRVJsWm1GMWJIUWdjM0JsWldRS0NWOWtaV1poZFd4ME9pQTBNREFLZlRzS0Nnb3ZMeUJDWVhObFpDQnZabVlnYjJZZ2RHaGxJSEJzZFdkcGJpQmllU0JEYkdsdWRDQklaV3htWlhKekxDQjNhWFJvSUhCbGNtMXBjM05wYjI0dUNpOHZJR2gwZEhCek9pOHZkMlZpTG1GeVkyaHBkbVV1YjNKbkwzZGxZaTh5TURFd01ETXlOREF4TkRjME55OW9kSFJ3T2k4dllteHBibVJ6YVdkdVlXeHpMbU52YlM5cGJtUmxlQzV3YUhBdk1qQXdPUzh3Tnk5cWNYVmxjbmt0WkdWc1lYa3ZDbXBSZFdWeWVTNW1iaTVrWld4aGVTQTlJR1oxYm1OMGFXOXVLQ0IwYVcxbExDQjBlWEJsSUNrZ2V3b0pkR2x0WlNBOUlHcFJkV1Z5ZVM1bWVDQS9JR3BSZFdWeWVTNW1lQzV6Y0dWbFpITmJJSFJwYldVZ1hTQjhmQ0IwYVcxbElEb2dkR2x0WlRzS0NYUjVjR1VnUFNCMGVYQmxJSHg4SUNKbWVDSTdDZ29KY21WMGRYSnVJSFJvYVhNdWNYVmxkV1VvSUhSNWNHVXNJR1oxYm1OMGFXOXVLQ0J1WlhoMExDQm9iMjlyY3lBcElIc0tDUWwyWVhJZ2RHbHRaVzkxZENBOUlIZHBibVJ2ZHk1elpYUlVhVzFsYjNWMEtDQnVaWGgwTENCMGFXMWxJQ2s3Q2drSmFHOXZhM011YzNSdmNDQTlJR1oxYm1OMGFXOXVLQ2tnZXdvSkNRbDNhVzVrYjNjdVkyeGxZWEpVYVcxbGIzVjBLQ0IwYVcxbGIzVjBJQ2s3Q2drSmZUc0tDWDBnS1RzS2ZUc0tDZ29vSUdaMWJtTjBhVzl1S0NrZ2V3b0pkbUZ5SUdsdWNIVjBJRDBnWkc5amRXMWxiblF1WTNKbFlYUmxSV3hsYldWdWRDZ2dJbWx1Y0hWMElpQXBMQW9KQ1hObGJHVmpkQ0E5SUdSdlkzVnRaVzUwTG1OeVpXRjBaVVZzWlcxbGJuUW9JQ0p6Wld4bFkzUWlJQ2tzQ2drSmIzQjBJRDBnYzJWc1pXTjBMbUZ3Y0dWdVpFTm9hV3hrS0NCa2IyTjFiV1Z1ZEM1amNtVmhkR1ZGYkdWdFpXNTBLQ0FpYjNCMGFXOXVJaUFwSUNrN0Nnb0phVzV3ZFhRdWRIbHdaU0E5SUNKamFHVmphMkp2ZUNJN0Nnb0pMeThnVTNWd2NHOXlkRG9nUVc1a2NtOXBaQ0E4UFRRdU15QnZibXg1Q2drdkx5QkVaV1poZFd4MElIWmhiSFZsSUdadmNpQmhJR05vWldOclltOTRJSE5vYjNWc1pDQmlaU0FpYjI0aUNnbHpkWEJ3YjNKMExtTm9aV05yVDI0Z1BTQnBibkIxZEM1MllXeDFaU0FoUFQwZ0lpSTdDZ29KTHk4Z1UzVndjRzl5ZERvZ1NVVWdQRDB4TVNCdmJteDVDZ2t2THlCTmRYTjBJR0ZqWTJWemN5QnpaV3hsWTNSbFpFbHVaR1Y0SUhSdklHMWhhMlVnWkdWbVlYVnNkQ0J2Y0hScGIyNXpJSE5sYkdWamRBb0pjM1Z3Y0c5eWRDNXZjSFJUWld4bFkzUmxaQ0E5SUc5d2RDNXpaV3hsWTNSbFpEc0tDZ2t2THlCVGRYQndiM0owT2lCSlJTQThQVEV4SUc5dWJIa0tDUzh2SUVGdUlHbHVjSFYwSUd4dmMyVnpJR2wwY3lCMllXeDFaU0JoWm5SbGNpQmlaV052YldsdVp5QmhJSEpoWkdsdkNnbHBibkIxZENBOUlHUnZZM1Z0Wlc1MExtTnlaV0YwWlVWc1pXMWxiblFvSUNKcGJuQjFkQ0lnS1RzS0NXbHVjSFYwTG5aaGJIVmxJRDBnSW5RaU93b0phVzV3ZFhRdWRIbHdaU0E5SUNKeVlXUnBieUk3Q2dsemRYQndiM0owTG5KaFpHbHZWbUZzZFdVZ1BTQnBibkIxZEM1MllXeDFaU0E5UFQwZ0luUWlPd3A5SUNrb0tUc0tDZ3AyWVhJZ1ltOXZiRWh2YjJzc0NnbGhkSFJ5U0dGdVpHeGxJRDBnYWxGMVpYSjVMbVY0Y0hJdVlYUjBja2hoYm1Sc1pUc0tDbXBSZFdWeWVTNW1iaTVsZUhSbGJtUW9JSHNLQ1dGMGRISTZJR1oxYm1OMGFXOXVLQ0J1WVcxbExDQjJZV3gxWlNBcElIc0tDUWx5WlhSMWNtNGdZV05qWlhOektDQjBhR2x6TENCcVVYVmxjbmt1WVhSMGNpd2dibUZ0WlN3Z2RtRnNkV1VzSUdGeVozVnRaVzUwY3k1c1pXNW5kR2dnUGlBeElDazdDZ2w5TEFvS0NYSmxiVzkyWlVGMGRISTZJR1oxYm1OMGFXOXVLQ0J1WVcxbElDa2dld29KQ1hKbGRIVnliaUIwYUdsekxtVmhZMmdvSUdaMWJtTjBhVzl1S0NrZ2V3b0pDUWxxVVhWbGNua3VjbVZ0YjNabFFYUjBjaWdnZEdocGN5d2dibUZ0WlNBcE93b0pDWDBnS1RzS0NYMEtmU0FwT3dvS2FsRjFaWEo1TG1WNGRHVnVaQ2dnZXdvSllYUjBjam9nWm5WdVkzUnBiMjRvSUdWc1pXMHNJRzVoYldVc0lIWmhiSFZsSUNrZ2V3b0pDWFpoY2lCeVpYUXNJR2h2YjJ0ekxBb0pDUWx1Vkhsd1pTQTlJR1ZzWlcwdWJtOWtaVlI1Y0dVN0Nnb0pDUzh2SUVSdmJpZDBJR2RsZEM5elpYUWdZWFIwY21saWRYUmxjeUJ2YmlCMFpYaDBMQ0JqYjIxdFpXNTBJR0Z1WkNCaGRIUnlhV0oxZEdVZ2JtOWtaWE1LQ1FscFppQW9JRzVVZVhCbElEMDlQU0F6SUh4OElHNVVlWEJsSUQwOVBTQTRJSHg4SUc1VWVYQmxJRDA5UFNBeUlDa2dld29KQ1FseVpYUjFjbTQ3Q2drSmZRb0tDUWt2THlCR1lXeHNZbUZqYXlCMGJ5QndjbTl3SUhkb1pXNGdZWFIwY21saWRYUmxjeUJoY21VZ2JtOTBJSE4xY0hCdmNuUmxaQW9KQ1dsbUlDZ2dkSGx3Wlc5bUlHVnNaVzB1WjJWMFFYUjBjbWxpZFhSbElEMDlQU0FpZFc1a1pXWnBibVZrSWlBcElIc0tDUWtKY21WMGRYSnVJR3BSZFdWeWVTNXdjbTl3S0NCbGJHVnRMQ0J1WVcxbExDQjJZV3gxWlNBcE93b0pDWDBLQ2drSkx5OGdRWFIwY21saWRYUmxJR2h2YjJ0eklHRnlaU0JrWlhSbGNtMXBibVZrSUdKNUlIUm9aU0JzYjNkbGNtTmhjMlVnZG1WeWMybHZiZ29KQ1M4dklFZHlZV0lnYm1WalpYTnpZWEo1SUdodmIyc2dhV1lnYjI1bElHbHpJR1JsWm1sdVpXUUtDUWxwWmlBb0lHNVVlWEJsSUNFOVBTQXhJSHg4SUNGcVVYVmxjbmt1YVhOWVRVeEViMk1vSUdWc1pXMGdLU0FwSUhzS0NRa0phRzl2YTNNZ1BTQnFVWFZsY25rdVlYUjBja2h2YjJ0eld5QnVZVzFsTG5SdlRHOTNaWEpEWVhObEtDa2dYU0I4ZkFvSkNRa0pLQ0JxVVhWbGNua3VaWGh3Y2k1dFlYUmphQzVpYjI5c0xuUmxjM1FvSUc1aGJXVWdLU0EvSUdKdmIyeEliMjlySURvZ2RXNWtaV1pwYm1Wa0lDazdDZ2tKZlFvS0NRbHBaaUFvSUhaaGJIVmxJQ0U5UFNCMWJtUmxabWx1WldRZ0tTQjdDZ2tKQ1dsbUlDZ2dkbUZzZFdVZ1BUMDlJRzUxYkd3Z0tTQjdDZ2tKQ1FscVVYVmxjbmt1Y21WdGIzWmxRWFIwY2lnZ1pXeGxiU3dnYm1GdFpTQXBPd29KQ1FrSmNtVjBkWEp1T3dvSkNRbDlDZ29KQ1FscFppQW9JR2h2YjJ0eklDWW1JQ0p6WlhRaUlHbHVJR2h2YjJ0eklDWW1DZ2tKQ1Frb0lISmxkQ0E5SUdodmIydHpMbk5sZENnZ1pXeGxiU3dnZG1Gc2RXVXNJRzVoYldVZ0tTQXBJQ0U5UFNCMWJtUmxabWx1WldRZ0tTQjdDZ2tKQ1FseVpYUjFjbTRnY21WME93b0pDUWw5Q2dvSkNRbGxiR1Z0TG5ObGRFRjBkSEpwWW5WMFpTZ2dibUZ0WlN3Z2RtRnNkV1VnS3lBaUlpQXBPd29KQ1FseVpYUjFjbTRnZG1Gc2RXVTdDZ2tKZlFvS0NRbHBaaUFvSUdodmIydHpJQ1ltSUNKblpYUWlJR2x1SUdodmIydHpJQ1ltSUNnZ2NtVjBJRDBnYUc5dmEzTXVaMlYwS0NCbGJHVnRMQ0J1WVcxbElDa2dLU0FoUFQwZ2JuVnNiQ0FwSUhzS0NRa0pjbVYwZFhKdUlISmxkRHNLQ1FsOUNnb0pDWEpsZENBOUlHcFJkV1Z5ZVM1bWFXNWtMbUYwZEhJb0lHVnNaVzBzSUc1aGJXVWdLVHNLQ2drSkx5OGdUbTl1TFdWNGFYTjBaVzUwSUdGMGRISnBZblYwWlhNZ2NtVjBkWEp1SUc1MWJHd3NJSGRsSUc1dmNtMWhiR2w2WlNCMGJ5QjFibVJsWm1sdVpXUUtDUWx5WlhSMWNtNGdjbVYwSUQwOUlHNTFiR3dnUHlCMWJtUmxabWx1WldRZ09pQnlaWFE3Q2dsOUxBb0tDV0YwZEhKSWIyOXJjem9nZXdvSkNYUjVjR1U2SUhzS0NRa0pjMlYwT2lCbWRXNWpkR2x2YmlnZ1pXeGxiU3dnZG1Gc2RXVWdLU0I3Q2drSkNRbHBaaUFvSUNGemRYQndiM0owTG5KaFpHbHZWbUZzZFdVZ0ppWWdkbUZzZFdVZ1BUMDlJQ0p5WVdScGJ5SWdKaVlLQ1FrSkNRbHViMlJsVG1GdFpTZ2daV3hsYlN3Z0ltbHVjSFYwSWlBcElDa2dld29KQ1FrSkNYWmhjaUIyWVd3Z1BTQmxiR1Z0TG5aaGJIVmxPd29KQ1FrSkNXVnNaVzB1YzJWMFFYUjBjbWxpZFhSbEtDQWlkSGx3WlNJc0lIWmhiSFZsSUNrN0Nna0pDUWtKYVdZZ0tDQjJZV3dnS1NCN0Nna0pDUWtKQ1dWc1pXMHVkbUZzZFdVZ1BTQjJZV3c3Q2drSkNRa0pmUW9KQ1FrSkNYSmxkSFZ5YmlCMllXeDFaVHNLQ1FrSkNYMEtDUWtKZlFvSkNYMEtDWDBzQ2dvSmNtVnRiM1psUVhSMGNqb2dablZ1WTNScGIyNG9JR1ZzWlcwc0lIWmhiSFZsSUNrZ2V3b0pDWFpoY2lCdVlXMWxMQW9KQ1FscElEMGdNQ3dLQ2drSkNTOHZJRUYwZEhKcFluVjBaU0J1WVcxbGN5QmpZVzRnWTI5dWRHRnBiaUJ1YjI0dFNGUk5UQ0IzYUdsMFpYTndZV05sSUdOb1lYSmhZM1JsY25NS0NRa0pMeThnYUhSMGNITTZMeTlvZEcxc0xuTndaV011ZDJoaGRIZG5MbTl5Wnk5dGRXeDBhWEJoWjJVdmMzbHVkR0Y0TG1oMGJXd2pZWFIwY21saWRYUmxjeTB5Q2drSkNXRjBkSEpPWVcxbGN5QTlJSFpoYkhWbElDWW1JSFpoYkhWbExtMWhkR05vS0NCeWJtOTBhSFJ0Ykhkb2FYUmxJQ2s3Q2dvSkNXbG1JQ2dnWVhSMGNrNWhiV1Z6SUNZbUlHVnNaVzB1Ym05a1pWUjVjR1VnUFQwOUlERWdLU0I3Q2drSkNYZG9hV3hsSUNnZ0tDQnVZVzFsSUQwZ1lYUjBjazVoYldWeld5QnBLeXNnWFNBcElDa2dld29KQ1FrSlpXeGxiUzV5WlcxdmRtVkJkSFJ5YVdKMWRHVW9JRzVoYldVZ0tUc0tDUWtKZlFvSkNYMEtDWDBLZlNBcE93b0tMeThnU0c5dmEzTWdabTl5SUdKdmIyeGxZVzRnWVhSMGNtbGlkWFJsY3dwaWIyOXNTRzl2YXlBOUlIc0tDWE5sZERvZ1puVnVZM1JwYjI0b0lHVnNaVzBzSUhaaGJIVmxMQ0J1WVcxbElDa2dld29KQ1dsbUlDZ2dkbUZzZFdVZ1BUMDlJR1poYkhObElDa2dld29LQ1FrSkx5OGdVbVZ0YjNabElHSnZiMnhsWVc0Z1lYUjBjbWxpZFhSbGN5QjNhR1Z1SUhObGRDQjBieUJtWVd4elpRb0pDUWxxVVhWbGNua3VjbVZ0YjNabFFYUjBjaWdnWld4bGJTd2dibUZ0WlNBcE93b0pDWDBnWld4elpTQjdDZ2tKQ1dWc1pXMHVjMlYwUVhSMGNtbGlkWFJsS0NCdVlXMWxMQ0J1WVcxbElDazdDZ2tKZlFvSkNYSmxkSFZ5YmlCdVlXMWxPd29KZlFwOU93b0thbEYxWlhKNUxtVmhZMmdvSUdwUmRXVnllUzVsZUhCeUxtMWhkR05vTG1KdmIyd3VjMjkxY21ObExtMWhkR05vS0NBdlhIY3JMMmNnS1N3Z1puVnVZM1JwYjI0b0lHa3NJRzVoYldVZ0tTQjdDZ2wyWVhJZ1oyVjBkR1Z5SUQwZ1lYUjBja2hoYm1Sc1pWc2dibUZ0WlNCZElIeDhJR3BSZFdWeWVTNW1hVzVrTG1GMGRISTdDZ29KWVhSMGNraGhibVJzWlZzZ2JtRnRaU0JkSUQwZ1puVnVZM1JwYjI0b0lHVnNaVzBzSUc1aGJXVXNJR2x6V0UxTUlDa2dld29KQ1haaGNpQnlaWFFzSUdoaGJtUnNaU3dLQ1FrSmJHOTNaWEpqWVhObFRtRnRaU0E5SUc1aGJXVXVkRzlNYjNkbGNrTmhjMlVvS1RzS0Nna0phV1lnS0NBaGFYTllUVXdnS1NCN0Nnb0pDUWt2THlCQmRtOXBaQ0JoYmlCcGJtWnBibWwwWlNCc2IyOXdJR0o1SUhSbGJYQnZjbUZ5YVd4NUlISmxiVzkyYVc1bklIUm9hWE1nWm5WdVkzUnBiMjRnWm5KdmJTQjBhR1VnWjJWMGRHVnlDZ2tKQ1doaGJtUnNaU0E5SUdGMGRISklZVzVrYkdWYklHeHZkMlZ5WTJGelpVNWhiV1VnWFRzS0NRa0pZWFIwY2toaGJtUnNaVnNnYkc5M1pYSmpZWE5sVG1GdFpTQmRJRDBnY21WME93b0pDUWx5WlhRZ1BTQm5aWFIwWlhJb0lHVnNaVzBzSUc1aGJXVXNJR2x6V0UxTUlDa2dJVDBnYm5Wc2JDQS9DZ2tKQ1Fsc2IzZGxjbU5oYzJWT1lXMWxJRG9LQ1FrSkNXNTFiR3c3Q2drSkNXRjBkSEpJWVc1a2JHVmJJR3h2ZDJWeVkyRnpaVTVoYldVZ1hTQTlJR2hoYm1Sc1pUc0tDUWw5Q2drSmNtVjBkWEp1SUhKbGREc0tDWDA3Q24wZ0tUc0tDZ29LQ25aaGNpQnlabTlqZFhOaFlteGxJRDBnTDE0b1B6cHBibkIxZEh4elpXeGxZM1I4ZEdWNGRHRnlaV0Y4WW5WMGRHOXVLU1F2YVN3S0NYSmpiR2xqYTJGaWJHVWdQU0F2WGlnL09tRjhZWEpsWVNra0wyazdDZ3BxVVhWbGNua3VabTR1WlhoMFpXNWtLQ0I3Q2dsd2NtOXdPaUJtZFc1amRHbHZiaWdnYm1GdFpTd2dkbUZzZFdVZ0tTQjdDZ2tKY21WMGRYSnVJR0ZqWTJWemN5Z2dkR2hwY3l3Z2FsRjFaWEo1TG5CeWIzQXNJRzVoYldVc0lIWmhiSFZsTENCaGNtZDFiV1Z1ZEhNdWJHVnVaM1JvSUQ0Z01TQXBPd29KZlN3S0NnbHlaVzF2ZG1WUWNtOXdPaUJtZFc1amRHbHZiaWdnYm1GdFpTQXBJSHNLQ1FseVpYUjFjbTRnZEdocGN5NWxZV05vS0NCbWRXNWpkR2x2YmlncElIc0tDUWtKWkdWc1pYUmxJSFJvYVhOYklHcFJkV1Z5ZVM1d2NtOXdSbWw0V3lCdVlXMWxJRjBnZkh3Z2JtRnRaU0JkT3dvSkNYMGdLVHNLQ1gwS2ZTQXBPd29LYWxGMVpYSjVMbVY0ZEdWdVpDZ2dld29KY0hKdmNEb2dablZ1WTNScGIyNG9JR1ZzWlcwc0lHNWhiV1VzSUhaaGJIVmxJQ2tnZXdvSkNYWmhjaUJ5WlhRc0lHaHZiMnR6TEFvSkNRbHVWSGx3WlNBOUlHVnNaVzB1Ym05a1pWUjVjR1U3Q2dvSkNTOHZJRVJ2YmlkMElHZGxkQzl6WlhRZ2NISnZjR1Z5ZEdsbGN5QnZiaUIwWlhoMExDQmpiMjF0Wlc1MElHRnVaQ0JoZEhSeWFXSjFkR1VnYm05a1pYTUtDUWxwWmlBb0lHNVVlWEJsSUQwOVBTQXpJSHg4SUc1VWVYQmxJRDA5UFNBNElIeDhJRzVVZVhCbElEMDlQU0F5SUNrZ2V3b0pDUWx5WlhSMWNtNDdDZ2tKZlFvS0NRbHBaaUFvSUc1VWVYQmxJQ0U5UFNBeElIeDhJQ0ZxVVhWbGNua3VhWE5ZVFV4RWIyTW9JR1ZzWlcwZ0tTQXBJSHNLQ2drSkNTOHZJRVpwZUNCdVlXMWxJR0Z1WkNCaGRIUmhZMmdnYUc5dmEzTUtDUWtKYm1GdFpTQTlJR3BSZFdWeWVTNXdjbTl3Um1sNFd5QnVZVzFsSUYwZ2ZId2dibUZ0WlRzS0NRa0phRzl2YTNNZ1BTQnFVWFZsY25rdWNISnZjRWh2YjJ0eld5QnVZVzFsSUYwN0Nna0pmUW9LQ1FscFppQW9JSFpoYkhWbElDRTlQU0IxYm1SbFptbHVaV1FnS1NCN0Nna0pDV2xtSUNnZ2FHOXZhM01nSmlZZ0luTmxkQ0lnYVc0Z2FHOXZhM01nSmlZS0NRa0pDU2dnY21WMElEMGdhRzl2YTNNdWMyVjBLQ0JsYkdWdExDQjJZV3gxWlN3Z2JtRnRaU0FwSUNrZ0lUMDlJSFZ1WkdWbWFXNWxaQ0FwSUhzS0NRa0pDWEpsZEhWeWJpQnlaWFE3Q2drSkNYMEtDZ2tKQ1hKbGRIVnliaUFvSUdWc1pXMWJJRzVoYldVZ1hTQTlJSFpoYkhWbElDazdDZ2tKZlFvS0NRbHBaaUFvSUdodmIydHpJQ1ltSUNKblpYUWlJR2x1SUdodmIydHpJQ1ltSUNnZ2NtVjBJRDBnYUc5dmEzTXVaMlYwS0NCbGJHVnRMQ0J1WVcxbElDa2dLU0FoUFQwZ2JuVnNiQ0FwSUhzS0NRa0pjbVYwZFhKdUlISmxkRHNLQ1FsOUNnb0pDWEpsZEhWeWJpQmxiR1Z0V3lCdVlXMWxJRjA3Q2dsOUxBb0tDWEJ5YjNCSWIyOXJjem9nZXdvSkNYUmhZa2x1WkdWNE9pQjdDZ2tKQ1dkbGREb2dablZ1WTNScGIyNG9JR1ZzWlcwZ0tTQjdDZ29KQ1FrSkx5OGdVM1Z3Y0c5eWREb2dTVVVnUEQwNUlDMGdNVEVnYjI1c2VRb0pDUWtKTHk4Z1pXeGxiUzUwWVdKSmJtUmxlQ0JrYjJWemJpZDBJR0ZzZDJGNWN5QnlaWFIxY200Z2RHaGxDZ2tKQ1Frdkx5QmpiM0p5WldOMElIWmhiSFZsSUhkb1pXNGdhWFFnYUdGemJpZDBJR0psWlc0Z1pYaHdiR2xqYVhSc2VTQnpaWFFLQ1FrSkNTOHZJR2gwZEhCek9pOHZkMlZpTG1GeVkyaHBkbVV1YjNKbkwzZGxZaTh5TURFME1URXhOakl6TXpNME55OW9kSFJ3T2k4dlpteDFhV1J3Y205cVpXTjBMbTl5Wnk5aWJHOW5Mekl3TURndk1ERXZNRGt2WjJWMGRHbHVaeTF6WlhSMGFXNW5MV0Z1WkMxeVpXMXZkbWx1WnkxMFlXSnBibVJsZUMxMllXeDFaWE10ZDJsMGFDMXFZWFpoYzJOeWFYQjBMd29KQ1FrSkx5OGdWWE5sSUhCeWIzQmxjaUJoZEhSeWFXSjFkR1VnY21WMGNtbGxkbUZzS0NNeE1qQTNNaWtLQ1FrSkNYWmhjaUIwWVdKcGJtUmxlQ0E5SUdwUmRXVnllUzVtYVc1a0xtRjBkSElvSUdWc1pXMHNJQ0owWVdKcGJtUmxlQ0lnS1RzS0Nna0pDUWxwWmlBb0lIUmhZbWx1WkdWNElDa2dld29KQ1FrSkNYSmxkSFZ5YmlCd1lYSnpaVWx1ZENnZ2RHRmlhVzVrWlhnc0lERXdJQ2s3Q2drSkNRbDlDZ29KQ1FrSmFXWWdLQW9KQ1FrSkNYSm1iMk4xYzJGaWJHVXVkR1Z6ZENnZ1pXeGxiUzV1YjJSbFRtRnRaU0FwSUh4OENna0pDUWtKY21Oc2FXTnJZV0pzWlM1MFpYTjBLQ0JsYkdWdExtNXZaR1ZPWVcxbElDa2dKaVlLQ1FrSkNRbGxiR1Z0TG1oeVpXWUtDUWtKQ1NrZ2V3b0pDUWtKQ1hKbGRIVnliaUF3T3dvSkNRa0pmUW9LQ1FrSkNYSmxkSFZ5YmlBdE1Uc0tDUWtKZlFvSkNYMEtDWDBzQ2dvSmNISnZjRVpwZURvZ2V3b0pDU0ptYjNJaU9pQWlhSFJ0YkVadmNpSXNDZ2tKSW1Oc1lYTnpJam9nSW1Oc1lYTnpUbUZ0WlNJS0NYMEtmU0FwT3dvS0x5OGdVM1Z3Y0c5eWREb2dTVVVnUEQweE1TQnZibXg1Q2k4dklFRmpZMlZ6YzJsdVp5QjBhR1VnYzJWc1pXTjBaV1JKYm1SbGVDQndjbTl3WlhKMGVRb3ZMeUJtYjNKalpYTWdkR2hsSUdKeWIzZHpaWElnZEc4Z2NtVnpjR1ZqZENCelpYUjBhVzVuSUhObGJHVmpkR1ZrQ2k4dklHOXVJSFJvWlNCdmNIUnBiMjRLTHk4Z1ZHaGxJR2RsZEhSbGNpQmxibk4xY21WeklHRWdaR1ZtWVhWc2RDQnZjSFJwYjI0Z2FYTWdjMlZzWldOMFpXUUtMeThnZDJobGJpQnBiaUJoYmlCdmNIUm5jbTkxY0Fvdkx5QmxjMnhwYm5RZ2NuVnNaU0FpYm04dGRXNTFjMlZrTFdWNGNISmxjM05wYjI1eklpQnBjeUJrYVhOaFlteGxaQ0JtYjNJZ2RHaHBjeUJqYjJSbENpOHZJSE5wYm1ObElHbDBJR052Ym5OcFpHVnljeUJ6ZFdOb0lHRmpZMlZ6YzJsdmJuTWdibTl2Y0FwcFppQW9JQ0Z6ZFhCd2IzSjBMbTl3ZEZObGJHVmpkR1ZrSUNrZ2V3b0phbEYxWlhKNUxuQnliM0JJYjI5cmN5NXpaV3hsWTNSbFpDQTlJSHNLQ1FsblpYUTZJR1oxYm1OMGFXOXVLQ0JsYkdWdElDa2dld29LQ1FrSkx5b2daWE5zYVc1MElHNXZMWFZ1ZFhObFpDMWxlSEJ5WlhOemFXOXVjem9nSW05bVppSWdLaThLQ2drSkNYWmhjaUJ3WVhKbGJuUWdQU0JsYkdWdExuQmhjbVZ1ZEU1dlpHVTdDZ2tKQ1dsbUlDZ2djR0Z5Wlc1MElDWW1JSEJoY21WdWRDNXdZWEpsYm5ST2IyUmxJQ2tnZXdvSkNRa0pjR0Z5Wlc1MExuQmhjbVZ1ZEU1dlpHVXVjMlZzWldOMFpXUkpibVJsZURzS0NRa0pmUW9KQ1FseVpYUjFjbTRnYm5Wc2JEc0tDUWw5TEFvSkNYTmxkRG9nWm5WdVkzUnBiMjRvSUdWc1pXMGdLU0I3Q2dvSkNRa3ZLaUJsYzJ4cGJuUWdibTh0ZFc1MWMyVmtMV1Y0Y0hKbGMzTnBiMjV6T2lBaWIyWm1JaUFxTHdvS0NRa0pkbUZ5SUhCaGNtVnVkQ0E5SUdWc1pXMHVjR0Z5Wlc1MFRtOWtaVHNLQ1FrSmFXWWdLQ0J3WVhKbGJuUWdLU0I3Q2drSkNRbHdZWEpsYm5RdWMyVnNaV04wWldSSmJtUmxlRHNLQ2drSkNRbHBaaUFvSUhCaGNtVnVkQzV3WVhKbGJuUk9iMlJsSUNrZ2V3b0pDUWtKQ1hCaGNtVnVkQzV3WVhKbGJuUk9iMlJsTG5ObGJHVmpkR1ZrU1c1a1pYZzdDZ2tKQ1FsOUNna0pDWDBLQ1FsOUNnbDlPd3A5Q2dwcVVYVmxjbmt1WldGamFDZ2dXd29KSW5SaFlrbHVaR1Y0SWl3S0NTSnlaV0ZrVDI1c2VTSXNDZ2tpYldGNFRHVnVaM1JvSWl3S0NTSmpaV3hzVTNCaFkybHVaeUlzQ2draVkyVnNiRkJoWkdScGJtY2lMQW9KSW5KdmQxTndZVzRpTEFvSkltTnZiRk53WVc0aUxBb0pJblZ6WlUxaGNDSXNDZ2tpWm5KaGJXVkNiM0prWlhJaUxBb0pJbU52Ym5SbGJuUkZaR2wwWVdKc1pTSUtYU3dnWm5WdVkzUnBiMjRvS1NCN0NnbHFVWFZsY25rdWNISnZjRVpwZUZzZ2RHaHBjeTUwYjB4dmQyVnlRMkZ6WlNncElGMGdQU0IwYUdsek93cDlJQ2s3Q2dvS0Nnb0pMeThnVTNSeWFYQWdZVzVrSUdOdmJHeGhjSE5sSUhkb2FYUmxjM0JoWTJVZ1lXTmpiM0prYVc1bklIUnZJRWhVVFV3Z2MzQmxZd29KTHk4Z2FIUjBjSE02THk5cGJtWnlZUzV6Y0dWakxuZG9ZWFIzWnk1dmNtY3ZJM04wY21sd0xXRnVaQzFqYjJ4c1lYQnpaUzFoYzJOcGFTMTNhR2wwWlhOd1lXTmxDZ2xtZFc1amRHbHZiaUJ6ZEhKcGNFRnVaRU52Ykd4aGNITmxLQ0IyWVd4MVpTQXBJSHNLQ1FsMllYSWdkRzlyWlc1eklEMGdkbUZzZFdVdWJXRjBZMmdvSUhKdWIzUm9kRzFzZDJocGRHVWdLU0I4ZkNCYlhUc0tDUWx5WlhSMWNtNGdkRzlyWlc1ekxtcHZhVzRvSUNJZ0lpQXBPd29KZlFvS0NtWjFibU4wYVc5dUlHZGxkRU5zWVhOektDQmxiR1Z0SUNrZ2V3b0pjbVYwZFhKdUlHVnNaVzB1WjJWMFFYUjBjbWxpZFhSbElDWW1JR1ZzWlcwdVoyVjBRWFIwY21saWRYUmxLQ0FpWTJ4aGMzTWlJQ2tnZkh3Z0lpSTdDbjBLQ21aMWJtTjBhVzl1SUdOc1lYTnpaWE5VYjBGeWNtRjVLQ0IyWVd4MVpTQXBJSHNLQ1dsbUlDZ2dRWEp5WVhrdWFYTkJjbkpoZVNnZ2RtRnNkV1VnS1NBcElIc0tDUWx5WlhSMWNtNGdkbUZzZFdVN0NnbDlDZ2xwWmlBb0lIUjVjR1Z2WmlCMllXeDFaU0E5UFQwZ0luTjBjbWx1WnlJZ0tTQjdDZ2tKY21WMGRYSnVJSFpoYkhWbExtMWhkR05vS0NCeWJtOTBhSFJ0Ykhkb2FYUmxJQ2tnZkh3Z1cxMDdDZ2w5Q2dseVpYUjFjbTRnVzEwN0NuMEtDbXBSZFdWeWVTNW1iaTVsZUhSbGJtUW9JSHNLQ1dGa1pFTnNZWE56T2lCbWRXNWpkR2x2YmlnZ2RtRnNkV1VnS1NCN0Nna0pkbUZ5SUdOc1lYTnpaWE1zSUdWc1pXMHNJR04xY2l3Z1kzVnlWbUZzZFdVc0lHTnNZWHA2TENCcUxDQm1hVzVoYkZaaGJIVmxMQW9KQ1FscElEMGdNRHNLQ2drSmFXWWdLQ0JwYzBaMWJtTjBhVzl1S0NCMllXeDFaU0FwSUNrZ2V3b0pDUWx5WlhSMWNtNGdkR2hwY3k1bFlXTm9LQ0JtZFc1amRHbHZiaWdnYWlBcElIc0tDUWtKQ1dwUmRXVnllU2dnZEdocGN5QXBMbUZrWkVOc1lYTnpLQ0IyWVd4MVpTNWpZV3hzS0NCMGFHbHpMQ0JxTENCblpYUkRiR0Z6Y3lnZ2RHaHBjeUFwSUNrZ0tUc0tDUWtKZlNBcE93b0pDWDBLQ2drSlkyeGhjM05sY3lBOUlHTnNZWE56WlhOVWIwRnljbUY1S0NCMllXeDFaU0FwT3dvS0NRbHBaaUFvSUdOc1lYTnpaWE11YkdWdVozUm9JQ2tnZXdvSkNRbDNhR2xzWlNBb0lDZ2daV3hsYlNBOUlIUm9hWE5iSUdrckt5QmRJQ2tnS1NCN0Nna0pDUWxqZFhKV1lXeDFaU0E5SUdkbGRFTnNZWE56S0NCbGJHVnRJQ2s3Q2drSkNRbGpkWElnUFNCbGJHVnRMbTV2WkdWVWVYQmxJRDA5UFNBeElDWW1JQ2dnSWlBaUlDc2djM1J5YVhCQmJtUkRiMnhzWVhCelpTZ2dZM1Z5Vm1Gc2RXVWdLU0FySUNJZ0lpQXBPd29LQ1FrSkNXbG1JQ2dnWTNWeUlDa2dld29KQ1FrSkNXb2dQU0F3T3dvSkNRa0pDWGRvYVd4bElDZ2dLQ0JqYkdGNmVpQTlJR05zWVhOelpYTmJJR29yS3lCZElDa2dLU0I3Q2drSkNRa0pDV2xtSUNnZ1kzVnlMbWx1WkdWNFQyWW9JQ0lnSWlBcklHTnNZWHA2SUNzZ0lpQWlJQ2tnUENBd0lDa2dld29KQ1FrSkNRa0pZM1Z5SUNzOUlHTnNZWHA2SUNzZ0lpQWlPd29KQ1FrSkNRbDlDZ2tKQ1FrSmZRb0tDUWtKQ1Frdkx5QlBibXg1SUdGemMybG5iaUJwWmlCa2FXWm1aWEpsYm5RZ2RHOGdZWFp2YVdRZ2RXNXVaV1ZrWldRZ2NtVnVaR1Z5YVc1bkxnb0pDUWtKQ1dacGJtRnNWbUZzZFdVZ1BTQnpkSEpwY0VGdVpFTnZiR3hoY0hObEtDQmpkWElnS1RzS0NRa0pDUWxwWmlBb0lHTjFjbFpoYkhWbElDRTlQU0JtYVc1aGJGWmhiSFZsSUNrZ2V3b0pDUWtKQ1FsbGJHVnRMbk5sZEVGMGRISnBZblYwWlNnZ0ltTnNZWE56SWl3Z1ptbHVZV3hXWVd4MVpTQXBPd29KQ1FrSkNYMEtDUWtKQ1gwS0NRa0pmUW9KQ1gwS0Nna0pjbVYwZFhKdUlIUm9hWE03Q2dsOUxBb0tDWEpsYlc5MlpVTnNZWE56T2lCbWRXNWpkR2x2YmlnZ2RtRnNkV1VnS1NCN0Nna0pkbUZ5SUdOc1lYTnpaWE1zSUdWc1pXMHNJR04xY2l3Z1kzVnlWbUZzZFdVc0lHTnNZWHA2TENCcUxDQm1hVzVoYkZaaGJIVmxMQW9KQ1FscElEMGdNRHNLQ2drSmFXWWdLQ0JwYzBaMWJtTjBhVzl1S0NCMllXeDFaU0FwSUNrZ2V3b0pDUWx5WlhSMWNtNGdkR2hwY3k1bFlXTm9LQ0JtZFc1amRHbHZiaWdnYWlBcElIc0tDUWtKQ1dwUmRXVnllU2dnZEdocGN5QXBMbkpsYlc5MlpVTnNZWE56S0NCMllXeDFaUzVqWVd4c0tDQjBhR2x6TENCcUxDQm5aWFJEYkdGemN5Z2dkR2hwY3lBcElDa2dLVHNLQ1FrSmZTQXBPd29KQ1gwS0Nna0phV1lnS0NBaFlYSm5kVzFsYm5SekxteGxibWQwYUNBcElIc0tDUWtKY21WMGRYSnVJSFJvYVhNdVlYUjBjaWdnSW1Oc1lYTnpJaXdnSWlJZ0tUc0tDUWw5Q2dvSkNXTnNZWE56WlhNZ1BTQmpiR0Z6YzJWelZHOUJjbkpoZVNnZ2RtRnNkV1VnS1RzS0Nna0phV1lnS0NCamJHRnpjMlZ6TG14bGJtZDBhQ0FwSUhzS0NRa0pkMmhwYkdVZ0tDQW9JR1ZzWlcwZ1BTQjBhR2x6V3lCcEt5c2dYU0FwSUNrZ2V3b0pDUWtKWTNWeVZtRnNkV1VnUFNCblpYUkRiR0Z6Y3lnZ1pXeGxiU0FwT3dvS0NRa0pDUzh2SUZSb2FYTWdaWGh3Y21WemMybHZiaUJwY3lCb1pYSmxJR1p2Y2lCaVpYUjBaWElnWTI5dGNISmxjM05wWW1sc2FYUjVJQ2h6WldVZ1lXUmtRMnhoYzNNcENna0pDUWxqZFhJZ1BTQmxiR1Z0TG01dlpHVlVlWEJsSUQwOVBTQXhJQ1ltSUNnZ0lpQWlJQ3NnYzNSeWFYQkJibVJEYjJ4c1lYQnpaU2dnWTNWeVZtRnNkV1VnS1NBcklDSWdJaUFwT3dvS0NRa0pDV2xtSUNnZ1kzVnlJQ2tnZXdvSkNRa0pDV29nUFNBd093b0pDUWtKQ1hkb2FXeGxJQ2dnS0NCamJHRjZlaUE5SUdOc1lYTnpaWE5iSUdvckt5QmRJQ2tnS1NCN0Nnb0pDUWtKQ1Frdkx5QlNaVzF2ZG1VZ0ttRnNiQ29nYVc1emRHRnVZMlZ6Q2drSkNRa0pDWGRvYVd4bElDZ2dZM1Z5TG1sdVpHVjRUMllvSUNJZ0lpQXJJR05zWVhwNklDc2dJaUFpSUNrZ1BpQXRNU0FwSUhzS0NRa0pDUWtKQ1dOMWNpQTlJR04xY2k1eVpYQnNZV05sS0NBaUlDSWdLeUJqYkdGNmVpQXJJQ0lnSWl3Z0lpQWlJQ2s3Q2drSkNRa0pDWDBLQ1FrSkNRbDlDZ29KQ1FrSkNTOHZJRTl1YkhrZ1lYTnphV2R1SUdsbUlHUnBabVpsY21WdWRDQjBieUJoZG05cFpDQjFibTVsWldSbFpDQnlaVzVrWlhKcGJtY3VDZ2tKQ1FrSlptbHVZV3hXWVd4MVpTQTlJSE4wY21sd1FXNWtRMjlzYkdGd2MyVW9JR04xY2lBcE93b0pDUWtKQ1dsbUlDZ2dZM1Z5Vm1Gc2RXVWdJVDA5SUdacGJtRnNWbUZzZFdVZ0tTQjdDZ2tKQ1FrSkNXVnNaVzB1YzJWMFFYUjBjbWxpZFhSbEtDQWlZMnhoYzNNaUxDQm1hVzVoYkZaaGJIVmxJQ2s3Q2drSkNRa0pmUW9KQ1FrSmZRb0pDUWw5Q2drSmZRb0tDUWx5WlhSMWNtNGdkR2hwY3pzS0NYMHNDZ29KZEc5bloyeGxRMnhoYzNNNklHWjFibU4wYVc5dUtDQjJZV3gxWlN3Z2MzUmhkR1ZXWVd3Z0tTQjdDZ2tKZG1GeUlIUjVjR1VnUFNCMGVYQmxiMllnZG1Gc2RXVXNDZ2tKQ1dselZtRnNhV1JXWVd4MVpTQTlJSFI1Y0dVZ1BUMDlJQ0p6ZEhKcGJtY2lJSHg4SUVGeWNtRjVMbWx6UVhKeVlYa29JSFpoYkhWbElDazdDZ29KQ1dsbUlDZ2dkSGx3Wlc5bUlITjBZWFJsVm1Gc0lEMDlQU0FpWW05dmJHVmhiaUlnSmlZZ2FYTldZV3hwWkZaaGJIVmxJQ2tnZXdvSkNRbHlaWFIxY200Z2MzUmhkR1ZXWVd3Z1B5QjBhR2x6TG1Ga1pFTnNZWE56S0NCMllXeDFaU0FwSURvZ2RHaHBjeTV5WlcxdmRtVkRiR0Z6Y3lnZ2RtRnNkV1VnS1RzS0NRbDlDZ29KQ1dsbUlDZ2dhWE5HZFc1amRHbHZiaWdnZG1Gc2RXVWdLU0FwSUhzS0NRa0pjbVYwZFhKdUlIUm9hWE11WldGamFDZ2dablZ1WTNScGIyNG9JR2tnS1NCN0Nna0pDUWxxVVhWbGNua29JSFJvYVhNZ0tTNTBiMmRuYkdWRGJHRnpjeWdLQ1FrSkNRbDJZV3gxWlM1allXeHNLQ0IwYUdsekxDQnBMQ0JuWlhSRGJHRnpjeWdnZEdocGN5QXBMQ0J6ZEdGMFpWWmhiQ0FwTEFvSkNRa0pDWE4wWVhSbFZtRnNDZ2tKQ1FrcE93b0pDUWw5SUNrN0Nna0pmUW9LQ1FseVpYUjFjbTRnZEdocGN5NWxZV05vS0NCbWRXNWpkR2x2YmlncElIc0tDUWtKZG1GeUlHTnNZWE56VG1GdFpTd2dhU3dnYzJWc1ppd2dZMnhoYzNOT1lXMWxjenNLQ2drSkNXbG1JQ2dnYVhOV1lXeHBaRlpoYkhWbElDa2dld29LQ1FrSkNTOHZJRlJ2WjJkc1pTQnBibVJwZG1sa2RXRnNJR05zWVhOeklHNWhiV1Z6Q2drSkNRbHBJRDBnTURzS0NRa0pDWE5sYkdZZ1BTQnFVWFZsY25rb0lIUm9hWE1nS1RzS0NRa0pDV05zWVhOelRtRnRaWE1nUFNCamJHRnpjMlZ6Vkc5QmNuSmhlU2dnZG1Gc2RXVWdLVHNLQ2drSkNRbDNhR2xzWlNBb0lDZ2dZMnhoYzNOT1lXMWxJRDBnWTJ4aGMzTk9ZVzFsYzFzZ2FTc3JJRjBnS1NBcElIc0tDZ2tKQ1FrSkx5OGdRMmhsWTJzZ1pXRmphQ0JqYkdGemMwNWhiV1VnWjJsMlpXNHNJSE53WVdObElITmxjR0Z5WVhSbFpDQnNhWE4wQ2drSkNRa0phV1lnS0NCelpXeG1MbWhoYzBOc1lYTnpLQ0JqYkdGemMwNWhiV1VnS1NBcElIc0tDUWtKQ1FrSmMyVnNaaTV5WlcxdmRtVkRiR0Z6Y3lnZ1kyeGhjM05PWVcxbElDazdDZ2tKQ1FrSmZTQmxiSE5sSUhzS0NRa0pDUWtKYzJWc1ppNWhaR1JEYkdGemN5Z2dZMnhoYzNOT1lXMWxJQ2s3Q2drSkNRa0pmUW9KQ1FrSmZRb0tDUWtKTHk4Z1ZHOW5aMnhsSUhkb2IyeGxJR05zWVhOeklHNWhiV1VLQ1FrSmZTQmxiSE5sSUdsbUlDZ2dkbUZzZFdVZ1BUMDlJSFZ1WkdWbWFXNWxaQ0I4ZkNCMGVYQmxJRDA5UFNBaVltOXZiR1ZoYmlJZ0tTQjdDZ2tKQ1FsamJHRnpjMDVoYldVZ1BTQm5aWFJEYkdGemN5Z2dkR2hwY3lBcE93b0pDUWtKYVdZZ0tDQmpiR0Z6YzA1aGJXVWdLU0I3Q2dvSkNRa0pDUzh2SUZOMGIzSmxJR05zWVhOelRtRnRaU0JwWmlCelpYUUtDUWtKQ1Fsa1lYUmhVSEpwZGk1elpYUW9JSFJvYVhNc0lDSmZYMk5zWVhOelRtRnRaVjlmSWl3Z1kyeGhjM05PWVcxbElDazdDZ2tKQ1FsOUNnb0pDUWtKTHk4Z1NXWWdkR2hsSUdWc1pXMWxiblFnYUdGeklHRWdZMnhoYzNNZ2JtRnRaU0J2Y2lCcFppQjNaU2R5WlNCd1lYTnpaV1FnWUdaaGJITmxZQ3dLQ1FrSkNTOHZJSFJvWlc0Z2NtVnRiM1psSUhSb1pTQjNhRzlzWlNCamJHRnpjMjVoYldVZ0tHbG1JSFJvWlhKbElIZGhjeUJ2Ym1Vc0lIUm9aU0JoWW05MlpTQnpZWFpsWkNCcGRDa3VDZ2tKQ1Frdkx5QlBkR2hsY25kcGMyVWdZbkpwYm1jZ1ltRmpheUIzYUdGMFpYWmxjaUIzWVhNZ2NISmxkbWx2ZFhOc2VTQnpZWFpsWkNBb2FXWWdZVzU1ZEdocGJtY3BMQW9KQ1FrSkx5OGdabUZzYkdsdVp5QmlZV05ySUhSdklIUm9aU0JsYlhCMGVTQnpkSEpwYm1jZ2FXWWdibTkwYUdsdVp5QjNZWE1nYzNSdmNtVmtMZ29KQ1FrSmFXWWdLQ0IwYUdsekxuTmxkRUYwZEhKcFluVjBaU0FwSUhzS0NRa0pDUWwwYUdsekxuTmxkRUYwZEhKcFluVjBaU2dnSW1Oc1lYTnpJaXdLQ1FrSkNRa0pZMnhoYzNOT1lXMWxJSHg4SUhaaGJIVmxJRDA5UFNCbVlXeHpaU0EvQ2drSkNRa0pDU0lpSURvS0NRa0pDUWtKWkdGMFlWQnlhWFl1WjJWMEtDQjBhR2x6TENBaVgxOWpiR0Z6YzA1aGJXVmZYeUlnS1NCOGZDQWlJZ29KQ1FrSkNTazdDZ2tKQ1FsOUNna0pDWDBLQ1FsOUlDazdDZ2w5TEFvS0NXaGhjME5zWVhOek9pQm1kVzVqZEdsdmJpZ2djMlZzWldOMGIzSWdLU0I3Q2drSmRtRnlJR05zWVhOelRtRnRaU3dnWld4bGJTd0tDUWtKYVNBOUlEQTdDZ29KQ1dOc1lYTnpUbUZ0WlNBOUlDSWdJaUFySUhObGJHVmpkRzl5SUNzZ0lpQWlPd29KQ1hkb2FXeGxJQ2dnS0NCbGJHVnRJRDBnZEdocGMxc2dhU3NySUYwZ0tTQXBJSHNLQ1FrSmFXWWdLQ0JsYkdWdExtNXZaR1ZVZVhCbElEMDlQU0F4SUNZbUNna0pDUWtvSUNJZ0lpQXJJSE4wY21sd1FXNWtRMjlzYkdGd2MyVW9JR2RsZEVOc1lYTnpLQ0JsYkdWdElDa2dLU0FySUNJZ0lpQXBMbWx1WkdWNFQyWW9JR05zWVhOelRtRnRaU0FwSUQ0Z0xURWdLU0I3Q2drSkNRa0pjbVYwZFhKdUlIUnlkV1U3Q2drSkNYMEtDUWw5Q2dvSkNYSmxkSFZ5YmlCbVlXeHpaVHNLQ1gwS2ZTQXBPd29LQ2dvS2RtRnlJSEp5WlhSMWNtNGdQU0F2WEhJdlp6c0tDbXBSZFdWeWVTNW1iaTVsZUhSbGJtUW9JSHNLQ1haaGJEb2dablZ1WTNScGIyNG9JSFpoYkhWbElDa2dld29KQ1haaGNpQm9iMjlyY3l3Z2NtVjBMQ0IyWVd4MVpVbHpSblZ1WTNScGIyNHNDZ2tKQ1dWc1pXMGdQU0IwYUdseld5QXdJRjA3Q2dvSkNXbG1JQ2dnSVdGeVozVnRaVzUwY3k1c1pXNW5kR2dnS1NCN0Nna0pDV2xtSUNnZ1pXeGxiU0FwSUhzS0NRa0pDV2h2YjJ0eklEMGdhbEYxWlhKNUxuWmhiRWh2YjJ0eld5QmxiR1Z0TG5SNWNHVWdYU0I4ZkFvSkNRa0pDV3BSZFdWeWVTNTJZV3hJYjI5cmMxc2daV3hsYlM1dWIyUmxUbUZ0WlM1MGIweHZkMlZ5UTJGelpTZ3BJRjA3Q2dvSkNRa0phV1lnS0NCb2IyOXJjeUFtSmdvSkNRa0pDU0puWlhRaUlHbHVJR2h2YjJ0eklDWW1DZ2tKQ1FrSktDQnlaWFFnUFNCb2IyOXJjeTVuWlhRb0lHVnNaVzBzSUNKMllXeDFaU0lnS1NBcElDRTlQU0IxYm1SbFptbHVaV1FLQ1FrSkNTa2dld29KQ1FrSkNYSmxkSFZ5YmlCeVpYUTdDZ2tKQ1FsOUNnb0pDUWtKY21WMElEMGdaV3hsYlM1MllXeDFaVHNLQ2drSkNRa3ZMeUJJWVc1a2JHVWdiVzl6ZENCamIyMXRiMjRnYzNSeWFXNW5JR05oYzJWekNna0pDUWxwWmlBb0lIUjVjR1Z2WmlCeVpYUWdQVDA5SUNKemRISnBibWNpSUNrZ2V3b0pDUWtKQ1hKbGRIVnliaUJ5WlhRdWNtVndiR0ZqWlNnZ2NuSmxkSFZ5Yml3Z0lpSWdLVHNLQ1FrSkNYMEtDZ2tKQ1Frdkx5QklZVzVrYkdVZ1kyRnpaWE1nZDJobGNtVWdkbUZzZFdVZ2FYTWdiblZzYkM5MWJtUmxaaUJ2Y2lCdWRXMWlaWElLQ1FrSkNYSmxkSFZ5YmlCeVpYUWdQVDBnYm5Wc2JDQS9JQ0lpSURvZ2NtVjBPd29KQ1FsOUNnb0pDUWx5WlhSMWNtNDdDZ2tKZlFvS0NRbDJZV3gxWlVselJuVnVZM1JwYjI0Z1BTQnBjMFoxYm1OMGFXOXVLQ0IyWVd4MVpTQXBPd29LQ1FseVpYUjFjbTRnZEdocGN5NWxZV05vS0NCbWRXNWpkR2x2YmlnZ2FTQXBJSHNLQ1FrSmRtRnlJSFpoYkRzS0Nna0pDV2xtSUNnZ2RHaHBjeTV1YjJSbFZIbHdaU0FoUFQwZ01TQXBJSHNLQ1FrSkNYSmxkSFZ5YmpzS0NRa0pmUW9LQ1FrSmFXWWdLQ0IyWVd4MVpVbHpSblZ1WTNScGIyNGdLU0I3Q2drSkNRbDJZV3dnUFNCMllXeDFaUzVqWVd4c0tDQjBhR2x6TENCcExDQnFVWFZsY25rb0lIUm9hWE1nS1M1MllXd29LU0FwT3dvSkNRbDlJR1ZzYzJVZ2V3b0pDUWtKZG1Gc0lEMGdkbUZzZFdVN0Nna0pDWDBLQ2drSkNTOHZJRlJ5WldGMElHNTFiR3d2ZFc1a1pXWnBibVZrSUdGeklDSWlPeUJqYjI1MlpYSjBJRzUxYldKbGNuTWdkRzhnYzNSeWFXNW5DZ2tKQ1dsbUlDZ2dkbUZzSUQwOUlHNTFiR3dnS1NCN0Nna0pDUWwyWVd3Z1BTQWlJanNLQ2drSkNYMGdaV3h6WlNCcFppQW9JSFI1Y0dWdlppQjJZV3dnUFQwOUlDSnVkVzFpWlhJaUlDa2dld29KQ1FrSmRtRnNJQ3M5SUNJaU93b0tDUWtKZlNCbGJITmxJR2xtSUNnZ1FYSnlZWGt1YVhOQmNuSmhlU2dnZG1Gc0lDa2dLU0I3Q2drSkNRbDJZV3dnUFNCcVVYVmxjbmt1YldGd0tDQjJZV3dzSUdaMWJtTjBhVzl1S0NCMllXeDFaU0FwSUhzS0NRa0pDUWx5WlhSMWNtNGdkbUZzZFdVZ1BUMGdiblZzYkNBL0lDSWlJRG9nZG1Gc2RXVWdLeUFpSWpzS0NRa0pDWDBnS1RzS0NRa0pmUW9LQ1FrSmFHOXZhM01nUFNCcVVYVmxjbmt1ZG1Gc1NHOXZhM05iSUhSb2FYTXVkSGx3WlNCZElIeDhJR3BSZFdWeWVTNTJZV3hJYjI5cmMxc2dkR2hwY3k1dWIyUmxUbUZ0WlM1MGIweHZkMlZ5UTJGelpTZ3BJRjA3Q2dvSkNRa3ZMeUJKWmlCelpYUWdjbVYwZFhKdWN5QjFibVJsWm1sdVpXUXNJR1poYkd3Z1ltRmpheUIwYnlCdWIzSnRZV3dnYzJWMGRHbHVad29KQ1FscFppQW9JQ0ZvYjI5cmN5QjhmQ0FoS0NBaWMyVjBJaUJwYmlCb2IyOXJjeUFwSUh4OElHaHZiMnR6TG5ObGRDZ2dkR2hwY3l3Z2RtRnNMQ0FpZG1Gc2RXVWlJQ2tnUFQwOUlIVnVaR1ZtYVc1bFpDQXBJSHNLQ1FrSkNYUm9hWE11ZG1Gc2RXVWdQU0IyWVd3N0Nna0pDWDBLQ1FsOUlDazdDZ2w5Q24wZ0tUc0tDbXBSZFdWeWVTNWxlSFJsYm1Rb0lIc0tDWFpoYkVodmIydHpPaUI3Q2drSmIzQjBhVzl1T2lCN0Nna0pDV2RsZERvZ1puVnVZM1JwYjI0b0lHVnNaVzBnS1NCN0Nnb0pDUWtKZG1GeUlIWmhiQ0E5SUdwUmRXVnllUzVtYVc1a0xtRjBkSElvSUdWc1pXMHNJQ0oyWVd4MVpTSWdLVHNLQ1FrSkNYSmxkSFZ5YmlCMllXd2dJVDBnYm5Wc2JDQS9DZ2tKQ1FrSmRtRnNJRG9LQ2drSkNRa0pMeThnVTNWd2NHOXlkRG9nU1VVZ1BEMHhNQ0F0SURFeElHOXViSGtLQ1FrSkNRa3ZMeUJ2Y0hScGIyNHVkR1Y0ZENCMGFISnZkM01nWlhoalpYQjBhVzl1Y3lBb0l6RTBOamcyTENBak1UUTROVGdwQ2drSkNRa0pMeThnVTNSeWFYQWdZVzVrSUdOdmJHeGhjSE5sSUhkb2FYUmxjM0JoWTJVS0NRa0pDUWt2THlCb2RIUndjem92TDJoMGJXd3VjM0JsWXk1M2FHRjBkMmN1YjNKbkx5TnpkSEpwY0MxaGJtUXRZMjlzYkdGd2MyVXRkMmhwZEdWemNHRmpaUW9KQ1FrSkNYTjBjbWx3UVc1a1EyOXNiR0Z3YzJVb0lHcFJkV1Z5ZVM1MFpYaDBLQ0JsYkdWdElDa2dLVHNLQ1FrSmZRb0pDWDBzQ2drSmMyVnNaV04wT2lCN0Nna0pDV2RsZERvZ1puVnVZM1JwYjI0b0lHVnNaVzBnS1NCN0Nna0pDUWwyWVhJZ2RtRnNkV1VzSUc5d2RHbHZiaXdnYVN3S0NRa0pDUWx2Y0hScGIyNXpJRDBnWld4bGJTNXZjSFJwYjI1ekxBb0pDUWtKQ1dsdVpHVjRJRDBnWld4bGJTNXpaV3hsWTNSbFpFbHVaR1Y0TEFvSkNRa0pDVzl1WlNBOUlHVnNaVzB1ZEhsd1pTQTlQVDBnSW5ObGJHVmpkQzF2Ym1VaUxBb0pDUWtKQ1haaGJIVmxjeUE5SUc5dVpTQS9JRzUxYkd3Z09pQmJYU3dLQ1FrSkNRbHRZWGdnUFNCdmJtVWdQeUJwYm1SbGVDQXJJREVnT2lCdmNIUnBiMjV6TG14bGJtZDBhRHNLQ2drSkNRbHBaaUFvSUdsdVpHVjRJRHdnTUNBcElIc0tDUWtKQ1FscElEMGdiV0Y0T3dvS0NRa0pDWDBnWld4elpTQjdDZ2tKQ1FrSmFTQTlJRzl1WlNBL0lHbHVaR1Y0SURvZ01Ec0tDUWtKQ1gwS0Nna0pDUWt2THlCTWIyOXdJSFJvY205MVoyZ2dZV3hzSUhSb1pTQnpaV3hsWTNSbFpDQnZjSFJwYjI1ekNna0pDUWxtYjNJZ0tDQTdJR2tnUENCdFlYZzdJR2tyS3lBcElIc0tDUWtKQ1FsdmNIUnBiMjRnUFNCdmNIUnBiMjV6V3lCcElGMDdDZ29KQ1FrSkNTOHZJRk4xY0hCdmNuUTZJRWxGSUR3OU9TQnZibXg1Q2drSkNRa0pMeThnU1VVNExUa2daRzlsYzI0bmRDQjFjR1JoZEdVZ2MyVnNaV04wWldRZ1lXWjBaWElnWm05eWJTQnlaWE5sZENBb0l6STFOVEVwQ2drSkNRa0phV1lnS0NBb0lHOXdkR2x2Ymk1elpXeGxZM1JsWkNCOGZDQnBJRDA5UFNCcGJtUmxlQ0FwSUNZbUNnb0pDUWtKQ1FrSkx5OGdSRzl1SjNRZ2NtVjBkWEp1SUc5d2RHbHZibk1nZEdoaGRDQmhjbVVnWkdsellXSnNaV1FnYjNJZ2FXNGdZU0JrYVhOaFlteGxaQ0J2Y0hSbmNtOTFjQW9KQ1FrSkNRa0pJVzl3ZEdsdmJpNWthWE5oWW14bFpDQW1KZ29KQ1FrSkNRa0pLQ0FoYjNCMGFXOXVMbkJoY21WdWRFNXZaR1V1WkdsellXSnNaV1FnZkh3S0NRa0pDUWtKQ1FraGJtOWtaVTVoYldVb0lHOXdkR2x2Ymk1d1lYSmxiblJPYjJSbExDQWliM0IwWjNKdmRYQWlJQ2tnS1NBcElIc0tDZ2tKQ1FrSkNTOHZJRWRsZENCMGFHVWdjM0JsWTJsbWFXTWdkbUZzZFdVZ1ptOXlJSFJvWlNCdmNIUnBiMjRLQ1FrSkNRa0pkbUZzZFdVZ1BTQnFVWFZsY25rb0lHOXdkR2x2YmlBcExuWmhiQ2dwT3dvS0NRa0pDUWtKTHk4Z1YyVWdaRzl1SjNRZ2JtVmxaQ0JoYmlCaGNuSmhlU0JtYjNJZ2IyNWxJSE5sYkdWamRITUtDUWtKQ1FrSmFXWWdLQ0J2Ym1VZ0tTQjdDZ2tKQ1FrSkNRbHlaWFIxY200Z2RtRnNkV1U3Q2drSkNRa0pDWDBLQ2drSkNRa0pDUzh2SUUxMWJIUnBMVk5sYkdWamRITWdjbVYwZFhKdUlHRnVJR0Z5Y21GNUNna0pDUWtKQ1haaGJIVmxjeTV3ZFhOb0tDQjJZV3gxWlNBcE93b0pDUWtKQ1gwS0NRa0pDWDBLQ2drSkNRbHlaWFIxY200Z2RtRnNkV1Z6T3dvSkNRbDlMQW9LQ1FrSmMyVjBPaUJtZFc1amRHbHZiaWdnWld4bGJTd2dkbUZzZFdVZ0tTQjdDZ2tKQ1FsMllYSWdiM0IwYVc5dVUyVjBMQ0J2Y0hScGIyNHNDZ2tKQ1FrSmIzQjBhVzl1Y3lBOUlHVnNaVzB1YjNCMGFXOXVjeXdLQ1FrSkNRbDJZV3gxWlhNZ1BTQnFVWFZsY25rdWJXRnJaVUZ5Y21GNUtDQjJZV3gxWlNBcExBb0pDUWtKQ1drZ1BTQnZjSFJwYjI1ekxteGxibWQwYURzS0Nna0pDUWwzYUdsc1pTQW9JR2t0TFNBcElIc0tDUWtKQ1FsdmNIUnBiMjRnUFNCdmNIUnBiMjV6V3lCcElGMDdDZ29KQ1FrSkNTOHFJR1Z6YkdsdWRDMWthWE5oWW14bElHNXZMV052Ym1RdFlYTnphV2R1SUNvdkNnb0pDUWtKQ1dsbUlDZ2diM0IwYVc5dUxuTmxiR1ZqZEdWa0lEMEtDUWtKQ1FrSmFsRjFaWEo1TG1sdVFYSnlZWGtvSUdwUmRXVnllUzUyWVd4SWIyOXJjeTV2Y0hScGIyNHVaMlYwS0NCdmNIUnBiMjRnS1N3Z2RtRnNkV1Z6SUNrZ1BpQXRNUW9KQ1FrSkNTa2dld29KQ1FrSkNRbHZjSFJwYjI1VFpYUWdQU0IwY25WbE93b0pDUWtKQ1gwS0Nna0pDUWtKTHlvZ1pYTnNhVzUwTFdWdVlXSnNaU0J1YnkxamIyNWtMV0Z6YzJsbmJpQXFMd29KQ1FrSmZRb0tDUWtKQ1M4dklFWnZjbU5sSUdKeWIzZHpaWEp6SUhSdklHSmxhR0YyWlNCamIyNXphWE4wWlc1MGJIa2dkMmhsYmlCdWIyNHRiV0YwWTJocGJtY2dkbUZzZFdVZ2FYTWdjMlYwQ2drSkNRbHBaaUFvSUNGdmNIUnBiMjVUWlhRZ0tTQjdDZ2tKQ1FrSlpXeGxiUzV6Wld4bFkzUmxaRWx1WkdWNElEMGdMVEU3Q2drSkNRbDlDZ2tKQ1FseVpYUjFjbTRnZG1Gc2RXVnpPd29KQ1FsOUNna0pmUW9KZlFwOUlDazdDZ292THlCU1lXUnBiM01nWVc1a0lHTm9aV05yWW05NFpYTWdaMlYwZEdWeUwzTmxkSFJsY2dwcVVYVmxjbmt1WldGamFDZ2dXeUFpY21Ga2FXOGlMQ0FpWTJobFkydGliM2dpSUYwc0lHWjFibU4wYVc5dUtDa2dld29KYWxGMVpYSjVMblpoYkVodmIydHpXeUIwYUdseklGMGdQU0I3Q2drSmMyVjBPaUJtZFc1amRHbHZiaWdnWld4bGJTd2dkbUZzZFdVZ0tTQjdDZ2tKQ1dsbUlDZ2dRWEp5WVhrdWFYTkJjbkpoZVNnZ2RtRnNkV1VnS1NBcElIc0tDUWtKQ1hKbGRIVnliaUFvSUdWc1pXMHVZMmhsWTJ0bFpDQTlJR3BSZFdWeWVTNXBia0Z5Y21GNUtDQnFVWFZsY25rb0lHVnNaVzBnS1M1MllXd29LU3dnZG1Gc2RXVWdLU0ErSUMweElDazdDZ2tKQ1gwS0NRbDlDZ2w5T3dvSmFXWWdLQ0FoYzNWd2NHOXlkQzVqYUdWamEwOXVJQ2tnZXdvSkNXcFJkV1Z5ZVM1MllXeEliMjlyYzFzZ2RHaHBjeUJkTG1kbGRDQTlJR1oxYm1OMGFXOXVLQ0JsYkdWdElDa2dld29KQ1FseVpYUjFjbTRnWld4bGJTNW5aWFJCZEhSeWFXSjFkR1VvSUNKMllXeDFaU0lnS1NBOVBUMGdiblZzYkNBL0lDSnZiaUlnT2lCbGJHVnRMblpoYkhWbE93b0pDWDA3Q2dsOUNuMGdLVHNLQ2dvS0NpOHZJRkpsZEhWeWJpQnFVWFZsY25rZ1ptOXlJR0YwZEhKcFluVjBaWE10YjI1c2VTQnBibU5zZFhOcGIyNEtDZ3B6ZFhCd2IzSjBMbVp2WTNWemFXNGdQU0FpYjI1bWIyTjFjMmx1SWlCcGJpQjNhVzVrYjNjN0Nnb0tkbUZ5SUhKbWIyTjFjMDF2Y25Cb0lEMGdMMTRvUHpwbWIyTjFjMmx1Wm05amRYTjhabTlqZFhOdmRYUmliSFZ5S1NRdkxBb0pjM1J2Y0ZCeWIzQmhaMkYwYVc5dVEyRnNiR0poWTJzZ1BTQm1kVzVqZEdsdmJpZ2daU0FwSUhzS0NRbGxMbk4wYjNCUWNtOXdZV2RoZEdsdmJpZ3BPd29KZlRzS0NtcFJkV1Z5ZVM1bGVIUmxibVFvSUdwUmRXVnllUzVsZG1WdWRDd2dld29LQ1hSeWFXZG5aWEk2SUdaMWJtTjBhVzl1S0NCbGRtVnVkQ3dnWkdGMFlTd2daV3hsYlN3Z2IyNXNlVWhoYm1Sc1pYSnpJQ2tnZXdvS0NRbDJZWElnYVN3Z1kzVnlMQ0IwYlhBc0lHSjFZbUpzWlZSNWNHVXNJRzl1ZEhsd1pTd2dhR0Z1Wkd4bExDQnpjR1ZqYVdGc0xDQnNZWE4wUld4bGJXVnVkQ3dLQ1FrSlpYWmxiblJRWVhSb0lEMGdXeUJsYkdWdElIeDhJR1J2WTNWdFpXNTBJRjBzQ2drSkNYUjVjR1VnUFNCb1lYTlBkMjR1WTJGc2JDZ2daWFpsYm5Rc0lDSjBlWEJsSWlBcElEOGdaWFpsYm5RdWRIbHdaU0E2SUdWMlpXNTBMQW9KQ1FsdVlXMWxjM0JoWTJWeklEMGdhR0Z6VDNkdUxtTmhiR3dvSUdWMlpXNTBMQ0FpYm1GdFpYTndZV05sSWlBcElEOGdaWFpsYm5RdWJtRnRaWE53WVdObExuTndiR2wwS0NBaUxpSWdLU0E2SUZ0ZE93b0tDUWxqZFhJZ1BTQnNZWE4wUld4bGJXVnVkQ0E5SUhSdGNDQTlJR1ZzWlcwZ1BTQmxiR1Z0SUh4OElHUnZZM1Z0Wlc1ME93b0tDUWt2THlCRWIyNG5kQ0JrYnlCbGRtVnVkSE1nYjI0Z2RHVjRkQ0JoYm1RZ1kyOXRiV1Z1ZENCdWIyUmxjd29KQ1dsbUlDZ2daV3hsYlM1dWIyUmxWSGx3WlNBOVBUMGdNeUI4ZkNCbGJHVnRMbTV2WkdWVWVYQmxJRDA5UFNBNElDa2dld29KQ1FseVpYUjFjbTQ3Q2drSmZRb0tDUWt2THlCbWIyTjFjeTlpYkhWeUlHMXZjbkJvY3lCMGJ5Qm1iMk4xYzJsdUwyOTFkRHNnWlc1emRYSmxJSGRsSjNKbElHNXZkQ0JtYVhKcGJtY2dkR2hsYlNCeWFXZG9kQ0J1YjNjS0NRbHBaaUFvSUhKbWIyTjFjMDF2Y25Cb0xuUmxjM1FvSUhSNWNHVWdLeUJxVVhWbGNua3VaWFpsYm5RdWRISnBaMmRsY21Wa0lDa2dLU0I3Q2drSkNYSmxkSFZ5YmpzS0NRbDlDZ29KQ1dsbUlDZ2dkSGx3WlM1cGJtUmxlRTltS0NBaUxpSWdLU0ErSUMweElDa2dld29LQ1FrSkx5OGdUbUZ0WlhOd1lXTmxaQ0IwY21sbloyVnlPeUJqY21WaGRHVWdZU0J5WldkbGVIQWdkRzhnYldGMFkyZ2daWFpsYm5RZ2RIbHdaU0JwYmlCb1lXNWtiR1VvS1FvSkNRbHVZVzFsYzNCaFkyVnpJRDBnZEhsd1pTNXpjR3hwZENnZ0lpNGlJQ2s3Q2drSkNYUjVjR1VnUFNCdVlXMWxjM0JoWTJWekxuTm9hV1owS0NrN0Nna0pDVzVoYldWemNHRmpaWE11YzI5eWRDZ3BPd29KQ1gwS0NRbHZiblI1Y0dVZ1BTQjBlWEJsTG1sdVpHVjRUMllvSUNJNklpQXBJRHdnTUNBbUppQWliMjRpSUNzZ2RIbHdaVHNLQ2drSkx5OGdRMkZzYkdWeUlHTmhiaUJ3WVhOeklHbHVJR0VnYWxGMVpYSjVMa1YyWlc1MElHOWlhbVZqZEN3Z1QySnFaV04wTENCdmNpQnFkWE4wSUdGdUlHVjJaVzUwSUhSNWNHVWdjM1J5YVc1bkNna0paWFpsYm5RZ1BTQmxkbVZ1ZEZzZ2FsRjFaWEo1TG1WNGNHRnVaRzhnWFNBL0Nna0pDV1YyWlc1MElEb0tDUWtKYm1WM0lHcFJkV1Z5ZVM1RmRtVnVkQ2dnZEhsd1pTd2dkSGx3Wlc5bUlHVjJaVzUwSUQwOVBTQWliMkpxWldOMElpQW1KaUJsZG1WdWRDQXBPd29LQ1Frdkx5QlVjbWxuWjJWeUlHSnBkRzFoYzJzNklDWWdNU0JtYjNJZ2JtRjBhWFpsSUdoaGJtUnNaWEp6T3lBbUlESWdabTl5SUdwUmRXVnllU0FvWVd4M1lYbHpJSFJ5ZFdVcENna0paWFpsYm5RdWFYTlVjbWxuWjJWeUlEMGdiMjVzZVVoaGJtUnNaWEp6SUQ4Z01pQTZJRE03Q2drSlpYWmxiblF1Ym1GdFpYTndZV05sSUQwZ2JtRnRaWE53WVdObGN5NXFiMmx1S0NBaUxpSWdLVHNLQ1FsbGRtVnVkQzV5Ym1GdFpYTndZV05sSUQwZ1pYWmxiblF1Ym1GdFpYTndZV05sSUQ4S0NRa0pibVYzSUZKbFowVjRjQ2dnSWloZWZGeGNMaWtpSUNzZ2JtRnRaWE53WVdObGN5NXFiMmx1S0NBaVhGd3VLRDg2TGlwY1hDNThLU0lnS1NBcklDSW9YRnd1ZkNRcElpQXBJRG9LQ1FrSmJuVnNiRHNLQ2drSkx5OGdRMnhsWVc0Z2RYQWdkR2hsSUdWMlpXNTBJR2x1SUdOaGMyVWdhWFFnYVhNZ1ltVnBibWNnY21WMWMyVmtDZ2tKWlhabGJuUXVjbVZ6ZFd4MElEMGdkVzVrWldacGJtVmtPd29KQ1dsbUlDZ2dJV1YyWlc1MExuUmhjbWRsZENBcElIc0tDUWtKWlhabGJuUXVkR0Z5WjJWMElEMGdaV3hsYlRzS0NRbDlDZ29KQ1M4dklFTnNiMjVsSUdGdWVTQnBibU52YldsdVp5QmtZWFJoSUdGdVpDQndjbVZ3Wlc1a0lIUm9aU0JsZG1WdWRDd2dZM0psWVhScGJtY2dkR2hsSUdoaGJtUnNaWElnWVhKbklHeHBjM1FLQ1Fsa1lYUmhJRDBnWkdGMFlTQTlQU0J1ZFd4c0lEOEtDUWtKV3lCbGRtVnVkQ0JkSURvS0NRa0phbEYxWlhKNUxtMWhhMlZCY25KaGVTZ2daR0YwWVN3Z1d5QmxkbVZ1ZENCZElDazdDZ29KQ1M4dklFRnNiRzkzSUhOd1pXTnBZV3dnWlhabGJuUnpJSFJ2SUdSeVlYY2diM1YwYzJsa1pTQjBhR1VnYkdsdVpYTUtDUWx6Y0dWamFXRnNJRDBnYWxGMVpYSjVMbVYyWlc1MExuTndaV05wWVd4YklIUjVjR1VnWFNCOGZDQjdmVHNLQ1FscFppQW9JQ0Z2Ym14NVNHRnVaR3hsY25NZ0ppWWdjM0JsWTJsaGJDNTBjbWxuWjJWeUlDWW1JSE53WldOcFlXd3VkSEpwWjJkbGNpNWhjSEJzZVNnZ1pXeGxiU3dnWkdGMFlTQXBJRDA5UFNCbVlXeHpaU0FwSUhzS0NRa0pjbVYwZFhKdU93b0pDWDBLQ2drSkx5OGdSR1YwWlhKdGFXNWxJR1YyWlc1MElIQnliM0JoWjJGMGFXOXVJSEJoZEdnZ2FXNGdZV1IyWVc1alpTd2djR1Z5SUZjelF5QmxkbVZ1ZEhNZ2MzQmxZeUFvSXprNU5URXBDZ2tKTHk4Z1FuVmlZbXhsSUhWd0lIUnZJR1J2WTNWdFpXNTBMQ0IwYUdWdUlIUnZJSGRwYm1SdmR6c2dkMkYwWTJnZ1ptOXlJR0VnWjJ4dlltRnNJRzkzYm1WeVJHOWpkVzFsYm5RZ2RtRnlJQ2dqT1RjeU5Da0tDUWxwWmlBb0lDRnZibXg1U0dGdVpHeGxjbk1nSmlZZ0lYTndaV05wWVd3dWJtOUNkV0ppYkdVZ0ppWWdJV2x6VjJsdVpHOTNLQ0JsYkdWdElDa2dLU0I3Q2dvSkNRbGlkV0ppYkdWVWVYQmxJRDBnYzNCbFkybGhiQzVrWld4bFoyRjBaVlI1Y0dVZ2ZId2dkSGx3WlRzS0NRa0phV1lnS0NBaGNtWnZZM1Z6VFc5eWNHZ3VkR1Z6ZENnZ1luVmlZbXhsVkhsd1pTQXJJSFI1Y0dVZ0tTQXBJSHNLQ1FrSkNXTjFjaUE5SUdOMWNpNXdZWEpsYm5ST2IyUmxPd29KQ1FsOUNna0pDV1p2Y2lBb0lEc2dZM1Z5T3lCamRYSWdQU0JqZFhJdWNHRnlaVzUwVG05a1pTQXBJSHNLQ1FrSkNXVjJaVzUwVUdGMGFDNXdkWE5vS0NCamRYSWdLVHNLQ1FrSkNYUnRjQ0E5SUdOMWNqc0tDUWtKZlFvS0NRa0pMeThnVDI1c2VTQmhaR1FnZDJsdVpHOTNJR2xtSUhkbElHZHZkQ0IwYnlCa2IyTjFiV1Z1ZENBb1pTNW5MaXdnYm05MElIQnNZV2x1SUc5aWFpQnZjaUJrWlhSaFkyaGxaQ0JFVDAwcENna0pDV2xtSUNnZ2RHMXdJRDA5UFNBb0lHVnNaVzB1YjNkdVpYSkViMk4xYldWdWRDQjhmQ0JrYjJOMWJXVnVkQ0FwSUNrZ2V3b0pDUWtKWlhabGJuUlFZWFJvTG5CMWMyZ29JSFJ0Y0M1a1pXWmhkV3gwVm1sbGR5QjhmQ0IwYlhBdWNHRnlaVzUwVjJsdVpHOTNJSHg4SUhkcGJtUnZkeUFwT3dvSkNRbDlDZ2tKZlFvS0NRa3ZMeUJHYVhKbElHaGhibVJzWlhKeklHOXVJSFJvWlNCbGRtVnVkQ0J3WVhSb0Nna0phU0E5SURBN0Nna0pkMmhwYkdVZ0tDQW9JR04xY2lBOUlHVjJaVzUwVUdGMGFGc2dhU3NySUYwZ0tTQW1KaUFoWlhabGJuUXVhWE5RY205d1lXZGhkR2x2YmxOMGIzQndaV1FvS1NBcElIc0tDUWtKYkdGemRFVnNaVzFsYm5RZ1BTQmpkWEk3Q2drSkNXVjJaVzUwTG5SNWNHVWdQU0JwSUQ0Z01TQS9DZ2tKQ1FsaWRXSmliR1ZVZVhCbElEb0tDUWtKQ1hOd1pXTnBZV3d1WW1sdVpGUjVjR1VnZkh3Z2RIbHdaVHNLQ2drSkNTOHZJR3BSZFdWeWVTQm9ZVzVrYkdWeUNna0pDV2hoYm1Sc1pTQTlJQ2dnWkdGMFlWQnlhWFl1WjJWMEtDQmpkWElzSUNKbGRtVnVkSE1pSUNrZ2ZId2dlMzBnS1ZzZ1pYWmxiblF1ZEhsd1pTQmRJQ1ltQ2drSkNRbGtZWFJoVUhKcGRpNW5aWFFvSUdOMWNpd2dJbWhoYm1Sc1pTSWdLVHNLQ1FrSmFXWWdLQ0JvWVc1a2JHVWdLU0I3Q2drSkNRbG9ZVzVrYkdVdVlYQndiSGtvSUdOMWNpd2daR0YwWVNBcE93b0pDUWw5Q2dvSkNRa3ZMeUJPWVhScGRtVWdhR0Z1Wkd4bGNnb0pDUWxvWVc1a2JHVWdQU0J2Ym5SNWNHVWdKaVlnWTNWeVd5QnZiblI1Y0dVZ1hUc0tDUWtKYVdZZ0tDQm9ZVzVrYkdVZ0ppWWdhR0Z1Wkd4bExtRndjR3g1SUNZbUlHRmpZMlZ3ZEVSaGRHRW9JR04xY2lBcElDa2dld29KQ1FrSlpYWmxiblF1Y21WemRXeDBJRDBnYUdGdVpHeGxMbUZ3Y0d4NUtDQmpkWElzSUdSaGRHRWdLVHNLQ1FrSkNXbG1JQ2dnWlhabGJuUXVjbVZ6ZFd4MElEMDlQU0JtWVd4elpTQXBJSHNLQ1FrSkNRbGxkbVZ1ZEM1d2NtVjJaVzUwUkdWbVlYVnNkQ2dwT3dvSkNRa0pmUW9KQ1FsOUNna0pmUW9KQ1dWMlpXNTBMblI1Y0dVZ1BTQjBlWEJsT3dvS0NRa3ZMeUJKWmlCdWIySnZaSGtnY0hKbGRtVnVkR1ZrSUhSb1pTQmtaV1poZFd4MElHRmpkR2x2Yml3Z1pHOGdhWFFnYm05M0Nna0phV1lnS0NBaGIyNXNlVWhoYm1Sc1pYSnpJQ1ltSUNGbGRtVnVkQzVwYzBSbFptRjFiSFJRY21WMlpXNTBaV1FvS1NBcElIc0tDZ2tKQ1dsbUlDZ2dLQ0FoYzNCbFkybGhiQzVmWkdWbVlYVnNkQ0I4ZkFvSkNRa0pjM0JsWTJsaGJDNWZaR1ZtWVhWc2RDNWhjSEJzZVNnZ1pYWmxiblJRWVhSb0xuQnZjQ2dwTENCa1lYUmhJQ2tnUFQwOUlHWmhiSE5sSUNrZ0ppWUtDUWtKQ1dGalkyVndkRVJoZEdFb0lHVnNaVzBnS1NBcElIc0tDZ2tKQ1Frdkx5QkRZV3hzSUdFZ2JtRjBhWFpsSUVSUFRTQnRaWFJvYjJRZ2IyNGdkR2hsSUhSaGNtZGxkQ0IzYVhSb0lIUm9aU0J6WVcxbElHNWhiV1VnWVhNZ2RHaGxJR1YyWlc1MExnb0pDUWtKTHk4Z1JHOXVKM1FnWkc4Z1pHVm1ZWFZzZENCaFkzUnBiMjV6SUc5dUlIZHBibVJ2ZHl3Z2RHaGhkQ2R6SUhkb1pYSmxJR2RzYjJKaGJDQjJZWEpwWVdKc1pYTWdZbVVnS0NNMk1UY3dLUW9KQ1FrSmFXWWdLQ0J2Ym5SNWNHVWdKaVlnYVhOR2RXNWpkR2x2YmlnZ1pXeGxiVnNnZEhsd1pTQmRJQ2tnSmlZZ0lXbHpWMmx1Wkc5M0tDQmxiR1Z0SUNrZ0tTQjdDZ29KQ1FrSkNTOHZJRVJ2YmlkMElISmxMWFJ5YVdkblpYSWdZVzRnYjI1R1QwOGdaWFpsYm5RZ2QyaGxiaUIzWlNCallXeHNJR2wwY3lCR1QwOG9LU0J0WlhSb2IyUUtDUWtKQ1FsMGJYQWdQU0JsYkdWdFd5QnZiblI1Y0dVZ1hUc0tDZ2tKQ1FrSmFXWWdLQ0IwYlhBZ0tTQjdDZ2tKQ1FrSkNXVnNaVzFiSUc5dWRIbHdaU0JkSUQwZ2JuVnNiRHNLQ1FrSkNRbDlDZ29KQ1FrSkNTOHZJRkJ5WlhabGJuUWdjbVV0ZEhKcFoyZGxjbWx1WnlCdlppQjBhR1VnYzJGdFpTQmxkbVZ1ZEN3Z2MybHVZMlVnZDJVZ1lXeHlaV0ZrZVNCaWRXSmliR1ZrSUdsMElHRmliM1psQ2drSkNRa0phbEYxWlhKNUxtVjJaVzUwTG5SeWFXZG5aWEpsWkNBOUlIUjVjR1U3Q2dvSkNRa0pDV2xtSUNnZ1pYWmxiblF1YVhOUWNtOXdZV2RoZEdsdmJsTjBiM0J3WldRb0tTQXBJSHNLQ1FrSkNRa0piR0Z6ZEVWc1pXMWxiblF1WVdSa1JYWmxiblJNYVhOMFpXNWxjaWdnZEhsd1pTd2djM1J2Y0ZCeWIzQmhaMkYwYVc5dVEyRnNiR0poWTJzZ0tUc0tDUWtKQ1FsOUNnb0pDUWtKQ1dWc1pXMWJJSFI1Y0dVZ1hTZ3BPd29LQ1FrSkNRbHBaaUFvSUdWMlpXNTBMbWx6VUhKdmNHRm5ZWFJwYjI1VGRHOXdjR1ZrS0NrZ0tTQjdDZ2tKQ1FrSkNXeGhjM1JGYkdWdFpXNTBMbkpsYlc5MlpVVjJaVzUwVEdsemRHVnVaWElvSUhSNWNHVXNJSE4wYjNCUWNtOXdZV2RoZEdsdmJrTmhiR3hpWVdOcklDazdDZ2tKQ1FrSmZRb0tDUWtKQ1FscVVYVmxjbmt1WlhabGJuUXVkSEpwWjJkbGNtVmtJRDBnZFc1a1pXWnBibVZrT3dvS0NRa0pDUWxwWmlBb0lIUnRjQ0FwSUhzS0NRa0pDUWtKWld4bGJWc2diMjUwZVhCbElGMGdQU0IwYlhBN0Nna0pDUWtKZlFvSkNRa0pmUW9KQ1FsOUNna0pmUW9LQ1FseVpYUjFjbTRnWlhabGJuUXVjbVZ6ZFd4ME93b0pmU3dLQ2drdkx5QlFhV2RuZVdKaFkyc2diMjRnWVNCa2IyNXZjaUJsZG1WdWRDQjBieUJ6YVcxMWJHRjBaU0JoSUdScFptWmxjbVZ1ZENCdmJtVUtDUzh2SUZWelpXUWdiMjVzZVNCbWIzSWdZR1p2WTNWektHbHVJSHdnYjNWMEtXQWdaWFpsYm5SekNnbHphVzExYkdGMFpUb2dablZ1WTNScGIyNG9JSFI1Y0dVc0lHVnNaVzBzSUdWMlpXNTBJQ2tnZXdvSkNYWmhjaUJsSUQwZ2FsRjFaWEo1TG1WNGRHVnVaQ2dLQ1FrSmJtVjNJR3BSZFdWeWVTNUZkbVZ1ZENncExBb0pDUWxsZG1WdWRDd0tDUWtKZXdvSkNRa0pkSGx3WlRvZ2RIbHdaU3dLQ1FrSkNXbHpVMmx0ZFd4aGRHVmtPaUIwY25WbENna0pDWDBLQ1FrcE93b0tDUWxxVVhWbGNua3VaWFpsYm5RdWRISnBaMmRsY2lnZ1pTd2diblZzYkN3Z1pXeGxiU0FwT3dvSmZRb0tmU0FwT3dvS2FsRjFaWEo1TG1adUxtVjRkR1Z1WkNnZ2V3b0tDWFJ5YVdkblpYSTZJR1oxYm1OMGFXOXVLQ0IwZVhCbExDQmtZWFJoSUNrZ2V3b0pDWEpsZEhWeWJpQjBhR2x6TG1WaFkyZ29JR1oxYm1OMGFXOXVLQ2tnZXdvSkNRbHFVWFZsY25rdVpYWmxiblF1ZEhKcFoyZGxjaWdnZEhsd1pTd2daR0YwWVN3Z2RHaHBjeUFwT3dvSkNYMGdLVHNLQ1gwc0NnbDBjbWxuWjJWeVNHRnVaR3hsY2pvZ1puVnVZM1JwYjI0b0lIUjVjR1VzSUdSaGRHRWdLU0I3Q2drSmRtRnlJR1ZzWlcwZ1BTQjBhR2x6V3lBd0lGMDdDZ2tKYVdZZ0tDQmxiR1Z0SUNrZ2V3b0pDUWx5WlhSMWNtNGdhbEYxWlhKNUxtVjJaVzUwTG5SeWFXZG5aWElvSUhSNWNHVXNJR1JoZEdFc0lHVnNaVzBzSUhSeWRXVWdLVHNLQ1FsOUNnbDlDbjBnS1RzS0Nnb3ZMeUJUZFhCd2IzSjBPaUJHYVhKbFptOTRJRHc5TkRRS0x5OGdSbWx5WldadmVDQmtiMlZ6YmlkMElHaGhkbVVnWm05amRYTW9hVzRnZkNCdmRYUXBJR1YyWlc1MGN3b3ZMeUJTWld4aGRHVmtJSFJwWTJ0bGRDQXRJR2gwZEhCek9pOHZZblZuZW1sc2JHRXViVzk2YVd4c1lTNXZjbWN2YzJodmQxOWlkV2N1WTJkcFAybGtQVFk0TnpjNE53b3ZMd292THlCVGRYQndiM0owT2lCRGFISnZiV1VnUEQwME9DQXRJRFE1TENCVFlXWmhjbWtnUEQwNUxqQWdMU0E1TGpFS0x5OGdabTlqZFhNb2FXNGdmQ0J2ZFhRcElHVjJaVzUwY3lCbWFYSmxJR0ZtZEdWeUlHWnZZM1Z6SUNZZ1lteDFjaUJsZG1WdWRITXNDaTh2SUhkb2FXTm9JR2x6SUhOd1pXTWdkbWx2YkdGMGFXOXVJQzBnYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2VkZJdlJFOU5MVXhsZG1Wc0xUTXRSWFpsYm5Sekx5TmxkbVZ1ZEhNdFptOWpkWE5sZG1WdWRDMWxkbVZ1ZEMxdmNtUmxjZ292THlCU1pXeGhkR1ZrSUhScFkydGxkQ0F0SUdoMGRIQnpPaTh2WW5WbmN5NWphSEp2YldsMWJTNXZjbWN2Y0M5amFISnZiV2wxYlM5cGMzTjFaWE12WkdWMFlXbHNQMmxrUFRRME9UZzFOd3BwWmlBb0lDRnpkWEJ3YjNKMExtWnZZM1Z6YVc0Z0tTQjdDZ2xxVVhWbGNua3VaV0ZqYUNnZ2V5Qm1iMk4xY3pvZ0ltWnZZM1Z6YVc0aUxDQmliSFZ5T2lBaVptOWpkWE52ZFhRaUlIMHNJR1oxYm1OMGFXOXVLQ0J2Y21sbkxDQm1hWGdnS1NCN0Nnb0pDUzh2SUVGMGRHRmphQ0JoSUhOcGJtZHNaU0JqWVhCMGRYSnBibWNnYUdGdVpHeGxjaUJ2YmlCMGFHVWdaRzlqZFcxbGJuUWdkMmhwYkdVZ2MyOXRaVzl1WlNCM1lXNTBjeUJtYjJOMWMybHVMMlp2WTNWemIzVjBDZ2tKZG1GeUlHaGhibVJzWlhJZ1BTQm1kVzVqZEdsdmJpZ2daWFpsYm5RZ0tTQjdDZ2tKQ1dwUmRXVnllUzVsZG1WdWRDNXphVzExYkdGMFpTZ2dabWw0TENCbGRtVnVkQzUwWVhKblpYUXNJR3BSZFdWeWVTNWxkbVZ1ZEM1bWFYZ29JR1YyWlc1MElDa2dLVHNLQ1FsOU93b0tDUWxxVVhWbGNua3VaWFpsYm5RdWMzQmxZMmxoYkZzZ1ptbDRJRjBnUFNCN0Nna0pDWE5sZEhWd09pQm1kVzVqZEdsdmJpZ3BJSHNLQ1FrSkNYWmhjaUJrYjJNZ1BTQjBhR2x6TG05M2JtVnlSRzlqZFcxbGJuUWdmSHdnZEdocGN5d0tDUWtKQ1FsaGRIUmhZMmhsY3lBOUlHUmhkR0ZRY21sMkxtRmpZMlZ6Y3lnZ1pHOWpMQ0JtYVhnZ0tUc0tDZ2tKQ1FscFppQW9JQ0ZoZEhSaFkyaGxjeUFwSUhzS0NRa0pDUWxrYjJNdVlXUmtSWFpsYm5STWFYTjBaVzVsY2lnZ2IzSnBaeXdnYUdGdVpHeGxjaXdnZEhKMVpTQXBPd29KQ1FrSmZRb0pDUWtKWkdGMFlWQnlhWFl1WVdOalpYTnpLQ0JrYjJNc0lHWnBlQ3dnS0NCaGRIUmhZMmhsY3lCOGZDQXdJQ2tnS3lBeElDazdDZ2tKQ1gwc0Nna0pDWFJsWVhKa2IzZHVPaUJtZFc1amRHbHZiaWdwSUhzS0NRa0pDWFpoY2lCa2IyTWdQU0IwYUdsekxtOTNibVZ5Ukc5amRXMWxiblFnZkh3Z2RHaHBjeXdLQ1FrSkNRbGhkSFJoWTJobGN5QTlJR1JoZEdGUWNtbDJMbUZqWTJWemN5Z2daRzlqTENCbWFYZ2dLU0F0SURFN0Nnb0pDUWtKYVdZZ0tDQWhZWFIwWVdOb1pYTWdLU0I3Q2drSkNRa0paRzlqTG5KbGJXOTJaVVYyWlc1MFRHbHpkR1Z1WlhJb0lHOXlhV2NzSUdoaGJtUnNaWElzSUhSeWRXVWdLVHNLQ1FrSkNRbGtZWFJoVUhKcGRpNXlaVzF2ZG1Vb0lHUnZZeXdnWm1sNElDazdDZ29KQ1FrSmZTQmxiSE5sSUhzS0NRa0pDUWxrWVhSaFVISnBkaTVoWTJObGMzTW9JR1J2WXl3Z1ptbDRMQ0JoZEhSaFkyaGxjeUFwT3dvSkNRa0pmUW9KQ1FsOUNna0pmVHNLQ1gwZ0tUc0tmUXAyWVhJZ2JHOWpZWFJwYjI0Z1BTQjNhVzVrYjNjdWJHOWpZWFJwYjI0N0NncDJZWElnYm05dVkyVWdQU0JFWVhSbExtNXZkeWdwT3dvS2RtRnlJSEp4ZFdWeWVTQTlJQ2dnTDF3L0x5QXBPd29LQ2dvdkx5QkRjbTl6Y3kxaWNtOTNjMlZ5SUhodGJDQndZWEp6YVc1bkNtcFJkV1Z5ZVM1d1lYSnpaVmhOVENBOUlHWjFibU4wYVc5dUtDQmtZWFJoSUNrZ2V3b0pkbUZ5SUhodGJEc0tDV2xtSUNnZ0lXUmhkR0VnZkh3Z2RIbHdaVzltSUdSaGRHRWdJVDA5SUNKemRISnBibWNpSUNrZ2V3b0pDWEpsZEhWeWJpQnVkV3hzT3dvSmZRb0tDUzh2SUZOMWNIQnZjblE2SUVsRklEa2dMU0F4TVNCdmJteDVDZ2t2THlCSlJTQjBhSEp2ZDNNZ2IyNGdjR0Z5YzJWR2NtOXRVM1J5YVc1bklIZHBkR2dnYVc1MllXeHBaQ0JwYm5CMWRDNEtDWFJ5ZVNCN0Nna0plRzFzSUQwZ0tDQnVaWGNnZDJsdVpHOTNMa1JQVFZCaGNuTmxjaWdwSUNrdWNHRnljMlZHY205dFUzUnlhVzVuS0NCa1lYUmhMQ0FpZEdWNGRDOTRiV3dpSUNrN0NnbDlJR05oZEdOb0lDZ2daU0FwSUhzS0NRbDRiV3dnUFNCMWJtUmxabWx1WldRN0NnbDlDZ29KYVdZZ0tDQWhlRzFzSUh4OElIaHRiQzVuWlhSRmJHVnRaVzUwYzBKNVZHRm5UbUZ0WlNnZ0luQmhjbk5sY21WeWNtOXlJaUFwTG14bGJtZDBhQ0FwSUhzS0NRbHFVWFZsY25rdVpYSnliM0lvSUNKSmJuWmhiR2xrSUZoTlREb2dJaUFySUdSaGRHRWdLVHNLQ1gwS0NYSmxkSFZ5YmlCNGJXdzdDbjA3Q2dvS2RtRnlDZ2x5WW5KaFkydGxkQ0E5SUM5Y1cxeGRKQzhzQ2dseVExSk1SaUE5SUM5Y2NqOWNiaTluTEFvSmNuTjFZbTFwZEhSbGNsUjVjR1Z6SUQwZ0wxNG9QenB6ZFdKdGFYUjhZblYwZEc5dWZHbHRZV2RsZkhKbGMyVjBmR1pwYkdVcEpDOXBMQW9KY25OMVltMXBkSFJoWW14bElEMGdMMTRvUHpwcGJuQjFkSHh6Wld4bFkzUjhkR1Y0ZEdGeVpXRjhhMlY1WjJWdUtTOXBPd29LWm5WdVkzUnBiMjRnWW5WcGJHUlFZWEpoYlhNb0lIQnlaV1pwZUN3Z2IySnFMQ0IwY21Ga2FYUnBiMjVoYkN3Z1lXUmtJQ2tnZXdvSmRtRnlJRzVoYldVN0Nnb0phV1lnS0NCQmNuSmhlUzVwYzBGeWNtRjVLQ0J2WW1vZ0tTQXBJSHNLQ2drSkx5OGdVMlZ5YVdGc2FYcGxJR0Z5Y21GNUlHbDBaVzB1Q2drSmFsRjFaWEo1TG1WaFkyZ29JRzlpYWl3Z1puVnVZM1JwYjI0b0lHa3NJSFlnS1NCN0Nna0pDV2xtSUNnZ2RISmhaR2wwYVc5dVlXd2dmSHdnY21KeVlXTnJaWFF1ZEdWemRDZ2djSEpsWm1sNElDa2dLU0I3Q2dvSkNRa0pMeThnVkhKbFlYUWdaV0ZqYUNCaGNuSmhlU0JwZEdWdElHRnpJR0VnYzJOaGJHRnlMZ29KQ1FrSllXUmtLQ0J3Y21WbWFYZ3NJSFlnS1RzS0Nna0pDWDBnWld4elpTQjdDZ29KQ1FrSkx5OGdTWFJsYlNCcGN5QnViMjR0YzJOaGJHRnlJQ2hoY25KaGVTQnZjaUJ2WW1wbFkzUXBMQ0JsYm1OdlpHVWdhWFJ6SUc1MWJXVnlhV01nYVc1a1pYZ3VDZ2tKQ1FsaWRXbHNaRkJoY21GdGN5Z0tDUWtKQ1Fsd2NtVm1hWGdnS3lBaVd5SWdLeUFvSUhSNWNHVnZaaUIySUQwOVBTQWliMkpxWldOMElpQW1KaUIySUNFOUlHNTFiR3dnUHlCcElEb2dJaUlnS1NBcklDSmRJaXdLQ1FrSkNRbDJMQW9KQ1FrSkNYUnlZV1JwZEdsdmJtRnNMQW9KQ1FrSkNXRmtaQW9KQ1FrSktUc0tDUWtKZlFvSkNYMGdLVHNLQ2dsOUlHVnNjMlVnYVdZZ0tDQWhkSEpoWkdsMGFXOXVZV3dnSmlZZ2RHOVVlWEJsS0NCdlltb2dLU0E5UFQwZ0ltOWlhbVZqZENJZ0tTQjdDZ29KQ1M4dklGTmxjbWxoYkdsNlpTQnZZbXBsWTNRZ2FYUmxiUzRLQ1FsbWIzSWdLQ0J1WVcxbElHbHVJRzlpYWlBcElIc0tDUWtKWW5WcGJHUlFZWEpoYlhNb0lIQnlaV1pwZUNBcklDSmJJaUFySUc1aGJXVWdLeUFpWFNJc0lHOWlhbHNnYm1GdFpTQmRMQ0IwY21Ga2FYUnBiMjVoYkN3Z1lXUmtJQ2s3Q2drSmZRb0tDWDBnWld4elpTQjdDZ29KQ1M4dklGTmxjbWxoYkdsNlpTQnpZMkZzWVhJZ2FYUmxiUzRLQ1FsaFpHUW9JSEJ5WldacGVDd2diMkpxSUNrN0NnbDlDbjBLQ2k4dklGTmxjbWxoYkdsNlpTQmhiaUJoY25KaGVTQnZaaUJtYjNKdElHVnNaVzFsYm5SeklHOXlJR0VnYzJWMElHOW1DaTh2SUd0bGVTOTJZV3gxWlhNZ2FXNTBieUJoSUhGMVpYSjVJSE4wY21sdVp3cHFVWFZsY25rdWNHRnlZVzBnUFNCbWRXNWpkR2x2YmlnZ1lTd2dkSEpoWkdsMGFXOXVZV3dnS1NCN0NnbDJZWElnY0hKbFptbDRMQW9KQ1hNZ1BTQmJYU3dLQ1FsaFpHUWdQU0JtZFc1amRHbHZiaWdnYTJWNUxDQjJZV3gxWlU5eVJuVnVZM1JwYjI0Z0tTQjdDZ29KQ1Frdkx5QkpaaUIyWVd4MVpTQnBjeUJoSUdaMWJtTjBhVzl1TENCcGJuWnZhMlVnYVhRZ1lXNWtJSFZ6WlNCcGRITWdjbVYwZFhKdUlIWmhiSFZsQ2drSkNYWmhjaUIyWVd4MVpTQTlJR2x6Um5WdVkzUnBiMjRvSUhaaGJIVmxUM0pHZFc1amRHbHZiaUFwSUQ4S0NRa0pDWFpoYkhWbFQzSkdkVzVqZEdsdmJpZ3BJRG9LQ1FrSkNYWmhiSFZsVDNKR2RXNWpkR2x2YmpzS0Nna0pDWE5iSUhNdWJHVnVaM1JvSUYwZ1BTQmxibU52WkdWVlVrbERiMjF3YjI1bGJuUW9JR3RsZVNBcElDc2dJajBpSUNzS0NRa0pDV1Z1WTI5a1pWVlNTVU52YlhCdmJtVnVkQ2dnZG1Gc2RXVWdQVDBnYm5Wc2JDQS9JQ0lpSURvZ2RtRnNkV1VnS1RzS0NRbDlPd29LQ1M4dklFbG1JR0Z1SUdGeWNtRjVJSGRoY3lCd1lYTnpaV1FnYVc0c0lHRnpjM1Z0WlNCMGFHRjBJR2wwSUdseklHRnVJR0Z5Y21GNUlHOW1JR1p2Y20wZ1pXeGxiV1Z1ZEhNdUNnbHBaaUFvSUVGeWNtRjVMbWx6UVhKeVlYa29JR0VnS1NCOGZDQW9JR0V1YW5GMVpYSjVJQ1ltSUNGcVVYVmxjbmt1YVhOUWJHRnBiazlpYW1WamRDZ2dZU0FwSUNrZ0tTQjdDZ29KQ1M4dklGTmxjbWxoYkdsNlpTQjBhR1VnWm05eWJTQmxiR1Z0Wlc1MGN3b0pDV3BSZFdWeWVTNWxZV05vS0NCaExDQm1kVzVqZEdsdmJpZ3BJSHNLQ1FrSllXUmtLQ0IwYUdsekxtNWhiV1VzSUhSb2FYTXVkbUZzZFdVZ0tUc0tDUWw5SUNrN0Nnb0pmU0JsYkhObElIc0tDZ2tKTHk4Z1NXWWdkSEpoWkdsMGFXOXVZV3dzSUdWdVkyOWtaU0IwYUdVZ0ltOXNaQ0lnZDJGNUlDaDBhR1VnZDJGNUlERXVNeTR5SUc5eUlHOXNaR1Z5Q2drSkx5OGdaR2xrSUdsMEtTd2diM1JvWlhKM2FYTmxJR1Z1WTI5a1pTQndZWEpoYlhNZ2NtVmpkWEp6YVhabGJIa3VDZ2tKWm05eUlDZ2djSEpsWm1sNElHbHVJR0VnS1NCN0Nna0pDV0oxYVd4a1VHRnlZVzF6S0NCd2NtVm1hWGdzSUdGYklIQnlaV1pwZUNCZExDQjBjbUZrYVhScGIyNWhiQ3dnWVdSa0lDazdDZ2tKZlFvSmZRb0tDUzh2SUZKbGRIVnliaUIwYUdVZ2NtVnpkV3gwYVc1bklITmxjbWxoYkdsNllYUnBiMjRLQ1hKbGRIVnliaUJ6TG1wdmFXNG9JQ0ltSWlBcE93cDlPd29LYWxGMVpYSjVMbVp1TG1WNGRHVnVaQ2dnZXdvSmMyVnlhV0ZzYVhwbE9pQm1kVzVqZEdsdmJpZ3BJSHNLQ1FseVpYUjFjbTRnYWxGMVpYSjVMbkJoY21GdEtDQjBhR2x6TG5ObGNtbGhiR2w2WlVGeWNtRjVLQ2tnS1RzS0NYMHNDZ2x6WlhKcFlXeHBlbVZCY25KaGVUb2dablZ1WTNScGIyNG9LU0I3Q2drSmNtVjBkWEp1SUhSb2FYTXViV0Z3S0NCbWRXNWpkR2x2YmlncElIc0tDZ2tKQ1M4dklFTmhiaUJoWkdRZ2NISnZjRWh2YjJzZ1ptOXlJQ0psYkdWdFpXNTBjeUlnZEc4Z1ptbHNkR1Z5SUc5eUlHRmtaQ0JtYjNKdElHVnNaVzFsYm5SekNna0pDWFpoY2lCbGJHVnRaVzUwY3lBOUlHcFJkV1Z5ZVM1d2NtOXdLQ0IwYUdsekxDQWlaV3hsYldWdWRITWlJQ2s3Q2drSkNYSmxkSFZ5YmlCbGJHVnRaVzUwY3lBL0lHcFJkV1Z5ZVM1dFlXdGxRWEp5WVhrb0lHVnNaVzFsYm5SeklDa2dPaUIwYUdsek93b0pDWDBnS1FvSkNTNW1hV3gwWlhJb0lHWjFibU4wYVc5dUtDa2dld29KQ1FsMllYSWdkSGx3WlNBOUlIUm9hWE11ZEhsd1pUc0tDZ2tKQ1M4dklGVnpaU0F1YVhNb0lDSTZaR2x6WVdKc1pXUWlJQ2tnYzI4Z2RHaGhkQ0JtYVdWc1pITmxkRnRrYVhOaFlteGxaRjBnZDI5eWEzTUtDUWtKY21WMGRYSnVJSFJvYVhNdWJtRnRaU0FtSmlBaGFsRjFaWEo1S0NCMGFHbHpJQ2t1YVhNb0lDSTZaR2x6WVdKc1pXUWlJQ2tnSmlZS0NRa0pDWEp6ZFdKdGFYUjBZV0pzWlM1MFpYTjBLQ0IwYUdsekxtNXZaR1ZPWVcxbElDa2dKaVlnSVhKemRXSnRhWFIwWlhKVWVYQmxjeTUwWlhOMEtDQjBlWEJsSUNrZ0ppWUtDUWtKQ1NnZ2RHaHBjeTVqYUdWamEyVmtJSHg4SUNGeVkyaGxZMnRoWW14bFZIbHdaUzUwWlhOMEtDQjBlWEJsSUNrZ0tUc0tDUWw5SUNrS0NRa3ViV0Z3S0NCbWRXNWpkR2x2YmlnZ2FTd2daV3hsYlNBcElIc0tDUWtKZG1GeUlIWmhiQ0E5SUdwUmRXVnllU2dnZEdocGN5QXBMblpoYkNncE93b0tDUWtKYVdZZ0tDQjJZV3dnUFQwZ2JuVnNiQ0FwSUhzS0NRa0pDWEpsZEhWeWJpQnVkV3hzT3dvSkNRbDlDZ29KQ1FscFppQW9JRUZ5Y21GNUxtbHpRWEp5WVhrb0lIWmhiQ0FwSUNrZ2V3b0pDUWtKY21WMGRYSnVJR3BSZFdWeWVTNXRZWEFvSUhaaGJDd2dablZ1WTNScGIyNG9JSFpoYkNBcElIc0tDUWtKQ1FseVpYUjFjbTRnZXlCdVlXMWxPaUJsYkdWdExtNWhiV1VzSUhaaGJIVmxPaUIyWVd3dWNtVndiR0ZqWlNnZ2NrTlNURVlzSUNKY2NseHVJaUFwSUgwN0Nna0pDUWw5SUNrN0Nna0pDWDBLQ2drSkNYSmxkSFZ5YmlCN0lHNWhiV1U2SUdWc1pXMHVibUZ0WlN3Z2RtRnNkV1U2SUhaaGJDNXlaWEJzWVdObEtDQnlRMUpNUml3Z0lseHlYRzRpSUNrZ2ZUc0tDUWw5SUNrdVoyVjBLQ2s3Q2dsOUNuMGdLVHNLQ2dwMllYSUtDWEl5TUNBOUlDOGxNakF2Wnl3S0NYSm9ZWE5vSUQwZ0x5TXVLaVF2TEFvSmNtRnVkR2xEWVdOb1pTQTlJQzhvV3o4bVhTbGZQVnRlSmwwcUx5d0tDWEpvWldGa1pYSnpJRDBnTDE0b0xpby9LVHBiSUZ4MFhTb29XMTVjY2x4dVhTb3BKQzl0Wnl3S0Nna3ZMeUFqTnpZMU15d2dJemd4TWpVc0lDTTRNVFV5T2lCc2IyTmhiQ0J3Y205MGIyTnZiQ0JrWlhSbFkzUnBiMjRLQ1hKc2IyTmhiRkJ5YjNSdlkyOXNJRDBnTDE0b1B6cGhZbTkxZEh4aGNIQjhZWEJ3TFhOMGIzSmhaMlY4TGlzdFpYaDBaVzV6YVc5dWZHWnBiR1Y4Y21WemZIZHBaR2RsZENrNkpDOHNDZ2x5Ym05RGIyNTBaVzUwSUQwZ0wxNG9QenBIUlZSOFNFVkJSQ2trTHl3S0NYSndjbTkwYjJOdmJDQTlJQzllWEM5Y0x5OHNDZ29KTHlvZ1VISmxabWxzZEdWeWN3b0pJQ29nTVNrZ1ZHaGxlU0JoY21VZ2RYTmxablZzSUhSdklHbHVkSEp2WkhWalpTQmpkWE4wYjIwZ1pHRjBZVlI1Y0dWeklDaHpaV1VnWVdwaGVDOXFjMjl1Y0M1cWN5Qm1iM0lnWVc0Z1pYaGhiWEJzWlNrS0NTQXFJRElwSUZSb1pYTmxJR0Z5WlNCallXeHNaV1E2Q2drZ0tpQWdJQ0F0SUVKRlJrOVNSU0JoYzJ0cGJtY2dabTl5SUdFZ2RISmhibk53YjNKMENna2dLaUFnSUNBdElFRkdWRVZTSUhCaGNtRnRJSE5sY21saGJHbDZZWFJwYjI0Z0tITXVaR0YwWVNCcGN5QmhJSE4wY21sdVp5QnBaaUJ6TG5CeWIyTmxjM05FWVhSaElHbHpJSFJ5ZFdVcENna2dLaUF6S1NCclpYa2dhWE1nZEdobElHUmhkR0ZVZVhCbENna2dLaUEwS1NCMGFHVWdZMkYwWTJoaGJHd2djM2x0WW05c0lDSXFJaUJqWVc0Z1ltVWdkWE5sWkFvSklDb2dOU2tnWlhobFkzVjBhVzl1SUhkcGJHd2djM1JoY25RZ2QybDBhQ0IwY21GdWMzQnZjblFnWkdGMFlWUjVjR1VnWVc1a0lGUklSVTRnWTI5dWRHbHVkV1VnWkc5M2JpQjBieUFpS2lJZ2FXWWdibVZsWkdWa0Nna2dLaThLQ1hCeVpXWnBiSFJsY25NZ1BTQjdmU3dLQ2drdktpQlVjbUZ1YzNCdmNuUnpJR0pwYm1ScGJtZHpDZ2tnS2lBeEtTQnJaWGtnYVhNZ2RHaGxJR1JoZEdGVWVYQmxDZ2tnS2lBeUtTQjBhR1VnWTJGMFkyaGhiR3dnYzNsdFltOXNJQ0lxSWlCallXNGdZbVVnZFhObFpBb0pJQ29nTXlrZ2MyVnNaV04wYVc5dUlIZHBiR3dnYzNSaGNuUWdkMmwwYUNCMGNtRnVjM0J2Y25RZ1pHRjBZVlI1Y0dVZ1lXNWtJRlJJUlU0Z1oyOGdkRzhnSWlvaUlHbG1JRzVsWldSbFpBb0pJQ292Q2dsMGNtRnVjM0J2Y25SeklEMGdlMzBzQ2dvSkx5OGdRWFp2YVdRZ1kyOXRiV1Z1ZEMxd2NtOXNiMmNnWTJoaGNpQnpaWEYxWlc1alpTQW9JekV3TURrNEtUc2diWFZ6ZENCaGNIQmxZWE5sSUd4cGJuUWdZVzVrSUdWMllXUmxJR052YlhCeVpYTnphVzl1Q2dsaGJHeFVlWEJsY3lBOUlDSXFMeUl1WTI5dVkyRjBLQ0FpS2lJZ0tTd0tDZ2t2THlCQmJtTm9iM0lnZEdGbklHWnZjaUJ3WVhKemFXNW5JSFJvWlNCa2IyTjFiV1Z1ZENCdmNtbG5hVzRLQ1c5eWFXZHBia0Z1WTJodmNpQTlJR1J2WTNWdFpXNTBMbU55WldGMFpVVnNaVzFsYm5Rb0lDSmhJaUFwT3dvSmIzSnBaMmx1UVc1amFHOXlMbWh5WldZZ1BTQnNiMk5oZEdsdmJpNW9jbVZtT3dvS0x5OGdRbUZ6WlNBaVkyOXVjM1J5ZFdOMGIzSWlJR1p2Y2lCcVVYVmxjbmt1WVdwaGVGQnlaV1pwYkhSbGNpQmhibVFnYWxGMVpYSjVMbUZxWVhoVWNtRnVjM0J2Y25RS1puVnVZM1JwYjI0Z1lXUmtWRzlRY21WbWFXeDBaWEp6VDNKVWNtRnVjM0J2Y25SektDQnpkSEoxWTNSMWNtVWdLU0I3Q2dvSkx5OGdaR0YwWVZSNWNHVkZlSEJ5WlhOemFXOXVJR2x6SUc5d2RHbHZibUZzSUdGdVpDQmtaV1poZFd4MGN5QjBieUFpS2lJS0NYSmxkSFZ5YmlCbWRXNWpkR2x2YmlnZ1pHRjBZVlI1Y0dWRmVIQnlaWE56YVc5dUxDQm1kVzVqSUNrZ2V3b0tDUWxwWmlBb0lIUjVjR1Z2WmlCa1lYUmhWSGx3WlVWNGNISmxjM05wYjI0Z0lUMDlJQ0p6ZEhKcGJtY2lJQ2tnZXdvSkNRbG1kVzVqSUQwZ1pHRjBZVlI1Y0dWRmVIQnlaWE56YVc5dU93b0pDUWxrWVhSaFZIbHdaVVY0Y0hKbGMzTnBiMjRnUFNBaUtpSTdDZ2tKZlFvS0NRbDJZWElnWkdGMFlWUjVjR1VzQ2drSkNXa2dQU0F3TEFvSkNRbGtZWFJoVkhsd1pYTWdQU0JrWVhSaFZIbHdaVVY0Y0hKbGMzTnBiMjR1ZEc5TWIzZGxja05oYzJVb0tTNXRZWFJqYUNnZ2NtNXZkR2gwYld4M2FHbDBaU0FwSUh4OElGdGRPd29LQ1FscFppQW9JR2x6Um5WdVkzUnBiMjRvSUdaMWJtTWdLU0FwSUhzS0Nna0pDUzh2SUVadmNpQmxZV05vSUdSaGRHRlVlWEJsSUdsdUlIUm9aU0JrWVhSaFZIbHdaVVY0Y0hKbGMzTnBiMjRLQ1FrSmQyaHBiR1VnS0NBb0lHUmhkR0ZVZVhCbElEMGdaR0YwWVZSNWNHVnpXeUJwS3lzZ1hTQXBJQ2tnZXdvS0NRa0pDUzh2SUZCeVpYQmxibVFnYVdZZ2NtVnhkV1Z6ZEdWa0Nna0pDUWxwWmlBb0lHUmhkR0ZVZVhCbFd5QXdJRjBnUFQwOUlDSXJJaUFwSUhzS0NRa0pDUWxrWVhSaFZIbHdaU0E5SUdSaGRHRlVlWEJsTG5Oc2FXTmxLQ0F4SUNrZ2ZId2dJaW9pT3dvSkNRa0pDU2dnYzNSeWRXTjBkWEpsV3lCa1lYUmhWSGx3WlNCZElEMGdjM1J5ZFdOMGRYSmxXeUJrWVhSaFZIbHdaU0JkSUh4OElGdGRJQ2t1ZFc1emFHbG1kQ2dnWm5WdVl5QXBPd29LQ1FrSkNTOHZJRTkwYUdWeWQybHpaU0JoY0hCbGJtUUtDUWtKQ1gwZ1pXeHpaU0I3Q2drSkNRa0pLQ0J6ZEhKMVkzUjFjbVZiSUdSaGRHRlVlWEJsSUYwZ1BTQnpkSEoxWTNSMWNtVmJJR1JoZEdGVWVYQmxJRjBnZkh3Z1cxMGdLUzV3ZFhOb0tDQm1kVzVqSUNrN0Nna0pDUWw5Q2drSkNYMEtDUWw5Q2dsOU93cDlDZ292THlCQ1lYTmxJR2x1YzNCbFkzUnBiMjRnWm5WdVkzUnBiMjRnWm05eUlIQnlaV1pwYkhSbGNuTWdZVzVrSUhSeVlXNXpjRzl5ZEhNS1puVnVZM1JwYjI0Z2FXNXpjR1ZqZEZCeVpXWnBiSFJsY25OUGNsUnlZVzV6Y0c5eWRITW9JSE4wY25WamRIVnlaU3dnYjNCMGFXOXVjeXdnYjNKcFoybHVZV3hQY0hScGIyNXpMQ0JxY1ZoSVVpQXBJSHNLQ2dsMllYSWdhVzV6Y0dWamRHVmtJRDBnZTMwc0Nna0pjMlZsYTJsdVoxUnlZVzV6Y0c5eWRDQTlJQ2dnYzNSeWRXTjBkWEpsSUQwOVBTQjBjbUZ1YzNCdmNuUnpJQ2s3Q2dvSlpuVnVZM1JwYjI0Z2FXNXpjR1ZqZENnZ1pHRjBZVlI1Y0dVZ0tTQjdDZ2tKZG1GeUlITmxiR1ZqZEdWa093b0pDV2x1YzNCbFkzUmxaRnNnWkdGMFlWUjVjR1VnWFNBOUlIUnlkV1U3Q2drSmFsRjFaWEo1TG1WaFkyZ29JSE4wY25WamRIVnlaVnNnWkdGMFlWUjVjR1VnWFNCOGZDQmJYU3dnWm5WdVkzUnBiMjRvSUY4c0lIQnlaV1pwYkhSbGNrOXlSbUZqZEc5eWVTQXBJSHNLQ1FrSmRtRnlJR1JoZEdGVWVYQmxUM0pVY21GdWMzQnZjblFnUFNCd2NtVm1hV3gwWlhKUGNrWmhZM1J2Y25rb0lHOXdkR2x2Ym5Nc0lHOXlhV2RwYm1Gc1QzQjBhVzl1Y3l3Z2FuRllTRklnS1RzS0NRa0phV1lnS0NCMGVYQmxiMllnWkdGMFlWUjVjR1ZQY2xSeVlXNXpjRzl5ZENBOVBUMGdJbk4wY21sdVp5SWdKaVlLQ1FrSkNTRnpaV1ZyYVc1blZISmhibk53YjNKMElDWW1JQ0ZwYm5Od1pXTjBaV1JiSUdSaGRHRlVlWEJsVDNKVWNtRnVjM0J2Y25RZ1hTQXBJSHNLQ2drSkNRbHZjSFJwYjI1ekxtUmhkR0ZVZVhCbGN5NTFibk5vYVdaMEtDQmtZWFJoVkhsd1pVOXlWSEpoYm5Od2IzSjBJQ2s3Q2drSkNRbHBibk53WldOMEtDQmtZWFJoVkhsd1pVOXlWSEpoYm5Od2IzSjBJQ2s3Q2drSkNRbHlaWFIxY200Z1ptRnNjMlU3Q2drSkNYMGdaV3h6WlNCcFppQW9JSE5sWld0cGJtZFVjbUZ1YzNCdmNuUWdLU0I3Q2drSkNRbHlaWFIxY200Z0lTZ2djMlZzWldOMFpXUWdQU0JrWVhSaFZIbHdaVTl5VkhKaGJuTndiM0owSUNrN0Nna0pDWDBLQ1FsOUlDazdDZ2tKY21WMGRYSnVJSE5sYkdWamRHVmtPd29KZlFvS0NYSmxkSFZ5YmlCcGJuTndaV04wS0NCdmNIUnBiMjV6TG1SaGRHRlVlWEJsYzFzZ01DQmRJQ2tnZkh3Z0lXbHVjM0JsWTNSbFpGc2dJaW9pSUYwZ0ppWWdhVzV6Y0dWamRDZ2dJaW9pSUNrN0NuMEtDaTh2SUVFZ2MzQmxZMmxoYkNCbGVIUmxibVFnWm05eUlHRnFZWGdnYjNCMGFXOXVjd292THlCMGFHRjBJSFJoYTJWeklDSm1iR0YwSWlCdmNIUnBiMjV6SUNodWIzUWdkRzhnWW1VZ1pHVmxjQ0JsZUhSbGJtUmxaQ2tLTHk4Z1JtbDRaWE1nSXprNE9EY0tablZ1WTNScGIyNGdZV3BoZUVWNGRHVnVaQ2dnZEdGeVoyVjBMQ0J6Y21NZ0tTQjdDZ2wyWVhJZ2EyVjVMQ0JrWldWd0xBb0pDV1pzWVhSUGNIUnBiMjV6SUQwZ2FsRjFaWEo1TG1GcVlYaFRaWFIwYVc1bmN5NW1iR0YwVDNCMGFXOXVjeUI4ZkNCN2ZUc0tDZ2xtYjNJZ0tDQnJaWGtnYVc0Z2MzSmpJQ2tnZXdvSkNXbG1JQ2dnYzNKald5QnJaWGtnWFNBaFBUMGdkVzVrWldacGJtVmtJQ2tnZXdvSkNRa29JR1pzWVhSUGNIUnBiMjV6V3lCclpYa2dYU0EvSUhSaGNtZGxkQ0E2SUNnZ1pHVmxjQ0I4ZkNBb0lHUmxaWEFnUFNCN2ZTQXBJQ2tnS1ZzZ2EyVjVJRjBnUFNCemNtTmJJR3RsZVNCZE93b0pDWDBLQ1gwS0NXbG1JQ2dnWkdWbGNDQXBJSHNLQ1FscVVYVmxjbmt1WlhoMFpXNWtLQ0IwY25WbExDQjBZWEpuWlhRc0lHUmxaWEFnS1RzS0NYMEtDZ2x5WlhSMWNtNGdkR0Z5WjJWME93cDlDZ292S2lCSVlXNWtiR1Z6SUhKbGMzQnZibk5sY3lCMGJ5QmhiaUJoYW1GNElISmxjWFZsYzNRNkNpQXFJQzBnWm1sdVpITWdkR2hsSUhKcFoyaDBJR1JoZEdGVWVYQmxJQ2h0WldScFlYUmxjeUJpWlhSM1pXVnVJR052Ym5SbGJuUXRkSGx3WlNCaGJtUWdaWGh3WldOMFpXUWdaR0YwWVZSNWNHVXBDaUFxSUMwZ2NtVjBkWEp1Y3lCMGFHVWdZMjl5Y21WemNHOXVaR2x1WnlCeVpYTndiMjV6WlFvZ0tpOEtablZ1WTNScGIyNGdZV3BoZUVoaGJtUnNaVkpsYzNCdmJuTmxjeWdnY3l3Z2FuRllTRklzSUhKbGMzQnZibk5sY3lBcElIc0tDZ2wyWVhJZ1kzUXNJSFI1Y0dVc0lHWnBibUZzUkdGMFlWUjVjR1VzSUdacGNuTjBSR0YwWVZSNWNHVXNDZ2tKWTI5dWRHVnVkSE1nUFNCekxtTnZiblJsYm5SekxBb0pDV1JoZEdGVWVYQmxjeUE5SUhNdVpHRjBZVlI1Y0dWek93b0tDUzh2SUZKbGJXOTJaU0JoZFhSdklHUmhkR0ZVZVhCbElHRnVaQ0JuWlhRZ1kyOXVkR1Z1ZEMxMGVYQmxJR2x1SUhSb1pTQndjbTlqWlhOekNnbDNhR2xzWlNBb0lHUmhkR0ZVZVhCbGMxc2dNQ0JkSUQwOVBTQWlLaUlnS1NCN0Nna0paR0YwWVZSNWNHVnpMbk5vYVdaMEtDazdDZ2tKYVdZZ0tDQmpkQ0E5UFQwZ2RXNWtaV1pwYm1Wa0lDa2dld29KQ1FsamRDQTlJSE11YldsdFpWUjVjR1VnZkh3Z2FuRllTRkl1WjJWMFVtVnpjRzl1YzJWSVpXRmtaWElvSUNKRGIyNTBaVzUwTFZSNWNHVWlJQ2s3Q2drSmZRb0pmUW9LQ1M4dklFTm9aV05ySUdsbUlIZGxKM0psSUdSbFlXeHBibWNnZDJsMGFDQmhJR3R1YjNkdUlHTnZiblJsYm5RdGRIbHdaUW9KYVdZZ0tDQmpkQ0FwSUhzS0NRbG1iM0lnS0NCMGVYQmxJR2x1SUdOdmJuUmxiblJ6SUNrZ2V3b0pDUWxwWmlBb0lHTnZiblJsYm5Seld5QjBlWEJsSUYwZ0ppWWdZMjl1ZEdWdWRITmJJSFI1Y0dVZ1hTNTBaWE4wS0NCamRDQXBJQ2tnZXdvSkNRa0paR0YwWVZSNWNHVnpMblZ1YzJocFpuUW9JSFI1Y0dVZ0tUc0tDUWtKQ1dKeVpXRnJPd29KQ1FsOUNna0pmUW9KZlFvS0NTOHZJRU5vWldOcklIUnZJSE5sWlNCcFppQjNaU0JvWVhabElHRWdjbVZ6Y0c5dWMyVWdabTl5SUhSb1pTQmxlSEJsWTNSbFpDQmtZWFJoVkhsd1pRb0phV1lnS0NCa1lYUmhWSGx3WlhOYklEQWdYU0JwYmlCeVpYTndiMjV6WlhNZ0tTQjdDZ2tKWm1sdVlXeEVZWFJoVkhsd1pTQTlJR1JoZEdGVWVYQmxjMXNnTUNCZE93b0pmU0JsYkhObElIc0tDZ2tKTHk4Z1ZISjVJR052Ym5abGNuUnBZbXhsSUdSaGRHRlVlWEJsY3dvSkNXWnZjaUFvSUhSNWNHVWdhVzRnY21WemNHOXVjMlZ6SUNrZ2V3b0pDUWxwWmlBb0lDRmtZWFJoVkhsd1pYTmJJREFnWFNCOGZDQnpMbU52Ym5abGNuUmxjbk5iSUhSNWNHVWdLeUFpSUNJZ0t5QmtZWFJoVkhsd1pYTmJJREFnWFNCZElDa2dld29KQ1FrSlptbHVZV3hFWVhSaFZIbHdaU0E5SUhSNWNHVTdDZ2tKQ1FsaWNtVmhhenNLQ1FrSmZRb0pDUWxwWmlBb0lDRm1hWEp6ZEVSaGRHRlVlWEJsSUNrZ2V3b0pDUWtKWm1seWMzUkVZWFJoVkhsd1pTQTlJSFI1Y0dVN0Nna0pDWDBLQ1FsOUNnb0pDUzh2SUU5eUlHcDFjM1FnZFhObElHWnBjbk4wSUc5dVpRb0pDV1pwYm1Gc1JHRjBZVlI1Y0dVZ1BTQm1hVzVoYkVSaGRHRlVlWEJsSUh4OElHWnBjbk4wUkdGMFlWUjVjR1U3Q2dsOUNnb0pMeThnU1dZZ2QyVWdabTkxYm1RZ1lTQmtZWFJoVkhsd1pRb0pMeThnVjJVZ1lXUmtJSFJvWlNCa1lYUmhWSGx3WlNCMGJ5QjBhR1VnYkdsemRDQnBaaUJ1WldWa1pXUUtDUzh2SUdGdVpDQnlaWFIxY200Z2RHaGxJR052Y25KbGMzQnZibVJwYm1jZ2NtVnpjRzl1YzJVS0NXbG1JQ2dnWm1sdVlXeEVZWFJoVkhsd1pTQXBJSHNLQ1FscFppQW9JR1pwYm1Gc1JHRjBZVlI1Y0dVZ0lUMDlJR1JoZEdGVWVYQmxjMXNnTUNCZElDa2dld29KQ1Fsa1lYUmhWSGx3WlhNdWRXNXphR2xtZENnZ1ptbHVZV3hFWVhSaFZIbHdaU0FwT3dvSkNYMEtDUWx5WlhSMWNtNGdjbVZ6Y0c5dWMyVnpXeUJtYVc1aGJFUmhkR0ZVZVhCbElGMDdDZ2w5Q24wS0NpOHFJRU5vWVdsdUlHTnZiblpsY25OcGIyNXpJR2RwZG1WdUlIUm9aU0J5WlhGMVpYTjBJR0Z1WkNCMGFHVWdiM0pwWjJsdVlXd2djbVZ6Y0c5dWMyVUtJQ29nUVd4emJ5QnpaWFJ6SUhSb1pTQnlaWE53YjI1elpWaFlXQ0JtYVdWc1pITWdiMjRnZEdobElHcHhXRWhTSUdsdWMzUmhibU5sQ2lBcUx3cG1kVzVqZEdsdmJpQmhhbUY0UTI5dWRtVnlkQ2dnY3l3Z2NtVnpjRzl1YzJVc0lHcHhXRWhTTENCcGMxTjFZMk5sYzNNZ0tTQjdDZ2wyWVhJZ1kyOXVkaklzSUdOMWNuSmxiblFzSUdOdmJuWXNJSFJ0Y0N3Z2NISmxkaXdLQ1FsamIyNTJaWEowWlhKeklEMGdlMzBzQ2dvSkNTOHZJRmR2Y21zZ2QybDBhQ0JoSUdOdmNIa2diMllnWkdGMFlWUjVjR1Z6SUdsdUlHTmhjMlVnZDJVZ2JtVmxaQ0IwYnlCdGIyUnBabmtnYVhRZ1ptOXlJR052Ym5abGNuTnBiMjRLQ1Fsa1lYUmhWSGx3WlhNZ1BTQnpMbVJoZEdGVWVYQmxjeTV6YkdsalpTZ3BPd29LQ1M4dklFTnlaV0YwWlNCamIyNTJaWEowWlhKeklHMWhjQ0IzYVhSb0lHeHZkMlZ5WTJGelpXUWdhMlY1Y3dvSmFXWWdLQ0JrWVhSaFZIbHdaWE5iSURFZ1hTQXBJSHNLQ1FsbWIzSWdLQ0JqYjI1MklHbHVJSE11WTI5dWRtVnlkR1Z5Y3lBcElIc0tDUWtKWTI5dWRtVnlkR1Z5YzFzZ1kyOXVkaTUwYjB4dmQyVnlRMkZ6WlNncElGMGdQU0J6TG1OdmJuWmxjblJsY25OYklHTnZibllnWFRzS0NRbDlDZ2w5Q2dvSlkzVnljbVZ1ZENBOUlHUmhkR0ZVZVhCbGN5NXphR2xtZENncE93b0tDUzh2SUVOdmJuWmxjblFnZEc4Z1pXRmphQ0J6WlhGMVpXNTBhV0ZzSUdSaGRHRlVlWEJsQ2dsM2FHbHNaU0FvSUdOMWNuSmxiblFnS1NCN0Nnb0pDV2xtSUNnZ2N5NXlaWE53YjI1elpVWnBaV3hrYzFzZ1kzVnljbVZ1ZENCZElDa2dld29KQ1FscWNWaElVbHNnY3k1eVpYTndiMjV6WlVacFpXeGtjMXNnWTNWeWNtVnVkQ0JkSUYwZ1BTQnlaWE53YjI1elpUc0tDUWw5Q2dvSkNTOHZJRUZ3Y0d4NUlIUm9aU0JrWVhSaFJtbHNkR1Z5SUdsbUlIQnliM1pwWkdWa0Nna0phV1lnS0NBaGNISmxkaUFtSmlCcGMxTjFZMk5sYzNNZ0ppWWdjeTVrWVhSaFJtbHNkR1Z5SUNrZ2V3b0pDUWx5WlhOd2IyNXpaU0E5SUhNdVpHRjBZVVpwYkhSbGNpZ2djbVZ6Y0c5dWMyVXNJSE11WkdGMFlWUjVjR1VnS1RzS0NRbDlDZ29KQ1hCeVpYWWdQU0JqZFhKeVpXNTBPd29KQ1dOMWNuSmxiblFnUFNCa1lYUmhWSGx3WlhNdWMyaHBablFvS1RzS0Nna0phV1lnS0NCamRYSnlaVzUwSUNrZ2V3b0tDUWtKTHk4Z1ZHaGxjbVVuY3lCdmJteDVJSGR2Y21zZ2RHOGdaRzhnYVdZZ1kzVnljbVZ1ZENCa1lYUmhWSGx3WlNCcGN5QnViMjR0WVhWMGJ3b0pDUWxwWmlBb0lHTjFjbkpsYm5RZ1BUMDlJQ0lxSWlBcElIc0tDZ2tKQ1FsamRYSnlaVzUwSUQwZ2NISmxkanNLQ2drSkNTOHZJRU52Ym5abGNuUWdjbVZ6Y0c5dWMyVWdhV1lnY0hKbGRpQmtZWFJoVkhsd1pTQnBjeUJ1YjI0dFlYVjBieUJoYm1RZ1pHbG1abVZ5Y3lCbWNtOXRJR04xY25KbGJuUUtDUWtKZlNCbGJITmxJR2xtSUNnZ2NISmxkaUFoUFQwZ0lpb2lJQ1ltSUhCeVpYWWdJVDA5SUdOMWNuSmxiblFnS1NCN0Nnb0pDUWtKTHk4Z1UyVmxheUJoSUdScGNtVmpkQ0JqYjI1MlpYSjBaWElLQ1FrSkNXTnZibllnUFNCamIyNTJaWEowWlhKeld5QndjbVYySUNzZ0lpQWlJQ3NnWTNWeWNtVnVkQ0JkSUh4OElHTnZiblpsY25SbGNuTmJJQ0lxSUNJZ0t5QmpkWEp5Wlc1MElGMDdDZ29KQ1FrSkx5OGdTV1lnYm05dVpTQm1iM1Z1WkN3Z2MyVmxheUJoSUhCaGFYSUtDUWtKQ1dsbUlDZ2dJV052Ym5ZZ0tTQjdDZ2tKQ1FrSlptOXlJQ2dnWTI5dWRqSWdhVzRnWTI5dWRtVnlkR1Z5Y3lBcElIc0tDZ2tKQ1FrSkNTOHZJRWxtSUdOdmJuWXlJRzkxZEhCMWRITWdZM1Z5Y21WdWRBb0pDUWtKQ1FsMGJYQWdQU0JqYjI1Mk1pNXpjR3hwZENnZ0lpQWlJQ2s3Q2drSkNRa0pDV2xtSUNnZ2RHMXdXeUF4SUYwZ1BUMDlJR04xY25KbGJuUWdLU0I3Q2dvSkNRa0pDUWtKTHk4Z1NXWWdjSEpsZGlCallXNGdZbVVnWTI5dWRtVnlkR1ZrSUhSdklHRmpZMlZ3ZEdWa0lHbHVjSFYwQ2drSkNRa0pDUWxqYjI1MklEMGdZMjl1ZG1WeWRHVnljMXNnY0hKbGRpQXJJQ0lnSWlBcklIUnRjRnNnTUNCZElGMGdmSHdLQ1FrSkNRa0pDUWxqYjI1MlpYSjBaWEp6V3lBaUtpQWlJQ3NnZEcxd1d5QXdJRjBnWFRzS0NRa0pDUWtKQ1dsbUlDZ2dZMjl1ZGlBcElIc0tDZ2tKQ1FrSkNRa0pMeThnUTI5dVpHVnVjMlVnWlhGMWFYWmhiR1Z1WTJVZ1kyOXVkbVZ5ZEdWeWN3b0pDUWtKQ1FrSkNXbG1JQ2dnWTI5dWRpQTlQVDBnZEhKMVpTQXBJSHNLQ1FrSkNRa0pDUWtKWTI5dWRpQTlJR052Ym5abGNuUmxjbk5iSUdOdmJuWXlJRjA3Q2dvSkNRa0pDUWtKQ1M4dklFOTBhR1Z5ZDJselpTd2dhVzV6WlhKMElIUm9aU0JwYm5SbGNtMWxaR2xoZEdVZ1pHRjBZVlI1Y0dVS0NRa0pDUWtKQ1FsOUlHVnNjMlVnYVdZZ0tDQmpiMjUyWlhKMFpYSnpXeUJqYjI1Mk1pQmRJQ0U5UFNCMGNuVmxJQ2tnZXdvSkNRa0pDUWtKQ1FsamRYSnlaVzUwSUQwZ2RHMXdXeUF3SUYwN0Nna0pDUWtKQ1FrSkNXUmhkR0ZVZVhCbGN5NTFibk5vYVdaMEtDQjBiWEJiSURFZ1hTQXBPd29KQ1FrSkNRa0pDWDBLQ1FrSkNRa0pDUWxpY21WaGF6c0tDUWtKQ1FrSkNYMEtDUWtKQ1FrSmZRb0pDUWtKQ1gwS0NRa0pDWDBLQ2drSkNRa3ZMeUJCY0hCc2VTQmpiMjUyWlhKMFpYSWdLR2xtSUc1dmRDQmhiaUJsY1hWcGRtRnNaVzVqWlNrS0NRa0pDV2xtSUNnZ1kyOXVkaUFoUFQwZ2RISjFaU0FwSUhzS0Nna0pDUWtKTHk4Z1ZXNXNaWE56SUdWeWNtOXljeUJoY21VZ1lXeHNiM2RsWkNCMGJ5QmlkV0ppYkdVc0lHTmhkR05vSUdGdVpDQnlaWFIxY200Z2RHaGxiUW9KQ1FrSkNXbG1JQ2dnWTI5dWRpQW1KaUJ6TG5Sb2NtOTNjeUFwSUhzS0NRa0pDUWtKY21WemNHOXVjMlVnUFNCamIyNTJLQ0J5WlhOd2IyNXpaU0FwT3dvSkNRa0pDWDBnWld4elpTQjdDZ2tKQ1FrSkNYUnllU0I3Q2drSkNRa0pDUWx5WlhOd2IyNXpaU0E5SUdOdmJuWW9JSEpsYzNCdmJuTmxJQ2s3Q2drSkNRa0pDWDBnWTJGMFkyZ2dLQ0JsSUNrZ2V3b0pDUWtKQ1FrSmNtVjBkWEp1SUhzS0NRa0pDUWtKQ1FsemRHRjBaVG9nSW5CaGNuTmxjbVZ5Y205eUlpd0tDUWtKQ1FrSkNRbGxjbkp2Y2pvZ1kyOXVkaUEvSUdVZ09pQWlUbThnWTI5dWRtVnljMmx2YmlCbWNtOXRJQ0lnS3lCd2NtVjJJQ3NnSWlCMGJ5QWlJQ3NnWTNWeWNtVnVkQW9KQ1FrSkNRa0pmVHNLQ1FrSkNRa0pmUW9KQ1FrSkNYMEtDUWtKQ1gwS0NRa0pmUW9KQ1gwS0NYMEtDZ2x5WlhSMWNtNGdleUJ6ZEdGMFpUb2dJbk4xWTJObGMzTWlMQ0JrWVhSaE9pQnlaWE53YjI1elpTQjlPd3A5Q2dwcVVYVmxjbmt1WlhoMFpXNWtLQ0I3Q2dvSkx5OGdRMjkxYm5SbGNpQm1iM0lnYUc5c1pHbHVaeUIwYUdVZ2JuVnRZbVZ5SUc5bUlHRmpkR2wyWlNCeGRXVnlhV1Z6Q2dsaFkzUnBkbVU2SURBc0Nnb0pMeThnVEdGemRDMU5iMlJwWm1sbFpDQm9aV0ZrWlhJZ1kyRmphR1VnWm05eUlHNWxlSFFnY21WeGRXVnpkQW9KYkdGemRFMXZaR2xtYVdWa09pQjdmU3dLQ1dWMFlXYzZJSHQ5TEFvS0NXRnFZWGhUWlhSMGFXNW5jem9nZXdvSkNYVnliRG9nYkc5allYUnBiMjR1YUhKbFppd0tDUWwwZVhCbE9pQWlSMFZVSWl3S0NRbHBjMHh2WTJGc09pQnliRzlqWVd4UWNtOTBiMk52YkM1MFpYTjBLQ0JzYjJOaGRHbHZiaTV3Y205MGIyTnZiQ0FwTEFvSkNXZHNiMkpoYkRvZ2RISjFaU3dLQ1Fsd2NtOWpaWE56UkdGMFlUb2dkSEoxWlN3S0NRbGhjM2x1WXpvZ2RISjFaU3dLQ1FsamIyNTBaVzUwVkhsd1pUb2dJbUZ3Y0d4cFkyRjBhVzl1TDNndGQzZDNMV1p2Y20wdGRYSnNaVzVqYjJSbFpEc2dZMmhoY25ObGREMVZWRVl0T0NJc0Nnb0pDUzhxQ2drSmRHbHRaVzkxZERvZ01Dd0tDUWxrWVhSaE9pQnVkV3hzTEFvSkNXUmhkR0ZVZVhCbE9pQnVkV3hzTEFvSkNYVnpaWEp1WVcxbE9pQnVkV3hzTEFvSkNYQmhjM04zYjNKa09pQnVkV3hzTEFvSkNXTmhZMmhsT2lCdWRXeHNMQW9KQ1hSb2NtOTNjem9nWm1Gc2MyVXNDZ2tKZEhKaFpHbDBhVzl1WVd3NklHWmhiSE5sTEFvSkNXaGxZV1JsY25NNklIdDlMQW9KQ1NvdkNnb0pDV0ZqWTJWd2RITTZJSHNLQ1FrSklpb2lPaUJoYkd4VWVYQmxjeXdLQ1FrSmRHVjRkRG9nSW5SbGVIUXZjR3hoYVc0aUxBb0pDUWxvZEcxc09pQWlkR1Y0ZEM5b2RHMXNJaXdLQ1FrSmVHMXNPaUFpWVhCd2JHbGpZWFJwYjI0dmVHMXNMQ0IwWlhoMEwzaHRiQ0lzQ2drSkNXcHpiMjQ2SUNKaGNIQnNhV05oZEdsdmJpOXFjMjl1TENCMFpYaDBMMnBoZG1GelkzSnBjSFFpQ2drSmZTd0tDZ2tKWTI5dWRHVnVkSE02SUhzS0NRa0plRzFzT2lBdlhHSjRiV3hjWWk4c0Nna0pDV2gwYld3NklDOWNZbWgwYld3dkxBb0pDUWxxYzI5dU9pQXZYR0pxYzI5dVhHSXZDZ2tKZlN3S0Nna0pjbVZ6Y0c5dWMyVkdhV1ZzWkhNNklIc0tDUWtKZUcxc09pQWljbVZ6Y0c5dWMyVllUVXdpTEFvSkNRbDBaWGgwT2lBaWNtVnpjRzl1YzJWVVpYaDBJaXdLQ1FrSmFuTnZiam9nSW5KbGMzQnZibk5sU2xOUFRpSUtDUWw5TEFvS0NRa3ZMeUJFWVhSaElHTnZiblpsY25SbGNuTUtDUWt2THlCTFpYbHpJSE5sY0dGeVlYUmxJSE52ZFhKalpTQW9iM0lnWTJGMFkyaGhiR3dnSWlvaUtTQmhibVFnWkdWemRHbHVZWFJwYjI0Z2RIbHdaWE1nZDJsMGFDQmhJSE5wYm1kc1pTQnpjR0ZqWlFvSkNXTnZiblpsY25SbGNuTTZJSHNLQ2drSkNTOHZJRU52Ym5abGNuUWdZVzU1ZEdocGJtY2dkRzhnZEdWNGRBb0pDUWtpS2lCMFpYaDBJam9nVTNSeWFXNW5MQW9LQ1FrSkx5OGdWR1Y0ZENCMGJ5Qm9kRzFzSUNoMGNuVmxJRDBnYm04Z2RISmhibk5tYjNKdFlYUnBiMjRwQ2drSkNTSjBaWGgwSUdoMGJXd2lPaUIwY25WbExBb0tDUWtKTHk4Z1JYWmhiSFZoZEdVZ2RHVjRkQ0JoY3lCaElHcHpiMjRnWlhod2NtVnpjMmx2YmdvSkNRa2lkR1Y0ZENCcWMyOXVJam9nU2xOUFRpNXdZWEp6WlN3S0Nna0pDUzh2SUZCaGNuTmxJSFJsZUhRZ1lYTWdlRzFzQ2drSkNTSjBaWGgwSUhodGJDSTZJR3BSZFdWeWVTNXdZWEp6WlZoTlRBb0pDWDBzQ2dvSkNTOHZJRVp2Y2lCdmNIUnBiMjV6SUhSb1lYUWdjMmh2ZFd4a2JpZDBJR0psSUdSbFpYQWdaWGgwWlc1a1pXUTZDZ2tKTHk4Z2VXOTFJR05oYmlCaFpHUWdlVzkxY2lCdmQyNGdZM1Z6ZEc5dElHOXdkR2x2Ym5NZ2FHVnlaU0JwWmdvSkNTOHZJR0Z1WkNCM2FHVnVJSGx2ZFNCamNtVmhkR1VnYjI1bElIUm9ZWFFnYzJodmRXeGtiaWQwSUdKbENna0pMeThnWkdWbGNDQmxlSFJsYm1SbFpDQW9jMlZsSUdGcVlYaEZlSFJsYm1RcENna0pabXhoZEU5d2RHbHZibk02SUhzS0NRa0pkWEpzT2lCMGNuVmxMQW9KQ1FsamIyNTBaWGgwT2lCMGNuVmxDZ2tKZlFvSmZTd0tDZ2t2THlCRGNtVmhkR1Z6SUdFZ1puVnNiQ0JtYkdWa1oyVmtJSE5sZEhScGJtZHpJRzlpYW1WamRDQnBiblJ2SUhSaGNtZGxkQW9KTHk4Z2QybDBhQ0JpYjNSb0lHRnFZWGhUWlhSMGFXNW5jeUJoYm1RZ2MyVjBkR2x1WjNNZ1ptbGxiR1J6TGdvSkx5OGdTV1lnZEdGeVoyVjBJR2x6SUc5dGFYUjBaV1FzSUhkeWFYUmxjeUJwYm5SdklHRnFZWGhUWlhSMGFXNW5jeTRLQ1dGcVlYaFRaWFIxY0RvZ1puVnVZM1JwYjI0b0lIUmhjbWRsZEN3Z2MyVjBkR2x1WjNNZ0tTQjdDZ2tKY21WMGRYSnVJSE5sZEhScGJtZHpJRDhLQ2drSkNTOHZJRUoxYVd4a2FXNW5JR0VnYzJWMGRHbHVaM01nYjJKcVpXTjBDZ2tKQ1dGcVlYaEZlSFJsYm1Rb0lHRnFZWGhGZUhSbGJtUW9JSFJoY21kbGRDd2dhbEYxWlhKNUxtRnFZWGhUWlhSMGFXNW5jeUFwTENCelpYUjBhVzVuY3lBcElEb0tDZ2tKQ1M4dklFVjRkR1Z1WkdsdVp5QmhhbUY0VTJWMGRHbHVaM01LQ1FrSllXcGhlRVY0ZEdWdVpDZ2dhbEYxWlhKNUxtRnFZWGhUWlhSMGFXNW5jeXdnZEdGeVoyVjBJQ2s3Q2dsOUxBb0tDV0ZxWVhoUWNtVm1hV3gwWlhJNklHRmtaRlJ2VUhKbFptbHNkR1Z5YzA5eVZISmhibk53YjNKMGN5Z2djSEpsWm1sc2RHVnljeUFwTEFvSllXcGhlRlJ5WVc1emNHOXlkRG9nWVdSa1ZHOVFjbVZtYVd4MFpYSnpUM0pVY21GdWMzQnZjblJ6S0NCMGNtRnVjM0J2Y25SeklDa3NDZ29KTHk4Z1RXRnBiaUJ0WlhSb2IyUUtDV0ZxWVhnNklHWjFibU4wYVc5dUtDQjFjbXdzSUc5d2RHbHZibk1nS1NCN0Nnb0pDUzh2SUVsbUlIVnliQ0JwY3lCaGJpQnZZbXBsWTNRc0lITnBiWFZzWVhSbElIQnlaUzB4TGpVZ2MybG5ibUYwZFhKbENna0phV1lnS0NCMGVYQmxiMllnZFhKc0lEMDlQU0FpYjJKcVpXTjBJaUFwSUhzS0NRa0piM0IwYVc5dWN5QTlJSFZ5YkRzS0NRa0pkWEpzSUQwZ2RXNWtaV1pwYm1Wa093b0pDWDBLQ2drSkx5OGdSbTl5WTJVZ2IzQjBhVzl1Y3lCMGJ5QmlaU0JoYmlCdlltcGxZM1FLQ1FsdmNIUnBiMjV6SUQwZ2IzQjBhVzl1Y3lCOGZDQjdmVHNLQ2drSmRtRnlJSFJ5WVc1emNHOXlkQ3dLQ2drSkNTOHZJRlZTVENCM2FYUm9iM1YwSUdGdWRHa3RZMkZqYUdVZ2NHRnlZVzBLQ1FrSlkyRmphR1ZWVWt3c0Nnb0pDUWt2THlCU1pYTndiMjV6WlNCb1pXRmtaWEp6Q2drSkNYSmxjM0J2Ym5ObFNHVmhaR1Z5YzFOMGNtbHVaeXdLQ1FrSmNtVnpjRzl1YzJWSVpXRmtaWEp6TEFvS0NRa0pMeThnZEdsdFpXOTFkQ0JvWVc1a2JHVUtDUWtKZEdsdFpXOTFkRlJwYldWeUxBb0tDUWtKTHk4Z1ZYSnNJR05zWldGdWRYQWdkbUZ5Q2drSkNYVnliRUZ1WTJodmNpd0tDZ2tKQ1M4dklGSmxjWFZsYzNRZ2MzUmhkR1VnS0dKbFkyOXRaWE1nWm1Gc2MyVWdkWEJ2YmlCelpXNWtJR0Z1WkNCMGNuVmxJSFZ3YjI0Z1kyOXRjR3hsZEdsdmJpa0tDUWtKWTI5dGNHeGxkR1ZrTEFvS0NRa0pMeThnVkc4Z2EyNXZkeUJwWmlCbmJHOWlZV3dnWlhabGJuUnpJR0Z5WlNCMGJ5QmlaU0JrYVhOd1lYUmphR1ZrQ2drSkNXWnBjbVZIYkc5aVlXeHpMQW9LQ1FrSkx5OGdURzl2Y0NCMllYSnBZV0pzWlFvSkNRbHBMQW9LQ1FrSkx5OGdkVzVqWVdOb1pXUWdjR0Z5ZENCdlppQjBhR1VnZFhKc0Nna0pDWFZ1WTJGamFHVmtMQW9LQ1FrSkx5OGdRM0psWVhSbElIUm9aU0JtYVc1aGJDQnZjSFJwYjI1eklHOWlhbVZqZEFvSkNRbHpJRDBnYWxGMVpYSjVMbUZxWVhoVFpYUjFjQ2dnZTMwc0lHOXdkR2x2Ym5NZ0tTd0tDZ2tKQ1M4dklFTmhiR3hpWVdOcmN5QmpiMjUwWlhoMENna0pDV05oYkd4aVlXTnJRMjl1ZEdWNGRDQTlJSE11WTI5dWRHVjRkQ0I4ZkNCekxBb0tDUWtKTHk4Z1EyOXVkR1Y0ZENCbWIzSWdaMnh2WW1Gc0lHVjJaVzUwY3lCcGN5QmpZV3hzWW1GamEwTnZiblJsZUhRZ2FXWWdhWFFnYVhNZ1lTQkVUMDBnYm05a1pTQnZjaUJxVVhWbGNua2dZMjlzYkdWamRHbHZiZ29KQ1FsbmJHOWlZV3hGZG1WdWRFTnZiblJsZUhRZ1BTQnpMbU52Ym5SbGVIUWdKaVlLQ1FrSkNTZ2dZMkZzYkdKaFkydERiMjUwWlhoMExtNXZaR1ZVZVhCbElIeDhJR05oYkd4aVlXTnJRMjl1ZEdWNGRDNXFjWFZsY25rZ0tTQS9DZ2tKQ1FrSmFsRjFaWEo1S0NCallXeHNZbUZqYTBOdmJuUmxlSFFnS1NBNkNna0pDUWtKYWxGMVpYSjVMbVYyWlc1MExBb0tDUWtKTHk4Z1JHVm1aWEp5WldSekNna0pDV1JsWm1WeWNtVmtJRDBnYWxGMVpYSjVMa1JsWm1WeWNtVmtLQ2tzQ2drSkNXTnZiWEJzWlhSbFJHVm1aWEp5WldRZ1BTQnFVWFZsY25rdVEyRnNiR0poWTJ0ektDQWliMjVqWlNCdFpXMXZjbmtpSUNrc0Nnb0pDUWt2THlCVGRHRjBkWE10WkdWd1pXNWtaVzUwSUdOaGJHeGlZV05yY3dvSkNRbHpkR0YwZFhORGIyUmxJRDBnY3k1emRHRjBkWE5EYjJSbElIeDhJSHQ5TEFvS0NRa0pMeThnU0dWaFpHVnljeUFvZEdobGVTQmhjbVVnYzJWdWRDQmhiR3dnWVhRZ2IyNWpaU2tLQ1FrSmNtVnhkV1Z6ZEVobFlXUmxjbk1nUFNCN2ZTd0tDUWtKY21WeGRXVnpkRWhsWVdSbGNuTk9ZVzFsY3lBOUlIdDlMQW9LQ1FrSkx5OGdSR1ZtWVhWc2RDQmhZbTl5ZENCdFpYTnpZV2RsQ2drSkNYTjBja0ZpYjNKMElEMGdJbU5oYm1ObGJHVmtJaXdLQ2drSkNTOHZJRVpoYTJVZ2VHaHlDZ2tKQ1dweFdFaFNJRDBnZXdvSkNRa0pjbVZoWkhsVGRHRjBaVG9nTUN3S0Nna0pDUWt2THlCQ2RXbHNaSE1nYUdWaFpHVnljeUJvWVhOb2RHRmliR1VnYVdZZ2JtVmxaR1ZrQ2drSkNRbG5aWFJTWlhOd2IyNXpaVWhsWVdSbGNqb2dablZ1WTNScGIyNG9JR3RsZVNBcElIc0tDUWtKQ1FsMllYSWdiV0YwWTJnN0Nna0pDUWtKYVdZZ0tDQmpiMjF3YkdWMFpXUWdLU0I3Q2drSkNRa0pDV2xtSUNnZ0lYSmxjM0J2Ym5ObFNHVmhaR1Z5Y3lBcElIc0tDUWtKQ1FrSkNYSmxjM0J2Ym5ObFNHVmhaR1Z5Y3lBOUlIdDlPd29KQ1FrSkNRa0pkMmhwYkdVZ0tDQW9JRzFoZEdOb0lEMGdjbWhsWVdSbGNuTXVaWGhsWXlnZ2NtVnpjRzl1YzJWSVpXRmtaWEp6VTNSeWFXNW5JQ2tnS1NBcElIc0tDUWtKQ1FrSkNRbHlaWE53YjI1elpVaGxZV1JsY25OYklHMWhkR05vV3lBeElGMHVkRzlNYjNkbGNrTmhjMlVvS1NCZElEMGdiV0YwWTJoYklESWdYVHNLQ1FrSkNRa0pDWDBLQ1FrSkNRa0pmUW9KQ1FrSkNRbHRZWFJqYUNBOUlISmxjM0J2Ym5ObFNHVmhaR1Z5YzFzZ2EyVjVMblJ2VEc5M1pYSkRZWE5sS0NrZ1hUc0tDUWtKQ1FsOUNna0pDUWtKY21WMGRYSnVJRzFoZEdOb0lEMDlJRzUxYkd3Z1B5QnVkV3hzSURvZ2JXRjBZMmc3Q2drSkNRbDlMQW9LQ1FrSkNTOHZJRkpoZHlCemRISnBibWNLQ1FrSkNXZGxkRUZzYkZKbGMzQnZibk5sU0dWaFpHVnljem9nWm5WdVkzUnBiMjRvS1NCN0Nna0pDUWtKY21WMGRYSnVJR052YlhCc1pYUmxaQ0EvSUhKbGMzQnZibk5sU0dWaFpHVnljMU4wY21sdVp5QTZJRzUxYkd3N0Nna0pDUWw5TEFvS0NRa0pDUzh2SUVOaFkyaGxjeUIwYUdVZ2FHVmhaR1Z5Q2drSkNRbHpaWFJTWlhGMVpYTjBTR1ZoWkdWeU9pQm1kVzVqZEdsdmJpZ2dibUZ0WlN3Z2RtRnNkV1VnS1NCN0Nna0pDUWtKYVdZZ0tDQmpiMjF3YkdWMFpXUWdQVDBnYm5Wc2JDQXBJSHNLQ1FrSkNRa0pibUZ0WlNBOUlISmxjWFZsYzNSSVpXRmtaWEp6VG1GdFpYTmJJRzVoYldVdWRHOU1iM2RsY2tOaGMyVW9LU0JkSUQwS0NRa0pDUWtKQ1hKbGNYVmxjM1JJWldGa1pYSnpUbUZ0WlhOYklHNWhiV1V1ZEc5TWIzZGxja05oYzJVb0tTQmRJSHg4SUc1aGJXVTdDZ2tKQ1FrSkNYSmxjWFZsYzNSSVpXRmtaWEp6V3lCdVlXMWxJRjBnUFNCMllXeDFaVHNLQ1FrSkNRbDlDZ2tKQ1FrSmNtVjBkWEp1SUhSb2FYTTdDZ2tKQ1FsOUxBb0tDUWtKQ1M4dklFOTJaWEp5YVdSbGN5QnlaWE53YjI1elpTQmpiMjUwWlc1MExYUjVjR1VnYUdWaFpHVnlDZ2tKQ1FsdmRtVnljbWxrWlUxcGJXVlVlWEJsT2lCbWRXNWpkR2x2YmlnZ2RIbHdaU0FwSUhzS0NRa0pDUWxwWmlBb0lHTnZiWEJzWlhSbFpDQTlQU0J1ZFd4c0lDa2dld29KQ1FrSkNRbHpMbTFwYldWVWVYQmxJRDBnZEhsd1pUc0tDUWtKQ1FsOUNna0pDUWtKY21WMGRYSnVJSFJvYVhNN0Nna0pDUWw5TEFvS0NRa0pDUzh2SUZOMFlYUjFjeTFrWlhCbGJtUmxiblFnWTJGc2JHSmhZMnR6Q2drSkNRbHpkR0YwZFhORGIyUmxPaUJtZFc1amRHbHZiaWdnYldGd0lDa2dld29KQ1FrSkNYWmhjaUJqYjJSbE93b0pDUWtKQ1dsbUlDZ2diV0Z3SUNrZ2V3b0pDUWtKQ1FscFppQW9JR052YlhCc1pYUmxaQ0FwSUhzS0Nna0pDUWtKQ1Frdkx5QkZlR1ZqZFhSbElIUm9aU0JoY0hCeWIzQnlhV0YwWlNCallXeHNZbUZqYTNNS0NRa0pDUWtKQ1dweFdFaFNMbUZzZDJGNWN5Z2diV0Z3V3lCcWNWaElVaTV6ZEdGMGRYTWdYU0FwT3dvSkNRa0pDUWw5SUdWc2MyVWdld29LQ1FrSkNRa0pDUzh2SUV4aGVua3RZV1JrSUhSb1pTQnVaWGNnWTJGc2JHSmhZMnR6SUdsdUlHRWdkMkY1SUhSb1lYUWdjSEpsYzJWeWRtVnpJRzlzWkNCdmJtVnpDZ2tKQ1FrSkNRbG1iM0lnS0NCamIyUmxJR2x1SUcxaGNDQXBJSHNLQ1FrSkNRa0pDUWx6ZEdGMGRYTkRiMlJsV3lCamIyUmxJRjBnUFNCYklITjBZWFIxYzBOdlpHVmJJR052WkdVZ1hTd2diV0Z3V3lCamIyUmxJRjBnWFRzS0NRa0pDUWtKQ1gwS0NRa0pDUWtKZlFvSkNRa0pDWDBLQ1FrSkNRbHlaWFIxY200Z2RHaHBjenNLQ1FrSkNYMHNDZ29KQ1FrSkx5OGdRMkZ1WTJWc0lIUm9aU0J5WlhGMVpYTjBDZ2tKQ1FsaFltOXlkRG9nWm5WdVkzUnBiMjRvSUhOMFlYUjFjMVJsZUhRZ0tTQjdDZ2tKQ1FrSmRtRnlJR1pwYm1Gc1ZHVjRkQ0E5SUhOMFlYUjFjMVJsZUhRZ2ZId2djM1J5UVdKdmNuUTdDZ2tKQ1FrSmFXWWdLQ0IwY21GdWMzQnZjblFnS1NCN0Nna0pDUWtKQ1hSeVlXNXpjRzl5ZEM1aFltOXlkQ2dnWm1sdVlXeFVaWGgwSUNrN0Nna0pDUWtKZlFvSkNRa0pDV1J2Ym1Vb0lEQXNJR1pwYm1Gc1ZHVjRkQ0FwT3dvSkNRa0pDWEpsZEhWeWJpQjBhR2x6T3dvSkNRa0pmUW9KQ1FsOU93b0tDUWt2THlCQmRIUmhZMmdnWkdWbVpYSnlaV1J6Q2drSlpHVm1aWEp5WldRdWNISnZiV2x6WlNnZ2FuRllTRklnS1RzS0Nna0pMeThnUVdSa0lIQnliM1J2WTI5c0lHbG1JRzV2ZENCd2NtOTJhV1JsWkNBb2NISmxabWxzZEdWeWN5QnRhV2RvZENCbGVIQmxZM1FnYVhRcENna0pMeThnU0dGdVpHeGxJR1poYkhONUlIVnliQ0JwYmlCMGFHVWdjMlYwZEdsdVozTWdiMkpxWldOMElDZ2pNVEF3T1RNNklHTnZibk5wYzNSbGJtTjVJSGRwZEdnZ2IyeGtJSE5wWjI1aGRIVnlaU2tLQ1Frdkx5QlhaU0JoYkhOdklIVnpaU0IwYUdVZ2RYSnNJSEJoY21GdFpYUmxjaUJwWmlCaGRtRnBiR0ZpYkdVS0NRbHpMblZ5YkNBOUlDZ2dLQ0IxY213Z2ZId2djeTUxY213Z2ZId2diRzlqWVhScGIyNHVhSEpsWmlBcElDc2dJaUlnS1FvSkNRa3VjbVZ3YkdGalpTZ2djbkJ5YjNSdlkyOXNMQ0JzYjJOaGRHbHZiaTV3Y205MGIyTnZiQ0FySUNJdkx5SWdLVHNLQ2drSkx5OGdRV3hwWVhNZ2JXVjBhRzlrSUc5d2RHbHZiaUIwYnlCMGVYQmxJR0Z6SUhCbGNpQjBhV05yWlhRZ0l6RXlNREEwQ2drSmN5NTBlWEJsSUQwZ2IzQjBhVzl1Y3k1dFpYUm9iMlFnZkh3Z2IzQjBhVzl1Y3k1MGVYQmxJSHg4SUhNdWJXVjBhRzlrSUh4OElITXVkSGx3WlRzS0Nna0pMeThnUlhoMGNtRmpkQ0JrWVhSaFZIbHdaWE1nYkdsemRBb0pDWE11WkdGMFlWUjVjR1Z6SUQwZ0tDQnpMbVJoZEdGVWVYQmxJSHg4SUNJcUlpQXBMblJ2VEc5M1pYSkRZWE5sS0NrdWJXRjBZMmdvSUhKdWIzUm9kRzFzZDJocGRHVWdLU0I4ZkNCYklDSWlJRjA3Q2dvSkNTOHZJRUVnWTNKdmMzTXRaRzl0WVdsdUlISmxjWFZsYzNRZ2FYTWdhVzRnYjNKa1pYSWdkMmhsYmlCMGFHVWdiM0pwWjJsdUlHUnZaWE51SjNRZ2JXRjBZMmdnZEdobElHTjFjbkpsYm5RZ2IzSnBaMmx1TGdvSkNXbG1JQ2dnY3k1amNtOXpjMFJ2YldGcGJpQTlQU0J1ZFd4c0lDa2dld29KQ1FsMWNteEJibU5vYjNJZ1BTQmtiMk4xYldWdWRDNWpjbVZoZEdWRmJHVnRaVzUwS0NBaVlTSWdLVHNLQ2drSkNTOHZJRk4xY0hCdmNuUTZJRWxGSUR3OU9DQXRJREV4TENCRlpHZGxJREV5SUMwZ01UVUtDUWtKTHk4Z1NVVWdkR2h5YjNkeklHVjRZMlZ3ZEdsdmJpQnZiaUJoWTJObGMzTnBibWNnZEdobElHaHlaV1lnY0hKdmNHVnlkSGtnYVdZZ2RYSnNJR2x6SUcxaGJHWnZjbTFsWkN3S0NRa0pMeThnWlM1bkxpQm9kSFJ3T2k4dlpYaGhiWEJzWlM1amIyMDZPREI0THdvSkNRbDBjbmtnZXdvSkNRa0pkWEpzUVc1amFHOXlMbWh5WldZZ1BTQnpMblZ5YkRzS0Nna0pDUWt2THlCVGRYQndiM0owT2lCSlJTQThQVGdnTFNBeE1TQnZibXg1Q2drSkNRa3ZMeUJCYm1Ob2IzSW5jeUJvYjNOMElIQnliM0JsY25SNUlHbHpiaWQwSUdOdmNuSmxZM1JzZVNCelpYUWdkMmhsYmlCekxuVnliQ0JwY3lCeVpXeGhkR2wyWlFvSkNRa0pkWEpzUVc1amFHOXlMbWh5WldZZ1BTQjFjbXhCYm1Ob2IzSXVhSEpsWmpzS0NRa0pDWE11WTNKdmMzTkViMjFoYVc0Z1BTQnZjbWxuYVc1QmJtTm9iM0l1Y0hKdmRHOWpiMndnS3lBaUx5OGlJQ3NnYjNKcFoybHVRVzVqYUc5eUxtaHZjM1FnSVQwOUNna0pDUWtKZFhKc1FXNWphRzl5TG5CeWIzUnZZMjlzSUNzZ0lpOHZJaUFySUhWeWJFRnVZMmh2Y2k1b2IzTjBPd29KQ1FsOUlHTmhkR05vSUNnZ1pTQXBJSHNLQ2drSkNRa3ZMeUJKWmlCMGFHVnlaU0JwY3lCaGJpQmxjbkp2Y2lCd1lYSnphVzVuSUhSb1pTQlZVa3dzSUdGemMzVnRaU0JwZENCcGN5QmpjbTl6YzBSdmJXRnBiaXdLQ1FrSkNTOHZJR2wwSUdOaGJpQmlaU0J5WldwbFkzUmxaQ0JpZVNCMGFHVWdkSEpoYm5Od2IzSjBJR2xtSUdsMElHbHpJR2x1ZG1Gc2FXUUtDUWtKQ1hNdVkzSnZjM05FYjIxaGFXNGdQU0IwY25WbE93b0pDUWw5Q2drSmZRb0tDUWt2THlCRGIyNTJaWEowSUdSaGRHRWdhV1lnYm05MElHRnNjbVZoWkhrZ1lTQnpkSEpwYm1jS0NRbHBaaUFvSUhNdVpHRjBZU0FtSmlCekxuQnliMk5sYzNORVlYUmhJQ1ltSUhSNWNHVnZaaUJ6TG1SaGRHRWdJVDA5SUNKemRISnBibWNpSUNrZ2V3b0pDUWx6TG1SaGRHRWdQU0JxVVhWbGNua3VjR0Z5WVcwb0lITXVaR0YwWVN3Z2N5NTBjbUZrYVhScGIyNWhiQ0FwT3dvSkNYMEtDZ2tKTHk4Z1FYQndiSGtnY0hKbFptbHNkR1Z5Y3dvSkNXbHVjM0JsWTNSUWNtVm1hV3gwWlhKelQzSlVjbUZ1YzNCdmNuUnpLQ0J3Y21WbWFXeDBaWEp6TENCekxDQnZjSFJwYjI1ekxDQnFjVmhJVWlBcE93b0tDUWt2THlCSlppQnlaWEYxWlhOMElIZGhjeUJoWW05eWRHVmtJR2x1YzJsa1pTQmhJSEJ5WldacGJIUmxjaXdnYzNSdmNDQjBhR1Z5WlFvSkNXbG1JQ2dnWTI5dGNHeGxkR1ZrSUNrZ2V3b0pDUWx5WlhSMWNtNGdhbkZZU0ZJN0Nna0pmUW9LQ1Frdkx5QlhaU0JqWVc0Z1ptbHlaU0JuYkc5aVlXd2daWFpsYm5SeklHRnpJRzltSUc1dmR5QnBaaUJoYzJ0bFpDQjBid29KQ1M4dklFUnZiaWQwSUdacGNtVWdaWFpsYm5SeklHbG1JR3BSZFdWeWVTNWxkbVZ1ZENCcGN5QjFibVJsWm1sdVpXUWdhVzRnWVc0Z1FVMUVMWFZ6WVdkbElITmpaVzVoY21sdklDZ2pNVFV4TVRncENna0pabWx5WlVkc2IySmhiSE1nUFNCcVVYVmxjbmt1WlhabGJuUWdKaVlnY3k1bmJHOWlZV3c3Q2dvSkNTOHZJRmRoZEdOb0lHWnZjaUJoSUc1bGR5QnpaWFFnYjJZZ2NtVnhkV1Z6ZEhNS0NRbHBaaUFvSUdacGNtVkhiRzlpWVd4eklDWW1JR3BSZFdWeWVTNWhZM1JwZG1Vckt5QTlQVDBnTUNBcElIc0tDUWtKYWxGMVpYSjVMbVYyWlc1MExuUnlhV2RuWlhJb0lDSmhhbUY0VTNSaGNuUWlJQ2s3Q2drSmZRb0tDUWt2THlCVmNIQmxjbU5oYzJVZ2RHaGxJSFI1Y0dVS0NRbHpMblI1Y0dVZ1BTQnpMblI1Y0dVdWRHOVZjSEJsY2tOaGMyVW9LVHNLQ2drSkx5OGdSR1YwWlhKdGFXNWxJR2xtSUhKbGNYVmxjM1FnYUdGeklHTnZiblJsYm5RS0NRbHpMbWhoYzBOdmJuUmxiblFnUFNBaGNtNXZRMjl1ZEdWdWRDNTBaWE4wS0NCekxuUjVjR1VnS1RzS0Nna0pMeThnVTJGMlpTQjBhR1VnVlZKTUlHbHVJR05oYzJVZ2QyVW5jbVVnZEc5NWFXNW5JSGRwZEdnZ2RHaGxJRWxtTFUxdlpHbG1hV1ZrTFZOcGJtTmxDZ2tKTHk4Z1lXNWtMMjl5SUVsbUxVNXZibVV0VFdGMFkyZ2dhR1ZoWkdWeUlHeGhkR1Z5SUc5dUNna0pMeThnVW1WdGIzWmxJR2hoYzJnZ2RHOGdjMmx0Y0d4cFpua2dkWEpzSUcxaGJtbHdkV3hoZEdsdmJnb0pDV05oWTJobFZWSk1JRDBnY3k1MWNtd3VjbVZ3YkdGalpTZ2djbWhoYzJnc0lDSWlJQ2s3Q2dvSkNTOHZJRTF2Y21VZ2IzQjBhVzl1Y3lCb1lXNWtiR2x1WnlCbWIzSWdjbVZ4ZFdWemRITWdkMmwwYUNCdWJ5QmpiMjUwWlc1MENna0phV1lnS0NBaGN5NW9ZWE5EYjI1MFpXNTBJQ2tnZXdvS0NRa0pMeThnVW1WdFpXMWlaWElnZEdobElHaGhjMmdnYzI4Z2QyVWdZMkZ1SUhCMWRDQnBkQ0JpWVdOckNna0pDWFZ1WTJGamFHVmtJRDBnY3k1MWNtd3VjMnhwWTJVb0lHTmhZMmhsVlZKTUxteGxibWQwYUNBcE93b0tDUWtKTHk4Z1NXWWdaR0YwWVNCcGN5QmhkbUZwYkdGaWJHVWdZVzVrSUhOb2IzVnNaQ0JpWlNCd2NtOWpaWE56WldRc0lHRndjR1Z1WkNCa1lYUmhJSFJ2SUhWeWJBb0pDUWxwWmlBb0lITXVaR0YwWVNBbUppQW9JSE11Y0hKdlkyVnpjMFJoZEdFZ2ZId2dkSGx3Wlc5bUlITXVaR0YwWVNBOVBUMGdJbk4wY21sdVp5SWdLU0FwSUhzS0NRa0pDV05oWTJobFZWSk1JQ3M5SUNnZ2NuRjFaWEo1TG5SbGMzUW9JR05oWTJobFZWSk1JQ2tnUHlBaUppSWdPaUFpUHlJZ0tTQXJJSE11WkdGMFlUc0tDZ2tKQ1Frdkx5QWpPVFk0TWpvZ2NtVnRiM1psSUdSaGRHRWdjMjhnZEdoaGRDQnBkQ2R6SUc1dmRDQjFjMlZrSUdsdUlHRnVJR1YyWlc1MGRXRnNJSEpsZEhKNUNna0pDUWxrWld4bGRHVWdjeTVrWVhSaE93b0pDUWw5Q2dvSkNRa3ZMeUJCWkdRZ2IzSWdkWEJrWVhSbElHRnVkR2t0WTJGamFHVWdjR0Z5WVcwZ2FXWWdibVZsWkdWa0Nna0pDV2xtSUNnZ2N5NWpZV05vWlNBOVBUMGdabUZzYzJVZ0tTQjdDZ2tKQ1FsallXTm9aVlZTVENBOUlHTmhZMmhsVlZKTUxuSmxjR3hoWTJVb0lISmhiblJwUTJGamFHVXNJQ0lrTVNJZ0tUc0tDUWtKQ1hWdVkyRmphR1ZrSUQwZ0tDQnljWFZsY25rdWRHVnpkQ2dnWTJGamFHVlZVa3dnS1NBL0lDSW1JaUE2SUNJL0lpQXBJQ3NnSWw4OUlpQXJJQ2dnYm05dVkyVXJLeUFwSUNzZ2RXNWpZV05vWldRN0Nna0pDWDBLQ2drSkNTOHZJRkIxZENCb1lYTm9JR0Z1WkNCaGJuUnBMV05oWTJobElHOXVJSFJvWlNCVlVrd2dkR2hoZENCM2FXeHNJR0psSUhKbGNYVmxjM1JsWkNBb1oyZ3RNVGN6TWlrS0NRa0pjeTUxY213Z1BTQmpZV05vWlZWU1RDQXJJSFZ1WTJGamFHVmtPd29LQ1Frdkx5QkRhR0Z1WjJVZ0p5VXlNQ2NnZEc4Z0p5c25JR2xtSUhSb2FYTWdhWE1nWlc1amIyUmxaQ0JtYjNKdElHSnZaSGtnWTI5dWRHVnVkQ0FvWjJndE1qWTFPQ2tLQ1FsOUlHVnNjMlVnYVdZZ0tDQnpMbVJoZEdFZ0ppWWdjeTV3Y205alpYTnpSR0YwWVNBbUpnb0pDUWtvSUhNdVkyOXVkR1Z1ZEZSNWNHVWdmSHdnSWlJZ0tTNXBibVJsZUU5bUtDQWlZWEJ3YkdsallYUnBiMjR2ZUMxM2QzY3RabTl5YlMxMWNteGxibU52WkdWa0lpQXBJRDA5UFNBd0lDa2dld29KQ1FsekxtUmhkR0VnUFNCekxtUmhkR0V1Y21Wd2JHRmpaU2dnY2pJd0xDQWlLeUlnS1RzS0NRbDlDZ29KQ1M4dklGTmxkQ0IwYUdVZ1NXWXRUVzlrYVdacFpXUXRVMmx1WTJVZ1lXNWtMMjl5SUVsbUxVNXZibVV0VFdGMFkyZ2dhR1ZoWkdWeUxDQnBaaUJwYmlCcFprMXZaR2xtYVdWa0lHMXZaR1V1Q2drSmFXWWdLQ0J6TG1sbVRXOWthV1pwWldRZ0tTQjdDZ2tKQ1dsbUlDZ2dhbEYxWlhKNUxteGhjM1JOYjJScFptbGxaRnNnWTJGamFHVlZVa3dnWFNBcElIc0tDUWtKQ1dweFdFaFNMbk5sZEZKbGNYVmxjM1JJWldGa1pYSW9JQ0pKWmkxTmIyUnBabWxsWkMxVGFXNWpaU0lzSUdwUmRXVnllUzVzWVhOMFRXOWthV1pwWldSYklHTmhZMmhsVlZKTUlGMGdLVHNLQ1FrSmZRb0pDUWxwWmlBb0lHcFJkV1Z5ZVM1bGRHRm5XeUJqWVdOb1pWVlNUQ0JkSUNrZ2V3b0pDUWtKYW5GWVNGSXVjMlYwVW1WeGRXVnpkRWhsWVdSbGNpZ2dJa2xtTFU1dmJtVXRUV0YwWTJnaUxDQnFVWFZsY25rdVpYUmhaMXNnWTJGamFHVlZVa3dnWFNBcE93b0pDUWw5Q2drSmZRb0tDUWt2THlCVFpYUWdkR2hsSUdOdmNuSmxZM1FnYUdWaFpHVnlMQ0JwWmlCa1lYUmhJR2x6SUdKbGFXNW5JSE5sYm5RS0NRbHBaaUFvSUhNdVpHRjBZU0FtSmlCekxtaGhjME52Ym5SbGJuUWdKaVlnY3k1amIyNTBaVzUwVkhsd1pTQWhQVDBnWm1Gc2MyVWdmSHdnYjNCMGFXOXVjeTVqYjI1MFpXNTBWSGx3WlNBcElIc0tDUWtKYW5GWVNGSXVjMlYwVW1WeGRXVnpkRWhsWVdSbGNpZ2dJa052Ym5SbGJuUXRWSGx3WlNJc0lITXVZMjl1ZEdWdWRGUjVjR1VnS1RzS0NRbDlDZ29KQ1M4dklGTmxkQ0IwYUdVZ1FXTmpaWEIwY3lCb1pXRmtaWElnWm05eUlIUm9aU0J6WlhKMlpYSXNJR1JsY0dWdVpHbHVaeUJ2YmlCMGFHVWdaR0YwWVZSNWNHVUtDUWxxY1ZoSVVpNXpaWFJTWlhGMVpYTjBTR1ZoWkdWeUtBb0pDUWtpUVdOalpYQjBJaXdLQ1FrSmN5NWtZWFJoVkhsd1pYTmJJREFnWFNBbUppQnpMbUZqWTJWd2RITmJJSE11WkdGMFlWUjVjR1Z6V3lBd0lGMGdYU0EvQ2drSkNRbHpMbUZqWTJWd2RITmJJSE11WkdGMFlWUjVjR1Z6V3lBd0lGMGdYU0FyQ2drSkNRa0pLQ0J6TG1SaGRHRlVlWEJsYzFzZ01DQmRJQ0U5UFNBaUtpSWdQeUFpTENBaUlDc2dZV3hzVkhsd1pYTWdLeUFpT3lCeFBUQXVNREVpSURvZ0lpSWdLU0E2Q2drSkNRbHpMbUZqWTJWd2RITmJJQ0lxSWlCZENna0pLVHNLQ2drSkx5OGdRMmhsWTJzZ1ptOXlJR2hsWVdSbGNuTWdiM0IwYVc5dUNna0pabTl5SUNnZ2FTQnBiaUJ6TG1obFlXUmxjbk1nS1NCN0Nna0pDV3B4V0VoU0xuTmxkRkpsY1hWbGMzUklaV0ZrWlhJb0lHa3NJSE11YUdWaFpHVnljMXNnYVNCZElDazdDZ2tKZlFvS0NRa3ZMeUJCYkd4dmR5QmpkWE4wYjIwZ2FHVmhaR1Z5Y3k5dGFXMWxkSGx3WlhNZ1lXNWtJR1ZoY214NUlHRmliM0owQ2drSmFXWWdLQ0J6TG1KbFptOXlaVk5sYm1RZ0ppWUtDUWtKS0NCekxtSmxabTl5WlZObGJtUXVZMkZzYkNnZ1kyRnNiR0poWTJ0RGIyNTBaWGgwTENCcWNWaElVaXdnY3lBcElEMDlQU0JtWVd4elpTQjhmQ0JqYjIxd2JHVjBaV1FnS1NBcElIc0tDZ2tKQ1M4dklFRmliM0owSUdsbUlHNXZkQ0JrYjI1bElHRnNjbVZoWkhrZ1lXNWtJSEpsZEhWeWJnb0pDUWx5WlhSMWNtNGdhbkZZU0ZJdVlXSnZjblFvS1RzS0NRbDlDZ29KQ1M4dklFRmliM0owYVc1bklHbHpJRzV2SUd4dmJtZGxjaUJoSUdOaGJtTmxiR3hoZEdsdmJnb0pDWE4wY2tGaWIzSjBJRDBnSW1GaWIzSjBJanNLQ2drSkx5OGdTVzV6ZEdGc2JDQmpZV3hzWW1GamEzTWdiMjRnWkdWbVpYSnlaV1J6Q2drSlkyOXRjR3hsZEdWRVpXWmxjbkpsWkM1aFpHUW9JSE11WTI5dGNHeGxkR1VnS1RzS0NRbHFjVmhJVWk1a2IyNWxLQ0J6TG5OMVkyTmxjM01nS1RzS0NRbHFjVmhJVWk1bVlXbHNLQ0J6TG1WeWNtOXlJQ2s3Q2dvSkNTOHZJRWRsZENCMGNtRnVjM0J2Y25RS0NRbDBjbUZ1YzNCdmNuUWdQU0JwYm5Od1pXTjBVSEpsWm1sc2RHVnljMDl5VkhKaGJuTndiM0owY3lnZ2RISmhibk53YjNKMGN5d2djeXdnYjNCMGFXOXVjeXdnYW5GWVNGSWdLVHNLQ2drSkx5OGdTV1lnYm04Z2RISmhibk53YjNKMExDQjNaU0JoZFhSdkxXRmliM0owQ2drSmFXWWdLQ0FoZEhKaGJuTndiM0owSUNrZ2V3b0pDUWxrYjI1bEtDQXRNU3dnSWs1dklGUnlZVzV6Y0c5eWRDSWdLVHNLQ1FsOUlHVnNjMlVnZXdvSkNRbHFjVmhJVWk1eVpXRmtlVk4wWVhSbElEMGdNVHNLQ2drSkNTOHZJRk5sYm1RZ1oyeHZZbUZzSUdWMlpXNTBDZ2tKQ1dsbUlDZ2dabWx5WlVkc2IySmhiSE1nS1NCN0Nna0pDUWxuYkc5aVlXeEZkbVZ1ZEVOdmJuUmxlSFF1ZEhKcFoyZGxjaWdnSW1GcVlYaFRaVzVrSWl3Z1d5QnFjVmhJVWl3Z2N5QmRJQ2s3Q2drSkNYMEtDZ2tKQ1M4dklFbG1JSEpsY1hWbGMzUWdkMkZ6SUdGaWIzSjBaV1FnYVc1emFXUmxJR0ZxWVhoVFpXNWtMQ0J6ZEc5d0lIUm9aWEpsQ2drSkNXbG1JQ2dnWTI5dGNHeGxkR1ZrSUNrZ2V3b0pDUWtKY21WMGRYSnVJR3B4V0VoU093b0pDUWw5Q2dvSkNRa3ZMeUJVYVcxbGIzVjBDZ2tKQ1dsbUlDZ2djeTVoYzNsdVl5QW1KaUJ6TG5ScGJXVnZkWFFnUGlBd0lDa2dld29KQ1FrSmRHbHRaVzkxZEZScGJXVnlJRDBnZDJsdVpHOTNMbk5sZEZScGJXVnZkWFFvSUdaMWJtTjBhVzl1S0NrZ2V3b0pDUWtKQ1dweFdFaFNMbUZpYjNKMEtDQWlkR2x0Wlc5MWRDSWdLVHNLQ1FrSkNYMHNJSE11ZEdsdFpXOTFkQ0FwT3dvSkNRbDlDZ29KQ1FsMGNua2dld29KQ1FrSlkyOXRjR3hsZEdWa0lEMGdabUZzYzJVN0Nna0pDUWwwY21GdWMzQnZjblF1YzJWdVpDZ2djbVZ4ZFdWemRFaGxZV1JsY25Nc0lHUnZibVVnS1RzS0NRa0pmU0JqWVhSamFDQW9JR1VnS1NCN0Nnb0pDUWtKTHk4Z1VtVjBhSEp2ZHlCd2IzTjBMV052YlhCc1pYUnBiMjRnWlhoalpYQjBhVzl1Y3dvSkNRa0phV1lnS0NCamIyMXdiR1YwWldRZ0tTQjdDZ2tKQ1FrSmRHaHliM2NnWlRzS0NRa0pDWDBLQ2drSkNRa3ZMeUJRY205d1lXZGhkR1VnYjNSb1pYSnpJR0Z6SUhKbGMzVnNkSE1LQ1FrSkNXUnZibVVvSUMweExDQmxJQ2s3Q2drSkNYMEtDUWw5Q2dvSkNTOHZJRU5oYkd4aVlXTnJJR1p2Y2lCM2FHVnVJR1YyWlhKNWRHaHBibWNnYVhNZ1pHOXVaUW9KQ1daMWJtTjBhVzl1SUdSdmJtVW9JSE4wWVhSMWN5d2dibUYwYVhabFUzUmhkSFZ6VkdWNGRDd2djbVZ6Y0c5dWMyVnpMQ0JvWldGa1pYSnpJQ2tnZXdvSkNRbDJZWElnYVhOVGRXTmpaWE56TENCemRXTmpaWE56TENCbGNuSnZjaXdnY21WemNHOXVjMlVzSUcxdlpHbG1hV1ZrTEFvSkNRa0pjM1JoZEhWelZHVjRkQ0E5SUc1aGRHbDJaVk4wWVhSMWMxUmxlSFE3Q2dvSkNRa3ZMeUJKWjI1dmNtVWdjbVZ3WldGMElHbHVkbTlqWVhScGIyNXpDZ2tKQ1dsbUlDZ2dZMjl0Y0d4bGRHVmtJQ2tnZXdvSkNRa0pjbVYwZFhKdU93b0pDUWw5Q2dvSkNRbGpiMjF3YkdWMFpXUWdQU0IwY25WbE93b0tDUWtKTHk4Z1EyeGxZWElnZEdsdFpXOTFkQ0JwWmlCcGRDQmxlR2x6ZEhNS0NRa0phV1lnS0NCMGFXMWxiM1YwVkdsdFpYSWdLU0I3Q2drSkNRbDNhVzVrYjNjdVkyeGxZWEpVYVcxbGIzVjBLQ0IwYVcxbGIzVjBWR2x0WlhJZ0tUc0tDUWtKZlFvS0NRa0pMeThnUkdWeVpXWmxjbVZ1WTJVZ2RISmhibk53YjNKMElHWnZjaUJsWVhKc2VTQm5ZWEppWVdkbElHTnZiR3hsWTNScGIyNEtDUWtKTHk4Z0tHNXZJRzFoZEhSbGNpQm9iM2NnYkc5dVp5QjBhR1VnYW5GWVNGSWdiMkpxWldOMElIZHBiR3dnWW1VZ2RYTmxaQ2tLQ1FrSmRISmhibk53YjNKMElEMGdkVzVrWldacGJtVmtPd29LQ1FrSkx5OGdRMkZqYUdVZ2NtVnpjRzl1YzJVZ2FHVmhaR1Z5Y3dvSkNRbHlaWE53YjI1elpVaGxZV1JsY25OVGRISnBibWNnUFNCb1pXRmtaWEp6SUh4OElDSWlPd29LQ1FrSkx5OGdVMlYwSUhKbFlXUjVVM1JoZEdVS0NRa0phbkZZU0ZJdWNtVmhaSGxUZEdGMFpTQTlJSE4wWVhSMWN5QStJREFnUHlBMElEb2dNRHNLQ2drSkNTOHZJRVJsZEdWeWJXbHVaU0JwWmlCemRXTmpaWE56Wm5Wc0Nna0pDV2x6VTNWalkyVnpjeUE5SUhOMFlYUjFjeUErUFNBeU1EQWdKaVlnYzNSaGRIVnpJRHdnTXpBd0lIeDhJSE4wWVhSMWN5QTlQVDBnTXpBME93b0tDUWtKTHk4Z1IyVjBJSEpsYzNCdmJuTmxJR1JoZEdFS0NRa0phV1lnS0NCeVpYTndiMjV6WlhNZ0tTQjdDZ2tKQ1FseVpYTndiMjV6WlNBOUlHRnFZWGhJWVc1a2JHVlNaWE53YjI1elpYTW9JSE1zSUdweFdFaFNMQ0J5WlhOd2IyNXpaWE1nS1RzS0NRa0pmUW9LQ1FrSkx5OGdRMjl1ZG1WeWRDQnVieUJ0WVhSMFpYSWdkMmhoZENBb2RHaGhkQ0IzWVhrZ2NtVnpjRzl1YzJWWVdGZ2dabWxsYkdSeklHRnlaU0JoYkhkaGVYTWdjMlYwS1FvSkNRbHlaWE53YjI1elpTQTlJR0ZxWVhoRGIyNTJaWEowS0NCekxDQnlaWE53YjI1elpTd2dhbkZZU0ZJc0lHbHpVM1ZqWTJWemN5QXBPd29LQ1FrSkx5OGdTV1lnYzNWalkyVnpjMloxYkN3Z2FHRnVaR3hsSUhSNWNHVWdZMmhoYVc1cGJtY0tDUWtKYVdZZ0tDQnBjMU4xWTJObGMzTWdLU0I3Q2dvSkNRa0pMeThnVTJWMElIUm9aU0JKWmkxTmIyUnBabWxsWkMxVGFXNWpaU0JoYm1RdmIzSWdTV1l0VG05dVpTMU5ZWFJqYUNCb1pXRmtaWElzSUdsbUlHbHVJR2xtVFc5a2FXWnBaV1FnYlc5a1pTNEtDUWtKQ1dsbUlDZ2djeTVwWmsxdlpHbG1hV1ZrSUNrZ2V3b0pDUWtKQ1cxdlpHbG1hV1ZrSUQwZ2FuRllTRkl1WjJWMFVtVnpjRzl1YzJWSVpXRmtaWElvSUNKTVlYTjBMVTF2WkdsbWFXVmtJaUFwT3dvSkNRa0pDV2xtSUNnZ2JXOWthV1pwWldRZ0tTQjdDZ2tKQ1FrSkNXcFJkV1Z5ZVM1c1lYTjBUVzlrYVdacFpXUmJJR05oWTJobFZWSk1JRjBnUFNCdGIyUnBabWxsWkRzS0NRa0pDUWw5Q2drSkNRa0piVzlrYVdacFpXUWdQU0JxY1ZoSVVpNW5aWFJTWlhOd2IyNXpaVWhsWVdSbGNpZ2dJbVYwWVdjaUlDazdDZ2tKQ1FrSmFXWWdLQ0J0YjJScFptbGxaQ0FwSUhzS0NRa0pDUWtKYWxGMVpYSjVMbVYwWVdkYklHTmhZMmhsVlZKTUlGMGdQU0J0YjJScFptbGxaRHNLQ1FrSkNRbDlDZ2tKQ1FsOUNnb0pDUWtKTHk4Z2FXWWdibThnWTI5dWRHVnVkQW9KQ1FrSmFXWWdLQ0J6ZEdGMGRYTWdQVDA5SURJd05DQjhmQ0J6TG5SNWNHVWdQVDA5SUNKSVJVRkVJaUFwSUhzS0NRa0pDUWx6ZEdGMGRYTlVaWGgwSUQwZ0ltNXZZMjl1ZEdWdWRDSTdDZ29KQ1FrSkx5OGdhV1lnYm05MElHMXZaR2xtYVdWa0Nna0pDUWw5SUdWc2MyVWdhV1lnS0NCemRHRjBkWE1nUFQwOUlETXdOQ0FwSUhzS0NRa0pDUWx6ZEdGMGRYTlVaWGgwSUQwZ0ltNXZkRzF2WkdsbWFXVmtJanNLQ2drSkNRa3ZMeUJKWmlCM1pTQm9ZWFpsSUdSaGRHRXNJR3hsZENkeklHTnZiblpsY25RZ2FYUUtDUWtKQ1gwZ1pXeHpaU0I3Q2drSkNRa0pjM1JoZEhWelZHVjRkQ0E5SUhKbGMzQnZibk5sTG5OMFlYUmxPd29KQ1FrSkNYTjFZMk5sYzNNZ1BTQnlaWE53YjI1elpTNWtZWFJoT3dvSkNRa0pDV1Z5Y205eUlEMGdjbVZ6Y0c5dWMyVXVaWEp5YjNJN0Nna0pDUWtKYVhOVGRXTmpaWE56SUQwZ0lXVnljbTl5T3dvSkNRa0pmUW9KQ1FsOUlHVnNjMlVnZXdvS0NRa0pDUzh2SUVWNGRISmhZM1FnWlhKeWIzSWdabkp2YlNCemRHRjBkWE5VWlhoMElHRnVaQ0J1YjNKdFlXeHBlbVVnWm05eUlHNXZiaTFoWW05eWRITUtDUWtKQ1dWeWNtOXlJRDBnYzNSaGRIVnpWR1Y0ZERzS0NRa0pDV2xtSUNnZ2MzUmhkSFZ6SUh4OElDRnpkR0YwZFhOVVpYaDBJQ2tnZXdvSkNRa0pDWE4wWVhSMWMxUmxlSFFnUFNBaVpYSnliM0lpT3dvSkNRa0pDV2xtSUNnZ2MzUmhkSFZ6SUR3Z01DQXBJSHNLQ1FrSkNRa0pjM1JoZEhWeklEMGdNRHNLQ1FrSkNRbDlDZ2tKQ1FsOUNna0pDWDBLQ2drSkNTOHZJRk5sZENCa1lYUmhJR1p2Y2lCMGFHVWdabUZyWlNCNGFISWdiMkpxWldOMENna0pDV3B4V0VoU0xuTjBZWFIxY3lBOUlITjBZWFIxY3pzS0NRa0phbkZZU0ZJdWMzUmhkSFZ6VkdWNGRDQTlJQ2dnYm1GMGFYWmxVM1JoZEhWelZHVjRkQ0I4ZkNCemRHRjBkWE5VWlhoMElDa2dLeUFpSWpzS0Nna0pDUzh2SUZOMVkyTmxjM012UlhKeWIzSUtDUWtKYVdZZ0tDQnBjMU4xWTJObGMzTWdLU0I3Q2drSkNRbGtaV1psY25KbFpDNXlaWE52YkhabFYybDBhQ2dnWTJGc2JHSmhZMnREYjI1MFpYaDBMQ0JiSUhOMVkyTmxjM01zSUhOMFlYUjFjMVJsZUhRc0lHcHhXRWhTSUYwZ0tUc0tDUWtKZlNCbGJITmxJSHNLQ1FrSkNXUmxabVZ5Y21Wa0xuSmxhbVZqZEZkcGRHZ29JR05oYkd4aVlXTnJRMjl1ZEdWNGRDd2dXeUJxY1ZoSVVpd2djM1JoZEhWelZHVjRkQ3dnWlhKeWIzSWdYU0FwT3dvSkNRbDlDZ29KQ1Frdkx5QlRkR0YwZFhNdFpHVndaVzVrWlc1MElHTmhiR3hpWVdOcmN3b0pDUWxxY1ZoSVVpNXpkR0YwZFhORGIyUmxLQ0J6ZEdGMGRYTkRiMlJsSUNrN0Nna0pDWE4wWVhSMWMwTnZaR1VnUFNCMWJtUmxabWx1WldRN0Nnb0pDUWxwWmlBb0lHWnBjbVZIYkc5aVlXeHpJQ2tnZXdvSkNRa0paMnh2WW1Gc1JYWmxiblJEYjI1MFpYaDBMblJ5YVdkblpYSW9JR2x6VTNWalkyVnpjeUEvSUNKaGFtRjRVM1ZqWTJWemN5SWdPaUFpWVdwaGVFVnljbTl5SWl3S0NRa0pDUWxiSUdweFdFaFNMQ0J6TENCcGMxTjFZMk5sYzNNZ1B5QnpkV05qWlhOeklEb2daWEp5YjNJZ1hTQXBPd29KQ1FsOUNnb0pDUWt2THlCRGIyMXdiR1YwWlFvSkNRbGpiMjF3YkdWMFpVUmxabVZ5Y21Wa0xtWnBjbVZYYVhSb0tDQmpZV3hzWW1GamEwTnZiblJsZUhRc0lGc2dhbkZZU0ZJc0lITjBZWFIxYzFSbGVIUWdYU0FwT3dvS0NRa0phV1lnS0NCbWFYSmxSMnh2WW1Gc2N5QXBJSHNLQ1FrSkNXZHNiMkpoYkVWMlpXNTBRMjl1ZEdWNGRDNTBjbWxuWjJWeUtDQWlZV3BoZUVOdmJYQnNaWFJsSWl3Z1d5QnFjVmhJVWl3Z2N5QmRJQ2s3Q2dvSkNRa0pMeThnU0dGdVpHeGxJSFJvWlNCbmJHOWlZV3dnUVVwQldDQmpiM1Z1ZEdWeUNna0pDUWxwWmlBb0lDRW9JQzB0YWxGMVpYSjVMbUZqZEdsMlpTQXBJQ2tnZXdvSkNRa0pDV3BSZFdWeWVTNWxkbVZ1ZEM1MGNtbG5aMlZ5S0NBaVlXcGhlRk4wYjNBaUlDazdDZ2tKQ1FsOUNna0pDWDBLQ1FsOUNnb0pDWEpsZEhWeWJpQnFjVmhJVWpzS0NYMHNDZ29KWjJWMFNsTlBUam9nWm5WdVkzUnBiMjRvSUhWeWJDd2daR0YwWVN3Z1kyRnNiR0poWTJzZ0tTQjdDZ2tKY21WMGRYSnVJR3BSZFdWeWVTNW5aWFFvSUhWeWJDd2daR0YwWVN3Z1kyRnNiR0poWTJzc0lDSnFjMjl1SWlBcE93b0pmU3dLQ2dsblpYUlRZM0pwY0hRNklHWjFibU4wYVc5dUtDQjFjbXdzSUdOaGJHeGlZV05ySUNrZ2V3b0pDWEpsZEhWeWJpQnFVWFZsY25rdVoyVjBLQ0IxY213c0lIVnVaR1ZtYVc1bFpDd2dZMkZzYkdKaFkyc3NJQ0p6WTNKcGNIUWlJQ2s3Q2dsOUNuMGdLVHNLQ21wUmRXVnllUzVsWVdOb0tDQmJJQ0puWlhRaUxDQWljRzl6ZENJZ1hTd2dablZ1WTNScGIyNG9JR2tzSUcxbGRHaHZaQ0FwSUhzS0NXcFJkV1Z5ZVZzZ2JXVjBhRzlrSUYwZ1BTQm1kVzVqZEdsdmJpZ2dkWEpzTENCa1lYUmhMQ0JqWVd4c1ltRmpheXdnZEhsd1pTQXBJSHNLQ2drSkx5OGdVMmhwWm5RZ1lYSm5kVzFsYm5SeklHbG1JR1JoZEdFZ1lYSm5kVzFsYm5RZ2QyRnpJRzl0YVhSMFpXUUtDUWxwWmlBb0lHbHpSblZ1WTNScGIyNG9JR1JoZEdFZ0tTQXBJSHNLQ1FrSmRIbHdaU0E5SUhSNWNHVWdmSHdnWTJGc2JHSmhZMnM3Q2drSkNXTmhiR3hpWVdOcklEMGdaR0YwWVRzS0NRa0paR0YwWVNBOUlIVnVaR1ZtYVc1bFpEc0tDUWw5Q2dvSkNTOHZJRlJvWlNCMWNtd2dZMkZ1SUdKbElHRnVJRzl3ZEdsdmJuTWdiMkpxWldOMElDaDNhR2xqYUNCMGFHVnVJRzExYzNRZ2FHRjJaU0F1ZFhKc0tRb0pDWEpsZEhWeWJpQnFVWFZsY25rdVlXcGhlQ2dnYWxGMVpYSjVMbVY0ZEdWdVpDZ2dld29KQ1FsMWNtdzZJSFZ5YkN3S0NRa0pkSGx3WlRvZ2JXVjBhRzlrTEFvSkNRbGtZWFJoVkhsd1pUb2dkSGx3WlN3S0NRa0paR0YwWVRvZ1pHRjBZU3dLQ1FrSmMzVmpZMlZ6Y3pvZ1kyRnNiR0poWTJzS0NRbDlMQ0JxVVhWbGNua3VhWE5RYkdGcGJrOWlhbVZqZENnZ2RYSnNJQ2tnSmlZZ2RYSnNJQ2tnS1RzS0NYMDdDbjBnS1RzS0NncHFVWFZsY25rdVgyVjJZV3hWY213Z1BTQm1kVzVqZEdsdmJpZ2dkWEpzSUNrZ2V3b0pjbVYwZFhKdUlHcFJkV1Z5ZVM1aGFtRjRLQ0I3Q2drSmRYSnNPaUIxY213c0Nnb0pDUzh2SUUxaGEyVWdkR2hwY3lCbGVIQnNhV05wZEN3Z2MybHVZMlVnZFhObGNpQmpZVzRnYjNabGNuSnBaR1VnZEdocGN5QjBhSEp2ZFdkb0lHRnFZWGhUWlhSMWNDQW9JekV4TWpZMEtRb0pDWFI1Y0dVNklDSkhSVlFpTEFvSkNXUmhkR0ZVZVhCbE9pQWljMk55YVhCMElpd0tDUWxqWVdOb1pUb2dkSEoxWlN3S0NRbGhjM2x1WXpvZ1ptRnNjMlVzQ2drSloyeHZZbUZzT2lCbVlXeHpaU3dLQ1FraWRHaHliM2R6SWpvZ2RISjFaUW9KZlNBcE93cDlPd29LQ21wUmRXVnllUzVtYmk1bGVIUmxibVFvSUhzS0NYZHlZWEJCYkd3NklHWjFibU4wYVc5dUtDQm9kRzFzSUNrZ2V3b0pDWFpoY2lCM2NtRndPd29LQ1FscFppQW9JSFJvYVhOYklEQWdYU0FwSUhzS0NRa0phV1lnS0NCcGMwWjFibU4wYVc5dUtDQm9kRzFzSUNrZ0tTQjdDZ2tKQ1Fsb2RHMXNJRDBnYUhSdGJDNWpZV3hzS0NCMGFHbHpXeUF3SUYwZ0tUc0tDUWtKZlFvS0NRa0pMeThnVkdobElHVnNaVzFsYm5SeklIUnZJSGR5WVhBZ2RHaGxJSFJoY21kbGRDQmhjbTkxYm1RS0NRa0pkM0poY0NBOUlHcFJkV1Z5ZVNnZ2FIUnRiQ3dnZEdocGMxc2dNQ0JkTG05M2JtVnlSRzlqZFcxbGJuUWdLUzVsY1NnZ01DQXBMbU5zYjI1bEtDQjBjblZsSUNrN0Nnb0pDUWxwWmlBb0lIUm9hWE5iSURBZ1hTNXdZWEpsYm5ST2IyUmxJQ2tnZXdvSkNRa0pkM0poY0M1cGJuTmxjblJDWldadmNtVW9JSFJvYVhOYklEQWdYU0FwT3dvSkNRbDlDZ29KQ1FsM2NtRndMbTFoY0NnZ1puVnVZM1JwYjI0b0tTQjdDZ2tKQ1FsMllYSWdaV3hsYlNBOUlIUm9hWE03Q2dvSkNRa0pkMmhwYkdVZ0tDQmxiR1Z0TG1acGNuTjBSV3hsYldWdWRFTm9hV3hrSUNrZ2V3b0pDUWtKQ1dWc1pXMGdQU0JsYkdWdExtWnBjbk4wUld4bGJXVnVkRU5vYVd4a093b0pDUWtKZlFvS0NRa0pDWEpsZEhWeWJpQmxiR1Z0T3dvSkNRbDlJQ2t1WVhCd1pXNWtLQ0IwYUdseklDazdDZ2tKZlFvS0NRbHlaWFIxY200Z2RHaHBjenNLQ1gwc0Nnb0pkM0poY0VsdWJtVnlPaUJtZFc1amRHbHZiaWdnYUhSdGJDQXBJSHNLQ1FscFppQW9JR2x6Um5WdVkzUnBiMjRvSUdoMGJXd2dLU0FwSUhzS0NRa0pjbVYwZFhKdUlIUm9hWE11WldGamFDZ2dablZ1WTNScGIyNG9JR2tnS1NCN0Nna0pDUWxxVVhWbGNua29JSFJvYVhNZ0tTNTNjbUZ3U1c1dVpYSW9JR2gwYld3dVkyRnNiQ2dnZEdocGN5d2dhU0FwSUNrN0Nna0pDWDBnS1RzS0NRbDlDZ29KQ1hKbGRIVnliaUIwYUdsekxtVmhZMmdvSUdaMWJtTjBhVzl1S0NrZ2V3b0pDUWwyWVhJZ2MyVnNaaUE5SUdwUmRXVnllU2dnZEdocGN5QXBMQW9KQ1FrSlkyOXVkR1Z1ZEhNZ1BTQnpaV3htTG1OdmJuUmxiblJ6S0NrN0Nnb0pDUWxwWmlBb0lHTnZiblJsYm5SekxteGxibWQwYUNBcElIc0tDUWtKQ1dOdmJuUmxiblJ6TG5keVlYQkJiR3dvSUdoMGJXd2dLVHNLQ2drSkNYMGdaV3h6WlNCN0Nna0pDUWx6Wld4bUxtRndjR1Z1WkNnZ2FIUnRiQ0FwT3dvSkNRbDlDZ2tKZlNBcE93b0pmU3dLQ2dsM2NtRndPaUJtZFc1amRHbHZiaWdnYUhSdGJDQXBJSHNLQ1FsMllYSWdhSFJ0YkVselJuVnVZM1JwYjI0Z1BTQnBjMFoxYm1OMGFXOXVLQ0JvZEcxc0lDazdDZ29KQ1hKbGRIVnliaUIwYUdsekxtVmhZMmdvSUdaMWJtTjBhVzl1S0NCcElDa2dld29KQ1FscVVYVmxjbmtvSUhSb2FYTWdLUzUzY21Gd1FXeHNLQ0JvZEcxc1NYTkdkVzVqZEdsdmJpQS9JR2gwYld3dVkyRnNiQ2dnZEdocGN5d2dhU0FwSURvZ2FIUnRiQ0FwT3dvSkNYMGdLVHNLQ1gwc0Nnb0pkVzUzY21Gd09pQm1kVzVqZEdsdmJpZ2djMlZzWldOMGIzSWdLU0I3Q2drSmRHaHBjeTV3WVhKbGJuUW9JSE5sYkdWamRHOXlJQ2t1Ym05MEtDQWlZbTlrZVNJZ0tTNWxZV05vS0NCbWRXNWpkR2x2YmlncElIc0tDUWtKYWxGMVpYSjVLQ0IwYUdseklDa3VjbVZ3YkdGalpWZHBkR2dvSUhSb2FYTXVZMmhwYkdST2IyUmxjeUFwT3dvSkNYMGdLVHNLQ1FseVpYUjFjbTRnZEdocGN6c0tDWDBLZlNBcE93b0tDbXBSZFdWeWVTNWxlSEJ5TG5CelpYVmtiM011YUdsa1pHVnVJRDBnWm5WdVkzUnBiMjRvSUdWc1pXMGdLU0I3Q2dseVpYUjFjbTRnSVdwUmRXVnllUzVsZUhCeUxuQnpaWFZrYjNNdWRtbHphV0pzWlNnZ1pXeGxiU0FwT3dwOU93cHFVWFZsY25rdVpYaHdjaTV3YzJWMVpHOXpMblpwYzJsaWJHVWdQU0JtZFc1amRHbHZiaWdnWld4bGJTQXBJSHNLQ1hKbGRIVnliaUFoSVNnZ1pXeGxiUzV2Wm1aelpYUlhhV1IwYUNCOGZDQmxiR1Z0TG05bVpuTmxkRWhsYVdkb2RDQjhmQ0JsYkdWdExtZGxkRU5zYVdWdWRGSmxZM1J6S0NrdWJHVnVaM1JvSUNrN0NuMDdDZ29LQ2dwcVVYVmxjbmt1WVdwaGVGTmxkSFJwYm1kekxuaG9jaUE5SUdaMWJtTjBhVzl1S0NrZ2V3b0pkSEo1SUhzS0NRbHlaWFIxY200Z2JtVjNJSGRwYm1SdmR5NVlUVXhJZEhSd1VtVnhkV1Z6ZENncE93b0pmU0JqWVhSamFDQW9JR1VnS1NCN2ZRcDlPd29LZG1GeUlIaG9jbE4xWTJObGMzTlRkR0YwZFhNZ1BTQjdDZ29KQ1M4dklFWnBiR1VnY0hKdmRHOWpiMndnWVd4M1lYbHpJSGxwWld4a2N5QnpkR0YwZFhNZ1kyOWtaU0F3TENCaGMzTjFiV1VnTWpBd0Nna0pNRG9nTWpBd0xBb0tDUWt2THlCVGRYQndiM0owT2lCSlJTQThQVGtnYjI1c2VRb0pDUzh2SUNNeE5EVXdPaUJ6YjIxbGRHbHRaWE1nU1VVZ2NtVjBkWEp1Y3lBeE1qSXpJSGRvWlc0Z2FYUWdjMmh2ZFd4a0lHSmxJREl3TkFvSkNURXlNak02SURJd05Bb0pmU3dLQ1hob2NsTjFjSEJ2Y25SbFpDQTlJR3BSZFdWeWVTNWhhbUY0VTJWMGRHbHVaM011ZUdoeUtDazdDZ3B6ZFhCd2IzSjBMbU52Y25NZ1BTQWhJWGhvY2xOMWNIQnZjblJsWkNBbUppQW9JQ0ozYVhSb1EzSmxaR1Z1ZEdsaGJITWlJR2x1SUhob2NsTjFjSEJ2Y25SbFpDQXBPd3B6ZFhCd2IzSjBMbUZxWVhnZ1BTQjRhSEpUZFhCd2IzSjBaV1FnUFNBaElYaG9jbE4xY0hCdmNuUmxaRHNLQ21wUmRXVnllUzVoYW1GNFZISmhibk53YjNKMEtDQm1kVzVqZEdsdmJpZ2diM0IwYVc5dWN5QXBJSHNLQ1haaGNpQmpZV3hzWW1GamF5d2daWEp5YjNKRFlXeHNZbUZqYXpzS0Nna3ZMeUJEY205emN5QmtiMjFoYVc0Z2IyNXNlU0JoYkd4dmQyVmtJR2xtSUhOMWNIQnZjblJsWkNCMGFISnZkV2RvSUZoTlRFaDBkSEJTWlhGMVpYTjBDZ2xwWmlBb0lITjFjSEJ2Y25RdVkyOXljeUI4ZkNCNGFISlRkWEJ3YjNKMFpXUWdKaVlnSVc5d2RHbHZibk11WTNKdmMzTkViMjFoYVc0Z0tTQjdDZ2tKY21WMGRYSnVJSHNLQ1FrSmMyVnVaRG9nWm5WdVkzUnBiMjRvSUdobFlXUmxjbk1zSUdOdmJYQnNaWFJsSUNrZ2V3b0pDUWtKZG1GeUlHa3NDZ2tKQ1FrSmVHaHlJRDBnYjNCMGFXOXVjeTU0YUhJb0tUc0tDZ2tKQ1FsNGFISXViM0JsYmlnS0NRa0pDUWx2Y0hScGIyNXpMblI1Y0dVc0Nna0pDUWtKYjNCMGFXOXVjeTUxY213c0Nna0pDUWtKYjNCMGFXOXVjeTVoYzNsdVl5d0tDUWtKQ1FsdmNIUnBiMjV6TG5WelpYSnVZVzFsTEFvSkNRa0pDVzl3ZEdsdmJuTXVjR0Z6YzNkdmNtUUtDUWtKQ1NrN0Nnb0pDUWtKTHk4Z1FYQndiSGtnWTNWemRHOXRJR1pwWld4a2N5QnBaaUJ3Y205MmFXUmxaQW9KQ1FrSmFXWWdLQ0J2Y0hScGIyNXpMbmhvY2tacFpXeGtjeUFwSUhzS0NRa0pDUWxtYjNJZ0tDQnBJR2x1SUc5d2RHbHZibk11ZUdoeVJtbGxiR1J6SUNrZ2V3b0pDUWtKQ1FsNGFISmJJR2tnWFNBOUlHOXdkR2x2Ym5NdWVHaHlSbWxsYkdSeld5QnBJRjA3Q2drSkNRa0pmUW9KQ1FrSmZRb0tDUWtKQ1M4dklFOTJaWEp5YVdSbElHMXBiV1VnZEhsd1pTQnBaaUJ1WldWa1pXUUtDUWtKQ1dsbUlDZ2diM0IwYVc5dWN5NXRhVzFsVkhsd1pTQW1KaUI0YUhJdWIzWmxjbkpwWkdWTmFXMWxWSGx3WlNBcElIc0tDUWtKQ1FsNGFISXViM1psY25KcFpHVk5hVzFsVkhsd1pTZ2diM0IwYVc5dWN5NXRhVzFsVkhsd1pTQXBPd29KQ1FrSmZRb0tDUWtKQ1M4dklGZ3RVbVZ4ZFdWemRHVmtMVmRwZEdnZ2FHVmhaR1Z5Q2drSkNRa3ZMeUJHYjNJZ1kzSnZjM010Wkc5dFlXbHVJSEpsY1hWbGMzUnpMQ0J6WldWcGJtY2dZWE1nWTI5dVpHbDBhVzl1Y3lCbWIzSWdZU0J3Y21WbWJHbG5hSFFnWVhKbENna0pDUWt2THlCaGEybHVJSFJ2SUdFZ2FtbG5jMkYzSUhCMWVucHNaU3dnZDJVZ2MybHRjR3g1SUc1bGRtVnlJSE5sZENCcGRDQjBieUJpWlNCemRYSmxMZ29KQ1FrSkx5OGdLR2wwSUdOaGJpQmhiSGRoZVhNZ1ltVWdjMlYwSUc5dUlHRWdjR1Z5TFhKbGNYVmxjM1FnWW1GemFYTWdiM0lnWlhabGJpQjFjMmx1WnlCaGFtRjRVMlYwZFhBcENna0pDUWt2THlCR2IzSWdjMkZ0WlMxa2IyMWhhVzRnY21WeGRXVnpkSE1zSUhkdmJpZDBJR05vWVc1blpTQm9aV0ZrWlhJZ2FXWWdZV3h5WldGa2VTQndjbTkyYVdSbFpDNEtDUWtKQ1dsbUlDZ2dJVzl3ZEdsdmJuTXVZM0p2YzNORWIyMWhhVzRnSmlZZ0lXaGxZV1JsY25OYklDSllMVkpsY1hWbGMzUmxaQzFYYVhSb0lpQmRJQ2tnZXdvSkNRa0pDV2hsWVdSbGNuTmJJQ0pZTFZKbGNYVmxjM1JsWkMxWGFYUm9JaUJkSUQwZ0lsaE5URWgwZEhCU1pYRjFaWE4wSWpzS0NRa0pDWDBLQ2drSkNRa3ZMeUJUWlhRZ2FHVmhaR1Z5Y3dvSkNRa0pabTl5SUNnZ2FTQnBiaUJvWldGa1pYSnpJQ2tnZXdvSkNRa0pDWGhvY2k1elpYUlNaWEYxWlhOMFNHVmhaR1Z5S0NCcExDQm9aV0ZrWlhKeld5QnBJRjBnS1RzS0NRa0pDWDBLQ2drSkNRa3ZMeUJEWVd4c1ltRmphd29KQ1FrSlkyRnNiR0poWTJzZ1BTQm1kVzVqZEdsdmJpZ2dkSGx3WlNBcElIc0tDUWtKQ1FseVpYUjFjbTRnWm5WdVkzUnBiMjRvS1NCN0Nna0pDUWtKQ1dsbUlDZ2dZMkZzYkdKaFkyc2dLU0I3Q2drSkNRa0pDUWxqWVd4c1ltRmpheUE5SUdWeWNtOXlRMkZzYkdKaFkyc2dQU0I0YUhJdWIyNXNiMkZrSUQwS0NRa0pDUWtKQ1FsNGFISXViMjVsY25KdmNpQTlJSGhvY2k1dmJtRmliM0owSUQwZ2VHaHlMbTl1ZEdsdFpXOTFkQ0E5Q2drSkNRa0pDUWtKQ1hob2NpNXZibkpsWVdSNWMzUmhkR1ZqYUdGdVoyVWdQU0J1ZFd4c093b0tDUWtKQ1FrSkNXbG1JQ2dnZEhsd1pTQTlQVDBnSW1GaWIzSjBJaUFwSUhzS0NRa0pDUWtKQ1FsNGFISXVZV0p2Y25Rb0tUc0tDUWtKQ1FrSkNYMGdaV3h6WlNCcFppQW9JSFI1Y0dVZ1BUMDlJQ0psY25KdmNpSWdLU0I3Q2dvSkNRa0pDUWtKQ1M4dklGTjFjSEJ2Y25RNklFbEZJRHc5T1NCdmJteDVDZ2tKQ1FrSkNRa0pMeThnVDI0Z1lTQnRZVzUxWVd3Z2JtRjBhWFpsSUdGaWIzSjBMQ0JKUlRrZ2RHaHliM2R6Q2drSkNRa0pDUWtKTHk4Z1pYSnliM0p6SUc5dUlHRnVlU0J3Y205d1pYSjBlU0JoWTJObGMzTWdkR2hoZENCcGN5QnViM1FnY21WaFpIbFRkR0YwWlFvSkNRa0pDUWtKQ1dsbUlDZ2dkSGx3Wlc5bUlIaG9jaTV6ZEdGMGRYTWdJVDA5SUNKdWRXMWlaWElpSUNrZ2V3b0pDUWtKQ1FrSkNRbGpiMjF3YkdWMFpTZ2dNQ3dnSW1WeWNtOXlJaUFwT3dvSkNRa0pDUWtKQ1gwZ1pXeHpaU0I3Q2drSkNRa0pDUWtKQ1dOdmJYQnNaWFJsS0FvS0NRa0pDUWtKQ1FrSkNTOHZJRVpwYkdVNklIQnliM1J2WTI5c0lHRnNkMkY1Y3lCNWFXVnNaSE1nYzNSaGRIVnpJREE3SUhObFpTQWpPRFl3TlN3Z0l6RTBNakEzQ2drSkNRa0pDUWtKQ1FsNGFISXVjM1JoZEhWekxBb0pDUWtKQ1FrSkNRa0plR2h5TG5OMFlYUjFjMVJsZUhRS0NRa0pDUWtKQ1FrSktUc0tDUWtKQ1FrSkNRbDlDZ2tKQ1FrSkNRbDlJR1ZzYzJVZ2V3b0pDUWtKQ1FrSkNXTnZiWEJzWlhSbEtBb0pDUWtKQ1FrSkNRbDRhSEpUZFdOalpYTnpVM1JoZEhWeld5QjRhSEl1YzNSaGRIVnpJRjBnZkh3Z2VHaHlMbk4wWVhSMWN5d0tDUWtKQ1FrSkNRa0plR2h5TG5OMFlYUjFjMVJsZUhRc0Nnb0pDUWtKQ1FrSkNRa3ZMeUJUZFhCd2IzSjBPaUJKUlNBOFBUa2diMjVzZVFvSkNRa0pDUWtKQ1Frdkx5QkpSVGtnYUdGeklHNXZJRmhJVWpJZ1luVjBJSFJvY205M2N5QnZiaUJpYVc1aGNua2dLSFJ5WVdNdE1URTBNallwQ2drSkNRa0pDUWtKQ1M4dklFWnZjaUJZU0ZJeUlHNXZiaTEwWlhoMExDQnNaWFFnZEdobElHTmhiR3hsY2lCb1lXNWtiR1VnYVhRZ0tHZG9MVEkwT1RncENna0pDUWtKQ1FrSkNTZ2dlR2h5TG5KbGMzQnZibk5sVkhsd1pTQjhmQ0FpZEdWNGRDSWdLU0FoUFQwZ0luUmxlSFFpSUNCOGZBb0pDUWtKQ1FrSkNRbDBlWEJsYjJZZ2VHaHlMbkpsYzNCdmJuTmxWR1Y0ZENBaFBUMGdJbk4wY21sdVp5SWdQd29KQ1FrSkNRa0pDUWtKZXlCaWFXNWhjbms2SUhob2NpNXlaWE53YjI1elpTQjlJRG9LQ1FrSkNRa0pDUWtKQ1hzZ2RHVjRkRG9nZUdoeUxuSmxjM0J2Ym5ObFZHVjRkQ0I5TEFvSkNRa0pDUWtKQ1FsNGFISXVaMlYwUVd4c1VtVnpjRzl1YzJWSVpXRmtaWEp6S0NrS0NRa0pDUWtKQ1FrcE93b0pDUWtKQ1FrSmZRb0pDUWtKQ1FsOUNna0pDUWtKZlRzS0NRa0pDWDA3Q2dvSkNRa0pMeThnVEdsemRHVnVJSFJ2SUdWMlpXNTBjd29KQ1FrSmVHaHlMbTl1Ykc5aFpDQTlJR05oYkd4aVlXTnJLQ2s3Q2drSkNRbGxjbkp2Y2tOaGJHeGlZV05ySUQwZ2VHaHlMbTl1WlhKeWIzSWdQU0I0YUhJdWIyNTBhVzFsYjNWMElEMGdZMkZzYkdKaFkyc29JQ0psY25KdmNpSWdLVHNLQ2drSkNRa3ZMeUJUZFhCd2IzSjBPaUJKUlNBNUlHOXViSGtLQ1FrSkNTOHZJRlZ6WlNCdmJuSmxZV1I1YzNSaGRHVmphR0Z1WjJVZ2RHOGdjbVZ3YkdGalpTQnZibUZpYjNKMENna0pDUWt2THlCMGJ5Qm9ZVzVrYkdVZ2RXNWpZWFZuYUhRZ1lXSnZjblJ6Q2drSkNRbHBaaUFvSUhob2NpNXZibUZpYjNKMElDRTlQU0IxYm1SbFptbHVaV1FnS1NCN0Nna0pDUWtKZUdoeUxtOXVZV0p2Y25RZ1BTQmxjbkp2Y2tOaGJHeGlZV05yT3dvSkNRa0pmU0JsYkhObElIc0tDUWtKQ1FsNGFISXViMjV5WldGa2VYTjBZWFJsWTJoaGJtZGxJRDBnWm5WdVkzUnBiMjRvS1NCN0Nnb0pDUWtKQ1Frdkx5QkRhR1ZqYXlCeVpXRmtlVk4wWVhSbElHSmxabTl5WlNCMGFXMWxiM1YwSUdGeklHbDBJR05vWVc1blpYTUtDUWtKQ1FrSmFXWWdLQ0I0YUhJdWNtVmhaSGxUZEdGMFpTQTlQVDBnTkNBcElIc0tDZ2tKQ1FrSkNRa3ZMeUJCYkd4dmR5QnZibVZ5Y205eUlIUnZJR0psSUdOaGJHeGxaQ0JtYVhKemRDd0tDUWtKQ1FrSkNTOHZJR0oxZENCMGFHRjBJSGRwYkd3Z2JtOTBJR2hoYm1Sc1pTQmhJRzVoZEdsMlpTQmhZbTl5ZEFvSkNRa0pDUWtKTHk4Z1FXeHpieXdnYzJGMlpTQmxjbkp2Y2tOaGJHeGlZV05ySUhSdklHRWdkbUZ5YVdGaWJHVUtDUWtKQ1FrSkNTOHZJR0Z6SUhob2NpNXZibVZ5Y205eUlHTmhibTV2ZENCaVpTQmhZMk5sYzNObFpBb0pDUWtKQ1FrSmQybHVaRzkzTG5ObGRGUnBiV1Z2ZFhRb0lHWjFibU4wYVc5dUtDa2dld29KQ1FrSkNRa0pDV2xtSUNnZ1kyRnNiR0poWTJzZ0tTQjdDZ2tKQ1FrSkNRa0pDV1Z5Y205eVEyRnNiR0poWTJzb0tUc0tDUWtKQ1FrSkNRbDlDZ2tKQ1FrSkNRbDlJQ2s3Q2drSkNRa0pDWDBLQ1FrSkNRbDlPd29KQ1FrSmZRb0tDUWtKQ1M4dklFTnlaV0YwWlNCMGFHVWdZV0p2Y25RZ1kyRnNiR0poWTJzS0NRa0pDV05oYkd4aVlXTnJJRDBnWTJGc2JHSmhZMnNvSUNKaFltOXlkQ0lnS1RzS0Nna0pDUWwwY25rZ2V3b0tDUWtKQ1Frdkx5QkVieUJ6Wlc1a0lIUm9aU0J5WlhGMVpYTjBJQ2gwYUdseklHMWhlU0J5WVdselpTQmhiaUJsZUdObGNIUnBiMjRwQ2drSkNRa0plR2h5TG5ObGJtUW9JRzl3ZEdsdmJuTXVhR0Z6UTI5dWRHVnVkQ0FtSmlCdmNIUnBiMjV6TG1SaGRHRWdmSHdnYm5Wc2JDQXBPd29KQ1FrSmZTQmpZWFJqYUNBb0lHVWdLU0I3Q2dvSkNRa0pDUzh2SUNNeE5EWTRNem9nVDI1c2VTQnlaWFJvY205M0lHbG1JSFJvYVhNZ2FHRnpiaWQwSUdKbFpXNGdibTkwYVdacFpXUWdZWE1nWVc0Z1pYSnliM0lnZVdWMENna0pDUWtKYVdZZ0tDQmpZV3hzWW1GamF5QXBJSHNLQ1FrSkNRa0pkR2h5YjNjZ1pUc0tDUWtKQ1FsOUNna0pDUWw5Q2drSkNYMHNDZ29KQ1FsaFltOXlkRG9nWm5WdVkzUnBiMjRvS1NCN0Nna0pDUWxwWmlBb0lHTmhiR3hpWVdOcklDa2dld29KQ1FrSkNXTmhiR3hpWVdOcktDazdDZ2tKQ1FsOUNna0pDWDBLQ1FsOU93b0pmUXA5SUNrN0Nnb0tDZ292THlCUWNtVjJaVzUwSUdGMWRHOHRaWGhsWTNWMGFXOXVJRzltSUhOamNtbHdkSE1nZDJobGJpQnVieUJsZUhCc2FXTnBkQ0JrWVhSaFZIbHdaU0IzWVhNZ2NISnZkbWxrWldRZ0tGTmxaU0JuYUMweU5ETXlLUXBxVVhWbGNua3VZV3BoZUZCeVpXWnBiSFJsY2lnZ1puVnVZM1JwYjI0b0lITWdLU0I3Q2dscFppQW9JSE11WTNKdmMzTkViMjFoYVc0Z0tTQjdDZ2tKY3k1amIyNTBaVzUwY3k1elkzSnBjSFFnUFNCbVlXeHpaVHNLQ1gwS2ZTQXBPd29LTHk4Z1NXNXpkR0ZzYkNCelkzSnBjSFFnWkdGMFlWUjVjR1VLYWxGMVpYSjVMbUZxWVhoVFpYUjFjQ2dnZXdvSllXTmpaWEIwY3pvZ2V3b0pDWE5qY21sd2REb2dJblJsZUhRdmFtRjJZWE5qY21sd2RDd2dZWEJ3YkdsallYUnBiMjR2YW1GMllYTmpjbWx3ZEN3Z0lpQXJDZ2tKQ1NKaGNIQnNhV05oZEdsdmJpOWxZMjFoYzJOeWFYQjBMQ0JoY0hCc2FXTmhkR2x2Ymk5NExXVmpiV0Z6WTNKcGNIUWlDZ2w5TEFvSlkyOXVkR1Z1ZEhNNklIc0tDUWx6WTNKcGNIUTZJQzljWWlnL09tcGhkbUY4WldOdFlTbHpZM0pwY0hSY1lpOEtDWDBzQ2dsamIyNTJaWEowWlhKek9pQjdDZ2tKSW5SbGVIUWdjMk55YVhCMElqb2dablZ1WTNScGIyNG9JSFJsZUhRZ0tTQjdDZ2tKQ1dwUmRXVnllUzVuYkc5aVlXeEZkbUZzS0NCMFpYaDBJQ2s3Q2drSkNYSmxkSFZ5YmlCMFpYaDBPd29KQ1gwS0NYMEtmU0FwT3dvS0x5OGdTR0Z1Wkd4bElHTmhZMmhsSjNNZ2MzQmxZMmxoYkNCallYTmxJR0Z1WkNCamNtOXpjMFJ2YldGcGJncHFVWFZsY25rdVlXcGhlRkJ5WldacGJIUmxjaWdnSW5OamNtbHdkQ0lzSUdaMWJtTjBhVzl1S0NCeklDa2dld29KYVdZZ0tDQnpMbU5oWTJobElEMDlQU0IxYm1SbFptbHVaV1FnS1NCN0Nna0pjeTVqWVdOb1pTQTlJR1poYkhObE93b0pmUW9KYVdZZ0tDQnpMbU55YjNOelJHOXRZV2x1SUNrZ2V3b0pDWE11ZEhsd1pTQTlJQ0pIUlZRaU93b0pmUXA5SUNrN0Nnb3ZMeUJDYVc1a0lITmpjbWx3ZENCMFlXY2dhR0ZqYXlCMGNtRnVjM0J2Y25RS2FsRjFaWEo1TG1GcVlYaFVjbUZ1YzNCdmNuUW9JQ0p6WTNKcGNIUWlMQ0JtZFc1amRHbHZiaWdnY3lBcElIc0tDZ2t2THlCVWFHbHpJSFJ5WVc1emNHOXlkQ0J2Ym14NUlHUmxZV3h6SUhkcGRHZ2dZM0p2YzNNZ1pHOXRZV2x1SUhKbGNYVmxjM1J6Q2dscFppQW9JSE11WTNKdmMzTkViMjFoYVc0Z0tTQjdDZ2tKZG1GeUlITmpjbWx3ZEN3Z1kyRnNiR0poWTJzN0Nna0pjbVYwZFhKdUlIc0tDUWtKYzJWdVpEb2dablZ1WTNScGIyNG9JRjhzSUdOdmJYQnNaWFJsSUNrZ2V3b0pDUWtKYzJOeWFYQjBJRDBnYWxGMVpYSjVLQ0FpUEhOamNtbHdkRDRpSUNrdWNISnZjQ2dnZXdvSkNRa0pDV05vWVhKelpYUTZJSE11YzJOeWFYQjBRMmhoY25ObGRDd0tDUWtKQ1FsemNtTTZJSE11ZFhKc0Nna0pDUWw5SUNrdWIyNG9DZ2tKQ1FrSklteHZZV1FnWlhKeWIzSWlMQW9KQ1FrSkNXTmhiR3hpWVdOcklEMGdablZ1WTNScGIyNG9JR1YyZENBcElIc0tDUWtKQ1FrSmMyTnlhWEIwTG5KbGJXOTJaU2dwT3dvSkNRa0pDUWxqWVd4c1ltRmpheUE5SUc1MWJHdzdDZ2tKQ1FrSkNXbG1JQ2dnWlhaMElDa2dld29KQ1FrSkNRa0pZMjl0Y0d4bGRHVW9JR1YyZEM1MGVYQmxJRDA5UFNBaVpYSnliM0lpSUQ4Z05EQTBJRG9nTWpBd0xDQmxkblF1ZEhsd1pTQXBPd29KQ1FrSkNRbDlDZ2tKQ1FrSmZRb0pDUWtKS1RzS0Nna0pDUWt2THlCVmMyVWdibUYwYVhabElFUlBUU0J0WVc1cGNIVnNZWFJwYjI0Z2RHOGdZWFp2YVdRZ2IzVnlJR1J2YlUxaGJtbHdJRUZLUVZnZ2RISnBZMnRsY25rS0NRa0pDV1J2WTNWdFpXNTBMbWhsWVdRdVlYQndaVzVrUTJocGJHUW9JSE5qY21sd2RGc2dNQ0JkSUNrN0Nna0pDWDBzQ2drSkNXRmliM0owT2lCbWRXNWpkR2x2YmlncElIc0tDUWtKQ1dsbUlDZ2dZMkZzYkdKaFkyc2dLU0I3Q2drSkNRa0pZMkZzYkdKaFkyc29LVHNLQ1FrSkNYMEtDUWtKZlFvSkNYMDdDZ2w5Q24wZ0tUc0tDZ29LQ25aaGNpQnZiR1JEWVd4c1ltRmphM01nUFNCYlhTd0tDWEpxYzI5dWNDQTlJQzhvUFNsY1B5Zy9QU1o4SkNsOFhEOWNQeTg3Q2dvdkx5QkVaV1poZFd4MElHcHpiMjV3SUhObGRIUnBibWR6Q21wUmRXVnllUzVoYW1GNFUyVjBkWEFvSUhzS0NXcHpiMjV3T2lBaVkyRnNiR0poWTJzaUxBb0phbk52Ym5CRFlXeHNZbUZqYXpvZ1puVnVZM1JwYjI0b0tTQjdDZ2tKZG1GeUlHTmhiR3hpWVdOcklEMGdiMnhrUTJGc2JHSmhZMnR6TG5CdmNDZ3BJSHg4SUNnZ2FsRjFaWEo1TG1WNGNHRnVaRzhnS3lBaVh5SWdLeUFvSUc1dmJtTmxLeXNnS1NBcE93b0pDWFJvYVhOYklHTmhiR3hpWVdOcklGMGdQU0IwY25WbE93b0pDWEpsZEhWeWJpQmpZV3hzWW1GamF6c0tDWDBLZlNBcE93b0tMeThnUkdWMFpXTjBMQ0J1YjNKdFlXeHBlbVVnYjNCMGFXOXVjeUJoYm1RZ2FXNXpkR0ZzYkNCallXeHNZbUZqYTNNZ1ptOXlJR3B6YjI1d0lISmxjWFZsYzNSekNtcFJkV1Z5ZVM1aGFtRjRVSEpsWm1sc2RHVnlLQ0FpYW5OdmJpQnFjMjl1Y0NJc0lHWjFibU4wYVc5dUtDQnpMQ0J2Y21sbmFXNWhiRk5sZEhScGJtZHpMQ0JxY1ZoSVVpQXBJSHNLQ2dsMllYSWdZMkZzYkdKaFkydE9ZVzFsTENCdmRtVnlkM0pwZEhSbGJpd2djbVZ6Y0c5dWMyVkRiMjUwWVdsdVpYSXNDZ2tKYW5OdmJsQnliM0FnUFNCekxtcHpiMjV3SUNFOVBTQm1ZV3h6WlNBbUppQW9JSEpxYzI5dWNDNTBaWE4wS0NCekxuVnliQ0FwSUQ4S0NRa0pJblZ5YkNJZ09nb0pDUWwwZVhCbGIyWWdjeTVrWVhSaElEMDlQU0FpYzNSeWFXNW5JaUFtSmdvSkNRa0pLQ0J6TG1OdmJuUmxiblJVZVhCbElIeDhJQ0lpSUNrS0NRa0pDUWt1YVc1a1pYaFBaaWdnSW1Gd2NHeHBZMkYwYVc5dUwzZ3RkM2QzTFdadmNtMHRkWEpzWlc1amIyUmxaQ0lnS1NBOVBUMGdNQ0FtSmdvSkNRa0pjbXB6YjI1d0xuUmxjM1FvSUhNdVpHRjBZU0FwSUNZbUlDSmtZWFJoSWdvSkNTazdDZ29KTHk4Z1NHRnVaR3hsSUdsbVppQjBhR1VnWlhod1pXTjBaV1FnWkdGMFlTQjBlWEJsSUdseklDSnFjMjl1Y0NJZ2IzSWdkMlVnYUdGMlpTQmhJSEJoY21GdFpYUmxjaUIwYnlCelpYUUtDV2xtSUNnZ2FuTnZibEJ5YjNBZ2ZId2djeTVrWVhSaFZIbHdaWE5iSURBZ1hTQTlQVDBnSW1wemIyNXdJaUFwSUhzS0Nna0pMeThnUjJWMElHTmhiR3hpWVdOcklHNWhiV1VzSUhKbGJXVnRZbVZ5YVc1bklIQnlaV1Y0YVhOMGFXNW5JSFpoYkhWbElHRnpjMjlqYVdGMFpXUWdkMmwwYUNCcGRBb0pDV05oYkd4aVlXTnJUbUZ0WlNBOUlITXVhbk52Ym5CRFlXeHNZbUZqYXlBOUlHbHpSblZ1WTNScGIyNG9JSE11YW5OdmJuQkRZV3hzWW1GamF5QXBJRDhLQ1FrSmN5NXFjMjl1Y0VOaGJHeGlZV05yS0NrZ09nb0pDUWx6TG1wemIyNXdRMkZzYkdKaFkyczdDZ29KQ1M4dklFbHVjMlZ5ZENCallXeHNZbUZqYXlCcGJuUnZJSFZ5YkNCdmNpQm1iM0p0SUdSaGRHRUtDUWxwWmlBb0lHcHpiMjVRY205d0lDa2dld29KQ1Fseld5QnFjMjl1VUhKdmNDQmRJRDBnYzFzZ2FuTnZibEJ5YjNBZ1hTNXlaWEJzWVdObEtDQnlhbk52Ym5Bc0lDSWtNU0lnS3lCallXeHNZbUZqYTA1aGJXVWdLVHNLQ1FsOUlHVnNjMlVnYVdZZ0tDQnpMbXB6YjI1d0lDRTlQU0JtWVd4elpTQXBJSHNLQ1FrSmN5NTFjbXdnS3owZ0tDQnljWFZsY25rdWRHVnpkQ2dnY3k1MWNtd2dLU0EvSUNJbUlpQTZJQ0kvSWlBcElDc2djeTVxYzI5dWNDQXJJQ0k5SWlBcklHTmhiR3hpWVdOclRtRnRaVHNLQ1FsOUNnb0pDUzh2SUZWelpTQmtZWFJoSUdOdmJuWmxjblJsY2lCMGJ5QnlaWFJ5YVdWMlpTQnFjMjl1SUdGbWRHVnlJSE5qY21sd2RDQmxlR1ZqZFhScGIyNEtDUWx6TG1OdmJuWmxjblJsY25OYklDSnpZM0pwY0hRZ2FuTnZiaUlnWFNBOUlHWjFibU4wYVc5dUtDa2dld29KQ1FscFppQW9JQ0Z5WlhOd2IyNXpaVU52Ym5SaGFXNWxjaUFwSUhzS0NRa0pDV3BSZFdWeWVTNWxjbkp2Y2lnZ1kyRnNiR0poWTJ0T1lXMWxJQ3NnSWlCM1lYTWdibTkwSUdOaGJHeGxaQ0lnS1RzS0NRa0pmUW9KQ1FseVpYUjFjbTRnY21WemNHOXVjMlZEYjI1MFlXbHVaWEpiSURBZ1hUc0tDUWw5T3dvS0NRa3ZMeUJHYjNKalpTQnFjMjl1SUdSaGRHRlVlWEJsQ2drSmN5NWtZWFJoVkhsd1pYTmJJREFnWFNBOUlDSnFjMjl1SWpzS0Nna0pMeThnU1c1emRHRnNiQ0JqWVd4c1ltRmphd29KQ1c5MlpYSjNjbWwwZEdWdUlEMGdkMmx1Wkc5M1d5QmpZV3hzWW1GamEwNWhiV1VnWFRzS0NRbDNhVzVrYjNkYklHTmhiR3hpWVdOclRtRnRaU0JkSUQwZ1puVnVZM1JwYjI0b0tTQjdDZ2tKQ1hKbGMzQnZibk5sUTI5dWRHRnBibVZ5SUQwZ1lYSm5kVzFsYm5Sek93b0pDWDA3Q2dvSkNTOHZJRU5zWldGdUxYVndJR1oxYm1OMGFXOXVJQ2htYVhKbGN5QmhablJsY2lCamIyNTJaWEowWlhKektRb0pDV3B4V0VoU0xtRnNkMkY1Y3lnZ1puVnVZM1JwYjI0b0tTQjdDZ29KQ1Frdkx5QkpaaUJ3Y21WMmFXOTFjeUIyWVd4MVpTQmthV1J1SjNRZ1pYaHBjM1FnTFNCeVpXMXZkbVVnYVhRS0NRa0phV1lnS0NCdmRtVnlkM0pwZEhSbGJpQTlQVDBnZFc1a1pXWnBibVZrSUNrZ2V3b0pDUWtKYWxGMVpYSjVLQ0IzYVc1a2IzY2dLUzV5WlcxdmRtVlFjbTl3S0NCallXeHNZbUZqYTA1aGJXVWdLVHNLQ2drSkNTOHZJRTkwYUdWeWQybHpaU0J5WlhOMGIzSmxJSEJ5WldWNGFYTjBhVzVuSUhaaGJIVmxDZ2tKQ1gwZ1pXeHpaU0I3Q2drSkNRbDNhVzVrYjNkYklHTmhiR3hpWVdOclRtRnRaU0JkSUQwZ2IzWmxjbmR5YVhSMFpXNDdDZ2tKQ1gwS0Nna0pDUzh2SUZOaGRtVWdZbUZqYXlCaGN5Qm1jbVZsQ2drSkNXbG1JQ2dnYzFzZ1kyRnNiR0poWTJ0T1lXMWxJRjBnS1NCN0Nnb0pDUWtKTHk4Z1RXRnJaU0J6ZFhKbElIUm9ZWFFnY21VdGRYTnBibWNnZEdobElHOXdkR2x2Ym5NZ1pHOWxjMjRuZENCelkzSmxkeUIwYUdsdVozTWdZWEp2ZFc1a0Nna0pDUWx6TG1wemIyNXdRMkZzYkdKaFkyc2dQU0J2Y21sbmFXNWhiRk5sZEhScGJtZHpMbXB6YjI1d1EyRnNiR0poWTJzN0Nnb0pDUWtKTHk4Z1UyRjJaU0IwYUdVZ1kyRnNiR0poWTJzZ2JtRnRaU0JtYjNJZ1puVjBkWEpsSUhWelpRb0pDUWtKYjJ4a1EyRnNiR0poWTJ0ekxuQjFjMmdvSUdOaGJHeGlZV05yVG1GdFpTQXBPd29KQ1FsOUNnb0pDUWt2THlCRFlXeHNJR2xtSUdsMElIZGhjeUJoSUdaMWJtTjBhVzl1SUdGdVpDQjNaU0JvWVhabElHRWdjbVZ6Y0c5dWMyVUtDUWtKYVdZZ0tDQnlaWE53YjI1elpVTnZiblJoYVc1bGNpQW1KaUJwYzBaMWJtTjBhVzl1S0NCdmRtVnlkM0pwZEhSbGJpQXBJQ2tnZXdvSkNRa0piM1psY25keWFYUjBaVzRvSUhKbGMzQnZibk5sUTI5dWRHRnBibVZ5V3lBd0lGMGdLVHNLQ1FrSmZRb0tDUWtKY21WemNHOXVjMlZEYjI1MFlXbHVaWElnUFNCdmRtVnlkM0pwZEhSbGJpQTlJSFZ1WkdWbWFXNWxaRHNLQ1FsOUlDazdDZ29KQ1M4dklFUmxiR1ZuWVhSbElIUnZJSE5qY21sd2RBb0pDWEpsZEhWeWJpQWljMk55YVhCMElqc0tDWDBLZlNBcE93b0tDZ29LTHk4Z1UzVndjRzl5ZERvZ1UyRm1ZWEpwSURnZ2IyNXNlUW92THlCSmJpQlRZV1poY21rZ09DQmtiMk4xYldWdWRITWdZM0psWVhSbFpDQjJhV0VnWkc5amRXMWxiblF1YVcxd2JHVnRaVzUwWVhScGIyNHVZM0psWVhSbFNGUk5URVJ2WTNWdFpXNTBDaTh2SUdOdmJHeGhjSE5sSUhOcFlteHBibWNnWm05eWJYTTZJSFJvWlNCelpXTnZibVFnYjI1bElHSmxZMjl0WlhNZ1lTQmphR2xzWkNCdlppQjBhR1VnWm1seWMzUWdiMjVsTGdvdkx5QkNaV05oZFhObElHOW1JSFJvWVhRc0lIUm9hWE1nYzJWamRYSnBkSGtnYldWaGMzVnlaU0JvWVhNZ2RHOGdZbVVnWkdsellXSnNaV1FnYVc0Z1UyRm1ZWEpwSURndUNpOHZJR2gwZEhCek9pOHZZblZuY3k1M1pXSnJhWFF1YjNKbkwzTm9iM2RmWW5WbkxtTm5hVDlwWkQweE16Y3pNemNLYzNWd2NHOXlkQzVqY21WaGRHVklWRTFNUkc5amRXMWxiblFnUFNBb0lHWjFibU4wYVc5dUtDa2dld29KZG1GeUlHSnZaSGtnUFNCa2IyTjFiV1Z1ZEM1cGJYQnNaVzFsYm5SaGRHbHZiaTVqY21WaGRHVklWRTFNUkc5amRXMWxiblFvSUNJaUlDa3VZbTlrZVRzS0NXSnZaSGt1YVc1dVpYSklWRTFNSUQwZ0lqeG1iM0p0UGp3dlptOXliVDQ4Wm05eWJUNDhMMlp2Y20wK0lqc0tDWEpsZEhWeWJpQmliMlI1TG1Ob2FXeGtUbTlrWlhNdWJHVnVaM1JvSUQwOVBTQXlPd3A5SUNrb0tUc0tDZ292THlCQmNtZDFiV1Z1ZENBaVpHRjBZU0lnYzJodmRXeGtJR0psSUhOMGNtbHVaeUJ2WmlCb2RHMXNDaTh2SUdOdmJuUmxlSFFnS0c5d2RHbHZibUZzS1RvZ1NXWWdjM0JsWTJsbWFXVmtMQ0IwYUdVZ1puSmhaMjFsYm5RZ2QybHNiQ0JpWlNCamNtVmhkR1ZrSUdsdUlIUm9hWE1nWTI5dWRHVjRkQ3dLTHk4Z1pHVm1ZWFZzZEhNZ2RHOGdaRzlqZFcxbGJuUUtMeThnYTJWbGNGTmpjbWx3ZEhNZ0tHOXdkR2x2Ym1Gc0tUb2dTV1lnZEhKMVpTd2dkMmxzYkNCcGJtTnNkV1JsSUhOamNtbHdkSE1nY0dGemMyVmtJR2x1SUhSb1pTQm9kRzFzSUhOMGNtbHVad3BxVVhWbGNua3VjR0Z5YzJWSVZFMU1JRDBnWm5WdVkzUnBiMjRvSUdSaGRHRXNJR052Ym5SbGVIUXNJR3RsWlhCVFkzSnBjSFJ6SUNrZ2V3b0phV1lnS0NCMGVYQmxiMllnWkdGMFlTQWhQVDBnSW5OMGNtbHVaeUlnS1NCN0Nna0pjbVYwZFhKdUlGdGRPd29KZlFvSmFXWWdLQ0IwZVhCbGIyWWdZMjl1ZEdWNGRDQTlQVDBnSW1KdmIyeGxZVzRpSUNrZ2V3b0pDV3RsWlhCVFkzSnBjSFJ6SUQwZ1kyOXVkR1Y0ZERzS0NRbGpiMjUwWlhoMElEMGdabUZzYzJVN0NnbDlDZ29KZG1GeUlHSmhjMlVzSUhCaGNuTmxaQ3dnYzJOeWFYQjBjenNLQ2dscFppQW9JQ0ZqYjI1MFpYaDBJQ2tnZXdvS0NRa3ZMeUJUZEc5d0lITmpjbWx3ZEhNZ2IzSWdhVzVzYVc1bElHVjJaVzUwSUdoaGJtUnNaWEp6SUdaeWIyMGdZbVZwYm1jZ1pYaGxZM1YwWldRZ2FXMXRaV1JwWVhSbGJIa0tDUWt2THlCaWVTQjFjMmx1WnlCa2IyTjFiV1Z1ZEM1cGJYQnNaVzFsYm5SaGRHbHZiZ29KQ1dsbUlDZ2djM1Z3Y0c5eWRDNWpjbVZoZEdWSVZFMU1SRzlqZFcxbGJuUWdLU0I3Q2drSkNXTnZiblJsZUhRZ1BTQmtiMk4xYldWdWRDNXBiWEJzWlcxbGJuUmhkR2x2Ymk1amNtVmhkR1ZJVkUxTVJHOWpkVzFsYm5Rb0lDSWlJQ2s3Q2dvSkNRa3ZMeUJUWlhRZ2RHaGxJR0poYzJVZ2FISmxaaUJtYjNJZ2RHaGxJR055WldGMFpXUWdaRzlqZFcxbGJuUUtDUWtKTHk4Z2MyOGdZVzU1SUhCaGNuTmxaQ0JsYkdWdFpXNTBjeUIzYVhSb0lGVlNUSE1LQ1FrSkx5OGdZWEpsSUdKaGMyVmtJRzl1SUhSb1pTQmtiMk4xYldWdWRDZHpJRlZTVENBb1oyZ3RNamsyTlNrS0NRa0pZbUZ6WlNBOUlHTnZiblJsZUhRdVkzSmxZWFJsUld4bGJXVnVkQ2dnSW1KaGMyVWlJQ2s3Q2drSkNXSmhjMlV1YUhKbFppQTlJR1J2WTNWdFpXNTBMbXh2WTJGMGFXOXVMbWh5WldZN0Nna0pDV052Ym5SbGVIUXVhR1ZoWkM1aGNIQmxibVJEYUdsc1pDZ2dZbUZ6WlNBcE93b0pDWDBnWld4elpTQjdDZ2tKQ1dOdmJuUmxlSFFnUFNCa2IyTjFiV1Z1ZERzS0NRbDlDZ2w5Q2dvSmNHRnljMlZrSUQwZ2NuTnBibWRzWlZSaFp5NWxlR1ZqS0NCa1lYUmhJQ2s3Q2dselkzSnBjSFJ6SUQwZ0lXdGxaWEJUWTNKcGNIUnpJQ1ltSUZ0ZE93b0tDUzh2SUZOcGJtZHNaU0IwWVdjS0NXbG1JQ2dnY0dGeWMyVmtJQ2tnZXdvSkNYSmxkSFZ5YmlCYklHTnZiblJsZUhRdVkzSmxZWFJsUld4bGJXVnVkQ2dnY0dGeWMyVmtXeUF4SUYwZ0tTQmRPd29KZlFvS0NYQmhjbk5sWkNBOUlHSjFhV3hrUm5KaFoyMWxiblFvSUZzZ1pHRjBZU0JkTENCamIyNTBaWGgwTENCelkzSnBjSFJ6SUNrN0Nnb0phV1lnS0NCelkzSnBjSFJ6SUNZbUlITmpjbWx3ZEhNdWJHVnVaM1JvSUNrZ2V3b0pDV3BSZFdWeWVTZ2djMk55YVhCMGN5QXBMbkpsYlc5MlpTZ3BPd29KZlFvS0NYSmxkSFZ5YmlCcVVYVmxjbmt1YldWeVoyVW9JRnRkTENCd1lYSnpaV1F1WTJocGJHUk9iMlJsY3lBcE93cDlPd29LQ2k4cUtnb2dLaUJNYjJGa0lHRWdkWEpzSUdsdWRHOGdZU0J3WVdkbENpQXFMd3BxVVhWbGNua3VabTR1Ykc5aFpDQTlJR1oxYm1OMGFXOXVLQ0IxY213c0lIQmhjbUZ0Y3l3Z1kyRnNiR0poWTJzZ0tTQjdDZ2wyWVhJZ2MyVnNaV04wYjNJc0lIUjVjR1VzSUhKbGMzQnZibk5sTEFvSkNYTmxiR1lnUFNCMGFHbHpMQW9KQ1c5bVppQTlJSFZ5YkM1cGJtUmxlRTltS0NBaUlDSWdLVHNLQ2dscFppQW9JRzltWmlBK0lDMHhJQ2tnZXdvSkNYTmxiR1ZqZEc5eUlEMGdjM1J5YVhCQmJtUkRiMnhzWVhCelpTZ2dkWEpzTG5Oc2FXTmxLQ0J2Wm1ZZ0tTQXBPd29KQ1hWeWJDQTlJSFZ5YkM1emJHbGpaU2dnTUN3Z2IyWm1JQ2s3Q2dsOUNnb0pMeThnU1dZZ2FYUW5jeUJoSUdaMWJtTjBhVzl1Q2dscFppQW9JR2x6Um5WdVkzUnBiMjRvSUhCaGNtRnRjeUFwSUNrZ2V3b0tDUWt2THlCWFpTQmhjM04xYldVZ2RHaGhkQ0JwZENkeklIUm9aU0JqWVd4c1ltRmphd29KQ1dOaGJHeGlZV05ySUQwZ2NHRnlZVzF6T3dvSkNYQmhjbUZ0Y3lBOUlIVnVaR1ZtYVc1bFpEc0tDZ2t2THlCUGRHaGxjbmRwYzJVc0lHSjFhV3hrSUdFZ2NHRnlZVzBnYzNSeWFXNW5DZ2w5SUdWc2MyVWdhV1lnS0NCd1lYSmhiWE1nSmlZZ2RIbHdaVzltSUhCaGNtRnRjeUE5UFQwZ0ltOWlhbVZqZENJZ0tTQjdDZ2tKZEhsd1pTQTlJQ0pRVDFOVUlqc0tDWDBLQ2drdkx5QkpaaUIzWlNCb1lYWmxJR1ZzWlcxbGJuUnpJSFJ2SUcxdlpHbG1lU3dnYldGclpTQjBhR1VnY21WeGRXVnpkQW9KYVdZZ0tDQnpaV3htTG14bGJtZDBhQ0ErSURBZ0tTQjdDZ2tKYWxGMVpYSjVMbUZxWVhnb0lIc0tDUWtKZFhKc09pQjFjbXdzQ2dvSkNRa3ZMeUJKWmlBaWRIbHdaU0lnZG1GeWFXRmliR1VnYVhNZ2RXNWtaV1pwYm1Wa0xDQjBhR1Z1SUNKSFJWUWlJRzFsZEdodlpDQjNhV3hzSUdKbElIVnpaV1F1Q2drSkNTOHZJRTFoYTJVZ2RtRnNkV1VnYjJZZ2RHaHBjeUJtYVdWc1pDQmxlSEJzYVdOcGRDQnphVzVqWlFvSkNRa3ZMeUIxYzJWeUlHTmhiaUJ2ZG1WeWNtbGtaU0JwZENCMGFISnZkV2RvSUdGcVlYaFRaWFIxY0NCdFpYUm9iMlFLQ1FrSmRIbHdaVG9nZEhsd1pTQjhmQ0FpUjBWVUlpd0tDUWtKWkdGMFlWUjVjR1U2SUNKb2RHMXNJaXdLQ1FrSlpHRjBZVG9nY0dGeVlXMXpDZ2tKZlNBcExtUnZibVVvSUdaMWJtTjBhVzl1S0NCeVpYTndiMjV6WlZSbGVIUWdLU0I3Q2dvSkNRa3ZMeUJUWVhabElISmxjM0J2Ym5ObElHWnZjaUIxYzJVZ2FXNGdZMjl0Y0d4bGRHVWdZMkZzYkdKaFkyc0tDUWtKY21WemNHOXVjMlVnUFNCaGNtZDFiV1Z1ZEhNN0Nnb0pDUWx6Wld4bUxtaDBiV3dvSUhObGJHVmpkRzl5SUQ4S0Nna0pDUWt2THlCSlppQmhJSE5sYkdWamRHOXlJSGRoY3lCemNHVmphV1pwWldRc0lHeHZZMkYwWlNCMGFHVWdjbWxuYUhRZ1pXeGxiV1Z1ZEhNZ2FXNGdZU0JrZFcxdGVTQmthWFlLQ1FrSkNTOHZJRVY0WTJ4MVpHVWdjMk55YVhCMGN5QjBieUJoZG05cFpDQkpSU0FuVUdWeWJXbHpjMmx2YmlCRVpXNXBaV1FuSUdWeWNtOXljd29KQ1FrSmFsRjFaWEo1S0NBaVBHUnBkajRpSUNrdVlYQndaVzVrS0NCcVVYVmxjbmt1Y0dGeWMyVklWRTFNS0NCeVpYTndiMjV6WlZSbGVIUWdLU0FwTG1acGJtUW9JSE5sYkdWamRHOXlJQ2tnT2dvS0NRa0pDUzh2SUU5MGFHVnlkMmx6WlNCMWMyVWdkR2hsSUdaMWJHd2djbVZ6ZFd4MENna0pDUWx5WlhOd2IyNXpaVlJsZUhRZ0tUc0tDZ2tKTHk4Z1NXWWdkR2hsSUhKbGNYVmxjM1FnYzNWalkyVmxaSE1zSUhSb2FYTWdablZ1WTNScGIyNGdaMlYwY3lBaVpHRjBZU0lzSUNKemRHRjBkWE1pTENBaWFuRllTRklpQ2drSkx5OGdZblYwSUhSb1pYa2dZWEpsSUdsbmJtOXlaV1FnWW1WallYVnpaU0J5WlhOd2IyNXpaU0IzWVhNZ2MyVjBJR0ZpYjNabExnb0pDUzh2SUVsbUlHbDBJR1poYVd4ekxDQjBhR2x6SUdaMWJtTjBhVzl1SUdkbGRITWdJbXB4V0VoU0lpd2dJbk4wWVhSMWN5SXNJQ0psY25KdmNpSUtDUWw5SUNrdVlXeDNZWGx6S0NCallXeHNZbUZqYXlBbUppQm1kVzVqZEdsdmJpZ2dhbkZZU0ZJc0lITjBZWFIxY3lBcElIc0tDUWtKYzJWc1ppNWxZV05vS0NCbWRXNWpkR2x2YmlncElIc0tDUWtKQ1dOaGJHeGlZV05yTG1Gd2NHeDVLQ0IwYUdsekxDQnlaWE53YjI1elpTQjhmQ0JiSUdweFdFaFNMbkpsYzNCdmJuTmxWR1Y0ZEN3Z2MzUmhkSFZ6TENCcWNWaElVaUJkSUNrN0Nna0pDWDBnS1RzS0NRbDlJQ2s3Q2dsOUNnb0pjbVYwZFhKdUlIUm9hWE03Q24wN0Nnb0tDZ292THlCQmRIUmhZMmdnWVNCaWRXNWphQ0J2WmlCbWRXNWpkR2x2Ym5NZ1ptOXlJR2hoYm1Sc2FXNW5JR052YlcxdmJpQkJTa0ZZSUdWMlpXNTBjd3BxVVhWbGNua3VaV0ZqYUNnZ1d3b0pJbUZxWVhoVGRHRnlkQ0lzQ2draVlXcGhlRk4wYjNBaUxBb0pJbUZxWVhoRGIyMXdiR1YwWlNJc0Nna2lZV3BoZUVWeWNtOXlJaXdLQ1NKaGFtRjRVM1ZqWTJWemN5SXNDZ2tpWVdwaGVGTmxibVFpQ2wwc0lHWjFibU4wYVc5dUtDQnBMQ0IwZVhCbElDa2dld29KYWxGMVpYSjVMbVp1V3lCMGVYQmxJRjBnUFNCbWRXNWpkR2x2YmlnZ1ptNGdLU0I3Q2drSmNtVjBkWEp1SUhSb2FYTXViMjRvSUhSNWNHVXNJR1p1SUNrN0NnbDlPd3A5SUNrN0Nnb0tDZ3BxVVhWbGNua3VaWGh3Y2k1d2MyVjFaRzl6TG1GdWFXMWhkR1ZrSUQwZ1puVnVZM1JwYjI0b0lHVnNaVzBnS1NCN0NnbHlaWFIxY200Z2FsRjFaWEo1TG1keVpYQW9JR3BSZFdWeWVTNTBhVzFsY25Nc0lHWjFibU4wYVc5dUtDQm1iaUFwSUhzS0NRbHlaWFIxY200Z1pXeGxiU0E5UFQwZ1ptNHVaV3hsYlRzS0NYMGdLUzVzWlc1bmRHZzdDbjA3Q2dvS0NncHFVWFZsY25rdWIyWm1jMlYwSUQwZ2V3b0pjMlYwVDJabWMyVjBPaUJtZFc1amRHbHZiaWdnWld4bGJTd2diM0IwYVc5dWN5d2dhU0FwSUhzS0NRbDJZWElnWTNWeVVHOXphWFJwYjI0c0lHTjFja3hsWm5Rc0lHTjFja05UVTFSdmNDd2dZM1Z5Vkc5d0xDQmpkWEpQWm1aelpYUXNJR04xY2tOVFUweGxablFzSUdOaGJHTjFiR0YwWlZCdmMybDBhVzl1TEFvSkNRbHdiM05wZEdsdmJpQTlJR3BSZFdWeWVTNWpjM01vSUdWc1pXMHNJQ0p3YjNOcGRHbHZiaUlnS1N3S0NRa0pZM1Z5Uld4bGJTQTlJR3BSZFdWeWVTZ2daV3hsYlNBcExBb0pDUWx3Y205d2N5QTlJSHQ5T3dvS0NRa3ZMeUJUWlhRZ2NHOXphWFJwYjI0Z1ptbHljM1FzSUdsdUxXTmhjMlVnZEc5d0wyeGxablFnWVhKbElITmxkQ0JsZG1WdUlHOXVJSE4wWVhScFl5QmxiR1Z0Q2drSmFXWWdLQ0J3YjNOcGRHbHZiaUE5UFQwZ0luTjBZWFJwWXlJZ0tTQjdDZ2tKQ1dWc1pXMHVjM1I1YkdVdWNHOXphWFJwYjI0Z1BTQWljbVZzWVhScGRtVWlPd29KQ1gwS0Nna0pZM1Z5VDJabWMyVjBJRDBnWTNWeVJXeGxiUzV2Wm1aelpYUW9LVHNLQ1FsamRYSkRVMU5VYjNBZ1BTQnFVWFZsY25rdVkzTnpLQ0JsYkdWdExDQWlkRzl3SWlBcE93b0pDV04xY2tOVFUweGxablFnUFNCcVVYVmxjbmt1WTNOektDQmxiR1Z0TENBaWJHVm1kQ0lnS1RzS0NRbGpZV3hqZFd4aGRHVlFiM05wZEdsdmJpQTlJQ2dnY0c5emFYUnBiMjRnUFQwOUlDSmhZbk52YkhWMFpTSWdmSHdnY0c5emFYUnBiMjRnUFQwOUlDSm1hWGhsWkNJZ0tTQW1KZ29KQ1Frb0lHTjFja05UVTFSdmNDQXJJR04xY2tOVFUweGxablFnS1M1cGJtUmxlRTltS0NBaVlYVjBieUlnS1NBK0lDMHhPd29LQ1Frdkx5Qk9aV1ZrSUhSdklHSmxJR0ZpYkdVZ2RHOGdZMkZzWTNWc1lYUmxJSEJ2YzJsMGFXOXVJR2xtSUdWcGRHaGxjZ29KQ1M4dklIUnZjQ0J2Y2lCc1pXWjBJR2x6SUdGMWRHOGdZVzVrSUhCdmMybDBhVzl1SUdseklHVnBkR2hsY2lCaFluTnZiSFYwWlNCdmNpQm1hWGhsWkFvSkNXbG1JQ2dnWTJGc1kzVnNZWFJsVUc5emFYUnBiMjRnS1NCN0Nna0pDV04xY2xCdmMybDBhVzl1SUQwZ1kzVnlSV3hsYlM1d2IzTnBkR2x2YmlncE93b0pDUWxqZFhKVWIzQWdQU0JqZFhKUWIzTnBkR2x2Ymk1MGIzQTdDZ2tKQ1dOMWNreGxablFnUFNCamRYSlFiM05wZEdsdmJpNXNaV1owT3dvS0NRbDlJR1ZzYzJVZ2V3b0pDUWxqZFhKVWIzQWdQU0J3WVhKelpVWnNiMkYwS0NCamRYSkRVMU5VYjNBZ0tTQjhmQ0F3T3dvSkNRbGpkWEpNWldaMElEMGdjR0Z5YzJWR2JHOWhkQ2dnWTNWeVExTlRUR1ZtZENBcElIeDhJREE3Q2drSmZRb0tDUWxwWmlBb0lHbHpSblZ1WTNScGIyNG9JRzl3ZEdsdmJuTWdLU0FwSUhzS0Nna0pDUzh2SUZWelpTQnFVWFZsY25rdVpYaDBaVzVrSUdobGNtVWdkRzhnWVd4c2IzY2diVzlrYVdacFkyRjBhVzl1SUc5bUlHTnZiM0prYVc1aGRHVnpJR0Z5WjNWdFpXNTBJQ2huYUMweE9EUTRLUW9KQ1FsdmNIUnBiMjV6SUQwZ2IzQjBhVzl1Y3k1allXeHNLQ0JsYkdWdExDQnBMQ0JxVVhWbGNua3VaWGgwWlc1a0tDQjdmU3dnWTNWeVQyWm1jMlYwSUNrZ0tUc0tDUWw5Q2dvSkNXbG1JQ2dnYjNCMGFXOXVjeTUwYjNBZ0lUMGdiblZzYkNBcElIc0tDUWtKY0hKdmNITXVkRzl3SUQwZ0tDQnZjSFJwYjI1ekxuUnZjQ0F0SUdOMWNrOW1abk5sZEM1MGIzQWdLU0FySUdOMWNsUnZjRHNLQ1FsOUNna0phV1lnS0NCdmNIUnBiMjV6TG14bFpuUWdJVDBnYm5Wc2JDQXBJSHNLQ1FrSmNISnZjSE11YkdWbWRDQTlJQ2dnYjNCMGFXOXVjeTVzWldaMElDMGdZM1Z5VDJabWMyVjBMbXhsWm5RZ0tTQXJJR04xY2t4bFpuUTdDZ2tKZlFvS0NRbHBaaUFvSUNKMWMybHVaeUlnYVc0Z2IzQjBhVzl1Y3lBcElIc0tDUWtKYjNCMGFXOXVjeTUxYzJsdVp5NWpZV3hzS0NCbGJHVnRMQ0J3Y205d2N5QXBPd29LQ1FsOUlHVnNjMlVnZXdvSkNRbGpkWEpGYkdWdExtTnpjeWdnY0hKdmNITWdLVHNLQ1FsOUNnbDlDbjA3Q2dwcVVYVmxjbmt1Wm00dVpYaDBaVzVrS0NCN0Nnb0pMeThnYjJabWMyVjBLQ2tnY21Wc1lYUmxjeUJoYmlCbGJHVnRaVzUwSjNNZ1ltOXlaR1Z5SUdKdmVDQjBieUIwYUdVZ1pHOWpkVzFsYm5RZ2IzSnBaMmx1Q2dsdlptWnpaWFE2SUdaMWJtTjBhVzl1S0NCdmNIUnBiMjV6SUNrZ2V3b0tDUWt2THlCUWNtVnpaWEoyWlNCamFHRnBibWx1WnlCbWIzSWdjMlYwZEdWeUNna0phV1lnS0NCaGNtZDFiV1Z1ZEhNdWJHVnVaM1JvSUNrZ2V3b0pDUWx5WlhSMWNtNGdiM0IwYVc5dWN5QTlQVDBnZFc1a1pXWnBibVZrSUQ4S0NRa0pDWFJvYVhNZ09nb0pDUWtKZEdocGN5NWxZV05vS0NCbWRXNWpkR2x2YmlnZ2FTQXBJSHNLQ1FrSkNRbHFVWFZsY25rdWIyWm1jMlYwTG5ObGRFOW1abk5sZENnZ2RHaHBjeXdnYjNCMGFXOXVjeXdnYVNBcE93b0pDUWtKZlNBcE93b0pDWDBLQ2drSmRtRnlJSEpsWTNRc0lIZHBiaXdLQ1FrSlpXeGxiU0E5SUhSb2FYTmJJREFnWFRzS0Nna0phV1lnS0NBaFpXeGxiU0FwSUhzS0NRa0pjbVYwZFhKdU93b0pDWDBLQ2drSkx5OGdVbVYwZFhKdUlIcGxjbTl6SUdadmNpQmthWE5qYjI1dVpXTjBaV1FnWVc1a0lHaHBaR1JsYmlBb1pHbHpjR3hoZVRvZ2JtOXVaU2tnWld4bGJXVnVkSE1nS0dkb0xUSXpNVEFwQ2drSkx5OGdVM1Z3Y0c5eWREb2dTVVVnUEQweE1TQnZibXg1Q2drSkx5OGdVblZ1Ym1sdVp5Qm5aWFJDYjNWdVpHbHVaME5zYVdWdWRGSmxZM1FnYjI0Z1lRb0pDUzh2SUdScGMyTnZibTVsWTNSbFpDQnViMlJsSUdsdUlFbEZJSFJvY205M2N5QmhiaUJsY25KdmNnb0pDV2xtSUNnZ0lXVnNaVzB1WjJWMFEyeHBaVzUwVW1WamRITW9LUzVzWlc1bmRHZ2dLU0I3Q2drSkNYSmxkSFZ5YmlCN0lIUnZjRG9nTUN3Z2JHVm1kRG9nTUNCOU93b0pDWDBLQ2drSkx5OGdSMlYwSUdSdlkzVnRaVzUwTFhKbGJHRjBhWFpsSUhCdmMybDBhVzl1SUdKNUlHRmtaR2x1WnlCMmFXVjNjRzl5ZENCelkzSnZiR3dnZEc4Z2RtbGxkM0J2Y25RdGNtVnNZWFJwZG1VZ1owSkRVZ29KQ1hKbFkzUWdQU0JsYkdWdExtZGxkRUp2ZFc1a2FXNW5RMnhwWlc1MFVtVmpkQ2dwT3dvSkNYZHBiaUE5SUdWc1pXMHViM2R1WlhKRWIyTjFiV1Z1ZEM1a1pXWmhkV3gwVm1sbGR6c0tDUWx5WlhSMWNtNGdld29KQ1FsMGIzQTZJSEpsWTNRdWRHOXdJQ3NnZDJsdUxuQmhaMlZaVDJabWMyVjBMQW9KQ1Fsc1pXWjBPaUJ5WldOMExteGxablFnS3lCM2FXNHVjR0ZuWlZoUFptWnpaWFFLQ1FsOU93b0pmU3dLQ2drdkx5QndiM05wZEdsdmJpZ3BJSEpsYkdGMFpYTWdZVzRnWld4bGJXVnVkQ2R6SUcxaGNtZHBiaUJpYjNnZ2RHOGdhWFJ6SUc5bVpuTmxkQ0J3WVhKbGJuUW5jeUJ3WVdSa2FXNW5JR0p2ZUFvSkx5OGdWR2hwY3lCamIzSnlaWE53YjI1a2N5QjBieUIwYUdVZ1ltVm9ZWFpwYjNJZ2IyWWdRMU5USUdGaWMyOXNkWFJsSUhCdmMybDBhVzl1YVc1bkNnbHdiM05wZEdsdmJqb2dablZ1WTNScGIyNG9LU0I3Q2drSmFXWWdLQ0FoZEdocGMxc2dNQ0JkSUNrZ2V3b0pDUWx5WlhSMWNtNDdDZ2tKZlFvS0NRbDJZWElnYjJabWMyVjBVR0Z5Wlc1MExDQnZabVp6WlhRc0lHUnZZeXdLQ1FrSlpXeGxiU0E5SUhSb2FYTmJJREFnWFN3S0NRa0pjR0Z5Wlc1MFQyWm1jMlYwSUQwZ2V5QjBiM0E2SURBc0lHeGxablE2SURBZ2ZUc0tDZ2tKTHk4Z2NHOXphWFJwYjI0NlptbDRaV1FnWld4bGJXVnVkSE1nWVhKbElHOW1abk5sZENCbWNtOXRJSFJvWlNCMmFXVjNjRzl5ZEN3Z2QyaHBZMmdnYVhSelpXeG1JR0ZzZDJGNWN5Qm9ZWE1nZW1WeWJ5QnZabVp6WlhRS0NRbHBaaUFvSUdwUmRXVnllUzVqYzNNb0lHVnNaVzBzSUNKd2IzTnBkR2x2YmlJZ0tTQTlQVDBnSW1acGVHVmtJaUFwSUhzS0Nna0pDUzh2SUVGemMzVnRaU0J3YjNOcGRHbHZianBtYVhobFpDQnBiWEJzYVdWeklHRjJZV2xzWVdKcGJHbDBlU0J2WmlCblpYUkNiM1Z1WkdsdVowTnNhV1Z1ZEZKbFkzUUtDUWtKYjJabWMyVjBJRDBnWld4bGJTNW5aWFJDYjNWdVpHbHVaME5zYVdWdWRGSmxZM1FvS1RzS0Nna0pmU0JsYkhObElIc0tDUWtKYjJabWMyVjBJRDBnZEdocGN5NXZabVp6WlhRb0tUc0tDZ2tKQ1M4dklFRmpZMjkxYm5RZ1ptOXlJSFJvWlNBcWNtVmhiQ29nYjJabWMyVjBJSEJoY21WdWRDd2dkMmhwWTJnZ1kyRnVJR0psSUhSb1pTQmtiMk4xYldWdWRDQnZjaUJwZEhNZ2NtOXZkQ0JsYkdWdFpXNTBDZ2tKQ1M4dklIZG9aVzRnWVNCemRHRjBhV05oYkd4NUlIQnZjMmwwYVc5dVpXUWdaV3hsYldWdWRDQnBjeUJwWkdWdWRHbG1hV1ZrQ2drSkNXUnZZeUE5SUdWc1pXMHViM2R1WlhKRWIyTjFiV1Z1ZERzS0NRa0piMlptYzJWMFVHRnlaVzUwSUQwZ1pXeGxiUzV2Wm1aelpYUlFZWEpsYm5RZ2ZId2daRzlqTG1SdlkzVnRaVzUwUld4bGJXVnVkRHNLQ1FrSmQyaHBiR1VnS0NCdlptWnpaWFJRWVhKbGJuUWdKaVlLQ1FrSkNTZ2diMlptYzJWMFVHRnlaVzUwSUQwOVBTQmtiMk11WW05a2VTQjhmQ0J2Wm1aelpYUlFZWEpsYm5RZ1BUMDlJR1J2WXk1a2IyTjFiV1Z1ZEVWc1pXMWxiblFnS1NBbUpnb0pDUWtKYWxGMVpYSjVMbU56Y3lnZ2IyWm1jMlYwVUdGeVpXNTBMQ0FpY0c5emFYUnBiMjRpSUNrZ1BUMDlJQ0p6ZEdGMGFXTWlJQ2tnZXdvS0NRa0pDVzltWm5ObGRGQmhjbVZ1ZENBOUlHOW1abk5sZEZCaGNtVnVkQzV3WVhKbGJuUk9iMlJsT3dvSkNRbDlDZ2tKQ1dsbUlDZ2diMlptYzJWMFVHRnlaVzUwSUNZbUlHOW1abk5sZEZCaGNtVnVkQ0FoUFQwZ1pXeGxiU0FtSmlCdlptWnpaWFJRWVhKbGJuUXVibTlrWlZSNWNHVWdQVDA5SURFZ0tTQjdDZ29KQ1FrSkx5OGdTVzVqYjNKd2IzSmhkR1VnWW05eVpHVnljeUJwYm5SdklHbDBjeUJ2Wm1aelpYUXNJSE5wYm1ObElIUm9aWGtnWVhKbElHOTFkSE5wWkdVZ2FYUnpJR052Ym5SbGJuUWdiM0pwWjJsdUNna0pDUWx3WVhKbGJuUlBabVp6WlhRZ1BTQnFVWFZsY25rb0lHOW1abk5sZEZCaGNtVnVkQ0FwTG05bVpuTmxkQ2dwT3dvSkNRa0pjR0Z5Wlc1MFQyWm1jMlYwTG5SdmNDQXJQU0JxVVhWbGNua3VZM056S0NCdlptWnpaWFJRWVhKbGJuUXNJQ0ppYjNKa1pYSlViM0JYYVdSMGFDSXNJSFJ5ZFdVZ0tUc0tDUWtKQ1hCaGNtVnVkRTltWm5ObGRDNXNaV1owSUNzOUlHcFJkV1Z5ZVM1amMzTW9JRzltWm5ObGRGQmhjbVZ1ZEN3Z0ltSnZjbVJsY2t4bFpuUlhhV1IwYUNJc0lIUnlkV1VnS1RzS0NRa0pmUW9KQ1gwS0Nna0pMeThnVTNWaWRISmhZM1FnY0dGeVpXNTBJRzltWm5ObGRITWdZVzVrSUdWc1pXMWxiblFnYldGeVoybHVjd29KQ1hKbGRIVnliaUI3Q2drSkNYUnZjRG9nYjJabWMyVjBMblJ2Y0NBdElIQmhjbVZ1ZEU5bVpuTmxkQzUwYjNBZ0xTQnFVWFZsY25rdVkzTnpLQ0JsYkdWdExDQWliV0Z5WjJsdVZHOXdJaXdnZEhKMVpTQXBMQW9KQ1Fsc1pXWjBPaUJ2Wm1aelpYUXViR1ZtZENBdElIQmhjbVZ1ZEU5bVpuTmxkQzVzWldaMElDMGdhbEYxWlhKNUxtTnpjeWdnWld4bGJTd2dJbTFoY21kcGJreGxablFpTENCMGNuVmxJQ2tLQ1FsOU93b0pmU3dLQ2drdkx5QlVhR2x6SUcxbGRHaHZaQ0IzYVd4c0lISmxkSFZ5YmlCa2IyTjFiV1Z1ZEVWc1pXMWxiblFnYVc0Z2RHaGxJR1p2Ykd4dmQybHVaeUJqWVhObGN6b0tDUzh2SURFcElFWnZjaUIwYUdVZ1pXeGxiV1Z1ZENCcGJuTnBaR1VnZEdobElHbG1jbUZ0WlNCM2FYUm9iM1YwSUc5bVpuTmxkRkJoY21WdWRDd2dkR2hwY3lCdFpYUm9iMlFnZDJsc2JDQnlaWFIxY200S0NTOHZJQ0FnSUdSdlkzVnRaVzUwUld4bGJXVnVkQ0J2WmlCMGFHVWdjR0Z5Wlc1MElIZHBibVJ2ZHdvSkx5OGdNaWtnUm05eUlIUm9aU0JvYVdSa1pXNGdiM0lnWkdWMFlXTm9aV1FnWld4bGJXVnVkQW9KTHk4Z015a2dSbTl5SUdKdlpIa2diM0lnYUhSdGJDQmxiR1Z0Wlc1MExDQnBMbVV1SUdsdUlHTmhjMlVnYjJZZ2RHaGxJR2gwYld3Z2JtOWtaU0F0SUdsMElIZHBiR3dnY21WMGRYSnVJR2wwYzJWc1pnb0pMeThLQ1M4dklHSjFkQ0IwYUc5elpTQmxlR05sY0hScGIyNXpJSGRsY21VZ2JtVjJaWElnY0hKbGMyVnVkR1ZrSUdGeklHRWdjbVZoYkNCc2FXWmxJSFZ6WlMxallYTmxjd29KTHk4Z1lXNWtJRzFwWjJoMElHSmxJR052Ym5OcFpHVnlaV1FnWVhNZ2JXOXlaU0J3Y21WbVpYSmhZbXhsSUhKbGMzVnNkSE11Q2drdkx3b0pMeThnVkdocGN5QnNiMmRwWXl3Z2FHOTNaWFpsY2l3Z2FYTWdibTkwSUdkMVlYSmhiblJsWldRZ1lXNWtJR05oYmlCamFHRnVaMlVnWVhRZ1lXNTVJSEJ2YVc1MElHbHVJSFJvWlNCbWRYUjFjbVVLQ1c5bVpuTmxkRkJoY21WdWREb2dablZ1WTNScGIyNG9LU0I3Q2drSmNtVjBkWEp1SUhSb2FYTXViV0Z3S0NCbWRXNWpkR2x2YmlncElIc0tDUWtKZG1GeUlHOW1abk5sZEZCaGNtVnVkQ0E5SUhSb2FYTXViMlptYzJWMFVHRnlaVzUwT3dvS0NRa0pkMmhwYkdVZ0tDQnZabVp6WlhSUVlYSmxiblFnSmlZZ2FsRjFaWEo1TG1OemN5Z2diMlptYzJWMFVHRnlaVzUwTENBaWNHOXphWFJwYjI0aUlDa2dQVDA5SUNKemRHRjBhV01pSUNrZ2V3b0pDUWtKYjJabWMyVjBVR0Z5Wlc1MElEMGdiMlptYzJWMFVHRnlaVzUwTG05bVpuTmxkRkJoY21WdWREc0tDUWtKZlFvS0NRa0pjbVYwZFhKdUlHOW1abk5sZEZCaGNtVnVkQ0I4ZkNCa2IyTjFiV1Z1ZEVWc1pXMWxiblE3Q2drSmZTQXBPd29KZlFwOUlDazdDZ292THlCRGNtVmhkR1VnYzJOeWIyeHNUR1ZtZENCaGJtUWdjMk55YjJ4c1ZHOXdJRzFsZEdodlpITUthbEYxWlhKNUxtVmhZMmdvSUhzZ2MyTnliMnhzVEdWbWREb2dJbkJoWjJWWVQyWm1jMlYwSWl3Z2MyTnliMnhzVkc5d09pQWljR0ZuWlZsUFptWnpaWFFpSUgwc0lHWjFibU4wYVc5dUtDQnRaWFJvYjJRc0lIQnliM0FnS1NCN0NnbDJZWElnZEc5d0lEMGdJbkJoWjJWWlQyWm1jMlYwSWlBOVBUMGdjSEp2Y0RzS0NnbHFVWFZsY25rdVptNWJJRzFsZEdodlpDQmRJRDBnWm5WdVkzUnBiMjRvSUhaaGJDQXBJSHNLQ1FseVpYUjFjbTRnWVdOalpYTnpLQ0IwYUdsekxDQm1kVzVqZEdsdmJpZ2daV3hsYlN3Z2JXVjBhRzlrTENCMllXd2dLU0I3Q2dvSkNRa3ZMeUJEYjJGc1pYTmpaU0JrYjJOMWJXVnVkSE1nWVc1a0lIZHBibVJ2ZDNNS0NRa0pkbUZ5SUhkcGJqc0tDUWtKYVdZZ0tDQnBjMWRwYm1SdmR5Z2daV3hsYlNBcElDa2dld29KQ1FrSmQybHVJRDBnWld4bGJUc0tDUWtKZlNCbGJITmxJR2xtSUNnZ1pXeGxiUzV1YjJSbFZIbHdaU0E5UFQwZ09TQXBJSHNLQ1FrSkNYZHBiaUE5SUdWc1pXMHVaR1ZtWVhWc2RGWnBaWGM3Q2drSkNYMEtDZ2tKQ1dsbUlDZ2dkbUZzSUQwOVBTQjFibVJsWm1sdVpXUWdLU0I3Q2drSkNRbHlaWFIxY200Z2QybHVJRDhnZDJsdVd5QndjbTl3SUYwZ09pQmxiR1Z0V3lCdFpYUm9iMlFnWFRzS0NRa0pmUW9LQ1FrSmFXWWdLQ0IzYVc0Z0tTQjdDZ2tKQ1FsM2FXNHVjMk55YjJ4c1ZHOG9DZ2tKQ1FrSklYUnZjQ0EvSUhaaGJDQTZJSGRwYmk1d1lXZGxXRTltWm5ObGRDd0tDUWtKQ1FsMGIzQWdQeUIyWVd3Z09pQjNhVzR1Y0dGblpWbFBabVp6WlhRS0NRa0pDU2s3Q2dvSkNRbDlJR1ZzYzJVZ2V3b0pDUWtKWld4bGJWc2diV1YwYUc5a0lGMGdQU0IyWVd3N0Nna0pDWDBLQ1FsOUxDQnRaWFJvYjJRc0lIWmhiQ3dnWVhKbmRXMWxiblJ6TG14bGJtZDBhQ0FwT3dvSmZUc0tmU0FwT3dvS0x5OGdVM1Z3Y0c5eWREb2dVMkZtWVhKcElEdzlOeUF0SURrdU1Td2dRMmh5YjIxbElEdzlNemNnTFNBME9Rb3ZMeUJCWkdRZ2RHaGxJSFJ2Y0M5c1pXWjBJR056YzBodmIydHpJSFZ6YVc1bklHcFJkV1Z5ZVM1bWJpNXdiM05wZEdsdmJnb3ZMeUJYWldKcmFYUWdZblZuT2lCb2RIUndjem92TDJKMVozTXVkMlZpYTJsMExtOXlaeTl6YUc5M1gySjFaeTVqWjJrL2FXUTlNamt3T0RRS0x5OGdRbXhwYm1zZ1luVm5PaUJvZEhSd2N6b3ZMMkoxWjNNdVkyaHliMjFwZFcwdWIzSm5MM0F2WTJoeWIyMXBkVzB2YVhOemRXVnpMMlJsZEdGcGJEOXBaRDAxT0Rrek5EY0tMeThnWjJWMFEyOXRjSFYwWldSVGRIbHNaU0J5WlhSMWNtNXpJSEJsY21ObGJuUWdkMmhsYmlCemNHVmphV1pwWldRZ1ptOXlJSFJ2Y0M5c1pXWjBMMkp2ZEhSdmJTOXlhV2RvZERzS0x5OGdjbUYwYUdWeUlIUm9ZVzRnYldGclpTQjBhR1VnWTNOeklHMXZaSFZzWlNCa1pYQmxibVFnYjI0Z2RHaGxJRzltWm5ObGRDQnRiMlIxYkdVc0lHcDFjM1FnWTJobFkyc2dabTl5SUdsMElHaGxjbVVLYWxGMVpYSjVMbVZoWTJnb0lGc2dJblJ2Y0NJc0lDSnNaV1owSWlCZExDQm1kVzVqZEdsdmJpZ2dhU3dnY0hKdmNDQXBJSHNLQ1dwUmRXVnllUzVqYzNOSWIyOXJjMXNnY0hKdmNDQmRJRDBnWVdSa1IyVjBTRzl2YTBsbUtDQnpkWEJ3YjNKMExuQnBlR1ZzVUc5emFYUnBiMjRzQ2drSlpuVnVZM1JwYjI0b0lHVnNaVzBzSUdOdmJYQjFkR1ZrSUNrZ2V3b0pDUWxwWmlBb0lHTnZiWEIxZEdWa0lDa2dld29KQ1FrSlkyOXRjSFYwWldRZ1BTQmpkWEpEVTFNb0lHVnNaVzBzSUhCeWIzQWdLVHNLQ2drSkNRa3ZMeUJKWmlCamRYSkRVMU1nY21WMGRYSnVjeUJ3WlhKalpXNTBZV2RsTENCbVlXeHNZbUZqYXlCMGJ5QnZabVp6WlhRS0NRa0pDWEpsZEhWeWJpQnliblZ0Ym05dWNIZ3VkR1Z6ZENnZ1kyOXRjSFYwWldRZ0tTQS9DZ2tKQ1FrSmFsRjFaWEo1S0NCbGJHVnRJQ2t1Y0c5emFYUnBiMjRvS1ZzZ2NISnZjQ0JkSUNzZ0luQjRJaUE2Q2drSkNRa0pZMjl0Y0hWMFpXUTdDZ2tKQ1gwS0NRbDlDZ2twT3dwOUlDazdDZ29LTHk4Z1EzSmxZWFJsSUdsdWJtVnlTR1ZwWjJoMExDQnBibTVsY2xkcFpIUm9MQ0JvWldsbmFIUXNJSGRwWkhSb0xDQnZkWFJsY2tobGFXZG9kQ0JoYm1RZ2IzVjBaWEpYYVdSMGFDQnRaWFJvYjJSekNtcFJkV1Z5ZVM1bFlXTm9LQ0I3SUVobGFXZG9kRG9nSW1obGFXZG9kQ0lzSUZkcFpIUm9PaUFpZDJsa2RHZ2lJSDBzSUdaMWJtTjBhVzl1S0NCdVlXMWxMQ0IwZVhCbElDa2dld29KYWxGMVpYSjVMbVZoWTJnb0lIc2djR0ZrWkdsdVp6b2dJbWx1Ym1WeUlpQXJJRzVoYldVc0lHTnZiblJsYm5RNklIUjVjR1VzSUNJaU9pQWliM1YwWlhJaUlDc2dibUZ0WlNCOUxBb0pDV1oxYm1OMGFXOXVLQ0JrWldaaGRXeDBSWGgwY21Fc0lHWjFibU5PWVcxbElDa2dld29LQ1Frdkx5Qk5ZWEpuYVc0Z2FYTWdiMjVzZVNCbWIzSWdiM1YwWlhKSVpXbG5hSFFzSUc5MWRHVnlWMmxrZEdnS0NRbHFVWFZsY25rdVptNWJJR1oxYm1OT1lXMWxJRjBnUFNCbWRXNWpkR2x2YmlnZ2JXRnlaMmx1TENCMllXeDFaU0FwSUhzS0NRa0pkbUZ5SUdOb1lXbHVZV0pzWlNBOUlHRnlaM1Z0Wlc1MGN5NXNaVzVuZEdnZ0ppWWdLQ0JrWldaaGRXeDBSWGgwY21FZ2ZId2dkSGx3Wlc5bUlHMWhjbWRwYmlBaFBUMGdJbUp2YjJ4bFlXNGlJQ2tzQ2drSkNRbGxlSFJ5WVNBOUlHUmxabUYxYkhSRmVIUnlZU0I4ZkNBb0lHMWhjbWRwYmlBOVBUMGdkSEoxWlNCOGZDQjJZV3gxWlNBOVBUMGdkSEoxWlNBL0lDSnRZWEpuYVc0aUlEb2dJbUp2Y21SbGNpSWdLVHNLQ2drSkNYSmxkSFZ5YmlCaFkyTmxjM01vSUhSb2FYTXNJR1oxYm1OMGFXOXVLQ0JsYkdWdExDQjBlWEJsTENCMllXeDFaU0FwSUhzS0NRa0pDWFpoY2lCa2IyTTdDZ29KQ1FrSmFXWWdLQ0JwYzFkcGJtUnZkeWdnWld4bGJTQXBJQ2tnZXdvS0NRa0pDUWt2THlBa0tDQjNhVzVrYjNjZ0tTNXZkWFJsY2xkcFpIUm9MMGhsYVdkb2RDQnlaWFIxY200Z2R5OW9JR2x1WTJ4MVpHbHVaeUJ6WTNKdmJHeGlZWEp6SUNobmFDMHhOekk1S1FvSkNRa0pDWEpsZEhWeWJpQm1kVzVqVG1GdFpTNXBibVJsZUU5bUtDQWliM1YwWlhJaUlDa2dQVDA5SURBZ1B3b0pDUWtKQ1FsbGJHVnRXeUFpYVc1dVpYSWlJQ3NnYm1GdFpTQmRJRG9LQ1FrSkNRa0paV3hsYlM1a2IyTjFiV1Z1ZEM1a2IyTjFiV1Z1ZEVWc1pXMWxiblJiSUNKamJHbGxiblFpSUNzZ2JtRnRaU0JkT3dvSkNRa0pmUW9LQ1FrSkNTOHZJRWRsZENCa2IyTjFiV1Z1ZENCM2FXUjBhQ0J2Y2lCb1pXbG5hSFFLQ1FrSkNXbG1JQ2dnWld4bGJTNXViMlJsVkhsd1pTQTlQVDBnT1NBcElIc0tDUWtKQ1Fsa2IyTWdQU0JsYkdWdExtUnZZM1Z0Wlc1MFJXeGxiV1Z1ZERzS0Nna0pDUWtKTHk4Z1JXbDBhR1Z5SUhOamNtOXNiRnRYYVdSMGFDOUlaV2xuYUhSZElHOXlJRzltWm5ObGRGdFhhV1IwYUM5SVpXbG5hSFJkSUc5eUlHTnNhV1Z1ZEZ0WGFXUjBhQzlJWldsbmFIUmRMQW9KQ1FrSkNTOHZJSGRvYVdOb1pYWmxjaUJwY3lCbmNtVmhkR1Z6ZEFvSkNRa0pDWEpsZEhWeWJpQk5ZWFJvTG0xaGVDZ0tDUWtKQ1FrSlpXeGxiUzVpYjJSNVd5QWljMk55YjJ4c0lpQXJJRzVoYldVZ1hTd2daRzlqV3lBaWMyTnliMnhzSWlBcklHNWhiV1VnWFN3S0NRa0pDUWtKWld4bGJTNWliMlI1V3lBaWIyWm1jMlYwSWlBcklHNWhiV1VnWFN3Z1pHOWpXeUFpYjJabWMyVjBJaUFySUc1aGJXVWdYU3dLQ1FrSkNRa0paRzlqV3lBaVkyeHBaVzUwSWlBcklHNWhiV1VnWFFvSkNRa0pDU2s3Q2drSkNRbDlDZ29KQ1FrSmNtVjBkWEp1SUhaaGJIVmxJRDA5UFNCMWJtUmxabWx1WldRZ1B3b0tDUWtKQ1Frdkx5QkhaWFFnZDJsa2RHZ2diM0lnYUdWcFoyaDBJRzl1SUhSb1pTQmxiR1Z0Wlc1MExDQnlaWEYxWlhOMGFXNW5JR0oxZENCdWIzUWdabTl5WTJsdVp5QndZWEp6WlVac2IyRjBDZ2tKQ1FrSmFsRjFaWEo1TG1OemN5Z2daV3hsYlN3Z2RIbHdaU3dnWlhoMGNtRWdLU0E2Q2dvSkNRa0pDUzh2SUZObGRDQjNhV1IwYUNCdmNpQm9aV2xuYUhRZ2IyNGdkR2hsSUdWc1pXMWxiblFLQ1FrSkNRbHFVWFZsY25rdWMzUjViR1VvSUdWc1pXMHNJSFI1Y0dVc0lIWmhiSFZsTENCbGVIUnlZU0FwT3dvSkNRbDlMQ0IwZVhCbExDQmphR0ZwYm1GaWJHVWdQeUJ0WVhKbmFXNGdPaUIxYm1SbFptbHVaV1FzSUdOb1lXbHVZV0pzWlNBcE93b0pDWDA3Q2dsOUlDazdDbjBnS1RzS0NncHFVWFZsY25rdVpXRmphQ2dnS0NBaVlteDFjaUJtYjJOMWN5Qm1iMk4xYzJsdUlHWnZZM1Z6YjNWMElISmxjMmw2WlNCelkzSnZiR3dnWTJ4cFkyc2daR0pzWTJ4cFkyc2dJaUFyQ2draWJXOTFjMlZrYjNkdUlHMXZkWE5sZFhBZ2JXOTFjMlZ0YjNabElHMXZkWE5sYjNabGNpQnRiM1Z6Wlc5MWRDQnRiM1Z6WldWdWRHVnlJRzF2ZFhObGJHVmhkbVVnSWlBckNna2lZMmhoYm1kbElITmxiR1ZqZENCemRXSnRhWFFnYTJWNVpHOTNiaUJyWlhsd2NtVnpjeUJyWlhsMWNDQmpiMjUwWlhoMGJXVnVkU0lnS1M1emNHeHBkQ2dnSWlBaUlDa3NDZ2xtZFc1amRHbHZiaWdnYVN3Z2JtRnRaU0FwSUhzS0Nna3ZMeUJJWVc1a2JHVWdaWFpsYm5RZ1ltbHVaR2x1WndvSmFsRjFaWEo1TG1adVd5QnVZVzFsSUYwZ1BTQm1kVzVqZEdsdmJpZ2daR0YwWVN3Z1ptNGdLU0I3Q2drSmNtVjBkWEp1SUdGeVozVnRaVzUwY3k1c1pXNW5kR2dnUGlBd0lEOEtDUWtKZEdocGN5NXZiaWdnYm1GdFpTd2diblZzYkN3Z1pHRjBZU3dnWm00Z0tTQTZDZ2tKQ1hSb2FYTXVkSEpwWjJkbGNpZ2dibUZ0WlNBcE93b0pmVHNLZlNBcE93b0thbEYxWlhKNUxtWnVMbVY0ZEdWdVpDZ2dld29KYUc5MlpYSTZJR1oxYm1OMGFXOXVLQ0JtYms5MlpYSXNJR1p1VDNWMElDa2dld29KQ1hKbGRIVnliaUIwYUdsekxtMXZkWE5sWlc1MFpYSW9JR1p1VDNabGNpQXBMbTF2ZFhObGJHVmhkbVVvSUdadVQzVjBJSHg4SUdadVQzWmxjaUFwT3dvSmZRcDlJQ2s3Q2dvS0NncHFVWFZsY25rdVptNHVaWGgwWlc1a0tDQjdDZ29KWW1sdVpEb2dablZ1WTNScGIyNG9JSFI1Y0dWekxDQmtZWFJoTENCbWJpQXBJSHNLQ1FseVpYUjFjbTRnZEdocGN5NXZiaWdnZEhsd1pYTXNJRzUxYkd3c0lHUmhkR0VzSUdadUlDazdDZ2w5TEFvSmRXNWlhVzVrT2lCbWRXNWpkR2x2YmlnZ2RIbHdaWE1zSUdadUlDa2dld29KQ1hKbGRIVnliaUIwYUdsekxtOW1aaWdnZEhsd1pYTXNJRzUxYkd3c0lHWnVJQ2s3Q2dsOUxBb0tDV1JsYkdWbllYUmxPaUJtZFc1amRHbHZiaWdnYzJWc1pXTjBiM0lzSUhSNWNHVnpMQ0JrWVhSaExDQm1iaUFwSUhzS0NRbHlaWFIxY200Z2RHaHBjeTV2YmlnZ2RIbHdaWE1zSUhObGJHVmpkRzl5TENCa1lYUmhMQ0JtYmlBcE93b0pmU3dLQ1hWdVpHVnNaV2RoZEdVNklHWjFibU4wYVc5dUtDQnpaV3hsWTNSdmNpd2dkSGx3WlhNc0lHWnVJQ2tnZXdvS0NRa3ZMeUFvSUc1aGJXVnpjR0ZqWlNBcElHOXlJQ2dnYzJWc1pXTjBiM0lzSUhSNWNHVnpJRnNzSUdadVhTQXBDZ2tKY21WMGRYSnVJR0Z5WjNWdFpXNTBjeTVzWlc1bmRHZ2dQVDA5SURFZ1B3b0pDUWwwYUdsekxtOW1aaWdnYzJWc1pXTjBiM0lzSUNJcUtpSWdLU0E2Q2drSkNYUm9hWE11YjJabUtDQjBlWEJsY3l3Z2MyVnNaV04wYjNJZ2ZId2dJaW9xSWl3Z1ptNGdLVHNLQ1gwS2ZTQXBPd29LTHk4Z1FtbHVaQ0JoSUdaMWJtTjBhVzl1SUhSdklHRWdZMjl1ZEdWNGRDd2diM0IwYVc5dVlXeHNlU0J3WVhKMGFXRnNiSGtnWVhCd2JIbHBibWNnWVc1NUNpOHZJR0Z5WjNWdFpXNTBjeTRLTHk4Z2FsRjFaWEo1TG5CeWIzaDVJR2x6SUdSbGNISmxZMkYwWldRZ2RHOGdjSEp2Ylc5MFpTQnpkR0Z1WkdGeVpITWdLSE53WldOcFptbGpZV3hzZVNCR2RXNWpkR2x2YmlOaWFXNWtLUW92THlCSWIzZGxkbVZ5TENCcGRDQnBjeUJ1YjNRZ2MyeGhkR1ZrSUdadmNpQnlaVzF2ZG1Gc0lHRnVlU0IwYVcxbElITnZiMjRLYWxGMVpYSjVMbkJ5YjNoNUlEMGdablZ1WTNScGIyNG9JR1p1TENCamIyNTBaWGgwSUNrZ2V3b0pkbUZ5SUhSdGNDd2dZWEpuY3l3Z2NISnZlSGs3Q2dvSmFXWWdLQ0IwZVhCbGIyWWdZMjl1ZEdWNGRDQTlQVDBnSW5OMGNtbHVaeUlnS1NCN0Nna0pkRzF3SUQwZ1ptNWJJR052Ym5SbGVIUWdYVHNLQ1FsamIyNTBaWGgwSUQwZ1ptNDdDZ2tKWm00Z1BTQjBiWEE3Q2dsOUNnb0pMeThnVVhWcFkyc2dZMmhsWTJzZ2RHOGdaR1YwWlhKdGFXNWxJR2xtSUhSaGNtZGxkQ0JwY3lCallXeHNZV0pzWlN3Z2FXNGdkR2hsSUhOd1pXTUtDUzh2SUhSb2FYTWdkR2h5YjNkeklHRWdWSGx3WlVWeWNtOXlMQ0JpZFhRZ2QyVWdkMmxzYkNCcWRYTjBJSEpsZEhWeWJpQjFibVJsWm1sdVpXUXVDZ2xwWmlBb0lDRnBjMFoxYm1OMGFXOXVLQ0JtYmlBcElDa2dld29KQ1hKbGRIVnliaUIxYm1SbFptbHVaV1E3Q2dsOUNnb0pMeThnVTJsdGRXeGhkR1ZrSUdKcGJtUUtDV0Z5WjNNZ1BTQnpiR2xqWlM1allXeHNLQ0JoY21kMWJXVnVkSE1zSURJZ0tUc0tDWEJ5YjNoNUlEMGdablZ1WTNScGIyNG9LU0I3Q2drSmNtVjBkWEp1SUdadUxtRndjR3g1S0NCamIyNTBaWGgwSUh4OElIUm9hWE1zSUdGeVozTXVZMjl1WTJGMEtDQnpiR2xqWlM1allXeHNLQ0JoY21kMWJXVnVkSE1nS1NBcElDazdDZ2w5T3dvS0NTOHZJRk5sZENCMGFHVWdaM1ZwWkNCdlppQjFibWx4ZFdVZ2FHRnVaR3hsY2lCMGJ5QjBhR1VnYzJGdFpTQnZaaUJ2Y21sbmFXNWhiQ0JvWVc1a2JHVnlMQ0J6YnlCcGRDQmpZVzRnWW1VZ2NtVnRiM1psWkFvSmNISnZlSGt1WjNWcFpDQTlJR1p1TG1kMWFXUWdQU0JtYmk1bmRXbGtJSHg4SUdwUmRXVnllUzVuZFdsa0t5czdDZ29KY21WMGRYSnVJSEJ5YjNoNU93cDlPd29LYWxGMVpYSjVMbWh2YkdSU1pXRmtlU0E5SUdaMWJtTjBhVzl1S0NCb2IyeGtJQ2tnZXdvSmFXWWdLQ0JvYjJ4a0lDa2dld29KQ1dwUmRXVnllUzV5WldGa2VWZGhhWFFyS3pzS0NYMGdaV3h6WlNCN0Nna0phbEYxWlhKNUxuSmxZV1I1S0NCMGNuVmxJQ2s3Q2dsOUNuMDdDbXBSZFdWeWVTNXBjMEZ5Y21GNUlEMGdRWEp5WVhrdWFYTkJjbkpoZVRzS2FsRjFaWEo1TG5CaGNuTmxTbE5QVGlBOUlFcFRUMDR1Y0dGeWMyVTdDbXBSZFdWeWVTNXViMlJsVG1GdFpTQTlJRzV2WkdWT1lXMWxPd3BxVVhWbGNua3VhWE5HZFc1amRHbHZiaUE5SUdselJuVnVZM1JwYjI0N0NtcFJkV1Z5ZVM1cGMxZHBibVJ2ZHlBOUlHbHpWMmx1Wkc5M093cHFVWFZsY25rdVkyRnRaV3hEWVhObElEMGdZMkZ0Wld4RFlYTmxPd3BxVVhWbGNua3VkSGx3WlNBOUlIUnZWSGx3WlRzS0NtcFJkV1Z5ZVM1dWIzY2dQU0JFWVhSbExtNXZkenNLQ21wUmRXVnllUzVwYzA1MWJXVnlhV01nUFNCbWRXNWpkR2x2YmlnZ2IySnFJQ2tnZXdvS0NTOHZJRUZ6SUc5bUlHcFJkV1Z5ZVNBekxqQXNJR2x6VG5WdFpYSnBZeUJwY3lCc2FXMXBkR1ZrSUhSdkNna3ZMeUJ6ZEhKcGJtZHpJR0Z1WkNCdWRXMWlaWEp6SUNod2NtbHRhWFJwZG1WeklHOXlJRzlpYW1WamRITXBDZ2t2THlCMGFHRjBJR05oYmlCaVpTQmpiMlZ5WTJWa0lIUnZJR1pwYm1sMFpTQnVkVzFpWlhKeklDaG5hQzB5TmpZeUtRb0pkbUZ5SUhSNWNHVWdQU0JxVVhWbGNua3VkSGx3WlNnZ2IySnFJQ2s3Q2dseVpYUjFjbTRnS0NCMGVYQmxJRDA5UFNBaWJuVnRZbVZ5SWlCOGZDQjBlWEJsSUQwOVBTQWljM1J5YVc1bklpQXBJQ1ltQ2dvSkNTOHZJSEJoY25ObFJteHZZWFFnVG1GT2N5QnVkVzFsY21sakxXTmhjM1FnWm1Gc2MyVWdjRzl6YVhScGRtVnpJQ2dpSWlrS0NRa3ZMeUF1TGk1aWRYUWdiV2x6YVc1MFpYSndjbVYwY3lCc1pXRmthVzVuTFc1MWJXSmxjaUJ6ZEhKcGJtZHpMQ0J3WVhKMGFXTjFiR0Z5YkhrZ2FHVjRJR3hwZEdWeVlXeHpJQ2dpTUhndUxpNGlLUW9KQ1M4dklITjFZblJ5WVdOMGFXOXVJR1p2Y21ObGN5QnBibVpwYm1sMGFXVnpJSFJ2SUU1aFRnb0pDU0ZwYzA1aFRpZ2diMkpxSUMwZ2NHRnljMlZHYkc5aGRDZ2diMkpxSUNrZ0tUc0tmVHNLQ2dvS0NpOHZJRkpsWjJsemRHVnlJR0Z6SUdFZ2JtRnRaV1FnUVUxRUlHMXZaSFZzWlN3Z2MybHVZMlVnYWxGMVpYSjVJR05oYmlCaVpTQmpiMjVqWVhSbGJtRjBaV1FnZDJsMGFDQnZkR2hsY2dvdkx5Qm1hV3hsY3lCMGFHRjBJRzFoZVNCMWMyVWdaR1ZtYVc1bExDQmlkWFFnYm05MElIWnBZU0JoSUhCeWIzQmxjaUJqYjI1allYUmxibUYwYVc5dUlITmpjbWx3ZENCMGFHRjBDaTh2SUhWdVpHVnljM1JoYm1SeklHRnViMjU1Ylc5MWN5QkJUVVFnYlc5a2RXeGxjeTRnUVNCdVlXMWxaQ0JCVFVRZ2FYTWdjMkZtWlhOMElHRnVaQ0J0YjNOMElISnZZblZ6ZEFvdkx5QjNZWGtnZEc4Z2NtVm5hWE4wWlhJdUlFeHZkMlZ5WTJGelpTQnFjWFZsY25rZ2FYTWdkWE5sWkNCaVpXTmhkWE5sSUVGTlJDQnRiMlIxYkdVZ2JtRnRaWE1nWVhKbENpOHZJR1JsY21sMlpXUWdabkp2YlNCbWFXeGxJRzVoYldWekxDQmhibVFnYWxGMVpYSjVJR2x6SUc1dmNtMWhiR3g1SUdSbGJHbDJaWEpsWkNCcGJpQmhJR3h2ZDJWeVkyRnpaUW92THlCbWFXeGxJRzVoYldVdUlFUnZJSFJvYVhNZ1lXWjBaWElnWTNKbFlYUnBibWNnZEdobElHZHNiMkpoYkNCemJ5QjBhR0YwSUdsbUlHRnVJRUZOUkNCdGIyUjFiR1VnZDJGdWRITUtMeThnZEc4Z1kyRnNiQ0J1YjBOdmJtWnNhV04wSUhSdklHaHBaR1VnZEdocGN5QjJaWEp6YVc5dUlHOW1JR3BSZFdWeWVTd2dhWFFnZDJsc2JDQjNiM0pyTGdvS0x5OGdUbTkwWlNCMGFHRjBJR1p2Y2lCdFlYaHBiWFZ0SUhCdmNuUmhZbWxzYVhSNUxDQnNhV0p5WVhKcFpYTWdkR2hoZENCaGNtVWdibTkwSUdwUmRXVnllU0J6YUc5MWJHUUtMeThnWkdWamJHRnlaU0IwYUdWdGMyVnNkbVZ6SUdGeklHRnViMjU1Ylc5MWN5QnRiMlIxYkdWekxDQmhibVFnWVhadmFXUWdjMlYwZEdsdVp5QmhJR2RzYjJKaGJDQnBaaUJoYmdvdkx5QkJUVVFnYkc5aFpHVnlJR2x6SUhCeVpYTmxiblF1SUdwUmRXVnllU0JwY3lCaElITndaV05wWVd3Z1kyRnpaUzRnUm05eUlHMXZjbVVnYVc1bWIzSnRZWFJwYjI0c0lITmxaUW92THlCb2RIUndjem92TDJkcGRHaDFZaTVqYjIwdmFuSmlkWEpyWlM5eVpYRjFhWEpsYW5NdmQybHJhUzlWY0dSaGRHbHVaeTFsZUdsemRHbHVaeTFzYVdKeVlYSnBaWE1qZDJscmFTMWhibTl1Q2dwcFppQW9JSFI1Y0dWdlppQmtaV1pwYm1VZ1BUMDlJQ0ptZFc1amRHbHZiaUlnSmlZZ1pHVm1hVzVsTG1GdFpDQXBJSHNLQ1dSbFptbHVaU2dnSW1weGRXVnllU0lzSUZ0ZExDQm1kVzVqZEdsdmJpZ3BJSHNLQ1FseVpYUjFjbTRnYWxGMVpYSjVPd29KZlNBcE93cDlDZ29LQ2dwMllYSUtDZ2t2THlCTllYQWdiM1psY2lCcVVYVmxjbmtnYVc0Z1kyRnpaU0J2WmlCdmRtVnlkM0pwZEdVS0NWOXFVWFZsY25rZ1BTQjNhVzVrYjNjdWFsRjFaWEo1TEFvS0NTOHZJRTFoY0NCdmRtVnlJSFJvWlNBa0lHbHVJR05oYzJVZ2IyWWdiM1psY25keWFYUmxDZ2xmSkNBOUlIZHBibVJ2ZHk0a093b0thbEYxWlhKNUxtNXZRMjl1Wm14cFkzUWdQU0JtZFc1amRHbHZiaWdnWkdWbGNDQXBJSHNLQ1dsbUlDZ2dkMmx1Wkc5M0xpUWdQVDA5SUdwUmRXVnllU0FwSUhzS0NRbDNhVzVrYjNjdUpDQTlJRjhrT3dvSmZRb0tDV2xtSUNnZ1pHVmxjQ0FtSmlCM2FXNWtiM2N1YWxGMVpYSjVJRDA5UFNCcVVYVmxjbmtnS1NCN0Nna0pkMmx1Wkc5M0xtcFJkV1Z5ZVNBOUlGOXFVWFZsY25rN0NnbDlDZ29KY21WMGRYSnVJR3BSZFdWeWVUc0tmVHNLQ2k4dklFVjRjRzl6WlNCcVVYVmxjbmtnWVc1a0lDUWdhV1JsYm5ScFptbGxjbk1zSUdWMlpXNGdhVzRnUVUxRUNpOHZJQ2dqTnpFd01pTmpiMjF0Wlc1ME9qRXdMQ0JvZEhSd2N6b3ZMMmRwZEdoMVlpNWpiMjB2YW5GMVpYSjVMMnB4ZFdWeWVTOXdkV3hzTHpVMU55a0tMeThnWVc1a0lFTnZiVzF2YmtwVElHWnZjaUJpY205M2MyVnlJR1Z0ZFd4aGRHOXljeUFvSXpFek5UWTJLUXBwWmlBb0lDRnViMGRzYjJKaGJDQXBJSHNLQ1hkcGJtUnZkeTVxVVhWbGNua2dQU0IzYVc1a2IzY3VKQ0E5SUdwUmRXVnllVHNLZlFvS0Nnb0tjbVYwZFhKdUlHcFJkV1Z5ZVRzS2ZTQXBPd289IiA+CgoJCQk8L3NjcmlwdD4KPCEtLQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ianMvY3VzdG9tLmpzIj48L3NjcmlwdD4gLS0+CjwhLS0JCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImpzL2N1c3RvbS5qcyI+PC9zY3JpcHQ+IC0tPgoKCgkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCQkkKGZ1bmN0aW9uKCkgewovLyBncmFiIHRoZSBmaWxlIGlucHV0IGFuZCBiaW5kIGEgY2hhbmdlIGV2ZW50IG9udG8gaXQKCQkJCSQoJyNmaWxlJykuYmluZCgiY2hhbmdlIiwgZnVuY3Rpb24oKSB7Ci8vIG5ldyBodG1sNSBmb3JtZGF0YSBvYmplY3QuCgkJCQkJdmFyIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci8vIGZvciBlYWNoIGVudHJ5LCBhZGQgdG8gZm9ybWRhdGEgdG8gbGF0ZXIgYWNjZXNzIHZpYSAkX0ZJTEVTWyJmaWxlIiArIGldCgkJCQkJZm9yICh2YXIgaSA9IDAsIGxlbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlJykuZmlsZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKCQkJCQkJZm9ybURhdGEuYXBwZW5kKCJmaWxlIiArIGksIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlJykuZmlsZXNbaV0pOwoJCQkJCQl9CiAKLy9zZW5kIGZvcm1kYXRhIHRvIHNlcnZlci1zaWRlCgkJCQkJJC5hamF4KHsKLy8JCQkJCQl1cmw6ICJmaWxlLXVwbG9hZC5waHAiLCAvLyBvdXIgcGhwIGZpbGUKLy8JCQkJCQl1cmw6ICJpbmRleF9maWxldXBsb2FkLnBocCIsIC8vIG91ciBwaHAgZmlsZQovLwkJCQkJCW51cmw6ICJodHRwOi8va2ExLnBocD9xPXVwIiwgLy8gb3VyIHBocCBmaWxlCi8vCQkJCQkJdXJsOiAiLi9rdXAucGhwIiwgLy8gb3VyIHBocCBmaWxlCi8vCQkJCQkJdXJsOiAiLi9pbmRleF91cC5waHAiLCAvLyBvdXIgcGhwIGZpbGUKLy8JCQkJCQl1cmw6ICIuL2thMS5waHA/cT1rdXAiLCAvLyBvdXIgcGhwIGZpbGUKLy8JCQkJCQl1cmw6ICIuL2tvMC5waHA/cT1rdXAiLCAvLyBvdXIgcGhwIGZpbGUKLy8JCQkJCQl1cmw6ICIuL2tvMS5waHA/cT1rdXAiLCAvLyBvdXIgcGhwIGZpbGUKCQkJCQkJdXJsOiAiLi9rbzIucGhwP3E9a3VwIiwgLy8gb3VyIHBocCBmaWxlCi8vIGJ1Z3MJCQkJCQl1cmw6ICIxMC4wLjAuMTEyOi9rYTEucGhwP3E9dXAiLCAvLyBvdXIgcGhwIGZpbGUKCQkJCQkJdHlwZTogJ3Bvc3QnLAoJCQkJCQlkYXRhOiBmb3JtRGF0YSwKCQkJCQkJZGF0YVR5cGU6ICdodG1sJywgLy8gd2UgcmV0dXJuIGh0bWwgZnJvbSBvdXIgcGhwIGZpbGUKCQkJCQkJYXN5bmM6IHRydWUsCgkJCQkJCXByb2Nlc3NEYXRhOiBmYWxzZSwgIC8vIHRlbGwgalF1ZXJ5IG5vdCB0byBwcm9jZXNzIHRoZSBkYXRhCgkJCQkJCWNvbnRlbnRUeXBlOiBmYWxzZSwgICAvLyB0ZWxsIGpRdWVyeSBub3QgdG8gc2V0IGNvbnRlbnRUeXBlCgkJCQkJCXN1Y2Nlc3MgOiBmdW5jdGlvbihkYXRhKSB7CgkJCQkJCQkkKCcjdXBsb2FkLXJlc3VsdCcpLmFwcGVuZCgnPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtc3VjY2VzcyI+PHA+RmlsZShzKSB1cGxvYWRlZCBzdWNjZXNzZnVsbHkhPC9wPjxiciAvPicpOwoJCQkJCQkJJCgnI3VwbG9hZC1yZXN1bHQgLmFsZXJ0JykuYXBwZW5kKGRhdGEpOwoJCQkJCQkJfSwKCQkJCQkJZXJyb3IgOiBmdW5jdGlvbihyZXF1ZXN0KSB7CgkJCQkJCQljb25zb2xlLmxvZyhyZXF1ZXN0LnJlc3BvbnNlVGV4dCk7CgkJCQkJCQl9CgkJCQkJCX0pOwoJCQkJCX0pOwoJCQkJfSk7CgkJCTwvc2NyaXB0PgoKCTxociBjb2xvcj13aGl0ZT4KCTxociBjb2xvcj1ibGFjaz4KCTxkaXYgaWQ9J2VkaXRhYmxlRGl2JyBjb250ZW50ZWRpdGFibGU9J3RydWUnPnBhc3RlPC9kaXY+Cgk8aHIgY29sb3I9YmxhY2s+Cgk8aHIgY29sb3I9d2hpdGU+Cgk8aHIgY29sb3I9YmxhY2s+Cgk8ZGl2IGlkPSdkaXYnIGNvbnRlbnRlZGl0YWJsZT0ndHJ1ZSc+ZmZwYXN0ZTwvZGl2PgoJPGhyIGNvbG9yPWJsYWNrPgoJPGhyIGNvbG9yPXdoaXRlPgoKCTxzY3JpcHQgaWQ9InNjcmlwdF9jbGlwYm9hcmQiID4KCQlmdW5jdGlvbiBoYW5kbGVQYXN0ZSAoZSkgewoJCQl2YXIgY2xpcGJvYXJkRGF0YSwgcGFzdGVkRGF0YTsKCi8vIFN0b3AgZGF0YSBhY3R1YWxseSBiZWluZyBwYXN0ZWQgaW50byBkaXYKCQkJZS5zdG9wUHJvcGFnYXRpb24oKTsKCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoKLy8gR2V0IHBhc3RlZCBkYXRhIHZpYSBjbGlwYm9hcmQgQVBJCgkJCWNsaXBib2FyZERhdGEgPSBlLmNsaXBib2FyZERhdGEgfHwgd2luZG93LmNsaXBib2FyZERhdGE7CgkJCXBhc3RlZERhdGEgPSBjbGlwYm9hcmREYXRhLmdldERhdGEoJ1RleHQnKTsKCi8vIERvIHdoYXRldmVyIHdpdGggcGFzdGVkZGF0YQoJCQlhbGVydChwYXN0ZWREYXRhKTsKCQkJfQoKCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdGFibGVEaXYnKS5hZGRFdmVudExpc3RlbmVyKCdwYXN0ZScsIGhhbmRsZVBhc3RlKTsKCQk8L3NjcmlwdD4KCgoJPHNjcmlwdCBpZD0ic2NyaXB0X2NsaXBib2FyZF9mZiIgPgoJCWZ1bmN0aW9uIGhhbmRsZXBhc3RlX2ZmIChlKSB7CgkJCXZhciB0eXBlcywgcGFzdGVkRGF0YSwgc2F2ZWRDb250ZW50OwoKLy8gQnJvd3NlcnMgdGhhdCBzdXBwb3J0IHRoZSAndGV4dC9odG1sJyB0eXBlIGluIHRoZSBDbGlwYm9hcmQgQVBJIChDaHJvbWUsIEZpcmVmb3ggMjIrKQoJCQlpZiAoZSAmJiBlLmNsaXBib2FyZERhdGEgJiYgZS5jbGlwYm9hcmREYXRhLnR5cGVzICYmIGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKSB7CgovLyBDaGVjayBmb3IgJ3RleHQvaHRtbCcgaW4gdHlwZXMgbGlzdC4gU2VlIGFibGlnaCdzIGFuc3dlciBiZWxvdyBmb3IgZGVhdGlscyBvbgovLyB3aHkgdGhlIERPTVN0cmluZ0xpc3QgYml0IGlzIG5lZWRlZC4gV2UgY2Fubm90IGZhbGwgYmFjayB0byAndGV4dC9wbGFpbicgYXMKLy8gU2FmYXJpL0VkZ2UgZG9uJ3QgYWR2ZXJ0aXNlIEhUTUwgZGF0YSBldmVuIGlmIGl0IGlzIGF2YWlsYWJsZQoJCQkJdHlwZXMgPSBlLmNsaXBib2FyZERhdGEudHlwZXM7CgkJCQlpZiAoKCh0eXBlcyBpbnN0YW5jZW9mIERPTVN0cmluZ0xpc3QpICYmIHR5cGVzLmNvbnRhaW5zKCJ0ZXh0L2h0bWwiKSkgfHwgKHR5cGVzLmluZGV4T2YgJiYgdHlwZXMuaW5kZXhPZigndGV4dC9odG1sJykgIT09IC0xKSkgewoKLy8gRXh0cmFjdCBkYXRhIGFuZCBwYXNzIGl0IHRvIGNhbGxiYWNrCgkJCQkJcGFzdGVkRGF0YSA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0L2h0bWwnKTsKLy8JCQkJCXByb2Nlc3NQYXN0ZShlZGl0YWJsZURpdiwgcGFzdGVkRGF0YSk7CgkJCQkJcHJvY2Vzc1Bhc3RlX2ZmKGVkaXRhYmxlRGl2LCBwYXN0ZWREYXRhKTsKCi8vIFN0b3AgdGhlIGRhdGEgZnJvbSBhY3R1YWxseSBiZWluZyBwYXN0ZWQKCQkJCQllLnN0b3BQcm9wYWdhdGlvbigpOwoJCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkJfQoKLy8gRXZlcnl0aGluZyBlbHNlOiBNb3ZlIGV4aXN0aW5nIGVsZW1lbnQgY29udGVudHMgdG8gYSBEb2N1bWVudEZyYWdtZW50IGZvciBzYWZla2VlcGluZwoJCQlzYXZlZENvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CgkJCXdoaWxlKGVkaXRhYmxlRGl2LmNoaWxkTm9kZXMubGVuZ3RoID4gMCkgewoJCQkJc2F2ZWRDb250ZW50LmFwcGVuZENoaWxkKGVkaXRhYmxlRGl2LmNoaWxkTm9kZXNbMF0pOwoJCQkJfQoKLy8gVGhlbiB3YWl0IGZvciBicm93c2VyIHRvIHBhc3RlIGNvbnRlbnQgaW50byBpdCBhbmQgY2xlYW51cAoJCQl3YWl0Rm9yUGFzdGVkRGF0YShlZGl0YWJsZURpdiwgc2F2ZWRDb250ZW50KTsKCQkJcmV0dXJuIHRydWU7CgkJCX0KCgkJZnVuY3Rpb24gd2FpdEZvclBhc3RlZERhdGEgKGVsZW0sIHNhdmVkQ29udGVudCkgewoKLy8gSWYgZGF0YSBoYXMgYmVlbiBwcm9jZXNzZXMgYnkgYnJvd3NlciwgcHJvY2VzcyBpdAoJCQlpZiAoZWxlbS5jaGlsZE5vZGVzICYmIGVsZW0uY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7CgovLyBSZXRyaWV2ZSBwYXN0ZWQgY29udGVudCB2aWEgaW5uZXJIVE1MCi8vIChBbHRlcm5hdGl2ZWx5IGxvb3AgdGhyb3VnaCBlbGVtLmNoaWxkTm9kZXMgb3IgZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSBoZXJlKQoJCQkJdmFyIHBhc3RlZERhdGEgPSBlbGVtLmlubmVySFRNTDsKCi8vIFJlc3RvcmUgc2F2ZWQgY29udGVudAoJCQkJZWxlbS5pbm5lckhUTUwgPSAiIjsKCQkJCWVsZW0uYXBwZW5kQ2hpbGQoc2F2ZWRDb250ZW50KTsKCi8vIENhbGwgY2FsbGJhY2sKCQkJCXByb2Nlc3NQYXN0ZV9mZihlbGVtLCBwYXN0ZWREYXRhKTsKCQkJCX0KCi8vIEVsc2Ugd2FpdCAyMG1zIGFuZCB0cnkgYWdhaW4KCQkJZWxzZSB7CgkJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKCQkJCQl3YWl0Rm9yUGFzdGVkRGF0YShlbGVtLCBzYXZlZENvbnRlbnQpCgkJCQkJfSwgMjApOwoJCQkJfQoJCQl9CgoJCWZ1bmN0aW9uIHByb2Nlc3NQYXN0ZV9mZiAoZWxlbSwgcGFzdGVkRGF0YSkgewovLyBEbyB3aGF0ZXZlciB3aXRoIGdhdGhlcmVkIGRhdGE7CgkJCWFsZXJ0KHBhc3RlZERhdGEpOwoJCQllbGVtLmZvY3VzKCk7CgkJCX0KCi8vIE1vZGVybiBicm93c2Vycy4gTm90ZTogM3JkIGFyZ3VtZW50IGlzIHJlcXVpcmVkIGZvciBGaXJlZm94IDw9IDYKCQlpZiAoZWRpdGFibGVEaXYuYWRkRXZlbnRMaXN0ZW5lcikgewoJCQllZGl0YWJsZURpdi5hZGRFdmVudExpc3RlbmVyKCdwYXN0ZScsIGhhbmRsZXBhc3RlLCBmYWxzZSk7CgkJCX0KLy8gSUUgPD0gOAoJCWVsc2UgewoJCQllZGl0YWJsZURpdi5hdHRhY2hFdmVudCgnb25wYXN0ZScsIGhhbmRsZXBhc3RlKTsKCQkJfQoKCQkkKGRvY3VtZW50KS5vbigncGFzdGUnLCdbY29udGVudGVkaXRhYmxlXScsZnVuY3Rpb24oZSkgewoJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCXZhciB0ZXh0ID0gKGUub3JpZ2luYWxFdmVudCB8fCBlKS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQvcGxhaW4nKTsKCQkJd2luZG93LmRvY3VtZW50LmV4ZWNDb21tYW5kKCdpbnNlcnRUZXh0JywgZmFsc2UsIHRleHQpOwoJCQl9KTsKCQk8L3NjcmlwdD4KCgk8c2NyaXB0IGlkPSJzY3JpcHRfY2xpcGJvYXJkX2pza2l0IiA+CgkJZnVuY3Rpb24gZ2V0U2VsZWN0aW9uVGV4dCgpewoJCQl2YXIgc2VsZWN0ZWRUZXh0ID0gIiIKCQkJaWYgKHdpbmRvdy5nZXRTZWxlY3Rpb24peyAvLyBhbGwgbW9kZXJuIGJyb3dzZXJzIGFuZCBJRTkrCgkJCQlzZWxlY3RlZFRleHQgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkudG9TdHJpbmcoKQoJCQkJfQoJCQlyZXR1cm4gc2VsZWN0ZWRUZXh0CgkJCX0KCgoJCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBmdW5jdGlvbigpewoJCQl2YXIgdGhldGV4dCA9IGdldFNlbGVjdGlvblRleHQoKQoJCQlpZiAodGhldGV4dC5sZW5ndGggPiAwKXsgLy8gY2hlY2sgdGhlcmUncyBzb21lIHRleHQgc2VsZWN0ZWQKCQkJCWNvbnNvbGUubG9nKHRoZXRleHQpIC8vIGxvZ3Mgd2hhdGV2ZXIgdGV4dHVhbCBjb250ZW50IHRoZSB1c2VyIGhhcyBzZWxlY3RlZCBvbiB0aGUgcGFnZQoJCQkJfQoJCQl9LCBmYWxzZSkKCgkJZnVuY3Rpb24gY29weVNlbGVjdGlvblRleHQoKXsKCQkJdmFyIGNvcHlzdWNjZXNzIC8vIHZhciB0byBjaGVjayB3aGV0aGVyIGV4ZWNDb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlZAoJCQl0cnl7CgkJCQljb3B5c3VjY2VzcyA9IGRvY3VtZW50LmV4ZWNDb21tYW5kKCJjb3B5IikgLy8gcnVuIGNvbW1hbmQgdG8gY29weSBzZWxlY3RlZCB0ZXh0IHRvIGNsaXBib2FyZAogICAgCQkJCX0gCgkJCWNhdGNoKGUpewoJCQkJY29weXN1Y2Nlc3MgPSBmYWxzZQoJCQkJfQoJCQlyZXR1cm4gY29weXN1Y2Nlc3MKCQkJfQoKCQk8L3NjcmlwdD4KCgk8ZGl2IG5hbWU9ImRpdl9kZCIgaWQ9ImRpdl9kZCIgaGlkZGVuPgoJCTxkaXYgaWQ9ImRyb3AiPgoJCQk8c3BhbiBpZD0ic3ciPjxoMT5kcm9wIGp0ZmluYzwvaDI+PC9zcGFuPgoJCQk8YSBocmVmPS4va29fanRmL3ptL2p0Zl9wYXJjZWxzL2p0ZmRjX3RoZWF0ZXIuaHRtbCB0YXJnZXQ9X2JsYW5rPgoJCQkJPGltZyBoZWlnaHQ9MjAwIHdpZHRoPTMwMAoJCQkJc3JjPSIuL2tvX2p0Zi96bS9qdGZfcGFyY2Vscy9qdGZkY190aGVhdGVyL1RpbGVHcm91cDAvMC0wLTAucG5nIiBib3JkZXI9MCA+CgkJCQk8L2E+CgkJCTwvZGl2PgoKCQk8ZGl2IGlkPSJkcmFnIj4ganRmZGM6PGJyIC8+CgkJCTxpbWcgc3JjPSIuL2ltZ3MvanRmL2p0Zl90YWtlcy9qdGYyOV9lYWdsZV9ub3J0aC5wbmciIGFsdD0ianRmMjlfZWFnbGVfbm9ydGgiIHdpZHRoPSI1MCIgY2xhc3M9ImRyZyIvPgoJCgkJCTxkaXYgY2xhc3M9ImRyZyI+PGgxPmtvbmV0IGxsYyA8L2gxPgoJCQkJPHByZT50aW1lamFzayBqa3dpaTwvcHJlPgoJCQkJPGltZyBjbGFzcz0iZHJnIiBzcmM9Ii4vaW1ncy9idG4va28ucG5nIiBhbHQ9ImtvLnBuZyIgd2lkdGg9IjUwIiA+CgkJCQk8aW1nIGNsYXNzPSJkcmciIHNyYz0iLi9pbWdzL2J0bi9vay5wbmciIGFsdD0ib2sucG5nIiB3aWR0aD0iNTAiID4KCQkJCTxwcmU+dGltZXNhayBza3dpaTwvcHJlPgoJCQkJPC9kaXY+CgkKCQkJPGRpdiBjbGFzcz0iZHJnIj48aDE+anRmMjkgPC9oMT4KCQkJCTxhIGhyZWY9Li9rb19qdGYvem0vanRmX3BhcmNlbHMvanRmMjkuaHRtbCB0YXJnZXQ9X2JsYW5rPgoJCQkJCTxpbWcgaGVpZ2h0PTIwMCB3aWR0aD0xMDAgc3JjPSIuL2tvX2p0Zi96bS9qdGZfcGFyY2Vscy9qdGYyOS9UaWxlR3JvdXAwLzAtMC0wLnBuZyIgYm9yZGVyPTAgPgoJCQkJCTwvYT4KCQkJCTwvZGl2PgoJCgkKCQkJPGRpdiBjbGFzcz0iZHJnIj48aDE+ZG9naGVhZHM8L2gxPgoJCQkJPGRpdiBpZD0iZGl2X2p0Zl92aWQ1Ij4KCQkJCQk8dmlkZW8gY29udHJvbHM9ImNvbnRyb2xzX2p0ZjUiIGRlZmF1bHRtdXRlZD0iIiBtdXRlZD0idHJ1ZSIgc3R5bGU9IndpZHRoOjMyMHB4O2hlaWdodDoxODBweDsiIHBvc3Rlcj0iaW5kZXg0X21wNC5wbmciPgoJCQkJCTxzb3VyY2Ugc3JjPSIuL2tiL3YvZG9naGVhZF92aWRlby5tcDQiIHR5cGU9InZpZGVvL21wNDtjb2RlY3M9JnF1b3Q7YXZjMS40MkUwMUUsIG1wNGEuNDAuMiZxdW90OyI+CgkJCQkJPC92aWRlbz4KCQkJCQk8L2Rpdj4KCQkJCTwvZGl2PgoJCgkJCTxkaXYgY2xhc3M9ImRyZyI+PGgxPmp0ZmRjIG5pZ2h0IGNvdXJ0IGxpZ2h0cyBhY3Rpb24gMzcyMDwvaDE+CgkJCQk8ZGl2IGlkPSJkaXZfdmlkIj4KCQkJCQk8dmlkZW8gY29udHJvbHM9ImNvbnRyb2xzIiBkZWZhdWx0bXV0ZWQ9IiIgbXV0ZWQ9InRydWUiIHN0eWxlPSJ3aWR0aDozMjBweDtoZWlnaHQ6MTgwcHg7IiBwb3N0ZXI9ImluZGV4X21wNC5wbmciPgoJCQkJCQk8c291cmNlIHNyYz0iaW5kZXgxX2F2cmlsLm1wNCIgdHlwZT0idmlkZW8vbXA0O2NvZGVjcz0mcXVvdDthdmMxLjQyRTAxRSwgbXA0YS40MC4yJnF1b3Q7Ij4KCQkJCQkJPHNvdXJjZSBzcmM9ImluZGV4X2F2cmlsLndlYm0iIHR5cGU9InZpZGVvL3dlYm07Y29kZWNzPSZxdW90O3ZwOCwgdm9yYmlzJnF1b3Q7Ij4KCQkJCQkJPC92aWRlbz4KCQkJCQk8L2Rpdj4KCQkJCTwvZGl2PgoJCQk8L2Rpdj4KCQk8L2Rpdj4KCgoKCjwhLS0KCQk8aWZyYW1lIGlkPSJpZnJhbWVfZGQiIHNyYz0iLi9pbmRleF9kZC5odG1sIiB3aWR0aD0iMTAwMCIgaGVpZ2h0PSI1MDAiCiAgICAgICAgCQlmcmFtZWJvcmRlcj0iMCIgc2Nyb2xsaW5nPSJ5ZXMiPgoJCQk8L2lmcmFtZT4KCS0tPgoKCTxhIGNsYXNzPSJwb3BvdmVyIiBocmVmPSIuL2t1cC5odG1sP3E9a3VwIiB0YXJnZXQ9X2JsYW5rID4KCSAgICAgICAgPGltZyBzcmM9Ii4vaW1ncy9idG4va29leWUucG5nIiBoZWlnaHQ9IjEwMCIgd2lkdGg9IjIwMCIgYWx0PSJrb2V5ZXciID4KCSAgICAgICAgPHNwYW4+PGltZyBzcmM9Ii4vaW1ncy9hbmltL2V5ZXMva29leWVfaGFuZC5naWYiIGhlaWdodD0iMTAwIiB3aWR0aD0iMjAwIiBhbHQ9ImtvZXlldyIgPjwvc3Bhbj4KCQk8L2E+CgoJPC9ib2R5PgoJPC9odG1sPgo=";
#	$html_main_b64d = base64_decode( $html_main_b64 );
#
#	print( $html_main_b64d );
#	print( base64_decode($html_main_b64) );
#	}


function sqlq( $dbfile, $sql, $fld ) {
//	printf( "MSG_18124:  sqlq:  dbfile=[$dbfile] sql=[$sql] fld=[$fld]<br>\n" );
        $pdo = newpdo( $dbfile );
//	$sql = "select * from $tblname";
	$output = "";
        $pdo = newpdo($dbfile);
	foreach( $pdo->query($sql) as $row ) {
//		printf( "BUGS_2390:  val=[$val] fld=[$fld] row=[$row]<br>\n" );

		$val=$row[$fld];
		$output .= "$val ";
		}
	$pdo=null;
	return($output);
	}


function newpdo1( $dbfile ) {
        $php_self=$_SERVER['PHP_SELF'];
        $http_host=$_SERVER['HTTP_HOST'];
        $request_uri=$_SERVER['REQUEST_URI'];

	if( ! file_exists( $dbfile )) {
		print( "$php_self newpdo ERR_3979:  NOT_EXISTS dbfile=[$dbfile]<br>\n" );
		if( $GLOBALS['install'] != true ) {
			print( "$php_self newpdo ERR:  NOT_INSTALL dbfile=[$dbfile]<br>\n" );
			return;
			}
		else {
			print( "$php_self newpdo MSG:  CREATE dbfile=[$dbfile]<br>\n" );
			}
		}

	try {
		$pdo = null;
		$pdo = new PDO("sqlite:$dbfile" );
		$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//		$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
//		$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
		
		if( $pdo == null ) {
			print( "$php_self newpdo ERR:   dbfile=[$dbfile]<br>\n" );
			return $pdo;
			}
		return $pdo;
		}


	catch(PDOException $e ) {
		$errmsg = $e->getMessage();
		print( "$php_self newpdo ERR:  pdo=[$pdo] dbfile=[$dbfile] errmsg=[$errmsg]<br>\n" );
		$pdo = null;
		return $pdo;
		}
	}




function json1() {
// Returns: ["Apple","Banana","Pear"]
	json_encode(array("Apple", "Banana", "Pear"));
// Returns: {"4":"four","8":"eight"}
	json_encode(array(4 => "four", 8 => "eight"));
// Returns: {"apples":true,"bananas":null}
	json_encode(array("apples" => true, "bananas" => null));
	}

function json2() {
	class User {
		public $firstname = "";
		public $lastname  = "";
		public $birthdate = "";
		}

	$user = new User();
	$user->firstname = "foo";
	$user->lastname  = "bar";

// Returns: {"firstname":"foo","lastname":"bar"}
	json_encode($user);
	$user->birthdate = new DateTime();
/* Returns:
	{
		"firstname":"foo",
        	"lastname":"bar",
        	"birthdate": {
			"date":"2012-06-06 08:46:58",
			"timezone_type":3,
			"timezone":"Europe\/Berlin"
        		}
		}
*/
	json_encode($user);
	return( $user );
	}



function json3() {
	class User {
		public $pub = "Mister X.";
		protected $pro = "hidden";
		private $priv = "hidden too";

		public $func;
		public $notUsed;
		public function __construct() {
			$this->func = function() {
				return "Foo";
				};
			}
		}
	$user = new User();
// Returns: {"pub":"Mister X.","func":{},"notUsed":null}
	echo json_encode($user);
	return( json_encode($user));
	}



function jsond1() {
	$string = '{"foo": "bar", "cool": "attr"}';
	$result = json_decode($string);

// Result: object(stdClass)#1 (2) { ["foo"]=> string(3) "bar" ["cool"]=> string(4) "attr" }
	var_dump($result);

// Prints "bar"
	echo $result->foo;

// Prints "attr"
	echo $result->cool;
	return( $result->cool );
	}

function jsond2() {
	$string = '{"foo": "bar", "cool": "attr"}';
	$result = json_decode($string, true);

// Result: array(2) { ["foo"]=> string(3) "bar" ["cool"]=> string(4) "attr" }
	var_dump($result);
// Prints "bar"
	echo $result['foo'];
// Prints "attr"
	echo $result['cool'];
	return( $result['cool'] );
	}

function json_handle() {
	class JsonHandler {

		protected static $_messages = array(
			JSON_ERROR_NONE => 'No error has occurred',
			JSON_ERROR_DEPTH => 'The maximum stack depth has been exceeded',
			JSON_ERROR_STATE_MISMATCH => 'Invalid or malformed JSON',
			JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded',
			JSON_ERROR_SYNTAX => 'Syntax error',
			JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded'
			);

		public static function encode($value, $options = 0) {
			$result = json_encode($value, $options);
			if($result)  {
				return $result;
				}

			throw new RuntimeException(static::$_messages[json_last_error()]);
			}

		public static function decode($json, $assoc = false) {
			$result = json_decode($json, $assoc);
			if($result) {
				return $result;
				}

			throw new RuntimeException(static::$_messages[json_last_error()]);
			}
		}
	return($result);
	}


# index_jg.php	ko_jgrid

	main_jg();

function main_jg() {
	$query_string=$_SERVER['QUERY_STRING'];
#	print( "index_jg.php query_string=".$query_string."<br>" );
	if( $query_string == "" ) {
		$html=html_jg();
		}
	else {
		$html=html_page($query_string);
		}
	print( $html );
	}


function html_jg() {
	$html_jg  = "";
	$html_jg .= html_hdr();
	$html_jg .= html_style();
	$html_jg .= html_style_ko_input();
	$html_jg .= html_style_ko_popover();
	$html_jg .= html_style_ko_drag();

	$html_jg .= html_js_b64();
	$html_jg .= html_js_links();
	$html_jg .= html_js_ko();
	$html_jg .= html_js_html();


	$html_jg .= html_links_php();
	$html_jg .= html_links_html();
	$html_jg .= html_body();
	$html_jg .= html_ftr();

	return( $html_jg );
	}


function html_page_jg($query_string) {
	$html_jg = "";
	$html_jg .= html_hdr();
	$html_jg .= html_style();
	$html_jg .= html_js_b64();
	$html_jg .= html_js_links();
#	$q=str_replace( "q=", "", $query_string ); 
	$qq=explode( "=", $query_string ); 
	$q=$qq[1];

#	print( "$progid MGG_40 html_page q=".$q."<br>" );
	if ( $q == "sql" ) { 
		$dbfile="kups.db3";
		$sql="select * from kups";
		sqlq( $dbfile, $sql, $fld ); 
		}
	if ( $q == "sql&tbl=koye" ) { 
		$dbfile="ka1.db3";
		$sql="select * from koye";
		sqlq( $dbfile, $sql, $fld ); 
		}
	if ( $q == "jg_basic" ) { $html_jg .= jg_basic(); }
	if ( $q == "jg_batchdel" ) { $html_jg .= jg_batchdel(); }
	if ( $q == "jg_custom" ) { $html_jg .= jg_custum(); }
	if ( $q == "jg_load" ) { $html_jg .= jg_load(); }
	if ( $q == "jg_rows" ) { $html_jg .= jg_rows(); }
	if ( $q == "jg_views" ) { $html_jg .= jg_vies(); }
	if ( $q == "jg_pagers" ) { $html_jg .= jg_pagers(); }
	if ( $q == "jg_data" ) { $html_jg .= jg_data(); }
	if ( $q == "jg_simple" ) { $html_jg .= jg_basic(); }
	if ( $q == "jg_page" ) { $html_jg .= jg_basic(); }
	if ( $q == "jg_loc" ) { $html_jg .= jg_loc(); }
	if ( $q == "jg_service" ) { $html_jg .= jg_service(); }
	if ( $q == "jg_reorder" ) { $html_jg .= jg_reorder(); }
	if ( $q == "jg_sort" ) { $html_jg .= jg_sort(); }
	if ( $q == "jg_static" ) { $html_jg .= jg_static(); }
	if ( $q == "jg_valid" ) { $html_jg .= jg_valid(); }
	if ( $q == "jg_basic" ) { $html_jg .= jg_basic(); }
	$html_jg .= html_ftr();
	return( $html_jg );
	}

function html_hdr_jg() {
	$html_hdr=<<<HTML_HDR
<html>
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>index_jg 20180705_1500 jgrid - Simple jQuery DataGrid - Demos</title>
<!--    
	<link rel="stylesheet" type="text/css" href="demos.css" />
	<link href='http://fonts.googleapis.com/css?family=Open+Sans:300,600,400' rel='stylesheet' type='text/css'>
	<link rel="stylesheet" type="text/css" href="/jg/demos/demos.css" />
	-->

HTML_HDR;
	return( $html_hdr );
	}

function html_style_jg() {
	$html_style=<<<HTML_STYLE
	<link rel="stylesheet" type="text/css" href="/jg/demos/demos.css" />
HTML_STYLE;
	return( $html_style );
	}

function html_body_jg() {

	$html_body=<<<HTML_BODY

</head>
<body>
    <div class="navigation">

<!--        <h1>jgrid Demos</h1> -->


HTML_BODY;
	return($html_body );
	}

function html_links_php_jg() {
	$html_links_php=<<<HTML_LINKS_PHP
        <ul>
            <li><a href="index_jg.php?q=jg_basic" target="demo">Basic Scenario</a></li>
            <li><a href="index_jg.php?q=jg_static" target="demo">Static Data</a></li>
            <li><a href="index_jg.php?q=jg_service" target="demo">OData Service</a></li>
            <li><a href="index_jg.php?q=jg_data" target="demo">Data Manipulation</a></li>
            <li><a href="index_jg.php?q=jg_valid" target="demo">Validation</a></li>
            <li><a href="index_jg.php?q=jg_sort" target="demo">Sorting</a></li>
            <li><a href="index_jg.php?q=jg_page" target="demo">Loading by Page</a></li>
            <li><a href="index_jg.php?q=jg_view" target="demo">Custom View</a></li>
            <li><a href="index_jg.php?q=jg_rows" target="demo">Custom Row Renderer</a></li>
            <li><a href="index_jg.php?q=jg_pager" target="demo">External Pager</a></li>
            <li><a href="index_jg.php?q=jg_custom" target="demo">Custom Grid Field</a></li>
            <li><a href="index_jg.php?q=jg_loc" target="demo">Localization</a></li>
        </ul>
HTML_LINKS_PHP;
	return( $html_links_php );
	}

function html_links_html() {
	$html_links_html=<<<HTML_LINKS_HTML
        <ul>
            <li><a href="/jg/demos/basic.html" target="demo">Basic Scenario</a></li>
            <li><a href="/jg/demos/static-data.html" target="demo">Static Data</a></li>
            <li><a href="/jg/demos/odata-service.html" target="demo">OData Service</a></li>
            <li><a href="/jg/demos/data-manipulation.html" target="demo">Data Manipulation</a></li>
            <li><a href="/jg/demos/validation.html" target="demo">Validation</a></li>
            <li><a href="/jg/demos/sorting.html" target="demo">Sorting</a></li>
            <li><a href="/jg/demos/loading-by-page.html" target="demo">Loading by Page</a></li>
            <li><a href="/jg/demos/custom-view.html" target="demo">Custom View</a></li>
            <li><a href="/jg/demos/custom-row-renderer.html" target="demo">Custom Row Renderer</a></li>
            <li><a href="/jg/demos/external-pager.html" target="demo">External Pager</a></li>
            <li><a href="/jg/demos/custom-grid-field.html" target="demo">Custom Grid Field</a></li>
            <li><a href="/jg/demos/localization.html" target="demo">Localization</a></li>
        </ul>
	<hr color="white">
	<h1>BUGS_25200</h1>
		<hr color="white" >
		<a href="ko.php" class="popover" >	
			<img src="/imgs/btn/koeye.png" height=50 border=0>
			<span><img src="/imgs/btn/koeye_handhither.gif" height=50 border=0></span>
			</a>ko.php
		<a href="ko.php?kups" class="popover" >	
			<img src="/imgs/btn/koeye.png" height=50 border=0>
			<span><img src="/imgs/btn/koeye_handhither.gif" height=50 border=0></span>
			</a>ko.php?kups
		<hr color="black" >
		<a href="kups.html" class="popover" >	
			<img src="/imgs/btn/koeye.png" height=50 border=0>
			<span><img src="/imgs/btn/koeye_handhi.gif" height=50 border=0></span>
			</a>kups.html
		<hr color="black" >
		<a href="index2.html" class="popover" >	
			<img src="/btn/koeye.png" height=50 border=0>
			<span><img src="/btn/koeye_handhi.gif" height=50 border=0></span>
			</a>index2.html
		<hr color="white" >
HTML_LINKS_HTML;

	return( $html_links_html );
	}

function html_ftr_jg() {
	$html_ftr=<<<HTML_FTR
    </div>
    <div class="demo-frame">
        <iframe name="demo" src="/jg/demos/basic.html"></iframe>
    </div>

</body>
</html>
HTML_FTR;
	return( $html_ftr );
	}


function jg_basic() {
	$jg_basic=<<<jg_BASIC
	</head>
<body>
    <h1>Basic Scenario</h1>
    <div id="jgrid"></div>

    <script>
        $(function() {

            $("#jgrid").jgrid({
                height: "70%",
                width: "100%",
                filtering: true,
                editing: true,
                inserting: true,
                sorting: true,
                paging: true,
                autoload: true,
                pageSize: 15,
                pageButtonCount: 5,
                deleteConfirm: "Do you really want to delete the client?",
                controller: db,
                fields: [
                    { name: "Name", type: "text", width: 150 },
                    { name: "Age", type: "number", width: 50 },
                    { name: "Address", type: "text", width: 200 },
                    { name: "Country", type: "select", items: db.countries, valueField: "Id", textField: "Name" },
                    { name: "Married", type: "checkbox", title: "Is Married", sorting: false },
                    { type: "control" }
                ]
            });

        });
    </script>
</body>
</html>
jg_BASIC;
	return ($jg_basic);
	}

function jg_batchdel() {
	$jg_scenario_body=<<<jg_BATCHDEL
</head>
<body>
    <h1>Batch Delete</h1>

    <div id="jgrid"></div>

    <script>
        $(function() {

            $("#jgrid").jgrid({
                height: "50%",
                width: "100%",
                autoload: true,
                confirmDeleting: false,
                paging: true,
                controller: {
                    loadData: function() {
                        return db.clients;
                    }
                },
                fields: [
                    {
                        headerTemplate: function() {
                            return $("<button>").attr("type", "button").text("Delete")
                                    .on("click", function () {
                                        deleteSelectedItems();
                                    });
                        },
                        itemTemplate: function(_, item) {
                            return $("<input>").attr("type", "checkbox")
                                    .prop("checked", $.inArray(item, selectedItems) > -1)
                                    .on("change", function () {
                                        $(this).is(":checked") ? selectItem(item) : unselectItem(item);
                                    });
                        },
                        align: "center",
                        width: 50
                    },
                    { name: "Name", type: "text", width: 150 },
                    { name: "Age", type: "number", width: 50 },
                    { name: "Address", type: "text", width: 200 }
                ]
            });


            var selectedItems = [];

            var selectItem = function(item) {
                selectedItems.push(item);
            };

            var unselectItem = function(item) {
                selectedItems = $.grep(selectedItems, function(i) {
                    return i !== item;
                });
            };

            var deleteSelectedItems = function() {
                if(!selectedItems.length || !confirm("Are you sure?"))
                    return;

                deleteClientsFromDb(selectedItems);

                var $grid = $("#jgrid");
                $grid.jgrid("option", "pageIndex", 1);
                $grid.jgrid("loadData");

                selectedItems = [];
            };

            var deleteClientsFromDb = function(deletingClients) {
                db.clients = $.map(db.clients, function(client) {
                    return ($.inArray(client, deletingClients) > -1) ? null : client;
                });
            };

        });
    </script>
</body>
</html>
jg_BATCHDEL;
	return( $jg_bachdel );
	}

function jg_custom() {
	$jg_custom=<<<jg_CUSTOM
    <style>
        .hasDatepicker {
            width: 100px;
            text-align: center;
        }

        .ui-datepicker * {
            font-family: 'Helvetica Neue Light', 'Open Sans', Helvetica;
            font-size: 14px;
            font-weight: 300 !important;
        }
    </style>
</head>
<body>
    <h1>Custom Grid DateField</h1>
    <div id="jgrid"></div>

    <script>
        $(function() {

            var MyDateField = function(config) {
                jgrid.Field.call(this, config);
            };

            MyDateField.prototype = new jgrid.Field({
                sorter: function(date1, date2) {
                    return new Date(date1) - new Date(date2);
                },

                itemTemplate: function(value) {
                    return new Date(value).toDateString();
                },

                insertTemplate: function(value) {
                    return this._insertPicker = $("<input>").datepicker({ defaultDate: new Date() });
                },

                editTemplate: function(value) {
                    return this._editPicker = $("<input>").datepicker().datepicker("setDate", new Date(value));
                },

                insertValue: function() {
                    return this._insertPicker.datepicker("getDate").toISOString();
                },

                editValue: function() {
                    return this._editPicker.datepicker("getDate").toISOString();
                }
            });

            jgrid.fields.myDateField = MyDateField;

            $("#jgrid").jgrid({
                height: "70%",
                width: "100%",
                inserting: true,
                editing: true,
                sorting: true,
                paging: true,
                fields: [
                    { name: "Account", width: 150, align: "center" },
                    { name: "Name", type: "text" },
                    { name: "RegisterDate", type: "myDateField", width: 100, align: "center" },
                    { type: "control", editButton: false, modeSwitchButton: false }
                ],
                data: db.users
            });

        });
    </script>
</body>
</html>
jg_CUSTOM;
	return( $jg_custom );
	}

function jg_load() {
	$jg_load=<<<jg_LOAD

    <style>
        .rating {
#		color: #F8CA03;
		color: darkslategrey;
        	}
    </style>
</head>
<body>
    <h1>Custom Load Indicator</h1>
    <div id="jgrid"></div>

    <script>
        $(function() {

            $("#jgrid").jgrid({
                height: "50%",
                width: "100%",
                sorting: true,
                paging: false,
                autoload: true,
                controller: {
                    loadData: function() {
                        var d = $.Deferred();

                        $.ajax({
                            url: "http://services.odata.org/V3/(S(3mnweai3qldmghnzfshavfok))/OData/OData.svc/Products",
                            dataType: "json"
                        }).done(function(response) {
                            setTimeout(function() {
                                d.resolve(response.value);
                            }, 2000);
                        });

                        return d.promise();
                    }
                },
                loadIndicator: function(config) {
                    var container = config.container[0];
                    var spinner = new Spinner();

                    return {
                        show: function() {
                            spinner.spin(container);
                        },
                        hide: function() {
                            spinner.stop();
                        }
                    };
                },
                fields: [
                    { name: "Name", type: "text" },
                    { name: "Description", type: "textarea", width: 150 },
                    { name: "Rating", type: "number", width: 50, align: "center",
                        itemTemplate: function(value) {
                            return $("<div>").addClass("rating").append(Array(value + 1).join("&#9733;"));
                        }
                    },
                    { name: "Price", type: "number", width: 50,
                        itemTemplate: function(value) {
                            return value.toFixed(2) + "$"; }
                    }
                ]
            });

        });
    </script>
</body>
</html>
jg_LOAD;
	return( $jg_load );
	}

function jg_rows() {
	$jg_rows=<<<jg_ROWS
    <style>
        .client-photo { float: left; margin: 0 20px 0 10px; }
        .client-photo img { border-radius: 50%; border: 1px solid #ddd; }
        .client-info { margin-top: 10px; }
        .client-info p { line-height: 25px; }
    </style>
</head>
<body>
    <h1>Custom Row Renderer</h1>
    <div id="jgrid"></div>

    <script>
        $(function() {

            $("#jgrid").jgrid({
                height: "80%",
                width: "50%",
                autoload: true,
                paging: true,
                controller: {
                    loadData: function() {
                        var deferred = $.Deferred();

                        $.ajax({
                            url: 'http://api.randomuser.me/?results=40',
                            dataType: 'jsonp',
                            success: function(data){
                                deferred.resolve(data.results);
                            }
                        });

                        return deferred.promise();
                    }
                },
                rowRenderer: function(item) {
                    var user = item;
                    var $photo = $("<div>").addClass("client-photo").append($("<img>").attr("src", user.picture.large));
                    var $info = $("<div>").addClass("client-info")
                        .append($("<p>").append($("<strong>").text(user.name.first.capitalize() + " " + user.name.last.capitalize())))
                        .append($("<p>").text("Location: " + user.location.city.capitalize() + ", " + user.location.street))
                        .append($("<p>").text("Email: " + user.email))
                        .append($("<p>").text("Phone: " + user.phone))
                        .append($("<p>").text("Cell: " + user.cell));

                    return $("<tr>").append($("<td>").append($photo).append($info));
                },
                fields: [
                    { title: "Clients" }
                ]
            });


            String.prototype.capitalize = function() {
                return this.charAt(0).toUpperCase() + this.slice(1);
            };

        });
    </script>
</body>
</html>
jg_ROWS;
	return( $jg_rows );
	}
function jg_views() {
	$jg_views=<<<jg_VIEWS
    <style>
        .config-panel {
            padding: 10px;
            margin: 10px 0;
            background: #fcfcfc;
            border: 1px solid #e9e9e9;
            display: inline-block;
        }

        .config-panel label {
            margin-right: 10px;
        }
    </style>
</head>
<body>
    <h1>Custom View</h1>
    <div class="config-panel">
        <label><input id="heading" type="checkbox" checked /> Heading</label>
        <label><input id="filtering" type="checkbox" checked /> Filtering</label>
        <label><input id="inserting" type="checkbox" /> Inserting</label>
        <label><input id="editing" type="checkbox" checked /> Editing</label>
        <label><input id="paging" type="checkbox" checked /> Paging</label>
        <label><input id="sorting" type="checkbox" checked /> Sorting</label>
        <label><input id="selecting" type="checkbox" checked /> Selecting</label>
    </div>

    <div id="jgrid"></div>

    <script>

        $(function() {

            $("#jgrid").jgrid({
                height: "70%",
                width: "100%",
                filtering: true,
                editing: true,
                sorting: true,
                paging: true,
                autoload: true,
                pageSize: 15,
                pageButtonCount: 5,
                controller: db,
                fields: [
                    { name: "Name", type: "text", width: 150 },
                    { name: "Age", type: "number", width: 50 },
                    { name: "Address", type: "text", width: 200 },
                    { name: "Country", type: "select", items: db.countries, valueField: "Id", textField: "Name" },
                    { name: "Married", type: "checkbox", title: "Is Married", sorting: false },
                    { type: "control", modeSwitchButton: false, editButton: false }
                ]
            });

            $(".config-panel input[type=checkbox]").on("click", function() {
                var $cb = $(this);
                $("#jgrid").jgrid("option", $cb.attr("id"), $cb.is(":checked"));
            });
        });
    </script>
</body>
</html>
jg_VIEWS;
	return( $jg_views );
	}



function jg_data() {
	$jg_data = <<<jg_DATA

    <style>
        .ui-widget *, .ui-widget input, .ui-widget select, .ui-widget button {
            font-family: 'Helvetica Neue Light', 'Open Sans', Helvetica;
            font-size: 14px;
            font-weight: 300 !important;
        }

        .details-form-field input,
        .details-form-field select {
            width: 250px;
            float: right;
        }

        .details-form-field {
            margin: 30px 0;
        }

        .details-form-field:first-child {
            margin-top: 10px;
        }

        .details-form-field:last-child {
            margin-bottom: 10px;
        }

        .details-form-field button {
            display: block;
            width: 100px;
            margin: 0 auto;
        }

        input.error, select.error {
            border: 1px solid #ff9999;
            background: #ffeeee;
        }

        label.error {
            float: right;
            margin-left: 100px;
            font-size: .8em;
            color: #ff6666;
        }
    </style>
</head>
<body>
    <h1>Data Manipulation</h1>
    <div id="jgrid"></div>

    <div id="detailsDialog">
        <form id="detailsForm">
            <div class="details-form-field">
                <label for="name">Name:</label>
                <input id="name" name="name" type="text" />
            </div>
            <div class="details-form-field">
                <label for="age">Age:</label>
                <input id="age" name="age" type="number" />
            </div>
            <div class="details-form-field">
                <label for="address">Address:</label>
                <input id="address" name="address" type="text" />
            </div>
            <div class="details-form-field">
                <label for="country">Country:</label>
                <select id="country" name="country">
                    <option value="">(Select)</option>
                    <option value="1">United States</option>
                    <option value="2">Canada</option>
                    <option value="3">United Kingdom</option>
                    <option value="4">France</option>
                    <option value="5">Brazil</option>
                    <option value="6">China</option>
                    <option value="7">Russia</option>
                </select>
            </div>
            <div class="details-form-field">
                <label for="married">Is Married</label>
                <input id="married" name="married" type="checkbox" />
            </div>
            <div class="details-form-field">
                <button type="submit" id="save">Save</button>
            </div>
        </form>
    </div>

    <script>
        $(function() {

            $("#jgrid").jgrid({
                height: "70%",
                width: "100%",
                editing: true,
                autoload: true,
                paging: true,
                deleteConfirm: function(item) {
                    return "The client \"" + item.Name + "\" will be removed. Are you sure?";
                },
                rowClick: function(args) {
                    showDetailsDialog("Edit", args.item);
                },
                controller: db,
                fields: [
                    { name: "Name", type: "text", width: 150 },
                    { name: "Age", type: "number", width: 50 },
                    { name: "Address", type: "text", width: 200 },
                    { name: "Country", type: "select", items: db.countries, valueField: "Id", textField: "Name" },
                    { name: "Married", type: "checkbox", title: "Is Married", sorting: false },
                    {
                        type: "control",
                        modeSwitchButton: false,
                        editButton: false,
                        headerTemplate: function() {
                            return $("<button>").attr("type", "button").text("Add")
                                .on("click", function () {
                                    showDetailsDialog("Add", {});
                                });
                        }
                    }
                ]
            });

            $("#detailsDialog").dialog({
                autoOpen: false,
                width: 400,
                close: function() {
                    $("#detailsForm").validate().resetForm();
                    $("#detailsForm").find(".error").removeClass("error");
                }
            });

            $("#detailsForm").validate({
                rules: {
                    name: "required",
                    age: { required: true, range: [18, 150] },
                    address: { required: true, minlength: 10 },
                    country: "required"
                },
                messages: {
                    name: "Please enter name",
                    age: "Please enter valid age",
                    address: "Please enter address (more than 10 chars)",
                    country: "Please select country"
                },
                submitHandler: function() {
                    formSubmitHandler();
                }
            });

            var formSubmitHandler = $.noop;

            var showDetailsDialog = function(dialogType, client) {
                $("#name").val(client.Name);
                $("#age").val(client.Age);
                $("#address").val(client.Address);
                $("#country").val(client.Country);
                $("#married").prop("checked", client.Married);

                formSubmitHandler = function() {
                    saveClient(client, dialogType === "Add");
                };

                $("#detailsDialog").dialog("option", "title", dialogType + " Client")
                    .dialog("open");
            };

            var saveClient = function(client, isNew) {
                $.extend(client, {
                    Name: $("#name").val(),
                    Age: parseInt($("#age").val(), 10),
                    Address: $("#address").val(),
                    Country: parseInt($("#country").val(), 10),
                    Married: $("#married").is(":checked")
                });

                $("#jgrid").jgrid(isNew ? "insertItem" : "updateItem", client);

                $("#detailsDialog").dialog("close");
            };

        });
    </script>
</body>
</html>
jg_DATA;
	return( $jg_data );
	}


function jg_pager() {
	$jg_pager=<<<jg_PAGER
    <style>
        .external-pager {
            margin: 10px 0;
        }

        .external-pager .jgrid-pager-current-page {
            background: #c4e2ff;
            color: #fff;
        }
    </style>
</head>
<body>
    <h1>External Customized Pager</h1>
    <div id="externalPager" class="external-pager"></div>

    <div id="jgrid"></div>

    <script>
        $(function() {

            $("#jgrid").jgrid({
                height: "70%",
                width: "100%",
                paging: true,
                pageSize: 15,
                pageButtonCount: 5,
                pagerContainer: "#externalPager",
                pagerFormat: "current page: {pageIndex} &nbsp;&nbsp; {first} {prev} {pages} {next} {last} &nbsp;&nbsp; total pages: {pageCount} total items: {itemCount}",
                pagePrevText: "<",
                pageNextText: ">",
                pageFirstText: "<<",
                pageLastText: ">>",
                pageNavigatorNextText: "&#8230;",
                pageNavigatorPrevText: "&#8230;",
                fields: [
                    { name: "Name", type: "text", width: 150 },
                    { name: "Age", type: "number", width: 50 },
                    { name: "Address", type: "text", width: 200 },
                    { name: "Country", type: "select", items: db.countries, valueField: "Id", textField: "Name" },
                    { name: "Married", type: "checkbox", title: "Is Married" }
                ],
                data: db.clients
            });

        });
    </script>
</body>
</html>
jg_PAGER;
	return( $jg_pager );
	}

function jg_simple() {
	$jg_simple=<<<jg_SIMPLE
</head>
<body>
    <div class="navigation">
        <h1>jgrid Demos</h1>
        <ul>
            <li><a href="basic.html" target="demo">Basic Scenario</a></li>
            <li><a href="static-data.html" target="demo">Static Data</a></li>
            <li><a href="odata-service.html" target="demo">OData Service</a></li>
            <li><a href="data-manipulation.html" target="demo">Data Manipulation</a></li>
            <li><a href="validation.html" target="demo">Validation</a></li>
            <li><a href="sorting.html" target="demo">Sorting</a></li>
            <li><a href="loading-by-page.html" target="demo">Loading by Page</a></li>
            <li><a href="custom-view.html" target="demo">Custom View</a></li>
            <li><a href="custom-row-renderer.html" target="demo">Custom Row Renderer</a></li>
            <li><a href="external-pager.html" target="demo">External Pager</a></li>
            <li><a href="custom-grid-field.html" target="demo">Custom Grid Field</a></li>
            <li><a href="localization.html" target="demo">Localization</a></li>
        </ul>
    </div>
    <div class="demo-frame">
        <iframe name="demo" src="basic.html"></iframe>
    </div>
</body>
</html>
jg_SIMPLE;
	return( $jg_simple );
	}


function jg_page() {
	$jg_page=<<<jg_PAGE
<html>
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>jgrid - Loading Data by Page Scenario</title>
    <link rel="stylesheet" type="text/css" href="demos.css" />
    <link href='http://fonts.googleapis.com/css?family=Open+Sans:300,600,400' rel='stylesheet' type='text/css'>

    <link rel="stylesheet" type="text/css" href="../css/jgrid.css" />
    <link rel="stylesheet" type="text/css" href="../css/theme.css" />

    <script src="../external/jquery/jquery-1.8.3.js"></script>
    <script src="db.js"></script>

    <script src="../src/jgrid.core.js"></script>
    <script src="../src/jgrid.load-indicator.js"></script>
    <script src="../src/jgrid.load-strategies.js"></script>
    <script src="../src/jgrid.sort-strategies.js"></script>
    <script src="../src/jgrid.field.js"></script>
    <script src="../src/fields/jgrid.field.text.js"></script>
    <script src="../src/fields/jgrid.field.number.js"></script>
    <script src="../src/fields/jgrid.field.select.js"></script>
    <script src="../src/fields/jgrid.field.checkbox.js"></script>

    <style>
        .pager-panel {
            padding: 10px;
            margin: 10px 0;
            background: #fcfcfc;
            border: 1px solid #e9e9e9;
            display: inline-block;
        }
    </style>
</head>
<body>
    <h1>Loading Data by Page</h1>
    <div class="pager-panel">
        <label>Page:
            <select id="pager">
                <option>1</option>
                <option selected>2</option>
                <option>3</option>
                <option>4</option>
                <option>5</option>
                <option>6</option>
                <option>7</option>
            </select>
        </label>
    </div>

    <div id="jgrid"></div>

    <script>
        $(function() {

            $("#jgrid").jgrid({
                height: "70%",
                width: "100%",
                autoload: true,
                paging: true,
                pageLoading: true,
                pageSize: 15,
                pageIndex: 2,
                controller: {
                    loadData: function(filter) {
                        var startIndex = (filter.pageIndex - 1) * filter.pageSize;
                        return {
                            data: db.clients.slice(startIndex, startIndex + filter.pageSize),
                            itemsCount: db.clients.length
                        };
                    }
                },
                fields: [
                    { name: "Name", type: "text", width: 150 },
                    { name: "Age", type: "number", width: 50 },
                    { name: "Address", type: "text", width: 200 },
                    { name: "Country", type: "select", items: db.countries, valueField: "Id", textField: "Name" },
                    { name: "Married", type: "checkbox", title: "Is Married" }
                ]
            });

            $("#pager").on("change", function() {
                var page = parseInt($(this).val(), 10);
                $("#jgrid").jgrid("openPage", page);
            });

        });
    </script>
</body>
</html>
jg_PAGE;
	return($jg_page);
	}

function jg_loc() {
	$jg_loc=<<<jg_LOC
</head>
<body>
    <h1>Localization (FR)</h1>
    <div id="jgrid"></div>

    <script>
        $(function() {

            jgrid.locale("fr");

            $("#jgrid").jgrid({
                height: "70%",
                width: "100%",
                filtering: true,
                editing: true,
                inserting: true,
                sorting: true,
                paging: true,
                autoload: true,
                pageSize: 15,
                pageButtonCount: 5,
                controller: db,
                fields: [
                    { name: "Name", title: "Nom", type: "text", width: 150, validate: "required" },
                    { name: "Age", title: "Âge", type: "number", width: 50, validate: { validator: "range", param: [18,80] } },
                    { name: "Address", title: "Adresse", type: "text", width: 200, validate: { validator: "rangeLength", param: [10, 250] } },
                    { name: "Country", title: "Pays", type: "select", items: db.countries, valueField: "Id", textField: "Name" },
                    { name: "Married", title: "Marié", type: "checkbox", sorting: false },
                    { type: "control" }
                ]
            });

        });
    </script>
</body>
</html>
jg_LOC;
	return( $jg_loc );
	}

function jg_service() {
	$jg_service=<<<jg_SERVICE

    <style>
        .rating {
            color: #F8CA03;
        }
    </style>
</head>
<body>
    <h1>OData Service</h1>
    <div id="jgrid"></div>

    <script>
        $(function() {

            $("#jgrid").jgrid({
                height: "auto",
                width: "auto",
                sorting: true,
                paging: false,
                autoload: true,
                controller: {
                    loadData: function() {
                        var d = $.Deferred();

                        $.ajax({
                            url: "http://services.odata.org/V3/(S(3mnweai3qldmghnzfshavfok))/OData/OData.svc/Products",
                            dataType: "json"
                        }).done(function(response) {
                            d.resolve(response.value);
                        });

                        return d.promise();
                    }
                },
                fields: [
                    { name: "Name", type: "text", width: 100 },
                    { name: "Description", type: "textarea", width: 200 },
                    { name: "Rating", type: "number", width: 150, align: "center",
                        itemTemplate: function(value) {
                            return $("<div>").addClass("rating").append(Array(value + 1).join("&#9733;"));
                        }
                    },
                    { name: "Price", type: "number", width: 100,
                        itemTemplate: function(value) {
                            return value.toFixed(2) + "$"; }
                    }
                ]
            });

        });
    </script>
</body>
</html>
jg_SERVICE;
	return($jg_service );
	}

function jg_reorder() {
	$jg_reorder=<<<jg_REORDER
</head>
<body>
<h1>Rows Reordering Scenario</h1>
<div id="jgrid"></div>

<script>
    $(function() {

        $("#jgrid").jgrid({
            height: "70%",
            width: "100%",
            autoload: true,

            rowClass: function(item, itemIndex) {
                return "client-" + itemIndex;
            },

            controller: {
                loadData: function() {
                    return db.clients.slice(0, 15);
                }
            },

            fields: [
                { name: "Name", type: "text", width: 150 },
                { name: "Age", type: "number", width: 50 },
                { name: "Address", type: "text", width: 200 },
                { name: "Country", type: "select", items: db.countries, valueField: "Id", textField: "Name" },
                { name: "Married", type: "checkbox", title: "Is Married", sorting: false }
            ],

            onRefreshed: function() {
                var $gridData = $("#jgrid .jgrid-grid-body tbody");

                $gridData.sortable({
                    update: function(e, ui) {
                        // array of indexes
                        var clientIndexRegExp = /\s*client-(\d+)\s*/;
                        var indexes = $.map($gridData.sortable("toArray", { attribute: "class" }), function(classes) {
                            return clientIndexRegExp.exec(classes)[1];
                        });
                        alert("Reordered indexes: " + indexes.join(", "));

                        // arrays of items
                        var items = $.map($gridData.find("tr"), function(row) {
                            return $(row).data("jgridItem");
                        });
                        console && console.log("Reordered items", items);
                    }
                });
            }
        });

    });
</script>
</body>
</html>
jg_REORDER;
	return( $jg_reorder );
	}

function jg_sort() {
	$jg_sort=<<<jg_SORT
    <style>
        .sort-panel {
            padding: 10px;
            margin: 10px 0;
            background: #fcfcfc;
            border: 1px solid #e9e9e9;
            display: inline-block;
        }
    </style>
</head>
<body>
    <h1>Sorting</h1>
    <div class="sort-panel">
        <label>Sorting Field:
            <select id="sortingField">
                <option>Name</option>
                <option>Age</option>
                <option>Address</option>
                <option>Country</option>
                <option>Married</option>
            </select>
            <button type="button" id="sort">Sort</button>
        </label>
    </div>

    <div id="jgrid"></div>

    <script>
        $(function() {

            $("#jgrid").jgrid({
                height: "70%",
                width: "100%",
                autoload: true,
                selecting: false,
                controller: db,
                fields: [
                    { name: "Name", type: "text", width: 150 },
                    { name: "Age", type: "number", width: 50 },
                    { name: "Address", type: "text", width: 200 },
                    { name: "Country", type: "select", items: db.countries, valueField: "Id", textField: "Name" },
                    { name: "Married", type: "checkbox", title: "Is Married" }
                ]
            });

            $("#sort").click(function() {
                var field = $("#sortingField").val();
                $("#jgrid").jgrid("sort", field);
            });

        });
    </script>
</body>
</html>
jg_SORT;
	return( $jg_sort );
	}

function jg_static() {
	$jg_static=<<<jg_STATIC
</head>
<body>
    <h1>Static Data</h1>
    <div id="jgrid"></div>

    <script>
        $(function() {

            $("#jgrid").jgrid({
                height: "70%",
                width: "100%",
                sorting: true,
                paging: true,
                fields: [
                    { name: "Name", type: "text", width: 150 },
                    { name: "Age", type: "number", width: 50 },
                    { name: "Address", type: "text", width: 200 },
                    { name: "Country", type: "select", items: db.countries, valueField: "Id", textField: "Name" },
                    { name: "Married", type: "checkbox", title: "Is Married" }
                ],
                data: db.clients
            });

        });
    </script>
</body>
</html>
jg_STATIC;
	return( $jg_static );
	}

function jg_valid() {
	$jg_valid=<<<jg_VALID
</head>
<body>
    <h1>Validation</h1>
    <div id="jgrid"></div>

    <script>
        $(function() {

            $("#jgrid").jgrid({
                height: "70%",
                width: "100%",
                filtering: true,
                editing: true,
                inserting: true,
                sorting: true,
                paging: true,
                autoload: true,
                pageSize: 15,
                pageButtonCount: 5,
                deleteConfirm: "Do you really want to delete the client?",
                controller: db,
                fields: [
                    { name: "Name", type: "text", width: 150, validate: "required" },
                    { name: "Age", type: "number", width: 50, validate: { validator: "range", param: [18,80] } },
                    { name: "Address", type: "text", width: 200, validate: { validator: "rangeLength", param: [10, 250] } },
                    { name: "Country", type: "select", items: db.countries, valueField: "Id", textField: "Name",
                        validate: { message: "Country should be specified", validator: function(value) { return value > 0; } } },
                    { name: "Married", type: "checkbox", title: "Is Married", sorting: false },
                    { type: "control" }
                ]
            });

        });
    </script>
</body>
</html>
jg_VALID;
	return($jg_valid);
	}


function html_js_b64() {
	$html_js_b64=<<<HTML_JS_B64
<html>
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>jgrid - Basic Scenario</title>
<style id="demos_css" src="data:text/css;base64,KiB7CiAgICBtYXJnaW46IDA7CiAgICBwYWRkaW5nOiAwOwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKfQoKaHRtbCB7CiAgICBoZWlnaHQ6IDEwMCU7Cn0KCmJvZHkgewogICAgaGVpZ2h0OiAxMDAlOwogICAgcGFkZGluZzogMTBweDsKICAgIGNvbG9yOiAjMjYyNjI2OwogICAgZm9udC1mYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZSBMaWdodCcsICdPcGVuIFNhbnMnLCBIZWx2ZXRpY2E7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBmb250LXdlaWdodDogMzAwOwp9CgpoMSB7CiAgICBtYXJnaW46IDAgMCA4cHggMDsKICAgIGZvbnQtc2l6ZTogMjRweDsKICAgIGZvbnQtZmFtaWx5OiAnSGVsdmV0aWNhIE5ldWUgTGlnaHQnLCAnT3BlbiBTYW5zJywgSGVsdmV0aWNhOwogICAgZm9udC13ZWlnaHQ6IDMwMDsKfQoKaDIgewogICAgbWFyZ2luOiAxNnB4IDAgOHB4IDA7CiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LWZhbWlseTogJ0hlbHZldGljYSBOZXVlIExpZ2h0JywgJ09wZW4gU2FucycsIEhlbHZldGljYTsKICAgIGZvbnQtd2VpZ2h0OiAzMDA7Cn0KCnVsIHsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7Cn0KCmEgewogICAgY29sb3I6ICMyYmE2Y2I7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KCmE6aG92ZXIgewogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICBjb2xvcjogIzI1OGZhZjsKfQoKaW5wdXQsIGJ1dHRvbiwgc2VsZWN0IHsKICAgIGZvbnQtZmFtaWx5OiAnSGVsdmV0aWNhIE5ldWUgTGlnaHQnLCAnT3BlbiBTYW5zJywgSGVsdmV0aWNhOwogICAgZm9udC13ZWlnaHQ6IDMwMDsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIHBhZGRpbmc6IDJweDsKfQoKLm5hdmlnYXRpb24gewogICAgd2lkdGg6IDIwMHB4OwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAwOwogICAgYm90dG9tOiAwOwogICAgbGVmdDogMDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZTllOWU5Owp9CgoubmF2aWdhdGlvbiBsaSB7CiAgICBtYXJnaW46IDEwcHggMDsKfQoKLmRlbW8tZnJhbWUgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAwOwogICAgcmlnaHQ6IDA7CiAgICBib3R0b206IDA7CiAgICBsZWZ0OiAyMDBweDsKfQoKaWZyYW1lW25hbWU9J2RlbW8nXSB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgYm9yZGVyOiBub25lOwp9" ></style>
<style id="jg_google_css" src="data:text/css;base64,LyogY3lyaWxsaWMtZXh0ICovCkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdPcGVuIFNhbnMgTGlnaHQnKSwgbG9jYWwoJ09wZW5TYW5zLUxpZ2h0JyksIHVybChodHRwOi8vZm9udHMuZ3N0YXRpYy5jb20vcy9vcGVuc2Fucy92MTUvbWVtNVlhR3MxMjZNaVpwQkEtVU5fcjhPWC1ocEtLU1RqNVBXLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMUM4MC0xQzg4LCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RiwgVStGRTJFLUZFMkY7Cn0KLyogY3lyaWxsaWMgKi8KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ09wZW4gU2FucyBMaWdodCcpLCBsb2NhbCgnT3BlblNhbnMtTGlnaHQnKSwgdXJsKGh0dHA6Ly9mb250cy5nc3RhdGljLmNvbS9zL29wZW5zYW5zL3YxNS9tZW01WWFHczEyNk1pWnBCQS1VTl9yOE9WdWhwS0tTVGo1UFcud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KLyogZ3JlZWstZXh0ICovCkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdPcGVuIFNhbnMgTGlnaHQnKSwgbG9jYWwoJ09wZW5TYW5zLUxpZ2h0JyksIHVybChodHRwOi8vZm9udHMuZ3N0YXRpYy5jb20vcy9vcGVuc2Fucy92MTUvbWVtNVlhR3MxMjZNaVpwQkEtVU5fcjhPWHVocEtLU1RqNVBXLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KLyogZ3JlZWsgKi8KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ09wZW4gU2FucyBMaWdodCcpLCBsb2NhbCgnT3BlblNhbnMtTGlnaHQnKSwgdXJsKGh0dHA6Ly9mb250cy5nc3RhdGljLmNvbS9zL29wZW5zYW5zL3YxNS9tZW01WWFHczEyNk1pWnBCQS1VTl9yOE9VZWhwS0tTVGo1UFcud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQovKiB2aWV0bmFtZXNlICovCkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdPcGVuIFNhbnMgTGlnaHQnKSwgbG9jYWwoJ09wZW5TYW5zLUxpZ2h0JyksIHVybChodHRwOi8vZm9udHMuZ3N0YXRpYy5jb20vcy9vcGVuc2Fucy92MTUvbWVtNVlhR3MxMjZNaVpwQkEtVU5fcjhPWGVocEtLU1RqNVBXLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMDExMC0wMTExLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9Ci8qIGxhdGluLWV4dCAqLwpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ09wZW4gU2Fucyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnT3BlbiBTYW5zIExpZ2h0JyksIGxvY2FsKCdPcGVuU2Fucy1MaWdodCcpLCB1cmwoaHR0cDovL2ZvbnRzLmdzdGF0aWMuY29tL3Mvb3BlbnNhbnMvdjE1L21lbTVZYUdzMTI2TWlacEJBLVVOX3I4T1hPaHBLS1NUajVQVy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzAyNTksIFUrMUUwMC0xRUZGLCBVKzIwMjAsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyMTEzLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KLyogbGF0aW4gKi8KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ09wZW4gU2FucyBMaWdodCcpLCBsb2NhbCgnT3BlblNhbnMtTGlnaHQnKSwgdXJsKGh0dHA6Ly9mb250cy5nc3RhdGljLmNvbS9zL29wZW5zYW5zL3YxNS9tZW01WWFHczEyNk1pWnBCQS1VTl9yOE9VdWhwS0tTVGp3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJCQi0wMkJDLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjEyMiwgVSsyMTkxLCBVKzIxOTMsIFUrMjIxMiwgVSsyMjE1LCBVK0ZFRkYsIFUrRkZGRDsKfQovKiBjeXJpbGxpYy1leHQgKi8KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ09wZW4gU2FucyBSZWd1bGFyJyksIGxvY2FsKCdPcGVuU2Fucy1SZWd1bGFyJyksIHVybChodHRwOi8vZm9udHMuZ3N0YXRpYy5jb20vcy9vcGVuc2Fucy92MTUvbWVtOFlhR3MxMjZNaVpwQkEtVUZXSjBiZjhwa0FwNmEud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsxQzgwLTFDODgsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGLCBVK0ZFMkUtRkUyRjsKfQovKiBjeXJpbGxpYyAqLwpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ09wZW4gU2Fucyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnT3BlbiBTYW5zIFJlZ3VsYXInKSwgbG9jYWwoJ09wZW5TYW5zLVJlZ3VsYXInKSwgdXJsKGh0dHA6Ly9mb250cy5nc3RhdGljLmNvbS9zL29wZW5zYW5zL3YxNS9tZW04WWFHczEyNk1pWnBCQS1VRlVaMGJmOHBrQXA2YS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQovKiBncmVlay1leHQgKi8KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ09wZW4gU2FucyBSZWd1bGFyJyksIGxvY2FsKCdPcGVuU2Fucy1SZWd1bGFyJyksIHVybChodHRwOi8vZm9udHMuZ3N0YXRpYy5jb20vcy9vcGVuc2Fucy92MTUvbWVtOFlhR3MxMjZNaVpwQkEtVUZXWjBiZjhwa0FwNmEud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQovKiBncmVlayAqLwpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ09wZW4gU2Fucyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnT3BlbiBTYW5zIFJlZ3VsYXInKSwgbG9jYWwoJ09wZW5TYW5zLVJlZ3VsYXInKSwgdXJsKGh0dHA6Ly9mb250cy5nc3RhdGljLmNvbS9zL29wZW5zYW5zL3YxNS9tZW04WWFHczEyNk1pWnBCQS1VRlZwMGJmOHBrQXA2YS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9Ci8qIHZpZXRuYW1lc2UgKi8KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ09wZW4gU2FucyBSZWd1bGFyJyksIGxvY2FsKCdPcGVuU2Fucy1SZWd1bGFyJyksIHVybChodHRwOi8vZm9udHMuZ3N0YXRpYy5jb20vcy9vcGVuc2Fucy92MTUvbWVtOFlhR3MxMjZNaVpwQkEtVUZXcDBiZjhwa0FwNmEud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSswMTEwLTAxMTEsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KLyogbGF0aW4tZXh0ICovCkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdPcGVuIFNhbnMgUmVndWxhcicpLCBsb2NhbCgnT3BlblNhbnMtUmVndWxhcicpLCB1cmwoaHR0cDovL2ZvbnRzLmdzdGF0aWMuY29tL3Mvb3BlbnNhbnMvdjE1L21lbThZYUdzMTI2TWlacEJBLVVGVzUwYmY4cGtBcDZhLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMDI1OSwgVSsxRTAwLTFFRkYsIFUrMjAyMCwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzIxMTMsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQovKiBsYXRpbiAqLwpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ09wZW4gU2Fucyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnT3BlbiBTYW5zIFJlZ3VsYXInKSwgbG9jYWwoJ09wZW5TYW5zLVJlZ3VsYXInKSwgdXJsKGh0dHA6Ly9mb250cy5nc3RhdGljLmNvbS9zL29wZW5zYW5zL3YxNS9tZW04WWFHczEyNk1pWnBCQS1VRlZaMGJmOHBrQWcud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkJCLTAyQkMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMTIyLCBVKzIxOTEsIFUrMjE5MywgVSsyMjEyLCBVKzIyMTUsIFUrRkVGRiwgVStGRkZEOwp9Ci8qIGN5cmlsbGljLWV4dCAqLwpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ09wZW4gU2Fucyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA2MDA7CiAgc3JjOiBsb2NhbCgnT3BlbiBTYW5zIFNlbWlCb2xkJyksIGxvY2FsKCdPcGVuU2Fucy1TZW1pQm9sZCcpLCB1cmwoaHR0cDovL2ZvbnRzLmdzdGF0aWMuY29tL3Mvb3BlbnNhbnMvdjE1L21lbTVZYUdzMTI2TWlacEJBLVVOaXJrT1gtaHBLS1NUajVQVy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTjgLCBVKzFDODAtMUM4OCwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUYsIFUrRkUyRS1GRTjgOwp9Ci8qIGN5cmlsbGljICovCkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDYwMDsKICBzcmM6IGxvY2FsKCdPcGVuIFNhbnMgU2VtaUJvbGQnKSwgbG9jYWwoJ09wZW5TYW5zLVNlbWlCb2xkJyksIHVybChodHRwOi8vZm9udHMuZ3N0YXRpYy5jb20vcy9vcGVuc2Fucy92MTUvbWVtNVlhR3MxMjZNaVpwQkEtVU5pcmtPVnVocEtLU1RqNVBXLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9Ci8qIGdyZWVrLWV4dCAqLwpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ09wZW4gU2Fucyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA2MDA7CiAgc3JjOiBsb2NhbCgnT3BlbiBTYW5zIFNlbWlCb2xkJyksIGxvY2FsKCdPcGVuU2Fucy1TZW1pQm9sZCcpLCB1cmwoaHR0cDovL2ZvbnRzLmdzdGF0aWMuY29tL3Mvb3BlbnNhbnMvdjE1L21lbTVZYUdzMTI2TWlacEJBLVVOaXJrT1h1aHBLS1NUajVQVy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9Ci8qIGdyZWVrICovCkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDYwMDsKICBzcmM6IGxvY2FsKCdPcGVuIFNhbnMgU2VtaUJvbGQnKSwgbG9jYWwoJ09wZW5TYW5zLVNlbWlCb2xkJyksIHVybChodHRwOi8vZm9udHMuZ3N0YXRpYy5jb20vcy9vcGVuc2Fucy92MTUvbWVtNVlhR3MxMjZNaVpwQkEtVU5pcmtPVWVocEtLU1RqNVBXLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KLyogdmlldG5hbWVzZSAqLwpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ09wZW4gU2Fucyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA2MDA7CiAgc3JjOiBsb2NhbCgnT3BlbiBTYW5zIFNlbWlCb2xkJyksIGxvY2FsKCdPcGVuU2Fucy1TZW1pQm9sZCcpLCB1cmwoaHR0cDovL2ZvbnRzLmdzdGF0aWMuY29tL3Mvb3BlbnNhbnMvdjE1L21lbTVZYUdzMTI2TWlacEJBLVVOaXJrT1hlaHBLS1NUajVQVy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzAxMTAtMDExMSwgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQovKiBsYXRpbi1leHQgKi8KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNjAwOwogIHNyYzogbG9jYWwoJ09wZW4gU2FucyBTZW1pQm9sZCcpLCBsb2NhbCgnT3BlblNhbnMtU2VtaUJvbGQnKSwgdXJsKGh0dHA6Ly9mb250cy5nc3RhdGljLmNvbS9zL29wZW5zYW5zL3YxNS9tZW01WWFHczEyNk1pWnBCQS1VTmlya09YT2hwS0tTVGo1UFcud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSswMjU5LCBVKzFFMDAtMUVGRiwgVSsyMDIwLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMjExMywgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9Ci8qIGxhdGluICovCkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDYwMDsKICBzcmM6IGxvY2FsKCdPcGVuIFNhbnMgU2VtaUJvbGQnKSwgbG9jYWwoJ09wZW5TYW5zLVNlbWlCb2xkJyksIHVybChodHRwOi8vZm9udHMuZ3N0YXRpYy5jb20vcy9vcGVuc2Fucy92MTUvbWVtNVlhR3MxMjZNaVpwQkEtVU5pcmtPVXVocEtLU1Rqdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQkItMDJCQywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIxMjIsIFUrMjE5MSwgVSsyMTkzLCBVKzIyMTIsIFUrMjIxNSwgVStGRUZGLCBVK0ZGRkQ7Cn0K" ></style>
<style id="jgrid_css" src="data:text/css;base64,77u/LmpzZ3JpZCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgZm9udC1zaXplOiAxZW07Cn0KCi5qc2dyaWQsIC5qc2dyaWQgKiwgLmpzZ3JpZCAqOmJlZm9yZSwgLmpzZ3JpZCAqOmFmdGVyIHsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCi5qc2dyaWQgaW5wdXQsCi5qc2dyaWQgdGV4dGFyZWEsCi5qc2dyaWQgc2VsZWN0IHsKICAgIGZvbnQtc2l6ZTogMWVtOwp9CgouanNncmlkLWdyaWQtaGVhZGVyIHsKICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgIG92ZXJmbG93LXk6IHNjcm9sbDsKICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAta2h0bWwtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgLW8tdXNlci1zZWxlY3Q6IG5vbmU7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLmpzZ3JpZC1ncmlkLWJvZHkgewogICAgb3ZlcmZsb3cteDogYXV0bzsKICAgIG92ZXJmbG93LXk6IHNjcm9sbDsKICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKfQoKLmpzZ3JpZC10YWJsZSB7CiAgICB3aWR0aDogMTAwJTsKICAgIHRhYmxlLWxheW91dDogZml4ZWQ7CiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgYm9yZGVyLXNwYWNpbmc6IDA7Cn0KCi5qc2dyaWQtY2VsbCB7CiAgICBwYWRkaW5nOiAwLjVlbSAwLjVlbTsKfQoKLmpzZ3JpZC3RgWVsbCwKLmpzZ3JpZC1oZWFkZXItY2VsbCB7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgouanNncmlkLWFsaWduLWxlZnQgewogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKLmpzZ3JpZC1hbGlnbi1jZW50ZXIsCi5qc2dyaWQtYWxpZ24tY2VudGVyIGlucHV0LAouanNncmlkLWFsaWduLWNlbnRlciB0ZXh0YXJlYSwKLmpzZ3JpZC1hbGlnbi1jZW50ZXIgc2VsZWN0IHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKLmpzZ3JpZC1hbGlnbi1yaWdodCwKLmpzZ3JpZC1hbGlnbi1yaWdodCBpbnB1dCwKLmpzZ3JpZC1hbGlnbi1yaWdodCB0ZXh0YXJlYSwKLmpzZ3JpZC1hbGlnbi1yaWdodCBzZWxlY3QgewogICAgdGV4dC1hbGlnbjogcmlnaHQ7Cn0KCi5qc2dyaWQtaGVhZGVyLWNlbGwgewogICAgcGFkZGluZzogLjVlbSAuNWVtOwp9CgouanNncmlkLWZpbHRlci1yb3cgaW5wdXQsCi5qc2dyaWQtZmlsdGVyLXJvdyB0ZXh0YXJlYSwKLmpzZ3JpZC1maWx0ZXItcm93IHNlbGVjdCwKLmpzZ3JpZC1lZGl0LXJvdyBpbnB1dCwKLmpzZ3JpZC1lZGl0LXJvdyB0ZXh0YXJlYSwKLmpzZ3JpZC1lZGl0LXJvdyBzZWxlY3QsCi5qc2dyaWQtaW5zZXJ0LXJvdyBpbnB1dCwKLmpzZ3JpZC1pbnNlcnQtcm93IHRleHRhcmVhLAouanNncmlkLWluc2VydC1yb3cgc2VsZWN0IHsKICAgIHdpZHRoOiAxMDAlOwogICAgcGFkZGluZzogLjNlbSAuNWVtOwp9CgouanNncmlkLWZpbHRlci1yb3cgaW5wdXRbdHlwZT0nY2hlY2tib3gnXSwKLmpzZ3JpZC1lZGl0LXJvdyBpbnB1dFt0eXBlPSdjaGVja2JveCddLAouanNncmlkLWluc2VydC1yb3cgaW5wdXRbdHlwZT0nY2hlY2tib3gnXSB7CiAgICB3aWR0aDogYXV0bzsKfQoKCi5qc2dyaWQtc2VsZWN0ZWQtcm93IC5qc2dyaWQtY2VsbCB7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi5qc2dyaWQtbm9kYXRhLXJvdyAuanNncmlkLWNlbGwgewogICAgcGFkZGluZzogLjVlbSAwOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgouanNncmlkLWhlYWRlci1zb3J0IHsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLmpzZ3JpZC1wYWdlciB7CiAgICBwYWRkaW5nOiAuNWVtIDA7Cn0KCi5qc2dyaWQtcGFnZXItbmF2LWJ1dHRvbiB7CiAgICBwYWRkaW5nOiAuMmVtIC42ZW07Cn0KCi5qc2dyaWQtcGFnZXItbmF2LWluYWN0aXZlLWJ1dHRvbiB7CiAgICBkaXNwbGF5OiBub25lOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5qc2dyaWQtcGFnZXItcGFnZSB7CiAgICBwYWRkaW5nOiAuMmVtIC42ZW07Cn0K" ></style>
<style id="theme_css" src="data:text/css;base64,LmpzZ3JpZC1ncmlkLWhlYWRlciwKLmpzZ3JpZC1ncmlkLWJvZHksCi5qc2dyaWQtaGVhZGVyLXJvdyA+IC5qc2dyaWQtaGVhZGVyLWNlbGwsCi5qc2dyaWQtZmlsdGVyLXJvdyA+IC5qc2dyaWQtY2VsbCwKLmpzZ3JpZC1pbnNlcnQtcm93ID4gLmpzZ3JpZC1jZWxsLAouanNncmlkLWVkaXQtcm93ID4gLmpzZ3JpZC1jZWxsIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNlOWU5ZTk7Cn0KCi5qc2dyaWQtaGVhZGVyLXJvdyA+IC5qc2dyaWQtaGVhZGVyLWNlbGwgewogICAgYm9yZGVyLXRvcDogMDsKfQoKLmpzZ3JpZC1oZWFkZXItcm93ID4gLmpzZ3JpZC1oZWFkZXItY2VsbCwKLmpzZ3JpZC1maWx0ZXItcm93ID4gLmpzZ3JpZC1jZWxsLAouanNncmlkLWluc2VydC1yb3cgPiAuanNncmlkLWNlbGwgewogICAgYm9yZGVyLWJvdHRvbTogMDsKfQoKLmpzZ3JpZC1oZWFkZXItcm93ID4gLmpzZ3JpZC1oZWFkZXItY2VsbDpmaXJzdC1jaGlsZCwKLmpzZ3JpZC1maWx0ZXItcm93ID4gLmpzZ3JpZC1jZWxsOmZpcnN0LWNoaWxkLAouanNncmlkLWluc2VydC1yb3cgPiAuanNncmlkLWNlbGw6Zmlyc3QtY2hpbGQgewogICAgYm9yZGVyLWxlZnQ6IG5vbmU7Cn0KCi5qc2dyaWQtaGVhZGVyLXJvdyA+IC5qc2dyaWQtaGVhZGVyLWNlbGw6bGFzdC1jaGlsZCwKLmpzZ3JpZC1maWx0ZXItcm93ID4gLmpzZ3JpZC1jZWxsOmxhc3QtY2hpbGQsCi5qc2dyaWQtaW5zZXJ0LXJvdyA+IC5qc2dyaWQtY2VsbDpsYXN0LWNoaWxkIHsKICAgIGJvcmRlci1yaWdodDogbm9uZTsKfQoKLmpzZ3JpZC1oZWFkZXItcm93IC5qc2dyaWQtYWxpZ24tcmlnaHQsCi5qc2dyaWQtaGVhZGVyLXJvdyAuanNncmlkLWFsaWduLWxlZnQgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgouanNncmlkLWdyaWQtaGVhZGVyIHsKICAgIGJhY2tncm91bmQ6ICNmOWY5Zjk7Cn0KCi5qc2dyaWQtaGVhZGVyLXNjcm9sbGJhciB7CiAgICBzY3JvbGxiYXItYXJyb3ctY29sb3I6ICNmMWYxZjE7CiAgICBzY3JvbGxiYXItYmFzZS1jb2xvcjogI2YxZjFmMTsKICAgIHNjcm9sbGJhci0zZGxpZ2h0LWNvbG9yOiAjZjFmMWYxOwogICAgc2Nyb2xsYmFyLWhpZ2hsaWdodC1jb2xvcjogI2YxZjFmMTsKICAgIHNjcm9sbGJhci10cmFjay1jb2xvcjogI2YxZjFmMTsKICAgIHNjcm9sbGJhci1zaGFkb3ctY29sb3I6ICNmMWYxZjE7CiAgICBzY3JvbGxiYXItZGFyay1zaGFkb3ctY29sb3I6ICNmMWYxZjE7Cn0KCi5qc2dyaWQtaGVhZGVyLXNjcm9sbGJhcjo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgdmlzaWJpbGl0eTogaGlkZGVuOwp9CgouanNncmlkLWhlYWRlci1zY3JvbGxiYXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgIGJhY2tncm91bmQ6ICNmMWYxZjE7Cn0KCi5qc2dyaWQtaGVhZGVyLXNvcnRhYmxlOmhvdmVyIHsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGJhY2tncm91bmQ6ICNmY2ZjZmM7Cn0KCi5qc2dyaWQtaGVhZGVyLXJvdyAuanNncmlkLWhlYWRlci1zb3J0IHsKICAgIGJhY2tncm91bmQ6ICNjNGUyZmY7Cn0KCi5qc2dyaWQtaGVhZGVyLXNvcnQ6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICIgIjsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZmxvYXQ6IGxlZnQ7CiAgICB3aWR0aDogMDsKICAgIGhlaWdodDogMDsKICAgIGJvcmRlci1zdHlsZTogc29saWQ7Cn0KCi5qc2dyaWQtaGVhZGVyLXNvcnQtYXNjOmJlZm9yZSB7CiAgICBib3JkZXItd2lkdGg6IDAgNXB4IDVweCA1cHg7CiAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50ICMwMDlhNjcgdHJhbnNwYXJlbnQ7Cn0KCi5qc2dyaWQtaGVhZGVyLXNvcnQtZGVzYzpiZWZvcmUgewogICAgYm9yZGVyLXdpZHRoOiA1cHggNXB4IDAgNXB4OwogICAgYm9yZGVyLWNvbG9yOiAjMDA5YTY3IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50Owp9CgouanNncmlkLWdyaWQtYm9keSB7CiAgICBib3JkZXItdG9wOiBub25lOwp9CgouanNncmlkLWNlbGwgewogICAgYm9yZGVyOiAjZjNmM2YzIDFweCBzb2xpZDsKfQoKLmpzZ3JpZC1ncmlkLWJvZHkgLmpzZ3JpZC1yb3c6Zmlyc3QtY2hpbGQgLmpzZ3JpZC1jZWxsLAouanNncmlkLWdyaWQtYm9keSAuanNncmlkLWFsdC1yb3c6Zmlyc3QtY2hpbGQgLmpzZ3JpZC1jZWxsIHsKICAgIGJvcmRlci10b3A6IG5vbmU7Cn0KCi5qc2dyaWQtZ3JpZC1ib2R5IC5qc2dyaWQtY2VsbDpmaXJzdC1jaGlsZCB7CiAgICBib3JkZXItbGVmdDogbm9uZTsKfQoKLmpzZ3JpZC1ncmlkLWJvZHkgLmpzZ3JpZC1jZWxsOmxhc3QtY2hpbGQgewogICAgYm9yZGVyLXJpZ2h0OiBub25lOwp9CgouanNncmlkLXJvdyA+IC5qc2dyaWQtY2VsbCB7CiAgICBiYWNrZ3JvdW5kOiAjZmZmOwp9CgouanNncmlkLWFsdC1yb3cgPiAuanNncmlkLWNlbGwgewogICAgYmFja2dyb3VuZDogI2ZjZmNmYzsKfQoKLmpzZ3JpZC1oZWFkZXItcm93ID4gLmpzZ3JpZC1oZWFkZXItY2VsbCB7CiAgICBiYWNrZ3JvdW5kOiAjZjlmOWY5Owp9CgouanNncmlkLWZpbHRlci1yb3cgPiAuanNncmlkLWNlbGwgewogICAgYmFja2dyb3VuZDogI2ZjZmNmYzsKfQoKLmpzZ3JpZC1pbnNlcnQtcm93ID4gLmpzZ3JpZC1jZWxsIHsKICAgIGJhY2tncm91bmQ6ICNlM2ZmZTU7Cn0KCi5qc2dyaWQtZWRpdC1yb3cgPiAuanNncmlkLWNlbGwgewogICAgYmFja2dyb3VuZDogI2ZkZmZlMzsKfQoKLmpzZ3JpZC1zZWxlY3RlZC1yb3cgPiAuanNncmlkLWNlbGwgewogICAgYmFja2dyb3VuZDogI2M0ZTJmZjsKICAgIGJvcmRlci1jb2xvcjogI2M0ZTJmZjsKfQoKLmpzZ3JpZC1ub2RhdGEtcm93ID4gLmpzZ3JpZC1jZWxsIHsKICAgIGJhY2tncm91bmQ6ICNmZmY7Cn0KCi5qc2dyaWQtaW52YWxpZCBpbnB1dCwKLmpzZ3JpZC1pbnZhbGlkIHNlbGVjdCwKLmpzZ3JpZC1pbnZhbGlkIHRleHRhcmVhIHsKICAgIGJhY2tncm91bmQ6ICNmZmUzZTU7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjZmY4MDhhOwp9CgouanNncmlkLXBhZ2VyLWN1cnJlbnQtcGFnZSB7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQoKLmpzZ3JpZC1wYWdlci1uYXYtaW5hY3RpdmUtYnV0dG9uIGEgewogICAgY29sb3I6ICNkM2QzZDM7Cn0KCi5qc2dyaWQtYnV0dG9uICsgLmpzZ3JpZC1idXR0b24gewogICAgbWFyZ2luLWxlZnQ6IDVweDsKfQoKLmpzZ3JpZC1idXR0b246aG92ZXIgewogICAgb3BhY2l0eTogLjU7CiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zIGxpbmVhcjsKfQoKLmpzZ3JpZCAuanNncmlkLWJ1dHRvbiB7CiAgICB3aWR0aDogMTZweDsKICAgIGhlaWdodDogMTZweDsKICAgIGJvcmRlcjogbm9uZTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChpY29ucy5wbmcpOwogICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50Owp9CgpAbWVkaWEgb25seSBzY3JlZW4gYW5kICgtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLCBvbmx5IHNjcmVlbiBhbmQgKG1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpIHsKICAgIC5qc2dyaWQgLmpzZ3JpZC1idXR0b24gewogICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChpY29ucy0yeC5wbmcpOwogICAgICAgIGJhY2tncm91bmQtc2l6ZTogMjRweCAzNTJweDsKICAgIH0KfQoKLmpzZ3JpZCAuanNncmlkLW1vZGUtYnV0dG9uIHsKICAgIHdpZHRoOiAyNHB4OwogICAgaGVpZ2h0OiAyNHB4Owp9CgouanNncmlkLW1vZGUtb24tYnV0dG9uIHsKICAgIG9wYWNpdHk6IC41Owp9CgouanNncmlkLWNhbmNlbC1lZGl0LWJ1dHRvbiB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgMDsgd2lkdGg6IDE2cHg7IGhlaWdodDogMTZweDsgfQouanNncmlkLWNsZWFyLWZpbHRlci1idXR0b24geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC00MHB4OyB3aWR0aDogMTZweDsgaGVpZ2h0OiAxNnB4OyB9Ci5qc2dyaWQtZGVsZXRlLWJ1dHRvbiB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgLTgwcHg7IHdpZHRoOiAxNnB4OyBoZWlnaHQ6IDE2cHg7IH0KLmpzZ3JpZC1lZGl0LWJ1dHRvbiB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgLTEyMHB4OyB3aWR0aDogMTZweDsgaGVpZ2h0OiAxNnB4OyB9Ci5qc2dyaWQtaW5zZXJ0LW1vZGUtYnV0dG9uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMTYwcHg7IHdpZHRoOiAyNHB4OyBoZWlnaHQ6IDI0cHg7IH0KLmpzZ3JpZC1pbnNlcnQtYnV0dG9uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMjA4cHg7IHdpZHRoOiAxNnB4OyBoZWlnaHQ6IDE2cHg7IH0KLmpzZ3JpZC1zZWFyY2gtbW9kZS1idXR0b24geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0yNDhweDsgd2lkdGg6IDI0cHg7IGhlaWdodDogMjRweDsgfQouanNncmlkLXNlYXJjaC1idXR0b24geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0yOTZweDsgd2lkdGg6IDE2cHg7IGhlaWdodDogMTZweDsgfQouanNncmlkLXVwZGF0ZS1idXR0b24geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0zMzZweDsgd2lkdGg6IDE2cHg7IGhlaWdodDogMTZweDsgfQoKCi5qc2dyaWQtbG9hZC1zaGFkZXIgewogICAgYmFja2dyb3VuZDogI2RkZDsKICAgIG9wYWNpdHk6IC41OwogICAgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTUwKTsKfQoKLmpzZ3JpZC1sb2FkLXBhbmVsIHsKICAgIHdpZHRoOiAxNWVtOwogICAgaGVpZ2h0OiA1ZW07CiAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgYm9yZGVyOiAxcHggc29saWQgI2U5ZTllOTsKICAgIHBhZGRpbmctdG9wOiAzZW07CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5qc2dyaWQtbG9hZC1wYW5lbDpiZWZvcmUgewogICAgY29udGVudDogJyAnOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAuNWVtOwogICAgbGVmdDogNTAlOwogICAgbWFyZ2luLWxlZnQ6IC0xZW07CiAgICB3aWR0aDogMmVtOwogICAgaGVpZ2h0OiAyZW07CiAgICBib3JkZXI6IDJweCBzb2xpZCAjMDA5YTY3OwogICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgIC13ZWJraXQtYW5pbWF0aW9uOiBpbmRpY2F0b3IgMXMgbGluZWFyIGluZmluaXRlOwogICAgYW5pbWF0aW9uOiBpbmRpY2F0b3IgMXMgbGluZWFyIGluZmluaXRlOwp9CgpALXdlYmtpdC1rZXlmcmFtZXMgaW5kaWNhdG9yCnsKICAgIGZyb20geyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDBkZWcpOyB9CiAgICA1MCUgIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOyB9CiAgICB0byAgIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9Cn0KCkBrZXlmcmFtZXMgaW5kaWNhdG9yCnsKICAgIGZyb20geyB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfQogICAgNTAlICB7IHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7IH0KICAgIHRvICAgeyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9Cn0KCi8qIG9sZCBJRSAqLwouanNncmlkLWxvYWQtcGFuZWwgewogICAgcGFkZGluZy10b3A6IDEuNWVtXDk7Cn0KLmpzZ3JpZC1sb2FkLXBhbmVsOmJlZm9yZSB7CiAgICBkaXNwbGF5OiBub25lXDk7Cn0K" ></style>
<script id="jquery-1_8_3_js" src="data:text/plain;base64,LyohDQogKiBqUXVlcnkgSmF2YVNjcmlwdCBMaWJyYXJ5IHYxLjguMw0KICogaHR0cDovL2pxdWVyeS5jb20vDQogKg0KICogSW5jbHVkZXMgU2l6emxlLmpzDQogKiBodHRwOi8vc2l6emxlanMuY29tLw0KICoNCiAqIENvcHlyaWdodCAyMDEyIGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMNCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQ0KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQ0KICoNCiAqIERhdGU6IFR1ZSBOb3YgMTMgMjAxMiAwODoyMDozMyBHTVQtMDUwMCAoRWFzdGVybiBTdGFuZGFyZCBUaW1lKQ0KICovDQooZnVuY3Rpb24oIHdpbmRvdywgdW5kZWZpbmVkICkgew0KdmFyDQoJLy8gQSBjZW50cmFsIHJlZmVyZW5jZSB0byB0aGUgcm9vdCBqUXVlcnkoZG9jdW1lbnQpDQoJcm9vdGpRdWVyeSwNCg0KCS8vIFRoZSBkZWZlcnJlZCB1c2VkIG9uIERPTSByZWFkeQ0KCXJlYWR5TGlzdCwNCg0KCS8vIFVzZSB0aGUgY29ycmVjdCBkb2N1bWVudCBhY2NvcmRpbmdseSB3aXRoIHdpbmRvdyBhcmd1bWVudCAoc2FuZGJveCkNCglkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudCwNCglsb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbiwNCgluYXZpZ2F0b3IgPSB3aW5kb3cubmF2aWdhdG9yLA0KDQoJLy8gTWFwIG92ZXIgalF1ZXJ5IGluIGNhc2Ugb2Ygb3ZlcndyaXRlDQoJX2pRdWVyeSA9IHdpbmRvdy5qUXVlcnksDQoNCgkvLyBNYXAgb3ZlciB0aGUgJCBpbiBjYXNlIG9mIG92ZXJ3cml0ZQ0KCV8kID0gd2luZG93LiQsDQoNCgkvLyBTYXZlIGEgcmVmZXJlbmNlIHRvIHNvbWUgY29yZSBtZXRob2RzDQoJY29yZV9wdXNoID0gQXJyYXkucHJvdG90eXBlLnB1c2gsDQoJY29yZV9zbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZSwNCgljb3JlX2luZGV4T2YgPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiwNCgljb3JlX3RvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZywNCgljb3JlX2hhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksDQoJY29yZV90cmltID0gU3RyaW5nLnByb3RvdHlwZS50cmltLA0KDQoJLy8gRGVmaW5lIGEgbG9jYWwgY29weSBvZiBqUXVlcnkNCglqUXVlcnkgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7DQoJCS8vIFRoZSBqUXVlcnkgb2JqZWN0IGlzIGFjdHVhbGx5IGp1c3QgdGhlIGluaXQgY29uc3RydWN0b3IgJ2VuaGFuY2VkJw0KCQlyZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KCBzZWxlY3RvciwgY29udGV4dCwgcm9vdGpRdWVyeSApOw0KCX0sDQoNCgkvLyBVc2VkIGZvciBtYXRjaGluZyBudW1iZXJzDQoJY29yZV9wbnVtID0gL1tcLStdPyg/OlxkKlwufClcZCsoPzpbZUVdW1wtK10/XGQrfCkvLnNvdXJjZSwNCg0KCS8vIFVzZWQgZm9yIGRldGVjdGluZyBhbmQgdHJpbW1pbmcgd2hpdGVzcGFjZQ0KCWNvcmVfcm5vdHdoaXRlID0gL1xTLywNCgljb3JlX3JzcGFjZSA9IC9ccysvLA0KDQoJLy8gTWFrZSBzdXJlIHdlIHRyaW0gQk9NIGFuZCBOQlNQIChoZXJlJ3MgbG9va2luZyBhdCB5b3UsIFNhZmFyaSA1LjAgYW5kIElFKQ0KCXJ0cmltID0gL15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLA0KDQoJLy8gQSBzaW1wbGUgd2F5IHRvIGNoZWNrIGZvciBIVE1MIHN0cmluZ3MNCgkvLyBQcmlvcml0aXplICNpZCBvdmVyIDx0YWc+IHRvIGF2b2lkIFhTUyB2aWEgbG9jYXRpb24uaGFzaCAoIzk1MjEpDQoJcnF1aWNrRXhwciA9IC9eKD86W14jPF0qKDxbXHdcV10rPilbXj5dKiR8IyhbXHdcLV0qKSQpLywNCg0KCS8vIE1hdGNoIGEgc3RhbmRhbG9uZSB0YWcNCglyc2luZ2xlVGFnID0gL148KFx3KylccypcLz8+KD86PFwvXDE+fCkkLywNCg0KCS8vIEpTT04gUmVnRXhwDQoJcnZhbGlkY2hhcnMgPSAvXltcXSw6e31cc10qJC8sDQoJcnZhbGlkYnJhY2VzID0gLyg/Ol58OnwsKSg/OlxzKlxbKSsvZywNCglydmFsaWRlc2NhcGUgPSAvXFwoPzpbIlxcXC9iZm5ydF18dVtcZGEtZkEtRl17NH0pL2csDQoJcnZhbGlkdG9rZW5zID0gLyJbXiJcXFxyXG5dKiJ8dHJ1ZXxmYWxzZXxudWxsfC0/KD86XGRcZCpcLnwpXGQrKD86W2VFXVtcLStdP1xkK3wpL2csDQoNCgkvLyBNYXRjaGVzIGRhc2hlZCBzdHJpbmcgZm9yIGNhbWVsaXppbmcNCglybXNQcmVmaXggPSAvXi1tcy0vLA0KCXJkYXNoQWxwaGEgPSAvLShbXGRhLXpdKS9naSwNCg0KCS8vIFVzZWQgYnkgalF1ZXJ5LmNhbWVsQ2FzZSBhcyBjYWxsYmFjayB0byByZXBsYWNlKCkNCglmY2FtZWxDYXNlID0gZnVuY3Rpb24oIGFsbCwgbGV0dGVyICkgew0KCQlyZXR1cm4gKCBsZXR0ZXIgKyAiIiApLnRvVXBwZXJDYXNlKCk7DQoJfSwNCg0KCS8vIFRoZSByZWFkeSBldmVudCBoYW5kbGVyIGFuZCBzZWxmIGNsZWFudXAgbWV0aG9kDQoJRE9NQ29udGVudExvYWRlZCA9IGZ1bmN0aW9uKCkgew0KCQlpZiAoIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIgKSB7DQoJCQlkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIERPTUNvbnRlbnRMb2FkZWQsIGZhbHNlICk7DQoJCQlqUXVlcnkucmVhZHkoKTsNCgkJfSBlbHNlIGlmICggZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiApIHsNCgkJCS8vIHdlJ3JlIGhlcmUgYmVjYXVzZSByZWFkeVN0YXRlID09PSAiY29tcGxldGUiIGluIG9sZElFDQoJCQkvLyB3aGljaCBpcyBnb29kIGVub3VnaCBmb3IgdXMgdG8gY2FsbCB0aGUgZG9tIHJlYWR5IQ0KCQkJZG9jdW1lbnQuZGV0YWNoRXZlbnQoICJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBET01Db250ZW50TG9hZGVkICk7DQoJCQlqUXVlcnkucmVhZHkoKTsNCgkJfQ0KCX0sDQoNCgkvLyBbW0NsYXNzXV0gLT4gdHlwZSBwYWlycw0KCWNsYXNzMnR5cGUgPSB7fTsNCg0KalF1ZXJ5LmZuID0galF1ZXJ5LnByb3RvdHlwZSA9IHsNCgljb25zdHJ1Y3RvcjogalF1ZXJ5LA0KCWluaXQ6IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCwgcm9vdGpRdWVyeSApIHsNCgkJdmFyIG1hdGNoLCBlbGVtLCByZXQsIGRvYzsNCg0KCQkvLyBIYW5kbGUgJCgiIiksICQobnVsbCksICQodW5kZWZpbmVkKSwgJChmYWxzZSkNCgkJaWYgKCAhc2VsZWN0b3IgKSB7DQoJCQlyZXR1cm4gdGhpczsNCgkJfQ0KDQoJCS8vIEhhbmRsZSAkKERPTUVsZW1lbnQpDQoJCWlmICggc2VsZWN0b3Iubm9kZVR5cGUgKSB7DQoJCQl0aGlzLmNvbnRleHQgPSB0aGlzWzBdID0gc2VsZWN0b3I7DQoJCQl0aGlzLmxlbmd0aCA9IDE7DQoJCQlyZXR1cm4gdGhpczsNCgkJfQ0KDQoJCS8vIEhhbmRsZSBIVE1MIHN0cmluZ3MNCgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgew0KCQkJaWYgKCBzZWxlY3Rvci5jaGFyQXQoMCkgPT09ICI8IiAmJiBzZWxlY3Rvci5jaGFyQXQoIHNlbGVjdG9yLmxlbmd0aCAtIDEgKSA9PT0gIj4iICYmIHNlbGVjdG9yLmxlbmd0aCA+PSAzICkgew0KCQkJCS8vIEFzc3VtZSB0aGF0IHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNraXAgdGhlIHJlZ2V4IGNoZWNrDQoJCQkJbWF0Y2ggPSBbIG51bGwsIHNlbGVjdG9yLCBudWxsIF07DQoNCgkJCX0gZWxzZSB7DQoJCQkJbWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICk7DQoJCQl9DQoNCgkJCS8vIE1hdGNoIGh0bWwgb3IgbWFrZSBzdXJlIG5vIGNvbnRleHQgaXMgc3BlY2lmaWVkIGZvciAjaWQNCgkJCWlmICggbWF0Y2ggJiYgKG1hdGNoWzFdIHx8ICFjb250ZXh0KSApIHsNCg0KCQkJCS8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KQ0KCQkJCWlmICggbWF0Y2hbMV0gKSB7DQoJCQkJCWNvbnRleHQgPSBjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5ID8gY29udGV4dFswXSA6IGNvbnRleHQ7DQoJCQkJCWRvYyA9ICggY29udGV4dCAmJiBjb250ZXh0Lm5vZGVUeXBlID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBkb2N1bWVudCApOw0KDQoJCQkJCS8vIHNjcmlwdHMgaXMgdHJ1ZSBmb3IgYmFjay1jb21wYXQNCgkJCQkJc2VsZWN0b3IgPSBqUXVlcnkucGFyc2VIVE1MKCBtYXRjaFsxXSwgZG9jLCB0cnVlICk7DQoJCQkJCWlmICggcnNpbmdsZVRhZy50ZXN0KCBtYXRjaFsxXSApICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb250ZXh0ICkgKSB7DQoJCQkJCQl0aGlzLmF0dHIuY2FsbCggc2VsZWN0b3IsIGNvbnRleHQsIHRydWUgKTsNCgkJCQkJfQ0KDQoJCQkJCXJldHVybiBqUXVlcnkubWVyZ2UoIHRoaXMsIHNlbGVjdG9yICk7DQoNCgkJCQkvLyBIQU5ETEU6ICQoI2lkKQ0KCQkJCX0gZWxzZSB7DQoJCQkJCWVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggbWF0Y2hbMl0gKTsNCg0KCQkJCQkvLyBDaGVjayBwYXJlbnROb2RlIHRvIGNhdGNoIHdoZW4gQmxhY2tiZXJyeSA0LjYgcmV0dXJucw0KCQkJCQkvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50ICM2OTYzDQoJCQkJCWlmICggZWxlbSAmJiBlbGVtLnBhcmVudE5vZGUgKSB7DQoJCQkJCQkvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgSUUgYW5kIE9wZXJhIHJldHVybiBpdGVtcw0KCQkJCQkJLy8gYnkgbmFtZSBpbnN0ZWFkIG9mIElEDQoJCQkJCQlpZiAoIGVsZW0uaWQgIT09IG1hdGNoWzJdICkgew0KCQkJCQkJCXJldHVybiByb290alF1ZXJ5LmZpbmQoIHNlbGVjdG9yICk7DQoJCQkJCQl9DQoNCgkJCQkJCS8vIE90aGVyd2lzZSwgd2UgaW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3QNCgkJCQkJCXRoaXMubGVuZ3RoID0gMTsNCgkJCQkJCXRoaXNbMF0gPSBlbGVtOw0KCQkJCQl9DQoNCgkJCQkJdGhpcy5jb250ZXh0ID0gZG9jdW1lbnQ7DQoJCQkJCXRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjsNCgkJCQkJcmV0dXJuIHRoaXM7DQoJCQkJfQ0KDQoJCQkvLyBIQU5ETEU6ICQoZXhwciwgJCguLi4pKQ0KCQkJfSBlbHNlIGlmICggIWNvbnRleHQgfHwgY29udGV4dC5qcXVlcnkgKSB7DQoJCQkJcmV0dXJuICggY29udGV4dCB8fCByb290alF1ZXJ5ICkuZmluZCggc2VsZWN0b3IgKTsNCg0KCQkJLy8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpDQoJCQkvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcikNCgkJCX0gZWxzZSB7DQoJCQkJcmV0dXJuIHRoaXMuY29uc3RydWN0b3IoIGNvbnRleHQgKS5maW5kKCBzZWxlY3RvciApOw0KCQkJfQ0KDQoJCS8vIEhBTkRMRTogJChmdW5jdGlvbikNCgkJLy8gU2hvcnRjdXQgZm9yIGRvY3VtZW50IHJlYWR5DQoJCX0gZWxzZSBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBzZWxlY3RvciApICkgew0KCQkJcmV0dXJuIHJvb3RqUXVlcnkucmVhZHkoIHNlbGVjdG9yICk7DQoJCX0NCg0KCQlpZiAoIHNlbGVjdG9yLnNlbGVjdG9yICE9PSB1bmRlZmluZWQgKSB7DQoJCQl0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3Iuc2VsZWN0b3I7DQoJCQl0aGlzLmNvbnRleHQgPSBzZWxlY3Rvci5jb250ZXh0Ow0KCQl9DQoNCgkJcmV0dXJuIGpRdWVyeS5tYWtlQXJyYXkoIHNlbGVjdG9yLCB0aGlzICk7DQoJfSwNCg0KCS8vIFN0YXJ0IHdpdGggYW4gZW1wdHkgc2VsZWN0b3INCglzZWxlY3RvcjogIiIsDQoNCgkvLyBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIGpRdWVyeSBiZWluZyB1c2VkDQoJanF1ZXJ5OiAiMS44LjMiLA0KDQoJLy8gVGhlIGRlZmF1bHQgbGVuZ3RoIG9mIGEgalF1ZXJ5IG9iamVjdCBpcyAwDQoJbGVuZ3RoOiAwLA0KDQoJLy8gVGhlIG51bWJlciBvZiBlbGVtZW50cyBjb250YWluZWQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQNCglzaXplOiBmdW5jdGlvbigpIHsNCgkJcmV0dXJuIHRoaXMubGVuZ3RoOw0KCX0sDQoNCgl0b0FycmF5OiBmdW5jdGlvbigpIHsNCgkJcmV0dXJuIGNvcmVfc2xpY2UuY2FsbCggdGhpcyApOw0KCX0sDQoNCgkvLyBHZXQgdGhlIE50aCBlbGVtZW50IGluIHRoZSBtYXRjaGVkIGVsZW1lbnQgc2V0IE9SDQoJLy8gR2V0IHRoZSB3aG9sZSBtYXRjaGVkIGVsZW1lbnQgc2V0IGFzIGEgY2xlYW4gYXJyYXkNCglnZXQ6IGZ1bmN0aW9uKCBudW0gKSB7DQoJCXJldHVybiBudW0gPT0gbnVsbCA/DQoNCgkJCS8vIFJldHVybiBhICdjbGVhbicgYXJyYXkNCgkJCXRoaXMudG9BcnJheSgpIDoNCg0KCQkJLy8gUmV0dXJuIGp1c3QgdGhlIG9iamVjdA0KCQkJKCBudW0gPCAwID8gdGhpc1sgdGhpcy5sZW5ndGggKyBudW0gXSA6IHRoaXNbIG51bSBdICk7DQoJfSwNCg0KCS8vIFRha2UgYW4gYXJyYXkgb2YgZWxlbWVudHMgYW5kIHB1c2ggaXQgb250byB0aGUgc3RhY2sNCgkvLyAocmV0dXJuaW5nIHRoZSBuZXcgbWF0Y2hlZCBlbGVtZW50IHNldCkNCglwdXNoU3RhY2s6IGZ1bmN0aW9uKCBlbGVtcywgbmFtZSwgc2VsZWN0b3IgKSB7DQoNCgkJLy8gQnVpbGQgYSBuZXcgalF1ZXJ5IG1hdGNoZWQgZWxlbWVudCBzZXQNCgkJdmFyIHJldCA9IGpRdWVyeS5tZXJnZSggdGhpcy5jb25zdHJ1Y3RvcigpLCBlbGVtcyApOw0KDQoJCS8vIEFkZCB0aGUgb2xkIG9iamVjdCBvbnRvIHRoZSBzdGFjayAoYXMgYSByZWZlcmVuY2UpDQoJCXJldC5wcmV2T2JqZWN0ID0gdGhpczsNCg0KCQlyZXQuY29udGV4dCA9IHRoaXMuY29udGV4dDsNCg0KCQlpZiAoIG5hbWUgPT09ICJmaW5kIiApIHsNCgkJCXJldC5zZWxlY3RvciA9IHRoaXMuc2VsZWN0b3IgKyAoIHRoaXMuc2VsZWN0b3IgPyAiICIgOiAiIiApICsgc2VsZWN0b3I7DQoJCX0gZWxzZSBpZiAoIG5hbWUgKSB7DQoJCQlyZXQuc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yICsgIi4iICsgbmFtZSArICIoIiArIHNlbGVjdG9yICsgIikiOw0KCQl9DQoNCgkJLy8gUmV0dXJuIHRoZSBuZXdseS1mb3JtZWQgZWxlbWVudCBzZXQNCgkJcmV0dXJuIHJldDsNCgl9LA0KDQoJLy8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC4NCgkvLyAoWW91IGNhbiBzZWVkIHRoZSBhcmd1bWVudHMgd2l0aCBhbiBhcnJheSBvZiBhcmdzLCBidXQgdGhpcyBpcw0KCS8vIG9ubHkgdXNlZCBpbnRlcm5hbGx5LikNCgllYWNoOiBmdW5jdGlvbiggY2FsbGJhY2ssIGFyZ3MgKSB7DQoJCXJldHVybiBqUXVlcnkuZWFjaCggdGhpcywgY2FsbGJhY2ssIGFyZ3MgKTsNCgl9LA0KDQoJcmVhZHk6IGZ1bmN0aW9uKCBmbiApIHsNCgkJLy8gQWRkIHRoZSBjYWxsYmFjaw0KCQlqUXVlcnkucmVhZHkucHJvbWlzZSgpLmRvbmUoIGZuICk7DQoNCgkJcmV0dXJuIHRoaXM7DQoJfSwNCg0KCWVxOiBmdW5jdGlvbiggaSApIHsNCgkJaSA9ICtpOw0KCQlyZXR1cm4gaSA9PT0gLTEgPw0KCQkJdGhpcy5zbGljZSggaSApIDoNCgkJCXRoaXMuc2xpY2UoIGksIGkgKyAxICk7DQoJfSwNCg0KCWZpcnN0OiBmdW5jdGlvbigpIHsNCgkJcmV0dXJuIHRoaXMuZXEoIDAgKTsNCgl9LA0KDQoJbGFzdDogZnVuY3Rpb24oKSB7DQoJCXJldHVybiB0aGlzLmVxKCAtMSApOw0KCX0sDQoNCglzbGljZTogZnVuY3Rpb24oKSB7DQoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggY29yZV9zbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICksDQoJCQkic2xpY2UiLCBjb3JlX3NsaWNlLmNhbGwoYXJndW1lbnRzKS5qb2luKCIsIikgKTsNCgl9LA0KDQoJbWFwOiBmdW5jdGlvbiggY2FsbGJhY2sgKSB7DQoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm1hcCh0aGlzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsNCgkJCXJldHVybiBjYWxsYmFjay5jYWxsKCBlbGVtLCBpLCBlbGVtICk7DQoJCX0pKTsNCgl9LA0KDQoJZW5kOiBmdW5jdGlvbigpIHsNCgkJcmV0dXJuIHRoaXMucHJldk9iamVjdCB8fCB0aGlzLmNvbnN0cnVjdG9yKG51bGwpOw0KCX0sDQoNCgkvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuDQoJLy8gQmVoYXZlcyBsaWtlIGFuIEFycmF5J3MgbWV0aG9kLCBub3QgbGlrZSBhIGpRdWVyeSBtZXRob2QuDQoJcHVzaDogY29yZV9wdXNoLA0KCXNvcnQ6IFtdLnNvcnQsDQoJc3BsaWNlOiBbXS5zcGxpY2UNCn07DQoNCi8vIEdpdmUgdGhlIGluaXQgZnVuY3Rpb24gdGhlIGpRdWVyeSBwcm90b3R5cGUgZm9yIGxhdGVyIGluc3RhbnRpYXRpb24NCmpRdWVyeS5mbi5pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjsNCg0KalF1ZXJ5LmV4dGVuZCA9IGpRdWVyeS5mbi5leHRlbmQgPSBmdW5jdGlvbigpIHsNCgl2YXIgb3B0aW9ucywgbmFtZSwgc3JjLCBjb3B5LCBjb3B5SXNBcnJheSwgY2xvbmUsDQoJCXRhcmdldCA9IGFyZ3VtZW50c1swXSB8fCB7fSwNCgkJaSA9IDEsDQoJCWxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsDQoJCWRlZXAgPSBmYWxzZTsNCg0KCS8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb24NCglpZiAoIHR5cGVvZiB0YXJnZXQgPT09ICJib29sZWFuIiApIHsNCgkJZGVlcCA9IHRhcmdldDsNCgkJdGFyZ2V0ID0gYXJndW1lbnRzWzFdIHx8IHt9Ow0KCQkvLyBza2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0DQoJCWkgPSAyOw0KCX0NCg0KCS8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KQ0KCWlmICggdHlwZW9mIHRhcmdldCAhPT0gIm9iamVjdCIgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKHRhcmdldCkgKSB7DQoJCXRhcmdldCA9IHt9Ow0KCX0NCg0KCS8vIGV4dGVuZCBqUXVlcnkgaXRzZWxmIGlmIG9ubHkgb25lIGFyZ3VtZW50IGlzIHBhc3NlZA0KCWlmICggbGVuZ3RoID09PSBpICkgew0KCQl0YXJnZXQgPSB0aGlzOw0KCQktLWk7DQoJfQ0KDQoJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7DQoJCS8vIE9ubHkgZGVhbCB3aXRoIG5vbi1udWxsL3VuZGVmaW5lZCB2YWx1ZXMNCgkJaWYgKCAob3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdKSAhPSBudWxsICkgew0KCQkJLy8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdA0KCQkJZm9yICggbmFtZSBpbiBvcHRpb25zICkgew0KCQkJCXNyYyA9IHRhcmdldFsgbmFtZSBdOw0KCQkJCWNvcHkgPSBvcHRpb25zWyBuYW1lIF07DQoNCgkJCQkvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wDQoJCQkJaWYgKCB0YXJnZXQgPT09IGNvcHkgKSB7DQoJCQkJCWNvbnRpbnVlOw0KCQkJCX0NCg0KCQkJCS8vIFJlY3Vyc2UgaWYgd2UncmUgbWVyZ2luZyBwbGFpbiBvYmplY3RzIG9yIGFycmF5cw0KCQkJCWlmICggZGVlcCAmJiBjb3B5ICYmICggalF1ZXJ5LmlzUGxhaW5PYmplY3QoY29weSkgfHwgKGNvcHlJc0FycmF5ID0galF1ZXJ5LmlzQXJyYXkoY29weSkpICkgKSB7DQoJCQkJCWlmICggY29weUlzQXJyYXkgKSB7DQoJCQkJCQljb3B5SXNBcnJheSA9IGZhbHNlOw0KCQkJCQkJY2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzQXJyYXkoc3JjKSA/IHNyYyA6IFtdOw0KDQoJCQkJCX0gZWxzZSB7DQoJCQkJCQljbG9uZSA9IHNyYyAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdChzcmMpID8gc3JjIDoge307DQoJCQkJCX0NCg0KCQkJCQkvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW0NCgkJCQkJdGFyZ2V0WyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBkZWVwLCBjbG9uZSwgY29weSApOw0KDQoJCQkJLy8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlcw0KCQkJCX0gZWxzZSBpZiAoIGNvcHkgIT09IHVuZGVmaW5lZCApIHsNCgkJCQkJdGFyZ2V0WyBuYW1lIF0gPSBjb3B5Ow0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0NCg0KCS8vIFJldHVybiB0aGUgbW9kaWZpZWQgb2JqZWN0DQoJcmV0dXJuIHRhcmdldDsNCn07DQoNCmpRdWVyeS5leHRlbmQoew0KCW5vQ29uZmxpY3Q6IGZ1bmN0aW9uKCBkZWVwICkgew0KCQlpZiAoIHdpbmRvdy4kID09PSBqUXVlcnkgKSB7DQoJCQl3aW5kb3cuJCA9IF8kOw0KCQl9DQoNCgkJaWYgKCBkZWVwICYmIHdpbmRvdy5qUXVlcnkgPT09IGpRdWVyeSApIHsNCgkJCXdpbmRvdy5qUXVlcnkgPSBfalF1ZXJ5Ow0KCQl9DQoNCgkJcmV0dXJuIGpRdWVyeTsNCgl9LA0KDQoJLy8gSXMgdGhlIERPTSByZWFkeSB0byBiZSB1c2VkPyBTZXQgdG8gdHJ1ZSBvbmNlIGl0IG9jY3Vycy4NCglpc1JlYWR5OiBmYWxzZSwNCg0KCS8vIEEgY291bnRlciB0byB0cmFjayBob3cgbWFueSBpdGVtcyB0byB3YWl0IGZvciBiZWZvcmUNCgkvLyB0aGUgcmVhZHkgZXZlbnQgZmlyZXMuIFNlZSAjNjc4MQ0KCXJlYWR5V2FpdDogMSwNCg0KCS8vIEhvbGQgKG9yIHJlbGVhc2UpIHRoZSByZWFkeSBldmVudA0KCWhvbGRSZWFkeTogZnVuY3Rpb24oIGhvbGQgKSB7DQoJCWlmICggaG9sZCApIHsNCgkJCWpRdWVyeS5yZWFkeVdhaXQrKzsNCgkJfSBlbHNlIHsNCgkJCWpRdWVyeS5yZWFkeSggdHJ1ZSApOw0KCQl9DQoJfSwNCg0KCS8vIEhhbmRsZSB3aGVuIHRoZSBET00gaXMgcmVhZHkNCglyZWFkeTogZnVuY3Rpb24oIHdhaXQgKSB7DQoNCgkJLy8gQWJvcnQgaWYgdGhlcmUgYXJlIHBlbmRpbmcgaG9sZHMgb3Igd2UncmUgYWxyZWFkeSByZWFkeQ0KCQlpZiAoIHdhaXQgPT09IHRydWUgPyAtLWpRdWVyeS5yZWFkeVdhaXQgOiBqUXVlcnkuaXNSZWFkeSApIHsNCgkJCXJldHVybjsNCgkJfQ0KDQoJCS8vIE1ha2Ugc3VyZSBib2R5IGV4aXN0cywgYXQgbGVhc3QsIGluIGNhc2UgSUUgZ2V0cyBhIGxpdHRsZSBvdmVyemVhbG91cyAodGlja2V0ICM1NDQzKS4NCgkJaWYgKCAhZG9jdW1lbnQuYm9keSApIHsNCgkJCXJldHVybiBzZXRUaW1lb3V0KCBqUXVlcnkucmVhZHksIDEgKTsNCgkJfQ0KDQoJCS8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeQ0KCQlqUXVlcnkuaXNSZWFkeSA9IHRydWU7DQoNCgkJLy8gSWYgYSBub3JtYWwgRE9NIFJlYWR5IGV2ZW50IGZpcmVkLCBkZWNyZW1lbnQsIGFuZCB3YWl0IGlmIG5lZWQgYmUNCgkJaWYgKCB3YWl0ICE9PSB0cnVlICYmIC0talF1ZXJ5LnJlYWR5V2FpdCA+IDAgKSB7DQoJCQlyZXR1cm47DQoJCX0NCg0KCQkvLyBJZiB0aGVyZSBhcmUgZnVuY3Rpb25zIGJvdW5kLCB0byBleGVjdXRlDQoJCXJlYWR5TGlzdC5yZXNvbHZlV2l0aCggZG9jdW1lbnQsIFsgalF1ZXJ5IF0gKTsNCg0KCQkvLyBUcmlnZ2VyIGFueSBib3VuZCByZWFkeSBldmVudHMNCgkJaWYgKCBqUXVlcnkuZm4udHJpZ2dlciApIHsNCgkJCWpRdWVyeSggZG9jdW1lbnQgKS50cmlnZ2VyKCJyZWFkeSIpLm9mZigicmVhZHkiKTsNCgkJfQ0KCX0sDQoNCgkvLyBTZWUgdGVzdC91bml0L2NvcmUuanMgZm9yIGRldGFpbHMgY29uY2VybmluZyBpc0Z1bmN0aW9uLg0KCS8vIFNpbmNlIHZlcnNpb24gMS4zLCBET00gbWV0aG9kcyBhbmQgZnVuY3Rpb25zIGxpa2UgYWxlcnQNCgkvLyBhcmVuJ3Qgc3VwcG9ydGVkLiBUaGV5IHJldHVybiBmYWxzZSBvbiBJRSAoIzI5NjgpLg0KCWlzRnVuY3Rpb246IGZ1bmN0aW9uKCBvYmogKSB7DQoJCXJldHVybiBqUXVlcnkudHlwZShvYmopID09PSAiZnVuY3Rpb24iOw0KCX0sDQoNCglpc0FycmF5OiBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uKCBvYmogKSB7DQoJCXJldHVybiBqUXVlcnkudHlwZShvYmopID09PSAiYXJyYXkiOw0KCX0sDQoNCglpc1dpbmRvdzogZnVuY3Rpb24oIG9iaiApIHsNCgkJcmV0dXJuIG9iaiAhPSBudWxsICYmIG9iaiA9PSBvYmoud2luZG93Ow0KCX0sDQoNCglpc051bWVyaWM6IGZ1bmN0aW9uKCBvYmogKSB7DQoJCXJldHVybiAhaXNOYU4oIHBhcnNlRmxvYXQob2JqKSApICYmIGlzRmluaXRlKCBvYmogKTsNCgl9LA0KDQoJdHlwZTogZnVuY3Rpb24oIG9iaiApIHsNCgkJcmV0dXJuIG9iaiA9PSBudWxsID8NCgkJCVN0cmluZyggb2JqICkgOg0KCQkJY2xhc3MydHlwZVsgY29yZV90b1N0cmluZy5jYWxsKG9iaikgXSB8fCAib2JqZWN0IjsNCgl9LA0KDQoJaXNQbGFpbk9iamVjdDogZnVuY3Rpb24oIG9iaiApIHsNCgkJLy8gTXVzdCBiZSBhbiBPYmplY3QuDQoJCS8vIEJlY2F1c2Ugb2YgSUUsIHdlIGFsc28gaGF2ZSB0byBjaGVjayB0aGUgcHJlc2VuY2Ugb2YgdGhlIGNvbnN0cnVjdG9yIHByb3BlcnR5Lg0KCQkvLyBNYWtlIHN1cmUgdGhhdCBET00gbm9kZXMgYW5kIHdpbmRvdyBvYmplY3RzIGRvbid0IHBhc3MgdGhyb3VnaCwgYXMgd2VsbA0KCQlpZiAoICFvYmogfHwgalF1ZXJ5LnR5cGUob2JqKSAhPT0gIm9iamVjdCIgfHwgb2JqLm5vZGVUeXBlIHx8IGpRdWVyeS5pc1dpbmRvdyggb2JqICkgKSB7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCg0KCQl0cnkgew0KCQkJLy8gTm90IG93biBjb25zdHJ1Y3RvciBwcm9wZXJ0eSBtdXN0IGJlIE9iamVjdA0KCQkJaWYgKCBvYmouY29uc3RydWN0b3IgJiYNCgkJCQkhY29yZV9oYXNPd24uY2FsbChvYmosICJjb25zdHJ1Y3RvciIpICYmDQoJCQkJIWNvcmVfaGFzT3duLmNhbGwob2JqLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgImlzUHJvdG90eXBlT2YiKSApIHsNCgkJCQlyZXR1cm4gZmFsc2U7DQoJCQl9DQoJCX0gY2F0Y2ggKCBlICkgew0KCQkJLy8gSUU4LDkgV2lsbCB0aHJvdyBleGNlcHRpb25zIG9uIGNlcnRhaW4gaG9zdCBvYmplY3RzICM5ODk3DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCg0KCQkvLyBPd24gcHJvcGVydGllcyBhcmUgZW51bWVyYXRlZCBmaXJzdGx5LCBzbyB0byBzcGVlZCB1cCwNCgkJLy8gaWYgbGFzdCBvbmUgaXMgb3duLCB0aGVuIGFsbCBwcm9wZXJ0aWVzIGFyZSBvd24uDQoNCgkJdmFyIGtleTsNCgkJZm9yICgga2V5IGluIG9iaiApIHt9DQoNCgkJcmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkIHx8IGNvcmVfaGFzT3duLmNhbGwoIG9iaiwga2V5ICk7DQoJfSwNCg0KCWlzRW1wdHlPYmplY3Q6IGZ1bmN0aW9uKCBvYmogKSB7DQoJCXZhciBuYW1lOw0KCQlmb3IgKCBuYW1lIGluIG9iaiApIHsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQlyZXR1cm4gdHJ1ZTsNCgl9LA0KDQoJZXJyb3I6IGZ1bmN0aW9uKCBtc2cgKSB7DQoJCXRocm93IG5ldyBFcnJvciggbXNnICk7DQoJfSwNCg0KCS8vIGRhdGE6IHN0cmluZyBvZiBodG1sDQoJLy8gY29udGV4dCAob3B0aW9uYWwpOiBJZiBzcGVjaWZpZWQsIHRoZSBmcmFnbWVudCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhpcyBjb250ZXh0LCBkZWZhdWx0cyB0byBkb2N1bWVudA0KCS8vIHNjcmlwdHMgKG9wdGlvbmFsKTogSWYgdHJ1ZSwgd2lsbCBpbmNsdWRlIHNjcmlwdHMgcGFzc2VkIGluIHRoZSBodG1sIHN0cmluZw0KCXBhcnNlSFRNTDogZnVuY3Rpb24oIGRhdGEsIGNvbnRleHQsIHNjcmlwdHMgKSB7DQoJCXZhciBwYXJzZWQ7DQoJCWlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09ICJzdHJpbmciICkgew0KCQkJcmV0dXJuIG51bGw7DQoJCX0NCgkJaWYgKCB0eXBlb2YgY29udGV4dCA9PT0gImJvb2xlYW4iICkgew0KCQkJc2NyaXB0cyA9IGNvbnRleHQ7DQoJCQljb250ZXh0ID0gMDsNCgkJfQ0KCQljb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDsNCg0KCQkvLyBTaW5nbGUgdGFnDQoJCWlmICggKHBhcnNlZCA9IHJzaW5nbGVUYWcuZXhlYyggZGF0YSApKSApIHsNCgkJCXJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggcGFyc2VkWzFdICkgXTsNCgkJfQ0KDQoJCXBhcnNlZCA9IGpRdWVyeS5idWlsZEZyYWdtZW50KCBbIGRhdGEgXSwgY29udGV4dCwgc2NyaXB0cyA/IG51bGwgOiBbXSApOw0KCQlyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwNCgkJCShwYXJzZWQuY2FjaGVhYmxlID8galF1ZXJ5LmNsb25lKCBwYXJzZWQuZnJhZ21lbnQgKSA6IHBhcnNlZC5mcmFnbWVudCkuY2hpbGROb2RlcyApOw0KCX0sDQoNCglwYXJzZUpTT046IGZ1bmN0aW9uKCBkYXRhICkgew0KCQlpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSAic3RyaW5nIikgew0KCQkJcmV0dXJuIG51bGw7DQoJCX0NCg0KCQkvLyBNYWtlIHN1cmUgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlIGlzIHJlbW92ZWQgKElFIGNhbid0IGhhbmRsZSBpdCkNCgkJZGF0YSA9IGpRdWVyeS50cmltKCBkYXRhICk7DQoNCgkJLy8gQXR0ZW1wdCB0byBwYXJzZSB1c2luZyB0aGUgbmF0aXZlIEpTT04gcGFyc2VyIGZpcnN0DQoJCWlmICggd2luZG93LkpTT04gJiYgd2luZG93LkpTT04ucGFyc2UgKSB7DQoJCQlyZXR1cm4gd2luZG93LkpTT04ucGFyc2UoIGRhdGEgKTsNCgkJfQ0KDQoJCS8vIE1ha2Ugc3VyZSB0aGUgaW5jb21pbmcgZGF0YSBpcyBhY3R1YWwgSlNPTg0KCQkvLyBMb2dpYyBib3Jyb3dlZCBmcm9tIGh0dHA6Ly9qc29uLm9yZy9qc29uMi5qcw0KCQlpZiAoIHJ2YWxpZGNoYXJzLnRlc3QoIGRhdGEucmVwbGFjZSggcnZhbGlkZXNjYXBlLCAiQCIgKQ0KCQkJLnJlcGxhY2UoIHJ2YWxpZHRva2VucywgIl0iICkNCgkJCS5yZXBsYWNlKCBydmFsaWRicmFjZXMsICIiKSkgKSB7DQoNCgkJCXJldHVybiAoIG5ldyBGdW5jdGlvbiggInJldHVybiAiICsgZGF0YSApICkoKTsNCg0KCQl9DQoJCWpRdWVyeS5lcnJvciggIkludmFsaWQgSlNPTjogIiArIGRhdGEgKTsNCgl9LA0KDQoJLy8gQ3Jvc3MtYnJvd3NlciB4bWwgcGFyc2luZw0KCXBhcnNlWE1MOiBmdW5jdGlvbiggZGF0YSApIHsNCgkJdmFyIHhtbCwgdG1wOw0KCQlpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSAic3RyaW5nIiApIHsNCgkJCXJldHVybiBudWxsOw0KCQl9DQoJCXRyeSB7DQoJCQlpZiAoIHdpbmRvdy5ET01QYXJzZXIgKSB7IC8vIFN0YW5kYXJkDQoJCQkJdG1wID0gbmV3IERPTVBhcnNlcigpOw0KCQkJCXhtbCA9IHRtcC5wYXJzZUZyb21TdHJpbmcoIGRhdGEgLCAidGV4dC94bWwiICk7DQoJCQl9IGVsc2UgeyAvLyBJRQ0KCQkJCXhtbCA9IG5ldyBBY3RpdmVYT2JqZWN0KCAiTWljcm9zb2Z0LlhNTERPTSIgKTsNCgkJCQl4bWwuYXN5bmMgPSAiZmFsc2UiOw0KCQkJCXhtbC5sb2FkWE1MKCBkYXRhICk7DQoJCQl9DQoJCX0gY2F0Y2goIGUgKSB7DQoJCQl4bWwgPSB1bmRlZmluZWQ7DQoJCX0NCgkJaWYgKCAheG1sIHx8ICF4bWwuZG9jdW1lbnRFbGVtZW50IHx8IHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSggInBhcnNlcmVycm9yIiApLmxlbmd0aCApIHsNCgkJCWpRdWVyeS5lcnJvciggIkludmFsaWQgWE1MOiAiICsgZGF0YSApOw0KCQl9DQoJCXJldHVybiB4bWw7DQoJfSwNCg0KCW5vb3A6IGZ1bmN0aW9uKCkge30sDQoNCgkvLyBFdmFsdWF0ZXMgYSBzY3JpcHQgaW4gYSBnbG9iYWwgY29udGV4dA0KCS8vIFdvcmthcm91bmRzIGJhc2VkIG9uIGZpbmRpbmdzIGJ5IEppbSBEcmlzY29sbA0KCS8vIGh0dHA6Ly93ZWJsb2dzLmphdmEubmV0L2Jsb2cvZHJpc2NvbGwvYXJjaGl2ZS8yMDA5LzA5LzA4L2V2YWwtamF2YXNjcmlwdC1nbG9iYWwtY29udGV4dA0KCWdsb2JhbEV2YWw6IGZ1bmN0aW9uKCBkYXRhICkgew0KCQlpZiAoIGRhdGEgJiYgY29yZV9ybm90d2hpdGUudGVzdCggZGF0YSApICkgew0KCQkJLy8gV2UgdXNlIGV4ZWNTY3JpcHQgb24gSW50ZXJuZXQgRXhwbG9yZXINCgkJCS8vIFdlIHVzZSBhbiBhbm9ueW1vdXMgZnVuY3Rpb24gc28gdGhhdCBjb250ZXh0IGlzIHdpbmRvdw0KCQkJLy8gcmF0aGVyIHRoYW4galF1ZXJ5IGluIEZpcmVmb3gNCgkJCSggd2luZG93LmV4ZWNTY3JpcHQgfHwgZnVuY3Rpb24oIGRhdGEgKSB7DQoJCQkJd2luZG93WyAiZXZhbCIgXS5jYWxsKCB3aW5kb3csIGRhdGEgKTsNCgkJCX0gKSggZGF0YSApOw0KCQl9DQoJfSwNCg0KCS8vIENvbnZlcnQgZGFzaGVkIHRvIGNhbWVsQ2FzZTsgdXNlZCBieSB0aGUgY3NzIGFuZCBkYXRhIG1vZHVsZXMNCgkvLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVuZG9yIHByZWZpeCAoIzk1NzIpDQoJY2FtZWxDYXNlOiBmdW5jdGlvbiggc3RyaW5nICkgew0KCQlyZXR1cm4gc3RyaW5nLnJlcGxhY2UoIHJtc1ByZWZpeCwgIm1zLSIgKS5yZXBsYWNlKCByZGFzaEFscGhhLCBmY2FtZWxDYXNlICk7DQoJfSwNCg0KCW5vZGVOYW1lOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsNCgkJcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCk7DQoJfSwNCg0KCS8vIGFyZ3MgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHkNCgllYWNoOiBmdW5jdGlvbiggb2JqLCBjYWxsYmFjaywgYXJncyApIHsNCgkJdmFyIG5hbWUsDQoJCQlpID0gMCwNCgkJCWxlbmd0aCA9IG9iai5sZW5ndGgsDQoJCQlpc09iaiA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGpRdWVyeS5pc0Z1bmN0aW9uKCBvYmogKTsNCg0KCQlpZiAoIGFyZ3MgKSB7DQoJCQlpZiAoIGlzT2JqICkgew0KCQkJCWZvciAoIG5hbWUgaW4gb2JqICkgew0KCQkJCQlpZiAoIGNhbGxiYWNrLmFwcGx5KCBvYmpbIG5hbWUgXSwgYXJncyApID09PSBmYWxzZSApIHsNCgkJCQkJCWJyZWFrOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQlmb3IgKCA7IGkgPCBsZW5ndGg7ICkgew0KCQkJCQlpZiAoIGNhbGxiYWNrLmFwcGx5KCBvYmpbIGkrKyBdLCBhcmdzICkgPT09IGZhbHNlICkgew0KCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoNCgkJLy8gQSBzcGVjaWFsLCBmYXN0LCBjYXNlIGZvciB0aGUgbW9zdCBjb21tb24gdXNlIG9mIGVhY2gNCgkJfSBlbHNlIHsNCgkJCWlmICggaXNPYmogKSB7DQoJCQkJZm9yICggbmFtZSBpbiBvYmogKSB7DQoJCQkJCWlmICggY2FsbGJhY2suY2FsbCggb2JqWyBuYW1lIF0sIG5hbWUsIG9ialsgbmFtZSBdICkgPT09IGZhbHNlICkgew0KCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQl9DQoJCQl9IGVsc2Ugew0KCQkJCWZvciAoIDsgaSA8IGxlbmd0aDsgKSB7DQoJCQkJCWlmICggY2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSsrIF0gKSA9PT0gZmFsc2UgKSB7DQoJCQkJCQlicmVhazsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfQ0KDQoJCXJldHVybiBvYmo7DQoJfSwNCg0KCS8vIFVzZSBuYXRpdmUgU3RyaW5nLnRyaW0gZnVuY3Rpb24gd2hlcmV2ZXIgcG9zc2libGUNCgl0cmltOiBjb3JlX3RyaW0gJiYgIWNvcmVfdHJpbS5jYWxsKCJcdUZFRkZceEEwIikgPw0KCQlmdW5jdGlvbiggdGV4dCApIHsNCgkJCXJldHVybiB0ZXh0ID09IG51bGwgPw0KCQkJCSIiIDoNCgkJCQljb3JlX3RyaW0uY2FsbCggdGV4dCApOw0KCQl9IDoNCg0KCQkvLyBPdGhlcndpc2UgdXNlIG91ciBvd24gdHJpbW1pbmcgZnVuY3Rpb25hbGl0eQ0KCQlmdW5jdGlvbiggdGV4dCApIHsNCgkJCXJldHVybiB0ZXh0ID09IG51bGwgPw0KCQkJCSIiIDoNCgkJCQkoIHRleHQgKyAiIiApLnJlcGxhY2UoIHJ0cmltLCAiIiApOw0KCQl9LA0KDQoJLy8gcmVzdWx0cyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seQ0KCW1ha2VBcnJheTogZnVuY3Rpb24oIGFyciwgcmVzdWx0cyApIHsNCgkJdmFyIHR5cGUsDQoJCQlyZXQgPSByZXN1bHRzIHx8IFtdOw0KDQoJCWlmICggYXJyICE9IG51bGwgKSB7DQoJCQkvLyBUaGUgd2luZG93LCBzdHJpbmdzIChhbmQgZnVuY3Rpb25zKSBhbHNvIGhhdmUgJ2xlbmd0aCcNCgkJCS8vIFR3ZWFrZWQgbG9naWMgc2xpZ2h0bHkgdG8gaGFuZGxlIEJsYWNrYmVycnkgNC43IFJlZ0V4cCBpc3N1ZXMgIzY5MzANCgkJCXR5cGUgPSBqUXVlcnkudHlwZSggYXJyICk7DQoNCgkJCWlmICggYXJyLmxlbmd0aCA9PSBudWxsIHx8IHR5cGUgPT09ICJzdHJpbmciIHx8IHR5cGUgPT09ICJmdW5jdGlvbiIgfHwgdHlwZSA9PT0gInJlZ2V4cCIgfHwgalF1ZXJ5LmlzV2luZG93KCBhcnIgKSApIHsNCgkJCQljb3JlX3B1c2guY2FsbCggcmV0LCBhcnIgKTsNCgkJCX0gZWxzZSB7DQoJCQkJalF1ZXJ5Lm1lcmdlKCByZXQsIGFyciApOw0KCQkJfQ0KCQl9DQoNCgkJcmV0dXJuIHJldDsNCgl9LA0KDQoJaW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFyciwgaSApIHsNCgkJdmFyIGxlbjsNCg0KCQlpZiAoIGFyciApIHsNCgkJCWlmICggY29yZV9pbmRleE9mICkgew0KCQkJCXJldHVybiBjb3JlX2luZGV4T2YuY2FsbCggYXJyLCBlbGVtLCBpICk7DQoJCQl9DQoNCgkJCWxlbiA9IGFyci5sZW5ndGg7DQoJCQlpID0gaSA/IGkgPCAwID8gTWF0aC5tYXgoIDAsIGxlbiArIGkgKSA6IGkgOiAwOw0KDQoJCQlmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsNCgkJCQkvLyBTa2lwIGFjY2Vzc2luZyBpbiBzcGFyc2UgYXJyYXlzDQoJCQkJaWYgKCBpIGluIGFyciAmJiBhcnJbIGkgXSA9PT0gZWxlbSApIHsNCgkJCQkJcmV0dXJuIGk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoNCgkJcmV0dXJuIC0xOw0KCX0sDQoNCgltZXJnZTogZnVuY3Rpb24oIGZpcnN0LCBzZWNvbmQgKSB7DQoJCXZhciBsID0gc2Vjb25kLmxlbmd0aCwNCgkJCWkgPSBmaXJzdC5sZW5ndGgsDQoJCQlqID0gMDsNCg0KCQlpZiAoIHR5cGVvZiBsID09PSAibnVtYmVyIiApIHsNCgkJCWZvciAoIDsgaiA8IGw7IGorKyApIHsNCgkJCQlmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTsNCgkJCX0NCg0KCQl9IGVsc2Ugew0KCQkJd2hpbGUgKCBzZWNvbmRbal0gIT09IHVuZGVmaW5lZCApIHsNCgkJCQlmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGorKyBdOw0KCQkJfQ0KCQl9DQoNCgkJZmlyc3QubGVuZ3RoID0gaTsNCg0KCQlyZXR1cm4gZmlyc3Q7DQoJfSwNCg0KCWdyZXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGludiApIHsNCgkJdmFyIHJldFZhbCwNCgkJCXJldCA9IFtdLA0KCQkJaSA9IDAsDQoJCQlsZW5ndGggPSBlbGVtcy5sZW5ndGg7DQoJCWludiA9ICEhaW52Ow0KDQoJCS8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCBvbmx5IHNhdmluZyB0aGUgaXRlbXMNCgkJLy8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb24NCgkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7DQoJCQlyZXRWYWwgPSAhIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7DQoJCQlpZiAoIGludiAhPT0gcmV0VmFsICkgew0KCQkJCXJldC5wdXNoKCBlbGVtc1sgaSBdICk7DQoJCQl9DQoJCX0NCg0KCQlyZXR1cm4gcmV0Ow0KCX0sDQoNCgkvLyBhcmcgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHkNCgltYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGFyZyApIHsNCgkJdmFyIHZhbHVlLCBrZXksDQoJCQlyZXQgPSBbXSwNCgkJCWkgPSAwLA0KCQkJbGVuZ3RoID0gZWxlbXMubGVuZ3RoLA0KCQkJLy8ganF1ZXJ5IG9iamVjdHMgYXJlIHRyZWF0ZWQgYXMgYXJyYXlzDQoJCQlpc0FycmF5ID0gZWxlbXMgaW5zdGFuY2VvZiBqUXVlcnkgfHwgbGVuZ3RoICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGxlbmd0aCA9PT0gIm51bWJlciIgJiYgKCAoIGxlbmd0aCA+IDAgJiYgZWxlbXNbIDAgXSAmJiBlbGVtc1sgbGVuZ3RoIC0xIF0gKSB8fCBsZW5ndGggPT09IDAgfHwgalF1ZXJ5LmlzQXJyYXkoIGVsZW1zICkgKSA7DQoNCgkJLy8gR28gdGhyb3VnaCB0aGUgYXJyYXksIHRyYW5zbGF0aW5nIGVhY2ggb2YgdGhlIGl0ZW1zIHRvIHRoZWlyDQoJCWlmICggaXNBcnJheSApIHsNCgkJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgew0KCQkJCXZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0sIGksIGFyZyApOw0KDQoJCQkJaWYgKCB2YWx1ZSAhPSBudWxsICkgew0KCQkJCQlyZXRbIHJldC5sZW5ndGggXSA9IHZhbHVlOw0KCQkJCX0NCgkJCX0NCg0KCQkvLyBHbyB0aHJvdWdoIGV2ZXJ5IGtleSBvbiB0aGUgb2JqZWN0LA0KCQl9IGVsc2Ugew0KCQkJZm9yICgga2V5IGluIGVsZW1zICkgew0KCQkJCXZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBrZXkgXSwga2V5LCBhcmcgKTsNCg0KCQkJCWlmICggdmFsdWUgIT0gbnVsbCApIHsNCgkJCQkJcmV0WyByZXQubGVuZ3RoIF0gPSB2YWx1ZTsNCgkJCQl9DQoJCQl9DQoJCX0NCg0KCQkvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzDQoJCXJldHVybiByZXQuY29uY2F0LmFwcGx5KCBbXSwgcmV0ICk7DQoJfSwNCg0KCS8vIEEgZ2xvYmFsIEdVSUQgY291bnRlciBmb3Igb2JqZWN0cw0KCWd1aWQ6IDEsDQoNCgkvLyBCaW5kIGEgZnVuY3Rpb24gdG8gYSBjb250ZXh0LCBvcHRpb25hbGx5IHBhcnRpYWxseSBhcHBseWluZyBhbnkNCgkvLyBhcmd1bWVudHMuDQoJcHJveHk6IGZ1bmN0aW9uKCBmbiwgY29udGV4dCApIHsNCgkJdmFyIHRtcCwgYXJncywgcHJveHk7DQoNCgkJaWYgKCB0eXBlb2YgY29udGV4dCA9PT0gInN0cmluZyIgKSB7DQoJCQl0bXAgPSBmblsgY29udGV4dCBdOw0KCQkJY29udGV4dCA9IGZuOw0KCQkJZm4gPSB0bXA7DQoJCX0NCg0KCQkvLyBRdWljayBjaGVjayB0byBkZXRlcm1pbmUgaWYgdGFyZ2V0IGlzIGNhbGxhYmxlLCBpbiB0aGUgc3BlYw0KCQkvLyB0aGlzIHRocm93cyBhIFR5cGVFcnJvciwgYnV0IHdlIHdpbGwganVzdCByZXR1cm4gdW5kZWZpbmVkLg0KCQlpZiAoICFqUXVlcnkuaXNGdW5jdGlvbiggZm4gKSApIHsNCgkJCXJldHVybiB1bmRlZmluZWQ7DQoJCX0NCg0KCQkvLyBTaW11bGF0ZWQgYmluZA0KCQlhcmdzID0gY29yZV9zbGljZS5jYWxsKCBhcmd1bWVudHMsIDIgKTsNCgkJcHJveHkgPSBmdW5jdGlvbigpIHsNCgkJCXJldHVybiBmbi5hcHBseSggY29udGV4dCwgYXJncy5jb25jYXQoIGNvcmVfc2xpY2UuY2FsbCggYXJndW1lbnRzICkgKSApOw0KCQl9Ow0KDQoJCS8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZA0KCQlwcm94eS5ndWlkID0gZm4uZ3VpZCA9IGZuLmd1aWQgfHwgalF1ZXJ5Lmd1aWQrKzsNCg0KCQlyZXR1cm4gcHJveHk7DQoJfSwNCg0KCS8vIE11bHRpZnVuY3Rpb25hbCBtZXRob2QgdG8gZ2V0IGFuZCBzZXQgdmFsdWVzIG9mIGEgY29sbGVjdGlvbg0KCS8vIFRoZSB2YWx1ZS9zIGNhbiBvcHRpb25hbGx5IGJlIGV4ZWN1dGVkIGlmIGl0J3MgYSBmdW5jdGlvbg0KCWFjY2VzczogZnVuY3Rpb24oIGVsZW1zLCBmbiwga2V5LCB2YWx1ZSwgY2hhaW5hYmxlLCBlbXB0eUdldCwgcGFzcyApIHsNCgkJdmFyIGV4ZWMsDQoJCQlidWxrID0ga2V5ID09IG51bGwsDQoJCQlpID0gMCwNCgkJCWxlbmd0aCA9IGVsZW1zLmxlbmd0aDsNCg0KCQkvLyBTZXRzIG1hbnkgdmFsdWVzDQoJCWlmICgga2V5ICYmIHR5cGVvZiBrZXkgPT09ICJvYmplY3QiICkgew0KCQkJZm9yICggaSBpbiBrZXkgKSB7DQoJCQkJalF1ZXJ5LmFjY2VzcyggZWxlbXMsIGZuLCBpLCBrZXlbaV0sIDEsIGVtcHR5R2V0LCB2YWx1ZSApOw0KCQkJfQ0KCQkJY2hhaW5hYmxlID0gMTsNCg0KCQkvLyBTZXRzIG9uZSB2YWx1ZQ0KCQl9IGVsc2UgaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgew0KCQkJLy8gT3B0aW9uYWxseSwgZnVuY3Rpb24gdmFsdWVzIGdldCBleGVjdXRlZCBpZiBleGVjIGlzIHRydWUNCgkJCWV4ZWMgPSBwYXNzID09PSB1bmRlZmluZWQgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICk7DQoNCgkJCWlmICggYnVsayApIHsNCgkJCQkvLyBCdWxrIG9wZXJhdGlvbnMgb25seSBpdGVyYXRlIHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVlcw0KCQkJCWlmICggZXhlYyApIHsNCgkJCQkJZXhlYyA9IGZuOw0KCQkJCQlmbiA9IGZ1bmN0aW9uKCBlbGVtLCBrZXksIHZhbHVlICkgew0KCQkJCQkJcmV0dXJuIGV4ZWMuY2FsbCggalF1ZXJ5KCBlbGVtICksIHZhbHVlICk7DQoJCQkJCX07DQoNCgkJCQkvLyBPdGhlcndpc2UgdGhleSBydW4gYWdhaW5zdCB0aGUgZW50aXJlIHNldA0KCQkJCX0gZWxzZSB7DQoJCQkJCWZuLmNhbGwoIGVsZW1zLCB2YWx1ZSApOw0KCQkJCQlmbiA9IG51bGw7DQoJCQkJfQ0KCQkJfQ0KDQoJCQlpZiAoIGZuICkgew0KCQkJCWZvciAoOyBpIDwgbGVuZ3RoOyBpKysgKSB7DQoJCQkJCWZuKCBlbGVtc1tpXSwga2V5LCBleGVjID8gdmFsdWUuY2FsbCggZWxlbXNbaV0sIGksIGZuKCBlbGVtc1tpXSwga2V5ICkgKSA6IHZhbHVlLCBwYXNzICk7DQoJCQkJfQ0KCQkJfQ0KDQoJCQljaGFpbmFibGUgPSAxOw0KCQl9DQoNCgkJcmV0dXJuIGNoYWluYWJsZSA/DQoJCQllbGVtcyA6DQoNCgkJCS8vIEdldHMNCgkJCWJ1bGsgPw0KCQkJCWZuLmNhbGwoIGVsZW1zICkgOg0KCQkJCWxlbmd0aCA/IGZuKCBlbGVtc1swXSwga2V5ICkgOiBlbXB0eUdldDsNCgl9LA0KDQoJbm93OiBmdW5jdGlvbigpIHsNCgkJcmV0dXJuICggbmV3IERhdGUoKSApLmdldFRpbWUoKTsNCgl9DQp9KTsNCg0KalF1ZXJ5LnJlYWR5LnByb21pc2UgPSBmdW5jdGlvbiggb2JqICkgew0KCWlmICggIXJlYWR5TGlzdCApIHsNCg0KCQlyZWFkeUxpc3QgPSBqUXVlcnkuRGVmZXJyZWQoKTsNCg0KCQkvLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZCBhZnRlciB0aGUgYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC4NCgkJLy8gd2Ugb25jZSB0cmllZCB0byB1c2UgcmVhZHlTdGF0ZSAiaW50ZXJhY3RpdmUiIGhlcmUsIGJ1dCBpdCBjYXVzZWQgaXNzdWVzIGxpa2UgdGhlIG9uZQ0KCQkvLyBkaXNjb3ZlcmVkIGJ5IENocmlzUyBoZXJlOiBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMjI4MiNjb21tZW50OjE1DQoJCWlmICggZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiApIHsNCgkJCS8vIEhhbmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeQ0KCQkJc2V0VGltZW91dCggalF1ZXJ5LnJlYWR5LCAxICk7DQoNCgkJLy8gU3RhbmRhcmRzLWJhc2VkIGJyb3dzZXJzIHN1cHBvcnQgRE9NQ29udGVudExvYWRlZA0KCQl9IGVsc2UgaWYgKCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyICkgew0KCQkJLy8gVXNlIHRoZSBoYW5keSBldmVudCBjYWxsYmFjaw0KCQkJZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggIkRPTUNvbnRlbnRMb2FkZWQiLCBET01Db250ZW50TG9hZGVkLCBmYWxzZSApOw0KDQoJCQkvLyBBIGZhbGxiYWNrIHRvIHdpbmRvdy5vbmxvYWQsIHRoYXQgd2lsbCBhbHdheXMgd29yaw0KCQkJd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICJsb2FkIiwgalF1ZXJ5LnJlYWR5LCBmYWxzZSApOw0KDQoJCS8vIElmIElFIGV2ZW50IG1vZGVsIGlzIHVzZWQNCgkJfSBlbHNlIHsNCgkJCS8vIEVuc3VyZSBmaXJpbmcgYmVmb3JlIG9ubG9hZCwgbWF5YmUgbGF0ZSBidXQgc2FmZSBhbHNvIGZvciBpZnJhbWVzDQoJCQlkb2N1bWVudC5hdHRhY2hFdmVudCggIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIERPTUNvbnRlbnRMb2FkZWQgKTsNCg0KCQkJLy8gQSBmYWxsYmFjayB0byB3aW5kb3cub25sb2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmsNCgkJCXdpbmRvdy5hdHRhY2hFdmVudCggIm9ubG9hZCIsIGpRdWVyeS5yZWFkeSApOw0KDQoJCQkvLyBJZiBJRSBhbmQgbm90IGEgZnJhbWUNCgkJCS8vIGNvbnRpbnVhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGUgZG9jdW1lbnQgaXMgcmVhZHkNCgkJCXZhciB0b3AgPSBmYWxzZTsNCg0KCQkJdHJ5IHsNCgkJCQl0b3AgPSB3aW5kb3cuZnJhbWVFbGVtZW50ID09IG51bGwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Ow0KCQkJfSBjYXRjaChlKSB7fQ0KDQoJCQlpZiAoIHRvcCAmJiB0b3AuZG9TY3JvbGwgKSB7DQoJCQkJKGZ1bmN0aW9uIGRvU2Nyb2xsQ2hlY2soKSB7DQoJCQkJCWlmICggIWpRdWVyeS5pc1JlYWR5ICkgew0KDQoJCQkJCQl0cnkgew0KCQkJCQkJCS8vIFVzZSB0aGUgdHJpY2sgYnkgRGllZ28gUGVyaW5pDQoJCQkJCQkJLy8gaHR0cDovL2phdmFzY3JpcHQubndib3guY29tL0lFQ29udGVudExvYWRlZC8NCgkJCQkJCQl0b3AuZG9TY3JvbGwoImxlZnQiKTsNCgkJCQkJCX0gY2F0Y2goZSkgew0KCQkJCQkJCXJldHVybiBzZXRUaW1lb3V0KCBkb1Njcm9sbENoZWNrLCA1MCApOw0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBhbmQgZXhlY3V0ZSBhbnkgd2FpdGluZyBmdW5jdGlvbnMNCgkJCQkJCWpRdWVyeS5yZWFkeSgpOw0KCQkJCQl9DQoJCQkJfSkoKTsNCgkJCX0NCgkJfQ0KCX0NCglyZXR1cm4gcmVhZHlMaXN0LnByb21pc2UoIG9iaiApOw0KfTsNCg0KLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUgbWFwDQpqUXVlcnkuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCIuc3BsaXQoIiAiKSwgZnVuY3Rpb24oaSwgbmFtZSkgew0KCWNsYXNzMnR5cGVbICJbb2JqZWN0ICIgKyBuYW1lICsgIl0iIF0gPSBuYW1lLnRvTG93ZXJDYXNlKCk7DQp9KTsNCg0KLy8gQWxsIGpRdWVyeSBvYmplY3RzIHNob3VsZCBwb2ludCBiYWNrIHRvIHRoZXNlDQpyb290alF1ZXJ5ID0galF1ZXJ5KGRvY3VtZW50KTsNCi8vIFN0cmluZyB0byBPYmplY3Qgb3B0aW9ucyBmb3JtYXQgY2FjaGUNCnZhciBvcHRpb25zQ2FjaGUgPSB7fTsNCg0KLy8gQ29udmVydCBTdHJpbmctZm9ybWF0dGVkIG9wdGlvbnMgaW50byBPYmplY3QtZm9ybWF0dGVkIG9uZXMgYW5kIHN0b3JlIGluIGNhY2hlDQpmdW5jdGlvbiBjcmVhdGVPcHRpb25zKCBvcHRpb25zICkgew0KCXZhciBvYmplY3QgPSBvcHRpb25zQ2FjaGVbIG9wdGlvbnMgXSA9IHt9Ow0KCWpRdWVyeS5lYWNoKCBvcHRpb25zLnNwbGl0KCBjb3JlX3JzcGFjZSApLCBmdW5jdGlvbiggXywgZmxhZyApIHsNCgkJb2JqZWN0WyBmbGFnIF0gPSB0cnVlOw0KCX0pOw0KCXJldHVybiBvYmplY3Q7DQp9DQoNCi8qDQogKiBDcmVhdGUgYSBjYWxsYmFjayBsaXN0IHVzaW5nIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoNCiAqDQogKglvcHRpb25zOiBhbiBvcHRpb25hbCBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBvcHRpb25zIHRoYXQgd2lsbCBjaGFuZ2UgaG93DQogKgkJCXRoZSBjYWxsYmFjayBsaXN0IGJlaGF2ZXMgb3IgYSBtb3JlIHRyYWRpdGlvbmFsIG9wdGlvbiBvYmplY3QNCiAqDQogKiBCeSBkZWZhdWx0IGEgY2FsbGJhY2sgbGlzdCB3aWxsIGFjdCBsaWtlIGFuIGV2ZW50IGNhbGxiYWNrIGxpc3QgYW5kIGNhbiBiZQ0KICogImZpcmVkIiBtdWx0aXBsZSB0aW1lcy4NCiAqDQogKiBQb3NzaWJsZSBvcHRpb25zOg0KICoNCiAqCW9uY2U6CQkJd2lsbCBlbnN1cmUgdGhlIGNhbGxiYWNrIGxpc3QgY2FuIG9ubHkgYmUgZmlyZWQgb25jZSAobGlrZSBhIERlZmVycmVkKQ0KICoNCiAqCW1lbW9yeToJCQl3aWxsIGtlZXAgdHJhY2sgb2YgcHJldmlvdXMgdmFsdWVzIGFuZCB3aWxsIGNhbGwgYW55IGNhbGxiYWNrIGFkZGVkDQogKgkJCQkJYWZ0ZXIgdGhlIGxpc3QgaGFzIGJlZW4gZmlyZWQgcmlnaHQgYXdheSB3aXRoIHRoZSBsYXRlc3QgIm1lbW9yaXplZCINCiAqCQkJCQl2YWx1ZXMgKGxpa2UgYSBEZWZlcnJlZCkNCiAqDQogKgl1bmlxdWU6CQkJd2lsbCBlbnN1cmUgYSBjYWxsYmFjayBjYW4gb25seSBiZSBhZGRlZCBvbmNlIChubyBkdXBsaWNhdGUgaW4gdGhlIGxpc3QpDQogKg0KICoJc3RvcE9uRmFsc2U6CWludGVycnVwdCBjYWxsaW5ncyB3aGVuIGEgY2FsbGJhY2sgcmV0dXJucyBmYWxzZQ0KICoNCiAqLw0KalF1ZXJ5LkNhbGxiYWNrcyA9IGZ1bmN0aW9uKCBvcHRpb25zICkgew0KDQoJLy8gQ29udmVydCBvcHRpb25zIGZyb20gU3RyaW5nLWZvcm1hdHRlZCB0byBPYmplY3QtZm9ybWF0dGVkIGlmIG5lZWRlZA0KCS8vICh3ZSBjaGVjayBpbiBjYWNoZSBmaXJzdCkNCglvcHRpb25zID0gdHlwZW9mIG9wdGlvbnMgPT09ICJzdHJpbmciID8NCgkJKCBvcHRpb25zQ2FjaGVbIG9wdGlvbnMgXSB8fCBjcmVhdGVPcHRpb25zKCBvcHRpb25zICkgKSA6DQoJCWpRdWVyeS5leHRlbmQoIHt9LCBvcHRpb25zICk7DQoNCgl2YXIgLy8gTGFzdCBmaXJlIHZhbHVlIChmb3Igbm9uLWZvcmdldHRhYmxlIGxpc3RzKQ0KCQltZW1vcnksDQoJCS8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IHdhcyBhbHJlYWR5IGZpcmVkDQoJCWZpcmVkLA0KCQkvLyBGbGFnIHRvIGtub3cgaWYgbGlzdCBpcyBjdXJyZW50bHkgZmlyaW5nDQoJCWZpcmluZywNCgkJLy8gRmlyc3QgY2FsbGJhY2sgdG8gZmlyZSAodXNlZCBpbnRlcm5hbGx5IGJ5IGFkZCBhbmQgZmlyZVdpdGgpDQoJCWZpcmluZ1N0YXJ0LA0KCQkvLyBFbmQgb2YgdGhlIGxvb3Agd2hlbiBmaXJpbmcNCgkJZmlyaW5nTGVuZ3RoLA0KCQkvLyBJbmRleCBvZiBjdXJyZW50bHkgZmlyaW5nIGNhbGxiYWNrIChtb2RpZmllZCBieSByZW1vdmUgaWYgbmVlZGVkKQ0KCQlmaXJpbmdJbmRleCwNCgkJLy8gQWN0dWFsIGNhbGxiYWNrIGxpc3QNCgkJbGlzdCA9IFtdLA0KCQkvLyBTdGFjayBvZiBmaXJlIGNhbGxzIGZvciByZXBlYXRhYmxlIGxpc3RzDQoJCXN0YWNrID0gIW9wdGlvbnMub25jZSAmJiBbXSwNCgkJLy8gRmlyZSBjYWxsYmFja3MNCgkJZmlyZSA9IGZ1bmN0aW9uKCBkYXRhICkgew0KCQkJbWVtb3J5ID0gb3B0aW9ucy5tZW1vcnkgJiYgZGF0YTsNCgkJCWZpcmVkID0gdHJ1ZTsNCgkJCWZpcmluZ0luZGV4ID0gZmlyaW5nU3RhcnQgfHwgMDsNCgkJCWZpcmluZ1N0YXJ0ID0gMDsNCgkJCWZpcmluZ0xlbmd0aCA9IGxpc3QubGVuZ3RoOw0KCQkJZmlyaW5nID0gdHJ1ZTsNCgkJCWZvciAoIDsgbGlzdCAmJiBmaXJpbmdJbmRleCA8IGZpcmluZ0xlbmd0aDsgZmlyaW5nSW5kZXgrKyApIHsNCgkJCQlpZiAoIGxpc3RbIGZpcmluZ0luZGV4IF0uYXBwbHkoIGRhdGFbIDAgXSwgZGF0YVsgMSBdICkgPT09IGZhbHNlICYmIG9wdGlvbnMuc3RvcE9uRmFsc2UgKSB7DQoJCQkJCW1lbW9yeSA9IGZhbHNlOyAvLyBUbyBwcmV2ZW50IGZ1cnRoZXIgY2FsbHMgdXNpbmcgYWRkDQoJCQkJCWJyZWFrOw0KCQkJCX0NCgkJCX0NCgkJCWZpcmluZyA9IGZhbHNlOw0KCQkJaWYgKCBsaXN0ICkgew0KCQkJCWlmICggc3RhY2sgKSB7DQoJCQkJCWlmICggc3RhY2subGVuZ3RoICkgew0KCQkJCQkJZmlyZSggc3RhY2suc2hpZnQoKSApOw0KCQkJCQl9DQoJCQkJfSBlbHNlIGlmICggbWVtb3J5ICkgew0KCQkJCQlsaXN0ID0gW107DQoJCQkJfSBlbHNlIHsNCgkJCQkJc2VsZi5kaXNhYmxlKCk7DQoJCQkJfQ0KCQkJfQ0KCQl9LA0KCQkvLyBBY3R1YWwgQ2FsbGJhY2tzIG9iamVjdA0KCQlzZWxmID0gew0KCQkJLy8gQWRkIGEgY2FsbGJhY2sgb3IgYSBjb2xsZWN0aW9uIG9mIGNhbGxiYWNrcyB0byB0aGUgbGlzdA0KCQkJYWRkOiBmdW5jdGlvbigpIHsNCgkJCQlpZiAoIGxpc3QgKSB7DQoJCQkJCS8vIEZpcnN0LCB3ZSBzYXZlIHRoZSBjdXJyZW50IGxlbmd0aA0KCQkJCQl2YXIgc3RhcnQgPSBsaXN0Lmxlbmd0aDsNCgkJCQkJKGZ1bmN0aW9uIGFkZCggYXJncyApIHsNCgkJCQkJCWpRdWVyeS5lYWNoKCBhcmdzLCBmdW5jdGlvbiggXywgYXJnICkgew0KCQkJCQkJCXZhciB0eXBlID0galF1ZXJ5LnR5cGUoIGFyZyApOw0KCQkJCQkJCWlmICggdHlwZSA9PT0gImZ1bmN0aW9uIiApIHsNCgkJCQkJCQkJaWYgKCAhb3B0aW9ucy51bmlxdWUgfHwgIXNlbGYuaGFzKCBhcmcgKSApIHsNCgkJCQkJCQkJCWxpc3QucHVzaCggYXJnICk7DQoJCQkJCQkJCX0NCgkJCQkJCQl9IGVsc2UgaWYgKCBhcmcgJiYgYXJnLmxlbmd0aCAmJiB0eXBlICE9PSAic3RyaW5nIiApIHsNCgkJCQkJCQkJLy8gSW5zcGVjdCByZWN1cnNpdmVseQ0KCQkJCQkJCQlhZGQoIGFyZyApOw0KCQkJCQkJCX0NCgkJCQkJCX0pOw0KCQkJCQl9KSggYXJndW1lbnRzICk7DQoJCQkJCS8vIERvIHdlIG5lZWQgdG8gYWRkIHRoZSBjYWxsYmFja3MgdG8gdGhlDQoJCQkJCS8vIGN1cnJlbnQgZmlyaW5nIGJhdGNoPw0KCQkJCQlpZiAoIGZpcmluZyApIHsNCgkJCQkJCWZpcmluZ0xlbmd0aCA9IGxpc3QubGVuZ3RoOw0KCQkJCQkvLyBXaXRoIG1lbW9yeSwgaWYgd2UncmUgbm90IGZpcmluZyB0aGVuDQoJCQkJCS8vIHdlIHNob3VsZCBjYWxsIHJpZ2h0IGF3YXkNCgkJCQkJfSBlbHNlIGlmICggbWVtb3J5ICkgew0KCQkJCQkJZmlyaW5nU3RhcnQgPSBzdGFydDsNCgkJCQkJCWZpcmUoIG1lbW9yeSApOw0KCQkJCQl9DQoJCQkJfQ0KCQkJCXJldHVybiB0aGlzOw0KCQkJfSwNCgkJCS8vIFJlbW92ZSBhIGNhbGxiYWNrIGZyb20gdGhlIGxpc3QNCgkJCXJlbW92ZTogZnVuY3Rpb24oKSB7DQoJCQkJaWYgKCBsaXN0ICkgew0KCQkJCQlqUXVlcnkuZWFjaCggYXJndW1lbnRzLCBmdW5jdGlvbiggXywgYXJnICkgew0KCQkJCQkJdmFyIGluZGV4Ow0KCQkJCQkJd2hpbGUoICggaW5kZXggPSBqUXVlcnkuaW5BcnJheSggYXJnLCBsaXN0LCBpbmRleCApICkgPiAtMSApIHsNCgkJCQkJCQlsaXN0LnNwbGljZSggaW5kZXgsIDEgKTsNCgkJCQkJCQkvLyBIYW5kbGUgZmlyaW5nIGluZGV4ZXMNCgkJCQkJCQlpZiAoIGZpcmluZyApIHsNCgkJCQkJCQkJaWYgKCBpbmRleCA8PSBmaXJpbmdMZW5ndGggKSB7DQoJCQkJCQkJCQlmaXJpbmdMZW5ndGgtLTsNCgkJCQkJCQkJfQ0KCQkJCQkJCQlpZiAoIGluZGV4IDw9IGZpcmluZ0luZGV4ICkgew0KCQkJCQkJCQkJZmlyaW5nSW5kZXgtLTsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfSk7DQoJCQkJfQ0KCQkJCXJldHVybiB0aGlzOw0KCQkJfSwNCgkJCS8vIENvbnRyb2wgaWYgYSBnaXZlbiBjYWxsYmFjayBpcyBpbiB0aGUgbGlzdA0KCQkJaGFzOiBmdW5jdGlvbiggZm4gKSB7DQoJCQkJcmV0dXJuIGpRdWVyeS5pbkFycmF5KCBmbiwgbGlzdCApID4gLTE7DQoJCQl9LA0KCQkJLy8gUmVtb3ZlIGFsbCBjYWxsYmFja3MgZnJvbSB0aGUgbGlzdA0KCQkJZW1wdHk6IGZ1bmN0aW9uKCkgew0KCQkJCWxpc3QgPSBbXTsNCgkJCQlyZXR1cm4gdGhpczsNCgkJCX0sDQoJCQkvLyBIYXZlIHRoZSBsaXN0IGRvIG5vdGhpbmcgYW55bW9yZQ0KCQkJZGlzYWJsZTogZnVuY3Rpb24oKSB7DQoJCQkJbGlzdCA9IHN0YWNrID0gbWVtb3J5ID0gdW5kZWZpbmVkOw0KCQkJCXJldHVybiB0aGlzOw0KCQkJfSwNCgkJCS8vIElzIGl0IGRpc2FibGVkPw0KCQkJZGlzYWJsZWQ6IGZ1bmN0aW9uKCkgew0KCQkJCXJldHVybiAhbGlzdDsNCgkJCX0sDQoJCQkvLyBMb2NrIHRoZSBsaXN0IGluIGl0cyBjdXJyZW50IHN0YXRlDQoJCQlsb2NrOiBmdW5jdGlvbigpIHsNCgkJCQlzdGFjayA9IHVuZGVmaW5lZDsNCgkJCQlpZiAoICFtZW1vcnkgKSB7DQoJCQkJCXNlbGYuZGlzYWJsZSgpOw0KCQkJCX0NCgkJCQlyZXR1cm4gdGhpczsNCgkJCX0sDQoJCQkvLyBJcyBpdCBsb2NrZWQ/DQoJCQlsb2NrZWQ6IGZ1bmN0aW9uKCkgew0KCQkJCXJldHVybiAhc3RhY2s7DQoJCQl9LA0KCQkJLy8gQ2FsbCBhbGwgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGNvbnRleHQgYW5kIGFyZ3VtZW50cw0KCQkJZmlyZVdpdGg6IGZ1bmN0aW9uKCBjb250ZXh0LCBhcmdzICkgew0KCQkJCWFyZ3MgPSBhcmdzIHx8IFtdOw0KCQkJCWFyZ3MgPSBbIGNvbnRleHQsIGFyZ3Muc2xpY2UgPyBhcmdzLnNsaWNlKCkgOiBhcmdzIF07DQoJCQkJaWYgKCBsaXN0ICYmICggIWZpcmVkIHx8IHN0YWNrICkgKSB7DQoJCQkJCWlmICggZmlyaW5nICkgew0KCQkJCQkJc3RhY2sucHVzaCggYXJncyApOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJZmlyZSggYXJncyApOw0KCQkJCQl9DQoJCQkJfQ0KCQkJCXJldHVybiB0aGlzOw0KCQkJfSwNCgkJCS8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzDQoJCQlmaXJlOiBmdW5jdGlvbigpIHsNCgkJCQlzZWxmLmZpcmVXaXRoKCB0aGlzLCBhcmd1bWVudHMgKTsNCgkJCQlyZXR1cm4gdGhpczsNCgkJCX0sDQoJCQkvLyBUbyBrbm93IGlmIHRoZSBjYWxsYmFja3MgaGF2ZSBhbHJlYWR5IGJlZW4gY2FsbGVkIGF0IGxlYXN0IG9uY2UNCgkJCWZpcmVkOiBmdW5jdGlvbigpIHsNCgkJCQlyZXR1cm4gISFmaXJlZDsNCgkJCX0NCgkJfTsNCg0KCXJldHVybiBzZWxmOw0KfTsNCmpRdWVyeS5leHRlbmQoew0KDQoJRGVmZXJyZWQ6IGZ1bmN0aW9uKCBmdW5jICkgew0KCQl2YXIgdHVwbGVzID0gWw0KCQkJCS8vIGFjdGlvbiwgYWRkIGxpc3RlbmVyLCBsaXN0ZW5lciBsaXN0LCBmaW5hbCBzdGF0ZQ0KCQkJCVsgInJlc29sdmUiLCAiZG9uZSIsIGpRdWVyeS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksICJyZXNvbHZlZCIgXSwNCgkJCQlbICJyZWplY3QiLCAiZmFpbCIsIGpRdWVyeS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksICJyZWplY3RlZCIgXSwNCgkJCQlbICJub3RpZnkiLCAicHJvZ3Jlc3MiLCBqUXVlcnkuQ2FsbGJhY2tzKCJtZW1vcnkiKSBdDQoJCQldLA0KCQkJc3RhdGUgPSAicGVuZGluZyIsDQoJCQlwcm9taXNlID0gew0KCQkJCXN0YXRlOiBmdW5jdGlvbigpIHsNCgkJCQkJcmV0dXJuIHN0YXRlOw0KCQkJCX0sDQoJCQkJYWx3YXlzOiBmdW5jdGlvbigpIHsNCgkJCQkJZGVmZXJyZWQuZG9uZSggYXJndW1lbnRzICkuZmFpbCggYXJndW1lbnRzICk7DQoJCQkJCXJldHVybiB0aGlzOw0KCQkJCX0sDQoJCQkJdGhlbjogZnVuY3Rpb24oIC8qIGZuRG9uZSwgZm5GYWlsLCBmblByb2dyZXNzICovICkgew0KCQkJCQl2YXIgZm5zID0gYXJndW1lbnRzOw0KCQkJCQlyZXR1cm4galF1ZXJ5LkRlZmVycmVkKGZ1bmN0aW9uKCBuZXdEZWZlciApIHsNCgkJCQkJCWpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBsZSApIHsNCgkJCQkJCQl2YXIgYWN0aW9uID0gdHVwbGVbIDAgXSwNCgkJCQkJCQkJZm4gPSBmbnNbIGkgXTsNCgkJCQkJCQkvLyBkZWZlcnJlZFsgZG9uZSB8IGZhaWwgfCBwcm9ncmVzcyBdIGZvciBmb3J3YXJkaW5nIGFjdGlvbnMgdG8gbmV3RGVmZXINCgkJCQkJCQlkZWZlcnJlZFsgdHVwbGVbMV0gXSggalF1ZXJ5LmlzRnVuY3Rpb24oIGZuICkgPw0KCQkJCQkJCQlmdW5jdGlvbigpIHsNCgkJCQkJCQkJCXZhciByZXR1cm5lZCA9IGZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsNCgkJCQkJCQkJCWlmICggcmV0dXJuZWQgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHJldHVybmVkLnByb21pc2UgKSApIHsNCgkJCQkJCQkJCQlyZXR1cm5lZC5wcm9taXNlKCkNCgkJCQkJCQkJCQkJLmRvbmUoIG5ld0RlZmVyLnJlc29sdmUgKQ0KCQkJCQkJCQkJCQkuZmFpbCggbmV3RGVmZXIucmVqZWN0ICkNCgkJCQkJCQkJCQkJLnByb2dyZXNzKCBuZXdEZWZlci5ub3RpZnkgKTsNCgkJCQkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJCQkJbmV3RGVmZXJbIGFjdGlvbiArICJXaXRoIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IG5ld0RlZmVyIDogdGhpcywgWyByZXR1cm5lZCBdICk7DQoJCQkJCQkJCQl9DQoJCQkJCQkJCX0gOg0KCQkJCQkJCQluZXdEZWZlclsgYWN0aW9uIF0NCgkJCQkJCQkpOw0KCQkJCQkJfSk7DQoJCQkJCQlmbnMgPSBudWxsOw0KCQkJCQl9KS5wcm9taXNlKCk7DQoJCQkJfSwNCgkJCQkvLyBHZXQgYSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkDQoJCQkJLy8gSWYgb2JqIGlzIHByb3ZpZGVkLCB0aGUgcHJvbWlzZSBhc3BlY3QgaXMgYWRkZWQgdG8gdGhlIG9iamVjdA0KCQkJCXByb21pc2U6IGZ1bmN0aW9uKCBvYmogKSB7DQoJCQkJCXJldHVybiBvYmogIT0gbnVsbCA/IGpRdWVyeS5leHRlbmQoIG9iaiwgcHJvbWlzZSApIDogcHJvbWlzZTsNCgkJCQl9DQoJCQl9LA0KCQkJZGVmZXJyZWQgPSB7fTsNCg0KCQkvLyBLZWVwIHBpcGUgZm9yIGJhY2stY29tcGF0DQoJCXByb21pc2UucGlwZSA9IHByb21pc2UudGhlbjsNCg0KCQkvLyBBZGQgbGlzdC1zcGVjaWZpYyBtZXRob2RzDQoJCWpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBsZSApIHsNCgkJCXZhciBsaXN0ID0gdHVwbGVbIDIgXSwNCgkJCQlzdGF0ZVN0cmluZyA9IHR1cGxlWyAzIF07DQoNCgkJCS8vIHByb21pc2VbIGRvbmUgfCBmYWlsIHwgcHJvZ3Jlc3MgXSA9IGxpc3QuYWRkDQoJCQlwcm9taXNlWyB0dXBsZVsxXSBdID0gbGlzdC5hZGQ7DQoNCgkJCS8vIEhhbmRsZSBzdGF0ZQ0KCQkJaWYgKCBzdGF0ZVN0cmluZyApIHsNCgkJCQlsaXN0LmFkZChmdW5jdGlvbigpIHsNCgkJCQkJLy8gc3RhdGUgPSBbIHJlc29sdmVkIHwgcmVqZWN0ZWQgXQ0KCQkJCQlzdGF0ZSA9IHN0YXRlU3RyaW5nOw0KDQoJCQkJLy8gWyByZWplY3RfbGlzdCB8IHJlc29sdmVfbGlzdCBdLmRpc2FibGU7IHByb2dyZXNzX2xpc3QubG9jaw0KCQkJCX0sIHR1cGxlc1sgaSBeIDEgXVsgMiBdLmRpc2FibGUsIHR1cGxlc1sgMiBdWyAyIF0ubG9jayApOw0KCQkJfQ0KDQoJCQkvLyBkZWZlcnJlZFsgcmVzb2x2ZSB8IHJlamVjdCB8IG5vdGlmeSBdID0gbGlzdC5maXJlDQoJCQlkZWZlcnJlZFsgdHVwbGVbMF0gXSA9IGxpc3QuZmlyZTsNCgkJCWRlZmVycmVkWyB0dXBsZVswXSArICJXaXRoIiBdID0gbGlzdC5maXJlV2l0aDsNCgkJfSk7DQoNCgkJLy8gTWFrZSB0aGUgZGVmZXJyZWQgYSBwcm9taXNlDQoJCXByb21pc2UucHJvbWlzZSggZGVmZXJyZWQgKTsNCg0KCQkvLyBDYWxsIGdpdmVuIGZ1bmMgaWYgYW55DQoJCWlmICggZnVuYyApIHsNCgkJCWZ1bmMuY2FsbCggZGVmZXJyZWQsIGRlZmVycmVkICk7DQoJCX0NCg0KCQkvLyBBbGwgZG9uZSENCgkJcmV0dXJuIGRlZmVycmVkOw0KCX0sDQoNCgkvLyBEZWZlcnJlZCBoZWxwZXINCgl3aGVuOiBmdW5jdGlvbiggc3Vib3JkaW5hdGUgLyogLCAuLi4sIHN1Ym9yZGluYXRlTiAqLyApIHsNCgkJdmFyIGkgPSAwLA0KCQkJcmVzb2x2ZVZhbHVlcyA9IGNvcmVfc2xpY2UuY2FsbCggYXJndW1lbnRzICksDQoJCQlsZW5ndGggPSByZXNvbHZlVmFsdWVzLmxlbmd0aCwNCg0KCQkJLy8gdGhlIGNvdW50IG9mIHVuY29tcGxldGVkIHN1Ym9yZGluYXRlcw0KCQkJcmVtYWluaW5nID0gbGVuZ3RoICE9PSAxIHx8ICggc3Vib3JkaW5hdGUgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHN1Ym9yZGluYXRlLnByb21pc2UgKSApID8gbGVuZ3RoIDogMCwNCg0KCQkJLy8gdGhlIG1hc3RlciBEZWZlcnJlZC4gSWYgcmVzb2x2ZVZhbHVlcyBjb25zaXN0IG9mIG9ubHkgYSBzaW5nbGUgRGVmZXJyZWQsIGp1c3QgdXNlIHRoYXQuDQoJCQlkZWZlcnJlZCA9IHJlbWFpbmluZyA9PT0gMSA/IHN1Ym9yZGluYXRlIDogalF1ZXJ5LkRlZmVycmVkKCksDQoNCgkJCS8vIFVwZGF0ZSBmdW5jdGlvbiBmb3IgYm90aCByZXNvbHZlIGFuZCBwcm9ncmVzcyB2YWx1ZXMNCgkJCXVwZGF0ZUZ1bmMgPSBmdW5jdGlvbiggaSwgY29udGV4dHMsIHZhbHVlcyApIHsNCgkJCQlyZXR1cm4gZnVuY3Rpb24oIHZhbHVlICkgew0KCQkJCQljb250ZXh0c1sgaSBdID0gdGhpczsNCgkJCQkJdmFsdWVzWyBpIF0gPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGNvcmVfc2xpY2UuY2FsbCggYXJndW1lbnRzICkgOiB2YWx1ZTsNCgkJCQkJaWYoIHZhbHVlcyA9PT0gcHJvZ3Jlc3NWYWx1ZXMgKSB7DQoJCQkJCQlkZWZlcnJlZC5ub3RpZnlXaXRoKCBjb250ZXh0cywgdmFsdWVzICk7DQoJCQkJCX0gZWxzZSBpZiAoICEoIC0tcmVtYWluaW5nICkgKSB7DQoJCQkJCQlkZWZlcnJlZC5yZXNvbHZlV2l0aCggY29udGV4dHMsIHZhbHVlcyApOw0KCQkJCQl9DQoJCQkJfTsNCgkJCX0sDQoNCgkJCXByb2dyZXNzVmFsdWVzLCBwcm9ncmVzc0NvbnRleHRzLCByZXNvbHZlQ29udGV4dHM7DQoNCgkJLy8gYWRkIGxpc3RlbmVycyB0byBEZWZlcnJlZCBzdWJvcmRpbmF0ZXM7IHRyZWF0IG90aGVycyBhcyByZXNvbHZlZA0KCQlpZiAoIGxlbmd0aCA+IDEgKSB7DQoJCQlwcm9ncmVzc1ZhbHVlcyA9IG5ldyBBcnJheSggbGVuZ3RoICk7DQoJCQlwcm9ncmVzc0NvbnRleHRzID0gbmV3IEFycmF5KCBsZW5ndGggKTsNCgkJCXJlc29sdmVDb250ZXh0cyA9IG5ldyBBcnJheSggbGVuZ3RoICk7DQoJCQlmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsNCgkJCQlpZiAoIHJlc29sdmVWYWx1ZXNbIGkgXSAmJiBqUXVlcnkuaXNGdW5jdGlvbiggcmVzb2x2ZVZhbHVlc1sgaSBdLnByb21pc2UgKSApIHsNCgkJCQkJcmVzb2x2ZVZhbHVlc1sgaSBdLnByb21pc2UoKQ0KCQkJCQkJLmRvbmUoIHVwZGF0ZUZ1bmMoIGksIHJlc29sdmVDb250ZXh0cywgcmVzb2x2ZVZhbHVlcyApICkNCgkJCQkJCS5mYWlsKCBkZWZlcnJlZC5yZWplY3QgKQ0KCQkJCQkJLnByb2dyZXNzKCB1cGRhdGVGdW5jKCBpLCBwcm9ncmVzc0NvbnRleHRzLCBwcm9ncmVzc1ZhbHVlcyApICk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJLS1yZW1haW5pbmc7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoNCgkJLy8gaWYgd2UncmUgbm90IHdhaXRpbmcgb24gYW55dGhpbmcsIHJlc29sdmUgdGhlIG1hc3Rlcg0KCQlpZiAoICFyZW1haW5pbmcgKSB7DQoJCQlkZWZlcnJlZC5yZXNvbHZlV2l0aCggcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICk7DQoJCX0NCg0KCQlyZXR1cm4gZGVmZXJyZWQucHJvbWlzZSgpOw0KCX0NCn0pOw0KalF1ZXJ5LnN1cHBvcnQgPSAoZnVuY3Rpb24oKSB7DQoNCgl2YXIgc3VwcG9ydCwNCgkJYWxsLA0KCQlhLA0KCQlzZWxlY3QsDQoJCW9wdCwNCgkJaW5wdXQsDQoJCWZyYWdtZW50LA0KCQlldmVudE5hbWUsDQoJCWksDQoJCWlzU3VwcG9ydGVkLA0KCQljbGlja0ZuLA0KCQlkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCg0KCS8vIFNldHVwDQoJZGl2LnNldEF0dHJpYnV0ZSggImNsYXNzTmFtZSIsICJ0IiApOw0KCWRpdi5pbm5lckhUTUwgPSAiICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IjsNCg0KCS8vIFN1cHBvcnQgdGVzdHMgd29uJ3QgcnVuIGluIHNvbWUgbGltaXRlZCBvciBub24tYnJvd3NlciBlbnZpcm9ubWVudHMNCglhbGwgPSBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTsNCglhID0gZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbIDAgXTsNCglpZiAoICFhbGwgfHwgIWEgfHwgIWFsbC5sZW5ndGggKSB7DQoJCXJldHVybiB7fTsNCgl9DQoNCgkvLyBGaXJzdCBiYXRjaCBvZiB0ZXN0cw0KCXNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpOw0KCW9wdCA9IHNlbGVjdC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIikgKTsNCglpbnB1dCA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKVsgMCBdOw0KDQoJYS5zdHlsZS5jc3NUZXh0ID0gInRvcDoxcHg7ZmxvYXQ6bGVmdDtvcGFjaXR5Oi41IjsNCglzdXBwb3J0ID0gew0KCQkvLyBJRSBzdHJpcHMgbGVhZGluZyB3aGl0ZXNwYWNlIHdoZW4gLmlubmVySFRNTCBpcyB1c2VkDQoJCWxlYWRpbmdXaGl0ZXNwYWNlOiAoIGRpdi5maXJzdENoaWxkLm5vZGVUeXBlID09PSAzICksDQoNCgkJLy8gTWFrZSBzdXJlIHRoYXQgdGJvZHkgZWxlbWVudHMgYXJlbid0IGF1dG9tYXRpY2FsbHkgaW5zZXJ0ZWQNCgkJLy8gSUUgd2lsbCBpbnNlcnQgdGhlbSBpbnRvIGVtcHR5IHRhYmxlcw0KCQl0Ym9keTogIWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsDQoNCgkJLy8gTWFrZSBzdXJlIHRoYXQgbGluayBlbGVtZW50cyBnZXQgc2VyaWFsaXplZCBjb3JyZWN0bHkgYnkgaW5uZXJIVE1MDQoJCS8vIFRoaXMgcmVxdWlyZXMgYSB3cmFwcGVyIGVsZW1lbnQgaW4gSUUNCgkJaHRtbFNlcmlhbGl6ZTogISFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKS5sZW5ndGgsDQoNCgkJLy8gR2V0IHRoZSBzdHlsZSBpbmZvcm1hdGlvbiBmcm9tIGdldEF0dHJpYnV0ZQ0KCQkvLyAoSUUgdXNlcyAuY3NzVGV4dCBpbnN0ZWFkKQ0KCQlzdHlsZTogL3RvcC8udGVzdCggYS5nZXRBdHRyaWJ1dGUoInN0eWxlIikgKSwNCg0KCQkvLyBNYWtlIHN1cmUgdGhhdCBVUkxzIGFyZW4ndCBtYW5pcHVsYXRlZA0KCQkvLyAoSUUgbm9ybWFsaXplcyBpdCBieSBkZWZhdWx0KQ0KCQlocmVmTm9ybWFsaXplZDogKCBhLmdldEF0dHJpYnV0ZSgiaHJlZiIpID09PSAiL2EiICksDQoNCgkJLy8gTWFrZSBzdXJlIHRoYXQgZWxlbWVudCBvcGFjaXR5IGV4aXN0cw0KCQkvLyAoSUUgdXNlcyBmaWx0ZXIgaW5zdGVhZCkNCgkJLy8gVXNlIGEgcmVnZXggdG8gd29yayBhcm91bmQgYSBXZWJLaXQgaXNzdWUuIFNlZSAjNTE0NQ0KCQlvcGFjaXR5OiAvXjAuNS8udGVzdCggYS5zdHlsZS5vcGFjaXR5ICksDQoNCgkJLy8gVmVyaWZ5IHN0eWxlIGZsb2F0IGV4aXN0ZW5jZQ0KCQkvLyAoSUUgdXNlcyBzdHlsZUZsb2F0IGluc3RlYWQgb2YgY3NzRmxvYXQpDQoJCWNzc0Zsb2F0OiAhIWEuc3R5bGUuY3NzRmxvYXQsDQoNCgkJLy8gTWFrZSBzdXJlIHRoYXQgaWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkIGZvciBhIGNoZWNrYm94DQoJCS8vIHRoYXQgaXQgZGVmYXVsdHMgdG8gIm9uIi4NCgkJLy8gKFdlYktpdCBkZWZhdWx0cyB0byAiIiBpbnN0ZWFkKQ0KCQljaGVja09uOiAoIGlucHV0LnZhbHVlID09PSAib24iICksDQoNCgkJLy8gTWFrZSBzdXJlIHRoYXQgYSBzZWxlY3RlZC1ieS1kZWZhdWx0IG9wdGlvbiBoYXMgYSB3b3JraW5nIHNlbGVjdGVkIHByb3BlcnR5Lg0KCQkvLyAoV2ViS2l0IGRlZmF1bHRzIHRvIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZSwgSUUgdG9vLCBpZiBpdCdzIGluIGFuIG9wdGdyb3VwKQ0KCQlvcHRTZWxlY3RlZDogb3B0LnNlbGVjdGVkLA0KDQoJCS8vIFRlc3Qgc2V0QXR0cmlidXRlIG9uIGNhbWVsQ2FzZSBjbGFzcy4gSWYgaXQgd29ya3MsIHdlIG5lZWQgYXR0ckZpeGVzIHdoZW4gZG9pbmcgZ2V0L3NldEF0dHJpYnV0ZSAoaWU2LzcpDQoJCWdldFNldEF0dHJpYnV0ZTogZGl2LmNsYXNzTmFtZSAhPT0gInQiLA0KDQoJCS8vIFRlc3RzIGZvciBlbmN0eXBlIHN1cHBvcnQgb24gYSBmb3JtICgjNjc0MykNCgkJZW5jdHlwZTogISFkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJmb3JtIikuZW5jdHlwZSwNCg0KCQkvLyBNYWtlcyBzdXJlIGNsb25pbmcgYW4gaHRtbDUgZWxlbWVudCBkb2VzIG5vdCBjYXVzZSBwcm9ibGVtcw0KCQkvLyBXaGVyZSBvdXRlckhUTUwgaXMgdW5kZWZpbmVkLCB0aGlzIHN0aWxsIHdvcmtzDQoJCWh0bWw1Q2xvbmU6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm5hdiIpLmNsb25lTm9kZSggdHJ1ZSApLm91dGVySFRNTCAhPT0gIjw6bmF2PjwvOm5hdj4iLA0KDQoJCS8vIGpRdWVyeS5zdXBwb3J0LmJveE1vZGVsIERFUFJFQ0FURUQgaW4gMS44IHNpbmNlIHdlIGRvbid0IHN1cHBvcnQgUXVpcmtzIE1vZGUNCgkJYm94TW9kZWw6ICggZG9jdW1lbnQuY29tcGF0TW9kZSA9PT0gIkNTUzFDb21wYXQiICksDQoNCgkJLy8gV2lsbCBiZSBkZWZpbmVkIGxhdGVyDQoJCXN1Ym1pdEJ1YmJsZXM6IHRydWUsDQoJCWNoYW5nZUJ1YmJsZXM6IHRydWUsDQoJCWZvY3VzaW5CdWJibGVzOiBmYWxzZSwNCgkJZGVsZXRlRXhwYW5kbzogdHJ1ZSwNCgkJbm9DbG9uZUV2ZW50OiB0cnVlLA0KCQlpbmxpbmVCbG9ja05lZWRzTGF5b3V0OiBmYWxzZSwNCgkJc2hyaW5rV3JhcEJsb2NrczogZmFsc2UsDQoJCXJlbGlhYmxlTWFyZ2luUmlnaHQ6IHRydWUsDQoJCWJveFNpemluZ1JlbGlhYmxlOiB0cnVlLA0KCQlwaXhlbFBvc2l0aW9uOiBmYWxzZQ0KCX07DQoNCgkvLyBNYWtlIHN1cmUgY2hlY2tlZCBzdGF0dXMgaXMgcHJvcGVybHkgY2xvbmVkDQoJaW5wdXQuY2hlY2tlZCA9IHRydWU7DQoJc3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCA9IGlucHV0LmNsb25lTm9kZSggdHJ1ZSApLmNoZWNrZWQ7DQoNCgkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgb3B0aW9ucyBpbnNpZGUgZGlzYWJsZWQgc2VsZWN0cyBhcmVuJ3QgbWFya2VkIGFzIGRpc2FibGVkDQoJLy8gKFdlYktpdCBtYXJrcyB0aGVtIGFzIGRpc2FibGVkKQ0KCXNlbGVjdC5kaXNhYmxlZCA9IHRydWU7DQoJc3VwcG9ydC5vcHREaXNhYmxlZCA9ICFvcHQuZGlzYWJsZWQ7DQoNCgkvLyBUZXN0IHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRlbGV0ZSBhbiBleHBhbmRvIGZyb20gYW4gZWxlbWVudA0KCS8vIEZhaWxzIGluIEludGVybmV0IEV4cGxvcmVyDQoJdHJ5IHsNCgkJZGVsZXRlIGRpdi50ZXN0Ow0KCX0gY2F0Y2goIGUgKSB7DQoJCXN1cHBvcnQuZGVsZXRlRXhwYW5kbyA9IGZhbHNlOw0KCX0NCg0KCWlmICggIWRpdi5hZGRFdmVudExpc3RlbmVyICYmIGRpdi5hdHRhY2hFdmVudCAmJiBkaXYuZmlyZUV2ZW50ICkgew0KCQlkaXYuYXR0YWNoRXZlbnQoICJvbmNsaWNrIiwgY2xpY2tGbiA9IGZ1bmN0aW9uKCkgew0KCQkJLy8gQ2xvbmluZyBhIG5vZGUgc2hvdWxkbid0IGNvcHkgb3ZlciBhbnkNCgkJCS8vIGJvdW5kIGV2ZW50IGhhbmRsZXJzIChJRSBkb2VzIHRoaXMpDQoJCQlzdXBwb3J0Lm5vQ2xvbmVFdmVudCA9IGZhbHNlOw0KCQl9KTsNCgkJZGl2LmNsb25lTm9kZSggdHJ1ZSApLmZpcmVFdmVudCgib25jbGljayIpOw0KCQlkaXYuZGV0YWNoRXZlbnQoICJvbmNsaWNrIiwgY2xpY2tGbiApOw0KCX0NCg0KCS8vIENoZWNrIGlmIGEgcmFkaW8gbWFpbnRhaW5zIGl0cyB2YWx1ZQ0KCS8vIGFmdGVyIGJlaW5nIGFwcGVuZGVkIHRvIHRoZSBET00NCglpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7DQoJaW5wdXQudmFsdWUgPSAidCI7DQoJaW5wdXQuc2V0QXR0cmlidXRlKCAidHlwZSIsICJyYWRpbyIgKTsNCglzdXBwb3J0LnJhZGlvVmFsdWUgPSBpbnB1dC52YWx1ZSA9PT0gInQiOw0KDQoJaW5wdXQuc2V0QXR0cmlidXRlKCAiY2hlY2tlZCIsICJjaGVja2VkIiApOw0KDQoJLy8gIzExMjE3IC0gV2ViS2l0IGxvc2VzIGNoZWNrIHdoZW4gdGhlIG5hbWUgaXMgYWZ0ZXIgdGhlIGNoZWNrZWQgYXR0cmlidXRlDQoJaW5wdXQuc2V0QXR0cmlidXRlKCAibmFtZSIsICJ0IiApOw0KDQoJZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApOw0KCWZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOw0KCWZyYWdtZW50LmFwcGVuZENoaWxkKCBkaXYubGFzdENoaWxkICk7DQoNCgkvLyBXZWJLaXQgZG9lc24ndCBjbG9uZSBjaGVja2VkIHN0YXRlIGNvcnJlY3RseSBpbiBmcmFnbWVudHMNCglzdXBwb3J0LmNoZWNrQ2xvbmUgPSBmcmFnbWVudC5jbG9uZU5vZGUoIHRydWUgKS5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuY2hlY2tlZDsNCg0KCS8vIENoZWNrIGlmIGEgZGlzY29ubmVjdGVkIGNoZWNrYm94IHdpbGwgcmV0YWluIGl0cyBjaGVja2VkDQoJLy8gdmFsdWUgb2YgdHJ1ZSBhZnRlciBhcHBlbmRlZCB0byB0aGUgRE9NIChJRTYvNykNCglzdXBwb3J0LmFwcGVuZENoZWNrZWQgPSBpbnB1dC5jaGVja2VkOw0KDQoJZnJhZ21lbnQucmVtb3ZlQ2hpbGQoIGlucHV0ICk7DQoJZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGRpdiApOw0KDQoJLy8gVGVjaG5pcXVlIGZyb20gSnVyaXkgWmF5dHNldg0KCS8vIGh0dHA6Ly9wZXJmZWN0aW9ua2lsbHMuY29tL2RldGVjdGluZy1ldmVudC1zdXBwb3J0LXdpdGhvdXQtYnJvd3Nlci1zbmlmZmluZy8NCgkvLyBXZSBvbmx5IGNhcmUgYWJvdXQgdGhlIGNhc2Ugd2hlcmUgbm9uLXN0YW5kYXJkIGV2ZW50IHN5c3RlbXMNCgkvLyBhcmUgdXNlZCwgbmFtZWx5IGluIElFLiBTaG9ydC1jaXJjdWl0aW5nIGhlcmUgaGVscHMgdXMgdG8NCgkvLyBhdm9pZCBhbiBldmFsIGNhbGwgKGluIHNldEF0dHJpYnV0ZSkgd2hpY2ggY2FuIGNhdXNlIENTUA0KCS8vIHRvIGdvIGhheXdpcmUuIFNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vU2VjdXJpdHkvQ1NQDQoJaWYgKCBkaXYuYXR0YWNoRXZlbnQgKSB7DQoJCWZvciAoIGkgaW4gew0KCQkJc3VibWl0OiB0cnVlLA0KCQkJY2hhbmdlOiB0cnVlLA0KCQkJZm9jdXNpbjogdHJ1ZQ0KCQl9KSB7DQoJCQlldmVudE5hbWUgPSAib24iICsgaTsNCgkJCWlzU3VwcG9ydGVkID0gKCBldmVudE5hbWUgaW4gZGl2ICk7DQoJCQlpZiAoICFpc1N1cHBvcnRlZCApIHsNCgkJCQlkaXYuc2V0QXR0cmlidXRlKCBldmVudE5hbWUsICJyZXR1cm47IiApOw0KCQkJCWlzU3VwcG9ydGVkID0gKCB0eXBlb2YgZGl2WyBldmVudE5hbWUgXSA9PT0gImZ1bmN0aW9uIiApOw0KCQkJfQ0KCQkJc3VwcG9ydFsgaSArICJCdWJibGVzIiBdID0gaXNTdXBwb3J0ZWQ7DQoJCX0NCgl9DQoNCgkvLyBSdW4gdGVzdHMgdGhhdCBuZWVkIGEgYm9keSBhdCBkb2MgcmVhZHkNCglqUXVlcnkoZnVuY3Rpb24oKSB7DQoJCXZhciBjb250YWluZXIsIGRpdiwgdGRzLCBtYXJnaW5EaXYsDQoJCQlkaXZSZXNldCA9ICJwYWRkaW5nOjA7bWFyZ2luOjA7Ym9yZGVyOjA7ZGlzcGxheTpibG9jaztvdmVyZmxvdzpoaWRkZW47IiwNCgkJCWJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdOw0KDQoJCWlmICggIWJvZHkgKSB7DQoJCQkvLyBSZXR1cm4gZm9yIGZyYW1lc2V0IGRvY3MgdGhhdCBkb24ndCBoYXZlIGEgYm9keQ0KCQkJcmV0dXJuOw0KCQl9DQoNCgkJY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQoJCWNvbnRhaW5lci5zdHlsZS5jc3NUZXh0ID0gInZpc2liaWxpdHk6aGlkZGVuO2JvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7cG9zaXRpb246c3RhdGljO3RvcDowO21hcmdpbi10b3A6MXB4IjsNCgkJYm9keS5pbnNlcnRCZWZvcmUoIGNvbnRhaW5lciwgYm9keS5maXJzdENoaWxkICk7DQoNCgkJLy8gQ29uc3RydWN0IHRoZSB0ZXN0IGVsZW1lbnQNCgkJZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQoJCWNvbnRhaW5lci5hcHBlbmRDaGlsZCggZGl2ICk7DQoNCgkJLy8gQ2hlY2sgaWYgdGFibGUgY2VsbHMgc3RpbGwgaGF2ZSBvZmZzZXRXaWR0aC9IZWlnaHQgd2hlbiB0aGV5IGFyZSBzZXQNCgkJLy8gdG8gZGlzcGxheTpub25lIGFuZCB0aGVyZSBhcmUgc3RpbGwgb3RoZXIgdmlzaWJsZSB0YWJsZSBjZWxscyBpbiBhDQoJCS8vIHRhYmxlIHJvdzsgaWYgc28sIG9mZnNldFdpZHRoL0hlaWdodCBhcmUgbm90IHJlbGlhYmxlIGZvciB1c2Ugd2hlbg0KCQkvLyBkZXRlcm1pbmluZyBpZiBhbiBlbGVtZW50IGhhcyBiZWVuIGhpZGRlbiBkaXJlY3RseSB1c2luZw0KCQkvLyBkaXNwbGF5Om5vbmUgKGl0IGlzIHN0aWxsIHNhZmUgdG8gdXNlIG9mZnNldHMgaWYgYSBwYXJlbnQgZWxlbWVudCBpcw0KCQkvLyBoaWRkZW47IGRvbiBzYWZldHkgZ29nZ2xlcyBhbmQgc2VlIGJ1ZyAjNDUxMiBmb3IgbW9yZSBpbmZvcm1hdGlvbikuDQoJCS8vIChvbmx5IElFIDggZmFpbHMgdGhpcyB0ZXN0KQ0KCQlkaXYuaW5uZXJIVE1MID0gIjx0YWJsZT48dHI+PHRkPjwvdGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iOw0KCQl0ZHMgPSBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7DQoJCXRkc1sgMCBdLnN0eWxlLmNzc1RleHQgPSAicGFkZGluZzowO21hcmdpbjowO2JvcmRlcjowO2Rpc3BsYXk6bm9uZSI7DQoJCWlzU3VwcG9ydGVkID0gKCB0ZHNbIDAgXS5vZmZzZXRIZWlnaHQgPT09IDAgKTsNCg0KCQl0ZHNbIDAgXS5zdHlsZS5kaXNwbGF5ID0gIiI7DQoJCXRkc1sgMSBdLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7DQoNCgkJLy8gQ2hlY2sgaWYgZW1wdHkgdGFibGUgY2VsbHMgc3RpbGwgaGF2ZSBvZmZzZXRXaWR0aC9IZWlnaHQNCgkJLy8gKElFIDw9IDggZmFpbCB0aGlzIHRlc3QpDQoJCXN1cHBvcnQucmVsaWFibGVIaWRkZW5PZmZzZXRzID0gaXNTdXBwb3J0ZWQgJiYgKCB0ZHNbIDAgXS5vZmZzZXRIZWlnaHQgPT09IDAgKTsNCg0KCQkvLyBDaGVjayBib3gtc2l6aW5nIGFuZCBtYXJnaW4gYmVoYXZpb3INCgkJZGl2LmlubmVySFRNTCA9ICIiOw0KCQlkaXYuc3R5bGUuY3NzVGV4dCA9ICJib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzoxcHg7Ym9yZGVyOjFweDtkaXNwbGF5OmJsb2NrO3dpZHRoOjRweDttYXJnaW4tdG9wOjElO3Bvc2l0aW9uOmFic29sdXRlO3RvcDoxJTsiOw0KCQlzdXBwb3J0LmJveFNpemluZyA9ICggZGl2Lm9mZnNldFdpZHRoID09PSA0ICk7DQoJCXN1cHBvcnQuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQgPSAoIGJvZHkub2Zmc2V0VG9wICE9PSAxICk7DQoNCgkJLy8gTk9URTogVG8gYW55IGZ1dHVyZSBtYWludGFpbmVyLCB3ZSd2ZSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZQ0KCQkvLyBiZWNhdXNlIGpzZG9tIG9uIG5vZGUuanMgd2lsbCBicmVhayB3aXRob3V0IGl0Lg0KCQlpZiAoIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlICkgew0KCQkJc3VwcG9ydC5waXhlbFBvc2l0aW9uID0gKCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggZGl2LCBudWxsICkgfHwge30gKS50b3AgIT09ICIxJSI7DQoJCQlzdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlID0gKCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggZGl2LCBudWxsICkgfHwgeyB3aWR0aDogIjRweCIgfSApLndpZHRoID09PSAiNHB4IjsNCg0KCQkJLy8gQ2hlY2sgaWYgZGl2IHdpdGggZXhwbGljaXQgd2lkdGggYW5kIG5vIG1hcmdpbi1yaWdodCBpbmNvcnJlY3RseQ0KCQkJLy8gZ2V0cyBjb21wdXRlZCBtYXJnaW4tcmlnaHQgYmFzZWQgb24gd2lkdGggb2YgY29udGFpbmVyLiBGb3IgbW9yZQ0KCQkJLy8gaW5mbyBzZWUgYnVnICMzMzMzDQoJCQkvLyBGYWlscyBpbiBXZWJLaXQgYmVmb3JlIEZlYiAyMDExIG5pZ2h0bGllcw0KCQkJLy8gV2ViS2l0IEJ1ZyAxMzM0MyAtIGdldENvbXB1dGVkU3R5bGUgcmV0dXJucyB3cm9uZyB2YWx1ZSBmb3IgbWFyZ2luLXJpZ2h0DQoJCQltYXJnaW5EaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCgkJCW1hcmdpbkRpdi5zdHlsZS5jc3NUZXh0ID0gZGl2LnN0eWxlLmNzc1RleHQgPSBkaXZSZXNldDsNCgkJCW1hcmdpbkRpdi5zdHlsZS5tYXJnaW5SaWdodCA9IG1hcmdpbkRpdi5zdHlsZS53aWR0aCA9ICIwIjsNCgkJCWRpdi5zdHlsZS53aWR0aCA9ICIxcHgiOw0KCQkJZGl2LmFwcGVuZENoaWxkKCBtYXJnaW5EaXYgKTsNCgkJCXN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodCA9DQoJCQkJIXBhcnNlRmxvYXQoICggd2luZG93LmdldENvbXB1dGVkU3R5bGUoIG1hcmdpbkRpdiwgbnVsbCApIHx8IHt9ICkubWFyZ2luUmlnaHQgKTsNCgkJfQ0KDQoJCWlmICggdHlwZW9mIGRpdi5zdHlsZS56b29tICE9PSAidW5kZWZpbmVkIiApIHsNCgkJCS8vIENoZWNrIGlmIG5hdGl2ZWx5IGJsb2NrLWxldmVsIGVsZW1lbnRzIGFjdCBsaWtlIGlubGluZS1ibG9jaw0KCQkJLy8gZWxlbWVudHMgd2hlbiBzZXR0aW5nIHRoZWlyIGRpc3BsYXkgdG8gJ2lubGluZScgYW5kIGdpdmluZw0KCQkJLy8gdGhlbSBsYXlvdXQNCgkJCS8vIChJRSA8IDggZG9lcyB0aGlzKQ0KCQkJZGl2LmlubmVySFRNTCA9ICIiOw0KCQkJZGl2LnN0eWxlLmNzc1RleHQgPSBkaXZSZXNldCArICJ3aWR0aDoxcHg7cGFkZGluZzoxcHg7ZGlzcGxheTppbmxpbmU7em9vbToxIjsNCgkJCXN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dCA9ICggZGl2Lm9mZnNldFdpZHRoID09PSAzICk7DQoNCgkJCS8vIENoZWNrIGlmIGVsZW1lbnRzIHdpdGggbGF5b3V0IHNocmluay13cmFwIHRoZWlyIGNoaWxkcmVuDQoJCQkvLyAoSUUgNiBkb2VzIHRoaXMpDQoJCQlkaXYuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7DQoJCQlkaXYuc3R5bGUub3ZlcmZsb3cgPSAidmlzaWJsZSI7DQoJCQlkaXYuaW5uZXJIVE1MID0gIjxkaXY+PC9kaXY+IjsNCgkJCWRpdi5maXJzdENoaWxkLnN0eWxlLndpZHRoID0gIjVweCI7DQoJCQlzdXBwb3J0LnNocmlua1dyYXBCbG9ja3MgPSAoIGRpdi5vZmZzZXRXaWR0aCAhPT0gMyApOw0KDQoJCQljb250YWluZXIuc3R5bGUuem9vbSA9IDE7DQoJCX0NCg0KCQkvLyBOdWxsIGVsZW1lbnRzIHRvIGF2b2lkIGxlYWtzIGluIElFDQoJCWJvZHkucmVtb3ZlQ2hpbGQoIGNvbnRhaW5lciApOw0KCQljb250YWluZXIgPSBkaXYgPSB0ZHMgPSBtYXJnaW5EaXYgPSBudWxsOw0KCX0pOw0KDQoJLy8gTnVsbCBlbGVtZW50cyB0byBhdm9pZCBsZWFrcyBpbiBJRQ0KCWZyYWdtZW50LnJlbW92ZUNoaWxkKCBkaXYgKTsNCglhbGwgPSBhID0gc2VsZWN0ID0gb3B0ID0gaW5wdXQgPSBmcmFnbWVudCA9IGRpdiA9IG51bGw7DQoNCglyZXR1cm4gc3VwcG9ydDsNCn0pKCk7DQp2YXIgcmJyYWNlID0gLyg/Olx7W1xzXFNdKlx9fFxbW1xzXFNdKlxdKSQvLA0KCXJtdWx0aURhc2ggPSAvKFtBLVpdKS9nOw0KDQpqUXVlcnkuZXh0ZW5kKHsNCgljYWNoZToge30sDQoNCglkZWxldGVkSWRzOiBbXSwNCg0KCS8vIFJlbW92ZSBhdCBuZXh0IG1ham9yIHJlbGVhc2UgKDEuOS8yLjApDQoJdXVpZDogMCwNCg0KCS8vIFVuaXF1ZSBmb3IgZWFjaCBjb3B5IG9mIGpRdWVyeSBvbiB0aGUgcGFnZQ0KCS8vIE5vbi1kaWdpdHMgcmVtb3ZlZCB0byBtYXRjaCByaW5saW5lalF1ZXJ5DQoJZXhwYW5kbzogImpRdWVyeSIgKyAoIGpRdWVyeS5mbi5qcXVlcnkgKyBNYXRoLnJhbmRvbSgpICkucmVwbGFjZSggL1xEL2csICIiICksDQoNCgkvLyBUaGUgZm9sbG93aW5nIGVsZW1lbnRzIHRocm93IHVuY2F0Y2hhYmxlIGV4Y2VwdGlvbnMgaWYgeW91DQoJLy8gYXR0ZW1wdCB0byBhZGQgZXhwYW5kbyBwcm9wZXJ0aWVzIHRvIHRoZW0uDQoJbm9EYXRhOiB7DQoJCSJlbWJlZCI6IHRydWUsDQoJCS8vIEJhbiBhbGwgb2JqZWN0cyBleGNlcHQgZm9yIEZsYXNoICh3aGljaCBoYW5kbGUgZXhwYW5kb3MpDQoJCSJvYmplY3QiOiAiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIiwNCgkJImFwcGxldCI6IHRydWUNCgl9LA0KDQoJaGFzRGF0YTogZnVuY3Rpb24oIGVsZW0gKSB7DQoJCWVsZW0gPSBlbGVtLm5vZGVUeXBlID8galF1ZXJ5LmNhY2hlWyBlbGVtW2pRdWVyeS5leHBhbmRvXSBdIDogZWxlbVsgalF1ZXJ5LmV4cGFuZG8gXTsNCgkJcmV0dXJuICEhZWxlbSAmJiAhaXNFbXB0eURhdGFPYmplY3QoIGVsZW0gKTsNCgl9LA0KDQoJZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEsIHB2dCAvKiBJbnRlcm5hbCBVc2UgT25seSAqLyApIHsNCgkJaWYgKCAhalF1ZXJ5LmFjY2VwdERhdGEoIGVsZW0gKSApIHsNCgkJCXJldHVybjsNCgkJfQ0KDQoJCXZhciB0aGlzQ2FjaGUsIHJldCwNCgkJCWludGVybmFsS2V5ID0galF1ZXJ5LmV4cGFuZG8sDQoJCQlnZXRCeU5hbWUgPSB0eXBlb2YgbmFtZSA9PT0gInN0cmluZyIsDQoNCgkJCS8vIFdlIGhhdmUgdG8gaGFuZGxlIERPTSBub2RlcyBhbmQgSlMgb2JqZWN0cyBkaWZmZXJlbnRseSBiZWNhdXNlIElFNi03DQoJCQkvLyBjYW4ndCBHQyBvYmplY3QgcmVmZXJlbmNlcyBwcm9wZXJseSBhY3Jvc3MgdGhlIERPTS1KUyBib3VuZGFyeQ0KCQkJaXNOb2RlID0gZWxlbS5ub2RlVHlwZSwNCg0KCQkJLy8gT25seSBET00gbm9kZXMgbmVlZCB0aGUgZ2xvYmFsIGpRdWVyeSBjYWNoZTsgSlMgb2JqZWN0IGRhdGEgaXMNCgkJCS8vIGF0dGFjaGVkIGRpcmVjdGx5IHRvIHRoZSBvYmplY3Qgc28gR0MgY2FuIG9jY3VyIGF1dG9tYXRpY2FsbHkNCgkJCWNhY2hlID0gaXNOb2RlID8galF1ZXJ5LmNhY2hlIDogZWxlbSwNCg0KCQkJLy8gT25seSBkZWZpbmluZyBhbiBJRCBmb3IgSlMgb2JqZWN0cyBpZiBpdHMgY2FjaGUgYWxyZWFkeSBleGlzdHMgYWxsb3dzDQoJCQkvLyB0aGUgY29kZSB0byBzaG9ydGN1dCBvbiB0aGUgc2FtZSBwYXRoIGFzIGEgRE9NIG5vZGUgd2l0aCBubyBjYWNoZQ0KCQkJaWQgPSBpc05vZGUgPyBlbGVtWyBpbnRlcm5hbEtleSBdIDogZWxlbVsgaW50ZXJuYWxLZXkgXSAmJiBpbnRlcm5hbEtleTsNCg0KCQkvLyBBdm9pZCBkb2luZyBhbnkgbW9yZSB3b3JrIHRoYW4gd2UgbmVlZCB0byB3aGVuIHRyeWluZyB0byBnZXQgZGF0YSBvbiBhbg0KCQkvLyBvYmplY3QgdGhhdCBoYXMgbm8gZGF0YSBhdCBhbGwNCgkJaWYgKCAoIWlkIHx8ICFjYWNoZVtpZF0gfHwgKCFwdnQgJiYgIWNhY2hlW2lkXS5kYXRhKSkgJiYgZ2V0QnlOYW1lICYmIGRhdGEgPT09IHVuZGVmaW5lZCApIHsNCgkJCXJldHVybjsNCgkJfQ0KDQoJCWlmICggIWlkICkgew0KCQkJLy8gT25seSBET00gbm9kZXMgbmVlZCBhIG5ldyB1bmlxdWUgSUQgZm9yIGVhY2ggZWxlbWVudCBzaW5jZSB0aGVpciBkYXRhDQoJCQkvLyBlbmRzIHVwIGluIHRoZSBnbG9iYWwgY2FjaGUNCgkJCWlmICggaXNOb2RlICkgew0KCQkJCWVsZW1bIGludGVybmFsS2V5IF0gPSBpZCA9IGpRdWVyeS5kZWxldGVkSWRzLnBvcCgpIHx8IGpRdWVyeS5ndWlkKys7DQoJCQl9IGVsc2Ugew0KCQkJCWlkID0gaW50ZXJuYWxLZXk7DQoJCQl9DQoJCX0NCg0KCQlpZiAoICFjYWNoZVsgaWQgXSApIHsNCgkJCWNhY2hlWyBpZCBdID0ge307DQoNCgkJCS8vIEF2b2lkcyBleHBvc2luZyBqUXVlcnkgbWV0YWRhdGEgb24gcGxhaW4gSlMgb2JqZWN0cyB3aGVuIHRoZSBvYmplY3QNCgkJCS8vIGlzIHNlcmlhbGl6ZWQgdXNpbmcgSlNPTi5zdHJpbmdpZnkNCgkJCWlmICggIWlzTm9kZSApIHsNCgkJCQljYWNoZVsgaWQgXS50b0pTT04gPSBqUXVlcnkubm9vcDsNCgkJCX0NCgkJfQ0KDQoJCS8vIEFuIG9iamVjdCBjYW4gYmUgcGFzc2VkIHRvIGpRdWVyeS5kYXRhIGluc3RlYWQgb2YgYSBrZXkvdmFsdWUgcGFpcjgdGhpcyBnZXRzDQoJCS8vIHNoYWxsb3cgY29waWVkIG92ZXIgb250byB0aGUgZXhpc3RpbmcgY2FjaGUNCgkJaWYgKCB0eXBlb2YgbmFtZSA9PT0gIm9iamVjdCIgfHwgdHlwZW9mIG5hbWUgPT09ICJmdW5jdGlvbiIgKSB7DQoJCQlpZiAoIHB2dCApIHsNCgkJCQljYWNoZVsgaWQgXSA9IGpRdWVyeS5leHRlbmQoIGNhY2hlWyBpZCBdLCBuYW1lICk7DQoJCQl9IGVsc2Ugew0KCQkJCWNhY2hlWyBpZCBdLmRhdGEgPSBqUXVlcnkuZXh0ZW5kKCBjYWNoZVsgaWQgXS5kYXRhLCBuYW1lICk7DQoJCQl9DQoJCX0NCg0KCQl0aGlzQ2FjaGUgPSBjYWNoZVsgaWQgXTsNCg0KCQkvLyBqUXVlcnkgZGF0YSgpIGlzIHN0b3JlZCBpbiBhIHNlcGFyYXRlIG9iamVjdCBpbnNpZGUgdGhlIG9iamVjdCdzIGludGVybmFsIGRhdGENCgkJLy8gY2FjaGUgaW4gb3JkZXIgdG8gYXZvaWQga2V5IGNvbGxpc2lvbnMgYmV0d2VlbiBpbnRlcm5hbCBkYXRhIGFuZCB1c2VyLWRlZmluZWQNCgkJLy8gZGF0YS4NCgkJaWYgKCAhcHZ0ICkgew0KCQkJaWYgKCAhdGhpc0NhY2hlLmRhdGEgKSB7DQoJCQkJdGhpc0NhY2hlLmRhdGEgPSB7fTsNCgkJCX0NCg0KCQkJdGhpc0NhY2hlID0gdGhpc0NhY2hlLmRhdGE7DQoJCX0NCg0KCQlpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApIHsNCgkJCXRoaXNDYWNoZVsgalF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApIF0gPSBkYXRhOw0KCQl9DQoNCgkJLy8gQ2hlY2sgZm9yIGJvdGggY29udmVydGVkLXRvLWNhbWVsIGFuZCBub24tY29udmVydGVkIGRhdGEgcHJvcGVydHkgbmFtZXMNCgkJLy8gSWYgYSBkYXRhIHByb3BlcnR5IHdhcyBzcGVjaWZpZWQNCgkJaWYgKCBnZXRCeU5hbWUgKSB7DQoNCgkJCS8vIEZpcnN0IFRyeSB0byBmaW5kIGFzLWlzIHByb3BlcnR5IGRhdGENCgkJCXJldCA9IHRoaXNDYWNoZVsgbmFtZSBdOw0KDQoJCQkvLyBUZXN0IGZvciBudWxsfHVuZGVmaW5lZCBwcm9wZXJ0eSBkYXRhDQoJCQlpZiAoIHJldCA9PSBudWxsICkgew0KDQoJCQkJLy8gVHJ5IHRvIGZpbmQgdGhlIGNhbWVsQ2FzZWQgcHJvcGVydHkNCgkJCQlyZXQgPSB0aGlzQ2FjaGVbIGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSBdOw0KCQkJfQ0KCQl9IGVsc2Ugew0KCQkJcmV0ID0gdGhpc0NhY2hlOw0KCQl9DQoNCgkJcmV0dXJuIHJldDsNCgl9LA0KDQoJcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHB2dCAvKiBJbnRlcm5hbCBVc2UgT25seSAqLyApIHsNCgkJaWYgKCAhalF1ZXJ5LmFjY2VwdERhdGEoIGVsZW0gKSApIHsNCgkJCXJldHVybjsNCgkJfQ0KDQoJCXZhciB0aGlzQ2FjaGUsIGksIGwsDQoNCgkJCWlzTm9kZSA9IGVsZW0ubm9kZVR5cGUsDQoNCgkJCS8vIFNlZSBqUXVlcnkuZGF0YSBmb3IgbW9yZSBpbmZvcm1hdGlvbg0KCQkJY2FjaGUgPSBpc05vZGUgPyBqUXVlcnkuY2FjaGUgOiBlbGVtLA0KCQkJaWQgPSBpc05vZGUgPyBlbGVtWyBqUXVlcnkuZXhwYW5kbyBdIDogalF1ZXJ5LmV4cGFuZG87DQoNCgkJLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBubyBjYWNoZSBlbnRyeSBmb3IgdGhpcyBvYmplY3QsIHRoZXJlIGlzIG5vDQoJCS8vIHB1cnBvc2UgaW4gY29udGludWluZw0KCQlpZiAoICFjYWNoZVsgaWQgXSApIHsNCgkJCXJldHVybjsNCgkJfQ0KDQoJCWlmICggbmFtZSApIHsNCg0KCQkJdGhpc0NhY2hlID0gcHZ0ID8gY2FjaGVbIGlkIF0gOiBjYWNoZVsgaWQgXS5kYXRhOw0KDQoJCQlpZiAoIHRoaXNDYWNoZSApIHsNCg0KCQkJCS8vIFN1cHBvcnQgYXJyYXkgb3Igc3BhY2Ugc2VwYXJhdGVkIHN0cmluZyBuYW1lcyBmb3IgZGF0YSBrZXlzDQoJCQkJaWYgKCAhalF1ZXJ5LmlzQXJyYXkoIG5hbWUgKSApIHsNCg0KCQkJCQkvLyB0cnkgdGhlIHN0cmluZyBhcyBhIGtleSBiZWZvcmUgYW55IG1hbmlwdWxhdGlvbg0KCQkJCQlpZiAoIG5hbWUgaW4gdGhpc0NhY2hlICkgew0KCQkJCQkJbmFtZSA9IFsgbmFtZSBdOw0KCQkJCQl9IGVsc2Ugew0KDQoJCQkJCQkvLyBzcGxpdCB0aGUgY2FtZWwgY2FzZWQgdmVyc2lvbiBieSBzcGFjZXMgdW5sZXNzIGEga2V5IHdpdGggdGhlIHNwYWNlcyBleGlzdHMNCgkJCQkJCW5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICk7DQoJCQkJCQlpZiAoIG5hbWUgaW4gdGhpc0NhY2hlICkgew0KCQkJCQkJCW5hbWUgPSBbIG5hbWUgXTsNCgkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJbmFtZSA9IG5hbWUuc3BsaXQoIiAiKTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCWZvciAoIGkgPSAwLCBsID0gbmFtZS5sZW5ndGg7IGkgPCBsOyBpKysgKSB7DQoJCQkJCWRlbGV0ZSB0aGlzQ2FjaGVbIG5hbWVbaV0gXTsNCgkJCQl9DQoNCgkJCQkvLyBJZiB0aGVyZSBpcyBubyBkYXRhIGxlZnQgaW4gdGhlIGNhY2hlLCB3ZSB3YW50IHRvIGNvbnRpbnVlDQoJCQkJLy8gYW5kIGxldCB0aGUgY2FjaGUgb2JqZWN0IGl0c2VsZiBnZXQgZGVzdHJveWVkDQoJCQkJaWYgKCAhKCBwdnQgPyBpc0VtcHR5RGF0YU9iamVjdCA6IGpRdWVyeS5pc0VtcHR5T2JqZWN0ICkoIHRoaXNDYWNoZSApICkgew0KCQkJCQlyZXR1cm47DQoJCQkJfQ0KCQkJfQ0KCQl9DQoNCgkJLy8gU2VlIGpRdWVyeS5kYXRhIGZvciBtb3JlIGluZm9ybWF0aW9uDQoJCWlmICggIXB2dCApIHsNCgkJCWRlbGV0ZSBjYWNoZVsgaWQgXS5kYXRhOw0KDQoJCQkvLyBEb24ndCBkZXN0cm95IHRoZSBwYXJlbnQgY2FjaGUgdW5sZXNzIHRoZSBpbnRlcm5hbCBkYXRhIG9iamVjdA0KCQkJLy8gaGFkIGJlZW4gdGhlIG9ubHkgdGhpbmcgbGVmdCBpbiBpdA0KCQkJaWYgKCAhaXNFbXB0eURhdGFPYmplY3QoIGNhY2hlWyBpZCBdICkgKSB7DQoJCQkJcmV0dXJuOw0KCQkJfQ0KCQl9DQoNCgkJLy8gRGVzdHJveSB0aGUgY2FjaGUNCgkJaWYgKCBpc05vZGUgKSB7DQoJCQlqUXVlcnkuY2xlYW5EYXRhKCBbIGVsZW0gXSwgdHJ1ZSApOw0KDQoJCS8vIFVzZSBkZWxldGUgd2hlbiBzdXBwb3J0ZWQgZm9yIGV4cGFuZG9zIG9yIGBjYWNoZWAgaXMgbm90IGEgd2luZG93IHBlciBpc1dpbmRvdyAoIzEwMDgwKQ0KCQl9IGVsc2UgaWYgKCBqUXVlcnkuc3VwcG9ydC5kZWxldGVFeHBhbmRvIHx8IGNhY2hlICE9IGNhY2hlLndpbmRvdyApIHsNCgkJCWRlbGV0ZSBjYWNoZVsgaWQgXTsNCg0KCQkvLyBXaGVuIGFsbCBlbHNlIGZhaWxzLCBudWxsDQoJCX0gZWxzZSB7DQoJCQljYWNoZVsgaWQgXSA9IG51bGw7DQoJCX0NCgl9LA0KDQoJLy8gRm9yIGludGVybmFsIHVzZSBvbmx5Lg0KCV9kYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHsNCgkJcmV0dXJuIGpRdWVyeS5kYXRhKCBlbGVtLCBuYW1lLCBkYXRhLCB0cnVlICk7DQoJfSwNCg0KCS8vIEEgbWV0aG9kIGZvciBkZXRlcm1pbmluZyBpZiBhIERPTSBub2RlIGNhbiBoYW5kbGUgdGhlIGRhdGEgZXhwYW5kbw0KCWFjY2VwdERhdGE6IGZ1bmN0aW9uKCBlbGVtICkgew0KCQl2YXIgbm9EYXRhID0gZWxlbS5ub2RlTmFtZSAmJiBqUXVlcnkubm9EYXRhWyBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTsNCg0KCQkvLyBub2RlcyBhY2NlcHQgZGF0YSB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZDsgcmVqZWN0aW9uIGNhbiBiZSBjb25kaXRpb25hbA0KCQlyZXR1cm4gIW5vRGF0YSB8fCBub0RhdGEgIT09IHRydWUgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzaWQiKSA9PT0gbm9EYXRhOw0KCX0NCn0pOw0KDQpqUXVlcnkuZm4uZXh0ZW5kKHsNCglkYXRhOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsNCgkJdmFyIHBhcnRzLCBwYXJ0LCBhdHRyLCBuYW1lLCBsLA0KCQkJZWxlbSA9IHRoaXNbMF0sDQoJCQlpID0gMCwNCgkJCWRhdGEgPSBudWxsOw0KDQoJCS8vIEdldHMgYWxsIHZhbHVlcw0KCQlpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkgew0KCQkJaWYgKCB0aGlzLmxlbmd0aCApIHsNCgkJCQlkYXRhID0galF1ZXJ5LmRhdGEoIGVsZW0gKTsNCg0KCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAhalF1ZXJ5Ll9kYXRhKCBlbGVtLCAicGFyc2VkQXR0cnMiICkgKSB7DQoJCQkJCWF0dHIgPSBlbGVtLmF0dHJpYnV0ZXM7DQoJCQkJCWZvciAoIGwgPSBhdHRyLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsNCgkJCQkJCW5hbWUgPSBhdHRyW2ldLm5hbWU7DQoNCgkJCQkJCWlmICggIW5hbWUuaW5kZXhPZiggImRhdGEtIiApICkgew0KCQkJCQkJCW5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lLnN1YnN0cmluZyg1KSApOw0KDQoJCQkJCQkJZGF0YUF0dHIoIGVsZW0sIG5hbWUsIGRhdGFbIG5hbWUgXSApOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCWpRdWVyeS5fZGF0YSggZWxlbSwgInBhcnNlZEF0dHJzIiwgdHJ1ZSApOw0KCQkJCX0NCgkJCX0NCg0KCQkJcmV0dXJuIGRhdGE7DQoJCX0NCg0KCQkvLyBTZXRzIG11bHRpcGxlIHZhbHVlcw0KCQlpZiAoIHR5cGVvZiBrZXkgPT09ICJvYmplY3QiICkgew0KCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsNCgkJCQlqUXVlcnkuZGF0YSggdGhpcywga2V5ICk7DQoJCQl9KTsNCgkJfQ0KDQoJCXBhcnRzID0ga2V5LnNwbGl0KCAiLiIsIDIgKTsNCgkJcGFydHNbMV0gPSBwYXJ0c1sxXSA/ICIuIiArIHBhcnRzWzFdIDogIiI7DQoJCXBhcnQgPSBwYXJ0c1sxXSArICIhIjsNCg0KCQlyZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkgew0KDQoJCQlpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7DQoJCQkJZGF0YSA9IHRoaXMudHJpZ2dlckhhbmRsZXIoICJnZXREYXRhIiArIHBhcnQsIFsgcGFydHNbMF0gXSApOw0KDQoJCQkJLy8gVHJ5IHRvIGZldGNoIGFueSBpbnRlcm5hbGx5IHN0b3JlZCBkYXRhIGZpcnN0DQoJCQkJaWYgKCBkYXRhID09PSB1bmRlZmluZWQgJiYgZWxlbSApIHsNCgkJCQkJZGF0YSA9IGpRdWVyeS5kYXRhKCBlbGVtLCBrZXkgKTsNCgkJCQkJZGF0YSA9IGRhdGFBdHRyKCBlbGVtLCBrZXksIGRhdGEgKTsNCgkJCQl9DQoNCgkJCQlyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkICYmIHBhcnRzWzFdID8NCgkJCQkJdGhpcy5kYXRhKCBwYXJ0c1swXSApIDoNCgkJCQkJZGF0YTsNCgkJCX0NCg0KCQkJcGFydHNbMV0gPSB2YWx1ZTsNCgkJCXRoaXMuZWFjaChmdW5jdGlvbigpIHsNCgkJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApOw0KDQoJCQkJc2VsZi50cmlnZ2VySGFuZGxlciggInNldERhdGEiICsgcGFydCwgcGFydHMgKTsNCgkJCQlqUXVlcnkuZGF0YSggdGhpcywga2V5LCB2YWx1ZSApOw0KCQkJCXNlbGYudHJpZ2dlckhhbmRsZXIoICJjaGFuZ2VEYXRhIiArIHBhcnQsIHBhcnRzICk7DQoJCQl9KTsNCgkJfSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxLCBudWxsLCBmYWxzZSApOw0KCX0sDQoNCglyZW1vdmVEYXRhOiBmdW5jdGlvbigga2V5ICkgew0KCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgew0KCQkJalF1ZXJ5LnJlbW92ZURhdGEoIHRoaXMsIGtleSApOw0KCQl9KTsNCgl9DQp9KTsNCg0KZnVuY3Rpb24gZGF0YUF0dHIoIGVsZW0sIGtleSwgZGF0YSApIHsNCgkvLyBJZiBub3RoaW5nIHdhcyBmb3VuZCBpbnRlcm5hbGx5LCB0cnkgdG8gZmV0Y2ggYW55DQoJLy8gZGF0YSBmcm9tIHRoZSBIVE1MNSBkYXRhLSogYXR0cmlidXRlDQoJaWYgKCBkYXRhID09PSB1bmRlZmluZWQgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsNCg0KCQl2YXIgbmFtZSA9ICJkYXRhLSIgKyBrZXkucmVwbGFjZSggcm11bHRpRGFzaCwgIi0kMSIgKS50b0xvd2VyQ2FzZSgpOw0KDQoJCWRhdGEgPSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApOw0KDQoJCWlmICggdHlwZW9mIGRhdGEgPT09ICJzdHJpbmciICkgew0KCQkJdHJ5IHsNCgkJCQlkYXRhID0gZGF0YSA9PT0gInRydWUiID8gdHJ1ZSA6DQoJCQkJZGF0YSA9PT0gImZhbHNlIiA/IGZhbHNlIDoNCgkJCQlkYXRhID09PSAibnVsbCIgPyBudWxsIDoNCgkJCQkvLyBPbmx5IGNvbnZlcnQgdG8gYSBudW1iZXIgaWYgaXQgZG9lc24ndCBjaGFuZ2UgdGhlIHN0cmluZw0KCQkJCStkYXRhICsgIiIgPT09IGRhdGEgPyArZGF0YSA6DQoJCQkJcmJyYWNlLnRlc3QoIGRhdGEgKSA/IGpRdWVyeS5wYXJzZUpTT04oIGRhdGEgKSA6DQoJCQkJCWRhdGE7DQoJCQl9IGNhdGNoKCBlICkge30NCg0KCQkJLy8gTWFrZSBzdXJlIHdlIHNldCB0aGUgZGF0YSBzbyBpdCBpc24ndCBjaGFuZ2VkIGxhdGVyDQoJCQlqUXVlcnkuZGF0YSggZWxlbSwga2V5LCBkYXRhICk7DQoNCgkJfSBlbHNlIHsNCgkJCWRhdGEgPSB1bmRlZmluZWQ7DQoJCX0NCgl9DQoNCglyZXR1cm4gZGF0YTsNCn0NCg0KLy8gY2hlY2tzIGEgY2FjaGUgb2JqZWN0IGZvciBlbXB0aW5lc3MNCmZ1bmN0aW9uIGlzRW1wdHlEYXRhT2JqZWN0KCBvYmogKSB7DQoJdmFyIG5hbWU7DQoJZm9yICggbmFtZSBpbiBvYmogKSB7DQoNCgkJLy8gaWYgdGhlIHB1YmxpYyBkYXRhIG9iamVjdCBpcyBlbXB0eSwgdGhlIHByaXZhdGUgaXMgc3RpbGwgZW1wdHkNCgkJaWYgKCBuYW1lID09PSAiZGF0YSIgJiYgalF1ZXJ5LmlzRW1wdHlPYmplY3QoIG9ialtuYW1lXSApICkgew0KCQkJY29udGludWU7DQoJCX0NCgkJaWYgKCBuYW1lICE9PSAidG9KU09OIiApIHsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCX0NCg0KCXJldHVybiB0cnVlOw0KfQ0KalF1ZXJ5LmV4dGVuZCh7DQoJcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkgew0KCQl2YXIgcXVldWU7DQoNCgkJaWYgKCBlbGVtICkgew0KCQkJdHlwZSA9ICggdHlwZSB8fCAiZngiICkgKyAicXVldWUiOw0KCQkJcXVldWUgPSBqUXVlcnkuX2RhdGEoIGVsZW0sIHR5cGUgKTsNCg0KCQkJLy8gU3BlZWQgdXAgZGVxdWV1ZSBieSBnZXR0aW5nIG91dCBxdWlja2x5IGlmIHRoaXMgaXMganVzdCBhIGxvb2t1cA0KCQkJaWYgKCBkYXRhICkgew0KCQkJCWlmICggIXF1ZXVlIHx8IGpRdWVyeS5pc0FycmF5KGRhdGEpICkgew0KCQkJCQlxdWV1ZSA9IGpRdWVyeS5fZGF0YSggZWxlbSwgdHlwZSwgalF1ZXJ5Lm1ha2VBcnJheShkYXRhKSApOw0KCQkJCX0gZWxzZSB7DQoJCQkJCXF1ZXVlLnB1c2goIGRhdGEgKTsNCgkJCQl9DQoJCQl9DQoJCQlyZXR1cm4gcXVldWUgfHwgW107DQoJCX0NCgl9LA0KDQoJZGVxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7DQoJCXR5cGUgPSB0eXBlIHx8ICJmeCI7DQoNCgkJdmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCBlbGVtLCB0eXBlICksDQoJCQlzdGFydExlbmd0aCA9IHF1ZXVlLmxlbmd0aCwNCgkJCWZuID0gcXVldWUuc2hpZnQoKSwNCgkJCWhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCB0eXBlICksDQoJCQluZXh0ID0gZnVuY3Rpb24oKSB7DQoJCQkJalF1ZXJ5LmRlcXVldWUoIGVsZW0sIHR5cGUgKTsNCgkJCX07DQoNCgkJLy8gSWYgdGhlIGZ4IHF1ZXVlIGlzIGRlcXVldWVkLCBhbHdheXMgcmVtb3ZlIHRoZSBwcm9ncmVzcyBzZW50aW5lbA0KCQlpZiAoIGZuID09PSAiaW5wcm9ncmVzcyIgKSB7DQoJCQlmbiA9IHF1ZXVlLnNoaWZ0KCk7DQoJCQlzdGFydExlbmd0aC0tOw0KCQl9DQoNCgkJaWYgKCBmbiApIHsNCg0KCQkJLy8gQWRkIGEgcHJvZ3Jlc3Mgc2VudGluZWwgdG8gcHJldmVudCB0aGUgZnggcXVldWUgZnJvbSBiZWluZw0KCQkJLy8gYXV0b21hdGljYWxseSBkZXF1ZXVlZA0KCQkJaWYgKCB0eXBlID09PSAiZngiICkgew0KCQkJCXF1ZXVlLnVuc2hpZnQoICJpbnByb2dyZXNzIiApOw0KCQkJfQ0KDQoJCQkvLyBjbGVhciB1cCB0aGUgbGFzdCBxdWV1ZSBzdG9wIGZ1bmN0aW9uDQoJCQlkZWxldGUgaG9va3Muc3RvcDsNCgkJCWZuLmNhbGwoIGVsZW0sIG5leHQsIGhvb2tzICk7DQoJCX0NCg0KCQlpZiAoICFzdGFydExlbmd0aCAmJiBob29rcyApIHsNCgkJCWhvb2tzLmVtcHR5LmZpcmUoKTsNCgkJfQ0KCX0sDQoNCgkvLyBub3QgaW50ZW5kZWQgZm9yIHB1YmxpYyBjb25zdW1wdGlvbiAtIGdlbmVyYXRlcyBhIHF1ZXVlSG9va3Mgb2JqZWN0LCBvciByZXR1cm5zIHRoZSBjdXJyZW50IG9uZQ0KCV9xdWV1ZUhvb2tzOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHsNCgkJdmFyIGtleSA9IHR5cGUgKyAicXVldWVIb29rcyI7DQoJCXJldHVybiBqUXVlcnkuX2RhdGEoIGVsZW0sIGtleSApIHx8IGpRdWVyeS5fZGF0YSggZWxlbSwga2V5LCB7DQoJCQllbXB0eTogalF1ZXJ5LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKS5hZGQoZnVuY3Rpb24oKSB7DQoJCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0sIHR5cGUgKyAicXVldWUiLCB0cnVlICk7DQoJCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0sIGtleSwgdHJ1ZSApOw0KCQkJfSkNCgkJfSk7DQoJfQ0KfSk7DQoNCmpRdWVyeS5mbi5leHRlbmQoew0KCXF1ZXVlOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsNCgkJdmFyIHNldHRlciA9IDI7DQoNCgkJaWYgKCB0eXBlb2YgdHlwZSAhPT0gInN0cmluZyIgKSB7DQoJCQlkYXRhID0gdHlwZTsNCgkJCXR5cGUgPSAiZngiOw0KCQkJc2V0dGVyLS07DQoJCX0NCg0KCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggPCBzZXR0ZXIgKSB7DQoJCQlyZXR1cm4galF1ZXJ5LnF1ZXVlKCB0aGlzWzBdLCB0eXBlICk7DQoJCX0NCg0KCQlyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkID8NCgkJCXRoaXMgOg0KCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgew0KCQkJCXZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApOw0KDQoJCQkJLy8gZW5zdXJlIGEgaG9va3MgZm9yIHRoaXMgcXVldWUNCgkJCQlqUXVlcnkuX3F1ZXVlSG9va3MoIHRoaXMsIHR5cGUgKTsNCg0KCQkJCWlmICggdHlwZSA9PT0gImZ4IiAmJiBxdWV1ZVswXSAhPT0gImlucHJvZ3Jlc3MiICkgew0KCQkJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOw0KCQkJCX0NCgkJCX0pOw0KCX0sDQoJZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7DQoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7DQoJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOw0KCQl9KTsNCgl9LA0KCS8vIEJhc2VkIG9mZiBvZiB0aGUgcGx1Z2luIGJ5IENsaW50IEhlbGZlcnMsIHdpdGggcGVybWlzc2lvbi4NCgkvLyBodHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvDQoJZGVsYXk6IGZ1bmN0aW9uKCB0aW1lLCB0eXBlICkgew0KCQl0aW1lID0galF1ZXJ5LmZ4ID8galF1ZXJ5LmZ4LnNwZWVkc1sgdGltZSBdIHx8IHRpbWUgOiB0aW1lOw0KCQl0eXBlID0gdHlwZSB8fCAiZngiOw0KDQoJCXJldHVybiB0aGlzLnF1ZXVlKCB0eXBlLCBmdW5jdGlvbiggbmV4dCwgaG9va3MgKSB7DQoJCQl2YXIgdGltZW91dCA9IHNldFRpbWVvdXQoIG5leHQsIHRpbWUgKTsNCgkJCWhvb2tzLnN0b3AgPSBmdW5jdGlvbigpIHsNCgkJCQljbGVhclRpbWVvdXQoIHRpbWVvdXQgKTsNCgkJCX07DQoJCX0pOw0KCX0sDQoJY2xlYXJRdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7DQoJCXJldHVybiB0aGlzLnF1ZXVlKCB0eXBlIHx8ICJmeCIsIFtdICk7DQoJfSwNCgkvLyBHZXQgYSBwcm9taXNlIHJlc29sdmVkIHdoZW4gcXVldWVzIG9mIGEgY2VydGFpbiB0eXBlDQoJLy8gYXJlIGVtcHRpZWQgKGZ4IGlzIHRoZSB0eXBlIGJ5IGRlZmF1bHQpDQoJcHJvbWlzZTogZnVuY3Rpb24oIHR5cGUsIG9iaiApIHsNCgkJdmFyIHRtcCwNCgkJCWNvdW50ID0gMSwNCgkJCWRlZmVyID0galF1ZXJ5LkRlZmVycmVkKCksDQoJCQllbGVtZW50cyA9IHRoaXMsDQoJCQlpID0gdGhpcy5sZW5ndGgsDQoJCQlyZXNvbHZlID0gZnVuY3Rpb24oKSB7DQoJCQkJaWYgKCAhKCAtLWNvdW50ICkgKSB7DQoJCQkJCWRlZmVyLnJlc29sdmVXaXRoKCBlbGVtZW50cywgWyBlbGVtZW50cyBdICk7DQoJCQkJfQ0KCQkJfTsNCg0KCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsNCgkJCW9iaiA9IHR5cGU7DQoJCQl0eXBlID0gdW5kZWZpbmVkOw0KCQl9DQoJCXR5cGUgPSB0eXBlIHx8ICJmeCI7DQoNCgkJd2hpbGUoIGktLSApIHsNCgkJCXRtcCA9IGpRdWVyeS5fZGF0YSggZWxlbWVudHNbIGkgXSwgdHlwZSArICJxdWV1ZUhvb2tzIiApOw0KCQkJaWYgKCB0bXAgJiYgdG1wLmVtcHR5ICkgew0KCQkJCWNvdW50Kys7DQoJCQkJdG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApOw0KCQkJfQ0KCQl9DQoJCXJlc29sdmUoKTsNCgkJcmV0dXJuIGRlZmVyLnByb21pc2UoIG9iaiApOw0KCX0NCn0pOw0KdmFyIG5vZGVIb29rLCBib29sSG9vaywgZml4U3BlY2lmaWVkLA0KCXJjbGFzcyA9IC9bXHRcclxuXS9nLA0KCXJyZXR1cm4gPSAvXHIvZywNCglydHlwZSA9IC9eKD86YnV0dG9ufGlucHV0KSQvaSwNCglyZm9jdXNhYmxlID0gL14oPzpidXR0b258aW5wdXR8b2JqZWN0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksDQoJcmNsaWNrYWJsZSA9IC9eYSg/OnJlYXwpJC9pLA0KCXJib29sZWFuID0gL14oPzphdXRvZm9jdXN8YXV0b3BsYXl8YXN5bmN8Y2hlY2tlZHxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZHxzZWxlY3RlZCkkL2ksDQoJZ2V0U2V0QXR0cmlidXRlID0galF1ZXJ5LnN1cHBvcnQuZ2V0U2V0QXR0cmlidXRlOw0KDQpqUXVlcnkuZm4uZXh0ZW5kKHsNCglhdHRyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7DQoJCXJldHVybiBqUXVlcnkuYWNjZXNzKCB0aGlzLCBqUXVlcnkuYXR0ciwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7DQoJfSwNCg0KCXJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkgew0KCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgew0KCQkJalF1ZXJ5LnJlbW92ZUF0dHIoIHRoaXMsIG5hbWUgKTsNCgkJfSk7DQoJfSwNCg0KCXByb3A6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsNCgkJcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIGpRdWVyeS5wcm9wLCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTsNCgl9LA0KDQoJcmVtb3ZlUHJvcDogZnVuY3Rpb24oIG5hbWUgKSB7DQoJCW5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7DQoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7DQoJCQkvLyB0cnkvY2F0Y2ggaGFuZGxlcyBjYXNlcyB3aGVyZSBJRSBiYWxrcyAoc3VjaCBhcyByZW1vdmluZyBhIHByb3BlcnR5IG9uIHdpbmRvdykNCgkJCXRyeSB7DQoJCQkJdGhpc1sgbmFtZSBdID0gdW5kZWZpbmVkOw0KCQkJCWRlbGV0ZSB0aGlzWyBuYW1lIF07DQoJCQl9IGNhdGNoKCBlICkge30NCgkJfSk7DQoJfSwNCg0KCWFkZENsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7DQoJCXZhciBjbGFzc05hbWVzLCBpLCBsLCBlbGVtLA0KCQkJc2V0Q2xhc3MsIGMsIGNsOw0KDQoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7DQoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBqICkgew0KCQkJCWpRdWVyeSggdGhpcyApLmFkZENsYXNzKCB2YWx1ZS5jYWxsKHRoaXMsIGosIHRoaXMuY2xhc3NOYW1lKSApOw0KCQkJfSk7DQoJCX0NCg0KCQlpZiAoIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgKSB7DQoJCQljbGFzc05hbWVzID0gdmFsdWUuc3BsaXQoIGNvcmVfcnNwYWNlICk7DQoNCgkJCWZvciAoIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7DQoJCQkJZWxlbSA9IHRoaXNbIGkgXTsNCg0KCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsNCgkJCQkJaWYgKCAhZWxlbS5jbGFzc05hbWUgJiYgY2xhc3NOYW1lcy5sZW5ndGggPT09IDEgKSB7DQoJCQkJCQllbGVtLmNsYXNzTmFtZSA9IHZhbHVlOw0KDQoJCQkJCX0gZWxzZSB7DQoJCQkJCQlzZXRDbGFzcyA9ICIgIiArIGVsZW0uY2xhc3NOYW1lICsgIiAiOw0KDQoJCQkJCQlmb3IgKCBjID0gMCwgY2wgPSBjbGFzc05hbWVzLmxlbmd0aDsgYyA8IGNsOyBjKysgKSB7DQoJCQkJCQkJaWYgKCBzZXRDbGFzcy5pbmRleE9mKCAiICIgKyBjbGFzc05hbWVzWyBjIF0gKyAiICIgKSA8IDAgKSB7DQoJCQkJCQkJCXNldENsYXNzICs9IGNsYXNzTmFtZXNbIGMgXSArICIgIjsNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCQllbGVtLmNsYXNzTmFtZSA9IGpRdWVyeS50cmltKCBzZXRDbGFzcyApOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQl9DQoNCgkJcmV0dXJuIHRoaXM7DQoJfSwNCg0KCXJlbW92ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7DQoJCXZhciByZW1vdmVzLCBjbGFzc05hbWUsIGVsZW0sIGMsIGNsLCBpLCBsOw0KDQoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7DQoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBqICkgew0KCQkJCWpRdWVyeSggdGhpcyApLnJlbW92ZUNsYXNzKCB2YWx1ZS5jYWxsKHRoaXMsIGosIHRoaXMuY2xhc3NOYW1lKSApOw0KCQkJfSk7DQoJCX0NCgkJaWYgKCAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIikgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCApIHsNCgkJCXJlbW92ZXMgPSAoIHZhbHVlIHx8ICIiICkuc3BsaXQoIGNvcmVfcnNwYWNlICk7DQoNCgkJCWZvciAoIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7DQoJCQkJZWxlbSA9IHRoaXNbIGkgXTsNCgkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgZWxlbS5jbGFzc05hbWUgKSB7DQoNCgkJCQkJY2xhc3NOYW1lID0gKCIgIiArIGVsZW0uY2xhc3NOYW1lICsgIiAiKS5yZXBsYWNlKCByY2xhc3MsICIgIiApOw0KDQoJCQkJCS8vIGxvb3Agb3ZlciBlYWNoIGl0ZW0gaW4gdGhlIHJlbW92YWwgbGlzdA0KCQkJCQlmb3IgKCBjID0gMCwgY2wgPSByZW1vdmVzLmxlbmd0aDsgYyA8IGNsOyBjKysgKSB7DQoJCQkJCQkvLyBSZW1vdmUgdW50aWwgdGhlcmUgaXMgbm90aGluZyB0byByZW1vdmUsDQoJCQkJCQl3aGlsZSAoIGNsYXNzTmFtZS5pbmRleE9mKCIgIiArIHJlbW92ZXNbIGMgXSArICIgIikgPj0gMCApIHsNCgkJCQkJCQljbGFzc05hbWUgPSBjbGFzc05hbWUucmVwbGFjZSggIiAiICsgcmVtb3Zlc1sgYyBdICsgIiAiICwgIiAiICk7DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQkJZWxlbS5jbGFzc05hbWUgPSB2YWx1ZSA/IGpRdWVyeS50cmltKCBjbGFzc05hbWUgKSA6ICIiOw0KCQkJCX0NCgkJCX0NCgkJfQ0KDQoJCXJldHVybiB0aGlzOw0KCX0sDQoNCgl0b2dnbGVDbGFzczogZnVuY3Rpb24oIHZhbHVlLCBzdGF0ZVZhbCApIHsNCgkJdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWUsDQoJCQlpc0Jvb2wgPSB0eXBlb2Ygc3RhdGVWYWwgPT09ICJib29sZWFuIjsNCg0KCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgew0KCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHsNCgkJCQlqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcyggdmFsdWUuY2FsbCh0aGlzLCBpLCB0aGlzLmNsYXNzTmFtZSwgc3RhdGVWYWwpLCBzdGF0ZVZhbCApOw0KCQkJfSk7DQoJCX0NCg0KCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgew0KCQkJaWYgKCB0eXBlID09PSAic3RyaW5nIiApIHsNCgkJCQkvLyB0b2dnbGUgaW5kaXZpZHVhbCBjbGFzcyBuYW1lcw0KCQkJCXZhciBjbGFzc05hbWUsDQoJCQkJCWkgPSAwLA0KCQkJCQlzZWxmID0galF1ZXJ5KCB0aGlzICksDQoJCQkJCXN0YXRlID0gc3RhdGVWYWwsDQoJCQkJCWNsYXNzTmFtZXMgPSB2YWx1ZS5zcGxpdCggY29yZV9yc3BhY2UgKTsNCg0KCQkJCXdoaWxlICggKGNsYXNzTmFtZSA9IGNsYXNzTmFtZXNbIGkrKyBdKSApIHsNCgkJCQkJLy8gY2hlY2sgZWFjaCBjbGFzc05hbWUgZ2l2ZW4sIHNwYWNlIHNlcGFyYXRlZCBsaXN0DQoJCQkJCXN0YXRlID0gaXNCb29sID8gc3RhdGUgOiAhc2VsZi5oYXNDbGFzcyggY2xhc3NOYW1lICk7DQoJCQkJCXNlbGZbIHN0YXRlID8gImFkZENsYXNzIiA6ICJyZW1vdmVDbGFzcyIgXSggY2xhc3NOYW1lICk7DQoJCQkJfQ0KDQoJCQl9IGVsc2UgaWYgKCB0eXBlID09PSAidW5kZWZpbmVkIiB8fCB0eXBlID09PSAiYm9vbGVhbiIgKSB7DQoJCQkJaWYgKCB0aGlzLmNsYXNzTmFtZSApIHsNCgkJCQkJLy8gc3RvcmUgY2xhc3NOYW1lIGlmIHNldA0KCQkJCQlqUXVlcnkuX2RhdGEoIHRoaXMsICJfX2NsYXNzTmFtZV9fIiwgdGhpcy5jbGFzc05hbWUgKTsNCgkJCQl9DQoNCgkJCQkvLyB0b2dnbGUgd2hvbGUgY2xhc3NOYW1lDQoJCQkJdGhpcy5jbGFzc05hbWUgPSB0aGlzLmNsYXNzTmFtZSB8fCB2YWx1ZSA9PT0gZmFsc2UgPyAiIiA6IGpRdWVyeS5fZGF0YSggdGhpcywgIl9fY2xhc3NOYW1lX18iICkgfHwgIiI7DQoJCQl9DQoJCX0pOw0KCX0sDQoNCgloYXNDbGFzczogZnVuY3Rpb24oIHNlbGVjdG9yICkgew0KCQl2YXIgY2xhc3NOYW1lID0gIiAiICsgc2VsZWN0b3IgKyAiICIsDQoJCQlpID0gMCwNCgkJCWwgPSB0aGlzLmxlbmd0aDsNCgkJZm9yICggOyBpIDwgbDsgaSsrICkgew0KCQkJaWYgKCB0aGlzW2ldLm5vZGVUeXBlID09PSAxICYmICgiICIgKyB0aGlzW2ldLmNsYXNzTmFtZSArICIgIikucmVwbGFjZShyY2xhc3MsICIgIikuaW5kZXhPZiggY2xhc3NOYW1lICkgPj0gMCApIHsNCgkJCQlyZXR1cm4gdHJ1ZTsNCgkJCX0NCgkJfQ0KDQoJCXJldHVybiBmYWxzZTsNCgl9LA0KDQoJdmFsOiBmdW5jdGlvbiggdmFsdWUgKSB7DQoJCXZhciBob29rcywgcmV0LCBpc0Z1bmN0aW9uLA0KCQkJZWxlbSA9IHRoaXNbMF07DQoNCgkJaWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHsNCgkJCWlmICggZWxlbSApIHsNCgkJCQlob29rcyA9IGpRdWVyeS52YWxIb29rc1sgZWxlbS50eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTsNCg0KCQkJCWlmICggaG9va3MgJiYgImdldCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgInZhbHVlIiApKSAhPT0gdW5kZWZpbmVkICkgew0KCQkJCQlyZXR1cm4gcmV0Ow0KCQkJCX0NCg0KCQkJCXJldCA9IGVsZW0udmFsdWU7DQoNCgkJCQlyZXR1cm4gdHlwZW9mIHJldCA9PT0gInN0cmluZyIgPw0KCQkJCQkvLyBoYW5kbGUgbW9zdCBjb21tb24gc3RyaW5nIGNhc2VzDQoJCQkJCXJldC5yZXBsYWNlKHJyZXR1cm4sICIiKSA6DQoJCQkJCS8vIGhhbmRsZSBjYXNlcyB3aGVyZSB2YWx1ZSBpcyBudWxsL3VuZGVmIG9yIG51bWJlcg0KCQkJCQlyZXQgPT0gbnVsbCA/ICIiIDogcmV0Ow0KCQkJfQ0KDQoJCQlyZXR1cm47DQoJCX0NCg0KCQlpc0Z1bmN0aW9uID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICk7DQoNCgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHsNCgkJCXZhciB2YWwsDQoJCQkJc2VsZiA9IGpRdWVyeSh0aGlzKTsNCg0KCQkJaWYgKCB0aGlzLm5vZGVUeXBlICE9PSAxICkgew0KCQkJCXJldHVybjsNCgkJCX0NCg0KCQkJaWYgKCBpc0Z1bmN0aW9uICkgew0KCQkJCXZhbCA9IHZhbHVlLmNhbGwoIHRoaXMsIGksIHNlbGYudmFsKCkgKTsNCgkJCX0gZWxzZSB7DQoJCQkJdmFsID0gdmFsdWU7DQoJCQl9DQoNCgkJCS8vIFRyZWF0IG51bGwvdW5kZWZpbmVkIGFzICIiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nDQoJCQlpZiAoIHZhbCA9PSBudWxsICkgew0KCQkJCXZhbCA9ICIiOw0KCQkJfSBlbHNlIGlmICggdHlwZW9mIHZhbCA9PT0gIm51bWJlciIgKSB7DQoJCQkJdmFsICs9ICIiOw0KCQkJfSBlbHNlIGlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbCApICkgew0KCQkJCXZhbCA9IGpRdWVyeS5tYXAodmFsLCBmdW5jdGlvbiAoIHZhbHVlICkgew0KCQkJCQlyZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUgKyAiIjsNCgkJCQl9KTsNCgkJCX0NCg0KCQkJaG9va3MgPSBqUXVlcnkudmFsSG9va3NbIHRoaXMudHlwZSBdIHx8IGpRdWVyeS52YWxIb29rc1sgdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07DQoNCgkJCS8vIElmIHNldCByZXR1cm5zIHVuZGVmaW5lZCwgZmFsbCBiYWNrIHRvIG5vcm1hbCBzZXR0aW5nDQoJCQlpZiAoICFob29rcyB8fCAhKCJzZXQiIGluIGhvb2tzKSB8fCBob29rcy5zZXQoIHRoaXMsIHZhbCwgInZhbHVlIiApID09PSB1bmRlZmluZWQgKSB7DQoJCQkJdGhpcy52YWx1ZSA9IHZhbDsNCgkJCX0NCgkJfSk7DQoJfQ0KfSk7DQoNCmpRdWVyeS5leHRlbmQoew0KCXZhbEhvb2tzOiB7DQoJCW9wdGlvbjogew0KCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsNCgkJCQkvLyBhdHRyaWJ1dGVzLnZhbHVlIGlzIHVuZGVmaW5lZCBpbiBCbGFja2JlcnJ5IDQuNyBidXQNCgkJCQkvLyB1c2VzIC52YWx1ZS4gU2VlICM2OTMyDQoJCQkJdmFyIHZhbCA9IGVsZW0uYXR0cmlidXRlcy52YWx1ZTsNCgkJCQlyZXR1cm4gIXZhbCB8fCB2YWwuc3BlY2lmaWVkID8gZWxlbS52YWx1ZSA6IGVsZW0udGV4dDsNCgkJCX0NCgkJfSwNCgkJc2VsZWN0OiB7DQoJCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgew0KCQkJCXZhciB2YWx1ZSwgb3B0aW9uLA0KCQkJCQlvcHRpb25zID0gZWxlbS5vcHRpb25zLA0KCQkJCQlpbmRleCA9IGVsZW0uc2VsZWN0ZWRJbmRleCwNCgkJCQkJb25lID0gZWxlbS50eXBlID09PSAic2VsZWN0LW9uZSIgfHwgaW5kZXggPCAwLA0KCQkJCQl2YWx1ZXMgPSBvbmUgPyBudWxsIDogW10sDQoJCQkJCW1heCA9IG9uZSA/IGluZGV4ICsgMSA6IG9wdGlvbnMubGVuZ3RoLA0KCQkJCQlpID0gaW5kZXggPCAwID8NCgkJCQkJCW1heCA6DQoJCQkJCQlvbmUgPyBpbmRleCA6IDA7DQoNCgkJCQkvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zDQoJCQkJZm9yICggOyBpIDwgbWF4OyBpKysgKSB7DQoJCQkJCW9wdGlvbiA9IG9wdGlvbnNbIGkgXTsNCg0KCQkJCQkvLyBvbGRJRSBkb2Vzbid0IHVwZGF0ZSBzZWxlY3RlZCBhZnRlciBmb3JtIHJlc2V0ICgjMjU1MSkNCgkJCQkJaWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCApICYmDQoJCQkJCQkJLy8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cA0KCQkJCQkJCSggalF1ZXJ5LnN1cHBvcnQub3B0RGlzYWJsZWQgPyAhb3B0aW9uLmRpc2FibGVkIDogb3B0aW9uLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKSA9PT0gbnVsbCApICYmDQoJCQkJCQkJKCAhb3B0aW9uLnBhcmVudE5vZGUuZGlzYWJsZWQgfHwgIWpRdWVyeS5ub2RlTmFtZSggb3B0aW9uLnBhcmVudE5vZGUsICJvcHRncm91cCIgKSApICkgew0KDQoJCQkJCQkvLyBHZXQgdGhlIHNwZWNpZmljIHZhbHVlIGZvciB0aGUgb3B0aW9uDQoJCQkJCQl2YWx1ZSA9IGpRdWVyeSggb3B0aW9uICkudmFsKCk7DQoNCgkJCQkJCS8vIFdlIGRvbid0IG5lZWQgYW4gYXJyYXkgZm9yIG9uZSBzZWxlY3RzDQoJCQkJCQlpZiAoIG9uZSApIHsNCgkJCQkJCQlyZXR1cm4gdmFsdWU7DQoJCQkJCQl9DQoNCgkJCQkJCS8vIE11bHRpLVNlbGVjdHMgcmV0dXJuIGFuIGFycmF5DQoJCQkJCQl2YWx1ZXMucHVzaCggdmFsdWUgKTsNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCXJldHVybiB2YWx1ZXM7DQoJCQl9LA0KDQoJCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsNCgkJCQl2YXIgdmFsdWVzID0galF1ZXJ5Lm1ha2VBcnJheSggdmFsdWUgKTsNCg0KCQkJCWpRdWVyeShlbGVtKS5maW5kKCJvcHRpb24iKS5lYWNoKGZ1bmN0aW9uKCkgew0KCQkJCQl0aGlzLnNlbGVjdGVkID0galF1ZXJ5LmluQXJyYXkoIGpRdWVyeSh0aGlzKS52YWwoKSwgdmFsdWVzICkgPj0gMDsNCgkJCQl9KTsNCg0KCQkJCWlmICggIXZhbHVlcy5sZW5ndGggKSB7DQoJCQkJCWVsZW0uc2VsZWN0ZWRJbmRleCA9IC0xOw0KCQkJCX0NCgkJCQlyZXR1cm4gdmFsdWVzOw0KCQkJfQ0KCQl9DQoJfSwNCg0KCS8vIFVudXNlZCBpbiAxLjgsIGxlZnQgaW4gc28gYXR0ckZuLXN0YWJiZXJzIHdvbid0IGRpZTsgcmVtb3ZlIGluIDEuOQ0KCWF0dHjgbjoge30sDQoNCglhdHRyOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUsIHBhc3MgKSB7DQoJCXZhciByZXQsIGhvb2tzLCBub3R4bWwsDQoJCQluVHlwZSA9IGVsZW0ubm9kZVR5cGU7DQoNCgkJLy8gZG9uJ3QgZ2V0L3NldCBhdHRyaWJ1dGVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2Rlcw0KCQlpZiAoICFlbGVtIHx8IG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgew0KCQkJcmV0dXJuOw0KCQl9DQoNCgkJaWYgKCBwYXNzICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBqUXVlcnkuZm5bIG5hbWUgXSApICkgew0KCQkJcmV0dXJuIGpRdWVyeSggZWxlbSApWyBuYW1lIF0oIHZhbHVlICk7DQoJCX0NCg0KCQkvLyBGYWxsYmFjayB0byBwcm9wIHdoZW4gYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZA0KCQlpZiAoIHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSA9PT0gInVuZGVmaW5lZCIgKSB7DQoJCQlyZXR1cm4galF1ZXJ5LnByb3AoIGVsZW0sIG5hbWUsIHZhbHVlICk7DQoJCX0NCg0KCQlub3R4bWwgPSBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICk7DQoNCgkJLy8gQWxsIGF0dHJpYnV0ZXMgYXJlIGxvd2VyY2FzZQ0KCQkvLyBHcmFiIG5lY2Vzc2FyeSBob29rIGlmIG9uZSBpcyBkZWZpbmVkDQoJCWlmICggbm90eG1sICkgew0KCQkJbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsNCgkJCWhvb2tzID0galF1ZXJ5LmF0dHJIb29rc1sgbmFtZSBdIHx8ICggcmJvb2xlYW4udGVzdCggbmFtZSApID8gYm9vbEhvb2sgOiBub2RlSG9vayApOw0KCQl9DQoNCgkJaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgew0KDQoJCQlpZiAoIHZhbHVlID09PSBudWxsICkgew0KCQkJCWpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7DQoJCQkJcmV0dXJuOw0KDQoJCQl9IGVsc2UgaWYgKCBob29rcyAmJiAic2V0IiBpbiBob29rcyAmJiBub3R4bWwgJiYgKHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSkgIT09IHVuZGVmaW5lZCApIHsNCgkJCQlyZXR1cm4gcmV0Ow0KDQoJCQl9IGVsc2Ugew0KCQkJCWVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCB2YWx1ZSArICIiICk7DQoJCQkJcmV0dXJuIHZhbHVlOw0KCQkJfQ0KDQoJCX0gZWxzZSBpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmIG5vdHhtbCAmJiAocmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkpICE9PSBudWxsICkgew0KCQkJcmV0dXJuIHJldDsNCg0KCQl9IGVsc2Ugew0KDQoJCQlyZXQgPSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApOw0KDQoJCQkvLyBOb24tZXhpc3RlbnQgYXR0cmlidXRlcyByZXR1cm4gbnVsbCwgd2Ugbm9ybWFsaXplIHRvIHVuZGVmaW5lZA0KCQkJcmV0dXJuIHJldCA9PT0gbnVsbCA/DQoJCQkJdW5kZWZpbmVkIDoNCgkJCQlyZXQ7DQoJCX0NCgl9LA0KDQoJcmVtb3ZlQXR0cjogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgew0KCQl2YXIgcHJvcE5hbWUsIGF0dHJOYW1lcywgbmFtZSwgaXNCb29sLA0KCQkJaSA9IDA7DQoNCgkJaWYgKCB2YWx1ZSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgew0KDQoJCQlhdHRyTmFtZXMgPSB2YWx1ZS5zcGxpdCggY29yZV9yc3BhY2UgKTsNCg0KCQkJZm9yICggOyBpIDwgYXR0ck5hbWVzLmxlbmd0aDsgaSsrICkgew0KCQkJCW5hbWUgPSBhdHRyTmFtZXNbIGkgXTsNCg0KCQkJCWlmICggbmFtZSApIHsNCgkJCQkJcHJvcE5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7DQoJCQkJCWlzQm9vbCA9IHJib29sZWFuLnRlc3QoIG5hbWUgKTsNCg0KCQkJCQkvLyBTZWUgIzk2OTkgZm9yIGV4cGxhbmF0aW9uIG9mIHRoaXMgYXBwcm9hY2ggKHNldHRpbmcgZmlyc3QsIHRoZW4gcmVtb3ZhbCkNCgkJCQkJLy8gRG8gbm90IGRvIHRoaXMgZm9yIGJvb2xlYW4gYXR0cmlidXRlcyAoc2VlICMxMDg3MCkNCgkJCQkJaWYgKCAhaXNCb29sICkgew0KCQkJCQkJalF1ZXJ5LmF0dHIoIGVsZW0sIG5hbWUsICIiICk7DQoJCQkJCX0NCgkJCQkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIGdldFNldEF0dHJpYnV0ZSA/IG5hbWUgOiBwcm9wTmFtZSApOw0KDQoJCQkJCS8vIFNldCBjb3JyZXNwb25kaW5nIHByb3BlcnR5IHRvIGZhbHNlIGZvciBib29sZWFuIGF0dHJpYnV0ZXMNCgkJCQkJaWYgKCBpc0Jvb2wgJiYgcHJvcE5hbWUgaW4gZWxlbSApIHsNCgkJCQkJCWVsZW1bIHByb3BOYW1lIF0gPSBmYWxzZTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0sDQoNCglhdHRySG9va3M6IHsNCgkJdHlwZTogew0KCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7DQoJCQkJLy8gV2UgY2FuJ3QgYWxsb3cgdGhlIHR5cGUgcHJvcGVydHkgdG8gYmUgY2hhbmdlZCAoc2luY2UgaXQgY2F1c2VzIHByb2JsZW1zIGluIElFKQ0KCQkJCWlmICggcnR5cGUudGVzdCggZWxlbS5ub2RlTmFtZSApICYmIGVsZW0ucGFyZW50Tm9kZSApIHsNCgkJCQkJalF1ZXJ5LmVycm9yKCAidHlwZSBwcm9wZXJ0eSBjYW4ndCBiZSBjaGFuZ2VkIiApOw0KCQkJCX0gZWxzZSBpZiAoICFqUXVlcnkuc3VwcG9ydC5yYWRpb1ZhbHVlICYmIHZhbHVlID09PSAicmFkaW8iICYmIGpRdWVyeS5ub2RlTmFtZShlbGVtLCAiaW5wdXQiKSApIHsNCgkJCQkJLy8gU2V0dGluZyB0aGUgdHlwZSBvbiBhIHJhZGlvIGJ1dHRvbiBhZnRlciB0aGUgdmFsdWUgcmVzZXRzIHRoZSB2YWx1ZSBpbiBJRTYtOQ0KCQkJCQkvLyBSZXNldCB2YWx1ZSB0byBpdCdzIGRlZmF1bHQgaW4gY2FzZSB0eXBlIGlzIHNldCBhZnRlciB2YWx1ZQ0KCQkJCQkvLyBUaGlzIGlzIGZvciBlbGVtZW50IGNyZWF0aW9uDQoJCQkJCXZhciB2YWwgPSBlbGVtLnZhbHVlOw0KCQkJCQllbGVtLnNldEF0dHJpYnV0ZSggInR5cGUiLCB2YWx1ZSApOw0KCQkJCQlpZiAoIHZhbCApIHsNCgkJCQkJCWVsZW0udmFsdWUgPSB2YWw7DQoJCQkJCX0NCgkJCQkJcmV0dXJuIHZhbHVlOw0KCQkJCX0NCgkJCX0NCgkJfSwNCgkJLy8gVXNlIHRoZSB2YWx1ZSBwcm9wZXJ0eSBmb3IgYmFjayBjb21wYXQNCgkJLy8gVXNlIHRoZSBub2RlSG9vayBmb3IgYnV0dG9uIGVsZW1lbnRzIGluIElFNi83ICgjMTk1NCkNCgkJdmFsdWU6IHsNCgkJCWdldDogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7DQoJCQkJaWYgKCBub2RlSG9vayAmJiBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJidXR0b24iICkgKSB7DQoJCQkJCXJldHVybiBub2RlSG9vay5nZXQoIGVsZW0sIG5hbWUgKTsNCgkJCQl9DQoJCQkJcmV0dXJuIG5hbWUgaW4gZWxlbSA/DQoJCQkJCWVsZW0udmFsdWUgOg0KCQkJCQludWxsOw0KCQkJfSwNCgkJCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkgew0KCQkJCWlmICggbm9kZUhvb2sgJiYgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiYnV0dG9uIiApICkgew0KCQkJCQlyZXR1cm4gbm9kZUhvb2suc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApOw0KCQkJCX0NCgkJCQkvLyBEb2VzIG5vdCByZXR1cm4gc28gdGhhdCBzZXRBdHRyaWJ1dGUgaXMgYWxzbyB1c2VkDQoJCQkJZWxlbS52YWx1ZSA9IHZhbHVlOw0KCQkJfQ0KCQl9DQoJfSwNCg0KCXByb3BGaXg6IHsNCgkJdGFiaW5kZXg6ICJ0YWJJbmRleCIsDQoJCXJlYWRvbmx5OiAicmVhZE9ubHkiLA0KCQkiZm9yIjogImh0bWxGb3IiLA0KCQkiY2xhc3MiOiAiY2xhc3NOYW1lIiwNCgkJbWF4bGVuZ3RoOiAibWF4TGVuZ3RoIiwNCgkJY2VsbHNwYWNpbmc6ICJjZWxsU3BhY2luZyIsDQoJCWNlbGxwYWRkaW5nOiAiY2VsbFBhZGRpbmciLA0KCQlyb3dzcGFuOiAicm93U3BhbiIsDQoJCWNvbHNwYW46ICJjb2xTcGFuIiwNCgkJdXNlbWFwOiAidXNlTWFwIiwNCgkJZnJhbWVib3JkZXI6ICJmcmFtZUJvcmRlciIsDQoJCWNvbnRlbnRlZGl0YWJsZTogImNvbnRlbnRFZGl0YWJsZSINCgl9LA0KDQoJcHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgew0KCQl2YXIgcmV0LCBob29rcywgbm90eG1sLA0KCQkJblR5cGUgPSBlbGVtLm5vZGVUeXBlOw0KDQoJCS8vIGRvbid0IGdldC9zZXQgcHJvcGVydGllcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXMNCgkJaWYgKCAhZWxlbSB8fCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHsNCgkJCXJldHVybjsNCgkJfQ0KDQoJCW5vdHhtbCA9IG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKTsNCg0KCQlpZiAoIG5vdHhtbCApIHsNCgkJCS8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3MNCgkJCW5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7DQoJCQlob29rcyA9IGpRdWVyeS5wcm9wSG9va3NbIG5hbWUgXTsNCgkJfQ0KDQoJCWlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHsNCgkJCWlmICggaG9va3MgJiYgInNldCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSkgIT09IHVuZGVmaW5lZCApIHsNCgkJCQlyZXR1cm4gcmV0Ow0KDQoJCQl9IGVsc2Ugew0KCQkJCXJldHVybiAoIGVsZW1bIG5hbWUgXSA9IHZhbHVlICk7DQoJCQl9DQoNCgkJfSBlbHNlIHsNCgkJCWlmICggaG9va3MgJiYgImdldCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApKSAhPT0gbnVsbCApIHsNCgkJCQlyZXR1cm4gcmV0Ow0KDQoJCQl9IGVsc2Ugew0KCQkJCXJldHVybiBlbGVtWyBuYW1lIF07DQoJCQl9DQoJCX0NCgl9LA0KDQoJcHJvcEhvb2tzOiB7DQoJCXRhYkluZGV4OiB7DQoJCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgew0KCQkJCS8vIGVsZW0udGFiSW5kZXggZG9lc24ndCBhbHdheXMgcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlIHdoZW4gaXQgaGFzbid0IGJlZW4gZXhwbGljaXRseSBzZXQNCgkJCQkvLyBodHRwOi8vZmx1aWRwcm9qZWN0Lm9yZy9ibG9nLzIwMDgvMDEvMDkvZ2V0dGluZy1zZXR0aW5nLWFuZC1yZW1vdmluZy10YWJpbmRleC12YWx1ZXMtd2l0aC1qYXZhc2NyaXB0Lw0KCQkJCXZhciBhdHRyaWJ1dGVOb2RlID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJ0YWJpbmRleCIpOw0KDQoJCQkJcmV0dXJuIGF0dHJpYnV0ZU5vZGUgJiYgYXR0cmlidXRlTm9kZS5zcGVjaWZpZWQgPw0KCQkJCQlwYXJzZUludCggYXR0cmlidXRlTm9kZS52YWx1ZSwgMTAgKSA6DQoJCQkJCXJmb2N1c2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8IHJjbGlja2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApICYmIGVsZW0uaHJlZiA/DQoJCQkJCQkwIDoNCgkJCQkJCXVuZGVmaW5lZDsNCgkJCX0NCgkJfQ0KCX0NCn0pOw0KDQovLyBIb29rIGZvciBib29sZWFuIGF0dHJpYnV0ZXMNCmJvb2xIb29rID0gew0KCWdldDogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7DQoJCS8vIEFsaWduIGJvb2xlYW4gYXR0cmlidXRlcyB3aXRoIGNvcnJlc3BvbmRpbmcgcHJvcGVydGllcw0KCQkvLyBGYWxsIGJhY2sgdG8gYXR0cmlidXRlIHByZXNlbmNlIHdoZXJlIHNvbWUgYm9vbGVhbnMgYXJlIG5vdCBzdXBwb3J0ZWQNCgkJdmFyIGF0dHJOb2RlLA0KCQkJcHJvcGVydHkgPSBqUXVlcnkucHJvcCggZWxlbSwgbmFtZSApOw0KCQlyZXR1cm4gcHJvcGVydHkgPT09IHRydWUgfHwgdHlwZW9mIHByb3BlcnR5ICE9PSAiYm9vbGVhbiIgJiYgKCBhdHRyTm9kZSA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZShuYW1lKSApICYmIGF0dHJOb2RlLm5vZGVWYWx1ZSAhPT0gZmFsc2UgPw0KCQkJbmFtZS50b0xvd2VyQ2FzZSgpIDoNCgkJCXVuZGVmaW5lZDsNCgl9LA0KCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkgew0KCQl2YXIgcHJvcE5hbWU7DQoJCWlmICggdmFsdWUgPT09IGZhbHNlICkgew0KCQkJLy8gUmVtb3ZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aGVuIHNldCB0byBmYWxzZQ0KCQkJalF1ZXJ5LnJlbW92ZUF0dHIoIGVsZW0sIG5hbWUgKTsNCgkJfSBlbHNlIHsNCgkJCS8vIHZhbHVlIGlzIHRydWUgc2luY2Ugd2Uga25vdyBhdCB0aGlzIHBvaW50IGl0J3MgdHlwZSBib29sZWFuIGFuZCBub3QgZmFsc2UNCgkJCS8vIFNldCBib29sZWFuIGF0dHJpYnV0ZXMgdG8gdGhlIHNhbWUgbmFtZSBhbmQgc2V0IHRoZSBET00gcHJvcGVydHkNCgkJCXByb3BOYW1lID0galF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lOw0KCQkJaWYgKCBwcm9wTmFtZSBpbiBlbGVtICkgew0KCQkJCS8vIE9ubHkgc2V0IHRoZSBJREwgc3BlY2lmaWNhbGx5IGlmIGl0IGFscmVhZHkgZXhpc3RzIG9uIHRoZSBlbGVtZW50DQoJCQkJZWxlbVsgcHJvcE5hbWUgXSA9IHRydWU7DQoJCQl9DQoNCgkJCWVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lLnRvTG93ZXJDYXNlKCkgKTsNCgkJfQ0KCQlyZXR1cm4gbmFtZTsNCgl9DQp9Ow0KDQovLyBJRTYvNyBkbyBub3Qgc3VwcG9ydCBnZXR0aW5nL3NldHRpbmcgc29tZSBhdHRyaWJ1dGVzIHdpdGggZ2V0L3NldEF0dHJpYnV0ZQ0KaWYgKCAhZ2V0U2V0QXR0cmlidXRlICkgew0KDQoJZml4U3BlY2lmaWVkID0gew0KCQluYW1lOiB0cnVlLA0KCQlpZDogdHJ1ZSwNCgkJY29vcmRzOiB0cnVlDQoJfTsNCg0KCS8vIFVzZSB0aGlzIGZvciBhbnkgYXR0cmlidXRlIGluIElFNi83DQoJLy8gVGhpcyBmaXhlcyBhbG1vc3QgZXZlcnkgSUU2LzcgaXNzdWUNCglub2RlSG9vayA9IGpRdWVyeS52YWxIb29rcy5idXR0b24gPSB7DQoJCWdldDogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7DQoJCQl2YXIgcmV0Ow0KCQkJcmV0ID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICk7DQoJCQlyZXR1cm4gcmV0ICYmICggZml4U3BlY2lmaWVkWyBuYW1lIF0gPyByZXQudmFsdWUgIT09ICIiIDogcmV0LnNwZWNpZmllZCApID8NCgkJCQlyZXQudmFsdWUgOg0KCQkJCXVuZGVmaW5lZDsNCgkJfSwNCgkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7DQoJCQkvLyBTZXQgdGhlIGV4aXN0aW5nIG9yIGNyZWF0ZSBhIG5ldyBhdHRyaWJ1dGUgbm9kZQ0KCQkJdmFyIHJldCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApOw0KCQkJaWYgKCAhcmV0ICkgew0KCQkJCXJldCA9IGRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZSggbmFtZSApOw0KCQkJCWVsZW0uc2V0QXR0cmlidXRlTm9kZSggcmV0ICk7DQoJCQl9DQoJCQlyZXR1cm4gKCByZXQudmFsdWUgPSB2YWx1ZSArICIiICk7DQoJCX0NCgl9Ow0KDQoJLy8gU2V0IHdpZHRoIGFuZCBoZWlnaHQgdG8gYXV0byBpbnN0ZWFkIG9mIDAgb24gZW1wdHkgc3RyaW5nKCBCdWcgIzgxNTAgKQ0KCS8vIFRoaXMgaXMgZm9yIHJlbW92YWxzDQoJalF1ZXJ5LmVhY2goWyAid2lkdGgiLCAiaGVpZ2h0IiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsNCgkJalF1ZXJ5LmF0dHJIb29rc1sgbmFtZSBdID0galF1ZXJ5LmV4dGVuZCggalF1ZXJ5LmF0dHJIb29rc1sgbmFtZSBdLCB7DQoJCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsNCgkJCQlpZiAoIHZhbHVlID09PSAiIiApIHsNCgkJCQkJZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsICJhdXRvIiApOw0KCQkJCQlyZXR1cm4gdmFsdWU7DQoJCQkJfQ0KCQkJfQ0KCQl9KTsNCgl9KTsNCg0KCS8vIFNldCBjb250ZW50ZWRpdGFibGUgdG8gZmFsc2Ugb24gcmVtb3ZhbHMoIzEwNDI5KQ0KCS8vIFNldHRpbmcgdG8gZW1wdHkgc3RyaW5nIHRocm93cyBhbiBlcnJvciBhcyBhbiBpbnZhbGlkIHZhbHVlDQoJalF1ZXJ5LmF0dHJIb29rcy5jb250ZW50ZWRpdGFibGUgPSB7DQoJCWdldDogbm9kZUhvb2suZ2V0LA0KCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgbmFtZSApIHsNCgkJCWlmICggdmFsdWUgPT09ICIiICkgew0KCQkJCXZhbHVlID0gImZhbHNlIjsNCgkJCX0NCgkJCW5vZGVIb29rLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKTsNCgkJfQ0KCX07DQp9DQoNCg0KLy8gU29tZSBhdHRyaWJ1dGVzIHJlcXVpcmUgYSBzcGVjaWFsIGNhbGwgb24gSUUNCmlmICggIWpRdWVyeS5zdXBwb3J0LmhyZWZOb3JtYWxpemVkICkgew0KCWpRdWVyeS5lYWNoKFsgImhyZWYiLCAic3JjIiwgIndpZHRoIiwgImhlaWdodCIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7DQoJCWpRdWVyeS5hdHRySG9va3NbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGpRdWVyeS5hdHRySG9va3NbIG5hbWUgXSwgew0KCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsNCgkJCQl2YXIgcmV0ID0gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUsIDIgKTsNCgkJCQlyZXR1cm4gcmV0ID09PSBudWxsID8gdW5kZWZpbmVkIDogcmV0Ow0KCQkJfQ0KCQl9KTsNCgl9KTsNCn0NCg0KaWYgKCAhalF1ZXJ5LnN1cHBvcnQuc3R5bGUgKSB7DQoJalF1ZXJ5LmF0dHJIb29rcy5zdHlsZSA9IHsNCgkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsNCgkJCS8vIFJldHVybiB1bmRlZmluZWQgaW4gdGhlIGNhc2Ugb2YgZW1wdHkgc3RyaW5nDQoJCQkvLyBOb3JtYWxpemUgdG8gbG93ZXJjYXNlIHNpbmNlIElFIHVwcGVyY2FzZXMgY3NzIHByb3BlcnR5IG5hbWVzDQoJCQlyZXR1cm4gZWxlbS5zdHlsZS5jc3NUZXh0LnRvTG93ZXJDYXNlKCkgfHwgdW5kZWZpbmVkOw0KCQl9LA0KCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsNCgkJCXJldHVybiAoIGVsZW0uc3R5bGUuY3NzVGV4dCA9IHZhbHVlICsgIiIgKTsNCgkJfQ0KCX07DQp9DQoNCi8vIFNhZmFyaSBtaXMtcmVwb3J0cyB0aGUgZGVmYXVsdCBzZWxlY3RlZCBwcm9wZXJ0eSBvZiBhbiBvcHRpb24NCi8vIEFjY2Vzc2luZyB0aGUgcGFyZW50J3Mgc2VsZWN0ZWRJbmRleCBwcm9wZXJ0eSBmaXhlcyBpdA0KaWYgKCAhalF1ZXJ5LnN1cHBvcnQub3B0U2VsZWN0ZWQgKSB7DQoJalF1ZXJ5LnByb3BIb29rcy5zZWxlY3RlZCA9IGpRdWVyeS5leHRlbmQoIGpRdWVyeS5wcm9wSG9va3Muc2VsZWN0ZWQsIHsNCgkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsNCgkJCXZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7DQoNCgkJCWlmICggcGFyZW50ICkgew0KCQkJCXBhcmVudC5zZWxlY3RlZEluZGV4Ow0KDQoJCQkJLy8gTWFrZSBzdXJlIHRoYXQgaXQgYWxzbyB3b3JrcyB3aXRoIG9wdGdyb3Vwcywgc2VlICM1NzAxDQoJCQkJaWYgKCBwYXJlbnQucGFyZW50Tm9kZSApIHsNCgkJCQkJcGFyZW50LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsNCgkJCQl9DQoJCQl9DQoJCQlyZXR1cm4gbnVsbDsNCgkJfQ0KCX0pOw0KfQ0KDQovLyBJRTYvNyBjYWxsIGVuY3R5cGUgZW5jb2RpbmcNCmlmICggIWpRdWVyeS5zdXBwb3J0LmVuY3R5cGUgKSB7DQoJalF1ZXJ5LnByb3BGaXguZW5jdHlwZSA9ICJlbmNvZGluZyI7DQp9DQoNCi8vIFJhZGlvcyBhbmQgY2hlY2tib3hlcyBnZXR0ZXIvc2V0dGVyDQppZiAoICFqUXVlcnkuc3VwcG9ydC5jaGVja09uICkgew0KCWpRdWVyeS5lYWNoKFsgInJhZGlvIiwgImNoZWNrYm94IiBdLCBmdW5jdGlvbigpIHsNCgkJalF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7DQoJCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgew0KCQkJCS8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBpbiBXZWJraXQgIiIgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiAib24iIGlmIGEgdmFsdWUgaXNuJ3Qgc3BlY2lmaWVkDQoJCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpID09PSBudWxsID8gIm9uIiA6IGVsZW0udmFsdWU7DQoJCQl9DQoJCX07DQoJfSk7DQp9DQpqUXVlcnkuZWFjaChbICJyYWRpbyIsICJjaGVja2JveCIgXSwgZnVuY3Rpb24oKSB7DQoJalF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSBqUXVlcnkuZXh0ZW5kKCBqUXVlcnkudmFsSG9va3NbIHRoaXMgXSwgew0KCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsNCgkJCWlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbHVlICkgKSB7DQoJCQkJcmV0dXJuICggZWxlbS5jaGVja2VkID0galF1ZXJ5LmluQXJyYXkoIGpRdWVyeShlbGVtKS52YWwoKSwgdmFsdWUgKSA+PSAwICk7DQoJCQl9DQoJCX0NCgl9KTsNCn0pOw0KdmFyIHJmb3JtRWxlbXMgPSAvXig/OnRleHRhcmVhfGlucHV0fHNlbGVjdCkkL2ksDQoJcnR5cGVuYW1lc3BhY2UgPSAvXihbXlwuXSp8KSg/OlwuKC4rKXwpJC8sDQoJcmhvdmVySGFjayA9IC8oPzpefFxzKWhvdmVyKFwuXFMrfClcYi8sDQoJcmtleUV2ZW50ID0gL15rZXkvLA0KCXJtb3VzZUV2ZW50ID0gL14oPzptb3VzZXxjb250ZXh0bWVudSl8Y2xpY2svLA0KCXJmb2N1c01vcnBoID0gL14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLA0KCWhvdmVySGFjayA9IGZ1bmN0aW9uKCBldmVudHMgKSB7DQoJCXJldHVybiBqUXVlcnkuZXZlbnQuc3BlY2lhbC5ob3ZlciA/IGV2ZW50cyA6IGV2ZW50cy5yZXBsYWNlKCByaG92ZXJIYWNrLCAibW91c2VlbnRlciQxIG1vdXNlbGVhdmUkMSIgKTsNCgl9Ow0KDQovKg0KICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgZXZlbnRzIC0tIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLg0KICogUHJvcHMgdG8gRGVhbiBFZHdhcmRzJyBhZGRFdmVudCBsaWJyYXJ5IGZvciBtYW55IG9mIHRoZSBpZGVhcy4NCiAqLw0KalF1ZXJ5LmV2ZW50ID0gew0KDQoJYWRkOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEsIHNlbGVjdG9yICkgew0KDQoJCXZhciBlbGVtRGF0YSwgZXZlbnRIYW5kbGUsIGV2ZW50cywNCgkJCXQsIHRucywgdHlwZSwgbmFtZXNwYWNlcywgaGFuZGxlT2JqLA0KCQkJaGFuZGxlT2JqSW4sIGhhbmRsZXJzLCBzcGVjaWFsOw0KDQoJCS8vIERvbid0IGF0dGFjaCBldmVudHMgdG8gbm9EYXRhIG9yIHRleHQvY29tbWVudCBub2RlcyAoYWxsb3cgcGxhaW4gb2JqZWN0cyB0aG8pDQoJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4IHx8ICF0eXBlcyB8fCAhaGFuZGxlciB8fCAhKGVsZW1EYXRhID0galF1ZXJ5Ll9kYXRhKCBlbGVtICkpICkgew0KCQkJcmV0dXJuOw0KCQl9DQoNCgkJLy8gQ2FsbGVyIGNhbiBwYXNzIGluIGFuIG9iamVjdCBvZiBjdXN0b20gZGF0YSBpbiBsaWV1IG9mIHRoZSBoYW5kbGVyDQoJCWlmICggaGFuZGxlci5oYW5kbGVyICkgew0KCQkJaGFuZGxlT2JqSW4gPSBoYW5kbGVyOw0KCQkJaGFuZGxlciA9IGhhbmRsZU9iakluLmhhbmRsZXI7DQoJCQlzZWxlY3RvciA9IGhhbmRsZU9iakluLnNlbGVjdG9yOw0KCQl9DQoNCgkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGhhbmRsZXIgaGFzIGEgdW5pcXVlIElELCB1c2VkIHRvIGZpbmQvcmVtb3ZlIGl0IGxhdGVyDQoJCWlmICggIWhhbmRsZXIuZ3VpZCApIHsNCgkJCWhhbmRsZXIuZ3VpZCA9IGpRdWVyeS5ndWlkKys7DQoJCX0NCg0KCQkvLyBJbml0IHRoZSBlbGVtZW50J3MgZXZlbnQgc3RydWN0dXJlIGFuZCBtYWluIGhhbmRsZXIsIGlmIHRoaXMgaXMgdGhlIGZpcnN0DQoJCWV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50czsNCgkJaWYgKCAhZXZlbnRzICkgew0KCQkJZWxlbURhdGEuZXZlbnRzID0gZXZlbnRzID0ge307DQoJCX0NCgkJZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGU7DQoJCWlmICggIWV2ZW50SGFuZGxlICkgew0KCQkJZWxlbURhdGEuaGFuZGxlID0gZXZlbnRIYW5kbGUgPSBmdW5jdGlvbiggZSApIHsNCgkJCQkvLyBEaXNjYXJkIHRoZSBzZWNvbmQgZXZlbnQgb2YgYSBqUXVlcnkuZXZlbnQudHJpZ2dlcigpIGFuZA0KCQkJCS8vIHdoZW4gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWQNCgkJCQlyZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gInVuZGVmaW5lZCIgJiYgKCFlIHx8IGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgIT09IGUudHlwZSkgPw0KCQkJCQlqUXVlcnkuZXZlbnQuZGlzcGF0Y2guYXBwbHkoIGV2ZW50SGFuZGxlLmVsZW0sIGFyZ3VtZW50cyApIDoNCgkJCQkJdW5kZWZpbmVkOw0KCQkJfTsNCgkJCS8vIEFkZCBlbGVtIGFzIGEgcHJvcGVydHkgb2YgdGhlIGhhbmRsZSBmbiB0byBwcmV2ZW50IGEgbWVtb3J5IGxlYWsgd2l0aCBJRSBub24tbmF0aXZlIGV2ZW50cw0KCQkJZXZlbnRIYW5kbGUuZWxlbSA9IGVsZW07DQoJCX0NCg0KCQkvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNwYWNlDQoJCS8vIGpRdWVyeSguLi4pLmJpbmQoIm1vdXNlb3ZlciBtb3VzZW91dCIsIGZuKTsNCgkJdHlwZXMgPSBqUXVlcnkudHJpbSggaG92ZXJIYWNrKHR5cGVzKSApLnNwbGl0KCAiICIgKTsNCgkJZm9yICggdCA9IDA7IHQgPCB0eXBlcy5sZW5ndGg7IHQrKyApIHsNCg0KCQkJdG5zID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbdF0gKSB8fCBbXTsNCgkJCXR5cGUgPSB0bnNbMV07DQoJCQluYW1lc3BhY2VzID0gKCB0bnNbMl0gfHwgIiIgKS5zcGxpdCggIi4iICkuc29ydCgpOw0KDQoJCQkvLyBJZiBldmVudCBjaGFuZ2VzIGl0cyB0eXBlLCB1c2UgdGhlIHNwZWNpYWwgZXZlbnQgaGFuZGxlcnMgZm9yIHRoZSBjaGFuZ2VkIHR5cGUNCgkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9Ow0KDQoJCQkvLyBJZiBzZWxlY3RvciBkZWZpbmVkLCBkZXRlcm1pbmUgc3BlY2lhbCBldmVudCBhcGkgdHlwZSwgb3RoZXJ3aXNlIGdpdmVuIHR5cGUNCgkJCXR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTsNCg0KCQkJLy8gVXBkYXRlIHNwZWNpYWwgYmFzZWQgb24gbmV3bHkgcmVzZXQgdHlwZQ0KCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307DQoNCgkJCS8vIGhhbmRsZU9iaiBpcyBwYXNzZWQgdG8gYWxsIGV2ZW50IGhhbmRsZXJzDQoJCQloYW5kbGVPYmogPSBqUXVlcnkuZXh0ZW5kKHsNCgkJCQl0eXBlOiB0eXBlLA0KCQkJCW9yaWdUeXBlOiB0bnNbMV0sDQoJCQkJZGF0YTogZGF0YSwNCgkJCQloYW5kbGVyOiBoYW5kbGVyLA0KCQkJCWd1aWQ6IGhhbmRsZXIuZ3VpZCwNCgkJCQlzZWxlY3Rvcjogc2VsZWN0b3IsDQoJCQkJbmVlZHNDb250ZXh0OiBzZWxlY3RvciAmJiBqUXVlcnkuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSwNCgkJCQluYW1lc3BhY2U6IG5hbWVzcGFjZXMuam9pbigiLiIpDQoJCQl9LCBoYW5kbGVPYmpJbiApOw0KDQoJCQkvLyBJbml0IHRoZSBldmVudCBoYW5kbGVyIHF1ZXVlIGlmIHdlJ3JlIHRoZSBmaXJzdA0KCQkJaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXTsNCgkJCWlmICggIWhhbmRsZXJzICkgew0KCQkJCWhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gPSBbXTsNCgkJCQloYW5kbGVycy5kZWxlZ2F0ZUNvdW50ID0gMDsNCg0KCQkJCS8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIvYXR0YWNoRXZlbnQgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZQ0KCQkJCWlmICggIXNwZWNpYWwuc2V0dXAgfHwgc3BlY2lhbC5zZXR1cC5jYWxsKCBlbGVtLCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApID09PSBmYWxzZSApIHsNCgkJCQkJLy8gQmluZCB0aGUgZ2xvYmFsIGV2ZW50IGhhbmRsZXIgdG8gdGhlIGVsZW1lbnQNCgkJCQkJaWYgKCBlbGVtLmFkZEV2ZW50TGlzdGVuZXIgKSB7DQoJCQkJCQllbGVtLmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIGV2ZW50SGFuZGxlLCBmYWxzZSApOw0KDQoJCQkJCX0gZWxzZSBpZiAoIGVsZW0uYXR0YWNoRXZlbnQgKSB7DQoJCQkJCQllbGVtLmF0dGFjaEV2ZW50KCAib24iICsgdHlwZSwgZXZlbnRIYW5kbGUgKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCg0KCQkJaWYgKCBzcGVjaWFsLmFkZCApIHsNCgkJCQlzcGVjaWFsLmFkZC5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTsNCg0KCQkJCWlmICggIWhhbmRsZU9iai5oYW5kbGVyLmd1aWQgKSB7DQoJCQkJCWhhbmRsZU9iai5oYW5kbGVyLmd1aWQgPSBoYW5kbGVyLmd1aWQ7DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBBZGQgdG8gdGhlIGVsZW1lbnQncyBoYW5kbGVyIGxpc3QsIGRlbGVnYXRlcyBpbiBmcm9udA0KCQkJaWYgKCBzZWxlY3RvciApIHsNCgkJCQloYW5kbGVycy5zcGxpY2UoIGhhbmRsZXJzLmRlbGVnYXRlQ291bnQrKywgMCwgaGFuZGxlT2JqICk7DQoJCQl9IGVsc2Ugew0KCQkJCWhhbmRsZXJzLnB1c2goIGhhbmRsZU9iaiApOw0KCQkJfQ0KDQoJCQkvLyBLZWVwIHRyYWNrIG9mIHdoaWNoIGV2ZW50cyBoYXZlIGV2ZXIgYmVlbiB1c2VkLCBmb3IgZXZlbnQgb3B0aW1pemF0aW9uDQoJCQlqUXVlcnkuZXZlbnQuZ2xvYmFsWyB0eXBlIF0gPSB0cnVlOw0KCQl9DQoNCgkJLy8gTnVsbGlmeSBlbGVtIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzIGluIElFDQoJCWVsZW0gPSBudWxsOw0KCX0sDQoNCglnbG9iYWw6IHt9LA0KDQoJLy8gRGV0YWNoIGFuIGV2ZW50IG9yIHNldCBvZiBldmVudHMgZnJvbSBhbiBlbGVtZW50DQoJcmVtb3ZlOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIHNlbGVjdG9yLCBtYXBwZWRUeXBlcyApIHsNCg0KCQl2YXIgdCwgdG5zLCB0eXBlLCBvcmlnVHlwZSwgbmFtZXNwYWNlcywgb3JpZ0NvdW50LA0KCQkJaiwgZXZlbnRzLCBzcGVjaWFsLCBldmVudFR5cGUsIGhhbmRsZU9iaiwNCgkJCWVsZW1EYXRhID0galF1ZXJ5Lmhhc0RhdGEoIGVsZW0gKSAmJiBqUXVlcnkuX2RhdGEoIGVsZW0gKTsNCg0KCQlpZiAoICFlbGVtRGF0YSB8fCAhKGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cykgKSB7DQoJCQlyZXR1cm47DQoJCX0NCg0KCQkvLyBPbmNlIGZvciBlYWNoIHR5cGUubmFtZXNwYWNlIGluIHR5cGVzOyB0eXBlIG1heSBiZSBvbWl0dGVkDQoJCXR5cGVzID0galF1ZXJ5LnRyaW0oIGhvdmVySGFjayggdHlwZXMgfHwgIiIgKSApLnNwbGl0KCIgIik7DQoJCWZvciAoIHQgPSAwOyB0IDwgdHlwZXMubGVuZ3RoOyB0KysgKSB7DQoJCQl0bnMgPSBydHlwZW5hbWVzcGFjZS5leGVjKCB0eXBlc1t0XSApIHx8IFtdOw0KCQkJdHlwZSA9IG9yaWdUeXBlID0gdG5zWzFdOw0KCQkJbmFtZXNwYWNlcyA9IHRuc1syXTsNCg0KCQkJLy8gVW5iaW5kIGFsbCBldmVudHMgKG9uIHRoaXMgbmFtZXNwYWNlLCBpZiBwcm92aWRlZCkgZm9yIHRoZSBlbGVtZW50DQoJCQlpZiAoICF0eXBlICkgew0KCQkJCWZvciAoIHR5cGUgaW4gZXZlbnRzICkgew0KCQkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICsgdHlwZXNbIHQgXSwgaGFuZGxlciwgc2VsZWN0b3IsIHRydWUgKTsNCgkJCQl9DQoJCQkJY29udGludWU7DQoJCQl9DQoNCgkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9Ow0KCQkJdHlwZSA9ICggc2VsZWN0b3I/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7DQoJCQlldmVudFR5cGUgPSBldmVudHNbIHR5cGUgXSB8fCBbXTsNCgkJCW9yaWdDb3VudCA9IGV2ZW50VHlwZS5sZW5ndGg7DQoJCQluYW1lc3BhY2VzID0gbmFtZXNwYWNlcyA/IG5ldyBSZWdFeHAoIihefFxcLikiICsgbmFtZXNwYWNlcy5zcGxpdCgiLiIpLnNvcnQoKS5qb2luKCJcXC4oPzouKlxcLnwpIikgKyAiKFxcLnwkKSIpIDogbnVsbDsNCg0KCQkJLy8gUmVtb3ZlIG1hdGNoaW5nIGV2ZW50cw0KCQkJZm9yICggaiA9IDA7IGogPCBldmVudFR5cGUubGVuZ3RoOyBqKysgKSB7DQoJCQkJaGFuZGxlT2JqID0gZXZlbnRUeXBlWyBqIF07DQoNCgkJCQlpZiAoICggbWFwcGVkVHlwZXMgfHwgb3JpZ1R5cGUgPT09IGhhbmRsZU9iai5vcmlnVHlwZSApICYmDQoJCQkJCSAoICFoYW5kbGVyIHx8IGhhbmRsZXIuZ3VpZCA9PT0gaGFuZGxlT2JqLmd1aWQgKSAmjg0KCQkJCQkgKCAhbmFtZXNwYWNlcyB8fCBuYW1lc3BhY2VzLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApICYmDQoJCQkJCSAoICFzZWxlY3RvciB8fCBzZWxlY3RvciA9PT0gaGFuZGxlT2JqLnNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSAiKioiICYmIGhhbmRsZU9iai5zZWxlY3RvciApICkgew0KCQkJCQlldmVudFR5cGUuc3BsaWNlKCBqLS0sIDEgKTsNCg0KCQkJCQlpZiAoIGhhbmRsZU9iai5zZWxlY3RvciApIHsNCgkJCQkJCWV2ZW50VHlwZS5kZWxlZ2F0ZUNvdW50LS07DQoJCQkJCX0NCgkJCQkJaWYgKCBzcGVjaWFsLnJlbW92ZSApIHsNCgkJCQkJCXNwZWNpYWwucmVtb3ZlLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBSZW1vdmUgZ2VuZXJpYyBldmVudCBoYW5kbGVyIGlmIHdlIHJlbW92ZWQgc29tZXRoaW5nIGFuZCBubyBtb3JlIGhhbmRsZXJzIGV4aXN0DQoJCQkvLyAoYXZvaWRzIHBvdGVudGlhbCBmb3IgZW5kbGVzcyByZWN1cnNpb24gZHVyaW5nIHJlbW92YWwgb2Ygc3BlY2lhbCBldmVudCBoYW5kbGVycykNCgkJCWlmICggZXZlbnRUeXBlLmxlbmd0aCA9PT0gMCAmJiBvcmlnQ291bnQgIT09IGV2ZW50VHlwZS5sZW5ndGggKSB7DQoJCQkJaWYgKCAhc3BlY2lhbC50ZWFyZG93biB8fCBzcGVjaWFsLnRlYXJkb3duLmNhbGwoIGVsZW0sIG5hbWVzcGFjZXMsIGVsZW1EYXRhLmhhbmRsZSApID09PSBmYWxzZSApIHsNCgkJCQkJalF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBlbGVtRGF0YS5oYW5kbGUgKTsNCgkJCQl9DQoNCgkJCQlkZWxldGUgZXZlbnRzWyB0eXBlIF07DQoJCQl9DQoJCX0NCg0KCQkvLyBSZW1vdmUgdGhlIGV4cGFuZG8gaWYgaXQncyBubyBsb25nZXIgdXNlZA0KCQlpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBldmVudHMgKSApIHsNCgkJCWRlbGV0ZSBlbGVtRGF0YS5oYW5kbGU7DQoNCgkJCS8vIHJlbW92ZURhdGEgYWxzbyBjaGVja3MgZm9yIGVtcHRpbmVzcyBhbmQgY2xlYXJzIHRoZSBleHBhbmRvIGlmIGVtcHR5DQoJCQkvLyBzbyB1c2UgaXQgaW5zdGVhZCBvZiBkZWxldGUNCgkJCWpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtLCAiZXZlbnRzIiwgdHJ1ZSApOw0KCQl9DQoJfSwNCg0KCS8vIEV2ZW50cyB0aGF0IGFyZSBzYWZlIHRvIHNob3J0LWNpcmN1aXQgaWYgbm8gaGFuZGxlcnMgYXJlIGF0dGFjaGVkLg0KCS8vIE5hdGl2ZSBET00gZXZlbnRzIHNob3VsZCBub3QgYmUgYWRkZWQsIHRoZXkgbWF5IGhhdmUgaW5saW5lIGhhbmRsZXJzLg0KCWN1c3RvbUV2ZW50OiB7DQoJCSJnZXREYXRhIjogdHJ1ZSwNCgkJInNldERhdGEiOiB0cnVlLA0KCQkiY2hhbmdlRGF0YSI6IHRydWUNCgl9LA0KDQoJdHJpZ2dlcjogZnVuY3Rpb24oIGV2ZW50LCBkYXRhLCBlbGVtLCBvbmx5SGFuZGxlcnMgKSB7DQoJCS8vIERvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzDQoJCWlmICggZWxlbSAmJiAoZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4KSApIHsNCgkJCXJldHVybjsNCgkJfQ0KDQoJCS8vIEV2ZW50IG9iamVjdCBvciBldmVudCB0eXBlDQoJCXZhciBjYWNoZSwgZXhjbHVzaXZlLCBpLCBjdXIsIG9sZCwgb250eXBlLCBzcGVjaWFsLCBoYW5kbGUsIGV2ZW50UGF0aCwgYnViYmxlVHlwZSwNCgkJCXR5cGUgPSBldmVudC50eXBlIHx8IGV2ZW50LA0KCQkJbmFtZXNwYWNlcyA9IFtdOw0KDQoJCS8vIGZvY3VzL2JsdXIgbW9ycGhzIHRvIGZvY3VzaW4vb3V0OyBlbnN1cmUgd2UncmUgbm90IGZpcmluZyB0aGVtIHJpZ2h0IG5vdw0KCQlpZiAoIHJmb2N1c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICkgKSB7DQoJCQlyZXR1cm47DQoJCX0NCg0KCQlpZiAoIHR5cGUuaW5kZXhPZiggIiEiICkgPj0gMCApIHsNCgkJCS8vIEV4Y2x1c2l2ZSBldmVudHMgdHJpZ2dlciBvbmx5IGZvciB0aGUgZXhhY3QgZXZlbnQgKG5vIG5hbWVzcGFjZXMpDQoJCQl0eXBlID0gdHlwZS5zbGljZSgwLCAtMSk7DQoJCQlleGNsdXNpdmUgPSB0cnVlOw0KCQl9DQoNCgkJaWYgKCB0eXBlLmluZGV4T2YoICIuIiApID49IDAgKSB7DQoJCQkvLyBOYW1lc3BhY2VkIHRyaWdnZXI7IGNyZWF0ZSBhIHJlZ2V4cCB0byBtYXRjaCBldmVudCB0eXBlIGluIGhhbmRsZSgpDQoJCQluYW1lc3BhY2VzID0gdHlwZS5zcGxpdCgiLiIpOw0KCQkJdHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTsNCgkJCW5hbWVzcGFjZXMuc29ydCgpOw0KCQl9DQoNCgkJaWYgKCAoIWVsZW0gfHwgalF1ZXJ5LmV2ZW50LmN1c3RvbUV2ZW50WyB0eXBlIF0pICYmICFqUXVlcnkuZXZlbnQuZ2xvYmFsWyB0eXBlIF0gKSB7DQoJCQkvLyBObyBqUXVlcnkgaGFuZGxlcnMgZm9yIHRoaXMgZXZlbnQgdHlwZSwgYW5kIGl0IGNhbid0IGhhdmUgaW5saW5lIGhhbmRsZXJzDQoJCQlyZXR1cm47DQoJCX0NCg0KCQkvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYW4gRXZlbnQsIE9iamVjdCwgb3IganVzdCBhbiBldmVudCB0eXBlIHN0cmluZw0KCQlldmVudCA9IHR5cGVvZiBldmVudCA9PT0gIm9iamVjdCIgPw0KCQkJLy8galF1ZXJ5LkV2ZW50IG9iamVjdA0KCQkJZXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gPyBldmVudCA6DQoJCQkvLyBPYmplY3QgbGl0ZXJhbA0KCQkJbmV3IGpRdWVyeS5FdmVudCggdHlwZSwgZXZlbnQgKSA6DQoJCQkvLyBKdXN0IHRoZSBldmVudCB0eXBlIChzdHJpbmcpDQoJCQluZXcgalF1ZXJ5LkV2ZW50KCB0eXBlICk7DQoNCgkJZXZlbnQudHlwZSA9IHR5cGU7DQoJCWV2ZW50LmlzVHJpZ2dlciA9IHRydWU7DQoJCWV2ZW50LmV4Y2x1c2l2ZSA9IGV4Y2x1c2l2ZTsNCgkJZXZlbnQubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5qb2luKCAiLiIgKTsNCgkJZXZlbnQubmFtZXNwYWNlX3JlID0gZXZlbnQubmFtZXNwYWNlPyBuZXcgUmVnRXhwKCIoXnxcXC4pIiArIG5hbWVzcGFjZXMuam9pbigiXFwuKD86LipcXC58KSIpICsgIihcXC58JCkiKSA6IG51bGw7DQoJCW9udHlwZSA9IHR5cGUuaW5kZXhPZiggIjoiICkgPCAwID8gIm9uIiArIHR5cGUgOiAiIjsNCg0KCQkvLyBIYW5kbGUgYSBnbG9iYWwgdHJpZ2dlcg0KCQlpZiAoICFlbGVtICkgew0KDQoJCQkvLyBUT0RPOiBTdG9wIHRhdW50aW5nIHRoZSBkYXRhIGNhY2hlOyByZW1vdmUgZ2xvYmFsIGV2ZW50cyBhbmQgYWx3YXlzIGF0dGFjaCB0byBkb2N1bWVudA0KCQkJY2FjaGUgPSBqUXVlcnkuY2FjaGU7DQoJCQlmb3IgKCBpIGluIGNhY2hlICkgew0KCQkJCWlmICggY2FjaGVbIGkgXS5ldmVudHMgJiYgY2FjaGVbIGkgXS5ldmVudHNbIHR5cGUgXSApIHsNCgkJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGV2ZW50LCBkYXRhLCBjYWNoZVsgaSBdLmhhbmRsZS5lbGVtLCB0cnVlICk7DQoJCQkJfQ0KCQkJfQ0KCQkJcmV0dXJuOw0KCQl9DQoNCgkJLy8gQ2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkDQoJCWV2ZW50LnJlc3VsdCA9IHVuZGVmaW5lZDsNCgkJaWYgKCAhZXZlbnQudGFyZ2V0ICkgew0KCQkJZXZlbnQudGFyZ2V0ID0gZWxlbTsNCgkJfQ0KDQoJCS8vIENsb25lIGFueSBpbmNvbWluZyBkYXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcgdGhlIGhhbmRsZXIgYXJnIGxpc3QNCgkJZGF0YSA9IGRhdGEgIT0gbnVsbCA/IGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEgKSA6IFtdOw0KCQlkYXRhLnVuc2hpZnQoIGV2ZW50ICk7DQoNCgkJLy8gQWxsb3cgc3BlY2lhbCBldmVudHMgdG8gZHJhdyBvdXRzaWRlIHRoZSBsaW5lcw0KCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsNCgkJaWYgKCBzcGVjaWFsLnRyaWdnZXIgJiYgc3BlY2lhbC50cmlnZ2VyLmFwcGx5KCBlbGVtLCBkYXRhICkgPT09IGZhbHNlICkgew0KCQkJcmV0dXJuOw0KCQl9DQoNCgkJLy8gRGV0ZXJtaW5lIGV2ZW50IHByb3BhZ2F0aW9uIHBhdGggaW4gYWR2YW5jZSwgcGVyIFczQyBldmVudHMgc3BlYyAoIzk5NTEpDQoJCS8vIEJ1YmJsZSB1cCB0byBkb2N1bWVudCwgdGhlbiB0byB3aW5kb3c7IHdhdGNoIGZvciBhIGdsb2JhbCBvd25lckRvY3VtZW50IHZhciAoIzk3MjQpDQoJCWV2ZW50UGF0aCA9IFtbIGVsZW0sIHNwZWNpYWwuYmluZFR5cGUgfHwgdHlwZSBdXTsNCgkJaWYgKCAhb25seUhhbmRsZXJzICYmICFzcGVjaWFsLm5vQnViYmxlICYmICFqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSApIHsNCg0KCQkJYnViYmxlVHlwZSA9IHNwZWNpYWwuZGVsZWdhdGVUeXBlIHx8IHR5cGU7DQoJCQljdXIgPSByZm9jdXNNb3JwaC50ZXN0KCBidWJibGVUeXBlICsgdHlwZSApID8gZWxlbSA6IGVsZW0ucGFyZW50Tm9kZTsNCgkJCWZvciAoIG9sZCA9IGVsZW07IGN1cjgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7DQoJCQkJZXZlbnRQYXRoLnB1c2goWyBjdXIsIGJ1YmJsZVR5cGUgXSk7DQoJCQkJb2xkID0gY3VyOw0KCQkJfQ0KDQoJCQkvLyBPbmx5IGFkZCB3aW5kb3cgaWYgd2UgZ290IHRvIGRvY3VtZW50IChlLmcuLCBub3QgcGxhaW4gb2JqIG9yIGRldGFjaGVkIERPTSkNCgkJCWlmICggb2xkID09PSAoZWxlbS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50KSApIHsNCgkJCQlldmVudFBhdGgucHVzaChbIG9sZC5kZWZhdWx0VmlldyB8fCBvbGQucGFyZW50V2luZG93IHx8IHdpbmRvdywgYnViYmxlVHlwZSBdKTsNCgkJCX0NCgkJfQ0KDQoJCS8vIEZpcmUgaGFuZGxlcnMgb24gdGhlIGV2ZW50IHBhdGgNCgkJZm9yICggaSA9IDA7IGkgPCBldmVudFBhdGgubGVuZ3RoICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpOyBpKysgKSB7DQoNCgkJCWN1ciA9IGV2ZW50UGF0aFtpXVswXTsNCgkJCWV2ZW50LnR5cGUgPSBldmVudFBhdGhbaV1bMV07DQoNCgkJCWhhbmRsZSA9ICggalF1ZXJ5Ll9kYXRhKCBjdXIsICJldmVudHMiICkgfHwge30gKVsgZXZlbnQudHlwZSBdICYmIGpRdWVyeS5fZGF0YSggY3VyLCAiaGFuZGxlIiApOw0KCQkJaWYgKCBoYW5kbGUgKSB7DQoJCQkJaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTsNCgkJCX0NCgkJCS8vIE5vdGUgdGhhdCB0aGlzIGlzIGEgYmFyZSBKUyBmdW5jdGlvbiBhbmQgbm90IGEgalF1ZXJ5IGhhbmRsZXINCgkJCWhhbmRsZSA9IG9udHlwZSAmJiBjdXJbIG9udHlwZSBdOw0KCQkJaWYgKCBoYW5kbGUgJiYgalF1ZXJ5LmFjY2VwdERhdGEoIGN1ciApICYmIGhhbmRsZS5hcHBseSAmJiBoYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApID09PSBmYWxzZSApIHsNCgkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOw0KCQkJfQ0KCQl9DQoJCWV2ZW50LnR5cGUgPSB0eXBlOw0KDQoJCS8vIElmIG5vYm9keSBwcmV2ZW50ZWQgdGhlIGRlZmF1bHQgYWN0aW9uLCBkbyBpdCBub3cNCgkJaWYgKCAhb25seUhhbmRsZXJzICYmICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHsNCg0KCQkJaWYgKCAoIXNwZWNpYWwuX2RlZmF1bHQgfHwgc3BlY2lhbC5fZGVmYXVsdC5hcHBseSggZWxlbS5vd25lckRvY3VtZW50LCBkYXRhICkgPT09IGZhbHNlKSAmjg0KCQkJCSEodHlwZSA9PT0gImNsaWNrIiAmJiBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJhIiApKSAmJiBqUXVlcnkuYWNjZXB0RGF0YSggZWxlbSApICkgew0KDQoJCQkJLy8gQ2FsbCBhIG5hdGl2ZSBET00gbWV0aG9kIG9uIHRoZSB0YXJnZXQgd2l0aCB0aGUgc2FtZSBuYW1lIG5hbWUgYXMgdGhlIGV2ZW50Lg0KCQkJCS8vIENhbid0IHVzZSBhbiAuaXNGdW5jdGlvbigpIGNoZWNrIGhlcmUgYmVjYXVzZSBJRTYvNyBmYWlscyB0aGF0IHRlc3QuDQoJCQkJLy8gRG9uJ3QgZG8gZGVmYXVsdCBhY3Rpb25zIG9uIHdpbmRvdywgdGhhdCdzIHdoZXJlIGdsb2JhbCB2YXJpYWJsZXMgYmUgKCM2MTcwKQ0KCQkJCS8vIElFPDkgZGllcyBvbiBmb2N1cy9ibHVyIHRvIGhpZGRlbiBlbGVtZW50ICgjMTQ4NikNCgkJCQlpZiAoIG9udHlwZSAmJiBlbGVtWyB0eXBlIF0gJiYgKCh0eXBlICE9PSAiZm9jdXMiICYmIHR5cGUgIT09ICJibHVyIikgfHwgZXZlbnQudGFyZ2V0Lm9mZnNldFdpZHRoICE9PSAwKSAmJiAhalF1ZXJ5LmlzV2luZG93KCBlbGVtICkgKSB7DQoNCgkJCQkJLy8gRG9uJ3QgcmUtdHJpZ2dlciBhbiBvbkZPTyBldmVudCB3aGVuIHdlIGNhbGwgaXRzIEZPTygpIG1ldGhvZA0KCQkJCQlvbGQgPSBlbGVtWyBvbnR5cGUgXTsNCg0KCQkJCQlpZiAoIG9sZCApIHsNCgkJCQkJCWVsZW1bIG9udHlwZSBdID0gbnVsbDsNCgkJCQkJfQ0KDQoJCQkJCS8vIFByZXZlbnQgcmUtdHJpZ2dlcmluZyBvZiB0aGUgc2FtZSBldmVudCwgc2luY2Ugd2UgYWxyZWFkeSBidWJibGVkIGl0IGFib3ZlDQoJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB0eXBlOw0KCQkJCQllbGVtWyB0eXBlIF0oKTsNCgkJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHVuZGVmaW5lZDsNCg0KCQkJCQlpZiAoIG9sZCApIHsNCgkJCQkJCWVsZW1bIG9udHlwZSBdID0gb2xkOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQl9DQoNCgkJcmV0dXJuIGV2ZW50LnJlc3VsdDsNCgl9LA0KDQoJZGlzcGF0Y2g6IGZ1bmN0aW9uKCBldmVudCApIHsNCg0KCQkvLyBNYWtlIGEgd3JpdGFibGUgalF1ZXJ5LkV2ZW50IGZyb20gdGhlIG5hdGl2ZSBldmVudCBvYmplY3QNCgkJZXZlbnQgPSBqUXVlcnkuZXZlbnQuZml4KCBldmVudCB8fCB3aW5kb3cuZXZlbnQgKTsNCg0KCQl2YXIgaSwgaiwgY3VyLCByZXQsIHNlbE1hdGNoLCBtYXRjaGVkLCBtYXRjaGVzLCBoYW5kbGVPYmosIHNlbCwgcmVsYXRlZCwNCgkJCWhhbmRsZXJzID0gKCAoalF1ZXJ5Ll9kYXRhKCB0aGlzLCAiZXZlbnRzIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSB8fCBbXSksDQoJCQlkZWxlZ2F0ZUNvdW50ID0gaGFuZGxlcnMuZGVsZWdhdGVDb3VudCwNCgkJCWFyZ3MgPSBjb3JlX3NsaWNlLmNhbGwoIGFyZ3VtZW50cyApLA0KCQkJcnVuX2FsbCA9ICFldmVudC5leGNsdXNpdmUgJiYgIWV2ZW50Lm5hbWVzcGFjZSwNCgkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZXZlbnQudHlwZSBdIHx8IHt9LA0KCQkJaGFuZGxlclF1ZXVlID0gW107DQoNCgkJLy8gVXNlIHRoZSBmaXgtZWQgalF1ZXJ5LkV2ZW50IHJhdGhlciB0aGFuIHRoZSAocmVhZC1vbmx5KSBuYXRpdmUgZXZlbnQNCgkJYXJnc1swXSA9IGV2ZW50Ow0KCQlldmVudC5kZWxlZ2F0ZVRhcmdldCA9IHRoaXM7DQoNCgkJLy8gQ2FsbCB0aGUgcHJlRGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVzaXJlZA0KCQlpZiAoIHNwZWNpYWwucHJlRGlzcGF0Y2ggJiYgc3BlY2lhbC5wcmVEaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApID09PSBmYWxzZSApIHsNCgkJCXJldHVybjsNCgkJfQ0KDQoJCS8vIERldGVybWluZSBoYW5kbGVycyB0aGF0IHNob3VsZCBydW4gaWYgdGhlcmUgYXJlIGRlbGVnYXRlZCBldmVudHMNCgkJLy8gQXZvaWQgbm9uLWxlZnQtY2xpY2sgYnViYmxpbmcgaW4gRmlyZWZveCAoIzM4NjEpDQoJCWlmICggZGVsZWdhdGVDb3VudCAmJiAhKGV2ZW50LmJ1dHRvbiAmJiBldmVudC50eXBlID09PSAiY2xpY2siKSApIHsNCg0KCQkJZm9yICggY3VyID0gZXZlbnQudGFyZ2V0OyBjdXIgIT0gdGhpczsgY3VyID0gY3VyLnBhcmVudE5vZGUgfHwgdGhpcyApIHsNCg0KCQkJCS8vIERvbid0IHByb2Nlc3MgY2xpY2tzIChPTkxZKSBvbiBkaXNhYmxlZCBlbGVtZW50cyAoIzY5MTEsICM4MTY1LCAjMTEzODIsICMxMTc2NCkNCgkJCQlpZiAoIGN1ci5kaXNhYmxlZCAhPT0gdHJ1ZSB8fCBldmVudC50eXBlICE9PSAiY2xpY2siICkgew0KCQkJCQlzZWxNYXRjaCA9IHt9Ow0KCQkJCQltYXRjaGVzID0gW107DQoJCQkJCWZvciAoIGkgPSAwOyBpIDwgZGVsZWdhdGVDb3VudDsgaSsrICkgew0KCQkJCQkJaGFuZGxlT2JqID0gaGFuZGxlcnNbIGkgXTsNCgkJCQkJCXNlbCA9IGhhbmRsZU9iai5zZWxlY3RvcjsNCg0KCQkJCQkJaWYgKCBzZWxNYXRjaFsgc2VsIF0gPT09IHVuZGVmaW5lZCApIHsNCgkJCQkJCQlzZWxNYXRjaFsgc2VsIF0gPSBoYW5kbGVPYmoubmVlZHNDb250ZXh0ID8NCgkJCQkJCQkJalF1ZXJ5KCBzZWwsIHRoaXMgKS5pbmRleCggY3VyICkgPj0gMCA6DQoJCQkJCQkJCWpRdWVyeS5maW5kKCBzZWwsIHRoaXMsIG51bGwsIFsgY3VyIF0gKS5sZW5ndGg7DQoJCQkJCQl9DQoJCQkJCQlpZiAoIHNlbE1hdGNoWyBzZWwgXSApIHsNCgkJCQkJCQltYXRjaGVzLnB1c2goIGhhbmRsZU9iaiApOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCWlmICggbWF0Y2hlcy5sZW5ndGggKSB7DQoJCQkJCQloYW5kbGVyUXVldWUucHVzaCh7IGVsZW06IGN1ciwgbWF0Y2hlczogbWF0Y2hlcyB9KTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfQ0KDQoJCS8vIEFkZCB0aGUgcmVtYWluaW5nIChkaXJlY3RseS1ib3VuZCkgaGFuZGxlcnMNCgkJaWYgKCBoYW5kbGVycy5sZW5ndGggPiBkZWxlZ2F0ZUNvdW50ICkgew0KCQkJaGFuZGxlclF1ZXVlLnB1c2goeyBlbGVtOiB0aGlzLCBtYXRjaGVzOiBoYW5kbGVycy5zbGljZSggZGVsZWdhdGVDb3VudCApIH0pOw0KCQl9DQoNCgkJLy8gUnVuIGRlbGVnYXRlcyBmaXJzdDsgdGhleSBtYXkgd2FudCB0byBzdG9wIHByb3BhZ2F0aW9uIGJlbmVhdGggdXMNCgkJZm9yICggaSA9IDA7IGkgPCBoYW5kbGVyUXVldWUubGVuZ3RoICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpOyBpKysgKSB7DQoJCQltYXRjaGVkID0gaGFuZGxlclF1ZXVlWyBpIF07DQoJCQlldmVudC5jdXJyZW50VGFyZ2V0ID0gbWF0Y2hlZC5lbGVtOw0KDQoJCQlmb3IgKCBqID0gMDsgaiA8IG1hdGNoZWQubWF0Y2hlcy5sZW5ndGggJiYgIWV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCk7IGorKyApIHsNCgkJCQloYW5kbGVPYmogPSBtYXRjaGVkLm1hdGNoZXNbIGogXTsNCg0KCQkJCS8vIFRyaWdnZXJlZCBldmVudCBtdXN0IGVpdGhlciAxKSBiZSBub24tZXhjbHVzaXZlIGFuZCBoYXZlIG5vIG5hbWVzcGFjZSwgb3INCgkJCQkvLyAyKSBoYXZlIG5hbWVzcGFjZShzKSBhIHN1YnNldCBvciBlcXVhbCB0byB0aG9zZSBpbiB0aGUgYm91bmQgZXZlbnQgKGJvdGggY2FuIGhhdmUgbm8gbmFtZXNwYWNlKS4NCgkJCQlpZiAoIHJ1bl9hbGwgfHwgKCFldmVudC5uYW1lc3BhY2UgJiYgIWhhbmRsZU9iai5uYW1lc3BhY2UpIHx8IGV2ZW50Lm5hbWVzcGFjZV9yZSAmJiBldmVudC5uYW1lc3BhY2VfcmUudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkgew0KDQoJCQkJCWV2ZW50LmRhdGEgPSBoYW5kbGVPYmouZGF0YTsNCgkJCQkJZXZlbnQuaGFuZGxlT2JqID0gaGFuZGxlT2JqOw0KDQoJCQkJCXJldCA9ICggKGpRdWVyeS5ldmVudC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSkuaGFuZGxlIHx8IGhhbmRsZU9iai5oYW5kbGVyICkNCgkJCQkJCQkuYXBwbHkoIG1hdGNoZWQuZWxlbSwgYXJncyApOw0KDQoJCQkJCWlmICggcmV0ICE9PSB1bmRlZmluZWQgKSB7DQoJCQkJCQlldmVudC5yZXN1bHQgPSByZXQ7DQoJCQkJCQlpZiAoIHJldCA9PT0gZmFsc2UgKSB7DQoJCQkJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsNCgkJCQkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfQ0KDQoJCS8vIENhbGwgdGhlIHBvc3REaXNwYXRjaCBob29rIGZvciB0aGUgbWFwcGVkIHR5cGUNCgkJaWYgKCBzcGVjaWFsLnBvc3REaXNwYXRjaCApIHsNCgkJCXNwZWNpYWwucG9zdERpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICk7DQoJCX0NCg0KCQlyZXR1cm4gZXZlbnQucmVzdWx0Ow0KCX0sDQoNCgkvLyBJbmNsdWRlcyBzb21lIGV2ZW50IHByb3BzIHNoYXJlZCBieSBLZXlFdmVudCBhbmQgTW91c2VFdmVudA0KCS8vICoqKiBhdHRyQ2hhbmdlIGF0dHJOYW1lIHJlbGF0ZWROb2RlIHNyY0VsZW1lbnQgIGFyZSBub3Qgbm9ybWFsaXplZCwgbm9uLVczQywgZGVwcmVjYXRlZCwgd2lsbCBiZSByZW1vdmVkIGluIDEuOCAqKioNCglwcm9wczogImF0dHJDaGFuZ2UgYXR0ck5hbWUgcmVsYXRlZE5vZGUgc3JjRWxlbWVudCBhbHRLZXkgYnViYmxlcyBjYW5jZWxhYmxlIGN0cmxLZXkgY3VycmVudFRhcmdldCBldmVudFBoYXNlIG1ldGFLZXkgcmVsYXRlZFRhcmdldCBzaGlmdEtleSB0YXJnZXQgdGltZVN0YW1wIHZpZXcgd2hpY2giLnNwbGl0KCIgIiksDQoNCglmaXhIb29rczoge30sDQoNCglrZXlIb29rczogew0KCQlwcm9wczogImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGUiLnNwbGl0KCIgIiksDQoJCWZpbHRlcjogZnVuY3Rpb24oIGV2ZW50LCBvcmlnaW5hbCApIHsNCg0KCQkJLy8gQWRkIHdoaWNoIGZvciBrZXkgZXZlbnRzDQoJCQlpZiAoIGV2ZW50LndoaWNoID09IG51bGwgKSB7DQoJCQkJZXZlbnQud2hpY2ggPSBvcmlnaW5hbC5jaGFyQ29kZSAhPSBudWxsID8gb3JpZ2luYWwuY2hhckNvZGUgOiBvcmlnaW5hbC5rZXlDb2RlOw0KCQkJfQ0KDQoJCQlyZXR1cm4gZXZlbnQ7DQoJCX0NCgl9LA0KDQoJbW91c2VIb29rczogew0KCQlwcm9wczogImJ1dHRvbiBidXR0b25zIGNsaWVudFggY2xpZW50WSBmcm9tRWxlbWVudCBvZmZzZXRYIG9mZnNldFkgcGFnZVggcGFnZVkgc2NyZWVuWCBzY3JlZW5ZIHRvRWxlbWVudCIuc3BsaXQoIiAiKSwNCgkJZmlsdGVyOiBmdW5jdGlvbiggZXZlbnQsIG9yaWdpbmFsICkgew0KCQkJdmFyIGV2ZW50RG9jLCBkb2MsIGJvZHksDQoJCQkJYnV0dG9uID0gb3JpZ2luYWwuYnV0dG9uLA0KCQkJCWZyb21FbGVtZW50ID0gb3JpZ2luYWwuZnJvbUVsZW1lbnQ7DQoNCgkJCS8vIENhbGN1bGF0ZSBwYWdlWC9ZIGlmIG1pc3NpbmcgYW5kIGNsaWVudFgvWSBhdmFpbGFibGUNCgkJCWlmICggZXZlbnQucGFnZVggPT0gbnVsbCAmJiBvcmlnaW5hbC5jbGllbnRYICE9IG51bGwgKSB7DQoJCQkJZXZlbnREb2MgPSBldmVudC50YXJnZXQub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudDsNCgkJCQlkb2MgPSBldmVudERvYy5kb2N1bWVudEVsZW1lbnQ7DQoJCQkJYm9keSA9IGV2ZW50RG9jLmJvZHk7DQoNCgkJCQlldmVudC5wYWdlWCA9IG9yaWdpbmFsLmNsaWVudFggKyAoIGRvYyAmJiBkb2Muc2Nyb2xsTGVmdCB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsTGVmdCB8fCAwICkgLSAoIGRvYyAmJiBkb2MuY2xpZW50TGVmdCB8fCBib2R5ICYmIGJvZHkuY2xpZW50TGVmdCB8fCAwICk7DQoJCQkJZXZlbnQucGFnZVkgPSBvcmlnaW5hbC5jbGllbnRZICsgKCBkb2MgJiYgZG9jLnNjcm9sbFRvcCAgfHwgYm9keSAmJiBib2R5LnNjcm9sbFRvcCAgfHwgMCApIC0gKCBkb2MgJiYgZG9jLmNsaWVudFRvcCAgfHwgYm9keSAmJiBib2R5LmNsaWVudFRvcCAgfHwgMCApOw0KCQkJfQ0KDQoJCQkvLyBBZGQgcmVsYXRlZFRhcmdldCwgaWYgbmVjZXNzYXJ5DQoJCQlpZiAoICFldmVudC5yZWxhdGVkVGFyZ2V0ICYmIGZyb21FbGVtZW50ICkgew0KCQkJCWV2ZW50LnJlbGF0ZWRUYXJnZXQgPSBmcm9tRWxlbWVudCA9PT0gZXZlbnQudGFyZ2V0ID8gb3JpZ2luYWwudG9FbGVtZW50IDogZnJvbUVsZW1lbnQ7DQoJCQl9DQoNCgkJCS8vIEFkZCB3aGljaCBmb3IgY2xpY2s6IDEgPT09IGxlZnQ7IDIgPT09IG1pZGRsZTsgMyA9PT0gcmlnaHQNCgkJCS8vIE5vdGU6IGJ1dHRvbiBpcyBub3Qgbm9ybWFsaXplZCwgc28gZG9uJ3QgdXNlIGl0DQoJCQlpZiAoICFldmVudC53aGljaCAmJiBidXR0b24gIT09IHVuZGVmaW5lZCApIHsNCgkJCQlldmVudC53aGljaCA9ICggYnV0dG9uICYgMSA/IDEgOiAoIGJ1dHRvbiAmIDIgPyAzIDogKCBidXR0b24gJiA0ID8gMiA6IDAgKSApICk7DQoJCQl9DQoNCgkJCXJldHVybiBldmVudDsNCgkJfQ0KCX0sDQoNCglmaXg6IGZ1bmN0aW9uKCBldmVudCApIHsNCgkJaWYgKCBldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSApIHsNCgkJCXJldHVybiBldmVudDsNCgkJfQ0KDQoJCS8vIENyZWF0ZSBhIHdyaXRhYmxlIGNvcHkgb2YgdGhlIGV2ZW50IG9iamVjdCBhbmQgbm9ybWFsaXplIHNvbWUgcHJvcGVydGllcw0KCQl2YXIgaSwgcHJvcCwNCgkJCW9yaWdpbmFsRXZlbnQgPSBldmVudCwNCgkJCWZpeEhvb2sgPSBqUXVlcnkuZXZlbnQuZml4SG9va3NbIGV2ZW50LnR5cGUgXSB8fCB7fSwNCgkJCWNvcHkgPSBmaXhIb29rLnByb3BzID8gdGhpcy5wcm9wcy5jb25jYXQoIGZpeEhvb2sucHJvcHMgKSA6IHRoaXMucHJvcHM7DQoNCgkJZXZlbnQgPSBqUXVlcnkuRXZlbnQoIG9yaWdpbmFsRXZlbnQgKTsNCg0KCQlmb3IgKCBpID0gY29weS5sZW5ndGg7IGk7ICkgew0KCQkJcHJvcCA9IGNvcHlbIC0taSBdOw0KCQkJZXZlbnRbIHByb3AgXSA9IG9yaWdpbmFsRXZlbnRbIHByb3AgXTsNCgkJfQ0KDQoJCS8vIEZpeCB0YXJnZXQgcHJvcGVydHksIGlmIG5lY2Vzc2FyeSAoIzE5MjUsIElFIDYvNy84ICYgU2FmYXJpMikNCgkJaWYgKCAhZXZlbnQudGFyZ2V0ICkgew0KCQkJZXZlbnQudGFyZ2V0ID0gb3JpZ2luYWxFdmVudC5zcmNFbGVtZW50IHx8IGRvY3VtZW50Ow0KCQl9DQoNCgkJLy8gVGFyZ2V0IHNob3VsZCBub3QgYmUgYSB0ZXh0IG5vZGUgKCM1MDQsIFNhZmFyaSkNCgkJaWYgKCBldmVudC50YXJnZXQubm9kZVR5cGUgPT09IDMgKSB7DQoJCQlldmVudC50YXJnZXQgPSBldmVudC50YXJnZXQucGFyZW50Tm9kZTsNCgkJfQ0KDQoJCS8vIEZvciBtb3VzZS9rZXkgZXZlbnRzLCBtZXRhS2V5PT1mYWxzZSBpZiBpdCdzIHVuZGVmaW5lZCAoIzMzNjgsICMxMTMyODsgSUU2LzcvOCkNCgkJZXZlbnQubWV0YUtleSA9ICEhZXZlbnQubWV0YUtleTsNCg0KCQlyZXR1cm4gZml4SG9vay5maWx0ZXI/IGZpeEhvb2suZmlsdGVyKCBldmVudCwgb3JpZ2luYWxFdmVudCApIDogZXZlbnQ7DQoJfSwNCg0KCXNwZWNpYWw6IHsNCgkJbG9hZDogew0KCQkJLy8gUHJldmVudCB0cmlnZ2VyZWQgaW1hZ2UubG9hZCBldmVudHMgZnJvbSBidWJibGluZyB0byB3aW5kb3cubG9hZA0KCQkJbm9CdWJibGU6IHRydWUNCgkJfSwNCg0KCQlmb2N1czogew0KCQkJZGVsZWdhdGVUeXBlOiAiZm9jdXNpbiINCgkJfSwNCgkJYmx1cjogew0KCQkJZGVsZWdhdGVUeXBlOiAiZm9jdXNvdXQiDQoJCX0sDQoNCgkJYmVmb3JldW5sb2FkOiB7DQoJCQlzZXR1cDogZnVuY3Rpb24oIGRhdGEsIG5hbWVzcGFjZXMsIGV2ZW50SGFuZGxlICkgew0KCQkJCS8vIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIHNwZWNpYWwgY2FzZSBvbiB3aW5kb3dzDQoJCQkJaWYgKCBqUXVlcnkuaXNXaW5kb3coIHRoaXMgKSApIHsNCgkJCQkJdGhpcy5vbmJlZm9yZXVubG9hZCA9IGV2ZW50SGFuZGxlOw0KCQkJCX0NCgkJCX0sDQoNCgkJCXRlYXJkb3duOiBmdW5jdGlvbiggbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSB7DQoJCQkJaWYgKCB0aGlzLm9uYmVmb3JldW5sb2FkID09PSBldmVudEhhbmRsZSApIHsNCgkJCQkJdGhpcy5vbmJlZm9yZXVubG9hZCA9IG51bGw7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfSwNCg0KCXNpbXVsYXRlOiBmdW5jdGlvbiggdHlwZSwgZWxlbSwgZXZlbnQsIGJ1YmJsZSApIHsNCgkJLy8gUGlnZ3liYWNrIG9uIGEgZG9ub3IgZXZlbnQgdG8gc2ltdWxhdGUgYSBkaWZmZXJlbnQgb25lLg0KCQkvLyBGYWtlIG9yaWdpbmFsRXZlbnQgdG8gYXZvaWQgZG9ub3IncyBzdG9wUHJvcGFnYXRpb24sIGJ1dCBpZiB0aGUNCgkJLy8gc2ltdWxhdGVkIGV2ZW50IHByZXZlbnRzIGRlZmF1bHQgdGhlbiB3ZSBkbyB0aGUgc2FtZSBvbiB0aGUgZG9ub3IuDQoJCXZhciBlID0galF1ZXJ5LmV4dGVuZCgNCgkJCW5ldyBqUXVlcnkuRXZlbnQoKSwNCgkJCWV2ZW50LA0KCQkJeyB0eXBlOiB0eXBlLA0KCQkJCWlzU2ltdWxhdGVkOiB0cnVlLA0KCQkJCW9yaWdpbmFsRXZlbnQ6IHt9DQoJCQl9DQoJCSk7DQoJCWlmICggYnViYmxlICkgew0KCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGUsIG51bGwsIGVsZW0gKTsNCgkJfSBlbHNlIHsNCgkJCWpRdWVyeS5ldmVudC5kaXNwYXRjaC5jYWxsKCBlbGVtLCBlICk7DQoJCX0NCgkJaWYgKCBlLmlzRGVmYXVsdFByZXZlbnRlZCgpICkgew0KCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsNCgkJfQ0KCX0NCn07DQoNCi8vIFNvbWUgcGx1Z2lucyBhcmUgdXNpbmcsIGJ1dCBpdCdzIHVuZG9jdW1lbnRlZC9kZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQuDQovLyBUaGUgMS43IHNwZWNpYWwgZXZlbnQgaW50ZXJmYWNlIHNob3VsZCBwcm92aWRlIGFsbCB0aGUgaG9va3MgbmVlZGVkIG5vdy4NCmpRdWVyeS5ldmVudC5oYW5kbGUgPSBqUXVlcnkuZXZlbnQuZGlzcGF0Y2g7DQoNCmpRdWVyeS5yZW1vdmVFdmVudCA9IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIgPw0KCWZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBoYW5kbGUgKSB7DQoJCWlmICggZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyICkgew0KCQkJZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBoYW5kbGUsIGZhbHNlICk7DQoJCX0NCgl9IDoNCglmdW5jdGlvbiggZWxlbSwgdHlwZSwgaGFuZGxlICkgew0KCQl2YXIgbmFtZSA9ICJvbiIgKyB0eXBlOw0KDQoJCWlmICggZWxlbS5kZXRhY2hFdmVudCApIHsNCg0KCQkJLy8gIzg1NDUsICM3MDU0LCBwcmV2ZW50aW5nIG1lbW9yeSBsZWFrcyBmb3IgY3VzdG9tIGV2ZW50cyBpbiBJRTYtOA0KCQkJLy8gZGV0YWNoRXZlbnQgbmVlZGVkIHByb3BlcnR5IG9uIGVsZW1lbnQsIGJ5IG5hbWUgb2YgdGhhdCBldmVudCwgdG8gcHJvcGVybHkgZXhwb3NlIGl0IHRvIEdDDQoJCQlpZiAoIHR5cGVvZiBlbGVtWyBuYW1lIF0gPT09ICJ1bmRlZmluZWQiICkgew0KCQkJCWVsZW1bIG5hbWUgXSA9IG51bGw7DQoJCQl9DQoNCgkJCWVsZW0uZGV0YWNoRXZlbnQoIG5hbWUsIGhhbmRsZSApOw0KCQl9DQoJfTsNCg0KalF1ZXJ5LkV2ZW50ID0gZnVuY3Rpb24oIHNyYywgcHJvcHMgKSB7DQoJLy8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkDQoJaWYgKCAhKHRoaXMgaW5zdGFuY2VvZiBqUXVlcnkuRXZlbnQpICkgew0KCQlyZXR1cm4gbmV3IGpRdWVyeS5FdmVudCggc3JjLCBwcm9wcyApOw0KCX0NCg0KCS8vIEV2ZW50IG9iamVjdA0KCWlmICggc3JjICYmIHNyYy50eXBlICkgew0KCQl0aGlzLm9yaWdpbmFsRXZlbnQgPSBzcmM7DQoJCXRoaXMudHlwZSA9IHNyYy50eXBlOw0KDQoJCS8vIEV2ZW50cyBidWJibGluZyB1cCB0aGUgZG9jdW1lbnQgbWF5IGhhdmUgYmVlbiBtYXJrZWQgYXMgcHJldmVudGVkDQoJCS8vIGJ5IGEgaGFuZGxlciBsb3dlciBkb3duIHRoZSB0cmVlOyByZWZsZWN0IHRoZSBjb3JyZWN0IHZhbHVlLg0KCQl0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9ICggc3JjLmRlZmF1bHRQcmV2ZW50ZWQgfHwgc3JjLnJldHVyblZhbHVlID09PSBmYWxzZSB8fA0KCQkJc3JjLmdldFByZXZlbnREZWZhdWx0ICYmIHNyYy5nZXRQcmV2ZW50RGVmYXVsdCgpICkgPyByZXR1cm5UcnVlIDogcmV0dXJuRmFsc2U7DQoNCgkvLyBFdmVudCB0eXBlDQoJfSBlbHNlIHsNCgkJdGhpcy50eXBlID0gc3JjOw0KCX0NCg0KCS8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0DQoJaWYgKCBwcm9wcyApIHsNCgkJalF1ZXJ5LmV4dGVuZCggdGhpcywgcHJvcHMgKTsNCgl9DQoNCgkvLyBDcmVhdGUgYSB0aW1lc3RhbXAgaWYgaW5jb21pbmcgZXZlbnQgZG9lc24ndCBoYXZlIG9uZQ0KCXRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1lU3RhbXAgfHwgalF1ZXJ5Lm5vdygpOw0KDQoJLy8gTWFyayBpdCBhcyBmaXhlZA0KCXRoaXNbIGpRdWVyeS5leHBhbmRvIF0gPSB0cnVlOw0KfTsNCg0KZnVuY3Rpb24gcmV0dXJuRmFsc2UoKSB7DQoJcmV0dXJuIGZhbHNlOw0KfQ0KZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHsNCglyZXR1cm4gdHJ1ZTsNCn0NCg0KLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nDQovLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDAzMDMzMS9lY21hLXNjcmlwdC1iaW5kaW5nLmh0bWwNCmpRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7DQoJcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkgew0KCQl0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHJldHVyblRydWU7DQoNCgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7DQoJCWlmICggIWUgKSB7DQoJCQlyZXR1cm47DQoJCX0NCg0KCQkvLyBpZiBwcmV2ZW50RGVmYXVsdCBleGlzdHMgcnVuIGl0IG9uIHRoZSBvcmlnaW5hbCBldmVudA0KCQlpZiAoIGUucHJldmVudERlZmF1bHQgKSB7DQoJCQllLnByZXZlbnREZWZhdWx0KCk7DQoNCgkJLy8gb3RoZXJ3aXNlIHNldCB0aGUgcmV0dXJuVmFsdWUgcHJvcGVydHkgb2YgdGhlIG9yaWdpbmFsIGV2ZW50IHRvIGZhbHNlIChJRSkNCgkJfSBlbHNlIHsNCgkJCWUucmV0dXJuVmFsdWUgPSBmYWxzZTsNCgkJfQ0KCX0sDQoJc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHsNCgkJdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7DQoNCgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7DQoJCWlmICggIWUgKSB7DQoJCQlyZXR1cm47DQoJCX0NCgkJLy8gaWYgc3RvcFByb3BhZ2F0aW9uIGV4aXN0cyBydW4gaXQgb24gdGhlIG9yaWdpbmFsIGV2ZW50DQoJCWlmICggZS5zdG9wUHJvcGFnYXRpb24gKSB7DQoJCQllLnN0b3BQcm9wYWdhdGlvbigpOw0KCQl9DQoJCS8vIG90aGVyd2lzZSBzZXQgdGhlIGNhbmNlbEJ1YmJsZSBwcm9wZXJ0eSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgdG8gdHJ1ZSAoSUUpDQoJCWUuY2FuY2VsQnViYmxlID0gdHJ1ZTsNCgl9LA0KCXN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7DQoJCXRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOw0KCQl0aGlzLnN0b3BQcm9wYWdhdGlvbigpOw0KCX0sDQoJaXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSwNCglpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsDQoJaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlDQp9Ow0KDQovLyBDcmVhdGUgbW91c2VlbnRlci9sZWF2ZSBldmVudHMgdXNpbmcgbW91c2VvdmVyL291dCBhbmQgZXZlbnQtdGltZSBjaGVja3MNCmpRdWVyeS5lYWNoKHsNCgltb3VzZWVudGVyOiAibW91c2VvdmVyIiwNCgltb3VzZWxlYXZlOiAibW91c2VvdXQiDQp9LCBmdW5jdGlvbiggb3JpZywgZml4ICkgew0KCWpRdWVyeS5ldmVudC5zcGVjaWFsWyBvcmlnIF0gPSB7DQoJCWRlbGVnYXRlVHlwZTogZml4LA0KCQliaW5kVHlwZTogZml4LA0KDQoJCWhhbmRsZTogZnVuY3Rpb24oIGV2ZW50ICkgew0KCQkJdmFyIHJldCwNCgkJCQl0YXJnZXQgPSB0aGlzLA0KCQkJCXJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0LA0KCQkJCWhhbmRsZU9iaiA9IGV2ZW50LmhhbmRsZU9iaiwNCgkJCQlzZWxlY3RvciA9IGhhbmRsZU9iai5zZWxlY3RvcjsNCg0KCQkJLy8gRm9yIG1vdXNlbnRlci9sZWF2ZSBjYWxsIHRoZSBoYW5kbGVyIGlmIHJlbGF0ZWQgaXMgb3V0c2lkZSB0aGUgdGFyZ2V0Lg0KCQkJLy8gTkI6IE5vIHJlbGF0ZWRUYXJnZXQgaWYgdGhlIG1vdXNlIGxlZnQvZW50ZXJlZCB0aGUgYnJvd3NlciB3aW5kb3cNCgkJCWlmICggIXJlbGF0ZWQgfHwgKHJlbGF0ZWQgIT09IHRhcmdldCAmJiAhalF1ZXJ5LmNvbnRhaW5zKCB0YXJnZXQsIHJlbGF0ZWQgKSkgKSB7DQoJCQkJZXZlbnQudHlwZSA9IGhhbmRsZU9iai5vcmlnVHlwZTsNCgkJCQlyZXQgPSBoYW5kbGVPYmouaGFuZGxlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7DQoJCQkJZXZlbnQudHlwZSA9IGZpeDsNCgkJCX0NCgkJCXJldHVybiByZXQ7DQoJCX0NCgl9Ow0KfSk7DQoNCi8vIElFIHN1Ym1pdCBkZWxlZ2F0aW9uDQppZiAoICFqUXVlcnkuc3VwcG9ydC5zdWJtaXRCdWJibGVzICkgew0KDQoJalF1ZXJ5LmV2ZW50LnNwZWNpYWwuc3VibWl0ID0gew0KCQlzZXR1cDogZnVuY3Rpb24oKSB7DQoJCQkvLyBPbmx5IG5lZWQgdGhpcyBmb3IgZGVsZWdhdGVkIGZvcm0gc3VibWl0IGV2ZW50cw0KCQkJaWYgKCBqUXVlcnkubm9kZU5hbWUoIHRoaXMsICJmb3JtIiApICkgew0KCQkJCXJldHVybiBmYWxzZTsNCgkJCX0NCg0KCQkJLy8gTGF6eS1hZGQgYSBzdWJtaXQgaGFuZGxlciB3aGVuIGEgZGVzY2VuZGFudCBmb3JtIG1heSBwb3RlbnRpYWxseSBiZSBzdWJtaXR0ZWQNCgkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsICJjbGljay5fc3VibWl0IGtleXByZXNzLl9zdWJtaXQiLCBmdW5jdGlvbiggZSApIHsNCgkJCQkvLyBOb2RlIG5hbWUgY2hlY2sgYXZvaWRzIGEgVk1MLXJlbGF0ZWQgY3Jhc2ggaW4gSUUgKCM5ODA3KQ0KCQkJCXZhciBlbGVtID0gZS50YXJnZXQsDQoJCQkJCWZvcm0gPSBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJpbnB1dCIgKSB8fCBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJidXR0b24iICkgPyBlbGVtLmZvcm0gOiB1bmRlZmluZWQ7DQoJCQkJaWYgKCBmb3JtICYmICFqUXVlcnkuX2RhdGEoIGZvcm0sICJfc3VibWl0X2F0dGFjaGVkIiApICkgew0KCQkJCQlqUXVlcnkuZXZlbnQuYWRkKCBmb3JtLCAic3VibWl0Ll9zdWJtaXQiLCBmdW5jdGlvbiggZXZlbnQgKSB7DQoJCQkJCQlldmVudC5fc3VibWl0X2J1YmJsZSA9IHRydWU7DQoJCQkJCX0pOw0KCQkJCQlqUXVlcnkuX2RhdGEoIGZvcm0sICJfc3VibWl0X2F0dGFjaGVkIiwgdHJ1ZSApOw0KCQkJCX0NCgkJCX0pOw0KCQkJLy8gcmV0dXJuIHVuZGVmaW5lZCBzaW5jZSB3ZSBkb24ndCBuZWVkIGFuIGV2ZW50IGxpc3RlbmVyDQoJCX0sDQoNCgkJcG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7DQoJCQkvLyBJZiBmb3JtIHdhcyBzdWJtaXR0ZWQgYnkgdGhlIHVzZXIsIGJ1YmJsZSB0aGUgZXZlbnQgdXAgdGhlIHRyZWUNCgkJCWlmICggZXZlbnQuX3N1Ym1pdF9idWJibGUgKSB7DQoJCQkJZGVsZXRlIGV2ZW50Ll9zdWJtaXRfYnViYmxlOw0KCQkJCWlmICggdGhpcy5wYXJlbnROb2RlICYmICFldmVudC5pc1RyaWdnZXIgKSB7DQoJCQkJCWpRdWVyeS5ldmVudC5zaW11bGF0ZSggInN1Ym1pdCIsIHRoaXMucGFyZW50Tm9kZSwgZXZlbnQsIHRydWUgKTsNCgkJCQl9DQoJCQl9DQoJCX0sDQoNCgkJdGVhcmRvd246IGZ1bmN0aW9uKCkgew0KCQkJLy8gT25seSBuZWVkIHRoaXMgZm9yIGRlbGVnYXRlZCBmb3JtIHN1Ym1pdCBldmVudHMNCgkJCWlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCAiZm9ybSIgKSApIHsNCgkJCQlyZXR1cm4gZmFsc2U7DQoJCQl9DQoNCgkJCS8vIFJlbW92ZSBkZWxlZ2F0ZWQgaGFuZGxlcnM7IGNsZWFuRGF0YSBldmVudHVhbGx5IHJlYXBzIHN1Ym1pdCBoYW5kbGVycyBhdHRhY2hlZCBhYm92ZQ0KCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgIi5fc3VibWl0IiApOw0KCQl9DQoJfTsNCn0NCg0KLy8gSUUgY2hhbmdlIGRlbGVnYXRpb24gYW5kIGNoZWNrYm94L3JhZGlvIGZpeA0KaWYgKCAhalF1ZXJ5LnN1cHBvcnQuY2hhbmdlQnViYmxlcyApIHsNCg0KCWpRdWVyeS5ldmVudC5zcGVjaWFsLmNoYW5nZSA9IHsNCg0KCQlzZXR1cDogZnVuY3Rpb24oKSB7DQoNCgkJCWlmICggcmZvcm1FbGVtcy50ZXN0KCB0aGlzLm5vZGVOYW1lICkgKSB7DQoJCQkJLy8gSUUgZG9lc24ndCBmaXJlIGNoYW5nZSBvbiBhIGNoZWNrL3JhZGlvIHVudGlsIGJsdXI7IHRyaWdnZXIgaXQgb24gY2xpY2sNCgkJCQkvLyBhZnRlciBhIHByb3BlcnR5Y2hhbmdlLiBFYXQgdGhlIGJsdXItY2hhbmdlIGluIHNwZWNpYWwuY2hhbmdlLmhhbmRsZS4NCgkJCQkvLyBUaGlzIHN0aWxsIGZpcmVzIG9uY2hhbmdlIGEgc2Vjb25kIHRpbWUgZm9yIGNoZWNrL3JhZGlvIGFmdGVyIGJsdXIuDQoJCQkJaWYgKCB0aGlzLnR5cGUgPT09ICJjaGVja2JveCIgfHwgdGhpcy50eXBlID09PSAicmFkaW8iICkgew0KCQkJCQlqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCAicHJvcGVydHljaGFuZ2UuX2NoYW5nZSIsIGZ1bmN0aW9uKCBldmVudCApIHsNCgkJCQkJCWlmICggZXZlbnQub3JpZ2luYWxFdmVudC5wcm9wZXJ0eU5hbWUgPT09ICJjaGVja2VkIiApIHsNCgkJCQkJCQl0aGlzLl9qdXN0X2NoYW5nZWQgPSB0cnVlOw0KCQkJCQkJfQ0KCQkJCQl9KTsNCgkJCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgImNsaWNrLl9jaGFuZ2UiLCBmdW5jdGlvbiggZXZlbnQgKSB7DQoJCQkJCQlpZiAoIHRoaXMuX2p1c3RfY2hhbmdlZCAmJiAhZXZlbnQuaXNUcmlnZ2VyICkgew0KCQkJCQkJCXRoaXMuX2p1c3RfY2hhbmdlZCA9IGZhbHNlOw0KCQkJCQkJfQ0KCQkJCQkJLy8gQWxsb3cgdHJpZ2dlcmVkLCBzaW11bGF0ZWQgY2hhbmdlIGV2ZW50cyAoIzExNTAwKQ0KCQkJCQkJalF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCAiY2hhbmdlIiwgdGhpcywgZXZlbnQsIHRydWUgKTsNCgkJCQkJfSk7DQoJCQkJfQ0KCQkJCXJldHVybiBmYWxzZTsNCgkJCX0NCgkJCS8vIERlbGVnYXRlZCBldmVudDsgbGF6eS1hZGQgYSBjaGFuZ2UgaGFuZGxlciBvbiBkZXNjZW5kYW50IGlucHV0cw0KCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgImJlZm9yZWFjdGl2YXRlLl9jaGFuZ2UiLCBmdW5jdGlvbiggZSApIHsNCgkJCQl2YXIgZWxlbSA9IGUudGFyZ2V0Ow0KDQoJCQkJaWYgKCByZm9ybUVsZW1zLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSAmJiAhalF1ZXJ5Ll9kYXRhKCBlbGVtLCAiX2NoYW5nZV9hdHRhY2hlZCIgKSApIHsNCgkJCQkJalF1ZXJ5LmV2ZW50LmFkZCggZWxlbSwgImNoYW5nZS5fY2hhbmdlIiwgZnVuY3Rpb24oIGV2ZW50ICkgew0KCQkJCQkJaWYgKCB0aGlzLnBhcmVudE5vZGUgJiYgIWV2ZW50LmlzU2ltdWxhdGVkICYmICFldmVudC5pc1RyaWdnZXIgKSB7DQoJCQkJCQkJalF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCAiY2hhbmdlIiwgdGhpcy5wYXJlbnROb2RlLCBldmVudCwgdHJ1ZSApOw0KCQkJCQkJfQ0KCQkJCQl9KTsNCgkJCQkJalF1ZXJ5Ll9kYXRhKCBlbGVtLCAiX2NoYW5nZV9hdHRhY2hlZCIsIHRydWUgKTsNCgkJCQl9DQoJCQl9KTsNCgkJfSwNCg0KCQloYW5kbGU6IGZ1bmN0aW9uKCBldmVudCApIHsNCgkJCXZhciBlbGVtID0gZXZlbnQudGFyZ2V0Ow0KDQoJCQkvLyBTd2FsbG93IG5hdGl2ZSBjaGFuZ2UgZXZlbnRzIGZyb20gY2hlY2tib3gvcmFkaW8sIHdlIGFscmVhZHkgdHJpZ2dlcmVkIHRoZW0gYWJvdmUNCgkJCWlmICggdGhpcyAhPT0gZWxlbSB8fCBldmVudC5pc1NpbXVsYXRlZCB8fCBldmVudC5pc1RyaWdnZXIgfHwgKGVsZW0udHlwZSAhPT0gInJhZGlvIiAmJiBlbGVtLnR5cGUgIT09ICJjaGVja2JveCIpICkgew0KCQkJCXJldHVybiBldmVudC5oYW5kbGVPYmouaGFuZGxlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7DQoJCQl9DQoJCX0sDQoNCgkJdGVhcmRvd246IGZ1bmN0aW9uKCkgew0KCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgIi5fY2hhbmdlIiApOw0KDQoJCQlyZXR1cm4gIXJmb3JtRWxlbXMudGVzdCggdGhpcy5ub2RlTmFtZSApOw0KCQl9DQoJfTsNCn0NCg0KLy8gQ3JlYXRlICJidWJibGluZyIgZm9jdXMgYW5kIGJsdXIgZXZlbnRzDQppZiAoICFqUXVlcnkuc3VwcG9ydC5mb2N1c2luQnViYmxlcyApIHsNCglqUXVlcnkuZWFjaCh7IGZvY3VzOiAiZm9jdXNpbiIsIGJsdXI6ICJmb2N1c291dCIgfSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApIHsNCg0KCQkvLyBBdHRhY2ggYSBzaW5nbGUgY2FwdHVyaW5nIGhhbmRsZXIgd2hpbGUgc29tZW9uZSB3YW50cyBmb2N1c2luL2ZvY3Vzb3V0DQoJCXZhciBhdHRhY2hlcyA9IDAsDQoJCQloYW5kbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkgew0KCQkJCWpRdWVyeS5ldmVudC5zaW11bGF0ZSggZml4LCBldmVudC50YXJnZXQsIGpRdWVyeS5ldmVudC5maXgoIGV2ZW50ICksIHRydWUgKTsNCgkJCX07DQoNCgkJalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGZpeCBdID0gew0KCQkJc2V0dXA6IGZ1bmN0aW9uKCkgew0KCQkJCWlmICggYXR0YWNoZXMrKyA9PT0gMCApIHsNCgkJCQkJZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApOw0KCQkJCX0NCgkJCX0sDQoJCQl0ZWFyZG93bjogZnVuY3Rpb24oKSB7DQoJCQkJaWYgKCAtLWF0dGFjaGVzID09PSAwICkgew0KCQkJCQlkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCBvcmlnLCBoYW5kbGVyLCB0cnVlICk7DQoJCQkJfQ0KCQkJfQ0KCQl9Ow0KCX0pOw0KfQ0KDQpqUXVlcnkuZm4uZXh0ZW5kKHsNCg0KCW9uOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgLypJTlRFUk5BTCovIG9uZSApIHsNCgkJdmFyIG9yaWdGbiwgdHlwZTsNCg0KCQkvLyBUeXBlcyBjYW4gYmUgYSBtYXAgb2YgdHlwZXMvaGFuZGxlcnMNCgkJaWYgKCB0eXBlb2YgdHlwZXMgPT09ICJvYmplY3QiICkgew0KCQkJLy8gKCB0eXBlcy1PYmplY3QsIHNlbGVjdG9yLCBkYXRhICkNCgkJCWlmICggdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5nIiApIHsgLy8gJiYgc2VsZWN0b3IgIT0gbnVsbA0KCQkJCS8vICggdHlwZXMtT2JqZWN0LCBkYXRhICkNCgkJCQlkYXRhID0gZGF0YSB8fCBzZWxlY3RvcjsNCgkJCQlzZWxlY3RvciA9IHVuZGVmaW5lZDsNCgkJCX0NCgkJCWZvciAoIHR5cGUgaW4gdHlwZXMgKSB7DQoJCQkJdGhpcy5vbiggdHlwZSwgc2VsZWN0b3IsIGRhdGEsIHR5cGVzWyB0eXBlIF0sIG9uZSApOw0KCQkJfQ0KCQkJcmV0dXJuIHRoaXM7DQoJCX0NCg0KCQlpZiAoIGRhdGEgPT0gbnVsbCAmJiBmbiA9PSBudWxsICkgew0KCQkJLy8gKCB0eXBlcywgZm4gKQ0KCQkJZm4gPSBzZWxlY3RvcjsNCgkJCWRhdGEgPSBzZWxlY3RvciA9IHVuZGVmaW5lZDsNCgkJfSBlbHNlIGlmICggZm4gPT0gbnVsbCApIHsNCgkJCWlmICggdHlwZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIiApIHsNCgkJCQkvLyAoIHR5cGVzLCBzZWxlY3RvciwgZm4gKQ0KCQkJCWZuID0gZGF0YTsNCgkJCQlkYXRhID0gdW5kZWZpbmVkOw0KCQkJfSBlbHNlIHsNCgkJCQkvLyAoIHR5cGVzLCBkYXRhLCBmbiApDQoJCQkJZm4gPSBkYXRhOw0KCQkJCWRhdGEgPSBzZWxlY3RvcjsNCgkJCQlzZWxlY3RvciA9IHVuZGVmaW5lZDsNCgkJCX0NCgkJfQ0KCQlpZiAoIGZuID09PSBmYWxzZSApIHsNCgkJCWZuID0gcmV0dXJuRmFsc2U7DQoJCX0gZWxzZSBpZiAoICFmbiApIHsNCgkJCXJldHVybiB0aGlzOw0KCQl9DQoNCgkJaWYgKCBvbmUgPT09IDEgKSB7DQoJCQlvcmlnRm4gPSBmbjsNCgkJCWZuID0gZnVuY3Rpb24oIGV2ZW50ICkgew0KCQkJCS8vIENhbiB1c2UgYW4gZW1wdHkgc2V0LCBzaW5jZSBldmVudCBjb250YWlucyB0aGUgaW5mbw0KCQkJCWpRdWVyeSgpLm9mZiggZXZlbnQgKTsNCgkJCQlyZXR1cm4gb3JpZ0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsNCgkJCX07DQoJCQkvLyBVc2Ugc2FtZSBndWlkIHNvIGNhbGxlciBjYW4gcmVtb3ZlIHVzaW5nIG9yaWdGbg0KCQkJZm4uZ3VpZCA9IG9yaWdGbi5ndWlkIHx8ICggb3JpZ0ZuLmd1aWQgPSBqUXVlcnkuZ3VpZCsrICk7DQoJCX0NCgkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7DQoJCQlqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlcywgZm4sIGRhdGEsIHNlbGVjdG9yICk7DQoJCX0pOw0KCX0sDQoJb25lOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApIHsNCgkJcmV0dXJuIHRoaXMub24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIDEgKTsNCgl9LA0KCW9mZjogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZm4gKSB7DQoJCXZhciBoYW5kbGVPYmosIHR5cGU7DQoJCWlmICggdHlwZXMgJiYgdHlwZXMucHJldmVudERlZmF1bHQgJiYgdHlwZXMuaGFuZGxlT2JqICkgew0KCQkJLy8gKCBldmVudCApICBkaXNwYXRjaGVkIGpRdWVyeS5FdmVudA0KCQkJaGFuZGxlT2JqID0gdHlwZXMuaGFuZGxlT2JqOw0KCQkJalF1ZXJ5KCB0eXBlcy5kZWxlZ2F0ZVRhcmdldCApLm9mZigNCgkJCQloYW5kbGVPYmoubmFtZXNwYWNlID8gaGFuZGxlT2JqLm9yaWdUeXBlICsgIi4iICsgaGFuZGxlT2JqLm5hbWVzcGFjZSA6IGhhbmRsZU9iai5vcmlnVHlwZSwNCgkJCQloYW5kbGVPYmouc2VsZWN0b3IsDQoJCQkJaGFuZGxlT2JqLmhhbmRsZXINCgkJCSk7DQoJCQlyZXR1cm4gdGhpczsNCgkJfQ0KCQlpZiAoIHR5cGVvZiB0eXBlcyA9PT0gIm9iamVjdCIgKSB7DQoJCQkvLyAoIHR5cGVzLW9iamVjdCBbLCBzZWxlY3Rvcl0gKQ0KCQkJZm9yICggdHlwZSBpbiB0eXBlcyApIHsNCgkJCQl0aGlzLm9mZiggdHlwZSwgc2VsZWN0b3IsIHR5cGVzWyB0eXBlIF0gKTsNCgkJCX0NCgkJCXJldHVybiB0aGlzOw0KCQl9DQoJCWlmICggc2VsZWN0b3IgPT09IGZhbHNlIHx8IHR5cGVvZiBzZWxlY3RvciA9PT0gImZ1bmN0aW9uIiApIHsNCgkJCS8vICggdHlwZXMgWywgZm5dICkNCgkJCWZuID0gc2VsZWN0b3I7DQoJCQlzZWxlY3RvciA9IHVuZGVmaW5lZDsNCgkJfQ0KCQlpZiAoIGZuID09PSBmYWxzZSApIHsNCgkJCWZuID0gcmV0dXJuRmFsc2U7DQoJCX0NCgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsNCgkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIHR5cGVzLCBmbiwgc2VsZWN0b3IgKTsNCgkJfSk7DQoJfSwNCg0KCWJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZGF0YSwgZm4gKSB7DQoJCXJldHVybiB0aGlzLm9uKCB0eXBlcywgbnVsbCwgZGF0YSwgZm4gKTsNCgl9LA0KCXVuYmluZDogZnVuY3Rpb24oIHR5cGVzLCBmbiApIHsNCgkJcmV0dXJuIHRoaXMub2ZmKCB0eXBlcywgbnVsbCwgZm4gKTsNCgl9LA0KDQoJbGl2ZTogZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHsNCgkJalF1ZXJ5KCB0aGlzLmNvbnRleHQgKS5vbiggdHlwZXMsIHRoaXMuc2VsZWN0b3IsIGRhdGEsIGZuICk7DQoJCXJldHVybiB0aGlzOw0KCX0sDQoJZGllOiBmdW5jdGlvbiggdHlwZXMsIGZuICkgew0KCQlqUXVlcnkoIHRoaXMuY29udGV4dCApLm9mZiggdHlwZXMsIHRoaXMuc2VsZWN0b3IgfHwgIioqIiwgZm4gKTsNCgkJcmV0dXJuIHRoaXM7DQoJfSwNCg0KCWRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHsNCgkJcmV0dXJuIHRoaXMub24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKTsNCgl9LA0KCXVuZGVsZWdhdGU6IGZ1bmN0aW9uKCBzZWxlY3RvciwgdHlwZXMsIGZuICkgew0KCQkvLyAoIG5hbWVzcGFjZSApIG9yICggc2VsZWN0b3IsIHR5cGVzIFssIGZuXSApDQoJCXJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gdGhpcy5vZmYoIHNlbGVjdG9yLCAiKioiICkgOiB0aGlzLm9mZiggdHlwZXMsIHNlbGVjdG9yIHx8ICIqKiIsIGZuICk7DQoJfSwNCg0KCXRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgew0KCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgew0KCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUsIGRhdGEsIHRoaXMgKTsNCgkJfSk7DQoJfSwNCgl0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7DQoJCWlmICggdGhpc1swXSApIHsNCgkJCXJldHVybiBqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpc1swXSwgdHJ1ZSApOw0KCQl9DQoJfSwNCg0KCXRvZ2dsZTogZnVuY3Rpb24oIGZuICkgew0KCQkvLyBTYXZlIHJlZmVyZW5jZSB0byBhcmd1bWVudHMgZm9yIGFjY2VzcyBpbiBjbG9zdXJlDQoJCXZhciBhcmdzID0gYXJndW1lbnRzLA0KCQkJZ3VpZCA9IGZuLmd1aWQgfHwgalF1ZXJ5Lmd1aWQrKywNCgkJCWkgPSAwLA0KCQkJdG9nZ2xlciA9IGZ1bmN0aW9uKCBldmVudCApIHsNCgkJCQkvLyBGaWd1cmUgb3V0IHdoaWNoIGZ1bmN0aW9uIHRvIGV4ZWN1dGUNCgkJCQl2YXIgbGFzdFRvZ2dsZSA9ICggalF1ZXJ5Ll9kYXRhKCB0aGlzLCAibGFzdFRvZ2dsZSIgKyBmbi5ndWlkICkgfHwgMCApICUgaTsNCgkJCQlqUXVlcnkuX2RhdGEoIHRoaXMsICJsYXN0VG9nZ2xlIiArIGZuLmd1aWQsIGxhc3RUb2dnbGUgKyAxICk7DQoNCgkJCQkvLyBNYWtlIHN1cmUgdGhhdCBjbGlja3Mgc3RvcA0KCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7DQoNCgkJCQkvLyBhbmQgZXhlY3V0ZSB0aGUgZnVuY3Rpb24NCgkJCQlyZXR1cm4gYXJnc1sgbGFzdFRvZ2dsZSBdLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSB8fCBmYWxzZTsNCgkJCX07DQoNCgkJLy8gbGluayBhbGwgdGhlIGZ1bmN0aW9ucywgc28gYW55IG9mIHRoZW0gY2FuIHVuYmluZCB0aGlzIGNsaWNrIGhhbmRsZXINCgkJdG9nZ2xlci5ndWlkID0gZ3VpZDsNCgkJd2hpbGUgKCBpIDwgYXJncy5sZW5ndGggKSB7DQoJCQlhcmdzWyBpKysgXS5ndWlkID0gZ3VpZDsNCgkJfQ0KDQoJCXJldHVybiB0aGlzLmNsaWNrKCB0b2dnbGVyICk7DQoJfSwNCg0KCWhvdmVyOiBmdW5jdGlvbiggZm5PdmVyLCBmbk91dCApIHsNCgkJcmV0dXJuIHRoaXMubW91c2VlbnRlciggZm5PdmVyICkubW91c2VsZWF2ZSggZm5PdXQgfHwgZm5PdmVyICk7DQoJfQ0KfSk7DQoNCmpRdWVyeS5lYWNoKCAoImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrICIgKw0KCSJtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSAiICsNCgkiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIpLnNwbGl0KCIgIiksIGZ1bmN0aW9uKCBpLCBuYW1lICkgew0KDQoJLy8gSGFuZGxlIGV2ZW50IGJpbmRpbmcNCglqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBkYXRhLCBmbiApIHsNCgkJaWYgKCBmbiA9PSBudWxsICkgew0KCQkJZm4gPSBkYXRhOw0KCQkJZGF0YSA9IG51bGw7DQoJCX0NCg0KCQlyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDAgPw0KCQkJdGhpcy5vbiggbmFtZSwgbnVsbCwgZGF0YSwgZm4gKSA6DQoJCQl0aGlzLnRyaWdnZXIoIG5hbWUgKTsNCgl9Ow0KDQoJaWYgKCBya2V5RXZlbnQudGVzdCggbmFtZSApICkgew0KCQlqUXVlcnkuZXZlbnQuZml4SG9va3NbIG5hbWUgXSA9IGpRdWVyeS5ldmVudC5rZXlIb29rczsNCgl9DQoNCglpZiAoIHJtb3VzZUV2ZW50LnRlc3QoIG5hbWUgKSApIHsNCgkJalF1ZXJ5LmV2ZW50LmZpeEhvb2tzWyBuYW1lIF0gPSBqUXVlcnkuZXZlbnQubW91c2VIb29rczsNCgl9DQp9KTsNCi8qIQ0KICogU2l6emxlIENTUyBTZWxlY3RvciBFbmdpbmUNCiAqIENvcHlyaWdodCAyMDEyIGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMNCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQ0KICogaHR0cDovL3NpenpsZWpzLmNvbS8NCiAqLw0KKGZ1bmN0aW9uKCB3aW5kb3csIHVuZGVmaW5lZCApIHsNCg0KdmFyIGNhY2hlZHJ1bnMsDQoJYXNzZXJ0R2V0SWROb3ROYW1lLA0KCUV4cHIsDQoJZ2V0VGV4dCwNCglpc1hNTCwNCgljb250YWlucywNCgljb21waWxlLA0KCXNvcnRPcmRlciwNCgloYXNEdXBsaWNhdGUsDQoJb3V0ZXJtb3N0Q29udGV4dCwNCg0KCWJhc2VIYXNEdXBsaWNhdGUgPSB0cnVlLA0KCXN0cnVuZGVmaW5lZCA9ICJ1bmRlZmluZWQiLA0KDQoJZXhwYW5kbyA9ICggInNpemNhY2hlIiArIE1hdGgucmFuZG9tKCkgKS5yZXBsYWNlKCAiLiIsICIiICksDQoNCglUb2tlbiA9IFN0cmluZywNCglkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudCwNCglkb2NFbGVtID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LA0KCWRpcnJ1bnMgPSAwLA0KCWRvbmUgPSAwLA0KCXBvcCA9IFtdLnBvcCwNCglwdXNoID0gW10ucHVzaCwNCglzbGljZSA9IFtdLnNsaWNlLA0KCS8vIFVzZSBhIHN0cmlwcGVkLWRvd24gaW5kZXhPZiBpZiBhIG5hdGl2ZSBvbmUgaXMgdW5hdmFpbGFibGUNCglpbmRleE9mID0gW10uaW5kZXhPZiB8fCBmdW5jdGlvbiggZWxlbSApIHsNCgkJdmFyIGkgPSAwLA0KCQkJbGVuID0gdGhpcy5sZW5ndGg7DQoJCWZvciAoIDsgaSA8IGxlbjgaSsrICkgew0KCQkJaWYgKCB0aGlzW2ldID09PSBlbGVtICkgew0KCQkJCXJldHVybiBpOw0KCQkJfQ0KCQl9DQoJCXJldHVybiAtMTsNCgl9LA0KDQoJLy8gQXVnbWVudCBhIGZ1bmN0aW9uIGZvciBzcGVjaWFsIHVzZSBieSBTaXp6bGUNCgltYXJrRnVuY3Rpb24gPSBmdW5jdGlvbiggZm4sIHZhbHVlICkgew0KCQlmblsgZXhwYW5kbyBdID0gdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZTsNCgkJcmV0dXJuIGZuOw0KCX0sDQoNCgljcmVhdGVDYWNoZSA9IGZ1bmN0aW9uKCkgew0KCQl2YXIgY2FjaGUgPSB7fSwNCgkJCWtleXMgPSBbXTsNCg0KCQlyZXR1cm4gbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgew0KCQkJLy8gT25seSBrZWVwIHRoZSBtb3N0IHJlY2VudCBlbnRyaWVzDQoJCQlpZiAoIGtleXMucHVzaCgga2V5ICkgPiBFeHByLmNhY2hlTGVuZ3RoICkgew0KCQkJCWRlbGV0ZSBjYWNoZVsga2V5cy5zaGlmdCgpIF07DQoJCQl9DQoNCgkJCS8vIFJldHJpZXZlIHdpdGggKGtleSArICIgIikgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggbmF0aXZlIE9iamVjdC5wcm90b3R5cGUgcHJvcGVydGllcyAoc2VlIElzc3VlICMxNTcpDQoJCQlyZXR1cm4gKGNhY2hlWyBrZXkgKyAiICIgXSA9IHZhbHVlKTsNCgkJfSwgY2FjaGUgKTsNCgl9LA0KDQoJY2xhc3NDYWNoZSA9IGNyZWF0ZUNhY2hlKCksDQoJdG9rZW5DYWNoZSA9IGNyZWF0ZUNhY2hlKCksDQoJY29tcGlsZXJDYWNoZSA9IGNyZWF0ZUNhY2hlKCksDQoNCgkvLyBSZWdleA0KDQoJLy8gV2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc2VsZWN0b3JzLyN3aGl0ZXNwYWNlDQoJd2hpdGVzcGFjZSA9ICJbXFx4MjBcXHRcXHJcXG5cXGZdIiwNCgkvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXN5bnRheC8jY2hhcmFjdGVycw0KCWNoYXJhY3RlckVuY29kaW5nID0gIig/OlxcXFwufFstXFx3XXxbXlxceDAwLVxceGEwXSkrIiwNCg0KCS8vIExvb3NlbHkgbW9kZWxlZCBvbiBDU1MgaWRlbnRpZmllciBjaGFyYWN0ZXJzDQoJLy8gQW4gdW5xdW90ZWQgdmFsdWUgc2hvdWxkIGJlIGEgQ1NTIGlkZW50aWZpZXIgKGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc2VsZWN0b3JzLyNhdHRyaWJ1dGUtc2VsZWN0b3JzKQ0KCS8vIFByb3BlciBzeW50YXg6IGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCN2YWx1ZS1kZWYtaWRlbnRpZmllcg0KCWlkZW50aWZpZXIgPSBjaGFyYWN0ZXJFbmNvZGluZy5yZXBsYWNlKCAidyIsICJ3IyIgKSwNCg0KCS8vIEFjY2VwdGFibGUgb3BlcmF0b3JzIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jYXR0cmlidXRlLXNlbGVjdG9ycw0KCW9wZXJhdG9ycyA9ICIoWypeJHwhfl0/PSkiLA0KCWF0dHJpYnV0ZXMgPSAiXFxbIiArIHdoaXRlc3BhY2UgKyAiKigiICsgY2hhcmFjdGVyRW5jb2RpbmcgKyAiKSIgKyB3aGl0ZXNwYWNlICsNCgkJIiooPzoiICsgb3BlcmF0b3JzICsgd2hpdGVzcGFjZSArICIqKD86KFsnXCJdKSgoPzpcXFxcLnxbXlxcXFxdKSo/KVxcM3woIiArIGlkZW50aWZpZXIgKyAiKXwpfCkiICsgd2hpdGVzcGFjZSArICIqXFxdIiwNCg0KCS8vIFByZWZlciBhcmd1bWVudHMgbm90IGluIHBhcmVucy9icmFja2V0cywNCgkvLyAgIHRoZW4gYXR0cmlidXRlIHNlbGVjdG9ycyBhbmQgbm9uLXBzZXVkb3MgKGRlbm90ZWQgYnkgOiksDQoJLy8gICB0aGVuIGFueXRoaW5nIGVsc2UNCgkvLyBUaGVzZSBwcmVmZXJlbmNlcyBhcmUgaGVyZSB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBzZWxlY3RvcnMNCgkvLyAgIG5lZWRpbmcgdG9rZW5pemUgaW4gdGhlIFBTRVVETyBwcmVGaWx0ZXINCglwc2V1ZG9zID0gIjooIiArIGNoYXJhY3RlckVuY29kaW5nICsgIikoPzpcXCgoPzooWydcIl0pKCg/OlxcXFwufFteXFxcXF0pKj8pXFwyfChbXigpW1xcXV0qfCg/Oig/OiIgKyBhdHRyaWJ1dGVzICsgIil8W146XXxcXFxcLikqfC4qKSlcXCl8KSIsDQoNCgkvLyBGb3IgbWF0Y2hFeHByLlBPUyBhbmQgbWF0Y2hFeHByLm5lZWRzQ29udGV4dA0KCXBvcyA9ICI6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIgKyB3aGl0ZXNwYWNlICsNCgkJIiooKD86LVxcZCk/XFxkKikiICsgd2hpdGVzcGFjZSArICIqXFwpfCkoPz1bXi1dfCQpIiwNCg0KCS8vIExlYWRpbmcgYW5kIG5vbi1lc2NhcGVkIHRyYWlsaW5nIHdoaXRlc3BhY2UsIGNhcHR1cmluZyBzb21lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMgcHJlY2VkaW5nIHRoZSBsYXR0ZXINCglydHJpbSA9IG5ldyBSZWdFeHAoICJeIiArIHdoaXRlc3BhY2UgKyAiK3woKD86XnxbXlxcXFxdKSg/OlxcXFwuKSopIiArIHdoaXRlc3BhY2UgKyAiKyQiLCAiZyIgKSwNCg0KCXJjb21tYSA9IG5ldyBSZWdFeHAoICJeIiArIHdoaXRlc3BhY2UgKyAiKiwiICsgd2hpdGVzcGFjZSArICIqIiApLA0KCXJjb21iaW5hdG9ycyA9IG5ldyBSZWdFeHAoICJeIiArIHdoaXRlc3BhY2UgKyAiKihbXFx4MjBcXHRcXHJcXG5cXGY+K35dKSIgKyB3aGl0ZXNwYWNlICsgIioiICksDQoJcnBzZXVkbyA9IG5ldyBSZWdFeHAoIHBzZXVkb3MgKSwNCg0KCS8vIEVhc2lseS1wYXJzZWFibGUvcmV0cmlldmFibGUgSUQgb3IgVEFHIG9yIENMQVNTIHNlbGVjdG9ycw0KCXJxdWlja0V4cHIgPSAvXig/OiMoW1x3XC1dKyl8KFx3Kyl8XC4oW1x3XC1dKykpJC8sDQoNCglybm90ID0gL146bm90LywNCglyc2libGluZyA9IC9bXHgyMFx0XHJcblxmXSpbK35dLywNCglyZW5kc1dpdGhOb3QgPSAvOm5vdFwoJC8sDQoNCglyaGVhZGVyID0gL2hcZC9pLA0KCXJpbnB1dHMgPSAvaW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbi9pLA0KDQoJcmJhY2tzbGFzaCA9IC9cXCg/IVxcKS9nLA0KDQoJbWF0Y2hFeHByID0gew0KCQkiSUQiOiBuZXcgUmVnRXhwKCAiXiMoIiArIGNoYXJhY3RlckVuY29kaW5nICsgIikiICksDQoJCSJDTEFTUyI6IG5ldyBSZWdFeHAoICJeXFwuKCIgKyBjaGFyYWN0ZXJFbmNvZGluZyArICIpIiApLA0KCQkiTkFNRSI6IG5ldyBSZWdFeHAoICJeXFxbbmFtZT1bJ1wiXT8oIiArIGNoYXJhY3RlckVuY29kaW5nICsgIilbJ1wiXT9cXF0iICksDQoJCSJUQUciOiBuZXcgUmVnRXhwKCAiXigiICsgY2hhcmFjdGVyRW5jb2RpbmcucmVwbGFjZSggInciLCAidyoiICkgKyAiKSIgKSwNCgkJIkFUVFIiOiBuZXcgUmVnRXhwKCAiXiIgKyBhdHRyaWJ1dGVzICksDQoJCSJQU0VVRE8iOiBuZXcgUmVnRXhwKCAiXiIgKyBwc2V1ZG9zICksDQoJCSJQT1MiOiBuZXcgUmVnRXhwKCBwb3MsICJpIiApLA0KCQkiQ0hJTEQiOiBuZXcgUmVnRXhwKCAiXjoob25seXxudGh8Zmlyc3R8bGFzdCktY2hpbGQoPzpcXCgiICsgd2hpdGVzcGFjZSArDQoJCQkiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIgKyB3aGl0ZXNwYWNlICsgIiooPzooWystXXwpIiArIHdoaXRlc3BhY2UgKw0KCQkJIiooXFxkKyl8KSkiICsgd2hpdGVzcGFjZSArICIqXFwpfCkiLCAiaSIgKSwNCgkJLy8gRm9yIHVzZSBpbiBsaWJyYXJpZXMgaW1wbGVtZW50aW5nIC5pcygpDQoJCSJuZWVkc0NvbnRleHQiOiBuZXcgUmVnRXhwKCAiXiIgKyB3aGl0ZXNwYWNlICsgIipbPit+XXwiICsgcG9zLCAiaSIgKQ0KCX0sDQoNCgkvLyBTdXBwb3J0DQoNCgkvLyBVc2VkIGZvciB0ZXN0aW5nIHNvbWV0aGluZyBvbiBhbiBlbGVtZW50DQoJYXNzZXJ0ID0gZnVuY3Rpb24oIGZuICkgew0KCQl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQoNCgkJdHJ5IHsNCgkJCXJldHVybiBmbiggZGl2ICk7DQoJCX0gY2F0Y2ggKGUpIHsNCgkJCXJldHVybiBmYWxzZTsNCgkJfSBmaW5hbGx5IHsNCgkJCS8vIHJlbGVhc2UgbWVtb3J5IGluIElFDQoJCQlkaXYgPSBudWxsOw0KCQl9DQoJfSwNCg0KCS8vIENoZWNrIGlmIGdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikgcmV0dXJucyBvbmx5IGVsZW1lbnRzDQoJYXNzZXJ0VGFnTmFtZU5vQ29tbWVudHMgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsNCgkJZGl2LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVDb21tZW50KCIiKSApOw0KCQlyZXR1cm4gIWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aDsNCgl9KSwNCg0KCS8vIENoZWNrIGlmIGdldEF0dHJpYnV0ZSByZXR1cm5zIG5vcm1hbGl6ZWQgaHJlZiBhdHRyaWJ1dGVzDQoJYXNzZXJ0SHJlZk5vdE5vcm1hbGl6ZWQgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsNCgkJZGl2LmlubmVySFRNTCA9ICI8YSBocmVmPScjJz48L2E+IjsNCgkJcmV0dXJuIGRpdi5maXJzdENoaWxkICYmIHR5cGVvZiBkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUgIT09IHN0cnVuZGVmaW5lZCAmjg0KCQkJZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikgPT09ICIjIjsNCgl9KSwNCg0KCS8vIENoZWNrIGlmIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIHJldHJpZXZlZCBieSBhdHRyaWJ1dGUgbm9kZXMNCglhc3NlcnRBdHRyaWJ1dGVzID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7DQoJCWRpdi5pbm5lckhUTUwgPSAiPHNlbGVjdD48L3NlbGVjdD4iOw0KCQl2YXIgdHlwZSA9IHR5cGVvZiBkaXYubGFzdENoaWxkLmdldEF0dHJpYnV0ZSgibXVsdGlwbGUiKTsNCgkJLy8gSUU4IHJldHVybnMgYSBzdHJpbmcgZm9yIHNvbWUgYXR0cmlidXRlcyBldmVuIHdoZW4gbm90IHByZXNlbnQNCgkJcmV0dXJuIHR5cGUgIT09ICJib29sZWFuIiAmJiB0eXBlICE9PSAic3RyaW5nIjsNCgl9KSwNCg0KCS8vIENoZWNrIGlmIGdldEVsZW1lbnRzQnlDbGFzc05hbWUgY2FuIGJlIHRydXN0ZWQNCglhc3NlcnRVc2FibGVDbGFzc05hbWUgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsNCgkJLy8gT3BlcmEgY2FuJ3QgZmluZCBhIHNlY29uZCBjbGFzc25hbWUgKGluIDkuNikNCgkJZGl2LmlubmVySFRNTCA9ICI8ZGl2IGNsYXNzPSdoaWRkZW4gZSc+PC9kaXY+PGRpdiBjbGFzcz0naGlkZGVuJz48L2Rpdj4iOw0KCQlpZiAoICFkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSB8fCAhZGl2LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGggKSB7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCg0KCQkvLyBTYWZhcmkgMy4yIGNhY2hlcyBjbGFzcyBhdHRyaWJ1dGVzIGFuZCBkb2Vzbid0IGNhdGNoIGNoYW5nZXMNCgkJZGl2Lmxhc3RDaGlsZC5jbGFzc05hbWUgPSAiZSI7DQoJCXJldHVybiBkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aCA9PT0gMjsNCgl9KSwNCg0KCS8vIENoZWNrIGlmIGdldEVsZW1lbnRCeUlkIHJldHVybnMgZWxlbWVudHMgYnkgbmFtZQ0KCS8vIENoZWNrIGlmIGdldEVsZW1lbnRzQnlOYW1lIHByaXZpbGVnZXMgZm9ybSBjb250cm9scyBvciByZXR1cm5zIGVsZW1lbnRzIGJ5IElEDQoJYXNzZXJ0VXNhYmxlTmFtZSA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkgew0KCQkvLyBJbmplY3QgY29udGVudA0KCQlkaXYuaWQgPSBleHBhbmRvICsgMDsNCgkJZGl2LmlubmVySFRNTCA9ICI8YSBuYW1lPSciICsgZXhwYW5kbyArICInPjwvYT48ZGl2IG5hbWU9JyIgKyBleHBhbmRvICsgIic+PC9kaXY+IjsNCgkJZG9jRWxlbS5pbnNlcnRCZWZvcmUoIGRpdiwgZG9jRWxlbS5maXJzdENoaWxkICk7DQoNCgkJLy8gVGVzdA0KCQl2YXIgcGFzcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lICYmDQoJCQkvLyBidWdneSBicm93c2VycyB3aWxsIHJldHVybiBmZXdlciB0aGFuIHRoZSBjb3JyZWN0IDINCgkJCWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCBleHBhbmRvICkubGVuZ3RoID09PSAyICsNCgkJCS8vIGJ1Z2d5IGJyb3dzZXJzIHdpbGwgcmV0dXJuIG1vcmUgdGhhbiB0aGUgY29ycmVjdCAwDQoJCQlkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSggZXhwYW5kbyArIDAgKS5sZW5ndGg7DQoJCWFzc2VydEdldElkTm90TmFtZSA9ICFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggZXhwYW5kbyApOw0KDQoJCS8vIENsZWFudXANCgkJZG9jRWxlbS5yZW1vdmVDaGlsZCggZGl2ICk7DQoNCgkJcmV0dXJuIHBhc3M7DQoJfSk7DQoNCi8vIElmIHNsaWNlIGlzIG5vdCBhdmFpbGFibGUsIHByb3ZpZGUgYSBiYWNrdXANCnRyeSB7DQoJc2xpY2UuY2FsbCggZG9jRWxlbS5jaGlsZE5vZGVzLCAwIClbMF0ubm9kZVR5cGU7DQp9IGNhdGNoICggZSApIHsNCglzbGljZSA9IGZ1bmN0aW9uKCBpICkgew0KCQl2YXIgZWxlbSwNCgkJCXJlc3VsdHMgPSBbXTsNCgkJZm9yICggOyAoZWxlbSA9IHRoaXNbaV0pOyBpKysgKSB7DQoJCQlyZXN1bHRzLnB1c2goIGVsZW0gKTsNCgkJfQ0KCQlyZXR1cm4gcmVzdWx0czsNCgl9Ow0KfQ0KDQpmdW5jdGlvbiBTaXp6bGUoIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICkgew0KCXJlc3VsdHMgPSByZXN1bHRzIHx8IFtdOw0KCWNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50Ow0KCXZhciBtYXRjaCwgZWxlbSwgeG1sLCBtLA0KCQlub2RlVHlwZSA9IGNvbnRleHQubm9kZVR5cGU7DQoNCglpZiAoICFzZWxlY3RvciB8fCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgew0KCQlyZXR1cm4gcmVzdWx0czsNCgl9DQoNCglpZiAoIG5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICkgew0KCQlyZXR1cm4gW107DQoJfQ0KDQoJeG1sID0gaXNYTUwoIGNvbnRleHQgKTsNCg0KCWlmICggIXhtbCAmJiAhc2VlZCApIHsNCgkJaWYgKCAobWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICkpICkgew0KCQkJLy8gU3BlZWQtdXA6IFNpenpsZSgiI0lEIikNCgkJCWlmICggKG0gPSBtYXRjaFsxXSkgKSB7DQoJCQkJaWYgKCBub2RlVHlwZSA9PT0gOSApIHsNCgkJCQkJZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKTsNCgkJCQkJLy8gQ2hlY2sgcGFyZW50Tm9kZSB0byBjYXRjaCB3aGVuIEJsYWNrYmVycnkgNC42IHJldHVybnMNCgkJCQkJLy8gbm9kZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIGluIHRoZSBkb2N1bWVudCAjNjk2Mw0KCQkJCQlpZiAoIGVsZW0gJiYgZWxlbS5wYXJlbnROb2RlICkgew0KCQkJCQkJLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIElFLCBPcGVyYSwgYW5kIFdlYmtpdCByZXR1cm4gaXRlbXMNCgkJCQkJCS8vIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRA0KCQkJCQkJaWYgKCBlbGVtLmlkID09PSBtICkgew0KCQkJCQkJCXJlc3VsdHMucHVzaCggZWxlbSApOw0KCQkJCQkJCXJldHVybiByZXN1bHRzOw0KCQkJCQkJfQ0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJcmV0dXJuIHJlc3VsdHM7DQoJCQkJCX0NCgkJCQl9IGVsc2Ugew0KCQkJCQkvLyBDb250ZXh0IGlzIG5vdCBhIGRvY3VtZW50DQoJCQkJCWlmICggY29udGV4dC5vd25lckRvY3VtZW50ICYmIChlbGVtID0gY29udGV4dC5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtICkpICYmDQoJCQkJCQljb250YWlucyggY29udGV4dCwgZWxlbSApICYmIGVsZW0uaWQgPT09IG0gKSB7DQoJCQkJCQlyZXN1bHRzLnB1c2goIGVsZW0gKTsNCgkJCQkJCXJldHVybiByZXN1bHRzOw0KCQkJCQl9DQoJCQkJfQ0KDQoJCQkvLyBTcGVlZC11cDogU2l6emxlKCJUQUciKQ0KCQkJfSBlbHNlIGlmICggbWF0Y2hbMl0gKSB7DQoJCQkJcHVzaC5hcHBseSggcmVzdWx0cywgc2xpY2UuY2FsbChjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBzZWxlY3RvciApLCAwKSApOw0KCQkJCXJldHVybiByZXN1bHRzOw0KDQoJCQkvLyBTcGVlZC11cDogU2l6emxlKCIuQ0xBU1MiKQ0KCQkJfSBlbHNlIGlmICggKG0gPSBtYXRjaFszXSkgJiYgYXNzZXJ0VXNhYmxlQ2xhc3NOYW1lICYmIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApIHsNCgkJCQlwdXNoLmFwcGx5KCByZXN1bHRzLCBzbGljZS5jYWxsKGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggbSApLCAwKSApOw0KCQkJCXJldHVybiByZXN1bHRzOw0KCQkJfQ0KCQl9DQoJfQ0KDQoJLy8gQWxsIG90aGVycw0KCXJldHVybiBzZWxlY3QoIHNlbGVjdG9yLnJlcGxhY2UoIHJ0cmltLCAiJDEiICksIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQsIHhtbCApOw0KfQ0KDQpTaXp6bGUubWF0Y2hlcyA9IGZ1bmN0aW9uKCBleHByLCBlbGVtZW50cyApIHsNCglyZXR1cm4gU2l6emxlKCBleHByLCBudWxsLCBudWxsLCBlbGVtZW50cyApOw0KfTsNCg0KU2l6emxlLm1hdGNoZXNTZWxlY3RvciA9IGZ1bmN0aW9uKCBlbGVtLCBleHByICkgew0KCXJldHVybiBTaXp6bGUoIGV4cHIsIG51bGwsIG51bGwsIFsgZWxlbSBdICkubGVuZ3RoID4gMDsNCn07DQoNCi8vIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgaW5wdXQgdHlwZXMNCmZ1bmN0aW9uIGNyZWF0ZUlucHV0UHNldWRvKCB0eXBlICkgew0KCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsNCgkJdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7DQoJCXJldHVybiBuYW1lID09PSAiaW5wdXQiICYmIGVsZW0udHlwZSA9PT0gdHlwZTsNCgl9Ow0KfQ0KDQovLyBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIGJ1dHRvbnMNCmZ1bmN0aW9uIGNyZWF0ZUJ1dHRvblBzZXVkbyggdHlwZSApIHsNCglyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7DQoJCXZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOw0KCQlyZXR1cm4gKG5hbWUgPT09ICJpbnB1dCIgfHwgbmFtZSA9PT0gImJ1dHRvbiIpICYmIGVsZW0udHlwZSA9PT0gdHlwZTsNCgl9Ow0KfQ0KDQovLyBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIHBvc2l0aW9uYWxzDQpmdW5jdGlvbiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmbiApIHsNCglyZXR1cm4gbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBhcmd1bWVudCApIHsNCgkJYXJndW1lbnQgPSArYXJndW1lbnQ7DQoJCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7DQoJCQl2YXIgaiwNCgkJCQltYXRjaEluZGV4ZXMgPSBmbiggW10sIHNlZWQubGVuZ3RoLCBhcmd1bWVudCApLA0KCQkJCWkgPSBtYXRjaEluZGV4ZXMubGVuZ3RoOw0KDQoJCQkvLyBNYXRjaCBlbGVtZW50cyBmb3VuZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4ZXMNCgkJCXdoaWxlICggaS0tICkgew0KCQkJCWlmICggc2VlZFsgKGogPSBtYXRjaEluZGV4ZXNbaV0pIF0gKSB7DQoJCQkJCXNlZWRbal0gPSAhKG1hdGNoZXNbal0gPSBzZWVkW2pdKTsNCgkJCQl9DQoJCQl9DQoJCX0pOw0KCX0pOw0KfQ0KDQovKioNCiAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHJldHJpZXZpbmcgdGhlIHRleHQgdmFsdWUgb2YgYW4gYXJyYXkgb2YgRE9NIG5vZGVzDQogKiBAcGFyYW0ge0FycmF5fEVsZW1lbnR9IGVsZW0NCiAqLw0KZ2V0VGV4dCA9IFNpenpsZS5nZXRUZXh0ID0gZnVuY3Rpb24oIGVsZW0gKSB7DQoJdmFyIG5vZGUsDQoJCXJldCA9ICIiLA0KCQlpID0gMCwNCgkJbm9kZVR5cGUgPSBlbGVtLm5vZGVUeXBlOw0KDQoJaWYgKCBub2RlVHlwZSApIHsNCgkJaWYgKCBub2RlVHlwZSA9PT0gMSB8fCBub2RlVHlwZSA9PT0gOSB8fCBub2RlVHlwZSA9PT0gMTEgKSB7DQoJCQkvLyBVc2UgdGV4dENvbnRlbnQgZm9yIGVsZW1lbnRzDQoJCQkvLyBpbm5lclRleHQgdXNhZ2UgcmVtb3ZlZCBmb3IgY29uc2lzdGVuY3kgb2YgbmV3IGxpbmVzIChzZWUgIzExMTUzKQ0KCQkJaWYgKCB0eXBlb2YgZWxlbS50ZXh0Q29udGVudCA9PT0gInN0cmluZyIgKSB7DQoJCQkJcmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7DQoJCQl9IGVsc2Ugew0KCQkJCS8vIFRyYXZlcnNlIGl0cyBjaGlsZHJlbg0KCQkJCWZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkgew0KCQkJCQlyZXQgKz0gZ2V0VGV4dCggZWxlbSApOw0KCQkJCX0NCgkJCX0NCgkJfSBlbHNlIGlmICggbm9kZVR5cGUgPT09IDMgfHwgbm9kZVR5cGUgPT09IDQgKSB7DQoJCQlyZXR1cm4gZWxlbS5ub2RlVmFsdWU7DQoJCX0NCgkJLy8gRG8gbm90IGluY2x1ZGUgY29tbWVudCBvciBwcm9jZXNzaW5nIGluc3RydWN0aW9uIG5vZGVzDQoJfSBlbHNlIHsNCg0KCQkvLyBJZiBubyBub2RlVHlwZSwgdGhpcyBpcyBleHBlY3RlZCB0byBiZSBhbiBhcnJheQ0KCQlmb3IgKCA7IChub2RlID0gZWxlbVtpXSk7IGkrKyApIHsNCgkJCS8vIERvIG5vdCB0cmF2ZXJzZSBjb21tZW50IG5vZGVzDQoJCQlyZXQgKz0gZ2V0VGV4dCggbm9kZSApOw0KCQl9DQoJfQ0KCXJldHVybiByZXQ7DQp9Ow0KDQppc1hNTCA9IFNpenpsZS5pc1hNTCA9IGZ1bmN0aW9uKCBlbGVtICkgew0KCS8vIGRvY3VtZW50RWxlbWVudCBpcyB2ZXJpZmllZCBmb3IgY2FzZXMgd2hlcmUgaXQgZG9lc24ndCB5ZXQgZXhpc3QNCgkvLyAoc3VjaCBhcyBsb2FkaW5nIGlmcmFtZXMgaW4gSUUgLSAjNDgzMykNCgl2YXIgZG9jdW1lbnRFbGVtZW50ID0gZWxlbSAmJiAoZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0pLmRvY3VtZW50RWxlbWVudDsNCglyZXR1cm4gZG9jdW1lbnRFbGVtZW50ID8gZG9jdW1lbnRFbGVtZW50Lm5vZGVOYW1lICE9PSAiSFRNTCIgOiBmYWxzZTsNCn07DQoNCi8vIEVsZW1lbnQgY29udGFpbnMgYW5vdGhlcg0KY29udGFpbnMgPSBTaXp6bGUuY29udGFpbnMgPSBkb2NFbGVtLmNvbnRhaW5zID8NCglmdW5jdGlvbiggYSwgYiApIHsNCgkJdmFyIGFkb3duID0gYS5ub2RlVHlwZSA9PT0gOSA/IGEuZG9jdW1lbnRFbGVtZW50IDogYSwNCgkJCWJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlOw0KCQlyZXR1cm4gYSA9PT0gYnVwIHx8ICEhKCBidXAgJiYgYnVwLm5vZGVUeXBlID09PSAxICYmIGFkb3duLmNvbnRhaW5zICYmIGFkb3duLmNvbnRhaW5zKGJ1cCkgKTsNCgl9IDoNCglkb2NFbGVtLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uID8NCglmdW5jdGlvbiggYSwgYiApIHsNCgkJcmV0dXJuIGIgJiYgISEoIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGIgKSAmIDE2ICk7DQoJfSA6DQoJZnVuY3Rpb24oIGEsIGIgKSB7DQoJCXdoaWxlICggKGIgPSBiLnBhcmVudE5vZGUpICkgew0KCQkJaWYgKCBiID09PSBhICkgew0KCQkJCXJldHVybiB0cnVlOw0KCQkJfQ0KCQl9DQoJCXJldHVybiBmYWxzZTsNCgl9Ow0KDQpTaXp6bGUuYXR0ciA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgew0KCXZhciB2YWwsDQoJCXhtbCA9IGlzWE1MKCBlbGVtICk7DQoNCglpZiAoICF4bWwgKSB7DQoJCW5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7DQoJfQ0KCWlmICggKHZhbCA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZSBdKSApIHsNCgkJcmV0dXJuIHZhbCggZWxlbSApOw0KCX0NCglpZiAoIHhtbCB8fCBhc3NlcnRBdHRyaWJ1dGVzICkgew0KCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTsNCgl9DQoJdmFsID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICk7DQoJcmV0dXJuIHZhbCA/DQoJCXR5cGVvZiBlbGVtWyBuYW1lIF0gPT09ICJib29sZWFuIiA/DQoJCQllbGVtWyBuYW1lIF0gPyBuYW1lIDogbnVsbCA6DQoJCQl2YWwuc3BlY2lmaWVkID8gdmFsLnZhbHVlIDogbnVsbCA6DQoJCW51bGw7DQp9Ow0KDQpFeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHsNCg0KCS8vIENhbiBiZSBhZGp1c3RlZCBieSB0aGUgdXNlcg0KCWNhY2hlTGVuZ3RoOiA1MCwNCg0KCWNyZWF0ZVBzZXVkbzogbWFya0Z1bmN0aW9uLA0KDQoJbWF0Y2g6IG1hdGNoRXhwciwNCg0KCS8vIElFNi83IHJldHVybiBhIG1vZGlmaWVkIGhyZWYNCglhdHRySGFuZGxlOiBhc3NlcnRIcmVmTm90Tm9ybWFsaXplZCA/DQoJCXt9IDoNCgkJew0KCQkJImhyZWYiOiBmdW5jdGlvbiggZWxlbSApIHsNCgkJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoICJocmVmIiwgMiApOw0KCQkJfSwNCgkJCSJ0eXBlIjogZnVuY3Rpb24oIGVsZW0gKSB7DQoJCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCJ0eXBlIik7DQoJCQl9DQoJCX0sDQoNCglmaW5kOiB7DQoJCSJJRCI6IGFzc2VydEdldElkTm90TmFtZSA/DQoJCQlmdW5jdGlvbiggaWQsIGNvbnRleHQsIHhtbCApIHsNCgkJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSBzdHJ1bmRlZmluZWQgJiYgIXhtbCApIHsNCgkJCQkJdmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBpZCApOw0KCQkJCQkvLyBDaGVjayBwYXJlbnROb2RlIHRvIGNhdGNoIHdoZW4gQmxhY2tiZXJyeSA0LjYgcmV0dXJucw0KCQkJCQkvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50ICM2OTYzDQoJCQkJCXJldHVybiBtICYmIG0ucGFyZW50Tm9kZSA/IFttXSA6IFtdOw0KCQkJCX0NCgkJCX0gOg0KCQkJZnVuY3Rpb24oIGlkLCBjb250ZXh0LCB4bWwgKSB7DQoJCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gc3RydW5kZWZpbmVkICYmICF4bWwgKSB7DQoJCQkJCXZhciBtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTsNCg0KCQkJCQlyZXR1cm4gbSA/DQoJCQkJCQltLmlkID09PSBpZCB8fCB0eXBlb2YgbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSBzdHJ1bmRlZmluZWQgJiYgbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpLnZhbHVlID09PSBpZCA/DQoJCQkJCQkJW21dIDoNCgkJCQkJCQl1bmRlZmluZWQgOg0KCQkJCQkJW107DQoJCQkJfQ0KCQkJfSwNCg0KCQkiVEFHIjogYXNzZXJ0VGFnTmFtZU5vQ29tbWVudHMgPw0KCQkJZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHsNCgkJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBzdHJ1bmRlZmluZWQgKSB7DQoJCQkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgKTsNCgkJCQl9DQoJCQl9IDoNCgkJCWZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7DQoJCQkJdmFyIHJlc3VsdHMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgKTsNCg0KCQkJCS8vIEZpbHRlciBvdXQgcG9zc2libGUgY29tbWVudHMNCgkJCQlpZiAoIHRhZyA9PT0gIioiICkgew0KCQkJCQl2YXIgZWxlbSwNCgkJCQkJCXRtcCA9IFtdLA0KCQkJCQkJaSA9IDA7DQoNCgkJCQkJZm9yICggOyAoZWxlbSA9IHJlc3VsdHNbaV0pOyBpKysgKSB7DQoJCQkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7DQoJCQkJCQkJdG1wLnB1c2goIGVsZW0gKTsNCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCXJldHVybiB0bXA7DQoJCQkJfQ0KCQkJCXJldHVybiByZXN1bHRzOw0KCQkJfSwNCg0KCQkiTkFNRSI6IGFzc2VydFVzYWJsZU5hbWUgJiYgZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHsNCgkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeU5hbWUgIT09IHN0cnVuZGVmaW5lZCApIHsNCgkJCQlyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZSggbmFtZSApOw0KCQkJfQ0KCQl9LA0KDQoJCSJDTEFTUyI6IGFzc2VydFVzYWJsZUNsYXNzTmFtZSAmJiBmdW5jdGlvbiggY2xhc3NOYW1lLCBjb250ZXh0LCB4bWwgKSB7DQoJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgIT09IHN0cnVuZGVmaW5lZCAmJiAheG1sICkgew0KCQkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIGNsYXNzTmFtZSApOw0KCQkJfQ0KCQl9DQoJfSwNCg0KCXJlbGF0aXZlOiB7DQoJCSI+IjogeyBkaXI6ICJwYXJlbnROb2RlIiwgZmlyc3Q6IHRydWUgfSwNCgkJIiAiOiB7IGRpcjogInBhcmVudE5vZGUiIH0sDQoJCSIrIjogeyBkaXI6ICJwcmV2aW91c1NpYmxpbmciLCBmaXJzdDogdHJ1ZSB9LA0KCQkifiI6IHsgZGlyOiAicHJldmlvdXNTaWJsaW5nIiB9DQoJfSwNCg0KCXByZUZpbHRlcjogew0KCQkiQVRUUiI6IGZ1bmN0aW9uKCBtYXRjaCApIHsNCgkJCW1hdGNoWzFdID0gbWF0Y2hbMV0ucmVwbGFjZSggcmJhY2tzbGFzaCwgIiIgKTsNCg0KCQkJLy8gTW92ZSB0aGUgZ2l2ZW4gdmFsdWUgdG8gbWF0Y2hbM10gd2hldGhlciBxdW90ZWQgb3IgdW5xdW90ZWQNCgkJCW1hdGNoWzNdID0gKCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCAiIiApLnJlcGxhY2UoIHJiYWNrc2xhc2gsICIiICk7DQoNCgkJCWlmICggbWF0Y2hbMl0gPT09ICJ+PSIgKSB7DQoJCQkJbWF0Y2hbM10gPSAiICIgKyBtYXRjaFszXSArICIgIjsNCgkJCX0NCg0KCQkJcmV0dXJuIG1hdGNoLnNsaWNlKCAwLCA0ICk7DQoJCX0sDQoNCgkJIkNISUxEIjogZnVuY3Rpb24oIG1hdGNoICkgew0KCQkJLyogbWF0Y2hlcyBmcm9tIG1hdGNoRXhwclsiQ0hJTEQiXQ0KCQkJCTEgdHlwZSAob25seXxudGh8Li4uKQ0KCQkJCTIgYXJndW1lbnQgKGV2ZW58b2RkfFxkKnxcZCpuKFsrLV1cZCspP3wuLi4pDQoJCQkJMyB4bi1jb21wb25lbnQgb2YgeG4reSBhcmd1bWVudCAoWystXT9cZCpufCkNCgkJCQk0IHNpZ24gb2YgeG4tY29tcG9uZW50DQoJCQkJNSB4IG9mIHhuLWNvbXBvbmVudA0KCQkJCTYgc2lnbiBvZiB5LWNvbXBvbmVudA0KCQkJCTcgeSBvZiB5LWNvbXBvbmVudA0KCQkJKi8NCgkJCW1hdGNoWzFdID0gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKTsNCg0KCQkJaWYgKCBtYXRjaFsxXSA9PT0gIm50aCIgKSB7DQoJCQkJLy8gbnRoLWNoaWxkIHJlcXVpcmVzIGFyZ3VtZW50DQoJCQkJaWYgKCAhbWF0Y2hbMl0gKSB7DQoJCQkJCVNpenpsZS5lcnJvciggbWF0Y2hbMF0gKTsNCgkJCQl9DQoNCgkJCQkvLyBudW1lcmljIHggYW5kIHkgcGFyYW1ldGVycyBmb3IgRXhwci5maWx0ZXIuQ0hJTEQNCgkJCQkvLyByZW1lbWJlciB0aGF0IGZhbHNlL3RydWUgY2FzdCByZXNwZWN0aXZlbHkgdG8gMC8xDQoJCQkJbWF0Y2hbM10gPSArKCBtYXRjaFszXSA/IG1hdGNoWzRdICsgKG1hdGNoWzVdIHx8IDEpIDogMiAqICggbWF0Y2hbMl0gPT09ICJldmVuIiB8fCBtYXRjaFsyXSA9PT0gIm9kZCIgKSApOw0KCQkJCW1hdGNoWzRdID0gKyggKCBtYXRjaFs2XSArIG1hdGNoWzddICkgfHwgbWF0Y2hbMl0gPT09ICJvZGQiICk7DQoNCgkJCS8vIG90aGVyIHR5cGVzIHByb2hpYml0IGFyZ3VtZW50cw0KCQkJfSBlbHNlIGlmICggbWF0Y2hbMl0gKSB7DQoJCQkJU2l6emxlLmVycm9yKCBtYXRjaFswXSApOw0KCQkJfQ0KDQoJCQlyZXR1cm4gbWF0Y2g7DQoJCX0sDQoNCgkJIlBTRVVETyI6IGZ1bmN0aW9uKCBtYXRjaCApIHsNCgkJCXZhciB1bnF1b3RlZCwgZXhjZXNzOw0KCQkJaWYgKCBtYXRjaEV4cHJbIkNISUxEIl0udGVzdCggbWF0Y2hbMF0gKSApIHsNCgkJCQlyZXR1cm4gbnVsbDsNCgkJCX0NCg0KCQkJaWYgKCBtYXRjaFszXSApIHsNCgkJCQltYXRjaFsyXSA9IG1hdGNoWzNdOw0KCQkJfSBlbHNlIGlmICggKHVucXVvdGVkID0gbWF0Y2hbNF0pICkgew0KCQkJCS8vIE9ubHkgY2hlY2sgYXJndW1lbnRzIHRoYXQgY29udGFpbiBhIHBzZXVkbw0KCQkJCWlmICggcnBzZXVkby50ZXN0KHVucXVvdGVkKSAmjg0KCQkJCQkvLyBHZXQgZXhjZXNzIGZyb20gdG9rZW5pemUgKHJlY3Vyc2l2ZWx5KQ0KCQkJCQkoZXhjZXNzID0gdG9rZW5pemUoIHVucXVvdGVkLCB0cnVlICkpICYmDQoJCQkJCS8vIGFkdmFuY2UgdG8gdGhlIG5leHQgY2xvc2luZyBwYXJlbnRoZXNpcw0KCQkJCQkoZXhjZXNzID0gdW5xdW90ZWQuaW5kZXhPZiggIikiLCB1bnF1b3RlZC5sZW5ndGggLSBleGNlc3MgKSAtIHVucXVvdGVkLmxlbmd0aCkgKSB7DQoNCgkJCQkJLy8gZXhjZXNzIGlzIGEgbmVnYXRpdmUgaW5kZXgNCgkJCQkJdW5xdW90ZWQgPSB1bnF1b3RlZC5zbGljZSggMCwgZXhjZXNzICk7DQoJCQkJCW1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAsIGV4Y2VzcyApOw0KCQkJCX0NCgkJCQltYXRjaFsyXSA9IHVucXVvdGVkOw0KCQkJfQ0KDQoJCQkvLyBSZXR1cm4gb25seSBjYXB0dXJlcyBuZWVkZWQgYnkgdGhlIHBzZXVkbyBmaWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVudCkNCgkJCXJldHVybiBtYXRjaC5zbGljZSggMCwgMyApOw0KCQl9DQoJfSwNCg0KCWZpbHRlcjogew0KCQkiSUQiOiBhc3NlcnRHZXRJZE5vdE5hbWUgPw0KCQkJZnVuY3Rpb24oIGlkICkgew0KCQkJCWlkID0gaWQucmVwbGFjZSggcmJhY2tzbGFzaCwgIiIgKTsNCgkJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7DQoJCQkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSgiaWQiKSA9PT0gaWQ7DQoJCQkJfTsNCgkJCX0gOg0KCQkJZnVuY3Rpb24oIGlkICkgew0KCQkJCWlkID0gaWQucmVwbGFjZSggcmJhY2tzbGFzaCwgIiIgKTsNCgkJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7DQoJCQkJCXZhciBub2RlID0gdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSAhPT0gc3RydW5kZWZpbmVkICYmIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTsNCgkJCQkJcmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gaWQ7DQoJCQkJfTsNCgkJCX0sDQoNCgkJIlRBRyI6IGZ1bmN0aW9uKCBub2RlTmFtZSApIHsNCgkJCWlmICggbm9kZU5hbWUgPT09ICIqIiApIHsNCgkJCQlyZXR1cm4gZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlOyB9Ow0KCQkJfQ0KCQkJbm9kZU5hbWUgPSBub2RlTmFtZS5yZXBsYWNlKCByYmFja3NsYXNoLCAiIiApLnRvTG93ZXJDYXNlKCk7DQoNCgkJCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsNCgkJCQlyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5vZGVOYW1lOw0KCQkJfTsNCgkJfSwNCg0KCQkiQ0xBU1MiOiBmdW5jdGlvbiggY2xhc3NOYW1lICkgew0KCQkJdmFyIHBhdHRlcm4gPSBjbGFzc0NhY2hlWyBleHBhbmRvIF1bIGNsYXNzTmFtZSArICIgIiBdOw0KDQoJCQlyZXR1cm4gcGF0dGVybiB8fA0KCQkJCShwYXR0ZXJuID0gbmV3IFJlZ0V4cCggIihefCIgKyB3aGl0ZXNwYWNlICsgIikiICsgY2xhc3NOYW1lICsgIigiICsgd2hpdGVzcGFjZSArICJ8JCkiICkpICYmDQoJCQkJY2xhc3NDYWNoZSggY2xhc3NOYW1lLCBmdW5jdGlvbiggZWxlbSApIHsNCgkJCQkJcmV0dXJuIHBhdHRlcm4udGVzdCggZWxlbS5jbGFzc05hbWUgfHwgKHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSAhPT0gc3RydW5kZWZpbmVkICYmIGVsZW0uZ2V0QXR0cmlidXRlKCJjbGFzcyIpKSB8fCAiIiApOw0KCQkJCX0pOw0KCQl9LA0KDQoJCSJBVFRSIjogZnVuY3Rpb24oIG5hbWUsIG9wZXJhdG9yLCBjaGVjayApIHsNCgkJCXJldHVybiBmdW5jdGlvbiggZWxlbSwgY29udGV4dCApIHsNCgkJCQl2YXIgcmVzdWx0ID0gU2l6emxlLmF0dHIoIGVsZW0sIG5hbWUgKTsNCg0KCQkJCWlmICggcmVzdWx0ID09IG51bGwgKSB7DQoJCQkJCXJldHVybiBvcGVyYXRvciA9PT0gIiE9IjsNCgkJCQl9DQoJCQkJaWYgKCAhb3BlcmF0b3IgKSB7DQoJCQkJCXJldHVybiB0cnVlOw0KCQkJCX0NCg0KCQkJCXJlc3VsdCArPSAiIjsNCg0KCQkJCXJldHVybiBvcGVyYXRvciA9PT0gIj0iID8gcmVzdWx0ID09PSBjaGVjayA6DQoJCQkJCW9wZXJhdG9yID09PSAiIT0iID8gcmVzdWx0ICE9PSBjaGVjayA6DQoJCQkJCW9wZXJhdG9yID09PSAiXj0iID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPT09IDAgOg0KCQkJCQlvcGVyYXRvciA9PT0gIio9IiA/IGNoZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVjayApID4gLTEgOg0KCQkJCQlvcGVyYXRvciA9PT0gIiQ9IiA/IGNoZWNrICYmIHJlc3VsdC5zdWJzdHIoIHJlc3VsdC5sZW5ndGggLSBjaGVjay5sZW5ndGggKSA9PT0gY2hlY2sgOg0KCQkJCQlvcGVyYXRvciA9PT0gIn49IiA/ICggIiAiICsgcmVzdWx0ICsgIiAiICkuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDoNCgkJCQkJb3BlcmF0b3IgPT09ICJ8PSIgPyByZXN1bHQgPT09IGNoZWNrIHx8IHJlc3VsdC5zdWJzdHIoIDAsIGNoZWNrLmxlbmd0aCArIDEgKSA9PT0gY2hlY2sgKyAiLSIgOg0KCQkJCQlmYWxzZTsNCgkJCX07DQoJCX0sDQoNCgkJIkNISUxEIjogZnVuY3Rpb24oIHR5cGUsIGFyZ3VtZW50LCBmaXJzdCwgbGFzdCApIHsNCg0KCQkJaWYgKCB0eXBlID09PSAibnRoIiApIHsNCgkJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7DQoJCQkJCXZhciBub2RlLCBkaWZmLA0KCQkJCQkJcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlOw0KDQoJCQkJCWlmICggZmlyc3QgPT09IDEgJiYgbGFzdCA9PT0gMCApIHsNCgkJCQkJCXJldHVybiB0cnVlOw0KCQkJCQl9DQoNCgkJCQkJaWYgKCBwYXJlbnQgKSB7DQoJCQkJCQlkaWZmID0gMDsNCgkJCQkJCWZvciAoIG5vZGUgPSBwYXJlbnQuZmlyc3RDaGlsZDsgbm9kZTsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcgKSB7DQoJCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgew0KCQkJCQkJCQlkaWZmKys7DQoJCQkJCQkJCWlmICggZWxlbSA9PT0gbm9kZSApIHsNCgkJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCQl9DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoNCgkJCQkJLy8gSW5jb3Jwb3JhdGUgdGhlIG9mZnNldCAob3IgY2FzdCB0byBOYU4pLCB0aGVuIGNoZWNrIGFnYWluc3QgY3ljbGUgc2l6ZQ0KCQkJCQlkaWZmIC09IGxhc3Q7DQoJCQkJCXJldHVybiBkaWZmID09PSBmaXJzdCB8fCAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApOw0KCQkJCX07DQoJCQl9DQoNCgkJCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsNCgkJCQl2YXIgbm9kZSA9IGVsZW07DQoNCgkJCQlzd2l0Y2ggKCB0eXBlICkgew0KCQkJCQljYXNlICJvbmx5IjoNCgkJCQkJY2FzZSAiZmlyc3QiOg0KCQkJCQkJd2hpbGUgKCAobm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nKSApIHsNCgkJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7DQoJCQkJCQkJCXJldHVybiBmYWxzZTsNCgkJCQkJCQl9DQoJCQkJCQl9DQoNCgkJCQkJCWlmICggdHlwZSA9PT0gImZpcnN0IiApIHsNCgkJCQkJCQlyZXR1cm4gdHJ1ZTsNCgkJCQkJCX0NCg0KCQkJCQkJbm9kZSA9IGVsZW07DQoNCgkJCQkJCS8qIGZhbGxzIHRocm91Z2ggKi8NCgkJCQkJY2FzZSAibGFzdCI6DQoJCQkJCQl3aGlsZSAoIChub2RlID0gbm9kZS5uZXh0U2libGluZykgKSB7DQoJCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgew0KCQkJCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KDQoJCQkJCQlyZXR1cm4gdHJ1ZTsNCgkJCQl9DQoJCQl9Ow0KCQl9LA0KDQoJCSJQU0VVRE8iOiBmdW5jdGlvbiggcHNldWRvLCBhcmd1bWVudCApIHsNCgkJCS8vIHBzZXVkby1jbGFzcyBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZQ0KCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNwc2V1ZG8tY2xhc3Nlcw0KCQkJLy8gUHJpb3JpdGl6ZSBieSBjYXNlIHNlbnNpdGl2aXR5IGluIGNhc2UgY3VzdG9tIHBzZXVkb3MgYXJlIGFkZGVkIHdpdGggdXBwZXJjYXNlIGxldHRlcnMNCgkJCS8vIFJlbWVtYmVyIHRoYXQgc2V0RmlsdGVycyBpbmhlcml0cyBmcm9tIHBzZXVkb3MNCgkJCXZhciBhcmdzLA0KCQkJCWZuID0gRXhwci5wc2V1ZG9zWyBwc2V1ZG8gXSB8fCBFeHByLnNldEZpbHRlcnNbIHBzZXVkby50b0xvd2VyQ2FzZSgpIF0gfHwNCgkJCQkJU2l6emxlLmVycm9yKCAidW5zdXBwb3J0ZWQgcHNldWRvOiAiICsgcHNldWRvICk7DQoNCgkJCS8vIFRoZSB1c2VyIG1heSB1c2UgY3JlYXRlUHNldWRvIHRvIGluZGljYXRlIHRoYXQNCgkJCS8vIGFyZ3VtZW50cyBhcmUgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgZmlsdGVyIGZ1bmN0aW9uDQoJCQkvLyBqdXN0IGFzIFNpenpsZSBkb2VzDQoJCQlpZiAoIGZuWyBleHBhbmRvIF0gKSB7DQoJCQkJcmV0dXJuIGZuKCBhcmd1bWVudCApOw0KCQkJfQ0KDQoJCQkvLyBCdXQgbWFpbnRhaW4gc3VwcG9ydCBmb3Igb2xkIHNpZ25hdHVyZXMNCgkJCWlmICggZm4ubGVuZ3RoID4gMSApIHsNCgkJCQlhcmdzID0gWyBwc2V1ZG8sIHBzZXVkbywgIiIsIGFyZ3VtZW50IF07DQoJCQkJcmV0dXJuIEV4cHIuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eSggcHNldWRvLnRvTG93ZXJDYXNlKCkgKSA/DQoJCQkJCW1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHsNCgkJCQkJCXZhciBpZHgsDQoJCQkJCQkJbWF0Y2hlZCA9IGZuKCBzZWVkLCBhcmd1bWVudCApLA0KCQkJCQkJCWkgPSBtYXRjaGVkLmxlbmd0aDsNCgkJCQkJCXdoaWxlICggaS0tICkgew0KCQkJCQkJCWlkeCA9IGluZGV4T2YuY2FsbCggc2VlZCwgbWF0Y2hlZFtpXSApOw0KCQkJCQkJCXNlZWRbIGlkeCBdID0gISggbWF0Y2hlc1sgaWR4IF0gPSBtYXRjaGVkW2ldICk7DQoJCQkJCQl9DQoJCQkJCX0pIDoNCgkJCQkJZnVuY3Rpb24oIGVsZW0gKSB7DQoJCQkJCQlyZXR1cm4gZm4oIGVsZW0sIDAsIGFyZ3MgKTsNCgkJCQkJfTsNCgkJCX0NCg0KCQkJcmV0dXJuIGZuOw0KCQl9DQoJfSwNCg0KCXBzZXVkb3M6IHsNCgkJIm5vdCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7DQoJCQkvLyBUcmltIHRoZSBzZWxlY3RvciBwYXNzZWQgdG8gY29tcGlsZQ0KCQkJLy8gdG8gYXZvaWQgdHJlYXRpbmcgbGVhZGluZyBhbmQgdHJhaWxpbmcNCgkJCS8vIHNwYWNlcyBhcyBjb21iaW5hdG9ycw0KCQkJdmFyIGlucHV0ID0gW10sDQoJCQkJcmVzdWx0cyA9IFtdLA0KCQkJCW1hdGNoZXIgPSBjb21waWxlKCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgIiQxIiApICk7DQoNCgkJCXJldHVybiBtYXRjaGVyWyBleHBhbmRvIF0gPw0KCQkJCW1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcywgY29udGV4dCwgeG1sICkgew0KCQkJCQl2YXIgZWxlbSwNCgkJCQkJCXVubWF0Y2hlZCA9IG1hdGNoZXIoIHNlZWQsIG51bGwsIHhtbCwgW10gKSwNCgkJCQkJCWkgPSBzZWVkLmxlbmd0aDsNCg0KCQkJCQkvLyBNYXRjaCBlbGVtZW50cyB1bm1hdGNoZWQgYnkgYG1hdGNoZXjgDQoJCQkJCXdoaWxlICggaS0tICkgew0KCQkJCQkJaWYgKCAoZWxlbSA9IHVubWF0Y2hlZFtpXSkgKSB7DQoJCQkJCQkJc2VlZFtpXSA9ICEobWF0Y2hlc1tpXSA9IGVsZW0pOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfSkgOg0KCQkJCWZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7DQoJCQkJCWlucHV0WzBdID0gZWxlbTsNCgkJCQkJbWF0Y2hlciggaW5wdXQsIG51bGwsIHhtbCwgcmVzdWx0cyApOw0KCQkJCQlyZXR1cm4gIXJlc3VsdHMucG9wKCk7DQoJCQkJfTsNCgkJfSksDQoNCgkJImhhcyI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7DQoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7DQoJCQkJcmV0dXJuIFNpenpsZSggc2VsZWN0b3IsIGVsZW0gKS5sZW5ndGggPiAwOw0KCQkJfTsNCgkJfSksDQoNCgkJImNvbnRhaW5zIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCB0ZXh0ICkgew0KCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgew0KCQkJCXJldHVybiAoIGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lclRleHQgfHwgZ2V0VGV4dCggZWxlbSApICkuaW5kZXhPZiggdGV4dCApID4gLTE7DQoJCQl9Ow0KCQl9KSwNCg0KCQkiZW5hYmxlZCI6IGZ1bmN0aW9uKCBlbGVtICkgew0KCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IGZhbHNlOw0KCQl9LA0KDQoJCSJkaXNhYmxlZCI6IGZ1bmN0aW9uKCBlbGVtICkgew0KCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWU7DQoJCX0sDQoNCgkJImNoZWNrZWQiOiBmdW5jdGlvbiggZWxlbSApIHsNCgkJCS8vIEluIENTUzMsIDpjaGVja2VkIHNob3VsZCByZXR1cm4gYm90aCBjaGVja2VkIGFuZCBzZWxlY3RlZCBlbGVtZW50cw0KCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWQNCgkJCXZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsNCgkJCXJldHVybiAobm9kZU5hbWUgPT09ICJpbnB1dCIgJiYgISFlbGVtLmNoZWNrZWQpIHx8IChub2RlTmFtZSA9PT0gIm9wdGlvbiIgJiYgISFlbGVtLnNlbGVjdGVkKTsNCgkJfSwNCg0KCQkic2VsZWN0ZWQiOiBmdW5jdGlvbiggZWxlbSApIHsNCgkJCS8vIEFjY2Vzc2luZyB0aGlzIHByb3BlcnR5IG1ha2VzIHNlbGVjdGVkLWJ5LWRlZmF1bHQNCgkJCS8vIG9wdGlvbnMgaW4gU2FmYXJpIHdvcmsgcHJvcGVybHkNCgkJCWlmICggZWxlbS5wYXJlbnROb2RlICkgew0KCQkJCWVsZW0ucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4Ow0KCQkJfQ0KDQoJCQlyZXR1cm4gZWxlbS5zZWxlY3RlZCA9PT0gdHJ1ZTsNCgkJfSwNCg0KCQkicGFyZW50IjogZnVuY3Rpb24oIGVsZW0gKSB7DQoJCQlyZXR1cm4gIUV4cHIucHNldWRvc1siZW1wdHkiXSggZWxlbSApOw0KCQl9LA0KDQoJCSJlbXB0eSI6IGZ1bmN0aW9uKCBlbGVtICkgew0KCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNlbXB0eS1wc2V1ZG8NCgkJCS8vIDplbXB0eSBpcyBvbmx5IGFmZmVjdGVkIGJ5IGVsZW1lbnQgbm9kZXMgYW5kIGNvbnRlbnQgbm9kZXMoaW5jbHVkaW5nIHRleHQoMyksIGNkYXRhKDQpKSwNCgkJCS8vICAgbm90IGNvbW1lbnQsIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLCBvciBvdGhlcnMNCgkJCS8vIFRoYW5rcyB0byBEaWVnbyBQZXJpbmkgZm9yIHRoZSBub2RlTmFtZSBzaG9ydGN1dA0KCQkJLy8gICBHcmVhdGVyIHRoYW4gIkAiIG1lYW5zIGFscGhhIGNoYXJhY3RlcnMgKHNwZWNpZmljYWxseSBub3Qgc3RhcnRpbmcgd2l0aCAiIyIgb3IgIj8iKQ0KCQkJdmFyIG5vZGVUeXBlOw0KCQkJZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsNCgkJCXdoaWxlICggZWxlbSApIHsNCgkJCQlpZiAoIGVsZW0ubm9kZU5hbWUgPiAiQCIgfHwgKG5vZGVUeXBlID0gZWxlbS5ub2RlVHlwZSkgPT09IDMgfHwgbm9kZVR5cGUgPT09IDQgKSB7DQoJCQkJCXJldHVybiBmYWxzZTsNCgkJCQl9DQoJCQkJZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmc7DQoJCQl9DQoJCQlyZXR1cm4gdHJ1ZTsNCgkJfSwNCg0KCQkiaGVhZGVyIjogZnVuY3Rpb24oIGVsZW0gKSB7DQoJCQlyZXR1cm4gcmhlYWRlci50ZXN0KCBlbGVtLm5vZGVOYW1lICk7DQoJCX0sDQoNCgkJInRleHQiOiBmdW5jdGlvbiggZWxlbSApIHsNCgkJCXZhciB0eXBlLCBhdHRyOw0KCQkJLy8gSUU2IGFuZCA3IHdpbGwgbWFwIGVsZW0udHlwZSB0byAndGV4dCcgZm9yIG5ldyBIVE1MNSB0eXBlcyAoc2VhcmNoLCBldGMpDQoJCQkvLyB1c2UgZ2V0QXR0cmlidXRlIGluc3RlYWQgdG8gdGVzdCB0aGlzIGNhc2UNCgkJCXJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJpbnB1dCIgJiYNCgkJCQkodHlwZSA9IGVsZW0udHlwZSkgPT09ICJ0ZXh0IiAmjg0KCQkJCSggKGF0dHIgPSBlbGVtLmdldEF0dHJpYnV0ZSgidHlwZSIpKSA9PSBudWxsIHx8IGF0dHIudG9Mb3dlckNhc2UoKSA9PT0gdHlwZSApOw0KCQl9LA0KDQoJCS8vIElucHV0IHR5cGVzDQoJCSJyYWRpbyI6IGNyZWF0ZUlucHV0UHNldWRvKCJyYWRpbyIpLA0KCQkiY2hlY2tib3giOiBjcmVhdGVJbnB1dFBzZXVkbygiY2hlY2tib3giKSwNCgkJImZpbGUiOiBjcmVhdGVJbnB1dFBzZXVkbygiZmlsZSIpLA0KCQkicGFzc3dvcmQiOiBjcmVhdGVJbnB1dFBzZXVkbygicGFzc3dvcmQiKSwNCgkJImltYWdlIjogY3JlYXRlSW5wdXRQc2V1ZG8oImltYWdlIiksDQoNCgkJInN1Ym1pdCI6IGNyZWF0ZUJ1dHRvblBzZXVkbygic3VibWl0IiksDQoJCSJyZXNldCI6IGNyZWF0ZUJ1dHRvblBzZXVkbygicmVzZXQiKSwNCg0KCQkiYnV0dG9uIjogZnVuY3Rpb24oIGVsZW0gKSB7DQoJCQl2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsNCgkJCXJldHVybiBuYW1lID09PSAiaW5wdXQiICYmIGVsZW0udHlwZSA9PT0gImJ1dHRvbiIgfHwgbmFtZSA9PT0gImJ1dHRvbiI7DQoJCX0sDQoNCgkJImlucHV0IjogZnVuY3Rpb24oIGVsZW0gKSB7DQoJCQlyZXR1cm4gcmlucHV0cy50ZXN0KCBlbGVtLm5vZGVOYW1lICk7DQoJCX0sDQoNCgkJImZvY3VzIjogZnVuY3Rpb24oIGVsZW0gKSB7DQoJCQl2YXIgZG9jID0gZWxlbS5vd25lckRvY3VtZW50Ow0KCQkJcmV0dXJuIGVsZW0gPT09IGRvYy5hY3RpdmVFbGVtZW50ICYmICghZG9jLmhhc0ZvY3VzIHx8IGRvYy5oYXNGb2N1cygpKSAmJiAhIShlbGVtLnR5cGUgfHwgZWxlbS5ocmVmIHx8IH5lbGVtLnRhYkluZGV4KTsNCgkJfSwNCg0KCQkiYWN0aXZlIjogZnVuY3Rpb24oIGVsZW0gKSB7DQoJCQlyZXR1cm4gZWxlbSA9PT0gZWxlbS5vd25lckRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7DQoJCX0sDQoNCgkJLy8gUG9zaXRpb25hbCB0eXBlcw0KCQkiZmlyc3QiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCkgew0KCQkJcmV0dXJuIFsgMCBdOw0KCQl9KSwNCg0KCQkibGFzdCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkgew0KCQkJcmV0dXJuIFsgbGVuZ3RoIC0gMSBdOw0KCQl9KSwNCg0KCQkiZXEiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7DQoJCQlyZXR1cm4gWyBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50IF07DQoJCX0pLA0KDQoJCSJldmVuIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7DQoJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMiApIHsNCgkJCQltYXRjaEluZGV4ZXMucHVzaCggaSApOw0KCQkJfQ0KCQkJcmV0dXJuIG1hdGNoSW5kZXhlczsNCgkJfSksDQoNCgkJIm9kZCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkgew0KCQkJZm9yICggdmFyIGkgPSAxOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7DQoJCQkJbWF0Y2hJbmRleGVzLnB1c2goIGkgKTsNCgkJCX0NCgkJCXJldHVybiBtYXRjaEluZGV4ZXM7DQoJCX0pLA0KDQoJCSJsdCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHsNCgkJCWZvciAoIHZhciBpID0gYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudDsgLS1pID49IDA7ICkgew0KCQkJCW1hdGNoSW5kZXhlcy5wdXNoKCBpICk7DQoJCQl9DQoJCQlyZXR1cm4gbWF0Y2hJbmRleGVzOw0KCQl9KSwNCg0KCQkiZ3QiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7DQoJCQlmb3IgKCB2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7ICsraSA8IGxlbmd0aDsgKSB7DQoJCQkJbWF0Y2hJbmRleGVzLnB1c2goIGkgKTsNCgkJCX0NCgkJCXJldHVybiBtYXRjaEluZGV4ZXM7DQoJCX0pDQoJfQ0KfTsNCg0KZnVuY3Rpb24gc2libGluZ0NoZWNrKCBhLCBiLCByZXQgKSB7DQoJaWYgKCBhID09PSBiICkgew0KCQlyZXR1cm4gcmV0Ow0KCX0NCg0KCXZhciBjdXIgPSBhLm5leHRTaWJsaW5nOw0KDQoJd2hpbGUgKCBjdXIgKSB7DQoJCWlmICggY3VyID09PSBiICkgew0KCQkJcmV0dXJuIC0xOw0KCQl9DQoNCgkJY3VyID0gY3VyLm5leHRTaWJsaW5nOw0KCX0NCg0KCXJldHVybiAxOw0KfQ0KDQpzb3J0T3JkZXIgPSBkb2NFbGVtLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uID8NCglmdW5jdGlvbiggYSwgYiApIHsNCgkJaWYgKCBhID09PSBiICkgew0KCQkJaGFzRHVwbGljYXRlID0gdHJ1ZTsNCgkJCXJldHVybiAwOw0KCQl9DQoNCgkJcmV0dXJuICggIWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gfHwgIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb24gPw0KCQkJYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA6DQoJCQlhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpICYgNA0KCQkpID8gLTEgOiAxOw0KCX0gOg0KCWZ1bmN0aW9uKCBhLCBiICkgew0KCQkvLyBUaGUgbm9kZXMgYXJlIGlkZW50aWNhbCwgd2UgY2FuIGV4aXQgZWFybHkNCgkJaWYgKCBhID09PSBiICkgew0KCQkJaGFzRHVwbGljYXRlID0gdHJ1ZTsNCgkJCXJldHVybiAwOw0KDQoJCS8vIEZhbGxiYWNrIHRvIHVzaW5nIHNvdXJjZUluZGV4IChpbiBJRSkgaWYgaXQncyBhdmFpbGFibGUgb24gYm90aCBub2Rlcw0KCQl9IGVsc2UgaWYgKCBhLnNvdXJjZUluZGV4ICYmIGIuc291cmNlSW5kZXggKSB7DQoJCQlyZXR1cm4gYS5zb3VyY2VJbmRleCAtIGIuc291cmNlSW5kZXg7DQoJCX0NCg0KCQl2YXIgYWwsIGJsLA0KCQkJYXAgPSBbXSwNCgkJCWJwID0gW10sDQoJCQlhdXAgPSBhLnBhcmVudE5vZGUsDQoJCQlidXAgPSBiLnBhcmVudE5vZGUsDQoJCQljdXIgPSBhdXA7DQoNCgkJLy8gSWYgdGhlIG5vZGVzIGFyZSBzaWJsaW5ncyAob3IgaWRlbnRpY2FsKSB3ZSBjYW4gZG8gYSBxdWljayBjaGVjaw0KCQlpZiAoIGF1cCA9PT0gYnVwICkgew0KCQkJcmV0dXJuIHNpYmxpbmdDaGVjayggYSwgYiApOw0KDQoJCS8vIElmIG5vIHBhcmVudHMgd2VyZSBmb3VuZCB0aGVuIHRoZSBub2RlcyBhcmUgZGlzY29ubmVjdGVkDQoJCX0gZWxzZSBpZiAoICFhdXAgKSB7DQoJCQlyZXR1cm4gLTE7DQoNCgkJfSBlbHNlIGlmICggIWJ1cCApIHsNCgkJCXJldHVybiAxOw0KCQl9DQoNCgkJLy8gT3RoZXJ3aXNlIHRoZXkncmUgc29tZXdoZXJlIGVsc2UgaW4gdGhlIHRyZWUgc28gd2UgbmVlZA0KCQkvLyB0byBidWlsZCB1cCBhIGZ1bGwgbGlzdCBvZiB0aGUgcGFyZW50Tm9kZXMgZm9yIGNvbXBhcmlzb24NCgkJd2hpbGUgKCBjdXIgKSB7DQoJCQlhcC51bnNoaWZ0KCBjdXIgKTsNCgkJCWN1ciA9IGN1ci5wYXJlbnROb2RlOw0KCQl9DQoNCgkJY3VyID0gYnVwOw0KDQoJCXdoaWxlICggY3VyICkgew0KCQkJYnAudW5zaGlmdCggY3VyICk7DQoJCQljdXIgPSBjdXIucGFyZW50Tm9kZTsNCgkJfQ0KDQoJCWFsID0gYXAubGVuZ3RoOw0KCQlibCA9IGJwLmxlbmd0aDsNCg0KCQkvLyBTdGFydCB3YWxraW5nIGRvd24gdGhlIHRyZWUgbG9va2luZyBmb3IgYSBkaXNjcmVwYW5jeQ0KCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBhbCAmJiBpIDwgYmw7IGkrKyApIHsNCgkJCWlmICggYXBbaV0gIT09IGJwW2ldICkgew0KCQkJCXJldHVybiBzaWJsaW5nQ2hlY2soIGFwW2ldLCBicFtpXSApOw0KCQkJfQ0KCQl9DQoNCgkJLy8gV2UgZW5kZWQgc29tZXBsYWNlIHVwIHRoZSB0cmVlIHNvIGRvIGEgc2libGluZyBjaGVjaw0KCQlyZXR1cm4gaSA9PT0gYWwgPw0KCQkJc2libGluZ0NoZWNrKCBhLCBicFtpXSwgLTEgKSA6DQoJCQlzaWJsaW5nQ2hlY2soIGFwW2ldLCBiLCAxICk7DQoJfTsNCg0KLy8gQWx3YXlzIGFzc3VtZSB0aGUgcHJlc2VuY2Ugb2YgZHVwbGljYXRlcyBpZiBzb3J0IGRvZXNuJ3QNCi8vIHBhc3MgdGhlbSB0byBvdXIgY29tcGFyaXNvbiBmdW5jdGlvbiAoYXMgaW4gR29vZ2xlIENocm9tZSkuDQpbMCwgMF0uc29ydCggc29ydE9yZGVyICk7DQpiYXNlSGFzRHVwbGljYXRlID0gIWhhc0R1cGxpY2F0ZTsNCg0KLy8gRG9jdW1lbnQgc29ydGluZyBhbmQgcmVtb3ZpbmcgZHVwbGljYXRlcw0KU2l6emxlLnVuaXF1ZVNvcnQgPSBmdW5jdGlvbiggcmVzdWx0cyApIHsNCgl2YXIgZWxlbSwNCgkJZHVwbGljYXRlcyA9IFtdLA0KCQlpID0gMSwNCgkJaiA9IDA7DQoNCgloYXNEdXBsaWNhdGUgPSBiYXNlSGFzRHVwbGljYXRlOw0KCXJlc3VsdHMuc29ydCggc29ydE9yZGVyICk7DQoNCglpZiAoIGhhc0R1cGxpY2F0ZSApIHsNCgkJZm9yICggOyAoZWxlbSA9IHJlc3VsdHNbaV0pOyBpKysgKSB7DQoJCQlpZiAoIGVsZW0gPT09IHJlc3VsdHNbIGkgLSAxIF0gKSB7DQoJCQkJaiA9IGR1cGxpY2F0ZXMucHVzaCggaSApOw0KCQkJfQ0KCQl9DQoJCXdoaWxlICggai0tICkgew0KCQkJcmVzdWx0cy5zcGxpY2UoIGR1cGxpY2F0ZXNbIGogXSwgMSApOw0KCQl9DQoJfQ0KDQoJcmV0dXJuIHJlc3VsdHM7DQp9Ow0KDQpTaXp6bGUuZXJyb3IgPSBmdW5jdGlvbiggbXNnICkgew0KCXRocm93IG5ldyBFcnJvciggIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIgKyBtc2cgKTsNCn07DQoNCmZ1bmN0aW9uIHRva2VuaXplKCBzZWxlY3RvciwgcGFyc2VPbmx5ICkgew0KCXZhciBtYXRjaGVkLCBtYXRjaCwgdG9rZW5zLCB0eXBlLA0KCQlzb0ZhciwgZ3JvdXBzLCBwcmVGaWx0ZXJzLA0KCQljYWNoZWQgPSB0b2tlbkNhY2hlWyBleHBhbmRvIF1bIHNlbGVjdG9yICsgIiAiIF07DQoNCglpZiAoIGNhY2hlZCApIHsNCgkJcmV0dXJuIHBhcnNlT25seSA/IDAgOiBjYWNoZWQuc2xpY2UoIDAgKTsNCgl9DQoNCglzb0ZhciA9IHNlbGVjdG9yOw0KCWdyb3VwcyA9IFtdOw0KCXByZUZpbHRlcnMgPSBFeHByLnByZUZpbHRlcjsNCg0KCXdoaWxlICggc29GYXIgKSB7DQoNCgkJLy8gQ29tbWEgYW5kIGZpcnN0IHJ1bg0KCQlpZiAoICFtYXRjaGVkIHx8IChtYXRjaCA9IHJjb21tYS5leGVjKCBzb0ZhciApKSApIHsNCgkJCWlmICggbWF0Y2ggKSB7DQoJCQkJLy8gRG9uJ3QgY29uc3VtZSB0cmFpbGluZyBjb21tYXMgYXMgdmFsaWQNCgkJCQlzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaFswXS5sZW5ndGggKSB8fCBzb0ZhcjsNCgkJCX0NCgkJCWdyb3Vwcy5wdXNoKCB0b2tlbnMgPSBbXSApOw0KCQl9DQoNCgkJbWF0Y2hlZCA9IGZhbHNlOw0KDQoJCS8vIENvbWJpbmF0b3JzDQoJCWlmICggKG1hdGNoID0gcmNvbWJpbmF0b3JzLmV4ZWMoIHNvRmFyICkpICkgew0KCQkJdG9rZW5zLnB1c2goIG1hdGNoZWQgPSBuZXcgVG9rZW4oIG1hdGNoLnNoaWZ0KCkgKSApOw0KCQkJc29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTsNCg0KCQkJLy8gQ2FzdCBkZXNjZW5kYW50IGNvbWJpbmF0b3JzIHRvIHNwYWNlDQoJCQltYXRjaGVkLnR5cGUgPSBtYXRjaFswXS5yZXBsYWNlKCBydHJpbSwgIiAiICk7DQoJCX0NCg0KCQkvLyBGaWx0ZXJzDQoJCWZvciAoIHR5cGUgaW4gRXhwci5maWx0ZXIgKSB7DQoJCQlpZiAoIChtYXRjaCA9IG1hdGNoRXhwclsgdHlwZSBdLmV4ZWMoIHNvRmFyICkpICYmICghcHJlRmlsdGVyc1sgdHlwZSBdIHx8DQoJCQkJKG1hdGNoID0gcHJlRmlsdGVyc1sgdHlwZSBdKCBtYXRjaCApKSkgKSB7DQoNCgkJCQl0b2tlbnMucHVzaCggbWF0Y2hlZCA9IG5ldyBUb2tlbiggbWF0Y2guc2hpZnQoKSApICk7DQoJCQkJc29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTsNCgkJCQltYXRjaGVkLnR5cGUgPSB0eXBlOw0KCQkJCW1hdGNoZWQubWF0Y2hlcyA9IG1hdGNoOw0KCQkJfQ0KCQl9DQoNCgkJaWYgKCAhbWF0Y2hlZCApIHsNCgkJCWJyZWFrOw0KCQl9DQoJfQ0KDQoJLy8gUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGludmFsaWQgZXhjZXNzDQoJLy8gaWYgd2UncmUganVzdCBwYXJzaW5nDQoJLy8gT3RoZXJ3aXNlLCB0aHJvdyBhbiBlcnJvciBvciByZXR1cm4gdG9rZW5zDQoJcmV0dXJuIHBhcnNlT25seSA/DQoJCXNvRmFyLmxlbmd0aCA6DQoJCXNvRmFyID8NCgkJCVNpenpsZS5lcnJvciggc2VsZWN0b3IgKSA6DQoJCQkvLyBDYWNoZSB0aGUgdG9rZW5zDQoJCQl0b2tlbkNhY2hlKCBzZWxlY3RvciwgZ3JvdXBzICkuc2xpY2UoIDAgKTsNCn0NCg0KZnVuY3Rpb24gYWRkQ29tYmluYXRvciggbWF0Y2hlciwgY29tYmluYXRvciwgYmFzZSApIHsNCgl2YXIgZGlyID0gY29tYmluYXRvci5kaXIsDQoJCWNoZWNrTm9uRWxlbWVudHMgPSBiYXNlICYmIGNvbWJpbmF0b3IuZGlyID09PSAicGFyZW50Tm9kZSIsDQoJCWRvbmVOYW1lID0gZG9uZSsrOw0KDQoJcmV0dXJuIGNvbWJpbmF0b3IuZmlyc3QgPw0KCQkvLyBDaGVjayBhZ2FpbnN0IGNsb3Nlc3QgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnQNCgkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsNCgkJCXdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7DQoJCQkJaWYgKCBjaGVja05vbkVsZW1lbnRzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDEgICkgew0KCQkJCQlyZXR1cm4gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICk7DQoJCQkJfQ0KCQkJfQ0KCQl9IDoNCg0KCQkvLyBDaGVjayBhZ2FpbnN0IGFsbCBhbmNlc3Rvci9wcmVjZWRpbmcgZWxlbWVudHMNCgkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsNCgkJCS8vIFdlIGNhbid0IHNldCBhcmJpdHJhcnkgZGF0YSBvbiBYTUwgbm9kZXMsIHNvIHRoZXkgZG9uJ3QgYmVuZWZpdCBmcm9tIGRpciBjYWNoaW5nDQoJCQlpZiAoICF4bWwgKSB7DQoJCQkJdmFyIGNhY2hlLA0KCQkJCQlkaXJrZXkgPSBkaXJydW5zICsgIiAiICsgZG9uZU5hbWUgKyAiICIsDQoJCQkJCWNhY2hlZGtleSA9IGRpcmtleSArIGNhY2hlZHJ1bnM7DQoJCQkJd2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHsNCgkJCQkJaWYgKCBjaGVja05vbkVsZW1lbnRzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7DQoJCQkJCQlpZiAoIChjYWNoZSA9IGVsZW1bIGV4cGFuZG8gXSkgPT09IGNhY2hlZGtleSApIHsNCgkJCQkJCQlyZXR1cm4gZWxlbS5zaXpzZXQ7DQoJCQkJCQl9IGVsc2UgaWYgKCB0eXBlb2YgY2FjaGUgPT09ICJzdHJpbmciICYmIGNhY2hlLmluZGV4T2YoZGlya2V5KSA9PT0gMCApIHsNCgkJCQkJCQlpZiAoIGVsZW0uc2l6c2V0ICkgew0KCQkJCQkJCQlyZXR1cm4gZWxlbTsNCgkJCQkJCQl9DQoJCQkJCQl9IGVsc2Ugew0KCQkJCQkJCWVsZW1bIGV4cGFuZG8gXSA9IGNhY2hlZGtleTsNCgkJCQkJCQlpZiAoIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkgew0KCQkJCQkJCQllbGVtLnNpenNldCA9IHRydWU7DQoJCQkJCQkJCXJldHVybiBlbGVtOw0KCQkJCQkJCX0NCgkJCQkJCQllbGVtLnNpenNldCA9IGZhbHNlOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQl3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkgew0KCQkJCQlpZiAoIGNoZWNrTm9uRWxlbWVudHMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsNCgkJCQkJCWlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7DQoJCQkJCQkJcmV0dXJuIGVsZW07DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCX07DQp9DQoNCmZ1bmN0aW9uIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApIHsNCglyZXR1cm4gbWF0Y2hlcnMubGVuZ3RoID4gMSA/DQoJCWZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7DQoJCQl2YXIgaSA9IG1hdGNoZXJzLmxlbmd0aDsNCgkJCXdoaWxlICggaS0tICkgew0KCQkJCWlmICggIW1hdGNoZXJzW2ldKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHsNCgkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCX0NCgkJCX0NCgkJCXJldHVybiB0cnVlOw0KCQl9IDoNCgkJbWF0Y2hlcnNbMF07DQp9DQoNCmZ1bmN0aW9uIGNvbmRlbnNlKCB1bm1hdGNoZWQsIG1hcCwgZmlsdGVyLCBjb250ZXh0LCB4bWwgKSB7DQoJdmFyIGVsZW0sDQoJCW5ld1VubWF0Y2hlZCA9IFtdLA0KCQlpID0gMCwNCgkJbGVuID0gdW5tYXRjaGVkLmxlbmd0aCwNCgkJbWFwcGVkID0gbWFwICE9IG51bGw7DQoNCglmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsNCgkJaWYgKCAoZWxlbSA9IHVubWF0Y2hlZFtpXSkgKSB7DQoJCQlpZiAoICFmaWx0ZXIgfHwgZmlsdGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHsNCgkJCQluZXdVbm1hdGNoZWQucHVzaCggZWxlbSApOw0KCQkJCWlmICggbWFwcGVkICkgew0KCQkJCQltYXAucHVzaCggaSApOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0NCg0KCXJldHVybiBuZXdVbm1hdGNoZWQ7DQp9DQoNCmZ1bmN0aW9uIHNldE1hdGNoZXIoIHByZUZpbHRlciwgc2VsZWN0b3IsIG1hdGNoZXIsIHBvc3RGaWx0ZXIsIHBvc3RGaW5kZXIsIHBvc3RTZWxlY3RvciApIHsNCglpZiAoIHBvc3RGaWx0ZXIgJiYgIXBvc3RGaWx0ZXJbIGV4cGFuZG8gXSApIHsNCgkJcG9zdEZpbHRlciA9IHNldE1hdGNoZXIoIHBvc3RGaWx0ZXIgKTsNCgl9DQoJaWYgKCBwb3N0RmluZGVyICYmICFwb3N0RmluZGVyWyBleHBhbmRvIF0gKSB7DQoJCXBvc3RGaW5kZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKTsNCgl9DQoJcmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgcmVzdWx0cywgY29udGV4dCwgeG1sICkgew0KCQl2YXIgdGVtcCwgaSwgZWxlbSwNCgkJCXByZU1hcCA9IFtdLA0KCQkJcG9zdE1hcCA9IFtdLA0KCQkJcHJlZXhpc3RpbmcgPSByZXN1bHRzLmxlbmd0aCwNCg0KCQkJLy8gR2V0IGluaXRpYWwgZWxlbWVudHMgZnJvbSBzZWVkIG9yIGNvbnRleHQNCgkJCWVsZW1zID0gc2VlZCB8fCBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciB8fCAiKiIsIGNvbnRleHQubm9kZVR5cGUgPyBbIGNvbnRleHQgXSA6IGNvbnRleHQsIFtdICksDQoNCgkJCS8vIFByZWZpbHRlciB0byBnZXQgbWF0Y2hlciBpbnB1dCwgcHJlc2VydmluZyBhIG1hcCBmb3Igc2VlZC1yZXN1bHRzIHN5bmNocm9uaXphdGlvbg0KCQkJbWF0Y2hlckluID0gcHJlRmlsdGVyICYmICggc2VlZCB8fCAhc2VsZWN0b3IgKSA/DQoJCQkJY29uZGVuc2UoIGVsZW1zLCBwcmVNYXAsIHByZUZpbHRlciwgY29udGV4dCwgeG1sICkgOg0KCQkJCWVsZW1zLA0KDQoJCQltYXRjaGVyT3V0ID0gbWF0Y2hlciA/DQoJCQkJLy8gSWYgd2UgaGF2ZSBhIHBvc3RGaW5kZXIsIG9yIGZpbHRlcmVkIHNlZWQsIG9yIG5vbi1zZWVkIHBvc3RGaWx0ZXIgb3IgcHJlZXhpc3RpbmcgcmVzdWx0cywNCgkJCQlwb3N0RmluZGVyIHx8ICggc2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8IHBvc3RGaWx0ZXIgKSA/DQoNCgkJCQkJLy8gLi4uaW50ZXJtZWRpYXRlIHByb2Nlc3NpbmcgaXMgbmVjZXNzYXJ5DQoJCQkJCVtdIDoNCg0KCQkJCQkvLyAuLi5vdGhlcndpc2UgdXNlIHJlc3VsdHMgZGlyZWN0bHkNCgkJCQkJcmVzdWx0cyA6DQoJCQkJbWF0Y2hlckluOw0KDQoJCS8vIEZpbmQgcHJpbWFyeSBtYXRjaGVzDQoJCWlmICggbWF0Y2hlciApIHsNCgkJCW1hdGNoZXIoIG1hdGNoZXJJbiwgbWF0Y2hlck91dCwgY29udGV4dCwgeG1sICk7DQoJCX0NCg0KCQkvLyBBcHBseSBwb3N0RmlsdGVyDQoJCWlmICggcG9zdEZpbHRlciApIHsNCgkJCXRlbXAgPSBjb25kZW5zZSggbWF0Y2hlck91dCwgcG9zdE1hcCApOw0KCQkJcG9zdEZpbHRlciggdGVtcCwgW10sIGNvbnRleHQsIHhtbCApOw0KDQoJCQkvLyBVbi1tYXRjaCBmYWlsaW5nIGVsZW1lbnRzIGJ5IG1vdmluZyB0aGVtIGJhY2sgdG8gbWF0Y2hlckluDQoJCQlpID0gdGVtcC5sZW5ndGg7DQoJCQl3aGlsZSAoIGktLSApIHsNCgkJCQlpZiAoIChlbGVtID0gdGVtcFtpXSkgKSB7DQoJCQkJCW1hdGNoZXJPdXRbIHBvc3RNYXBbaV0gXSA9ICEobWF0Y2hlckluWyBwb3N0TWFwW2ldIF0gPSBlbGVtKTsNCgkJCQl9DQoJCQl9DQoJCX0NCg0KCQlpZiAoIHNlZWQgKSB7DQoJCQlpZiAoIHBvc3RGaW5kZXIgfHwgcHJlRmlsdGVyICkgew0KCQkJCWlmICggcG9zdEZpbmRlciApIHsNCgkJCQkJLy8gR2V0IHRoZSBmaW5hbCBtYXRjaGVyT3V0IGJ5IGNvbmRlbnNpbmcgdGhpcyBpbnRlcm1lZGlhdGUgaW50byBwb3N0RmluZGVyIGNvbnRleHRzDQoJCQkJCXRlbXAgPSBbXTsNCgkJCQkJaSA9IG1hdGNoZXJPdXQubGVuZ3RoOw0KCQkJCQl3aGlsZSAoIGktLSApIHsNCgkJCQkJCWlmICggKGVsZW0gPSBtYXRjaGVyT3V0W2ldKSApIHsNCgkJCQkJCQkvLyBSZXN0b3JlIG1hdGNoZXJJbiBzaW5jZSBlbGVtIGlzIG5vdCB5ZXQgYSBmaW5hbCBtYXRjaA0KCQkJCQkJCXRlbXAucHVzaCggKG1hdGNoZXJJbltpXSA9IGVsZW0pICk7DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQkJcG9zdEZpbmRlciggbnVsbCwgKG1hdGNoZXJPdXQgPSBbXSksIHRlbXAsIHhtbCApOw0KCQkJCX0NCg0KCQkJCS8vIE1vdmUgbWF0Y2hlZCBlbGVtZW50cyBmcm9tIHNlZWQgdG8gcmVzdWx0cyB0byBrZWVwIHRoZW0gc3luY2hyb25pemVkDQoJCQkJaSA9IG1hdGNoZXJPdXQubGVuZ3RoOw0KCQkJCXdoaWxlICggaS0tICkgew0KCQkJCQlpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgJiYNCgkJCQkJCSh0ZW1wID0gcG9zdEZpbmRlciA/IGluZGV4T2YuY2FsbCggc2VlZCwgZWxlbSApIDogcHJlTWFwW2ldKSA+IC0xICkgew0KDQoJCQkJCQlzZWVkW3RlbXBdID0gIShyZXN1bHRzW3RlbXBdID0gZWxlbSk7DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoNCgkJLy8gQWRkIGVsZW1lbnRzIHRvIHJlc3VsdHMsIHRocm91Z2ggcG9zdEZpbmRlciBpZiBkZWZpbmVkDQoJCX0gZWxzZSB7DQoJCQltYXRjaGVyT3V0ID0gY29uZGVuc2UoDQoJCQkJbWF0Y2hlck91dCA9PT0gcmVzdWx0cyA/DQoJCQkJCW1hdGNoZXJPdXQuc3BsaWNlKCBwcmVleGlzdGluZywgbWF0Y2hlck91dC5sZW5ndGggKSA6DQoJCQkJCW1hdGNoZXJPdXQNCgkJCSk7DQoJCQlpZiAoIHBvc3RGaW5kZXIgKSB7DQoJCQkJcG9zdEZpbmRlciggbnVsbCwgcmVzdWx0cywgbWF0Y2hlck91dCwgeG1sICk7DQoJCQl9IGVsc2Ugew0KCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTsNCgkJCX0NCgkJfQ0KCX0pOw0KfQ0KDQpmdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkgew0KCXZhciBjaGVja0NvbnRleHQsIG1hdGNoZXIsIGosDQoJCWxlbiA9IHRva2Vucy5sZW5ndGgsDQoJCWxlYWRpbmdSZWxhdGl2ZSA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1swXS50eXBlIF0sDQoJCWltcGxpY2l0UmVsYXRpdmUgPSBsZWFkaW5nUmVsYXRpdmUgfHwgRXhwci5yZWxhdGl2ZVsiICJdLA0KCQlpID0gbGVhZGluZ1JlbGF0aXZlID8gMSA6IDAsDQoNCgkJLy8gVGhlIGZvdW5kYXRpb25hbCBtYXRjaGVyIGVuc3VyZXMgdGhhdCBlbGVtZW50cyBhcmUgcmVhY2hhYmxlIGZyb20gdG9wLWxldmVsIGNvbnRleHQocykNCgkJbWF0Y2hDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7DQoJCQlyZXR1cm4gZWxlbSA9PT0gY2hlY2tDb250ZXh0Ow0KCQl9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksDQoJCW1hdGNoQW55Q29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkgew0KCQkJcmV0dXJuIGluZGV4T2YuY2FsbCggY2hlY2tDb250ZXh0LCBlbGVtICkgPiAtMTsNCgkJfSwgaW1wbGljaXRSZWxhdGl2ZSwgdHJ1ZSApLA0KCQltYXRjaGVycyA9IFsgZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsNCgkJCXJldHVybiAoICFsZWFkaW5nUmVsYXRpdmUgJiYgKCB4bWwgfHwgY29udGV4dCAhPT0gb3V0ZXJtb3N0Q29udGV4dCApICkgfHwgKA0KCQkJCShjaGVja0NvbnRleHQgPSBjb250ZXh0KS5ub2RlVHlwZSA/DQoJCQkJCW1hdGNoQ29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgOg0KCQkJCQltYXRjaEFueUNvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApICk7DQoJCX0gXTsNCg0KCWZvciAoIDsgaSA8IGxlbjgaSsrICkgew0KCQlpZiAoIChtYXRjaGVyID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2ldLnR5cGUgXSkgKSB7DQoJCQltYXRjaGVycyA9IFsgYWRkQ29tYmluYXRvciggZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksIG1hdGNoZXIgKSBdOw0KCQl9IGVsc2Ugew0KCQkJbWF0Y2hlciA9IEV4cHIuZmlsdGVyWyB0b2tlbnNbaV0udHlwZSBdLmFwcGx5KCBudWxsLCB0b2tlbnNbaV0ubWF0Y2hlcyApOw0KDQoJCQkvLyBSZXR1cm4gc3BlY2lhbCB1cG9uIHNlZWluZyBhIHBvc2l0aW9uYWwgbWF0Y2hlcg0KCQkJaWYgKCBtYXRjaGVyWyBleHBhbmRvIF0gKSB7DQoJCQkJLy8gRmluZCB0aGUgbmV4dCByZWxhdGl2ZSBvcGVyYXRvciAoaWYgYW55KSBmb3IgcHJvcGVyIGhhbmRsaW5nDQoJCQkJaiA9ICsraTsNCgkJCQlmb3IgKCA7IGogPCBsZW47IGorKyApIHsNCgkJCQkJaWYgKCBFeHByLnJlbGF0aXZlWyB0b2tlbnNbal0udHlwZSBdICkgew0KCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQl9DQoJCQkJcmV0dXJuIHNldE1hdGNoZXIoDQoJCQkJCWkgPiAxICYmIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApLA0KCQkJCQlpID4gMSAmJiB0b2tlbnMuc2xpY2UoIDAsIGkgLSAxICkuam9pbigiIikucmVwbGFjZSggcnRyaW0sICIkMSIgKSwNCgkJCQkJbWF0Y2hlciwNCgkJCQkJaSA8IGogJiYgbWF0Y2hlckZyb21Ub2tlbnMoIHRva2Vucy5zbGljZSggaSwgaiApICksDQoJCQkJCWogPCBsZW4gJiYgbWF0Y2hlckZyb21Ub2tlbnMoICh0b2tlbnMgPSB0b2tlbnMuc2xpY2UoIGogKSkgKSwNCgkJCQkJaiA8IGxlbiAmJiB0b2tlbnMuam9pbigiIikNCgkJCQkpOw0KCQkJfQ0KCQkJbWF0Y2hlcnMucHVzaCggbWF0Y2hlciApOw0KCQl9DQoJfQ0KDQoJcmV0dXJuIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApOw0KfQ0KDQpmdW5jdGlvbiBtYXRjaGVyRnJvbUdyb3VwTWF0Y2hlcnMoIGVsZW1lbnRNYXRjaGVycywgc2V0TWF0Y2hlcnMgKSB7DQoJdmFyIGJ5U2V0ID0gc2V0TWF0Y2hlcnMubGVuZ3RoID4gMCwNCgkJYnlFbGVtZW50ID0gZWxlbWVudE1hdGNoZXJzLmxlbmd0aCA+IDAsDQoJCXN1cGVyTWF0Y2hlciA9IGZ1bmN0aW9uKCBzZWVkLCBjb250ZXh0LCB4bWwsIHJlc3VsdHMsIGV4cGFuZENvbnRleHQgKSB7DQoJCQl2YXIgZWxlbSwgaiwgbWF0Y2hlciwNCgkJCQlzZXRNYXRjaGVkID0gW10sDQoJCQkJbWF0Y2hlZENvdW50ID0gMCwNCgkJCQlpID0gIjAiLA0KCQkJCXVubWF0Y2hlZCA9IHNlZWQgJiYgW10sDQoJCQkJb3V0ZXJtb3N0ID0gZXhwYW5kQ29udGV4dCAhPSBudWxsLA0KCQkJCWNvbnRleHRCYWNrdXAgPSBvdXRlcm1vc3RDb250ZXh0LA0KCQkJCS8vIFdlIG11c3QgYWx3YXlzIGhhdmUgZWl0aGVyIHNlZWQgZWxlbWVudHMgb3IgY29udGV4dA0KCQkJCWVsZW1zID0gc2VlZCB8fCBieUVsZW1lbnQgJiYgRXhwci5maW5kWyJUQUciXSggIioiLCBleHBhbmRDb250ZXh0ICYmIGNvbnRleHQucGFyZW50Tm9kZSB8fCBjb250ZXh0ICksDQoJCQkJLy8gTmVzdGVkIG1hdGNoZXJzIHNob3VsZCB1c2Ugbm9uLWludGVnZXIgZGlycnVucw0KCQkJCWRpcnJ1bnNVbmlxdWUgPSAoZGlycnVucyArPSBjb250ZXh0QmFja3VwID09IG51bGwgPyAxIDogTWF0aC5FKTsNCg0KCQkJaWYgKCBvdXRlcm1vc3QgKSB7DQoJCQkJb3V0ZXJtb3N0Q29udGV4dCA9IGNvbnRleHQgIT09IGRvY3VtZW50ICYmIGNvbnRleHQ7DQoJCQkJY2FjaGVkcnVucyA9IHN1cGVyTWF0Y2hlci5lbDsNCgkJCX0NCg0KCQkJLy8gQWRkIGVsZW1lbnRzIHBhc3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHMNCgkJCWZvciAoIDsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgew0KCQkJCWlmICggYnlFbGVtZW50ICYmIGVsZW0gKSB7DQoJCQkJCWZvciAoIGogPSAwOyAobWF0Y2hlciA9IGVsZW1lbnRNYXRjaGVyc1tqXSk7IGorKyApIHsNCgkJCQkJCWlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7DQoJCQkJCQkJcmVzdWx0cy5wdXNoKCBlbGVtICk7DQoJCQkJCQkJYnJlYWs7DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQkJaWYgKCBvdXRlcm1vc3QgKSB7DQoJCQkJCQlkaXJydW5zID0gZGlycnVuc1VuaXF1ZTsNCgkJCQkJCWNhY2hlZHJ1bnMgPSArK3N1cGVyTWF0Y2hlci5lbDsNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCS8vIFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Igc2V0IGZpbHRlcnMNCgkJCQlpZiAoIGJ5U2V0ICkgew0KCQkJCQkvLyBUaGV5IHdpbGwgaGF2ZSBnb25lIHRocm91Z2ggYWxsIHBvc3NpYmxlIG1hdGNoZXJzDQoJCQkJCWlmICggKGVsZW0gPSAhbWF0Y2hlciAmJiBlbGVtKSApIHsNCgkJCQkJCW1hdGNoZWRDb3VudC0tOw0KCQkJCQl9DQoNCgkJCQkJLy8gTGVuZ3RoZW4gdGhlIGFycmF5IGZvciBldmVyeSBlbGVtZW50LCBtYXRjaGVkIG9yIG5vdA0KCQkJCQlpZiAoIHNlZWQgKSB7DQoJCQkJCQl1bm1hdGNoZWQucHVzaCggZWxlbSApOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBBcHBseSBzZXQgZmlsdGVycyB0byB1bm1hdGNoZWQgZWxlbWVudHMNCgkJCW1hdGNoZWRDb3VudCArPSBpOw0KCQkJaWYgKCBieVNldCAmJiBpICE9PSBtYXRjaGVkQ291bnQgKSB7DQoJCQkJZm9yICggaiA9IDA7IChtYXRjaGVyID0gc2V0TWF0Y2hlcnNbal0pOyBqKysgKSB7DQoJCQkJCW1hdGNoZXIoIHVubWF0Y2hlZCwgc2V0TWF0Y2hlZCwgY29udGV4dCwgeG1sICk7DQoJCQkJfQ0KDQoJCQkJaWYgKCBzZWVkICkgew0KCQkJCQkvLyBSZWludGVncmF0ZSBlbGVtZW50IG1hdGNoZXMgdG8gZWxpbWluYXRlIHRoZSBuZWVkIGZvciBzb3J0aW5nDQoJCQkJCWlmICggbWF0Y2hlZENvdW50ID4gMCApIHsNCgkJCQkJCXdoaWxlICggaS0tICkgew0KCQkJCQkJCWlmICggISh1bm1hdGNoZWRbaV0gfHwgc2V0TWF0Y2hlZFtpXSkgKSB7DQoJCQkJCQkJCXNldE1hdGNoZWRbaV0gPSBwb3AuY2FsbCggcmVzdWx0cyApOw0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCS8vIERpc2NhcmQgaW5kZXggcGxhY2Vob2xkZXIgdmFsdWVzIHRvIGdldCBvbmx5IGFjdHVhbCBtYXRjaGVzDQoJCQkJCXNldE1hdGNoZWQgPSBjb25kZW5zZSggc2V0TWF0Y2hlZCApOw0KCQkJCX0NCg0KCQkJCS8vIEFkZCBtYXRjaGVzIHRvIHJlc3VsdHMNCgkJCQlwdXNoLmFwcGx5KCByZXN1bHRzLCBzZXRNYXRjaGVkICk7DQoNCgkJCQkvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmcNCgkJCQlpZiAoIG91dGVybW9zdCAmJiAhc2VlZCAmJiBzZXRNYXRjaGVkLmxlbmd0aCA+IDAgJiYNCgkJCQkJKCBtYXRjaGVkQ291bnQgKyBzZXRNYXRjaGVycy5sZW5ndGggKSA+IDEgKSB7DQoNCgkJCQkJU2l6emxlLnVuaXF1ZVNvcnQoIHJlc3VsdHMgKTsNCgkJCQl9DQoJCQl9DQoNCgkJCS8vIE92ZXJyaWRlIG1hbmlwdWxhdGlvbiBvZiBnbG9iYWxzIGJ5IG5lc3RlZCBtYXRjaGVycw0KCQkJaWYgKCBvdXRlcm1vc3QgKSB7DQoJCQkJZGlycnVucyA9IGRpcnJ1bnNVbmlxdWU7DQoJCQkJb3V0ZXJtb3N0Q29udGV4dCA9IGNvbnRleHRCYWNrdXA7DQoJCQl9DQoNCgkJCXJldHVybiB1bm1hdGNoZWQ7DQoJCX07DQoNCglzdXBlck1hdGNoZXIuZWwgPSAwOw0KCXJldHVybiBieVNldCA/DQoJCW1hcmtGdW5jdGlvbiggc3VwZXJNYXRjaGVyICkgOg0KCQlzdXBlck1hdGNoZXI7DQp9DQoNCmNvbXBpbGUgPSBTaXp6bGUuY29tcGlsZSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgZ3JvdXAgLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7DQoJdmFyIGksDQoJCXNldE1hdGNoZXJzID0gW10sDQoJCWVsZW1lbnRNYXRjaGVycyA9IFtdLA0KCQljYWNoZWQgPSBjb21waWxlckNhY2hlWyBleHBhbmRvIF1bIHNlbGVjdG9yICsgIiAiIF07DQoNCglpZiAoICFjYWNoZWQgKSB7DQoJCS8vIEdlbmVyYXRlIGEgZnVuY3Rpb24gb2YgcmVjdXJzaXZlIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoZWNrIGVhY2ggZWxlbWVudA0KCQlpZiAoICFncm91cCApIHsNCgkJCWdyb3VwID0gdG9rZW5pemUoIHNlbGVjdG9yICk7DQoJCX0NCgkJaSA9IGdyb3VwLmxlbmd0aDsNCgkJd2hpbGUgKCBpLS0gKSB7DQoJCQljYWNoZWQgPSBtYXRjaGVyRnJvbVRva2VucyggZ3JvdXBbaV0gKTsNCgkJCWlmICggY2FjaGVkWyBleHBhbmRvIF0gKSB7DQoJCQkJc2V0TWF0Y2hlcnMucHVzaCggY2FjaGVkICk7DQoJCQl9IGVsc2Ugew0KCQkJCWVsZW1lbnRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTsNCgkJCX0NCgkJfQ0KDQoJCS8vIENhY2hlIHRoZSBjb21waWxlZCBmdW5jdGlvbg0KCQljYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3RvciwgbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgKTsNCgl9DQoJcmV0dXJuIGNhY2hlZDsNCn07DQoNCmZ1bmN0aW9uIG11bHRpcGxlQ29udGV4dHMoIHNlbGVjdG9yLCBjb250ZXh0cywgcmVzdWx0cyApIHsNCgl2YXIgaSA9IDAsDQoJCWxlbiA9IGNvbnRleHRzLmxlbmd0aDsNCglmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsNCgkJU2l6emxlKCBzZWxlY3RvciwgY29udGV4dHNbaV0sIHJlc3VsdHMgKTsNCgl9DQoJcmV0dXJuIHJlc3VsdHM7DQp9DQoNCmZ1bmN0aW9uIHNlbGVjdCggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQsIHhtbCApIHsNCgl2YXIgaSwgdG9rZW5zLCB0b2tlbiwgdHlwZSwgZmluZCwNCgkJbWF0Y2ggPSB0b2tlbml6ZSggc2VsZWN0b3IgKSwNCgkJaiA9IG1hdGNoLmxlbmd0aDsNCg0KCWlmICggIXNlZWQgKSB7DQoJCS8vIFRyeSB0byBtaW5pbWl6ZSBvcGVyYXRpb25zIGlmIHRoZXJlIGlzIG9ubHkgb25lIGdyb3VwDQoJCWlmICggbWF0Y2gubGVuZ3RoID09PSAxICkgew0KDQoJCQkvLyBUYWtlIGEgc2hvcnRjdXQgYW5kIHNldCB0aGUgY29udGV4dCBpZiB0aGUgcm9vdCBzZWxlY3RvciBpcyBhbiBJRA0KCQkJdG9rZW5zID0gbWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCApOw0KCQkJaWYgKCB0b2tlbnMubGVuZ3RoID4gMiAmJiAodG9rZW4gPSB0b2tlbnNbMF0pLnR5cGUgPT09ICJJRCIgJiYNCgkJCQkJY29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiAheG1sICYmDQoJCQkJCUV4cHIucmVsYXRpdmVbIHRva2Vuc1sxXS50eXBlIF0gKSB7DQoNCgkJCQljb250ZXh0ID0gRXhwci5maW5kWyJJRCJdKCB0b2tlbi5tYXRjaGVzWzBdLnJlcGxhY2UoIHJiYWNrc2xhc2gsICIiICksIGNvbnRleHQsIHhtbCApWzBdOw0KCQkJCWlmICggIWNvbnRleHQgKSB7DQoJCQkJCXJldHVybiByZXN1bHRzOw0KCQkJCX0NCg0KCQkJCXNlbGVjdG9yID0gc2VsZWN0b3Iuc2xpY2UoIHRva2Vucy5zaGlmdCgpLmxlbmd0aCApOw0KCQkJfQ0KDQoJCQkvLyBGZXRjaCBhIHNlZWQgc2V0IGZvciByaWdodC10by1sZWZ0IG1hdGNoaW5nDQoJCQlmb3IgKCBpID0gbWF0Y2hFeHByWyJQT1MiXS50ZXN0KCBzZWxlY3RvciApID8gLTEgOiB0b2tlbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0gKSB7DQoJCQkJdG9rZW4gPSB0b2tlbnNbaV07DQoNCgkJCQkvLyBBYm9ydCBpZiB3ZSBoaXQgYSBjb21iaW5hdG9yDQoJCQkJaWYgKCBFeHByLnJlbGF0aXZlWyAodHlwZSA9IHRva2VuLnR5cGUpIF0gKSB7DQoJCQkJCWJyZWFrOw0KCQkJCX0NCgkJCQlpZiAoIChmaW5kID0gRXhwci5maW5kWyB0eXBlIF0pICkgew0KCQkJCQkvLyBTZWFyY2gsIGV4cGFuZGluZyBjb250ZXh0IGZvciBsZWFkaW5nIHNpYmxpbmcgY29tYmluYXRvcnMNCgkJCQkJaWYgKCAoc2VlZCA9IGZpbmQoDQoJCQkJCQl0b2tlbi5tYXRjaGVzWzBdLnJlcGxhY2UoIHJiYWNrc2xhc2gsICIiICksDQoJCQkJCQlyc2libGluZy50ZXN0KCB0b2tlbnNbMF0udHlwZSApICYmIGNvbnRleHQucGFyZW50Tm9kZSB8fCBjb250ZXh0LA0KCQkJCQkJeG1sDQoJCQkJCSkpICkgew0KDQoJCQkJCQkvLyBJZiBzZWVkIGlzIGVtcHR5IG9yIG5vIHRva2VucyByZW1haW4sIHdlIGNhbiByZXR1cm4gZWFybHkNCgkJCQkJCXRva2Vucy5zcGxpY2UoIGksIDEgKTsNCgkJCQkJCXNlbGVjdG9yID0gc2VlZC5sZW5ndGggJiYgdG9rZW5zLmpvaW4oIiIpOw0KCQkJCQkJaWYgKCAhc2VsZWN0b3IgKSB7DQoJCQkJCQkJcHVzaC5hcHBseSggcmVzdWx0cywgc2xpY2UuY2FsbCggc2VlZCwgMCApICk7DQoJCQkJCQkJcmV0dXJuIHJlc3VsdHM7DQoJCQkJCQl9DQoNCgkJCQkJCWJyZWFrOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KDQoJLy8gQ29tcGlsZSBhbmQgZXhlY3V0ZSBhIGZpbHRlcmluZyBmdW5jdGlvbg0KCS8vIFByb3ZpZGUgYG1hdGNoYCB0byBhdm9pZCByZXRva2VuaXphdGlvbiBpZiB3ZSBtb2RpZmllZCB0aGUgc2VsZWN0b3IgYWJvdmUNCgljb21waWxlKCBzZWxlY3RvciwgbWF0Y2ggKSgNCgkJc2VlZCwNCgkJY29udGV4dCwNCgkJeG1sLA0KCQlyZXN1bHRzLA0KCQlyc2libGluZy50ZXN0KCBzZWxlY3RvciApDQoJKTsNCglyZXR1cm4gcmVzdWx0czsNCn0NCg0KaWYgKCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsICkgew0KCShmdW5jdGlvbigpIHsNCgkJdmFyIGRpc2Nvbm5lY3RlZE1hdGNoLA0KCQkJb2xkU2VsZWN0ID0gc2VsZWN0LA0KCQkJcmVzY2FwZSA9IC8nfFxcL2csDQoJCQlyYXR0cmlidXRlUXVvdGVzID0gL1w9W1x4MjBcdFxyXG5cZl0qKFteJyJcXV0qKVtceDIwXHRcclxuXGZdKlxdL2csDQoNCgkJCS8vIHFTYSg6Zm9jdXMpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChDaHJvbWUgMjEpLCBubyBuZWVkIHRvIGFsc28gYWRkIHRvIGJ1Z2d5TWF0Y2hlcyBzaW5jZSBtYXRjaGVzIGNoZWNrcyBidWdneVFTQQ0KCQkJLy8gQSBzdXBwb3J0IHRlc3Qgd291bGQgcmVxdWlyZSB0b28gbXVjaCBjb2RlICh3b3VsZCBpbmNsdWRlIGRvY3VtZW50IHJlYWR5KQ0KCQkJcmJ1Z2d5UVNBID0gWyAiOmZvY3VzIiBdLA0KDQoJCQkvLyBtYXRjaGVzU2VsZWN0b3IoOmFjdGl2ZSkgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKElFOS9PcGVyYSAxMS41KQ0KCQkJLy8gQSBzdXBwb3J0IHRlc3Qgd291bGQgcmVxdWlyZSB0b28gbXVjaCBjb2RlICh3b3VsZCBpbmNsdWRlIGRvY3VtZW50IHJlYWR5KQ0KCQkJLy8ganVzdCBza2lwIG1hdGNoZXNTZWxlY3RvciBmb3IgOmFjdGl2ZQ0KCQkJcmJ1Z2d5TWF0Y2hlcyA9IFsgIjphY3RpdmUiIF0sDQoJCQltYXRjaGVzID0gZG9jRWxlbS5tYXRjaGVzU2VsZWN0b3IgfHwNCgkJCQlkb2NFbGVtLm1vek1hdGNoZXNTZWxlY3RvciB8fA0KCQkJCWRvY0VsZW0ud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8DQoJCQkJZG9jRWxlbS5vTWF0Y2hlc1NlbGVjdG9yIHx8DQoJCQkJZG9jRWxlbS5tc01hdGNoZXNTZWxlY3RvcjsNCg0KCQkvLyBCdWlsZCBRU0EgcmVnZXgNCgkJLy8gUmVnZXggc3RyYXRlZ3kgYWRvcHRlZCBmcm9tIERpZWdvIFBlcmluaQ0KCQlhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsNCgkJCS8vIFNlbGVjdCBpcyBzZXQgdG8gZW1wdHkgc3RyaW5nIG9uIHB1cnBvc2UNCgkJCS8vIFRoaXMgaXMgdG8gdGVzdCBJRSdzIHRyZWF0bWVudCBvZiBub3QgZXhwbGljdGx5DQoJCQkvLyBzZXR0aW5nIGEgYm9vbGVhbiBjb250ZW50IGF0dHJpYnV0ZSwNCgkJCS8vIHNpbmNlIGl0cyBwcmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoDQoJCQkvLyBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMjM1OQ0KCQkJZGl2LmlubmVySFRNTCA9ICI8c2VsZWN0PjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+IjsNCg0KCQkJLy8gSUU4IC0gU29tZSBib29sZWFuIGF0dHJpYnV0ZXMgYXJlIG5vdCB0cmVhdGVkIGNvcnJlY3RseQ0KCQkJaWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGggKSB7DQoJCQkJcmJ1Z2d5UVNBLnB1c2goICJcXFsiICsgd2hpdGVzcGFjZSArICIqKD86Y2hlY2tlZHxkaXNhYmxlZHxpc21hcHxtdWx0aXBsZXxyZWFkb25seXxzZWxlY3RlZHx2YWx1ZSkiICk7DQoJCQl9DQoNCgkJCS8vIFdlYmtpdC9PcGVyYSAtIDpjaGVja2VkIHNob3VsZCByZXR1cm4gc2VsZWN0ZWQgb3B0aW9uIGVsZW1lbnRzDQoJCQkvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZA0KCQkJLy8gSUU4IHRocm93cyBlcnJvciBoZXJlIChkbyBub3QgcHV0IHRlc3RzIGFmdGVyIHRoaXMgb25lKQ0KCQkJaWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RoICkgew0KCQkJCXJidWdneVFTQS5wdXNoKCI6Y2hlY2tlZCIpOw0KCQkJfQ0KCQl9KTsNCg0KCQlhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsNCg0KCQkJLy8gT3BlcmEgMTAtMTIvSUU5IC0gXj0gJD0gKj0gYW5kIGVtcHR5IHZhbHVlcw0KCQkJLy8gU2hvdWxkIG5vdCBzZWxlY3QgYW55dGhpbmcNCgkJCWRpdi5pbm5lckhUTUwgPSAiPHAgdGVzdD0nJz48L3A+IjsNCgkJCWlmICggZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIlt0ZXN0Xj0nJ10iKS5sZW5ndGggKSB7DQoJCQkJcmJ1Z2d5UVNBLnB1c2goICJbKl4kXT0iICsgd2hpdGVzcGFjZSArICIqKD86XCJcInwnJykiICk7DQoJCQl9DQoNCgkJCS8vIEZGIDMuNSAtIDplbmFibGVkLzpkaXNhYmxlZCBhbmQgaGlkZGVuIGVsZW1lbnRzIChoaWRkZW4gZWxlbWVudHMgYXJlIHN0aWxsIGVuYWJsZWQpDQoJCQkvLyBJRTggdGhyb3dzIGVycm9yIGhlcmUgKGRvIG5vdCBwdXQgdGVzdHMgYWZ0ZXIgdGhpcyBvbmUpDQoJCQlkaXYuaW5uZXJIVE1MID0gIjxpbnB1dCB0eXBlPSdoaWRkZW4nLz4iOw0KCQkJaWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RoICkgew0KCQkJCXJidWdneVFTQS5wdXNoKCI6ZW5hYmxlZCIsICI6ZGlzYWJsZWQiKTsNCgkJCX0NCgkJfSk7DQoNCgkJLy8gcmJ1Z2d5UVNBIGFsd2F5cyBjb250YWlucyA6Zm9jdXMsIHNvIG5vIG5lZWQgZm9yIGEgbGVuZ3RoIGNoZWNrDQoJCXJidWdneVFTQSA9IC8qIHJidWdneVFTQS5sZW5ndGggJiYgKi8gbmV3IFJlZ0V4cCggcmJ1Z2d5UVNBLmpvaW4oInwiKSApOw0KDQoJCXNlbGVjdCA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCwgeG1sICkgew0KCQkJLy8gT25seSB1c2UgcXVlcnlTZWxlY3RvckFsbCB3aGVuIG5vdCBmaWx0ZXJpbmcsDQoJCQkvLyB3aGVuIHRoaXMgaXMgbm90IHhtbCwNCgkJCS8vIGFuZCB3aGVuIG5vIFFTQSBidWdzIGFwcGx5DQoJCQlpZiAoICFzZWVkICYmICF4bWwgJiYgIXJidWdneVFTQS50ZXN0KCBzZWxlY3RvciApICkgew0KCQkJCXZhciBncm91cHMsIGksDQoJCQkJCW9sZCA9IHRydWUsDQoJCQkJCW5pZCA9IGV4cGFuZG8sDQoJCQkJCW5ld0NvbnRleHQgPSBjb250ZXh0LA0KCQkJCQluZXdTZWxlY3RvciA9IGNvbnRleHQubm9kZVR5cGUgPT09IDkgJiYgc2VsZWN0b3I7DQoNCgkJCQkvLyBxU0Egd29ya3Mgc3RyYW5nZWx5IG9uIEVsZW1lbnQtcm9vdGVkIHF1ZXJpZXMNCgkJCQkvLyBXZSBjYW4gd29yayBhcm91bmQgdGhpcyBieSBzcGVjaWZ5aW5nIGFuIGV4dHJhIElEIG9uIHRoZSByb290DQoJCQkJLy8gYW5kIHdvcmtpbmcgdXAgZnJvbSB0aGVyZSAoVGhhbmtzIHRvIEFuZHJldyBEdXBvbnQgZm9yIHRoZSB0ZWNobmlxdWUpDQoJCQkJLy8gSUUgOCBkb2Vzbid0IHdvcmsgb24gb2JqZWN0IGVsZW1lbnRzDQoJCQkJaWYgKCBjb250ZXh0Lm5vZGVUeXBlID09PSAxICYmIGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gIm9iamVjdCIgKSB7DQoJCQkJCWdyb3VwcyA9IHRva2VuaXplKCBzZWxlY3RvciApOw0KDQoJCQkJCWlmICggKG9sZCA9IGNvbnRleHQuZ2V0QXR0cmlidXRlKCJpZCIpKSApIHsNCgkJCQkJCW5pZCA9IG9sZC5yZXBsYWNlKCByZXNjYXBlLCAiXFwkJiIgKTsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCWNvbnRleHQuc2V0QXR0cmlidXRlKCAiaWQiLCBuaWQgKTsNCgkJCQkJfQ0KCQkJCQluaWQgPSAiW2lkPSciICsgbmlkICsgIiddICI7DQoNCgkJCQkJaSA9IGdyb3Vwcy5sZW5ndGg7DQoJCQkJCXdoaWxlICggaS0tICkgew0KCQkJCQkJZ3JvdXBzW2ldID0gbmlkICsgZ3JvdXBzW2ldLmpvaW4oIiIpOw0KCQkJCQl9DQoJCQkJCW5ld0NvbnRleHQgPSByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIGNvbnRleHQucGFyZW50Tm9kZSB8fCBjb250ZXh0Ow0KCQkJCQluZXdTZWxlY3RvciA9IGdyb3Vwcy5qb2luKCIsIik7DQoJCQkJfQ0KDQoJCQkJaWYgKCBuZXdTZWxlY3RvciApIHsNCgkJCQkJdHJ5IHsNCgkJCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIHNsaWNlLmNhbGwoIG5ld0NvbnRleHQucXVlcnlTZWxlY3RvckFsbCgNCgkJCQkJCQluZXdTZWxlY3Rvcg0KCQkJCQkJKSwgMCApICk7DQoJCQkJCQlyZXR1cm4gcmVzdWx0czsNCgkJCQkJfSBjYXRjaChxc2FFcnJvcikgew0KCQkJCQl9IGZpbmFsbHkgew0KCQkJCQkJaWYgKCAhb2xkICkgew0KCQkJCQkJCWNvbnRleHQucmVtb3ZlQXR0cmlidXRlKCJpZCIpOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KDQoJCQlyZXR1cm4gb2xkU2VsZWN0KCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCwgeG1sICk7DQoJCX07DQoNCgkJaWYgKCBtYXRjaGVzICkgew0KCQkJYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7DQoJCQkJLy8gQ2hlY2sgdG8gc2VlIGlmIGl0J3MgcG9zc2libGUgdG8gZG8gbWF0Y2hlc1NlbGVjdG9yDQoJCQkJLy8gb24gYSBkaXNjb25uZWN0ZWQgbm9kZSAoSUUgOSkNCgkJCQlkaXNjb25uZWN0ZWRNYXRjaCA9IG1hdGNoZXMuY2FsbCggZGl2LCAiZGl2IiApOw0KDQoJCQkJLy8gVGhpcyBzaG91bGQgZmFpbCB3aXRoIGFuIGV4Y2VwdGlvbg0KCQkJCS8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWQNCgkJCQl0cnkgew0KCQkJCQltYXRjaGVzLmNhbGwoIGRpdiwgIlt0ZXN0IT0nJ106c2l6emxlIiApOw0KCQkJCQlyYnVnZ3lNYXRjaGVzLnB1c2goICIhPSIsIHBzZXVkb3MgKTsNCgkJCQl9IGNhdGNoICggZSApIHt9DQoJCQl9KTsNCg0KCQkJLy8gcmJ1Z2d5TWF0Y2hlcyBhbHdheXMgY29udGFpbnMgOmFjdGl2ZSBhbmQgOmZvY3VzLCBzbyBubyBuZWVkIGZvciBhIGxlbmd0aCBjaGVjaw0KCQkJcmJ1Z2d5TWF0Y2hlcyA9IC8qIHJidWdneU1hdGNoZXMubGVuZ3RoICYmICovIG5ldyBSZWdFeHAoIHJidWdneU1hdGNoZXMuam9pbigifCIpICk7DQoNCgkJCVNpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggZWxlbSwgZXhwciApIHsNCgkJCQkvLyBNYWtlIHN1cmUgdGhhdCBhdHRyaWJ1dGUgc2VsZWN0b3JzIGFyZSBxdW90ZWQNCgkJCQlleHByID0gZXhwci5yZXBsYWNlKCByYXR0cmlidXRlUXVvdGVzLCAiPSckMSddIiApOw0KDQoJCQkJLy8gcmJ1Z2d5TWF0Y2hlcyBhbHdheXMgY29udGFpbnMgOmFjdGl2ZSwgc28gbm8gbmVlZCBmb3IgYW4gZXhpc3RlbmNlIGNoZWNrDQoJCQkJaWYgKCAhaXNYTUwoIGVsZW0gKSAmJiAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KCBleHByICkgJiYgIXJidWdneVFTQS50ZXN0KCBleHByICkgKSB7DQoJCQkJCXRyeSB7DQoJCQkJCQl2YXIgcmV0ID0gbWF0Y2hlcy5jYWxsKCBlbGVtLCBleHByICk7DQoNCgkJCQkJCS8vIElFIDkncyBtYXRjaGVzU2VsZWN0b3IgcmV0dXJucyBmYWxzZSBvbiBkaXNjb25uZWN0ZWQgbm9kZXMNCgkJCQkJCWlmICggcmV0IHx8IGRpc2Nvbm5lY3RlZE1hdGNoIHx8DQoJCQkJCQkJCS8vIEFzIHdlbGwsIGRpc2Nvbm5lY3RlZCBub2RlcyBhcmUgc2FpZCB0byBiZSBpbiBhIGRvY3VtZW50DQoJCQkJCQkJCS8vIGZyYWdtZW50IGluIElFIDkNCgkJCQkJCQkJZWxlbS5kb2N1bWVudCAmJiBlbGVtLmRvY3VtZW50Lm5vZGVUeXBlICE9PSAxMSApIHsNCgkJCQkJCQlyZXR1cm4gcmV0Ow0KCQkJCQkJfQ0KCQkJCQl9IGNhdGNoKGUpIHt9DQoJCQkJfQ0KDQoJCQkJcmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgWyBlbGVtIF0gKS5sZW5ndGggPiAwOw0KCQkJfTsNCgkJfQ0KCX0pKCk7DQp9DQoNCi8vIERlcHJlY2F0ZWQNCkV4cHIucHNldWRvc1sibnRoIl0gPSBFeHByLnBzZXVkb3NbImVxIl07DQoNCi8vIEJhY2stY29tcGF0DQpmdW5jdGlvbiBzZXRGaWx0ZXJzKCkge30NCkV4cHIuZmlsdGVycyA9IHNldEZpbHRlcnMucHJvdG90eXBlID0gRXhwci5wc2V1ZG9zOw0KRXhwci5zZXRGaWx0ZXJzID0gbmV3IHNldEZpbHRlcnMoKTsNCg0KLy8gT3ZlcnJpZGUgc2l6emxlIGF0dHJpYnV0ZSByZXRyaWV2YWwNClNpenpsZS5hdHRyID0galF1ZXJ5LmF0dHI7DQpqUXVlcnkuZmluZCA9IFNpenpsZTsNCmpRdWVyeS5leHByID0gU2l6emxlLnNlbGVjdG9yczsNCmpRdWVyeS5leHByWyI6Il0gPSBqUXVlcnkuZXhwci5wc2V1ZG9zOw0KalF1ZXJ5LnVuaXF1ZSA9IFNpenpsZS51bmlxdWVTb3J0Ow0KalF1ZXJ5LnRleHQgPSBTaXp6bGUuZ2V0VGV4dDsNCmpRdWVyeS5pc1hNTERvYyA9IFNpenpsZS5pc1hNTDsNCmpRdWVyeS5jb250YWlucyA9IFNpenpsZS5jb250YWluczsNCg0KDQp9KSggd2luZG93ICk7DQp2YXIgcnVudGlsID0gL1VudGlsJC8sDQoJcnBhcmVudHNwcmV2ID0gL14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sDQoJaXNTaW1wbGUgPSAvXi5bXjojXFtcLixdKiQvLA0KCXJuZWVkc0NvbnRleHQgPSBqUXVlcnkuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQsDQoJLy8gbWV0aG9kcyBndWFyYW50ZWVkIHRvIHByb2R1Y2UgYSB1bmlxdWUgc2V0IHdoZW4gc3RhcnRpbmcgZnJvbSBhIHVuaXF1ZSBzZXQNCglndWFyYW50ZWVkVW5pcXVlID0gew0KCQljaGlsZHJlbjogdHJ1ZSwNCgkJY29udGVudHM6IHRydWUsDQoJCW5leHQ6IHRydWUsDQoJCXByZXY6IHRydWUNCgl9Ow0KDQpqUXVlcnkuZm4uZXh0ZW5kKHsNCglmaW5kOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7DQoJCXZhciBpLCBsLCBsZW5ndGgsIG4sIHIsIHJldCwNCgkJCXNlbGYgPSB0aGlzOw0KDQoJCWlmICggdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5nIiApIHsNCgkJCXJldHVybiBqUXVlcnkoIHNlbGVjdG9yICkuZmlsdGVyKGZ1bmN0aW9uKCkgew0KCQkJCWZvciAoIGkgPSAwLCBsID0gc2VsZi5sZW5ndGg7IGkgPCBsOyBpKysgKSB7DQoJCQkJCWlmICggalF1ZXJ5LmNvbnRhaW5zKCBzZWxmWyBpIF0sIHRoaXMgKSApIHsNCgkJCQkJCXJldHVybiB0cnVlOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfSk7DQoJCX0NCg0KCQlyZXQgPSB0aGlzLnB1c2hTdGFjayggIiIsICJmaW5kIiwgc2VsZWN0b3IgKTsNCg0KCQlmb3IgKCBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICkgew0KCQkJbGVuZ3RoID0gcmV0Lmxlbmd0aDsNCgkJCWpRdWVyeS5maW5kKCBzZWxlY3RvciwgdGhpc1tpXSwgcmV0ICk7DQoNCgkJCWlmICggaSA+IDAgKSB7DQoJCQkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHJlc3VsdHMgYXJlIHVuaXF1ZQ0KCQkJCWZvciAoIG4gPSBsZW5ndGg7IG4gPCByZXQubGVuZ3RoOyBuKysgKSB7DQoJCQkJCWZvciAoIHIgPSAwOyByIDwgbGVuZ3RoOyByKysgKSB7DQoJCQkJCQlpZiAoIHJldFtyXSA9PT0gcmV0W25dICkgew0KCQkJCQkJCXJldC5zcGxpY2Uobi0tLCAxKTsNCgkJCQkJCQlicmVhazsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfQ0KDQoJCXJldHVybiByZXQ7DQoJfSwNCg0KCWhhczogZnVuY3Rpb24oIHRhcmdldCApIHsNCgkJdmFyIGksDQoJCQl0YXJnZXRzID0galF1ZXJ5KCB0YXJnZXQsIHRoaXMgKSwNCgkJCWxlbiA9IHRhcmdldHMubGVuZ3RoOw0KDQoJCXJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpIHsNCgkJCWZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7DQoJCQkJaWYgKCBqUXVlcnkuY29udGFpbnMoIHRoaXMsIHRhcmdldHNbaV0gKSApIHsNCgkJCQkJcmV0dXJuIHRydWU7DQoJCQkJfQ0KCQkJfQ0KCQl9KTsNCgl9LA0KDQoJbm90OiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7DQoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KHRoaXMsIHNlbGVjdG9yLCBmYWxzZSksICJub3QiLCBzZWxlY3Rvcik7DQoJfSwNCg0KCWZpbHRlcjogZnVuY3Rpb24oIHNlbGVjdG9yICkgew0KCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyh0aGlzLCBzZWxlY3RvciwgdHJ1ZSksICJmaWx0ZXIiLCBzZWxlY3RvciApOw0KCX0sDQoNCglpczogZnVuY3Rpb24oIHNlbGVjdG9yICkgew0KCQlyZXR1cm4gISFzZWxlY3RvciAmJiAoDQoJCQl0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciID8NCgkJCQkvLyBJZiB0aGlzIGlzIGEgcG9zaXRpb25hbC9yZWxhdGl2ZSBzZWxlY3RvciwgY2hlY2sgbWVtYmVyc2hpcCBpbiB0aGUgcmV0dXJuZWQgc2V0DQoJCQkJLy8gc28gJCgicDpmaXJzdCIpLmlzKCJwOmxhc3QiKSB3b24ndCByZXR1cm4gdHJ1ZSBmb3IgYSBkb2Mgd2l0aCB0d28gInAiLg0KCQkJCXJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSA/DQoJCQkJCWpRdWVyeSggc2VsZWN0b3IsIHRoaXMuY29udGV4dCApLmluZGV4KCB0aGlzWzBdICkgPj0gMCA6DQoJCQkJCWpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCB0aGlzICkubGVuZ3RoID4gMCA6DQoJCQkJdGhpcy5maWx0ZXIoIHNlbGVjdG9yICkubGVuZ3RoID4gMCApOw0KCX0sDQoNCgljbG9zZXN0OiBmdW5jdGlvbiggc2VsZWN0b3JzLCBjb250ZXh0ICkgew0KCQl2YXIgY3VyLA0KCQkJaSA9IDAsDQoJCQlsID0gdGhpcy5sZW5ndGgsDQoJCQlyZXQgPSBbXSwNCgkJCXBvcyA9IHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3JzICkgfHwgdHlwZW9mIHNlbGVjdG9ycyAhPT0gInN0cmluZyIgPw0KCQkJCWpRdWVyeSggc2VsZWN0b3JzLCBjb250ZXh0IHx8IHRoaXMuY29udGV4dCApIDoNCgkJCQkwOw0KDQoJCWZvciAoIDsgaSA8IGw7IGkrKyApIHsNCgkJCWN1ciA9IHRoaXNbaV07DQoNCgkJCXdoaWxlICggY3VyICYmIGN1ci5vd25lckRvY3VtZW50ICYmIGN1ciAhPT0gY29udGV4dCAmJiBjdXIubm9kZVR5cGUgIT09IDExICkgew0KCQkJCWlmICggcG9zID8gcG9zLmluZGV4KGN1cikgPiAtMSA6IGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvcihjdXIsIHNlbGVjdG9ycykgKSB7DQoJCQkJCXJldC5wdXNoKCBjdXIgKTsNCgkJCQkJYnJlYWs7DQoJCQkJfQ0KCQkJCWN1ciA9IGN1ci5wYXJlbnROb2RlOw0KCQkJfQ0KCQl9DQoNCgkJcmV0ID0gcmV0Lmxlbmd0aCA+IDEgPyBqUXVlcnkudW5pcXVlKCByZXQgKSA6IHJldDsNCg0KCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCwgImNsb3Nlc3QiLCBzZWxlY3RvcnMgKTsNCgl9LA0KDQoJLy8gRGV0ZXJtaW5lIHRoZSBwb3NpdGlvbiBvZiBhbiBlbGVtZW50IHdpdGhpbg0KCS8vIHRoZSBtYXRjaGVkIHNldCBvZiBlbGVtZW50cw0KCWluZGV4OiBmdW5jdGlvbiggZWxlbSApIHsNCg0KCQkvLyBObyBhcmd1bWVudCwgcmV0dXJuIGluZGV4IGluIHBhcmVudA0KCQlpZiAoICFlbGVtICkgew0KCQkJcmV0dXJuICggdGhpc1swXSAmJiB0aGlzWzBdLnBhcmVudE5vZGUgKSA/IHRoaXMucHJldkFsbCgpLmxlbmd0aCA6IC0xOw0KCQl9DQoNCgkJLy8gaW5kZXggaW4gc2VsZWN0b3INCgkJaWYgKCB0eXBlb2YgZWxlbSA9PT0gInN0cmluZyIgKSB7DQoJCQlyZXR1cm4galF1ZXJ5LmluQXJyYXkoIHRoaXNbMF0sIGpRdWVyeSggZWxlbSApICk7DQoJCX0NCg0KCQkvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQNCgkJcmV0dXJuIGpRdWVyeS5pbkFycmF5KA0KCQkJLy8gSWYgaXQgcmVjZWl2ZXMgYSBqUXVlcnkgb2JqZWN0LCB0aGUgZmlyc3QgZWxlbWVudCBpcyB1c2VkDQoJCQllbGVtLmpxdWVyeSA/IGVsZW1bMF0gOiBlbGVtLCB0aGlzICk7DQoJfSwNCg0KCWFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgew0KCQl2YXIgc2V0ID0gdHlwZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIiA/DQoJCQkJalF1ZXJ5KCBzZWxlY3RvciwgY29udGV4dCApIDoNCgkJCQlqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciAmJiBzZWxlY3Rvci5ub2RlVHlwZSA/IFsgc2VsZWN0b3IgXSA6IHNlbGVjdG9yICksDQoJCQlhbGwgPSBqUXVlcnkubWVyZ2UoIHRoaXMuZ2V0KCksIHNldCApOw0KDQoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggaXNEaXNjb25uZWN0ZWQoIHNldFswXSApIHx8IGlzRGlzY29ubmVjdGVkKCBhbGxbMF0gKSA/DQoJCQlhbGwgOg0KCQkJalF1ZXJ5LnVuaXF1ZSggYWxsICkgKTsNCgl9LA0KDQoJYWRkQmFjazogZnVuY3Rpb24oIHNlbGVjdG9yICkgew0KCQlyZXR1cm4gdGhpcy5hZGQoIHNlbGVjdG9yID09IG51bGwgPw0KCQkJdGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZpbHRlcihzZWxlY3RvcikNCgkJKTsNCgl9DQp9KTsNCg0KalF1ZXJ5LmZuLmFuZFNlbGYgPSBqUXVlcnkuZm4uYWRkQmFjazsNCg0KLy8gQSBwYWluZnVsbHkgc2ltcGxlIGNoZWNrIHRvIHNlZSBpZiBhbiBlbGVtZW50IGlzIGRpc2Nvbm5lY3RlZA0KLy8gZnJvbSBhIGRvY3VtZW50IChzaG91bGQgYmUgaW1wcm92ZWQsIHdoZXJlIGZlYXNpYmxlKS4NCmZ1bmN0aW9uIGlzRGlzY29ubmVjdGVkKCBub2RlICkgew0KCXJldHVybiAhbm9kZSB8fCAhbm9kZS5wYXJlbnROb2RlIHx8IG5vZGUucGFyZW50Tm9kZS5ub2RlVHlwZSA9PT0gMTE7DQp9DQoNCmZ1bmN0aW9uIHNpYmxpbmcoIGN1ciwgZGlyICkgew0KCWRvIHsNCgkJY3VyID0gY3VyWyBkaXIgXTsNCgl9IHdoaWxlICggY3VyICYmIGN1ci5ub2RlVHlwZSAhPT0gMSApOw0KDQoJcmV0dXJuIGN1cjsNCn0NCg0KalF1ZXJ5LmVhY2goew0KCXBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7DQoJCXZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7DQoJCXJldHVybiBwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlICE9PSAxMSA/IHBhcmVudCA6IG51bGw7DQoJfSwNCglwYXJlbnRzOiBmdW5jdGlvbiggZWxlbSApIHsNCgkJcmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJwYXJlbnROb2RlIiApOw0KCX0sDQoJcGFyZW50c1VudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7DQoJCXJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAicGFyZW50Tm9kZSIsIHVudGlsICk7DQoJfSwNCgluZXh0OiBmdW5jdGlvbiggZWxlbSApIHsNCgkJcmV0dXJuIHNpYmxpbmcoIGVsZW0sICJuZXh0U2libGluZyIgKTsNCgl9LA0KCXByZXY6IGZ1bmN0aW9uKCBlbGVtICkgew0KCQlyZXR1cm4gc2libGluZyggZWxlbSwgInByZXZpb3VzU2libGluZyIgKTsNCgl9LA0KCW5leHRBbGw6IGZ1bmN0aW9uKCBlbGVtICkgew0KCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgIm5leHRTaWJsaW5nIiApOw0KCX0sDQoJcHJldkFsbDogZnVuY3Rpb24oIGVsZW0gKSB7DQoJCXJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiApOw0KCX0sDQoJbmV4dFVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7DQoJCXJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAibmV4dFNpYmxpbmciLCB1bnRpbCApOw0KCX0sDQoJcHJldlVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7DQoJCXJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiwgdW50aWwgKTsNCgl9LA0KCXNpYmxpbmdzOiBmdW5jdGlvbiggZWxlbSApIHsNCgkJcmV0dXJuIGpRdWVyeS5zaWJsaW5nKCAoIGVsZW0ucGFyZW50Tm9kZSB8fCB7fSApLmZpcnN0Q2hpbGQsIGVsZW0gKTsNCgl9LA0KCWNoaWxkcmVuOiBmdW5jdGlvbiggZWxlbSApIHsNCgkJcmV0dXJuIGpRdWVyeS5zaWJsaW5nKCBlbGVtLmZpcnN0Q2hpbGQgKTsNCgl9LA0KCWNvbnRlbnRzOiBmdW5jdGlvbiggZWxlbSApIHsNCgkJcmV0dXJuIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlmcmFtZSIgKSA/DQoJCQllbGVtLmNvbnRlbnREb2N1bWVudCB8fCBlbGVtLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQgOg0KCQkJalF1ZXJ5Lm1lcmdlKCBbXSwgZWxlbS5jaGlsZE5vZGVzICk7DQoJfQ0KfSwgZnVuY3Rpb24oIG5hbWUsIGZuICkgew0KCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHVudGlsLCBzZWxlY3RvciApIHsNCgkJdmFyIHJldCA9IGpRdWVyeS5tYXAoIHRoaXMsIGZuLCB1bnRpbCApOw0KDQoJCWlmICggIXJ1bnRpbC50ZXN0KCBuYW1lICkgKSB7DQoJCQlzZWxlY3RvciA9IHVudGlsOw0KCQl9DQoNCgkJaWYgKCBzZWxlY3RvciAmJiB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgew0KCQkJcmV0ID0galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIHJldCApOw0KCQl9DQoNCgkJcmV0ID0gdGhpcy5sZW5ndGggPiAxICYmICFndWFyYW50ZWVkVW5pcXVlWyBuYW1lIF0gPyBqUXVlcnkudW5pcXVlKCByZXQgKSA6IHJldDsNCg0KCQlpZiAoIHRoaXMubGVuZ3RoID4gMSAmJiBycGFyZW50c3ByZXYudGVzdCggbmFtZSApICkgew0KCQkJcmV0ID0gcmV0LnJldmVyc2UoKTsNCgkJfQ0KDQoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0LCBuYW1lLCBjb3JlX3NsaWNlLmNhbGwoIGFyZ3VtZW50cyApLmpvaW4oIiwiKSApOw0KCX07DQp9KTsNCg0KalF1ZXJ5LmV4dGVuZCh7DQoJZmlsdGVyOiBmdW5jdGlvbiggZXhwciwgZWxlbXMsIG5vdCApIHsNCgkJaWYgKCBub3QgKSB7DQoJCQlleHByID0gIjpub3QoIiArIGV4cHIgKyAiKSI7DQoJCX0NCg0KCQlyZXR1cm4gZWxlbXMubGVuZ3RoID09PSAxID8NCgkJCWpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvcihlbGVtc1swXSwgZXhwcikgPyBbIGVsZW1zWzBdIF0gOiBbXSA6DQoJCQlqUXVlcnkuZmluZC5tYXRjaGVzKGV4cHIsIGVsZW1zKTsNCgl9LA0KDQoJZGlyOiBmdW5jdGlvbiggZWxlbSwgZGlyLCB1bnRpbCApIHsNCgkJdmFyIG1hdGNoZWQgPSBbXSwNCgkJCWN1ciA9IGVsZW1bIGRpciBdOw0KDQoJCXdoaWxlICggY3VyICYmIGN1ci5ub2RlVHlwZSAhPT0gOSAmJiAodW50aWwgPT09IHVuZGVmaW5lZCB8fCBjdXIubm9kZVR5cGUgIT09IDEgfHwgIWpRdWVyeSggY3VyICkuaXMoIHVudGlsICkpICkgew0KCQkJaWYgKCBjdXIubm9kZVR5cGUgPT09IDEgKSB7DQoJCQkJbWF0Y2hlZC5wdXNoKCBjdXIgKTsNCgkJCX0NCgkJCWN1ciA9IGN1cltkaXJdOw0KCQl9DQoJCXJldHVybiBtYXRjaGVkOw0KCX0sDQoNCglzaWJsaW5nOiBmdW5jdGlvbiggbiwgZWxlbSApIHsNCgkJdmFyIHIgPSBbXTsNCg0KCQlmb3IgKCA7IG47IG4gPSBuLm5leHRTaWJsaW5nICkgew0KCQkJaWYgKCBuLm5vZGVUeXBlID09PSAxICYmIG4gIT09IGVsZW0gKSB7DQoJCQkJci5wdXNoKCBuICk7DQoJCQl9DQoJCX0NCg0KCQlyZXR1cm4gcjsNCgl9DQp9KTsNCg0KLy8gSW1wbGVtZW50IHRoZSBpZGVudGljYWwgZnVuY3Rpb25hbGl0eSBmb3IgZmlsdGVyIGFuZCBub3QNCmZ1bmN0aW9uIHdpbm5vdyggZWxlbWVudHMsIHF1YWxpZmllciwga2VlcCApIHsNCg0KCS8vIENhbid0IHBhc3MgbnVsbCBvciB1bmRlZmluZWQgdG8gaW5kZXhPZiBpbiBGaXJlZm94IDQNCgkvLyBTZXQgdG8gMCB0byBza2lwIHN0cmluZyBjaGVjaw0KCXF1YWxpZmllciA9IHF1YWxpZmllciB8fCAwOw0KDQoJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcXVhbGlmaWVyICkgKSB7DQoJCXJldHVybiBqUXVlcnkuZ3JlcChlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7DQoJCQl2YXIgcmV0VmFsID0gISFxdWFsaWZpZXIuY2FsbCggZWxlbSwgaSwgZWxlbSApOw0KCQkJcmV0dXJuIHJldFZhbCA9PT0ga2VlcDsNCgkJfSk7DQoNCgl9IGVsc2UgaWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7DQoJCXJldHVybiBqUXVlcnkuZ3JlcChlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7DQoJCQlyZXR1cm4gKCBlbGVtID09PSBxdWFsaWZpZXIgKSA9PT0ga2VlcDsNCgkJfSk7DQoNCgl9IGVsc2UgaWYgKCB0eXBlb2YgcXVhbGlmaWVyID09PSAic3RyaW5nIiApIHsNCgkJdmFyIGZpbHRlcmVkID0galF1ZXJ5LmdyZXAoZWxlbWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgew0KCQkJcmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDE7DQoJCX0pOw0KDQoJCWlmICggaXNTaW1wbGUudGVzdCggcXVhbGlmaWVyICkgKSB7DQoJCQlyZXR1cm4galF1ZXJ5LmZpbHRlcihxdWFsaWZpZXIsIGZpbHRlcmVkLCAha2VlcCk7DQoJCX0gZWxzZSB7DQoJCQlxdWFsaWZpZXIgPSBqUXVlcnkuZmlsdGVyKCBxdWFsaWZpZXIsIGZpbHRlcmVkICk7DQoJCX0NCgl9DQoNCglyZXR1cm4galF1ZXJ5LmdyZXAoZWxlbWVudHMsIGZ1bmN0aW9uKCBlbGVtLCBpICkgew0KCQlyZXR1cm4gKCBqUXVlcnkuaW5BcnJheSggZWxlbSwgcXVhbGlmaWVyICkgPj0gMCApID09PSBrZWVwOw0KCX0pOw0KfQ0KZnVuY3Rpb24gY3JlYXRlU2FmZUZyYWdtZW50KCBkb2N1bWVudCApIHsNCgl2YXIgbGlzdCA9IG5vZGVOYW1lcy5zcGxpdCggInwiICksDQoJc2FmZUZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7DQoNCglpZiAoIHNhZmVGcmFnLmNyZWF0ZUVsZW1lbnQgKSB7DQoJCXdoaWxlICggbGlzdC5sZW5ndGggKSB7DQoJCQlzYWZlRnJhZy5jcmVhdGVFbGVtZW50KA0KCQkJCWxpc3QucG9wKCkNCgkJCSk7DQoJCX0NCgl9DQoJcmV0dXJuIHNhZmVGcmFnOw0KfQ0KDQp2YXIgbm9kZU5hbWVzID0gImFiYnJ8YXJ0aWNsZXxhc2lkZXxhdWRpb3xiZGl8Y2FudmFzfGRhdGF8ZGF0YWxpc3R8ZGV0YWlsc3xmaWdjYXB0aW9ufGZpZ3VyZXxmb290ZXJ8IiArDQoJCSJoZWFkZXJ8aGdyb3VwfG1hcmt8bWV0ZXJ8bmF2fG91dHB1dHxwcm9ncmVzc3xzZWN0aW9ufHN1bW1hcnl8dGltZXx2aWRlbyIsDQoJcmlubGluZWpRdWVyeSA9IC8galF1ZXJ5XGQrPSIoPzpudWxsfFxkKykiL2csDQoJcmxlYWRpbmdXaGl0ZXNwYWNlID0gL15ccysvLA0KCXJ4aHRtbFRhZyA9IC88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzpdKylbXj5dKilcLz4vZ2ksDQoJcnRhZ05hbWUgPSAvPChbXHc6XSspLywNCglydGJvZHkgPSAvPHRib2R5L2ksDQoJcmh0bWwgPSAvPHwmIz9cdys7LywNCglybm9Jbm5lcmh0bWwgPSAvPCg/OnNjcmlwdHxzdHlsZXxsaW5rKS9pLA0KCXJub2NhY2hlID0gLzwoPzpzY3JpcHR8b2JqZWN0fGVtYmVkfG9wdGlvbnxzdHlsZSkvaSwNCglybm9zaGltY2FjaGUgPSBuZXcgUmVnRXhwKCI8KD86IiArIG5vZGVOYW1lcyArICIpW1xccy8+XSIsICJpIiksDQoJcmNoZWNrYWJsZVR5cGUgPSAvXig/OmNoZWNrYm94fHJhZGlvKSQvLA0KCS8vIGNoZWNrZWQ9ImNoZWNrZWQiIG9yIGNoZWNrZWQNCglyY2hlY2tlZCA9IC9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLA0KCXJzY3JpcHRUeXBlID0gL1wvKGphdmF8ZWNtYSlzY3JpcHQvaSwNCglyY2xlYW5TY3JpcHQgPSAvXlxzKjwhKD86XFtDREFUQVxbfFwtXC0pfFtcXVwtXXsyfT5ccyokL2csDQoJd3JhcE1hcCA9IHsNCgkJb3B0aW9uOiBbIDEsICI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwgIjwvc2VsZWN0PiIgXSwNCgkJbGVnZW5kOiBbIDEsICI8ZmllbGRzZXQ+IiwgIjwvZmllbGRzZXQ+IiBdLA0KCQl0aGVhZDogWyAxLCAiPHRhYmxlPiIsICI8L3RhYmxlPiIgXSwNCgkJdHI6IFsgMiwgIjx0YWJsZT48dGJvZHk+IiwgIjwvdGJvZHk+PC90YWJsZT4iIF0sDQoJCXRkOiBbIDMsICI8dGFibGU+PHRib2R5Pjx0cj4iLCAiPC90cj48L3Rib2R5PjwvdGFibGU+IiBdLA0KCQljb2w6IFsgMiwgIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwgIjwvY29sZ3JvdXA+PC90YWJsZT4iIF0sDQoJCWFyZWE6IFsgMSwgIjxtYXA+IiwgIjwvbWFwPiIgXSwNCgkJX2RlZmF1bHQ6IFsgMCwgIiIsICIiIF0NCgl9LA0KCXNhZmVGcmFnbWVudCA9IGNyZWF0ZVNhZmVGcmFnbWVudCggZG9jdW1lbnQgKSwNCglmcmFnbWVudERpdiA9IHNhZmVGcmFnbWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikgKTsNCg0Kd3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uOw0Kd3JhcE1hcC50Ym9keSA9IHdyYXBNYXAudGZvb3QgPSB3cmFwTWFwLmNvbGdyb3VwID0gd3JhcE1hcC5jYXB0aW9uID0gd3JhcE1hcC50aGVhZDsNCndyYXBNYXAudGggPSB3cmFwTWFwLnRkOw0KDQovLyBJRTYtOCBjYW4ndCBzZXJpYWxpemUgbGluaywgc2NyaXB0LCBzdHlsZSwgb3IgYW55IGh0bWw1IChOb1Njb3BlKSB0YWdzLA0KLy8gdW5sZXNzIHdyYXBwZWQgaW4gYSBkaXYgd2l0aCBub24tYnJlYWtpbmcgY2hhcmFjdGVycyBpbiBmcm9udCBvZiBpdC4NCmlmICggIWpRdWVyeS5zdXBwb3J0Lmh0bWxTZXJpYWxpemUgKSB7DQoJd3JhcE1hcC5fZGVmYXVsdCA9IFsgMSwgIlg8ZGl2PiIsICI8L2Rpdj4iIF07DQp9DQoNCmpRdWVyeS5mbi5leHRlbmQoew0KCXRleHQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHsNCgkJcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHsNCgkJCXJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8NCgkJCQlqUXVlcnkudGV4dCggdGhpcyApIDoNCgkJCQl0aGlzLmVtcHR5KCkuYXBwZW5kKCAoIHRoaXNbMF0gJiYgdGhpc1swXS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50ICkuY3JlYXRlVGV4dE5vZGUoIHZhbHVlICkgKTsNCgkJfSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggKTsNCgl9LA0KDQoJd3JhcEFsbDogZnVuY3Rpb24oIGh0bWwgKSB7DQoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHsNCgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSkgew0KCQkJCWpRdWVyeSh0aGlzKS53cmFwQWxsKCBodG1sLmNhbGwodGhpcywgaSkgKTsNCgkJCX0pOw0KCQl9DQoNCgkJaWYgKCB0aGlzWzBdICkgew0KCQkJLy8gVGhlIGVsZW1lbnRzIHRvIHdyYXAgdGhlIHRhcmdldCBhcm91bmQNCgkJCXZhciB3cmFwID0galF1ZXJ5KCBodG1sLCB0aGlzWzBdLm93bmVyRG9jdW1lbnQgKS5lcSgwKS5jbG9uZSh0cnVlKTsNCg0KCQkJaWYgKCB0aGlzWzBdLnBhcmVudE5vZGUgKSB7DQoJCQkJd3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbMF0gKTsNCgkJCX0NCg0KCQkJd3JhcC5tYXAoZnVuY3Rpb24oKSB7DQoJCQkJdmFyIGVsZW0gPSB0aGlzOw0KDQoJCQkJd2hpbGUgKCBlbGVtLmZpcnN0Q2hpbGQgJiYgZWxlbS5maXJzdENoaWxkLm5vZGVUeXBlID09PSAxICkgew0KCQkJCQllbGVtID0gZWxlbS5maXJzdENoaWxkOw0KCQkJCX0NCg0KCQkJCXJldHVybiBlbGVtOw0KCQkJfSkuYXBwZW5kKCB0aGlzICk7DQoJCX0NCg0KCQlyZXR1cm4gdGhpczsNCgl9LA0KDQoJd3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHsNCgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggaHRtbCApICkgew0KCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7DQoJCQkJalF1ZXJ5KHRoaXMpLndyYXBJbm5lciggaHRtbC5jYWxsKHRoaXMsIGkpICk7DQoJCQl9KTsNCgkJfQ0KDQoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7DQoJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApLA0KCQkJCWNvbnRlbnRzID0gc2VsZi5jb250ZW50cygpOw0KDQoJCQlpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHsNCgkJCQljb250ZW50cy53cmFwQWxsKCBodG1sICk7DQoNCgkJCX0gZWxzZSB7DQoJCQkJc2VsZi5hcHBlbmQoIGh0bWwgKTsNCgkJCX0NCgkJfSk7DQoJfSwNCg0KCXdyYXA6IGZ1bmN0aW9uKCBodG1sICkgew0KCQl2YXIgaXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICk7DQoNCgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7DQoJCQlqUXVlcnkoIHRoaXMgKS53cmFwQWxsKCBpc0Z1bmN0aW9uID8gaHRtbC5jYWxsKHRoaXMsIGkpIDogaHRtbCApOw0KCQl9KTsNCgl9LA0KDQoJdW53cmFwOiBmdW5jdGlvbigpIHsNCgkJcmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpIHsNCgkJCWlmICggIWpRdWVyeS5ub2RlTmFtZSggdGhpcywgImJvZHkiICkgKSB7DQoJCQkJalF1ZXJ5KCB0aGlzICkucmVwbGFjZVdpdGgoIHRoaXMuY2hpbGROb2RlcyApOw0KCQkJfQ0KCQl9KS5lbmQoKTsNCgl9LA0KDQoJYXBwZW5kOiBmdW5jdGlvbigpIHsNCgkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCB0cnVlLCBmdW5jdGlvbiggZWxlbSApIHsNCgkJCWlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSApIHsNCgkJCQl0aGlzLmFwcGVuZENoaWxkKCBlbGVtICk7DQoJCQl9DQoJCX0pOw0KCX0sDQoNCglwcmVwZW5kOiBmdW5jdGlvbigpIHsNCgkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCB0cnVlLCBmdW5jdGlvbiggZWxlbSApIHsNCgkJCWlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSApIHsNCgkJCQl0aGlzLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcy5maXJzdENoaWxkICk7DQoJCQl9DQoJCX0pOw0KCX0sDQoNCgliZWZvcmU6IGZ1bmN0aW9uKCkgew0KCQlpZiAoICFpc0Rpc2Nvbm5lY3RlZCggdGhpc1swXSApICkgew0KCQkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCBmYWxzZSwgZnVuY3Rpb24oIGVsZW0gKSB7DQoJCQkJdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcyApOw0KCQkJfSk7DQoJCX0NCg0KCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7DQoJCQl2YXIgc2V0ID0galF1ZXJ5LmNsZWFuKCBhcmd1bWVudHMgKTsNCgkJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm1lcmdlKCBzZXQsIHRoaXMgKSwgImJlZm9yZSIsIHRoaXMuc2VsZWN0b3IgKTsNCgkJfQ0KCX0sDQoNCglhZnRlcjogZnVuY3Rpb24oKSB7DQoJCWlmICggIWlzRGlzY29ubmVjdGVkKCB0aGlzWzBdICkgKSB7DQoJCQlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsIGZhbHNlLCBmdW5jdGlvbiggZWxlbSApIHsNCgkJCQl0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7DQoJCQl9KTsNCgkJfQ0KDQoJCWlmICggYXJndW1lbnRzLmxlbmd0aCApIHsNCgkJCXZhciBzZXQgPSBqUXVlcnkuY2xlYW4oIGFyZ3VtZW50cyApOw0KCQkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkubWVyZ2UoIHRoaXMsIHNldCApLCAiYWZ0ZXIiLCB0aGlzLnNlbGVjdG9yICk7DQoJCX0NCgl9LA0KDQoJLy8ga2VlcERhdGEgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LS1kbyBub3QgZG9jdW1lbnQNCglyZW1vdmU6IGZ1bmN0aW9uKCBzZWxlY3Rvciwga2VlcERhdGEgKSB7DQoJCXZhciBlbGVtLA0KCQkJaSA9IDA7DQoNCgkJZm9yICggOyAoZWxlbSA9IHRoaXNbaV0pICE9IG51bGw7IGkrKyApIHsNCgkJCWlmICggIXNlbGVjdG9yIHx8IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCBbIGVsZW0gXSApLmxlbmd0aCApIHsNCgkJCQlpZiAoICFrZWVwRGF0YSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgew0KCQkJCQlqUXVlcnkuY2xlYW5EYXRhKCBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikgKTsNCgkJCQkJalF1ZXJ5LmNsZWFuRGF0YSggWyBlbGVtIF0gKTsNCgkJCQl9DQoNCgkJCQlpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHsNCgkJCQkJZWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbGVtICk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoNCgkJcmV0dXJuIHRoaXM7DQoJfSwNCg0KCWVtcHR5OiBmdW5jdGlvbigpIHsNCgkJdmFyIGVsZW0sDQoJCQlpID0gMDsNCg0KCQlmb3IgKCA7IChlbGVtID0gdGhpc1tpXSkgIT0gbnVsbDsgaSsrICkgew0KCQkJLy8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzDQoJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7DQoJCQkJalF1ZXJ5LmNsZWFuRGF0YSggZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpICk7DQoJCQl9DQoNCgkJCS8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG5vZGVzDQoJCQl3aGlsZSAoIGVsZW0uZmlyc3RDaGlsZCApIHsNCgkJCQllbGVtLnJlbW92ZUNoaWxkKCBlbGVtLmZpcnN0Q2hpbGQgKTsNCgkJCX0NCgkJfQ0KDQoJCXJldHVybiB0aGlzOw0KCX0sDQoNCgljbG9uZTogZnVuY3Rpb24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkgew0KCQlkYXRhQW5kRXZlbnRzID0gZGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZmFsc2UgOiBkYXRhQW5kRXZlbnRzOw0KCQlkZWVwRGF0YUFuZEV2ZW50cyA9IGRlZXBEYXRhQW5kRXZlbnRzID09IG51bGwgPyBkYXRhQW5kRXZlbnRzIDogZGVlcERhdGFBbmRFdmVudHM7DQoNCgkJcmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbiAoKSB7DQoJCQlyZXR1cm4galF1ZXJ5LmNsb25lKCB0aGlzLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApOw0KCQl9KTsNCgl9LA0KDQoJaHRtbDogZnVuY3Rpb24oIHZhbHVlICkgew0KCQlyZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkgew0KCQkJdmFyIGVsZW0gPSB0aGlzWzBdIHx8IHt9LA0KCQkJCWkgPSAwLA0KCQkJCWwgPSB0aGlzLmxlbmd0aDsNCg0KCQkJaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgew0KCQkJCXJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxID8NCgkJCQkJZWxlbS5pbm5lckhUTUwucmVwbGFjZSggcmlubGluZWpRdWVyeSwgIiIgKSA6DQoJCQkJCXVuZGVmaW5lZDsNCgkJCX0NCg0KCQkJLy8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRNTA0KCQkJaWYgKCB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciICYmICFybm9Jbm5lcmh0bWwudGVzdCggdmFsdWUgKSAmjg0KCQkJCSggalF1ZXJ5LnN1cHBvcnQuaHRtbFNlcmlhbGl6ZSB8fCAhcm5vc2hpbWNhY2hlLnRlc3QoIHZhbHVlICkgICkgJiYNCgkJCQkoIGpRdWVyeS5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlIHx8ICFybGVhZGluZ1doaXRlc3BhY2UudGVzdCggdmFsdWUgKSApICYmDQoJCQkJIXdyYXBNYXBbICggcnRhZ05hbWUuZXhlYyggdmFsdWUgKSB8fCBbIiIsICIiXSApWzFdLnRvTG93ZXJDYXNlKCkgXSApIHsNCg0KCQkJCXZhbHVlID0gdmFsdWUucmVwbGFjZSggcnhodG1sVGFnLCAiPCQxPjwvJDI+IiApOw0KDQoJCQkJdHJ5IHsNCgkJCQkJZm9yICg7IGkgPCBsOyBpKysgKSB7DQoJCQkJCQkvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3MNCgkJCQkJCWVsZW0gPSB0aGlzW2ldIHx8IHt9Ow0KCQkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgew0KCQkJCQkJCWpRdWVyeS5jbGVhbkRhdGEoIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoICIqIiApICk7DQoJCQkJCQkJZWxlbS5pbm5lckhUTUwgPSB2YWx1ZTsNCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCWVsZW0gPSAwOw0KDQoJCQkJLy8gSWYgdXNpbmcgaW5uZXJIVE1MIHRocm93cyBhbiBleGNlcHRpb24sIHVzZSB0aGUgZmFsbGJhY2sgbWV0aG9kDQoJCQkJfSBjYXRjaChlKSB7fQ0KCQkJfQ0KDQoJCQlpZiAoIGVsZW0gKSB7DQoJCQkJdGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTsNCgkJCX0NCgkJfSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggKTsNCgl9LA0KDQoJcmVwbGFjZVdpdGg6IGZ1bmN0aW9uKCB2YWx1ZSApIHsNCgkJaWYgKCAhaXNEaXNjb25uZWN0ZWQoIHRoaXNbMF0gKSApIHsNCgkJCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBlbGVtZW50cyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBET00gYmVmb3JlIHRoZXkgYXJlIGluc2VydGVkDQoJCQkvLyB0aGlzIGNhbiBoZWxwIGZpeCByZXBsYWNpbmcgYSBwYXJlbnQgd2l0aCBjaGlsZCBlbGVtZW50cw0KCQkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHsNCgkJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpIHsNCgkJCQkJdmFyIHNlbGYgPSBqUXVlcnkodGhpcyksIG9sZCA9IHNlbGYuaHRtbCgpOw0KCQkJCQlzZWxmLnJlcGxhY2VXaXRoKCB2YWx1ZS5jYWxsKCB0aGlzLCBpLCBvbGQgKSApOw0KCQkJCX0pOw0KCQkJfQ0KDQoJCQlpZiAoIHR5cGVvZiB2YWx1ZSAhPT0gInN0cmluZyIgKSB7DQoJCQkJdmFsdWUgPSBqUXVlcnkoIHZhbHVlICkuZGV0YWNoKCk7DQoJCQl9DQoNCgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7DQoJCQkJdmFyIG5leHQgPSB0aGlzLm5leHRTaWJsaW5nLA0KCQkJCQlwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7DQoNCgkJCQlqUXVlcnkoIHRoaXMgKS5yZW1vdmUoKTsNCg0KCQkJCWlmICggbmV4dCApIHsNCgkJCQkJalF1ZXJ5KG5leHQpLmJlZm9yZSggdmFsdWUgKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlqUXVlcnkocGFyZW50KS5hcHBlbmQoIHZhbHVlICk7DQoJCQkJfQ0KCQkJfSk7DQoJCX0NCg0KCQlyZXR1cm4gdGhpcy5sZW5ndGggPw0KCQkJdGhpcy5wdXNoU3RhY2soIGpRdWVyeShqUXVlcnkuaXNGdW5jdGlvbih2YWx1ZSkgPyB2YWx1ZSgpIDogdmFsdWUpLCAicmVwbGFjZVdpdGgiLCB2YWx1ZSApIDoNCgkJCXRoaXM7DQoJfSwNCg0KCWRldGFjaDogZnVuY3Rpb24oIHNlbGVjdG9yICkgew0KCQlyZXR1cm4gdGhpcy5yZW1vdmUoIHNlbGVjdG9yLCB0cnVlICk7DQoJfSwNCg0KCWRvbU1hbmlwOiBmdW5jdGlvbiggYXJncywgdGFibGUsIGNhbGxiYWNrICkgew0KDQoJCS8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXMNCgkJYXJncyA9IFtdLmNvbmNhdC5hcHBseSggW10sIGFyZ3MgKTsNCg0KCQl2YXIgcmVzdWx0cywgZmlyc3QsIGZyYWdtZW50LCBpTm9DbG9uZSwNCgkJCWkgPSAwLA0KCQkJdmFsdWUgPSBhcmdzWzBdLA0KCQkJc2NyaXB0cyA9IFtdLA0KCQkJbCA9IHRoaXMubGVuZ3RoOw0KDQoJCS8vIFdlIGNhbid0IGNsb25lTm9kZSBmcmFnbWVudHMgdGhhdCBjb250YWluIGNoZWNrZWQsIGluIFdlYktpdA0KCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5jaGVja0Nsb25lICYmIGwgPiAxICYmIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgJiYgcmNoZWNrZWQudGVzdCggdmFsdWUgKSApIHsNCgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7DQoJCQkJalF1ZXJ5KHRoaXMpLmRvbU1hbmlwKCBhcmdzLCB0YWJsZSwgY2FsbGJhY2sgKTsNCgkJCX0pOw0KCQl9DQoNCgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbih2YWx1ZSkgKSB7DQoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpIHsNCgkJCQl2YXIgc2VsZiA9IGpRdWVyeSh0aGlzKTsNCgkJCQlhcmdzWzBdID0gdmFsdWUuY2FsbCggdGhpcywgaSwgdGFibGUgPyBzZWxmLmh0bWwoKSA6IHVuZGVmaW5lZCApOw0KCQkJCXNlbGYuZG9tTWFuaXAoIGFyZ3MsIHRhYmxlLCBjYWxsYmFjayApOw0KCQkJfSk7DQoJCX0NCg0KCQlpZiAoIHRoaXNbMF0gKSB7DQoJCQlyZXN1bHRzID0galF1ZXJ5LmJ1aWxkRnJhZ21lbnQoIGFyZ3MsIHRoaXMsIHNjcmlwdHMgKTsNCgkJCWZyYWdtZW50ID0gcmVzdWx0cy5mcmFnbWVudDsNCgkJCWZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsNCg0KCQkJaWYgKCBmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSApIHsNCgkJCQlmcmFnbWVudCA9IGZpcnN0Ow0KCQkJfQ0KDQoJCQlpZiAoIGZpcnN0ICkgew0KCQkJCXRhYmxlID0gdGFibGUgJiYgalF1ZXJ5Lm5vZGVOYW1lKCBmaXJzdCwgInRyIiApOw0KDQoJCQkJLy8gVXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbSBpbnN0ZWFkIG9mIHRoZSBmaXJzdCBiZWNhdXNlIGl0IGNhbiBlbmQgdXANCgkJCQkvLyBiZWluZyBlbXB0aWVkIGluY29ycmVjdGx5IGluIGNlcnRhaW4gc2l0dWF0aW9ucyAoIzgwNzApLg0KCQkJCS8vIEZyYWdtZW50cyBmcm9tIHRoZSBmcmFnbWVudCBjYWNoZSBtdXN0IGFsd2F5cyBiZSBjbG9uZWQgYW5kIG5ldmVyIHVzZWQgaW4gcGxhY2UuDQoJCQkJZm9yICggaU5vQ2xvbmUgPSByZXN1bHRzLmNhY2hlYWJsZSB8fCBsIC0gMTsgaSA8IGw7IGkrKyApIHsNCgkJCQkJY2FsbGJhY2suY2FsbCgNCgkJCQkJCXRhYmxlICYmIGpRdWVyeS5ub2RlTmFtZSggdGhpc1tpXSwgInRhYmxlIiApID8NCgkJCQkJCQlmaW5kT3JBcHBlbmQoIHRoaXNbaV0sICJ0Ym9keSIgKSA6DQoJCQkJCQkJdGhpc1tpXSwNCgkJCQkJCWkgPT09IGlOb0Nsb25lID8NCgkJCQkJCQlmcmFnbWVudCA6DQoJCQkJCQkJalF1ZXJ5LmNsb25lKCBmcmFnbWVudCwgdHJ1ZSwgdHJ1ZSApDQoJCQkJCSk7DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBGaXggIzExODA5OiBBdm9pZCBsZWFraW5nIG1lbW9yeQ0KCQkJZnJhZ21lbnQgPSBmaXJzdCA9IG51bGw7DQoNCgkJCWlmICggc2NyaXB0cy5sZW5ndGggKSB7DQoJCQkJalF1ZXJ5LmVhY2goIHNjcmlwdHMsIGZ1bmN0aW9uKCBpLCBlbGVtICkgew0KCQkJCQlpZiAoIGVsZW0uc3JjICkgew0KCQkJCQkJaWYgKCBqUXVlcnkuYWpheCApIHsNCgkJCQkJCQlqUXVlcnkuYWpheCh7DQoJCQkJCQkJCXVybDogZWxlbS5zcmMsDQoJCQkJCQkJCXR5cGU6ICJHRVQiLA0KCQkJCQkJCQlkYXRhVHlwZTogInNjcmlwdCIsDQoJCQkJCQkJCWFzeW5jOiBmYWxzZSwNCgkJCQkJCQkJZ2xvYmFsOiBmYWxzZSwNCgkJCQkJCQkJInRocm93cyI6IHRydWUNCgkJCQkJCQl9KTsNCgkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJalF1ZXJ5LmVycm9yKCJubyBhamF4Iik7DQoJCQkJCQl9DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQlqUXVlcnkuZ2xvYmFsRXZhbCggKCBlbGVtLnRleHQgfHwgZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVySFRNTCB8fCAiIiApLnJlcGxhY2UoIHJjbGVhblNjcmlwdCwgIiIgKSApOw0KCQkJCQl9DQoNCgkJCQkJaWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7DQoJCQkJCQllbGVtLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGVsZW0gKTsNCgkJCQkJfQ0KCQkJCX0pOw0KCQkJfQ0KCQl9DQoNCgkJcmV0dXJuIHRoaXM7DQoJfQ0KfSk7DQoNCmZ1bmN0aW9uIGZpbmRPckFwcGVuZCggZWxlbSwgdGFnICkgew0KCXJldHVybiBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgKVswXSB8fCBlbGVtLmFwcGVuZENoaWxkKCBlbGVtLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCggdGFnICkgKTsNCn0NCg0KZnVuY3Rpb24gY2xvbmVDb3B5RXZlbnQoIHNyYywgZGVzdCApIHsNCg0KCWlmICggZGVzdC5ub2RlVHlwZSAhPT0gMSB8fCAhalF1ZXJ5Lmhhc0RhdGEoIHNyYyApICkgew0KCQlyZXR1cm47DQoJfQ0KDQoJdmFyIHR5cGUsIGksIGwsDQoJCW9sZERhdGEgPSBqUXVlcnkuX2RhdGEoIHNyYyApLA0KCQljdXJEYXRhID0galF1ZXJ5Ll9kYXRhKCBkZXN0LCBvbGREYXRhICksDQoJCWV2ZW50cyA9IG9sZERhdGEuZXZlbnRzOw0KDQoJaWYgKCBldmVudHMgKSB7DQoJCWRlbGV0ZSBjdXJEYXRhLmhhbmRsZTsNCgkJY3VyRGF0YS5ldmVudHMgPSB7fTsNCg0KCQlmb3IgKCB0eXBlIGluIGV2ZW50cyApIHsNCgkJCWZvciAoIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkgew0KCQkJCWpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUsIGV2ZW50c1sgdHlwZSBdWyBpIF0gKTsNCgkJCX0NCgkJfQ0KCX0NCg0KCS8vIG1ha2UgdGhlIGNsb25lZCBwdWJsaWMgZGF0YSBvYmplY3QgYSBjb3B5IGZyb20gdGhlIG9yaWdpbmFsDQoJaWYgKCBjdXJEYXRhLmRhdGEgKSB7DQoJCWN1ckRhdGEuZGF0YSA9IGpRdWVyeS5leHRlbmQoIHt9LCBjdXJEYXRhLmRhdGEgKTsNCgl9DQp9DQoNCmZ1bmN0aW9uIGNsb25lRml4QXR0cmlidXRlcyggc3JjLCBkZXN0ICkgew0KCXZhciBub2RlTmFtZTsNCg0KCS8vIFdlIGRvIG5vdCBuZWVkIHRvIGRvIGFueXRoaW5nIGZvciBub24tRWxlbWVudHMNCglpZiAoIGRlc3Qubm9kZVR5cGUgIT09IDEgKSB7DQoJCXJldHVybjsNCgl9DQoNCgkvLyBjbGVhckF0dHJpYnV0ZXMgcmVtb3ZlcyB0aGUgYXR0cmlidXRlcywgd2hpY2ggd2UgZG9uJ3Qgd2FudCwNCgkvLyBidXQgYWxzbyByZW1vdmVzIHRoZSBhdHRhY2hFdmVudCBldmVudHMsIHdoaWNoIHdlICpkbyogd2FudA0KCWlmICggZGVzdC5jbGVhckF0dHJpYnV0ZXMgKSB7DQoJCWRlc3QuY2xlYXJBdHRyaWJ1dGVzKCk7DQoJfQ0KDQoJLy8gbWVyZ2VBdHRyaWJ1dGVzLCBpbiBjb250cmFzdCwgb25seSBtZXJnZXMgYmFjayBvbiB0aGUNCgkvLyBvcmlnaW5hbCBhdHRyaWJ1dGVzLCBub3QgdGhlIGV2ZW50cw0KCWlmICggZGVzdC5tZXJnZUF0dHJpYnV0ZXMgKSB7DQoJCWRlc3QubWVyZ2VBdHRyaWJ1dGVzKCBzcmMgKTsNCgl9DQoNCglub2RlTmFtZSA9IGRlc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsNCg0KCWlmICggbm9kZU5hbWUgPT09ICJvYmplY3QiICkgew0KCQkvLyBJRTYtMTAgaW1wcm9wZXJseSBjbG9uZXMgY2hpbGRyZW4gb2Ygb2JqZWN0IGVsZW1lbnRzIHVzaW5nIGNsYXNzaWQuDQoJCS8vIElFMTAgdGhyb3dzIE5vTW9kaWZpY2F0aW9uQWxsb3dlZEVycm9yIGlmIHBhcmVudCBpcyBudWxsLCAjMTIxMzIuDQoJCWlmICggZGVzdC5wYXJlbnROb2RlICkgew0KCQkJZGVzdC5vdXRlckhUTUwgPSBzcmMub3V0ZXJIVE1MOw0KCQl9DQoNCgkJLy8gVGhpcyBwYXRoIGFwcGVhcnMgdW5hdm9pZGFibGUgZm9yIElFOS4gV2hlbiBjbG9uaW5nIGFuIG9iamVjdA0KCQkvLyBlbGVtZW50IGluIElFOSwgdGhlIG91dGVySFRNTCBzdHJhdGVneSBhYm92ZSBpcyBub3Qgc3VmZmljaWVudC4NCgkJLy8gSWYgdGhlIHNyYyBoYXMgaW5uZXJIVE1MIGFuZCB0aGUgZGVzdGluYXRpb24gZG9lcyBub3QsDQoJCS8vIGNvcHkgdGhlIHNyYy5pbm5lckhUTUwgaW50byB0aGUgZGVzdC5pbm5lckhUTUwuICMxMDMyNA0KCQlpZiAoIGpRdWVyeS5zdXBwb3J0Lmh0bWw1Q2xvbmUgJiYgKHNyYy5pbm5lckhUTUwgJiYgIWpRdWVyeS50cmltKGRlc3QuaW5uZXJIVE1MKSkgKSB7DQoJCQlkZXN0LmlubmVySFRNTCA9IHNyYy5pbm5lckhUTUw7DQoJCX0NCg0KCX0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSAiaW5wdXQiICYmIHJjaGVja2FibGVUeXBlLnRlc3QoIHNyYy50eXBlICkgKSB7DQoJCS8vIElFNi04IGZhaWxzIHRvIHBlcnNpc3QgdGhlIGNoZWNrZWQgc3RhdGUgb2YgYSBjbG9uZWQgY2hlY2tib3gNCgkJLy8gb3IgcmFkaW8gYnV0dG9uLiBXb3JzZSwgSUU2LTcgZmFpbCB0byBnaXZlIHRoZSBjbG9uZWQgZWxlbWVudA0KCQkvLyBhIGNoZWNrZWQgYXBwZWFyYW5jZSBpZiB0aGUgZGVmYXVsdENoZWNrZWQgdmFsdWUgaXNuJ3QgYWxzbyBzZXQNCg0KCQlkZXN0LmRlZmF1bHRDaGVja2VkID0gZGVzdC5jaGVja2VkID0gc3JjLmNoZWNrZWQ7DQoNCgkJLy8gSUU2LTcgZ2V0IGNvbmZ1c2VkIGFuZCBlbmQgdXAgc2V0dGluZyB0aGUgdmFsdWUgb2YgYSBjbG9uZWQNCgkJLy8gY2hlY2tib3gvcmFkaW8gYnV0dG9uIHRvIGFuIGVtcHR5IHN0cmluZyBpbnN0ZWFkIG9mICJvbiINCgkJaWYgKCBkZXN0LnZhbHVlICE9PSBzcmMudmFsdWUgKSB7DQoJCQlkZXN0LnZhbHVlID0gc3JjLnZhbHVlOw0KCQl9DQoNCgkvLyBJRTYtOCBmYWlscyB0byByZXR1cm4gdGhlIHNlbGVjdGVkIG9wdGlvbiB0byB0aGUgZGVmYXVsdCBzZWxlY3RlZA0KCS8vIHN0YXRlIHdoZW4gY2xvbmluZyBvcHRpb25zDQoJfSBlbHNlIGlmICggbm9kZU5hbWUgPT09ICJvcHRpb24iICkgew0KCQlkZXN0LnNlbGVjdGVkID0gc3JjLmRlZmF1bHRTZWxlY3RlZDsNCg0KCS8vIElFNi04IGZhaWxzIHRvIHNldCB0aGUgZGVmYXVsdFZhbHVlIHRvIHRoZSBjb3JyZWN0IHZhbHVlIHdoZW4NCgkvLyBjbG9uaW5nIG90aGVyIHR5cGVzIG9mIGlucHV0IGZpZWxkcw0KCX0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSAiaW5wdXQiIHx8IG5vZGVOYW1lID09PSAidGV4dGFyZWEiICkgew0KCQlkZXN0LmRlZmF1bHRWYWx1ZSA9IHNyYy5kZWZhdWx0VmFsdWU7DQoNCgkvLyBJRSBibGFua3MgY29udGVudHMgd2hlbiBjbG9uaW5nIHNjcmlwdHMNCgl9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gInNjcmlwdCIgJiYgZGVzdC50ZXh0ICE9PSBzcmMudGV4dCApIHsNCgkJZGVzdC50ZXh0ID0gc3JjLnRleHQ7DQoJfQ0KDQoJLy8gRXZlbnQgZGF0YSBnZXRzIHJlZmVyZW5jZWQgaW5zdGVhZCBvZiBjb3BpZWQgaWYgdGhlIGV4cGFuZG8NCgkvLyBnZXRzIGNvcGllZCB0b28NCglkZXN0LnJlbW92ZUF0dHJpYnV0ZSggalF1ZXJ5LmV4cGFuZG8gKTsNCn0NCg0KalF1ZXJ5LmJ1aWxkRnJhZ21lbnQgPSBmdW5jdGlvbiggYXJncywgY29udGV4dCwgc2NyaXB0cyApIHsNCgl2YXIgZnJhZ21lbnQsIGNhY2hlYWJsZSwgY2FjaGVoaXQsDQoJCWZpcnN0ID0gYXJnc1sgMCBdOw0KDQoJLy8gU2V0IGNvbnRleHQgZnJvbSB3aGF0IG1heSBjb21lIGluIGFzIHVuZGVmaW5lZCBvciBhIGpRdWVyeSBjb2xsZWN0aW9uIG9yIGEgbm9kZQ0KCS8vIFVwZGF0ZWQgdG8gZml4ICMxMjI2NiB3aGVyZSBhY2Nlc3NpbmcgY29udGV4dFswXSBjb3VsZCB0aHJvdyBhbiBleGNlcHRpb24gaW4gSUU5LzEwICYNCgkvLyBhbHNvIGRvdWJsZXMgYXMgZml4IGZvciAjODk1MCB3aGVyZSBwbGFpbiBvYmplY3RzIGNhdXNlZCBjcmVhdGVEb2N1bWVudEZyYWdtZW50IGV4Y2VwdGlvbg0KCWNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50Ow0KCWNvbnRleHQgPSAhY29udGV4dC5ub2RlVHlwZSAmJiBjb250ZXh0WzBdIHx8IGNvbnRleHQ7DQoJY29udGV4dCA9IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0Ow0KDQoJLy8gT25seSBjYWNoZSAic21hbGwiICgxLzIgS0IpIEhUTUwgc3RyaW5ncyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1haW4gZG9jdW1lbnQNCgkvLyBDbG9uaW5nIG9wdGlvbnMgbG9zZXMgdGhlIHNlbGVjdGVkIHN0YXRlLCBzbyBkb24ndCBjYWNoZSB0aGVtDQoJLy8gSUUgNiBkb2Vzbid0IGxpa2UgaXQgd2hlbiB5b3UgcHV0IDxvYmplY3Q+IG9yIDxlbWJlZD4gZWxlbWVudHMgaW4gYSBmcmFnbWVudA0KCS8vIEFsc28sIFdlYktpdCBkb2VzIG5vdCBjbG9uZSAnY2hlY2tlZCcgYXR0cmlidXRlcyBvbiBjbG9uZU5vZGUsIHNvIGRvbid0IGNhY2hlDQoJLy8gTGFzdGx5LCBJRTYsNyw4IHdpbGwgbm90IGNvcnJlY3RseSByZXVzZSBjYWNoZWQgZnJhZ21lbnRzIHRoYXQgd2VyZSBjcmVhdGVkIGZyb20gdW5rbm93biBlbGVtcyAjMTA1MDENCglpZiAoIGFyZ3MubGVuZ3RoID09PSAxICYmIHR5cGVvZiBmaXJzdCA9PT0gInN0cmluZyIgJiYgZmlyc3QubGVuZ3RoIDwgNTEyICYmIGNvbnRleHQgPT09IGRvY3VtZW50ICYmDQoJCWZpcnN0LmNoYXJBdCgwKSA9PT0gIjwiICYmICFybm9jYWNoZS50ZXN0KCBmaXJzdCApICYmDQoJCShqUXVlcnkuc3VwcG9ydC5jaGVja0Nsb25lIHx8ICFyY2hlY2tlZC50ZXN0KCBmaXJzdCApKSAmjg0KCQkoalF1ZXJ5LnN1cHBvcnQuaHRtbDVDbG9uZSB8fCAhcm5vc2hpbWNhY2hlLnRlc3QoIGZpcnN0ICkpICkgew0KDQoJCS8vIE1hcmsgY2FjaGVhYmxlIGFuZCBsb29rIGZvciBhIGhpdA0KCQljYWNoZWFibGUgPSB0cnVlOw0KCQlmcmFnbWVudCA9IGpRdWVyeS5mcmFnbWVudHNbIGZpcnN0IF07DQoJCWNhY2hlaGl0ID0gZnJhZ21lbnQgIT09IHVuZGVmaW5lZDsNCgl9DQoNCglpZiAoICFmcmFnbWVudCApIHsNCgkJZnJhZ21lbnQgPSBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsNCgkJalF1ZXJ5LmNsZWFuKCBhcmdzLCBjb250ZXh0LCBmcmFnbWVudCwgc2NyaXB0cyApOw0KDQoJCS8vIFVwZGF0ZSB0aGUgY2FjaGUsIGJ1dCBvbmx5IHN0b3JlIGZhbHNlDQoJCS8vIHVubGVzcyB0aGlzIGlzIGEgc2Vjb25kIHBhcnNpbmcgb2YgdGhlIHNhbWUgY29udGVudA0KCQlpZiAoIGNhY2hlYWJsZSApIHsNCgkJCWpRdWVyeS5mcmFnbWVudHNbIGZpcnN0IF0gPSBjYWNoZWhpdCAmJiBmcmFnbWVudDsNCgkJfQ0KCX0NCg0KCXJldHVybiB7IGZyYWdtZW50OiBmcmFnbWVudCwgY2FjaGVhYmxlOiBjYWNoZWFibGUgfTsNCn07DQoNCmpRdWVyeS5mcmFnbWVudHMgPSB7fTsNCg0KalF1ZXJ5LmVhY2goew0KCWFwcGVuZFRvOiAiYXBwZW5kIiwNCglwcmVwZW5kVG86ICJwcmVwZW5kIiwNCglpbnNlcnRCZWZvcmU6ICJiZWZvcmUiLA0KCWluc2VydEFmdGVyOiAiYWZ0ZXIiLA0KCXJlcGxhY2VBbGw6ICJyZXBsYWNlV2l0aCINCn0sIGZ1bmN0aW9uKCBuYW1lLCBvcmlnaW5hbCApIHsNCglqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsNCgkJdmFyIGVsZW1zLA0KCQkJaSA9IDAsDQoJCQlyZXQgPSBbXSwNCgkJCWluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKSwNCgkJCWwgPSBpbnNlcnQubGVuZ3RoLA0KCQkJcGFyZW50ID0gdGhpcy5sZW5ndGggPT09IDEgJiYgdGhpc1swXS5wYXJlbnROb2RlOw0KDQoJCWlmICggKHBhcmVudCA9PSBudWxsIHx8IHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgPT09IDExICYmIHBhcmVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSkgJiYgbCA9PT0gMSApIHsNCgkJCWluc2VydFsgb3JpZ2luYWwgXSggdGhpc1swXSApOw0KCQkJcmV0dXJuIHRoaXM7DQoJCX0gZWxzZSB7DQoJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7DQoJCQkJZWxlbXMgPSAoIGkgPiAwID8gdGhpcy5jbG9uZSh0cnVlKSA6IHRoaXMgKS5nZXQoKTsNCgkJCQlqUXVlcnkoIGluc2VydFtpXSApWyBvcmlnaW5hbCBdKCBlbGVtcyApOw0KCQkJCXJldCA9IHJldC5jb25jYXQoIGVsZW1zICk7DQoJCQl9DQoNCgkJCXJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0LCBuYW1lLCBpbnNlcnQuc2VsZWN0b3IgKTsNCgkJfQ0KCX07DQp9KTsNCg0KZnVuY3Rpb24gZ2V0QWxsKCBlbGVtICkgew0KCWlmICggdHlwZW9mIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICkgew0KCQlyZXR1cm4gZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSggIioiICk7DQoNCgl9IGVsc2UgaWYgKCB0eXBlb2YgZWxlbS5xdWVyeVNlbGVjdG9yQWxsICE9PSAidW5kZWZpbmVkIiApIHsNCgkJcmV0dXJuIGVsZW0ucXVlcnlTZWxlY3RvckFsbCggIioiICk7DQoNCgl9IGVsc2Ugew0KCQlyZXR1cm4gW107DQoJfQ0KfQ0KDQovLyBVc2VkIGluIGNsZWFuLCBmaXhlcyB0aGUgZGVmYXVsdENoZWNrZWQgcHJvcGVydHkNCmZ1bmN0aW9uIGZpeERlZmF1bHRDaGVja2VkKCBlbGVtICkgew0KCWlmICggcmNoZWNrYWJsZVR5cGUudGVzdCggZWxlbS50eXBlICkgKSB7DQoJCWVsZW0uZGVmYXVsdENoZWNrZWQgPSBlbGVtLmNoZWNrZWQ7DQoJfQ0KfQ0KDQpqUXVlcnkuZXh0ZW5kKHsNCgljbG9uZTogZnVuY3Rpb24oIGVsZW0sIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkgew0KCQl2YXIgc3JjRWxlbWVudHMsDQoJCQlkZXN0RWxlbWVudHMsDQoJCQlpLA0KCQkJY2xvbmU7DQoNCgkJaWYgKCBqUXVlcnkuc3VwcG9ydC5odG1sNUNsb25lIHx8IGpRdWVyeS5pc1hNTERvYyhlbGVtKSB8fCAhcm5vc2hpbWNhY2hlLnRlc3QoICI8IiArIGVsZW0ubm9kZU5hbWUgKyAiPiIgKSApIHsNCgkJCWNsb25lID0gZWxlbS5jbG9uZU5vZGUoIHRydWUgKTsNCg0KCQkvLyBJRTw9OCBkb2VzIG5vdCBwcm9wZXJseSBjbG9uZSBkZXRhY2hlZCwgdW5rbm93biBlbGVtZW50IG5vZGVzDQoJCX0gZWxzZSB7DQoJCQlmcmFnbWVudERpdi5pbm5lckhUTUwgPSBlbGVtLm91dGVySFRNTDsNCgkJCWZyYWdtZW50RGl2LnJlbW92ZUNoaWxkKCBjbG9uZSA9IGZyYWdtZW50RGl2LmZpcnN0Q2hpbGQgKTsNCgkJfQ0KDQoJCWlmICggKCFqUXVlcnkuc3VwcG9ydC5ub0Nsb25lRXZlbnQgfHwgIWpRdWVyeS5zdXBwb3J0Lm5vQ2xvbmVDaGVja2VkKSAmjg0KCQkJCShlbGVtLm5vZGVUeXBlID09PSAxIHx8IGVsZW0ubm9kZVR5cGUgPT09IDExKSAmJiAhalF1ZXJ5LmlzWE1MRG9jKGVsZW0pICkgew0KCQkJLy8gSUUgY29waWVzIGV2ZW50cyBib3VuZCB2aWEgYXR0YWNoRXZlbnQgd2hlbiB1c2luZyBjbG9uZU5vZGUuDQoJCQkvLyBDYWxsaW5nIGRldGFjaEV2ZW50IG9uIHRoZSBjbG9uZSB3aWxsIGFsc28gcmVtb3ZlIHRoZSBldmVudHMNCgkJCS8vIGZyb20gdGhlIG9yaWdpbmFsLiBJbiBvcmRlciB0byBnZXQgYXJvdW5kIHRoaXMsIHdlIHVzZSBzb21lDQoJCQkvLyBwcm9wcmlldGFyeSBtZXRob2RzIHRvIGNsZWFyIHRoZSBldmVudHMuIFRoYW5rcyB0byBNb29Ub29scw0KCQkJLy8gZ3V5cyBmb3IgdGhpcyBob3RuZXNzLg0KDQoJCQljbG9uZUZpeEF0dHJpYnV0ZXMoIGVsZW0sIGNsb25lICk7DQoNCgkJCS8vIFVzaW5nIFNpenpsZSBoZXJlIGlzIGNyYXp5IHNsb3csIHNvIHdlIHVzZSBnZXRFbGVtZW50c0J5VGFnTmFtZSBpbnN0ZWFkDQoJCQlzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApOw0KCQkJZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSApOw0KDQoJCQkvLyBXZWlyZCBpdGVyYXRpb24gYmVjYXVzZSBJRSB3aWxsIHJlcGxhY2UgdGhlIGxlbmd0aCBwcm9wZXJ0eQ0KCQkJLy8gd2l0aCBhbiBlbGVtZW50IGlmIHlvdSBhcmUgY2xvbmluZyB0aGUgYm9keSBhbmQgb25lIG9mIHRoZQ0KCQkJLy8gZWxlbWVudHMgb24gdGhlIHBhZ2UgaGFzIGEgbmFtZSBvciBpZCBvZiAibGVuZ3RoIg0KCQkJZm9yICggaSA9IDA7IHNyY0VsZW1lbnRzW2ldOyArK2kgKSB7DQoJCQkJLy8gRW5zdXJlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIG5vZGUgaXMgbm90IG51bGw7IEZpeGVzICM5NTg3DQoJCQkJaWYgKCBkZXN0RWxlbWVudHNbaV0gKSB7DQoJCQkJCWNsb25lRml4QXR0cmlidXRlcyggc3JjRWxlbWVudHNbaV0sIGRlc3RFbGVtZW50c1tpXSApOw0KCQkJCX0NCgkJCX0NCgkJfQ0KDQoJCS8vIENvcHkgdGhlIGV2ZW50cyBmcm9tIHRoZSBvcmlnaW5hbCB0byB0aGUgY2xvbmUNCgkJaWYgKCBkYXRhQW5kRXZlbnRzICkgew0KCQkJY2xvbmVDb3B5RXZlbnQoIGVsZW0sIGNsb25lICk7DQoNCgkJCWlmICggZGVlcERhdGFBbmRFdmVudHMgKSB7DQoJCQkJc3JjRWxlbWVudHMgPSBnZXRBbGwoIGVsZW0gKTsNCgkJCQlkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lICk7DQoNCgkJCQlmb3IgKCBpID0gMDsgc3JjRWxlbWVudHNbaV07ICsraSApIHsNCgkJCQkJY2xvbmVDb3B5RXZlbnQoIHNyY0VsZW1lbnRzW2ldLCBkZXN0RWxlbWVudHNbaV0gKTsNCgkJCQl9DQoJCQl9DQoJCX0NCg0KCQlzcmNFbGVtZW50cyA9IGRlc3RFbGVtZW50cyA9IG51bGw7DQoNCgkJLy8gUmV0dXJuIHRoZSBjbG9uZWQgc2V0DQoJCXJldHVybiBjbG9uZTsNCgl9LA0KDQoJY2xlYW46IGZ1bmN0aW9uKCBlbGVtcywgY29udGV4dCwgZnJhZ21lbnQsIHNjcmlwdHMgKSB7DQoJCXZhciBpLCBqLCBlbGVtLCB0YWcsIHdyYXAsIGRlcHRoLCBkaXYsIGhhc0JvZHksIHRib2R5LCBsZW4sIGhhbmRsZVNjcmlwdCwganNUYWdzLA0KCQkJc2FmZSA9IGNvbnRleHQgPT09IGRvY3VtZW50ICYmIHNhZmVGcmFnbWVudCwNCgkJCXJldCA9IFtdOw0KDQoJCS8vIEVuc3VyZSB0aGF0IGNvbnRleHQgaXMgYSBkb2N1bWVudA0KCQlpZiAoICFjb250ZXh0IHx8IHR5cGVvZiBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQgPT09ICJ1bmRlZmluZWQiICkgew0KCQkJY29udGV4dCA9IGRvY3VtZW50Ow0KCQl9DQoNCgkJLy8gVXNlIHRoZSBhbHJlYWR5LWNyZWF0ZWQgc2FmZSBmcmFnbWVudCBpZiBjb250ZXh0IHBlcm1pdHMNCgkJZm9yICggaSA9IDA7IChlbGVtID0gZWxlbXNbaV0pICE9IG51bGw7IGkrKyApIHsNCgkJCWlmICggdHlwZW9mIGVsZW0gPT09ICJudW1iZXIiICkgew0KCQkJCWVsZW0gKz0gIiI7DQoJCQl9DQoNCgkJCWlmICggIWVsZW0gKSB7DQoJCQkJY29udGludWU7DQoJCQl9DQoNCgkJCS8vIENvbnZlcnQgaHRtbCBzdHJpbmcgaW50byBET00gbm9kZXMNCgkJCWlmICggdHlwZW9mIGVsZW0gPT09ICJzdHJpbmciICkgew0KCQkJCWlmICggIXJodG1sLnRlc3QoIGVsZW0gKSApIHsNCgkJCQkJZWxlbSA9IGNvbnRleHQuY3JlYXRlVGV4dE5vZGUoIGVsZW0gKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQkvLyBFbnN1cmUgYSBzYWZlIGNvbnRhaW5lciBpbiB3aGljaCB0byByZW5kZXIgdGhlIGh0bWwNCgkJCQkJc2FmZSA9IHNhZmUgfHwgY3JlYXRlU2FmZUZyYWdtZW50KCBjb250ZXh0ICk7DQoJCQkJCWRpdiA9IGNvbnRleHQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQoJCQkJCXNhZmUuYXBwZW5kQ2hpbGQoIGRpdiApOw0KDQoJCQkJCS8vIEZpeCAiWEhUTUwiLXN0eWxlIHRhZ3MgaW4gYWxsIGJyb3dzZXJzDQoJCQkJCWVsZW0gPSBlbGVtLnJlcGxhY2UocnhodG1sVGFnLCAiPCQxPjwvJDI+Iik7DQoNCgkJCQkJLy8gR28gdG8gaHRtbCBhbmQgYmFjaywgdGhlbiBwZWVsIG9mZiBleHRyYSB3cmFwcGVycw0KCQkJCQl0YWcgPSAoIHJ0YWdOYW1lLmV4ZWMoIGVsZW0gKSB8fCBbIiIsICIiXSApWzFdLnRvTG93ZXJDYXNlKCk7DQoJCQkJCXdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZhdWx0Ow0KCQkJCQlkZXB0aCA9IHdyYXBbMF07DQoJCQkJCWRpdi5pbm5lckhUTUwgPSB3cmFwWzFdICsgZWxlbSArIHdyYXBbMl07DQoNCgkJCQkJLy8gTW92ZSB0byB0aGUgcmlnaHQgZGVwdGgNCgkJCQkJd2hpbGUgKCBkZXB0aC0tICkgew0KCQkJCQkJZGl2ID0gZGl2Lmxhc3RDaGlsZDsNCgkJCQkJfQ0KDQoJCQkJCS8vIFJlbW92ZSBJRSdzIGF1dG9pbnNlcnRlZCA8dGJvZHk+IGZyb20gdGFibGUgZnJhZ21lbnRzDQoJCQkJCWlmICggIWpRdWVyeS5zdXBwb3J0LnRib2R5ICkgew0KDQoJCQkJCQkvLyBTdHJpbmcgd2FzIGEgPHRhYmxlPiwgKm1heSogaGF2ZSBzcHVyaW91cyA8dGJvZHk+DQoJCQkJCQloYXNCb2R5ID0gcnRib2R5LnRlc3QoZWxlbSk7DQoJCQkJCQkJdGJvZHkgPSB0YWcgPT09ICJ0YWJsZSIgJiYgIWhhc0JvZHkgPw0KCQkJCQkJCQlkaXYuZmlyc3RDaGlsZCAmJiBkaXYuZmlyc3RDaGlsZC5jaGlsZE5vZGVzIDoNCg0KCQkJCQkJCQkvLyBTdHJpbmcgd2FzIGEgYmFyZSA8dGhlYWQ+IG9yIDx0Zm9vdD4NCgkJCQkJCQkJd3JhcFsxXSA9PT0gIjx0YWJsZT4iICYmICFoYXNCb2R5ID8NCgkJCQkJCQkJCWRpdi5jaGlsZE5vZGVzIDoNCgkJCQkJCQkJCVtdOw0KDQoJCQkJCQlmb3IgKCBqID0gdGJvZHkubGVuZ3RoIC0gMTsgaiA+PSAwIDsgLS1qICkgew0KCQkJCQkJCWlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0Ym9keVsgaiBdLCAidGJvZHkiICkgJiYgIXRib2R5WyBqIF0uY2hpbGROb2Rlcy5sZW5ndGggKSB7DQoJCQkJCQkJCXRib2R5WyBqIF0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggdGJvZHlbIGogXSApOw0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCS8vIElFIGNvbXBsZXRlbHkga2lsbHMgbGVhZGluZyB3aGl0ZXNwYWNlIHdoZW4gaW5uZXJIVE1MIGlzIHVzZWQNCgkJCQkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2UgJiYgcmxlYWRpbmdXaGl0ZXNwYWNlLnRlc3QoIGVsZW0gKSApIHsNCgkJCQkJCWRpdi5pbnNlcnRCZWZvcmUoIGNvbnRleHQuY3JlYXRlVGV4dE5vZGUoIHJsZWFkaW5nV2hpdGVzcGFjZS5leGVjKGVsZW0pWzBdICksIGRpdi5maXJzdENoaWxkICk7DQoJCQkJCX0NCg0KCQkJCQllbGVtID0gZGl2LmNoaWxkTm9kZXM7DQoNCgkJCQkJLy8gVGFrZSBvdXQgb2YgZnJhZ21lbnQgY29udGFpbmVyICh3ZSBuZWVkIGEgZnJlc2ggZGl2IGVhY2ggdGltZSkNCgkJCQkJZGl2LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGRpdiApOw0KCQkJCX0NCgkJCX0NCg0KCQkJaWYgKCBlbGVtLm5vZGVUeXBlICkgew0KCQkJCXJldC5wdXNoKCBlbGVtICk7DQoJCQl9IGVsc2Ugew0KCQkJCWpRdWVyeS5tZXJnZSggcmV0LCBlbGVtICk7DQoJCQl9DQoJCX0NCg0KCQkvLyBGaXggIzExMzU2OiBDbGVhciBlbGVtZW50cyBmcm9tIHNhZmVGcmFnbWVudA0KCQlpZiAoIGRpdiApIHsNCgkJCWVsZW0gPSBkaXYgPSBzYWZlID0gbnVsbDsNCgkJfQ0KDQoJCS8vIFJlc2V0IGRlZmF1bHRDaGVja2VkIGZvciBhbnkgcmFkaW9zIGFuZCBjaGVja2JveGVzDQoJCS8vIGFib3V0IHRvIGJlIGFwcGVuZGVkIHRvIHRoZSBET00gaW4gSUUgNi83ICgjODA2MCkNCgkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQuYXBwZW5kQ2hlY2tlZCApIHsNCgkJCWZvciAoIGkgPSAwOyAoZWxlbSA9IHJldFtpXSkgIT0gbnVsbDsgaSsrICkgew0KCQkJCWlmICggalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiaW5wdXQiICkgKSB7DQoJCQkJCWZpeERlZmF1bHRDaGVja2VkKCBlbGVtICk7DQoJCQkJfSBlbHNlIGlmICggdHlwZW9mIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICkgew0KCQkJCQlqUXVlcnkuZ3JlcCggZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKSwgZml4RGVmYXVsdENoZWNrZWQgKTsNCgkJCQl9DQoJCQl9DQoJCX0NCg0KCQkvLyBBcHBlbmQgZWxlbWVudHMgdG8gYSBwcm92aWRlZCBkb2N1bWVudCBmcmFnbWVudA0KCQlpZiAoIGZyYWdtZW50ICkgew0KCQkJLy8gU3BlY2lhbCBoYW5kbGluZyBvZiBlYWNoIHNjcmlwdCBlbGVtZW50DQoJCQloYW5kbGVTY3JpcHQgPSBmdW5jdGlvbiggZWxlbSApIHsNCgkJCQkvLyBDaGVjayBpZiB3ZSBjb25zaWRlciBpdCBleGVjdXRhYmxlDQoJCQkJaWYgKCAhZWxlbS50eXBlIHx8IHJzY3JpcHRUeXBlLnRlc3QoIGVsZW0udHlwZSApICkgew0KCQkJCQkvLyBEZXRhY2ggdGhlIHNjcmlwdCBhbmQgc3RvcmUgaXQgaW4gdGhlIHNjcmlwdHMgYXJyYXkgKGlmIHByb3ZpZGVkKSBvciB0aGUgZnJhZ21lbnQNCgkJCQkJLy8gUmV0dXJuIHRydXRoeSB0byBpbmRpY2F0ZSB0aGF0IGl0IGhhcyBiZWVuIGhhbmRsZWQNCgkJCQkJcmV0dXJuIHNjcmlwdHMgPw0KCQkJCQkJc2NyaXB0cy5wdXNoKCBlbGVtLnBhcmVudE5vZGUgPyBlbGVtLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGVsZW0gKSA6IGVsZW0gKSA6DQoJCQkJCQlmcmFnbWVudC5hcHBlbmRDaGlsZCggZWxlbSApOw0KCQkJCX0NCgkJCX07DQoNCgkJCWZvciAoIGkgPSAwOyAoZWxlbSA9IHJldFtpXSkgIT0gbnVsbDsgaSsrICkgew0KCQkJCS8vIENoZWNrIGlmIHdlJ3JlIGRvbmUgYWZ0ZXIgaGFuZGxpbmcgYW4gZXhlY3V0YWJsZSBzY3JpcHQNCgkJCQlpZiAoICEoIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgInNjcmlwdCIgKSAmJiBoYW5kbGVTY3JpcHQoIGVsZW0gKSApICkgew0KCQkJCQkvLyBBcHBlbmQgdG8gZnJhZ21lbnQgYW5kIGhhbmRsZSBlbWJlZGRlZCBzY3JpcHRzDQoJCQkJCWZyYWdtZW50LmFwcGVuZENoaWxkKCBlbGVtICk7DQoJCQkJCWlmICggdHlwZW9mIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICkgew0KCQkJCQkJLy8gaGFuZGxlU2NyaXB0IGFsdGVycyB0aGUgRE9NLCBzbyB1c2UgalF1ZXJ5Lm1lcmdlIHRvIGVuc3VyZSBzbmFwc2hvdCBpdGVyYXRpb24NCgkJCQkJCWpzVGFncyA9IGpRdWVyeS5ncmVwKCBqUXVlcnkubWVyZ2UoIFtdLCBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSApLCBoYW5kbGVTY3JpcHQgKTsNCg0KCQkJCQkJLy8gU3BsaWNlIHRoZSBzY3JpcHRzIGludG8gcmV0IGFmdGVyIHRoZWlyIGZvcm1lciBhbmNlc3RvciBhbmQgYWR2YW5jZSBvdXIgaW5kZXggYmV5b25kIHRoZW0NCgkJCQkJCXJldC5zcGxpY2UuYXBwbHkoIHJldCwgW2kgKyAxLCAwXS5jb25jYXQoIGpzVGFncyApICk7DQoJCQkJCQlpICs9IGpzVGFncy5sZW5ndGg7DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCX0NCg0KCQlyZXR1cm4gcmV0Ow0KCX0sDQoNCgljbGVhbkRhdGE6IGZ1bmN0aW9uKCBlbGVtcywgLyogaW50ZXJuYWwgKi8gYWNjZXB0RGF0YSApIHsNCgkJdmFyIGRhdGEsIGlkLCBlbGVtLCB0eXBlLA0KCQkJaSA9IDAsDQoJCQlpbnRlcm5hbEtleSA9IGpRdWVyeS5leHBhbmRvLA0KCQkJY2FjaGUgPSBqUXVlcnkuY2FjaGUsDQoJCQlkZWxldGVFeHBhbmRvID0galF1ZXJ5LnN1cHBvcnQuZGVsZXRlRXhwYW5kbywNCgkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbDsNCg0KCQlmb3IgKCA7IChlbGVtID0gZWxlbXNbaV0pICE9IG51bGw7IGkrKyApIHsNCg0KCQkJaWYgKCBhY2NlcHREYXRhIHx8IGpRdWVyeS5hY2NlcHREYXRhKCBlbGVtICkgKSB7DQoNCgkJCQlpZCA9IGVsZW1bIGludGVybmFsS2V5IF07DQoJCQkJZGF0YSA9IGlkICYmIGNhY2hlWyBpZCBdOw0KDQoJCQkJaWYgKCBkYXRhICkgew0KCQkJCQlpZiAoIGRhdGEuZXZlbnRzICkgew0KCQkJCQkJZm9yICggdHlwZSBpbiBkYXRhLmV2ZW50cyApIHsNCgkJCQkJCQlpZiAoIHNwZWNpYWxbIHR5cGUgXSApIHsNCgkJCQkJCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSApOw0KDQoJCQkJCQkJLy8gVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGF2b2lkIGpRdWVyeS5ldmVudC5yZW1vdmUncyBvdmVyaGVhZA0KCQkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJCWpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZGF0YS5oYW5kbGUgKTsNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCg0KCQkJCQkvLyBSZW1vdmUgY2FjaGUgb25seSBpZiBpdCB3YXMgbm90IGFscmVhZHkgcmVtb3ZlZCBieSBqUXVlcnkuZXZlbnQucmVtb3ZlDQoJCQkJCWlmICggY2FjaGVbIGlkIF0gKSB7DQoNCgkJCQkJCWRlbGV0ZSBjYWNoZVsgaWQgXTsNCg0KCQkJCQkJLy8gSUUgZG9lcyBub3QgYWxsb3cgdXMgdG8gZGVsZXRlIGV4cGFuZG8gcHJvcGVydGllcyBmcm9tIG5vZGVzLA0KCQkJCQkJLy8gbm9yIGRvZXMgaXQgaGF2ZSBhIHJlbW92ZUF0dHJpYnV0ZSBmdW5jdGlvbiBvbiBEb2N1bWVudCBub2RlczsNCgkJCQkJCS8vIHdlIG11c3QgaGFuZGxlIGFsbCBvZiB0aGVzZSBjYXNlcw0KCQkJCQkJaWYgKCBkZWxldGVFeHBhbmRvICkgew0KCQkJCQkJCWRlbGV0ZSBlbGVtWyBpbnRlcm5hbEtleSBdOw0KDQoJCQkJCQl9IGVsc2UgaWYgKCBlbGVtLnJlbW92ZUF0dHJpYnV0ZSApIHsNCgkJCQkJCQllbGVtLnJlbW92ZUF0dHJpYnV0ZSggaW50ZXJuYWxLZXkgKTsNCg0KCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQllbGVtWyBpbnRlcm5hbEtleSBdID0gbnVsbDsNCgkJCQkJCX0NCg0KCQkJCQkJalF1ZXJ5LmRlbGV0ZWRJZHMucHVzaCggaWQgKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0NCn0pOw0KLy8gTGltaXQgc2NvcGUgcG9sbHV0aW9uIGZyb20gYW55IGRlcHJlY2F0ZWQgQVBJDQooZnVuY3Rpb24oKSB7DQoNCnZhciBtYXRjaGVkLCBicm93c2VyOw0KDQovLyBVc2Ugb2YgalF1ZXJ5LmJyb3dzZXIgaXMgZnJvd25lZCB1cG9uLg0KLy8gTW9yZSBkZXRhaWxzOiBodHRwOi8vYXBpLmpxdWVyeS5jb20valF1ZXJ5LmJyb3dzZXINCi8vIGpRdWVyeS51YU1hdGNoIG1haW50YWluZWQgZm9yIGJhY2stY29tcGF0DQpqUXVlcnkudWFNYXRjaCA9IGZ1bmN0aW9uKCB1YSApIHsNCgl1YSA9IHVhLnRvTG93ZXJDYXNlKCk7DQoNCgl2YXIgbWF0Y2ggPSAvKGNocm9tZSlbIFwvXShbXHcuXSspLy5leGVjKCB1YSApIHx8DQoJCS8od2Via2l0KVsgXC9dKFtcdy5dKykvLmV4ZWMoIHVhICkgfHwNCgkJLyhvcGVyYSkoPzouKnZlcnNpb258KVsgXC9dKFtcdy5dKykvLmV4ZWMoIHVhICkgfHwNCgkJLyhtc2llKSAoW1x3Ll0rKS8uZXhlYyggdWEgKSB8fA0KCQl1YS5pbmRleE9mKCJjb21wYXRpYmxlIikgPCAwICYmIC8obW96aWxsYSkoPzouKj8gcnY6KFtcdy5dKyl8KS8uZXhlYyggdWEgKSB8fA0KCQlbXTsNCg0KCXJldHVybiB7DQoJCWJyb3dzZXI6IG1hdGNoWyAxIF0gfHwgIiIsDQoJCXZlcnNpb246IG1hdGNoWyAyIF0gfHwgIjAiDQoJfTsNCn07DQoNCm1hdGNoZWQgPSBqUXVlcnkudWFNYXRjaCggbmF2aWdhdG9yLnVzZXJBZ2VudCApOw0KYnJvd3NlciA9IHt9Ow0KDQppZiAoIG1hdGNoZWQuYnJvd3NlciApIHsNCglicm93c2VyWyBtYXRjaGVkLmJyb3dzZXIgXSA9IHRydWU7DQoJYnJvd3Nlci52ZXJzaW9uID0gbWF0Y2hlZC52ZXJzaW9uOw0KfQ0KDQovLyBDaHJvbWUgaXMgV2Via2l0LCBidXQgV2Via2l0IGlzIGFsc28gU2FmYXJpLg0KaWYgKCBicm93c2VyLmNocm9tZSApIHsNCglicm93c2VyLndlYmtpdCA9IHRydWU7DQp9IGVsc2UgaWYgKCBicm93c2VyLndlYmtpdCApIHsNCglicm93c2VyLnNhZmFyaSA9IHRydWU7DQp9DQoNCmpRdWVyeS5icm93c2VyID0gYnJvd3NlcjsNCg0KalF1ZXJ5LnN1YiA9IGZ1bmN0aW9uKCkgew0KCWZ1bmN0aW9uIGpRdWVyeVN1Yiggc2VsZWN0b3IsIGNvbnRleHQgKSB7DQoJCXJldHVybiBuZXcgalF1ZXJ5U3ViLmZuLmluaXQoIHNlbGVjdG9yLCBjb250ZXh0ICk7DQoJfQ0KCWpRdWVyeS5leHRlbmQoIHRydWUsIGpRdWVyeVN1YiwgdGhpcyApOw0KCWpRdWVyeVN1Yi5zdXBlcmNsYXNzID0gdGhpczsNCglqUXVlcnlTdWIuZm4gPSBqUXVlcnlTdWIucHJvdG90eXBlID0gdGhpcygpOw0KCWpRdWVyeVN1Yi5mbi5jb25zdHJ1Y3RvciA9IGpRdWVyeVN1YjsNCglqUXVlcnlTdWIuc3ViID0gdGhpcy5zdWI7DQoJalF1ZXJ5U3ViLmZuLmluaXQgPSBmdW5jdGlvbiBpbml0KCBzZWxlY3RvciwgY29udGV4dCApIHsNCgkJaWYgKCBjb250ZXh0ICYmIGNvbnRleHQgaW5zdGFuY2VvZiBqUXVlcnkgJiYgIShjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5U3ViKSApIHsNCgkJCWNvbnRleHQgPSBqUXVlcnlTdWIoIGNvbnRleHQgKTsNCgkJfQ0KDQoJCXJldHVybiBqUXVlcnkuZm4uaW5pdC5jYWxsKCB0aGlzLCBzZWxlY3RvciwgY29udGV4dCwgcm9vdGpRdWVyeVN1YiApOw0KCX07DQoJalF1ZXJ5U3ViLmZuLmluaXQucHJvdG90eXBlID0galF1ZXJ5U3ViLmZuOw0KCXZhciByb290alF1ZXJ5U3ViID0galF1ZXJ5U3ViKGRvY3VtZW50KTsNCglyZXR1cm4galF1ZXJ5U3ViOw0KfTsNCg0KfSkoKTsNCnZhciBjdXJDU1MsIGlmcmFtZSwgaWZyYW1lRG9jLA0KCXJhbHBoYSA9IC9hbHBoYVwoW14pXSpcKS9pLA0KCXJvcGFjaXR5ID0gL29wYWNpdHk9KFteKV0qKS8sDQoJcnBvc2l0aW9uID0gL14odG9wfHJpZ2h0fGJvdHRvbXxsZWZ0KSQvLA0KCS8vIHN3YXBwYWJsZSBpZiBkaXNwbGF5IGlzIG5vbmUgb3Igc3RhcnRzIHdpdGggdGFibGUgZXhjZXB0ICJ0YWJsZSIsICJ0YWJsZS1jZWxsIiwgb3IgInRhYmxlLWNhcHRpb24iDQoJLy8gc2VlIGhlcmUgZm9yIGRpc3BsYXkgdmFsdWVzOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0NTUy9kaXNwbGF5DQoJcmRpc3BsYXlzd2FwID0gL14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLA0KCXJtYXJnaW4gPSAvXm1hcmdpbi8sDQoJcm51bXNwbGl0ID0gbmV3IFJlZ0V4cCggIl4oIiArIGNvcmVfcG51bSArICIpKC4qKSQiLCAiaSIgKSwNCglybnVtbm9ucHggPSBuZXcgUmVnRXhwKCAiXigiICsgY29yZV9wbnVtICsgIikoPyFweClbYS16JV0rJCIsICJpIiApLA0KCXJyZWxOdW0gPSBuZXcgUmVnRXhwKCAiXihbLStdKT0oIiArIGNvcmVfcG51bSArICIpIiwgImkiICksDQoJZWxlbWRpc3BsYXkgPSB7IEJPRFk6ICJibG9jayIgfSwNCg0KCWNzc1Nob3cgPSB7IHBvc2l0aW9uOiAiYWJzb2x1dGUiLCB2aXNpYmlsaXR5OiAiaGlkZGVuIiwgZGlzcGxheTogImJsb2NrIiB9LA0KCWNzc05vcm1hbFRyYW5zZm9ybSA9IHsNCgkJbGV0dGVyU3BhY2luZzogMCwNCgkJZm9udFdlaWdodDogNDAwDQoJfSwNCg0KCWNzc0V4cGFuZCA9IFsgIlRvcCIsICJSaWdodCIsICJCb3R0b20iLCAiTGVmdCIgXSwNCgljc3NQcmVmaXhlcyA9IFsgIldlYmtpdCIsICJPIiwgIk1veiIsICJtcyIgXSwNCg0KCWV2ZW50c1RvZ2dsZSA9IGpRdWVyeS5mbi50b2dnbGU7DQoNCi8vIHJldHVybiBhIGNzcyBwcm9wZXJ0eSBtYXBwZWQgdG8gYSBwb3RlbnRpYWxseSB2ZW5kb3IgcHJlZml4ZWQgcHJvcGVydHkNCmZ1bmN0aW9uIHZlbmRvclByb3BOYW1lKCBzdHlsZSwgbmFtZSApIHsNCg0KCS8vIHNob3J0Y3V0IGZvciBuYW1lcyB0aGF0IGFyZSBub3QgdmVuZG9yIHByZWZpeGVkDQoJaWYgKCBuYW1lIGluIHN0eWxlICkgew0KCQlyZXR1cm4gbmFtZTsNCgl9DQoNCgkvLyBjaGVjayBmb3IgdmVuZG9yIHByZWZpeGVkIG5hbWVzDQoJdmFyIGNhcE5hbWUgPSBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKSwNCgkJb3JpZ05hbWUgPSBuYW1lLA0KCQlpID0gY3NzUHJlZml4ZXMubGVuZ3RoOw0KDQoJd2hpbGUgKCBpLS0gKSB7DQoJCW5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsgY2FwTmFtZTsNCgkJaWYgKCBuYW1lIGluIHN0eWxlICkgew0KCQkJcmV0dXJuIG5hbWU7DQoJCX0NCgl9DQoNCglyZXR1cm4gb3JpZ05hbWU7DQp9DQoNCmZ1bmN0aW9uIGlzSGlkZGVuKCBlbGVtLCBlbCApIHsNCgllbGVtID0gZWwgfHwgZWxlbTsNCglyZXR1cm4galF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICkgPT09ICJub25lIiB8fCAhalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTsNCn0NCg0KZnVuY3Rpb24gc2hvd0hpZGUoIGVsZW1lbnRzLCBzaG93ICkgew0KCXZhciBlbGVtLCBkaXNwbGF5LA0KCQl2YWx1ZXMgPSBbXSwNCgkJaW5kZXggPSAwLA0KCQlsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7DQoNCglmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkgew0KCQllbGVtID0gZWxlbWVudHNbIGluZGV4IF07DQoJCWlmICggIWVsZW0uc3R5bGUgKSB7DQoJCQljb250aW51ZTsNCgkJfQ0KCQl2YWx1ZXNbIGluZGV4IF0gPSBqUXVlcnkuX2RhdGEoIGVsZW0sICJvbGRkaXNwbGF5IiApOw0KCQlpZiAoIHNob3cgKSB7DQoJCQkvLyBSZXNldCB0aGUgaW5saW5lIGRpc3BsYXkgb2YgdGhpcyBlbGVtZW50IHRvIGxlYXJuIGlmIGl0IGlzDQoJCQkvLyBiZWluZyBoaWRkZW4gYnkgY2FzY2FkZWQgcnVsZXMgb3Igbm90DQoJCQlpZiAoICF2YWx1ZXNbIGluZGV4IF0gJiYgZWxlbS5zdHlsZS5kaXNwbGF5ID09PSAibm9uZSIgKSB7DQoJCQkJZWxlbS5zdHlsZS5kaXNwbGF5ID0gIiI7DQoJCQl9DQoNCgkJCS8vIFNldCBlbGVtZW50cyB3aGljaCBoYXZlIGJlZW4gb3ZlcnJpZGRlbiB3aXRoIGRpc3BsYXk6IG5vbmUNCgkJCS8vIGluIGEgc3R5bGVzaGVldCB0byB3aGF0ZXZlciB0aGUgZGVmYXVsdCBicm93c2VyIHN0eWxlIGlzDQoJCQkvLyBmb3Igc3VjaCBhbiBlbGVtZW50DQoJCQlpZiAoIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gIiIgJiYgaXNIaWRkZW4oIGVsZW0gKSApIHsNCgkJCQl2YWx1ZXNbIGluZGV4IF0gPSBqUXVlcnkuX2RhdGEoIGVsZW0sICJvbGRkaXNwbGF5IiwgY3NzX2RlZmF1bHREaXNwbGF5KGVsZW0ubm9kZU5hbWUpICk7DQoJCQl9DQoJCX0gZWxzZSB7DQoJCQlkaXNwbGF5ID0gY3VyQ1NTKCBlbGVtLCAiZGlzcGxheSIgKTsNCg0KCQkJaWYgKCAhdmFsdWVzWyBpbmRleCBdICYmIGRpc3BsYXkgIT09ICJub25lIiApIHsNCgkJCQlqUXVlcnkuX2RhdGEoIGVsZW0sICJvbGRkaXNwbGF5IiwgZGlzcGxheSApOw0KCQkJfQ0KCQl9DQoJfQ0KDQoJLy8gU2V0IHRoZSBkaXNwbGF5IG9mIG1vc3Qgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3ANCgkvLyB0byBhdm9pZCB0aGUgY29uc3RhbnQgcmVmbG93DQoJZm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsNCgkJZWxlbSA9IGVsZW1lbnRzWyBpbmRleCBdOw0KCQlpZiAoICFlbGVtLnN0eWxlICkgew0KCQkJY29udGludWU7DQoJCX0NCgkJaWYgKCAhc2hvdyB8fCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICJub25lIiB8fCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICIiICkgew0KCQkJZWxlbS5zdHlsZS5kaXNwbGF5ID0gc2hvdyA/IHZhbHVlc1sgaW5kZXggXSB8fCAiIiA6ICJub25lIjsNCgkJfQ0KCX0NCg0KCXJldHVybiBlbGVtZW50czsNCn0NCg0KalF1ZXJ5LmZuLmV4dGVuZCh7DQoJY3NzOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7DQoJCXJldHVybiBqUXVlcnkuYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7DQoJCQlyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/DQoJCQkJalF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lLCB2YWx1ZSApIDoNCgkJCQlqUXVlcnkuY3NzKCBlbGVtLCBuYW1lICk7DQoJCX0sIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApOw0KCX0sDQoJc2hvdzogZnVuY3Rpb24oKSB7DQoJCXJldHVybiBzaG93SGlkZSggdGhpcywgdHJ1ZSApOw0KCX0sDQoJaGlkZTogZnVuY3Rpb24oKSB7DQoJCXJldHVybiBzaG93SGlkZSggdGhpcyApOw0KCX0sDQoJdG9nZ2xlOiBmdW5jdGlvbiggc3RhdGUsIGZuMiApIHsNCgkJdmFyIGJvb2wgPSB0eXBlb2Ygc3RhdGUgPT09ICJib29sZWFuIjsNCg0KCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBzdGF0ZSApICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBmbjIgKSApIHsNCgkJCXJldHVybiBldmVudHNUb2dnbGUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOw0KCQl9DQoNCgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsNCgkJCWlmICggYm9vbCA/IHN0YXRlIDogaXNIaWRkZW4oIHRoaXMgKSApIHsNCgkJCQlqUXVlcnkoIHRoaXMgKS5zaG93KCk7DQoJCQl9IGVsc2Ugew0KCQkJCWpRdWVyeSggdGhpcyApLmhpZGUoKTsNCgkJCX0NCgkJfSk7DQoJfQ0KfSk7DQoNCmpRdWVyeS5leHRlbmQoew0KCS8vIEFkZCBpbiBzdHlsZSBwcm9wZXJ0eSBob29rcyBmb3Igb3ZlcnJpZGluZyB0aGUgZGVmYXVsdA0KCS8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBzdHlsZSBwcm9wZXJ0eQ0KCWNzc0hvb2tzOiB7DQoJCW9wYWNpdHk6IHsNCgkJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgew0KCQkJCWlmICggY29tcHV0ZWQgKSB7DQoJCQkJCS8vIFdlIHNob3VsZCBhbHdheXMgZ2V0IGEgbnVtYmVyIGJhY2sgZnJvbSBvcGFjaXR5DQoJCQkJCXZhciByZXQgPSBjdXJDU1MoIGVsZW0sICJvcGFjaXR5IiApOw0KCQkJCQlyZXR1cm4gcmV0ID09PSAiIiA/ICIxIiA6IHJldDsNCg0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0sDQoNCgkvLyBFeGNsdWRlIHRoZSBmb2xsb3dpbmcgY3NzIHByb3BlcnRpZXMgdG8gYWRkIHB4DQoJY3NzTnVtYmVyOiB7DQoJCSJmaWxsT3BhY2l0eSI6IHRydWUsDQoJCSJmb250V2VpZ2h0IjogdHJ1ZSwNCgkJImxpbmVIZWlnaHQiOiB0cnVlLA0KCQkib3BhY2l0eSI6IHRydWUsDQoJCSJvcnBoYW5zIjogdHJ1ZSwNCgkJIndpZG93cyI6IHRydWUsDQoJCSJ6SW5kZXgiOiB0cnVlLA0KCQkiem9vbSI6IHRydWUNCgl9LA0KDQoJLy8gQWRkIGluIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9yZQ0KCS8vIHNldHRpbmcgb3IgZ2V0dGluZyB0aGUgdmFsdWUNCgljc3NQcm9wczogew0KCQkvLyBub3JtYWxpemUgZmxvYXQgY3NzIHByb3BlcnR5DQoJCSJmbG9hdCI6IGpRdWVyeS5zdXBwb3J0LmNzc0Zsb2F0ID8gImNzc0Zsb2F0IiA6ICJzdHlsZUZsb2F0Ig0KCX0sDQoNCgkvLyBHZXQgYW5kIHNldCB0aGUgc3R5bGUgcHJvcGVydHkgb24gYSBET00gTm9kZQ0KCXN0eWxlOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUsIGV4dHJhICkgew0KCQkvLyBEb24ndCBzZXQgc3R5bGVzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXMNCgkJaWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggfHwgIWVsZW0uc3R5bGUgKSB7DQoJCQlyZXR1cm47DQoJCX0NCg0KCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWUNCgkJdmFyIHJldCwgdHlwZSwgaG9va3MsDQoJCQlvcmlnTmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSwNCgkJCXN0eWxlID0gZWxlbS5zdHlsZTsNCg0KCQluYW1lID0galF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdIHx8ICggalF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdID0gdmVuZG9yUHJvcE5hbWUoIHN0eWxlLCBvcmlnTmFtZSApICk7DQoNCgkJLy8gZ2V0cyBob29rIGZvciB0aGUgcHJlZml4ZWQgdmVyc2lvbg0KCQkvLyBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCB2ZXJzaW9uDQoJCWhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdOw0KDQoJCS8vIENoZWNrIGlmIHdlJ3JlIHNldHRpbmcgYSB2YWx1ZQ0KCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7DQoJCQl0eXBlID0gdHlwZW9mIHZhbHVlOw0KDQoJCQkvLyBjb252ZXJ0IHJlbGF0aXZlIG51bWJlciBzdHJpbmdzICgrPSBvciAtPSkgdG8gcmVsYXRpdmUgbnVtYmVycy4gIzczNDUNCgkJCWlmICggdHlwZSA9PT0gInN0cmluZyIgJiYgKHJldCA9IHJyZWxOdW0uZXhlYyggdmFsdWUgKSkgKSB7DQoJCQkJdmFsdWUgPSAoIHJldFsxXSArIDEgKSAqIHJldFsyXSArIHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKSApOw0KCQkJCS8vIEZpeGVzIGJ1ZyAjOTIzNw0KCQkJCXR5cGUgPSAibnVtYmVyIjsNCgkJCX0NCg0KCQkJLy8gTWFrZSBzdXJlIHRoYXQgTmFOIGFuZCBudWxsIHZhbHVlcyBhcmVuJ3Qgc2V0LiBTZWU6ICM3MTE2DQoJCQlpZiAoIHZhbHVlID09IG51bGwgfHwgdHlwZSA9PT0gIm51bWJlciIgJiYgaXNOYU4oIHZhbHVlICkgKSB7DQoJCQkJcmV0dXJuOw0KCQkJfQ0KDQoJCQkvLyBJZiBhIG51bWJlciB3YXMgcGFzc2VkIGluLCBhZGQgJ3B4JyB0byB0aGUgKGV4Y2VwdCBmb3IgY2VydGFpbiBDU1MgcHJvcGVydGllcykNCgkJCWlmICggdHlwZSA9PT0gIm51bWJlciIgJiYgIWpRdWVyeS5jc3NOdW1iZXJbIG9yaWdOYW1lIF0gKSB7DQoJCQkJdmFsdWUgKz0gInB4IjsNCgkJCX0NCg0KCQkJLy8gSWYgYSBob29rIHdhcyBwcm92aWRlZCwgdXNlIHRoYXQgdmFsdWUsIG90aGVyd2lzZSBqdXN0IHNldCB0aGUgc3BlY2lmaWVkIHZhbHVlDQoJCQlpZiAoICFob29rcyB8fCAhKCJzZXQiIGluIGhvb2tzKSB8fCAodmFsdWUgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBleHRyYSApKSAhPT0gdW5kZWZpbmVkICkgew0KCQkJCS8vIFdyYXBwZWQgdG8gcHJldmVudCBJRSBmcm9tIHRocm93aW5nIGVycm9ycyB3aGVuICdpbnZhbGlkJyB2YWx1ZXMgYXJlIHByb3ZpZGVkDQoJCQkJLy8gRml4ZXMgYnVnICM1NTA5DQoJCQkJdHJ5IHsNCgkJCQkJc3R5bGVbIG5hbWUgXSA9IHZhbHVlOw0KCQkJCX0gY2F0Y2goZSkge30NCgkJCX0NCg0KCQl9IGVsc2Ugew0KCQkJLy8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIG5vbi1jb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlDQoJCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIGZhbHNlLCBleHRyYSApKSAhPT0gdW5kZWZpbmVkICkgew0KCQkJCXJldHVybiByZXQ7DQoJCQl9DQoNCgkJCS8vIE90aGVyd2lzZSBqdXN0IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgc3R5bGUgb2JqZWN0DQoJCQlyZXR1cm4gc3R5bGVbIG5hbWUgXTsNCgkJfQ0KCX0sDQoNCgljc3M6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBudW1lcmljLCBleHRyYSApIHsNCgkJdmFyIHZhbCwgbnVtLCBob29rcywNCgkJCW9yaWdOYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApOw0KDQoJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZQ0KCQluYW1lID0galF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdIHx8ICggalF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdID0gdmVuZG9yUHJvcE5hbWUoIGVsZW0uc3R5bGUsIG9yaWdOYW1lICkgKTsNCg0KCQkvLyBnZXRzIGhvb2sgZm9yIHRoZSBwcmVmaXhlZCB2ZXJzaW9uDQoJCS8vIGZvbGxvd2VkIGJ5IHRoZSB1bnByZWZpeGVkIHZlcnNpb24NCgkJaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07DQoNCgkJLy8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmUNCgkJaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyApIHsNCgkJCXZhbCA9IGhvb2tzLmdldCggZWxlbSwgdHJ1ZSwgZXh0cmEgKTsNCgkJfQ0KDQoJCS8vIE90aGVyd2lzZSwgaWYgYSB3YXkgdG8gZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBleGlzdHMsIHVzZSB0aGF0DQoJCWlmICggdmFsID09PSB1bmRlZmluZWQgKSB7DQoJCQl2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUgKTsNCgkJfQ0KDQoJCS8vY29udmVydCAibm9ybWFsIiB0byBjb21wdXRlZCB2YWx1ZQ0KCQlpZiAoIHZhbCA9PT0gIm5vcm1hbCIgJiYgbmFtZSBpbiBjc3NOb3JtYWxUcmFuc2Zvcm0gKSB7DQoJCQl2YWwgPSBjc3NOb3JtYWxUcmFuc2Zvcm1bIG5hbWUgXTsNCgkJfQ0KDQoJCS8vIFJldHVybiwgY29udmVydGluZyB0byBudW1iZXIgaWYgZm9yY2VkIG9yIGEgcXVhbGlmaWVyIHdhcyBwcm92aWRlZCBhbmQgdmFsIGxvb2tzIG51bWVyaWMNCgkJaWYgKCBudW1lcmljIHx8IGV4dHJhICE9PSB1bmRlZmluZWQgKSB7DQoJCQludW0gPSBwYXJzZUZsb2F0KCB2YWwgKTsNCgkJCXJldHVybiBudW1lcmljIHx8IGpRdWVyeS5pc051bWVyaWMoIG51bSApID8gbnVtIHx8IDAgOiB2YWw7DQoJCX0NCgkJcmV0dXJuIHZhbDsNCgl9LA0KDQoJLy8gQSBtZXRob2QgZm9yIHF1aWNrbHkgc3dhcHBpbmcgaW4vb3V0IENTUyBwcm9wZXJ0aWVzIHRvIGdldCBjb3JyZWN0IGNhbGN1bGF0aW9ucw0KCXN3YXA6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBjYWxsYmFjayApIHsNCgkJdmFyIHJldCwgbmFtZSwNCgkJCW9sZCA9IHt9Ow0KDQoJCS8vIFJlbWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcgb25lcw0KCQlmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7DQoJCQlvbGRbIG5hbWUgXSA9IGVsZW0uc3R5bGVbIG5hbWUgXTsNCgkJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9wdGlvbnNbIG5hbWUgXTsNCgkJfQ0KDQoJCXJldCA9IGNhbGxiYWNrLmNhbGwoIGVsZW0gKTsNCg0KCQkvLyBSZXZlcnQgdGhlIG9sZCB2YWx1ZXMNCgkJZm9yICggbmFtZSBpbiBvcHRpb25zICkgew0KCQkJZWxlbS5zdHlsZVsgbmFtZSBdID0gb2xkWyBuYW1lIF07DQoJCX0NCg0KCQlyZXR1cm4gcmV0Ow0KCX0NCn0pOw0KDQovLyBOT1RFOiBUbyBhbnkgZnV0dXJlIG1haW50YWluZXIsIHdlJ3ZlIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlDQovLyBiZWNhdXNlIGpzZG9tIG9uIG5vZGUuanMgd2lsbCBicmVhayB3aXRob3V0IGl0Lg0KaWYgKCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSApIHsNCgljdXJDU1MgPSBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsNCgkJdmFyIHJldCwgd2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCwNCgkJCWNvbXB1dGVkID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGVsZW0sIG51bGwgKSwNCgkJCXN0eWxlID0gZWxlbS5zdHlsZTsNCg0KCQlpZiAoIGNvbXB1dGVkICkgew0KDQoJCQkvLyBnZXRQcm9wZXJ0eVZhbHVlIGlzIG9ubHkgbmVlZGVkIGZvciAuY3NzKCdmaWx0ZXInKSBpbiBJRTksIHNlZSAjMTI1MzcNCgkJCXJldCA9IGNvbXB1dGVkLmdldFByb3BlcnR5VmFsdWUoIG5hbWUgKSB8fCBjb21wdXRlZFsgbmFtZSBdOw0KDQoJCQlpZiAoIHJldCA9PT0gIiIgJiYgIWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgKSB7DQoJCQkJcmV0ID0galF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lICk7DQoJCQl9DQoNCgkJCS8vIEEgdHJpYnV0ZSB0byB0aGUgImF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHMiDQoJCQkvLyBDaHJvbWUgPCAxNyBhbmQgU2FmYXJpIDUuMCB1c2VzICJjb21wdXRlZCB2YWx1ZSIgaW5zdGVhZCBvZiAidXNlZCB2YWx1ZSIgZm9yIG1hcmdpbi1yaWdodA0KCQkJLy8gU2FmYXJpIDUuMS43IChhdCBsZWFzdCkgcmV0dXJucyBwZXJjZW50YWdlIGZvciBhIGxhcmdlciBzZXQgb2YgdmFsdWVzLCBidXQgd2lkdGggc2VlbXMgdG8gYmUgcmVsaWFibHkgcGl4ZWxzDQoJCQkvLyB0aGlzIGlzIGFnYWluc3QgdGhlIENTU09NIGRyYWZ0IHNwZWM6IGh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2Nzc29tLyNyZXNvbHZlZC12YWx1ZXMNCgkJCWlmICggcm51bW5vbnB4LnRlc3QoIHJldCApICYmIHJtYXJnaW4udGVzdCggbmFtZSApICkgew0KCQkJCXdpZHRoID0gc3R5bGUud2lkdGg7DQoJCQkJbWluV2lkdGggPSBzdHlsZS5taW5XaWR0aDsNCgkJCQltYXhXaWR0aCA9IHN0eWxlLm1heFdpZHRoOw0KDQoJCQkJc3R5bGUubWluV2lkdGggPSBzdHlsZS5tYXhXaWR0aCA9IHN0eWxlLndpZHRoID0gcmV0Ow0KCQkJCXJldCA9IGNvbXB1dGVkLndpZHRoOw0KDQoJCQkJc3R5bGUud2lkdGggPSB3aWR0aDsNCgkJCQlzdHlsZS5taW5XaWR0aCA9IG1pbldpZHRoOw0KCQkJCXN0eWxlLm1heFdpZHRoID0gbWF4V2lkdGg7DQoJCQl9DQoJCX0NCg0KCQlyZXR1cm4gcmV0Ow0KCX07DQp9IGVsc2UgaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY3VycmVudFN0eWxlICkgew0KCWN1ckNTUyA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgew0KCQl2YXIgbGVmdCwgcnNMZWZ0LA0KCQkJcmV0ID0gZWxlbS5jdXJyZW50U3R5bGUgJiYgZWxlbS5jdXJyZW50U3R5bGVbIG5hbWUgXSwNCgkJCXN0eWxlID0gZWxlbS5zdHlsZTsNCg0KCQkvLyBBdm9pZCBzZXR0aW5nIHJldCB0byBlbXB0eSBzdHJpbmcgaGVyZQ0KCQkvLyBzbyB3ZSBkb24ndCBkZWZhdWx0IHRvIGF1dG8NCgkJaWYgKCByZXQgPT0gbnVsbCAmJiBzdHlsZSAmJiBzdHlsZVsgbmFtZSBdICkgew0KCQkJcmV0ID0gc3R5bGVbIG5hbWUgXTsNCgkJfQ0KDQoJCS8vIEZyb20gdGhlIGF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHMNCgkJLy8gaHR0cDovL2VyaWsuZWFlLm5ldC9hcmNoaXZlcy8yMDA3LzA3LzI3LzE4LjU0LjE1LyNjb21tZW50LTEwMjI5MQ0KDQoJCS8vIElmIHdlJ3JlIG5vdCBkZWFsaW5nIHdpdGggYSByZWd1bGFyIHBpeGVsIG51bWJlcg0KCQkvLyBidXQgYSBudW1iZXIgdGhhdCBoYXMgYSB3ZWlyZCBlbmRpbmcsIHdlIG5lZWQgdG8gY29udmVydCBpdCB0byBwaXhlbHMNCgkJLy8gYnV0IG5vdCBwb3NpdGlvbiBjc3MgYXR0cmlidXRlcywgYXMgdGhvc2UgYXJlIHByb3BvcnRpb25hbCB0byB0aGUgcGFyZW50IGVsZW1lbnQgaW5zdGVhZA0KCQkvLyBhbmQgd2UgY2FuJ3QgbWVhc3VyZSB0aGUgcGFyZW50IGluc3RlYWQgYmVjYXVzZSBpdCBtaWdodCB0cmlnZ2VyIGEgInN0YWNraW5nIGRvbGxzIiBwcm9ibGVtDQoJCWlmICggcm51bW5vbnB4LnRlc3QoIHJldCApICYmICFycG9zaXRpb24udGVzdCggbmFtZSApICkgew0KDQoJCQkvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzDQoJCQlsZWZ0ID0gc3R5bGUubGVmdDsNCgkJCXJzTGVmdCA9IGVsZW0ucnVudGltZVN0eWxlICYmIGVsZW0ucnVudGltZVN0eWxlLmxlZnQ7DQoNCgkJCS8vIFB1dCBpbiB0aGUgbmV3IHZhbHVlcyB0byBnZXQgYSBjb21wdXRlZCB2YWx1ZSBvdXQNCgkJCWlmICggcnNMZWZ0ICkgew0KCQkJCWVsZW0ucnVudGltZVN0eWxlLmxlZnQgPSBlbGVtLmN1cnJlbnRTdHlsZS5sZWZ0Ow0KCQkJfQ0KCQkJc3R5bGUubGVmdCA9IG5hbWUgPT09ICJmb250U2l6ZSIgPyAiMWVtIiA6IHJldDsNCgkJCXJldCA9IHN0eWxlLnBpeGVsTGVmdCArICJweCI7DQoNCgkJCS8vIFJldmVydCB0aGUgY2hhbmdlZCB2YWx1ZXMNCgkJCXN0eWxlLmxlZnQgPSBsZWZ0Ow0KCQkJaWYgKCByc0xlZnQgKSB7DQoJCQkJZWxlbS5ydW50aW1lU3R5bGUubGVmdCA9IHJzTGVmdDsNCgkJCX0NCgkJfQ0KDQoJCXJldHVybiByZXQgPT09ICIiID8gImF1dG8iIDogcmV0Ow0KCX07DQp9DQoNCmZ1bmN0aW9uIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgc3VidHJhY3QgKSB7DQoJdmFyIG1hdGNoZXMgPSBybnVtc3BsaXQuZXhlYyggdmFsdWUgKTsNCglyZXR1cm4gbWF0Y2hlcyA/DQoJCQlNYXRoLm1heCggMCwgbWF0Y2hlc1sgMSBdIC0gKCBzdWJ0cmFjdCB8fCAwICkgKSArICggbWF0Y2hlc1sgMiBdIHx8ICJweCIgKSA6DQoJCQl2YWx1ZTsNCn0NCg0KZnVuY3Rpb24gYXVnbWVudFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhLCBpc0JvcmRlckJveCApIHsNCgl2YXIgaSA9IGV4dHJhID09PSAoIGlzQm9yZGVyQm94ID8gImJvcmRlciIgOiAiY29udGVudCIgKSA/DQoJCS8vIElmIHdlIGFscmVhZHkgaGF2ZSB0aGUgcmlnaHQgbWVhc3VyZW1lbnQsIGF2b2lkIGF1Z21lbnRhdGlvbg0KCQk0IDoNCgkJLy8gT3RoZXJ3aXNlIGluaXRpYWxpemUgZm9yIGhvcml6b250YWwgb3IgdmVydGljYWwgcHJvcGVydGllcw0KCQluYW1lID09PSAid2lkdGgiID8gMSA6IDAsDQoNCgkJdmFsID0gMDsNCg0KCWZvciAoIDsgaSA8IDQ7IGkgKz0gMiApIHsNCgkJLy8gYm90aCBib3ggbW9kZWxzIGV4Y2x1ZGUgbWFyZ2luLCBzbyBhZGQgaXQgaWYgd2Ugd2FudCBpdA0KCQlpZiAoIGV4dHJhID09PSAibWFyZ2luIiApIHsNCgkJCS8vIHdlIHVzZSBqUXVlcnkuY3NzIGluc3RlYWQgb2YgY3VyQ1NTIGhlcmUNCgkJCS8vIGJlY2F1c2Ugb2YgdGhlIHJlbGlhYmxlTWFyZ2luUmlnaHQgQ1NTIGhvb2shDQoJCQl2YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwgZXh0cmEgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSApOw0KCQl9DQoNCgkJLy8gRnJvbSB0aGlzIHBvaW50IG9uIHdlIHVzZSBjdXJDU1MgZm9yIG1heGltdW0gcGVyZm9ybWFuY2UgKHJlbGV2YW50IGluIGFuaW1hdGlvbnMpDQoJCWlmICggaXNCb3JkZXJCb3ggKSB7DQoJCQkvLyBib3JkZXItYm94IGluY2x1ZGVzIHBhZGRpbmcsIHNvIHJlbW92ZSBpdCBpZiB3ZSB3YW50IGNvbnRlbnQNCgkJCWlmICggZXh0cmEgPT09ICJjb250ZW50IiApIHsNCgkJCQl2YWwgLT0gcGFyc2VGbG9hdCggY3VyQ1NTKCBlbGVtLCAicGFkZGluZyIgKyBjc3NFeHBhbmRbIGkgXSApICkgfHwgMDsNCgkJCX0NCg0KCQkJLy8gYXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgYm9yZGVyIG5vciBtYXJnaW4sIHNvIHJlbW92ZSBib3JkZXINCgkJCWlmICggZXh0cmEgIT09ICJtYXJnaW4iICkgew0KCQkJCXZhbCAtPSBwYXJzZUZsb2F0KCBjdXJDU1MoIGVsZW0sICJib3JkZXIiICsgY3NzRXhwYW5kWyBpIF0gKyAiV2lkdGgiICkgKSB8fCAwOw0KCQkJfQ0KCQl9IGVsc2Ugew0KCQkJLy8gYXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgY29udGVudCwgc28gYWRkIHBhZGRpbmcNCgkJCXZhbCArPSBwYXJzZUZsb2F0KCBjdXJDU1MoIGVsZW0sICJwYWRkaW5nIiArIGNzc0V4cGFuZFsgaSBdICkgKSB8fCAwOw0KDQoJCQkvLyBhdCB0aGlzIHBvaW50LCBleHRyYSBpc24ndCBjb250ZW50IG5vciBwYWRkaW5nLCBzbyBhZGQgYm9yZGVyDQoJCQlpZiAoIGV4dHJhICE9PSAicGFkZGluZyIgKSB7DQoJCQkJdmFsICs9IHBhcnNlRmxvYXQoIGN1ckNTUyggZWxlbSwgImJvcmRlciIgKyBjc3NFeHBhbmRbIGkgXSArICJXaWR0aCIgKSApIHx8IDA7DQoJCQl9DQoJCX0NCgl9DQoNCglyZXR1cm4gdmFsOw0KfQ0KDQpmdW5jdGlvbiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSApIHsNCg0KCS8vIFN0YXJ0IHdpdGggb2Zmc2V0IHByb3BlcnR5LCB3aGljaCBpcyBlcXVpdmFsZW50IHRvIHRoZSBib3JkZXItYm94IHZhbHVlDQoJdmFyIHZhbCA9IG5hbWUgPT09ICJ3aWR0aCIgPyBlbGVtLm9mZnNldFdpZHRoIDogZWxlbS5vZmZzZXRIZWlnaHQsDQoJCXZhbHVlSXNCb3JkZXJCb3ggPSB0cnVlLA0KCQlpc0JvcmRlckJveCA9IGpRdWVyeS5zdXBwb3J0LmJveFNpemluZyAmJiBqUXVlcnkuY3NzKCBlbGVtLCAiYm94U2l6aW5nIiApID09PSAiYm9yZGVyLWJveCI7DQoNCgkvLyBzb21lIG5vbi1odG1sIGVsZW1lbnRzIHJldHVybiB1bmRlZmluZWQgZm9yIG9mZnNldFdpZHRoLCBzbyBjaGVjayBmb3IgbnVsbC91bmRlZmluZWQNCgkvLyBzdmcgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02NDkyODUNCgkvLyBNYXRoTUwgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD00OTE2NjgNCglpZiAoIHZhbCA8PSAwIHx8IHZhbCA9PSBudWxsICkgew0KCQkvLyBGYWxsIGJhY2sgdG8gY29tcHV0ZWQgdGhlbiB1bmNvbXB1dGVkIGNzcyBpZiBuZWNlc3NhcnkNCgkJdmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lICk7DQoJCWlmICggdmFsIDwgMCB8fCB2YWwgPT0gbnVsbCApIHsNCgkJCXZhbCA9IGVsZW0uc3R5bGVbIG5hbWUgXTsNCgkJfQ0KDQoJCS8vIENvbXB1dGVkIHVuaXQgaXMgbm90IHBpeGVscy4gU3RvcCBoZXJlIGFuZCByZXR1cm4uDQoJCWlmICggcm51bW5vbnB4LnRlc3QodmFsKSApIHsNCgkJCXJldHVybiB2YWw7DQoJCX0NCg0KCQkvLyB3ZSBuZWVkIHRoZSBjaGVjayBmb3Igc3R5bGUgaW4gY2FzZSBhIGJyb3dzZXIgd2hpY2ggcmV0dXJucyB1bnJlbGlhYmxlIHZhbHVlcw0KCQkvLyBmb3IgZ2V0Q29tcHV0ZWRTdHlsZSBzaWxlbnRseSBmYWxscyBiYWNrIHRvIHRoZSByZWxpYWJsZSBlbGVtLnN0eWxlDQoJCXZhbHVlSXNCb3JkZXJCb3ggPSBpc0JvcmRlckJveCAmJiAoIGpRdWVyeS5zdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlIHx8IHZhbCA9PT0gZWxlbS5zdHlsZVsgbmFtZSBdICk7DQoNCgkJLy8gTm9ybWFsaXplICIiLCBhdXRvLCBhbmQgcHJlcGFyZSBmb3IgZXh0cmENCgkJdmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDsNCgl9DQoNCgkvLyB1c2UgdGhlIGFjdGl2ZSBib3gtc2l6aW5nIG1vZGVsIHRvIGFkZC9zdWJ0cmFjdCBpcnJlbGV2YW50IHN0eWxlcw0KCXJldHVybiAoIHZhbCArDQoJCWF1Z21lbnRXaWR0aE9ySGVpZ2h0KA0KCQkJZWxlbSwNCgkJCW5hbWUsDQoJCQlleHRyYSB8fCAoIGlzQm9yZGVyQm94ID8gImJvcmRlciIgOiAiY29udGVudCIgKSwNCgkJCXZhbHVlSXNCb3JkZXJCb3gNCgkJKQ0KCSkgKyAicHgiOw0KfQ0KDQoNCi8vIFRyeSB0byBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgZGlzcGxheSB2YWx1ZSBvZiBhbiBlbGVtZW50DQpmdW5jdGlvbiBjc3NfZGVmYXVsdERpc3BsYXkoIG5vZGVOYW1lICkgew0KCWlmICggZWxlbWRpc3BsYXlbIG5vZGVOYW1lIF0gKSB7DQoJCXJldHVybiBlbGVtZGlzcGxheVsgbm9kZU5hbWUgXTsNCgl9DQoNCgl2YXIgZWxlbSA9IGpRdWVyeSggIjwiICsgbm9kZU5hbWUgKyAiPiIgKS5hcHBlbmRUbyggZG9jdW1lbnQuYm9keSApLA0KCQlkaXNwbGF5ID0gZWxlbS5jc3MoImRpc3BsYXkiKTsNCgllbGVtLnJlbW92ZSgpOw0KDQoJLy8gSWYgdGhlIHNpbXBsZSB3YXkgZmFpbHMsDQoJLy8gZ2V0IGVsZW1lbnQncyByZWFsIGRlZmF1bHQgZGlzcGxheSBieSBhdHRhY2hpbmcgaXQgdG8gYSB0ZW1wIGlmcmFtZQ0KCWlmICggZGlzcGxheSA9PT0gIm5vbmUiIHx8IGRpc3BsYXkgPT09ICIiICkgew0KCQkvLyBVc2UgdGhlIGFscmVhZHktY3JlYXRlZCBpZnJhbWUgaWYgcG9zc2libGUNCgkJaWZyYW1lID0gZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCgNCgkJCWlmcmFtZSB8fCBqUXVlcnkuZXh0ZW5kKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKSwgew0KCQkJCWZyYW1lQm9yZGVyOiAwLA0KCQkJCXdpZHRoOiAwLA0KCQkJCWhlaWdodDogMA0KCQkJfSkNCgkJKTsNCg0KCQkvLyBDcmVhdGUgYSBjYWNoZWFibGUgY29weSBvZiB0aGUgaWZyYW1lIGRvY3VtZW50IG9uIGZpcnN0IGNhbGwuDQoJCS8vIElFIGFuZCBPcGVyYSB3aWxsIGFsbG93IHVzIHRvIHJldXNlIHRoZSBpZnJhbWVEb2Mgd2l0aG91dCByZS13cml0aW5nIHRoZSBmYWtlIEhUTUwNCgkJLy8gZG9jdW1lbnQgdG8gaXQ7IFdlYktpdCAmIEZpcmVmb3ggd29uJ3QgYWxsb3cgcmV1c2luZyB0aGUgaWZyYW1lIGRvY3VtZW50Lg0KCQlpZiAoICFpZnJhbWVEb2MgfHwgIWlmcmFtZS5jcmVhdGVFbGVtZW50ICkgew0KCQkJaWZyYW1lRG9jID0gKCBpZnJhbWUuY29udGVudFdpbmRvdyB8fCBpZnJhbWUuY29udGVudERvY3VtZW50ICkuZG9jdW1lbnQ7DQoJCQlpZnJhbWVEb2Mud3JpdGUoIjwhZG9jdHlwZSBodG1sPjxodG1sPjxib2R5PiIpOw0KCQkJaWZyYW1lRG9jLmNsb3NlKCk7DQoJCX0NCg0KCQllbGVtID0gaWZyYW1lRG9jLmJvZHkuYXBwZW5kQ2hpbGQoIGlmcmFtZURvYy5jcmVhdGVFbGVtZW50KG5vZGVOYW1lKSApOw0KDQoJCWRpc3BsYXkgPSBjdXJDU1MoIGVsZW0sICJkaXNwbGF5IiApOw0KCQlkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKCBpZnJhbWUgKTsNCgl9DQoNCgkvLyBTdG9yZSB0aGUgY29ycmVjdCBkZWZhdWx0IGRpc3BsYXkNCgllbGVtZGlzcGxheVsgbm9kZU5hbWUgXSA9IGRpc3BsYXk7DQoNCglyZXR1cm4gZGlzcGxheTsNCn0NCg0KalF1ZXJ5LmVhY2goWyAiaGVpZ2h0IiwgIndpZHRoIiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsNCglqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSA9IHsNCgkJZ2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQsIGV4dHJhICkgew0KCQkJaWYgKCBjb21wdXRlZCApIHsNCgkJCQkvLyBjZXJ0YWluIGVsZW1lbnRzIGNhbiBoYXZlIGRpbWVuc2lvbiBpbmZvIGlmIHdlIGludmlzaWJseSBzaG93IHRoZW0NCgkJCQkvLyBob3dldmVyLCBpdCBtdXN0IGhhdmUgYSBjdXJyZW50IGRpc3BsYXkgc3R5bGUgdGhhdCB3b3VsZCBiZW5lZml0IGZyb20gdGhpcw0KCQkJCWlmICggZWxlbS5vZmZzZXRXaWR0aCA9PT0gMCAmJiByZGlzcGxheXN3YXAudGVzdCggY3VyQ1NTKCBlbGVtLCAiZGlzcGxheSIgKSApICkgew0KCQkJCQlyZXR1cm4galF1ZXJ5LnN3YXAoIGVsZW0sIGNzc1Nob3csIGZ1bmN0aW9uKCkgew0KCQkJCQkJcmV0dXJuIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICk7DQoJCQkJCX0pOw0KCQkJCX0gZWxzZSB7DQoJCQkJCXJldHVybiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSApOw0KCQkJCX0NCgkJCX0NCgkJfSwNCg0KCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgZXh0cmEgKSB7DQoJCQlyZXR1cm4gc2V0UG9zaXRpdmVOdW1iZXIoIGVsZW0sIHZhbHVlLCBleHRyYSA/DQoJCQkJYXVnbWVudFdpZHRoT3JIZWlnaHQoDQoJCQkJCWVsZW0sDQoJCQkJCW5hbWUsDQoJCQkJCWV4dHJhLA0KCQkJCQlqUXVlcnkuc3VwcG9ydC5ib3hTaXppbmcgJiYgalF1ZXJ5LmNzcyggZWxlbSwgImJveFNpemluZyIgKSA9PT0gImJvcmRlci1ib3giDQoJCQkJKSA6IDANCgkJCSk7DQoJCX0NCgl9Ow0KfSk7DQoNCmlmICggIWpRdWVyeS5zdXBwb3J0Lm9wYWNpdHkgKSB7DQoJalF1ZXJ5LmNzc0hvb2tzLm9wYWNpdHkgPSB7DQoJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgew0KCQkJLy8gSUUgdXNlcyBmaWx0ZXJzIGZvciBvcGFjaXR5DQoJCQlyZXR1cm4gcm9wYWNpdHkudGVzdCggKGNvbXB1dGVkICYmIGVsZW0uY3VycmVudFN0eWxlID8gZWxlbS5jdXJyZW50U3R5bGUuZmlsdGVyIDogZWxlbS5zdHlsZS5maWx0ZXIpIHx8ICIiICkgPw0KCQkJCSggMC4wMSAqIHBhcnNlRmxvYXQoIFJlZ0V4cC4kMSApICkgKyAiIiA6DQoJCQkJY29tcHV0ZWQgPyAiMSIgOiAiIjsNCgkJfSwNCg0KCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsNCgkJCXZhciBzdHlsZSA9IGVsZW0uc3R5bGUsDQoJCQkJY3VycmVudFN0eWxlID0gZWxlbS5jdXJyZW50U3R5bGUsDQoJCQkJb3BhY2l0eSA9IGpRdWVyeS5pc051bWVyaWMoIHZhbHVlICkgPyAiYWxwaGEob3BhY2l0eT0iICsgdmFsdWUgKiAxMDAgKyAiKSIgOiAiIiwNCgkJCQlmaWx0ZXIgPSBjdXJyZW50U3R5bGUgJiYgY3VycmVudFN0eWxlLmZpbHRlciB8fCBzdHlsZS5maWx0ZXIgfHwgIiI7DQoNCgkJCS8vIElFIGhhcyB0cm91YmxlIHdpdGggb3BhY2l0eSBpZiBpdCBkb2VzIG5vdCBoYXZlIGxheW91dA0KCQkJLy8gRm9yY2UgaXQgYnkgc2V0dGluZyB0aGUgem9vbSBsZXZlbA0KCQkJc3R5bGUuem9vbSA9IDE7DQoNCgkJCS8vIGlmIHNldHRpbmcgb3BhY2l0eSB0byAxLCBhbmQgbm8gb3RoZXIgZmlsdGVycyBleGlzdCAtIGF0dGVtcHQgdG8gcmVtb3ZlIGZpbHRlciBhdHRyaWJ1dGUgIzY2NTINCgkJCWlmICggdmFsdWUgPj0gMSAmJiBqUXVlcnkudHJpbSggZmlsdGVyLnJlcGxhY2UoIHJhbHBoYSwgIiIgKSApID09PSAiIiAmjg0KCQkJCXN0eWxlLnJlbW92ZUF0dHJpYnV0ZSApIHsNCg0KCQkJCS8vIFNldHRpbmcgc3R5bGUuZmlsdGVyIHRvIG51bGwsICIiICYgIiAiIHN0aWxsIGxlYXZlICJmaWx0ZXI6IiBpbiB0aGUgY3NzVGV4dA0KCQkJCS8vIGlmICJmaWx0ZXI6IiBpcyBwcmVzZW50IGF0IGFsbCwgY2xlYXJUeXBlIGlzIGRpc2FibGVkLCB3ZSB3YW50IHRvIGF2b2lkIHRoaXMNCgkJCQkvLyBzdHlsZS5yZW1vdmVBdHRyaWJ1dGUgaXMgSUUgT25seSwgYnV0IHNvIGFwcGFyZW50bHkgaXMgdGhpcyBjb2RlIHBhdGguLi4NCgkJCQlzdHlsZS5yZW1vdmVBdHRyaWJ1dGUoICJmaWx0ZXIiICk7DQoNCgkJCQkvLyBpZiB0aGVyZSB0aGVyZSBpcyBubyBmaWx0ZXIgc3R5bGUgYXBwbGllZCBpbiBhIGNzcyBydWxlLCB3ZSBhcmUgZG9uZQ0KCQkJCWlmICggY3VycmVudFN0eWxlICYmICFjdXJyZW50U3R5bGUuZmlsdGVyICkgew0KCQkJCQlyZXR1cm47DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBvdGhlcndpc2UsIHNldCBuZXcgZmlsdGVyIHZhbHVlcw0KCQkJc3R5bGUuZmlsdGVyID0gcmFscGhhLnRlc3QoIGZpbHRlciApID8NCgkJCQlmaWx0ZXIucmVwbGFjZSggcmFscGhhLCBvcGFjaXR5ICkgOg0KCQkJCWZpbHRlciArICIgIiArIG9wYWNpdHk7DQoJCX0NCgl9Ow0KfQ0KDQovLyBUaGVzZSBob29rcyBjYW5ub3QgYmUgYWRkZWQgdW50aWwgRE9NIHJlYWR5IGJlY2F1c2UgdGhlIHN1cHBvcnQgdGVzdA0KLy8gZm9yIGl0IGlzIG5vdCBydW4gdW50aWwgYWZ0ZXIgRE9NIHJlYWR5DQpqUXVlcnkoZnVuY3Rpb24oKSB7DQoJaWYgKCAhalF1ZXJ5LnN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodCApIHsNCgkJalF1ZXJ5LmNzc0hvb2tzLm1hcmdpblJpZ2h0ID0gew0KCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7DQoJCQkJLy8gV2ViS2l0IEJ1ZyAxMzM0MyAtIGdldENvbXB1dGVkU3R5bGUgcmV0dXJucyB3cm9uZyB2YWx1ZSBmb3IgbWFyZ2luLXJpZ2h0DQoJCQkJLy8gV29yayBhcm91bmQgYnkgdGVtcG9yYXJpbHkgc2V0dGluZyBlbGVtZW50IGRpc3BsYXkgdG8gaW5saW5lLWJsb2NrDQoJCQkJcmV0dXJuIGpRdWVyeS5zd2FwKCBlbGVtLCB7ICJkaXNwbGF5IjogImlubGluZS1ibG9jayIgfSwgZnVuY3Rpb24oKSB7DQoJCQkJCWlmICggY29tcHV0ZWQgKSB7DQoJCQkJCQlyZXR1cm4gY3VyQ1NTKCBlbGVtLCAibWFyZ2luUmlnaHQiICk7DQoJCQkJCX0NCgkJCQl9KTsNCgkJCX0NCgkJfTsNCgl9DQoNCgkvLyBXZWJraXQgYnVnOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkwODQNCgkvLyBnZXRDb21wdXRlZFN0eWxlIHJldHVybnMgcGVyY2VudCB3aGVuIHNwZWNpZmllZCBmb3IgdG9wL2xlZnQvYm90dG9tL3JpZ2h0DQoJLy8gcmF0aGVyIHRoYW4gbWFrZSB0aGUgY3NzIG1vZHVsZSBkZXBlbmQgb24gdGhlIG9mZnNldCBtb2R1bGUsIHdlIGp1c3QgY2hlY2sgZm9yIGl0IGhlcmUNCglpZiAoICFqUXVlcnkuc3VwcG9ydC5waXhlbFBvc2l0aW9uICYmIGpRdWVyeS5mbi5wb3NpdGlvbiApIHsNCgkJalF1ZXJ5LmVhY2goIFsgInRvcCIsICJsZWZ0IiBdLCBmdW5jdGlvbiggaSwgcHJvcCApIHsNCgkJCWpRdWVyeS5jc3NIb29rc1sgcHJvcCBdID0gew0KCQkJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgew0KCQkJCQlpZiAoIGNvbXB1dGVkICkgew0KCQkJCQkJdmFyIHJldCA9IGN1ckNTUyggZWxlbSwgcHJvcCApOw0KCQkJCQkJLy8gaWYgY3VyQ1NTIHJldHVybnMgcGVyY2VudGFnZSwgZmFsbGJhY2sgdG8gb2Zmc2V0DQoJCQkJCQlyZXR1cm4gcm51bW5vbnB4LnRlc3QoIHJldCApID8galF1ZXJ5KCBlbGVtICkucG9zaXRpb24oKVsgcHJvcCBdICsgInB4IiA6IHJldDsNCgkJCQkJfQ0KCQkJCX0NCgkJCX07DQoJCX0pOw0KCX0NCg0KfSk7DQoNCmlmICggalF1ZXJ5LmV4cHIgJiYgalF1ZXJ5LmV4cHIuZmlsdGVycyApIHsNCglqUXVlcnkuZXhwci5maWx0ZXJzLmhpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtICkgew0KCQlyZXR1cm4gKCBlbGVtLm9mZnNldFdpZHRoID09PSAwICYmIGVsZW0ub2Zmc2V0SGVpZ2h0ID09PSAwICkgfHwgKCFqUXVlcnkuc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHMgJiYgKChlbGVtLnN0eWxlICYmIGVsZW0uc3R5bGUuZGlzcGxheSkgfHwgY3VyQ1NTKCBlbGVtLCAiZGlzcGxheSIgKSkgPT09ICJub25lIik7DQoJfTsNCg0KCWpRdWVyeS5leHByLmZpbHRlcnMudmlzaWJsZSA9IGZ1bmN0aW9uKCBlbGVtICkgew0KCQlyZXR1cm4gIWpRdWVyeS5leHByLmZpbHRlcnMuaGlkZGVuKCBlbGVtICk7DQoJfTsNCn0NCg0KLy8gVGhlc2UgaG9va3MgYXJlIHVzZWQgYnkgYW5pbWF0ZSB0byBleHBhbmQgcHJvcGVydGllcw0KalF1ZXJ5LmVhY2goew0KCW1hcmdpbjogIiIsDQoJcGFkZGluZzogIiIsDQoJYm9yZGVyOiAiV2lkdGgiDQp9LCBmdW5jdGlvbiggcHJlZml4LCBzdWZmaXggKSB7DQoJalF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXSA9IHsNCgkJZXhwYW5kOiBmdW5jdGlvbiggdmFsdWUgKSB7DQoJCQl2YXIgaSwNCg0KCQkJCS8vIGFzc3VtZXMgYSBzaW5nbGUgbnVtYmVyIGlmIG5vdCBhIHN0cmluZw0KCQkJCXBhcnRzID0gdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiA/IHZhbHVlLnNwbGl0KCIgIikgOiBbIHZhbHVlIF0sDQoJCQkJZXhwYW5kZWQgPSB7fTsNCg0KCQkJZm9yICggaSA9IDA7IGkgPCA0OyBpKysgKSB7DQoJCQkJZXhwYW5kZWRbIHByZWZpeCArIGNzc0V4cGFuZFsgaSBdICsgc3VmZml4IF0gPQ0KCQkJCQlwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBdIHx8IHBhcnRzWyAwIF07DQoJCQl9DQoNCgkJCXJldHVybiBleHBhbmRlZDsNCgkJfQ0KCX07DQoNCglpZiAoICFybWFyZ2luLnRlc3QoIHByZWZpeCApICkgew0KCQlqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdLnNldCA9IHNldFBvc2l0aXZlTnVtYmVyOw0KCX0NCn0pOw0KdmFyIHIyMCA9IC8lMjAvZywNCglyYnJhY2tldCA9IC9cW1xdJC8sDQoJckNSTEYgPSAvXHI/XG4vZywNCglyaW5wdXQgPSAvXig/OmNvbG9yfGRhdGV8ZGF0ZXRpbWV8ZGF0ZXRpbWUtbG9jYWx8ZW1haWx8aGlkZGVufG1vbnRofG51bWJlcnxwYXNzd29yZHxyYW5nZXxzZWFyY2h8dGVsfHRleHR8dGltZXx1cmx8d2VlaykkL2ksDQoJcnNlbGVjdFRleHRhcmVhID0gL14oPzpzZWxlY3R8dGV4dGFyZWEpL2k7DQoNCmpRdWVyeS5mbi5leHRlbmQoew0KCXNlcmlhbGl6ZTogZnVuY3Rpb24oKSB7DQoJCXJldHVybiBqUXVlcnkucGFyYW0oIHRoaXMuc2VyaWFsaXplQXJyYXkoKSApOw0KCX0sDQoJc2VyaWFsaXplQXJyYXk6IGZ1bmN0aW9uKCkgew0KCQlyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXsNCgkJCXJldHVybiB0aGlzLmVsZW1lbnRzID8galF1ZXJ5Lm1ha2VBcnJheSggdGhpcy5lbGVtZW50cyApIDogdGhpczsNCgkJfSkNCgkJLmZpbHRlcihmdW5jdGlvbigpew0KCQkJcmV0dXJuIHRoaXMubmFtZSAmJiAhdGhpcy5kaXNhYmxlZCAmjg0KCQkJCSggdGhpcy5jaGVja2VkIHx8IHJzZWxlY3RUZXh0YXJlYS50ZXN0KCB0aGlzLm5vZGVOYW1lICkgfHwNCgkJCQkJcmlucHV0LnRlc3QoIHRoaXMudHlwZSApICk7DQoJCX0pDQoJCS5tYXAoZnVuY3Rpb24oIGksIGVsZW0gKXsNCgkJCXZhciB2YWwgPSBqUXVlcnkoIHRoaXMgKS52YWwoKTsNCg0KCQkJcmV0dXJuIHZhbCA9PSBudWxsID8NCgkJCQludWxsIDoNCgkJCQlqUXVlcnkuaXNBcnJheSggdmFsICkgPw0KCQkJCQlqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWwsIGkgKXsNCgkJCQkJCXJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgIlxyXG4iICkgfTsNCgkJCQkJfSkgOg0KCQkJCQl7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgIlxyXG4iICkgfTsNCgkJfSkuZ2V0KCk7DQoJfQ0KfSk7DQoNCi8vU2VyaWFsaXplIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMgb3IgYSBzZXQgb2YNCi8va2V5L3ZhbHVlcyBpbnRvIGEgcXVlcnkgc3RyaW5nDQpqUXVlcnkucGFyYW0gPSBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7DQoJdmFyIHByZWZpeCwNCgkJcyA9IFtdLA0KCQlhZGQgPSBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsNCgkJCS8vIElmIHZhbHVlIGlzIGEgZnVuY3Rpb24sIGludm9rZSBpdCBhbmQgcmV0dXJuIGl0cyB2YWx1ZQ0KCQkJdmFsdWUgPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSA/IHZhbHVlKCkgOiAoIHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlICk7DQoJCQlzWyBzLmxlbmd0aCBdID0gZW5jb2RlVVJJQ29tcG9uZW50KCBrZXkgKSArICI9IiArIGVuY29kZVVSSUNvbXBvbmVudCggdmFsdWUgKTsNCgkJfTsNCg0KCS8vIFNldCB0cmFkaXRpb25hbCB0byB0cnVlIGZvciBqUXVlcnkgPD0gMS4zLjIgYmVoYXZpb3IuDQoJaWYgKCB0cmFkaXRpb25hbCA9PT0gdW5kZWZpbmVkICkgew0KCQl0cmFkaXRpb25hbCA9IGpRdWVyeS5hamF4U2V0dGluZ3MgJiYgalF1ZXJ5LmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbDsNCgl9DQoNCgkvLyBJZiBhbiBhcnJheSB3YXMgcGFzc2VkIGluLCBhc3N1bWUgdGhhdCBpdCBpcyBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzLg0KCWlmICggalF1ZXJ5LmlzQXJyYXkoIGEgKSB8fCAoIGEuanF1ZXJ5ICYmICFqUXVlcnkuaXNQbGFpbk9iamVjdCggYSApICkgKSB7DQoJCS8vIFNlcmlhbGl6ZSB0aGUgZm9ybSBlbGVtZW50cw0KCQlqUXVlcnkuZWFjaCggYSwgZnVuY3Rpb24oKSB7DQoJCQlhZGQoIHRoaXMubmFtZSwgdGhpcy52YWx1ZSApOw0KCQl9KTsNCg0KCX0gZWxzZSB7DQoJCS8vIElmIHRyYWRpdGlvbmFsLCBlbmNvZGUgdGhlICJvbGQiIHdheSAodGhlIHdheSAxLjMuMiBvciBvbGRlcg0KCQkvLyBkaWQgaXQpLCBvdGhlcndpc2UgZW5jb2RlIHBhcmFtcyByZWN1cnNpdmVseS4NCgkJZm9yICggcHJlZml4IGluIGEgKSB7DQoJCQlidWlsZFBhcmFtcyggcHJlZml4LCBhWyBwcmVmaXggXSwgdHJhZGl0aW9uYWwsIGFkZCApOw0KCQl9DQoJfQ0KDQoJLy8gUmV0dXJuIHRoZSByZXN1bHRpbmcgc2VyaWFsaXphdGlvbg0KCXJldHVybiBzLmpvaW4oICImIiApLnJlcGxhY2UoIHIyMCwgIisiICk7DQp9Ow0KDQpmdW5jdGlvbiBidWlsZFBhcmFtcyggcHJlZml4LCBvYmosIHRyYWRpdGlvbmFsLCBhZGQgKSB7DQoJdmFyIG5hbWU7DQoNCglpZiAoIGpRdWVyeS5pc0FycmF5KCBvYmogKSApIHsNCgkJLy8gU2VyaWFsaXplIGFycmF5IGl0ZW0uDQoJCWpRdWVyeS5lYWNoKCBvYmosIGZ1bmN0aW9uKCBpLCB2ICkgew0KCQkJaWYgKCB0cmFkaXRpb25hbCB8fCByYnJhY2tldC50ZXN0KCBwcmVmaXggKSApIHsNCgkJCQkvLyBUcmVhdCBlYWNoIGFycmF5IGl0ZW0gYXMgYSBzY2FsYXIuDQoJCQkJYWRkKCBwcmVmaXgsIHYgKTsNCg0KCQkJfSBlbHNlIHsNCgkJCQkvLyBJZiBhcnJheSBpdGVtIGlzIG5vbi1zY2FsYXIgKGFycmF5IG9yIG9iamVjdCksIGVuY29kZSBpdHMNCgkJCQkvLyBudW1lcmljIGluZGV4IHRvIHJlc29sdmUgZGVzZXJpYWxpemF0aW9uIGFtYmlndWl0eSBpc3N1ZXMuDQoJCQkJLy8gTm90ZSB0aGF0IHJhY2sgKGFzIG9mIDEuMC4wKSBjYW4ndCBjdXJyZW50bHkgZGVzZXJpYWxpemUNCgkJCQkvLyBuZXN0ZWQgYXJyYXlzIHByb3Blcmx5LCBhbmQgYXR0ZW1wdGluZyB0byBkbyBzbyBtYXkgY2F1c2UNCgkJCQkvLyBhIHNlcnZlciBlcnJvci4gUG9zc2libGUgZml4ZXMgYXJlIHRvIG1vZGlmeSByYWNrJ3MNCgkJCQkvLyBkZXNlcmlhbGl6YXRpb24gYWxnb3JpdGhtIG9yIHRvIHByb3ZpZGUgYW4gb3B0aW9uIG9yIGZsYWcNCgkJCQkvLyB0byBmb3JjZSBhcnJheSBzZXJpYWxpemF0aW9uIHRvIGJlIHNoYWxsb3cuDQoJCQkJYnVpbGRQYXJhbXMoIHByZWZpeCArICJbIiArICggdHlwZW9mIHYgPT09ICJvYmplY3QiID8gaSA6ICIiICkgKyAiXSIsIHYsIHRyYWRpdGlvbmFsLCBhZGQgKTsNCgkJCX0NCgkJfSk7DQoNCgl9IGVsc2UgaWYgKCAhdHJhZGl0aW9uYWwgJiYgalF1ZXJ5LnR5cGUoIG9iaiApID09PSAib2JqZWN0IiApIHsNCgkJLy8gU2VyaWFsaXplIG9iamVjdCBpdGVtLg0KCQlmb3IgKCBuYW1lIGluIG9iaiApIHsNCgkJCWJ1aWxkUGFyYW1zKCBwcmVmaXggKyAiWyIgKyBuYW1lICsgIl0iLCBvYmpbIG5hbWUgXSwgdHJhZGl0aW9uYWwsIGFkZCApOw0KCQl9DQoNCgl9IGVsc2Ugew0KCQkvLyBTZXJpYWxpemUgc2NhbGFyIGl0ZW0uDQoJCWFkZCggcHJlZml4LCBvYmogKTsNCgl9DQp9DQp2YXINCgkvLyBEb2N1bWVudCBsb2NhdGlvbg0KCWFqYXhMb2NQYXJ0cywNCglhamF4TG9jYXRpb24sDQoNCglyaGFzaCA9IC8jLiokLywNCglyaGVhZGVycyA9IC9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKVxyPyQvbWcsIC8vIElFIGxlYXZlcyBhbiBcciBjaGFyYWN0ZXIgYXQgRU9MDQoJLy8gIzc2NTMsICM4MTI1LCAjODE1MjogbG9jYWwgcHJvdG9jb2wgZGV0ZWN0aW9uDQoJcmxvY2FsUHJvdG9jb2wgPSAvXig/OmFib3V0fGFwcHxhcHBcLXN0b3JhZ2V8LitcLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLA0KCXJub0NvbnRlbnQgPSAvXig/OkdFVHxIRUFEKSQvLA0KCXJwcm90b2NvbCA9IC9eXC9cLy8sDQoJcnF1ZXJ5ID0gL1w/LywNCglyc2NyaXB0ID0gLzxzY3JpcHRcYltePF0qKD86KD8hPFwvc2NyaXB0Pik8W148XSopKjxcL3NjcmlwdD4vZ2ksDQoJcnRzID0gLyhbPyZdKV89W14mXSovLA0KCXJ1cmwgPSAvXihbXHdcK1wuXC1dKzopKD86XC9cLyhbXlwvPyM6XSopKD86OihcZCspfCl8KS8sDQoNCgkvLyBLZWVwIGEgY29weSBvZiB0aGUgb2xkIGxvYWQgbWV0aG9kDQoJX2xvYWQgPSBqUXVlcnkuZm4ubG9hZCwNCg0KCS8qIFByZWZpbHRlcnMNCgkgKiAxKSBUaGV5IGFyZSB1c2VmdWwgdG8gaW50cm9kdWNlIGN1c3RvbSBkYXRhVHlwZXMgKHNlZSBhamF4L2pzb25wLmpzIGZvciBhbiBleGFtcGxlKQ0KCSAqIDIpIFRoZXNlIGFyZSBjYWxsZWQ6DQoJICogICAgLSBCRUZPUkUgYXNraW5nIGZvciBhIHRyYW5zcG9ydA0KCSAqICAgIC0gQUZURVIgcGFyYW0gc2VyaWFsaXphdGlvbiAocy5kYXRhIGlzIGEgc3RyaW5nIGlmIHMucHJvY2Vzc0RhdGEgaXMgdHJ1ZSkNCgkgKiAzKSBrZXkgaXMgdGhlIGRhdGFUeXBlDQoJICogNCkgdGhlIGNhdGNoYWxsIHN5bWJvbCAiKiIgY2FuIGJlIHVzZWQNCgkgKiA1KSBleGVjdXRpb24gd2lsbCBzdGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBjb250aW51ZSBkb3duIHRvICIqIiBpZiBuZWVkZWQNCgkgKi8NCglwcmVmaWx0ZXJzID0ge30sDQoNCgkvKiBUcmFuc3BvcnRzIGJpbmRpbmdzDQoJICogMSkga2V5IGlzIHRoZSBkYXRhVHlwZQ0KCSAqIDIpIHRoZSBjYXRjaGFsbCBzeW1ib2wgIioiIGNhbiBiZSB1c2VkDQoJICogMykgc2VsZWN0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gZ28gdG8gIioiIGlmIG5lZWRlZA0KCSAqLw0KCXRyYW5zcG9ydHMgPSB7fSwNCg0KCS8vIEF2b2lkIGNvbW1lbnQtcHJvbG9nIGNoYXIgc2VxdWVuY2UgKCMxMDA5OCk7IG11c3QgYXBwZWFzZSBsaW50IGFuZCBldmFkZSBjb21wcmVzc2lvbg0KCWFsbFR5cGVzID0gWyIqLyJdICsgWyIqIl07DQoNCi8vICM4MTM4LCBJRSBtYXkgdGhyb3cgYW4gZXhjZXB0aW9uIHdoZW4gYWNjZXNzaW5nDQovLyBhIGZpZWxkIGZyb20gd2luZG93LmxvY2F0aW9uIGlmIGRvY3VtZW50LmRvbWFpbiBoYXMgYmVlbiBzZXQNCnRyeSB7DQoJYWpheExvY2F0aW9uID0gbG9jYXRpb24uaHJlZjsNCn0gY2F0Y2goIGUgKSB7DQoJLy8gVXNlIHRoZSBocmVmIGF0dHJpYnV0ZSBvZiBhbiBBIGVsZW1lbnQNCgkvLyBzaW5jZSBJRSB3aWxsIG1vZGlmeSBpdCBnaXZlbiBkb2N1bWVudC5sb2NhdGlvbg0KCWFqYXhMb2NhdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJhIiApOw0KCWFqYXhMb2NhdGlvbi5ocmVmID0gIiI7DQoJYWpheExvY2F0aW9uID0gYWpheExvY2F0aW9uLmhyZWY7DQp9DQoNCi8vIFNlZ21lbnQgbG9jYXRpb24gaW50byBwYXJ0cw0KYWpheExvY1BhcnRzID0gcnVybC5leGVjKCBhamF4TG9jYXRpb24udG9Mb3dlckNhc2UoKSApIHx8IFtdOw0KDQovLyBCYXNlICJjb25zdHJ1Y3RvciIgZm9yIGpRdWVyeS5hamF4UHJlZmlsdGVyIGFuZCBqUXVlcnkuYWpheFRyYW5zcG9ydA0KZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7DQoNCgkvLyBkYXRhVHlwZUV4cHJlc3Npb24gaXMgb3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvICIqIg0KCXJldHVybiBmdW5jdGlvbiggZGF0YVR5cGVFeHByZXNzaW9uLCBmdW5jICkgew0KDQoJCWlmICggdHlwZW9mIGRhdGFUeXBlRXhwcmVzc2lvbiAhPT0gInN0cmluZyIgKSB7DQoJCQlmdW5jID0gZGF0YVR5cGVFeHByZXNzaW9uOw0KCQkJZGF0YVR5cGVFeHByZXNzaW9uID0gIioiOw0KCQl9DQoNCgkJdmFyIGRhdGFUeXBlLCBsaXN0LCBwbGFjZUJlZm9yZSwNCgkJCWRhdGFUeXBlcyA9IGRhdGFUeXBlRXhwcmVzc2lvbi50b0xvd2VyQ2FzZSgpLnNwbGl0KCBjb3JlX3JzcGFjZSApLA0KCQkJaSA9IDAsDQoJCQlsZW5ndGggPSBkYXRhVHlwZXMubGVuZ3RoOw0KDQoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGZ1bmMgKSApIHsNCgkJCS8vIEZvciBlYWNoIGRhdGFUeXBlIGluIHRoZSBkYXRhVHlwZUV4cHJlc3Npb24NCgkJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgew0KCQkJCWRhdGFUeXBlID0gZGF0YVR5cGVzWyBpIF07DQoJCQkJLy8gV2UgY29udHJvbCBpZiB3ZSdyZSBhc2tlZCB0byBhZGQgYmVmb3JlDQoJCQkJLy8gYW55IGV4aXN0aW5nIGVsZW1lbnQNCgkJCQlwbGFjZUJlZm9yZSA9IC9eXCsvLnRlc3QoIGRhdGFUeXBlICk7DQoJCQkJaWYgKCBwbGFjZUJlZm9yZSApIHsNCgkJCQkJZGF0YVR5cGUgPSBkYXRhVHlwZS5zdWJzdHIoIDEgKSB8fCAiKiI7DQoJCQkJfQ0KCQkJCWxpc3QgPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW107DQoJCQkJLy8gdGhlbiB3ZSBhZGQgdG8gdGhlIHN0cnVjdHVyZSBhY2NvcmRpbmdseQ0KCQkJCWxpc3RbIHBsYWNlQmVmb3JlID8gInVuc2hpZnQiIDogInB1c2giIF0oIGZ1bmMgKTsNCgkJCX0NCgkJfQ0KCX07DQp9DQoNCi8vIEJhc2UgaW5zcGVjdGlvbiBmdW5jdGlvbiBmb3IgcHJlZmlsdGVycyBhbmQgdHJhbnNwb3J0cw0KZnVuY3Rpb24gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiwNCgkJZGF0YVR5cGUgLyogaW50ZXJuYWwgKi8sIGluc3BlY3RlZCAvKiBpbnRlcm5hbCAqLyApIHsNCg0KCWRhdGFUeXBlID0gZGF0YVR5cGUgfHwgb3B0aW9ucy5kYXRhVHlwZXNbIDAgXTsNCglpbnNwZWN0ZWQgPSBpbnNwZWN0ZWQgfHwge307DQoNCglpbnNwZWN0ZWRbIGRhdGFUeXBlIF0gPSB0cnVlOw0KDQoJdmFyIHNlbGVjdGlvbiwNCgkJbGlzdCA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSwNCgkJaSA9IDAsDQoJCWxlbmd0aCA9IGxpc3QgPyBsaXN0Lmxlbmd0aCA6IDAsDQoJCWV4ZWN1dGVPbmx5ID0gKCBzdHJ1Y3R1cmUgPT09IHByZWZpbHRlcnMgKTsNCg0KCWZvciAoIDsgaSA8IGxlbmd0aCAmJiAoIGV4ZWN1dGVPbmx5IHx8ICFzZWxlY3Rpb24gKTsgaSsrICkgew0KCQlzZWxlY3Rpb24gPSBsaXN0WyBpIF0oIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTsNCgkJLy8gSWYgd2UgZ290IHJlZGlyZWN0ZWQgdG8gYW5vdGhlciBkYXRhVHlwZQ0KCQkvLyB3ZSB0cnkgdGhlcmUgaWYgZXhlY3V0aW5nIG9ubHkgYW5kIG5vdCBkb25lIGFscmVhZHkNCgkJaWYgKCB0eXBlb2Ygc2VsZWN0aW9uID09PSAic3RyaW5nIiApIHsNCgkJCWlmICggIWV4ZWN1dGVPbmx5IHx8IGluc3BlY3RlZFsgc2VsZWN0aW9uIF0gKSB7DQoJCQkJc2VsZWN0aW9uID0gdW5kZWZpbmVkOw0KCQkJfSBlbHNlIHsNCgkJCQlvcHRpb25zLmRhdGFUeXBlcy51bnNoaWZ0KCBzZWxlY3Rpb24gKTsNCgkJCQlzZWxlY3Rpb24gPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cygNCgkJCQkJCXN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiwgc2VsZWN0aW9uLCBpbnNwZWN0ZWQgKTsNCgkJCX0NCgkJfQ0KCX0NCgkvLyBJZiB3ZSdyZSBvbmx5IGV4ZWN1dGluZyBvciBub3RoaW5nIHdhcyBzZWxlY3RlZA0KCS8vIHdlIHRyeSB0aGUgY2F0Y2hhbGwgZGF0YVR5cGUgaWYgbm90IGRvbmUgYWxyZWFkeQ0KCWlmICggKCBleGVjdXRlT25seSB8fCAhc2VsZWN0aW9uICkgJiYgIWluc3BlY3RlZFsgIioiIF0gKSB7DQoJCXNlbGVjdGlvbiA9IGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKA0KCQkJCXN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiwgIioiLCBpbnNwZWN0ZWQgKTsNCgl9DQoJLy8gdW5uZWNlc3Nhcnkgd2hlbiBvbmx5IGV4ZWN1dGluZyAocHJlZmlsdGVycykNCgkvLyBidXQgaXQnbGwgYmUgaWdub3JlZCBieSB0aGUgY2FsbGVyIGluIHRoYXQgY2FzZQ0KCXJldHVybiBzZWxlY3Rpb247DQp9DQoNCi8vIEEgc3BlY2lhbCBleHRlbmQgZm9yIGFqYXggb3B0aW9ucw0KLy8gdGhhdCB0YWtlcyAiZmxhdCIgb3B0aW9ucyAobm90IHRvIGJlIGRlZXAgZXh0ZW5kZWQpDQovLyBGaXhlcyAjOTg4Nw0KZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7DQoJdmFyIGtleSwgZGVlcCwNCgkJZmxhdE9wdGlvbnMgPSBqUXVlcnkuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zIHx8IHt9Ow0KCWZvciAoIGtleSBpbiBzcmMgKSB7DQoJCWlmICggc3JjWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkgew0KCQkJKCBmbGF0T3B0aW9uc1sga2V5IF0gPyB0YXJnZXQgOiAoIGRlZXAgfHwgKCBkZWVwID0ge30gKSApIClbIGtleSBdID0gc3JjWyBrZXkgXTsNCgkJfQ0KCX0NCglpZiAoIGRlZXAgKSB7DQoJCWpRdWVyeS5leHRlbmQoIHRydWUsIHRhcmdldCwgZGVlcCApOw0KCX0NCn0NCg0KalF1ZXJ5LmZuLmxvYWQgPSBmdW5jdGlvbiggdXJsLCBwYXJhbXMsIGNhbGxiYWNrICkgew0KCWlmICggdHlwZW9mIHVybCAhPT0gInN0cmluZyIgJiYgX2xvYWQgKSB7DQoJCXJldHVybiBfbG9hZC5hcHBseSggdGhpcywgYXJndW1lbnRzICk7DQoJfQ0KDQoJLy8gRG9uJ3QgZG8gYSByZXF1ZXN0IGlmIG5vIGVsZW1lbnRzIGFyZSBiZWluZyByZXF1ZXN0ZWQNCglpZiAoICF0aGlzLmxlbmd0aCApIHsNCgkJcmV0dXJuIHRoaXM7DQoJfQ0KDQoJdmFyIHNlbGVjdG9yLCB0eXBlLCByZXNwb25zZSwNCgkJc2VsZiA9IHRoaXMsDQoJCW9mZiA9IHVybC5pbmRleE9mKCIgIik7DQoNCglpZiAoIG9mZiA+PSAwICkgew0KCQlzZWxlY3RvciA9IHVybC5zbGljZSggb2ZmLCB1cmwubGVuZ3RoICk7DQoJCXVybCA9IHVybC5zbGljZSggMCwgb2ZmICk7DQoJfQ0KDQoJLy8gSWYgaXQncyBhIGZ1bmN0aW9uDQoJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcGFyYW1zICkgKSB7DQoNCgkJLy8gV2UgYXNzdW1lIHRoYXQgaXQncyB0aGUgY2FsbGJhY2sNCgkJY2FsbGJhY2sgPSBwYXJhbXM7DQoJCXBhcmFtcyA9IHVuZGVmaW5lZDsNCg0KCS8vIE90aGVyd2lzZSwgYnVpbGQgYSBwYXJhbSBzdHJpbmcNCgl9IGVsc2UgaWYgKCBwYXJhbXMgJiYgdHlwZW9mIHBhcmFtcyA9PT0gIm9iamVjdCIgKSB7DQoJCXR5cGUgPSAiUE9TVCI7DQoJfQ0KDQoJLy8gUmVxdWVzdCB0aGUgcmVtb3RlIGRvY3VtZW50DQoJalF1ZXJ5LmFqYXgoew0KCQl1cmw6IHVybCwNCg0KCQkvLyBpZiAidHlwZSIgdmFyaWFibGUgaXMgdW5kZWZpbmVkLCB0aGVuICJHRVQiIG1ldGhvZCB3aWxsIGJlIHVzZWQNCgkJdHlwZTogdHlwZSwNCgkJZGF0YVR5cGU6ICJodG1sIiwNCgkJZGF0YTogcGFyYW1zLA0KCQljb21wbGV0ZTogZnVuY3Rpb24oIGpxWEhSLCBzdGF0dXMgKSB7DQoJCQlpZiAoIGNhbGxiYWNrICkgew0KCQkJCXNlbGYuZWFjaCggY2FsbGJhY2ssIHJlc3BvbnNlIHx8IFsganFYSFIucmVzcG9uc2VUZXh0LCBzdGF0dXMsIGpxWEhSIF0gKTsNCgkJCX0NCgkJfQ0KCX0pLmRvbmUoZnVuY3Rpb24oIHJlc3BvbnNlVGV4dCApIHsNCg0KCQkvLyBTYXZlIHJlc3BvbnNlIGZvciB1c2UgaW4gY29tcGxldGUgY2FsbGJhY2sNCgkJcmVzcG9uc2UgPSBhcmd1bWVudHM7DQoNCgkJLy8gU2VlIGlmIGEgc2VsZWN0b3Igd2FzIHNwZWNpZmllZA0KCQlzZWxmLmh0bWwoIHNlbGVjdG9yID8NCg0KCQkJLy8gQ3JlYXRlIGEgZHVtbXkgZGl2IHRvIGhvbGQgdGhlIHJlc3VsdHMNCgkJCWpRdWVyeSgiPGRpdj4iKQ0KDQoJCQkJLy8gaW5qZWN0IHRoZSBjb250ZW50cyBvZiB0aGUgZG9jdW1lbnQgaW4sIHJlbW92aW5nIHRoZSBzY3JpcHRzDQoJCQkJLy8gdG8gYXZvaWQgYW55ICdQZXJtaXNzaW9uIERlbmllZCcgZXJyb3JzIGluIElFDQoJCQkJLmFwcGVuZCggcmVzcG9uc2VUZXh0LnJlcGxhY2UoIHJzY3JpcHQsICIiICkgKQ0KDQoJCQkJLy8gTG9jYXRlIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMNCgkJCQkuZmluZCggc2VsZWN0b3IgKSA6DQoNCgkJCS8vIElmIG5vdCwganVzdCBpbmplY3QgdGhlIGZ1bGwgcmVzdWx0DQoJCQlyZXNwb25zZVRleHQgKTsNCg0KCX0pOw0KDQoJcmV0dXJuIHRoaXM7DQp9Ow0KDQovLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFYIGV2ZW50cw0KalF1ZXJ5LmVhY2goICJhamF4U3RhcnQgYWpheFN0b3AgYWpheENvbXBsZXRlIGFqYXhFcnJvciBhamF4U3VjY2VzcyBhamF4U2VuZCIuc3BsaXQoICIgIiApLCBmdW5jdGlvbiggaSwgbyApew0KCWpRdWVyeS5mblsgbyBdID0gZnVuY3Rpb24oIGYgKXsNCgkJcmV0dXJuIHRoaXMub24oIG8sIGYgKTsNCgl9Ow0KfSk7DQoNCmpRdWVyeS5lYWNoKCBbICJnZXQiLCAicG9zdCIgXSwgZnVuY3Rpb24oIGksIG1ldGhvZCApIHsNCglqUXVlcnlbIG1ldGhvZCBdID0gZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2ssIHR5cGUgKSB7DQoJCS8vIHNoaWZ0IGFyZ3VtZW50cyBpZiBkYXRhIGFyZ3VtZW50IHdhcyBvbWl0dGVkDQoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSApIHsNCgkJCXR5cGUgPSB0eXBlIHx8IGNhbGxiYWNrOw0KCQkJY2FsbGJhY2sgPSBkYXRhOw0KCQkJZGF0YSA9IHVuZGVmaW5lZDsNCgkJfQ0KDQoJCXJldHVybiBqUXVlcnkuYWpheCh7DQoJCQl0eXBlOiBtZXRob2QsDQoJCQl1cmw6IHVybCwNCgkJCWRhdGE6IGRhdGEsDQoJCQlzdWNjZXNzOiBjYWxsYmFjaywNCgkJCWRhdGFUeXBlOiB0eXBlDQoJCX0pOw0KCX07DQp9KTsNCg0KalF1ZXJ5LmV4dGVuZCh7DQoNCglnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkgew0KCQlyZXR1cm4galF1ZXJ5LmdldCggdXJsLCB1bmRlZmluZWQsIGNhbGxiYWNrLCAic2NyaXB0IiApOw0KCX0sDQoNCglnZXRKU09OOiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjayApIHsNCgkJcmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgZGF0YSwgY2FsbGJhY2ssICJqc29uIiApOw0KCX0sDQoNCgkvLyBDcmVhdGVzIGEgZnVsbCBmbGVkZ2VkIHNldHRpbmdzIG9iamVjdCBpbnRvIHRhcmdldA0KCS8vIHdpdGggYm90aCBhamF4U2V0dGluZ3MgYW5kIHNldHRpbmdzIGZpZWxkcy4NCgkvLyBJZiB0YXJnZXQgaXMgb21pdHRlZCwgd3JpdGVzIGludG8gYWpheFNldHRpbmdzLg0KCWFqYXhTZXR1cDogZnVuY3Rpb24oIHRhcmdldCwgc2V0dGluZ3MgKSB7DQoJCWlmICggc2V0dGluZ3MgKSB7DQoJCQkvLyBCdWlsZGluZyBhIHNldHRpbmdzIG9iamVjdA0KCQkJYWpheEV4dGVuZCggdGFyZ2V0LCBqUXVlcnkuYWpheFNldHRpbmdzICk7DQoJCX0gZWxzZSB7DQoJCQkvLyBFeHRlbmRpbmcgYWpheFNldHRpbmdzDQoJCQlzZXR0aW5ncyA9IHRhcmdldDsNCgkJCXRhcmdldCA9IGpRdWVyeS5hamF4U2V0dGluZ3M7DQoJCX0NCgkJYWpheEV4dGVuZCggdGFyZ2V0LCBzZXR0aW5ncyApOw0KCQlyZXR1cm4gdGFyZ2V0Ow0KCX0sDQoNCglhamF4U2V0dGluZ3M6IHsNCgkJdXJsOiBhamF4TG9jYXRpb24sDQoJCWlzTG9jYWw6IHJsb2NhbFByb3RvY29sLnRlc3QoIGFqYXhMb2NQYXJ0c1sgMSBdICksDQoJCWdsb2JhbDogdHJ1ZSwNCgkJdHlwZTogIkdFVCIsDQoJCWNvbnRlbnRUeXBlOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IiwNCgkJcHJvY2Vzc0RhdGE6IHRydWUsDQoJCWFzeW5jOiB0cnVlLA0KCQkvKg0KCQl0aW1lb3V0OiAwLA0KCQlkYXRhOiBudWxsLA0KCQlkYXRhVHlwZTogbnVsbCwNCgkJdXNlcm5hbWU6IG51bGwsDQoJCXBhc3N3b3JkOiBudWxsLA0KCQljYWNoZTogbnVsbCwNCgkJdGhyb3dzOiBmYWxzZSwNCgkJdHJhZGl0aW9uYWw6IGZhbHNlLA0KCQloZWFkZXJzOiB7fSwNCgkJKi8NCg0KCQlhY2NlcHRzOiB7DQoJCQl4bWw6ICJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIiwNCgkJCWh0bWw6ICJ0ZXh0L2h0bWwiLA0KCQkJdGV4dDogInRleHQvcGxhaW4iLA0KCQkJanNvbjogImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCIsDQoJCQkiKiI6IGFsbFR5cGVzDQoJCX0sDQoNCgkJY29udGVudHM6IHsNCgkJCXhtbDogL3htbC8sDQoJCQlodG1sOiAvaHRtbC8sDQoJCQlqc29uOiAvanNvbi8NCgkJfSwNCg0KCQlyZXNwb25zZUZpZWxkczogew0KCQkJeG1sOiAicmVzcG9uc2VYTUwiLA0KCQkJdGV4dDogInJlc3BvbnNlVGV4dCINCgkJfSwNCg0KCQkvLyBMaXN0IG9mIGRhdGEgY29udmVydGVycw0KCQkvLyAxKSBrZXkgZm9ybWF0IGlzICJzb3VyY2VfdHlwZSBkZXN0aW5hdGlvbl90eXBlIiAoYSBzaW5nbGUgc3BhY2UgaW4tYmV0d2VlbikNCgkJLy8gMikgdGhlIGNhdGNoYWxsIHN5bWJvbCAiKiIgY2FuIGJlIHVzZWQgZm9yIHNvdXJjZV90eXBlDQoJCWNvbnZlcnRlcnM6IHsNCg0KCQkJLy8gQ29udmVydCBhbnl0aGluZyB0byB0ZXh0DQoJCQkiKiB0ZXh0Ijogd2luZG93LlN0cmluZywNCg0KCQkJLy8gVGV4dCB0byBodG1sICh0cnVlID0gbm8gdHJhbnNmb3JtYXRpb24pDQoJCQkidGV4dCBodG1sIjogdHJ1ZSwNCg0KCQkJLy8gRXZhbHVhdGUgdGV4dCBhcyBhIGpzb24gZXhwcmVzc2lvbg0KCQkJInRleHQganNvbiI6IGpRdWVyeS5wYXJzZUpTT04sDQoNCgkJCS8vIFBhcnNlIHRleHQgYXMgeG1sDQoJCQkidGV4dCB4bWwiOiBqUXVlcnkucGFyc2VYTUwNCgkJfSwNCg0KCQkvLyBGb3Igb3B0aW9ucyB0aGF0IHNob3VsZG4ndCBiZSBkZWVwIGV4dGVuZGVkOg0KCQkvLyB5b3UgY2FuIGFkZCB5b3VyIG93biBjdXN0b20gb3B0aW9ucyBoZXJlIGlmDQoJCS8vIGFuZCB3aGVuIHlvdSBjcmVhdGUgb25lIHRoYXQgc2hvdWxkbid0IGJlDQoJCS8vIGRlZXAgZXh0ZW5kZWQgKHNlZSBhamF4RXh0ZW5kKQ0KCQlmbGF0T3B0aW9uczogew0KCQkJY29udGV4dDogdHJ1ZSwNCgkJCXVybDogdHJ1ZQ0KCQl9DQoJfSwNCg0KCWFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLA0KCWFqYXhUcmFuc3BvcnQ6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cyApLA0KDQoJLy8gTWFpbiBtZXRob2QNCglhamF4OiBmdW5jdGlvbiggdXJsLCBvcHRpb25zICkgew0KDQoJCS8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRlIHByZS0xLjUgc2lnbmF0dXJlDQoJCWlmICggdHlwZW9mIHVybCA9PT0gIm9iamVjdCIgKSB7DQoJCQlvcHRpb25zID0gdXJsOw0KCQkJdXJsID0gdW5kZWZpbmVkOw0KCQl9DQoNCgkJLy8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBvYmplY3QNCgkJb3B0aW9ucyA9IG9wdGlvbnMgfHwge307DQoNCgkJdmFyIC8vIGlmTW9kaWZpZWQga2V5DQoJCQlpZk1vZGlmaWVkS2V5LA0KCQkJLy8gUmVzcG9uc2UgaGVhZGVycw0KCQkJcmVzcG9uc2VIZWFkZXJzU3RyaW5nLA0KCQkJcmVzcG9uc2VIZWFkZXJzLA0KCQkJLy8gdHJhbnNwb3J0DQoJCQl0cmFuc3BvcnQsDQoJCQkvLyB0aW1lb3V0IGhhbmRsZQ0KCQkJdGltZW91dFRpbWVyLA0KCQkJLy8gQ3Jvc3MtZG9tYWluIGRldGVjdGlvbiB2YXJzDQoJCQlwYXJ0cywNCgkJCS8vIFRvIGtub3cgaWYgZ2xvYmFsIGV2ZW50cyBhcmUgdG8gYmUgZGlzcGF0Y2hlZA0KCQkJZmlyZUdsb2JhbHMsDQoJCQkvLyBMb29wIHZhcmlhYmxlDQoJCQlpLA0KCQkJLy8gQ3JlYXRlIHRoZSBmaW5hbCBvcHRpb25zIG9iamVjdA0KCQkJcyA9IGpRdWVyeS5hamF4U2V0dXAoIHt9LCBvcHRpb25zICksDQoJCQkvLyBDYWxsYmFja3MgY29udGV4dA0KCQkJY2FsbGJhY2tDb250ZXh0ID0gcy5jb250ZXh0IHx8IHMsDQoJCQkvLyBDb250ZXh0IGZvciBnbG9iYWwgZXZlbnRzDQoJCQkvLyBJdCdzIHRoZSBjYWxsYmFja0NvbnRleHQgaWYgb25lIHdhcyBwcm92aWRlZCBpbiB0aGUgb3B0aW9ucw0KCQkJLy8gYW5kIGlmIGl0J3MgYSBET00gbm9kZSBvciBhIGpRdWVyeSBjb2xsZWN0aW9uDQoJCQlnbG9iYWxFdmVudENvbnRleHQgPSBjYWxsYmFja0NvbnRleHQgIT09IHMgJiYNCgkJCQkoIGNhbGxiYWNrQ29udGV4dC5ub2RlVHlwZSB8fCBjYWxsYmFja0NvbnRleHQgaW5zdGFuY2VvZiBqUXVlcnkgKSA/DQoJCQkJCQlqUXVlcnkoIGNhbGxiYWNrQ29udGV4dCApIDogalF1ZXJ5LmV2ZW50LA0KCQkJLy8gRGVmZXJyZWRzDQoJCQlkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLA0KCQkJY29tcGxldGVEZWZlcnJlZCA9IGpRdWVyeS5DYWxsYmFja3MoICJvbmNlIG1lbW9yeSIgKSwNCgkJCS8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzDQoJCQlzdGF0dXNDb2RlID0gcy5zdGF0dXNDb2RlIHx8IHt9LA0KCQkJLy8gSGVhZGVycyAodGhleSBhcmUgc2VudCBhbGwgYXQgb25jZSkNCgkJCXJlcXVlc3RIZWFkZXJzID0ge30sDQoJCQlyZXF1ZXN0SGVhZGVyc05hbWVzID0ge30sDQoJCQkvLyBUaGUganFYSFIgc3RhdGUNCgkJCXN0YXRlID0gMCwNCgkJCS8vIERlZmF1bHQgYWJvcnQgbWVzc2FnZQ0KCQkJc3RyQWJvcnQgPSAiY2FuY2VsZWQiLA0KCQkJLy8gRmFrZSB4aHINCgkJCWpxWEhSID0gew0KDQoJCQkJcmVhZHlTdGF0ZTogMCwNCg0KCQkJCS8vIENhY2hlcyB0aGUgaGVhZGVyDQoJCQkJc2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkgew0KCQkJCQlpZiAoICFzdGF0ZSApIHsNCgkJCQkJCXZhciBsbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsNCgkJCQkJCW5hbWUgPSByZXF1ZXN0SGVhZGVyc05hbWVzWyBsbmFtZSBdID0gcmVxdWVzdEhlYWRlcnNOYW1lc1sgbG5hbWUgXSB8fCBuYW1lOw0KCQkJCQkJcmVxdWVzdEhlYWRlcnNbIG5hbWUgXSA9IHZhbHVlOw0KCQkJCQl9DQoJCQkJCXJldHVybiB0aGlzOw0KCQkJCX0sDQoNCgkJCQkvLyBSYXcgc3RyaW5nDQoJCQkJZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOiBmdW5jdGlvbigpIHsNCgkJCQkJcmV0dXJuIHN0YXRlID09PSAyID8gcmVzcG9uc2VIZWFkZXJzU3RyaW5nIDogbnVsbDsNCgkJCQl9LA0KDQoJCQkJLy8gQnVpbGRzIGhlYWRlcnMgaGFzaHRhYmxlIGlmIG5lZWRlZA0KCQkJCWdldFJlc3BvbnNlSGVhZGVyOiBmdW5jdGlvbigga2V5ICkgew0KCQkJCQl2YXIgbWF0Y2g7DQoJCQkJCWlmICggc3RhdGUgPT09IDIgKSB7DQoJCQkJCQlpZiAoICFyZXNwb25zZUhlYWRlcnMgKSB7DQoJCQkJCQkJcmVzcG9uc2VIZWFkZXJzID0ge307DQoJCQkJCQkJd2hpbGUoICggbWF0Y2ggPSByaGVhZGVycy5leGVjKCByZXNwb25zZUhlYWRlcnNTdHJpbmcgKSApICkgew0KCQkJCQkJCQlyZXNwb25zZUhlYWRlcnNbIG1hdGNoWzFdLnRvTG93ZXJDYXNlKCkgXSA9IG1hdGNoWyAyIF07DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQkJbWF0Y2ggPSByZXNwb25zZUhlYWRlcnNbIGtleS50b0xvd2VyQ2FzZSgpIF07DQoJCQkJCX0NCgkJCQkJcmV0dXJuIG1hdGNoID09PSB1bmRlZmluZWQgPyBudWxsIDogbWF0Y2g7DQoJCQkJfSwNCg0KCQkJCS8vIE92ZXJyaWRlcyByZXNwb25zZSBjb250ZW50LXR5cGUgaGVhZGVyDQoJCQkJb3ZlcnJpZGVNaW1lVHlwZTogZnVuY3Rpb24oIHR5cGUgKSB7DQoJCQkJCWlmICggIXN0YXRlICkgew0KCQkJCQkJcy5taW1lVHlwZSA9IHR5cGU7DQoJCQkJCX0NCgkJCQkJcmV0dXJuIHRoaXM7DQoJCQkJfSwNCg0KCQkJCS8vIENhbmNlbCB0aGUgcmVxdWVzdA0KCQkJCWFib3J0OiBmdW5jdGlvbiggc3RhdHVzVGV4dCApIHsNCgkJCQkJc3RhdHVzVGV4dCA9IHN0YXR1c1RleHQgfHwgc3RyQWJvcnQ7DQoJCQkJCWlmICggdHJhbnNwb3J0ICkgew0KCQkJCQkJdHJhbnNwb3J0LmFib3J0KCBzdGF0dXNUZXh0ICk7DQoJCQkJCX0NCgkJCQkJZG9uZSggMCwgc3RhdHVzVGV4dCApOw0KCQkJCQlyZXR1cm4gdGhpczsNCgkJCQl9DQoJCQl9Ow0KDQoJCS8vIENhbGxiYWNrIGZvciB3aGVuIGV2ZXJ5dGhpbmcgaXMgZG9uZQ0KCQkvLyBJdCBpcyBkZWZpbmVkIGhlcmUgYmVjYXVzZSBqc2xpbnQgY29tcGxhaW5zIGlmIGl0IGlzIGRlY2xhcmVkDQoJCS8vIGF0IHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uICh3aGljaCB3b3VsZCBiZSBtb3JlIGxvZ2ljYWwgYW5kIHJlYWRhYmxlKQ0KCQlmdW5jdGlvbiBkb25lKCBzdGF0dXMsIG5hdGl2ZVN0YXR1c1RleHQsIHJlc3BvbnNlcywgaGVhZGVycyApIHsNCgkJCXZhciBpc1N1Y2Nlc3MsIHN1Y2Nlc3MsIGVycm9yLCByZXNwb25zZSwgbW9kaWZpZWQsDQoJCQkJc3RhdHVzVGV4dCA9IG5hdGl2ZVN0YXR1c1RleHQ7DQoNCgkJCS8vIENhbGxlZCBvbmNlDQoJCQlpZiAoIHN0YXRlID09PSAyICkgew0KCQkJCXJldHVybjsNCgkJCX0NCg0KCQkJLy8gU3RhdGUgaXMgImRvbmUiIG5vdw0KCQkJc3RhdGUgPSAyOw0KDQoJCQkvLyBDbGVhciB0aW1lb3V0IGlmIGl0IGV4aXN0cw0KCQkJaWYgKCB0aW1lb3V0VGltZXIgKSB7DQoJCQkJY2xlYXJUaW1lb3V0KCB0aW1lb3V0VGltZXIgKTsNCgkJCX0NCg0KCQkJLy8gRGVyZWZlcmVuY2UgdHJhbnNwb3J0IGZvciBlYXJseSBnYXJiYWdlIGNvbGxlY3Rpb24NCgkJCS8vIChubyBtYXR0ZXIgaG93IGxvbmcgdGhlIGpxWEhSIG9iamVjdCB3aWxsIGJlIHVzZWQpDQoJCQl0cmFuc3BvcnQgPSB1bmRlZmluZWQ7DQoNCgkJCS8vIENhY2hlIHJlc3BvbnNlIGhlYWRlcnMNCgkJCXJlc3BvbnNlSGVhZGVyc1N0cmluZyA9IGhlYWRlcnMgfHwgIiI7DQoNCgkJCS8vIFNldCByZWFkeVN0YXRlDQoJCQlqcVhIUi5yZWFkeVN0YXRlID0gc3RhdHVzID4gMCA/IDQgOiAwOw0KDQoJCQkvLyBHZXQgcmVzcG9uc2UgZGF0YQ0KCQkJaWYgKCByZXNwb25zZXMgKSB7DQoJCQkJcmVzcG9uc2UgPSBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICk7DQoJCQl9DQoNCgkJCS8vIElmIHN1Y2Nlc3NmdWwsIGhhbmRsZSB0eXBlIGNoYWluaW5nDQoJCQlpZiAoIHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1cyA9PT0gMzA0ICkgew0KDQoJCQkJLy8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS4NCgkJCQlpZiAoIHMuaWZNb2RpZmllZCApIHsNCg0KCQkJCQltb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIik7DQoJCQkJCWlmICggbW9kaWZpZWQgKSB7DQoJCQkJCQlqUXVlcnkubGFzdE1vZGlmaWVkWyBpZk1vZGlmaWVkS2V5IF0gPSBtb2RpZmllZDsNCgkJCQkJfQ0KCQkJCQltb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCJFdGFnIik7DQoJCQkJCWlmICggbW9kaWZpZWQgKSB7DQoJCQkJCQlqUXVlcnkuZXRhZ1sgaWZNb2RpZmllZEtleSBdID0gbW9kaWZpZWQ7DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQkvLyBJZiBub3QgbW9kaWZpZWQNCgkJCQlpZiAoIHN0YXR1cyA9PT0gMzA0ICkgew0KDQoJCQkJCXN0YXR1c1RleHQgPSAibm90bW9kaWZpZWQiOw0KCQkJCQlpc1N1Y2Nlc3MgPSB0cnVlOw0KDQoJCQkJLy8gSWYgd2UgaGF2ZSBkYXRhDQoJCQkJfSBlbHNlIHsNCg0KCQkJCQlpc1N1Y2Nlc3MgPSBhamF4Q29udmVydCggcywgcmVzcG9uc2UgKTsNCgkJCQkJc3RhdHVzVGV4dCA9IGlzU3VjY2Vzcy5zdGF0ZTsNCgkJCQkJc3VjY2VzcyA9IGlzU3VjY2Vzcy5kYXRhOw0KCQkJCQllcnJvciA9IGlzU3VjY2Vzcy5lcnJvcjsNCgkJCQkJaXNTdWNjZXNzID0gIWVycm9yOw0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJLy8gV2UgZXh0cmFjdCBlcnJvciBmcm9tIHN0YXR1c1RleHQNCgkJCQkvLyB0aGVuIG5vcm1hbGl6ZSBzdGF0dXNUZXh0IGFuZCBzdGF0dXMgZm9yIG5vbi1hYm9ydHMNCgkJCQllcnJvciA9IHN0YXR1c1RleHQ7DQoJCQkJaWYgKCAhc3RhdHVzVGV4dCB8fCBzdGF0dXMgKSB7DQoJCQkJCXN0YXR1c1RleHQgPSAiZXJyb3IiOw0KCQkJCQlpZiAoIHN0YXR1cyA8IDAgKSB7DQoJCQkJCQlzdGF0dXMgPSAwOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBTZXQgZGF0YSBmb3IgdGhlIGZha2UgeGhyIG9iamVjdA0KCQkJanFYSFIuc3RhdHVzID0gc3RhdHVzOw0KCQkJanFYSFIuc3RhdHVzVGV4dCA9ICggbmF0aXZlU3RhdHVzVGV4dCB8fCBzdGF0dXNUZXh0ICkgKyAiIjsNCg0KCQkJLy8gU3VjY2Vzcy9FcnJvcg0KCQkJaWYgKCBpc1N1Y2Nlc3MgKSB7DQoJCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBzdWNjZXNzLCBzdGF0dXNUZXh0LCBqcVhIUiBdICk7DQoJCQl9IGVsc2Ugew0KCQkJCWRlZmVycmVkLnJlamVjdFdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCwgZXJyb3IgXSApOw0KCQkJfQ0KDQoJCQkvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcw0KCQkJanFYSFIuc3RhdHVzQ29kZSggc3RhdHVzQ29kZSApOw0KCQkJc3RhdHVzQ29kZSA9IHVuZGVmaW5lZDsNCg0KCQkJaWYgKCBmaXJlR2xvYmFscyApIHsNCgkJCQlnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggImFqYXgiICsgKCBpc1N1Y2Nlc3MgPyAiU3VjY2VzcyIgOiAiRXJyb3IiICksDQoJCQkJCQlbIGpxWEhSLCBzLCBpc1N1Y2Nlc3MgPyBzdWNjZXNzIDogZXJyb3IgXSApOw0KCQkJfQ0KDQoJCQkvLyBDb21wbGV0ZQ0KCQkJY29tcGxldGVEZWZlcnJlZC5maXJlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0IF0gKTsNCg0KCQkJaWYgKCBmaXJlR2xvYmFscyApIHsNCgkJCQlnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggImFqYXhDb21wbGV0ZSIsIFsganFYSFIsIHMgXSApOw0KCQkJCS8vIEhhbmRsZSB0aGUgZ2xvYmFsIEFKQVggY291bnRlcg0KCQkJCWlmICggISggLS1qUXVlcnkuYWN0aXZlICkgKSB7DQoJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0b3AiICk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoNCgkJLy8gQXR0YWNoIGRlZmVycmVkcw0KCQlkZWZlcnJlZC5wcm9taXNlKCBqcVhIUiApOw0KCQlqcVhIUi5zdWNjZXNzID0ganFYSFIuZG9uZTsNCgkJanFYSFIuZXJyb3IgPSBqcVhIUi5mYWlsOw0KCQlqcVhIUi5jb21wbGV0ZSA9IGNvbXBsZXRlRGVmZXJyZWQuYWRkOw0KDQoJCS8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzDQoJCWpxWEhSLnN0YXR1c0NvZGUgPSBmdW5jdGlvbiggbWFwICkgew0KCQkJaWYgKCBtYXAgKSB7DQoJCQkJdmFyIHRtcDsNCgkJCQlpZiAoIHN0YXRlIDwgMiApIHsNCgkJCQkJZm9yICggdG1wIGluIG1hcCApIHsNCgkJCQkJCXN0YXR1c0NvZGVbIHRtcCBdID0gWyBzdGF0dXNDb2RlW3RtcF0sIG1hcFt0bXBdIF07DQoJCQkJCX0NCgkJCQl9IGVsc2Ugew0KCQkJCQl0bXAgPSBtYXBbIGpxWEhSLnN0YXR1cyBdOw0KCQkJCQlqcVhIUi5hbHdheXMoIHRtcCApOw0KCQkJCX0NCgkJCX0NCgkJCXJldHVybiB0aGlzOw0KCQl9Ow0KDQoJCS8vIFJlbW92ZSBoYXNoIGNoYXJhY3RlciAoIzc1MzE6IGFuZCBzdHJpbmcgcHJvbW90aW9uKQ0KCQkvLyBBZGQgcHJvdG9jb2wgaWYgbm90IHByb3ZpZGVkICgjNTg2NjogSUU3IGlzc3VlIHdpdGggcHJvdG9jb2wtbGVzcyB1cmxzKQ0KCQkvLyBXZSBhbHNvIHVzZSB0aGUgdXJsIHBhcmFtZXRlciBpZiBhdmFpbGFibGUNCgkJcy51cmwgPSAoICggdXJsIHx8IHMudXJsICkgKyAiIiApLnJlcGxhY2UoIHJoYXNoLCAiIiApLnJlcGxhY2UoIHJwcm90b2NvbCwgYWpheExvY1BhcnRzWyAxIF0gKyAiLy8iICk7DQoNCgkJLy8gRXh0cmFjdCBkYXRhVHlwZXMgbGlzdA0KCQlzLmRhdGFUeXBlcyA9IGpRdWVyeS50cmltKCBzLmRhdGFUeXBlIHx8ICIqIiApLnRvTG93ZXJDYXNlKCkuc3BsaXQoIGNvcmVfcnNwYWNlICk7DQoNCgkJLy8gQSBjcm9zcy1kb21haW4gcmVxdWVzdCBpcyBpbiBvcmRlciB3aGVuIHdlIGhhdmUgYSBwcm90b2NvbDpob3N0OnBvcnQgbWlzbWF0Y2gNCgkJaWYgKCBzLmNyb3NzRG9tYWluID09IG51bGwgKSB7DQoJCQlwYXJ0cyA9IHJ1cmwuZXhlYyggcy51cmwudG9Mb3dlckNhc2UoKSApOw0KCQkJcy5jcm9zc0RvbWFpbiA9ICEhKCBwYXJ0cyAmjg0KCQkJCSggcGFydHNbIDEgXSAhPT0gYWpheExvY1BhcnRzWyAxIF0gfHwgcGFydHNbIDIgXSAhPT0gYWpheExvY1BhcnRzWyAyIF0gfHwNCgkJCQkJKCBwYXJ0c1sgMyBdIHx8ICggcGFydHNbIDEgXSA9PT0gImh0dHA6IiA/IDgwIDogNDQzICkgKSAhPQ0KCQkJCQkJKCBhamF4TG9jUGFydHNbIDMgXSB8fCAoIGFqYXhMb2NQYXJ0c1sgMSBdID09PSAiaHR0cDoiID8gODAgOiA0NDMgKSApICkNCgkJCSk7DQoJCX0NCg0KCQkvLyBDb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmcNCgkJaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJiB0eXBlb2Ygcy5kYXRhICE9PSAic3RyaW5nIiApIHsNCgkJCXMuZGF0YSA9IGpRdWVyeS5wYXJhbSggcy5kYXRhLCBzLnRyYWRpdGlvbmFsICk7DQoJCX0NCg0KCQkvLyBBcHBseSBwcmVmaWx0ZXJzDQoJCWluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzLCBzLCBvcHRpb25zLCBqcVhIUiApOw0KDQoJCS8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGEgcHJlZmlsdGVyLCBzdG9wIHRoZXJlDQoJCWlmICggc3RhdGUgPT09IDIgKSB7DQoJCQlyZXR1cm4ganFYSFI7DQoJCX0NCg0KCQkvLyBXZSBjYW4gZmlyZSBnbG9iYWwgZXZlbnRzIGFzIG9mIG5vdyBpZiBhc2tlZCB0bw0KCQlmaXJlR2xvYmFscyA9IHMuZ2xvYmFsOw0KDQoJCS8vIFVwcGVyY2FzZSB0aGUgdHlwZQ0KCQlzLnR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTsNCg0KCQkvLyBEZXRlcm1pbmUgaWYgcmVxdWVzdCBoYXMgY29udGVudA0KCQlzLmhhc0NvbnRlbnQgPSAhcm5vQ29udGVudC50ZXN0KCBzLnR5cGUgKTsNCg0KCQkvLyBXYXRjaCBmb3IgYSBuZXcgc2V0IG9mIHJlcXVlc3RzDQoJCWlmICggZmlyZUdsb2JhbHMgJiYgalF1ZXJ5LmFjdGl2ZSsrID09PSAwICkgew0KCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RhcnQiICk7DQoJCX0NCg0KCQkvLyBNb3JlIG9wdGlvbnMgaGFuZGxpbmcgZm9yIHJlcXVlc3RzIHdpdGggbm8gY29udGVudA0KCQlpZiAoICFzLmhhc0NvbnRlbnQgKSB7DQoNCgkJCS8vIElmIGRhdGEgaXMgYXZhaWxhYmxlLCBhcHBlbmQgZGF0YSB0byB1cmwNCgkJCWlmICggcy5kYXRhICkgew0KCQkJCXMudXJsICs9ICggcnF1ZXJ5LnRlc3QoIHMudXJsICkgPyAiJiIgOiAiPyIgKSArIHMuZGF0YTsNCgkJCQkvLyAjOTY4MjogcmVtb3ZlIGRhdGEgc28gdGhhdCBpdCdzIG5vdCB1c2VkIGluIGFuIGV2ZW50dWFsIHJldHJ5DQoJCQkJZGVsZXRlIHMuZGF0YTsNCgkJCX0NCg0KCQkJLy8gR2V0IGlmTW9kaWZpZWRLZXkgYmVmb3JlIGFkZGluZyB0aGUgYW50aS1jYWNoZSBwYXJhbWV0ZXINCgkJCWlmTW9kaWZpZWRLZXkgPSBzLnVybDsNCg0KCQkJLy8gQWRkIGFudGktY2FjaGUgaW4gdXJsIGlmIG5lZWRlZA0KCQkJaWYgKCBzLmNhY2hlID09PSBmYWxzZSApIHsNCg0KCQkJCXZhciB0cyA9IGpRdWVyeS5ub3coKSwNCgkJCQkJLy8gdHJ5IHJlcGxhY2luZyBfPSBpZiBpdCBpcyB0aGVyZQ0KCQkJCQlyZXQgPSBzLnVybC5yZXBsYWNlKCBydHMsICIkMV89IiArIHRzICk7DQoNCgkJCQkvLyBpZiBub3RoaW5nIHdhcyByZXBsYWNlZCwgYWRkIHRpbWVzdGFtcCB0byB0aGUgZW5kDQoJCQkJcy51cmwgPSByZXQgKyAoICggcmV0ID09PSBzLnVybCApID8gKCBycXVlcnkudGVzdCggcy51cmwgKSA/ICImIiA6ICI/IiApICsgIl89IiArIHRzIDogIiIgKTsNCgkJCX0NCgkJfQ0KDQoJCS8vIFNldCB0aGUgY29ycmVjdCBoZWFkZXIsIGlmIGRhdGEgaXMgYmVpbmcgc2VudA0KCQlpZiAoIHMuZGF0YSAmJiBzLmhhc0NvbnRlbnQgJiYgcy5jb250ZW50VHlwZSAhPT0gZmFsc2UgfHwgb3B0aW9ucy5jb250ZW50VHlwZSApIHsNCgkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJDb250ZW50LVR5cGUiLCBzLmNvbnRlbnRUeXBlICk7DQoJCX0NCg0KCQkvLyBTZXQgdGhlIElmLU1vZGlmaWVkLVNpbmNlIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciwgaWYgaW4gaWZNb2RpZmllZCBtb2RlLg0KCQlpZiAoIHMuaWZNb2RpZmllZCApIHsNCgkJCWlmTW9kaWZpZWRLZXkgPSBpZk1vZGlmaWVkS2V5IHx8IHMudXJsOw0KCQkJaWYgKCBqUXVlcnkubGFzdE1vZGlmaWVkWyBpZk1vZGlmaWVkS2V5IF0gKSB7DQoJCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRlciggIklmLU1vZGlmaWVkLVNpbmNlIiwgalF1ZXJ5Lmxhc3RNb2RpZmllZFsgaWZNb2RpZmllZEtleSBdICk7DQoJCQl9DQoJCQlpZiAoIGpRdWVyeS5ldGFnWyBpZk1vZGlmaWVkS2V5IF0gKSB7DQoJCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRlciggIklmLU5vbmUtTWF0Y2giLCBqUXVlcnkuZXRhZ1sgaWZNb2RpZmllZEtleSBdICk7DQoJCQl9DQoJCX0NCg0KCQkvLyBTZXQgdGhlIEFjY2VwdHMgaGVhZGVyIGZvciB0aGUgc2VydmVyLCBkZXBlbmRpbmcgb24gdGhlIGRhdGFUeXBlDQoJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoDQoJCQkiQWNjZXB0IiwNCgkJCXMuZGF0YVR5cGVzWyAwIF0gJiYgcy5hY2NlcHRzWyBzLmRhdGFUeXBlc1swXSBdID8NCgkJCQlzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWzBdIF0gKyAoIHMuZGF0YVR5cGVzWyAwIF0gIT09ICIqIiA/ICIsICIgKyBhbGxUeXBlcyArICI7IHE9MC4wMSIgOiAiIiApIDoNCgkJCQlzLmFjY2VwdHNbICIqIiBdDQoJCSk7DQoNCgkJLy8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9uDQoJCWZvciAoIGkgaW4gcy5oZWFkZXJzICkgew0KCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRlciggaSwgcy5oZWFkZXJzWyBpIF0gKTsNCgkJfQ0KDQoJCS8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnQNCgkJaWYgKCBzLmJlZm9yZVNlbmQgJiYgKCBzLmJlZm9yZVNlbmQuY2FsbCggY2FsbGJhY2tDb250ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBzdGF0ZSA9PT0gMiApICkgew0KCQkJCS8vIEFib3J0IGlmIG5vdCBkb25lIGFscmVhZHkgYW5kIHJldHVybg0KCQkJCXJldHVybiBqcVhIUi5hYm9ydCgpOw0KDQoJCX0NCg0KCQkvLyBhYm9ydGluZyBpcyBubyBsb25nZXIgYSBjYW5jZWxsYXRpb24NCgkJc3RyQWJvcnQgPSAiYWJvcnQiOw0KDQoJCS8vIEluc3RhbGwgY2FsbGJhY2tzIG9uIGRlZmVycmVkcw0KCQlmb3IgKCBpIGluIHsgc3VjY2VzczogMSwgZXJyb3I6IDEsIGNvbXBsZXRlOiAxIH0gKSB7DQoJCQlqcVhIUlsgaSBdKCBzWyBpIF0gKTsNCgkJfQ0KDQoJCS8vIEdldCB0cmFuc3BvcnQNCgkJdHJhbnNwb3J0ID0gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHRyYW5zcG9ydHMsIHMsIG9wdGlvbnMsIGpxWEhSICk7DQoNCgkJLy8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0DQoJCWlmICggIXRyYW5zcG9ydCApIHsNCgkJCWRvbmUoIC0xLCAiTm8gVHJhbnNwb3J0IiApOw0KCQl9IGVsc2Ugew0KCQkJanFYSFIucmVhZHlTdGF0ZSA9IDE7DQoJCQkvLyBTZW5kIGdsb2JhbCBldmVudA0KCQkJaWYgKCBmaXJlR2xvYmFscyApIHsNCgkJCQlnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggImFqYXhTZW5kIiwgWyBqcVhIUiwgcyBdICk7DQoJCQl9DQoJCQkvLyBUaW1lb3V0DQoJCQlpZiAoIHMuYXN5bmMgJiYgcy50aW1lb3V0ID4gMCApIHsNCgkJCQl0aW1lb3V0VGltZXIgPSBzZXRUaW1lb3V0KCBmdW5jdGlvbigpew0KCQkJCQlqcVhIUi5hYm9ydCggInRpbWVvdXQiICk7DQoJCQkJfSwgcy50aW1lb3V0ICk7DQoJCQl9DQoNCgkJCXRyeSB7DQoJCQkJc3RhdGUgPSAxOw0KCQkJCXRyYW5zcG9ydC5zZW5kKCByZXF1ZXN0SGVhZGVycywgZG9uZSApOw0KCQkJfSBjYXRjaCAoZSkgew0KCQkJCS8vIFByb3BhZ2F0ZSBleGNlcHRpb24gYXMgZXJyb3IgaWYgbm90IGRvbmUNCgkJCQlpZiAoIHN0YXRlIDwgMiApIHsNCgkJCQkJZG9uZSggLTEsIGUgKTsNCgkJCQkvLyBTaW1wbHkgcmV0aHJvdyBvdGhlcndpc2UNCgkJCQl9IGVsc2Ugew0KCQkJCQl0aHJvdyBlOw0KCQkJCX0NCgkJCX0NCgkJfQ0KDQoJCXJldHVybiBqcVhIUjsNCgl9LA0KDQoJLy8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBxdWVyaWVzDQoJYWN0aXZlOiAwLA0KDQoJLy8gTGFzdC1Nb2RpZmllZCBoZWFkZXIgY2FjaGUgZm9yIG5leHQgcmVxdWVzdA0KCWxhc3RNb2RpZmllZDoge30sDQoJZXRhZzoge30NCg0KfSk7DQoNCi8qIEhhbmRsZXMgcmVzcG9uc2VzIHRvIGFuIGFqYXggcmVxdWVzdDoNCiAqIC0gc2V0cyBhbGwgcmVzcG9uc2VYWFggZmllbGRzIGFjY29yZGluZ2x5DQogKiAtIGZpbmRzIHRoZSByaWdodCBkYXRhVHlwZSAobWVkaWF0ZXMgYmV0d2VlbiBjb250ZW50LXR5cGUgYW5kIGV4cGVjdGVkIGRhdGFUeXBlKQ0KICogLSByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlDQogKi8NCmZ1bmN0aW9uIGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKSB7DQoNCgl2YXIgY3QsIHR5cGUsIGZpbmFsRGF0YVR5cGUsIGZpcnN0RGF0YVR5cGUsDQoJCWNvbnRlbnRzID0gcy5jb250ZW50cywNCgkJZGF0YVR5cGVzID0gcy5kYXRhVHlwZXMsDQoJCXJlc3BvbnNlRmllbGRzID0gcy5yZXNwb25zZUZpZWxkczsNCg0KCS8vIEZpbGwgcmVzcG9uc2VYWFggZmllbGRzDQoJZm9yICggdHlwZSBpbiByZXNwb25zZUZpZWxkcyApIHsNCgkJaWYgKCB0eXBlIGluIHJlc3BvbnNlcyApIHsNCgkJCWpxWEhSWyByZXNwb25zZUZpZWxkc1t0eXBlXSBdID0gcmVzcG9uc2VzWyB0eXBlIF07DQoJCX0NCgl9DQoNCgkvLyBSZW1vdmUgYXV0byBkYXRhVHlwZSBhbmQgZ2V0IGNvbnRlbnQtdHlwZSBpbiB0aGUgcHJvY2Vzcw0KCXdoaWxlKCBkYXRhVHlwZXNbIDAgXSA9PT0gIioiICkgew0KCQlkYXRhVHlwZXMuc2hpZnQoKTsNCgkJaWYgKCBjdCA9PT0gdW5kZWZpbmVkICkgew0KCQkJY3QgPSBzLm1pbWVUeXBlIHx8IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCAiY29udGVudC10eXBlIiApOw0KCQl9DQoJfQ0KDQoJLy8gQ2hlY2sgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEga25vd24gY29udGVudC10eXBlDQoJaWYgKCBjdCApIHsNCgkJZm9yICggdHlwZSBpbiBjb250ZW50cyApIHsNCgkJCWlmICggY29udGVudHNbIHR5cGUgXSAmJiBjb250ZW50c1sgdHlwZSBdLnRlc3QoIGN0ICkgKSB7DQoJCQkJZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTsNCgkJCQlicmVhazsNCgkJCX0NCgkJfQ0KCX0NCg0KCS8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlwZQ0KCWlmICggZGF0YVR5cGVzWyAwIF0gaW4gcmVzcG9uc2VzICkgew0KCQlmaW5hbERhdGFUeXBlID0gZGF0YVR5cGVzWyAwIF07DQoJfSBlbHNlIHsNCgkJLy8gVHJ5IGNvbnZlcnRpYmxlIGRhdGFUeXBlcw0KCQlmb3IgKCB0eXBlIGluIHJlc3BvbnNlcyApIHsNCgkJCWlmICggIWRhdGFUeXBlc1sgMCBdIHx8IHMuY29udmVydGVyc1sgdHlwZSArICIgIiArIGRhdGFUeXBlc1swXSBdICkgew0KCQkJCWZpbmFsRGF0YVR5cGUgPSB0eXBlOw0KCQkJCWJyZWFrOw0KCQkJfQ0KCQkJaWYgKCAhZmlyc3REYXRhVHlwZSApIHsNCgkJCQlmaXJzdERhdGFUeXBlID0gdHlwZTsNCgkJCX0NCgkJfQ0KCQkvLyBPciBqdXN0IHVzZSBmaXJzdCBvbmUNCgkJZmluYWxEYXRhVHlwZSA9IGZpbmFsRGF0YVR5cGUgfHwgZmlyc3REYXRhVHlwZTsNCgl9DQoNCgkvLyBJZiB3ZSBmb3VuZCBhIGRhdGFUeXBlDQoJLy8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWQNCgkvLyBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlDQoJaWYgKCBmaW5hbERhdGFUeXBlICkgew0KCQlpZiAoIGZpbmFsRGF0YVR5cGUgIT09IGRhdGFUeXBlc1sgMCBdICkgew0KCQkJZGF0YVR5cGVzLnVuc2hpZnQoIGZpbmFsRGF0YVR5cGUgKTsNCgkJfQ0KCQlyZXR1cm4gcmVzcG9uc2VzWyBmaW5hbERhdGFUeXBlIF07DQoJfQ0KfQ0KDQovLyBDaGFpbiBjb252ZXJzaW9ucyBnaXZlbiB0aGUgcmVxdWVzdCBhbmQgdGhlIG9yaWdpbmFsIHJlc3BvbnNlDQpmdW5jdGlvbiBhamF4Q29udmVydCggcywgcmVzcG9uc2UgKSB7DQoNCgl2YXIgY29udiwgY29udjIsIGN1cnJlbnQsIHRtcCwNCgkJLy8gV29yayB3aXRoIGEgY29weSBvZiBkYXRhVHlwZXMgaW4gY2FzZSB3ZSBuZWVkIHRvIG1vZGlmeSBpdCBmb3IgY29udmVyc2lvbg0KCQlkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcy5zbGljZSgpLA0KCQlwcmV2ID0gZGF0YVR5cGVzWyAwIF0sDQoJCWNvbnZlcnRlcnMgPSB7fSwNCgkJaSA9IDA7DQoNCgkvLyBBcHBseSB0aGUgZGF0YUZpbHRlciBpZiBwcm92aWRlZA0KCWlmICggcy5kYXRhRmlsdGVyICkgew0KCQlyZXNwb25zZSA9IHMuZGF0YUZpbHRlciggcmVzcG9uc2UsIHMuZGF0YVR5cGUgKTsNCgl9DQoNCgkvLyBDcmVhdGUgY29udmVydGVycyBtYXAgd2l0aCBsb3dlcmNhc2VkIGtleXMNCglpZiAoIGRhdGFUeXBlc1sgMSBdICkgew0KCQlmb3IgKCBjb252IGluIHMuY29udmVydGVycyApIHsNCgkJCWNvbnZlcnRlcnNbIGNvbnYudG9Mb3dlckNhc2UoKSBdID0gcy5jb252ZXJ0ZXJzWyBjb252IF07DQoJCX0NCgl9DQoNCgkvLyBDb252ZXJ0IHRvIGVhY2ggc2VxdWVudGlhbCBkYXRhVHlwZSwgdG9sZXJhdGluZyBsaXN0IG1vZGlmaWNhdGlvbg0KCWZvciAoIDsgKGN1cnJlbnQgPSBkYXRhVHlwZXNbKytpXSk7ICkgew0KDQoJCS8vIFRoZXJlJ3Mgb25seSB3b3JrIHRvIGRvIGlmIGN1cnJlbnQgZGF0YVR5cGUgaXMgbm9uLWF1dG8NCgkJaWYgKCBjdXJyZW50ICE9PSAiKiIgKSB7DQoNCgkJCS8vIENvbnZlcnQgcmVzcG9uc2UgaWYgcHJldiBkYXRhVHlwZSBpcyBub24tYXV0byBhbmQgZGlmZmVycyBmcm9tIGN1cnJlbnQNCgkJCWlmICggcHJldiAhPT0gIioiICYmIHByZXYgIT09IGN1cnJlbnQgKSB7DQoNCgkJCQkvLyBTZWVrIGEgZGlyZWN0IGNvbnZlcnRlcg0KCQkJCWNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgIiAiICsgY3VycmVudCBdIHx8IGNvbnZlcnRlcnNbICIqICIgKyBjdXJyZW50IF07DQoNCgkJCQkvLyBJZiBub25lIGZvdW5kLCBzZWVrIGEgcGFpcg0KCQkJCWlmICggIWNvbnYgKSB7DQoJCQkJCWZvciAoIGNvbnYyIGluIGNvbnZlcnRlcnMgKSB7DQoNCgkJCQkJCS8vIElmIGNvbnYyIG91dHB1dHMgY3VycmVudA0KCQkJCQkJdG1wID0gY29udjIuc3BsaXQoIiAiKTsNCgkJCQkJCWlmICggdG1wWyAxIF0gPT09IGN1cnJlbnQgKSB7DQoNCgkJCQkJCQkvLyBJZiBwcmV2IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYWNjZXB0ZWQgaW5wdXQNCgkJCQkJCQljb252ID0gY29udmVydGVyc1sgcHJldiArICIgIiArIHRtcFsgMCBdIF0gfHwNCgkJCQkJCQkJY29udmVydGVyc1sgIiogIiArIHRtcFsgMCBdIF07DQoJCQkJCQkJaWYgKCBjb252ICkgew0KCQkJCQkJCQkvLyBDb25kZW5zZSBlcXVpdmFsZW5jZSBjb252ZXJ0ZXJzDQoJCQkJCQkJCWlmICggY29udiA9PT0gdHJ1ZSApIHsNCgkJCQkJCQkJCWNvbnYgPSBjb252ZXJ0ZXJzWyBjb252MiBdOw0KDQoJCQkJCQkJCS8vIE90aGVyd2lzZSwgaW5zZXJ0IHRoZSBpbnRlcm1lZGlhdGUgZGF0YVR5cGUNCgkJCQkJCQkJfSBlbHNlIGlmICggY29udmVydGVyc1sgY29udjIgXSAhPT0gdHJ1ZSApIHsNCgkJCQkJCQkJCWN1cnJlbnQgPSB0bXBbIDAgXTsNCgkJCQkJCQkJCWRhdGFUeXBlcy5zcGxpY2UoIGktLSwgMCwgY3VycmVudCApOw0KCQkJCQkJCQl9DQoNCgkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KDQoJCQkJLy8gQXBwbHkgY29udmVydGVyIChpZiBub3QgYW4gZXF1aXZhbGVuY2UpDQoJCQkJaWYgKCBjb252ICE9PSB0cnVlICkgew0KDQoJCQkJCS8vIFVubGVzcyBlcnJvcnMgYXJlIGFsbG93ZWQgdG8gYnViYmxlLCBjYXRjaCBhbmQgcmV0dXJuIHRoZW0NCgkJCQkJaWYgKCBjb252ICYmIHNbInRocm93cyJdICkgew0KCQkJCQkJcmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJdHJ5IHsNCgkJCQkJCQlyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7DQoJCQkJCQl9IGNhdGNoICggZSApIHsNCgkJCQkJCQlyZXR1cm4geyBzdGF0ZTogInBhcnNlcmVycm9yIiwgZXJyb3I6IGNvbnYgPyBlIDogIk5vIGNvbnZlcnNpb24gZnJvbSAiICsgcHJldiArICIgdG8gIiArIGN1cnJlbnQgfTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCg0KCQkJLy8gVXBkYXRlIHByZXYgZm9yIG5leHQgaXRlcmF0aW9uDQoJCQlwcmV2ID0gY3VycmVudDsNCgkJfQ0KCX0NCg0KCXJldHVybiB7IHN0YXRlOiAic3VjY2VzcyIsIGRhdGE6IHJlc3BvbnNlIH07DQp9DQp2YXIgb2xkQ2FsbGJhY2tzID0gW10sDQoJcnF1ZXN0aW9uID0gL1w/LywNCglyanNvbnAgPSAvKD0pXD8oPz0mfCQpfFw/XD8vLA0KCW5vbmNlID0galF1ZXJ5Lm5vdygpOw0KDQovLyBEZWZhdWx0IGpzb25wIHNldHRpbmdzDQpqUXVlcnkuYWpheFNldHVwKHsNCglqc29ucDogImNhbGxiYWNrIiwNCglqc29ucENhbGxiYWNrOiBmdW5jdGlvbigpIHsNCgkJdmFyIGNhbGxiYWNrID0gb2xkQ2FsbGJhY2tzLnBvcCgpIHx8ICggalF1ZXJ5LmV4cGFuZG8gKyAiXyIgKyAoIG5vbmNlKysgKSApOw0KCQl0aGlzWyBjYWxsYmFjayBdID0gdHJ1ZTsNCgkJcmV0dXJuIGNhbGxiYWNrOw0KCX0NCn0pOw0KDQovLyBEZXRlY3QsIG5vcm1hbGl6ZSBvcHRpb25zIGFuZCBpbnN0YWxsIGNhbGxiYWNrcyBmb3IganNvbnAgcmVxdWVzdHMNCmpRdWVyeS5hamF4UHJlZmlsdGVyKCAianNvbiBqc29ucCIsIGZ1bmN0aW9uKCBzLCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHsNCg0KCXZhciBjYWxsYmFja05hbWUsIG92ZXJ3cml0dGVuLCByZXNwb25zZUNvbnRhaW5lciwNCgkJZGF0YSA9IHMuZGF0YSwNCgkJdXJsID0gcy51cmwsDQoJCWhhc0NhbGxiYWNrID0gcy5qc29ucCAhPT0gZmFsc2UsDQoJCXJlcGxhY2VJblVybCA9IGhhc0NhbGxiYWNrICYmIHJqc29ucC50ZXN0KCB1cmwgKSwNCgkJcmVwbGFjZUluRGF0YSA9IGhhc0NhbGxiYWNrICYmICFyZXBsYWNlSW5VcmwgJiYgdHlwZW9mIGRhdGEgPT09ICJzdHJpbmciICYmDQoJCQkhKCBzLmNvbnRlbnRUeXBlIHx8ICIiICkuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikgJiYNCgkJCXJqc29ucC50ZXN0KCBkYXRhICk7DQoNCgkvLyBIYW5kbGUgaWZmIHRoZSBleHBlY3RlZCBkYXRhIHR5cGUgaXMgImpzb25wIiBvciB3ZSBoYXZlIGEgcGFyYW1ldGVyIHRvIHNldA0KCWlmICggcy5kYXRhVHlwZXNbIDAgXSA9PT0gImpzb25wIiB8fCByZXBsYWNlSW5VcmwgfHwgcmVwbGFjZUluRGF0YSApIHsNCg0KCQkvLyBHZXQgY2FsbGJhY2sgbmFtZSwgcmVtZW1iZXJpbmcgcHJlZXhpc3RpbmcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGl0DQoJCWNhbGxiYWNrTmFtZSA9IHMuanNvbnBDYWxsYmFjayA9IGpRdWVyeS5pc0Z1bmN0aW9uKCBzLmpzb25wQ2FsbGJhY2sgKSA/DQoJCQlzLmpzb25wQ2FsbGJhY2soKSA6DQoJCQlzLmpzb25wQ2FsbGJhY2s7DQoJCW92ZXJ3cml0dGVuID0gd2luZG93WyBjYWxsYmFja05hbWUgXTsNCg0KCQkvLyBJbnNlcnQgY2FsbGJhY2sgaW50byB1cmwgb3IgZm9ybSBkYXRhDQoJCWlmICggcmVwbGFjZUluVXJsICkgew0KCQkJcy51cmwgPSB1cmwucmVwbGFjZSggcmpzb25wLCAiJDEiICsgY2FsbGJhY2tOYW1lICk7DQoJCX0gZWxzZSBpZiAoIHJlcGxhY2VJbkRhdGEgKSB7DQoJCQlzLmRhdGEgPSBkYXRhLnJlcGxhY2UoIHJqc29ucCwgIiQxIiArIGNhbGxiYWNrTmFtZSApOw0KCQl9IGVsc2UgaWYgKCBoYXNDYWxsYmFjayApIHsNCgkJCXMudXJsICs9ICggcnF1ZXN0aW9uLnRlc3QoIHVybCApID8gIiYiIDogIj8iICkgKyBzLmpzb25wICsgIj0iICsgY2FsbGJhY2tOYW1lOw0KCQl9DQoNCgkJLy8gVXNlIGRhdGEgY29udmVydGVyIHRvIHJldHJpZXZlIGpzb24gYWZ0ZXIgc2NyaXB0IGV4ZWN1dGlvbg0KCQlzLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl0gPSBmdW5jdGlvbigpIHsNCgkJCWlmICggIXJlc3BvbnNlQ29udGFpbmVyICkgew0KCQkJCWpRdWVyeS5lcnJvciggY2FsbGJhY2tOYW1lICsgIiB3YXMgbm90IGNhbGxlZCIgKTsNCgkJCX0NCgkJCXJldHVybiByZXNwb25zZUNvbnRhaW5lclsgMCBdOw0KCQl9Ow0KDQoJCS8vIGZvcmNlIGpzb24gZGF0YVR5cGUNCgkJcy5kYXRhVHlwZXNbIDAgXSA9ICJqc29uIjsNCg0KCQkvLyBJbnN0YWxsIGNhbGxiYWNrDQoJCXdpbmRvd1sgY2FsbGJhY2tOYW1lIF0gPSBmdW5jdGlvbigpIHsNCgkJCXJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRzOw0KCQl9Ow0KDQoJCS8vIENsZWFuLXVwIGZ1bmN0aW9uIChmaXJlcyBhZnRlciBjb252ZXJ0ZXJzKQ0KCQlqcVhIUi5hbHdheXMoZnVuY3Rpb24oKSB7DQoJCQkvLyBSZXN0b3JlIHByZWV4aXN0aW5nIHZhbHVlDQoJCQl3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gb3ZlcndyaXR0ZW47DQoNCgkJCS8vIFNhdmUgYmFjayBhcyBmcmVlDQoJCQlpZiAoIHNbIGNhbGxiYWNrTmFtZSBdICkgew0KCQkJCS8vIG1ha2Ugc3VyZSB0aGF0IHJlLXVzaW5nIHRoZSBvcHRpb25zIGRvZXNuJ3Qgc2NyZXcgdGhpbmdzIGFyb3VuZA0KCQkJCXMuanNvbnBDYWxsYmFjayA9IG9yaWdpbmFsU2V0dGluZ3MuanNvbnBDYWxsYmFjazsNCg0KCQkJCS8vIHNhdmUgdGhlIGNhbGxiYWNrIG5hbWUgZm9yIGZ1dHVyZSB1c2UNCgkJCQlvbGRDYWxsYmFja3MucHVzaCggY2FsbGJhY2tOYW1lICk7DQoJCQl9DQoNCgkJCS8vIENhbGwgaWYgaXQgd2FzIGEgZnVuY3Rpb24gYW5kIHdlIGhhdmUgYSByZXNwb25zZQ0KCQkJaWYgKCByZXNwb25zZUNvbnRhaW5lciAmJiBqUXVlcnkuaXNGdW5jdGlvbiggb3ZlcndyaXR0ZW4gKSApIHsNCgkJCQlvdmVyd3JpdHRlbiggcmVzcG9uc2VDb250YWluZXJbIDAgXSApOw0KCQkJfQ0KDQoJCQlyZXNwb25zZUNvbnRhaW5lciA9IG92ZXJ3cml0dGVuID0gdW5kZWZpbmVkOw0KCQl9KTsNCg0KCQkvLyBEZWxlZ2F0ZSB0byBzY3JpcHQNCgkJcmV0dXJuICJzY3JpcHQiOw0KCX0NCn0pOw0KLy8gSW5zdGFsbCBzY3JpcHQgZGF0YVR5cGUNCmpRdWVyeS5hamF4U2V0dXAoew0KCWFjY2VwdHM6IHsNCgkJc2NyaXB0OiAidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiDQoJfSwNCgljb250ZW50czogew0KCQlzY3JpcHQ6IC9qYXZhc2NyaXB0fGVjbWFzY3JpcHQvDQoJfSwNCgljb252ZXJ0ZXJzOiB7DQoJCSJ0ZXh0IHNjcmlwdCI6IGZ1bmN0aW9uKCB0ZXh0ICkgew0KCQkJalF1ZXJ5Lmdsb2JhbEV2YWwoIHRleHQgKTsNCgkJCXJldHVybiB0ZXh0Ow0KCQl9DQoJfQ0KfSk7DQoNCi8vIEhhbmRsZSBjYWNoZSdzIHNwZWNpYWwgY2FzZSBhbmQgZ2xvYmFsDQpqUXVlcnkuYWpheFByZWZpbHRlciggInNjcmlwdCIsIGZ1bmN0aW9uKCBzICkgew0KCWlmICggcy5jYWNoZSA9PT0gdW5kZWZpbmVkICkgew0KCQlzLmNhY2hlID0gZmFsc2U7DQoJfQ0KCWlmICggcy5jcm9zc0RvbWFpbiApIHsNCgkJcy50eXBlID0gIkdFVCI7DQoJCXMuZ2xvYmFsID0gZmFsc2U7DQoJfQ0KfSk7DQoNCi8vIEJpbmQgc2NyaXB0IHRhZyBoYWNrIHRyYW5zcG9ydA0KalF1ZXJ5LmFqYXhUcmFuc3BvcnQoICJzY3JpcHQiLCBmdW5jdGlvbihzKSB7DQoNCgkvLyBUaGlzIHRyYW5zcG9ydCBvbmx5IGRlYWxzIHdpdGggY3Jvc3MgZG9tYWluIHJlcXVlc3RzDQoJaWYgKCBzLmNyb3NzRG9tYWluICkgew0KDQoJCXZhciBzY3JpcHQsDQoJCQloZWFkID0gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggImhlYWQiIClbMF0gfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Ow0KDQoJCXJldHVybiB7DQoNCgkJCXNlbmQ6IGZ1bmN0aW9uKCBfLCBjYWxsYmFjayApIHsNCg0KCQkJCXNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzY3JpcHQiICk7DQoNCgkJCQlzY3JpcHQuYXN5bmMgPSAiYXN5bmMiOw0KDQoJCQkJaWYgKCBzLnNjcmlwdENoYXJzZXQgKSB7DQoJCQkJCXNjcmlwdC5jaGFyc2V0ID0gcy5zY3JpcHRDaGFyc2V0Ow0KCQkJCX0NCg0KCQkJCXNjcmlwdC5zcmMgPSBzLnVybDsNCg0KCQkJCS8vIEF0dGFjaCBoYW5kbGVycyBmb3IgYWxsIGJyb3dzZXJzDQoJCQkJc2NyaXB0Lm9ubG9hZCA9IHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiggXywgaXNBYm9ydCApIHsNCg0KCQkJCQlpZiAoIGlzQWJvcnQgfHwgIXNjcmlwdC5yZWFkeVN0YXRlIHx8IC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoIHNjcmlwdC5yZWFkeVN0YXRlICkgKSB7DQoNCgkJCQkJCS8vIEhhbmRsZSBtZW1vcnkgbGVhayBpbiBJRQ0KCQkJCQkJc2NyaXB0Lm9ubG9hZCA9IHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsOw0KDQoJCQkJCQkvLyBSZW1vdmUgdGhlIHNjcmlwdA0KCQkJCQkJaWYgKCBoZWFkICYmIHNjcmlwdC5wYXJlbnROb2RlICkgew0KCQkJCQkJCWhlYWQucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOw0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBEZXJlZmVyZW5jZSB0aGUgc2NyaXB0DQoJCQkJCQlzY3JpcHQgPSB1bmRlZmluZWQ7DQoNCgkJCQkJCS8vIENhbGxiYWNrIGlmIG5vdCBhYm9ydA0KCQkJCQkJaWYgKCAhaXNBYm9ydCApIHsNCgkJCQkJCQljYWxsYmFjayggMjAwLCAic3VjY2VzcyIgKTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX07DQoJCQkJLy8gVXNlIGluc2VydEJlZm9yZSBpbnN0ZWFkIG9mIGFwcGVuZENoaWxkICB0byBjaXJjdW12ZW50IGFuIElFNiBidWcuDQoJCQkJLy8gVGhpcyBhcmlzZXMgd2hlbiBhIGJhc2Ugbm9kZSBpcyB1c2VkICgjMjcwOSBhbmQgIzQzNzgpLg0KCQkJCWhlYWQuaW5zZXJ0QmVmb3JlKCBzY3JpcHQsIGhlYWQuZmlyc3RDaGlsZCApOw0KCQkJfSwNCg0KCQkJYWJvcnQ6IGZ1bmN0aW9uKCkgew0KCQkJCWlmICggc2NyaXB0ICkgew0KCQkJCQlzY3JpcHQub25sb2FkKCAwLCAxICk7DQoJCQkJfQ0KCQkJfQ0KCQl9Ow0KCX0NCn0pOw0KdmFyIHhockNhbGxiYWNrcywNCgkvLyAjNTI4MDogSW50ZXJuZXQgRXhwbG9yZXIgd2lsbCBrZWVwIGNvbm5lY3Rpb25zIGFsaXZlIGlmIHdlIGRvbid0IGFib3J0IG9uIHVubG9hZA0KCXhock9uVW5sb2FkQWJvcnQgPSB3aW5kb3cuQWN0aXZlWE9iamVjdCA/IGZ1bmN0aW9uKCkgew0KCQkvLyBBYm9ydCBhbGwgcGVuZGluZyByZXF1ZXN0cw0KCQlmb3IgKCB2YXIga2V5IGluIHhockNhbGxiYWNrcyApIHsNCgkJCXhockNhbGxiYWNrc1sga2V5IF0oIDAsIDEgKTsNCgkJfQ0KCX0gOiBmYWxzZSwNCgl4aHJJZCA9IDA7DQoNCi8vIEZ1bmN0aW9ucyB0byBjcmVhdGUgeGhycw0KZnVuY3Rpb24gY3JlYXRlU3RhbmRhcmRYSFIoKSB7DQoJdHJ5IHsNCgkJcmV0dXJuIG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTsNCgl9IGNhdGNoKCBlICkge30NCn0NCg0KZnVuY3Rpb24gY3JlYXRlQWN0aXZlWEhSKCkgew0KCXRyeSB7DQoJCXJldHVybiBuZXcgd2luZG93LkFjdGl2ZVhPYmplY3QoICJNaWNyb3NvZnQuWE1MSFRUUCIgKTsNCgl9IGNhdGNoKCBlICkge30NCn0NCg0KLy8gQ3JlYXRlIHRoZSByZXF1ZXN0IG9iamVjdA0KLy8gKFRoaXMgaXMgc3RpbGwgYXR0YWNoZWQgdG8gYWpheFNldHRpbmdzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KQ0KalF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIgPSB3aW5kb3cuQWN0aXZlWE9iamVjdCA/DQoJLyogTWljcm9zb2Z0IGZhaWxlZCB0byBwcm9wZXJseQ0KCSAqIGltcGxlbWVudCB0aGUgWE1MSHR0cFJlcXVlc3QgaW4gSUU3IChjYW4ndCByZXF1ZXN0IGxvY2FsIGZpbGVzKSwNCgkgKiBzbyB3ZSB1c2UgdGhlIEFjdGl2ZVhPYmplY3Qgd2hlbiBpdCBpcyBhdmFpbGFibGUNCgkgKiBBZGRpdGlvbmFsbHkgWE1MSHR0cFJlcXVlc3QgY2FuIGJlIGRpc2FibGVkIGluIElFNy9JRTggc28NCgkgKiB3ZSBuZWVkIGEgZmFsbGJhY2suDQoJICovDQoJZnVuY3Rpb24oKSB7DQoJCXJldHVybiAhdGhpcy5pc0xvY2FsICYmIGNyZWF0ZVN0YW5kYXJkWEhSKCkgfHwgY3JlYXRlQWN0aXZlWEhSKCk7DQoJfSA6DQoJLy8gRm9yIGFsbCBvdGhlciBicm93c2VycywgdXNlIHRoZSBzdGFuZGFyZCBYTUxIdHRwUmVxdWVzdCBvYmplY3QNCgljcmVhdGVTdGFuZGFyZFhIUjsNCg0KLy8gRGV0ZXJtaW5lIHN1cHBvcnQgcHJvcGVydGllcw0KKGZ1bmN0aW9uKCB4aHIgKSB7DQoJalF1ZXJ5LmV4dGVuZCggalF1ZXJ5LnN1cHBvcnQsIHsNCgkJYWpheDogISF4aHIsDQoJCWNvcnM6ICEheGhyICYmICggIndpdGhDcmVkZW50aWFscyIgaW4geGhyICkNCgl9KTsNCn0pKCBqUXVlcnkuYWpheFNldHRpbmdzLnhocigpICk7DQoNCi8vIENyZWF0ZSB0cmFuc3BvcnQgaWYgdGhlIGJyb3dzZXIgY2FuIHByb3ZpZGUgYW4geGhyDQppZiAoIGpRdWVyeS5zdXBwb3J0LmFqYXggKSB7DQoNCglqUXVlcnkuYWpheFRyYW5zcG9ydChmdW5jdGlvbiggcyApIHsNCgkJLy8gQ3Jvc3MgZG9tYWluIG9ubHkgYWxsb3dlZCBpZiBzdXBwb3J0ZWQgdGhyb3VnaCBYTUxIdHRwUmVxdWVzdA0KCQlpZiAoICFzLmNyb3NzRG9tYWluIHx8IGpRdWVyeS5zdXBwb3J0LmNvcnMgKSB7DQoNCgkJCXZhciBjYWxsYmFjazsNCg0KCQkJcmV0dXJuIHsNCgkJCQlzZW5kOiBmdW5jdGlvbiggaGVhZGVycywgY29tcGxldGUgKSB7DQoNCgkJCQkJLy8gR2V0IGEgbmV3IHhocg0KCQkJCQl2YXIgaGFuZGxlLCBpLA0KCQkJCQkJeGhyID0gcy54aHIoKTsNCg0KCQkJCQkvLyBPcGVuIHRoZSBzb2NrZXQNCgkJCQkJLy8gUGFzc2luZyBudWxsIHVzZXJuYW1lLCBnZW5lcmF0ZXMgYSBsb2dpbiBwb3B1cCBvbiBPcGVyYSAoIzI4NjUpDQoJCQkJCWlmICggcy51c2VybmFtZSApIHsNCgkJCQkJCXhoci5vcGVuKCBzLnR5cGUsIHMudXJsLCBzLmFzeW5jLCBzLnVzZXJuYW1lLCBzLnBhc3N3b3JkICk7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQl4aHIub3Blbiggcy50eXBlLCBzLnVybCwgcy5hc3luYyApOw0KCQkJCQl9DQoNCgkJCQkJLy8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZA0KCQkJCQlpZiAoIHMueGhyRmllbGRzICkgew0KCQkJCQkJZm9yICggaSBpbiBzLnhockZpZWxkcyApIHsNCgkJCQkJCQl4aHJbIGkgXSA9IHMueGhyRmllbGRzWyBpIF07DQoJCQkJCQl9DQoJCQkJCX0NCg0KCQkJCQkvLyBPdmVycmlkZSBtaW1lIHR5cGUgaWYgbmVlZGVkDQoJCQkJCWlmICggcy5taW1lVHlwZSAmJiB4aHIub3ZlcnJpZGVNaW1lVHlwZSApIHsNCgkJCQkJCXhoci5vdmVycmlkZU1pbWVUeXBlKCBzLm1pbWVUeXBlICk7DQoJCQkJCX0NCg0KCQkJCQkvLyBYLVJlcXVlc3RlZC1XaXRoIGhlYWRlcg0KCQkJCQkvLyBGb3IgY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzZWVpbmcgYXMgY29uZGl0aW9ucyBmb3IgYSBwcmVmbGlnaHQgYXJlDQoJCQkJCS8vIGFraW4gdG8gYSBqaWdzYXcgcHV6emxlLCB3ZSBzaW1wbHkgbmV2ZXIgc2V0IGl0IHRvIGJlIHN1cmUuDQoJCQkJCS8vIChpdCBjYW4gYWx3YXlzIGJlIHNldCBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIG9yIGV2ZW4gdXNpbmcgYWpheFNldHVwKQ0KCQkJCQkvLyBGb3Igc2FtZS1kb21haW4gcmVxdWVzdHMsIHdvbid0IGNoYW5nZSBoZWFkZXIgaWYgYWxyZWFkeSBwcm92aWRlZC4NCgkJCQkJaWYgKCAhcy5jcm9zc0RvbWFpbiAmJiAhaGVhZGVyc1siWC1SZXF1ZXN0ZWQtV2l0aCJdICkgew0KCQkJCQkJaGVhZGVyc1sgIlgtUmVxdWVzdGVkLVdpdGgiIF0gPSAiWE1MSHR0cFJlcXVlc3QiOw0KCQkJCQl9DQoNCgkJCQkJLy8gTmVlZCBhbiBleHRyYSB0cnkvY2F0Y2ggZm9yIGNyb3NzIGRvbWFpbiByZXF1ZXN0cyBpbiBGaXJlZm94IDMNCgkJCQkJdHJ5IHsNCgkJCQkJCWZvciAoIGkgaW4gaGVhZGVycyApIHsNCgkJCQkJCQl4aHIuc2V0UmVxdWVzdEhlYWRlciggaSwgaGVhZGVyc1sgaSBdICk7DQoJCQkJCQl9DQoJCQkJCX0gY2F0Y2goIF8gKSB7fQ0KDQoJCQkJCS8vIERvIHNlbmQgdGhlIHJlcXVlc3QNCgkJCQkJLy8gVGhpcyBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uIHdoaWNoIGlzIGFjdHVhbGx5DQoJCQkJCS8vIGhhbmRsZWQgaW4galF1ZXJ5LmFqYXggKHNvIG5vIHRyeS9jYXRjaCBoZXJlKQ0KCQkJCQl4aHIuc2VuZCggKCBzLmhhc0NvbnRlbnQgJiYgcy5kYXRhICkgfHwgbnVsbCApOw0KDQoJCQkJCS8vIExpc3RlbmVyDQoJCQkJCWNhbGxiYWNrID0gZnVuY3Rpb24oIF8sIGlzQWJvcnQgKSB7DQoNCgkJCQkJCXZhciBzdGF0dXMsDQoJCQkJCQkJc3RhdHVzVGV4dCwNCgkJCQkJCQlyZXNwb25zZUhlYWRlcnMsDQoJCQkJCQkJcmVzcG9uc2VzLA0KCQkJCQkJCXhtbDsNCg0KCQkJCQkJLy8gRmlyZWZveCB0aHJvd3MgZXhjZXB0aW9ucyB3aGVuIGFjY2Vzc2luZyBwcm9wZXJ0aWVzDQoJCQkJCQkvLyBvZiBhbiB4aHIgd2hlbiBhIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQNCgkJCQkJCS8vIGh0dHA6Ly9oZWxwZnVsLmtub2JzLWRpYWxzLmNvbS9pbmRleC5waHAvQ29tcG9uZW50X3JldHVybmVkX2ZhaWx1cmVfY29kZTpfMHg4MDA0MDExMV8oTlNfRVJST1JfTk9UX0FWQUlMQUJMRSkNCgkJCQkJCXRyeSB7DQoNCgkJCQkJCQkvLyBXYXMgbmV2ZXIgY2FsbGVkIGFuZCBpcyBhYm9ydGVkIG9yIGNvbXBsZXRlDQoJCQkJCQkJaWYgKCBjYWxsYmFjayAmJiAoIGlzQWJvcnQgfHwgeGhyLnJlYWR5U3RhdGUgPT09IDQgKSApIHsNCg0KCQkJCQkJCQkvLyBPbmx5IGNhbGxlZCBvbmNlDQoJCQkJCQkJCWNhbGxiYWNrID0gdW5kZWZpbmVkOw0KDQoJCQkJCQkJCS8vIERvIG5vdCBrZWVwIGFzIGFjdGl2ZSBhbnltb3JlDQoJCQkJCQkJCWlmICggaGFuZGxlICkgew0KCQkJCQkJCQkJeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGpRdWVyeS5ub29wOw0KCQkJCQkJCQkJaWYgKCB4aHJPblVubG9hZEFib3J0ICkgew0KCQkJCQkJCQkJCWRlbGV0ZSB4aHJDYWxsYmFja3NbIGhhbmRsZSBdOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQl9DQoNCgkJCQkJCQkJLy8gSWYgaXQncyBhbiBhYm9ydA0KCQkJCQkJCQlpZiAoIGlzQWJvcnQgKSB7DQoJCQkJCQkJCQkvLyBBYm9ydCBpdCBtYW51YWxseSBpZiBuZWVkZWQNCgkJCQkJCQkJCWlmICggeGhyLnJlYWR5U3RhdGUgIT09IDQgKSB7DQoJCQkJCQkJCQkJeGhyLmFib3J0KCk7DQoJCQkJCQkJCQl9DQoJCQkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJCQlzdGF0dXMgPSB4aHIuc3RhdHVzOw0KCQkJCQkJCQkJcmVzcG9uc2VIZWFkZXJzID0geGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpOw0KCQkJCQkJCQkJcmVzcG9uc2VzID0ge307DQoJCQkJCQkJCQl4bWwgPSB4aHIucmVzcG9uc2VYTUw7DQoNCgkJCQkJCQkJCS8vIENvbnN0cnVjdCByZXNwb25zZSBsaXN0DQoJCQkJCQkJCQlpZiAoIHhtbCAmJiB4bWwuZG9jdW1lbnRFbGVtZW50IC8qICM0OTU4ICovICkgew0KCQkJCQkJCQkJCXJlc3BvbnNlcy54bWwgPSB4bWw7DQoJCQkJCQkJCQl9DQoNCgkJCQkJCQkJCS8vIFdoZW4gcmVxdWVzdGluZyBiaW5hcnkgZGF0YSwgSUU2LTkgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24NCgkJCQkJCQkJCS8vIG9uIGFueSBhdHRlbXB0IHRvIGFjY2VzcyByZXNwb25zZVRleHQgKCMxMTQyNikNCgkJCQkJCQkJCXRyeSB7DQoJCQkJCQkJCQkJcmVzcG9uc2VzLnRleHQgPSB4aHIucmVzcG9uc2VUZXh0Ow0KCQkJCQkJCQkJfSBjYXRjaCggZSApIHsNCgkJCQkJCQkJCX0NCg0KCQkJCQkJCQkJLy8gRmlyZWZveCB0aHJvd3MgYW4gZXhjZXB0aW9uIHdoZW4gYWNjZXNzaW5nDQoJCQkJCQkJCQkvLyBzdGF0dXNUZXh0IGZvciBmYXVsdHkgY3Jvc3MtZG9tYWluIHJlcXVlc3RzDQoJCQkJCQkJCQl0cnkgew0KCQkJCQkJCQkJCXN0YXR1c1RleHQgPSB4aHIuc3RhdHVzVGV4dDsNCgkJCQkJCQkJCX0gY2F0Y2goIGUgKSB7DQoJCQkJCQkJCQkJLy8gV2Ugbm9ybWFsaXplIHdpdGggV2Via2l0IGdpdmluZyBhbiBlbXB0eSBzdGF0dXNUZXh0DQoJCQkJCQkJCQkJc3RhdHVzVGV4dCA9ICIiOw0KCQkJCQkJCQkJfQ0KDQoJCQkJCQkJCQkvLyBGaWx0ZXIgc3RhdHVzIGZvciBub24gc3RhbmRhcmQgYmVoYXZpb3JzDQoNCgkJCQkJCQkJCS8vIElmIHRoZSByZXF1ZXN0IGlzIGxvY2FsIGFuZCB3ZSBoYXZlIGRhdGE6IGFzc3VtZSBhIHN1Y2Nlc3MNCgkJCQkJCQkJCS8vIChzdWNjZXNzIHdpdGggbm8gZGF0YSB3b24ndCBnZXQgbm90aWZpZWQsIHRoYXQncyB0aGUgYmVzdCB3ZQ0KCQkJCQkJCQkJLy8gY2FuIGRvIGdpdmVuIGN1cnJlbnQgaW1wbGVtZW50YXRpb25zKQ0KCQkJCQkJCQkJaWYgKCAhc3RhdHVzICYmIHMuaXNMb2NhbCAmJiAhcy5jcm9zc0RvbWFpbiApIHsNCgkJCQkJCQkJCQlzdGF0dXMgPSByZXNwb25zZXMudGV4dCA/IDIwMCA6IDQwNDsNCgkJCQkJCQkJCS8vIElFIC0gIzE0NTA6IHNvbWV0aW1lcyByZXR1cm5zIDEyMjMgd2hlbiBpdCBzaG91bGQgYmUgMjA0DQoJCQkJCQkJCQl9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDEyMjMgKSB7DQoJCQkJCQkJCQkJc3RhdHVzID0gMjA0Ow0KCQkJCQkJCQkJfQ0KCQkJCQkJCQl9DQoJCQkJCQkJfQ0KCQkJCQkJfSBjYXRjaCggZmlyZWZveEFjY2Vzc0V4Y2VwdGlvbiApIHsNCgkJCQkJCQlpZiAoICFpc0Fib3J0ICkgew0KCQkJCQkJCQljb21wbGV0ZSggLTEsIGZpcmVmb3hBY2Nlc3NFeGNlcHRpb24gKTsNCgkJCQkJCQl9DQoJCQkJCQl9DQoNCgkJCQkJCS8vIENhbGwgY29tcGxldGUgaWYgbmVlZGVkDQoJCQkJCQlpZiAoIHJlc3BvbnNlcyApIHsNCgkJCQkJCQljb21wbGV0ZSggc3RhdHVzLCBzdGF0dXNUZXh0LCByZXNwb25zZXMsIHJlc3BvbnNlSGVhZGVycyApOw0KCQkJCQkJfQ0KCQkJCQl9Ow0KDQoJCQkJCWlmICggIXMuYXN5bmMgKSB7DQoJCQkJCQkvLyBpZiB3ZSdyZSBpbiBzeW5jIG1vZGUgd2UgZmlyZSB0aGUgY2FsbGJhY2sNCgkJCQkJCWNhbGxiYWNrKCk7DQoJCQkJCX0gZWxzZSBpZiAoIHhoci5yZWFkeVN0YXRlID09PSA0ICkgew0KCQkJCQkJLy8gKElFNiAmIElFNykgaWYgaXQncyBpbiBjYWNoZSBhbmQgaGFzIGJlZW4NCgkJCQkJCS8vIHJldHJpZXZlZCBkaXJlY3RseSB3ZSBuZWVkIHRvIGZpcmUgdGhlIGNhbGxiYWNrDQoJCQkJCQlzZXRUaW1lb3V0KCBjYWxsYmFjaywgMCApOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJaGFuZGxlID0gKyt4aHJJZDsNCgkJCQkJCWlmICggeGhyT25VbmxvYWRBYm9ydCApIHsNCgkJCQkJCQkvLyBDcmVhdGUgdGhlIGFjdGl2ZSB4aHJzIGNhbGxiYWNrcyBsaXN0IGlmIG5lZWRlZA0KCQkJCQkJCS8vIGFuZCBhdHRhY2ggdGhlIHVubG9hZCBoYW5kbGVyDQoJCQkJCQkJaWYgKCAheGhyQ2FsbGJhY2tzICkgew0KCQkJCQkJCQl4aHJDYWxsYmFja3MgPSB7fTsNCgkJCQkJCQkJalF1ZXJ5KCB3aW5kb3cgKS51bmxvYWQoIHhock9uVW5sb2FkQWJvcnQgKTsNCgkJCQkJCQl9DQoJCQkJCQkJLy8gQWRkIHRvIGxpc3Qgb2YgYWN0aXZlIHhocnMgY2FsbGJhY2tzDQoJCQkJCQkJeGhyQ2FsbGJhY2tzWyBoYW5kbGUgXSA9IGNhbGxiYWNrOw0KCQkJCQkJfQ0KCQkJCQkJeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGNhbGxiYWNrOw0KCQkJCQl9DQoJCQkJfSwNCg0KCQkJCWFib3J0OiBmdW5jdGlvbigpIHsNCgkJCQkJaWYgKCBjYWxsYmFjayApIHsNCgkJCQkJCWNhbGxiYWNrKDAsMSk7DQoJCQkJCX0NCgkJCQl9DQoJCQl9Ow0KCQl9DQoJfSk7DQp9DQp2YXIgZnhOb3csIHRpbWVySWQsDQoJcmZ4dHlwZXMgPSAvXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sDQoJcmZ4bnVtID0gbmV3IFJlZ0V4cCggIl4oPzooWy0rXSk9fCkoIiArIGNvcmVfcG51bSArICIpKFthLXolXSopJCIsICJpIiApLA0KCXJydW4gPSAvcXVldWVIb29rcyQvLA0KCWFuaW1hdGlvblByZWZpbHRlcnMgPSBbIGRlZmF1bHRQcmVmaWx0ZXIgXSwNCgl0d2VlbmVycyA9IHsNCgkJIioiOiBbZnVuY3Rpb24oIHByb3AsIHZhbHVlICkgew0KCQkJdmFyIGVuZCwgdW5pdCwNCgkJCQl0d2VlbiA9IHRoaXMuY3JlYXRlVHdlZW4oIHByb3AsIHZhbHVlICksDQoJCQkJcGFydHMgPSByZnhudW0uZXhlYyggdmFsdWUgKSwNCgkJCQl0YXJnZXQgPSB0d2Vlbi5jdXIoKSwNCgkJCQlzdGFydCA9ICt0YXJnZXQgfHwgMCwNCgkJCQlzY2FsZSA9IDEsDQoJCQkJbWF4SXRlcmF0aW9ucyA9IDIwOw0KDQoJCQlpZiAoIHBhcnRzICkgew0KCQkJCWVuZCA9ICtwYXJ0c1syXTsNCgkJCQl1bml0ID0gcGFydHNbM10gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gPyAiIiA6ICJweCIgKTsNCg0KCQkJCS8vIFdlIG5lZWQgdG8gY29tcHV0ZSBzdGFydGluZyB2YWx1ZQ0KCQkJCWlmICggdW5pdCAhPT0gInB4IiAmJiBzdGFydCApIHsNCgkJCQkJLy8gSXRlcmF0aXZlbHkgYXBwcm94aW1hdGUgZnJvbSBhIG5vbnplcm8gc3RhcnRpbmcgcG9pbnQNCgkJCQkJLy8gUHJlZmVyIHRoZSBjdXJyZW50IHByb3BlcnR5LCBiZWNhdXNlIHRoaXMgcHJvY2VzcyB3aWxsIGJlIHRyaXZpYWwgaWYgaXQgdXNlcyB0aGUgc2FtZSB1bml0cw0KCQkJCQkvLyBGYWxsYmFjayB0byBlbmQgb3IgYSBzaW1wbGUgY29uc3RhbnQNCgkJCQkJc3RhcnQgPSBqUXVlcnkuY3NzKCB0d2Vlbi5lbGVtLCBwcm9wLCB0cnVlICkgfHwgZW5kIHx8IDE7DQoNCgkJCQkJZG8gew0KCQkJCQkJLy8gSWYgcHJldmlvdXMgaXRlcmF0aW9uIHplcm9lZCBvdXQsIGRvdWJsZSB1bnRpbCB3ZSBnZXQgKnNvbWV0aGluZyoNCgkJCQkJCS8vIFVzZSBhIHN0cmluZyBmb3IgZG91YmxpbmcgZmFjdG9yIHNvIHdlIGRvbid0IGFjY2lkZW50YWxseSBzZWUgc2NhbGUgYXMgdW5jaGFuZ2VkIGJlbG93DQoJCQkJCQlzY2FsZSA9IHNjYWxlIHx8ICIuNSI7DQoNCgkJCQkJCS8vIEFkanVzdCBhbmQgYXBwbHkNCgkJCQkJCXN0YXJ0ID0gc3RhcnQgLyBzY2FsZTsNCgkJCQkJCWpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgcHJvcCwgc3RhcnQgKyB1bml0ICk7DQoNCgkJCQkJLy8gVXBkYXRlIHNjYWxlLCB0b2xlcmF0aW5nIHplcm8gb3IgTmFOIGZyb20gdHdlZW4uY3VyKCkNCgkJCQkJLy8gQW5kIGJyZWFraW5nIHRoZSBsb29wIGlmIHNjYWxlIGlzIHVuY2hhbmdlZCBvciBwZXJmZWN0LCBvciBpZiB3ZSd2ZSBqdXN0IGhhZCBlbm91Z2gNCgkJCQkJfSB3aGlsZSAoIHNjYWxlICE9PSAoc2NhbGUgPSB0d2Vlbi5jdXIoKSAvIHRhcmdldCkgJiYgc2NhbGUgIT09IDEgJiYgLS1tYXhJdGVyYXRpb25zICk7DQoJCQkJfQ0KDQoJCQkJdHdlZW4udW5pdCA9IHVuaXQ7DQoJCQkJdHdlZW4uc3RhcnQgPSBzdGFydDsNCgkJCQkvLyBJZiBhICs9Ly09IHRva2VuIHdhcyBwcm92aWRlZCwgd2UncmUgZG9pbmcgYSByZWxhdGl2ZSBhbmltYXRpb24NCgkJCQl0d2Vlbi5lbmQgPSBwYXJ0c1sxXSA/IHN0YXJ0ICsgKCBwYXJ0c1sxXSArIDEgKSAqIGVuZCA6IGVuZDsNCgkJCX0NCgkJCXJldHVybiB0d2VlbjsNCgkJfV0NCgl9Ow0KDQovLyBBbmltYXRpb25zIGNyZWF0ZWQgc3luY2hyb25vdXNseSB3aWxsIHJ1biBzeW5jaHJvbm91c2x5DQpmdW5jdGlvbiBjcmVhdGVGeE5vdygpIHsNCglzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgew0KCQlmeE5vdyA9IHVuZGVmaW5lZDsNCgl9LCAwICk7DQoJcmV0dXJuICggZnhOb3cgPSBqUXVlcnkubm93KCkgKTsNCn0NCg0KZnVuY3Rpb24gY3JlYXRlVHdlZW5zKCBhbmltYXRpb24sIHByb3BzICkgew0KCWpRdWVyeS5lYWNoKCBwcm9wcywgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkgew0KCQl2YXIgY29sbGVjdGlvbiA9ICggdHdlZW5lcnNbIHByb3AgXSB8fCBbXSApLmNvbmNhdCggdHdlZW5lcnNbICIqIiBdICksDQoJCQlpbmRleCA9IDAsDQoJCQlsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDsNCgkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsNCgkJCWlmICggY29sbGVjdGlvblsgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIHByb3AsIHZhbHVlICkgKSB7DQoNCgkJCQkvLyB3ZSdyZSBkb25lIHdpdGggdGhpcyBwcm9wZXJ0eQ0KCQkJCXJldHVybjsNCgkJCX0NCgkJfQ0KCX0pOw0KfQ0KDQpmdW5jdGlvbiBBbmltYXRpb24oIGVsZW0sIHByb3BlcnRpZXMsIG9wdGlvbnMgKSB7DQoJdmFyIHJlc3VsdCwNCgkJaW5kZXggPSAwLA0KCQl0d2VlbmVySW5kZXggPSAwLA0KCQlsZW5ndGggPSBhbmltYXRpb25QcmVmaWx0ZXJzLmxlbmd0aCwNCgkJZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKS5hbHdheXMoIGZ1bmN0aW9uKCkgew0KCQkJLy8gZG9uJ3QgbWF0Y2ggZWxlbSBpbiB0aGUgOmFuaW1hdGVkIHNlbGVjdG9yDQoJCQlkZWxldGUgdGljay5lbGVtOw0KCQl9KSwNCgkJdGljayA9IGZ1bmN0aW9uKCkgew0KCQkJdmFyIGN1cnJlbnRUaW1lID0gZnhOb3cgfHwgY3JlYXRlRnhOb3coKSwNCgkJCQlyZW1haW5pbmcgPSBNYXRoLm1heCggMCwgYW5pbWF0aW9uLnN0YXJ0VGltZSArIGFuaW1hdGlvbi5kdXJhdGlvbiAtIGN1cnJlbnRUaW1lICksDQoJCQkJLy8gYXJjaGFpYyBjcmFzaCBidWcgd29uJ3QgYWxsb3cgdXMgdG8gdXNlIDEgLSAoIDAuNSB8fCAwICkgKCMxMjQ5NykNCgkJCQl0ZW1wID0gcmVtYWluaW5nIC8gYW5pbWF0aW9uLmR1cmF0aW9uIHx8IDAsDQoJCQkJcGVyY2VudCA9IDEgLSB0ZW1wLA0KCQkJCWluZGV4ID0gMCwNCgkJCQlsZW5ndGggPSBhbmltYXRpb24udHdlZW5zLmxlbmd0aDsNCg0KCQkJZm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7DQoJCQkJYW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIHBlcmNlbnQgKTsNCgkJCX0NCg0KCQkJZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIHBlcmNlbnQsIHJlbWFpbmluZyBdKTsNCg0KCQkJaWYgKCBwZXJjZW50IDwgMSAmJiBsZW5ndGggKSB7DQoJCQkJcmV0dXJuIHJlbWFpbmluZzsNCgkJCX0gZWxzZSB7DQoJCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uIF0gKTsNCgkJCQlyZXR1cm4gZmFsc2U7DQoJCQl9DQoJCX0sDQoJCWFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2Uoew0KCQkJZWxlbTogZWxlbSwNCgkJCXByb3BzOiBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcGVydGllcyApLA0KCQkJb3B0czogalF1ZXJ5LmV4dGVuZCggdHJ1ZSwgeyBzcGVjaWFsRWFzaW5nOiB7fSB9LCBvcHRpb25zICksDQoJCQlvcmlnaW5hbFByb3BlcnRpZXM6IHByb3BlcnRpZXMsDQoJCQlvcmlnaW5hbE9wdGlvbnM6IG9wdGlvbnMsDQoJCQlzdGFydFRpbWU6IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksDQoJCQlkdXJhdGlvbjogb3B0aW9ucy5kdXJhdGlvbiwNCgkJCXR3ZWVuczogW10sDQoJCQljcmVhdGVUd2VlbjogZnVuY3Rpb24oIHByb3AsIGVuZCwgZWFzaW5nICkgew0KCQkJCXZhciB0d2VlbiA9IGpRdWVyeS5Ud2VlbiggZWxlbSwgYW5pbWF0aW9uLm9wdHMsIHByb3AsIGVuZCwNCgkJCQkJCWFuaW1hdGlvbi5vcHRzLnNwZWNpYWxFYXNpbmdbIHByb3AgXSB8fCBhbmltYXRpb24ub3B0cy5lYXNpbmcgKTsNCgkJCQlhbmltYXRpb24udHdlZW5zLnB1c2goIHR3ZWVuICk7DQoJCQkJcmV0dXJuIHR3ZWVuOw0KCQkJfSwNCgkJCXN0b3A6IGZ1bmN0aW9uKCBnb3RvRW5kICkgew0KCQkJCXZhciBpbmRleCA9IDAsDQoJCQkJCS8vIGlmIHdlIGFyZSBnb2luZyB0byB0aGUgZW5kLCB3ZSB3YW50IHRvIHJ1biBhbGwgdGhlIHR3ZWVucw0KCQkJCQkvLyBvdGhlcndpc2Ugd2Ugc2tpcCB0aGlzIHBhcnQNCgkJCQkJbGVuZ3RoID0gZ290b0VuZCA/IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoIDogMDsNCg0KCQkJCWZvciAoIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkgew0KCQkJCQlhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggMSApOw0KCQkJCX0NCg0KCQkJCS8vIHJlc29sdmUgd2hlbiB3ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWUNCgkJCQkvLyBvdGhlcndpc2UsIHJlamVjdA0KCQkJCWlmICggZ290b0VuZCApIHsNCgkJCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlkZWZlcnJlZC5yZWplY3RXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7DQoJCQkJfQ0KCQkJCXJldHVybiB0aGlzOw0KCQkJfQ0KCQl9KSwNCgkJcHJvcHMgPSBhbmltYXRpb24ucHJvcHM7DQoNCglwcm9wRmlsdGVyKCBwcm9wcywgYW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZyApOw0KDQoJZm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7DQoJCXJlc3VsdCA9IGFuaW1hdGlvblByZWZpbHRlcnNbIGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBlbGVtLCBwcm9wcywgYW5pbWF0aW9uLm9wdHMgKTsNCgkJaWYgKCByZXN1bHQgKSB7DQoJCQlyZXR1cm4gcmVzdWx0Ow0KCQl9DQoJfQ0KDQoJY3JlYXRlVHdlZW5zKCBhbmltYXRpb24sIHByb3BzICk7DQoNCglpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBhbmltYXRpb24ub3B0cy5zdGFydCApICkgew0KCQlhbmltYXRpb24ub3B0cy5zdGFydC5jYWxsKCBlbGVtLCBhbmltYXRpb24gKTsNCgl9DQoNCglqUXVlcnkuZngudGltZXIoDQoJCWpRdWVyeS5leHRlbmQoIHRpY2ssIHsNCgkJCWFuaW06IGFuaW1hdGlvbiwNCgkJCXF1ZXVlOiBhbmltYXRpb24ub3B0cy5xdWV1ZSwNCgkJCWVsZW06IGVsZW0NCgkJfSkNCgkpOw0KDQoJLy8gYXR0YWNoIGNhbGxiYWNrcyBmcm9tIG9wdGlvbnMNCglyZXR1cm4gYW5pbWF0aW9uLnByb2dyZXNzKCBhbmltYXRpb24ub3B0cy5wcm9ncmVzcyApDQoJCS5kb25lKCBhbmltYXRpb24ub3B0cy5kb25lLCBhbmltYXRpb24ub3B0cy5jb21wbGV0ZSApDQoJCS5mYWlsKCBhbmltYXRpb24ub3B0cy5mYWlsICkNCgkJLmFsd2F5cyggYW5pbWF0aW9uLm9wdHMuYWx3YXlzICk7DQp9DQoNCmZ1bmN0aW9uIHByb3BGaWx0ZXIoIHByb3BzLCBzcGVjaWFsRWFzaW5nICkgew0KCXZhciBpbmRleCwgbmFtZSwgZWFzaW5nLCB2YWx1ZSwgaG9va3M7DQoNCgkvLyBjYW1lbENhc2UsIHNwZWNpYWxFYXNpbmcgYW5kIGV4cGFuZCBjc3NIb29rIHBhc3MNCglmb3IgKCBpbmRleCBpbiBwcm9wcyApIHsNCgkJbmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIGluZGV4ICk7DQoJCWVhc2luZyA9IHNwZWNpYWxFYXNpbmdbIG5hbWUgXTsNCgkJdmFsdWUgPSBwcm9wc1sgaW5kZXggXTsNCgkJaWYgKCBqUXVlcnkuaXNBcnJheSggdmFsdWUgKSApIHsNCgkJCWVhc2luZyA9IHZhbHVlWyAxIF07DQoJCQl2YWx1ZSA9IHByb3BzWyBpbmRleCBdID0gdmFsdWVbIDAgXTsNCgkJfQ0KDQoJCWlmICggaW5kZXggIT09IG5hbWUgKSB7DQoJCQlwcm9wc1sgbmFtZSBdID0gdmFsdWU7DQoJCQlkZWxldGUgcHJvcHNbIGluZGV4IF07DQoJCX0NCg0KCQlob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdOw0KCQlpZiAoIGhvb2tzICYmICJleHBhbmQiIGluIGhvb2tzICkgew0KCQkJdmFsdWUgPSBob29rcy5leHBhbmQoIHZhbHVlICk7DQoJCQlkZWxldGUgcHJvcHNbIG5hbWUgXTsNCg0KCQkJLy8gbm90IHF1aXRlICQuZXh0ZW5kLCB0aGlzIHdvbnQgb3ZlcndyaXRlIGtleXMgYWxyZWFkeSBwcmVzZW50Lg0KCQkJLy8gYWxzbyAtIHJldXNpbmcgJ2luZGV4JyBmcm9tIGFib3ZlIGJlY2F1c2Ugd2UgaGF2ZSB0aGUgY29ycmVjdCAibmFtZSINCgkJCWZvciAoIGluZGV4IGluIHZhbHVlICkgew0KCQkJCWlmICggISggaW5kZXggaW4gcHJvcHMgKSApIHsNCgkJCQkJcHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgaW5kZXggXTsNCgkJCQkJc3BlY2lhbEVhc2luZ1sgaW5kZXggXSA9IGVhc2luZzsNCgkJCQl9DQoJCQl9DQoJCX0gZWxzZSB7DQoJCQlzcGVjaWFsRWFzaW5nWyBuYW1lIF0gPSBlYXNpbmc7DQoJCX0NCgl9DQp9DQoNCmpRdWVyeS5BbmltYXRpb24gPSBqUXVlcnkuZXh0ZW5kKCBBbmltYXRpb24sIHsNCg0KCXR3ZWVuZXI6IGZ1bmN0aW9uKCBwcm9wcywgY2FsbGJhY2sgKSB7DQoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHByb3BzICkgKSB7DQoJCQljYWxsYmFjayA9IHByb3BzOw0KCQkJcHJvcHMgPSBbICIqIiBdOw0KCQl9IGVsc2Ugew0KCQkJcHJvcHMgPSBwcm9wcy5zcGxpdCgiICIpOw0KCQl9DQoNCgkJdmFyIHByb3AsDQoJCQlpbmRleCA9IDAsDQoJCQlsZW5ndGggPSBwcm9wcy5sZW5ndGg7DQoNCgkJZm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7DQoJCQlwcm9wID0gcHJvcHNbIGluZGV4IF07DQoJCQl0d2VlbmVyc1sgcHJvcCBdID0gdHdlZW5lcnNbIHByb3AgXSB8fCBbXTsNCgkJCXR3ZWVuZXJzWyBwcm9wIF0udW5zaGlmdCggY2FsbGJhY2sgKTsNCgkJfQ0KCX0sDQoNCglwcmVmaWx0ZXI6IGZ1bmN0aW9uKCBjYWxsYmFjaywgcHJlcGVuZCApIHsNCgkJaWYgKCBwcmVwZW5kICkgew0KCQkJYW5pbWF0aW9uUHJlZmlsdGVycy51bnNoaWZ0KCBjYWxsYmFjayApOw0KCQl9IGVsc2Ugew0KCQkJYW5pbWF0aW9uUHJlZmlsdGVycy5wdXNoKCBjYWxsYmFjayApOw0KCQl9DQoJfQ0KfSk7DQoNCmZ1bmN0aW9uIGRlZmF1bHRQcmVmaWx0ZXIoIGVsZW0sIHByb3BzLCBvcHRzICkgew0KCXZhciBpbmRleCwgcHJvcCwgdmFsdWUsIGxlbmd0aCwgZGF0YVNob3csIHRvZ2dsZSwgdHdlZW4sIGhvb2tzLCBvbGRmaXJlLA0KCQlhbmltID0gdGhpcywNCgkJc3R5bGUgPSBlbGVtLnN0eWxlLA0KCQlvcmlnID0ge30sDQoJCWhhbmRsZWQgPSBbXSwNCgkJaGlkZGVuID0gZWxlbS5ub2RlVHlwZSAmJiBpc0hpZGRlbiggZWxlbSApOw0KDQoJLy8gaGFuZGxlIHF1ZXVlOiBmYWxzZSBwcm9taXNlcw0KCWlmICggIW9wdHMucXVldWUgKSB7DQoJCWhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCAiZngiICk7DQoJCWlmICggaG9va3MudW5xdWV1ZWQgPT0gbnVsbCApIHsNCgkJCWhvb2tzLnVucXVldWVkID0gMDsNCgkJCW9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlOw0KCQkJaG9va3MuZW1wdHkuZmlyZSA9IGZ1bmN0aW9uKCkgew0KCQkJCWlmICggIWhvb2tzLnVucXVldWVkICkgew0KCQkJCQlvbGRmaXJlKCk7DQoJCQkJfQ0KCQkJfTsNCgkJfQ0KCQlob29rcy51bnF1ZXVlZCsrOw0KDQoJCWFuaW0uYWx3YXlzKGZ1bmN0aW9uKCkgew0KCQkJLy8gZG9pbmcgdGhpcyBtYWtlcyBzdXJlIHRoYXQgdGhlIGNvbXBsZXRlIGhhbmRsZXIgd2lsbCBiZSBjYWxsZWQNCgkJCS8vIGJlZm9yZSB0aGlzIGNvbXBsZXRlcw0KCQkJYW5pbS5hbHdheXMoZnVuY3Rpb24oKSB7DQoJCQkJaG9va3MudW5xdWV1ZWQtLTsNCgkJCQlpZiAoICFqUXVlcnkucXVldWUoIGVsZW0sICJmeCIgKS5sZW5ndGggKSB7DQoJCQkJCWhvb2tzLmVtcHR5LmZpcmUoKTsNCgkJCQl9DQoJCQl9KTsNCgkJfSk7DQoJfQ0KDQoJLy8gaGVpZ2h0L3dpZHRoIG92ZXJmbG93IHBhc3MNCglpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgKCAiaGVpZ2h0IiBpbiBwcm9wcyB8fCAid2lkdGgiIGluIHByb3BzICkgKSB7DQoJCS8vIE1ha2Ugc3VyZSB0aGF0IG5vdGhpbmcgc25lYWtzIG91dA0KCQkvLyBSZWNvcmQgYWxsIDMgb3ZlcmZsb3cgYXR0cmlidXRlcyBiZWNhdXNlIElFIGRvZXMgbm90DQoJCS8vIGNoYW5nZSB0aGUgb3ZlcmZsb3cgYXR0cmlidXRlIHdoZW4gb3ZlcmZsb3dYIGFuZA0KCQkvLyBvdmVyZmxvd1kgYXJlIHNldCB0byB0aGUgc2FtZSB2YWx1ZQ0KCQlvcHRzLm92ZXJmbG93ID0gWyBzdHlsZS5vdmVyZmxvdywgc3R5bGUub3ZlcmZsb3dYLCBzdHlsZS5vdmVyZmxvd1kgXTsNCg0KCQkvLyBTZXQgZGlzcGxheSBwcm9wZXJ0eSB0byBpbmxpbmUtYmxvY2sgZm9yIGhlaWdodC93aWR0aA0KCQkvLyBhbmltYXRpb25zIG9uIGlubGluZSBlbGVtZW50cyB0aGF0IGFyZSBoYXZpbmcgd2lkdGgvaGVpZ2h0IGFuaW1hdGVkDQoJCWlmICggalF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICkgPT09ICJpbmxpbmUiICYmDQoJCQkJalF1ZXJ5LmNzcyggZWxlbSwgImZsb2F0IiApID09PSAibm9uZSIgKSB7DQoNCgkJCS8vIGlubGluZS1sZXZlbCBlbGVtZW50cyBhY2NlcHQgaW5saW5lLWJsb2NrOw0KCQkJLy8gYmxvY2stbGV2ZWwgZWxlbWVudHMgbmVlZCB0byBiZSBpbmxpbmUgd2l0aCBsYXlvdXQNCgkJCWlmICggIWpRdWVyeS5zdXBwb3J0LmlubGluZUJsb2NrTmVlZHNMYXlvdXQgfHwgY3NzX2RlZmF1bHREaXNwbGF5KCBlbGVtLm5vZGVOYW1lICkgPT09ICJpbmxpbmUiICkgew0KCQkJCXN0eWxlLmRpc3BsYXkgPSAiaW5saW5lLWJsb2NrIjsNCg0KCQkJfSBlbHNlIHsNCgkJCQlzdHlsZS56b29tID0gMTsNCgkJCX0NCgkJfQ0KCX0NCg0KCWlmICggb3B0cy5vdmVyZmxvdyApIHsNCgkJc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsNCgkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQuc2hyaW5rV3JhcEJsb2NrcyApIHsNCgkJCWFuaW0uZG9uZShmdW5jdGlvbigpIHsNCgkJCQlzdHlsZS5vdmVyZmxvdyA9IG9wdHMub3ZlcmZsb3dbIDAgXTsNCgkJCQlzdHlsZS5vdmVyZmxvd1ggPSBvcHRzLm92ZXJmbG93WyAxIF07DQoJCQkJc3R5bGUub3ZlcmZsb3dZID0gb3B0cy5vdmVyZmxvd1sgMiBdOw0KCQkJfSk7DQoJCX0NCgl9DQoNCg0KCS8vIHNob3cvaGlkZSBwYXNzDQoJZm9yICggaW5kZXggaW4gcHJvcHMgKSB7DQoJCXZhbHVlID0gcHJvcHNbIGluZGV4IF07DQoJCWlmICggcmZ4dHlwZXMuZXhlYyggdmFsdWUgKSApIHsNCgkJCWRlbGV0ZSBwcm9wc1sgaW5kZXggXTsNCgkJCXRvZ2dsZSA9IHRvZ2dsZSB8fCB2YWx1ZSA9PT0gInRvZ2dsZSI7DQoJCQlpZiAoIHZhbHVlID09PSAoIGhpZGRlbiA/ICJoaWRlIiA6ICJzaG93IiApICkgew0KCQkJCWNvbnRpbnVlOw0KCQkJfQ0KCQkJaGFuZGxlZC5wdXNoKCBpbmRleCApOw0KCQl9DQoJfQ0KDQoJbGVuZ3RoID0gaGFuZGxlZC5sZW5ndGg7DQoJaWYgKCBsZW5ndGggKSB7DQoJCWRhdGFTaG93ID0galF1ZXJ5Ll9kYXRhKCBlbGVtLCAiZnhzaG93IiApIHx8IGpRdWVyeS5fZGF0YSggZWxlbSwgImZ4c2hvdyIsIHt9ICk7DQoJCWlmICggImhpZGRlbiIgaW4gZGF0YVNob3cgKSB7DQoJCQloaWRkZW4gPSBkYXRhU2hvdy5oaWRkZW47DQoJCX0NCg0KCQkvLyBzdG9yZSBzdGF0ZSBpZiBpdHMgdG9nZ2xlIC0gZW5hYmxlcyAuc3RvcCgpLnRvZ2dsZSgpIHRvICJyZXZlcnNlIg0KCQlpZiAoIHRvZ2dsZSApIHsNCgkJCWRhdGFTaG93LmhpZGRlbiA9ICFoaWRkZW47DQoJCX0NCgkJaWYgKCBoaWRkZW4gKSB7DQoJCQlqUXVlcnkoIGVsZW0gKS5zaG93KCk7DQoJCX0gZWxzZSB7DQoJCQlhbmltLmRvbmUoZnVuY3Rpb24oKSB7DQoJCQkJalF1ZXJ5KCBlbGVtICkuaGlkZSgpOw0KCQkJfSk7DQoJCX0NCgkJYW5pbS5kb25lKGZ1bmN0aW9uKCkgew0KCQkJdmFyIHByb3A7DQoJCQlqUXVlcnkucmVtb3ZlRGF0YSggZWxlbSwgImZ4c2hvdyIsIHRydWUgKTsNCgkJCWZvciAoIHByb3AgaW4gb3JpZyApIHsNCgkJCQlqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AsIG9yaWdbIHByb3AgXSApOw0KCQkJfQ0KCQl9KTsNCgkJZm9yICggaW5kZXggPSAwIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkgew0KCQkJcHJvcCA9IGhhbmRsZWRbIGluZGV4IF07DQoJCQl0d2VlbiA9IGFuaW0uY3JlYXRlVHdlZW4oIHByb3AsIGhpZGRlbiA/IGRhdGFTaG93WyBwcm9wIF0gOiAwICk7DQoJCQlvcmlnWyBwcm9wIF0gPSBkYXRhU2hvd1sgcHJvcCBdIHx8IGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCApOw0KDQoJCQlpZiAoICEoIHByb3AgaW4gZGF0YVNob3cgKSApIHsNCgkJCQlkYXRhU2hvd1sgcHJvcCBdID0gdHdlZW4uc3RhcnQ7DQoJCQkJaWYgKCBoaWRkZW4gKSB7DQoJCQkJCXR3ZWVuLmVuZCA9IHR3ZWVuLnN0YXJ0Ow0KCQkJCQl0d2Vlbi5zdGFydCA9IHByb3AgPT09ICJ3aWR0aCIgfHwgcHJvcCA9PT0gImhlaWdodCIgPyAxIDogMDsNCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQp9DQoNCmZ1bmN0aW9uIFR3ZWVuKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApIHsNCglyZXR1cm4gbmV3IFR3ZWVuLnByb3RvdHlwZS5pbml0KCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApOw0KfQ0KalF1ZXJ5LlR3ZWVuID0gVHdlZW47DQoNClR3ZWVuLnByb3RvdHlwZSA9IHsNCgljb25zdHJ1Y3RvcjogVHdlZW4sDQoJaW5pdDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nLCB1bml0ICkgew0KCQl0aGlzLmVsZW0gPSBlbGVtOw0KCQl0aGlzLnByb3AgPSBwcm9wOw0KCQl0aGlzLmVhc2luZyA9IGVhc2luZyB8fCAic3dpbmciOw0KCQl0aGlzLm9wdGlvbnMgPSBvcHRpb25zOw0KCQl0aGlzLnN0YXJ0ID0gdGhpcy5ub3cgPSB0aGlzLmN1cigpOw0KCQl0aGlzLmVuZCA9IGVuZDsNCgkJdGhpcy51bml0ID0gdW5pdCB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/ICIiIDogInB4IiApOw0KCX0sDQoJY3VyOiBmdW5jdGlvbigpIHsNCgkJdmFyIGhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTsNCg0KCQlyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID8NCgkJCWhvb2tzLmdldCggdGhpcyApIDoNCgkJCVR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5nZXQoIHRoaXMgKTsNCgl9LA0KCXJ1bjogZnVuY3Rpb24oIHBlcmNlbnQgKSB7DQoJCXZhciBlYXNlZCwNCgkJCWhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTsNCg0KCQlpZiAoIHRoaXMub3B0aW9ucy5kdXJhdGlvbiApIHsNCgkJCXRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKA0KCQkJCXBlcmNlbnQsIHRoaXMub3B0aW9ucy5kdXJhdGlvbiAqIHBlcmNlbnQsIDAsIDEsIHRoaXMub3B0aW9ucy5kdXJhdGlvbg0KCQkJKTsNCgkJfSBlbHNlIHsNCgkJCXRoaXMucG9zID0gZWFzZWQgPSBwZXJjZW50Ow0KCQl9DQoJCXRoaXMubm93ID0gKCB0aGlzLmVuZCAtIHRoaXMuc3RhcnQgKSAqIGVhc2VkICsgdGhpcy5zdGFydDsNCg0KCQlpZiAoIHRoaXMub3B0aW9ucy5zdGVwICkgew0KCQkJdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApOw0KCQl9DQoNCgkJaWYgKCBob29rcyAmJiBob29rcy5zZXQgKSB7DQoJCQlob29rcy5zZXQoIHRoaXMgKTsNCgkJfSBlbHNlIHsNCgkJCVR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTsNCgkJfQ0KCQlyZXR1cm4gdGhpczsNCgl9DQp9Ow0KDQpUd2Vlbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGUgPSBUd2Vlbi5wcm90b3R5cGU7DQoNClR3ZWVuLnByb3BIb29rcyA9IHsNCglfZGVmYXVsdDogew0KCQlnZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHsNCgkJCXZhciByZXN1bHQ7DQoNCgkJCWlmICggdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdICE9IG51bGwgJiYNCgkJCQkoIXR3ZWVuLmVsZW0uc3R5bGUgfHwgdHdlZW4uZWxlbS5zdHlsZVsgdHdlZW4ucHJvcCBdID09IG51bGwpICkgew0KCQkJCXJldHVybiB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF07DQoJCQl9DQoNCgkJCS8vIHBhc3NpbmcgYW55IHZhbHVlIGFzIGEgNHRoIHBhcmFtZXRlciB0byAuY3NzIHdpbGwgYXV0b21hdGljYWxseQ0KCQkJLy8gYXR0ZW1wdCBhIHBhcnNlRmxvYXQgYW5kIGZhbGxiYWNrIHRvIGEgc3RyaW5nIGlmIHRoZSBwYXJzZSBmYWlscw0KCQkJLy8gc28sIHNpbXBsZSB2YWx1ZXMgc3VjaCBhcyAiMTBweCIgYXJlIHBhcnNlZCB0byBGbG9hdC4NCgkJCS8vIGNvbXBsZXggdmFsdWVzIHN1Y2ggYXMgInJvdGF0ZSgxcmFkKSIgYXJlIHJldHVybmVkIGFzIGlzLg0KCQkJcmVzdWx0ID0galF1ZXJ5LmNzcyggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgZmFsc2UsICIiICk7DQoJCQkvLyBFbXB0eSBzdHJpbmdzLCBudWxsLCB1bmRlZmluZWQgYW5kICJhdXRvIiBhcmUgY29udmVydGVkIHRvIDAuDQoJCQlyZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09ICJhdXRvIiA/IDAgOiByZXN1bHQ7DQoJCX0sDQoJCXNldDogZnVuY3Rpb24oIHR3ZWVuICkgew0KCQkJLy8gdXNlIHN0ZXAgaG9vayBmb3IgYmFjayBjb21wYXQgLSB1c2UgY3NzSG9vayBpZiBpdHMgdGhlcmUgLSB1c2UgLnN0eWxlIGlmIGl0cw0KCQkJLy8gYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUNCgkJCWlmICggalF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSApIHsNCgkJCQlqUXVlcnkuZnguc3RlcFsgdHdlZW4ucHJvcCBdKCB0d2VlbiApOw0KCQkJfSBlbHNlIGlmICggdHdlZW4uZWxlbS5zdHlsZSAmJiAoIHR3ZWVuLmVsZW0uc3R5bGVbIGpRdWVyeS5jc3NQcm9wc1sgdHdlZW4ucHJvcCBdIF0gIT0gbnVsbCB8fCBqUXVlcnkuY3NzSG9va3NbIHR3ZWVuLnByb3AgXSApICkgew0KCQkJCWpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgdHdlZW4ubm93ICsgdHdlZW4udW5pdCApOw0KCQkJfSBlbHNlIHsNCgkJCQl0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7DQoJCQl9DQoJCX0NCgl9DQp9Ow0KDQovLyBSZW1vdmUgaW4gMi4wIC0gdGhpcyBzdXBwb3J0cyBJRTgncyBwYW5pYyBiYXNlZCBhcHByb2FjaA0KLy8gdG8gc2V0dGluZyB0aGluZ3Mgb24gZGlzY29ubmVjdGVkIG5vZGVzDQoNClR3ZWVuLnByb3BIb29rcy5zY3JvbGxUb3AgPSBUd2Vlbi5wcm9wSG9va3Muc2Nyb2xsTGVmdCA9IHsNCglzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHsNCgkJaWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlICYmIHR3ZWVuLmVsZW0ucGFyZW50Tm9kZSApIHsNCgkJCXR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdzsNCgkJfQ0KCX0NCn07DQoNCmpRdWVyeS5lYWNoKFsgInRvZ2dsZSIsICJzaG93IiwgImhpZGUiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkgew0KCXZhciBjc3NGbiA9IGpRdWVyeS5mblsgbmFtZSBdOw0KCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgew0KCQlyZXR1cm4gc3BlZWQgPT0gbnVsbCB8fCB0eXBlb2Ygc3BlZWQgPT09ICJib29sZWFuIiB8fA0KCQkJLy8gc3BlY2lhbCBjaGVjayBmb3IgLnRvZ2dsZSggaGFuZGxlciwgaGFuZGxlciwgLi4uICkNCgkJCSggIWkgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHNwZWVkICkgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIGVhc2luZyApICkgPw0KCQkJY3NzRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIDoNCgkJCXRoaXMuYW5pbWF0ZSggZ2VuRngoIG5hbWUsIHRydWUgKSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTsNCgl9Ow0KfSk7DQoNCmpRdWVyeS5mbi5leHRlbmQoew0KCWZhZGVUbzogZnVuY3Rpb24oIHNwZWVkLCB0bywgZWFzaW5nLCBjYWxsYmFjayApIHsNCg0KCQkvLyBzaG93IGFueSBoaWRkZW4gZWxlbWVudHMgYWZ0ZXIgc2V0dGluZyBvcGFjaXR5IHRvIDANCgkJcmV0dXJuIHRoaXMuZmlsdGVyKCBpc0hpZGRlbiApLmNzcyggIm9wYWNpdHkiLCAwICkuc2hvdygpDQoNCgkJCS8vIGFuaW1hdGUgdG8gdGhlIHZhbHVlIHNwZWNpZmllZA0KCQkJLmVuZCgpLmFuaW1hdGUoeyBvcGFjaXR5OiB0byB9LCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOw0KCX0sDQoJYW5pbWF0ZTogZnVuY3Rpb24oIHByb3AsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgew0KCQl2YXIgZW1wdHkgPSBqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcCApLA0KCQkJb3B0YWxsID0galF1ZXJ5LnNwZWVkKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApLA0KCQkJZG9BbmltYXRpb24gPSBmdW5jdGlvbigpIHsNCgkJCQkvLyBPcGVyYXRlIG9uIGEgY29weSBvZiBwcm9wIHNvIHBlci1wcm9wZXJ0eSBlYXNpbmcgd29uJ3QgYmUgbG9zdA0KCQkJCXZhciBhbmltID0gQW5pbWF0aW9uKCB0aGlzLCBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcCApLCBvcHRhbGwgKTsNCg0KCQkJCS8vIEVtcHR5IGFuaW1hdGlvbnMgcmVzb2x2ZSBpbW1lZGlhdGVseQ0KCQkJCWlmICggZW1wdHkgKSB7DQoJCQkJCWFuaW0uc3RvcCggdHJ1ZSApOw0KCQkJCX0NCgkJCX07DQoNCgkJcmV0dXJuIGVtcHR5IHx8IG9wdGFsbC5xdWV1ZSA9PT0gZmFsc2UgPw0KCQkJdGhpcy5lYWNoKCBkb0FuaW1hdGlvbiApIDoNCgkJCXRoaXMucXVldWUoIG9wdGFsbC5xdWV1ZSwgZG9BbmltYXRpb24gKTsNCgl9LA0KCXN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5kICkgew0KCQl2YXIgc3RvcFF1ZXVlID0gZnVuY3Rpb24oIGhvb2tzICkgew0KCQkJdmFyIHN0b3AgPSBob29rcy5zdG9wOw0KCQkJZGVsZXRlIGhvb2tzLnN0b3A7DQoJCQlzdG9wKCBnb3RvRW5kICk7DQoJCX07DQoNCgkJaWYgKCB0eXBlb2YgdHlwZSAhPT0gInN0cmluZyIgKSB7DQoJCQlnb3RvRW5kID0gY2xlYXJRdWV1ZTsNCgkJCWNsZWFyUXVldWUgPSB0eXBlOw0KCQkJdHlwZSA9IHVuZGVmaW5lZDsNCgkJfQ0KCQlpZiAoIGNsZWFyUXVldWUgJiYgdHlwZSAhPT0gZmFsc2UgKSB7DQoJCQl0aGlzLnF1ZXVlKCB0eXBlIHx8ICJmeCIsIFtdICk7DQoJCX0NCg0KCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgew0KCQkJdmFyIGRlcXVldWUgPSB0cnVlLA0KCQkJCWluZGV4ID0gdHlwZSAhPSBudWxsICYmIHR5cGUgKyAicXVldWVIb29rcyIsDQoJCQkJdGltZXJzID0galF1ZXJ5LnRpbWVycywNCgkJCQlkYXRhID0galF1ZXJ5Ll9kYXRhKCB0aGlzICk7DQoNCgkJCWlmICggaW5kZXggKSB7DQoJCQkJaWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3RvcCApIHsNCgkJCQkJc3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQlmb3IgKCBpbmRleCBpbiBkYXRhICkgew0KCQkJCQlpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICYmIHJydW4udGVzdCggaW5kZXggKSApIHsNCgkJCQkJCXN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KDQoJCQlmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkgew0KCQkJCWlmICggdGltZXJzWyBpbmRleCBdLmVsZW0gPT09IHRoaXMgJiYgKHR5cGUgPT0gbnVsbCB8fCB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUpICkgew0KCQkJCQl0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCBnb3RvRW5kICk7DQoJCQkJCWRlcXVldWUgPSBmYWxzZTsNCgkJCQkJdGltZXJzLnNwbGljZSggaW5kZXgsIDEgKTsNCgkJCQl9DQoJCQl9DQoNCgkJCS8vIHN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQNCgkJCS8vIHRpbWVycyBjdXJyZW50bHkgd2lsbCBjYWxsIHRoZWlyIGNvbXBsZXRlIGNhbGxiYWNrcywgd2hpY2ggd2lsbCBkZXF1ZXVlDQoJCQkvLyBidXQgb25seSBpZiB0aGV5IHdlcmUgZ290b0VuZA0KCQkJaWYgKCBkZXF1ZXVlIHx8ICFnb3RvRW5kICkgew0KCQkJCWpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7DQoJCQl9DQoJCX0pOw0KCX0NCn0pOw0KDQovLyBHZW5lcmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlvbg0KZnVuY3Rpb24gZ2VuRngoIHR5cGUsIGluY2x1ZGVXaWR0aCApIHsNCgl2YXIgd2hpY2gsDQoJCWF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfSwNCgkJaSA9IDA7DQoNCgkvLyBpZiB3ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4cGFuZCB2YWx1ZXMsDQoJLy8gaWYgd2UgZG9uJ3QgaW5jbHVkZSB3aWR0aCwgc3RlcCB2YWx1ZSBpcyAyIHRvIHNraXAgb3ZlciBMZWZ0IGFuZCBSaWdodA0KCWluY2x1ZGVXaWR0aCA9IGluY2x1ZGVXaWR0aD8gMSA6IDA7DQoJZm9yKCA7IGkgPCA0IDsgaSArPSAyIC0gaW5jbHVkZVdpZHRoICkgew0KCQl3aGljaCA9IGNzc0V4cGFuZFsgaSBdOw0KCQlhdHRyc1sgIm1hcmdpbiIgKyB3aGljaCBdID0gYXR0cnNbICJwYWRkaW5nIiArIHdoaWNoIF0gPSB0eXBlOw0KCX0NCg0KCWlmICggaW5jbHVkZVdpZHRoICkgew0KCQlhdHRycy5vcGFjaXR5ID0gYXR0cnMud2lkdGggPSB0eXBlOw0KCX0NCg0KCXJldHVybiBhdHRyczsNCn0NCg0KLy8gR2VuZXJhdGUgc2hvcnRjdXRzIGZvciBjdXN0b20gYW5pbWF0aW9ucw0KalF1ZXJ5LmVhY2goew0KCXNsaWRlRG93bjogZ2VuRngoInNob3ciKSwNCglzbGlkZVVwOiBnZW5GeCgiaGlkZSIpLA0KCXNsaWRlVG9nZ2xlOiBnZW5GeCgidG9nZ2xlIiksDQoJZmFkZUluOiB7IG9wYWNpdHk6ICJzaG93IiB9LA0KCWZhZGVPdXQ6IHsgb3BhY2l0eTogImhpZGUiIH0sDQoJZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiAidG9nZ2xlIiB9DQp9LCBmdW5jdGlvbiggbmFtZSwgcHJvcHMgKSB7DQoJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7DQoJCXJldHVybiB0aGlzLmFuaW1hdGUoIHByb3BzLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOw0KCX07DQp9KTsNCg0KalF1ZXJ5LnNwZWVkID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGZuICkgew0KCXZhciBvcHQgPSBzcGVlZCAmJiB0eXBlb2Ygc3BlZWQgPT09ICJvYmplY3QiID8galF1ZXJ5LmV4dGVuZCgge30sIHNwZWVkICkgOiB7DQoJCWNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8DQoJCQlqUXVlcnkuaXNGdW5jdGlvbiggc3BlZWQgKSAmJiBzcGVlZCwNCgkJZHVyYXRpb246IHNwZWVkLA0KCQllYXNpbmc6IGZuICYmIGVhc2luZyB8fCBlYXNpbmcgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKCBlYXNpbmcgKSAmJiBlYXNpbmcNCgl9Ow0KDQoJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4Lm9mZiA/IDAgOiB0eXBlb2Ygb3B0LmR1cmF0aW9uID09PSAibnVtYmVyIiA/IG9wdC5kdXJhdGlvbiA6DQoJCW9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRzID8galF1ZXJ5LmZ4LnNwZWVkc1sgb3B0LmR1cmF0aW9uIF0gOiBqUXVlcnkuZnguc3BlZWRzLl9kZWZhdWx0Ow0KDQoJLy8gbm9ybWFsaXplIG9wdC5xdWV1ZSAtIHRydWUvdW5kZWZpbmVkL251bGwgLT4gImZ4Ig0KCWlmICggb3B0LnF1ZXVlID09IG51bGwgfHwgb3B0LnF1ZXVlID09PSB0cnVlICkgew0KCQlvcHQucXVldWUgPSAiZngiOw0KCX0NCg0KCS8vIFF1ZXVlaW5nDQoJb3B0Lm9sZCA9IG9wdC5jb21wbGV0ZTsNCg0KCW9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkgew0KCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBvcHQub2xkICkgKSB7DQoJCQlvcHQub2xkLmNhbGwoIHRoaXMgKTsNCgkJfQ0KDQoJCWlmICggb3B0LnF1ZXVlICkgew0KCQkJalF1ZXJ5LmRlcXVldWUoIHRoaXMsIG9wdC5xdWV1ZSApOw0KCQl9DQoJfTsNCg0KCXJldHVybiBvcHQ7DQp9Ow0KDQpqUXVlcnkuZWFzaW5nID0gew0KCWxpbmVhcjogZnVuY3Rpb24oIHAgKSB7DQoJCXJldHVybiBwOw0KCX0sDQoJc3dpbmc6IGZ1bmN0aW9uKCBwICkgew0KCQlyZXR1cm4gMC41IC0gTWF0aC5jb3MoIHAqTWF0aC5QSSApIC8gMjsNCgl9DQp9Ow0KDQpqUXVlcnkudGltZXJzID0gW107DQpqUXVlcnkuZnggPSBUd2Vlbi5wcm90b3R5cGUuaW5pdDsNCmpRdWVyeS5meC50aWNrID0gZnVuY3Rpb24oKSB7DQoJdmFyIHRpbWVyLA0KCQl0aW1lcnMgPSBqUXVlcnkudGltZXJzLA0KCQlpID0gMDsNCg0KCWZ4Tm93ID0galF1ZXJ5Lm5vdygpOw0KDQoJZm9yICggOyBpIDwgdGltZXJzLmxlbmd0aDsgaSsrICkgew0KCQl0aW1lciA9IHRpbWVyc1sgaSBdOw0KCQkvLyBDaGVja3MgdGhlIHRpbWVyIGhhcyBub3QgYWxyZWFkeSBiZWVuIHJlbW92ZWQNCgkJaWYgKCAhdGltZXIoKSAmJiB0aW1lcnNbIGkgXSA9PT0gdGltZXIgKSB7DQoJCQl0aW1lcnMuc3BsaWNlKCBpLS0sIDEgKTsNCgkJfQ0KCX0NCg0KCWlmICggIXRpbWVycy5sZW5ndGggKSB7DQoJCWpRdWVyeS5meC5zdG9wKCk7DQoJfQ0KCWZ4Tm93ID0gdW5kZWZpbmVkOw0KfTsNCg0KalF1ZXJ5LmZ4LnRpbWVyID0gZnVuY3Rpb24oIHRpbWVyICkgew0KCWlmICggdGltZXIoKSAmJiBqUXVlcnkudGltZXJzLnB1c2goIHRpbWVyICkgJiYgIXRpbWVySWQgKSB7DQoJCXRpbWVySWQgPSBzZXRJbnRlcnZhbCggalF1ZXJ5LmZ4LnRpY2ssIGpRdWVyeS5meC5pbnRlcnZhbCApOw0KCX0NCn07DQoNCmpRdWVyeS5meC5pbnRlcnZhbCA9IDEzOw0KDQpqUXVlcnkuZnguc3RvcCA9IGZ1bmN0aW9uKCkgew0KCWNsZWFySW50ZXJ2YWwoIHRpbWVySWQgKTsNCgl0aW1lcklkID0gbnVsbDsNCn07DQoNCmpRdWVyeS5meC5zcGVlZHMgPSB7DQoJc2xvdzogNjAwLA0KCWZhc3Q6IDIwMCwNCgkvLyBEZWZhdWx0IHNwZWVkDQoJX2RlZmF1bHQ6IDQwMA0KfTsNCg0KLy8gQmFjayBDb21wYXQgPDEuOCBleHRlbnNpb24gcG9pbnQNCmpRdWVyeS5meC5zdGVwID0ge307DQoNCmlmICggalF1ZXJ5LmV4cHIgJiYgalF1ZXJ5LmV4cHIuZmlsdGVycyApIHsNCglqUXVlcnkuZXhwci5maWx0ZXJzLmFuaW1hdGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7DQoJCXJldHVybiBqUXVlcnkuZ3JlcChqUXVlcnkudGltZXJzLCBmdW5jdGlvbiggZm4gKSB7DQoJCQlyZXR1cm4gZWxlbSA9PT0gZm4uZWxlbTsNCgkJfSkubGVuZ3RoOw0KCX07DQp9DQp2YXIgcnJvb3QgPSAvXig/OmJvZHl8aHRtbCkkL2k7DQoNCmpRdWVyeS5mbi5vZmZzZXQgPSBmdW5jdGlvbiggb3B0aW9ucyApIHsNCglpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7DQoJCXJldHVybiBvcHRpb25zID09PSB1bmRlZmluZWQgPw0KCQkJdGhpcyA6DQoJCQl0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7DQoJCQkJalF1ZXJ5Lm9mZnNldC5zZXRPZmZzZXQoIHRoaXMsIG9wdGlvbnMsIGkgKTsNCgkJCX0pOw0KCX0NCg0KCXZhciBkb2NFbGVtLCBib2R5LCB3aW4sIGNsaWVudFRvcCwgY2xpZW50TGVmdCwgc2Nyb2xsVG9wLCBzY3JvbGxMZWZ0LA0KCQlib3ggPSB7IHRvcDogMCwgbGVmdDogMCB9LA0KCQllbGVtID0gdGhpc1sgMCBdLA0KCQlkb2MgPSBlbGVtICYmIGVsZW0ub3duZXJEb2N1bWVudDsNCg0KCWlmICggIWRvYyApIHsNCgkJcmV0dXJuOw0KCX0NCg0KCWlmICggKGJvZHkgPSBkb2MuYm9keSkgPT09IGVsZW0gKSB7DQoJCXJldHVybiBqUXVlcnkub2Zmc2V0LmJvZHlPZmZzZXQoIGVsZW0gKTsNCgl9DQoNCglkb2NFbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudDsNCg0KCS8vIE1ha2Ugc3VyZSBpdCdzIG5vdCBhIGRpc2Nvbm5lY3RlZCBET00gbm9kZQ0KCWlmICggIWpRdWVyeS5jb250YWlucyggZG9jRWxlbSwgZWxlbSApICkgew0KCQlyZXR1cm4gYm94Ow0KCX0NCg0KCS8vIElmIHdlIGRvbid0IGhhdmUgZ0JDUiwganVzdCB1c2UgMCwwIHJhdGhlciB0aGFuIGVycm9yDQoJLy8gQmxhY2tCZXJyeSA1LCBpT1MgMyAob3JpZ2luYWwgaVBob25lKQ0KCWlmICggdHlwZW9mIGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0ICE9PSAidW5kZWZpbmVkIiApIHsNCgkJYm94ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsNCgl9DQoJd2luID0gZ2V0V2luZG93KCBkb2MgKTsNCgljbGllbnRUb3AgID0gZG9jRWxlbS5jbGllbnRUb3AgIHx8IGJvZHkuY2xpZW50VG9wICB8fCAwOw0KCWNsaWVudExlZnQgPSBkb2NFbGVtLmNsaWVudExlZnQgfHwgYm9keS5jbGllbnRMZWZ0IHx8IDA7DQoJc2Nyb2xsVG9wICA9IHdpbi5wYWdlWU9mZnNldCB8fCBkb2NFbGVtLnNjcm9sbFRvcDsNCglzY3JvbGxMZWZ0ID0gd2luLnBhZ2VYT2Zmc2V0IHx8IGRvY0VsZW0uc2Nyb2xsTGVmdDsNCglyZXR1cm4gew0KCQl0b3A6IGJveC50b3AgICsgc2Nyb2xsVG9wICAtIGNsaWVudFRvcCwNCgkJbGVmdDogYm94LmxlZnQgKyBzY3JvbGxMZWZ0IC0gY2xpZW50TGVmdA0KCX07DQp9Ow0KDQpqUXVlcnkub2Zmc2V0ID0gew0KDQoJYm9keU9mZnNldDogZnVuY3Rpb24oIGJvZHkgKSB7DQoJCXZhciB0b3AgPSBib2R5Lm9mZnNldFRvcCwNCgkJCWxlZnQgPSBib2R5Lm9mZnNldExlZnQ7DQoNCgkJaWYgKCBqUXVlcnkuc3VwcG9ydC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCApIHsNCgkJCXRvcCAgKz0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyhib2R5LCAibWFyZ2luVG9wIikgKSB8fCAwOw0KCQkJbGVmdCArPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKGJvZHksICJtYXJnaW5MZWZ0IikgKSB8fCAwOw0KCQl9DQoNCgkJcmV0dXJuIHsgdG9wOiB0b3AsIGxlZnQ6IGxlZnQgfTsNCgl9LA0KDQoJc2V0T2Zmc2V0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgaSApIHsNCgkJdmFyIHBvc2l0aW9uID0galF1ZXJ5LmNzcyggZWxlbSwgInBvc2l0aW9uIiApOw0KDQoJCS8vIHNldCBwb3NpdGlvbiBmaXJzdCwgaW4tY2FzZSB0b3AvbGVmdCBhcmUgc2V0IGV2ZW4gb24gc3RhdGljIGVsZW0NCgkJaWYgKCBwb3NpdGlvbiA9PT0gInN0YXRpYyIgKSB7DQoJCQllbGVtLnN0eWxlLnBvc2l0aW9uID0gInJlbGF0aXZlIjsNCgkJfQ0KDQoJCXZhciBjdXJFbGVtID0galF1ZXJ5KCBlbGVtICksDQoJCQljdXJPZmZzZXQgPSBjdXJFbGVtLm9mZnNldCgpLA0KCQkJY3VyQ1NTVG9wID0galF1ZXJ5LmNzcyggZWxlbSwgInRvcCIgKSwNCgkJCWN1ckNTU0xlZnQgPSBqUXVlcnkuY3NzKCBlbGVtLCAibGVmdCIgKSwNCgkJCWNhbGN1bGF0ZVBvc2l0aW9uID0gKCBwb3NpdGlvbiA9PT0gImFic29sdXRlIiB8fCBwb3NpdGlvbiA9PT0gImZpeGVkIiApICYmIGpRdWVyeS5pbkFycmF5KCJhdXRvIiwgW2N1ckNTU1RvcCwgY3VyQ1NTTGVmdF0pID4gLTEsDQoJCQlwcm9wcyA9IHt9LCBjdXJQb3NpdGlvbiA9IHt9LCBjdXJUb3AsIGN1ckxlZnQ7DQoNCgkJLy8gbmVlZCB0byBiZSBhYmxlIHRvIGNhbGN1bGF0ZSBwb3NpdGlvbiBpZiBlaXRoZXIgdG9wIG9yIGxlZnQgaXMgYXV0byBhbmQgcG9zaXRpb24gaXMgZWl0aGVyIGFic29sdXRlIG9yIGZpeGVkDQoJCWlmICggY2FsY3VsYXRlUG9zaXRpb24gKSB7DQoJCQljdXJQb3NpdGlvbiA9IGN1ckVsZW0ucG9zaXRpb24oKTsNCgkJCWN1clRvcCA9IGN1clBvc2l0aW9uLnRvcDsNCgkJCWN1ckxlZnQgPSBjdXJQb3NpdGlvbi5sZWZ0Ow0KCQl9IGVsc2Ugew0KCQkJY3VyVG9wID0gcGFyc2VGbG9hdCggY3VyQ1NTVG9wICkgfHwgMDsNCgkJCWN1ckxlZnQgPSBwYXJzZUZsb2F0KCBjdXJDU1NMZWZ0ICkgfHwgMDsNCgkJfQ0KDQoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHsNCgkJCW9wdGlvbnMgPSBvcHRpb25zLmNhbGwoIGVsZW0sIGksIGN1ck9mZnNldCApOw0KCQl9DQoNCgkJaWYgKCBvcHRpb25zLnRvcCAhPSBudWxsICkgew0KCQkJcHJvcHMudG9wID0gKCBvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDsNCgkJfQ0KCQlpZiAoIG9wdGlvbnMubGVmdCAhPSBudWxsICkgew0KCQkJcHJvcHMubGVmdCA9ICggb3B0aW9ucy5sZWZ0IC0gY3VyT2Zmc2V0LmxlZnQgKSArIGN1ckxlZnQ7DQoJCX0NCg0KCQlpZiAoICJ1c2luZyIgaW4gb3B0aW9ucyApIHsNCgkJCW9wdGlvbnMudXNpbmcuY2FsbCggZWxlbSwgcHJvcHMgKTsNCgkJfSBlbHNlIHsNCgkJCWN1ckVsZW0uY3NzKCBwcm9wcyApOw0KCQl9DQoJfQ0KfTsNCg0KDQpqUXVlcnkuZm4uZXh0ZW5kKHsNCg0KCXBvc2l0aW9uOiBmdW5jdGlvbigpIHsNCgkJaWYgKCAhdGhpc1swXSApIHsNCgkJCXJldHVybjsNCgkJfQ0KDQoJCXZhciBlbGVtID0gdGhpc1swXSwNCg0KCQkvLyBHZXQgKnJlYWwqIG9mZnNldFBhcmVudA0KCQlvZmZzZXRQYXJlbnQgPSB0aGlzLm9mZnNldFBhcmVudCgpLA0KDQoJCS8vIEdldCBjb3JyZWN0IG9mZnNldHMNCgkJb2Zmc2V0ICAgICAgID0gdGhpcy5vZmZzZXQoKSwNCgkJcGFyZW50T2Zmc2V0ID0gcnJvb3QudGVzdChvZmZzZXRQYXJlbnRbMF0ubm9kZU5hbWUpID8geyB0b3A6IDAsIGxlZnQ6IDAgfSA6IG9mZnNldFBhcmVudC5vZmZzZXQoKTsNCg0KCQkvLyBTdWJ0cmFjdCBlbGVtZW50IG1hcmdpbnMNCgkJLy8gbm90ZTogd2hlbiBhbiBlbGVtZW50IGhhcyBtYXJnaW46IGF1dG8gdGhlIG9mZnNldExlZnQgYW5kIG1hcmdpbkxlZnQNCgkJLy8gYXJlIHRoZSBzYW1lIGluIFNhZmFyaSBjYXVzaW5nIG9mZnNldC5sZWZ0IHRvIGluY29ycmVjdGx5IGJlIDANCgkJb2Zmc2V0LnRvcCAgLT0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyhlbGVtLCAibWFyZ2luVG9wIikgKSB8fCAwOw0KCQlvZmZzZXQubGVmdCAtPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKGVsZW0sICJtYXJnaW5MZWZ0IikgKSB8fCAwOw0KDQoJCS8vIEFkZCBvZmZzZXRQYXJlbnQgYm9yZGVycw0KCQlwYXJlbnRPZmZzZXQudG9wICArPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKG9mZnNldFBhcmVudFswXSwgImJvcmRlclRvcFdpZHRoIikgKSB8fCAwOw0KCQlwYXJlbnRPZmZzZXQubGVmdCArPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKG9mZnNldFBhcmVudFswXSwgImJvcmRlckxlZnRXaWR0aCIpICkgfHwgMDsNCg0KCQkvLyBTdWJ0cmFjdCB0aGUgdHdvIG9mZnNldHMNCgkJcmV0dXJuIHsNCgkJCXRvcDogIG9mZnNldC50b3AgIC0gcGFyZW50T2Zmc2V0LnRvcCwNCgkJCWxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQNCgkJfTsNCgl9LA0KDQoJb2Zmc2V0UGFyZW50OiBmdW5jdGlvbigpIHsNCgkJcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCkgew0KCQkJdmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50IHx8IGRvY3VtZW50LmJvZHk7DQoJCQl3aGlsZSAoIG9mZnNldFBhcmVudCAmJiAoIXJyb290LnRlc3Qob2Zmc2V0UGFyZW50Lm5vZGVOYW1lKSAmJiBqUXVlcnkuY3NzKG9mZnNldFBhcmVudCwgInBvc2l0aW9uIikgPT09ICJzdGF0aWMiKSApIHsNCgkJCQlvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50Ow0KCQkJfQ0KCQkJcmV0dXJuIG9mZnNldFBhcmVudCB8fCBkb2N1bWVudC5ib2R5Ow0KCQl9KTsNCgl9DQp9KTsNCg0KDQovLyBDcmVhdGUgc2Nyb2xsTGVmdCBhbmQgc2Nyb2xsVG9wIG1ldGhvZHMNCmpRdWVyeS5lYWNoKCB7c2Nyb2xsTGVmdDogInBhZ2VYT2Zmc2V0Iiwgc2Nyb2xsVG9wOiAicGFnZVlPZmZzZXQifSwgZnVuY3Rpb24oIG1ldGhvZCwgcHJvcCApIHsNCgl2YXIgdG9wID0gL1kvLnRlc3QoIHByb3AgKTsNCg0KCWpRdWVyeS5mblsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdmFsICkgew0KCQlyZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG1ldGhvZCwgdmFsICkgew0KCQkJdmFyIHdpbiA9IGdldFdpbmRvdyggZWxlbSApOw0KDQoJCQlpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkgew0KCQkJCXJldHVybiB3aW4gPyAocHJvcCBpbiB3aW4pID8gd2luWyBwcm9wIF0gOg0KCQkJCQl3aW4uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyBtZXRob2QgXSA6DQoJCQkJCWVsZW1bIG1ldGhvZCBdOw0KCQkJfQ0KDQoJCQlpZiAoIHdpbiApIHsNCgkJCQl3aW4uc2Nyb2xsVG8oDQoJCQkJCSF0b3AgPyB2YWwgOiBqUXVlcnkoIHdpbiApLnNjcm9sbExlZnQoKSwNCgkJCQkJIHRvcCA/IHZhbCA6IGpRdWVyeSggd2luICkuc2Nyb2xsVG9wKCkNCgkJCQkpOw0KDQoJCQl9IGVsc2Ugew0KCQkJCWVsZW1bIG1ldGhvZCBdID0gdmFsOw0KCQkJfQ0KCQl9LCBtZXRob2QsIHZhbCwgYXJndW1lbnRzLmxlbmd0aCwgbnVsbCApOw0KCX07DQp9KTsNCg0KZnVuY3Rpb24gZ2V0V2luZG93KCBlbGVtICkgew0KCXJldHVybiBqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSA/DQoJCWVsZW0gOg0KCQllbGVtLm5vZGVUeXBlID09PSA5ID8NCgkJCWVsZW0uZGVmYXVsdFZpZXcgfHwgZWxlbS5wYXJlbnRXaW5kb3cgOg0KCQkJZmFsc2U7DQp9DQovLyBDcmVhdGUgaW5uZXJIZWlnaHQsIGlubmVyV2lkdGgsIGhlaWdodCwgd2lkdGgsIG91dGVySGVpZ2h0IGFuZCBvdXRlcldpZHRoIG1ldGhvZHMNCmpRdWVyeS5lYWNoKCB7IEhlaWdodDogImhlaWdodCIsIFdpZHRoOiAid2lkdGgiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkgew0KCWpRdWVyeS5lYWNoKCB7IHBhZGRpbmc6ICJpbm5lciIgKyBuYW1lLCBjb250ZW50OiB0eXBlLCAiIjogIm91dGVyIiArIG5hbWUgfSwgZnVuY3Rpb24oIGRlZmF1bHRFeHRyYSwgZnVuY05hbWUgKSB7DQoJCS8vIG1hcmdpbiBpcyBvbmx5IGZvciBvdXRlckhlaWdodCwgb3V0ZXJXaWR0aA0KCQlqUXVlcnkuZm5bIGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHsNCgkJCXZhciBjaGFpbmFibGUgPSBhcmd1bWVudHMubGVuZ3RoICYmICggZGVmYXVsdEV4dHJhIHx8IHR5cGVvZiBtYXJnaW4gIT09ICJib29sZWFuIiApLA0KCQkJCWV4dHJhID0gZGVmYXVsdEV4dHJhIHx8ICggbWFyZ2luID09PSB0cnVlIHx8IHZhbHVlID09PSB0cnVlID8gIm1hcmdpbiIgOiAiYm9yZGVyIiApOw0KDQoJCQlyZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIHR5cGUsIHZhbHVlICkgew0KCQkJCXZhciBkb2M7DQoNCgkJCQlpZiAoIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkgew0KCQkJCQkvLyBBcyBvZiA1LzgvMjAxMiB0aGlzIHdpbGwgeWllbGQgaW5jb3JyZWN0IHJlc3VsdHMgZm9yIE1vYmlsZSBTYWZhcmksIGJ1dCB0aGVyZQ0KCQkJCQkvLyBpc24ndCBhIHdob2xlIGxvdCB3ZSBjYW4gZG8uIFNlZSBwdWxsIHJlcXVlc3QgYXQgdGhpcyBVUkwgZm9yIGRpc2N1c3Npb246DQoJCQkJCS8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L3B1bGwvNzY0DQoJCQkJCXJldHVybiBlbGVtLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgImNsaWVudCIgKyBuYW1lIF07DQoJCQkJfQ0KDQoJCQkJLy8gR2V0IGRvY3VtZW50IHdpZHRoIG9yIGhlaWdodA0KCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHsNCgkJCQkJZG9jID0gZWxlbS5kb2N1bWVudEVsZW1lbnQ7DQoNCgkJCQkJLy8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdIG9yIGNsaWVudFtXaWR0aC9IZWlnaHRdLCB3aGljaGV2ZXIgaXMgZ3JlYXRlc3QNCgkJCQkJLy8gdW5mb3J0dW5hdGVseSwgdGhpcyBjYXVzZXMgYnVnICMzODM4IGluIElFNi84IG9ubHksIGJ1dCB0aGVyZSBpcyBjdXJyZW50bHkgbm8gZ29vZCwgc21hbGwgd2F5IHRvIGZpeCBpdC4NCgkJCQkJcmV0dXJuIE1hdGgubWF4KA0KCQkJCQkJZWxlbS5ib2R5WyAic2Nyb2xsIiArIG5hbWUgXSwgZG9jWyAic2Nyb2xsIiArIG5hbWUgXSwNCgkJCQkJCWVsZW0uYm9keVsgIm9mZnNldCIgKyBuYW1lIF0sIGRvY1sgIm9mZnNldCIgKyBuYW1lIF0sDQoJCQkJCQlkb2NbICJjbGllbnQiICsgbmFtZSBdDQoJCQkJCSk7DQoJCQkJfQ0KDQoJCQkJcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPw0KCQkJCQkvLyBHZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50LCByZXF1ZXN0aW5nIGJ1dCBub3QgZm9yY2luZyBwYXJzZUZsb2F0DQoJCQkJCWpRdWVyeS5jc3MoIGVsZW0sIHR5cGUsIHZhbHVlLCBleHRyYSApIDoNCg0KCQkJCQkvLyBTZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50DQoJCQkJCWpRdWVyeS5zdHlsZSggZWxlbSwgdHlwZSwgdmFsdWUsIGV4dHJhICk7DQoJCQl9LCB0eXBlLCBjaGFpbmFibGUgPyBtYXJnaW4gOiB1bmRlZmluZWQsIGNoYWluYWJsZSwgbnVsbCApOw0KCQl9Ow0KCX0pOw0KfSk7DQovLyBFeHBvc2UgalF1ZXJ5IHRvIHRoZSBnbG9iYWwgb2JqZWN0DQp3aW5kb3cualF1ZXJ5ID0gd2luZG93LiQgPSBqUXVlcnk7DQoNCi8vIEV4cG9zZSBqUXVlcnkgYXMgYW4gQU1EIG1vZHVsZSwgYnV0IG9ubHkgZm9yIEFNRCBsb2FkZXJzIHRoYXQNCi8vIHVuZGVyc3RhbmQgdGhlIGlzc3VlcyB3aXRoIGxvYWRpbmcgbXVsdGlwbGUgdmVyc2lvbnMgb2YgalF1ZXJ5DQovLyBpbiBhIHBhZ2UgdGhhdCBhbGwgbWlnaHQgY2FsbCBkZWZpbmUoKS4gVGhlIGxvYWRlciB3aWxsIGluZGljYXRlDQovLyB0aGV5IGhhdmUgc3BlY2lhbCBhbGxvd2FuY2VzIGZvciBtdWx0aXBsZSBqUXVlcnkgdmVyc2lvbnMgYnkNCi8vIHNwZWNpZnlpbmcgZGVmaW5lLmFtZC5qUXVlcnkgPSB0cnVlLiBSZWdpc3RlciBhcyBhIG5hbWVkIG1vZHVsZSwNCi8vIHNpbmNlIGpRdWVyeSBjYW4gYmUgY29uY2F0ZW5hdGVkIHdpdGggb3RoZXIgZmlsZXMgdGhhdCBtYXkgdXNlIGRlZmluZSwNCi8vIGJ1dCBub3QgdXNlIGEgcHJvcGVyIGNvbmNhdGVuYXRpb24gc2NyaXB0IHRoYXQgdW5kZXJzdGFuZHMgYW5vbnltb3VzDQovLyBBTUQgbW9kdWxlcy4gQSBuYW1lZCBBTUQgaXMgc2FmZXN0IGFuZCBtb3N0IHJvYnVzdCB3YXkgdG8gcmVnaXN0ZXIuDQovLyBMb3dlcmNhc2UganF1ZXJ5IGlzIHVzZWQgYmVjYXVzZSBBTUQgbW9kdWxlIG5hbWVzIGFyZSBkZXJpdmVkIGZyb20NCi8vIGZpbGUgbmFtZXMsIGFuZCBqUXVlcnkgaXMgbm9ybWFsbHkgZGVsaXZlcmVkIGluIGEgbG93ZXJjYXNlIGZpbGUgbmFtZS4NCi8vIERvIHRoaXMgYWZ0ZXIgY3JlYXRpbmcgdGhlIGdsb2JhbCBzbyB0aGF0IGlmIGFuIEFNRCBtb2R1bGUgd2FudHMgdG8gY2FsbA0KLy8gbm9Db25mbGljdCB0byBoaWRlIHRoaXMgdmVyc2lvbiBvZiBqUXVlcnksIGl0IHdpbGwgd29yay4NCmlmICggdHlwZW9mIGRlZmluZSA9PT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kICYmIGRlZmluZS5hbWQualF1ZXJ5ICkgew0KCWRlZmluZSggImpxdWVyeSIsIFtdLCBmdW5jdGlvbiAoKSB7IHJldHVybiBqUXVlcnk7IH0gKTsNCn0NCg0KfSkoIHdpbmRvdyApOw0K" ></script>
<script id="db_js" src="data:text/plain;base64," ></script>
<script id="jgrid_core_js" src="data:text/plain;base64,KGZ1bmN0aW9uKHdpbmRvdywgJCwgdW5kZWZpbmVkKSB7CgogICAgdmFyIEpTR1JJRCA9ICJKU0dyaWQiLAogICAgICAgIEpTR1JJRF9EQVRBX0tFWSA9IEpTR1JJRCwKICAgICAgICBKU0dSSURfUk9XX0RBVEFfS0VZID0gIkpTR3JpZEl0ZW0iLAogICAgICAgIEpTR1JJRF9FRElUX1JPV19EQVRBX0tFWSA9ICJKU0dyaWRFZGl0Um93IiwKCiAgICAgICAgU09SVF9PUkRFUl9BU0MgPSAiYXNjIiwKICAgICAgICBTT1JUX09SREVSX0RFU0MgPSAiZGVzYyIsCgogICAgICAgIEZJUlNUX1BBR0VfUExBQ0VIT0xERVIgPSAie2ZpcnN0fSIsCiAgICAgICAgUEFHRVNfUExBQ0VIT0xERVIgPSAie3BhZ2VzfSIsCiAgICAgICAgUFJFVl9QQUdFX1BMQUNFSE9MREVSID0gIntwcmV2fSIsCiAgICAgICAgTkVYVF9QQUdFX1BMQUNFSE9MREVSID0gIntuZXh0fSIsCiAgICAgICAgTEFTVF9QQUdFX1BMQUNFSE9MREVSID0gIntsYXN0fSIsCiAgICAgICAgUEFHRV9JTkRFWF9QTEFDRUhPTERFUiA9ICJ7cGFnZUluZGV4fSIsCiAgICAgICAgUEFHRV9DT1VOVF9QTEFDRUhPTERFUiA9ICJ7cGFnZUNvdW50fSIsCiAgICAgICAgSVRFTV9DT1VOVF9QTEFDRUhPTERFUiA9ICJ7aXRlbUNvdW50fSIsCgogICAgICAgIEVNUFRZX0hSRUYgPSAiamF2YXNjcmlwdDp2b2lkKDApOyI7CgogICAgdmFyIGdldE9yQXBwbHkgPSBmdW5jdGlvbih2YWx1ZSwgY29udGV4dCkgewogICAgICAgIGlmKCQuaXNGdW5jdGlvbih2YWx1ZSkpIHsKICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmFwcGx5KGNvbnRleHQsICQubWFrZUFycmF5KGFyZ3VtZW50cykuc2xpY2UoMikpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdmFsdWU7CiAgICB9OwoKICAgIHZhciBub3JtYWxpemVQcm9taXNlID0gZnVuY3Rpb24ocHJvbWlzZSkgewogICAgICAgIHZhciBkID0gJC5EZWZlcnJlZCgpOwoKICAgICAgICBpZihwcm9taXNlICYmIHByb21pc2UudGhlbikgewogICAgICAgICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBkLnJlc29sdmUuYXBwbHkoZCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBkLnJlamVjdC5hcHBseShkLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkLnJlc29sdmUocHJvbWlzZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZC5wcm9taXNlKCk7CiAgICB9OwoKICAgIHZhciBkZWZhdWx0Q29udHJvbGxlciA9IHsKICAgICAgICBsb2FkRGF0YTogJC5ub29wLAogICAgICAgIGluc2VydEl0ZW06ICQubm9vcCwKICAgICAgICB1cGRhdGVJdGVtOiAkLm5vb3AsCiAgICAgICAgZGVsZXRlSXRlbTogJC5ub29wCiAgICB9OwoKCiAgICBmdW5jdGlvbiBHcmlkKGVsZW1lbnQsIGNvbmZpZykgewogICAgICAgIHZhciAkZWxlbWVudCA9ICQoZWxlbWVudCk7CgogICAgICAgICRlbGVtZW50LmRhdGEoSlNHUklEX0RBVEFfS0VZLCB0aGlzKTsKCiAgICAgICAgdGhpcy5fY29udGFpbmVyID0gjgVsZW1lbnQ7CgogICAgICAgIHRoaXMuZGF0YSA9IFtdOwogICAgICAgIHRoaXMuZmllbGRzID0gW107CgogICAgICAgIHRoaXMuX2VkaXRpbmdSb3cgPSBudWxsOwogICAgICAgIHRoaXMuX3NvcnRGaWVsZCA9IG51bGw7CiAgICAgICAgdGhpcy5fc29ydE9yZGVyID0gU09SVF9PUkRFUl9BU0M7CiAgICAgICAgdGhpcy5fZmlyc3REaXNwbGF5aW5nUGFnZSA9IDE7CgogICAgICAgIHRoaXMuX2luaXQoY29uZmlnKTsKICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgfQoKICAgIEdyaWQucHJvdG90eXBlID0gewogICAgICAgIHdpZHRoOiAiYXV0byIsCiAgICAgICAgaGVpZ2h0OiAiYXV0byIsCiAgICAgICAgdXBkYXRlT25SZXNpemU6IHRydWUsCgogICAgICAgIHJvd0NsYXNzOiAkLm5vb3AsCiAgICAgICAgcm93UmVuZGVyZXI6IG51bGwsCgogICAgICAgIHJvd0NsaWNrOiBmdW5jdGlvbihhcmdzKSB7CiAgICAgICAgICAgIGlmKHRoaXMuZWRpdGluZykgewogICAgICAgICAgICAgICAgdGhpcy5lZGl0SXRlbSgkKGFyZ3MuZXZlbnQudGFyZ2V0KS5jbG9zZXN0KCJ0ciIpKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgcm93RG91YmxlQ2xpY2s6ICQubm9vcCwKCiAgICAgICAgbm9EYXRhQ29udGVudDogIk5vdCBmb3VuZCIsCiAgICAgICAgbm9EYXRhUm93Q2xhc3M6ICJqc2dyaWQtbm9kYXRhLXJvdyIsCgogICAgICAgIGhlYWRpbmc6IHRydWUsCiAgICAgICAgaGVhZGVyUm93UmVuZGVyZXI6IG51bGwsCiAgICAgICAgaGVhZGVyUm93Q2xhc3M6ICJqc2dyaWQtaGVhZGVyLXJvdyIsCiAgICAgICAgaGVhZGVyQ2VsbENsYXNzOiAianNncmlkLWhlYWRlci1jZWxsIiwKCiAgICAgICAgZmlsdGVyaW5nOiBmYWxzZSwKICAgICAgICBmaWx0ZXJSb3dSZW5kZXJlcjogbnVsbCwKICAgICAgICBmaWx0ZXJSb3dDbGFzczogImpzZ3JpZC1maWx0ZXItcm93IiwKCiAgICAgICAgaW5zZXJ0aW5nOiBmYWxzZSwKICAgICAgICBpbnNlcnRSb3dSZW5kZXJlcjogbnVsbCwKICAgICAgICBpbnNlcnRSb3dDbGFzczogImpzZ3JpZC1pbnNlcnQtcm93IiwKCiAgICAgICAgZWRpdGluZzogZmFsc2UsCiAgICAgICAgZWRpdFJvd1JlbmRlcmVyOiBudWxsLAogICAgICAgIGVkaXRSb3dDbGFzczogImpzZ3JpZC1lZGl0LXJvdyIsCgogICAgICAgIGNvbmZpcm1EZWxldGluZzogdHJ1ZSwKICAgICAgICBkZWxldGVDb25maXJtOiAiQXJlIHlvdSBzdXJlPyIsCgogICAgICAgIHNlbGVjdGluZzogdHJ1ZSwKICAgICAgICBzZWxlY3RlZFJvd0NsYXNzOiAianNncmlkLXNlbGVjdGVkLXJvdyIsCiAgICAgICAgb2RkUm93Q2xhc3M6ICJqc2dyaWQtcm93IiwKICAgICAgICBldmVuUm93Q2xhc3M6ICJqc2dyaWQtYWx0LXJvdyIsCiAgICAgICAgY2VsbENsYXNzOiAianNncmlkLWNlbGwiLAoKICAgICAgICBzb3J0aW5nOiBmYWxzZSwKICAgICAgICBzb3J0YWJsZUNsYXNzOiAianNncmlkLWhlYWRlci1zb3J0YWJsZSIsCiAgICAgICAgc29ydEFzY0NsYXNzOiAianNncmlkLWhlYWRlci1zb3J0IGpzZ3JpZC1oZWFkZXItc29ydC1hc2MiLAogICAgICAgIHNvcnREZXNjQ2xhc3M6ICJqc2dyaWQtaGVhZGVyLXNvcnQganNncmlkLWhlYWRlci1zb3J0LWRlc2MiLAoKICAgICAgICBwYWdpbmc6IGZhbHNlLAogICAgICAgIHBhZ2VyQ29udGFpbmVyOiBudWxsLAogICAgICAgIHBhZ2VJbmRleDogMSwKICAgICAgICBwYWdlU2l6ZTogMjAsCiAgICAgICAgcGFnZUJ1dHRvbkNvdW50OiAxNSwKICAgICAgICBwYWdlckZvcm1hdDogIlBhZ2VzOiB7Zmlyc3R9IHtwcmV2fSB7cGFnZXN9IHtuZXh0fSB7bGFzdH0gJm5ic3A7Jm5ic3A7IHtwYWdlSW5kZXh9IG9mIHtwYWdlQ291bnR9IiwKICAgICAgICBwYWdlUHJldlRleHQ6ICJQcmV2IiwKICAgICAgICBwYWdlTmV4dFRleHQ6ICJOZXh0IiwKICAgICAgICBwYWdlRmlyc3RUZXh0OiAiRmlyc3QiLAogICAgICAgIHBhZ2VMYXN0VGV4dDogIkxhc3QiLAogICAgICAgIHBhZ2VOYXZpZ2F0b3JOZXh0VGV4dDogIi4uLiIsCiAgICAgICAgcGFnZU5hdmlnYXRvclByZXZUZXh0OiAiLi4uIiwKICAgICAgICBwYWdlckNvbnRhaW5lckNsYXNzOiAianNncmlkLXBhZ2VyLWNvbnRhaW5lciIsCiAgICAgICAgcGFnZXJDbGFzczogImpzZ3JpZC1wYWdlciIsCiAgICAgICAgcGFnZXJOYXZCdXR0b25DbGFzczogImpzZ3JpZC1wYWdlci1uYXYtYnV0dG9uIiwKICAgICAgICBwYWdlck5hdkJ1dHRvbkluYWN0aXZlQ2xhc3M6ICJqc2dyaWQtcGFnZXItbmF2LWluYWN0aXZlLWJ1dHRvbiIsCiAgICAgICAgcGFnZUNsYXNzOiAianNncmlkLXBhZ2VyLXBhZ2UiLAogICAgICAgIGN1cnJlbnRQYWdlQ2xhc3M6ICJqc2dyaWQtcGFnZXItY3VycmVudC1wYWdlIiwKCiAgICAgICAgY3VzdG9tTG9hZGluZzogZmFsc2UsCiAgICAgICAgcGFnZUxvYWRpbmc6IGZhbHNlLAoKICAgICAgICBhdXRvbG9hZDogZmFsc2UsCiAgICAgICAgY29udHJvbGxlcjogZGVmYXVsdENvbnRyb2xsZXIsCgogICAgICAgIGxvYWRJbmRpY2F0aW9uOiB0cnVlLAogICAgICAgIGxvYWRJbmRpY2F0aW9uRGVsYXk6IDUwMCwKICAgICAgICBsb2FkTWVzc2FnZTogIlBsZWFzZSwgd2FpdC4uLiIsCiAgICAgICAgbG9hZFNoYWRpbmc6IHRydWUsCgogICAgICAgIGludmFsaWRNZXNzYWdlOiAiSW52YWxpZCBkYXRhIGVudGVyZWQhIiwKCiAgICAgICAgaW52YWxpZE5vdGlmeTogZnVuY3Rpb24oYXJncykgewogICAgICAgICAgICB2YXIgbWVzc2FnZXMgPSAkLm1hcChhcmdzLmVycm9ycywgZnVuY3Rpb24oZXJyb3IpIHsKICAgICAgICAgICAgICAgIHJldHVybiBlcnJvci5tZXNzYWdlIHx8IG51bGw7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgd2luZG93LmFsZXJ0KFt0aGlzLmludmFsaWRNZXNzYWdlXS5jb25jYXQobWVzc2FnZXMpLmpvaW4oIlxuIikpOwogICAgICAgIH0sCgogICAgICAgIG9uSW5pdDogJC5ub29wLAogICAgICAgIG9uUmVmcmVzaGluZzogJC5ub29wLAogICAgICAgIG9uUmVmcmVzaGVkOiAkLm5vb3AsCiAgICAgICAgb25QYWdlQ2hhbmdlZDogJC5ub29wLAogICAgICAgIG9uSXRlbURlbGV0aW5nOiAkLm5vb3AsCiAgICAgICAgb25JdGVtRGVsZXRlZDogJC5ub29wLAogICAgICAgIG9uSXRlbUluc2VydGluZzogJC5ub29wLAogICAgICAgIG9uSXRlbUluc2VydGVkOiAkLm5vb3AsCiAgICAgICAgb25JdGVtRWRpdGluZzogJC5ub29wLAogICAgICAgIG9uSXRlbVVwZGF0aW5nOiAkLm5vb3AsCiAgICAgICAgb25JdGVtVXBkYXRlZDogJC5ub29wLAogICAgICAgIG9uSXRlbUludmFsaWQ6ICQubm9vcCwKICAgICAgICBvbkRhdGFMb2FkaW5nOiAkLm5vb3AsCiAgICAgICAgb25EYXRhTG9hZGVkOiAkLm5vb3AsCiAgICAgICAgb25PcHRpb25DaGFuZ2luZzogJC5ub29wLAogICAgICAgIG9uT3B0aW9uQ2hhbmdlZDogJC5ub29wLAogICAgICAgIG9uRXJyb3I6ICQubm9vcCwKCiAgICAgICAgaW52YWxpZENsYXNzOiAianNncmlkLWludmFsaWQiLAoKICAgICAgICBjb250YWluZXJDbGFzczogImpzZ3JpZCIsCiAgICAgICAgdGFibGVDbGFzczogImpzZ3JpZC10YWJsZSIsCiAgICAgICAgZ3JpZEhlYWRlckNsYXNzOiAianNncmlkLWdyaWQtaGVhZGVyIiwKICAgICAgICBncmlkQm9keUNsYXNzOiAianNncmlkLWdyaWQtYm9keSIsCgogICAgICAgIF9pbml0OiBmdW5jdGlvbihjb25maWcpIHsKICAgICAgICAgICAgJC5leHRlbmQodGhpcywgY29uZmlnKTsKICAgICAgICAgICAgdGhpcy5faW5pdExvYWRTdHJhdGVneSgpOwogICAgICAgICAgICB0aGlzLl9pbml0Q29udHJvbGxlcigpOwogICAgICAgICAgICB0aGlzLl9pbml0RmllbGRzKCk7CiAgICAgICAgICAgIHRoaXMuX2F0dGFjaFdpbmRvd0xvYWRSZXNpemUoKTsKICAgICAgICAgICAgdGhpcy5fYXR0YWNoV2luZG93UmVzaXplQ2FsbGJhY2soKTsKICAgICAgICAgICAgdGhpcy5fY2FsbEV2ZW50SGFuZGxlcih0aGlzLm9uSW5pdCkKICAgICAgICB9LAoKICAgICAgICBsb2FkU3RyYXRlZ3k6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5wYWdlTG9hZGluZwogICAgICAgICAgICAgICAgPyBuZXcganNHcmlkLmxvYWRTdHJhdGVnaWVzLlBhZ2VMb2FkaW5nU3RyYXRlZ3kodGhpcykKICAgICAgICAgICAgICAgIDogbmV3IGpzR3JpZC5sb2FkU3RyYXRlZ2llcy5EaXJlY3RMb2FkaW5nU3RyYXRlZ3kodGhpcyk7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRMb2FkU3RyYXRlZ3k6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB0aGlzLl9sb2FkU3RyYXRlZ3kgPSBnZXRPckFwcGx5KHRoaXMubG9hZFN0cmF0ZWd5LCB0aGlzKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdENvbnRyb2xsZXI6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB0aGlzLl9jb250cm9sbGVyID0gJC5leHRlbmQoe30sIGRlZmF1bHRDb250cm9sbGVyLCBnZXRPckFwcGx5KHRoaXMuY29udHJvbGxlciwgdGhpcykpOwogICAgICAgIH0sCgogICAgICAgIHJlbmRlclRlbXBsYXRlOiBmdW5jdGlvbihzb3VyY2UsIGNvbnRleHQsIGNvbmZpZykgewogICAgICAgICAgICBhcmdzID0gW107CiAgICAgICAgICAgIGZvcih2YXIga2V5IGluIGNvbmZpZykgewogICAgICAgICAgICAgICAgYXJncy5wdXNoKGNvbmZpZ1trZXldKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYXJncy51bnNoaWZ0KHNvdXJjZSwgY29udGV4dCk7CgogICAgICAgICAgICBzb3VyY2UgPSBnZXRPckFwcGx5LmFwcGx5KG51bGwsIGFyZ3MpOwogICAgICAgICAgICByZXR1cm4gKHNvdXJjZSA9PT0gdW5kZWZpbmVkIHx8IHNvdXJjZSA9PT0gbnVsbCkgPyAiIiA6IHNvdXJjZTsKICAgICAgICB9LAoKICAgICAgICBsb2FkSW5kaWNhdG9yOiBmdW5jdGlvbihjb25maWcpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBqc0dyaWQuTG9hZEluZGljYXRvcihjb25maWcpOwogICAgICAgIH0sCgogICAgICAgIHZhbGlkYXRpb246IGZ1bmN0aW9uKGNvbmZpZykgewogICAgICAgICAgICByZXR1cm4ganNHcmlkLlZhbGlkYXRpb24gJiYgbmV3IGpzR3JpZC5WYWxpZGF0aW9uKGNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRGaWVsZHM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgICAgICAgIHNlbGYuZmllbGRzID0gJC5tYXAoc2VsZi5maWVsZHMsIGZ1bmN0aW9uKGZpZWxkKSB7CiAgICAgICAgICAgICAgICBpZigkLmlzUGxhaW5PYmplY3QoZmllbGQpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkQ29uc3RydWN0b3IgPSAoZmllbGQudHlwZSAmJiBqc0dyaWQuZmllbGRzW2ZpZWxkLnR5cGVdKSB8fCBqc0dyaWQuRmllbGQ7CiAgICAgICAgICAgICAgICAgICAgZmllbGQgPSBuZXcgZmllbGRDb25zdHJ1Y3RvcihmaWVsZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmaWVsZC5fZ3JpZCA9IHNlbGY7CiAgICAgICAgICAgICAgICByZXR1cm4gZmllbGQ7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9hdHRhY2hXaW5kb3dMb2FkUmVzaXplOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgJCh3aW5kb3cpLm9uKCJsb2FkIiwgJC5wcm94eSh0aGlzLl9yZWZyZXNoU2l6ZSwgdGhpcykpOwogICAgICAgIH0sCgogICAgICAgIF9hdHRhY2hXaW5kb3dSZXNpemVDYWxsYmFjazogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmKHRoaXMudXBkYXRlT25SZXNpemUpIHsKICAgICAgICAgICAgICAgICQod2luZG93KS5vbigicmVzaXplIiwgJC5wcm94eSh0aGlzLl9yZWZyZXNoU2l6ZSwgdGhpcykpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2RldGFjaFdpbmRvd1Jlc2l6ZUNhbGxiYWNrOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgJCh3aW5kb3cpLm9mZigicmVzaXplIiwgdGhpcy5fcmVmcmVzaFNpemUpOwogICAgICAgIH0sCgogICAgICAgIG9wdGlvbjogZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewogICAgICAgICAgICB2YXIgb3B0aW9uQ2hhbmdpbmdFdmVudEFyZ3MsCiAgICAgICAgICAgICAgICBvcHRpb25DaGFuZ2VkRXZlbnRBcmdzOwoKICAgICAgICAgICAgaWYoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW2tleV07CgogICAgICAgICAgICBvcHRpb25DaGFuZ2luZ0V2ZW50QXJncyA9IHsKICAgICAgICAgICAgICAgIG9wdGlvbjoga2V5LAogICAgICAgICAgICAgICAgb2xkVmFsdWU6IHRoaXNba2V5XSwKICAgICAgICAgICAgICAgIG5ld1ZhbHVlOiB2YWx1ZQogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9jYWxsRXZlbnRIYW5kbGVyKHRoaXMub25PcHRpb25DaGFuZ2luZywgb3B0aW9uQ2hhbmdpbmdFdmVudEFyZ3MpOwoKICAgICAgICAgICAgdGhpcy5faGFuZGxlT3B0aW9uQ2hhbmdlKG9wdGlvbkNoYW5naW5nRXZlbnRBcmdzLm9wdGlvbiwgb3B0aW9uQ2hhbmdpbmdFdmVudEFyZ3MubmV3VmFsdWUpOwoKICAgICAgICAgICAgb3B0aW9uQ2hhbmdlZEV2ZW50QXJncyA9IHsKICAgICAgICAgICAgICAgIG9wdGlvbjogb3B0aW9uQ2hhbmdpbmdFdmVudEFyZ3Mub3B0aW9uLAogICAgICAgICAgICAgICAgdmFsdWU6IG9wdGlvbkNoYW5naW5nRXZlbnRBcmdzLm5ld1ZhbHVlCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuX2NhbGxFdmVudEhhbmRsZXIodGhpcy5vbk9wdGlvbkNoYW5nZWQsIG9wdGlvbkNoYW5nZWRFdmVudEFyZ3MpOwogICAgICAgIH0sCgogICAgICAgIGZpZWxkT3B0aW9uOiBmdW5jdGlvbihmaWVsZCwga2V5LCB2YWx1ZSkgewogICAgICAgICAgICBmaWVsZCA9IHRoaXMuX25vcm1hbGl6ZUZpZWxkKGZpZWxkKTsKCiAgICAgICAgICAgIGlmKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpCiAgICAgICAgICAgICAgICByZXR1cm4gZmllbGRba2V5XTsKCiAgICAgICAgICAgIGZpZWxkW2tleV0gPSB2YWx1ZTsKICAgICAgICAgICAgdGhpcy5fcmVuZGVyR3JpZCgpOwogICAgICAgIH0sCgogICAgICAgIF9oYW5kbGVPcHRpb25DaGFuZ2U6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXNbbmFtZV0gPSB2YWx1ZTsKCiAgICAgICAgICAgIHN3aXRjaChuYW1lKSB7CiAgICAgICAgICAgICAgICBjYXNlICJ3aWR0aCI6CiAgICAgICAgICAgICAgICBjYXNlICJoZWlnaHQiOgogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlZnJlc2hTaXplKCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJyb3dDbGFzcyI6CiAgICAgICAgICAgICAgICBjYXNlICJyb3dSZW5kZXJlciI6CiAgICAgICAgICAgICAgICBjYXNlICJyb3dDbGljayI6CiAgICAgICAgICAgICAgICBjYXNlICJyb3dEb3VibGVDbGljayI6CiAgICAgICAgICAgICAgICBjYXNlICJub0RhdGFSb3dDbGFzcyI6CiAgICAgICAgICAgICAgICBjYXNlICJub0RhdGFDb250ZW50IjoKICAgICAgICAgICAgICAgIGNhc2UgInNlbGVjdGluZyI6CiAgICAgICAgICAgICAgICBjYXNlICJzZWxlY3RlZFJvd0NsYXNzIjoKICAgICAgICAgICAgICAgIGNhc2UgIm9kZFJvd0NsYXNzIjoKICAgICAgICAgICAgICAgIGNhc2UgImV2ZW5Sb3dDbGFzcyI6CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVmcmVzaENvbnRlbnQoKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgInBhZ2VCdXR0b25Db3VudCI6CiAgICAgICAgICAgICAgICBjYXNlICJwYWdlckZvcm1hdCI6CiAgICAgICAgICAgICAgICBjYXNlICJwYWdlUHJldlRleHQiOgogICAgICAgICAgICAgICAgY2FzZSAicGFnZU5leHRUZXh0IjoKICAgICAgICAgICAgICAgIGNhc2UgInBhZ2VGaXJzdFRleHQiOgogICAgICAgICAgICAgICAgY2FzZSAicGFnZUxhc3RUZXh0IjoKICAgICAgICAgICAgICAgIGNhc2UgInBhZ2VOYXZpZ2F0b3JOZXh0VGV4dCI6CiAgICAgICAgICAgICAgICBjYXNlICJwYWdlTmF2aWdhdG9yUHJldlRleHQiOgogICAgICAgICAgICAgICAgY2FzZSAicGFnZXJDbGFzcyI6CiAgICAgICAgICAgICAgICBjYXNlICJwYWdlck5hdkJ1dHRvbkNsYXNzIjoKICAgICAgICAgICAgICAgIGNhc2UgInBhZ2VDbGFzcyI6CiAgICAgICAgICAgICAgICBjYXNlICJjdXJyZW50UGFnZUNsYXNzIjoKICAgICAgICAgICAgICAgIGNhc2UgInBhZ2VyUmVuZGVyZXIiOgogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlZnJlc2hQYWdlcigpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAiZmllbGRzIjoKICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbml0RmllbGRzKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgImRhdGEiOgogICAgICAgICAgICAgICAgY2FzZSAiZWRpdGluZyI6CiAgICAgICAgICAgICAgICBjYXNlICJoZWFkaW5nIjoKICAgICAgICAgICAgICAgIGNhc2UgImZpbHRlcmluZyI6CiAgICAgICAgICAgICAgICBjYXNlICJpbnNlcnRpbmciOgogICAgICAgICAgICAgICAgY2FzZSAicGFnaW5nIjoKICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2goKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgImxvYWRTdHJhdGVneSI6CiAgICAgICAgICAgICAgICBjYXNlICJwYWdlTG9hZGluZyI6CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5pdExvYWRTdHJhdGVneSgpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoKCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJwYWdlSW5kZXgiOgogICAgICAgICAgICAgICAgICAgIHRoaXMub3BlblBhZ2UodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAicGFnZVNpemUiOgogICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaCgpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoKCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJlZGl0Um93UmVuZGVyZXIiOgogICAgICAgICAgICAgICAgY2FzZSAiZWRpdFJvd0NsYXNzIjoKICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbEVkaXQoKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgInVwZGF0ZU9uUmVzaXplIjoKICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZXRhY2hXaW5kb3dSZXNpemVDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2F0dGFjaFdpbmRvd1Jlc2l6ZUNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJpbnZhbGlkTm90aWZ5IjoKICAgICAgICAgICAgICAgIGNhc2UgImludmFsaWRNZXNzYWdlIjoKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB0aGlzLl9kZXRhY2hXaW5kb3dSZXNpemVDYWxsYmFjaygpOwogICAgICAgICAgICB0aGlzLl9jbGVhcigpOwogICAgICAgICAgICB0aGlzLl9jb250YWluZXIucmVtb3ZlRGF0YShKU0dSSURfREFUQV9LRVkpOwogICAgICAgIH0sCgogICAgICAgIHJlbmRlcjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMuX3JlbmRlckdyaWQoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXV0b2xvYWQgPyB0aGlzLmxvYWREYXRhKCkgOiAkLkRlZmVycmVkKCkucmVzb2x2ZSgpLnByb21pc2UoKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyR3JpZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMuX2NsZWFyKCk7CgogICAgICAgICAgICB0aGlzLl9jb250YWluZXIuYWRkQ2xhc3ModGhpcy5jb250YWluZXJDbGFzcykKICAgICAgICAgICAgICAgIC5jc3MoInBvc2l0aW9uIiwgInJlbGF0aXZlIikKICAgICAgICAgICAgICAgIC5hcHBlbmQodGhpcy5fY3JlYXRlSGVhZGVyKCkpCiAgICAgICAgICAgICAgICAuYXBwZW5kKHRoaXMuX2NyZWF0ZUJvZHkoKSk7CgogICAgICAgICAgICB0aGlzLl9wYWdlckNvbnRhaW5lciA9IHRoaXMuX2NyZWF0ZVBhZ2VyQ29udGFpbmVyKCk7CiAgICAgICAgICAgIHRoaXMuX2xvYWRJbmRpY2F0b3IgPSB0aGlzLl9jcmVhdGVMb2FkSW5kaWNhdG9yKCk7CiAgICAgICAgICAgIHRoaXMuX3ZhbGlkYXRpb24gPSB0aGlzLl9jcmVhdGVWYWxpZGF0aW9uKCk7CgogICAgICAgICAgICB0aGlzLnJlZnJlc2goKTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlTG9hZEluZGljYXRvcjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBnZXRPckFwcGx5KHRoaXMubG9hZEluZGljYXRvciwgdGhpcywgewogICAgICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5sb2FkTWVzc2FnZSwKICAgICAgICAgICAgICAgIHNoYWRpbmc6IHRoaXMubG9hZFNoYWRpbmcsCiAgICAgICAgICAgICAgICBjb250YWluZXI6IHRoaXMuX2NvbnRhaW5lcgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlVmFsaWRhdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBnZXRPckFwcGx5KHRoaXMudmFsaWRhdGlvbiwgdGhpcyk7CiAgICAgICAgfSwKCiAgICAgICAgX2NsZWFyOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdGhpcy5jYW5jZWxFZGl0KCk7CgogICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fbG9hZGluZ1RpbWVyKTsKCiAgICAgICAgICAgIHRoaXMuX3BhZ2VyQ29udGFpbmVyICYmIHRoaXMuX3BhZ2VyQ29udGFpbmVyLmVtcHR5KCk7CgogICAgICAgICAgICB0aGlzLl9jb250YWluZXIuZW1wdHkoKQogICAgICAgICAgICAgICAgLmNzcyh7IHBvc2l0aW9uOiAiIiwgd2lkdGg6ICIiLCBoZWlnaHQ6ICIiIH0pOwogICAgICAgIH0sCgogICAgICAgIF9jcmVhdGVIZWFkZXI6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgjghlYWRlclJvdyA9IHRoaXMuX2hlYWRlclJvdyA9IHRoaXMuX2NyZWF0ZUhlYWRlclJvdygpLAogICAgICAgICAgICAgICAgjgZpbHRlclJvdyA9IHRoaXMuX2ZpbHRlclJvdyA9IHRoaXMuX2NyZWF0ZUZpbHRlclJvdygpLAogICAgICAgICAgICAgICAgjgluc2VydFJvdyA9IHRoaXMuX2luc2VydFJvdyA9IHRoaXMuX2NyZWF0ZUluc2VydFJvdygpOwoKICAgICAgICAgICAgdmFyICRoZWFkZXJHcmlkID0gdGhpcy5faGVhZGVyR3JpZCA9ICQoIjx0YWJsZT4iKS5hZGRDbGFzcyh0aGlzLnRhYmxlQ2xhc3MpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCRoZWFkZXJSb3cpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCRmaWx0ZXJSb3cpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCRpbnNlcnRSb3cpOwoKICAgICAgICAgICAgdmFyICRoZWFkZXIgPSB0aGlzLl9oZWFkZXIgPSAkKCI8ZGl2PiIpLmFkZENsYXNzKHRoaXMuZ3JpZEhlYWRlckNsYXNzKQogICAgICAgICAgICAgICAgLmFkZENsYXNzKHRoaXMuX3Njcm9sbEJhcldpZHRoKCkgPyAianNncmlkLWhlYWRlci1zY3JvbGxiYXIiIDogIiIpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCRoZWFkZXJHcmlkKTsKCiAgICAgICAgICAgIHJldHVybiAkaGVhZGVyOwogICAgICAgIH0sCgogICAgICAgIF9jcmVhdGVCb2R5OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyICRjb250ZW50ID0gdGhpcy5fY29udGVudCA9ICQoIjx0Ym9keT4iKTsKCiAgICAgICAgICAgIHZhciAkYm9keUdyaWQgPSB0aGlzLl9ib2R5R3JpZCA9ICQoIjx0YWJsZT4iKS5hZGRDbGFzcyh0aGlzLnRhYmxlQ2xhc3MpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCRjb250ZW50KTsKCiAgICAgICAgICAgIHZhciAkYm9keSA9IHRoaXMuX2JvZHkgPSAkKCI8ZGl2PiIpLmFkZENsYXNzKHRoaXMuZ3JpZEJvZHlDbGFzcykKICAgICAgICAgICAgICAgIC5hcHBlbmQojgJvZHlHcmlkKQogICAgICAgICAgICAgICAgLm9uKCJzY3JvbGwiLCAkLnByb3h5KGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9oZWFkZXIuc2Nyb2xsTGVmdChlLnRhcmdldC5zY3JvbGxMZWZ0KTsKICAgICAgICAgICAgICAgIH0sIHRoaXMpKTsKCiAgICAgICAgICAgIHJldHVybiAkYm9keTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlUGFnZXJDb250YWluZXI6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcGFnZXJDb250YWluZXIgPSB0aGlzLnBhZ2VyQ29udGFpbmVyIHx8ICQoIjxkaXY+IikuYXBwZW5kVG8odGhpcy5fY29udGFpbmVyKTsKICAgICAgICAgICAgcmV0dXJuICQocGFnZXJDb250YWluZXIpLmFkZENsYXNzKHRoaXMucGFnZXJDb250YWluZXJDbGFzcyk7CiAgICAgICAgfSwKCiAgICAgICAgX2VhY2hGaWVsZDogZnVuY3Rpb24oY2FsbEJhY2spIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAgICAgICAkLmVhY2godGhpcy5maWVsZHMsIGZ1bmN0aW9uKGluZGV4LCBmaWVsZCkgewogICAgICAgICAgICAgICAgaWYoZmllbGQudmlzaWJsZSkgewogICAgICAgICAgICAgICAgICAgIGNhbGxCYWNrLmNhbGwoc2VsZiwgZmllbGQsIGluZGV4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgX2NyZWF0ZUhlYWRlclJvdzogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmKCQuaXNGdW5jdGlvbih0aGlzLmhlYWRlclJvd1JlbmRlcmVyKSkKICAgICAgICAgICAgICAgIHJldHVybiAkKHRoaXMucmVuZGVyVGVtcGxhdGUodGhpcy5oZWFkZXJSb3dSZW5kZXJlciwgdGhpcykpOwoKICAgICAgICAgICAgdmFyICRyZXN1bHQgPSAkKCI8dHI+IikuYWRkQ2xhc3ModGhpcy5oZWFkZXJSb3dDbGFzcyk7CgogICAgICAgICAgICB0aGlzLl9lYWNoRmllbGQoZnVuY3Rpb24oZmllbGQsIGluZGV4KSB7CiAgICAgICAgICAgICAgICB2YXIgJHRoID0gdGhpcy5fcHJlcGFyZUNlbGwoIjx0aD4iLCBmaWVsZCwgImhlYWRlcmNzcyIsIHRoaXMuaGVhZGVyQ2VsbENsYXNzKQogICAgICAgICAgICAgICAgICAgIC5hcHBlbmQodGhpcy5yZW5kZXJUZW1wbGF0ZShmaWVsZC5oZWFkZXJUZW1wbGF0ZSwgZmllbGQpKQogICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkcmVzdWx0KTsKCiAgICAgICAgICAgICAgICBpZih0aGlzLnNvcnRpbmcgJiYgZmllbGQuc29ydGluZykgewogICAgICAgICAgICAgICAgICAgICR0aC5hZGRDbGFzcyh0aGlzLnNvcnRhYmxlQ2xhc3MpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vbigiY2xpY2siLCAkLnByb3h5KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3J0KGluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgIH0sCgogICAgICAgIF9wcmVwYXJlQ2VsbDogZnVuY3Rpb24oY2VsbCwgZmllbGQsIGNzc3Byb3AsIGNlbGxDbGFzcykgewogICAgICAgICAgICByZXR1cm4gJChjZWxsKS5jc3MoIndpZHRoIiwgZmllbGQud2lkdGgpCiAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoY2VsbENsYXNzIHx8IHRoaXMuY2VsbENsYXNzKQogICAgICAgICAgICAgICAgLmFkZENsYXNzKChjc3Nwcm9wICYmIGZpZWxkW2Nzc3Byb3BdKSB8fCBmaWVsZC5jc3MpCiAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoZmllbGQuYWxpZ24gPyAoImpzZ3JpZC1hbGlnbi0iICsgZmllbGQuYWxpZ24pIDogIiIpOwogICAgICAgIH0sCgogICAgICAgIF9jcmVhdGVGaWx0ZXJSb3c6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZigkLmlzRnVuY3Rpb24odGhpcy5maWx0ZXJSb3dSZW5kZXJlcikpCiAgICAgICAgICAgICAgICByZXR1cm4gJCh0aGlzLnJlbmRlclRlbXBsYXRlKHRoaXMuZmlsdGVyUm93UmVuZGVyZXIsIHRoaXMpKTsKCiAgICAgICAgICAgIHZhciAkcmVzdWx0ID0gJCgiPHRyPiIpLmFkZENsYXNzKHRoaXMuZmlsdGVyUm93Q2xhc3MpOwoKICAgICAgICAgICAgdGhpcy5fZWFjaEZpZWxkKGZ1bmN0aW9uKGZpZWxkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9wcmVwYXJlQ2VsbCgiPHRkPiIsIGZpZWxkLCAiZmlsdGVyY3NzIikKICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHRoaXMucmVuZGVyVGVtcGxhdGUoZmllbGQuZmlsdGVyVGVtcGxhdGUsIGZpZWxkKSkKICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJHJlc3VsdCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgICAgfSwKCiAgICAgICAgX2NyZWF0ZUluc2VydFJvdzogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmKCQuaXNGdW5jdGlvbih0aGlzLmluc2VydFJvd1JlbmRlcmVyKSkKICAgICAgICAgICAgICAgIHJldHVybiAkKHRoaXMucmVuZGVyVGVtcGxhdGUodGhpcy5pbnNlcnRSb3dSZW5kZXJlciwgdGhpcykpOwoKICAgICAgICAgICAgdmFyICRyZXN1bHQgPSAkKCI8dHI+IikuYWRkQ2xhc3ModGhpcy5pbnNlcnRSb3dDbGFzcyk7CgogICAgICAgICAgICB0aGlzLl9lYWNoRmllbGQoZnVuY3Rpb24oZmllbGQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVDZWxsKCI8dGQ+IiwgZmllbGQsICJpbnNlcnRjc3MiKQogICAgICAgICAgICAgICAgICAgIC5hcHBlbmQodGhpcy5yZW5kZXJUZW1wbGF0ZShmaWVsZC5pbnNlcnRUZW1wbGF0ZSwgZmllbGQpKQogICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkcmVzdWx0KTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICB9LAoKICAgICAgICBfY2FsbEV2ZW50SGFuZGxlcjogZnVuY3Rpb24oaGFuZGxlciwgZXZlbnRQYXJhbXMpIHsKICAgICAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsICQuZXh0ZW5kKGV2ZW50UGFyYW1zLCB7CiAgICAgICAgICAgICAgICBncmlkOiB0aGlzCiAgICAgICAgICAgIH0pKTsKCiAgICAgICAgICAgIHJldHVybiBldmVudFBhcmFtczsKICAgICAgICB9LAoKICAgICAgICByZXNldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMuX3Jlc2V0U29ydGluZygpOwogICAgICAgICAgICB0aGlzLl9yZXNldFBhZ2VyKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9sb2FkU3RyYXRlZ3kucmVzZXQoKTsKICAgICAgICB9LAoKICAgICAgICBfcmVzZXRQYWdlcjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMuX2ZpcnN0RGlzcGxheWluZ1BhZ2UgPSAxOwogICAgICAgICAgICB0aGlzLl9zZXRQYWdlKDEpOwogICAgICAgIH0sCgogICAgICAgIF9yZXNldFNvcnRpbmc6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB0aGlzLl9zb3J0RmllbGQgPSBudWxsOwogICAgICAgICAgICB0aGlzLl9zb3J0T3JkZXIgPSBTT1JUX09SREVSX0FTQzsKICAgICAgICAgICAgdGhpcy5fY2xlYXJTb3J0aW5nQ3NzKCk7CiAgICAgICAgfSwKCiAgICAgICAgcmVmcmVzaDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMuX2NhbGxFdmVudEhhbmRsZXIodGhpcy5vblJlZnJlc2hpbmcpOwoKICAgICAgICAgICAgdGhpcy5jYW5jZWxFZGl0KCk7CgogICAgICAgICAgICB0aGlzLl9yZWZyZXNoSGVhZGluZygpOwogICAgICAgICAgICB0aGlzLl9yZWZyZXNoRmlsdGVyaW5nKCk7CiAgICAgICAgICAgIHRoaXMuX3JlZnJlc2hJbnNlcnRpbmcoKTsKICAgICAgICAgICAgdGhpcy5fcmVmcmVzaENvbnRlbnQoKTsKICAgICAgICAgICAgdGhpcy5fcmVmcmVzaFBhZ2VyKCk7CiAgICAgICAgICAgIHRoaXMuX3JlZnJlc2hTaXplKCk7CgogICAgICAgICAgICB0aGlzLl9jYWxsRXZlbnRIYW5kbGVyKHRoaXMub25SZWZyZXNoZWQpOwogICAgICAgIH0sCgogICAgICAgIF9yZWZyZXNoSGVhZGluZzogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMuX2hlYWRlclJvdy50b2dnbGUodGhpcy5oZWFkaW5nKTsKICAgICAgICB9LAoKICAgICAgICBfcmVmcmVzaEZpbHRlcmluZzogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMuX2ZpbHRlclJvdy50b2dnbGUodGhpcy5maWx0ZXJpbmcpOwogICAgICAgIH0sCgogICAgICAgIF9yZWZyZXNoSW5zZXJ0aW5nOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdGhpcy5faW5zZXJ0Um93LnRvZ2dsZSh0aGlzLmluc2VydGluZyk7CiAgICAgICAgfSwKCiAgICAgICAgX3JlZnJlc2hDb250ZW50OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyICRjb250ZW50ID0gdGhpcy5fY29udGVudDsKICAgICAgICAgICAgjgNvbnRlbnQuZW1wdHkoKTsKCiAgICAgICAgICAgIGlmKCF0aGlzLmRhdGEubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAkY29udGVudC5hcHBlbmQodGhpcy5fY3JlYXRlTm9EYXRhUm93KCkpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBpbmRleEZyb20gPSB0aGlzLl9sb2FkU3RyYXRlZ3kuZmlyc3REaXNwbGF5SW5kZXgoKTsKICAgICAgICAgICAgdmFyIGluZGV4VG8gPSB0aGlzLl9sb2FkU3RyYXRlZ3kubGFzdERpc3BsYXlJbmRleCgpOwoKICAgICAgICAgICAgZm9yKHZhciBpdGVtSW5kZXggPSBpbmRleEZyb207IGl0ZW1JbmRleCA8IGluZGV4VG87IGl0ZW1JbmRleCsrKSB7CiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuZGF0YVtpdGVtSW5kZXhdOwogICAgICAgICAgICAgICAgjgNvbnRlbnQuYXBwZW5kKHRoaXMuX2NyZWF0ZVJvdyhpdGVtLCBpdGVtSW5kZXgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9jcmVhdGVOb0RhdGFSb3c6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgYW1vdW50T2ZGaWVsZHMgPSAwOwogICAgICAgICAgICB0aGlzLl9lYWNoRmllbGQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBhbW91bnRPZkZpZWxkcysrOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiAkKCI8dHI+IikuYWRkQ2xhc3ModGhpcy5ub0RhdGFSb3dDbGFzcykKICAgICAgICAgICAgICAgIC5hcHBlbmQoJCgiPHRkPiIpLmFkZENsYXNzKHRoaXMuY2VsbENsYXNzKS5hdHRyKCJjb2xzcGFuIiwgYW1vdW50T2ZGaWVsZHMpCiAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCh0aGlzLnJlbmRlclRlbXBsYXRlKHRoaXMubm9EYXRhQ29udGVudCwgdGhpcykpKTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlUm93OiBmdW5jdGlvbihpdGVtLCBpdGVtSW5kZXgpIHsKICAgICAgICAgICAgdmFyICRyZXN1bHQ7CgogICAgICAgICAgICBpZigkLmlzRnVuY3Rpb24odGhpcy5yb3dSZW5kZXJlcikpIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSB0aGlzLnJlbmRlclRlbXBsYXRlKHRoaXMucm93UmVuZGVyZXIsIHRoaXMsIHsgaXRlbTogaXRlbSwgaXRlbUluZGV4OiBpdGVtSW5kZXggfSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJCgiPHRyPiIpOwogICAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyQ2VsbHMoJHJlc3VsdCwgaXRlbSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRyZXN1bHQuYWRkQ2xhc3ModGhpcy5fZ2V0Um93Q2xhc3NlcyhpdGVtLCBpdGVtSW5kZXgpKQogICAgICAgICAgICAgICAgLmRhdGEoSlNHUklEX1JPV19EQVRBX0tFWSwgaXRlbSkKICAgICAgICAgICAgICAgIC5vbigiY2xpY2siLCAkLnByb3h5KGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd0NsaWNrKHsKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbTogaXRlbSwKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUluZGV4OiBpdGVtSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiBlCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LCB0aGlzKSkKICAgICAgICAgICAgICAgIC5vbigiZGJsY2xpY2siLCAkLnByb3h5KGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd0RvdWJsZUNsaWNrKHsKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbTogaXRlbSwKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUluZGV4OiBpdGVtSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiBlCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LCB0aGlzKSk7CgogICAgICAgICAgICBpZih0aGlzLnNlbGVjdGluZykgewogICAgICAgICAgICAgICAgdGhpcy5fYXR0YWNoUm93SG92ZXIoJHJlc3VsdCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgIH0sCgogICAgICAgIF9nZXRSb3dDbGFzc2VzOiBmdW5jdGlvbihpdGVtLCBpdGVtSW5kZXgpIHsKICAgICAgICAgICAgdmFyIGNsYXNzZXMgPSBbXTsKICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCgoaXRlbUluZGV4ICsgMSkgJSAyKSA/IHRoaXMub2RkUm93Q2xhc3MgOiB0aGlzLmV2ZW5Sb3dDbGFzcyk7CiAgICAgICAgICAgIGNsYXNzZXMucHVzaChnZXRPckFwcGx5KHRoaXMucm93Q2xhc3MsIHRoaXMsIGl0ZW0sIGl0ZW1JbmRleCkpOwogICAgICAgICAgICByZXR1cm4gY2xhc3Nlcy5qb2luKCIgIik7CiAgICAgICAgfSwKCiAgICAgICAgX2F0dGFjaFJvd0hvdmVyOiBmdW5jdGlvbigkcm93KSB7CiAgICAgICAgICAgIHZhciBzZWxlY3RlZFJvd0NsYXNzID0gdGhpcy5zZWxlY3RlZFJvd0NsYXNzOwogICAgICAgICAgICAkcm93LmhvdmVyKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3Moc2VsZWN0ZWRSb3dDbGFzcyk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcyhzZWxlY3RlZFJvd0NsYXNzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyQ2VsbHM6IGZ1bmN0aW9uKCRyb3csIGl0ZW0pIHsKICAgICAgICAgICAgdGhpcy5fZWFjaEZpZWxkKGZ1bmN0aW9uKGZpZWxkKSB7CiAgICAgICAgICAgICAgICAkcm93LmFwcGVuZCh0aGlzLl9jcmVhdGVDZWxsKGl0ZW0sIGZpZWxkKSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlQ2VsbDogZnVuY3Rpb24oaXRlbSwgZmllbGQpIHsKICAgICAgICAgICAgdmFyICRyZXN1bHQ7CiAgICAgICAgICAgIHZhciBmaWVsZFZhbHVlID0gdGhpcy5fZ2V0SXRlbUZpZWxkVmFsdWUoaXRlbSwgZmllbGQpOwoKICAgICAgICAgICAgdmFyIGFyZ3MgPSB7IHZhbHVlOiBmaWVsZFZhbHVlLCBpdGVtIDogaXRlbSB9OwogICAgICAgICAgICBpZigkLmlzRnVuY3Rpb24oZmllbGQuY2VsbFJlbmRlcmVyKSkgewogICAgICAgICAgICAgICAgJHJlc3VsdCA9IHRoaXMucmVuZGVyVGVtcGxhdGUoZmllbGQuY2VsbFJlbmRlcmVyLCBmaWVsZCwgYXJncyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJCgiPHRkPiIpLmFwcGVuZCh0aGlzLnJlbmRlclRlbXBsYXRlKGZpZWxkLml0ZW1UZW1wbGF0ZSB8fCBmaWVsZFZhbHVlLCBmaWVsZCwgYXJncykpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJlcGFyZUNlbGwoJHJlc3VsdCwgZmllbGQpOwogICAgICAgIH0sCgogICAgICAgIF9nZXRJdGVtRmllbGRWYWx1ZTogZnVuY3Rpb24oaXRlbSwgZmllbGQpIHsKICAgICAgICAgICAgdmFyIHByb3BzID0gZmllbGQubmFtZS5zcGxpdCgnLicpOwogICAgICAgICAgICB2YXIgcmVzdWx0ID0gaXRlbVtwcm9wcy5zaGlmdCgpXTsKCiAgICAgICAgICAgIHdoaWxlKHJlc3VsdCAmJiBwcm9wcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdFtwcm9wcy5zaGlmdCgpXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9LAoKICAgICAgICBfc2V0SXRlbUZpZWxkVmFsdWU6IGZ1bmN0aW9uKGl0ZW0sIGZpZWxkLCB2YWx1ZSkgewogICAgICAgICAgICB2YXIgcHJvcHMgPSBmaWVsZC5uYW1lLnNwbGl0KCcuJyk7CiAgICAgICAgICAgIHZhciBjdXJyZW50ID0gaXRlbTsKICAgICAgICAgICAgdmFyIHByb3AgPSBwcm9wc1swXTsKCiAgICAgICAgICAgIHdoaWxlKGN1cnJlbnQgJiYgcHJvcHMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBpdGVtID0gY3VycmVudDsKICAgICAgICAgICAgICAgIHByb3AgPSBwcm9wcy5zaGlmdCgpOwogICAgICAgICAgICAgICAgY3VycmVudCA9IGl0ZW1bcHJvcF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKCFjdXJyZW50KSB7CiAgICAgICAgICAgICAgICB3aGlsZShwcm9wcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBpdGVtID0gaXRlbVtwcm9wXSA9IHt9OwogICAgICAgICAgICAgICAgICAgIHByb3AgPSBwcm9wcy5zaGlmdCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpdGVtW3Byb3BdID0gdmFsdWU7CiAgICAgICAgfSwKCiAgICAgICAgc29ydDogZnVuY3Rpb24oZmllbGQsIG9yZGVyKSB7CiAgICAgICAgICAgIGlmKCQuaXNQbGFpbk9iamVjdChmaWVsZCkpIHsKICAgICAgICAgICAgICAgIG9yZGVyID0gZmllbGQub3JkZXI7CiAgICAgICAgICAgICAgICBmaWVsZCA9IGZpZWxkLmZpZWxkOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLl9jbGVhclNvcnRpbmdDc3MoKTsKICAgICAgICAgICAgdGhpcy5fc2V0U29ydGluZ1BhcmFtcyhmaWVsZCwgb3JkZXIpOwogICAgICAgICAgICB0aGlzLl9zZXRTb3J0aW5nQ3NzKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9sb2FkU3RyYXRlZ3kuc29ydCgpOwogICAgICAgIH0sCgogICAgICAgIF9jbGVhclNvcnRpbmdDc3M6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB0aGlzLl9oZWFkZXJSb3cuZmluZCgidGgiKQogICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKHRoaXMuc29ydEFzY0NsYXNzKQogICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKHRoaXMuc29ydERlc2NDbGFzcyk7CiAgICAgICAgfSwKCiAgICAgICAgX3NldFNvcnRpbmdQYXJhbXM6IGZ1bmN0aW9uKGZpZWxkLCBvcmRlcikgewogICAgICAgICAgICBmaWVsZCA9IHRoaXMuX25vcm1hbGl6ZUZpZWxkKGZpZWxkKTsKICAgICAgICAgICAgb3JkZXIgPSBvcmRlciB8fCAoKHRoaXMuX3NvcnRGaWVsZCA9PT0gZmllbGQpID8gdGhpcy5fcmV2ZXJzZWRTb3J0T3JkZXIodGhpcy5fc29ydE9yZGVyKSA6IFNPUlRfT1JERVJfQVNDKTsKCiAgICAgICAgICAgIHRoaXMuX3NvcnRGaWVsZCA9IGZpZWxkOwogICAgICAgICAgICB0aGlzLl9zb3J0T3JkZXIgPSBvcmRlcjsKICAgICAgICB9LAoKICAgICAgICBfbm9ybWFsaXplRmllbGQ6IGZ1bmN0aW9uKGZpZWxkKSB7CiAgICAgICAgICAgIGlmKCQuaXNOdW1lcmljKGZpZWxkKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmllbGRzW2ZpZWxkXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYodHlwZW9mIGZpZWxkID09PSAic3RyaW5nIikgewogICAgICAgICAgICAgICAgcmV0dXJuICQuZ3JlcCh0aGlzLmZpZWxkcywgZnVuY3Rpb24oZikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmLm5hbWUgPT09IGZpZWxkOwogICAgICAgICAgICAgICAgfSlbMF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBmaWVsZDsKICAgICAgICB9LAoKICAgICAgICBfcmV2ZXJzZWRTb3J0T3JkZXI6IGZ1bmN0aW9uKG9yZGVyKSB7CiAgICAgICAgICAgIHJldHVybiAob3JkZXIgPT09IFNPUlRfT1JERVJfQVNDID8gU09SVF9PUkRFUl9ERVNDIDogU09SVF9PUkRFUl9BU0MpOwogICAgICAgIH0sCgogICAgICAgIF9zZXRTb3J0aW5nQ3NzOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGZpZWxkSW5kZXggPSB0aGlzLl92aXNpYmxlRmllbGRJbmRleCh0aGlzLl9zb3J0RmllbGQpOwoKICAgICAgICAgICAgdGhpcy5faGVhZGVyUm93LmZpbmQoInRoIikuZXEoZmllbGRJbmRleCkKICAgICAgICAgICAgICAgIC5hZGRDbGFzcyh0aGlzLl9zb3J0T3JkZXIgPT09IFNPUlRfT1JERVJfQVNDID8gdGhpcy5zb3J0QXNjQ2xhc3MgOiB0aGlzLnNvcnREZXNjQ2xhc3MpOwogICAgICAgIH0sCgogICAgICAgIF92aXNpYmxlRmllbGRJbmRleDogZnVuY3Rpb24oZmllbGQpIHsKICAgICAgICAgICAgcmV0dXJuICQuaW5BcnJheShmaWVsZCwgJC5ncmVwKHRoaXMuZmllbGRzLCBmdW5jdGlvbihmKSB7IHJldHVybiBmLnZpc2libGU7IH0pKTsKICAgICAgICB9LAoKICAgICAgICBfc29ydERhdGE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgc29ydEZhY3RvciA9IHRoaXMuX3NvcnRGYWN0b3IoKSwKICAgICAgICAgICAgICAgIHNvcnRGaWVsZCA9IHRoaXMuX3NvcnRGaWVsZDsKCiAgICAgICAgICAgIGlmKHNvcnRGaWVsZCkgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhLnNvcnQoZnVuY3Rpb24oaXRlbTEsIGl0ZW0yKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvcnRGYWN0b3IgKiBzb3J0RmllbGQuc29ydGluZ0Z1bmMoaXRlbTFbc29ydEZpZWxkLm5hbWVdLCBpdGVtMltzb3J0RmllbGQubmFtZV0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfc29ydEZhY3RvcjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zb3J0T3JkZXIgPT09IFNPUlRfT1JERVJfQVNDID8gMSA6IC0xOwogICAgICAgIH0sCgogICAgICAgIF9pdGVtc0NvdW50OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRTdHJhdGVneS5pdGVtc0NvdW50KCk7CiAgICAgICAgfSwKCiAgICAgICAgX3BhZ2VzQ291bnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgaXRlbXNDb3VudCA9IHRoaXMuX2l0ZW1zQ291bnQoKSwKICAgICAgICAgICAgICAgIHBhZ2VTaXplID0gdGhpcy5wYWdlU2l6ZTsKICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoaXRlbXNDb3VudCAvIHBhZ2VTaXplKSArIChpdGVtc0NvdW50ICUgcGFnZVNpemUgPyAxIDogMCk7CiAgICAgICAgfSwKCiAgICAgICAgX3JlZnJlc2hQYWdlcjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciAkcGFnZXJDb250YWluZXIgPSB0aGlzLl9wYWdlckNvbnRhaW5lcjsKICAgICAgICAgICAgJHBhZ2VyQ29udGFpbmVyLmVtcHR5KCk7CgogICAgICAgICAgICBpZih0aGlzLnBhZ2luZykgewogICAgICAgICAgICAgICAgJHBhZ2VyQ29udGFpbmVyLmFwcGVuZCh0aGlzLl9jcmVhdGVQYWdlcigpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHNob3dQYWdlciA9IHRoaXMucGFnaW5nICYmIHRoaXMuX3BhZ2VzQ291bnQoKSA+IDE7CiAgICAgICAgICAgICRwYWdlckNvbnRhaW5lci50b2dnbGUoc2hvd1BhZ2VyKTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlUGFnZXI6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgJHJlc3VsdDsKCiAgICAgICAgICAgIGlmKCQuaXNGdW5jdGlvbih0aGlzLnBhZ2VyUmVuZGVyZXIpKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJCh0aGlzLnBhZ2VyUmVuZGVyZXIoewogICAgICAgICAgICAgICAgICAgIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgcGFnZUNvdW50OiB0aGlzLl9wYWdlc0NvdW50KCkKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkKCI8ZGl2PiIpLmFwcGVuZCh0aGlzLl9jcmVhdGVQYWdlckJ5Rm9ybWF0KCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkcmVzdWx0LmFkZENsYXNzKHRoaXMucGFnZXJDbGFzcyk7CgogICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlUGFnZXJCeUZvcm1hdDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBwYWdlSW5kZXggPSB0aGlzLnBhZ2VJbmRleCwKICAgICAgICAgICAgICAgIHBhZ2VDb3VudCA9IHRoaXMuX3BhZ2VzQ291bnQoKSwKICAgICAgICAgICAgICAgIGl0ZW1Db3VudCA9IHRoaXMuX2l0ZW1zQ291bnQoKSwKICAgICAgICAgICAgICAgIHBhZ2VyUGFydHMgPSB0aGlzLnBhZ2VyRm9ybWF0LnNwbGl0KCIgIik7CgogICAgICAgICAgICByZXR1cm4gJC5tYXAocGFnZXJQYXJ0cywgJC5wcm94eShmdW5jdGlvbihwYWdlclBhcnQpIHsKICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBwYWdlclBhcnQ7CgogICAgICAgICAgICAgICAgaWYocGFnZXJQYXJ0ID09PSBQQUdFU19QTEFDRUhPTERFUikgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuX2NyZWF0ZVBhZ2VzKCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYocGFnZXJQYXJ0ID09PSBGSVJTVF9QQUdFX1BMQUNFSE9MREVSKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5fY3JlYXRlUGFnZXJOYXZCdXR0b24odGhpcy5wYWdlRmlyc3RUZXh0LCAxLCBwYWdlSW5kZXggPiAxKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZihwYWdlclBhcnQgPT09IFBSRVZfUEFHRV9QTEFDRUhPTERFUikgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuX2NyZWF0ZVBhZ2VyTmF2QnV0dG9uKHRoaXMucGFnZVByZXZUZXh0LCBwYWdlSW5kZXggLSAxLCBwYWdlSW5kZXggPiAxKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZihwYWdlclBhcnQgPT09IE5FWFRfUEFHRV9QTEFDRUhPTERFUikgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuX2NyZWF0ZVBhZ2VyTmF2QnV0dG9uKHRoaXMucGFnZU5leHRUZXh0LCBwYWdlSW5kZXggKyAxLCBwYWdlSW5kZXggPCBwYWdlQ291bnQpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmKHBhZ2VyUGFydCA9PT0gTEFTVF9QQUdFX1BMQUNFSE9MREVSKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5fY3JlYXRlUGFnZXJOYXZCdXR0b24odGhpcy5wYWdlTGFzdFRleHQsIHBhZ2VDb3VudCwgcGFnZUluZGV4IDwgcGFnZUNvdW50KTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZihwYWdlclBhcnQgPT09IFBBR0VfSU5ERVhfUExBQ0VIT0xERVIpIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBwYWdlSW5kZXg7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYocGFnZXJQYXJ0ID09PSBQQUdFX0NPVU5UX1BMQUNFSE9MREVSKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcGFnZUNvdW50OwogICAgICAgICAgICAgICAgfSBlbHNlIGlmKHBhZ2VyUGFydCA9PT0gSVRFTV9DT1VOVF9QTEFDRUhPTERFUikgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGl0ZW1Db3VudDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gJC5pc0FycmF5KHJlc3VsdCkgPyByZXN1bHQuY29uY2F0KFsiICJdKSA6IFtyZXN1bHQsICIgIl07CiAgICAgICAgICAgIH0sIHRoaXMpKTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlUGFnZXM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcGFnZUNvdW50ID0gdGhpcy5fcGFnZXNDb3VudCgpLAogICAgICAgICAgICAgICAgcGFnZUJ1dHRvbkNvdW50ID0gdGhpcy5wYWdlQnV0dG9uQ291bnQsCiAgICAgICAgICAgICAgICBmaXJzdERpc3BsYXlpbmdQYWdlID0gdGhpcy5fZmlyc3REaXNwbGF5aW5nUGFnZSwKICAgICAgICAgICAgICAgIHBhZ2VzID0gW107CgogICAgICAgICAgICBpZihmaXJzdERpc3BsYXlpbmdQYWdlID4gMSkgewogICAgICAgICAgICAgICAgcGFnZXMucHVzaCh0aGlzLl9jcmVhdGVQYWdlclBhZ2VOYXZCdXR0b24odGhpcy5wYWdlTmF2aWdhdG9yUHJldlRleHQsIHRoaXMuc2hvd1ByZXZQYWdlcykpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IodmFyIGkgPSAwLCBwYWdlTnVtYmVyID0gZmlyc3REaXNwbGF5aW5nUGFnZTsgaSA8IHBhZ2VCdXR0b25Db3VudCAmJiBwYWdlTnVtYmVyIDw9IHBhZ2VDb3VudDsgaSsrLCBwYWdlTnVtYmVyKyspIHsKICAgICAgICAgICAgICAgIHBhZ2VzLnB1c2gocGFnZU51bWJlciA9PT0gdGhpcy5wYWdlSW5kZXgKICAgICAgICAgICAgICAgICAgICA/IHRoaXMuX2NyZWF0ZVBhZ2VyQ3VycmVudFBhZ2UoKQogICAgICAgICAgICAgICAgICAgIDogdGhpcy5fY3JlYXRlUGFnZXJQYWdlKHBhZ2VOdW1iZXIpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYoKGZpcnN0RGlzcGxheWluZ1BhZ2UgKyBwYWdlQnV0dG9uQ291bnQgLSAxKSA8IHBhZ2VDb3VudCkgewogICAgICAgICAgICAgICAgcGFnZXMucHVzaCh0aGlzLl9jcmVhdGVQYWdlclBhZ2VOYXZCdXR0b24odGhpcy5wYWdlTmF2aWdhdG9yTmV4dFRleHQsIHRoaXMuc2hvd05leHRQYWdlcykpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcGFnZXM7CiAgICAgICAgfSwKCiAgICAgICAgX2NyZWF0ZVBhZ2VyTmF2QnV0dG9uOiBmdW5jdGlvbih0ZXh0LCBwYWdlSW5kZXgsIGlzQWN0aXZlKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVQYWdlckJ1dHRvbih0ZXh0LCB0aGlzLnBhZ2VyTmF2QnV0dG9uQ2xhc3MgKyAoaXNBY3RpdmUgPyAiIiA6ICIgIiArIHRoaXMucGFnZXJOYXZCdXR0b25JbmFjdGl2ZUNsYXNzKSwKICAgICAgICAgICAgICAgIGlzQWN0aXZlID8gZnVuY3Rpb24oKSB7IHRoaXMub3BlblBhZ2UocGFnZUluZGV4KTsgfSA6ICQubm9vcCk7CiAgICAgICAgfSwKCiAgICAgICAgX2NyZWF0ZVBhZ2VyUGFnZU5hdkJ1dHRvbjogZnVuY3Rpb24odGV4dCwgaGFuZGxlcikgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fY3JlYXRlUGFnZXJCdXR0b24odGV4dCwgdGhpcy5wYWdlck5hdkJ1dHRvbkNsYXNzLCBoYW5kbGVyKTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlUGFnZXJQYWdlOiBmdW5jdGlvbihwYWdlSW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZVBhZ2VyQnV0dG9uKHBhZ2VJbmRleCwgdGhpcy5wYWdlQ2xhc3MsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdGhpcy5vcGVuUGFnZShwYWdlSW5kZXgpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlUGFnZXJCdXR0b246IGZ1bmN0aW9uKHRleHQsIGNzcywgaGFuZGxlcikgewogICAgICAgICAgICB2YXIgjgxpbmsgPSAkKCI8YT4iKS5hdHRyKCJocmVmIiwgRU1QVFlfSFJFRikKICAgICAgICAgICAgICAgIC5odG1sKHRleHQpCiAgICAgICAgICAgICAgICAub24oImNsaWNrIiwgJC5wcm94eShoYW5kbGVyLCB0aGlzKSk7CgogICAgICAgICAgICByZXR1cm4gJCgiPHNwYW4+IikuYWRkQ2xhc3MoY3NzKS5hcHBlbmQojgxpbmspOwogICAgICAgIH0sCgogICAgICAgIF9jcmVhdGVQYWdlckN1cnJlbnRQYWdlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICQoIjxzcGFuPiIpCiAgICAgICAgICAgICAgICAuYWRkQ2xhc3ModGhpcy5wYWdlQ2xhc3MpCiAgICAgICAgICAgICAgICAuYWRkQ2xhc3ModGhpcy5jdXJyZW50UGFnZUNsYXNzKQogICAgICAgICAgICAgICAgLnRleHQodGhpcy5wYWdlSW5kZXgpOwogICAgICAgIH0sCgogICAgICAgIF9yZWZyZXNoU2l6ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMuX3JlZnJlc2hIZWlnaHQoKTsKICAgICAgICAgICAgdGhpcy5fcmVmcmVzaFdpZHRoKCk7CiAgICAgICAgfSwKCiAgICAgICAgX3JlZnJlc2hXaWR0aDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciB3aWR0aCA9ICh0aGlzLndpZHRoID09PSAiYXV0byIpID8gdGhpcy5fZ2V0QXV0b1dpZHRoKCkgOiB0aGlzLndpZHRoOwoKICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLndpZHRoKHdpZHRoKTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0QXV0b1dpZHRoOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyICRoZWFkZXJHcmlkID0gdGhpcy5faGVhZGVyR3JpZCwKICAgICAgICAgICAgICAgICRoZWFkZXIgPSB0aGlzLl9oZWFkZXI7CgogICAgICAgICAgICAkaGVhZGVyR3JpZC53aWR0aCgiYXV0byIpOwoKICAgICAgICAgICAgdmFyIGNvbnRlbnRXaWR0aCA9ICRoZWFkZXJHcmlkLm91dGVyV2lkdGgoKTsKICAgICAgICAgICAgdmFyIGJvcmRlcldpZHRoID0gjghlYWRlci5vdXRlcldpZHRoKCkgLSAkaGVhZGVyLmlubmVyV2lkdGgoKTsKCiAgICAgICAgICAgICRoZWFkZXJHcmlkLndpZHRoKCIiKTsKCiAgICAgICAgICAgIHJldHVybiBjb250ZW50V2lkdGggKyBib3JkZXJXaWR0aDsKICAgICAgICB9LAoKICAgICAgICBfc2Nyb2xsQmFyV2lkdGg6IChmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHJlc3VsdDsKCiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGlmKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyICRnaG9zdENvbnRhaW5lciA9ICQoIjxkaXYgc3R5bGU9J3dpZHRoOjUwcHg7aGVpZ2h0OjUwcHg7b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOmFic29sdXRlO3RvcDotMTAwMDBweDtsZWZ0Oi0xMDAwMHB4Oyc+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICAgICAgdmFyICRnaG9zdENvbnRlbnQgPSAkKCI8ZGl2IHN0eWxlPSdoZWlnaHQ6MTAwcHg7Jz48L2Rpdj4iKTsKICAgICAgICAgICAgICAgICAgICAkZ2hvc3RDb250YWluZXIuYXBwZW5kKCRnaG9zdENvbnRlbnQpLmFwcGVuZFRvKCJib2R5Iik7CiAgICAgICAgICAgICAgICAgICAgdmFyIHdpZHRoID0gjgdob3N0Q29udGVudC5pbm5lcldpZHRoKCk7CiAgICAgICAgICAgICAgICAgICAgjgdob3N0Q29udGFpbmVyLmNzcygib3ZlcmZsb3cteSIsICJhdXRvIik7CiAgICAgICAgICAgICAgICAgICAgdmFyIHdpZHRoRXhjbHVkaW5nU2Nyb2xsQmFyID0gjgdob3N0Q29udGVudC5pbm5lcldpZHRoKCk7CiAgICAgICAgICAgICAgICAgICAgjgdob3N0Q29udGFpbmVyLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHdpZHRoIC0gd2lkdGhFeGNsdWRpbmdTY3JvbGxCYXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9OwogICAgICAgIH0pKCksCgogICAgICAgIF9yZWZyZXNoSGVpZ2h0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuX2NvbnRhaW5lciwKICAgICAgICAgICAgICAgIHBhZ2VyQ29udGFpbmVyID0gdGhpcy5fcGFnZXJDb250YWluZXIsCiAgICAgICAgICAgICAgICBoZWlnaHQgPSB0aGlzLmhlaWdodCwKICAgICAgICAgICAgICAgIG5vbkJvZHlIZWlnaHQ7CgogICAgICAgICAgICBjb250YWluZXIuaGVpZ2h0KGhlaWdodCk7CgogICAgICAgICAgICBpZihoZWlnaHQgIT09ICJhdXRvIikgewogICAgICAgICAgICAgICAgaGVpZ2h0ID0gY29udGFpbmVyLmhlaWdodCgpOwoKICAgICAgICAgICAgICAgIG5vbkJvZHlIZWlnaHQgPSB0aGlzLl9oZWFkZXIub3V0ZXJIZWlnaHQodHJ1ZSk7CiAgICAgICAgICAgICAgICBpZihwYWdlckNvbnRhaW5lci5wYXJlbnRzKGNvbnRhaW5lcikubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgbm9uQm9keUhlaWdodCArPSBwYWdlckNvbnRhaW5lci5vdXRlckhlaWdodCh0cnVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLl9ib2R5Lm91dGVySGVpZ2h0KGhlaWdodCAtIG5vbkJvZHlIZWlnaHQpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgc2hvd1ByZXZQYWdlczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmaXJzdERpc3BsYXlpbmdQYWdlID0gdGhpcy5fZmlyc3REaXNwbGF5aW5nUGFnZSwKICAgICAgICAgICAgICAgIHBhZ2VCdXR0b25Db3VudCA9IHRoaXMucGFnZUJ1dHRvbkNvdW50OwoKICAgICAgICAgICAgdGhpcy5fZmlyc3REaXNwbGF5aW5nUGFnZSA9IChmaXJzdERpc3BsYXlpbmdQYWdlID4gcGFnZUJ1dHRvbkNvdW50KSA/IGZpcnN0RGlzcGxheWluZ1BhZ2UgLSBwYWdlQnV0dG9uQ291bnQgOiAxOwoKICAgICAgICAgICAgdGhpcy5fcmVmcmVzaFBhZ2VyKCk7CiAgICAgICAgfSwKCiAgICAgICAgc2hvd05leHRQYWdlczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmaXJzdERpc3BsYXlpbmdQYWdlID0gdGhpcy5fZmlyc3REaXNwbGF5aW5nUGFnZSwKICAgICAgICAgICAgICAgIHBhZ2VCdXR0b25Db3VudCA9IHRoaXMucGFnZUJ1dHRvbkNvdW50LAogICAgICAgICAgICAgICAgcGFnZUNvdW50ID0gdGhpcy5fcGFnZXNDb3VudCgpOwoKICAgICAgICAgICAgdGhpcy5fZmlyc3REaXNwbGF5aW5nUGFnZSA9IChmaXJzdERpc3BsYXlpbmdQYWdlICsgMiAqIHBhZ2VCdXR0b25Db3VudCA+IHBhZ2VDb3VudCkKICAgICAgICAgICAgICAgID8gcGFnZUNvdW50IC0gcGFnZUJ1dHRvbkNvdW50ICsgMQogICAgICAgICAgICAgICAgOiBmaXJzdERpc3BsYXlpbmdQYWdlICsgcGFnZUJ1dHRvbkNvdW50OwoKICAgICAgICAgICAgdGhpcy5fcmVmcmVzaFBhZ2VyKCk7CiAgICAgICAgfSwKCiAgICAgICAgb3BlblBhZ2U6IGZ1bmN0aW9uKHBhZ2VJbmRleCkgewogICAgICAgICAgICBpZihwYWdlSW5kZXggPCAxIHx8IHBhZ2VJbmRleCA+IHRoaXMuX3BhZ2VzQ291bnQoKSkKICAgICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgICAgIHRoaXMuX3NldFBhZ2UocGFnZUluZGV4KTsKICAgICAgICAgICAgdGhpcy5fbG9hZFN0cmF0ZWd5Lm9wZW5QYWdlKHBhZ2VJbmRleCk7CiAgICAgICAgfSwKCiAgICAgICAgX3NldFBhZ2U6IGZ1bmN0aW9uKHBhZ2VJbmRleCkgewogICAgICAgICAgICB2YXIgZmlyc3REaXNwbGF5aW5nUGFnZSA9IHRoaXMuX2ZpcnN0RGlzcGxheWluZ1BhZ2UsCiAgICAgICAgICAgICAgICBwYWdlQnV0dG9uQ291bnQgPSB0aGlzLnBhZ2VCdXR0b25Db3VudDsKCiAgICAgICAgICAgIHRoaXMucGFnZUluZGV4ID0gcGFnZUluZGV4OwoKICAgICAgICAgICAgaWYocGFnZUluZGV4IDwgZmlyc3REaXNwbGF5aW5nUGFnZSkgewogICAgICAgICAgICAgICAgdGhpcy5fZmlyc3REaXNwbGF5aW5nUGFnZSA9IHBhZ2VJbmRleDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYocGFnZUluZGV4ID4gZmlyc3REaXNwbGF5aW5nUGFnZSArIHBhZ2VCdXR0b25Db3VudCAtIDEpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2ZpcnN0RGlzcGxheWluZ1BhZ2UgPSBwYWdlSW5kZXggLSBwYWdlQnV0dG9uQ291bnQgKyAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLl9jYWxsRXZlbnRIYW5kbGVyKHRoaXMub25QYWdlQ2hhbmdlZCwgewogICAgICAgICAgICAgICAgcGFnZUluZGV4OiBwYWdlSW5kZXgKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgX2NvbnRyb2xsZXJDYWxsOiBmdW5jdGlvbihtZXRob2QsIHBhcmFtLCBpc0NhbmNlbGVkLCBkb25lQ2FsbGJhY2spIHsKICAgICAgICAgICAgaWYoaXNDYW5jZWxlZCkKICAgICAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVqZWN0KCkucHJvbWlzZSgpOwoKICAgICAgICAgICAgdGhpcy5fc2hvd0xvYWRpbmcoKTsKCiAgICAgICAgICAgIHZhciBjb250cm9sbGVyID0gdGhpcy5fY29udHJvbGxlcjsKICAgICAgICAgICAgaWYoIWNvbnRyb2xsZXIgfHwgIWNvbnRyb2xsZXJbbWV0aG9kXSkgewogICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoImNvbnRyb2xsZXIgaGFzIG5vIG1ldGhvZCAnIiArIG1ldGhvZCArICInIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBub3JtYWxpemVQcm9taXNlKGNvbnRyb2xsZXJbbWV0aG9kXShwYXJhbSkpCiAgICAgICAgICAgICAgICAuZG9uZSgkLnByb3h5KGRvbmVDYWxsYmFjaywgdGhpcykpCiAgICAgICAgICAgICAgICAuZmFpbCgkLnByb3h5KHRoaXMuX2Vycm9ySGFuZGxlciwgdGhpcykpCiAgICAgICAgICAgICAgICAuYWx3YXlzKCQucHJveHkodGhpcy5faGlkZUxvYWRpbmcsIHRoaXMpKTsKICAgICAgICB9LAoKICAgICAgICBfZXJyb3JIYW5kbGVyOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdGhpcy5fY2FsbEV2ZW50SGFuZGxlcih0aGlzLm9uRXJyb3IsIHsKICAgICAgICAgICAgICAgIGFyZ3M6ICQubWFrZUFycmF5KGFyZ3VtZW50cykKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgX3Nob3dMb2FkaW5nOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYoIXRoaXMubG9hZEluZGljYXRpb24pCiAgICAgICAgICAgICAgICByZXR1cm47CgogICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fbG9hZGluZ1RpbWVyKTsKCiAgICAgICAgICAgIHRoaXMuX2xvYWRpbmdUaW1lciA9IHNldFRpbWVvdXQoJC5wcm94eShmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRJbmRpY2F0b3Iuc2hvdygpOwogICAgICAgICAgICB9LCB0aGlzKSwgdGhpcy5sb2FkSW5kaWNhdGlvbkRlbGF5KTsKICAgICAgICB9LAoKICAgICAgICBfaGlkZUxvYWRpbmc6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZighdGhpcy5sb2FkSW5kaWNhdGlvbikKICAgICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9sb2FkaW5nVGltZXIpOwogICAgICAgICAgICB0aGlzLl9sb2FkSW5kaWNhdG9yLmhpZGUoKTsKICAgICAgICB9LAoKICAgICAgICBzZWFyY2g6IGZ1bmN0aW9uKGZpbHRlcikgewogICAgICAgICAgICB0aGlzLl9yZXNldFNvcnRpbmcoKTsKICAgICAgICAgICAgdGhpcy5fcmVzZXRQYWdlcigpOwogICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkRGF0YShmaWx0ZXIpOwogICAgICAgIH0sCgogICAgICAgIGxvYWREYXRhOiBmdW5jdGlvbihmaWx0ZXIpIHsKICAgICAgICAgICAgZmlsdGVyID0gZmlsdGVyIHx8ICh0aGlzLmZpbHRlcmluZyA/IHRoaXMuZ2V0RmlsdGVyKCkgOiB7fSk7CgogICAgICAgICAgICAkLmV4dGVuZChmaWx0ZXIsIHRoaXMuX2xvYWRTdHJhdGVneS5sb2FkUGFyYW1zKCksIHRoaXMuX3NvcnRpbmdQYXJhbXMoKSk7CgogICAgICAgICAgICB2YXIgYXJncyA9IHRoaXMuX2NhbGxFdmVudEhhbmRsZXIodGhpcy5vbkRhdGFMb2FkaW5nLCB7CiAgICAgICAgICAgICAgICBmaWx0ZXI6IGZpbHRlcgogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb250cm9sbGVyQ2FsbCgibG9hZERhdGEiLCBmaWx0ZXIsIGFyZ3MuY2FuY2VsLCBmdW5jdGlvbihsb2FkZWREYXRhKSB7CiAgICAgICAgICAgICAgICBpZighbG9hZGVkRGF0YSkKICAgICAgICAgICAgICAgICAgICByZXR1cm47CgogICAgICAgICAgICAgICAgdGhpcy5fbG9hZFN0cmF0ZWd5LmZpbmlzaExvYWQobG9hZGVkRGF0YSk7CgogICAgICAgICAgICAgICAgdGhpcy5fY2FsbEV2ZW50SGFuZGxlcih0aGlzLm9uRGF0YUxvYWRlZCwgewogICAgICAgICAgICAgICAgICAgIGRhdGE6IGxvYWRlZERhdGEKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBnZXRGaWx0ZXI6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcmVzdWx0ID0ge307CiAgICAgICAgICAgIHRoaXMuX2VhY2hGaWVsZChmdW5jdGlvbihmaWVsZCkgewogICAgICAgICAgICAgICAgaWYoZmllbGQuZmlsdGVyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2V0SXRlbUZpZWxkVmFsdWUocmVzdWx0LCBmaWVsZCwgZmllbGQuZmlsdGVyVmFsdWUoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0sCgogICAgICAgIF9zb3J0aW5nUGFyYW1zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYodGhpcy5zb3J0aW5nICYmIHRoaXMuX3NvcnRGaWVsZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBzb3J0RmllbGQ6IHRoaXMuX3NvcnRGaWVsZC5uYW1lLAogICAgICAgICAgICAgICAgICAgIHNvcnRPcmRlcjogdGhpcy5fc29ydE9yZGVyCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICB9LAoKICAgICAgICBnZXRTb3J0aW5nOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHNvcnRpbmdQYXJhbXMgPSB0aGlzLl9zb3J0aW5nUGFyYW1zKCk7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBmaWVsZDogc29ydGluZ1BhcmFtcy5zb3J0RmllbGQsCiAgICAgICAgICAgICAgICBvcmRlcjogc29ydGluZ1BhcmFtcy5zb3J0T3JkZXIKICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICBjbGVhckZpbHRlcjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciAkZmlsdGVyUm93ID0gdGhpcy5fY3JlYXRlRmlsdGVyUm93KCk7CiAgICAgICAgICAgIHRoaXMuX2ZpbHRlclJvdy5yZXBsYWNlV2l0aCgkZmlsdGVyUm93KTsKICAgICAgICAgICAgdGhpcy5fZmlsdGVyUm93ID0gjgZpbHRlclJvdzsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoKCk7CiAgICAgICAgfSwKCiAgICAgICAgaW5zZXJ0SXRlbTogZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICB2YXIgaW5zZXJ0aW5nSXRlbSA9IGl0ZW0gfHwgdGhpcy5fZ2V0VmFsaWRhdGVkSW5zZXJ0SXRlbSgpOwoKICAgICAgICAgICAgaWYoIWluc2VydGluZ0l0ZW0pCiAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlamVjdCgpLnByb21pc2UoKTsKCiAgICAgICAgICAgIHZhciBhcmdzID0gdGhpcy5fY2FsbEV2ZW50SGFuZGxlcih0aGlzLm9uSXRlbUluc2VydGluZywgewogICAgICAgICAgICAgICAgaXRlbTogaW5zZXJ0aW5nSXRlbQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb250cm9sbGVyQ2FsbCgiaW5zZXJ0SXRlbSIsIGluc2VydGluZ0l0ZW0sIGFyZ3MuY2FuY2VsLCBmdW5jdGlvbihpbnNlcnRlZEl0ZW0pIHsKICAgICAgICAgICAgICAgIGluc2VydGVkSXRlbSA9IGluc2VydGVkSXRlbSB8fCBpbnNlcnRpbmdJdGVtOwogICAgICAgICAgICAgICAgdGhpcy5fbG9hZFN0cmF0ZWd5LmZpbmlzaEluc2VydChpbnNlcnRlZEl0ZW0pOwoKICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxFdmVudEhhbmRsZXIodGhpcy5vbkl0ZW1JbnNlcnRlZCwgewogICAgICAgICAgICAgICAgICAgIGl0ZW06IGluc2VydGVkSXRlbQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9nZXRWYWxpZGF0ZWRJbnNlcnRJdGVtOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLl9nZXRJbnNlcnRJdGVtKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0ZUl0ZW0oaXRlbSwgdGhpcy5faW5zZXJ0Um93KSA/IGl0ZW0gOiBudWxsOwogICAgICAgIH0sCgogICAgICAgIF9nZXRJbnNlcnRJdGVtOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHt9OwogICAgICAgICAgICB0aGlzLl9lYWNoRmllbGQoZnVuY3Rpb24oZmllbGQpIHsKICAgICAgICAgICAgICAgIGlmKGZpZWxkLmluc2VydGluZykgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NldEl0ZW1GaWVsZFZhbHVlKHJlc3VsdCwgZmllbGQsIGZpZWxkLmluc2VydFZhbHVlKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9LAoKICAgICAgICBfdmFsaWRhdGVJdGVtOiBmdW5jdGlvbihpdGVtLCAkcm93KSB7CiAgICAgICAgICAgIHZhciB2YWxpZGF0aW9uRXJyb3JzID0gW107CgogICAgICAgICAgICB2YXIgYXJncyA9IHsKICAgICAgICAgICAgICAgIGl0ZW06IGl0ZW0sCiAgICAgICAgICAgICAgICBpdGVtSW5kZXg6IHRoaXMuX3Jvd0luZGV4KCRyb3cpLAogICAgICAgICAgICAgICAgcm93OiAkcm93CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB0aGlzLl9lYWNoRmllbGQoZnVuY3Rpb24oZmllbGQpIHsKICAgICAgICAgICAgICAgIGlmKCFmaWVsZC52YWxpZGF0ZSB8fAogICAgICAgICAgICAgICAgICAgKCRyb3cgPT09IHRoaXMuX2luc2VydFJvdyAmJiAhZmllbGQuaW5zZXJ0aW5nKSB8fAogICAgICAgICAgICAgICAgICAgKCRyb3cgPT09IHRoaXMuX2dldEVkaXRSb3coKSAmJiAhZmllbGQuZWRpdGluZykpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICAgICAgICAgIHZhciBmaWVsZFZhbHVlID0gdGhpcy5fZ2V0SXRlbUZpZWxkVmFsdWUoaXRlbSwgZmllbGQpOwoKICAgICAgICAgICAgICAgIHZhciBlcnJvcnMgPSB0aGlzLl92YWxpZGF0aW9uLnZhbGlkYXRlKCQuZXh0ZW5kKHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZmllbGRWYWx1ZSwKICAgICAgICAgICAgICAgICAgICBydWxlczogZmllbGQudmFsaWRhdGUKICAgICAgICAgICAgICAgIH0sIGFyZ3MpKTsKCiAgICAgICAgICAgICAgICB0aGlzLl9zZXRDZWxsVmFsaWRpdHkoJHJvdy5jaGlsZHJlbigpLmVxKHRoaXMuX3Zpc2libGVGaWVsZEluZGV4KGZpZWxkKSksIGVycm9ycyk7CgogICAgICAgICAgICAgICAgaWYoIWVycm9ycy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICAgICAgICAgIHZhbGlkYXRpb25FcnJvcnMucHVzaC5hcHBseSh2YWxpZGF0aW9uRXJyb3JzLAogICAgICAgICAgICAgICAgICAgICQubWFwKGVycm9ycywgZnVuY3Rpb24obWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBmaWVsZDogZmllbGQsIG1lc3NhZ2U6IG1lc3NhZ2UgfTsKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgaWYoIXZhbGlkYXRpb25FcnJvcnMubGVuZ3RoKQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CgogICAgICAgICAgICB2YXIgaW52YWxpZEFyZ3MgPSAkLmV4dGVuZCh7CiAgICAgICAgICAgICAgICBlcnJvcnM6IHZhbGlkYXRpb25FcnJvcnMKICAgICAgICAgICAgfSwgYXJncyk7CiAgICAgICAgICAgIHRoaXMuX2NhbGxFdmVudEhhbmRsZXIodGhpcy5vbkl0ZW1JbnZhbGlkLCBpbnZhbGlkQXJncyk7CiAgICAgICAgICAgIHRoaXMuaW52YWxpZE5vdGlmeShpbnZhbGlkQXJncyk7CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSwKCiAgICAgICAgX3NldENlbGxWYWxpZGl0eTogZnVuY3Rpb24ojgNlbGwsIGVycm9ycykgewogICAgICAgICAgICAkY2VsbAogICAgICAgICAgICAgICAgLnRvZ2dsZUNsYXNzKHRoaXMuaW52YWxpZENsYXNzLCAhIWVycm9ycy5sZW5ndGgpCiAgICAgICAgICAgICAgICAuYXR0cigidGl0bGUiLCBlcnJvcnMuam9pbigiXG4iKSk7CiAgICAgICAgfSwKCiAgICAgICAgY2xlYXJJbnNlcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgaW5zZXJ0Um93ID0gdGhpcy5fY3JlYXRlSW5zZXJ0Um93KCk7CiAgICAgICAgICAgIHRoaXMuX2luc2VydFJvdy5yZXBsYWNlV2l0aChpbnNlcnRSb3cpOwogICAgICAgICAgICB0aGlzLl9pbnNlcnRSb3cgPSBpbnNlcnRSb3c7CiAgICAgICAgICAgIHRoaXMucmVmcmVzaCgpOwogICAgICAgIH0sCgogICAgICAgIGVkaXRJdGVtOiBmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgIHZhciAkcm93ID0gdGhpcy5yb3dCeUl0ZW0oaXRlbSk7CiAgICAgICAgICAgIGlmKCRyb3cubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9lZGl0Um93KCRyb3cpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcm93QnlJdGVtOiBmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgIGlmKGl0ZW0uanF1ZXJ5IHx8IGl0ZW0ubm9kZVR5cGUpCiAgICAgICAgICAgICAgICByZXR1cm4gJChpdGVtKTsKCiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50LmZpbmQoInRyIikuZmlsdGVyKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICQuZGF0YSh0aGlzLCBKU0dSSURfUk9XX0RBVEFfS0VZKSA9PT0gaXRlbTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgX2VkaXRSb3c6IGZ1bmN0aW9uKCRyb3cpIHsKICAgICAgICAgICAgaWYoIXRoaXMuZWRpdGluZykKICAgICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgICAgIHZhciBpdGVtID0gJHJvdy5kYXRhKEpTR1JJRF9ST1dfREFUQV9LRVkpOwoKICAgICAgICAgICAgdmFyIGFyZ3MgPSB0aGlzLl9jYWxsRXZlbnRIYW5kbGVyKHRoaXMub25JdGVtRWRpdGluZywgewogICAgICAgICAgICAgICAgcm93OiAkcm93LAogICAgICAgICAgICAgICAgaXRlbTogaXRlbSwKICAgICAgICAgICAgICAgIGl0ZW1JbmRleDogdGhpcy5faXRlbUluZGV4KGl0ZW0pCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgaWYoYXJncy5jYW5jZWwpCiAgICAgICAgICAgICAgICByZXR1cm47CgogICAgICAgICAgICBpZih0aGlzLl9lZGl0aW5nUm93KSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbEVkaXQoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyICRlZGl0Um93ID0gdGhpcy5fY3JlYXRlRWRpdFJvdyhpdGVtKTsKCiAgICAgICAgICAgIHRoaXMuX2VkaXRpbmdSb3cgPSAkcm93OwogICAgICAgICAgICAkcm93LmhpZGUoKTsKICAgICAgICAgICAgjgVkaXRSb3cuaW5zZXJ0QmVmb3JlKCRyb3cpOwogICAgICAgICAgICAkcm93LmRhdGEoSlNHUklEX0VESVRfUk9XX0RBVEFfS0VZLCAkZWRpdFJvdyk7CiAgICAgICAgfSwKCiAgICAgICAgX2NyZWF0ZUVkaXRSb3c6IGZ1bmN0aW9uKGl0ZW0pIHsKICAgICAgICAgICAgaWYoJC5pc0Z1bmN0aW9uKHRoaXMuZWRpdFJvd1JlbmRlcmVyKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICQodGhpcy5yZW5kZXJUZW1wbGF0ZSh0aGlzLmVkaXRSb3dSZW5kZXJlciwgdGhpcywgeyBpdGVtOiBpdGVtLCBpdGVtSW5kZXg6IHRoaXMuX2l0ZW1JbmRleChpdGVtKSB9KSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciAkcmVzdWx0ID0gJCgiPHRyPiIpLmFkZENsYXNzKHRoaXMuZWRpdFJvd0NsYXNzKTsKCiAgICAgICAgICAgIHRoaXMuX2VhY2hGaWVsZChmdW5jdGlvbihmaWVsZCkgewogICAgICAgICAgICAgICAgdmFyIGZpZWxkVmFsdWUgPSB0aGlzLl9nZXRJdGVtRmllbGRWYWx1ZShpdGVtLCBmaWVsZCk7CgogICAgICAgICAgICAgICAgdGhpcy5fcHJlcGFyZUNlbGwoIjx0ZD4iLCBmaWVsZCwgImVkaXRjc3MiKQogICAgICAgICAgICAgICAgICAgIC5hcHBlbmQodGhpcy5yZW5kZXJUZW1wbGF0ZShmaWVsZC5lZGl0VGVtcGxhdGUgfHwgIiIsIGZpZWxkLCB7IHZhbHVlOiBmaWVsZFZhbHVlLCBpdGVtOiBpdGVtIH0pKQogICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkcmVzdWx0KTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICB9LAoKICAgICAgICB1cGRhdGVJdGVtOiBmdW5jdGlvbihpdGVtLCBlZGl0ZWRJdGVtKSB7CiAgICAgICAgICAgIGlmKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKICAgICAgICAgICAgICAgIGVkaXRlZEl0ZW0gPSBpdGVtOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgJHJvdyA9IGl0ZW0gPyB0aGlzLnJvd0J5SXRlbShpdGVtKSA6IHRoaXMuX2VkaXRpbmdSb3c7CiAgICAgICAgICAgIGVkaXRlZEl0ZW0gPSBlZGl0ZWRJdGVtIHx8IHRoaXMuX2dldFZhbGlkYXRlZEVkaXRlZEl0ZW0oKTsKCiAgICAgICAgICAgIGlmKCFlZGl0ZWRJdGVtKQogICAgICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZVJvdygkcm93LCBlZGl0ZWRJdGVtKTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0VmFsaWRhdGVkRWRpdGVkSXRlbTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5fZ2V0RWRpdGVkSXRlbSgpOwogICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVJdGVtKGl0ZW0sIHRoaXMuX2dldEVkaXRSb3coKSkgPyBpdGVtIDogbnVsbDsKICAgICAgICB9LAoKICAgICAgICBfdXBkYXRlUm93OiBmdW5jdGlvbigkdXBkYXRpbmdSb3csIGVkaXRlZEl0ZW0pIHsKICAgICAgICAgICAgdmFyIHVwZGF0aW5nSXRlbSA9ICR1cGRhdGluZ1Jvdy5kYXRhKEpTR1JJRF9ST1dfREFUQV9LRVkpLAogICAgICAgICAgICAgICAgdXBkYXRpbmdJdGVtSW5kZXggPSB0aGlzLl9pdGVtSW5kZXgodXBkYXRpbmdJdGVtKSwKICAgICAgICAgICAgICAgIHVwZGF0ZWRJdGVtID0gJC5leHRlbmQodHJ1ZSwge30sIHVwZGF0aW5nSXRlbSwgZWRpdGVkSXRlbSk7CgogICAgICAgICAgICB2YXIgYXJncyA9IHRoaXMuX2NhbGxFdmVudEhhbmRsZXIodGhpcy5vbkl0ZW1VcGRhdGluZywgewogICAgICAgICAgICAgICAgcm93OiAkdXBkYXRpbmdSb3csCiAgICAgICAgICAgICAgICBpdGVtOiB1cGRhdGVkSXRlbSwKICAgICAgICAgICAgICAgIGl0ZW1JbmRleDogdXBkYXRpbmdJdGVtSW5kZXgsCiAgICAgICAgICAgICAgICBwcmV2aW91c0l0ZW06IHVwZGF0aW5nSXRlbQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb250cm9sbGVyQ2FsbCgidXBkYXRlSXRlbSIsIHVwZGF0ZWRJdGVtLCBhcmdzLmNhbmNlbCwgZnVuY3Rpb24obG9hZGVkVXBkYXRlZEl0ZW0pIHsKICAgICAgICAgICAgICAgIHZhciBwcmV2aW91c0l0ZW0gPSAkLmV4dGVuZCh0cnVlLCB7fSwgdXBkYXRpbmdJdGVtKTsKICAgICAgICAgICAgICAgIHVwZGF0ZWRJdGVtID0gbG9hZGVkVXBkYXRlZEl0ZW0gfHwgJC5leHRlbmQodHJ1ZSwgdXBkYXRpbmdJdGVtLCBlZGl0ZWRJdGVtKTsKCiAgICAgICAgICAgICAgICB2YXIgJHVwZGF0ZWRSb3cgPSB0aGlzLl9maW5pc2hVcGRhdGUoJHVwZGF0aW5nUm93LCB1cGRhdGVkSXRlbSwgdXBkYXRpbmdJdGVtSW5kZXgpOwoKICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxFdmVudEhhbmRsZXIodGhpcy5vbkl0ZW1VcGRhdGVkLCB7CiAgICAgICAgICAgICAgICAgICAgcm93OiAkdXBkYXRlZFJvdywKICAgICAgICAgICAgICAgICAgICBpdGVtOiB1cGRhdGVkSXRlbSwKICAgICAgICAgICAgICAgICAgICBpdGVtSW5kZXg6IHVwZGF0aW5nSXRlbUluZGV4LAogICAgICAgICAgICAgICAgICAgIHByZXZpb3VzSXRlbTogcHJldmlvdXNJdGVtCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgX3Jvd0luZGV4OiBmdW5jdGlvbihyb3cpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnQuY2hpbGRyZW4oKS5pbmRleCgkKHJvdykpOwogICAgICAgIH0sCgogICAgICAgIF9pdGVtSW5kZXg6IGZ1bmN0aW9uKGl0ZW0pIHsKICAgICAgICAgICAgcmV0dXJuICQuaW5BcnJheShpdGVtLCB0aGlzLmRhdGEpOwogICAgICAgIH0sCgogICAgICAgIF9maW5pc2hVcGRhdGU6IGZ1bmN0aW9uKCR1cGRhdGluZ1JvdywgdXBkYXRlZEl0ZW0sIHVwZGF0ZWRJdGVtSW5kZXgpIHsKICAgICAgICAgICAgdGhpcy5jYW5jZWxFZGl0KCk7CiAgICAgICAgICAgIHRoaXMuZGF0YVt1cGRhdGVkSXRlbUluZGV4XSA9IHVwZGF0ZWRJdGVtOwoKICAgICAgICAgICAgdmFyICR1cGRhdGVkUm93ID0gdGhpcy5fY3JlYXRlUm93KHVwZGF0ZWRJdGVtLCB1cGRhdGVkSXRlbUluZGV4KTsKICAgICAgICAgICAgJHVwZGF0aW5nUm93LnJlcGxhY2VXaXRoKCR1cGRhdGVkUm93KTsKICAgICAgICAgICAgcmV0dXJuICR1cGRhdGVkUm93OwogICAgICAgIH0sCgogICAgICAgIF9nZXRFZGl0ZWRJdGVtOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHt9OwogICAgICAgICAgICB0aGlzLl9lYWNoRmllbGQoZnVuY3Rpb24oZmllbGQpIHsKICAgICAgICAgICAgICAgIGlmKGZpZWxkLmVkaXRpbmcpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXRJdGVtRmllbGRWYWx1ZShyZXN1bHQsIGZpZWxkLCBmaWVsZC5lZGl0VmFsdWUoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0sCgogICAgICAgIGNhbmNlbEVkaXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZighdGhpcy5fZWRpdGluZ1JvdykKICAgICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgICAgIHRoaXMuX2dldEVkaXRSb3coKS5yZW1vdmUoKTsKICAgICAgICAgICAgdGhpcy5fZWRpdGluZ1Jvdy5zaG93KCk7CiAgICAgICAgICAgIHRoaXMuX2VkaXRpbmdSb3cgPSBudWxsOwogICAgICAgIH0sCgogICAgICAgIF9nZXRFZGl0Um93OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VkaXRpbmdSb3cgJiYgdGhpcy5fZWRpdGluZ1Jvdy5kYXRhKEpTR1JJRF9FRElUX1JPV19EQVRBX0tFWSk7CiAgICAgICAgfSwKCiAgICAgICAgZGVsZXRlSXRlbTogZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICB2YXIgJHJvdyA9IHRoaXMucm93QnlJdGVtKGl0ZW0pOwoKICAgICAgICAgICAgaWYoISRyb3cubGVuZ3RoKQogICAgICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICAgICAgaWYodGhpcy5jb25maXJtRGVsZXRpbmcgJiYgIXdpbmRvdy5jb25maXJtKGdldE9yQXBwbHkodGhpcy5kZWxldGVDb25maXJtLCB0aGlzLCAkcm93LmRhdGEoSlNHUklEX1JPV19EQVRBX0tFWSkpKSkKICAgICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWxldGVSb3coJHJvdyk7CiAgICAgICAgfSwKCiAgICAgICAgX2RlbGV0ZVJvdzogZnVuY3Rpb24oJHJvdykgewogICAgICAgICAgICB2YXIgZGVsZXRpbmdJdGVtID0gJHJvdy5kYXRhKEpTR1JJRF9ST1dfREFUQV9LRVkpLAogICAgICAgICAgICAgICAgZGVsZXRpbmdJdGVtSW5kZXggPSB0aGlzLl9pdGVtSW5kZXgoZGVsZXRpbmdJdGVtKTsKCiAgICAgICAgICAgIHZhciBhcmdzID0gdGhpcy5fY2FsbEV2ZW50SGFuZGxlcih0aGlzLm9uSXRlbURlbGV0aW5nLCB7CiAgICAgICAgICAgICAgICByb3c6ICRyb3csCiAgICAgICAgICAgICAgICBpdGVtOiBkZWxldGluZ0l0ZW0sCiAgICAgICAgICAgICAgICBpdGVtSW5kZXg6IGRlbGV0aW5nSXRlbUluZGV4CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRyb2xsZXJDYWxsKCJkZWxldGVJdGVtIiwgZGVsZXRpbmdJdGVtLCBhcmdzLmNhbmNlbCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9sb2FkU3RyYXRlZ3kuZmluaXNoRGVsZXRlKGRlbGV0aW5nSXRlbSwgZGVsZXRpbmdJdGVtSW5kZXgpOwoKICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxFdmVudEhhbmRsZXIodGhpcy5vbkl0ZW1EZWxldGVkLCB7CiAgICAgICAgICAgICAgICAgICAgcm93OiAkcm93LAogICAgICAgICAgICAgICAgICAgIGl0ZW06IGRlbGV0aW5nSXRlbSwKICAgICAgICAgICAgICAgICAgICBpdGVtSW5kZXg6IGRlbGV0aW5nSXRlbUluZGV4CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfTsKCiAgICAkLmZuLmpzR3JpZCA9IGZ1bmN0aW9uKGNvbmZpZykgewogICAgICAgIHZhciBhcmdzID0gJC5tYWtlQXJyYXkoYXJndW1lbnRzKSwKICAgICAgICAgICAgbWV0aG9kQXJncyA9IGFyZ3Muc2xpY2UoMSksCiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXM7CgogICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyICRlbGVtZW50ID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgIGluc3RhbmNlID0gjgVsZW1lbnQuZGF0YShKU0dSSURfREFUQV9LRVkpLAogICAgICAgICAgICAgICAgbWV0aG9kUmVzdWx0OwoKICAgICAgICAgICAgaWYoaW5zdGFuY2UpIHsKICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBjb25maWcgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgICAgICAgbWV0aG9kUmVzdWx0ID0gaW5zdGFuY2VbY29uZmlnXS5hcHBseShpbnN0YW5jZSwgbWV0aG9kQXJncyk7CiAgICAgICAgICAgICAgICAgICAgaWYobWV0aG9kUmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgbWV0aG9kUmVzdWx0ICE9PSBpbnN0YW5jZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBtZXRob2RSZXN1bHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLl9kZXRhY2hXaW5kb3dSZXNpemVDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLl9pbml0KGNvbmZpZyk7CiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UucmVuZGVyKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBuZXcgR3JpZCgkZWxlbWVudCwgY29uZmlnKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfTsKCiAgICB2YXIgZmllbGRzID0ge307CgogICAgdmFyIHNldERlZmF1bHRzID0gZnVuY3Rpb24oY29uZmlnKSB7CiAgICAgICAgdmFyIGNvbXBvbmVudFByb3RvdHlwZTsKCiAgICAgICAgaWYoJC5pc1BsYWluT2JqZWN0KGNvbmZpZykpIHsKICAgICAgICAgICAgY29tcG9uZW50UHJvdG90eXBlID0gR3JpZC5wcm90b3R5cGU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29tcG9uZW50UHJvdG90eXBlID0gZmllbGRzW2NvbmZpZ10ucHJvdG90eXBlOwogICAgICAgICAgICBjb25maWcgPSBhcmd1bWVudHNbMV0gfHwge307CiAgICAgICAgfQoKICAgICAgICAkLmV4dGVuZChjb21wb25lbnRQcm90b3R5cGUsIGNvbmZpZyk7CiAgICB9OwoKICAgIHZhciBsb2NhbGVzID0ge307CgogICAgdmFyIGxvY2FsZSA9IGZ1bmN0aW9uKGxhbmcpIHsKICAgICAgICB2YXIgbG9jYWxlQ29uZmlnID0gJC5pc1BsYWluT2JqZWN0KGxhbmcpID8gbGFuZyA6IGxvY2FsZXNbbGFuZ107CgogICAgICAgIGlmKCFsb2NhbGVDb25maWcpCiAgICAgICAgICAgIHRocm93IEVycm9yKCJ1bmtub3duIGxvY2FsZSAiICsgbGFuZyk7CgogICAgICAgIHNldExvY2FsZShqc0dyaWQsIGxvY2FsZUNvbmZpZyk7CiAgICB9OwoKICAgIHZhciBzZXRMb2NhbGUgPSBmdW5jdGlvbihvYmosIGxvY2FsZUNvbmZpZykgewogICAgICAgICQuZWFjaChsb2NhbGVDb25maWcsIGZ1bmN0aW9uKGZpZWxkLCB2YWx1ZSkgewogICAgICAgICAgICBpZigkLmlzUGxhaW5PYmplY3QodmFsdWUpKSB7CiAgICAgICAgICAgICAgICBzZXRMb2NhbGUob2JqW2ZpZWxkXSB8fCBvYmpbZmllbGRbMF0udG9VcHBlckNhc2UoKSArIGZpZWxkLnNsaWNlKDEpXSwgdmFsdWUpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZihvYmouaGFzT3duUHJvcGVydHkoZmllbGQpKSB7CiAgICAgICAgICAgICAgICBvYmpbZmllbGRdID0gdmFsdWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBvYmoucHJvdG90eXBlW2ZpZWxkXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9OwoKICAgIHdpbmRvdy5qc0dyaWQgPSB7CiAgICAgICAgR3JpZDogR3JpZCwKICAgICAgICBmaWVsZHM6IGZpZWxkcywKICAgICAgICBzZXREZWZhdWx0czogc2V0RGVmYXVsdHMsCiAgICAgICAgbG9jYWxlczogbG9jYWxlcywKICAgICAgICBsb2NhbGU6IGxvY2FsZSwKICAgICAgICB2ZXJzaW9uOiAiQFZFUlNJT04iCiAgICB9OwoKfSh3aW5kb3csIGpRdWVyeSkpOwo=" ></script>
<script id="jgrid_load-indicator_js" src="data:text/plain;base64,KGZ1bmN0aW9uKGpzR3JpZCwgJCwgdW5kZWZpbmVkKSB7CgogICAgZnVuY3Rpb24gTG9hZEluZGljYXRvcihjb25maWcpIHsKICAgICAgICB0aGlzLl9pbml0KGNvbmZpZyk7CiAgICB9CgogICAgTG9hZEluZGljYXRvci5wcm90b3R5cGUgPSB7CgogICAgICAgIGNvbnRhaW5lcjogImJvZHkiLAogICAgICAgIG1lc3NhZ2U6ICJMb2FkaW5nLi4uIiwKICAgICAgICBzaGFkaW5nOiB0cnVlLAoKICAgICAgICB6SW5kZXg6IDEwMDAsCiAgICAgICAgc2hhZGVyQ2xhc3M6ICJqc2dyaWQtbG9hZC1zaGFkZXIiLAogICAgICAgIGxvYWRQYW5lbENsYXNzOiAianNncmlkLWxvYWQtcGFuZWwiLAoKICAgICAgICBfaW5pdDogZnVuY3Rpb24oY29uZmlnKSB7CiAgICAgICAgICAgICQuZXh0ZW5kKHRydWUsIHRoaXMsIGNvbmZpZyk7CgogICAgICAgICAgICB0aGlzLl9pbml0Q29udGFpbmVyKCk7CiAgICAgICAgICAgIHRoaXMuX2luaXRTaGFkZXIoKTsKICAgICAgICAgICAgdGhpcy5faW5pdExvYWRQYW5lbCgpOwogICAgICAgIH0sCgogICAgICAgIF9pbml0Q29udGFpbmVyOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyID0gJCh0aGlzLmNvbnRhaW5lcik7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRTaGFkZXI6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZighdGhpcy5zaGFkaW5nKQogICAgICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICAgICAgdGhpcy5fc2hhZGVyID0gJCgiPGRpdj4iKS5hZGRDbGFzcyh0aGlzLnNoYWRlckNsYXNzKQogICAgICAgICAgICAgICAgLmhpZGUoKQogICAgICAgICAgICAgICAgLmNzcyh7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICJhYnNvbHV0ZSIsCiAgICAgICAgICAgICAgICAgICAgdG9wOiAwLAogICAgICAgICAgICAgICAgICAgIHJpZ2h0OiAwLAogICAgICAgICAgICAgICAgICAgIGJvdHRvbTogMCwKICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLAogICAgICAgICAgICAgICAgICAgIHpJbmRleDogdGhpcy56SW5kZXgKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuYXBwZW5kVG8odGhpcy5fY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdExvYWRQYW5lbDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMuX2xvYWRQYW5lbCA9ICQoIjxkaXY+IikuYWRkQ2xhc3ModGhpcy5sb2FkUGFuZWxDbGFzcykKICAgICAgICAgICAgICAgIC50ZXh0KHRoaXMubWVzc2FnZSkKICAgICAgICAgICAgICAgIC5oaWRlKCkKICAgICAgICAgICAgICAgIC5jc3MoewogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAiYWJzb2x1dGUiLAogICAgICAgICAgICAgICAgICAgIHRvcDogIjUwJSIsCiAgICAgICAgICAgICAgICAgICAgbGVmdDogIjUwJSIsCiAgICAgICAgICAgICAgICAgICAgekluZGV4OiB0aGlzLnpJbmRleAogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5hcHBlbmRUbyh0aGlzLl9jb250YWluZXIpOwogICAgICAgIH0sCgogICAgICAgIHNob3c6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgjgxvYWRQYW5lbCA9IHRoaXMuX2xvYWRQYW5lbC5zaG93KCk7CgogICAgICAgICAgICB2YXIgYWN0dWFsV2lkdGggPSAkbG9hZFBhbmVsLm91dGVyV2lkdGgoKTsKICAgICAgICAgICAgdmFyIGFjdHVhbEhlaWdodCA9ICRsb2FkUGFuZWwub3V0ZXJIZWlnaHQoKTsKCiAgICAgICAgICAgICRsb2FkUGFuZWwuY3NzKHsKICAgICAgICAgICAgICAgIG1hcmdpblRvcDogLWFjdHVhbEhlaWdodCAvIDIsCiAgICAgICAgICAgICAgICBtYXJnaW5MZWZ0OiAtYWN0dWFsV2lkdGggLyAyCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgdGhpcy5fc2hhZGVyLnNob3coKTsKICAgICAgICB9LAoKICAgICAgICBoaWRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdGhpcy5fbG9hZFBhbmVsLmhpZGUoKTsKICAgICAgICAgICAgdGhpcy5fc2hhZGVyLmhpZGUoKTsKICAgICAgICB9CgogICAgfTsKCiAgICBqc0dyaWQuTG9hZEluZGljYXRvciA9IExvYWRJbmRpY2F0b3I7Cgp9KGpzR3JpZCwgalF1ZXJ5KSk7Cg==" ></script>
<script id="jgrid_load-strategies_js" src="data:text/plain;base64,KGZ1bmN0aW9uKGpzR3JpZCwgJCwgdW5kZWZpbmVkKSB7CgogICAgZnVuY3Rpb24gRGlyZWN0TG9hZGluZ1N0cmF0ZWd5KGdyaWQpIHsKICAgICAgICB0aGlzLl9ncmlkID0gZ3JpZDsKICAgIH0KCiAgICBEaXJlY3RMb2FkaW5nU3RyYXRlZ3kucHJvdG90eXBlID0gewoKICAgICAgICBmaXJzdERpc3BsYXlJbmRleDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBncmlkID0gdGhpcy5fZ3JpZDsKICAgICAgICAgICAgcmV0dXJuIGdyaWQub3B0aW9uKCJwYWdpbmciKSA/IChncmlkLm9wdGlvbigicGFnZUluZGV4IikgLSAxKSAqIGdyaWQub3B0aW9uKCJwYWdlU2l6ZSIpIDogMDsKICAgICAgICB9LAoKICAgICAgICBsYXN0RGlzcGxheUluZGV4OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGdyaWQgPSB0aGlzLl9ncmlkOwogICAgICAgICAgICB2YXIgaXRlbXNDb3VudCA9IGdyaWQub3B0aW9uKCJkYXRhIikubGVuZ3RoOwoKICAgICAgICAgICAgcmV0dXJuIGdyaWQub3B0aW9uKCJwYWdpbmciKQogICAgICAgICAgICAgICAgPyBNYXRoLm1pbihncmlkLm9wdGlvbigicGFnZUluZGV4IikgKiBncmlkLm9wdGlvbigicGFnZVNpemUiKSwgaXRlbXNDb3VudCkKICAgICAgICAgICAgICAgIDogaXRlbXNDb3VudDsKICAgICAgICB9LAoKICAgICAgICBpdGVtc0NvdW50OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dyaWQub3B0aW9uKCJkYXRhIikubGVuZ3RoOwogICAgICAgIH0sCgogICAgICAgIG9wZW5QYWdlOiBmdW5jdGlvbihpbmRleCkgewogICAgICAgICAgICB0aGlzLl9ncmlkLnJlZnJlc2goKTsKICAgICAgICB9LAoKICAgICAgICBsb2FkUGFyYW1zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgIH0sCgogICAgICAgIHNvcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB0aGlzLl9ncmlkLl9zb3J0RGF0YSgpOwogICAgICAgICAgICB0aGlzLl9ncmlkLnJlZnJlc2goKTsKICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlKCkucHJvbWlzZSgpOwogICAgICAgIH0sCgogICAgICAgIHJlc2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdGhpcy5fZ3JpZC5yZWZyZXNoKCk7CiAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZSgpLnByb21pc2UoKTsKICAgICAgICB9LAoKICAgICAgICBmaW5pc2hMb2FkOiBmdW5jdGlvbihsb2FkZWREYXRhKSB7CiAgICAgICAgICAgIHRoaXMuX2dyaWQub3B0aW9uKCJkYXRhIiwgbG9hZGVkRGF0YSk7CiAgICAgICAgfSwKCiAgICAgICAgZmluaXNoSW5zZXJ0OiBmdW5jdGlvbihpbnNlcnRlZEl0ZW0pIHsKICAgICAgICAgICAgdmFyIGdyaWQgPSB0aGlzLl9ncmlkOwogICAgICAgICAgICBncmlkLm9wdGlvbigiZGF0YSIpLnB1c2goaW5zZXJ0ZWRJdGVtKTsKICAgICAgICAgICAgZ3JpZC5yZWZyZXNoKCk7CiAgICAgICAgfSwKCiAgICAgICAgZmluaXNoRGVsZXRlOiBmdW5jdGlvbihkZWxldGVkSXRlbSwgZGVsZXRlZEl0ZW1JbmRleCkgewogICAgICAgICAgICB2YXIgZ3JpZCA9IHRoaXMuX2dyaWQ7CiAgICAgICAgICAgIGdyaWQub3B0aW9uKCJkYXRhIikuc3BsaWNlKGRlbGV0ZWRJdGVtSW5kZXgsIDEpOwogICAgICAgICAgICBncmlkLnJlc2V0KCk7CiAgICAgICAgfQogICAgfTsKCgogICAgZnVuY3Rpb24gUGFnZUxvYWRpbmdTdHJhdGVneShncmlkKSB7CiAgICAgICAgdGhpcy5fZ3JpZCA9IGdyaWQ7CiAgICAgICAgdGhpcy5faXRlbXNDb3VudCA9IDA7CiAgICB9CgogICAgUGFnZUxvYWRpbmdTdHJhdGVneS5wcm90b3R5cGUgPSB7CgogICAgICAgIGZpcnN0RGlzcGxheUluZGV4OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfSwKCiAgICAgICAgbGFzdERpc3BsYXlJbmRleDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ncmlkLm9wdGlvbigiZGF0YSIpLmxlbmd0aDsKICAgICAgICB9LAoKICAgICAgICBpdGVtc0NvdW50OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zQ291bnQ7CiAgICAgICAgfSwKCiAgICAgICAgb3BlblBhZ2U6IGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgIHRoaXMuX2dyaWQubG9hZERhdGEoKTsKICAgICAgICB9LAoKICAgICAgICBsb2FkUGFyYW1zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGdyaWQgPSB0aGlzLl9ncmlkOwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgcGFnZUluZGV4OiBncmlkLm9wdGlvbigicGFnZUluZGV4IiksCiAgICAgICAgICAgICAgICBwYWdlU2l6ZTogZ3JpZC5vcHRpb24oInBhZ2VTaXplIikKICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICByZXNldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ncmlkLmxvYWREYXRhKCk7CiAgICAgICAgfSwKCiAgICAgICAgc29ydDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ncmlkLmxvYWREYXRhKCk7CiAgICAgICAgfSwKCiAgICAgICAgZmluaXNoTG9hZDogZnVuY3Rpb24obG9hZGVkRGF0YSkgewogICAgICAgICAgICB0aGlzLl9pdGVtc0NvdW50ID0gbG9hZGVkRGF0YS5pdGVtc0NvdW50OwogICAgICAgICAgICB0aGlzLl9ncmlkLm9wdGlvbigiZGF0YSIsIGxvYWRlZERhdGEuZGF0YSk7CiAgICAgICAgfSwKCiAgICAgICAgZmluaXNoSW5zZXJ0OiBmdW5jdGlvbihpbnNlcnRlZEl0ZW0pIHsKICAgICAgICAgICAgdGhpcy5fZ3JpZC5zZWFyY2goKTsKICAgICAgICB9LAoKICAgICAgICBmaW5pc2hEZWxldGU6IGZ1bmN0aW9uKGRlbGV0ZWRJdGVtLCBkZWxldGVkSXRlbUluZGV4KSB7CiAgICAgICAgICAgIHRoaXMuX2dyaWQuc2VhcmNoKCk7CiAgICAgICAgfQogICAgfTsKCiAgICBqc0dyaWQubG9hZFN0cmF0ZWdpZXMgPSB7CiAgICAgICAgRGlyZWN0TG9hZGluZ1N0cmF0ZWd5OiBEaXJlY3RMb2FkaW5nU3RyYXRlZ3ksCiAgICAgICAgUGFnZUxvYWRpbmdTdHJhdGVneTogUGFnZUxvYWRpbmdTdHJhdGVneQogICAgfTsKCn0oanNHcmlkLCBqUXVlcnkpKTsK" ></script>
<script id="jgrid_sort-strategies_js" src="data:text/plain;base64,KGZ1bmN0aW9uKGpzR3JpZCwgJCwgdW5kZWZpbmVkKSB7CgogICAgdmFyIGlzRGVmaW5lZCA9IGZ1bmN0aW9uKHZhbCkgewogICAgICAgIHJldHVybiB0eXBlb2YodmFsKSAhPT0gInVuZGVmaW5lZCIgJiYgdmFsICE9PSBudWxsOwogICAgfTsKCiAgICB2YXIgc29ydFN0cmF0ZWdpZXMgPSB7CiAgICAgICAgc3RyaW5nOiBmdW5jdGlvbihzdHIxLCBzdHIyKSB7CiAgICAgICAgICAgIGlmKCFpc0RlZmluZWQoc3RyMSkgJiYgIWlzRGVmaW5lZChzdHIyKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwoKICAgICAgICAgICAgaWYoIWlzRGVmaW5lZChzdHIxKSkKICAgICAgICAgICAgICAgIHJldHVybiAtMTsKCiAgICAgICAgICAgIGlmKCFpc0RlZmluZWQoc3RyMikpCiAgICAgICAgICAgICAgICByZXR1cm4gMTsKCiAgICAgICAgICAgIHJldHVybiAoIiIgKyBzdHIxKS5sb2NhbGVDb21wYXJlKCIiICsgc3RyMik7CiAgICAgICAgfSwKCiAgICAgICAgbnVtYmVyOiBmdW5jdGlvbihuMSwgbjIpIHsKICAgICAgICAgICAgcmV0dXJuIG4xIC0gbjI7CiAgICAgICAgfSwKCiAgICAgICAgZGF0ZTogZnVuY3Rpb24oZHQxLCBkdDIpIHsKICAgICAgICAgICAgcmV0dXJuIGR0MSAtIGR0MjsKICAgICAgICB9LAoKICAgICAgICBudW1iZXJBc1N0cmluZzogZnVuY3Rpb24objEsIG4yKSB7CiAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KG4xKSAtIHBhcnNlRmxvYXQobjIpOwogICAgICAgIH0KICAgIH07CgogICAganNHcmlkLnNvcnRTdHJhdGVnaWVzID0gc29ydFN0cmF0ZWdpZXM7Cgp9KGpzR3JpZCwgalF1ZXJ5KSk7Cg==" ></script>
<script id="jgrid_field_js" src="data:text/plain;base64,KGZ1bmN0aW9uKGpzR3JpZCwgJCwgdW5kZWZpbmVkKSB7CgogICAgZnVuY3Rpb24gRmllbGQoY29uZmlnKSB7CiAgICAgICAgJC5leHRlbmQodHJ1ZSwgdGhpcywgY29uZmlnKTsKICAgICAgICB0aGlzLnNvcnRpbmdGdW5jID0gdGhpcy5fZ2V0U29ydGluZ0Z1bmMoKTsKICAgIH0KCiAgICBGaWVsZC5wcm90b3R5cGUgPSB7CiAgICAgICAgbmFtZTogIiIsCiAgICAgICAgdGl0bGU6IG51bGwsCiAgICAgICAgY3NzOiAiIiwKICAgICAgICBhbGlnbjogIiIsCiAgICAgICAgd2lkdGg6IDEwMCwKCiAgICAgICAgdmlzaWJsZTogdHJ1ZSwKICAgICAgICBmaWx0ZXJpbmc6IHRydWUsCiAgICAgICAgaW5zZXJ0aW5nOiB0cnVlLAogICAgICAgIGVkaXRpbmc6IHRydWUsCiAgICAgICAgc29ydGluZzogdHJ1ZSwKICAgICAgICBzb3J0ZXI6ICJzdHJpbmciLCAvLyBuYW1lIG9mIFNvcnRTdHJhdGVneSBvciBmdW5jdGlvbiB0byBjb21wYXJlIGVsZW1lbnRzCgogICAgICAgIGhlYWRlclRlbXBsYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICh0aGlzLnRpdGxlID09PSB1bmRlZmluZWQgfHwgdGhpcy50aXRsZSA9PT0gbnVsbCkgPyB0aGlzLm5hbWUgOiB0aGlzLnRpdGxlOwogICAgICAgIH0sCgogICAgICAgIGl0ZW1UZW1wbGF0ZTogZnVuY3Rpb24odmFsdWUsIGl0ZW0pIHsKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0sCgogICAgICAgIGZpbHRlclRlbXBsYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIH0sCgogICAgICAgIGluc2VydFRlbXBsYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIH0sCgogICAgICAgIGVkaXRUZW1wbGF0ZTogZnVuY3Rpb24odmFsdWUsIGl0ZW0pIHsKICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXRlbVRlbXBsYXRlKHZhbHVlLCBpdGVtKTsKICAgICAgICB9LAoKICAgICAgICBmaWx0ZXJWYWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9LAoKICAgICAgICBpbnNlcnRWYWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9LAoKICAgICAgICBlZGl0VmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7CiAgICAgICAgfSwKCiAgICAgICAgX2dldFNvcnRpbmdGdW5jOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHNvcnRlciA9IHRoaXMuc29ydGVyOwoKICAgICAgICAgICAgaWYoJC5pc0Z1bmN0aW9uKHNvcnRlcikpIHsKICAgICAgICAgICAgICAgIHJldHVybiBzb3J0ZXI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKHR5cGVvZiBzb3J0ZXIgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgICByZXR1cm4ganNHcmlkLnNvcnRTdHJhdGVnaWVzW3NvcnRlcl07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRocm93IEVycm9yKCJ3cm9uZyBzb3J0ZXIgZm9yIHRoZSBmaWVsZCBcIiIgKyB0aGlzLm5hbWUgKyAiXCIhIik7CiAgICAgICAgfQogICAgfTsKCiAgICBqc0dyaWQuRmllbGQgPSBGaWVsZDsKCn0oanNHcmlkLCBqUXVlcnkpKTsK" ></script>
<script id="jgrid_field_text_js" src="data:text/plain;base64,KGZ1bmN0aW9uKGpzR3JpZCwgJCwgdW5kZWZpbmVkKSB7CgogICAgdmFyIEZpZWxkID0ganNHcmlkLkZpZWxkOwoKICAgIGZ1bmN0aW9uIFRleHRGaWVsZChjb25maWcpIHsKICAgICAgICBGaWVsZC5jYWxsKHRoaXMsIGNvbmZpZyk7CiAgICB9CgogICAgVGV4dEZpZWxkLnByb3RvdHlwZSA9IG5ldyBGaWVsZCh7CgogICAgICAgIGF1dG9zZWFyY2g6IHRydWUsCgkJcmVhZE9ubHk6IGZhbHNlLAoKICAgICAgICBmaWx0ZXJUZW1wbGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmKCF0aGlzLmZpbHRlcmluZykKICAgICAgICAgICAgICAgIHJldHVybiAiIjsKCiAgICAgICAgICAgIHZhciBncmlkID0gdGhpcy5fZ3JpZCwKICAgICAgICAgICAgICAgICRyZXN1bHQgPSB0aGlzLmZpbHRlckNvbnRyb2wgPSB0aGlzLl9jcmVhdGVUZXh0Qm94KCk7CgogICAgICAgICAgICBpZih0aGlzLmF1dG9zZWFyY2gpIHsKICAgICAgICAgICAgICAgICRyZXN1bHQub24oImtleXByZXNzIiwgZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIGlmKGUud2hpY2ggPT09IDEzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdyaWQuc2VhcmNoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgICAgfSwKCiAgICAgICAgaW5zZXJ0VGVtcGxhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZighdGhpcy5pbnNlcnRpbmcpCiAgICAgICAgICAgICAgICByZXR1cm4gIiI7CgogICAgICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRDb250cm9sID0gdGhpcy5fY3JlYXRlVGV4dEJveCgpOwogICAgICAgIH0sCgogICAgICAgIGVkaXRUZW1wbGF0ZTogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgaWYoIXRoaXMuZWRpdGluZykKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLml0ZW1UZW1wbGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwoKICAgICAgICAgICAgdmFyICRyZXN1bHQgPSB0aGlzLmVkaXRDb250cm9sID0gdGhpcy5fY3JlYXRlVGV4dEJveCgpOwogICAgICAgICAgICAkcmVzdWx0LnZhbCh2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgIH0sCgogICAgICAgIGZpbHRlclZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyQ29udHJvbC52YWwoKTsKICAgICAgICB9LAoKICAgICAgICBpbnNlcnRWYWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmluc2VydENvbnRyb2wudmFsKCk7CiAgICAgICAgfSwKCiAgICAgICAgZWRpdFZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWRpdENvbnRyb2wudmFsKCk7CiAgICAgICAgfSwKCiAgICAgICAgX2NyZWF0ZVRleHRCb3g6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gJCgiPGlucHV0PiIpLmF0dHIoInR5cGUiLCAidGV4dCIpCiAgICAgICAgICAgICAgICAucHJvcCgicmVhZG9ubHkiLCAhIXRoaXMucmVhZE9ubHkpOwogICAgICAgIH0KICAgIH0pOwoKICAgIGpzR3JpZC5maWVsZHMudGV4dCA9IGpzR3JpZC5UZXh0RmllbGQgPSBUZXh0RmllbGQ7Cgp9KGpzR3JpZCwgalF1ZXJ5KSk7Cg==" ></script>
<script id="jgrid_field_number_js" src="data:text/plain;base64," ></script>
<script id="jgrid_field_select_js" src="data:text/plain;base64,KGZ1bmN0aW9uKGpzR3JpZCwgJCwgdW5kZWZpbmVkKSB7CgogICAgdmFyIE51bWJlckZpZWxkID0ganNHcmlkLk51bWJlckZpZWxkOwogICAgdmFyIG51bWJlclZhbHVlVHlwZSA9ICJudW1iZXIiOwogICAgdmFyIHN0cmluZ1ZhbHVlVHlwZSA9ICJzdHJpbmciOwoKICAgIGZ1bmN0aW9uIFNlbGVjdEZpZWxkKGNvbmZpZykgewogICAgICAgIHRoaXMuaXRlbXMgPSBbXTsKICAgICAgICB0aGlzLnNlbGVjdGVkSW5kZXggPSAtMTsKICAgICAgICB0aGlzLnZhbHVlRmllbGQgPSAiIjsKICAgICAgICB0aGlzLnRleHRGaWVsZCA9ICIiOwoKICAgICAgICBpZihjb25maWcudmFsdWVGaWVsZCAmJiBjb25maWcuaXRlbXMubGVuZ3RoKSB7CiAgICAgICAgICAgIHZhciBmaXJzdEl0ZW1WYWx1ZSA9IGNvbmZpZy5pdGVtc1swXVtjb25maWcudmFsdWVGaWVsZF07CiAgICAgICAgICAgIHRoaXMudmFsdWVUeXBlID0gKHR5cGVvZiBmaXJzdEl0ZW1WYWx1ZSkgPT09IG51bWJlclZhbHVlVHlwZSA/IG51bWJlclZhbHVlVHlwZSA6IHN0cmluZ1ZhbHVlVHlwZTsKICAgICAgICB9CgogICAgICAgIHRoaXMuc29ydGVyID0gdGhpcy52YWx1ZVR5cGU7CgogICAgICAgIE51bWJlckZpZWxkLmNhbGwodGhpcywgY29uZmlnKTsKICAgIH0KCiAgICBTZWxlY3RGaWVsZC5wcm90b3R5cGUgPSBuZXcgTnVtYmVyRmllbGQoewoKICAgICAgICBhbGlnbjogImNlbnRlciIsCiAgICAgICAgdmFsdWVUeXBlOiBudW1iZXJWYWx1ZVR5cGUsCgogICAgICAgIGl0ZW1UZW1wbGF0ZTogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gdGhpcy5pdGVtcywKICAgICAgICAgICAgICAgIHZhbHVlRmllbGQgPSB0aGlzLnZhbHVlRmllbGQsCiAgICAgICAgICAgICAgICB0ZXh0RmllbGQgPSB0aGlzLnRleHRGaWVsZCwKICAgICAgICAgICAgICAgIHJlc3VsdEl0ZW07CgogICAgICAgICAgICBpZih2YWx1ZUZpZWxkKSB7CiAgICAgICAgICAgICAgICByZXN1bHRJdGVtID0gJC5ncmVwKGl0ZW1zLCBmdW5jdGlvbihpdGVtLCBpbmRleCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtW3ZhbHVlRmllbGRdID09PSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0pWzBdIHx8IHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmVzdWx0SXRlbSA9IGl0ZW1zW3ZhbHVlXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICh0ZXh0RmllbGQgPyByZXN1bHRJdGVtW3RleHRGaWVsZF0gOiByZXN1bHRJdGVtKTsKCiAgICAgICAgICAgIHJldHVybiAocmVzdWx0ID09PSB1bmRlZmluZWQgfHwgcmVzdWx0ID09PSBudWxsKSA/ICIiIDogcmVzdWx0OwogICAgICAgIH0sCgogICAgICAgIGZpbHRlclRlbXBsYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYoIXRoaXMuZmlsdGVyaW5nKQogICAgICAgICAgICAgICAgcmV0dXJuICIiOwoKICAgICAgICAgICAgdmFyIGdyaWQgPSB0aGlzLl9ncmlkLAogICAgICAgICAgICAgICAgJHJlc3VsdCA9IHRoaXMuZmlsdGVyQ29udHJvbCA9IHRoaXMuX2NyZWF0ZVNlbGVjdCgpOwoKICAgICAgICAgICAgaWYodGhpcy5hdXRvc2VhcmNoKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0Lm9uKCJjaGFuZ2UiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgZ3JpZC5zZWFyY2goKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICB9LAoKICAgICAgICBpbnNlcnRUZW1wbGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmKCF0aGlzLmluc2VydGluZykKICAgICAgICAgICAgICAgIHJldHVybiAiIjsKCiAgICAgICAgICAgIHJldHVybiB0aGlzLmluc2VydENvbnRyb2wgPSB0aGlzLl9jcmVhdGVTZWxlY3QoKTsKICAgICAgICB9LAoKICAgICAgICBlZGl0VGVtcGxhdGU6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgIGlmKCF0aGlzLmVkaXRpbmcpCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pdGVtVGVtcGxhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKCiAgICAgICAgICAgIHZhciAkcmVzdWx0ID0gdGhpcy5lZGl0Q29udHJvbCA9IHRoaXMuX2NyZWF0ZVNlbGVjdCgpOwogICAgICAgICAgICAodmFsdWUgIT09IHVuZGVmaW5lZCkgJiYgJHJlc3VsdC52YWwodmFsdWUpOwogICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICB9LAoKICAgICAgICBmaWx0ZXJWYWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmZpbHRlckNvbnRyb2wudmFsKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlVHlwZSA9PT0gbnVtYmVyVmFsdWVUeXBlID8gcGFyc2VJbnQodmFsIHx8IDAsIDEwKSA6IHZhbDsKICAgICAgICB9LAoKICAgICAgICBpbnNlcnRWYWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmluc2VydENvbnRyb2wudmFsKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlVHlwZSA9PT0gbnVtYmVyVmFsdWVUeXBlID8gcGFyc2VJbnQodmFsIHx8IDAsIDEwKSA6IHZhbDsKICAgICAgICB9LAoKICAgICAgICBlZGl0VmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5lZGl0Q29udHJvbC52YWwoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVUeXBlID09PSBudW1iZXJWYWx1ZVR5cGUgPyBwYXJzZUludCh2YWwgfHwgMCwgMTApIDogdmFsOwogICAgICAgIH0sCgogICAgICAgIF9jcmVhdGVTZWxlY3Q6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgJHJlc3VsdCA9ICQoIjxzZWxlY3Q+IiksCiAgICAgICAgICAgICAgICB2YWx1ZUZpZWxkID0gdGhpcy52YWx1ZUZpZWxkLAogICAgICAgICAgICAgICAgdGV4dEZpZWxkID0gdGhpcy50ZXh0RmllbGQsCiAgICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4ID0gdGhpcy5zZWxlY3RlZEluZGV4OwoKICAgICAgICAgICAgJC5lYWNoKHRoaXMuaXRlbXMsIGZ1bmN0aW9uKGluZGV4LCBpdGVtKSB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB2YWx1ZUZpZWxkID8gaXRlbVt2YWx1ZUZpZWxkXSA6IGluZGV4LAogICAgICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0RmllbGQgPyBpdGVtW3RleHRGaWVsZF0gOiBpdGVtOwoKICAgICAgICAgICAgICAgIHZhciAkb3B0aW9uID0gJCgiPG9wdGlvbj4iKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCJ2YWx1ZSIsIHZhbHVlKQogICAgICAgICAgICAgICAgICAgIC50ZXh0KHRleHQpCiAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRyZXN1bHQpOwoKICAgICAgICAgICAgICAgICRvcHRpb24ucHJvcCgic2VsZWN0ZWQiLCAoc2VsZWN0ZWRJbmRleCA9PT0gaW5kZXgpKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAkcmVzdWx0LnByb3AoImRpc2FibGVkIiwgISF0aGlzLnJlYWRPbmx5KTsKCiAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgIH0KICAgIH0pOwoKICAgIGpzR3JpZC5maWVsZHMuc2VsZWN0ID0ganNHcmlkLlNlbGVjdEZpZWxkID0gU2VsZWN0RmllbGQ7Cgp9KGpzR3JpZCwgalF1ZXJ5KSk7Cg==" ></script>
<script id="jgrid_field_checkbox_js" src="data:text/plain;base64,KGZ1bmN0aW9uKGpzR3JpZCwgJCwgdW5kZWZpbmVkKSB7CgogICAgdmFyIEZpZWxkID0ganNHcmlkLkZpZWxkOwoKICAgIGZ1bmN0aW9uIENoZWNrYm94RmllbGQoY29uZmlnKSB7CiAgICAgICAgRmllbGQuY2FsbCh0aGlzLCBjb25maWcpOwogICAgfQoKICAgIENoZWNrYm94RmllbGQucHJvdG90eXBlID0gbmV3IEZpZWxkKHsKCiAgICAgICAgc29ydGVyOiAibnVtYmVyIiwKICAgICAgICBhbGlnbjogImNlbnRlciIsCiAgICAgICAgYXV0b3NlYXJjaDogdHJ1ZSwKCiAgICAgICAgaXRlbVRlbXBsYXRlOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fY3JlYXRlQ2hlY2tib3goKS5wcm9wKHsKICAgICAgICAgICAgICAgIGNoZWNrZWQ6IHZhbHVlLAogICAgICAgICAgICAgICAgZGlzYWJsZWQ6IHRydWUKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZmlsdGVyVGVtcGxhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZighdGhpcy5maWx0ZXJpbmcpCiAgICAgICAgICAgICAgICByZXR1cm4gIiI7CgogICAgICAgICAgICB2YXIgZ3JpZCA9IHRoaXMuX2dyaWQsCiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gdGhpcy5maWx0ZXJDb250cm9sID0gdGhpcy5fY3JlYXRlQ2hlY2tib3goKTsKCiAgICAgICAgICAgICRyZXN1bHQucHJvcCh7CiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSwKICAgICAgICAgICAgICAgIGluZGV0ZXJtaW5hdGU6IHRydWUKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAkcmVzdWx0Lm9uKCJjbGljayIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyICRjYiA9ICQodGhpcyk7CgogICAgICAgICAgICAgICAgaWYojgNiLnByb3AoInJlYWRPbmx5IikpIHsKICAgICAgICAgICAgICAgICAgICAkY2IucHJvcCh7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICByZWFkT25seTogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYoISRjYi5wcm9wKCJjaGVja2VkIikpIHsKICAgICAgICAgICAgICAgICAgICAkY2IucHJvcCh7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBpbmRldGVybWluYXRlOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgaWYodGhpcy5hdXRvc2VhcmNoKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0Lm9uKCJjbGljayIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGdyaWQuc2VhcmNoKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgICAgfSwKCiAgICAgICAgaW5zZXJ0VGVtcGxhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZighdGhpcy5pbnNlcnRpbmcpCiAgICAgICAgICAgICAgICByZXR1cm4gIiI7CgogICAgICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRDb250cm9sID0gdGhpcy5fY3JlYXRlQ2hlY2tib3goKTsKICAgICAgICB9LAoKICAgICAgICBlZGl0VGVtcGxhdGU6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgIGlmKCF0aGlzLmVkaXRpbmcpCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pdGVtVGVtcGxhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKCiAgICAgICAgICAgIHZhciAkcmVzdWx0ID0gdGhpcy5lZGl0Q29udHJvbCA9IHRoaXMuX2NyZWF0ZUNoZWNrYm94KCk7CiAgICAgICAgICAgICRyZXN1bHQucHJvcCgiY2hlY2tlZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgICAgfSwKCiAgICAgICAgZmlsdGVyVmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJDb250cm9sLmdldCgwKS5pbmRldGVybWluYXRlCiAgICAgICAgICAgICAgICA/IHVuZGVmaW5lZAogICAgICAgICAgICAgICAgOiB0aGlzLmZpbHRlckNvbnRyb2wuaXMoIjpjaGVja2VkIik7CiAgICAgICAgfSwKCiAgICAgICAgaW5zZXJ0VmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRDb250cm9sLmlzKCI6Y2hlY2tlZCIpOwogICAgICAgIH0sCgogICAgICAgIGVkaXRWYWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmVkaXRDb250cm9sLmlzKCI6Y2hlY2tlZCIpOwogICAgICAgIH0sCgogICAgICAgIF9jcmVhdGVDaGVja2JveDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAkKCI8aW5wdXQ+IikuYXR0cigidHlwZSIsICJjaGVja2JveCIpOwogICAgICAgIH0KICAgIH0pOwoKICAgIGpzR3JpZC5maWVsZHMuY2hlY2tib3ggPSBqc0dyaWQuQ2hlY2tib3hGaWVsZCA9IENoZWNrYm94RmllbGQ7Cgp9KGpzR3JpZCwgalF1ZXJ5KSk7Cg==" ></script>
<script id="jgrid_field_control_js" src="data:text/plain;base64,KGZ1bmN0aW9uKGpzR3JpZCwgJCwgdW5kZWZpbmVkKSB7CgogICAgdmFyIEZpZWxkID0ganNHcmlkLkZpZWxkOwoKICAgIGZ1bmN0aW9uIENvbnRyb2xGaWVsZChjb25maWcpIHsKICAgICAgICBGaWVsZC5jYWxsKHRoaXMsIGNvbmZpZyk7CiAgICAgICAgdGhpcy5fY29uZmlnSW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAgIH0KCiAgICBDb250cm9sRmllbGQucHJvdG90eXBlID0gbmV3IEZpZWxkKHsKICAgICAgICBjc3M6ICJqc2dyaWQtY29udHJvbC1maWVsZCIsCiAgICAgICAgYWxpZ246ICJjZW50ZXIiLAogICAgICAgIHdpZHRoOiA1MCwKICAgICAgICBmaWx0ZXJpbmc6IGZhbHNlLAogICAgICAgIGluc2VydGluZzogZmFsc2UsCiAgICAgICAgZWRpdGluZzogZmFsc2UsCiAgICAgICAgc29ydGluZzogZmFsc2UsCgogICAgICAgIGJ1dHRvbkNsYXNzOiAianNncmlkLWJ1dHRvbiIsCiAgICAgICAgbW9kZUJ1dHRvbkNsYXNzOiAianNncmlkLW1vZGUtYnV0dG9uIiwKCiAgICAgICAgbW9kZU9uQnV0dG9uQ2xhc3M6ICJqc2dyaWQtbW9kZS1vbi1idXR0b24iLAogICAgICAgIHNlYXJjaE1vZGVCdXR0b25DbGFzczogImpzZ3JpZC1zZWFyY2gtbW9kZS1idXR0b24iLAogICAgICAgIGluc2VydE1vZGVCdXR0b25DbGFzczogImpzZ3JpZC1pbnNlcnQtbW9kZS1idXR0b24iLAogICAgICAgIGVkaXRCdXR0b25DbGFzczogImpzZ3JpZC1lZGl0LWJ1dHRvbiIsCiAgICAgICAgZGVsZXRlQnV0dG9uQ2xhc3M6ICJqc2dyaWQtZGVsZXRlLWJ1dHRvbiIsCiAgICAgICAgc2VhcmNoQnV0dG9uQ2xhc3M6ICJqc2dyaWQtc2VhcmNoLWJ1dHRvbiIsCiAgICAgICAgY2xlYXjgaWx0ZXJCdXR0b25DbGFzczogImpzZ3JpZC1jbGVhci1maWx0ZXItYnV0dG9uIiwKICAgICAgICBpbnNlcnRCdXR0b25DbGFzczogImpzZ3JpZC1pbnNlcnQtYnV0dG9uIiwKICAgICAgICB1cGRhdGVCdXR0b25DbGFzczogImpzZ3JpZC11cGRhdGUtYnV0dG9uIiwKICAgICAgICBjYW5jZWxFZGl0QnV0dG9uQ2xhc3M6ICJqc2dyaWQtY2FuY2VsLWVkaXQtYnV0dG9uIiwKCiAgICAgICAgc2VhcmNoTW9kZUJ1dHRvblRvb2x0aXA6ICJTd2l0Y2ggdG8gc2VhcmNoaW5nIiwKICAgICAgICBpbnNlcnRNb2RlQnV0dG9uVG9vbHRpcDogIlN3aXRjaCB0byBpbnNlcnRpbmciLAogICAgICAgIGVkaXRCdXR0b25Ub29sdGlwOiAiRWRpdCIsCiAgICAgICAgZGVsZXRlQnV0dG9uVG9vbHRpcDogIkRlbGV0ZSIsCiAgICAgICAgc2VhcmNoQnV0dG9uVG9vbHRpcDogIlNlYXJjaCIsCiAgICAgICAgY2xlYXjgaWx0ZXJCdXR0b25Ub29sdGlwOiAiQ2xlYXIgZmlsdGVyIiwKICAgICAgICBpbnNlcnRCdXR0b25Ub29sdGlwOiAiSW5zZXJ0IiwKICAgICAgICB1cGRhdGVCdXR0b25Ub29sdGlwOiAiVXBkYXRlIiwKICAgICAgICBjYW5jZWxFZGl0QnV0dG9uVG9vbHRpcDogIkNhbmNlbCBlZGl0IiwKCiAgICAgICAgZWRpdEJ1dHRvbjogdHJ1ZSwKICAgICAgICBkZWxldGVCdXR0b246IHRydWUsCiAgICAgICAgY2xlYXjgaWx0ZXJCdXR0b246IHRydWUsCiAgICAgICAgbW9kZVN3aXRjaEJ1dHRvbjogdHJ1ZSwKCiAgICAgICAgX2luaXRDb25maWc6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB0aGlzLl9oYXNGaWx0ZXJpbmcgPSB0aGlzLl9ncmlkLmZpbHRlcmluZzsKICAgICAgICAgICAgdGhpcy5faGFzSW5zZXJ0aW5nID0gdGhpcy5fZ3JpZC5pbnNlcnRpbmc7CgogICAgICAgICAgICBpZih0aGlzLl9oYXNJbnNlcnRpbmcgJiYgdGhpcy5tb2RlU3dpdGNoQnV0dG9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9ncmlkLmluc2VydGluZyA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLl9jb25maWdJbml0aWFsaXplZCA9IHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgaGVhZGVyVGVtcGxhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZighdGhpcy5fY29uZmlnSW5pdGlhbGl6ZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2luaXRDb25maWcoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGhhc0ZpbHRlcmluZyA9IHRoaXMuX2hhc0ZpbHRlcmluZzsKICAgICAgICAgICAgdmFyIGhhc0luc2VydGluZyA9IHRoaXMuX2hhc0luc2VydGluZzsKCiAgICAgICAgICAgIGlmKCF0aGlzLm1vZGVTd2l0Y2hCdXR0b24gfHwgKCFoYXNGaWx0ZXJpbmcgJiYgIWhhc0luc2VydGluZykpCiAgICAgICAgICAgICAgICByZXR1cm4gIiI7CgogICAgICAgICAgICBpZihoYXNGaWx0ZXJpbmcgJiYgIWhhc0luc2VydGluZykKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVGaWx0ZXJTd2l0Y2hCdXR0b24oKTsKCiAgICAgICAgICAgIGlmKGhhc0luc2VydGluZyAmJiAhaGFzRmlsdGVyaW5nKQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUluc2VydFN3aXRjaEJ1dHRvbigpOwoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZU1vZGVTd2l0Y2hCdXR0b24oKTsKICAgICAgICB9LAoKICAgICAgICBpdGVtVGVtcGxhdGU6IGZ1bmN0aW9uKHZhbHVlLCBpdGVtKSB7CiAgICAgICAgICAgIHZhciAkcmVzdWx0ID0gJChbXSk7CgogICAgICAgICAgICBpZih0aGlzLmVkaXRCdXR0b24pIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkcmVzdWx0LmFkZCh0aGlzLl9jcmVhdGVFZGl0QnV0dG9uKGl0ZW0pKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYodGhpcy5kZWxldGVCdXR0b24pIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkcmVzdWx0LmFkZCh0aGlzLl9jcmVhdGVEZWxldGVCdXR0b24oaXRlbSkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICB9LAoKICAgICAgICBmaWx0ZXJUZW1wbGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciAkcmVzdWx0ID0gdGhpcy5fY3JlYXRlU2VhcmNoQnV0dG9uKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsZWFyRmlsdGVyQnV0dG9uID8gJHJlc3VsdC5hZGQodGhpcy5fY3JlYXRlQ2xlYXjgaWx0ZXJCdXR0b24oKSkgOiAkcmVzdWx0OwogICAgICAgIH0sCgogICAgICAgIGluc2VydFRlbXBsYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUluc2VydEJ1dHRvbigpOwogICAgICAgIH0sCgogICAgICAgIGVkaXRUZW1wbGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVVcGRhdGVCdXR0b24oKS5hZGQodGhpcy5fY3JlYXRlQ2FuY2VsRWRpdEJ1dHRvbigpKTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlRmlsdGVyU3dpdGNoQnV0dG9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZU9uT2ZmU3dpdGNoQnV0dG9uKCJmaWx0ZXJpbmciLCB0aGlzLnNlYXJjaE1vZGVCdXR0b25DbGFzcywgdHJ1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgX2NyZWF0ZUluc2VydFN3aXRjaEJ1dHRvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVPbk9mZlN3aXRjaEJ1dHRvbigiaW5zZXJ0aW5nIiwgdGhpcy5pbnNlcnRNb2RlQnV0dG9uQ2xhc3MsIGZhbHNlKTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlT25PZmZTd2l0Y2hCdXR0b246IGZ1bmN0aW9uKG9wdGlvbiwgY3NzQ2xhc3MsIGlzT25Jbml0aWFsbHkpIHsKICAgICAgICAgICAgdmFyIGlzT24gPSBpc09uSW5pdGlhbGx5OwoKICAgICAgICAgICAgdmFyIHVwZGF0ZUJ1dHRvblN0YXRlID0gJC5wcm94eShmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICRidXR0b24udG9nZ2xlQ2xhc3ModGhpcy5tb2RlT25CdXR0b25DbGFzcywgaXNPbik7CiAgICAgICAgICAgIH0sIHRoaXMpOwoKICAgICAgICAgICAgdmFyICRidXR0b24gPSB0aGlzLl9jcmVhdGVHcmlkQnV0dG9uKHRoaXMubW9kZUJ1dHRvbkNsYXNzICsgIiAiICsgY3NzQ2xhc3MsICIiLCBmdW5jdGlvbihncmlkKSB7CiAgICAgICAgICAgICAgICBpc09uID0gIWlzT247CiAgICAgICAgICAgICAgICBncmlkLm9wdGlvbihvcHRpb24sIGlzT24pOwogICAgICAgICAgICAgICAgdXBkYXRlQnV0dG9uU3RhdGUoKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB1cGRhdGVCdXR0b25TdGF0ZSgpOwoKICAgICAgICAgICAgcmV0dXJuICRidXR0b247CiAgICAgICAgfSwKCiAgICAgICAgX2NyZWF0ZU1vZGVTd2l0Y2hCdXR0b246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgaXNJbnNlcnRpbmcgPSBmYWxzZTsKCiAgICAgICAgICAgIHZhciB1cGRhdGVCdXR0b25TdGF0ZSA9ICQucHJveHkoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAkYnV0dG9uLmF0dHIoInRpdGxlIiwgaXNJbnNlcnRpbmcgPyB0aGlzLnNlYXJjaE1vZGVCdXR0b25Ub29sdGlwIDogdGhpcy5pbnNlcnRNb2RlQnV0dG9uVG9vbHRpcCkKICAgICAgICAgICAgICAgICAgICAudG9nZ2xlQ2xhc3ModGhpcy5pbnNlcnRNb2RlQnV0dG9uQ2xhc3MsICFpc0luc2VydGluZykKICAgICAgICAgICAgICAgICAgICAudG9nZ2xlQ2xhc3ModGhpcy5zZWFyY2hNb2RlQnV0dG9uQ2xhc3MsIGlzSW5zZXJ0aW5nKTsKICAgICAgICAgICAgfSwgdGhpcyk7CgogICAgICAgICAgICB2YXIgjgJ1dHRvbiA9IHRoaXMuX2NyZWF0ZUdyaWRCdXR0b24odGhpcy5tb2RlQnV0dG9uQ2xhc3MsICIiLCBmdW5jdGlvbihncmlkKSB7CiAgICAgICAgICAgICAgICBpc0luc2VydGluZyA9ICFpc0luc2VydGluZzsKICAgICAgICAgICAgICAgIGdyaWQub3B0aW9uKCJpbnNlcnRpbmciLCBpc0luc2VydGluZyk7CiAgICAgICAgICAgICAgICBncmlkLm9wdGlvbigiZmlsdGVyaW5nIiwgIWlzSW5zZXJ0aW5nKTsKICAgICAgICAgICAgICAgIHVwZGF0ZUJ1dHRvblN0YXRlKCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgdXBkYXRlQnV0dG9uU3RhdGUoKTsKCiAgICAgICAgICAgIHJldHVybiAkYnV0dG9uOwogICAgICAgIH0sCgogICAgICAgIF9jcmVhdGVFZGl0QnV0dG9uOiBmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVHcmlkQnV0dG9uKHRoaXMuZWRpdEJ1dHRvbkNsYXNzLCB0aGlzLmVkaXRCdXR0b25Ub29sdGlwLCBmdW5jdGlvbihncmlkLCBlKSB7CiAgICAgICAgICAgICAgICBncmlkLmVkaXRJdGVtKGl0ZW0pOwogICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgX2NyZWF0ZURlbGV0ZUJ1dHRvbjogZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fY3JlYXRlR3JpZEJ1dHRvbih0aGlzLmRlbGV0ZUJ1dHRvbkNsYXNzLCB0aGlzLmRlbGV0ZUJ1dHRvblRvb2x0aXAsIGZ1bmN0aW9uKGdyaWQsIGUpIHsKICAgICAgICAgICAgICAgIGdyaWQuZGVsZXRlSXRlbShpdGVtKTsKICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9jcmVhdGVTZWFyY2hCdXR0b246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fY3JlYXRlR3JpZEJ1dHRvbih0aGlzLnNlYXJjaEJ1dHRvbkNsYXNzLCB0aGlzLnNlYXJjaEJ1dHRvblRvb2x0aXAsIGZ1bmN0aW9uKGdyaWQpIHsKICAgICAgICAgICAgICAgIGdyaWQuc2VhcmNoKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9jcmVhdGVDbGVhckZpbHRlckJ1dHRvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVHcmlkQnV0dG9uKHRoaXMuY2xlYXjgaWx0ZXJCdXR0b25DbGFzcywgdGhpcy5jbGVhckZpbHRlckJ1dHRvblRvb2x0aXAsIGZ1bmN0aW9uKGdyaWQpIHsKICAgICAgICAgICAgICAgIGdyaWQuY2xlYXjgaWx0ZXIoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgX2NyZWF0ZUluc2VydEJ1dHRvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVHcmlkQnV0dG9uKHRoaXMuaW5zZXJ0QnV0dG9uQ2xhc3MsIHRoaXMuaW5zZXJ0QnV0dG9uVG9vbHRpcCwgZnVuY3Rpb24oZ3JpZCkgewogICAgICAgICAgICAgICAgZ3JpZC5pbnNlcnRJdGVtKCkuZG9uZShmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBncmlkLmNsZWFySW5zZXJ0KCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgX2NyZWF0ZVVwZGF0ZUJ1dHRvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVHcmlkQnV0dG9uKHRoaXMudXBkYXRlQnV0dG9uQ2xhc3MsIHRoaXMudXBkYXRlQnV0dG9uVG9vbHRpcCwgZnVuY3Rpb24oZ3JpZCwgZSkgewogICAgICAgICAgICAgICAgZ3JpZC51cGRhdGVJdGVtKCk7CiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlQ2FuY2VsRWRpdEJ1dHRvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVHcmlkQnV0dG9uKHRoaXMuY2FuY2VsRWRpdEJ1dHRvbkNsYXNzLCB0aGlzLmNhbmNlbEVkaXRCdXR0b25Ub29sdGlwLCBmdW5jdGlvbihncmlkLCBlKSB7CiAgICAgICAgICAgICAgICBncmlkLmNhbmNlbEVkaXQoKTsKICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9jcmVhdGVHcmlkQnV0dG9uOiBmdW5jdGlvbihjbHMsIHRvb2x0aXAsIGNsaWNrSGFuZGxlcikgewogICAgICAgICAgICB2YXIgZ3JpZCA9IHRoaXMuX2dyaWQ7CgogICAgICAgICAgICByZXR1cm4gJCgiPGlucHV0PiIpLmFkZENsYXNzKHRoaXMuYnV0dG9uQ2xhc3MpCiAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoY2xzKQogICAgICAgICAgICAgICAgLmF0dHIoewogICAgICAgICAgICAgICAgICAgIHR5cGU6ICJidXR0b24iLAogICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0b29sdGlwCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLm9uKCJjbGljayIsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBjbGlja0hhbmRsZXIoZ3JpZCwgZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBlZGl0VmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgfQoKICAgIH0pOwoKICAgIGpzR3JpZC5maWVsZHMuY29udHJvbCA9IGpzR3JpZC5Db250cm9sRmllbGQgPSBDb250cm9sRmllbGQ7Cgp9KGpzR3JpZCwgalF1ZXJ5KSk7Cg==" ></script>


HTML_JS_B64;
	return( $html_js_b64 );
	}


function html_js_links() {
	$html_js_links = <<<HTML_JS_LINKS

   <link rel="stylesheet" type="text/css" href="/jg/demos/demos.css" />
    <link href='http://fonts.googleapis.com/css?family=Open+Sans:300,600,400' rel='stylesheet' type='text/css'>

    <link rel="stylesheet" type="text/css" href="/jg/css/jgrid.css" />
    <link rel="stylesheet" type="text/css" href="/jg/css/theme.css" />

    <script src="/jg/external/jquery/jquery-1.8.3.js"></script>
    <script src="/jg/demos/db.js"></script>

    <script src="/jg/src/jgrid.core.js"></script>
    <script src="/jg/src/jgrid.load-indicator.js"></script>
    <script src="/jg/src/jgrid.load-strategies.js"></script>
    <script src="/jg/src/jgrid.sort-strategies.js"></script>
    <script src="/jg/src/jgrid.field.js"></script>
    <script src="/jg/src/fields/jgrid.field.text.js"></script>
    <script src="/jg/src/fields/jgrid.field.number.js"></script>
    <script src="/jg/src/fields/jgrid.field.select.js"></script>
    <script src="/jg/src/fields/jgrid.field.checkbox.js"></script>
    <script src="/jg/src/fields/jgrid.field.control.js"></script>
<!--
	-->

HTML_JS_LINKS;
	return( $html_js_links );
	}

function sqlq_jg( $dbfile, $sql, $fld ) {
//	printf( "MSG_2380:  sqlq:  dbfile=[$dbfile] sql=[$sql] fld=[$fld]<br>\n" );
        $pdo = newpdo( $dbfile );
//	$sql = "select * from $tblname";
	$output = "";
        $pdo = newpdo($dbfile);
	foreach( $pdo->query($sql) as $row ) {
		printf( "BUGS_2390:  val=[$val] fld=[$fld] row=[$row]<br>\n" );

		$val=$row[$fld];
		$output .= "$val ";
		}
	$pdo=null;
	return($output);
	}


function newpdo_jg( $dbfile ) {
        $php_self=$_SERVER['PHP_SELF'];
        $http_host=$_SERVER['HTTP_HOST'];
        $request_uri=$_SERVER['REQUEST_URI'];

	if( ! file_exists( $dbfile )) {
		print( "$php_self newpdo ERR_3979:  NOT_EXISTS dbfile=[$dbfile]<br>\n" );
		if( $GLOBALS['install'] != true ) {
			print( "$php_self newpdo ERR:  NOT_INSTALL dbfile=[$dbfile]<br>\n" );
			return;
			}
		else {
			print( "$php_self newpdo MSG:  CREATE dbfile=[$dbfile]<br>\n" );
			}
		}

	try {
		$pdo = null;
		$pdo = new PDO("sqlite:$dbfile" );
		$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//		$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
//		$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
		
		if( $pdo == null ) {
			print( "$php_self newpdo ERR:   dbfile=[$dbfile]<br>\n" );
			return $pdo;
			}
		return $pdo;
		}


	catch(PDOException $e ) {
		$errmsg = $e->getMessage();
		print( "$php_self newpdo ERR:  pdo=[$pdo] dbfile=[$dbfile] errmsg=[$errmsg]<br>\n" );
		$pdo = null;
		return $pdo;
		}
	}




function json1_jg() {
// Returns: ["Apple","Banana","Pear"]
	json_encode(array("Apple", "Banana", "Pear"));
// Returns: {"4":"four","8":"eight"}
	json_encode(array(4 => "four", 8 => "eight"));
// Returns: {"apples":true,"bananas":null}
	json_encode(array("apples" => true, "bananas" => null));
	}

function json2_jg() {
	class User {
		public $firstname = "";
		public $lastname  = "";
		public $birthdate = "";
		}

	$user = new User();
	$user->firstname = "foo";
	$user->lastname  = "bar";

// Returns: {"firstname":"foo","lastname":"bar"}
	json_encode($user);
	$user->birthdate = new DateTime();
/* Returns:
	{
		"firstname":"foo",
        	"lastname":"bar",
        	"birthdate": {
			"date":"2012-06-06 08:46:58",
			"timezone_type":3,
			"timezone":"Europe\/Berlin"
        		}
		}
*/
	json_encode($user);
	return( $user );
	}



function json3_jg() {
	class User {
		public $pub = "Mister X.";
		protected $pro = "hidden";
		private $priv = "hidden too";

		public $func;
		public $notUsed;
		public function __construct() {
			$this->func = function() {
				return "Foo";
				};
			}
		}
	$user = new User();
// Returns: {"pub":"Mister X.","func":{},"notUsed":null}
	echo json_encode($user);
	return( json_encode($user));
	}



function jsond1_jg() {
	$string = '{"foo": "bar", "cool": "attr"}';
	$result = json_decode($string);

// Result: object(stdClass)#1 (2) { ["foo"]=> string(3) "bar" ["cool"]=> string(4) "attr" }
	var_dump($result);

// Prints "bar"
	echo $result->foo;

// Prints "attr"
	echo $result->cool;
	return( $result->cool );
	}

function jsond2_jg() {
	$string = '{"foo": "bar", "cool": "attr"}';
	$result = json_decode($string, true);

// Result: array(2) { ["foo"]=> string(3) "bar" ["cool"]=> string(4) "attr" }
	var_dump($result);
// Prints "bar"
	echo $result['foo'];
// Prints "attr"
	echo $result['cool'];
	return( $result['cool'] );
	}

function json_handle_jg() {
	class JsonHandler {

		protected static $_messages = array(
			JSON_ERROR_NONE => 'No error has occurred',
			JSON_ERROR_DEPTH => 'The maximum stack depth has been exceeded',
			JSON_ERROR_STATE_MISMATCH => 'Invalid or malformed JSON',
			JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded',
			JSON_ERROR_SYNTAX => 'Syntax error',
			JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded'
			);

		public static function encode($value, $options = 0) {
			$result = json_encode($value, $options);
			if($result)  {
				return $result;
				}

			throw new RuntimeException(static::$_messages[json_last_error()]);
			}

		public static function decode($json, $assoc = false) {
			$result = json_decode($json, $assoc);
			if($result) {
				return $result;
				}

			throw new RuntimeException(static::$_messages[json_last_error()]);
			}
		}
	return($result);
	}



function html_style_ko_input() {
	$html_style_ko_input=<<<HTML_STYLE_KO_INPUT
	<style id="style_input_ko">
		.fileContainer {
		    overflow: hidden;
		    position: relative;
			}
		
		.fileContainer \[type=file\] {
		    cursor: inherit;
		    display: block;
		    font-size: 999px;
		    filter: alpha(opacity=0);
		    min-height: 100%;
		    min-width: 100%;
		    opacity: 0;
		    position: absolute;
		    right: 0;
		    text-align: right;`
		    top: 0;
			}
		</style>
HTML_STYLE_KO_INPUT;
	return( $html_style_ko_input );
	}

function html_style_ko_popover() {
	$html_style_ko_popover=<<<HTML_STYLE_POPOVER
	<style id="style_popover" >
		.popover  {
			position: relative;
//			float: left;
			padding: 5px;
			/*z-index: 0;*/
			}
		.popover:hover {
//			background-color: #e9e9e2;
			background-color: slategrey;
			/*z-index: 50;*/
			color: white;
//			color: #335500;
			text-decoration: none;
			}
/*CSS for enlarged image*/
		.popover span { 
			position: absolute; 
//			background-color: #e5e5e5;
			background-color: slategrey;
			padding: 5px;
			/*left: -1000px;*/
			border: 1px solid #666;
			visibility: hidden;
			color: black;
			text-decoration: none;
			}
/*CSS for enlarged image*/
		.popover span img { 
			border-width: 0px; 
			/*padding: 2px;*/
			}
		
/*CSS for enlarged image on hover*/
		.popover:hover span { 
			visibility: visible; 
//			width: 200px;
			top: 0px; /* use IF IE6 style to correct IE6 positions of larger image relative to thumb */
			left: 0px;/*position where enlarged image should offset horizontally */
			}
		</style>


	<style id="style_popse" >
		.popse  {
			position: relative;
			float: left;
			padding: 5px;
			/*z-index: 0;*/
			}
		.popse:hover {
			background-color: #e9e9e2;
			/*z-index: 50;*/
			color: #335500;
			text-decoration: none;
			}
/*CSS for enlarged image*/
		.popse span { 
			position: absolute; 
			background-color: #e5e5e5;
			padding: 5px;
			/*left: -1000px;*/
			border: 1px solid #666;
			visibility: hidden;
			color: black;
			text-decoration: none;
			}
/*CSS for enlarged image*/
		.popse span img { 
			border-width: 0px; 
			/*padding: 2px;*/
			}
		
/*CSS for enlarged image on hover*/
		.popse:hover span { 
			visibility: visible; 
			width: 200px;
			top: 5px; /* use IF IE6 style to correct IE6 positions of larger image relative to thumb */
			left: 300px;/*position where enlarged image should offset horizontally */
			}
		</script>
	<style id="style_buttons" >
                body { text-align: center; background-color: "darkslategrey"; color:"white"; }
                button {
//			visibility: hidden;
//			background: rgba(7, 99, 53, .1);
			background: transparent;
//	                border: 3px solid rgba(7, 99, 53, 1);
	                border: 3px solid slategrey;
			border-radius: 5px;
//			color: rgba(7, 99, 53, 1);
			color: slategrey;
			cursor: pointer;
			line-height: 40px;
			font-size: 20px;
			outline: none;
			padding: 0 20px;
			transition: all .3s;
                	}
	        button:hover {
//	              background: rgba(7, 99, 53, 1);
//  	              background: yellow;
//  	              background: white;
  	              background: darkgreyslate;
//  	              color: rgba(255,255,255,1);
  	              color: white;
  	              }
		p {font-size: 12px; font-weight: bold;}
		</style>

	<style id="style_input" >
                body { text-align: center; background-color: "darkslategrey"; color:"white"; }
                input {
//			visibility: hidden;
//			background: rgba(7, 99, 53, .1);
			background: transparent;
//	                border: 3px solid rgba(7, 99, 53, 1);
	                border: 3px solid slategrey;
			border-radius: 5px;
//			color: rgba(7, 99, 53, 1);
			color: slategrey;
			cursor: pointer;
			line-height: 40px;
			font-size: 10px;
			outline: none;
			padding: 0 20px;
			transition: all .3s;
                	}
	        button:hover {
//	              background: rgba(7, 99, 53, 1);
  	              background: darkgreyslate;
//  	              background: yellow;
//  	              background: white;
//  	              color: rgba(255,255,255,1);
  	              color: white;
  	              }
		p {font-size: 10px; font-weight: bold;
		</style>



HTML_STYLE_POPOVER;
	return( $html_style_ko_popover );
	}

function html_style_ko_drag() {
	$html_style_ko_drag=<<<HTML_STYLE_KO_DRAG
	<style type="text/css">
		#drop {
			 width:200px;
			 height:150px;
			 margin:3px auto;
			 background:#eddaa8;
			 font-size:16px;
			}
		#drop #sw { text-decoration:underline; cursor:pointer; }
		#drag {
			 width:450px;
			 height:180px;
			 margin:12px auto;
			 border:1px solid silver;
			 font-size:16px;
			}
		#drag .drg { margin:10px 12px; }
		#drag div.drg {
			 width:150px;
			 height:50px;
			 background:#07da08;
			 border:2px solid blue;
			}
		</style>
HTML_STYLE_KO_DRAG;
	return( $html_style_ko_drag );
	}


function html_js_ko() {
	$html_js_ko=<<<HTML_JS_KO

	<script type="text/javascript">

// sets the draggable
		$(document).ready(function() {
			$('#drag .drg').draggable({
				cursor: 'move',          // sets the cursor apperance
				revert: 'valid'
				});

// sets droppable
// after the draggable is droped, hides it with a hide() effect
			$('#drop').droppable({
				drop: function(event, ui) {
					ui.draggable.hide(1000);
					}
				});

// after the draggable is droped, hides it with a hide() effect
			$('#drop1').droppable({
				drop: function(event, ui) {
				ui.draggable.hide(1000);
				}
			});

// after the draggable is droped, hides it with a hide() effect
		$('#drop2').droppable({
			drop: function(event, ui) {
				ui.draggable.hide(1000);
				}
			});

// when the "#sw" element (inside the "#drop") is clicked
// show the items with class "drg", contained in "#drag"
//   $('#drag .drg').slideDown(1000);
		$('#drop #sw').click(function(){
			var url = "https://ka6//ko_center/ko_center.php?q=jqui/dragdrop1/"
			$(location).attr('href',url);
			});
		});
		</script>
HTML_JS_KO;
	return( $html_js_ko);
	}


function html_style_yokkmokk() {
	$html_style_yokkmokk=<<<HTML_STYLE_YOKKMOKK

		<style id=style_yokkmokk>
			body { 
//				background: url("data:font/ttf;base64,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AEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgCjAFcAWABZAJYAWgChAFsAXABdAF4AXwBgAGEAYgBjAGQAZQBmAGcAaABpAGoAawBsAG0AbgBvAHAAcQByAHMAdAB1AHYAdwB4AHkAegB7AHwAfQB+AH8AgACBAIIAgwCEAIUAhgCHAIgAiQCKAIsAjACNAI4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJoAmwANAJwAnQCeAJ8AoAChAAAAAAAQAAAAqAkIBQABAQMCAwQFAwMEAgQCBQQCAwMDAwQDAgQCAgMEAwIGAwgFBAQEBAIEBAMGBQQEBQQCAwMEBgUEAwICAgQDBgQEAgQFAgQEAgYEAwQEBAICAwMGBQQDAwMFAgICBgYGBgYGCAgEBAQCAgIFBAQEBAQEAwMDAwMEBAQEBAQHBgQEBAICAgQDAwMDAwMDAwMDCAYCAgICAgIBAgIEAgICBgUBBQUAAAoJBQABAQMCBAUGAwMFAgQCBQUCBAMDBAUDAgQCAgMEAwMHAwkGBAQFBAIEBAMHBgUEBgQCBAQEBwUEAwICAwUDBwUEAgUGAgQEAgYFAwUFBQICAwMGBQQDAwMGAwIDBwcHBwcHCQkEBAQCAgIGBQUFBQUFBAQEBAMFBQUFBQUIBwQEBAICAgUDAwMDAwQDAwMDCAcDAwICAgIBAgIEAgICBwUBBQUAAAsKBgACAgQCBAUGAwMFAgQCBgUDBAQEBAUEAwUDAgMEAwMIAwoGBQUFBQIEBQMHBgUEBgUDBAQECAYFAwIDAwUDCAUFAwUGAgQEAgcFBAUFBQMDAwMHBgUDBAQGAwIDCAgICAgICQoFBQUCAgIGBQUFBQUFBAQEBAMFBQUFBQUJCAUFBQICAgUEBAQEBAQDAwMDCQgDAwICAwIBAgIEAgICBwYBBgYAAAwLBgACAgQDBAYHBAQGAgUDBgYDBQQEBAUEAwUDAwQFBAMIAwsHBQUFBQIFBQQIBwYFBwUDBQUFCAYFAwMDAwYDCQYFAwUHAgUFAggGBAYGBgMDBAQHBgUDBAQHAwMDCAgICAgICgsFBQUCAgIHBgYGBgYGBQUFBQMGBgYGBgYJCQUFBQICAgYEBAQEBAQEBAQECggDAwMDAwIBAwMFAwMDCAYBBgYAAA0MBwACAgQDBQYHBAQGAwUDBwYDBQQFBQYEAwYDAwQFBAMJBAwIBgYGBQMFBgQJBwYFCAUDBQUFCQcFBAMDAwYECQYGAwYIAwUFAggGBQYGBgMDBAQIBwYEBAQHAwMDCQkJCQkJCwwGBgYDAwMHBgYGBgYGBQUFBQQGBgYGBgYKCQYGBgMDAwYFBQUFBQUEBAQECwkDAwMDAwIBAwMFAwMDCQcCBwcAAA4NBwACAgUDBQcIBAQHAwUDBwcDBQUFBQYFAwYDAwQFBAQKBAwIBgYGBgMGBgQJCAcGCAYDBQUGCggGBAMDBAcECgcGAwYIAwYGAwkHBQcHBwMDBAQJBwYEBQUIBAMECgoKCgoKDA0GBgYDAwMIBwcHBwcHBQUFBQQHBwcHBwcLCgYGBgMDAwcFBQUFBQUEBAQEDAoEBAMDAwMBAwMGAwMDCQcCBwcAAA8OCAACAgUDBgcIBQUHAwYDCAcDBgUFBQcFBAcEAwUGBQQLBA0JBwcHBgMGBwUKCAcGCQYEBgYGCggGBAMEBAcECwcHBAcJAwYGAwkHBQcHBwQDBQUJCAYEBQUJBAMECwsLCwsLDQ4HBwcDAwMIBwcHBwcHBgYGBgQHBwcHBwcMCwcHBwMDAwcFBQUFBQUFBQUFDQoEBAMDBAMCAwMGAwMDCggCCAgAABAPCAACAgUEBggJBQUIAwYECAgEBgUGBgcFBAcEBAUGBQQLBQ4JBwcHBwMGBwULCQgGCQcEBgYGCwkHBAQEBAgFCwgHBAcJAwcGAwoHBggIBwQEBQUKCAcEBQUJBAMECwsLCwsLDg8HBwcDAwMJCAgICAgIBgYGBgUICAgICAgNCwcHBwMDAwcGBgYGBgYFBQUFDgsEBAQEBAMCAwMGBAQECwgCCAgAABEQCQACAgYEBggJBQUIAwcECQgEBwYGBggGBAcEBAUHBQUMBQ8KBwcIBwMHCAULCggHCgcEBgYHDAkHBQQEBAgFDAgHBAgKAwcHAwsIBggICAQEBQUKCQcFBgYKBAQFDAwMDAwMDxAHCAcDAwMKCAgICAgIBgYGBgUICAgICAgNDAcHBwMDAwgGBgYGBgYFBQUFDgwFBQQEBAMCBAQHBAQECwkCCQkAABIQCQADAwYEBwkKBgYJBAcECQkEBwYGBggGBAgEBAYHBgUNBRAKCAgICAQHCAUMCgkHCwcEBwcHDQoIBQQEBQkFDQkIBAgKBAcHAwsIBgkJCAQEBQYLCQgFBgYKBQQFDQ0NDQ0NDxAICAgEBAQKCQkJCQkJBwcHBwUJCQkJCQkODQgICAQEBAgGBgYGBgYFBQUFDwwFBQQEBAMCBAQHBAQEDAkCCQkAABMRCgADAwYEBwkLBgYJBAcECgkEBwYHBwkGBAgFBAYHBgUNBhELCAgJCAQICAYNCwkICwgEBwcIDQoIBQQFBQkFDQkIBAkLBAgIBAwJBwkJCQQEBgYMCggFBgYLBQQFDQ0NDQ0NEBEICAgEBAQLCQkJCQkJBwcHBwUJCQkJCQkPDQgICAQEBAkHBwcHBwcGBgYGEA0FBQQEBQQCBAQIBAQEDQoCCgoAABQSCgADAwcEBwoLBgYKBAgECgoFCAcHBwkHBQkFBAYIBgUOBhIMCQkJCAQICQYNCwoIDAgFCAgIDgsIBgUFBQoGDgoJBQkMBAgIBA0JBwoKCQUFBgYMCgkGBwcLBQQFDg4ODg4OERIJCQkEBAQLCgoKCgoKCAgICAYKCgoKCgoQDgkJCQQEBAkHBwcHBwcGBgYGEQ4FBQUFBQQCBAQIBQUEDgoCCgoAABUTCwADAwcFCAoMBgYKBAgFCwoFCAcHBwoHBQkFBQYIBgYPBhMMCQkJCQQJCQYODAoIDAkFCAgIDwsJBgUFBQoGDwoJBQoMBAkIBA0KBwoKCgUFBgcNCwkGBwcMBQQGDw8PDw8PEhMJCQkEBAQMCgoKCgoKCAgICAYKCgoKCgoRDwkJCQQEBAoHBwcHBwcGBgYGEg4GBgUFBQQCBAQIBQUFDgsDCwsAABYUCwADAwcFCAsMBwcLBAkFCwoFCAcICAoHBQoFBQcJBwYPBhQNCgoKCQQJCgcPDAoJDQkFCAgJDwwJBgUFBgsGEAsKBQoNBAkJBA4KCAsLCgUFBwcOCwkGBwcNBgUGDw8PDw8PExQKCgoEBAQMCgoKCgoLCAgICAYLCwsLCwsREAoKCgQEBAoICAgICAgHBwcHEw8GBgUFBQQCBQUJBQUFDwsDCwsAABcVDAADAwcFCQsNBwcLBQkFDAsFCQcICAsIBQoGBQcJBwYQBxQNCgoKCgUJCgcPDQsJDQoFCQkJEAwKBgUGBgsHEAsKBQoNBQkJBA4LCAsLCwUFBwcODAoGBwgNBgUGEBAQEBAQFBUKCgoFBQUNCwsLCwsLCQkJCQcLCwsLCwsSEAoKCgUFBQsICAgICAgHBwcHFBAGBgUFBgQCBQUJBQUFEAwDDAwAABgWDAADAwgFCQwNBwcMBQkFDAsGCQgICAsIBgoGBQcJBwYRBxUOCgoLCgUKCwcQDgsKDgoGCQkKEQ0KBwUGBgsHEQwKBgsOBQoKBA8LCAwMCwYGBwgPDAoHCAgOBgUGERERERERFRYKCwoFBQUOCwsLCwsMCQkJCQcLCwsLCwsTEQoKCgUFBQsICAgICAgHBwcHFBEGBgUFBgQCBQUKBQUFEAwDDAwAAAABAV0BkAAFAAICvAKKAAAAjwK8AooAAAHFADIBAwAAAAAEAAAAAAAAAAAAAAMAAAAAAAAAAAAAAABNQUNSAEAAICIZAyH/OQAAAyEAxwAAAAEAAAAAAAAAAQAAgAAAAACLAT8AAGAAAbQCdVlva2ttb2trICAgICAgICD/////N////llPS1IwMAAAAAAAAAABAAAAAQAAmJpL9V8PPPUAAAPoAAAAALfnFZIAAAAAt+cVkv+2/zkDawMhAAAAAwACAAEAAAAAAAEAAAMh/zkAAAOQ/7b/uANrAAEAAAAAAAAAAAAAAAAAAACkAAEAAACkAJgADQAAAAAAAgAIAEAACgAAAF0AvgABAAE=");
				background-color: darkslategrey;
				color: white;
				font-size:62.5%; 
//				font-family: yokkmokkOT;
				font-size: 38pt;
				}
			</style>
HTML_STYLE_YOKKMOKK;
	return( $html_style_yokkmokk );
	}


function html_ajax_app() {

	$ko_idx="ko_idx_ajxapp";
	$ko_code="ko_ajxapp";
	$ko_status="ko_status_ajxapp";
	$ko_dttm=date('Ymd_His');
	$ko_num="123_ABC";
	$ko_price="12.13";
	$ko_url="ko2.us";
	$ko_name="ko_name_ajxapp";
	$ko_dest="ko_dest_ajxapp";
	$ko_text="ko_text_ajxapp";
	$ko_desc="ko_desc_ajxapp";

	$ko_imgfil="/imgs/btn/ko.png";
	$ko_txtfil="/imgs/btn/ko.txt";
	$ko_psvfil="/imgs/btn/ko.psv";
	$ko_db3fil="/imgs/btn/ko.db3";
	$ko_csvfil="/imgs/btn/ko.csv";
	$ko_mp3fil="/imgs/btn/ko.mp3";
	$ko_mp4fil="/imgs/btn/ko.mp4";
	$ko_pdffil="/imgs/btn/ko.pdf";

	$ko_ajxapp = '';
	$ko_ajxapp += '<script id="script_ko_ajxapp">';
	$ko_ajxapp += '	var formData = new FormData();';
	$ko_ajxapp += '	formData.append("ko_idx", $ko_idx); ';
	$ko_ajxapp += '	formData.append("ko_code", $ko_code); ';
	$ko_ajxapp += '	formData.append("ko_status", $ko_status); ';
	$ko_ajxapp += '	formData.append("ko_dttm", $ko_dttm); ';
	$ko_ajxapp += '	formData.append("ko_price", $ko_price); ';
	$ko_ajxapp += '	formData.append("ko_url", $ko_url); ';
	$ko_ajxapp += '	formData.append("ko_name", $ko_name); ';
	$ko_ajxapp += '	formData.append("ko_dest", $ko_dest); ';
	$ko_ajxapp += '	formData.append("ko_text", $ko_text); ';
	$ko_ajxapp += '	formData.append("ko_desc", $ko_desc); ';

	$ko_ajxapp += '	formData.append("ko_imgfil", $ko_imgfil); ';
	$ko_ajxapp += '	formData.append("ko_txtfil", $ko_txtfil); ';
	$ko_ajxapp += '	formData.append("ko_psvfil", $ko_psvfil); ';
	$ko_ajxapp += '	formData.append("ko_db3fil", $ko_db3fil); ';
	$ko_ajxapp += '	formData.append("ko_csvfil", $ko_csvfil); ';
	$ko_ajxapp += '	formData.append("ko_mp3fil", $ko_mp3fil); ';
	$ko_ajxapp += '	formData.append("ko_mp4fil", $ko_mp4fil); ';
	$ko_ajxapp += '	formData.append("ko_pdffil", $ko_pdffil); ';
	$ko_ajxapp += '	formData.append("ko_idx", $ko_idx); ';
	
	$ko_ajxapp += '	var xhr = new XMLHttpRequest();';
	$ko_ajxapp += '	xhr.open("POST", "http://ka1.php?q=kups&ajxapp/");  ';
	$ko_ajxapp += '	xhr.send(formData);';
	$ko_ajxapp += '	</script>';
	return( $ko_ajxapp );
	}


function html_ajax_add() {
	
	$ko_idx="ko_ajxadd";
	$ko_code="ko_ajxadd";
	$ko_status="ko_ajxadd_status";
	$ko_dttm=date('Ymd_His');
	$ko_num="123_ABC";
	$ko_price="13.12";
	$ko_url="ko2.us";
	$ko_name="ko_name_ajxadd";
	$ko_dest="ko_dest_ajxadd";
	$ko_text="ko_text_ajxadd";
	$ko_desc="ko_desc_ajxadd";


	$ko_imgfil="/imgs/btn/ko.png";
	$ko_txtfil="/imgs/btn/ko.txt";
	$ko_psvfil="/imgs/btn/ko.psv";
	$ko_db3fil="/imgs/btn/ko.db3";
	$ko_csvfil="/imgs/btn/ko.csv";
	$ko_mp3fil="/imgs/btn/ko.mp3";
	$ko_mp4fil="/imgs/btn/ko.mp4";
	$ko_pdffil="/imgs/btn/ko.pdf";

	$ko_ajxadd = '';

	$ko_ajxadd += 'var formElement = document.getElementById("ko_ajxadd");';
	$ko_ajxadd += 'var formData = new FormData(formElement);';
	$ko_ajxadd += 'formData.append("ko_idx", $ko_idx); ';
	$ko_ajxadd += 'formData.append("ko_code", $ko_code); ';
	$ko_ajxadd += 'formData.append("ko_status", $ko_status); ';
	$ko_ajxadd += 'formData.append("ko_dttm", $ko_dttm); ';
	$ko_ajxadd += 'formData.append("ko_price", $ko_price); ';
	$ko_ajxadd += 'formData.append("ko_url", $ko_url); ';
	$ko_ajxadd += 'formData.append("ko_name", $ko_name); ';
	$ko_ajxadd += 'formData.append("ko_dest", $ko_dest); ';
	$ko_ajxadd += 'formData.append("ko_text", $ko_text); ';
	$ko_ajxadd += 'formData.append("ko_desc", $ko_desc); ';

	$ko_ajxadd += 'formData.append("ko_imgfil", $ko_imgfil); ';
	$ko_ajxadd += 'formData.append("ko_txtfil", $ko_txtfil); ';
	$ko_ajxadd += 'formData.append("ko_psvfil", $ko_psvfil); ';
	$ko_ajxadd += 'formData.append("ko_db3fil", $ko_db3fil); ';
	$ko_ajxadd += 'formData.append("ko_csvfil", $ko_csvfil); ';
	$ko_ajxadd += 'formData.append("ko_mp3fil", $ko_mp3fil); ';
	$ko_ajxadd += 'formData.append("ko_mp4fil", $ko_mp4fil); ';
	$ko_ajxadd += 'formData.append("ko_pdffil", $ko_pdffil); ';
	$ko_ajxadd += 'formData.append("ko_idx", $ko_idx); ';

	$ko_ajxadd += 'var xhr = new XMLHttpRequest();';
	$ko_ajxadd += 'xhr.open("POST", "http://ka1.php?q=kups&ajxadd/");';
	$ko_ajxadd += 'xhr.send(formData);';
	$ko_ajxadd += '</script>';
	return( $ko_ajxadd );
	}


function html_atwist() {} 
function html_atwist_page() {
	$atwist_page=<<<ATWIST_PAGE
<style id="style_atwist_page">

    html, body {
      width: 100%;
      height: 100%;
      margin: 0;
      background: #fcfcfc;
      background: lightblue;
      background: url('imgs/bg/bg.jpg');

      font-family: Helvetica, Arial, sans-serif;
    }

    .box {

      background: #FFF center center no-repeat;

      width: 200px;
      height: 300px;
      border-radius: 3px;
      position: absolute;
      left: 50%;
      top: 50%;
      margin: -150px 0 0 -100px;

      box-shadow: 0 1px 1px rgba(0,0,0,0.3);

      -webkit-backface-visibility: hidden;
      -moz-backface-visibility: hidden;
      -ms-backface-visibility: hidden;
      -o-backface-visibility: hidden;
      backface-visibility: hidden;

      -webkit-transition: all 500ms cubic-bezier(0.190, 1.000, 0.220, 1.000);
      -moz-transition: all 500ms cubic-bezier(0.190, 1.000, 0.220, 1.000);
      -ms-transition: all 500ms cubic-bezier(0.190, 1.000, 0.220, 1.000);
      -o-transition: all 500ms cubic-bezier(0.190, 1.000, 0.220, 1.000);
      transition: all 500ms cubic-bezier(0.190, 1.000, 0.220, 1.000);

      -webkit-transform: translateY(0) scale(0.95, 0.95);
      -moz-transform: translateY(0) scale(0.95, 0.95);
      -ms-transform: translateY(0) scale(0.95, 0.95);
      -o-transform: translateY(0) scale(0.95, 0.95);
      transform: translateY(0) scale(0.95, 0.95);

    }


    .kogo {
      width: 100px;
//    background: #333;
      background: grey10;
//    color: #FFF !important;
      color: #000 !important;
      font-size: 14px;
      padding: 7px 10px;
      border-radius: 4px;
      border: none;
      transition: background 0.3s ease-out;

      position: absolute;
      bottom: 10px;
      left: 50%;
      margin-left: -50px;
    }

    .kogo:hover {
      background: #50C0FB;
    }

    #container.active .box {
      -webkit-transform: translateY(-20px) scale(1, 1);
      -moz-transform: translateY(-20px) scale(1, 1);
      -ms-transform: translateY(-20px) scale(1, 1);
      -o-transform: translateY(-20px) scale(1, 1);
      transform: translateY(-20px) scale(1, 1);

      box-shadow: 0 11px 18px rgba(0,0,0,0.2);
    }

	</style>

  <div id="container">
    <div class="box"></div>
    <div class="box-back"></div>
  </div>

  <button id="animate" class="kogo">kogo</button>

  <script>

    var goButton = document.getElementById("animate");
    var container = document.getElementById("container");

    goButton.addEventListener('click', function() {

      container.classList.toggle('active');

    });
  </script>
ATWIST_PAGE;
	return( $atwist_page );
	} 


function html_atwist_flip() {
	$atwist_flip=<<<ATWIST_FLIP
	<style>
		@-webkit-keyframes back {
			 0% {-webkit-transform: scale(1) rotateY(180deg);}
			10% {-webkit-transform: scale(1.000768) rotateY(180deg);}
			20% {-webkit-transform: scale(1.024576) rotateY(180deg);}
			30% {-webkit-transform: scale(1.125424) rotateY(180.17135717260666deg);}
			40% {-webkit-transform: scale(1.149232) rotateY(185.48342952341287deg);}
			50% {-webkit-transform: scale(1.15) rotateY(221.6397929434164deg);}
			60% {-webkit-transform: scale(1.149232) rotateY(318.3602070565836deg);}
			70% {-webkit-transform: scale(1.125424) rotateY(354.51657047658716deg);}
			80% {-webkit-transform: scale(1.024576) rotateY(359.8286428273933deg);}
			90% {-webkit-transform: scale(1.000768) rotateY(360deg);}
			100% {-webkit-transform: scale(1) rotateY(360deg);}
			}
		
		@-moz-keyframes back {
			  0% {-moz-transform: scale(1) rotateY(180deg);}
			10% {-moz-transform: scale(1.000768) rotateY(180deg);}
			20% {-moz-transform: scale(1.024576) rotateY(180deg);}
			30% {-moz-transform: scale(1.125424) rotateY(180.17135717260666deg);}
			40% {-moz-transform: scale(1.149232) rotateY(185.48342952341287deg);}
			50% {-moz-transform: scale(1.15) rotateY(221.6397929434164deg);}
			60% {-moz-transform: scale(1.149232) rotateY(318.3602070565836deg);}
			70% {-moz-transform: scale(1.125424) rotateY(354.51657047658716deg);}
			80% {-moz-transform: scale(1.024576) rotateY(359.8286428273933deg);}
			90% {-moz-transform: scale(1.000768) rotateY(360deg);}
			100% {-moz-transform: scale(1) rotateY(360deg);}
			}
		
		@-ms-keyframes back {
			  0% {-ms-transform: scale(1) rotateY(180deg);}
			10% {-ms-transform: scale(1.000768) rotateY(180deg);}
			20% {-ms-transform: scale(1.024576) rotateY(180deg);}
			  30% {-ms-transform: scale(1.125424) rotateY(180.17135717260666deg);}
			40% {-ms-transform: scale(1.149232) rotateY(185.48342952341287deg);}
			50% {-ms-transform: scale(1.15) rotateY(221.6397929434164deg);}
			60% {-ms-transform: scale(1.149232) rotateY(318.3602070565836deg);}
			70% {-ms-transform: scale(1.125424) rotateY(354.51657047658716deg);}
			80% {-ms-transform: scale(1.024576) rotateY(359.8286428273933deg);}
			90% {-ms-transform: scale(1.000768) rotateY(360deg);}
			100% {-ms-transform: scale(1) rotateY(360deg);}
			}
		
		@-o-keyframes back {
			  0% {-o-transform: scale(1) rotateY(180deg);}
			  10% {-o-transform: scale(1.000768) rotateY(180deg);}
			20% {-o-transform: scale(1.024576) rotateY(180deg);}
			30% {-o-transform: scale(1.125424) rotateY(180.17135717260666deg);}
			40% {-o-transform: scale(1.149232) rotateY(185.48342952341287deg);}
			50% {-o-transform: scale(1.15) rotateY(221.6397929434164deg);}
			60% {-o-transform: scale(1.149232) rotateY(318.3602070565836deg);}
			70% {-o-transform: scale(1.125424) rotateY(354.51657047658716deg);}
			80% {-o-transform: scale(1.024576) rotateY(359.8286428273933deg);}
			90% {-o-transform: scale(1.000768) rotateY(360deg);}
			100% {-o-transform: scale(1) rotateY(360deg);}
			}
		
		@keyframes back {
			  0% {transform: scale(1) rotateY(180deg);}
			  10% {transform: scale(1.000768) rotateY(180deg);}
			  20% {transform: scale(1.024576) rotateY(180deg);}
			30% {transform: scale(1.125424) rotateY(180.17135717260666deg);}
			40% {transform: scale(1.149232) rotateY(185.48342952341287deg);}
			50% {transform: scale(1.15) rotateY(221.6397929434164deg);}
			60% {transform: scale(1.149232) rotateY(318.3602070565836deg);}
			70% {transform: scale(1.125424) rotateY(354.51657047658716deg);}
			80% {transform: scale(1.024576) rotateY(359.8286428273933deg);}
			90% {transform: scale(1.000768) rotateY(360deg);}
			100% {transform: scale(1) rotateY(360deg);}
			}
		
		
		@-webkit-keyframes front {
			10% {-webkit-transform: scale(1.000768) rotateY(0deg);}
			20% {-webkit-transform: scale(1.000768) rotateY(0deg);}
			30% {-webkit-transform: scale(1.125424) rotateY(0.17135717260665195deg);}
			40% {-webkit-transform: scale(1.149232) rotateY(5.4834295234128625deg);}
			50% {-webkit-transform: scale(1.15) rotateY(41.639792943416424deg);}
			60% {-webkit-transform: scale(1.149232) rotateY(138.36020705658356deg);}
			70% {-webkit-transform: scale(1.125424) rotateY(174.51657047658713deg);}
			80% {-webkit-transform: scale(1.024576) rotateY(179.82864282739334deg);}
			90% {-webkit-transform: scale(1.000768) rotateY(180deg);}
			100% {-webkit-transform: scale(1) rotateY(180deg);}
			}
		
		@-moz-keyframes front {
			  0% {-moz-transform: scale(1) rotateY(0deg);}
			10% {-moz-transform: scale(1.000768) rotateY(0deg);}
			20% {-moz-transform: scale(1.024576) rotateY(0deg);}
			30% {-moz-transform: scale(1.125424) rotateY(0.17135717260665195deg);}
			40% {-moz-transform: scale(1.149232) rotateY(5.4834295234128625deg);}
			50% {-moz-transform: scale(1.15) rotateY(41.639792943416424deg);}
			60% {-moz-transform: scale(1.149232) rotateY(138.36020705658356deg);}
			70% {-moz-transform: scale(1.125424) rotateY(174.51657047658713deg);}
			80% {-moz-transform: scale(1.024576) rotateY(179.82864282739334deg);}
			90% {-moz-transform: scale(1.000768) rotateY(180deg);}
			100% {-moz-transform: scale(1) rotateY(180deg);}
			}
		
		@-ms-keyframes front {
			  0% {-ms-transform: scale(1) rotateY(0deg);}
			10% {-ms-transform: scale(1.000768) rotateY(0deg);}
			20% {-ms-transform: scale(1.024576) rotateY(0deg);}
			30% {-ms-transform: scale(1.125424) rotateY(0.17135717260665195deg);}
			40% {-ms-transform: scale(1.149232) rotateY(5.4834295234128625deg);}
			50% {-ms-transform: scale(1.15) rotateY(41.639792943416424deg);}
			60% {-ms-transform: scale(1.149232) rotateY(138.36020705658356deg);}
			70% {-ms-transform: scale(1.125424) rotateY(174.51657047658713deg);}
			80% {-ms-transform: scale(1.024576) rotateY(179.82864282739334deg);}
			90% {-ms-transform: scale(1.000768) rotateY(180deg);}
			100% {-ms-transform: scale(1) rotateY(180deg);}
			}
		
		@-o-keyframes front {
			  0% {-o-transform: scale(1) rotateY(0deg);}
			  10% {-o-transform: scale(1.000768) rotateY(0deg);}
			20% {-o-transform: scale(1.024576) rotateY(0deg);}
			30% {-o-transform: scale(1.125424) rotateY(0.17135717260665195deg);}
			40% {-o-transform: scale(1.149232) rotateY(5.4834295234128625deg);}
			50% {-o-transform: scale(1.15) rotateY(41.639792943416424deg);}
			60% {-o-transform: scale(1.149232) rotateY(138.36020705658356deg);}
			70% {-o-transform: scale(1.125424) rotateY(174.51657047658713deg);}
			80% {-o-transform: scale(1.024576) rotateY(179.82864282739334deg);}
			90% {-o-transform: scale(1.000768) rotateY(180deg);}
			100% {-o-transform: scale(1) rotateY(180deg);}
			}
		
		@keyframes front {
			  0% {transform: scale(1) rotateY(0deg);}
			10% {transform: scale(1.000768) rotateY(0deg);}
			20% {transform: scale(1.024576) rotateY(0deg);}
			30% {transform: scale(1.125424) rotateY(0.17135717260665195deg);}
			40% {transform: scale(1.149232) rotateY(5.4834295234128625deg);}
			50% {transform: scale(1.15) rotateY(41.639792943416424deg);}
			60% {transform: scale(1.149232) rotateY(138.36020705658356deg);} 
			70% {transform: scale(1.125424) rotateY(174.51657047658713deg);}
			80% {transform: scale(1.024576) rotateY(179.82864282739334deg);}
			90% {transform: scale(1.000768) rotateY(180deg);}
			100% {transform: scale(1) rotateY(180deg);}
			}
		</style>
		

	<style>
		html, body {
			width: 100%;
			height: 100%;
			margin: 0;
//			background: #fcfcfc;
//			background: lightblue;
			background: url('imgs/bg/bg.jpg');

			font-family: Helvetica, Arial, sans-serif;
			}

		#container {
			-webkit-perspective: 1000px;
			-moz-perspective: 1000px;
			-ms-perspective: 1000px;
			-o-perspective: 1000px;
			perspective: 1000px;
			width: 100%;
			height: 100%;
			}

		.box,
		.box-back {

			background: url(imgs/btn/koeyeb.png ) center center no-repeat;
//			background-size: 200px 300px;
			background-size: 100px 25px;

			width: 200px;
			height: 300px;
			border-radius: 3px;
			position: absolute;
			left: 50%;
			top: 50%;
			margin: -165px 0 0 -100px;

			-webkit-backface-visibility: hidden;
			-moz-backface-visibility: hidden;
			-ms-backface-visibility: hidden;
			-o-backface-visibility: hidden;
			backface-visibility: hidden;

			}

		.box-back {

			background: url(imgs/btn/koeyew.png) center center no-repeat;
//			background-size: 200px 300px;
			background-size: 100px 25px;

			-webkit-transform: rotateY(180deg);
			-moz-transform: rotateY(180deg);
			-ms-transform: rotateY(180deg);
			-o-transform: rotateY(180deg);
			transform: rotateY(180deg);
			}

		.livedemo {
			width: 100px;
			background: #333;
			color: #FFF !important;
			font-size: 14px;
			padding: 7px 10px;
			border-radius: 4px;
			border: none;
			transition: background 0.3s ease-out;

			position: absolute;
			bottom: 10px;
			left: 50%;
			margin-left: -50px;
			}

		.livedemo:hover {
			background: #50C0FB;
			}

		#container.active .box,
		#container.active .box:after,
		#container.active .box-back:after {
			-webkit-animation: front 650ms 0s 1 linear forwards;
			-moz-animation:    front 650ms 0s 1 linear forwards;
			-o-animation:      front 650ms 0s 1 linear forwards;
			animation:         front 650ms 0s 1 linear forwards;
			}

		#container.active .box-back {

			-webkit-animation: back 650ms 0s 1 linear forwards;
			-moz-animation:    back 650ms 0s 1 linear forwards;
			-o-animation:      back 650ms 0s 1 linear forwards;
			animation:         back 650ms 0s 1 linear forwards;
			}

		#container.active .box:after,
		#container.active .box-back:after {
			-webkit-animation-name: shadow;
			-moz-animation-name:    shadow;
			-o-animation-name:      shadow;
			animation-name:         shadow;
			}

		#container.active .box,
		#container.active .box-back,
		#container.active .box:after,
		#container.active .box-back:after {
			-webkit-animation-play-state: running;
			-moz-animation-play-state:    running;
			-o-animation-play-state:      running;
			animation-play-state:         running;
			}

		#container.reverse .box {

			-webkit-transform: scale(1) rotateY(180deg);
			-moz-transform: scale(1) rotateY(180deg);
			-ms-transform: scale(1) rotateY(180deg);
			-o-transform: scale(1) rotateY(180deg);
			transform: scale(1) rotateY(180deg);

			-webkit-animation-direction: reverse;
			-moz-animation-direction:    reverse;
			-o-animation-direction:      reverse;
			animation-direction:         reverse;
			}

		#container.reverse .box-back {

			-webkit-transform: scale(1) rotateY(360deg);
			-moz-transform: scale(1) rotateY(360deg);
			-ms-transform: scale(1) rotateY(360deg);
			-o-transform: scale(1) rotateY(360deg);
			transform: scale(1) rotateY(360deg);

			-webkit-animation-direction: reverse;
			-moz-animation-direction:    reverse;
			-o-animation-direction:      reverse;
			animation-direction:         reverse;
			}

		</style>
	</head>



<body background='imgs/bg/bg.jpg'>
	<div id=ko_hdr>
		<hr color=black height=10> <hr color=white height=10 >

		<a href=/ target=_blank><img src=imgs/btn/ko.png border=0 width=80 height=25></a>
			&nbsp &nbsp &nbsp . . . &nbsp &nbsp &nbsp

		<a href=koh5_aerotwist_menu.html target=_blank><img src=imgs/btn/kolb.png border=0 width=40 height=12></a>
			&nbsp &nbsp &nbsp . . . &nbsp &nbsp &nbsp

		<a href=koh5_aerotwist_btn.html target=_blank><img src=imgs/btn/korb.png border=0 width=40 height=12></a>

		<hr color=white height=10 > <hr color=black height=10 >
		</div>

	<div id="container">
		<div class="box"></div>
		<div class="box-back"></div>
		</div>

	<button id="animate" class="livedemo">Animate</button>
	<button id="animate" class="kogo">kogo</button>


// shim layer with setTimeout fallback always got hugz for Paul Irish
	<script>
		window.requestAnimFrame = (function(){
			return  window.requestAnimationFrame       ||
				window.webkitRequestAnimationFrame ||
				window.mozRequestAnimationFrame    ||
			function( callback ){
				window.setTimeout(callback, 1000 / 60);
				};
			})();

		var goButton = document.getElementById("animate");
		var container = document.getElementById("container");
		var animating = false;

		goButton.addEventListener('click', function() {

		if (animating) return;

		container.classList.add('active');
		animating = true;

		setTimeout(function() {
			requestAnimFrame(function() {
				animating = false;
				container.classList.remove('active');
				container.classList.toggle('reverse');
				});
			}, 680);
		});
		</script>
ATWIST_FLIP;
	return( $atwist_flip );
	} 

function html_atwist_send() {
	$atwist_send=<<<ATWIST_SEND


ATWIST_SEND;
	return( $atwist_send );
	} 

function html_neave() {} 
function html_neave_im() {
	$neave_im=<<<NEAVE_IM

<!-- <script src="neave_pixel-dust.2.js"></script> -->
<!-- <script src="neave_imagination.4.js"></script> -->

<script name="neave_pixeldust2_js" src="data:/text/plain;base64,KGZ1bmN0aW9uKCl7d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fGZ1bmN0aW9uKGNhbGxiYWNrKXtzZXRUaW1lb3V0KGNhbGxiYWNrLDEwMDAvNjApO307ZnVuY3Rpb24gRmx1aWRGaWVsZCgpe3ZhciBpdGVyYXRpb25zPTQsZHQ9MC4wNSxkYW1wPTAuOTksZGVucyxkZW5zX3ByZXYsdSx1X3ByZXYsdix2X3ByZXYsd2lkdGgsaGVpZ2h0LHJvd1NpemUsc2l6ZTtmdW5jdGlvbiBGaWVsZChkZW5zLHUsdil7dGhpcy5nZXREZW5zaXR5PWZ1bmN0aW9uKHgseSl7cmV0dXJuIGRlbnNbKHgrMSkrKHkrMSkqcm93U2l6ZV07fTt0aGlzLnNldERlbnNpdHk9ZnVuY3Rpb24oeCx5LGQpe2RlbnNbKHgrMSkrKHkrMSkqcm93U2l6ZV09ZDt9O3RoaXMuc2V0VmVsb2NpdHk9ZnVuY3Rpb24oeCx5LHh2LHl2KXt1Wyh4KzEpKyh5KzEpKnJvd1NpemVdPXh2O3ZbKHgrMSkrKHkrMSkqcm93U2l6ZV09eXY7fTt9CmZ1bmN0aW9uIGFkZEZpZWxkcyh4LHMpe2Zvcih2YXIgaT1zaXplO2ktLTspeFtpXSs9c1tpXSpkdDt9CmZ1bmN0aW9uIHNldEJvdW5kYXJ5KGIseCl7aWYoYj09PTEpe2Zvcih2YXIgaT0xO2k8PXdpZHRoO2krKyl7eFtpXT14W2krcm93U2l6ZV07eFtpKyhoZWlnaHQrMSkqcm93U2l6ZV09eFtpK2hlaWdodCpyb3dTaXplXTt9CmZvcih2YXIgaj0xO2k8PWhlaWdodDtpKyspe3hbaipyb3dTaXplXT0teFsxK2oqcm93U2l6ZV07eFsod2lkdGgrMSkraipyb3dTaXplXT0teFt3aWR0aCtqKnJvd1NpemVdO319ZWxzZSBpZihiPT09Mil7Zm9yKHZhciBpPTE7aTw9d2lkdGg7aSsrKXt4W2ldPS14W2krcm93U2l6ZV07eFtpKyhoZWlnaHQrMSkqcm93U2l6ZV09LXhbaStoZWlnaHQqcm93U2l6ZV07fQpmb3IodmFyIGo9MTtqPD1oZWlnaHQ7aisrKXt4W2oqcm93U2l6ZV09eFsxK2oqcm93U2l6ZV07eFsod2lkdGgrMSkraipyb3dTaXplXT14W3dpZHRoK2oqcm93U2l6ZV07fX1lbHNle2Zvcih2YXIgaT0xO2k8PXdpZHRoO2krKyl7eFtpXT14W2krcm93U2l6ZV07eFtpKyhoZWlnaHQrMSkqcm93U2l6ZV09eFtpK2hlaWdodCpyb3dTaXplXTt9CmZvcih2YXIgaj0xO2o8PWhlaWdodDtqKyspe3hbaipyb3dTaXplXT14WzEraipyb3dTaXplXTt4Wyh3aWR0aCsxKStqKnJvd1NpemVdPXhbd2lkdGgraipyb3dTaXplXTt9fQp2YXIgbWF4RWRnZT0oaGVpZ2h0KzEpKnJvd1NpemU7eFswXT0wLjUqKHhbMV0reFtyb3dTaXplXSk7eFttYXhFZGdlXT0wLjUqKHhbMSttYXhFZGdlXSt4W2hlaWdodCpyb3dTaXplXSk7eFsod2lkdGgrMSldPTAuNSooeFt3aWR0aF0reFsod2lkdGgrMSkrcm93U2l6ZV0pO3hbKHdpZHRoKzEpK21heEVkZ2VdPTAuNSooeFt3aWR0aCttYXhFZGdlXSt4Wyh3aWR0aCsxKStoZWlnaHQqcm93U2l6ZV0pO30KZnVuY3Rpb24gZGlmZnVzZShiLHgseDApe3ZhciBhPTA7c29sdmVMaW5lYXIoYix4LHgwLGEsMSs0KmEpO30KZnVuY3Rpb24gZGlmZnVzZTIoeCx4MCx5LHkwKXt2YXIgYT0wO3NvbHZlTGluZWFyMih4LHgwLHkseTAsYSw0KmErMSk7fQpmdW5jdGlvbiBzb2x2ZUxpbmVhcihiLHgseDAsYSxjKXtpZihhPT09MCYmYz09PTEpe2Zvcih2YXIgaj0xO2o8PWhlaWdodDtqKyspe3ZhciBjdXJyZW50Um93PWoqcm93U2l6ZTtjdXJyZW50Um93Kys7Zm9yKHZhciBpPTA7aTx3aWR0aDtpKyspe3hbY3VycmVudFJvd109eDBbY3VycmVudFJvd107Y3VycmVudFJvdysrO319CnNldEJvdW5kYXJ5KGIseCk7fQplbHNle3ZhciBpbnZDPTEvYztmb3IodmFyIGs9MDtrPGl0ZXJhdGlvbnM7aysrKXtmb3IodmFyIGo9MTtqPD1oZWlnaHQ7aisrKXt2YXIgbGFzdFJvdz0oai0xKSpyb3dTaXplO3ZhciBjdXJyZW50Um93PWoqcm93U2l6ZTt2YXIgbmV4dFJvdz0oaisxKSpyb3dTaXplO3ZhciBsYXN0WD14W2N1cnJlbnRSb3ddO2N1cnJlbnRSb3crKztmb3IodmFyIGk9MTtpPD13aWR0aDtpKyspe2xhc3RYPXhbY3VycmVudFJvd109KHgwW2N1cnJlbnRSb3ddK2EqKGxhc3RYK3hbKytjdXJyZW50Um93XSt4WysrbGFzdFJvd10reFsrK25leHRSb3ddKSkqaW52Qzt9fQpzZXRCb3VuZGFyeShiLHgpO319fQpmdW5jdGlvbiBzb2x2ZUxpbmVhcjIoeCx4MCx5LHkwLGEsYyl7aWYoYT09PTAmJmM9PT0xKXtmb3IodmFyIGo9MTtqPD1oZWlnaHQ7aisrKXt2YXIgY3VycmVudFJvdz1qKnJvd1NpemU7Y3VycmVudFJvdysrO2Zvcih2YXIgaT0wO2k8d2lkdGg7aSsrKXt4W2N1cnJlbnRSb3ddPXgwW2N1cnJlbnRSb3ddO3lbY3VycmVudFJvd109eTBbY3VycmVudFJvd107Y3VycmVudFJvdysrO319CnNldEJvdW5kYXJ5KDEseCk7c2V0Qm91bmRhcnkoMix5KTt9CmVsc2V7dmFyIGludkM9MS9jO2Zvcih2YXIgaz0wO2s8aXRlcmF0aW9ucztrKyspe2Zvcih2YXIgaj0xO2o8PWhlaWdodDtqKyspe3ZhciBsYXN0Um93PShqLTEpKnJvd1NpemU7dmFyIGN1cnJlbnRSb3c9aipyb3dTaXplO3ZhciBuZXh0Um93PShqKzEpKnJvd1NpemU7dmFyIGxhc3RYPXhbY3VycmVudFJvd107dmFyIGxhc3RZPXlbY3VycmVudFJvd107Y3VycmVudFJvdysrO2Zvcih2YXIgaT0xO2k8PXdpZHRoO2krKyl7bGFzdFg9eFtjdXJyZW50Um93XT0oeDBbY3VycmVudFJvd10rYSoobGFzdFgreFtjdXJyZW50Um93XSt4W2xhc3RSb3ddK3hbbmV4dFJvd10pKSppbnZDO2xhc3RZPXlbY3VycmVudFJvd109KHkwW2N1cnJlbnRSb3ddK2EqKGxhc3RZK3lbKytjdXJyZW50Um93XSt5WysrbGFzdFJvd10reVsrK25leHRSb3ddKSkqaW52Qzt9fQpzZXRCb3VuZGFyeSgxLHgpO3NldEJvdW5kYXJ5KDIseSk7fX19CmZ1bmN0aW9uIGFkdmVjdChiLGQsZDAsdSx2KXt2YXIgd2R0MD13aWR0aCpkdCxoZHQwPWhlaWdodCpkdCx3cDU9d2lkdGgrMC41LGhwNT1oZWlnaHQrMC41O2Zvcih2YXIgaj0xO2o8PWhlaWdodDtqKyspe3ZhciBwb3M9aipyb3dTaXplO2Zvcih2YXIgaT0xO2k8PXdpZHRoO2krKyl7dmFyIHg9aS13ZHQwKnVbKytwb3NdLHk9ai1oZHQwKnZbcG9zXTtpZih4PDAuNSl4PTAuNTtlbHNlIGlmKHg+d3A1KXg9d3A1O3ZhciBpMD14fDAsaTE9aTArMTtpZih5PDAuNSl5PTAuNTtlbHNlIGlmKHk+aHA1KXk9aHA1O3ZhciBqMD15fDAsajE9ajArMSxzMT14LWkwLHMwPTEtczEsdDE9eS1qMCx0MD0xLXQxLHJvdzE9ajAqcm93U2l6ZSxyb3cyPWoxKnJvd1NpemU7ZFtwb3NdPXMwKih0MCpkMFtpMCtyb3cxXSt0MSpkMFtpMCtyb3cyXSkrczEqKHQwKmQwW2kxK3JvdzFdK3QxKmQwW2kxK3JvdzJdKTt9fQpzZXRCb3VuZGFyeShiLGQpO30KZnVuY3Rpb24gcHJvamVjdCh1LHYscCxkaXYpe3ZhciBoPS0wLjUvTWF0aC5zcXJ0KHdpZHRoKmhlaWdodCk7Zm9yKHZhciBqPTE7ajw9aGVpZ2h0O2orKyl7dmFyIHJvdz1qKnJvd1NpemUscHJldlJvdz0oai0xKSpyb3dTaXplLHByZXZWYWx1ZT1yb3ctMSxjdXJyZW50Um93PXJvdyxuZXh0VmFsdWU9cm93KzEsbmV4dFJvdz0oaisxKSpyb3dTaXplO2Zvcih2YXIgaT0xO2k8PXdpZHRoO2krKyl7ZGl2WysrY3VycmVudFJvd109aCoodVsrK25leHRWYWx1ZV0tdVsrK3ByZXZWYWx1ZV0rdlsrK25leHRSb3ddLXZbKytwcmV2Um93XSk7cFtjdXJyZW50Um93XT0wO319CnNldEJvdW5kYXJ5KDAsZGl2KTtzZXRCb3VuZGFyeSgwLHApO3NvbHZlTGluZWFyKDAscCxkaXYsMSw0KTt2YXIgd1NjYWxlPTAuNSp3aWR0aCxoU2NhbGU9MC41KmhlaWdodDtmb3IodmFyIGo9MTtqPD1oZWlnaHQ7aisrKXt2YXIgcHJldlBvcz1qKnJvd1NpemUtMSxjdXJyZW50UG9zPWoqcm93U2l6ZSxuZXh0UG9zPWoqcm93U2l6ZSsxLHByZXZSb3c9KGotMSkqcm93U2l6ZSxjdXJyZW50Um93PWoqcm93U2l6ZSxuZXh0Um93PShqKzEpKnJvd1NpemU7Zm9yKHZhciBpPTE7aTw9d2lkdGg7aSsrKXt1WysrY3VycmVudFBvc10tPXdTY2FsZSoocFsrK25leHRQb3NdLXBbKytwcmV2UG9zXSk7dltjdXJyZW50UG9zXS09aFNjYWxlKihwWysrbmV4dFJvd10tcFsrK3ByZXZSb3ddKTt9fQpzZXRCb3VuZGFyeSgxLHUpO3NldEJvdW5kYXJ5KDIsdik7fQpmdW5jdGlvbiBkZW5zaXR5U3RlcCh4LHgwLHUsdil7YWRkRmllbGRzKHgseDApO2RpZmZ1c2UoMCx4MCx4KTthZHZlY3QoMCx4LHgwLHUsdik7fQpmdW5jdGlvbiB2ZWxvY2l0eVN0ZXAodSx2LHUwLHYwKXthZGRGaWVsZHModSx1MCk7YWRkRmllbGRzKHYsdjApO3ZhciB0ZW1wPXUwO3UwPXU7dT10ZW1wO3RlbXA9djA7djA9djt2PXRlbXA7ZGlmZnVzZTIodSx1MCx2LHYwKTtwcm9qZWN0KHUsdix1MCx2MCk7dGVtcD11MDt1MD11O3U9dGVtcDt0ZW1wPXYwO3YwPXY7dj10ZW1wO2FkdmVjdCgxLHUsdTAsdTAsdjApO2FkdmVjdCgyLHYsdjAsdTAsdjApO3Byb2plY3QodSx2LHUwLHYwKTt9CnRoaXMudXBkYXRlPWZ1bmN0aW9uKCl7Zm9yKHZhciBpPXNpemU7aS0tOyl7dV9wcmV2W2ldPXZfcHJldltpXT1kZW5zX3ByZXZbaV09MDtkZW5zW2ldKj1kYW1wO30KdXBkYXRlRnJhbWUobmV3IEZpZWxkKGRlbnNfcHJldix1X3ByZXYsdl9wcmV2KSk7dmVsb2NpdHlTdGVwKHUsdix1X3ByZXYsdl9wcmV2KTtkZW5zaXR5U3RlcChkZW5zLGRlbnNfcHJldix1LHYpO2RyYXdGcmFtZShuZXcgRmllbGQoZGVucyx1LHYpKTt9O3RoaXMucmVzZXQ9ZnVuY3Rpb24oKXtyb3dTaXplPXdpZHRoKzI7c2l6ZT0od2lkdGgrMikqKGhlaWdodCsyKTtkZW5zPW5ldyBBcnJheShzaXplKTtkZW5zX3ByZXY9bmV3IEFycmF5KHNpemUpO3U9bmV3IEFycmF5KHNpemUpO3VfcHJldj1uZXcgQXJyYXkoc2l6ZSk7dj1uZXcgQXJyYXkoc2l6ZSk7dl9wcmV2PW5ldyBBcnJheShzaXplKTtmb3IodmFyIGk9c2l6ZTtpLS07KXtkZW5zX3ByZXZbaV09dV9wcmV2W2ldPXZfcHJldltpXT1kZW5zW2ldPXVbaV09dltpXT0wO319O3RoaXMuc2V0UmVzb2x1dGlvbj1mdW5jdGlvbih3LGgpe3dpZHRoPXc7aGVpZ2h0PWg7dGhpcy5yZXNldCgpO307fQp2YXIgZ2V0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IuYmluZChkb2N1bWVudCksb249ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lci5iaW5kKGRvY3VtZW50KSxjYW52YXMsY29udGV4dCxzY2FsZSxkaXNwbGF5V2lkdGgsZGlzcGxheUhlaWdodCxmaWVsZFNpemU9NCxmaWVsZFdpZHRoLGZpZWxkSGVpZ2h0LG9teD0wLG9teT0wLG14PTAsbXk9MCxkZW5zaXR5PTIwMCxkcmF3aW5nPWZhbHNlLGJ1ZmZlcixidWZmZXJEYXRhLGZsdWlkO2Z1bmN0aW9uIGluaXRCdWZmZXIoKXt9CmZ1bmN0aW9uIHVwZGF0ZUZyYW1lKGZpZWxkKXtpZihkcmF3aW5nKXt2YXIgZHg9bXgtb214LGR5PW15LW9teSxsZW5ndGg9KE1hdGguc3FydChkeCpkeCtkeSpkeSkrMC41KXwwO2lmKGxlbmd0aDwxKWxlbmd0aD0xO2Zvcih2YXIgaT1sZW5ndGg7aS0tOyl7dmFyIHg9KChvbXgrZHgqaS9sZW5ndGgpL2Rpc3BsYXlXaWR0aCpmaWVsZFdpZHRoKXwwLHk9KChvbXkrZHkqaS9sZW5ndGgpL2Rpc3BsYXlIZWlnaHQqZmllbGRIZWlnaHQpfDA7ZmllbGQuc2V0VmVsb2NpdHkoeCx5LGR4LGR5KTtmaWVsZC5zZXREZW5zaXR5KHgseSxkZW5zaXR5KTt9Cm9teD1teDtvbXk9bXk7fX0KZnVuY3Rpb24gZHJhd0ZyYW1lKGZpZWxkKXtmb3IodmFyIHg9ZmllbGRXaWR0aDt4LS07KXtmb3IodmFyIHk9ZmllbGRIZWlnaHQ7eS0tOyl7YnVmZmVyRGF0YVsoeSpmaWVsZFdpZHRoK3gpKjQrTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjMpXT1maWVsZC5nZXREZW5zaXR5KHgseSkqMHhmZjt9fQpjb250ZXh0LnB1dEltYWdlRGF0YShidWZmZXIsMCwwKTt9CmZ1bmN0aW9uIHVwZGF0ZUZsdWlkKCl7dXBkYXRlSUQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHVwZGF0ZUZsdWlkKTtmbHVpZC51cGRhdGUoKTt9CmZ1bmN0aW9uIGdldE5vcm1IZWlnaHQoKXtyZXR1cm4gaW5uZXJIZWlnaHQvZmllbGRIZWlnaHQvZmllbGRTaXplO30KZnVuY3Rpb24gZ2V0Tm9ybVdpZHRoKCl7cmV0dXJuIGlubmVyV2lkdGgvZmllbGRXaWR0aC9maWVsZFNpemU7fQpmdW5jdGlvbiBzZXRTaXplKCl7ZGlzcGxheVdpZHRoPU1hdGgucm91bmQoaW5uZXJXaWR0aCk7ZGlzcGxheUhlaWdodD1NYXRoLnJvdW5kKGlubmVySGVpZ2h0KTtvbXg9ZGlzcGxheVdpZHRoLzI7b215PWRpc3BsYXlIZWlnaHQvMjtteD1vbXgrKE1hdGgucmFuZG9tKCktMC41KSo0O215PW9teSsoTWF0aC5yYW5kb20oKS0wLjUpKjQ7ZmllbGRXaWR0aD1NYXRoLnJvdW5kKGRpc3BsYXlXaWR0aC9maWVsZFNpemUpO2ZpZWxkSGVpZ2h0PU1hdGgucm91bmQoZGlzcGxheUhlaWdodC9maWVsZFNpemUpO2NhbnZhcy53aWR0aD1maWVsZFdpZHRoO2NhbnZhcy5oZWlnaHQ9ZmllbGRIZWlnaHQ7fQpmdW5jdGlvbiBpbml0KCl7Y2FudmFzPWdldCgnY2FudmFzJyk7dHJ5e2NvbnRleHQ9Y2FudmFzLmdldENvbnRleHQoJzJkJyk7fWNhdGNoKGUpe2dldCgnLmFsdCcpLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJztyZXR1cm47fQpzZXRTaXplKCk7dmFyIGJ1ZmZlckNhbnZhcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtidWZmZXJDYW52YXMud2lkdGg9ZmllbGRXaWR0aDtidWZmZXJDYW52YXMuaGVpZ2h0PWZpZWxkSGVpZ2h0O3RyeXtidWZmZXI9YnVmZmVyQ2FudmFzLmdldENvbnRleHQoJzJkJykuY3JlYXRlSW1hZ2VEYXRhKGZpZWxkV2lkdGgsZmllbGRIZWlnaHQpO2J1ZmZlckRhdGE9YnVmZmVyLmRhdGE7dmFyIHNpemU9ZmllbGRXaWR0aCpmaWVsZEhlaWdodCo0O2Zvcih2YXIgaT0zO2k8c2l6ZTtpKz00KXtidWZmZXJEYXRhW2ldPTB4ZmY7fX1jYXRjaChlKXtnZXQoJy5hbHQnKS5zdHlsZS5kaXNwbGF5PSdibG9jayc7cmV0dXJuO30KY2FudmFzLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJztpZihnZXQoJ2JvZHkubW9iaWxlJykpe2NhbnZhcy5vbnRvdWNoc3RhcnQ9ZnVuY3Rpb24oZXZlbnQpe2RyYXdpbmc9dHJ1ZTtvbXg9bXg9ZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WC9nZXROb3JtV2lkdGgoKTtvbXk9bXk9ZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WS9nZXROb3JtSGVpZ2h0KCk7ZXZlbnQucHJldmVudERlZmF1bHQoKTt9O2NhbnZhcy5vbnRvdWNobW92ZT1mdW5jdGlvbihldmVudCl7bXg9ZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WC9nZXROb3JtV2lkdGgoKTtteT1ldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZL2dldE5vcm1IZWlnaHQoKTt9O2NhbnZhcy5vbnRvdWNoZW5kPWZ1bmN0aW9uKCl7ZHJhd2luZz1mYWxzZTt9O31lbHNle2NhbnZhcy5vbm1vdXNlbW92ZT1mdW5jdGlvbihldmVudCl7bXg9ZXZlbnQuY2xpZW50WC9nZXROb3JtV2lkdGgoKTtteT1ldmVudC5jbGllbnRZL2dldE5vcm1IZWlnaHQoKTt9O30KZmx1aWQ9bmV3IEZsdWlkRmllbGQoKTtmbHVpZC5zZXRSZXNvbHV0aW9uKGNhbnZhcy53aWR0aCxjYW52YXMuaGVpZ2h0KTtkcmF3aW5nPXRydWU7dXBkYXRlRmx1aWQoKTt9Cm9uKCdET01Db250ZW50TG9hZGVkJyxpbml0KTt9KCkpOw==" ></script>


<!--
<script name="neave_imagination4_js" src="data:/text/plain,base64,KGZ1bmN0aW9uKCl7d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fGZ1bmN0aW9uKGNhbGxiYWNrKXtzZXRUaW1lb3V0KGNhbGxiYWNrLDEwMDAvNjApO307dmFyIGdldD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yLmJpbmQoZG9jdW1lbnQpLG9uPWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIuYmluZChkb2N1bWVudCksY29udGV4dCxjYW52YXMsbW91c2VYLG1vdXNlWSxweCxweSxwb2ludHM9W10sc2l6ZT0wLHJlZD0wLGdyZWVuPTI1NSxibHVlPTI1NSxzcHJlYWQsTUFYX1NQUkVBRD0zLFNQRUVEX1g9MC4xNSxTUEVFRF9ZPTAuMTUsTUFYX0xFTkdUSD0xMjAsUkVEX1NURVA9MC4wMixHUkVFTl9TVEVQPTAuMDE1LEJMVUVfU1RFUD0wLjAyNTtmdW5jdGlvbiBQb2ludCh4LHksZHgsZHksc2l6ZSxjb2xvcil7dGhpcy54PXg7dGhpcy55PXk7dGhpcy5keD1keDt0aGlzLmR5PWR5O3RoaXMuc2l6ZT1zaXplO3RoaXMuY29sb3I9Y29sb3I7fQpQb2ludC5wcm90b3R5cGUuc3ByZWFkPWZ1bmN0aW9uKCl7dGhpcy54Kz10aGlzLmR4O3RoaXMueSs9dGhpcy5keTt9O2Z1bmN0aW9uIGRyYXdMaW5lcygpe3ZhciBwMCxwMSxwMix0b3RhbD1wb2ludHMubGVuZ3RoO2Zvcih2YXIgaT10b3RhbC0xO2k+MTtpLS0pe3AwPXBvaW50c1tpXTtwMT1wb2ludHNbaS0xXTtwMj1wb2ludHNbaS0yXTtjb250ZXh0LmJlZ2luUGF0aCgpO2NvbnRleHQuc3Ryb2tlU3R5bGU9cDAuY29sb3I7Y29udGV4dC5saW5lV2lkdGg9cDAuc2l6ZTtjb250ZXh0Lmdsb2JhbEFscGhhPWkvdG90YWw7Y29udGV4dC5tb3ZlVG8oKHAxLngrcDAueCkvMiwocDEueStwMC55KS8yKTtjb250ZXh0LnF1YWRyYXRpY0N1cnZlVG8ocDEueCxwMS55LChwMS54K3AyLngpLzIsKHAxLnkrcDIueSkvMik7Y29udGV4dC5zdHJva2UoKTtwMC5zcHJlYWQoKTt9CnBvaW50c1swXS5zcHJlYWQoKTtwb2ludHNbdG90YWwtMV0uc3ByZWFkKCk7fQpmdW5jdGlvbiBkcmF3KCl7dmFyIGR4PShtb3VzZVgtcHgpKlNQRUVEX1gsZHk9KG1vdXNlWS1weSkqU1BFRURfWTtpZihkeDwtc3ByZWFkKXtkeD0tc3ByZWFkO31lbHNlIGlmKGR4PnNwcmVhZCl7ZHg9c3ByZWFkO30KaWYoZHk8LXNwcmVhZCl7ZHk9LXNwcmVhZDt9ZWxzZSBpZihkeT5zcHJlYWQpe2R5PXNwcmVhZDt9CnB4PW1vdXNlWDtweT1tb3VzZVk7cG9pbnRzLnB1c2gobmV3IFBvaW50KHB4LHB5LGR4LGR5LE1hdGguYWJzKE1hdGguc2luKHNpemUrPTAuMTI1KSoxMCkrMSwncmdiKCcrCihNYXRoLmZsb29yKE1hdGguc2luKHJlZCs9UkVEX1NURVApKjEyOCsxMjgpKSsnLCcrCihNYXRoLmZsb29yKE1hdGguc2luKGdyZWVuKz1HUkVFTl9TVEVQKSoxMjgrMTI4KSkrJywnKwooTWF0aC5mbG9vcihNYXRoLnNpbihibHVlKz1CTFVFX1NURVApKjEyOCsxMjgpKSsnKScpKTtpZihwb2ludHMubGVuZ3RoPk1BWF9MRU5HVEgpcG9pbnRzLnNoaWZ0KCk7Y29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249J3NvdXJjZS1vdmVyJztjb250ZXh0Lmdsb2JhbEFscGhhPTE7Y29udGV4dC5maWxsU3R5bGU9J3JnYmEoMCwgMCwgMCwgMC4wNSknO2NvbnRleHQuZmlsbFJlY3QoMCwwLGNhbnZhcy53aWR0aCxjYW52YXMuaGVpZ2h0KTtjb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0nbGlnaHRlcic7ZHJhd0xpbmVzKCk7ZHJhd0xpbmVzKCk7ZHJhd0xpbmVzKCk7fQpmdW5jdGlvbiB1cGRhdGUoKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUodXBkYXRlKTtkcmF3KCk7fQpmdW5jdGlvbiByZXNpemUoKXtjYW52YXMud2lkdGg9aW5uZXJXaWR0aDtjYW52YXMuaGVpZ2h0PWlubmVySGVpZ2h0O30KZnVuY3Rpb24gaW5pdCgpe2NhbnZhcz1nZXQoJ2NhbnZhcycpO3RyeXtjb250ZXh0PWNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO31jYXRjaChlKXtnZXQoJy5hbHQnKS5zdHlsZS5kaXNwbGF5PSdibG9jayc7cmV0dXJuO30KY2FudmFzLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJztjYW52YXMub25tb3VzZW1vdmU9ZnVuY3Rpb24oZXZlbnQpe21vdXNlWD1ldmVudC5wYWdlWDttb3VzZVk9ZXZlbnQucGFnZVk7fTtkb2N1bWVudC5vbm1vdXNlZW50ZXI9ZnVuY3Rpb24oZXZlbnQpe21vdXNlWD1ldmVudC5wYWdlWDttb3VzZVk9ZXZlbnQucGFnZVk7Zm9yKHZhciBpPXBvaW50cy5sZW5ndGg7aS0tOyl7cG9pbnRzW2ldLng9bW91c2VYO3BvaW50c1tpXS55PW1vdXNlWTt9fTtjYW52YXMub250b3VjaG1vdmU9ZnVuY3Rpb24oZXZlbnQpe21vdXNlWD1ldmVudC50YXJnZXRUb3VjaGVzWzBdLnBhZ2VYO21vdXNlWT1ldmVudC50YXJnZXRUb3VjaGVzWzBdLnBhZ2VZO3NwcmVhZD0xO307Y2FudmFzLm9udG91Y2hzdGFydD1mdW5jdGlvbihldmVudCl7c3ByZWFkPTA7bW91c2VYPWV2ZW50LnRhcmdldFRvdWNoZXNbMF0ucGFnZVg7bW91c2VZPWV2ZW50LnRhcmdldFRvdWNoZXNbMF0ucGFnZVk7Zm9yKHZhciBpPXBvaW50cy5sZW5ndGg7aS0tOyl7cG9pbnRzW2ldLng9bW91c2VYO3BvaW50c1tpXS55PW1vdXNlWTt9CmlmKCFldmVudC50YXJnZXQuaHJlZil7ZXZlbnQucHJldmVudERlZmF1bHQoKTt9fTt3aW5kb3cub25yZXNpemU9cmVzaXplO3Jlc2l6ZSgpO21vdXNlWD1jYW52YXMud2lkdGgvMjttb3VzZVk9Y2FudmFzLmhlaWdodC8yO3VwZGF0ZSgpO30Kb24oJ0RPTUNvbnRlbnRMb2FkZWQnLGluaXQpO30oKSk7"></script>
	-->
<body>

<!-- <a class="neave" href="https://neave.com"><img src="./imgs/btn/koeye.png</a> -->
<a name="neave" href="https://neave.com" target=_blank><img src="./imgs/btn/koeye.png</a>


<~-- <canvas width=392 height=221 style='display: block;"></canvas> -->
<!-- <canvas width=800 height=600 style='display: block;"></canvas> -->
<canvas width=800 height=600 "></canvas> -->
NEAVE_IM;
	return( $neave_im );
	} 


function html_neave_wb() {
	$neave_wb=<<<NEAVE_WB

	<style class="cp-pen-styles">body {
		margin: 0;
		}</style>

	<!--
	<script src='datgui_min.js'></script>
	<script src='./js/css_live_reload_init.js'></script>
	-->

<script name="script_datgui_min_js" src="data:/text/plain;base64,LyoqCiAqIGRhdC1ndWkgSmF2YVNjcmlwdCBDb250cm9sbGVyIExpYnJhcnkKICogaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2RhdC1ndWkKICoKICogQ29weXJpZ2h0IDIwMTEgRGF0YSBBcnRzIFRlYW0sIEdvb2dsZSBDcmVhdGl2ZSBMYWIKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKi8KdmFyIGRhdD1kYXR8fHt9O2RhdC5ndWk9ZGF0Lmd1aXx8e307ZGF0LnV0aWxzPWRhdC51dGlsc3x8e307ZGF0LmNvbnRyb2xsZXJzPWRhdC5jb250cm9sbGVyc3x8e307ZGF0LmRvbT1kYXQuZG9tfHx7fTtkYXQuY29sb3I9ZGF0LmNvbG9yfHx7fTtkYXQudXRpbHMuY3NzPWZ1bmN0aW9uKCl7cmV0dXJue2xvYWQ6ZnVuY3Rpb24oZSxhKXt2YXIgYT1hfHxkb2N1bWVudCxjPWEuY3JlYXRlRWxlbWVudCgibGluayIpO2MudHlwZT0idGV4dC9jc3MiO2MucmVsPSJzdHlsZXNoZWV0IjtjLmhyZWY9ZTthLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0uYXBwZW5kQ2hpbGQoYyl9LGluamVjdDpmdW5jdGlvbihlLGEpe3ZhciBhPWF8fGRvY3VtZW50LGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtjLnR5cGU9InRleHQvY3NzIjtjLmlubmVySFRNTD1lO2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXS5hcHBlbmRDaGlsZChjKX19fSgpOwpkYXQudXRpbHMuY29tbW9uPWZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLmZvckVhY2gsYT1BcnJheS5wcm90b3R5cGUuc2xpY2U7cmV0dXJue0JSRUFLOnt9LGV4dGVuZDpmdW5jdGlvbihjKXt0aGlzLmVhY2goYS5jYWxsKGFyZ3VtZW50cywxKSxmdW5jdGlvbihhKXtmb3IodmFyIGYgaW4gYSl0aGlzLmlzVW5kZWZpbmVkKGFbZl0pfHwoY1tmXT1hW2ZdKX0sdGhpcyk7cmV0dXJuIGN9LGRlZmF1bHRzOmZ1bmN0aW9uKGMpe3RoaXMuZWFjaChhLmNhbGwoYXJndW1lbnRzLDEpLGZ1bmN0aW9uKGEpe2Zvcih2YXIgZiBpbiBhKXRoaXMuaXNVbmRlZmluZWQoY1tmXSkmJihjW2ZdPWFbZl0pfSx0aGlzKTtyZXR1cm4gY30sY29tcG9zZTpmdW5jdGlvbigpe3ZhciBjPWEuY2FsbChhcmd1bWVudHMpO3JldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgZD1hLmNhbGwoYXJndW1lbnRzKSxmPWMubGVuZ3RoLTE7Zj49MDtmLS0pZD1bY1tmXS5hcHBseSh0aGlzLGQpXTtyZXR1cm4gZFswXX19LAplYWNoOmZ1bmN0aW9uKGEsZCxmKXtpZihlJiZhLmZvckVhY2g9PT1lKWEuZm9yRWFjaChkLGYpO2Vsc2UgaWYoYS5sZW5ndGg9PT1hLmxlbmd0aCswKWZvcih2YXIgYj0wLG49YS5sZW5ndGg7YjxuO2IrKyl7aWYoYiBpbiBhJiZkLmNhbGwoZixhW2JdLGIpPT09dGhpcy5CUkVBSylicmVha31lbHNlIGZvcihiIGluIGEpaWYoZC5jYWxsKGYsYVtiXSxiKT09PXRoaXMuQlJFQUspYnJlYWt9LGRlZmVyOmZ1bmN0aW9uKGEpe3NldFRpbWVvdXQoYSwwKX0sdG9BcnJheTpmdW5jdGlvbihjKXtyZXR1cm4gYy50b0FycmF5P2MudG9BcnJheSgpOmEuY2FsbChjKX0saXNVbmRlZmluZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT12b2lkIDB9LGlzTnVsbDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PW51bGx9LGlzTmFOOmZ1bmN0aW9uKGEpe3JldHVybiBhIT09YX0saXNBcnJheTpBcnJheS5pc0FycmF5fHxmdW5jdGlvbihhKXtyZXR1cm4gYS5jb25zdHJ1Y3Rvcj09PUFycmF5fSxpc09iamVjdDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PQpPYmplY3QoYSl9LGlzTnVtYmVyOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09YSswfSxpc1N0cmluZzpmdW5jdGlvbihhKXtyZXR1cm4gYT09PWErIiJ9LGlzQm9vbGVhbjpmdW5jdGlvbihhKXtyZXR1cm4gYT09PWZhbHNlfHxhPT09dHJ1ZX0saXNGdW5jdGlvbjpmdW5jdGlvbihhKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpPT09IltvYmplY3QgRnVuY3Rpb25dIn19fSgpOwpkYXQuY29udHJvbGxlcnMuQ29udHJvbGxlcj1mdW5jdGlvbihlKXt2YXIgYT1mdW5jdGlvbihhLGQpe3RoaXMuaW5pdGlhbFZhbHVlPWFbZF07dGhpcy5kb21FbGVtZW50PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMub2JqZWN0PWE7dGhpcy5wcm9wZXJ0eT1kO3RoaXMuX19vbkZpbmlzaENoYW5nZT10aGlzLl9fb25DaGFuZ2U9dm9pZCAwfTtlLmV4dGVuZChhLnByb3RvdHlwZSx7b25DaGFuZ2U6ZnVuY3Rpb24oYSl7dGhpcy5fX29uQ2hhbmdlPWE7cmV0dXJuIHRoaXN9LG9uRmluaXNoQ2hhbmdlOmZ1bmN0aW9uKGEpe3RoaXMuX19vbkZpbmlzaENoYW5nZT1hO3JldHVybiB0aGlzfSxzZXRWYWx1ZTpmdW5jdGlvbihhKXt0aGlzLm9iamVjdFt0aGlzLnByb3BlcnR5XT1hO3RoaXMuX19vbkNoYW5nZSYmdGhpcy5fX29uQ2hhbmdlLmNhbGwodGhpcyxhKTt0aGlzLnVwZGF0ZURpc3BsYXkoKTtyZXR1cm4gdGhpc30sZ2V0VmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vYmplY3RbdGhpcy5wcm9wZXJ0eV19LAp1cGRhdGVEaXNwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGlzTW9kaWZpZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbml0aWFsVmFsdWUhPT10aGlzLmdldFZhbHVlKCl9fSk7cmV0dXJuIGF9KGRhdC51dGlscy5jb21tb24pOwpkYXQuZG9tLmRvbT1mdW5jdGlvbihlKXtmdW5jdGlvbiBhKGIpe2lmKGI9PT0iMCJ8fGUuaXNVbmRlZmluZWQoYikpcmV0dXJuIDA7Yj1iLm1hdGNoKGQpO3JldHVybiFlLmlzTnVsbChiKT9wYXJzZUZsb2F0KGJbMV0pOjB9dmFyIGM9e307ZS5lYWNoKHtIVE1MRXZlbnRzOlsiY2hhbmdlIl0sTW91c2VFdmVudHM6WyJjbGljayIsIm1vdXNlbW92ZSIsIm1vdXNlZG93biIsIm1vdXNldXAiLCJtb3VzZW92ZXIiXSxLZXlib2FyZEV2ZW50czpbImtleWRvd24iXX0sZnVuY3Rpb24oYixhKXtlLmVhY2goYixmdW5jdGlvbihiKXtjW2JdPWF9KX0pO3ZhciBkPS8oXGQrKFwuXGQrKT8pcHgvLGY9e21ha2VTZWxlY3RhYmxlOmZ1bmN0aW9uKGIsYSl7aWYoIShiPT09dm9pZCAwfHxiLnN0eWxlPT09dm9pZCAwKSliLm9uc2VsZWN0c3RhcnQ9YT9mdW5jdGlvbigpe3JldHVybiBmYWxzZX06ZnVuY3Rpb24oKXt9LGIuc3R5bGUuTW96VXNlclNlbGVjdD1hPyJhdXRvIjoibm9uZSIsYi5zdHlsZS5LaHRtbFVzZXJTZWxlY3Q9CmE/ImF1dG8iOiJub25lIixiLnVuc2VsZWN0YWJsZT1hPyJvbiI6Im9mZiJ9LG1ha2VGdWxsc2NyZWVuOmZ1bmN0aW9uKGIsYSxkKXtlLmlzVW5kZWZpbmVkKGEpJiYoYT10cnVlKTtlLmlzVW5kZWZpbmVkKGQpJiYoZD10cnVlKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7aWYoYSliLnN0eWxlLmxlZnQ9MCxiLnN0eWxlLnJpZ2h0PTA7aWYoZCliLnN0eWxlLnRvcD0wLGIuc3R5bGUuYm90dG9tPTB9LGZha2VFdmVudDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgZD1kfHx7fSxtPWNbYV07aWYoIW0pdGhyb3cgRXJyb3IoIkV2ZW50IHR5cGUgIithKyIgbm90IHN1cHBvcnRlZC4iKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFdmVudChtKTtzd2l0Y2gobSl7Y2FzZSAiTW91c2VFdmVudHMiOmwuaW5pdE1vdXNlRXZlbnQoYSxkLmJ1YmJsZXN8fGZhbHNlLGQuY2FuY2VsYWJsZXx8dHJ1ZSx3aW5kb3csZC5jbGlja0NvdW50fHwxLDAsMCxkLnh8fGQuY2xpZW50WHx8MCxkLnl8fGQuY2xpZW50WXx8CjAsZmFsc2UsZmFsc2UsZmFsc2UsZmFsc2UsMCxudWxsKTticmVhaztjYXNlICJLZXlib2FyZEV2ZW50cyI6bT1sLmluaXRLZXlib2FyZEV2ZW50fHxsLmluaXRLZXlFdmVudDtlLmRlZmF1bHRzKGQse2NhbmNlbGFibGU6dHJ1ZSxjdHJsS2V5OmZhbHNlLGFsdEtleTpmYWxzZSxzaGlmdEtleTpmYWxzZSxtZXRhS2V5OmZhbHNlLGtleUNvZGU6dm9pZCAwLGNoYXJDb2RlOnZvaWQgMH0pO20oYSxkLmJ1YmJsZXN8fGZhbHNlLGQuY2FuY2VsYWJsZSx3aW5kb3csZC5jdHJsS2V5LGQuYWx0S2V5LGQuc2hpZnRLZXksZC5tZXRhS2V5LGQua2V5Q29kZSxkLmNoYXJDb2RlKTticmVhaztkZWZhdWx0OmwuaW5pdEV2ZW50KGEsZC5idWJibGVzfHxmYWxzZSxkLmNhbmNlbGFibGV8fHRydWUpfWUuZGVmYXVsdHMobCxmKTtiLmRpc3BhdGNoRXZlbnQobCl9LGJpbmQ6ZnVuY3Rpb24oYixhLGQsYyl7Yi5hZGRFdmVudExpc3RlbmVyP2IuYWRkRXZlbnRMaXN0ZW5lcihhLGQsY3x8ZmFsc2UpOmIuYXR0YWNoRXZlbnQmJgpiLmF0dGFjaEV2ZW50KCJvbiIrYSxkKTtyZXR1cm4gZn0sdW5iaW5kOmZ1bmN0aW9uKGIsYSxkLGMpe2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSxkLGN8fGZhbHNlKTpiLmRldGFjaEV2ZW50JiZiLmRldGFjaEV2ZW50KCJvbiIrYSxkKTtyZXR1cm4gZn0sYWRkQ2xhc3M6ZnVuY3Rpb24oYixhKXtpZihiLmNsYXNzTmFtZT09PXZvaWQgMCliLmNsYXNzTmFtZT1hO2Vsc2UgaWYoYi5jbGFzc05hbWUhPT1hKXt2YXIgZD1iLmNsYXNzTmFtZS5zcGxpdCgvICsvKTtpZihkLmluZGV4T2YoYSk9PS0xKWQucHVzaChhKSxiLmNsYXNzTmFtZT1kLmpvaW4oIiAiKS5yZXBsYWNlKC9eXHMrLywiIikucmVwbGFjZSgvXHMrJC8sIiIpfXJldHVybiBmfSxyZW1vdmVDbGFzczpmdW5jdGlvbihiLGEpe2lmKGEpe2lmKGIuY2xhc3NOYW1lIT09dm9pZCAwKWlmKGIuY2xhc3NOYW1lPT09YSliLnJlbW92ZUF0dHJpYnV0ZSgiY2xhc3MiKTtlbHNle3ZhciBkPWIuY2xhc3NOYW1lLnNwbGl0KC8gKy8pLApjPWQuaW5kZXhPZihhKTtpZihjIT0tMSlkLnNwbGljZShjLDEpLGIuY2xhc3NOYW1lPWQuam9pbigiICIpfX1lbHNlIGIuY2xhc3NOYW1lPXZvaWQgMDtyZXR1cm4gZn0saGFzQ2xhc3M6ZnVuY3Rpb24oYSxkKXtyZXR1cm4gUmVnRXhwKCIoPzpefFxccyspIitkKyIoPzpcXHMrfCQpIikudGVzdChhLmNsYXNzTmFtZSl8fGZhbHNlfSxnZXRXaWR0aDpmdW5jdGlvbihiKXtiPWdldENvbXB1dGVkU3R5bGUoYik7cmV0dXJuIGEoYlsiYm9yZGVyLWxlZnQtd2lkdGgiXSkrYShiWyJib3JkZXItcmlnaHQtd2lkdGgiXSkrYShiWyJwYWRkaW5nLWxlZnQiXSkrYShiWyJwYWRkaW5nLXJpZ2h0Il0pK2EoYi53aWR0aCl9LGdldEhlaWdodDpmdW5jdGlvbihiKXtiPWdldENvbXB1dGVkU3R5bGUoYik7cmV0dXJuIGEoYlsiYm9yZGVyLXRvcC13aWR0aCJdKSthKGJbImJvcmRlci1ib3R0b20td2lkdGgiXSkrYShiWyJwYWRkaW5nLXRvcCJdKSthKGJbInBhZGRpbmctYm90dG9tIl0pK2EoYi5oZWlnaHQpfSwKZ2V0T2Zmc2V0OmZ1bmN0aW9uKGEpe3ZhciBkPXtsZWZ0OjAsdG9wOjB9O2lmKGEub2Zmc2V0UGFyZW50KXtkbyBkLmxlZnQrPWEub2Zmc2V0TGVmdCxkLnRvcCs9YS5vZmZzZXRUb3A7d2hpbGUoYT1hLm9mZnNldFBhcmVudCl9cmV0dXJuIGR9LGlzQWN0aXZlOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCYmKGEudHlwZXx8YS5ocmVmKX19O3JldHVybiBmfShkYXQudXRpbHMuY29tbW9uKTsKZGF0LmNvbnRyb2xsZXJzLk9wdGlvbkNvbnRyb2xsZXI9ZnVuY3Rpb24oZSxhLGMpe3ZhciBkPWZ1bmN0aW9uKGYsYixlKXtkLnN1cGVyY2xhc3MuY2FsbCh0aGlzLGYsYik7dmFyIGg9dGhpczt0aGlzLl9fc2VsZWN0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpO2lmKGMuaXNBcnJheShlKSl7dmFyIGo9e307Yy5lYWNoKGUsZnVuY3Rpb24oYSl7althXT1hfSk7ZT1qfWMuZWFjaChlLGZ1bmN0aW9uKGEsYil7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIik7ZC5pbm5lckhUTUw9YjtkLnNldEF0dHJpYnV0ZSgidmFsdWUiLGEpO2guX19zZWxlY3QuYXBwZW5kQ2hpbGQoZCl9KTt0aGlzLnVwZGF0ZURpc3BsYXkoKTthLmJpbmQodGhpcy5fX3NlbGVjdCwiY2hhbmdlIixmdW5jdGlvbigpe2guc2V0VmFsdWUodGhpcy5vcHRpb25zW3RoaXMuc2VsZWN0ZWRJbmRleF0udmFsdWUpfSk7dGhpcy5kb21FbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX19zZWxlY3QpfTsKZC5zdXBlcmNsYXNzPWU7Yy5leHRlbmQoZC5wcm90b3R5cGUsZS5wcm90b3R5cGUse3NldFZhbHVlOmZ1bmN0aW9uKGEpe2E9ZC5zdXBlcmNsYXNzLnByb3RvdHlwZS5zZXRWYWx1ZS5jYWxsKHRoaXMsYSk7dGhpcy5fX29uRmluaXNoQ2hhbmdlJiZ0aGlzLl9fb25GaW5pc2hDaGFuZ2UuY2FsbCh0aGlzLHRoaXMuZ2V0VmFsdWUoKSk7cmV0dXJuIGF9LHVwZGF0ZURpc3BsYXk6ZnVuY3Rpb24oKXt0aGlzLl9fc2VsZWN0LnZhbHVlPXRoaXMuZ2V0VmFsdWUoKTtyZXR1cm4gZC5zdXBlcmNsYXNzLnByb3RvdHlwZS51cGRhdGVEaXNwbGF5LmNhbGwodGhpcyl9fSk7cmV0dXJuIGR9KGRhdC5jb250cm9sbGVycy5Db250cm9sbGVyLGRhdC5kb20uZG9tLGRhdC51dGlscy5jb21tb24pOwpkYXQuY29udHJvbGxlcnMuTnVtYmVyQ29udHJvbGxlcj1mdW5jdGlvbihlLGEpe3ZhciBjPWZ1bmN0aW9uKGQsZixiKXtjLnN1cGVyY2xhc3MuY2FsbCh0aGlzLGQsZik7Yj1ifHx7fTt0aGlzLl9fbWluPWIubWluO3RoaXMuX19tYXg9Yi5tYXg7dGhpcy5fX3N0ZXA9Yi5zdGVwO2Q9dGhpcy5fX2ltcGxpZWRTdGVwPWEuaXNVbmRlZmluZWQodGhpcy5fX3N0ZXApP3RoaXMuaW5pdGlhbFZhbHVlPT0wPzE6TWF0aC5wb3coMTAsTWF0aC5mbG9vcihNYXRoLmxvZyh0aGlzLmluaXRpYWxWYWx1ZSkvTWF0aC5MTjEwKSkvMTA6dGhpcy5fX3N0ZXA7ZD1kLnRvU3RyaW5nKCk7dGhpcy5fX3ByZWNpc2lvbj1kLmluZGV4T2YoIi4iKT4tMT9kLmxlbmd0aC1kLmluZGV4T2YoIi4iKS0xOjB9O2Muc3VwZXJjbGFzcz1lO2EuZXh0ZW5kKGMucHJvdG90eXBlLGUucHJvdG90eXBlLHtzZXRWYWx1ZTpmdW5jdGlvbihhKXtpZih0aGlzLl9fbWluIT09dm9pZCAwJiZhPHRoaXMuX19taW4pYT10aGlzLl9fbWluOwplbHNlIGlmKHRoaXMuX19tYXghPT12b2lkIDAmJmE+dGhpcy5fX21heClhPXRoaXMuX19tYXg7dGhpcy5fX3N0ZXAhPT12b2lkIDAmJmEldGhpcy5fX3N0ZXAhPTAmJihhPU1hdGgucm91bmQoYS90aGlzLl9fc3RlcCkqdGhpcy5fX3N0ZXApO3JldHVybiBjLnN1cGVyY2xhc3MucHJvdG90eXBlLnNldFZhbHVlLmNhbGwodGhpcyxhKX0sbWluOmZ1bmN0aW9uKGEpe3RoaXMuX19taW49YTtyZXR1cm4gdGhpc30sbWF4OmZ1bmN0aW9uKGEpe3RoaXMuX19tYXg9YTtyZXR1cm4gdGhpc30sc3RlcDpmdW5jdGlvbihhKXt0aGlzLl9fc3RlcD1hO3JldHVybiB0aGlzfX0pO3JldHVybiBjfShkYXQuY29udHJvbGxlcnMuQ29udHJvbGxlcixkYXQudXRpbHMuY29tbW9uKTsKZGF0LmNvbnRyb2xsZXJzLk51bWJlckNvbnRyb2xsZXJCb3g9ZnVuY3Rpb24oZSxhLGMpe3ZhciBkPWZ1bmN0aW9uKGYsYixlKXtmdW5jdGlvbiBoKCl7dmFyIGE9cGFyc2VGbG9hdChsLl9faW5wdXQudmFsdWUpO2MuaXNOYU4oYSl8fGwuc2V0VmFsdWUoYSl9ZnVuY3Rpb24gaihhKXt2YXIgYj1vLWEuY2xpZW50WTtsLnNldFZhbHVlKGwuZ2V0VmFsdWUoKStiKmwuX19pbXBsaWVkU3RlcCk7bz1hLmNsaWVudFl9ZnVuY3Rpb24gbSgpe2EudW5iaW5kKHdpbmRvdywibW91c2Vtb3ZlIixqKTthLnVuYmluZCh3aW5kb3csIm1vdXNldXAiLG0pfXRoaXMuX190cnVuY2F0aW9uU3VzcGVuZGVkPWZhbHNlO2Quc3VwZXJjbGFzcy5jYWxsKHRoaXMsZixiLGUpO3ZhciBsPXRoaXMsbzt0aGlzLl9faW5wdXQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTt0aGlzLl9faW5wdXQuc2V0QXR0cmlidXRlKCJ0eXBlIiwidGV4dCIpO2EuYmluZCh0aGlzLl9faW5wdXQsImNoYW5nZSIsaCk7CmEuYmluZCh0aGlzLl9faW5wdXQsImJsdXIiLGZ1bmN0aW9uKCl7aCgpO2wuX19vbkZpbmlzaENoYW5nZSYmbC5fX29uRmluaXNoQ2hhbmdlLmNhbGwobCxsLmdldFZhbHVlKCkpfSk7YS5iaW5kKHRoaXMuX19pbnB1dCwibW91c2Vkb3duIixmdW5jdGlvbihiKXthLmJpbmQod2luZG93LCJtb3VzZW1vdmUiLGopO2EuYmluZCh3aW5kb3csIm1vdXNldXAiLG0pO289Yi5jbGllbnRZfSk7YS5iaW5kKHRoaXMuX19pbnB1dCwia2V5ZG93biIsZnVuY3Rpb24oYSl7aWYoYS5rZXlDb2RlPT09MTMpbC5fX3RydW5jYXRpb25TdXNwZW5kZWQ9dHJ1ZSx0aGlzLmJsdXIoKSxsLl9fdHJ1bmNhdGlvblN1c3BlbmRlZD1mYWxzZX0pO3RoaXMudXBkYXRlRGlzcGxheSgpO3RoaXMuZG9tRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9faW5wdXQpfTtkLnN1cGVyY2xhc3M9ZTtjLmV4dGVuZChkLnByb3RvdHlwZSxlLnByb3RvdHlwZSx7dXBkYXRlRGlzcGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX19pbnB1dCwKYjtpZih0aGlzLl9fdHJ1bmNhdGlvblN1c3BlbmRlZCliPXRoaXMuZ2V0VmFsdWUoKTtlbHNle2I9dGhpcy5nZXRWYWx1ZSgpO3ZhciBjPU1hdGgucG93KDEwLHRoaXMuX19wcmVjaXNpb24pO2I9TWF0aC5yb3VuZChiKmMpL2N9YS52YWx1ZT1iO3JldHVybiBkLnN1cGVyY2xhc3MucHJvdG90eXBlLnVwZGF0ZURpc3BsYXkuY2FsbCh0aGlzKX19KTtyZXR1cm4gZH0oZGF0LmNvbnRyb2xsZXJzLk51bWJlckNvbnRyb2xsZXIsZGF0LmRvbS5kb20sZGF0LnV0aWxzLmNvbW1vbik7CmRhdC5jb250cm9sbGVycy5OdW1iZXJDb250cm9sbGVyU2xpZGVyPWZ1bmN0aW9uKGUsYSxjLGQsZil7dmFyIGI9ZnVuY3Rpb24oZCxjLGYsZSxsKXtmdW5jdGlvbiBvKGIpe2IucHJldmVudERlZmF1bHQoKTt2YXIgZD1hLmdldE9mZnNldChnLl9fYmFja2dyb3VuZCksYz1hLmdldFdpZHRoKGcuX19iYWNrZ3JvdW5kKTtnLnNldFZhbHVlKGcuX19taW4rKGcuX19tYXgtZy5fX21pbikqKChiLmNsaWVudFgtZC5sZWZ0KS8oZC5sZWZ0K2MtZC5sZWZ0KSkpO3JldHVybiBmYWxzZX1mdW5jdGlvbiB5KCl7YS51bmJpbmQod2luZG93LCJtb3VzZW1vdmUiLG8pO2EudW5iaW5kKHdpbmRvdywibW91c2V1cCIseSk7Zy5fX29uRmluaXNoQ2hhbmdlJiZnLl9fb25GaW5pc2hDaGFuZ2UuY2FsbChnLGcuZ2V0VmFsdWUoKSl9Yi5zdXBlcmNsYXNzLmNhbGwodGhpcyxkLGMse21pbjpmLG1heDplLHN0ZXA6bH0pO3ZhciBnPXRoaXM7dGhpcy5fX2JhY2tncm91bmQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMuX19mb3JlZ3JvdW5kPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuYmluZCh0aGlzLl9fYmFja2dyb3VuZCwibW91c2Vkb3duIixmdW5jdGlvbihiKXthLmJpbmQod2luZG93LCJtb3VzZW1vdmUiLG8pO2EuYmluZCh3aW5kb3csIm1vdXNldXAiLHkpO28oYil9KTthLmFkZENsYXNzKHRoaXMuX19iYWNrZ3JvdW5kLCJzbGlkZXIiKTthLmFkZENsYXNzKHRoaXMuX19mb3JlZ3JvdW5kLCJzbGlkZXItZmciKTt0aGlzLnVwZGF0ZURpc3BsYXkoKTt0aGlzLl9fYmFja2dyb3VuZC5hcHBlbmRDaGlsZCh0aGlzLl9fZm9yZWdyb3VuZCk7dGhpcy5kb21FbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX19iYWNrZ3JvdW5kKX07Yi5zdXBlcmNsYXNzPWU7Yi51c2VEZWZhdWx0U3R5bGVzPWZ1bmN0aW9uKCl7Yy5pbmplY3QoZil9O2QuZXh0ZW5kKGIucHJvdG90eXBlLGUucHJvdG90eXBlLHt1cGRhdGVEaXNwbGF5OmZ1bmN0aW9uKCl7dGhpcy5fX2ZvcmVncm91bmQuc3R5bGUud2lkdGg9Cih0aGlzLmdldFZhbHVlKCktdGhpcy5fX21pbikvKHRoaXMuX19tYXgtdGhpcy5fX21pbikqMTAwKyIlIjtyZXR1cm4gYi5zdXBlcmNsYXNzLnByb3RvdHlwZS51cGRhdGVEaXNwbGF5LmNhbGwodGhpcyl9fSk7cmV0dXJuIGJ9KGRhdC5jb250cm9sbGVycy5OdW1iZXJDb250cm9sbGVyLGRhdC5kb20uZG9tLGRhdC51dGlscy5jc3MsZGF0LnV0aWxzLmNvbW1vbiwiLnNsaWRlciB7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMnB4IDRweCByZ2JhKDAsMCwwLDAuMTUpO1xuICBoZWlnaHQ6IDFlbTtcbiAgYm9yZGVyLXJhZGl1czogMWVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlO1xuICBwYWRkaW5nOiAwIDAuNWVtO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4uc2xpZGVyLWZnIHtcbiAgcGFkZGluZzogMXB4IDAgMnB4IDA7XG4gIGJhY2tncm91bmQtY29sb3I6ICNhYWE7XG4gIGhlaWdodDogMWVtO1xuICBtYXJnaW4tbGVmdDogLTAuNWVtO1xuICBwYWRkaW5nLXJpZ2h0OiAwLjVlbTtcbiAgYm9yZGVyLXJhZGl1czogMWVtIDAgMCAxZW07XG59XG5cbi5zbGlkZXItZmc6YWZ0ZXIge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGJvcmRlci1yYWRpdXM6IDFlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgYm9yZGVyOiAgMXB4IHNvbGlkICNhYWE7XG4gIGNvbnRlbnQ6ICcnO1xuICBmbG9hdDogcmlnaHQ7XG4gIG1hcmdpbi1yaWdodDogLTFlbTtcbiAgbWFyZ2luLXRvcDogLTFweDtcbiAgaGVpZ2h0OiAwLjllbTtcbiAgd2lkdGg6IDAuOWVtO1xufSIpOwpkYXQuY29udHJvbGxlcnMuRnVuY3Rpb25Db250cm9sbGVyPWZ1bmN0aW9uKGUsYSxjKXt2YXIgZD1mdW5jdGlvbihjLGIsZSl7ZC5zdXBlcmNsYXNzLmNhbGwodGhpcyxjLGIpO3ZhciBoPXRoaXM7dGhpcy5fX2J1dHRvbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLl9fYnV0dG9uLmlubmVySFRNTD1lPT09dm9pZCAwPyJGaXJlIjplO2EuYmluZCh0aGlzLl9fYnV0dG9uLCJjbGljayIsZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpO2guZmlyZSgpO3JldHVybiBmYWxzZX0pO2EuYWRkQ2xhc3ModGhpcy5fX2J1dHRvbiwiYnV0dG9uIik7dGhpcy5kb21FbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX19idXR0b24pfTtkLnN1cGVyY2xhc3M9ZTtjLmV4dGVuZChkLnByb3RvdHlwZSxlLnByb3RvdHlwZSx7ZmlyZTpmdW5jdGlvbigpe3RoaXMuX19vbkNoYW5nZSYmdGhpcy5fX29uQ2hhbmdlLmNhbGwodGhpcyk7dGhpcy5fX29uRmluaXNoQ2hhbmdlJiZ0aGlzLl9fb25GaW5pc2hDaGFuZ2UuY2FsbCh0aGlzLAp0aGlzLmdldFZhbHVlKCkpO3RoaXMuZ2V0VmFsdWUoKS5jYWxsKHRoaXMub2JqZWN0KX19KTtyZXR1cm4gZH0oZGF0LmNvbnRyb2xsZXJzLkNvbnRyb2xsZXIsZGF0LmRvbS5kb20sZGF0LnV0aWxzLmNvbW1vbik7CmRhdC5jb250cm9sbGVycy5Cb29sZWFuQ29udHJvbGxlcj1mdW5jdGlvbihlLGEsYyl7dmFyIGQ9ZnVuY3Rpb24oYyxiKXtkLnN1cGVyY2xhc3MuY2FsbCh0aGlzLGMsYik7dmFyIGU9dGhpczt0aGlzLl9fcHJldj10aGlzLmdldFZhbHVlKCk7dGhpcy5fX2NoZWNrYm94PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7dGhpcy5fX2NoZWNrYm94LnNldEF0dHJpYnV0ZSgidHlwZSIsImNoZWNrYm94Iik7YS5iaW5kKHRoaXMuX19jaGVja2JveCwiY2hhbmdlIixmdW5jdGlvbigpe2Uuc2V0VmFsdWUoIWUuX19wcmV2KX0sZmFsc2UpO3RoaXMuZG9tRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9fY2hlY2tib3gpO3RoaXMudXBkYXRlRGlzcGxheSgpfTtkLnN1cGVyY2xhc3M9ZTtjLmV4dGVuZChkLnByb3RvdHlwZSxlLnByb3RvdHlwZSx7c2V0VmFsdWU6ZnVuY3Rpb24oYSl7YT1kLnN1cGVyY2xhc3MucHJvdG90eXBlLnNldFZhbHVlLmNhbGwodGhpcyxhKTt0aGlzLl9fb25GaW5pc2hDaGFuZ2UmJgp0aGlzLl9fb25GaW5pc2hDaGFuZ2UuY2FsbCh0aGlzLHRoaXMuZ2V0VmFsdWUoKSk7dGhpcy5fX3ByZXY9dGhpcy5nZXRWYWx1ZSgpO3JldHVybiBhfSx1cGRhdGVEaXNwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRWYWx1ZSgpPT09dHJ1ZT8odGhpcy5fX2NoZWNrYm94LnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKSx0aGlzLl9fY2hlY2tib3guY2hlY2tlZD10cnVlKTp0aGlzLl9fY2hlY2tib3guY2hlY2tlZD1mYWxzZTtyZXR1cm4gZC5zdXBlcmNsYXNzLnByb3RvdHlwZS51cGRhdGVEaXNwbGF5LmNhbGwodGhpcyl9fSk7cmV0dXJuIGR9KGRhdC5jb250cm9sbGVycy5Db250cm9sbGVyLGRhdC5kb20uZG9tLGRhdC51dGlscy5jb21tb24pOwpkYXQuY29sb3IudG9TdHJpbmc9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKGEpe2lmKGEuYT09MXx8ZS5pc1VuZGVmaW5lZChhLmEpKXtmb3IoYT1hLmhleC50b1N0cmluZygxNik7YS5sZW5ndGg8NjspYT0iMCIrYTtyZXR1cm4iIyIrYX1lbHNlIHJldHVybiJyZ2JhKCIrTWF0aC5yb3VuZChhLnIpKyIsIitNYXRoLnJvdW5kKGEuZykrIiwiK01hdGgucm91bmQoYS5iKSsiLCIrYS5hKyIpIn19KGRhdC51dGlscy5jb21tb24pOwpkYXQuY29sb3IuaW50ZXJwcmV0PWZ1bmN0aW9uKGUsYSl7dmFyIGMsZCxmPVt7bGl0bXVzOmEuaXNTdHJpbmcsY29udmVyc2lvbnM6e1RIUkVFX0NIQVJfSEVYOntyZWFkOmZ1bmN0aW9uKGEpe2E9YS5tYXRjaCgvXiMoW0EtRjAtOV0pKFtBLUYwLTldKShbQS1GMC05XSkkL2kpO3JldHVybiBhPT09bnVsbD9mYWxzZTp7c3BhY2U6IkhFWCIsaGV4OnBhcnNlSW50KCIweCIrYVsxXS50b1N0cmluZygpK2FbMV0udG9TdHJpbmcoKSthWzJdLnRvU3RyaW5nKCkrYVsyXS50b1N0cmluZygpK2FbM10udG9TdHJpbmcoKSthWzNdLnRvU3RyaW5nKCkpfX0sd3JpdGU6ZX0sU0lYX0NIQVJfSEVYOntyZWFkOmZ1bmN0aW9uKGEpe2E9YS5tYXRjaCgvXiMoW0EtRjAtOV17Nn0pJC9pKTtyZXR1cm4gYT09PW51bGw/ZmFsc2U6e3NwYWNlOiJIRVgiLGhleDpwYXJzZUludCgiMHgiK2FbMV0udG9TdHJpbmcoKSl9fSx3cml0ZTplfSxDU1NfUkdCOntyZWFkOmZ1bmN0aW9uKGEpe2E9YS5tYXRjaCgvXnJnYlwoXHMqKC4rKVxzKixccyooLispXHMqLFxzKiguKylccypcKS8pOwpyZXR1cm4gYT09PW51bGw/ZmFsc2U6e3NwYWNlOiJSR0IiLHI6cGFyc2VGbG9hdChhWzFdKSxnOnBhcnNlRmxvYXQoYVsyXSksYjpwYXJzZUZsb2F0KGFbM10pfX0sd3JpdGU6ZX0sQ1NTX1JHQkE6e3JlYWQ6ZnVuY3Rpb24oYSl7YT1hLm1hdGNoKC9ecmdiYVwoXHMqKC4rKVxzKixccyooLispXHMqLFxzKiguKylccypcLFxzKiguKylccypcKS8pO3JldHVybiBhPT09bnVsbD9mYWxzZTp7c3BhY2U6IlJHQiIscjpwYXJzZUZsb2F0KGFbMV0pLGc6cGFyc2VGbG9hdChhWzJdKSxiOnBhcnNlRmxvYXQoYVszXSksYTpwYXJzZUZsb2F0KGFbNF0pfX0sd3JpdGU6ZX19fSx7bGl0bXVzOmEuaXNOdW1iZXIsY29udmVyc2lvbnM6e0hFWDp7cmVhZDpmdW5jdGlvbihhKXtyZXR1cm57c3BhY2U6IkhFWCIsaGV4OmEsY29udmVyc2lvbk5hbWU6IkhFWCJ9fSx3cml0ZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5oZXh9fX19LHtsaXRtdXM6YS5pc0FycmF5LGNvbnZlcnNpb25zOntSR0JfQVJSQVk6e3JlYWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RoIT0KMz9mYWxzZTp7c3BhY2U6IlJHQiIscjphWzBdLGc6YVsxXSxiOmFbMl19fSx3cml0ZTpmdW5jdGlvbihhKXtyZXR1cm5bYS5yLGEuZyxhLmJdfX0sUkdCQV9BUlJBWTp7cmVhZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGghPTQ/ZmFsc2U6e3NwYWNlOiJSR0IiLHI6YVswXSxnOmFbMV0sYjphWzJdLGE6YVszXX19LHdyaXRlOmZ1bmN0aW9uKGEpe3JldHVyblthLnIsYS5nLGEuYixhLmFdfX19fSx7bGl0bXVzOmEuaXNPYmplY3QsY29udmVyc2lvbnM6e1JHQkFfT0JKOntyZWFkOmZ1bmN0aW9uKGIpe3JldHVybiBhLmlzTnVtYmVyKGIucikmJmEuaXNOdW1iZXIoYi5nKSYmYS5pc051bWJlcihiLmIpJiZhLmlzTnVtYmVyKGIuYSk/e3NwYWNlOiJSR0IiLHI6Yi5yLGc6Yi5nLGI6Yi5iLGE6Yi5hfTpmYWxzZX0sd3JpdGU6ZnVuY3Rpb24oYSl7cmV0dXJue3I6YS5yLGc6YS5nLGI6YS5iLGE6YS5hfX19LFJHQl9PQko6e3JlYWQ6ZnVuY3Rpb24oYil7cmV0dXJuIGEuaXNOdW1iZXIoYi5yKSYmCmEuaXNOdW1iZXIoYi5nKSYmYS5pc051bWJlcihiLmIpP3tzcGFjZToiUkdCIixyOmIucixnOmIuZyxiOmIuYn06ZmFsc2V9LHdyaXRlOmZ1bmN0aW9uKGEpe3JldHVybntyOmEucixnOmEuZyxiOmEuYn19fSxIU1ZBX09CSjp7cmVhZDpmdW5jdGlvbihiKXtyZXR1cm4gYS5pc051bWJlcihiLmgpJiZhLmlzTnVtYmVyKGIucykmJmEuaXNOdW1iZXIoYi52KSYmYS5pc051bWJlcihiLmEpP3tzcGFjZToiSFNWIixoOmIuaCxzOmIucyx2OmIudixhOmIuYX06ZmFsc2V9LHdyaXRlOmZ1bmN0aW9uKGEpe3JldHVybntoOmEuaCxzOmEucyx2OmEudixhOmEuYX19fSxIU1ZfT0JKOntyZWFkOmZ1bmN0aW9uKGIpe3JldHVybiBhLmlzTnVtYmVyKGIuaCkmJmEuaXNOdW1iZXIoYi5zKSYmYS5pc051bWJlcihiLnYpP3tzcGFjZToiSFNWIixoOmIuaCxzOmIucyx2OmIudn06ZmFsc2V9LHdyaXRlOmZ1bmN0aW9uKGEpe3JldHVybntoOmEuaCxzOmEucyx2OmEudn19fX19XTtyZXR1cm4gZnVuY3Rpb24oKXtkPQpmYWxzZTt2YXIgYj1hcmd1bWVudHMubGVuZ3RoPjE/YS50b0FycmF5KGFyZ3VtZW50cyk6YXJndW1lbnRzWzBdO2EuZWFjaChmLGZ1bmN0aW9uKGUpe2lmKGUubGl0bXVzKGIpKXJldHVybiBhLmVhY2goZS5jb252ZXJzaW9ucyxmdW5jdGlvbihlLGYpe2M9ZS5yZWFkKGIpO2lmKGQ9PT1mYWxzZSYmYyE9PWZhbHNlKXJldHVybiBkPWMsYy5jb252ZXJzaW9uTmFtZT1mLGMuY29udmVyc2lvbj1lLGEuQlJFQUt9KSxhLkJSRUFLfSk7cmV0dXJuIGR9fShkYXQuY29sb3IudG9TdHJpbmcsZGF0LnV0aWxzLmNvbW1vbik7CmRhdC5HVUk9ZGF0Lmd1aS5HVUk9ZnVuY3Rpb24oZSxhLGMsZCxmLGIsbixoLGosbSxsLG8seSxnLGkpe2Z1bmN0aW9uIHEoYSxiLHIsYyl7aWYoYltyXT09PXZvaWQgMCl0aHJvdyBFcnJvcigiT2JqZWN0ICIrYisnIGhhcyBubyBwcm9wZXJ0eSAiJytyKyciJyk7Yy5jb2xvcj9iPW5ldyBsKGIscik6KGI9W2Iscl0uY29uY2F0KGMuZmFjdG9yeUFyZ3MpLGI9ZC5hcHBseShhLGIpKTtpZihjLmJlZm9yZSBpbnN0YW5jZW9mIGYpYy5iZWZvcmU9Yy5iZWZvcmUuX19saTt0KGEsYik7Zy5hZGRDbGFzcyhiLmRvbUVsZW1lbnQsImMiKTtyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtnLmFkZENsYXNzKHIsInByb3BlcnR5LW5hbWUiKTtyLmlubmVySFRNTD1iLnByb3BlcnR5O3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2UuYXBwZW5kQ2hpbGQocik7ZS5hcHBlbmRDaGlsZChiLmRvbUVsZW1lbnQpO2M9cyhhLGUsYy5iZWZvcmUpO2cuYWRkQ2xhc3MoYyxrLkNMQVNTX0NPTlRST0xMRVJfUk9XKTsKZy5hZGRDbGFzcyhjLHR5cGVvZiBiLmdldFZhbHVlKCkpO3AoYSxjLGIpO2EuX19jb250cm9sbGVycy5wdXNoKGIpO3JldHVybiBifWZ1bmN0aW9uIHMoYSxiLGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpIik7YiYmYy5hcHBlbmRDaGlsZChiKTtkP2EuX191bC5pbnNlcnRCZWZvcmUoYyxwYXJhbXMuYmVmb3JlKTphLl9fdWwuYXBwZW5kQ2hpbGQoYyk7YS5vblJlc2l6ZSgpO3JldHVybiBjfWZ1bmN0aW9uIHAoYSxkLGMpe2MuX19saT1kO2MuX19ndWk9YTtpLmV4dGVuZChjLHtvcHRpb25zOmZ1bmN0aW9uKGIpe2lmKGFyZ3VtZW50cy5sZW5ndGg+MSlyZXR1cm4gYy5yZW1vdmUoKSxxKGEsYy5vYmplY3QsYy5wcm9wZXJ0eSx7YmVmb3JlOmMuX19saS5uZXh0RWxlbWVudFNpYmxpbmcsZmFjdG9yeUFyZ3M6W2kudG9BcnJheShhcmd1bWVudHMpXX0pO2lmKGkuaXNBcnJheShiKXx8aS5pc09iamVjdChiKSlyZXR1cm4gYy5yZW1vdmUoKSxxKGEsYy5vYmplY3QsYy5wcm9wZXJ0eSwKe2JlZm9yZTpjLl9fbGkubmV4dEVsZW1lbnRTaWJsaW5nLGZhY3RvcnlBcmdzOltiXX0pfSxuYW1lOmZ1bmN0aW9uKGEpe2MuX19saS5maXJzdEVsZW1lbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZC5pbm5lckhUTUw9YTtyZXR1cm4gY30sbGlzdGVuOmZ1bmN0aW9uKCl7Yy5fX2d1aS5saXN0ZW4oYyk7cmV0dXJuIGN9LHJlbW92ZTpmdW5jdGlvbigpe2MuX19ndWkucmVtb3ZlKGMpO3JldHVybiBjfX0pO2lmKGMgaW5zdGFuY2VvZiBqKXt2YXIgZT1uZXcgaChjLm9iamVjdCxjLnByb3BlcnR5LHttaW46Yy5fX21pbixtYXg6Yy5fX21heCxzdGVwOmMuX19zdGVwfSk7aS5lYWNoKFsidXBkYXRlRGlzcGxheSIsIm9uQ2hhbmdlIiwib25GaW5pc2hDaGFuZ2UiXSxmdW5jdGlvbihhKXt2YXIgYj1jW2FdLEg9ZVthXTtjW2FdPWVbYV09ZnVuY3Rpb24oKXt2YXIgYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO2IuYXBwbHkoYyxhKTtyZXR1cm4gSC5hcHBseShlLGEpfX0pOwpnLmFkZENsYXNzKGQsImhhcy1zbGlkZXIiKTtjLmRvbUVsZW1lbnQuaW5zZXJ0QmVmb3JlKGUuZG9tRWxlbWVudCxjLmRvbUVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQpfWVsc2UgaWYoYyBpbnN0YW5jZW9mIGgpe3ZhciBmPWZ1bmN0aW9uKGIpe3JldHVybiBpLmlzTnVtYmVyKGMuX19taW4pJiZpLmlzTnVtYmVyKGMuX19tYXgpPyhjLnJlbW92ZSgpLHEoYSxjLm9iamVjdCxjLnByb3BlcnR5LHtiZWZvcmU6Yy5fX2xpLm5leHRFbGVtZW50U2libGluZyxmYWN0b3J5QXJnczpbYy5fX21pbixjLl9fbWF4LGMuX19zdGVwXX0pKTpifTtjLm1pbj1pLmNvbXBvc2UoZixjLm1pbik7Yy5tYXg9aS5jb21wb3NlKGYsYy5tYXgpfWVsc2UgaWYoYyBpbnN0YW5jZW9mIGIpZy5iaW5kKGQsImNsaWNrIixmdW5jdGlvbigpe2cuZmFrZUV2ZW50KGMuX19jaGVja2JveCwiY2xpY2siKX0pLGcuYmluZChjLl9fY2hlY2tib3gsImNsaWNrIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk7CmVsc2UgaWYoYyBpbnN0YW5jZW9mIG4pZy5iaW5kKGQsImNsaWNrIixmdW5jdGlvbigpe2cuZmFrZUV2ZW50KGMuX19idXR0b24sImNsaWNrIil9KSxnLmJpbmQoZCwibW91c2VvdmVyIixmdW5jdGlvbigpe2cuYWRkQ2xhc3MoYy5fX2J1dHRvbiwiaG92ZXIiKX0pLGcuYmluZChkLCJtb3VzZW91dCIsZnVuY3Rpb24oKXtnLnJlbW92ZUNsYXNzKGMuX19idXR0b24sImhvdmVyIil9KTtlbHNlIGlmKGMgaW5zdGFuY2VvZiBsKWcuYWRkQ2xhc3MoZCwiY29sb3IiKSxjLnVwZGF0ZURpc3BsYXk9aS5jb21wb3NlKGZ1bmN0aW9uKGEpe2Quc3R5bGUuYm9yZGVyTGVmdENvbG9yPWMuX19jb2xvci50b1N0cmluZygpO3JldHVybiBhfSxjLnVwZGF0ZURpc3BsYXkpLGMudXBkYXRlRGlzcGxheSgpO2Muc2V0VmFsdWU9aS5jb21wb3NlKGZ1bmN0aW9uKGIpe2EuZ2V0Um9vdCgpLl9fcHJlc2V0X3NlbGVjdCYmYy5pc01vZGlmaWVkKCkmJkIoYS5nZXRSb290KCksdHJ1ZSk7cmV0dXJuIGJ9LGMuc2V0VmFsdWUpfQpmdW5jdGlvbiB0KGEsYil7dmFyIGM9YS5nZXRSb290KCksZD1jLl9fcmVtZW1iZXJlZE9iamVjdHMuaW5kZXhPZihiLm9iamVjdCk7aWYoZCE9LTEpe3ZhciBlPWMuX19yZW1lbWJlcmVkT2JqZWN0SW5kZWNlc1RvQ29udHJvbGxlcnNbZF07ZT09PXZvaWQgMCYmKGU9e30sYy5fX3JlbWVtYmVyZWRPYmplY3RJbmRlY2VzVG9Db250cm9sbGVyc1tkXT1lKTtlW2IucHJvcGVydHldPWI7aWYoYy5sb2FkJiZjLmxvYWQucmVtZW1iZXJlZCl7Yz1jLmxvYWQucmVtZW1iZXJlZDtpZihjW2EucHJlc2V0XSljPWNbYS5wcmVzZXRdO2Vsc2UgaWYoY1t3XSljPWNbd107ZWxzZSByZXR1cm47aWYoY1tkXSYmY1tkXVtiLnByb3BlcnR5XSE9PXZvaWQgMClkPWNbZF1bYi5wcm9wZXJ0eV0sYi5pbml0aWFsVmFsdWU9ZCxiLnNldFZhbHVlKGQpfX19ZnVuY3Rpb24gSShhKXt2YXIgYj1hLl9fc2F2ZV9yb3c9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGkiKTtnLmFkZENsYXNzKGEuZG9tRWxlbWVudCwKImhhcy1zYXZlIik7YS5fX3VsLmluc2VydEJlZm9yZShiLGEuX191bC5maXJzdENoaWxkKTtnLmFkZENsYXNzKGIsInNhdmUtcm93Iik7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO2MuaW5uZXJIVE1MPSImbmJzcDsiO2cuYWRkQ2xhc3MoYywiYnV0dG9uIGdlYXJzIik7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO2QuaW5uZXJIVE1MPSJTYXZlIjtnLmFkZENsYXNzKGQsImJ1dHRvbiIpO2cuYWRkQ2xhc3MoZCwic2F2ZSIpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtlLmlubmVySFRNTD0iTmV3IjtnLmFkZENsYXNzKGUsImJ1dHRvbiIpO2cuYWRkQ2xhc3MoZSwic2F2ZS1hcyIpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtmLmlubmVySFRNTD0iUmV2ZXJ0IjtnLmFkZENsYXNzKGYsImJ1dHRvbiIpO2cuYWRkQ2xhc3MoZiwicmV2ZXJ0Iik7dmFyIG09YS5fX3ByZXNldF9zZWxlY3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VsZWN0Iik7CmEubG9hZCYmYS5sb2FkLnJlbWVtYmVyZWQ/aS5lYWNoKGEubG9hZC5yZW1lbWJlcmVkLGZ1bmN0aW9uKGIsYyl7QyhhLGMsYz09YS5wcmVzZXQpfSk6QyhhLHcsZmFsc2UpO2cuYmluZChtLCJjaGFuZ2UiLGZ1bmN0aW9uKCl7Zm9yKHZhciBiPTA7YjxhLl9fcHJlc2V0X3NlbGVjdC5sZW5ndGg7YisrKWEuX19wcmVzZXRfc2VsZWN0W2JdLmlubmVySFRNTD1hLl9fcHJlc2V0X3NlbGVjdFtiXS52YWx1ZTthLnByZXNldD10aGlzLnZhbHVlfSk7Yi5hcHBlbmRDaGlsZChtKTtiLmFwcGVuZENoaWxkKGMpO2IuYXBwZW5kQ2hpbGQoZCk7Yi5hcHBlbmRDaGlsZChlKTtiLmFwcGVuZENoaWxkKGYpO2lmKHUpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkZy1zYXZlLWxvY2FsbHkiKSxsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkZy1sb2NhbC1leHBsYWluIik7Yi5zdHlsZS5kaXNwbGF5PSJibG9jayI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZGctbG9jYWwtc3RvcmFnZSIpOwpsb2NhbFN0b3JhZ2UuZ2V0SXRlbShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKyIuaXNMb2NhbCIpPT09InRydWUiJiZiLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKTt2YXIgbz1mdW5jdGlvbigpe2wuc3R5bGUuZGlzcGxheT1hLnVzZUxvY2FsU3RvcmFnZT8iYmxvY2siOiJub25lIn07bygpO2cuYmluZChiLCJjaGFuZ2UiLGZ1bmN0aW9uKCl7YS51c2VMb2NhbFN0b3JhZ2U9IWEudXNlTG9jYWxTdG9yYWdlO28oKX0pfXZhciBoPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkZy1uZXctY29uc3RydWN0b3IiKTtnLmJpbmQoaCwia2V5ZG93biIsZnVuY3Rpb24oYSl7YS5tZXRhS2V5JiYoYS53aGljaD09PTY3fHxhLmtleUNvZGU9PTY3KSYmeC5oaWRlKCl9KTtnLmJpbmQoYywiY2xpY2siLGZ1bmN0aW9uKCl7aC5pbm5lckhUTUw9SlNPTi5zdHJpbmdpZnkoYS5nZXRTYXZlT2JqZWN0KCksdm9pZCAwLDIpO3guc2hvdygpO2guZm9jdXMoKTtoLnNlbGVjdCgpfSk7Zy5iaW5kKGQsCiJjbGljayIsZnVuY3Rpb24oKXthLnNhdmUoKX0pO2cuYmluZChlLCJjbGljayIsZnVuY3Rpb24oKXt2YXIgYj1wcm9tcHQoIkVudGVyIGEgbmV3IHByZXNldCBuYW1lLiIpO2ImJmEuc2F2ZUFzKGIpfSk7Zy5iaW5kKGYsImNsaWNrIixmdW5jdGlvbigpe2EucmV2ZXJ0KCl9KX1mdW5jdGlvbiBKKGEpe2Z1bmN0aW9uIGIoZil7Zi5wcmV2ZW50RGVmYXVsdCgpO2U9Zi5jbGllbnRYO2cuYWRkQ2xhc3MoYS5fX2Nsb3NlQnV0dG9uLGsuQ0xBU1NfRFJBRyk7Zy5iaW5kKHdpbmRvdywibW91c2Vtb3ZlIixjKTtnLmJpbmQod2luZG93LCJtb3VzZXVwIixkKTtyZXR1cm4gZmFsc2V9ZnVuY3Rpb24gYyhiKXtiLnByZXZlbnREZWZhdWx0KCk7YS53aWR0aCs9ZS1iLmNsaWVudFg7YS5vblJlc2l6ZSgpO2U9Yi5jbGllbnRYO3JldHVybiBmYWxzZX1mdW5jdGlvbiBkKCl7Zy5yZW1vdmVDbGFzcyhhLl9fY2xvc2VCdXR0b24say5DTEFTU19EUkFHKTtnLnVuYmluZCh3aW5kb3csIm1vdXNlbW92ZSIsCmMpO2cudW5iaW5kKHdpbmRvdywibW91c2V1cCIsZCl9YS5fX3Jlc2l6ZV9oYW5kbGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aS5leHRlbmQoYS5fX3Jlc2l6ZV9oYW5kbGUuc3R5bGUse3dpZHRoOiI2cHgiLG1hcmdpbkxlZnQ6Ii0zcHgiLGhlaWdodDoiMjAwcHgiLGN1cnNvcjoiZXctcmVzaXplIixwb3NpdGlvbjoiYWJzb2x1dGUifSk7dmFyIGU7Zy5iaW5kKGEuX19yZXNpemVfaGFuZGxlLCJtb3VzZWRvd24iLGIpO2cuYmluZChhLl9fY2xvc2VCdXR0b24sIm1vdXNlZG93biIsYik7YS5kb21FbGVtZW50Lmluc2VydEJlZm9yZShhLl9fcmVzaXplX2hhbmRsZSxhLmRvbUVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQpfWZ1bmN0aW9uIEQoYSxiKXthLmRvbUVsZW1lbnQuc3R5bGUud2lkdGg9YisicHgiO2lmKGEuX19zYXZlX3JvdyYmYS5hdXRvUGxhY2UpYS5fX3NhdmVfcm93LnN0eWxlLndpZHRoPWIrInB4IjtpZihhLl9fY2xvc2VCdXR0b24pYS5fX2Nsb3NlQnV0dG9uLnN0eWxlLndpZHRoPQpiKyJweCJ9ZnVuY3Rpb24geihhLGIpe3ZhciBjPXt9O2kuZWFjaChhLl9fcmVtZW1iZXJlZE9iamVjdHMsZnVuY3Rpb24oZCxlKXt2YXIgZj17fTtpLmVhY2goYS5fX3JlbWVtYmVyZWRPYmplY3RJbmRlY2VzVG9Db250cm9sbGVyc1tlXSxmdW5jdGlvbihhLGMpe2ZbY109Yj9hLmluaXRpYWxWYWx1ZTphLmdldFZhbHVlKCl9KTtjW2VdPWZ9KTtyZXR1cm4gY31mdW5jdGlvbiBDKGEsYixjKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKTtkLmlubmVySFRNTD1iO2QudmFsdWU9YjthLl9fcHJlc2V0X3NlbGVjdC5hcHBlbmRDaGlsZChkKTtpZihjKWEuX19wcmVzZXRfc2VsZWN0LnNlbGVjdGVkSW5kZXg9YS5fX3ByZXNldF9zZWxlY3QubGVuZ3RoLTF9ZnVuY3Rpb24gQihhLGIpe3ZhciBjPWEuX19wcmVzZXRfc2VsZWN0W2EuX19wcmVzZXRfc2VsZWN0LnNlbGVjdGVkSW5kZXhdO2MuaW5uZXJIVE1MPWI/Yy52YWx1ZSsiKiI6Yy52YWx1ZX1mdW5jdGlvbiBFKGEpe2EubGVuZ3RoIT0KMCYmbyhmdW5jdGlvbigpe0UoYSl9KTtpLmVhY2goYSxmdW5jdGlvbihhKXthLnVwZGF0ZURpc3BsYXkoKX0pfWUuaW5qZWN0KGMpO3ZhciB3PSJEZWZhdWx0Iix1O3RyeXt1PSJsb2NhbFN0b3JhZ2UiaW4gd2luZG93JiZ3aW5kb3cubG9jYWxTdG9yYWdlIT09bnVsbH1jYXRjaChLKXt1PWZhbHNlfXZhciB4LEY9dHJ1ZSx2LEE9ZmFsc2UsRz1bXSxrPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoKXtsb2NhbFN0b3JhZ2Uuc2V0SXRlbShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKyIuZ3VpIixKU09OLnN0cmluZ2lmeShkLmdldFNhdmVPYmplY3QoKSkpfWZ1bmN0aW9uIGMoKXt2YXIgYT1kLmdldFJvb3QoKTthLndpZHRoKz0xO2kuZGVmZXIoZnVuY3Rpb24oKXthLndpZHRoLT0xfSl9dmFyIGQ9dGhpczt0aGlzLmRvbUVsZW1lbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5fX3VsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInVsIik7dGhpcy5kb21FbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX191bCk7CmcuYWRkQ2xhc3ModGhpcy5kb21FbGVtZW50LCJkZyIpO3RoaXMuX19mb2xkZXJzPXt9O3RoaXMuX19jb250cm9sbGVycz1bXTt0aGlzLl9fcmVtZW1iZXJlZE9iamVjdHM9W107dGhpcy5fX3JlbWVtYmVyZWRPYmplY3RJbmRlY2VzVG9Db250cm9sbGVycz1bXTt0aGlzLl9fbGlzdGVuaW5nPVtdO2E9YXx8e307YT1pLmRlZmF1bHRzKGEse2F1dG9QbGFjZTp0cnVlLHdpZHRoOmsuREVGQVVMVF9XSURUSH0pO2E9aS5kZWZhdWx0cyhhLHtyZXNpemFibGU6YS5hdXRvUGxhY2UsaGlkZWFibGU6YS5hdXRvUGxhY2V9KTtpZihpLmlzVW5kZWZpbmVkKGEubG9hZCkpYS5sb2FkPXtwcmVzZXQ6d307ZWxzZSBpZihhLnByZXNldClhLmxvYWQucHJlc2V0PWEucHJlc2V0O2kuaXNVbmRlZmluZWQoYS5wYXJlbnQpJiZhLmhpZGVhYmxlJiZHLnB1c2godGhpcyk7YS5yZXNpemFibGU9aS5pc1VuZGVmaW5lZChhLnBhcmVudCkmJmEucmVzaXphYmxlO2lmKGEuYXV0b1BsYWNlJiZpLmlzVW5kZWZpbmVkKGEuc2Nyb2xsYWJsZSkpYS5zY3JvbGxhYmxlPQp0cnVlO3ZhciBlPXUmJmxvY2FsU3RvcmFnZS5nZXRJdGVtKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYrIi5pc0xvY2FsIik9PT0idHJ1ZSI7T2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcyx7cGFyZW50OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYS5wYXJlbnR9fSxzY3JvbGxhYmxlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYS5zY3JvbGxhYmxlfX0sYXV0b1BsYWNlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYS5hdXRvUGxhY2V9fSxwcmVzZXQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBkLnBhcmVudD9kLmdldFJvb3QoKS5wcmVzZXQ6YS5sb2FkLnByZXNldH0sc2V0OmZ1bmN0aW9uKGIpe2QucGFyZW50P2QuZ2V0Um9vdCgpLnByZXNldD1iOmEubG9hZC5wcmVzZXQ9Yjtmb3IoYj0wO2I8dGhpcy5fX3ByZXNldF9zZWxlY3QubGVuZ3RoO2IrKylpZih0aGlzLl9fcHJlc2V0X3NlbGVjdFtiXS52YWx1ZT09dGhpcy5wcmVzZXQpdGhpcy5fX3ByZXNldF9zZWxlY3Quc2VsZWN0ZWRJbmRleD0KYjtkLnJldmVydCgpfX0sd2lkdGg6e2dldDpmdW5jdGlvbigpe3JldHVybiBhLndpZHRofSxzZXQ6ZnVuY3Rpb24oYil7YS53aWR0aD1iO0QoZCxiKX19LG5hbWU6e2dldDpmdW5jdGlvbigpe3JldHVybiBhLm5hbWV9LHNldDpmdW5jdGlvbihiKXthLm5hbWU9YjtpZihtKW0uaW5uZXJIVE1MPWEubmFtZX19LGNsb3NlZDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGEuY2xvc2VkfSxzZXQ6ZnVuY3Rpb24oYil7YS5jbG9zZWQ9YjthLmNsb3NlZD9nLmFkZENsYXNzKGQuX191bCxrLkNMQVNTX0NMT1NFRCk6Zy5yZW1vdmVDbGFzcyhkLl9fdWwsay5DTEFTU19DTE9TRUQpO3RoaXMub25SZXNpemUoKTtpZihkLl9fY2xvc2VCdXR0b24pZC5fX2Nsb3NlQnV0dG9uLmlubmVySFRNTD1iP2suVEVYVF9PUEVOOmsuVEVYVF9DTE9TRUR9fSxsb2FkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYS5sb2FkfX0sdXNlTG9jYWxTdG9yYWdlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZX0sc2V0OmZ1bmN0aW9uKGEpe3UmJgooKGU9YSk/Zy5iaW5kKHdpbmRvdywidW5sb2FkIixiKTpnLnVuYmluZCh3aW5kb3csInVubG9hZCIsYiksbG9jYWxTdG9yYWdlLnNldEl0ZW0oZG9jdW1lbnQubG9jYXRpb24uaHJlZisiLmlzTG9jYWwiLGEpKX19fSk7aWYoaS5pc1VuZGVmaW5lZChhLnBhcmVudCkpe2EuY2xvc2VkPWZhbHNlO2cuYWRkQ2xhc3ModGhpcy5kb21FbGVtZW50LGsuQ0xBU1NfTUFJTik7Zy5tYWtlU2VsZWN0YWJsZSh0aGlzLmRvbUVsZW1lbnQsZmFsc2UpO2lmKHUmJmUpe2QudXNlTG9jYWxTdG9yYWdlPXRydWU7dmFyIGY9bG9jYWxTdG9yYWdlLmdldEl0ZW0oZG9jdW1lbnQubG9jYXRpb24uaHJlZisiLmd1aSIpO2lmKGYpYS5sb2FkPUpTT04ucGFyc2UoZil9dGhpcy5fX2Nsb3NlQnV0dG9uPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuX19jbG9zZUJ1dHRvbi5pbm5lckhUTUw9ay5URVhUX0NMT1NFRDtnLmFkZENsYXNzKHRoaXMuX19jbG9zZUJ1dHRvbixrLkNMQVNTX0NMT1NFX0JVVFRPTik7CnRoaXMuZG9tRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9fY2xvc2VCdXR0b24pO2cuYmluZCh0aGlzLl9fY2xvc2VCdXR0b24sImNsaWNrIixmdW5jdGlvbigpe2QuY2xvc2VkPSFkLmNsb3NlZH0pfWVsc2V7aWYoYS5jbG9zZWQ9PT12b2lkIDApYS5jbG9zZWQ9dHJ1ZTt2YXIgbT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhLm5hbWUpO2cuYWRkQ2xhc3MobSwiY29udHJvbGxlci1uYW1lIik7Zj1zKGQsbSk7Zy5hZGRDbGFzcyh0aGlzLl9fdWwsay5DTEFTU19DTE9TRUQpO2cuYWRkQ2xhc3MoZiwidGl0bGUiKTtnLmJpbmQoZiwiY2xpY2siLGZ1bmN0aW9uKGEpe2EucHJldmVudERlZmF1bHQoKTtkLmNsb3NlZD0hZC5jbG9zZWQ7cmV0dXJuIGZhbHNlfSk7aWYoIWEuY2xvc2VkKXRoaXMuY2xvc2VkPWZhbHNlfWEuYXV0b1BsYWNlJiYoaS5pc1VuZGVmaW5lZChhLnBhcmVudCkmJihGJiYodj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxnLmFkZENsYXNzKHYsImRnIiksZy5hZGRDbGFzcyh2LAprLkNMQVNTX0FVVE9fUExBQ0VfQ09OVEFJTkVSKSxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHYpLEY9ZmFsc2UpLHYuYXBwZW5kQ2hpbGQodGhpcy5kb21FbGVtZW50KSxnLmFkZENsYXNzKHRoaXMuZG9tRWxlbWVudCxrLkNMQVNTX0FVVE9fUExBQ0UpKSx0aGlzLnBhcmVudHx8RChkLGEud2lkdGgpKTtnLmJpbmQod2luZG93LCJyZXNpemUiLGZ1bmN0aW9uKCl7ZC5vblJlc2l6ZSgpfSk7Zy5iaW5kKHRoaXMuX191bCwid2Via2l0VHJhbnNpdGlvbkVuZCIsZnVuY3Rpb24oKXtkLm9uUmVzaXplKCl9KTtnLmJpbmQodGhpcy5fX3VsLCJ0cmFuc2l0aW9uZW5kIixmdW5jdGlvbigpe2Qub25SZXNpemUoKX0pO2cuYmluZCh0aGlzLl9fdWwsIm9UcmFuc2l0aW9uRW5kIixmdW5jdGlvbigpe2Qub25SZXNpemUoKX0pO3RoaXMub25SZXNpemUoKTthLnJlc2l6YWJsZSYmSih0aGlzKTtkLmdldFJvb3QoKTthLnBhcmVudHx8YygpfTtrLnRvZ2dsZUhpZGU9ZnVuY3Rpb24oKXtBPSFBO2kuZWFjaChHLApmdW5jdGlvbihhKXthLmRvbUVsZW1lbnQuc3R5bGUuekluZGV4PUE/LTk5OTo5OTk7YS5kb21FbGVtZW50LnN0eWxlLm9wYWNpdHk9QT8wOjF9KX07ay5DTEFTU19BVVRPX1BMQUNFPSJhIjtrLkNMQVNTX0FVVE9fUExBQ0VfQ09OVEFJTkVSPSJhYyI7ay5DTEFTU19NQUlOPSJtYWluIjtrLkNMQVNTX0NPTlRST0xMRVJfUk9XPSJjciI7ay5DTEFTU19UT09fVEFMTD0idGFsbGVyLXRoYW4td2luZG93IjtrLkNMQVNTX0NMT1NFRD0iY2xvc2VkIjtrLkNMQVNTX0NMT1NFX0JVVFRPTj0iY2xvc2UtYnV0dG9uIjtrLkNMQVNTX0RSQUc9ImRyYWciO2suREVGQVVMVF9XSURUSD0yNDU7ay5URVhUX0NMT1NFRD0iQ2xvc2UgQ29udHJvbHMiO2suVEVYVF9PUEVOPSJPcGVuIENvbnRyb2xzIjtnLmJpbmQod2luZG93LCJrZXlkb3duIixmdW5jdGlvbihhKXtkb2N1bWVudC5hY3RpdmVFbGVtZW50LnR5cGUhPT0idGV4dCImJihhLndoaWNoPT09NzJ8fGEua2V5Q29kZT09NzIpJiZrLnRvZ2dsZUhpZGUoKX0sCmZhbHNlKTtpLmV4dGVuZChrLnByb3RvdHlwZSx7YWRkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHEodGhpcyxhLGIse2ZhY3RvcnlBcmdzOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywyKX0pfSxhZGRDb2xvcjpmdW5jdGlvbihhLGIpe3JldHVybiBxKHRoaXMsYSxiLHtjb2xvcjp0cnVlfSl9LHJlbW92ZTpmdW5jdGlvbihhKXt0aGlzLl9fdWwucmVtb3ZlQ2hpbGQoYS5fX2xpKTt0aGlzLl9fY29udHJvbGxlcnMuc2xpY2UodGhpcy5fX2NvbnRyb2xsZXJzLmluZGV4T2YoYSksMSk7dmFyIGI9dGhpcztpLmRlZmVyKGZ1bmN0aW9uKCl7Yi5vblJlc2l6ZSgpfSl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmF1dG9QbGFjZSYmdi5yZW1vdmVDaGlsZCh0aGlzLmRvbUVsZW1lbnQpfSxhZGRGb2xkZXI6ZnVuY3Rpb24oYSl7aWYodGhpcy5fX2ZvbGRlcnNbYV0hPT12b2lkIDApdGhyb3cgRXJyb3IoJ1lvdSBhbHJlYWR5IGhhdmUgYSBmb2xkZXIgaW4gdGhpcyBHVUkgYnkgdGhlIG5hbWUgIicrCmErJyInKTt2YXIgYj17bmFtZTphLHBhcmVudDp0aGlzfTtiLmF1dG9QbGFjZT10aGlzLmF1dG9QbGFjZTtpZih0aGlzLmxvYWQmJnRoaXMubG9hZC5mb2xkZXJzJiZ0aGlzLmxvYWQuZm9sZGVyc1thXSliLmNsb3NlZD10aGlzLmxvYWQuZm9sZGVyc1thXS5jbG9zZWQsYi5sb2FkPXRoaXMubG9hZC5mb2xkZXJzW2FdO2I9bmV3IGsoYik7dGhpcy5fX2ZvbGRlcnNbYV09YjthPXModGhpcyxiLmRvbUVsZW1lbnQpO2cuYWRkQ2xhc3MoYSwiZm9sZGVyIik7cmV0dXJuIGJ9LG9wZW46ZnVuY3Rpb24oKXt0aGlzLmNsb3NlZD1mYWxzZX0sY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLmNsb3NlZD10cnVlfSxvblJlc2l6ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Um9vdCgpO2lmKGEuc2Nyb2xsYWJsZSl7dmFyIGI9Zy5nZXRPZmZzZXQoYS5fX3VsKS50b3AsYz0wO2kuZWFjaChhLl9fdWwuY2hpbGROb2RlcyxmdW5jdGlvbihiKXthLmF1dG9QbGFjZSYmYj09PWEuX19zYXZlX3Jvd3x8KGMrPQpnLmdldEhlaWdodChiKSl9KTt3aW5kb3cuaW5uZXJIZWlnaHQtYi0yMDxjPyhnLmFkZENsYXNzKGEuZG9tRWxlbWVudCxrLkNMQVNTX1RPT19UQUxMKSxhLl9fdWwuc3R5bGUuaGVpZ2h0PXdpbmRvdy5pbm5lckhlaWdodC1iLTIwKyJweCIpOihnLnJlbW92ZUNsYXNzKGEuZG9tRWxlbWVudCxrLkNMQVNTX1RPT19UQUxMKSxhLl9fdWwuc3R5bGUuaGVpZ2h0PSJhdXRvIil9YS5fX3Jlc2l6ZV9oYW5kbGUmJmkuZGVmZXIoZnVuY3Rpb24oKXthLl9fcmVzaXplX2hhbmRsZS5zdHlsZS5oZWlnaHQ9YS5fX3VsLm9mZnNldEhlaWdodCsicHgifSk7aWYoYS5fX2Nsb3NlQnV0dG9uKWEuX19jbG9zZUJ1dHRvbi5zdHlsZS53aWR0aD1hLndpZHRoKyJweCJ9LHJlbWVtYmVyOmZ1bmN0aW9uKCl7aWYoaS5pc1VuZGVmaW5lZCh4KSl4PW5ldyB5LHguZG9tRWxlbWVudC5pbm5lckhUTUw9YTtpZih0aGlzLnBhcmVudCl0aHJvdyBFcnJvcigiWW91IGNhbiBvbmx5IGNhbGwgcmVtZW1iZXIgb24gYSB0b3AgbGV2ZWwgR1VJLiIpOwp2YXIgYj10aGlzO2kuZWFjaChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLGZ1bmN0aW9uKGEpe2IuX19yZW1lbWJlcmVkT2JqZWN0cy5sZW5ndGg9PTAmJkkoYik7Yi5fX3JlbWVtYmVyZWRPYmplY3RzLmluZGV4T2YoYSk9PS0xJiZiLl9fcmVtZW1iZXJlZE9iamVjdHMucHVzaChhKX0pO3RoaXMuYXV0b1BsYWNlJiZEKHRoaXMsdGhpcy53aWR0aCl9LGdldFJvb3Q6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpczthLnBhcmVudDspYT1hLnBhcmVudDtyZXR1cm4gYX0sZ2V0U2F2ZU9iamVjdDpmdW5jdGlvbigpe3ZhciBhPXRoaXMubG9hZDthLmNsb3NlZD10aGlzLmNsb3NlZDtpZih0aGlzLl9fcmVtZW1iZXJlZE9iamVjdHMubGVuZ3RoPjApe2EucHJlc2V0PXRoaXMucHJlc2V0O2lmKCFhLnJlbWVtYmVyZWQpYS5yZW1lbWJlcmVkPXt9O2EucmVtZW1iZXJlZFt0aGlzLnByZXNldF09eih0aGlzKX1hLmZvbGRlcnM9e307aS5lYWNoKHRoaXMuX19mb2xkZXJzLGZ1bmN0aW9uKGIsCmMpe2EuZm9sZGVyc1tjXT1iLmdldFNhdmVPYmplY3QoKX0pO3JldHVybiBhfSxzYXZlOmZ1bmN0aW9uKCl7aWYoIXRoaXMubG9hZC5yZW1lbWJlcmVkKXRoaXMubG9hZC5yZW1lbWJlcmVkPXt9O3RoaXMubG9hZC5yZW1lbWJlcmVkW3RoaXMucHJlc2V0XT16KHRoaXMpO0IodGhpcyxmYWxzZSl9LHNhdmVBczpmdW5jdGlvbihhKXtpZighdGhpcy5sb2FkLnJlbWVtYmVyZWQpdGhpcy5sb2FkLnJlbWVtYmVyZWQ9e30sdGhpcy5sb2FkLnJlbWVtYmVyZWRbd109eih0aGlzLHRydWUpO3RoaXMubG9hZC5yZW1lbWJlcmVkW2FdPXoodGhpcyk7dGhpcy5wcmVzZXQ9YTtDKHRoaXMsYSx0cnVlKX0scmV2ZXJ0OmZ1bmN0aW9uKGEpe2kuZWFjaCh0aGlzLl9fY29udHJvbGxlcnMsZnVuY3Rpb24oYil7dGhpcy5nZXRSb290KCkubG9hZC5yZW1lbWJlcmVkP3QoYXx8dGhpcy5nZXRSb290KCksYik6Yi5zZXRWYWx1ZShiLmluaXRpYWxWYWx1ZSl9LHRoaXMpO2kuZWFjaCh0aGlzLl9fZm9sZGVycywKZnVuY3Rpb24oYSl7YS5yZXZlcnQoYSl9KTthfHxCKHRoaXMuZ2V0Um9vdCgpLGZhbHNlKX0sbGlzdGVuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuX19saXN0ZW5pbmcubGVuZ3RoPT0wO3RoaXMuX19saXN0ZW5pbmcucHVzaChhKTtiJiZFKHRoaXMuX19saXN0ZW5pbmcpfX0pO3JldHVybiBrfShkYXQudXRpbHMuY3NzLCc8ZGl2IGlkPSJkZy1zYXZlIiBjbGFzcz0iZGcgZGlhbG9ndWUiPlxuXG4gIEhlcmVcJ3MgdGhlIG5ldyBsb2FkIHBhcmFtZXRlciBmb3IgeW91ciA8Y29kZT5HVUk8L2NvZGU+XCdzIGNvbnN0cnVjdG9yOlxuXG4gIDx0ZXh0YXJlYSBpZD0iZGctbmV3LWNvbnN0cnVjdG9yIj48L3RleHRhcmVhPlxuXG4gIDxkaXYgaWQ9ImRnLXNhdmUtbG9jYWxseSI+XG5cbiAgICA8aW5wdXQgaWQ9ImRnLWxvY2FsLXN0b3JhZ2UiIHR5cGU9ImNoZWNrYm94Ii8+IEF1dG9tYXRpY2FsbHkgc2F2ZVxuICAgIHZhbHVlcyB0byA8Y29kZT5sb2NhbFN0b3JhZ2U8L2NvZGU+IG9uIGV4aXQuXG5cbiAgICA8ZGl2IGlkPSJkZy1sb2NhbC1leHBsYWluIj5UaGUgdmFsdWVzIHNhdmVkIHRvIDxjb2RlPmxvY2FsU3RvcmFnZTwvY29kZT4gd2lsbFxuICAgICAgb3ZlcnJpZGUgdGhvc2UgcGFzc2VkIHRvIDxjb2RlPmRhdC5HVUk8L2NvZGU+XCdzIGNvbnN0cnVjdG9yLiBUaGlzIG1ha2VzIGl0XG4gICAgICBlYXNpZXIgdG8gd29yayBpbmNyZW1lbnRhbGx5LCBidXQgPGNvZGU+bG9jYWxTdG9yYWdlPC9jb2RlPiBpcyBmcmFnaWxlLFxuICAgICAgYW5kIHlvdXIgZnJpZW5kcyBtYXkgbm90IHNlZSB0aGUgc2FtZSB2YWx1ZXMgeW91IGRvLlxuICAgICAgXG4gICAgPC9kaXY+XG4gICAgXG4gIDwvZGl2PlxuXG48L2Rpdj4nLAoiLmRnIHVse2xpc3Qtc3R5bGU6bm9uZTttYXJnaW46MDtwYWRkaW5nOjA7d2lkdGg6MTAwJTtjbGVhcjpib3RofS5kZy5hY3twb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtoZWlnaHQ6MDt6LWluZGV4OjB9LmRnOm5vdCguYWMpIC5tYWlue292ZXJmbG93OmhpZGRlbn0uZGcubWFpbnstd2Via2l0LXRyYW5zaXRpb246b3BhY2l0eSAwLjFzIGxpbmVhcjstby10cmFuc2l0aW9uOm9wYWNpdHkgMC4xcyBsaW5lYXI7LW1vei10cmFuc2l0aW9uOm9wYWNpdHkgMC4xcyBsaW5lYXI7dHJhbnNpdGlvbjpvcGFjaXR5IDAuMXMgbGluZWFyfS5kZy5tYWluLnRhbGxlci10aGFuLXdpbmRvd3tvdmVyZmxvdy15OmF1dG99LmRnLm1haW4udGFsbGVyLXRoYW4td2luZG93IC5jbG9zZS1idXR0b257b3BhY2l0eToxO21hcmdpbi10b3A6LTFweDtib3JkZXItdG9wOjFweCBzb2xpZCAjMmMyYzJjfS5kZy5tYWluIHVsLmNsb3NlZCAuY2xvc2UtYnV0dG9ue29wYWNpdHk6MSAhaW1wb3J0YW50fS5kZy5tYWluOmhvdmVyIC5jbG9zZS1idXR0b24sLmRnLm1haW4gLmNsb3NlLWJ1dHRvbi5kcmFne29wYWNpdHk6MX0uZGcubWFpbiAuY2xvc2UtYnV0dG9uey13ZWJraXQtdHJhbnNpdGlvbjpvcGFjaXR5IDAuMXMgbGluZWFyOy1vLXRyYW5zaXRpb246b3BhY2l0eSAwLjFzIGxpbmVhcjstbW96LXRyYW5zaXRpb246b3BhY2l0eSAwLjFzIGxpbmVhcjt0cmFuc2l0aW9uOm9wYWNpdHkgMC4xcyBsaW5lYXI7Ym9yZGVyOjA7cG9zaXRpb246YWJzb2x1dGU7bGluZS1oZWlnaHQ6MTlweDtoZWlnaHQ6MjBweDtjdXJzb3I6cG9pbnRlcjt0ZXh0LWFsaWduOmNlbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9LmRnLm1haW4gLmNsb3NlLWJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiMxMTF9LmRnLmF7ZmxvYXQ6cmlnaHQ7bWFyZ2luLXJpZ2h0OjE1cHg7b3ZlcmZsb3cteDpoaWRkZW59LmRnLmEuaGFzLXNhdmUgdWx7bWFyZ2luLXRvcDoyN3B4fS5kZy5hLmhhcy1zYXZlIHVsLmNsb3NlZHttYXJnaW4tdG9wOjB9LmRnLmEgLnNhdmUtcm93e3Bvc2l0aW9uOmZpeGVkO3RvcDowO3otaW5kZXg6MTAwMn0uZGcgbGl7LXdlYmtpdC10cmFuc2l0aW9uOmhlaWdodCAwLjFzIGVhc2Utb3V0Oy1vLXRyYW5zaXRpb246aGVpZ2h0IDAuMXMgZWFzZS1vdXQ7LW1vei10cmFuc2l0aW9uOmhlaWdodCAwLjFzIGVhc2Utb3V0O3RyYW5zaXRpb246aGVpZ2h0IDAuMXMgZWFzZS1vdXR9LmRnIGxpOm5vdCguZm9sZGVyKXtjdXJzb3I6YXV0bztoZWlnaHQ6MjdweDtsaW5lLWhlaWdodDoyN3B4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjAgNHB4IDAgNXB4fS5kZyBsaS5mb2xkZXJ7cGFkZGluZzowO2JvcmRlci1sZWZ0OjRweCBzb2xpZCByZ2JhKDAsMCwwLDApfS5kZyBsaS50aXRsZXtjdXJzb3I6cG9pbnRlcjttYXJnaW4tbGVmdDotNHB4fS5kZyAuY2xvc2VkIGxpOm5vdCgudGl0bGUpLC5kZyAuY2xvc2VkIHVsIGxpLC5kZyAuY2xvc2VkIHVsIGxpID4gKntoZWlnaHQ6MDtvdmVyZmxvdzpoaWRkZW47Ym9yZGVyOjB9LmRnIC5jcntjbGVhcjpib3RoO3BhZGRpbmctbGVmdDozcHg7aGVpZ2h0OjI3cHh9LmRnIC5wcm9wZXJ0eS1uYW1le2N1cnNvcjpkZWZhdWx0O2Zsb2F0OmxlZnQ7Y2xlYXI6bGVmdDt3aWR0aDo0MCU7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXN9LmRnIC5je2Zsb2F0OmxlZnQ7d2lkdGg6NjAlfS5kZyAuYyBpbnB1dFt0eXBlPXRleHRde2JvcmRlcjowO21hcmdpbi10b3A6NHB4O3BhZGRpbmc6M3B4O3dpZHRoOjEwMCU7ZmxvYXQ6cmlnaHR9LmRnIC5oYXMtc2xpZGVyIGlucHV0W3R5cGU9dGV4dF17d2lkdGg6MzAlO21hcmdpbi1sZWZ0OjB9LmRnIC5zbGlkZXJ7ZmxvYXQ6bGVmdDt3aWR0aDo2NiU7bWFyZ2luLWxlZnQ6LTVweDttYXJnaW4tcmlnaHQ6MDtoZWlnaHQ6MTlweDttYXJnaW4tdG9wOjRweH0uZGcgLnNsaWRlci1mZ3toZWlnaHQ6MTAwJX0uZGcgLmMgaW5wdXRbdHlwZT1jaGVja2JveF17bWFyZ2luLXRvcDo5cHh9LmRnIC5jIHNlbGVjdHttYXJnaW4tdG9wOjVweH0uZGcgLmNyLmZ1bmN0aW9uLC5kZyAuY3IuZnVuY3Rpb24gLnByb3BlcnR5LW5hbWUsLmRnIC5jci5mdW5jdGlvbiAqLC5kZyAuY3IuYm9vbGVhbiwuZGcgLmNyLmJvb2xlYW4gKntjdXJzb3I6cG9pbnRlcn0uZGcgLnNlbGVjdG9ye2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZTttYXJnaW4tbGVmdDotOXB4O21hcmdpbi10b3A6MjNweDt6LWluZGV4OjEwfS5kZyAuYzpob3ZlciAuc2VsZWN0b3IsLmRnIC5zZWxlY3Rvci5kcmFne2Rpc3BsYXk6YmxvY2t9LmRnIGxpLnNhdmUtcm93e3BhZGRpbmc6MH0uZGcgbGkuc2F2ZS1yb3cgLmJ1dHRvbntkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nOjBweCA2cHh9LmRnLmRpYWxvZ3Vle2JhY2tncm91bmQtY29sb3I6IzIyMjt3aWR0aDo0NjBweDtwYWRkaW5nOjE1cHg7Zm9udC1zaXplOjEzcHg7bGluZS1oZWlnaHQ6MTVweH0jZGctbmV3LWNvbnN0cnVjdG9ye3BhZGRpbmc6MTBweDtjb2xvcjojMjIyO2ZvbnQtZmFtaWx5Ok1vbmFjbywgbW9ub3NwYWNlO2ZvbnQtc2l6ZToxMHB4O2JvcmRlcjowO3Jlc2l6ZTpub25lO2JveC1zaGFkb3c6aW5zZXQgMXB4IDFweCAxcHggIzg4ODt3b3JkLXdyYXA6YnJlYWstd29yZDttYXJnaW46MTJweCAwO2Rpc3BsYXk6YmxvY2s7d2lkdGg6NDQwcHg7b3ZlcmZsb3cteTpzY3JvbGw7aGVpZ2h0OjEwMHB4O3Bvc2l0aW9uOnJlbGF0aXZlfSNkZy1sb2NhbC1leHBsYWlue2Rpc3BsYXk6bm9uZTtmb250LXNpemU6MTFweDtsaW5lLWhlaWdodDoxN3B4O2JvcmRlci1yYWRpdXM6M3B4O2JhY2tncm91bmQtY29sb3I6IzMzMztwYWRkaW5nOjhweDttYXJnaW4tdG9wOjEwcHh9I2RnLWxvY2FsLWV4cGxhaW4gY29kZXtmb250LXNpemU6MTBweH0jZGF0LWd1aS1zYXZlLWxvY2FsbHl7ZGlzcGxheTpub25lfS5kZ3tjb2xvcjojZWVlO2ZvbnQ6MTFweCAnTHVjaWRhIEdyYW5kZScsIHNhbnMtc2VyaWY7dGV4dC1zaGFkb3c6MCAtMXB4IDAgIzExMX0uZGcubWFpbjo6LXdlYmtpdC1zY3JvbGxiYXJ7d2lkdGg6NXB4O2JhY2tncm91bmQ6IzFhMWExYX0uZGcubWFpbjo6LXdlYmtpdC1zY3JvbGxiYXItY29ybmVye2hlaWdodDowO2Rpc3BsYXk6bm9uZX0uZGcubWFpbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWJ7Ym9yZGVyLXJhZGl1czo1cHg7YmFja2dyb3VuZDojNjc2NzY3fS5kZyBsaTpub3QoLmZvbGRlcil7YmFja2dyb3VuZDojMWExYTFhO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICMyYzJjMmN9LmRnIGxpLnNhdmUtcm93e2xpbmUtaGVpZ2h0OjI1cHg7YmFja2dyb3VuZDojZGFkNWNiO2JvcmRlcjowfS5kZyBsaS5zYXZlLXJvdyBzZWxlY3R7bWFyZ2luLWxlZnQ6NXB4O3dpZHRoOjEwOHB4fS5kZyBsaS5zYXZlLXJvdyAuYnV0dG9ue21hcmdpbi1sZWZ0OjVweDttYXJnaW4tdG9wOjFweDtib3JkZXItcmFkaXVzOjJweDtmb250LXNpemU6OXB4O2xpbmUtaGVpZ2h0OjdweDtwYWRkaW5nOjRweCA0cHggNXB4IDRweDtiYWNrZ3JvdW5kOiNjNWJkYWQ7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzowIDFweCAwICNiMGE1OGY7Ym94LXNoYWRvdzowIC0xcHggMCAjYjBhNThmO2N1cnNvcjpwb2ludGVyfS5kZyBsaS5zYXZlLXJvdyAuYnV0dG9uLmdlYXJze2JhY2tncm91bmQ6I2M1YmRhZCB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBc0FBQUFOQ0FZQUFBQi85WlE3QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUFRSkpSRUZVZU5waVlLQVUvUC8vUHdHSUMvQXBDQUJpQlNBVytJOEFDbEFjZ0t4UTRUOWhvTUFFVXJ4eDJRU0dONitlZ0RYKy92V1Q0ZTdOODJBTVlvUEF4L2V2d1dvWW9TWWJBQ1gyczdLeEN4emNzZXpEaDNldkZvREVCWVRFRXF5Y2dnV0F6QTlBdVVTUVFnZVlQYTlmUHY2L1lXbS9BY3g1SVBiN3R5L2Z3K1FaYmx3Njd2RHM4UjBZSHlRaGdPYngreUFKa0JxbUc1ZFBQRGgxYVBPR1IvZXVnVzBHNHZsSW9USWZ5RmNBK1Fla2hoSEpoUGRReGJpQUlndU1CVFFaclBENzEwOE02cm9XWURGUWlJQUF2NkFvdy8xYkZ3WGdpcytmMkxVQXlud29JYU5jejhYTngzRGw3TUVKVURHUXB4OWd0UThZQ3VlQitEMjZPRUNBQVFEYWR0N2U0NkQ0MlFBQUFBQkpSVTVFcmtKZ2dnPT0pIDJweCAxcHggbm8tcmVwZWF0O2hlaWdodDo3cHg7d2lkdGg6OHB4fS5kZyBsaS5zYXZlLXJvdyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2JhYjE5ZTtib3gtc2hhZG93OjAgLTFweCAwICNiMGE1OGZ9LmRnIGxpLmZvbGRlcntib3JkZXItYm90dG9tOjB9LmRnIGxpLnRpdGxle3BhZGRpbmctbGVmdDoxNnB4O2JhY2tncm91bmQ6IzAwMCB1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQlFBRkFKRUFBUC8vLy9QejgvLy8vLy8vL3lINUJBRUFBQUlBTEFBQUFBQUZBQVVBQUFJSWxJK2hLZ0Z4b0NnQU93PT0pIDZweCAxMHB4IG5vLXJlcGVhdDtjdXJzb3I6cG9pbnRlcjtib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMil9LmRnIC5jbG9zZWQgbGkudGl0bGV7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQlFBRkFKRUFBUC8vLy9QejgvLy8vLy8vL3lINUJBRUFBQUlBTEFBQUFBQUZBQVVBQUFJSWxHSVdxTUNiV0FFQU93PT0pfS5kZyAuY3IuYm9vbGVhbntib3JkZXItbGVmdDozcHggc29saWQgIzgwNjc4N30uZGcgLmNyLmZ1bmN0aW9ue2JvcmRlci1sZWZ0OjNweCBzb2xpZCAjZTYxZDVmfS5kZyAuY3IubnVtYmVye2JvcmRlci1sZWZ0OjNweCBzb2xpZCAjMmZhMWQ2fS5kZyAuY3IubnVtYmVyIGlucHV0W3R5cGU9dGV4dF17Y29sb3I6IzJmYTFkNn0uZGcgLmNyLnN0cmluZ3tib3JkZXItbGVmdDozcHggc29saWQgIzFlZDM2Zn0uZGcgLmNyLnN0cmluZyBpbnB1dFt0eXBlPXRleHRde2NvbG9yOiMxZWQzNmZ9LmRnIC5jci5mdW5jdGlvbjpob3ZlciwuZGcgLmNyLmJvb2xlYW46aG92ZXJ7YmFja2dyb3VuZDojMTExfS5kZyAuYyBpbnB1dFt0eXBlPXRleHRde2JhY2tncm91bmQ6IzMwMzAzMDtvdXRsaW5lOm5vbmV9LmRnIC5jIGlucHV0W3R5cGU9dGV4dF06aG92ZXJ7YmFja2dyb3VuZDojM2MzYzNjfS5kZyAuYyBpbnB1dFt0eXBlPXRleHRdOmZvY3Vze2JhY2tncm91bmQ6IzQ5NDk0OTtjb2xvcjojZmZmfS5kZyAuYyAuc2xpZGVye2JhY2tncm91bmQ6IzMwMzAzMDtjdXJzb3I6ZXctcmVzaXplfS5kZyAuYyAuc2xpZGVyLWZne2JhY2tncm91bmQ6IzJmYTFkNn0uZGcgLmMgLnNsaWRlcjpob3ZlcntiYWNrZ3JvdW5kOiMzYzNjM2N9LmRnIC5jIC5zbGlkZXI6aG92ZXIgLnNsaWRlci1mZ3tiYWNrZ3JvdW5kOiM0NGFiZGF9XG4iLApkYXQuY29udHJvbGxlcnMuZmFjdG9yeT1mdW5jdGlvbihlLGEsYyxkLGYsYixuKXtyZXR1cm4gZnVuY3Rpb24oaCxqLG0sbCl7dmFyIG89aFtqXTtpZihuLmlzQXJyYXkobSl8fG4uaXNPYmplY3QobSkpcmV0dXJuIG5ldyBlKGgsaixtKTtpZihuLmlzTnVtYmVyKG8pKXJldHVybiBuLmlzTnVtYmVyKG0pJiZuLmlzTnVtYmVyKGwpP25ldyBjKGgsaixtLGwpOm5ldyBhKGgsaix7bWluOm0sbWF4Omx9KTtpZihuLmlzU3RyaW5nKG8pKXJldHVybiBuZXcgZChoLGopO2lmKG4uaXNGdW5jdGlvbihvKSlyZXR1cm4gbmV3IGYoaCxqLCIiKTtpZihuLmlzQm9vbGVhbihvKSlyZXR1cm4gbmV3IGIoaCxqKX19KGRhdC5jb250cm9sbGVycy5PcHRpb25Db250cm9sbGVyLGRhdC5jb250cm9sbGVycy5OdW1iZXJDb250cm9sbGVyQm94LGRhdC5jb250cm9sbGVycy5OdW1iZXJDb250cm9sbGVyU2xpZGVyLGRhdC5jb250cm9sbGVycy5TdHJpbmdDb250cm9sbGVyPWZ1bmN0aW9uKGUsYSxjKXt2YXIgZD0KZnVuY3Rpb24oYyxiKXtmdW5jdGlvbiBlKCl7aC5zZXRWYWx1ZShoLl9faW5wdXQudmFsdWUpfWQuc3VwZXJjbGFzcy5jYWxsKHRoaXMsYyxiKTt2YXIgaD10aGlzO3RoaXMuX19pbnB1dD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO3RoaXMuX19pbnB1dC5zZXRBdHRyaWJ1dGUoInR5cGUiLCJ0ZXh0Iik7YS5iaW5kKHRoaXMuX19pbnB1dCwia2V5dXAiLGUpO2EuYmluZCh0aGlzLl9faW5wdXQsImNoYW5nZSIsZSk7YS5iaW5kKHRoaXMuX19pbnB1dCwiYmx1ciIsZnVuY3Rpb24oKXtoLl9fb25GaW5pc2hDaGFuZ2UmJmguX19vbkZpbmlzaENoYW5nZS5jYWxsKGgsaC5nZXRWYWx1ZSgpKX0pO2EuYmluZCh0aGlzLl9faW5wdXQsImtleWRvd24iLGZ1bmN0aW9uKGEpe2Eua2V5Q29kZT09PTEzJiZ0aGlzLmJsdXIoKX0pO3RoaXMudXBkYXRlRGlzcGxheSgpO3RoaXMuZG9tRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9faW5wdXQpfTtkLnN1cGVyY2xhc3M9ZTtjLmV4dGVuZChkLnByb3RvdHlwZSwKZS5wcm90b3R5cGUse3VwZGF0ZURpc3BsYXk6ZnVuY3Rpb24oKXtpZighYS5pc0FjdGl2ZSh0aGlzLl9faW5wdXQpKXRoaXMuX19pbnB1dC52YWx1ZT10aGlzLmdldFZhbHVlKCk7cmV0dXJuIGQuc3VwZXJjbGFzcy5wcm90b3R5cGUudXBkYXRlRGlzcGxheS5jYWxsKHRoaXMpfX0pO3JldHVybiBkfShkYXQuY29udHJvbGxlcnMuQ29udHJvbGxlcixkYXQuZG9tLmRvbSxkYXQudXRpbHMuY29tbW9uKSxkYXQuY29udHJvbGxlcnMuRnVuY3Rpb25Db250cm9sbGVyLGRhdC5jb250cm9sbGVycy5Cb29sZWFuQ29udHJvbGxlcixkYXQudXRpbHMuY29tbW9uKSxkYXQuY29udHJvbGxlcnMuQ29udHJvbGxlcixkYXQuY29udHJvbGxlcnMuQm9vbGVhbkNvbnRyb2xsZXIsZGF0LmNvbnRyb2xsZXJzLkZ1bmN0aW9uQ29udHJvbGxlcixkYXQuY29udHJvbGxlcnMuTnVtYmVyQ29udHJvbGxlckJveCxkYXQuY29udHJvbGxlcnMuTnVtYmVyQ29udHJvbGxlclNsaWRlcixkYXQuY29udHJvbGxlcnMuT3B0aW9uQ29udHJvbGxlciwKZGF0LmNvbnRyb2xsZXJzLkNvbG9yQ29udHJvbGxlcj1mdW5jdGlvbihlLGEsYyxkLGYpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7YS5zdHlsZS5iYWNrZ3JvdW5kPSIiO2YuZWFjaChqLGZ1bmN0aW9uKGUpe2Euc3R5bGUuY3NzVGV4dCs9ImJhY2tncm91bmQ6ICIrZSsibGluZWFyLWdyYWRpZW50KCIrYisiLCAiK2MrIiAwJSwgIitkKyIgMTAwJSk7ICJ9KX1mdW5jdGlvbiBuKGEpe2Euc3R5bGUuYmFja2dyb3VuZD0iIjthLnN0eWxlLmNzc1RleHQrPSJiYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsICAjZmYwMDAwIDAlLCAjZmYwMGZmIDE3JSwgIzAwMDBmZiAzNCUsICMwMGZmZmYgNTAlLCAjMDBmZjAwIDY3JSwgI2ZmZmYwMCA4NCUsICNmZjAwMDAgMTAwJSk7IjthLnN0eWxlLmNzc1RleHQrPSJiYWNrZ3JvdW5kOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsICAjZmYwMDAwIDAlLCNmZjAwZmYgMTclLCMwMDAwZmYgMzQlLCMwMGZmZmYgNTAlLCMwMGZmMDAgNjclLCNmZmZmMDAgODQlLCNmZjAwMDAgMTAwJSk7IjsKYS5zdHlsZS5jc3NUZXh0Kz0iYmFja2dyb3VuZDogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgICNmZjAwMDAgMCUsI2ZmMDBmZiAxNyUsIzAwMDBmZiAzNCUsIzAwZmZmZiA1MCUsIzAwZmYwMCA2NyUsI2ZmZmYwMCA4NCUsI2ZmMDAwMCAxMDAlKTsiO2Euc3R5bGUuY3NzVGV4dCs9ImJhY2tncm91bmQ6IC1tcy1saW5lYXItZ3JhZGllbnQodG9wLCAgI2ZmMDAwMCAwJSwjZmYwMGZmIDE3JSwjMDAwMGZmIDM0JSwjMDBmZmZmIDUwJSwjMDBmZjAwIDY3JSwjZmZmZjAwIDg0JSwjZmYwMDAwIDEwMCUpOyI7YS5zdHlsZS5jc3NUZXh0Kz0iYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvcCwgICNmZjAwMDAgMCUsI2ZmMDBmZiAxNyUsIzAwMDBmZiAzNCUsIzAwZmZmZiA1MCUsIzAwZmYwMCA2NyUsI2ZmZmYwMCA4NCUsI2ZmMDAwMCAxMDAlKTsifXZhciBoPWZ1bmN0aW9uKGUsbCl7ZnVuY3Rpb24gbyhiKXtxKGIpO2EuYmluZCh3aW5kb3csIm1vdXNlbW92ZSIscSk7YS5iaW5kKHdpbmRvdywKIm1vdXNldXAiLGopfWZ1bmN0aW9uIGooKXthLnVuYmluZCh3aW5kb3csIm1vdXNlbW92ZSIscSk7YS51bmJpbmQod2luZG93LCJtb3VzZXVwIixqKX1mdW5jdGlvbiBnKCl7dmFyIGE9ZCh0aGlzLnZhbHVlKTthIT09ZmFsc2U/KHAuX19jb2xvci5fX3N0YXRlPWEscC5zZXRWYWx1ZShwLl9fY29sb3IudG9PcmlnaW5hbCgpKSk6dGhpcy52YWx1ZT1wLl9fY29sb3IudG9TdHJpbmcoKX1mdW5jdGlvbiBpKCl7YS51bmJpbmQod2luZG93LCJtb3VzZW1vdmUiLHMpO2EudW5iaW5kKHdpbmRvdywibW91c2V1cCIsaSl9ZnVuY3Rpb24gcShiKXtiLnByZXZlbnREZWZhdWx0KCk7dmFyIGM9YS5nZXRXaWR0aChwLl9fc2F0dXJhdGlvbl9maWVsZCksZD1hLmdldE9mZnNldChwLl9fc2F0dXJhdGlvbl9maWVsZCksZT0oYi5jbGllbnRYLWQubGVmdCtkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQpL2MsYj0xLShiLmNsaWVudFktZC50b3ArZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApL2M7Yj4xP2I9CjE6YjwwJiYoYj0wKTtlPjE/ZT0xOmU8MCYmKGU9MCk7cC5fX2NvbG9yLnY9YjtwLl9fY29sb3Iucz1lO3Auc2V0VmFsdWUocC5fX2NvbG9yLnRvT3JpZ2luYWwoKSk7cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIHMoYil7Yi5wcmV2ZW50RGVmYXVsdCgpO3ZhciBjPWEuZ2V0SGVpZ2h0KHAuX19odWVfZmllbGQpLGQ9YS5nZXRPZmZzZXQocC5fX2h1ZV9maWVsZCksYj0xLShiLmNsaWVudFktZC50b3ArZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApL2M7Yj4xP2I9MTpiPDAmJihiPTApO3AuX19jb2xvci5oPWIqMzYwO3Auc2V0VmFsdWUocC5fX2NvbG9yLnRvT3JpZ2luYWwoKSk7cmV0dXJuIGZhbHNlfWguc3VwZXJjbGFzcy5jYWxsKHRoaXMsZSxsKTt0aGlzLl9fY29sb3I9bmV3IGModGhpcy5nZXRWYWx1ZSgpKTt0aGlzLl9fdGVtcD1uZXcgYygwKTt2YXIgcD10aGlzO3RoaXMuZG9tRWxlbWVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLm1ha2VTZWxlY3RhYmxlKHRoaXMuZG9tRWxlbWVudCwKZmFsc2UpO3RoaXMuX19zZWxlY3Rvcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLl9fc2VsZWN0b3IuY2xhc3NOYW1lPSJzZWxlY3RvciI7dGhpcy5fX3NhdHVyYXRpb25fZmllbGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5fX3NhdHVyYXRpb25fZmllbGQuY2xhc3NOYW1lPSJzYXR1cmF0aW9uLWZpZWxkIjt0aGlzLl9fZmllbGRfa25vYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLl9fZmllbGRfa25vYi5jbGFzc05hbWU9ImZpZWxkLWtub2IiO3RoaXMuX19maWVsZF9rbm9iX2JvcmRlcj0iMnB4IHNvbGlkICI7dGhpcy5fX2h1ZV9rbm9iPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuX19odWVfa25vYi5jbGFzc05hbWU9Imh1ZS1rbm9iIjt0aGlzLl9faHVlX2ZpZWxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuX19odWVfZmllbGQuY2xhc3NOYW1lPSJodWUtZmllbGQiO3RoaXMuX19pbnB1dD0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTt0aGlzLl9faW5wdXQudHlwZT0idGV4dCI7dGhpcy5fX2lucHV0X3RleHRTaGFkb3c9IjAgMXB4IDFweCAiO2EuYmluZCh0aGlzLl9faW5wdXQsImtleWRvd24iLGZ1bmN0aW9uKGEpe2Eua2V5Q29kZT09PTEzJiZnLmNhbGwodGhpcyl9KTthLmJpbmQodGhpcy5fX2lucHV0LCJibHVyIixnKTthLmJpbmQodGhpcy5fX3NlbGVjdG9yLCJtb3VzZWRvd24iLGZ1bmN0aW9uKCl7YS5hZGRDbGFzcyh0aGlzLCJkcmFnIikuYmluZCh3aW5kb3csIm1vdXNldXAiLGZ1bmN0aW9uKCl7YS5yZW1vdmVDbGFzcyhwLl9fc2VsZWN0b3IsImRyYWciKX0pfSk7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5leHRlbmQodGhpcy5fX3NlbGVjdG9yLnN0eWxlLHt3aWR0aDoiMTIycHgiLGhlaWdodDoiMTAycHgiLHBhZGRpbmc6IjNweCIsYmFja2dyb3VuZENvbG9yOiIjMjIyIixib3hTaGFkb3c6IjBweCAxcHggM3B4IHJnYmEoMCwwLDAsMC4zKSJ9KTsKZi5leHRlbmQodGhpcy5fX2ZpZWxkX2tub2Iuc3R5bGUse3Bvc2l0aW9uOiJhYnNvbHV0ZSIsd2lkdGg6IjEycHgiLGhlaWdodDoiMTJweCIsYm9yZGVyOnRoaXMuX19maWVsZF9rbm9iX2JvcmRlcisodGhpcy5fX2NvbG9yLnY8MC41PyIjZmZmIjoiIzAwMCIpLGJveFNoYWRvdzoiMHB4IDFweCAzcHggcmdiYSgwLDAsMCwwLjUpIixib3JkZXJSYWRpdXM6IjEycHgiLHpJbmRleDoxfSk7Zi5leHRlbmQodGhpcy5fX2h1ZV9rbm9iLnN0eWxlLHtwb3NpdGlvbjoiYWJzb2x1dGUiLHdpZHRoOiIxNXB4IixoZWlnaHQ6IjJweCIsYm9yZGVyUmlnaHQ6IjRweCBzb2xpZCAjZmZmIix6SW5kZXg6MX0pO2YuZXh0ZW5kKHRoaXMuX19zYXR1cmF0aW9uX2ZpZWxkLnN0eWxlLHt3aWR0aDoiMTAwcHgiLGhlaWdodDoiMTAwcHgiLGJvcmRlcjoiMXB4IHNvbGlkICM1NTUiLG1hcmdpblJpZ2h0OiIzcHgiLGRpc3BsYXk6ImlubGluZS1ibG9jayIsY3Vyc29yOiJwb2ludGVyIn0pO2YuZXh0ZW5kKHQuc3R5bGUsCnt3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIixiYWNrZ3JvdW5kOiJub25lIn0pO2IodCwidG9wIiwicmdiYSgwLDAsMCwwKSIsIiMwMDAiKTtmLmV4dGVuZCh0aGlzLl9faHVlX2ZpZWxkLnN0eWxlLHt3aWR0aDoiMTVweCIsaGVpZ2h0OiIxMDBweCIsZGlzcGxheToiaW5saW5lLWJsb2NrIixib3JkZXI6IjFweCBzb2xpZCAjNTU1IixjdXJzb3I6Im5zLXJlc2l6ZSJ9KTtuKHRoaXMuX19odWVfZmllbGQpO2YuZXh0ZW5kKHRoaXMuX19pbnB1dC5zdHlsZSx7b3V0bGluZToibm9uZSIsdGV4dEFsaWduOiJjZW50ZXIiLGNvbG9yOiIjZmZmIixib3JkZXI6MCxmb250V2VpZ2h0OiJib2xkIix0ZXh0U2hhZG93OnRoaXMuX19pbnB1dF90ZXh0U2hhZG93KyJyZ2JhKDAsMCwwLDAuNykifSk7YS5iaW5kKHRoaXMuX19zYXR1cmF0aW9uX2ZpZWxkLCJtb3VzZWRvd24iLG8pO2EuYmluZCh0aGlzLl9fZmllbGRfa25vYiwibW91c2Vkb3duIixvKTthLmJpbmQodGhpcy5fX2h1ZV9maWVsZCwibW91c2Vkb3duIiwKZnVuY3Rpb24oYil7cyhiKTthLmJpbmQod2luZG93LCJtb3VzZW1vdmUiLHMpO2EuYmluZCh3aW5kb3csIm1vdXNldXAiLGkpfSk7dGhpcy5fX3NhdHVyYXRpb25fZmllbGQuYXBwZW5kQ2hpbGQodCk7dGhpcy5fX3NlbGVjdG9yLmFwcGVuZENoaWxkKHRoaXMuX19maWVsZF9rbm9iKTt0aGlzLl9fc2VsZWN0b3IuYXBwZW5kQ2hpbGQodGhpcy5fX3NhdHVyYXRpb25fZmllbGQpO3RoaXMuX19zZWxlY3Rvci5hcHBlbmRDaGlsZCh0aGlzLl9faHVlX2ZpZWxkKTt0aGlzLl9faHVlX2ZpZWxkLmFwcGVuZENoaWxkKHRoaXMuX19odWVfa25vYik7dGhpcy5kb21FbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX19pbnB1dCk7dGhpcy5kb21FbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX19zZWxlY3Rvcik7dGhpcy51cGRhdGVEaXNwbGF5KCl9O2guc3VwZXJjbGFzcz1lO2YuZXh0ZW5kKGgucHJvdG90eXBlLGUucHJvdG90eXBlLHt1cGRhdGVEaXNwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9ZCh0aGlzLmdldFZhbHVlKCkpOwppZihhIT09ZmFsc2Upe3ZhciBlPWZhbHNlO2YuZWFjaChjLkNPTVBPTkVOVFMsZnVuY3Rpb24oYil7aWYoIWYuaXNVbmRlZmluZWQoYVtiXSkmJiFmLmlzVW5kZWZpbmVkKHRoaXMuX19jb2xvci5fX3N0YXRlW2JdKSYmYVtiXSE9PXRoaXMuX19jb2xvci5fX3N0YXRlW2JdKXJldHVybiBlPXRydWUse319LHRoaXMpO2UmJmYuZXh0ZW5kKHRoaXMuX19jb2xvci5fX3N0YXRlLGEpfWYuZXh0ZW5kKHRoaXMuX190ZW1wLl9fc3RhdGUsdGhpcy5fX2NvbG9yLl9fc3RhdGUpO3RoaXMuX190ZW1wLmE9MTt2YXIgaD10aGlzLl9fY29sb3IudjwwLjV8fHRoaXMuX19jb2xvci5zPjAuNT8yNTU6MCxqPTI1NS1oO2YuZXh0ZW5kKHRoaXMuX19maWVsZF9rbm9iLnN0eWxlLHttYXJnaW5MZWZ0OjEwMCp0aGlzLl9fY29sb3Iucy03KyJweCIsbWFyZ2luVG9wOjEwMCooMS10aGlzLl9fY29sb3IudiktNysicHgiLGJhY2tncm91bmRDb2xvcjp0aGlzLl9fdGVtcC50b1N0cmluZygpLGJvcmRlcjp0aGlzLl9fZmllbGRfa25vYl9ib3JkZXIrCiJyZ2IoIitoKyIsIitoKyIsIitoKyIpIn0pO3RoaXMuX19odWVfa25vYi5zdHlsZS5tYXJnaW5Ub3A9KDEtdGhpcy5fX2NvbG9yLmgvMzYwKSoxMDArInB4Ijt0aGlzLl9fdGVtcC5zPTE7dGhpcy5fX3RlbXAudj0xO2IodGhpcy5fX3NhdHVyYXRpb25fZmllbGQsImxlZnQiLCIjZmZmIix0aGlzLl9fdGVtcC50b1N0cmluZygpKTtmLmV4dGVuZCh0aGlzLl9faW5wdXQuc3R5bGUse2JhY2tncm91bmRDb2xvcjp0aGlzLl9faW5wdXQudmFsdWU9dGhpcy5fX2NvbG9yLnRvU3RyaW5nKCksY29sb3I6InJnYigiK2grIiwiK2grIiwiK2grIikiLHRleHRTaGFkb3c6dGhpcy5fX2lucHV0X3RleHRTaGFkb3crInJnYmEoIitqKyIsIitqKyIsIitqKyIsLjcpIn0pfX0pO3ZhciBqPVsiLW1vei0iLCItby0iLCItd2Via2l0LSIsIi1tcy0iLCIiXTtyZXR1cm4gaH0oZGF0LmNvbnRyb2xsZXJzLkNvbnRyb2xsZXIsZGF0LmRvbS5kb20sZGF0LmNvbG9yLkNvbG9yPWZ1bmN0aW9uKGUsYSxjLGQpe2Z1bmN0aW9uIGYoYSwKYixjKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxiLHtnZXQ6ZnVuY3Rpb24oKXtpZih0aGlzLl9fc3RhdGUuc3BhY2U9PT0iUkdCIilyZXR1cm4gdGhpcy5fX3N0YXRlW2JdO24odGhpcyxiLGMpO3JldHVybiB0aGlzLl9fc3RhdGVbYl19LHNldDpmdW5jdGlvbihhKXtpZih0aGlzLl9fc3RhdGUuc3BhY2UhPT0iUkdCIiluKHRoaXMsYixjKSx0aGlzLl9fc3RhdGUuc3BhY2U9IlJHQiI7dGhpcy5fX3N0YXRlW2JdPWF9fSl9ZnVuY3Rpb24gYihhLGIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse2dldDpmdW5jdGlvbigpe2lmKHRoaXMuX19zdGF0ZS5zcGFjZT09PSJIU1YiKXJldHVybiB0aGlzLl9fc3RhdGVbYl07aCh0aGlzKTtyZXR1cm4gdGhpcy5fX3N0YXRlW2JdfSxzZXQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5fX3N0YXRlLnNwYWNlIT09IkhTViIpaCh0aGlzKSx0aGlzLl9fc3RhdGUuc3BhY2U9IkhTViI7dGhpcy5fX3N0YXRlW2JdPWF9fSl9ZnVuY3Rpb24gbihiLGMsZSl7aWYoYi5fX3N0YXRlLnNwYWNlPT09CiJIRVgiKWIuX19zdGF0ZVtjXT1hLmNvbXBvbmVudF9mcm9tX2hleChiLl9fc3RhdGUuaGV4LGUpO2Vsc2UgaWYoYi5fX3N0YXRlLnNwYWNlPT09IkhTViIpZC5leHRlbmQoYi5fX3N0YXRlLGEuaHN2X3RvX3JnYihiLl9fc3RhdGUuaCxiLl9fc3RhdGUucyxiLl9fc3RhdGUudikpO2Vsc2UgdGhyb3ciQ29ycnVwdGVkIGNvbG9yIHN0YXRlIjt9ZnVuY3Rpb24gaChiKXt2YXIgYz1hLnJnYl90b19oc3YoYi5yLGIuZyxiLmIpO2QuZXh0ZW5kKGIuX19zdGF0ZSx7czpjLnMsdjpjLnZ9KTtpZihkLmlzTmFOKGMuaCkpe2lmKGQuaXNVbmRlZmluZWQoYi5fX3N0YXRlLmgpKWIuX19zdGF0ZS5oPTB9ZWxzZSBiLl9fc3RhdGUuaD1jLmh9dmFyIGo9ZnVuY3Rpb24oKXt0aGlzLl9fc3RhdGU9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYodGhpcy5fX3N0YXRlPT09ZmFsc2UpdGhyb3ciRmFpbGVkIHRvIGludGVycHJldCBjb2xvciBhcmd1bWVudHMiO3RoaXMuX19zdGF0ZS5hPXRoaXMuX19zdGF0ZS5hfHwKMX07ai5DT01QT05FTlRTPSJyLGcsYixoLHMsdixoZXgsYSIuc3BsaXQoIiwiKTtkLmV4dGVuZChqLnByb3RvdHlwZSx7dG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gYyh0aGlzKX0sdG9PcmlnaW5hbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9fc3RhdGUuY29udmVyc2lvbi53cml0ZSh0aGlzKX19KTtmKGoucHJvdG90eXBlLCJyIiwyKTtmKGoucHJvdG90eXBlLCJnIiwxKTtmKGoucHJvdG90eXBlLCJiIiwwKTtiKGoucHJvdG90eXBlLCJoIik7YihqLnByb3RvdHlwZSwicyIpO2Ioai5wcm90b3R5cGUsInYiKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoai5wcm90b3R5cGUsImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX3N0YXRlLmF9LHNldDpmdW5jdGlvbihhKXt0aGlzLl9fc3RhdGUuYT1hfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShqLnByb3RvdHlwZSwiaGV4Iix7Z2V0OmZ1bmN0aW9uKCl7aWYoIXRoaXMuX19zdGF0ZS5zcGFjZSE9PSJIRVgiKXRoaXMuX19zdGF0ZS5oZXg9CmEucmdiX3RvX2hleCh0aGlzLnIsdGhpcy5nLHRoaXMuYik7cmV0dXJuIHRoaXMuX19zdGF0ZS5oZXh9LHNldDpmdW5jdGlvbihhKXt0aGlzLl9fc3RhdGUuc3BhY2U9IkhFWCI7dGhpcy5fX3N0YXRlLmhleD1hfX0pO3JldHVybiBqfShkYXQuY29sb3IuaW50ZXJwcmV0LGRhdC5jb2xvci5tYXRoPWZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJue2hzdl90b19yZ2I6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPWEvNjAtTWF0aC5mbG9vcihhLzYwKSxiPWQqKDEtYyksbj1kKigxLWUqYyksYz1kKigxLSgxLWUpKmMpLGE9W1tkLGMsYl0sW24sZCxiXSxbYixkLGNdLFtiLG4sZF0sW2MsYixkXSxbZCxiLG5dXVtNYXRoLmZsb29yKGEvNjApJTZdO3JldHVybntyOmFbMF0qMjU1LGc6YVsxXSoyNTUsYjphWzJdKjI1NX19LHJnYl90b19oc3Y6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPU1hdGgubWluKGEsYyxkKSxiPU1hdGgubWF4KGEsYyxkKSxlPWItZTtpZihiPT0wKXJldHVybntoOk5hTixzOjAsdjowfTsKYT1hPT1iPyhjLWQpL2U6Yz09Yj8yKyhkLWEpL2U6NCsoYS1jKS9lO2EvPTY7YTwwJiYoYSs9MSk7cmV0dXJue2g6YSozNjAsczplL2IsdjpiLzI1NX19LHJnYl90b19oZXg6ZnVuY3Rpb24oYSxjLGQpe2E9dGhpcy5oZXhfd2l0aF9jb21wb25lbnQoMCwyLGEpO2E9dGhpcy5oZXhfd2l0aF9jb21wb25lbnQoYSwxLGMpO3JldHVybiBhPXRoaXMuaGV4X3dpdGhfY29tcG9uZW50KGEsMCxkKX0sY29tcG9uZW50X2Zyb21faGV4OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGE+PmMqOCYyNTV9LGhleF93aXRoX2NvbXBvbmVudDpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIGQ8PChlPWMqOCl8YSZ+KDI1NTw8ZSl9fX0oKSxkYXQuY29sb3IudG9TdHJpbmcsZGF0LnV0aWxzLmNvbW1vbiksZGF0LmNvbG9yLmludGVycHJldCxkYXQudXRpbHMuY29tbW9uKSxkYXQudXRpbHMucmVxdWVzdEFuaW1hdGlvbkZyYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fAp3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cub1JlcXVlc3RBbmltYXRpb25GcmFtZXx8d2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lfHxmdW5jdGlvbihlKXt3aW5kb3cuc2V0VGltZW91dChlLDFFMy82MCl9fSgpLGRhdC5kb20uQ2VudGVyZWREaXY9ZnVuY3Rpb24oZSxhKXt2YXIgYz1mdW5jdGlvbigpe3RoaXMuYmFja2dyb3VuZEVsZW1lbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5leHRlbmQodGhpcy5iYWNrZ3JvdW5kRWxlbWVudC5zdHlsZSx7YmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDAuOCkiLHRvcDowLGxlZnQ6MCxkaXNwbGF5OiJub25lIix6SW5kZXg6IjEwMDAiLG9wYWNpdHk6MCxXZWJraXRUcmFuc2l0aW9uOiJvcGFjaXR5IDAuMnMgbGluZWFyIn0pO2UubWFrZUZ1bGxzY3JlZW4odGhpcy5iYWNrZ3JvdW5kRWxlbWVudCk7dGhpcy5iYWNrZ3JvdW5kRWxlbWVudC5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiO3RoaXMuZG9tRWxlbWVudD0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5leHRlbmQodGhpcy5kb21FbGVtZW50LnN0eWxlLHtwb3NpdGlvbjoiZml4ZWQiLGRpc3BsYXk6Im5vbmUiLHpJbmRleDoiMTAwMSIsb3BhY2l0eTowLFdlYmtpdFRyYW5zaXRpb246Ii13ZWJraXQtdHJhbnNmb3JtIDAuMnMgZWFzZS1vdXQsIG9wYWNpdHkgMC4ycyBsaW5lYXIifSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmJhY2tncm91bmRFbGVtZW50KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuZG9tRWxlbWVudCk7dmFyIGM9dGhpcztlLmJpbmQodGhpcy5iYWNrZ3JvdW5kRWxlbWVudCwiY2xpY2siLGZ1bmN0aW9uKCl7Yy5oaWRlKCl9KX07Yy5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbigpe3ZhciBjPXRoaXM7dGhpcy5iYWNrZ3JvdW5kRWxlbWVudC5zdHlsZS5kaXNwbGF5PSJibG9jayI7dGhpcy5kb21FbGVtZW50LnN0eWxlLmRpc3BsYXk9ImJsb2NrIjt0aGlzLmRvbUVsZW1lbnQuc3R5bGUub3BhY2l0eT0KMDt0aGlzLmRvbUVsZW1lbnQuc3R5bGUud2Via2l0VHJhbnNmb3JtPSJzY2FsZSgxLjEpIjt0aGlzLmxheW91dCgpO2EuZGVmZXIoZnVuY3Rpb24oKXtjLmJhY2tncm91bmRFbGVtZW50LnN0eWxlLm9wYWNpdHk9MTtjLmRvbUVsZW1lbnQuc3R5bGUub3BhY2l0eT0xO2MuZG9tRWxlbWVudC5zdHlsZS53ZWJraXRUcmFuc2Zvcm09InNjYWxlKDEpIn0pfTtjLnByb3RvdHlwZS5oaWRlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxjPWZ1bmN0aW9uKCl7YS5kb21FbGVtZW50LnN0eWxlLmRpc3BsYXk9Im5vbmUiO2EuYmFja2dyb3VuZEVsZW1lbnQuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS51bmJpbmQoYS5kb21FbGVtZW50LCJ3ZWJraXRUcmFuc2l0aW9uRW5kIixjKTtlLnVuYmluZChhLmRvbUVsZW1lbnQsInRyYW5zaXRpb25lbmQiLGMpO2UudW5iaW5kKGEuZG9tRWxlbWVudCwib1RyYW5zaXRpb25FbmQiLGMpfTtlLmJpbmQodGhpcy5kb21FbGVtZW50LCJ3ZWJraXRUcmFuc2l0aW9uRW5kIiwKYyk7ZS5iaW5kKHRoaXMuZG9tRWxlbWVudCwidHJhbnNpdGlvbmVuZCIsYyk7ZS5iaW5kKHRoaXMuZG9tRWxlbWVudCwib1RyYW5zaXRpb25FbmQiLGMpO3RoaXMuYmFja2dyb3VuZEVsZW1lbnQuc3R5bGUub3BhY2l0eT0wO3RoaXMuZG9tRWxlbWVudC5zdHlsZS5vcGFjaXR5PTA7dGhpcy5kb21FbGVtZW50LnN0eWxlLndlYmtpdFRyYW5zZm9ybT0ic2NhbGUoMS4xKSJ9O2MucHJvdG90eXBlLmxheW91dD1mdW5jdGlvbigpe3RoaXMuZG9tRWxlbWVudC5zdHlsZS5sZWZ0PXdpbmRvdy5pbm5lcldpZHRoLzItZS5nZXRXaWR0aCh0aGlzLmRvbUVsZW1lbnQpLzIrInB4Ijt0aGlzLmRvbUVsZW1lbnQuc3R5bGUudG9wPXdpbmRvdy5pbm5lckhlaWdodC8yLWUuZ2V0SGVpZ2h0KHRoaXMuZG9tRWxlbWVudCkvMisicHgifTtyZXR1cm4gY30oZGF0LmRvbS5kb20sZGF0LnV0aWxzLmNvbW1vbiksZGF0LmRvbS5kb20sZGF0LnV0aWxzLmNvbW1vbik7"></script>
<!--
<script name="script_css_init_js" sorc="data:/text/plain;basec64,dmFyIENTU1JlbG9hZD17aGVhZDpudWxsLGluaXQ6ZnVuY3Rpb24oKXt0aGlzLl9zdG9yZUhlYWQoKSx0aGlzLl9saXN0ZW5Ub1Bvc3RNZXNzYWdlcygpfSxfc3RvcmVIZWFkOmZ1bmN0aW9uKCl7dGhpcy5oZWFkPWRvY3VtZW50LmhlYWR8fGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF19LF9saXN0ZW5Ub1Bvc3RNZXNzYWdlczpmdW5jdGlvbigpe3ZhciBlPXRoaXM7d2luZG93W3RoaXMuX2V2ZW50TWV0aG9kKCldKHRoaXMuX21lc3NhZ2VFdmVudCgpLGZ1bmN0aW9uKHQpe3RyeXt2YXIgcz1KU09OLnBhcnNlKHQuZGF0YSk7InN0cmluZyI9PXR5cGVvZiBzLmNzcyYmZS5fcmVmcmVzaENTUyhzKX1jYXRjaChuKXt9fSwhMSl9LF9tZXNzYWdlRXZlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4iYXR0YWNoRXZlbnQiPT09dGhpcy5fZXZlbnRNZXRob2QoKT8ib25tZXNzYWdlIjoibWVzc2FnZSJ9LF9ldmVudE1ldGhvZDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcj8iYWRkRXZlbnRMaXN0ZW5lciI6ImF0dGFjaEV2ZW50In0sX3JlZnJlc2hDU1M6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fZmluZFByZXZDUFN0eWxlKCkscz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO3MudHlwZT0idGV4dC9jc3MiLHMuY2xhc3NOYW1lPSJjcC1wZW4tc3R5bGVzIixzLnN0eWxlU2hlZXQ/cy5zdHlsZVNoZWV0LmNzc1RleHQ9ZS5jc3M6cy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlLmNzcykpLHRoaXMuaGVhZC5hcHBlbmRDaGlsZChzKSx0JiZ0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCksInByZWZpeGZyZWUiPT09ZS5jc3NfcHJlZml4JiZTdHlsZUZpeC5wcm9jZXNzKCl9LF9maW5kUHJldkNQU3R5bGU6ZnVuY3Rpb24oKXtmb3IodmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInN0eWxlIiksdD1lLmxlbmd0aC0xO3Q+PTA7dC0tKWlmKCJjcC1wZW4tc3R5bGVzIj09PWVbdF0uY2xhc3NOYW1lKXJldHVybiBlW3RdO3JldHVybiExfX07Q1NTUmVsb2FkLmluaXQoKTs="></script>
	-->


	<script>
	// Wobbly Surface - mouse over for fun blobbiness!
	// As used on http://blog.neave.com
	// by Paul Neave
	// @neave

// requestAnimationFrame shim
		var i = 0,
		lastTime = 0,
		vendors = ['ms', 'moz', 'webkit', 'o'];

		while (i < vendors.length && !window.requestAnimationFrame) {
			window.requestAnimationFrame = window[vendors[i] + 'RequestAnimationFrame'];
			window.cancelAnimationFrame = window[vendors[i] + 'CancelAnimationFrame'] || window[vendors[i] + 'CancelRequestAnimationFrame'];
			i++;
			}

		if (!window.requestAnimationFrame) {
			window.requestAnimationFrame = function(callback, element) {
				var currTime = new Date().getTime(),
				timeToCall = Math.max(0, 1000 / 60 - currTime + lastTime),
				id = setTimeout(function() { callback(currTime + timeToCall); }, timeToCall);
    
				lastTime = currTime + timeToCall;
				return id;
				};
			}

		if (!window.cancelAnimationFrame) {
			window.cancelAnimationFrame = function(id) {
				clearTimeout(id);
				};
		}

//		color = '#f09';

		var mouseX = 0,
		mouseY = -100,
		mouseDist = 150,
		viscosity = 30,
		damping = 0.1,
		motion = 1,
		totalPoints = 20,
		updateID,
		points,
//		color = '#f01';
// white	color = '#fff';
		color = '#000';

var canvas = document.createElement('canvas');
document.body.appendChild(canvas);

var c = canvas.getContext('2d');

function Point(x, y) {
  this.x = x;
  this.ix = x;
  this.vx = 0;
  this.y = y;
  this.iy = y;
  this.vy = 0;
}

Point.prototype.move = function() {
  this.vx += (this.ix - this.x) / viscosity * canvas.width;
  this.vy += (this.iy - this.y) / viscosity * canvas.height;
  
  var dx = this.x * canvas.width - mouseX,
      dy = this.y * canvas.height - mouseY;
  
  if (Math.sqrt(dx * dx + dy * dy) < mouseDist) {
    var a = Math.atan2(dy, dx);
    this.vx += (Math.cos(a) * viscosity - dx) / viscosity;
    this.vy -= (Math.sin(a) * viscosity - dy) / viscosity;
  }
  
  this.vx *= (1 - damping);
  this.vy *= (1 - damping);
  this.x += this.vx / canvas.width;
  this.y += this.vy / canvas.height;
  
  if (this.y < 0) {
    this.y = 0;
  } else if (this.y > 1) {
    this.y = 1;
  }
};

function init() {
  var w = canvas.width = window.innerWidth;
  canvas.height = window.innerHeight;
  motion = 1;
  points = [];
  totalPoints = Math.max(Math.round(w / 50), 10);
  for (var i = totalPoints; i--; ) {
    points.push(new Point(i / (totalPoints - 3), 0.5));
  }
}


function update() {
  updateID = requestAnimationFrame(update);
  
  if (motion < 0.04) {
    return;
  }
  
  var p = points[totalPoints - 1],
      cx,
      cy;
  
  c.clearRect(0, 0, canvas.width, canvas.height);
  c.fillStyle = color;
  c.beginPath();
  c.moveTo(p.x * canvas.width, p.y * canvas.height);
  
  motion = 0;
  
  for (var i = totalPoints - 1; i > 0; i--) {
    p = points[i];
    
    p.move();
    
    motion += Math.abs(p.vx) + Math.abs(p.vy);
    
    cx = (p.x + points[i - 1].x) / 2 * canvas.width;
    cy = (p.y + points[i - 1].y) / 2 * canvas.height;
    
    if (i === 1) {
      cx = canvas.width;
    } else if (i === totalPoints - 1) {
      p.x = 0;
    }
    
    c.bezierCurveTo(p.x * canvas.width, p.y * canvas.height, cx, cy, cx, cy);
  }
  
  c.lineTo(canvas.width, canvas.height);
  c.lineTo(0, canvas.height);
  c.closePath();
  c.fill();
}

function wobble() {
  for (var i = totalPoints - 1; i > 0; i--) {
    points[i].vy += Math.random() * 100 - 50;
  }
}

window.onload = function() {
  var gui = new dat.GUI();
  gui.closed = true;
  gui.add(this, 'viscosity', 10, 50);
  gui.add(this, 'damping', 0, 0.2);
  gui.add(this, 'mouseDist', 10, 300);
  gui.add(this, 'wobble');
  gui.addColor(this, 'color');
  
  window.addEventListener('mousemove', function(event) {
    mouseX = event.pageX;
    mouseY = event.pageY;
    motion = 1;
  });
  
  canvas.addEventListener('mousedown', wobble);
  
  window.onresize = function(event) {
    cancelAnimationFrame(updateID);
    init();
    update()
  };
  
		init();
		wobble();
		update();

		};

//@ sourceURL=pen.js
	</script>

NEAVE_WB;
	return($neave_wb);
	} 


function html_neave_pi() {
	$neave_pi=<<<NEAVE_PI

<!-- <script src="neave_pixel-dust.2.js"></script> -->
<!-- <script src="neave_imagination.4.js"></script> -->

<script name="neave_pixeldust2_js" src="data:/text/plain;base64,KGZ1bmN0aW9uKCl7d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fGZ1bmN0aW9uKGNhbGxiYWNrKXtzZXRUaW1lb3V0KGNhbGxiYWNrLDEwMDAvNjApO307ZnVuY3Rpb24gRmx1aWRGaWVsZCgpe3ZhciBpdGVyYXRpb25zPTQsZHQ9MC4wNSxkYW1wPTAuOTksZGVucyxkZW5zX3ByZXYsdSx1X3ByZXYsdix2X3ByZXYsd2lkdGgsaGVpZ2h0LHJvd1NpemUsc2l6ZTtmdW5jdGlvbiBGaWVsZChkZW5zLHUsdil7dGhpcy5nZXREZW5zaXR5PWZ1bmN0aW9uKHgseSl7cmV0dXJuIGRlbnNbKHgrMSkrKHkrMSkqcm93U2l6ZV07fTt0aGlzLnNldERlbnNpdHk9ZnVuY3Rpb24oeCx5LGQpe2RlbnNbKHgrMSkrKHkrMSkqcm93U2l6ZV09ZDt9O3RoaXMuc2V0VmVsb2NpdHk9ZnVuY3Rpb24oeCx5LHh2LHl2KXt1Wyh4KzEpKyh5KzEpKnJvd1NpemVdPXh2O3ZbKHgrMSkrKHkrMSkqcm93U2l6ZV09eXY7fTt9CmZ1bmN0aW9uIGFkZEZpZWxkcyh4LHMpe2Zvcih2YXIgaT1zaXplO2ktLTspeFtpXSs9c1tpXSpkdDt9CmZ1bmN0aW9uIHNldEJvdW5kYXJ5KGIseCl7aWYoYj09PTEpe2Zvcih2YXIgaT0xO2k8PXdpZHRoO2krKyl7eFtpXT14W2krcm93U2l6ZV07eFtpKyhoZWlnaHQrMSkqcm93U2l6ZV09eFtpK2hlaWdodCpyb3dTaXplXTt9CmZvcih2YXIgaj0xO2k8PWhlaWdodDtpKyspe3hbaipyb3dTaXplXT0teFsxK2oqcm93U2l6ZV07eFsod2lkdGgrMSkraipyb3dTaXplXT0teFt3aWR0aCtqKnJvd1NpemVdO319ZWxzZSBpZihiPT09Mil7Zm9yKHZhciBpPTE7aTw9d2lkdGg7aSsrKXt4W2ldPS14W2krcm93U2l6ZV07eFtpKyhoZWlnaHQrMSkqcm93U2l6ZV09LXhbaStoZWlnaHQqcm93U2l6ZV07fQpmb3IodmFyIGo9MTtqPD1oZWlnaHQ7aisrKXt4W2oqcm93U2l6ZV09eFsxK2oqcm93U2l6ZV07eFsod2lkdGgrMSkraipyb3dTaXplXT14W3dpZHRoK2oqcm93U2l6ZV07fX1lbHNle2Zvcih2YXIgaT0xO2k8PXdpZHRoO2krKyl7eFtpXT14W2krcm93U2l6ZV07eFtpKyhoZWlnaHQrMSkqcm93U2l6ZV09eFtpK2hlaWdodCpyb3dTaXplXTt9CmZvcih2YXIgaj0xO2o8PWhlaWdodDtqKyspe3hbaipyb3dTaXplXT14WzEraipyb3dTaXplXTt4Wyh3aWR0aCsxKStqKnJvd1NpemVdPXhbd2lkdGgraipyb3dTaXplXTt9fQp2YXIgbWF4RWRnZT0oaGVpZ2h0KzEpKnJvd1NpemU7eFswXT0wLjUqKHhbMV0reFtyb3dTaXplXSk7eFttYXhFZGdlXT0wLjUqKHhbMSttYXhFZGdlXSt4W2hlaWdodCpyb3dTaXplXSk7eFsod2lkdGgrMSldPTAuNSooeFt3aWR0aF0reFsod2lkdGgrMSkrcm93U2l6ZV0pO3hbKHdpZHRoKzEpK21heEVkZ2VdPTAuNSooeFt3aWR0aCttYXhFZGdlXSt4Wyh3aWR0aCsxKStoZWlnaHQqcm93U2l6ZV0pO30KZnVuY3Rpb24gZGlmZnVzZShiLHgseDApe3ZhciBhPTA7c29sdmVMaW5lYXIoYix4LHgwLGEsMSs0KmEpO30KZnVuY3Rpb24gZGlmZnVzZTIoeCx4MCx5LHkwKXt2YXIgYT0wO3NvbHZlTGluZWFyMih4LHgwLHkseTAsYSw0KmErMSk7fQpmdW5jdGlvbiBzb2x2ZUxpbmVhcihiLHgseDAsYSxjKXtpZihhPT09MCYmYz09PTEpe2Zvcih2YXIgaj0xO2o8PWhlaWdodDtqKyspe3ZhciBjdXJyZW50Um93PWoqcm93U2l6ZTtjdXJyZW50Um93Kys7Zm9yKHZhciBpPTA7aTx3aWR0aDtpKyspe3hbY3VycmVudFJvd109eDBbY3VycmVudFJvd107Y3VycmVudFJvdysrO319CnNldEJvdW5kYXJ5KGIseCk7fQplbHNle3ZhciBpbnZDPTEvYztmb3IodmFyIGs9MDtrPGl0ZXJhdGlvbnM7aysrKXtmb3IodmFyIGo9MTtqPD1oZWlnaHQ7aisrKXt2YXIgbGFzdFJvdz0oai0xKSpyb3dTaXplO3ZhciBjdXJyZW50Um93PWoqcm93U2l6ZTt2YXIgbmV4dFJvdz0oaisxKSpyb3dTaXplO3ZhciBsYXN0WD14W2N1cnJlbnRSb3ddO2N1cnJlbnRSb3crKztmb3IodmFyIGk9MTtpPD13aWR0aDtpKyspe2xhc3RYPXhbY3VycmVudFJvd109KHgwW2N1cnJlbnRSb3ddK2EqKGxhc3RYK3hbKytjdXJyZW50Um93XSt4WysrbGFzdFJvd10reFsrK25leHRSb3ddKSkqaW52Qzt9fQpzZXRCb3VuZGFyeShiLHgpO319fQpmdW5jdGlvbiBzb2x2ZUxpbmVhcjIoeCx4MCx5LHkwLGEsYyl7aWYoYT09PTAmJmM9PT0xKXtmb3IodmFyIGo9MTtqPD1oZWlnaHQ7aisrKXt2YXIgY3VycmVudFJvdz1qKnJvd1NpemU7Y3VycmVudFJvdysrO2Zvcih2YXIgaT0wO2k8d2lkdGg7aSsrKXt4W2N1cnJlbnRSb3ddPXgwW2N1cnJlbnRSb3ddO3lbY3VycmVudFJvd109eTBbY3VycmVudFJvd107Y3VycmVudFJvdysrO319CnNldEJvdW5kYXJ5KDEseCk7c2V0Qm91bmRhcnkoMix5KTt9CmVsc2V7dmFyIGludkM9MS9jO2Zvcih2YXIgaz0wO2s8aXRlcmF0aW9ucztrKyspe2Zvcih2YXIgaj0xO2o8PWhlaWdodDtqKyspe3ZhciBsYXN0Um93PShqLTEpKnJvd1NpemU7dmFyIGN1cnJlbnRSb3c9aipyb3dTaXplO3ZhciBuZXh0Um93PShqKzEpKnJvd1NpemU7dmFyIGxhc3RYPXhbY3VycmVudFJvd107dmFyIGxhc3RZPXlbY3VycmVudFJvd107Y3VycmVudFJvdysrO2Zvcih2YXIgaT0xO2k8PXdpZHRoO2krKyl7bGFzdFg9eFtjdXJyZW50Um93XT0oeDBbY3VycmVudFJvd10rYSoobGFzdFgreFtjdXJyZW50Um93XSt4W2xhc3RSb3ddK3hbbmV4dFJvd10pKSppbnZDO2xhc3RZPXlbY3VycmVudFJvd109KHkwW2N1cnJlbnRSb3ddK2EqKGxhc3RZK3lbKytjdXJyZW50Um93XSt5WysrbGFzdFJvd10reVsrK25leHRSb3ddKSkqaW52Qzt9fQpzZXRCb3VuZGFyeSgxLHgpO3NldEJvdW5kYXJ5KDIseSk7fX19CmZ1bmN0aW9uIGFkdmVjdChiLGQsZDAsdSx2KXt2YXIgd2R0MD13aWR0aCpkdCxoZHQwPWhlaWdodCpkdCx3cDU9d2lkdGgrMC41LGhwNT1oZWlnaHQrMC41O2Zvcih2YXIgaj0xO2o8PWhlaWdodDtqKyspe3ZhciBwb3M9aipyb3dTaXplO2Zvcih2YXIgaT0xO2k8PXdpZHRoO2krKyl7dmFyIHg9aS13ZHQwKnVbKytwb3NdLHk9ai1oZHQwKnZbcG9zXTtpZih4PDAuNSl4PTAuNTtlbHNlIGlmKHg+d3A1KXg9d3A1O3ZhciBpMD14fDAsaTE9aTArMTtpZih5PDAuNSl5PTAuNTtlbHNlIGlmKHk+aHA1KXk9aHA1O3ZhciBqMD15fDAsajE9ajArMSxzMT14LWkwLHMwPTEtczEsdDE9eS1qMCx0MD0xLXQxLHJvdzE9ajAqcm93U2l6ZSxyb3cyPWoxKnJvd1NpemU7ZFtwb3NdPXMwKih0MCpkMFtpMCtyb3cxXSt0MSpkMFtpMCtyb3cyXSkrczEqKHQwKmQwW2kxK3JvdzFdK3QxKmQwW2kxK3JvdzJdKTt9fQpzZXRCb3VuZGFyeShiLGQpO30KZnVuY3Rpb24gcHJvamVjdCh1LHYscCxkaXYpe3ZhciBoPS0wLjUvTWF0aC5zcXJ0KHdpZHRoKmhlaWdodCk7Zm9yKHZhciBqPTE7ajw9aGVpZ2h0O2orKyl7dmFyIHJvdz1qKnJvd1NpemUscHJldlJvdz0oai0xKSpyb3dTaXplLHByZXZWYWx1ZT1yb3ctMSxjdXJyZW50Um93PXJvdyxuZXh0VmFsdWU9cm93KzEsbmV4dFJvdz0oaisxKSpyb3dTaXplO2Zvcih2YXIgaT0xO2k8PXdpZHRoO2krKyl7ZGl2WysrY3VycmVudFJvd109aCoodVsrK25leHRWYWx1ZV0tdVsrK3ByZXZWYWx1ZV0rdlsrK25leHRSb3ddLXZbKytwcmV2Um93XSk7cFtjdXJyZW50Um93XT0wO319CnNldEJvdW5kYXJ5KDAsZGl2KTtzZXRCb3VuZGFyeSgwLHApO3NvbHZlTGluZWFyKDAscCxkaXYsMSw0KTt2YXIgd1NjYWxlPTAuNSp3aWR0aCxoU2NhbGU9MC41KmhlaWdodDtmb3IodmFyIGo9MTtqPD1oZWlnaHQ7aisrKXt2YXIgcHJldlBvcz1qKnJvd1NpemUtMSxjdXJyZW50UG9zPWoqcm93U2l6ZSxuZXh0UG9zPWoqcm93U2l6ZSsxLHByZXZSb3c9KGotMSkqcm93U2l6ZSxjdXJyZW50Um93PWoqcm93U2l6ZSxuZXh0Um93PShqKzEpKnJvd1NpemU7Zm9yKHZhciBpPTE7aTw9d2lkdGg7aSsrKXt1WysrY3VycmVudFBvc10tPXdTY2FsZSoocFsrK25leHRQb3NdLXBbKytwcmV2UG9zXSk7dltjdXJyZW50UG9zXS09aFNjYWxlKihwWysrbmV4dFJvd10tcFsrK3ByZXZSb3ddKTt9fQpzZXRCb3VuZGFyeSgxLHUpO3NldEJvdW5kYXJ5KDIsdik7fQpmdW5jdGlvbiBkZW5zaXR5U3RlcCh4LHgwLHUsdil7YWRkRmllbGRzKHgseDApO2RpZmZ1c2UoMCx4MCx4KTthZHZlY3QoMCx4LHgwLHUsdik7fQpmdW5jdGlvbiB2ZWxvY2l0eVN0ZXAodSx2LHUwLHYwKXthZGRGaWVsZHModSx1MCk7YWRkRmllbGRzKHYsdjApO3ZhciB0ZW1wPXUwO3UwPXU7dT10ZW1wO3RlbXA9djA7djA9djt2PXRlbXA7ZGlmZnVzZTIodSx1MCx2LHYwKTtwcm9qZWN0KHUsdix1MCx2MCk7dGVtcD11MDt1MD11O3U9dGVtcDt0ZW1wPXYwO3YwPXY7dj10ZW1wO2FkdmVjdCgxLHUsdTAsdTAsdjApO2FkdmVjdCgyLHYsdjAsdTAsdjApO3Byb2plY3QodSx2LHUwLHYwKTt9CnRoaXMudXBkYXRlPWZ1bmN0aW9uKCl7Zm9yKHZhciBpPXNpemU7aS0tOyl7dV9wcmV2W2ldPXZfcHJldltpXT1kZW5zX3ByZXZbaV09MDtkZW5zW2ldKj1kYW1wO30KdXBkYXRlRnJhbWUobmV3IEZpZWxkKGRlbnNfcHJldix1X3ByZXYsdl9wcmV2KSk7dmVsb2NpdHlTdGVwKHUsdix1X3ByZXYsdl9wcmV2KTtkZW5zaXR5U3RlcChkZW5zLGRlbnNfcHJldix1LHYpO2RyYXdGcmFtZShuZXcgRmllbGQoZGVucyx1LHYpKTt9O3RoaXMucmVzZXQ9ZnVuY3Rpb24oKXtyb3dTaXplPXdpZHRoKzI7c2l6ZT0od2lkdGgrMikqKGhlaWdodCsyKTtkZW5zPW5ldyBBcnJheShzaXplKTtkZW5zX3ByZXY9bmV3IEFycmF5KHNpemUpO3U9bmV3IEFycmF5KHNpemUpO3VfcHJldj1uZXcgQXJyYXkoc2l6ZSk7dj1uZXcgQXJyYXkoc2l6ZSk7dl9wcmV2PW5ldyBBcnJheShzaXplKTtmb3IodmFyIGk9c2l6ZTtpLS07KXtkZW5zX3ByZXZbaV09dV9wcmV2W2ldPXZfcHJldltpXT1kZW5zW2ldPXVbaV09dltpXT0wO319O3RoaXMuc2V0UmVzb2x1dGlvbj1mdW5jdGlvbih3LGgpe3dpZHRoPXc7aGVpZ2h0PWg7dGhpcy5yZXNldCgpO307fQp2YXIgZ2V0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IuYmluZChkb2N1bWVudCksb249ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lci5iaW5kKGRvY3VtZW50KSxjYW52YXMsY29udGV4dCxzY2FsZSxkaXNwbGF5V2lkdGgsZGlzcGxheUhlaWdodCxmaWVsZFNpemU9NCxmaWVsZFdpZHRoLGZpZWxkSGVpZ2h0LG9teD0wLG9teT0wLG14PTAsbXk9MCxkZW5zaXR5PTIwMCxkcmF3aW5nPWZhbHNlLGJ1ZmZlcixidWZmZXJEYXRhLGZsdWlkO2Z1bmN0aW9uIGluaXRCdWZmZXIoKXt9CmZ1bmN0aW9uIHVwZGF0ZUZyYW1lKGZpZWxkKXtpZihkcmF3aW5nKXt2YXIgZHg9bXgtb214LGR5PW15LW9teSxsZW5ndGg9KE1hdGguc3FydChkeCpkeCtkeSpkeSkrMC41KXwwO2lmKGxlbmd0aDwxKWxlbmd0aD0xO2Zvcih2YXIgaT1sZW5ndGg7aS0tOyl7dmFyIHg9KChvbXgrZHgqaS9sZW5ndGgpL2Rpc3BsYXlXaWR0aCpmaWVsZFdpZHRoKXwwLHk9KChvbXkrZHkqaS9sZW5ndGgpL2Rpc3BsYXlIZWlnaHQqZmllbGRIZWlnaHQpfDA7ZmllbGQuc2V0VmVsb2NpdHkoeCx5LGR4LGR5KTtmaWVsZC5zZXREZW5zaXR5KHgseSxkZW5zaXR5KTt9Cm9teD1teDtvbXk9bXk7fX0KZnVuY3Rpb24gZHJhd0ZyYW1lKGZpZWxkKXtmb3IodmFyIHg9ZmllbGRXaWR0aDt4LS07KXtmb3IodmFyIHk9ZmllbGRIZWlnaHQ7eS0tOyl7YnVmZmVyRGF0YVsoeSpmaWVsZFdpZHRoK3gpKjQrTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjMpXT1maWVsZC5nZXREZW5zaXR5KHgseSkqMHhmZjt9fQpjb250ZXh0LnB1dEltYWdlRGF0YShidWZmZXIsMCwwKTt9CmZ1bmN0aW9uIHVwZGF0ZUZsdWlkKCl7dXBkYXRlSUQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHVwZGF0ZUZsdWlkKTtmbHVpZC51cGRhdGUoKTt9CmZ1bmN0aW9uIGdldE5vcm1IZWlnaHQoKXtyZXR1cm4gaW5uZXJIZWlnaHQvZmllbGRIZWlnaHQvZmllbGRTaXplO30KZnVuY3Rpb24gZ2V0Tm9ybVdpZHRoKCl7cmV0dXJuIGlubmVyV2lkdGgvZmllbGRXaWR0aC9maWVsZFNpemU7fQpmdW5jdGlvbiBzZXRTaXplKCl7ZGlzcGxheVdpZHRoPU1hdGgucm91bmQoaW5uZXJXaWR0aCk7ZGlzcGxheUhlaWdodD1NYXRoLnJvdW5kKGlubmVySGVpZ2h0KTtvbXg9ZGlzcGxheVdpZHRoLzI7b215PWRpc3BsYXlIZWlnaHQvMjtteD1vbXgrKE1hdGgucmFuZG9tKCktMC41KSo0O215PW9teSsoTWF0aC5yYW5kb20oKS0wLjUpKjQ7ZmllbGRXaWR0aD1NYXRoLnJvdW5kKGRpc3BsYXlXaWR0aC9maWVsZFNpemUpO2ZpZWxkSGVpZ2h0PU1hdGgucm91bmQoZGlzcGxheUhlaWdodC9maWVsZFNpemUpO2NhbnZhcy53aWR0aD1maWVsZFdpZHRoO2NhbnZhcy5oZWlnaHQ9ZmllbGRIZWlnaHQ7fQpmdW5jdGlvbiBpbml0KCl7Y2FudmFzPWdldCgnY2FudmFzJyk7dHJ5e2NvbnRleHQ9Y2FudmFzLmdldENvbnRleHQoJzJkJyk7fWNhdGNoKGUpe2dldCgnLmFsdCcpLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJztyZXR1cm47fQpzZXRTaXplKCk7dmFyIGJ1ZmZlckNhbnZhcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtidWZmZXJDYW52YXMud2lkdGg9ZmllbGRXaWR0aDtidWZmZXJDYW52YXMuaGVpZ2h0PWZpZWxkSGVpZ2h0O3RyeXtidWZmZXI9YnVmZmVyQ2FudmFzLmdldENvbnRleHQoJzJkJykuY3JlYXRlSW1hZ2VEYXRhKGZpZWxkV2lkdGgsZmllbGRIZWlnaHQpO2J1ZmZlckRhdGE9YnVmZmVyLmRhdGE7dmFyIHNpemU9ZmllbGRXaWR0aCpmaWVsZEhlaWdodCo0O2Zvcih2YXIgaT0zO2k8c2l6ZTtpKz00KXtidWZmZXJEYXRhW2ldPTB4ZmY7fX1jYXRjaChlKXtnZXQoJy5hbHQnKS5zdHlsZS5kaXNwbGF5PSdibG9jayc7cmV0dXJuO30KY2FudmFzLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJztpZihnZXQoJ2JvZHkubW9iaWxlJykpe2NhbnZhcy5vbnRvdWNoc3RhcnQ9ZnVuY3Rpb24oZXZlbnQpe2RyYXdpbmc9dHJ1ZTtvbXg9bXg9ZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WC9nZXROb3JtV2lkdGgoKTtvbXk9bXk9ZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WS9nZXROb3JtSGVpZ2h0KCk7ZXZlbnQucHJldmVudERlZmF1bHQoKTt9O2NhbnZhcy5vbnRvdWNobW92ZT1mdW5jdGlvbihldmVudCl7bXg9ZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WC9nZXROb3JtV2lkdGgoKTtteT1ldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZL2dldE5vcm1IZWlnaHQoKTt9O2NhbnZhcy5vbnRvdWNoZW5kPWZ1bmN0aW9uKCl7ZHJhd2luZz1mYWxzZTt9O31lbHNle2NhbnZhcy5vbm1vdXNlbW92ZT1mdW5jdGlvbihldmVudCl7bXg9ZXZlbnQuY2xpZW50WC9nZXROb3JtV2lkdGgoKTtteT1ldmVudC5jbGllbnRZL2dldE5vcm1IZWlnaHQoKTt9O30KZmx1aWQ9bmV3IEZsdWlkRmllbGQoKTtmbHVpZC5zZXRSZXNvbHV0aW9uKGNhbnZhcy53aWR0aCxjYW52YXMuaGVpZ2h0KTtkcmF3aW5nPXRydWU7dXBkYXRlRmx1aWQoKTt9Cm9uKCdET01Db250ZW50TG9hZGVkJyxpbml0KTt9KCkpOw==" ></script>


<!--
<script name="neave_imagination4_js" src="data:/text/plain,base64,KGZ1bmN0aW9uKCl7d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fGZ1bmN0aW9uKGNhbGxiYWNrKXtzZXRUaW1lb3V0KGNhbGxiYWNrLDEwMDAvNjApO307dmFyIGdldD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yLmJpbmQoZG9jdW1lbnQpLG9uPWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIuYmluZChkb2N1bWVudCksY29udGV4dCxjYW52YXMsbW91c2VYLG1vdXNlWSxweCxweSxwb2ludHM9W10sc2l6ZT0wLHJlZD0wLGdyZWVuPTI1NSxibHVlPTI1NSxzcHJlYWQsTUFYX1NQUkVBRD0zLFNQRUVEX1g9MC4xNSxTUEVFRF9ZPTAuMTUsTUFYX0xFTkdUSD0xMjAsUkVEX1NURVA9MC4wMixHUkVFTl9TVEVQPTAuMDE1LEJMVUVfU1RFUD0wLjAyNTtmdW5jdGlvbiBQb2ludCh4LHksZHgsZHksc2l6ZSxjb2xvcil7dGhpcy54PXg7dGhpcy55PXk7dGhpcy5keD1keDt0aGlzLmR5PWR5O3RoaXMuc2l6ZT1zaXplO3RoaXMuY29sb3I9Y29sb3I7fQpQb2ludC5wcm90b3R5cGUuc3ByZWFkPWZ1bmN0aW9uKCl7dGhpcy54Kz10aGlzLmR4O3RoaXMueSs9dGhpcy5keTt9O2Z1bmN0aW9uIGRyYXdMaW5lcygpe3ZhciBwMCxwMSxwMix0b3RhbD1wb2ludHMubGVuZ3RoO2Zvcih2YXIgaT10b3RhbC0xO2k+MTtpLS0pe3AwPXBvaW50c1tpXTtwMT1wb2ludHNbaS0xXTtwMj1wb2ludHNbaS0yXTtjb250ZXh0LmJlZ2luUGF0aCgpO2NvbnRleHQuc3Ryb2tlU3R5bGU9cDAuY29sb3I7Y29udGV4dC5saW5lV2lkdGg9cDAuc2l6ZTtjb250ZXh0Lmdsb2JhbEFscGhhPWkvdG90YWw7Y29udGV4dC5tb3ZlVG8oKHAxLngrcDAueCkvMiwocDEueStwMC55KS8yKTtjb250ZXh0LnF1YWRyYXRpY0N1cnZlVG8ocDEueCxwMS55LChwMS54K3AyLngpLzIsKHAxLnkrcDIueSkvMik7Y29udGV4dC5zdHJva2UoKTtwMC5zcHJlYWQoKTt9CnBvaW50c1swXS5zcHJlYWQoKTtwb2ludHNbdG90YWwtMV0uc3ByZWFkKCk7fQpmdW5jdGlvbiBkcmF3KCl7dmFyIGR4PShtb3VzZVgtcHgpKlNQRUVEX1gsZHk9KG1vdXNlWS1weSkqU1BFRURfWTtpZihkeDwtc3ByZWFkKXtkeD0tc3ByZWFkO31lbHNlIGlmKGR4PnNwcmVhZCl7ZHg9c3ByZWFkO30KaWYoZHk8LXNwcmVhZCl7ZHk9LXNwcmVhZDt9ZWxzZSBpZihkeT5zcHJlYWQpe2R5PXNwcmVhZDt9CnB4PW1vdXNlWDtweT1tb3VzZVk7cG9pbnRzLnB1c2gobmV3IFBvaW50KHB4LHB5LGR4LGR5LE1hdGguYWJzKE1hdGguc2luKHNpemUrPTAuMTI1KSoxMCkrMSwncmdiKCcrCihNYXRoLmZsb29yKE1hdGguc2luKHJlZCs9UkVEX1NURVApKjEyOCsxMjgpKSsnLCcrCihNYXRoLmZsb29yKE1hdGguc2luKGdyZWVuKz1HUkVFTl9TVEVQKSoxMjgrMTI4KSkrJywnKwooTWF0aC5mbG9vcihNYXRoLnNpbihibHVlKz1CTFVFX1NURVApKjEyOCsxMjgpKSsnKScpKTtpZihwb2ludHMubGVuZ3RoPk1BWF9MRU5HVEgpcG9pbnRzLnNoaWZ0KCk7Y29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249J3NvdXJjZS1vdmVyJztjb250ZXh0Lmdsb2JhbEFscGhhPTE7Y29udGV4dC5maWxsU3R5bGU9J3JnYmEoMCwgMCwgMCwgMC4wNSknO2NvbnRleHQuZmlsbFJlY3QoMCwwLGNhbnZhcy53aWR0aCxjYW52YXMuaGVpZ2h0KTtjb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0nbGlnaHRlcic7ZHJhd0xpbmVzKCk7ZHJhd0xpbmVzKCk7ZHJhd0xpbmVzKCk7fQpmdW5jdGlvbiB1cGRhdGUoKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUodXBkYXRlKTtkcmF3KCk7fQpmdW5jdGlvbiByZXNpemUoKXtjYW52YXMud2lkdGg9aW5uZXJXaWR0aDtjYW52YXMuaGVpZ2h0PWlubmVySGVpZ2h0O30KZnVuY3Rpb24gaW5pdCgpe2NhbnZhcz1nZXQoJ2NhbnZhcycpO3RyeXtjb250ZXh0PWNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO31jYXRjaChlKXtnZXQoJy5hbHQnKS5zdHlsZS5kaXNwbGF5PSdibG9jayc7cmV0dXJuO30KY2FudmFzLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJztjYW52YXMub25tb3VzZW1vdmU9ZnVuY3Rpb24oZXZlbnQpe21vdXNlWD1ldmVudC5wYWdlWDttb3VzZVk9ZXZlbnQucGFnZVk7fTtkb2N1bWVudC5vbm1vdXNlZW50ZXI9ZnVuY3Rpb24oZXZlbnQpe21vdXNlWD1ldmVudC5wYWdlWDttb3VzZVk9ZXZlbnQucGFnZVk7Zm9yKHZhciBpPXBvaW50cy5sZW5ndGg7aS0tOyl7cG9pbnRzW2ldLng9bW91c2VYO3BvaW50c1tpXS55PW1vdXNlWTt9fTtjYW52YXMub250b3VjaG1vdmU9ZnVuY3Rpb24oZXZlbnQpe21vdXNlWD1ldmVudC50YXJnZXRUb3VjaGVzWzBdLnBhZ2VYO21vdXNlWT1ldmVudC50YXJnZXRUb3VjaGVzWzBdLnBhZ2VZO3NwcmVhZD0xO307Y2FudmFzLm9udG91Y2hzdGFydD1mdW5jdGlvbihldmVudCl7c3ByZWFkPTA7bW91c2VYPWV2ZW50LnRhcmdldFRvdWNoZXNbMF0ucGFnZVg7bW91c2VZPWV2ZW50LnRhcmdldFRvdWNoZXNbMF0ucGFnZVk7Zm9yKHZhciBpPXBvaW50cy5sZW5ndGg7aS0tOyl7cG9pbnRzW2ldLng9bW91c2VYO3BvaW50c1tpXS55PW1vdXNlWTt9CmlmKCFldmVudC50YXJnZXQuaHJlZil7ZXZlbnQucHJldmVudERlZmF1bHQoKTt9fTt3aW5kb3cub25yZXNpemU9cmVzaXplO3Jlc2l6ZSgpO21vdXNlWD1jYW52YXMud2lkdGgvMjttb3VzZVk9Y2FudmFzLmhlaWdodC8yO3VwZGF0ZSgpO30Kb24oJ0RPTUNvbnRlbnRMb2FkZWQnLGluaXQpO30oKSk7"></script>
	-->

<!-- <a class="neave" href="https://neave.com"><img src="./imgs/btn/koeye.png</a> -->
<a name="neave" href="https://neave.com" target=_blank><img src="./imgs/btn/koeye.png</a>


<~-- <canvas width=392 height=221 style='display: block;"></canvas> -->
<!-- <canvas width=800 height=600 style='display: block;"></canvas> -->
<canvas width=800 height=600 "></canvas> -->
NEAVE_PI;
	return( $neave_pi );
	} 


function html_h5() {} 
function html_h5_file() {
	$h5_file=<<<H5_FILE

	<div id="div_files" >
		<output id="zonelist"></output>
		<div id="dropzone">
			dropzone
			<div id="div_canvas" style="position:relative; width:400px; height:200px background:white">
				<canvas id="canvas_dropzone" style="z-index: 1;
					position:absolute;
					left:0px;
					top:0px;
					" height="100px" width="200" background-color="white" color="white">
					WARN_1387 unauthorized access has been logged
					</canvas>
			</div>

		<script name="script_fileselect">
			function handleFileSelect(evt) {
				evt.stopPropagation();
				evt.preventDefault();

				var files = evt.dataTransfer.files; // FileList object.

// files is a FileList of File objects. List some properties.
    var output = [];
    for (var i = 0, f; f = files[i]; i++) {
      output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
                  f.size, ' bytes, last modified: ',
                  f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
                  '</li>');
    }
    document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
  }

  function handleDragOver(evt) {
    evt.stopPropagation();
    evt.preventDefault();
    evt.dataTransfer.dropEffect = 'copy'; // Explicitly show this is a copy.
  }

  // Setup the dnd listeners.
  var dropZone = document.getElementById('dropzone');
  dropZone.addEventListener('dragover', handleDragOver, false);
  dropZone.addEventListener('drop', handleFileSelect, false);
</script>

<hr><hr><hr>
<style>
  .thumb {
    height: 75px;
    border: 1px solid #000;
    margin: 10px 5px 0 0;
  }
</style>


	<label class="fileContainer">
		files
		<input id="files" name="files[]" multiple="" type="file">
		</label>


<output id="zonelist"></output>

<script>
  function handleFileSelect(evt) {
    var files = evt.target.files; // FileList object

    // files is a FileList of File objects. List some properties.
    var output = [];
    for (var i = 0, f; f = files[i]; i++) {
      output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
                  f.size, ' bytes, last modified: ',
                  f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
                  '</li>');
    }
    document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
  }

	  document.getElementById('files').addEventListener('change', handleFileSelect, false);
	</script>
H5_FILE;
	return( $h5_file );
	} 
function html_h5_files() {
	$h5_files=<<<H5_FILES

	<div id="div_files" >
		<output id="zonelist"></output>
		<div id="dropzone">
			dropzone
			<div id="div_canvas" style="position:relative; width:400px; height:200px background:white">
				<canvas id="canvas_dropzone" style="z-index: 1;
					position:absolute;
					left:0px;
					top:0px;
					" height="100px" width="200" background-color="white" color="white">
					WARN_1387 unauthorized access has been logged
					</canvas>
			</div>

		<script name="script_fileselect">
			function handleFileSelect(evt) {
				evt.stopPropagation();
				evt.preventDefault();

				var files = evt.dataTransfer.files; // FileList object.

// files is a FileList of File objects. List some properties.
    var output = [];
    for (var i = 0, f; f = files[i]; i++) {
      output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
                  f.size, ' bytes, last modified: ',
                  f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
                  '</li>');
    }
    document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
  }

  function handleDragOver(evt) {
    evt.stopPropagation();
    evt.preventDefault();
    evt.dataTransfer.dropEffect = 'copy'; // Explicitly show this is a copy.
  }

  // Setup the dnd listeners.
  var dropZone = document.getElementById('dropzone');
  dropZone.addEventListener('dragover', handleDragOver, false);
  dropZone.addEventListener('drop', handleFileSelect, false);
</script>

<hr><hr><hr>
<style>
  .thumb {
    height: 75px;
    border: 1px solid #000;
    margin: 10px 5px 0 0;
  }
</style>


	<label class="fileContainer">
		files
		<input id="files" name="files[]" multiple="" type="file">
		</label>


<output id="zonelist"></output>

<script>
  function handleFileSelect(evt) {
    var files = evt.target.files; // FileList object

    // files is a FileList of File objects. List some properties.
    var output = [];
    for (var i = 0, f; f = files[i]; i++) {
      output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
                  f.size, ' bytes, last modified: ',
                  f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
                  '</li>');
    }
    document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
  }

	  document.getElementById('files').addEventListener('change', handleFileSelect, false);
	</script>
H5_FILES;
	return( $h5_files );
	} 


function html_h5_csv() {
	$h5_csv=<<<H5_CSV

<output id="zonelist"></output>

<script>
  function handleFileSelect(evt) {
    var files = evt.target.files; // FileList object

    // files is a FileList of File objects. List some properties.
    var output = [];
    for (var i = 0, f; f = files[i]; i++) {
      output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
                  f.size, ' bytes, last modified: ',
                  f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
                  '</li>');
    }
    document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
  }

	  document.getElementById('files').addEventListener('change', handleFileSelect, false);
	</script>

	<div id="div_files2" hidden >
		<label class="fileContainer">
			files2
			<input id="files" name="files[]" multiple="" type="file">
			</label>
		<output id="zonelist"></output>
		</div>

<script>
  function handleFileSelect(evt) {
    var files = evt.target.files; // FileList object

    // Loop through the FileList and render image files as thumbnails.
    for (var i = 0, f; f = files[i]; i++) {

// Only process image files.
	if (!f.type.match('image.*')) { continue; }

      var reader = new FileReader();

      // Closure to capture the file information.
      reader.onload = (function(theFile) {
        return function(e) {
          // Render thumbnail.
          var span = document.createElement('span');
          span.innerHTML = ['<img class="thumb" src="', e.target.result,
                            '" title="', escape(theFile.name), '"/>'].join('');
          document.getElementById('zonelist').insertBefore(span, null);
        };
      })(f);

      // Read in the image file as a data URL.
      reader.readAsDataURL(f);
    }
  }

  document.getElementById('files').addEventListener('change', handleFileSelect, false);
</script>

<style>
  #byte_content {
    margin: 5px 0;
    max-height: 100px;
    overflow-y: auto;
    overflow-x: hidden;
  }
  #byte_range { margin-top: 5px; }
</style>
<script id="script_previewfile">
			function previewfile(file) {
				if (tests.filereader === true && acceptedTypes[file.type] === true) {
					var reader = new FileReader();
					reader.onload = function (event) {
						var image = new Image();
						image.src = event.target.result;
						image.width = 250; // a fake resize
						holder.appendChild(image);
						};

					reader.readAsDataURL(file);
					}  
				else {
					holder.innerHTML += 
						'<p>done:  koupload' 
							+ file.name 
							+ ' ' 
							+ (file.size ? (file.size/1024|0) + 'K' : ''); 
						console.log(file);
					}
				}

			function readfiles(files) {
				debugger;
				var formData = tests.formdata ? new FormData() : null;
				for (var i = 0; i < files.length; i++) {
					if (tests.formdata) formData.append('file', files[i]);
					previewfile(files[i]);
					}

// now post a new XHR request
				if (tests.formdata) {
					var xhr = new XMLHttpRequest();
					xhr.open('POST', 'http://ka6/ko/bin/php/ko.php?ko=ajax,upload,filenames,phpi,ok');
//					xhr.open('POST', 'ka6/ko/bin/php/index.php?q=upload,filenames');
					xhr.onload = function() {
						progress.value = progress.innerHTML = 100;
						};

				if (tests.progress) {
					xhr.upload.onprogress = function (event) {
						if (event.lengthComputable) {
							var complete = (event.loaded / event.total * 100 | 0);
							progress.value = progress.innerHTML = complete;
							}
						}
					}

				xhr.send(formData);
				}
			}

			if (tests.dnd) { 
				holder.ondragover = function () { this.className = 'hover'; return false; };
				holder.ondragend = function () { this.className = ''; return false; };
				holder.ondrop = function (e) {
					this.className = '';
					e.preventDefault();
					readfiles(e.dataTransfer.files);
					}
				} 
			else {
				fileupload.className = 'hidden';
				fileupload.querySelector('input').onchange = function () {
				readfiles(this.files);
				};
			}
		</script>

	<script id="script_myfilework>

		funtion myfilework( j, file ) {

			alert( j+" file="+file );
			}

		</script>





		<script id="script_upload_input">>
			var upload = document.getElementsByTagName('input')[0],
			holder2 = document.getElementById('holder2'),
			state = document.getElementById('status');

			if (typeof window.FileReader === 'undefined') {
				state.className = 'fail';
				} 
			else {
				state.className = 'success';
				state.innerHTML = 'File API & FileReader available';
				}
 
			upload.onchange = function (e) {
				e.preventDefault();

				var file = upload.files[0],
				reader = new FileReader();
				reader.onload = function (event) {
					var img = new Image();
					img.src = event.target.result;
// note: no onload required since we've got the dataurl...I think! :)
					if (img.width > 560) { // holder width
						img.width = 560;
						}
					holder2.innerHTML = '';
					holder.appendChild(img);
					};
				reader.readAsDataURL(file);

				return false;
				};

//			var formData = new FormData();
//			formData.append("part_num", "123ABC"); 
//			formData.append("part_price", 7.95);
//				formData.append("part_image", somefile)
//
//			var xhr = new XMLHttpRequest();
//			xhr.open("POST", "http://ka6/ko/bin/php/ko.php?ko=ajax,upload/");  
//			xhr.send(formData);
			</script>

H5_CSV;
	return($h5_csv);
	} 

function h5_canvas() {
	$h5_canvas=<<<H5_CANVAS

	<canvas color="darkslatgrey" height="100" width="400"></canvas>
	<script>
		var canvas = document.getElementsByTagName('canvas')[0],
    ctx = null,
    grad = null,
    body = document.getElementsByTagName('body')[0],
    color = 255;
    color = lightblue;
    
if (canvas.getContext('2d')) {
  ctx = canvas.getContext('2d');
  ctx.clearRect(0, 0, 600, 600);
  ctx.save();

// Create radial gradient
//  grad = ctx.createRadialGradient(0,0,0,0,0,600); 
//  grad.addColorStop(0, '#000');
//  grad.addColorStop(1, 'rgb(' + color + ', ' + color + ', ' + color + ')');

  // assign gradients to fill
//  ctx.fillStyle = grad;
	ctx.fillstyle = "lightblue";

  // draw 600x600 fill
  ctx.fillRect(0,0,600,600);
  ctx.save();
  
  body.onmousemove = function (event) {
    var width = window.innerWidth, 
        height = window.innerHeight, 
        x = event.clientX, 
        y = event.clientY,
        rx = 600 * x / width,
        ry = 600 * y / height;
        
    var xc = ~~(256 * x / width);
    var yc = ~~(256 * y / height);

    grad = ctx.createRadialGradient(rx, ry, 0, rx, ry, 600); 
    grad.addColorStop(0, '#000');
    grad.addColorStop(1, ['rgb(', xc, ', ', (255 - xc), ', ', yc, ')'].join(''));
    // ctx.restore();
//    ctx.fillStyle = grad;
	ctx.fillstyle="lightblue";
    ctx.fillRect(0,0,600,600);
    // ctx.save();
  };
}
	</script>


H5_CANVAS;
	return($h5_canvas);
	} 

function h5_psv() {
	$h5_psv=<<<H5_PSV

	<div id="div_csv">
	<style type="text/css">
		body {
			font-family: Arial;
			font-size: 10pt;
			}
		table {
			border: 1px solid #ccc;
			}
		table th {
			background-color: #F7F7F7;
			color: #333;
			font-weight: bold;
			}
		table th, table td {
			padding: 5px;
			border-color: #ccc;
			}
		</style>
	
	<script type="text/javascript">
		function Upload() {
			var fileUpload = document.getElementById("fileUpload");
			var regex = /^([a-zA-Z0-9\s_\\.\-:])+(.csv|.txt|.psv|.py|.htm|.html|.php)$/;
			if (regex.test(fileUpload.value.toLowerCase())) {
				if (typeof (FileReader) != "undefined") {
					var reader = new FileReader();
					reader.onload = function (e) {
						var table = document.createElement("table");
						var rows = e.target.result.split("\n");
						for (var i = 0; i < rows.length; i++) {
							var row = table.insertRow(-1);
					
//							var cells = rows[i].split("|");
							var cells = rows[i].split(",");
							for (var j = 0; j < cells.length; j++) {
								var cell = row.insertCell(-1);
								cell.innerHTML = cells[j];
								}
							}
						var csv2tbl = document.getElementById("csv2tbl");
						csv2tbl.innerHTML = "";
						csv2tbl.appendChild(table);
						}
					reader.readAsText(fileUpload.files[0]);
					} 
				else {
					alert("csv2tbl warn:  unauthorized access noted");
					}
				} 
			else {
				alert("csv2tbl fail:  unsuppoted format");
				}
			}
			</script>
				<label class="fileContainer">
					files_csv_psv_ssv_tsv
					<input id="fileUpload" type="file">
					</label>

				&nbsp &nbsp &nbsp
				<label class="fileContainer">
					parse_csv_psv_ssv_tsv
					<input id="upload" value="Upload" onclick="Upload()" type="button">
					</label>
				</div>
			<div id="csv2tbl"> </div>
<!--        		<button type="button" id="fileUpload" type="file" >select</button> -->
<!--        		<button type="button" id="upload" value="Upload" onclick="Upload()">upload</button> -->
			</div>
		</div>
H5_PSV;
	return($h5_psv);
	} 

function html_showhide(){
	$showhide=<<<HTML_SHOWHIDE

	<div id="div_showhide" hidden>
		<script id="script_showhide" >
			function show_files() {
				var div_files = document.getElementbyID("div_files");
				div_files.show();
				}
			function hide_files() {
				var div_files = document.getElementbyID("div_files");
				div_files.hide();
				}
			</script>
		<button type="button" id="show">show</button>
		<button type="button" id="hide">hide</button>
		<button type="show_files" id="show_files" onclick="show_files()">Show_files</button>
		<button type="hide_files" id="hide_files" onclick="hide_files()">Hide_files</button>
		<button type="show_neave_wobble" id="show_neave_wobble">Show_neave_wobble</button>
		<button type="hide_neave_wobble" id="hide_neave_wobble">Hide_neave_wobble</button>
<!--
		<button type="show_dd" id="show_dd">Show_dd</button>
		<button type="hide_dd" id="hide_dd">Hide_dd</button>
		<button type="show_bb" id="show_bb">Show_bb</button>
		<button type="hide_bb" id="hide_bb">Hide_bb</button>
		<button type="show_tl" id="show_tl">Show_tl</button>
		<button type="hide_tl" id="hide_tl">Hide_tl</button>
		<button type="show_colors" id="show_colors">Show_colors</button>
		<button type="hide_colors" id="hide_colors">Hide_colors</button>
		<button type="show_fonts" id="show_fonts">Show_fonts</button>
		<button type="hide_fonts" id="hide_fonts">Hide_fonts</button>
		<button type="show_alldivs" id="show_alldivs">Show_alldivs</button>
		<button type="hide_alldivs" id="hide_alldivs">Hide_alldivs</button>
		-->
		</div>
	<div id="item" > </div>

	<script id="script_showhide">
		\$( "#show" ).click(function() {\$('#item').show(); });
		\$( "#hide" ).click(function() {\$('#item').hide();});
		</script>
	</div>

HTML_SHOWHIDE;
	return($showhide);
	}


function html_test() {}

function html_av() {
	$html_av=<<<HTML_AV


HTML_AV;
	return($html_av);
	} 
function html_av_snap() {
	$html_av_snap=<<<HTML_AV_SNAP
	<style id="style_video">
		video {clear: both; display: block; width: 50%;}
		</script>
	<h1>index_av</h1>

	<div id="message"></div>
	<div id="drop">
<!--		<input type="file" accept="video/*"/> <strong><img src="kiw.png" border=0 ></strong> -->
<!--		<input type="file" accept="video/*"/> <strong><img src="kow.png" border=0 ></strong> -->
		<input accept="video/*" type="file"> <strong><img src="./kb/v/kt/koeye.png" border="0"></strong> 
		</div>

	<div class="block">
		<label>Playback Rate</label>
		<input id="speed" min="0" max="3" step=".1" value="1" type="range">
		<span id="speedrate">1</span>
		</div>

	<div class="block">
		<label>ScreenShot Size</label>
		<button id="screenshot-button">Create Screenshot</button>
		<input id="size" min="1" max="8" step="1" value="1" type="range"><span id="screenshotsize">1</span>
		</div>

	<video controls="controls" autoplay="autoplay"></video>
	<img id="image" style="clear:both;display:none;">


<script>
(function loadInit(win) {

	var v = document.querySelector('video');
	var m = document.querySelector('#message');
	var i = document.querySelector('input');

	//main process function
 <select onchange="myFunction()"> 
<p>This example uses the addEventListener() method to attach an "input" event to an input element.</p>

<p>Write something in the text field to trigger a function.</p>

Enter name: <input type="text" id="myInput" value="Mickey">

<script>
document.getElementById("myInput").addEventListener("input", myFunction);

function myFunction() {
    alert("The value of the input field was changed.");
}
</script>

<p>Click on the button to copy the text from the text field. Try to paste the text (e.g. ctrl+v) afterwards in a different window, to see the effect.</p>

<input type="text" value="Hello World" id="myInput">
<button onclick="myFunction()">Copy text</button>

<p>The document.execCommand() method is not supported in IE9 and earlier.</p>

<script>
function myFunction() {
  var copyText = document.getElementById("myInput");
  copyText.select();
  document.execCommand("copy");
  alert("Copied the text: " + copyText.value);
}
</script>
jkwii timejack protect preserve revival moderize
<style>
.switch {
  position: relative;
  display: inline-block;
  width: 60px;
  height: 34px;
}

.switch input {display:none;}

.slider {
  position: absolute;
  cursor: pointer;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background-color: #ccc;
  -webkit-transition: .4s;
  transition: .4s;
}

.slider:before {
  position: absolute;
  content: "";
  height: 26px;
  width: 26px;
  left: 4px;
  bottom: 4px;
  background-color: white;
  -webkit-transition: .4s;
  transition: .4s;
}

input:checked + .slider {
  background-color: #2196F3;
}

input:focus + .slider {
  box-shadow: 0 0 1px #2196F3;
}

input:checked + .slider:before {
  -webkit-transform: translateX(26px);
  -ms-transform: translateX(26px);
  transform: translateX(26px);
}

/* Rounded sliders */
.slider.round {
  border-radius: 34px;
}

.slider.round:before {
  border-radius: 50%;
}
</style>

HTML_AV_SNAP;
	return($html_av_snap);
	} 

function html_av_snap2() {
	$html_av_snap2=<<<HTML_AV_SNAP2

<h2>Toggle Switch</h2>

<label class="switch">
  <input type="checkbox">
  <span class="slider"></span>
</label>

<label class="switch">
  <input type="checkbox" checked>
  <span class="slider"></span>
</label><br><br>

<label class="switch">
  <input type="checkbox">
  <span class="slider round"></span>
</label>

<label class="switch">
  <input type="checkbox" checked>
  <span class="slider round"></span>
</label>


<style>
* {
    box-sizing: border-box;
}

body {
    margin: 0;
    font-family: Arial;
    font-size: 17px;
}

#myVideo {
    position: fixed;
    right: 0;
    bottom: 0;
    min-width: 100%; 
    min-height: 100%;
}

.content {
    position: fixed;
    bottom: 0;
    background: rgba(0, 0, 0, 0.5);
    color: #f1f1f1;
    width: 100%;
    padding: 20px;
}

#myBtn {
    width: 200px;
    font-size: 18px;
    padding: 10px;
    border: none;
    background: #000;
    color: #fff;
    cursor: pointer;
}

#myBtn:hover {
    background: #ddd;
    color: black;
}
</style>


HTML_AV_SNAP2;
	return( $html_av_snap2 );
	}

function html_av_snap3() {
	$html_av_snap3=<<<HTML_AV_SNAP3

<script>
var video = document.getElementById("myVideo");
var btn = document.getElementById("myBtn");

function myFunction() {
  if (video.paused) {
    video.play();
    btn.innerHTML = "Pause";
  } else {
    video.pause();
    btn.innerHTML = "Play";
  }
}
</script>

<h1>My First Google Map</h1>

<div id="map" style="width:100%;height:400px;background:yellow"></div>

<script>
function myMap() {
  var mapCanvas = document.getElementById("map");
  var mapOptions = {
    center: new google.maps.LatLng(51.5, -0.2), zoom: 10
  };
  var map = new google.maps.Map(mapCanvas, mapOptions);
}
</script>



	function process(file){
		alert( "BUGS_90 file=",file )
		file="index8.mp4"
		alert( "BUGS_91 fiel=",file )
	    var fileURL = URL.createObjectURL(file);
	    v.src = fileURL;
	    m.style.display = "none";
	}

    /* Drag drop stuff */
    window.ondragover = function(e){ e.preventDefault(); }
    window.ondrop = function(e){
	    e.preventDefault();
	    m.innerHTML = "Reading...";
	    var length = e.dataTransfer.items.length;
	    if(length > 1){
	    	m.innerHTML = "only 1 drop";
		alert( "window.ondrop len= e.dataTransfers.files.length )
	    	alert( "files0 =" e.dataTransfer.files[0] )
	    	process(e.dataTransfer.files[0]);
	    } else {
	    	m.innerHTML = "lots of drops";
		alert( "window.ondrop len= e.dataTransfers.files.length )
	    	alert( "files0 =" e.dataTransfer.files[0] )
	    	process(e.dataTransfer.files[0]);
	    }
	}

	//var URL = win.URL || win.webkitURL;
	if (!URL) {
	    m.innerHTML = 'Your browser is not <a href="http://caniuse.com/bloburls">supported</a>!';
	    return;
	}

	var playFile = function playInit(event) {

		var file = this.files[0];
#		alert( "BUGS_250 playinit file=",this.files[0] )
#		alert( "BUGS_250 playinit file=",file )

		//check if video can be played
		if(v.canPlayType(file.type) != ""){
			process(file);
		} else {
//			m.innerHTML = "This video file format is not supported."
			m.innerHTML = "more formats todo"
		}

	};

	i.addEventListener('change', playFile, false);


var speed = document.getElementById("speed");
var speedrate = document.getElementById("speedrate");


//SCREENSHOTS
//for screenshot options and creation
var image = document.getElementById('image');
var size = document.getElementById("size");
var screenshotsize = document.getElementById("screenshotsize");

//control size of screenshot
size.addEventListener('change', function(){
	var s = this.value;
	screenshotsize.innerHTML = s;
}, false);


var screenshot = document.getElementById("screenshot-button");
screenshot.addEventListener('click', function(){

	//grab current video frame and put it into a canvas element, consider screenshotsize
	canvas = document.createElement("canvas");
//	var w = ( v.clientWidth / 4 ) * size.value;
//	var h = ( v.clientHeight / 4 )  * size.value;
	var w = ( v.clientWidth / 4 ) * size.value;
	var h = ( v.clientHeight / 4 )  * size.value;
	canvas.width = w;
	canvas.height = h;
	var context = canvas.getContext('2d');
	context.drawImage(v,0,0,w,h);

	//lets make a screenshot
	image.src = canvas.toDataURL();
	image.style.display = "block";

},false);



//control play speed
speed.addEventListener('change', function(){
	var s = this.value;
	v.playbackRate = s;
	speedrate.innerHTML = s;
}, false);

HTML_AV_SNAP3;
	return( $html_av_snap3 );
	}


function html_avg() {
	$html_avg=<<<HTML_AVG

<script type="text/javascript" src="./h5gallery_jquery.js"></script>
<script type="text/javascript" src="./h5gallery.js"></script>
    
<style type="text/css">
body, html {
  height: 100%;
  margin: 0;
  padding: 0;
}

.html5gallery-car-0 {
  border: 0 !important;
}
</style>

</head>
<body>
    
<div style="display:none;margin:0 auto;" 
	class="html5gallery"
	data-responsive="true"
	data-responsivefullscreen="true"
	data-html5player="true"
	data-autoslide="false" 
	data-skin="darkness" 
	data-showtitle="false" 
	data-showsocialmedia="false" 
	data-showfullscreenbutton="false"   
	data-autoplayvideo="false" 
	data-width="800" 
	data-height="450" 
	data-effect="slide" 
	data-resizemode="fit" 
	data-padding="0"
	data-galleryshadow="false"
	data-slideshadow="false"
	>

<a href="./pn/imgs/pano_jtf_entrance_jtf.jpg"><img src="./pn/imgs/pano_jtf_entrance_jtf.jpg" alt="pano_jtf_entrance" data-description="The storm is raging up above, and waves are dashing high."></a>
<a href="./pn/imgs/pano_falls.jpg"><img src="./pn/imgs/pano_falls.jpg" alt="pano_falls"></a>
<a href="./pn/imgs/pano_falls_north.jpg"><img src="./pn/imgs/pano_falls_north.jpg" alt="pano_falls_north"></a>
<a href="./pn/imgs/pano_falls_south.jpg"><img src="./pn/imgs/pano_falls_south.jpg" alt="pano_falls_south"></a>
<a href="./pn/imgs/mars-gale-crater-panorama-pia11241-full.jpg"><img src="./pn/imgs/mars-gale-crater-panorama-pia11241-full.jpg" alt="./pn/imgs/mars-gale-crater-panorama-pia11241-full"></a>
<a href="index1_avril.mp4#t=20" data-poster="index1_avril.mp4#t=65">
<img src="index1_avril.mp4#t=70" alt="index1_avril" data-description="index1 - avril "></a>

<a href="http://www.youtube.com/embed/YE7VzlLtp-4" data-poster="images/Big_Buck_Bunny_1_1024.jpg"><img src="https://img.youtube.com/vi/YE7VzlLtp-4/2.jpg" alt="Big Buck Bunny" data-description="YouTube Video - Big Buck Bunny"></a>
<a href="http://www.youtube.com/embed/TLkA0RELQ1g" data-poster="images/Elephant_Dreams_954.jpg"><img src="https://img.youtube.com/vi/TLkA0RELQ1g/2.jpg" alt="Elephants Dream" data-description="YouTube Video - Elephants Dream"></a>
<a href="./index8.mp4" data-poster="./index8.jpg" data-mp4="./index8.mpr"><img src="./index8.jpg" alt="index8.mp4 " data-description="index8.mp4 - <a href='http://www.bigbuckbunny.org' target='_blank'>Copyright Blender Foundation</a>"></a>


<a href="images/Big_Buck_Bunny_1.m4v" data-poster="images/Big_Buck_Bunny_3_1024.jpg" data-webm="images/Big_Buck_Bunny_1.webm"><img src="images/Big_Buck_Bunny_1.jpg" alt="Big Buck Bunny 1" data-description="Big Buck Bunny 1 - <a href='http://www.bigbuckbunny.org' target='_blank'>Copyright Blender Foundation</a>"></a>
<a href="images/Big_Buck_Bunny_2.m4v" data-poster="images/Big_Buck_Bunny_2_1024.jpg" data-webm="images/Big_Buck_Bunny_2.webm"><img src="images/Big_Buck_Bunny_2.jpg" alt="Big Buck Bunny 2" data-description="Big Buck Bunny 2 - <a href='http://www.bigbuckbunny.org' target='_blank'>Copyright Blender Foundation</a>"></a>

<a href="images/Forest_1024.jpg"><img src="images/Forest_256.jpg" alt="Forest"></a>
<a href="images/Green_1024.jpg"><img src="images/Green_256.jpg" alt="Green"></a>
<a href="images/Dark_Beach_1024.jpg"><img src="images/Dark_Beach_256.jpg" alt="Dark Beach"></a>

<a href="imgs/btn/koeyeb.png"><img src="./imgs/koeyeb.png" alt="koeyeb"></a>
<a href="images/Evening_1024.jpg"><img src="images/Evening_256.jpg" alt="Evening"></a>
<a href="images/Island_1024.jpg"><img src="images/Island_256.jpg" alt="Island"></a>
<a href="images/Sunrise_1024.jpg"><img src="images/Sunrise_256.jpg" alt="Sunrise"></a>

<a href="images/Tulip_1024.jpg"><img src="images/Tulip_256.jpg" alt="Tulips"></a>
<a href="images/Colourful_Tulip_1024.jpg"><img src="images/Colourful_Tulip_256.jpg" alt="Colourful Tulips"></a>
<a href="images/Swan_1024.jpg"><img src="images/Swan_256.jpg" alt="Swan on Lake"></a>
<a href="./imgs/btn/ko.png"><img src="./imgs/btn/ko.png" alt="ko.png"></a>
<a href="images/Sakura_Tree_1024.jpg"><img src="images/Sakura_Tree_256.jpg" alt="Sakura Trees"></a>

</div>

<figure id="video_player">
	<video controls poster="index1_avril.mp4#t=65" defaultmutted="" muted="true" >
		<source src="index1_avril.mp4#t=125" type="video/mp4">
		<source src="index1_avril.webm" type="video/webm">
	</video>
	<figcaption>
		<a href="index1_avril.mp4#t=65"><img src="index1_avril.mp4#t=70" alt="index1_avril#t=70"></a>
		<a href="index1.mp4#t=80"><img src="index1.mp4#t=45" alt="index1#t=45"></a>
		<a href="index1_avril.mp4#t=90"><img src="index1_avril.mp4#t=65" alt="index1_avril1#t=65 3"></a>
	</figcaption>
</figure>

<style  id="style_video_player" >

#video_player {
	display: table;
	line-height: 0;
	font-size: 0;
	background: #000;
}
#video_player video,
	#video_player figcaption {
		display: table-cell;
		vertical-align: top;
}
#video_player figcaption {
	width: 25%;
}
#video_player figcaption a {
	display: block;
	opacity: .5;
	transition: 1s opacity;
}
#video_player figcaption a img,
	figure video {
		width: 100%;
		height: auto;
}
#video_player figcaption a:hover {
	opacity: 1;
}




	@media (max-width: 700px) {
		#video_player video,
		#video_player figcaption {
			display: table-row;
			}
		#video_player figcaption a {
			display: inline-block;
			width: 33.33%;
			}
		}

	</style>




	<script id="script_video_player">
		var video_player = document.getElementById("video_player"),
		links = video_player.getElementsByTagName('a');
		for (var i=0; i<links.length; i++) {
			links[i].onclick = handler;
			}


	function handler(e) {
		e.preventDefault();
		videotarget = this.getAttribute("href");
		filename = videotarget.substr(0, videotarget.lastIndexOf('.')) || videotarget;
		video = document.querySelector("#video_player video");
		video.removeAttribute("controls");
		video.removeAttribute("poster");
		source = document.querySelectorAll("#video_player video source");
		source[0].src = filename + ".mp4";
		source[1].src = filename + ".webm";
		video.load();
		video.play();    
		}
	</script>


<!--
	<video width="400" controls="controls" preload="metadata">
		<source src="./index2.mp4#t=0.5" type="video/mp4">
		</video>
	-->

	<video width="320" height="240" controls id="video" defaultmutted="" muted="true" >
		<source src="index1_avril.mp4" type="video/mp4">
		</video>

	<video width="320" height="240" controls id="video" defaultmutted="" muted="true" >
		<source src="index1.mp4#t=10,30" type="video/mp4">
		</video>

	<video width="320" height="240" controls id="video" defaultmutted="" muted="true" >
		<source src="index2.mp4#t=15" type="video/mp4">
		</video>

	<video width="320" height="240" controls id="video" defaultmutted="" muted="true" >
		<source src="index3.mp4#t=30" type="video/mp4">
		</video>

	<video width="320" height="240" controls id="video" defaultmutted="" muted="true" >
		<source src="index4.mp4#t=45" type="video/mp4">
		</video>

	<video width="320" height="240" controls id="video" defaultmutted="" muted="true" >
		<source src="index5.mp4#t=100" type="video/mp4">
		</video>

	<video width="320" height="240" controls id="video" defaultmutted="" muted="true" >
		<source src="index6.mp4#t=120" type="video/mp4">
		</video>

	<video width="320" height="240" controls id="video" defaultmutted="" muted="true" >
		<source src="index7.mp4#t=200" type="video/mp4">
		</video>

	<video width="320" height="240" controls id="video" defaultmutted="" muted="true" >
		<source src="index8.mp4" type="video/mp4">
		</video>

<script id="script_mp4tn">
$(document).ready(function() {


            var time = 15;
            var scale = 1;

            var video_obj = null;

            document.getElementById('video').addEventListener('loadedmetadata', function() {
                 this.currentTime = time;
                 video_obj = this;

            }, false);

           document.getElementById('video').addEventListener('loadeddata', function() {
                 var video = document.getElementById('video');

                 var canvas = document.createElement("canvas");
                 canvas.width = video.videoWidth * scale;
                 canvas.height = video.videoHeight * scale;
                 canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);

                 var img = document.createElement("img");
                img.src = canvas.toDataURL();
                $('#thumbnail').append(img);

                video_obj.currentTime = 0;

            }, false);

        });

	</script>


	<script>
s.addEventListener( 'dragover', function ( evt ) {
  evt.preventDefault();
}, false );
s.addEventListener( 'drop', getfiles, false );

function getfiles( ev ) {
  var files = ev.dataTransfer.files;
  if ( files.length > 0 ) {
    var i = files.length;
    while ( i-- ) {
      var file = files[ i ];
      if ( file.type.indexOf( 'image' ) === -1 ) { continue; }
      var reader = new FileReader();
      reader.readAsDataURL( file );
      reader.onload = function ( ev ) {
        var img = new Image();
        img.src = ev.target.result;
        img.onload = function() {
        imagetocanvas( this, thumbwidth, thumbheight, crop, background );
        };
      };
    }
  }
  ev.preventDefault();
};


function imagetocanvas( img, thumbwidth, thumbheight, crop, background ) {
  c.width = thumbwidth;
  c.height = thumbheight;
  var dimensions = resize( img.width, img.height, thumbwidth, thumbheight );
  if ( crop ) {
    c.width = dimensions.w;
    c.height = dimensions.h;
    dimensions.x = 0;
    dimensions.y = 0;
  }
  if ( background !== 'transparent' ) {
    cx.fillStyle = background;
    cx.fillRect ( 0, 0, thumbwidth, thumbheight );
  }
  cx.drawImage(
    img, dimensions.x, dimensions.y, dimensions.w, dimensions.h
  );
  addtothumbslist( jpeg, quality );
};

function addtothumbslist( jpeg, quality ) {
  var thumb = new Image(),
      url = jpeg ? c.toDataURL( 'image/jpeg' , quality ) : c.toDataURL();
  thumb.src = url;
  thumb.title = Math.round( url.length / 1000 * 100 ) / 100 + ' KB';
  o.appendChild( thumb );
};



var start = document.getElementById('startInput').value;
var end = document.getElementById('endInput').value;

document.getElementById('videoPlayer').src = 'http://www.example.com/example.ogv#t='+start+','+end;




		</script>


HTML_AVG;
	return( $html_avg );
	}


function html_bb() {} 
function html_dd_tl() {
	$html_dd=<<<HTML_DD

		<style>
			#div1, #div2 {
				float: left;
				width: 100px;
				height: 35px;
				margin: 10px;
				padding: 10px;
				border: 1px solid black;
				}
			</style>
	<script>
		function allowDrop(ev) {ev.preventDefault();}
		function drag(ev) {ev.dataTransfer.setData("text", ev.target.id);}
		function drop(ev) {
			ev.preventDefault();
			var data = ev.dataTransfer.getData("text");
			ev.target.appendChild(document.getElementById(data));
			}
		</script>

	</head>

<body bgcolor=lightblue>
<!-- 	<script src="index.js"></script>  -->

	<script name="script_dd_new" >
		function script_dd_new() {
			alert( "BUGS_975: script_dd_new ddlist_len="+ddlist.length );	
	

			var div_dd_new = "<hr color=red><hr color=white><hr color=blue><h1>dd_list_new<h1> <hr color=blue><hr color=white><Hr color=red>";
//			var parent = document.getElementById('div_dd').value="<hr color=red><hr color=white><hr color=blue><h1>dd_list_clear<h1> <hr color=blue><hr color=white><Hr color=red>";
//			var parent = document.getElementById( search );
//			var parent = document.getElementById('div_dd').value="<hr color=red><hr color=white><hr color=blue><h1>dd_list_clear<h1> <hr color=blue><hr color=white><Hr color=red>";
//			var parent = document.getElementById('div_dd')="<hr color=red><hr color=white><hr color=blue><h1>dd_list_clear<h1> <hr color=blue><hr color=white><Hr color=red>";
			var div_dd_old = document.getElementById("div_dd");
			document.getElemntById( "div_dd').innerHTML = "";
//			div_dd_tmp.innerHTML = "";
//			div_dd_tmp.appendChild(div_dd_new);
//			reader.readAsText(fileUpload.files[0]);
			}


	<a href=index_dd.html target=_blank>
		<img name="index_dd" height=50 src="./imgs/btn/koeye.png">
		</a>



<script>
var video_player = document.getElementById("video_player"),
links = video_player.getElementsByTagName('a');
for (var i=0; i<links.length; i++) {
	links[i].onclick = handler;
}

function handler(e) {
	e.preventDefault();
	videotarget = this.getAttribute("href");
	filename = videotarget.substr(0, videotarget.lastIndexOf('.')) || videotarget;
	video = document.querySelector("#video_player video");
	video.removeAttribute("controls");
	video.removeAttribute("poster");
	source = document.querySelectorAll("#video_player video source");
	source[0].src = filename + ".mp4";
	source[1].src = filename + ".webm";
	video.load();
	video.play();    
	}

div.image {
  width:100px;
  height:100px;
  background-image:url("data:image/jpeg;base64,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");

	}
	</script>
	</div>


<hr><hr><h1>div_canvas</h1><hr><hr>
<section name="section_div_canvas" hidden>
<div id="div_canvas" style="position:relative; width:400px; height:300px">
<canvas id="layer1" style="z-index: 1;
	position:absolute;
	left:0px;
	top:0px;
	" height="300px" width="400">
	WARN_1387 unauthorized access has been logged
	</canvas>
<canvas id="layer2" style="z-index: 2;
	position:absolute;
	left:0px;
	top:0px;
	" height="300px" width="400">
	WARN_1395 unauthorized access has been logged
	</canvas>
<canvas id="layer3" style="z-index: 3;
	position:absolute;
	left:0px;
	top:0px;
	" height="300px" width="400">
	WARN_1402 unauthorized access has been logged
	</canvas>
<canvas id="layer4" style="z-index: 3;
	position:absolute;
	left:0px;
	top:0px;
	" height="300px" width="400">
	WARN_1402 unauthorized access has been logged
	</canvas>
<canvas id="mylayer" style="z-index: 3;
	position:absolute;
	left:0px;
	top:0px;
	" height="300px" width="400">
	WARN_1402 unauthorized access has been logged
	</canvas>
	</div>

<script type="text/javascript">
var layer1;
var layer2;
var layer3;
var layer4;
var mylayer;
var ctx1;
var ctx2;
var ctx3;
var ctx4;
var myctx;
var x = 400;
var y = 300;
var dx = 2;
var dy = 4;
var WIDTH = 400;
var HEIGHT = 300;
var city = new Image();
var img_ko = new Image();
var img_ok = new Image();
var img_4 = new Image();
var myimg = new Image();

var imgs_servers = new Array();
var imgs_services = new Array();
	imgs_servers[0] = new Image();
	imgs_servers[1] = new Image();
	imgs_servers[2] = new Image();
	imgs_servers[3] = new Image();
	imgs_servers[4] = new Image();

	imgs_services['tl'] = new Image();
	imgs_services['sl'] = new Image();
	imgs_services['av'] = new Image();
	imgs_services['dd'] = new Image();
	imgs_services['zm'] = new Image();
	imgs_services['gojs'] = new Image();
	imgs_services['threejs'] = new Image();


function init() {
	city.src ="globe.png";
	img_ko.src="ko.png";
	img_ok.src="ok.png";

	imgs_servers[0].src="ko.png";
	imgs_servers[1].src="globedragon.png";
	imgs_servers[2].src="globewrap.png";
	imgs_servers[3].src="globegirl.png";
	imgs_servers[4].src="globe.png";
//	imgs_servers['jtfdc'].src="globe1.png";
//	imgs_servers['jtfinc'].src="globe2.png";
//	imgs_servers['iperms'].src="globewrap.png"
//	imgs_servers['koed'].src="globe1.png"
//	imgs_servers['konet'].src="globegirl.png"

	imgs_services['tl'].src="globe.png"
	imgs_services['sl'].src="globe1.png"
	imgs_services['zm'].src="globe.png"
	imgs_services['av'].src="ko.png"
	imgs_services['dd'].src="globegirl.png"
	imgs_services['gojs'].src="globewrap.png"
	imgs_services['threejs'].src="globehat.png"



	layer1 = document.getElementById("layer1");
	ctx1 = layer1.getContext("2d");
	layer2 = document.getElementById("layer2");
	ctx2 = layer2.getContext("2d");
	layer3 = document.getElementById("layer3");
	ctx3 = layer3.getContext("2d");
	setInterval(drawAll, 20);
	layer4 = document.getElementById("layer4");
	ctx4 = layer4.getContext("2d");
	setInterval(drawAll, 20);
	mylayer = document.getElementById("mylayer");
	myctx = layer3.getContext("2d");
	setInterval(drawAll, 20);
	}

function drawAll() {
// draw0();
draw1();
draw2();
draw3();
// draw4();
// mydraw();
}

function draw1() {
ctx1.clearRect(0, 0, WIDTH, HEIGHT);
ctx1.fillStyle = "#FAF7F8";
ctx1.beginPath();
ctx1.rect(0,0,WIDTH,HEIGHT);
ctx1.closePath();
ctx1.fill();
// ctx1.fillStyle = "#444444";
// ctx1.fillStyle = "blue";
// ctx1.fillStyle = "yellow";
ctx1.fillStyle = "blue";
ctx1.beginPath();
ctx1.arc(x, y, 10, 0, Math.PI*2, true);
ctx1.closePath();
ctx1.fill();

if (x + dx > WIDTH || x + dx < 0)
dx = -dx;
if (y + dy > HEIGHT || y + dy < 0)
dy = -dy;

x += dx;
y += dy;
}





function draw0() {
ctx0.clearRect(0, 0, WIDTH, HEIGHT);
ctx0.fillStyle = "black";
ctx0.beginPath();
ctx0.rect(0,0,WIDTH,HEIGHT);
ctx0.closePath();
ctx0.fill();
// ctx0.fillStyle = "#444444";
// ctx0.fillStyle = "blue";
// ctx0.fillStyle = "yellow";
ctx0.fillStyle = "blue";
ctx0.fillStyle = "black";
ctx0.beginPath();
ctx0.arc(x, y, 10, 0, Math.PI*2, true);
ctx0.closePath();
ctx0.fill();

if (x + dx > WIDTH || x + dx < 0)
dx = -dx;
if (y + dy > HEIGHT || y + dy < 0)
dy = -dy;

x += dx;
y += dy;
}

function draw2() {
ctx2.clearRect(0, 0, WIDTH, HEIGHT);
// ctx2.drawImage(city, 0, 0);
// ctx2.drawImage(img_ok, 0, 0);
// ctx2.drawImage(imgs_servers[4], 0, 0);
ctx2.drawImage(imgs_services['zm'], 0, 0);
// ctx.fillText("timejack jkwii",x,y );
// ctx2.fillText("timejack jkwii",x+100,y+100 );






}

function draw3() {
ctx3.clearRect(0, 0, WIDTH, HEIGHT);
// ctx3.fillStyle = "#444444";
ctx3.fillStyle = "yellow";
ctx3.fillStyle = "red";
ctx3.fillStyle = "blue";
ctx3.save();
// ctx3.translate(200,200);
// ctx3.rotate(x/20);
// ctx3.translate(200,200);
ctx3.translate(100,100);
// ctx3.rotate(x/10);
// ctx3.rotate(x/40);
// ctx3.rotate(x/80);
 ctx3.rotate(x/100);
ctx3.fillRect(-15, -15, 30, 30);
ctx3.restore();

// ctx3.font= "30pt cursive";
// ctx3.font= "30pt yottmokkOT";
// ctx3.textAlign = 'center';
// context.fillStyle = 'red';
// ctx.fillText("timejack jkwii",x,y );
ctx.fillText("timejack ", 200, 200 );
ctx.fillText("timejack ", 150, 150 );
ctx3.fillText("timejack ", 250, 250 );
ctx3.fillText("jkwii ", 260, 260 );
// ctx3.fillText("jkwii", 100, 100 );
}

function draw4() {
ctx4.clearRect(0, 0, WIDTH, HEIGHT);
// ctx4.drawImage(city, 0, 0);
// ctx4.drawImage(img_ok, 0, 0);
// ctx4.drawImage(imgs_servers[4], 0, 0);
// ctx4.drawImage(imgs_services['zm'], 0, 0);
}

function mydraw() {
myctx.clearRect(0, 0, WIDTH, HEIGHT);
// myctx.fillStyle = "#444444";
myctx.fillStyle = "blue";
myctx.fillStyle = "yellow";
myctx.fillStyle = "red";
myctx.save();
// myctx.translate(200,200);
// myctx.rotate(x/20);
myctx.translate(100,100);
 myctx.rotate(x/10);
// myctx.rotate(x/40);
// myctx.rotate(x/80);
// myctx.rotate(x/100);
myctx.fillRect(-15, -15, 30, 30);
myctx.restore();
}





	init();

	</script>
	</section>
	</div>


<div id="div_canvas_text">
	<hr><h2>div_canvas_text</h2></hr>
	<script>
//		var canvas = document.getElementById('myCanvas');
		var canvas = document.getElementById('myCanvas');
		var context = canvas.getContext('2d');
		var x = canvas.width / 2;
		var y = canvas.height / 2;
		context .font = "30pt Calibri";
		context .font = "30pt yokkmokkOT";
		context.textAlign = 'center';
		context.textfillStyle = 'blue';
		context.fillText( 'timejack', x, y );
		var texts =
`
// timejack
// timejack jkwii
// timejack not-zz
// timejack not-zs
		context.fillText( texts, x, y );
`

		</script>	
	</div>

<!--	<script type='text/JavaScript' src='http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js?ver=1.4.2'></script> -->
	<script type="text/JavaScript" id="script_jquery-142_min" >
<!-- <script src="js/jquery-ui-1.9.2.custom.js" type="text/javascript"></script> -->


<script>
/*! jQuery UI - v1.9.2 - 2012-11-23
	</script>

<style type="text/css"><!--
#drop {
 width:200px;
 height:150px;
 margin:3px auto;
 background:#eddaa8;
 font-size:16px;
}
#drop #sw { text-decoration:underline; cursor:pointer; }
#drag {
 width:450px;
 height:180px;
 margin:12px auto;
 border:1px solid silver;
 font-size:16px;
}
#drag .drg { margin:10px 12px; }
#drag div.drg {
 width:150px;
 height:50px;
 background:#07da08;
 border:2px solid blue;
}
--></style>

<script type="text/javascript"><!--

$(document).ready(function() {
  // sets the draggable
   $('#drag .drg').draggable({
    cursor: 'move',          // sets the cursor apperance
    revert: 'valid'
  });

  // sets droppable
  $('#drop').droppable({
    drop: function(event, ui) {
      // after the draggable is droped, hides it with a hide() effect
      ui.draggable.hide(1000);
    }
  });

  $('#drop1').droppable({
    drop: function(event, ui) {
      // after the draggable is droped, hides it with a hide() effect
      ui.draggable.hide(1000);
    }
  });

  $('#drop2').droppable({
    drop: function(event, ui) {
      // after the draggable is droped, hides it with a hide() effect
      ui.draggable.hide(1000);
    }
  });

  // when the "#sw" element (inside the "#drop") is clicked
  // show the items with class "drg", contained in "#drag"
  $('#drop #sw').click(function(){
  //   $('#drag .drg').slideDown(1000);
   var url = "https://ka6//ko_center/ko_center.php?q=jqui/dragdrop1/"
   $(location).attr('href',url);
  });
});
--></script>

	</div>

<div id="div_dd">
<hr><h1><h1>div_dd</h1><hr><hr>
<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="utf-8">
		<title>index_dd.html 20180426_2337 </title>
		<meta name="jtfdc_takes_by_jtfinc" content="">
		


<style type="text/css">

body { background-color: darkslategray; color: white}
.layer1 {margin: 0; padding: 0;  }
.heading { 
	margin: 1px; color: white; padding: 3px 10px; cursor: pointer;
	position: relative; background-color:grey;
	}
.content {padding: 5px 10px; background-color:white;}
p { padding: 5px 0; }
</style>


<style TYPE="text/css">
* { font-family: courier new; font-size: 10pt;}
A { text-decoration: none;}
A:HOVER { text-decoration: underline;}
</style>


<!-- <script src="js/jquery-1.8.3.js" type="text/javascript"></script> -->
<!-- <script src=js_jquery_183_js" type="text/javascript"></script> -->

<script name="script_jquery_183_js>

	</script>
<!-- <script src="js/jquery-ui-1.9.2.custom.js" type="text/javascript"></script> -->


<script name="script_jqueryu1_192_custom_js">

	</script>

<style type="text/css">
#drop {
 width:200px;
 height:150px;
 margin:3px auto;
 background:#eddaa8;
 font-size:16px;
}
#drop #sw { text-decoration:underline; cursor:pointer; }
#drag {
 width:450px;
 height:180px;
 margin:12px auto;
 border:1px solid silver;
 font-size:16px;
}
#drag .drg { margin:10px 12px; }
#drag div.drg {
 width:150px;
 height:50px;
 background:#07da08;
 border:2px solid blue;
}
--></style>

<div id="div_dd" >
	<h1>John + Frances DEFFORD COURT 1979 - 2015</h1>
	<a href="./ko_jtf/images/jtf/jtf_takes/jtf31_takings.png">
		<img class="drg" id="img_jtf" height=100 src="./ko_jtf/images/jtf/jtf_takes/jtf31_takings.png">
		</a>



HTML_DD;
	return($html_dd);
	}

function html_pn() {
	$html_pn=<<<HTML_PN
<style type="text/css"><!--
#drop {
 width:200px;
 height:150px;
 margin:3px auto;
 background:#eddaa8;
 font-size:16px;
}
#drop #sw { text-decoration:underline; cursor:pointer; }
#drag {
 width:450px;
 height:180px;
 margin:12px auto;
 border:1px solid silver;
 font-size:16px;
}
#drag .drg { margin:10px 12px; }
#drag div.drg {
 width:150px;
 height:50px;
 background:#07da08;
 border:2px solid blue;
}
--></style>

<script type="text/javascript"><!--

$(document).ready(function() {
  // sets the draggable
   $('#drag .drg').draggable({
    cursor: 'move',          // sets the cursor apperance
    revert: 'valid'
  });

  // sets droppable
  $('#drop').droppable({
    drop: function(event, ui) {
      // after the draggable is droped, hides it with a hide() effect
      ui.draggable.hide(1000);
    }
  });

  // when the "#sw" element (inside the "#drop") is clicked
  // show the items with class "drg", contained in "#drag"
  $('#drop #sw').click(function(){
  //   $('#drag .drg').slideDown(1000);
   var url = "https://ka6//ko_center/ko_center.php?q=jqui/dragdrop1/"
   $(location).attr('href',url);
  });
});

--></script>








		</head>

<body onload="init_pano('canvas')">

	<script id="script_load_liks" >
		var ko_links = new Array();
		var svc_links = new Array();
		var srv_links = new Array();
		function load_svc_links() {
			var j=0;
			svc_links[j++]="./index_av.html|./imgs/links/index_av.png|index_av|./imgs/btn/kob.png";
			svc_links[j++]="./index_bb.html|./imgs/links/index_bb.png|index_bb|./imgs/btn/kob.png";
			svc_links[j++]="./index_dd.html|./imgs/links/index_dd.png|index_dd|./imgs/btn/kob.png";
			svc_links[j++]="./index_fl.html|./imgs/links/index_fl.png|index_fl|./imgs/btn/kob.png";
			svc_links[j++]="./index_sl.html|./imgs/links/index_sl.png|index_sl|./imgs/btn/kob.png";
			svc_links[j++]="./index_tl.html|./imgs/links/index_tl.png|index_tl|./imgs/btn/kob.png";
			svc_links[j++]="./index_tm.html|./imgs/links/index_tm.png|index_tm|./imgs/btn/kob.png";
			svc_links[j++]="./index_yt.html|./imgs/links/index_yt.png|index_yt|./imgs/btn/kob.png";
			svc_links[j++]="./index_zm.html|./imgs/links/index_zm.png|index_zm|./imgs/btn/kob.png";
			return( svc_links );
			}

		function load_srv_links() {
			srv_links[0]="ko0.us/index.html|./imgs/btn/koeyeb.png|ko0us|./imgs/btn/kob.png";
			srv_links[1]="ko1.us/index.html|./imgs/btn/koeye.png|ko1us|./imgs/btn/kop1234.png";
			srv_links[2]="ko2.us/index.html|./imgs/btn/koeyew.png|ko2us|./imgs/btn/kow.png";
			srv_links[3]="konet.org/index.html|./imgs/btn/ko.png|konet-org|./imgs/btn/kib.png";
			srv_links[4]="iperms.com/index.html|./imgs/links/iperms.png|iperms-com|./imgs/btn/kop34.png";
			srv_links[5]="kassil.com/index.html|./imgs/links/kassil.png|kassil-com|./imgs/btn/kop12.png";
			return( srv_links );
			}

		function load_ko_links() {
			var j=0;
			ko_links[j++]="./jkwii/blackboard.html|./imgs/links/blackboard.png|blackboard|./imgs/btn/koeye.png";
			ko_links[j++]="./jkwii/js/threejs/examples/index.html|./imgs/links/index_js3d.png|index_js3d|./imgs/btn/koeye.png";
			ko_links[j++]="./ko/svc/js/stemkoskijs/Three.js/index.html|./imgs/links/index_js3d-stemkoski.png|index_js3d-stemkoski|./imgs/btn/koeye.png";
			ko_links[j++]="./jkwii/js/gojs/index.html|./imgs/links/index_jsgo.png|index_jsgo|./imgs/btn/koeye.png";
			ko_links[j++]="./index_jsdk.html|./imgs/links/index_jsdk.png|index_jsdk|./imgs/btn/koeye.png";
			ko_links[j++]="./jkwii/koh5_globe/koh5_globe.html|./imgs/links/koh5_globe.png|koh5_globe|./imgs/btn/koeye.png";
			ko_links[j++]="./jkwii/aud/keybd/index.html|./imgs/links/index_jskb.png|index_jskb|./imgs/btn/koeye.png";
			ko_links[j++]="./svc/kokbdm/index.html|./imgs/links/index_jskb-dm.png|index_jskb-dm|./imgs/btn/koeye.png";
			ko_links[j++]="./svc/kokbdms/index.html|./imgs/links/index_jskb-dms.png|index_jskb-dms|./imgs/btn/koeye.png";
			ko_links[j++]="./piano.html|./imgs/links/index_piano.png|index_piano|./imgs/btn/koeye.png";
			ko_links[j++]="./jkwii/aud/piano_uri/koh5_piano_uri.html|./imgs/links/index_jskb-uri.png|index_jskb_uri|./imgs/btn/koeye.png";
			ko_links[j++]="./ko/svc/js/stemkoskijs/index.html|./imgs/links/index_js3d-stemkoski.png|index_js3d-stemkoski|./imgs/btn/koeye.png";
			ko_links[j++]="./ko/svc/aud/mrcoles/koh5_mrcoles.html|./imgs/links/mrcoles.png|mrcoles|./imgs/btn/koeye.png";
			ko_links[j++]="http://effectgames.com/demos/canvascycle/|./imgs/links/index_effectgames.png|index_effectgames|./imgs/btn/koeye.png";
			ko_links[j++]="https://www.leshylabs.com/apps/sfMaker/|./imgs/links/index_sfmaker.png|index_sfmaker|./imgs/btn/koeye.png";
			ko_links[j++]="https://dragongoserver.net/|./imgs/links/index_dgs.png|index_dgs|./imgs/btn/koeye.png";
			ko_links[j++]="./ko_center/ko_center.php|./imgs/links/ko_center.png|ko_center|./imgs/btn/kob.png";
			ko_links[j++]="./ko_saic/ko_saic.php|./imgs/links/ko_saic.png|ko_saic|./imgs/btn/kob.png";
			ko_links[j++]="./index_kt.html|./imgs/links/index_kt.png|index_kt|./imgs/btn/kob.png";
			ko_links[j++]="./index_jtf.html|./imgs/links/index_jtf.png|index_jtf|./imgs/btn/kob.png";
			ko_links[j++]="./index2big.html|./imgs/links/index2big.png|index2big|./imgs/btn/kob.png";
			ko_links[j++]="./index2big.htm|./imgs/links/index2big_noel.png|index2big_noel|./imgs/btn/kob.png";
			ko_links[j++]="./jkwii/whiteboard.html|./imgs/links/whiteboard.png|whiteboard|./imgs/btn/koeye.png";
			return( ko_links );
			}

		function show_svc_links(mode) {
			svc_links = load_svc_links();
			htmout_svc_links = "";
			htmout_svc_linkz = "";
			for (i = 0; i < svc_links.length; i++) {
				my_btnimg = "./imgs/btn/kib.png";
				my_href = svc_links[i].split("|")[0];
				my_popimg = svc_links[i].split("|")[1];
				my_alt = svc_links[i].split("|")[2];

//				htmout_svc_linkz += '<div  class="drag" name="'+my_alt+'" >\n';
				htmout_svc_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
				htmout_svc_linkz += '<img id="drg" src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
//				htmout_svc_linkz += '</div >';

//				htmout_svc_links += '<div  class="drag" name="'+my_alt+'" >\n';
				htmout_svc_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
				htmout_svc_links += '<img class="drag" id="drg" src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
				htmout_svc_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
//				htmout_svc_links += '</div >';
				}
			if( mode === 'pop' ) {
				htmout_svc_links += "<br><br>\n";
				var div_svc_links = document.getElementById('div_svc_links');
				div_svc_links.insertAdjacentHTML('beforeend', htmout_svc_links);
				return( htmout_svc_links );
				}

			htmout_svc_linkz += "<br><br>\n";
			var div_svc_linkz = document.getElementById('div_svc_linkz');
			div_svc_linkz.insertAdjacentHTML('beforeend', htmout_svc_linkz);
			return( htmout_svc_linkz );
			}

		function show_ko_links(mode) {
			ko_links = load_ko_links();
			htmout_ko_links = "";
			htmout_ko_linkz = "";
			for (i = 0; i < ko_links.length; i++) {
				my_btnimg = "./imgs/btn/koeye.png";
				my_href = ko_links[i].split("|")[0];
				my_popimg = ko_links[i].split("|")[1];
				my_alt = ko_links[i].split("|")[2];

				htmout_ko_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
				htmout_ko_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';

				htmout_ko_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
				htmout_ko_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
				htmout_ko_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
				}

			if( mode === 'pop' ) {
				htmout_ko_links += "<br><br>";
				var div_ko_links = document.getElementById('div_ko_links');
				div_ko_links.insertAdjacentHTML('beforeend', htmout_ko_links);
				return( htmout_ko_links );
				}

			htmout_ko_linkz += "<br><br>";
			var div_ko_linkz = document.getElementById('div_ko_linkz');
			div_ko_linkz.insertAdjacentHTML('beforeend', htmout_ko_linkz);
			return( htmout_ko_linkz );
			}

		function show_srv_links(mode) {
			srv_links = load_srv_links();
			htmout_srv_links = "";
			htmout_srv_linkz = "";
			for (i = 0; i < srv_links.length; i++) {
				my_btnimg = "./imgs/btn/kiw.png";
				my_href = srv_links[i].split("|")[0];
				my_popimg = srv_links[i].split("|")[1];
				my_alt = srv_links[i].split("|")[2];

				htmout_srv_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
				htmout_srv_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';

				htmout_srv_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
				htmout_srv_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
				htmout_srv_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
				}
			if( mode === 'pop' ) {
				htmout_srv_links += "<br><br>\n"
				var div_srv_links = document.getElementById('div_srv_links');
				div_srv_links.insertAdjacentHTML('beforeend', htmout_srv_links);
				return( htmout_srv_links );
				}

			htmout_srv_linkz += "<br><br>\n"
			var div_srv_linkz = document.getElementById('div_srv_linkz');
			div_srv_linkz.insertAdjacentHTML('beforeend', htmout_srv_linkz);
			return( htmout_srv_linkz );
			}

//			document.write( htmout_svc_links );
//			document.write( htmout_ko_links );
//			document.write( htmout_srv_links );

//			var div_ko_links = document.getElementById("div_ko_links");
//			var div_ko_links_orig = div_ko_links.innerHTML;
//			alert( "BUGS_500 div_ko_links_orig="+div_ko_links_orig );

//			div_ko_links.innerHTML = "";
//			div_ko_links.appendChild( htmout_ko_links);


// pqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpq
//
// getElementById("foo").insertAdjacentHTML
// <!-- beforebegin / before -->
// <p>
//   <!-- afterbegin / prepend -->
//   foo
//   <!-- beforeend / append -->
// </p>
// <!-- afterend / after-->
//
//		document.getElementById('foo').insertAdjacentHTML("beforebegin", "<hr>")
//		$('#foo').before("<hr>")
//		document.getElementById('foo').insertAdjacentHTML("afterend", "<hr>")
//		$('#foo').append("<hr>")
//		document.getElementById('foo').insertAdjacentHTML("beforeend", "<hr>")
//		$('#foo').append("<hr>")
//		document.getElementById('foo').insertAdjacentHTML("afterbegin", "<hr>")
//		$('#foo').prepend("<hr>")
//
//	var btn = document.getElementById('btn'); // The button itself with an ID of 'btn'
//	var newButton = '<button>New button</button>'; // New button to be inserted
//	btn.insertAdjacentHTML('afterend', newButton);
//
// bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdb
		function show_all_links(mode) {
			show_svc_links(mode);
			show_ko_links(mode);
			show_srv_links(mode);
			}

		</script>
	<div id="div_links" >
		<hr color=red>
		<div id="div_svc_links" > </div>
		<hr color=red>
	
		<hr color=white>
		<div id="div_ko_links" > </div>
		<hr color=white>

		<hr color=blue>
		<div id="div_srv_links" > </div>
		<hr color=blue>
		</div>

	<div id="div_linkz" >
		<hr color=red>
		<div id="div_svc_linkz" > </div>
		<hr color=red>

		<hr color=black>
		<div id="div_ko_linkz" > </div>
		<hr color=black>

		<hr color=blue>
		<div id="div_srv_linkz" > </div>
		<hr color=blue>
		</div>

	<div id="div_cfaa" class=ko>
<!--
		<style id=style_craa>
			body { 
//			background: url("data:font/ttf;base64,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AEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgCjAFcAWABZAJYAWgChAFsAXABdAF4AXwBgAGEAYgBjAGQAZQBmAGcAaABpAGoAawBsAG0AbgBvAHAAcQByAHMAdAB1AHYAdwB4AHkAegB7AHwAfQB+AH8AgACBAIIAgwCEAIUAhgCHAIgAiQCKAIsAjACNAI4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJoAmwANAJwAnQCeAJ8AoAChAAAAAAAQAAAAqAkIBQABAQMCAwQFAwMEAgQCBQQCAwMDAwQDAgQCAgMEAwIGAwgFBAQEBAIEBAMGBQQEBQQCAwMEBgUEAwICAgQDBgQEAgQFAgQEAgYEAwQEBAICAwMGBQQDAwMFAgICBgYGBgYGCAgEBAQCAgIFBAQEBAQEAwMDAwMEBAQEBAQHBgQEBAICAgQDAwMDAwMDAwMDCAYCAgICAgIBAgIEAgICBgUBBQUAAAoJBQABAQMCBAUGAwMFAgQCBQUCBAMDBAUDAgQCAgMEAwMHAwkGBAQFBAIEBAMHBgUEBgQCBAQEBwUEAwICAwUDBwUEAgUGAgQEAgYFAwUFBQICAwMGBQQDAwMGAwIDBwcHBwcHCQkEBAQCAgIGBQUFBQUFBAQEBAMFBQUFBQUIBwQEBAICAgUDAwMDAwQDAwMDCAcDAwICAgIBAgIEAgICBwUBBQUAAAsKBgACAgQCBAUGAwMFAgQCBgUDBAQEBAUEAwUDAgMEAwMIAwoGBQUFBQIEBQMHBgUEBgUDBAQECAYFAwIDAwUDCAUFAwUGAgQEAgcFBAUFBQMDAwMHBgUDBAQGAwIDCAgICAgICQoFBQUCAgIGBQUFBQUFBAQEBAMFBQUFBQUJCAUFBQICAgUEBAQEBAQDAwMDCQgDAwICAwIBAgIEAgICBwYBBgYAAAwLBgACAgQDBAYHBAQGAgUDBgYDBQQEBAUEAwUDAwQFBAMIAwsHBQUFBQIFBQQIBwYFBwUDBQUFCAYFAwMDAwYDCQYFAwUHAgUFAggGBAYGBgMDBAQHBgUDBAQHAwMDCAgICAgICgsFBQUCAgIHBgYGBgYGBQUFBQMGBgYGBgYJCQUFBQICAgYEBAQEBAQEBAQECggDAwMDAwIBAwMFAwMDCAYBBgYAAA0MBwACAgQDBQYHBAQGAwUDBwYDBQQFBQYEAwYDAwQFBAMJBAwIBgYGBQMFBgQJBwYFCAUDBQUFCQcFBAMDAwYECQYGAwYIAwUFAggGBQYGBgMDBAQIBwYEBAQHAwMDCQkJCQkJCwwGBgYDAwMHBgYGBgYGBQUFBQQGBgYGBgYKCQYGBgMDAwYFBQUFBQUEBAQECwkDAwMDAwIBAwMFAwMDCQcCBwcAAA4NBwACAgUDBQcIBAQHAwUDBwcDBQUFBQYFAwYDAwQFBAQKBAwIBgYGBgMGBgQJCAcGCAYDBQUGCggGBAMDBAcECgcGAwYIAwYGAwkHBQcHBwMDBAQJBwYEBQUIBAMECgoKCgoKDA0GBgYDAwMIBwcHBwcHBQUFBQQHBwcHBwcLCgYGBgMDAwcFBQUFBQUEBAQEDAoEBAMDAwMBAwMGAwMDCQcCBwcAAA8OCAACAgUDBgcIBQUHAwYDCAcDBgUFBQcFBAcEAwUGBQQLBA0JBwcHBgMGBwUKCAcGCQYEBgYGCggGBAMEBAcECwcHBAcJAwYGAwkHBQcHBwQDBQUJCAYEBQUJBAMECwsLCwsLDQ4HBwcDAwMIBwcHBwcHBgYGBgQHBwcHBwcMCwcHBwMDAwcFBQUFBQUFBQUFDQoEBAMDBAMCAwMGAwMDCggCCAgAABAPCAACAgUEBggJBQUIAwYECAgEBgUGBgcFBAcEBAUGBQQLBQ4JBwcHBwMGBwULCQgGCQcEBgYGCwkHBAQEBAgFCwgHBAcJAwcGAwoHBggIBwQEBQUKCAcEBQUJBAMECwsLCwsLDg8HBwcDAwMJCAgICAgIBgYGBgUICAgICAgNCwcHBwMDAwcGBgYGBgYFBQUFDgsEBAQEBAMCAwMGBAQECwgCCAgAABEQCQACAgYEBggJBQUIAwcECQgEBwYGBggGBAcEBAUHBQUMBQ8KBwcIBwMHCAULCggHCgcEBgYHDAkHBQQEBAgFDAgHBAgKAwcHAwsIBggICAQEBQUKCQcFBgYKBAQFDAwMDAwMDxAHCAcDAwMKCAgICAgIBgYGBgUICAgICAgNDAcHBwMDAwgGBgYGBgYFBQUFDgwFBQQEBAMCBAQHBAQECwkCCQkAABIQCQADAwYEBwkKBgYJBAcECQkEBwYGBggGBAgEBAYHBgUNBRAKCAgICAQHCAUMCgkHCwcEBwcHDQoIBQQEBQkFDQkIBAgKBAcHAwsIBgkJCAQEBQYLCQgFBgYKBQQFDQ0NDQ0NDxAICAgEBAQKCQkJCQkJBwcHBwUJCQkJCQkODQgICAQEBAgGBgYGBgYFBQUFDwwFBQQEBAMCBAQHBAQEDAkCCQkAABMRCgADAwYEBwkLBgYJBAcECgkEBwYHBwkGBAgFBAYHBgUNBhELCAgJCAQICAYNCwkICwgEBwcIDQoIBQQFBQkFDQkIBAkLBAgIBAwJBwkJCQQEBgYMCggFBgYLBQQFDQ0NDQ0NEBEICAgEBAQLCQkJCQkJBwcHBwUJCQkJCQkPDQgICAQEBAkHBwcHBwcGBgYGEA0FBQQEBQQCBAQIBAQEDQoCCgoAABQSCgADAwcEBwoLBgYKBAgECgoFCAcHBwkHBQkFBAYIBgUOBhIMCQkJCAQICQYNCwoIDAgFCAgIDgsIBgUFBQoGDgoJBQkMBAgIBA0JBwoKCQUFBgYMCgkGBwcLBQQFDg4ODg4OERIJCQkEBAQLCgoKCgoKCAgICAYKCgoKCgoQDgkJCQQEBAkHBwcHBwcGBgYGEQ4FBQUFBQQCBAQIBQUEDgoCCgoAABUTCwADAwcFCAoMBgYKBAgFCwoFCAcHBwoHBQkFBQYIBgYPBhMMCQkJCQQJCQYODAoIDAkFCAgIDwsJBgUFBQoGDwoJBQoMBAkIBA0KBwoKCgUFBgcNCwkGBwcMBQQGDw8PDw8PEhMJCQkEBAQMCgoKCgoKCAgICAYKCgoKCgoRDwkJCQQEBAoHBwcHBwcGBgYGEg4GBgUFBQQCBAQIBQUFDgsDCwsAABYUCwADAwcFCAsMBwcLBAkFCwoFCAcICAoHBQoFBQcJBwYPBhQNCgoKCQQJCgcPDAoJDQkFCAgJDwwJBgUFBgsGEAsKBQoNBAkJBA4KCAsLCgUFBwcOCwkGBwcNBgUGDw8PDw8PExQKCgoEBAQMCgoKCgoLCAgICAYLCwsLCwsREAoKCgQEBAoICAgICAgHBwcHEw8GBgUFBQQCBQUJBQUFDwsDCwsAABcVDAADAwcFCQsNBwcLBQkFDAsFCQcICAsIBQoGBQcJBwYQBxQNCgoKCgUJCgcPDQsJDQoFCQkJEAwKBgUGBgsHEAsKBQoNBQkJBA4LCAsLCwUFBwcODAoGBwgNBgUGEBAQEBAQFBUKCgoFBQUNCwsLCwsLCQkJCQcLCwsLCwsSEAoKCgUFBQsICAgICAgHBwcHFBAGBgUFBgQCBQUJBQUFEAwDDAwAABgWDAADAwgFCQwNBwcMBQkFDAsGCQgICAsIBgoGBQcJBwYRBxUOCgoLCgUKCwcQDgsKDgoGCQkKEQ0KBwUGBgsHEQwKBgsOBQoKBA8LCAwMCwYGBwgPDAoHCAgOBgUGERERERERFRYKCwoFBQUOCwsLCwsMCQkJCQcLCwsLCwsTEQoKCgUFBQsICAgICAgHBwcHFBEGBgUFBgQCBQUKBQUFEAwDDAwAAAABAV0BkAAFAAICvAKKAAAAjwK8AooAAAHFADIBAwAAAAAEAAAAAAAAAAAAAAMAAAAAAAAAAAAAAABNQUNSAEAAICIZAyH/OQAAAyEAxwAAAAEAAAAAAAAAAQAAgAAAAACLAT8AAGAAAbQCdVlva2ttb2trICAgICAgICD/////N////llPS1IwMAAAAAAAAAABAAAAAQAAmJpL9V8PPPUAAAPoAAAAALfnFZIAAAAAt+cVkv+2/zkDawMhAAAAAwACAAEAAAAAAAEAAAMh/zkAAAOQ/7b/uANrAAEAAAAAAAAAAAAAAAAAAACkAAEAAACkAJgADQAAAAAAAgAIAEAACgAAAF0AvgABAAE=");
			background-color: darkslategrey;
			color: white;
			font-size:62.5%; 
//			font-family: yokkmokkOT;
			font-size: 38pt;
			}

		</style>



<!-- <script type="text/javascript" src="html5pano.js" ></script> -->
<script id="script_panoview" type="text/javascript"  >

/*
Copyright (c) 2010, Martin Wengenmayer ( www.cheetah3d.com )
All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are 
permitted provided that the following conditions are met:

-Redistributions of source code must retain the above copyright notice, this list of 
conditions and the following disclaimer. 

-Redistributions in binary form must reproduce the above copyright notice, this list 
of conditions and the following disclaimer in the documentation and/or other materials 
provided with the distribution. 

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS 
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 
AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
POSSIBILITY OF SUCH DAMAGE.
*/

const 	FPS = 30;
const	DEG2RAD=Math.PI/180.0;

//Canvas to which to draw the panorama
var		pano_canvas=null;
 
//Event state
var		mouseIsDown=false;
var		mouseDownPosLastX=0;
var		mouseDownPosLastY=0;
var		displayInfo=false;
var		highquality=true;

//Camera state
var		cam_heading=90.0;
var		cam_pitch=90.0;
var 	cam_fov=90;

//Load image 
		var pnid=19;
		var img_buffer=null;
		var img = new Image();

		var j=0;

				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||558953|Jun|6|21:56|2018|./pn/imgs/pano_creek5.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||4100818|Dec|7||2008|./pn/imgs/pano_burmuda.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||18936775|Apr|6|1:25|2018|./pn/imgs/PIA22313_pano.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||1892489|Mar|27|11:50|2018|./pn/imgs/Sol83-PremiersGivres-pano.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||49100075|Feb|10|13:13|2018|./pn/imgs/Taipo_pano.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||1920795|Nov|23||2017|./pn/imgs/Opportunity-Mars-Rover-Lander-pia19112.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||17090384|Nov|23||2017|./pn/imgs/mars-rover-opportunity-pia19111_Sol3902B_Cape_Tribulation_L2R2ana.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||20422151|Nov|23||2017|./pn/imgs/mars-rover-opportunity-pia19110_Sol3902B_Cape_Tribulation_L257F.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||18009851|Jul|17||2017|./pn/imgs/mars-gale-crater-panorama-pia11241-full.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||1869852|Jan|21||2017|./pn/imgs/opportunity-panorama-warton-ridge-enhanced-pia20850-full.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||13323398|Jan|21||2017|./pn/imgs/mars-panoramic-mt-sharp-rover-curiosity-pia19662.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||595490|Sep|28||2009|./pn/imgs/pano_jtf_entrance_jtf.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||726437|Jun|7||2008|./pn/imgs/pano_jtf_entrance.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||1031370|Jun|1||2007|./pn/imgs/pano_fork_grass.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||583043|Jun|1||2007|./pn/imgs/pano_jtfarms_entrance_9700x100.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||559318|Jun|1||2007|./pn/imgs/pano_backyard_all.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||249208|Jun|1||2007|./pn/imgs/pano_jtfarms_enter_hi.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||316986|May|13||2007|./pn/imgs/pano_falls.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||1046328|May|13||2007|./pn/imgs/pano_falls1_4000.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||282735|May|13||2007|./pn/imgs/pano_courtyard2.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||127540|May|13||2007|./pn/imgs/pano_courtyard1.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||171929|May|12||2007|./pn/imgs/pano_closeline.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||470566|May|12||2007|./pn/imgs/pano_falls_south.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||386103|May|12||2007|./pn/imgs/pano_falls_north.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||992548|May|12||2007|./pn/imgs/pano_falls_015-285.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||505577|May|11||2007|./pn/imgs/pano_creek.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||100790|May|10||2007|./pn/imgs/yard.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||154451|May|10||2007|./pn/imgs/veneer.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||81569|May|10||2007|./pn/imgs/sphere.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||80726|May|10||2007|./pn/imgs/pano.jpg";

		var z=0;
<!--
	-->

	function script_pnlist_csv_load() {
		var j=0;
		pnlist_csv[j++] = "recno,appcode,status,dttm,pathfile,path,base,file,ext,filsiz,ctime,desc1,status,index,2018-06-23_09:17:29,./pn/imgs/mars-gale-crater-panorama-pia11241-full.jpg,./pn/imgs,mars-gale-crater-panorama-pia11241-full.jpg,mars-gale-crater-panorama-pia11241-full,.jpg,18009851,2017-07-17_07:37:49,";
		pnlist_csv[j++] = "30,status,index,2018-06-23_09:17:56,./pn/imgs/yard.jpg,./pn/imgs,yard.jpg,yard,.jpg,100790,2007-05-10_20:35:18,";
		return( pnlist_csv );
		}

	function script_pnlist_load() {
		var z=0;


			return(pnlist);
			}


		img.onload = imageLoaded;

		var idx_default = 19;
		var idx = idx_default;
		var pano_img = "";
		var pano_tn = "";
		var pnid = "";
		var url_args = "";
		var pano_paths = new Array();
		var pano_paths_len = 0;
		var psv_len = pnlist_psv.length;
		var url_search = url.search;
		var base = "base";
		var path = "path";
		if( url.search != "" ) {
			url_args = url_search.split( "&" );
			idx = url_args[1].split( "=" )[1];
			pnid = url_args[2].split( "=" )[1];
			}
		pano_img = pnlist_psv[idx].split("|")[12];
//		alert( "BUGS_1400 idx="+idx+"  pano_img="+pano_img+"  url_search="+url_search );

		pano_paths = pano_img.split("/");
		pano_paths_len = pano_paths.length;
//		alert( "BUGS_1550 pano_paths_len="+pano_paths_len+"  path="+path+'  base="+base );
//		base = pano_paths[ pano_paths_len -1];
//		path = pano_img.replace("base","");
//		alert( "BUGS_1550 pano_img="+pano_img+"  path="+path+'  base="+base );

		
//		pano_tn = pano_img;
//		pano_id = pano_img;
//		alert( "BUGS_1441 len="+psv_len+"  psv="+pnlist_psv[psv_len-1] );

// 		img.src = './pn/imgs/pano_falls.jpg';
// 		img.src = './pn/imgs/pano_jtf_sky.jpg';
// 		img.src = './pn/imgs/pano_falls1_4000.jpg';
// 		img.src = './pn/imgs/pano_falls_north.jpg';
//		alert( "BUGS_1420 idx="+idx+" psv_len="+psv_len+"  pano_img="+pano_img+" url_search="+url_search );

		img.src = pano_img;
//		alert( "BUGS_1421 idx="+idx+"  pano_img="+pano_img );

//		img.src = pnlist_psv[idx].split("|")[13];
// 		img.src = './pn/imgs/pano_falls_south.jpg';
// 		img.src = './pn/imgs/pano_jtf_entrance.jpg';
// 		img.src = './pn/imgs/pano_courtyard1_12b.jpg';		

//		var idx=4;
//		alert( "BUGS_100 url.search="+url.search );
		if( url.search != "" ) {
			var urlarg_q = url.search.split('&')[0];
			var urlarg_id = url.search.split('&')[1];
			var urlarg_pnid = url.search.split('&')[2];
			var id = urlarg_id.split('=')[1];
			}

//		alert( "BUGS_1488 urlarg_id="+urlarg_id );
//		alert( "BUGS_1489 id="+id );
//		var filnam_psv =	pnlist_psv[id].split('|')[ pnlist_psv[id].split('|').length -1 ];
//		script_pnlist();


		var pano_img = pnlist_psv[idx].split("|")[12];
//		alert( "BUGS_1444 idx="+idx+" url_search="+url.search );
		img.src = pano_img;
//		alert( "BUGS_1445 idx="+idx+" pano_img="+pano_img );

//		img.src = './pn/imgs/pano_falls1_4000.jpg';		
//		img.src = pnlist_psv[idx].split("|")[12];
//		img.src = pnlist[id];
//		img.src = pnlist_psv[id];
//		img.src = filnam;
//		img.src = pnlist_psv[id].split('|')[ pnlist_psv[id].split('|').length -1 ];


function init_pano(canvasid){
//get canvas and set up call backs
	pano_canvas = document.getElementById('canvas');
	pano_canvas.onmousedown = mouseDown;
	window.onmousemove = mouseMove;
	window.onmouseup = mouseUp;
	window.onmousewheel = mouseScroll;
	window.onkeydown = keyDown;
	draw();

//	setInterval(draw, 1000/FPS);
	}
	
function imageLoaded(){
	var   buffer = document.createElement("canvas");
	var   buffer_ctx = buffer.getContext ("2d");
	
	//set buffer size
	buffer.width = img.width;
	buffer.height = img.height;
 	
 	//draw image
	buffer_ctx.drawImage(img,0,0);
 		
 	//get pixels
 	var buffer_imgdata = buffer_ctx.getImageData(0, 0,buffer.width,buffer.height);
 	var buffer_pixels = buffer_imgdata.data;
 		
 	//convert imgdata to float image buffer
 	img_buffer = new Array(img.width*img.height*3);
 	for(var i=0,j=0;i<buffer_pixels.length;i+=4, j+=3){
		img_buffer[j] 	= buffer_pixels[i];
		img_buffer[j+1] = buffer_pixels[i+1];
		img_buffer[j+2] = buffer_pixels[i+2];
 		}
	}


function mouseDown(e){
	mouseIsDown=true;
	mouseDownPosLastX=e.clientX;
	mouseDownPosLastY=e.clientY;	
}

function mouseMove(e){
	if(mouseIsDown==true){
		cam_heading-=(e.clientX-mouseDownPosLastX);
		cam_pitch+=0.5*(e.clientY-mouseDownPosLastY);
		cam_pitch=Math.min(180,Math.max(0,cam_pitch));
		mouseDownPosLastX=e.clientX;
		mouseDownPosLastY=e.clientY;	
		draw();
		}
}

function mouseUp(e){
	mouseIsDown=false;
	draw();
}

function mouseScroll(e){
	cam_fov+=e.wheelDelta/120;
	cam_fov=Math.min(90,Math.max(30,cam_fov));
	draw();
}

function keyDown(e){
	if(e.keyCode==73){	//i==73 Info
		displayInfo = !displayInfo;
		draw();
		}
}

function renderPanorama(canvas){
	if(canvas!=null && img_buffer!=null){
		var ctx = canvas.getContext("2d");
		var imgdata = ctx.getImageData(0, 0,canvas.width,canvas.height);
		var pixels = imgdata.data;
	
		var src_width=img.width;
		var src_height=img.height;
		var dest_width=canvas.width;
		var dest_height=canvas.height;
		
		//calculate camera plane
		var theta_fac=src_height/Math.PI;
		var phi_fac=src_width*0.5/Math.PI
		var ratioUp=2.0*Math.tan(cam_fov*DEG2RAD/2.0);
		var ratioRight=ratioUp*1.33;
		var camDirX=Math.sin(cam_pitch*DEG2RAD)*Math.sin(cam_heading*DEG2RAD);
		var camDirY=Math.cos(cam_pitch*DEG2RAD);
		var camDirZ=Math.sin(cam_pitch*DEG2RAD)*Math.cos(cam_heading*DEG2RAD);
		var camUpX=ratioUp*Math.sin((cam_pitch-90.0)*DEG2RAD)*Math.sin(cam_heading*DEG2RAD);
		var camUpY=ratioUp*Math.cos((cam_pitch-90.0)*DEG2RAD);
		var camUpZ=ratioUp*Math.sin((cam_pitch-90.0)*DEG2RAD)*Math.cos(cam_heading*DEG2RAD);
		var camRightX=ratioRight*Math.sin((cam_heading-90.0)*DEG2RAD);
		var camRightY=0.0;
		var camRightZ=ratioRight*Math.cos((cam_heading-90.0)*DEG2RAD);
		var camPlaneOriginX=camDirX + 0.5*camUpX - 0.5*camRightX;
		var camPlaneOriginY=camDirY + 0.5*camUpY - 0.5*camRightY;
		var camPlaneOriginZ=camDirZ + 0.5*camUpZ - 0.5*camRightZ;
		
		//render image
		var	i,j;
		for(i=0;i<dest_height;i++){
			for(j=0;j<dest_width;j++){
				var	fx=j/dest_width;
				var	fy=i/dest_height;
				
				var	rayX=camPlaneOriginX + fx*camRightX - fy*camUpX;
				var	rayY=camPlaneOriginY + fx*camRightY - fy*camUpY;
				var	rayZ=camPlaneOriginZ + fx*camRightZ - fy*camUpZ;
				var	rayNorm=1.0/Math.sqrt(rayX*rayX + rayY*rayY + rayZ*rayZ);
				
				var	theta=Math.acos(rayY*rayNorm);
    			var	phi=Math.atan2(rayZ,rayX) + Math.PI;
    			var	theta_i=Math.floor(theta_fac*theta);
    			var	phi_i=Math.floor(phi_fac*phi);
    			
    			var	dest_offset=4*(i*dest_width+j);
				var	src_offset=3*(theta_i*src_width + phi_i);
				
				pixels[dest_offset]     = img_buffer[src_offset];
				pixels[dest_offset+1]   = img_buffer[src_offset+1];
				pixels[dest_offset+2]   = img_buffer[src_offset+2];
				//pixels[dest_offset+3] = img_buffer[src_offset+3];
				}
			}
 		
 		//upload image data
 		ctx.putImageData(imgdata, 0, 0);
	}
}


function drawRoundedRect(ctx,ox,oy,w,h,radius){
	ctx.beginPath();
	ctx.moveTo(ox + radius,oy);
	ctx.lineTo(ox + w - radius,oy);
	ctx.arc(ox +w-radius,oy+ radius, radius,-Math.PI/2,0, false);
	ctx.lineTo(ox + w,oy + h - radius);
	ctx.arc(ox +w-radius,oy + h - radius, radius,0,Math.PI/2, false);
	ctx.lineTo(ox + radius,oy + h);
	ctx.arc(ox + radius,oy + h - radius, radius,Math.PI/2,Math.PI, false);
	ctx.lineTo(ox,oy + radius);
	ctx.arc(ox + radius,oy + radius, radius,Math.PI,3*Math.PI/2, false);
	ctx.fill();	
}


function draw(){
    if(pano_canvas!=null && pano_canvas.getContext!=null){
    	var ctx = pano_canvas.getContext("2d");
    	
    	//clear canvas
    	ctx.fillStyle = "rgba(0, 0, 0, 1)";
    	ctx.fillRect(0,0,pano_canvas.width,pano_canvas.height);
			
		//render paromana direct
		var startTime = new Date();
			renderPanorama(pano_canvas);
		var endTime = new Date();
		
		//draw info text
		if(displayInfo==true){	
			ctx.fillStyle = "rgba(255,255,255,0.75)";
			drawRoundedRect(ctx,20,pano_canvas.height-60-20,180,60,7);
			
			ctx.fillStyle = "rgba(0, 0, 0, 1)";
			ctx.font="10pt helvetica";
			ctx.fillText("Canvas = " +  pano_canvas.width + "x" + pano_canvas.height,30,pano_canvas.height-60);
			ctx.fillText("Image size = " + img.width + "x" + img.height,30,pano_canvas.height-45);
			ctx.fillText("FPS = " + (1000.0/(endTime.getTime()-startTime.getTime())).toFixed(1),30,pano_canvas.height-30);
			}
    	}
   }
   
     


		</script>


	<div align="center"> <br>		
		<br>		
		<h1>panorama viewer</h1>		</div>


	<div id="canvas_pn" align="center">
		<br>
		<br>
<!--		<canvas id="canvas" width="640" height="480"> -->
		<canvas id="canvas" width="1000" height="600">
        		<p>unauthorized access logged</p>			
			</canvas> 

		<br>
		======== pano ========
		</div>


	<div style="padding:50px;" align="left">

<!--      
		<h2>Description</h2>      Experimental HTML5 panorama viewer using the new HTLM5 canvas element.      This script displays equirectangular (360x180) panoramas. So just one      image is necessary to display a complete 360x180 panorama.      <h2>Purpose</h2>      I mainly was curious how fast equirectangular panorama image can be      displayed with a HTML5 canvas. So the script isn't cleaned up very well,      but it gave me at least an idea that it is possible. On my an Intel Core      i7 CPU I get more than 20 frames per second. That is of course not very      fast but usable. And the best of all it doesn't require any Plug-Ins :)      <h2>Navigation</h2>      <ul>        <li>Left/Right Mouse drag: Changes camera heading. </li>        <li>Up/Sown Mouse drag: Changes camera pitch. </li>        <li>Scroll wheel: Changes camera field of view. </li>        <li>I-Key: Displays Info panel with canvas size, image size and FPS. </li>      </ul>      <h2>Requirements</h2>      I've tested this HTML5 panorama script with the latest versions of Safari,      Firefox and Chrome on Mac OS X. But it should also run on other platforms      supporting HTML5. <br>      <br>      <h2>License</h2>      The html5pano.js script is released under the Simplified BSD License.      Please see comments within the script.<br>      <br>      <h2>Dowload</h2>      Please use the following link to download the script including a sample      panorama image. <br>      <br>      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;      &nbsp;&nbsp;&nbsp; <a href="http://www.cheetah3d.com/download/HTML5pano/HTML5pano.zip">http://www.cheetah3d.com/download/HTML5pano/HTML5pano.zip</a><br>      <br>      <br>      <br>      <br>

		<a href="http://cheetah3d.com">17.Aug.2010, Martin Wengenmayer</a> 
	-->
		</div>



	<label for="input_pano">pano: </label>
	<input id="input_pano" list="panos" name="panos" type="text" />
		<datalist id="panos">
			<option value="1-pano">
			<option value="2-pano_closeline">
			<option value="3-pano_courtyard1">
			<option value="4-pano_courtyard1_12b">
			<option value="5-pano_courtyard1a">
			<option value="6-pano_courtyard2">
			<option value="7-pano_creek">
			<option value="8-pano_creek5">
			<option value="9-pano_falls">
			<option value="10-pano_falls1_4000">
			<option value="11-pano_falls_015-285">
			<option value="12-pano_falls_north">
			<option value="13-pano_falls_south">
			<option value="14-pano_jtf_entrance">
			<option value="15-pano_jtf_entrance_jtf">
			<option value="16-pano_jtf_sky">
			<option value="17-sphere">
			<option value="18-veneer">
			<option value="19-yard">
			<option value="jakwii3">
			<option value="timejack">
			<option value="pano">
			<option value="courtyard">
			<option value="closeline">
			<option value="jkwii">
			<option value="jakwii1">
			<option value="jakwii2">
			<option value="skwii">
			</datalist>

	&nbsp &nbsp &nbsp &nbsp

	<label for="input_choctype">chocolates</label>
		<input id="input_choctype" list="choctypes" type="text">
		<datalist id="choctypes">
			<option value="white" />
			<option value="milk" />
			<option value="dark" />
			<option value="semisweet" />
			<option value="herseys" />
			</datalist>


	<hr color=black>
	<hr color=white>


	<div id="div_show_pn-imgs-jpg" hidden >
		<a href=index_pn.html?q=pn&idx=0 id="0-pano-.jpg" target=_blank >
			<img name="pano" src=./pn/imgs/tn/tn_pano.png border=0>
			</a>

		<a href=?q=pn&idx=2-pano_closeline-.jpg id="2-pano_closeline-.jpg" target=_blank >
			<img name="pano" src=./pn/imgs/tn/tn_pano_closeline.png border=0>
			</a>

		<a href=?q=pn&idx=3-pano_courtyard1-.jpg id="3-pano_courtyard1-.jpg" target=_blank >
			<img name="pano" src=./pn/imgs/tn/tn_pano_courtyard1.png border=0>
			</a>

		</div>
			

	<hr color=white>
	<hr color=black>

	<button type="button" onclick="script_pnlist()">script_pnlist</button>
	<button type="button" onclick="addChild_pn()">addChild_pn</button>
	<button type="button" onclick="addChild()">addChild</button>


	<hr color=black>
	<hr color=white>

	<script > function imgWindow() {window.open("image") } </script>

	
	<img src="./imgs/btn/koeye.png" height="50" size="150" alt="koeye" onclick="script_pnlist()"> 
	<img src="./imgs/btn/koeyeb.png" height="50" size="150" alt="koeyeb" onclick="addChild_pn()"> 
	<img src="./imgs/btn/koeyew.png" height="50" size="150" alt="koeyew" onclick="addChild()"> 

	<div id="div_pnlist">
		<h1>div_pnlist</h1>
		<p>Child_pn 1</p>
		</div>

	<div id="div_addchild">
		<p>Child 1</p>
		</div>

	<div id="div_addchild_pn" >
		<h1>div_addchild_pn</h1>
		addchild_pn <br>
		</div>


		<script id="script_pnlist" >
//			function script_pnlist_hover() {body { background-color: blue; }}

//			var pnlist_psv = new Array();
			function script_pnlist_psv_load() {
				var j=0;

				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||558953|Jun|6|21:56|2018|./pn/imgs/pano_creek5.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||4100818|Dec|7||2008|./pn/imgs/pano_burmuda.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||18936775|Apr|6|1:25|2018|./pn/imgs/PIA22313_pano.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||1892489|Mar|27|11:50|2018|./pn/imgs/Sol83-PremiersGivres-pano.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||49100075|Feb|10|13:13|2018|./pn/imgs/Taipo_pano.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||1920795|Nov|23||2017|./pn/imgs/Opportunity-Mars-Rover-Lander-pia19112.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||17090384|Nov|23||2017|./pn/imgs/mars-rover-opportunity-pia19111_Sol3902B_Cape_Tribulation_L2R2ana.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||20422151|Nov|23||2017|./pn/imgs/mars-rover-opportunity-pia19110_Sol3902B_Cape_Tribulation_L257F.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||18009851|Jul|17||2017|./pn/imgs/mars-gale-crater-panorama-pia11241-full.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||1869852|Jan|21||2017|./pn/imgs/opportunity-panorama-warton-ridge-enhanced-pia20850-full.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||13323398|Jan|21||2017|./pn/imgs/mars-panoramic-mt-sharp-rover-curiosity-pia19662.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||595490|Sep|28||2009|./pn/imgs/pano_jtf_entrance_jtf.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||726437|Jun|7||2008|./pn/imgs/pano_jtf_entrance.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||1031370|Jun|1||2007|./pn/imgs/pano_fork_grass.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||583043|Jun|1||2007|./pn/imgs/pano_jtfarms_entrance_9700x100.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||559318|Jun|1||2007|./pn/imgs/pano_backyard_all.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||249208|Jun|1||2007|./pn/imgs/pano_jtfarms_enter_hi.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||316986|May|13||2007|./pn/imgs/pano_falls.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||1046328|May|13||2007|./pn/imgs/pano_falls1_4000.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||282735|May|13||2007|./pn/imgs/pano_courtyard2.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||127540|May|13||2007|./pn/imgs/pano_courtyard1.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||171929|May|12||2007|./pn/imgs/pano_closeline.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||470566|May|12||2007|./pn/imgs/pano_falls_south.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||386103|May|12||2007|./pn/imgs/pano_falls_north.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||992548|May|12||2007|./pn/imgs/pano_falls_015-285.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||505577|May|11||2007|./pn/imgs/pano_creek.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||100790|May|10||2007|./pn/imgs/yard.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||154451|May|10||2007|./pn/imgs/veneer.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||81569|May|10||2007|./pn/imgs/sphere.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||80726|May|10||2007|./pn/imgs/pano.jpg"		;
				return( pnlist_psv );
				}


//			var pnlist = new Array();
			function script_pnlist_load() {
				var z=0;
<!--
	-->

//				z--;
//				alert( "BUGS_load pnlist("+z+")="+pnlist[z] + " len="+pnlist.length );
//				document.write( "pnlist_lost pnlist_length="+pnlist.length+" z="+z );
					return(pnlist);
					}

			function script_pnlist_show() {
				var z = 0; var pnout=""; var len=pnlist.length;
				var pnid = ""; var pnurl = ""; 
				var pnlist_psv = script_pnlist_psv_load();
//				var pnlist_csv = script_pnlist_csv_load();
				var len_psv = pnlist_psv.length;
//				var len_csv = pnlist_csv.length;
				var nf = 0;
//				alert( "bugs_1924 script_pnlist_show IN len_psv="+len_psv );
//				alert( "BUGS_1925 pnlist_psv10="+pnlist_psv[10] );
//				alert( "BUGS_1925 pnlist_psv30="+pnlist_psv[30] );
//				alert( "bugs_1764 script_pnlist_show IN len_csv="+len_csv );
				var pano_img = "";
				var pano_tn = "";
				var pano_id = "";
				var idx = 0;


//				for( z=0; z< pnlist.length; z++ ) {
				for( z=0; z< pnlist_psv.length; z++ ) {
					pano_img = pnlist_psv[z].split("|")[12];
//					alert( "BUGS_1953 z="+z+" pnlist_psv="+pnlist_psv[z] );

					var basename = pano_img.replace(/^.*[\\\/]/, '');
					var basepath = pano_img.replace( basename, "" );
					var pnid = pano_img;
					pnid = pnid.replace( '/',"-" );
					pnid = pnid.replace(/.jpg/,"" );
					pnid = pnid.replace(/^-/,"" );
					pano_tn = basepath+"tn/tn_"+basename;
//					pano_tn = pano_tn.replace( ".jpg", ".png" );
//					alert( "BUGS_1900 pano_tn="+pano_tn+"  idx="+z );

					nf = pnlist_psv[z].split('|').length -1;
//					alert( "BUGS_1960 z="+z+" nf="+nf+" pano_img="+pano_img );
//					alert( "BUGS_1961 z="+z+" nf="+nf+" basename="+basename );
//					alert( "BUGS_1962 z="+z+" nf="+nf+" basepath="+basepath );
//					alert( "BUGS_1945 z="+z+" nf="+nf+" pano_tn="+pano_tn );
//					alert( "BUGS_1945 z="+z+" nf="+nf+" pnid="+pnid );

//					pnout += "<h1><b>pnlist_"+z+"</b><h1>";
					pnout += "<a href='./index_pn.html?q=pn&idx="+z+"&pnid="+pnid+"' target=_blank>";
					pnout += "	<img name='" + pnid + "' src='"+pano_tn+"' border=0 height=100 >\n";
					pnout += "	</a>";
					pnout += "<a href='./index_pn.html?q=img&idx="+z+"&pnid="+pnid+"' target=_blank>";
					pnout += "	<img name='" + pano_tn + "' height=25 src='"+pano_tn+"' border=0 height=100 >\n";
					pnout += "	</a>";
//					alert( "bugs_1923 pano_img=" + pano_img );
					}
//				document.write( "bugs435 pnout=" + pnout );
//				alert( "BUGS432_show pnlist("+len+")="+pnlist[z] + " len="+pnlist.length );
//	 			document.getElementById('div_pnlist').innerHTML += pnout;
				var parent = document.getElementById('div_pnlist');
				parent.insertAdjacentHTML('beforeend', pnout);
				}

			function script_pnlist() {
				script_pnlist_load();
				script_pnlist_psv_load();
				script_pnlist_tn_load();
//				alert( "bugs_1840: script_pnlist len="+pnlist.length );
//				alert( "bugs_1841: script_pnlist_psv len="+pnlist_psv.length );
//				alert( "bugs_1842: script_pnlist_tn len="+pnlist_tn.length );
				script_pnlist_show();
				}
			function script_pn_view( idx ) {
				alert( "BUGS_1890 script_pn_view idx="+idx );
				document.write( "script_pn_view idx="+idx );
				}
			</script>

	<script id='script_load_pnlist_tn' >
//		var pnlist_tn = new array();
		function script_pnlist_tn_load() {
			var j=0;
			return(pnlist_tn);
			}
//		pnlist_tn = script_pnlist_tn_load();
	</script>


HTML_PN;
	return($html_pn);
	}

function html_cfaa_tl() {
	$html_cfaa=<<<HTML_CFAA
	<script id="script_cfaa">
		var text_cfaa = 
`
pqpqpqpqpqpqpqpqpqpq Warning pqpqpqpqpqpqpqpqpqpq<br>
<br>
This site may be protected under the 
<br>
<br>
<b>CFAA</b> 
<br>
Computer Fraud and Abuse Act 
<br>
<br>
your attemped access has been logged 
<br>
repeated attemps by unauthorized guests will be reported 
<br>
<br>
By continuing You are acknowledging 
<br>
you are fully authorized and 
<br>
understand the responsibilites to access the content on the site 
<br>
<br>
This page must not be removed 
<br>
bdbdbdbdbdbdbdbdbdbd Warning bdbdbdbdbdbdbdbdbdbd
<br>
<br>
unauthoriced users should
<br>
consider browsing elsewhere: 


<hr color=black>
<hr color=ivory>
<hr color=red>
<hr color=blue>
<hr color=ebony>
<hr color=white>

<a href=duckduckgo.com > <img src="ok.png" alt="duckduckgo" height=10 border=0></a>
&nbsp &nbsp &nbsp
<a href=bing.com > <img src="ok.png" alt="bing" height=10 border=0></a>
&nbsp &nbsp &nbsp
<a href=google.com > <img src="ok.png" alt="google" height=10 border=0></a>
&nbsp &nbsp &nbsp
<a href=yahoo.com > <img src="ok.png" alt="yahoo" height=10 border=0></a>
&nbsp &nbsp &nbsp
	<a href=https://mars.jpl.nasa.gov/msl/multimedia/raw target=_blank>
		<img src="ok.png" border=0 height=10>
		</a>
&nbsp &nbsp &nbsp
	<a href=http://youtube.com target=_blank>
		<img src="ok.png" border=0 height=10>
		</a>

HTML_CFAA;
	return( $html_cfaa );
	}



function html_sl() {
	$html_sl=<<<HTML_SL
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />


	<title>index_sl.html 20180521_1200</title>
	<style type="text/css">
<!--
		html,body{height:100%}
		body {margin:0; padding:0; background:#333 url(sw_page_bg.png); overflow:hidden; font-family:Helvetica, Arial, sans-serif; font-size:16px;}
		/* custom fonts */
		@font-face {
			font-family: 'eurof55-webfont';
			src: url('fonts/eurof55-webfont.eot');
			src: local('☺'), url('fonts/eurof55-webfont.woff') format('woff'), url('fonts/eurof55-webfont.ttf') format('truetype'), url('fonts/eurof55-webfont.svg#webfont8xigBfG2') format('svg');
		}
		@font-face {
			font-family: 'eurof35-webfont';
			src: url('fonts/eurof35-webfont.eot');
			src: local('☺'), url('fonts/eurof35-webfont.woff') format('woff'), url('fonts/eurof35-webfont.ttf') format('truetype'), url('fonts/eurof35-webfont.svg#webfont8xigBfG2') format('svg');
		}
		@font-face {
			font-family: 'graublauweb-webfont';
			src: url('fonts/graublauweb-webfont.eot');
			src: local('☺'), url('fonts/graublauweb-webfont.woff') format('woff'), url('fonts/graublauweb-webfont.ttf') format('truetype'), url('fonts/graublauweb-webfont.svg#webfont8xigBfG2') format('svg');
		}
		.clear{clear:both;}
		a:link,a:visited,a:hover{color:#ddd;}
		a:hover{color:#fff; text-decoration:none;}
		#bg{position:fixed; left:585px; top:0; width:100%; height:100%;}
		#bgimg{display:none; cursor:pointer; -ms-interpolation-mode: bicubic;} /* special IE fix for resized images */
		#preloader{position:absolute; z-index:2; width:140px; padding:20px; top:20px; left:50px; background:#000; color:#666; font-family:graublauweb-webfont, Helvetica, Arial, sans-serif; font-size:16px; -moz-border-radius:5px; -khtml-border-radius:5px; -webkit-border-radius:5px; border-radius:5px;}
		#preloader img{margin-right:20px;}
		#toolbar{display:inline-block; padding:4px 15px; margin:20px 15px; background:#262626 url(sw_btn_bg.png) repeat-x; -moz-border-radius:8px; -khtml-border-radius:8px; -webkit-border-radius:8px; border-radius:8px; font-family:graublauweb-webfont, Helvetica, Arial, sans-serif; font-size:12px; color:#fff; cursor:pointer;}
		#outer_container{position:relative; margin:0; width:700px; padding:0 100px 0 0; z-index:2; background:url(empty.gif);} /* fucking IE needs a background value to understand hover area */
		#customScrollBox{position:relative; overflow:hidden; background:url(sw_l_bg.png) repeat-y;}
		#customScrollBox .container{position:relative; width:585px; top:0; float:left;}
		#customScrollBox .content{clear:both;}
		#customScrollBox .content h1{padding:5px; margin:10px; color:#fff; font-family:eurof55-webfont, Helvetica, Arial, sans-serif; font-size:48px;}
		#customScrollBox .content h2{padding:5px; margin:10px 10px 0 10px; color:#fff; font-family:eurof35-webfont, Helvetica, Arial, sans-serif; font-size:24px;}
		#customScrollBox .content p{padding:5px; margin:0 10px 10px 10px; color:#ddd; font-family:graublauweb-webfont, Helvetica, Arial, sans-serif; line-height:26px;}
		.light{font-family:eurof35-webfont, Helvetica, Arial, sans-serif;}
		.grey{color:#999;}
		.lightgrey{color:#ddd;}
		.s36{font-size:36px;}
		.s24{font-size:24px;}
		#customScrollBox a.thumb_link{position:relative; margin:0 0 1px 1px; display:block; float:left;}
		#customScrollBox img{border:none;}
		#customScrollBox a.thumb_link .selected{position:absolute; top:0; left:0; width:145px; height:91px; background:url(sw_thumb_selected.png) no-repeat; display:none;}
		#dragger_container{position:relative; width:30px; height:580px; float:left; margin:10px 0 0 0; background:url(sw_dragger_bg.png) repeat-y center;}
		#dragger{position:absolute; width:30px; height:59px; background:url(round_custom_scrollbar_bg.png) no-repeat center center; cursor:pointer;}
		#arrow_indicator{position:absolute; z-index:1; width:50px; padding:10px; top:50%; margin-top:-25px; left:20px; background:url(sw_transparent_black_bg.png); -moz-border-radius:5px; -khtml-border-radius:5px; -webkit-border-radius:5px; border-radius:5px; display:none;}
		#nextimage_tip{position:fixed; z-index:1; padding:0 20px; line-height:40px; color:#fff; height:40px; top:50%; margin-top:-20px; right:20px; background:url(sw_transparent_black_bg.png); -moz-border-radius:5px; -khtml-border-radius:5px; -webkit-border-radius:5px; border-radius:5px; display:none; font-family:graublauweb-webfont, Helvetica, Arial, sans-serif;}
		.with_border{border:1px solid #000;}
		.with_shadow{-moz-box-shadow:0 0 40px #000; -webkit-box-shadow:0 0 40px #000; box-shadow:0 0 40px #000;}
	-->
		</style>
		



<!--
	<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
	<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
	<script type="text/javascript" src="./sl/bg/jquery.easing.1.3.js"></script>
	<script type="text/javascript" src="./sl/bg/jquery.mousewheel.min.js"></script>
	-->


	<script  id= "script_sl_jquery_js" type="text/javascript" src="data:/text/plain;base64,LyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuNC40CiAqIGh0dHA6Ly9qcXVlcnkuY29tLwogKgogKiBDb3B5cmlnaHQgMjAxMCwgSm9obiBSZXNpZwogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBJbmNsdWRlcyBTaXp6bGUuanMKICogaHR0cDovL3NpenpsZWpzLmNvbS8KICogQ29weXJpZ2h0IDIwMTAsIFRoZSBEb2pvIEZvdW5kYXRpb24KICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCwgQlNELCBhbmQgR1BMIExpY2Vuc2VzLgogKgogKiBEYXRlOiBUaHUgTm92IDExIDE5OjA0OjUzIDIwMTAgLTA1MDAKICovCihmdW5jdGlvbihFLEIpe2Z1bmN0aW9uIGthKGEsYixkKXtpZihkPT09QiYmYS5ub2RlVHlwZT09PTEpe2Q9YS5nZXRBdHRyaWJ1dGUoImRhdGEtIitiKTtpZih0eXBlb2YgZD09PSJzdHJpbmciKXt0cnl7ZD1kPT09InRydWUiP3RydWU6ZD09PSJmYWxzZSI/ZmFsc2U6ZD09PSJudWxsIj9udWxsOiFjLmlzTmFOKGQpP3BhcnNlRmxvYXQoZCk6SmEudGVzdChkKT9jLnBhcnNlSlNPTihkKTpkfWNhdGNoKGUpe31jLmRhdGEoYSxiLGQpfWVsc2UgZD1CfXJldHVybiBkfWZ1bmN0aW9uIFUoKXtyZXR1cm4gZmFsc2V9ZnVuY3Rpb24gY2EoKXtyZXR1cm4gdHJ1ZX1mdW5jdGlvbiBsYShhLGIsZCl7ZFswXS50eXBlPWE7cmV0dXJuIGMuZXZlbnQuaGFuZGxlLmFwcGx5KGIsZCl9ZnVuY3Rpb24gS2EoYSl7dmFyIGIsZCxlLGYsaCxsLGssbyx4LHIsQSxDPVtdO2Y9W107aD1jLmRhdGEodGhpcyx0aGlzLm5vZGVUeXBlPyJldmVudHMiOiJfX2V2ZW50c19fIik7aWYodHlwZW9mIGg9PT0iZnVuY3Rpb24iKWg9CmguZXZlbnRzO2lmKCEoYS5saXZlRmlyZWQ9PT10aGlzfHwhaHx8IWgubGl2ZXx8YS5idXR0b24mJmEudHlwZT09PSJjbGljayIpKXtpZihhLm5hbWVzcGFjZSlBPVJlZ0V4cCgiKF58XFwuKSIrYS5uYW1lc3BhY2Uuc3BsaXQoIi4iKS5qb2luKCJcXC4oPzouKlxcLik/IikrIihcXC58JCkiKTthLmxpdmVGaXJlZD10aGlzO3ZhciBKPWgubGl2ZS5zbGljZSgwKTtmb3Ioaz0wO2s8Si5sZW5ndGg7aysrKXtoPUpba107aC5vcmlnVHlwZS5yZXBsYWNlKFgsIiIpPT09YS50eXBlP2YucHVzaChoLnNlbGVjdG9yKTpKLnNwbGljZShrLS0sMSl9Zj1jKGEudGFyZ2V0KS5jbG9zZXN0KGYsYS5jdXJyZW50VGFyZ2V0KTtvPTA7Zm9yKHg9Zi5sZW5ndGg7bzx4O28rKyl7cj1mW29dO2ZvcihrPTA7azxKLmxlbmd0aDtrKyspe2g9SltrXTtpZihyLnNlbGVjdG9yPT09aC5zZWxlY3RvciYmKCFBfHxBLnRlc3QoaC5uYW1lc3BhY2UpKSl7bD1yLmVsZW07ZT1udWxsO2lmKGgucHJlVHlwZT09PSJtb3VzZWVudGVyInx8CmgucHJlVHlwZT09PSJtb3VzZWxlYXZlIil7YS50eXBlPWgucHJlVHlwZTtlPWMoYS5yZWxhdGVkVGFyZ2V0KS5jbG9zZXN0KGguc2VsZWN0b3IpWzBdfWlmKCFlfHxlIT09bClDLnB1c2goe2VsZW06bCxoYW5kbGVPYmo6aCxsZXZlbDpyLmxldmVsfSl9fX1vPTA7Zm9yKHg9Qy5sZW5ndGg7bzx4O28rKyl7Zj1DW29dO2lmKGQmJmYubGV2ZWw+ZClicmVhazthLmN1cnJlbnRUYXJnZXQ9Zi5lbGVtO2EuZGF0YT1mLmhhbmRsZU9iai5kYXRhO2EuaGFuZGxlT2JqPWYuaGFuZGxlT2JqO0E9Zi5oYW5kbGVPYmoub3JpZ0hhbmRsZXIuYXBwbHkoZi5lbGVtLGFyZ3VtZW50cyk7aWYoQT09PWZhbHNlfHxhLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpe2Q9Zi5sZXZlbDtpZihBPT09ZmFsc2UpYj1mYWxzZTtpZihhLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkpYnJlYWt9fXJldHVybiBifX1mdW5jdGlvbiBZKGEsYil7cmV0dXJuKGEmJmEhPT0iKiI/YSsiLiI6IiIpK2IucmVwbGFjZShMYSwKImAiKS5yZXBsYWNlKE1hLCImIil9ZnVuY3Rpb24gbWEoYSxiLGQpe2lmKGMuaXNGdW5jdGlvbihiKSlyZXR1cm4gYy5ncmVwKGEsZnVuY3Rpb24oZixoKXtyZXR1cm4hIWIuY2FsbChmLGgsZik9PT1kfSk7ZWxzZSBpZihiLm5vZGVUeXBlKXJldHVybiBjLmdyZXAoYSxmdW5jdGlvbihmKXtyZXR1cm4gZj09PWI9PT1kfSk7ZWxzZSBpZih0eXBlb2YgYj09PSJzdHJpbmciKXt2YXIgZT1jLmdyZXAoYSxmdW5jdGlvbihmKXtyZXR1cm4gZi5ub2RlVHlwZT09PTF9KTtpZihOYS50ZXN0KGIpKXJldHVybiBjLmZpbHRlcihiLGUsIWQpO2Vsc2UgYj1jLmZpbHRlcihiLGUpfXJldHVybiBjLmdyZXAoYSxmdW5jdGlvbihmKXtyZXR1cm4gYy5pbkFycmF5KGYsYik+PTA9PT1kfSl9ZnVuY3Rpb24gbmEoYSxiKXt2YXIgZD0wO2IuZWFjaChmdW5jdGlvbigpe2lmKHRoaXMubm9kZU5hbWU9PT0oYVtkXSYmYVtkXS5ub2RlTmFtZSkpe3ZhciBlPWMuZGF0YShhW2QrK10pLGY9Yy5kYXRhKHRoaXMsCmUpO2lmKGU9ZSYmZS5ldmVudHMpe2RlbGV0ZSBmLmhhbmRsZTtmLmV2ZW50cz17fTtmb3IodmFyIGggaW4gZSlmb3IodmFyIGwgaW4gZVtoXSljLmV2ZW50LmFkZCh0aGlzLGgsZVtoXVtsXSxlW2hdW2xdLmRhdGEpfX19KX1mdW5jdGlvbiBPYShhLGIpe2Iuc3JjP2MuYWpheCh7dXJsOmIuc3JjLGFzeW5jOmZhbHNlLGRhdGFUeXBlOiJzY3JpcHQifSk6Yy5nbG9iYWxFdmFsKGIudGV4dHx8Yi50ZXh0Q29udGVudHx8Yi5pbm5lckhUTUx8fCIiKTtiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKX1mdW5jdGlvbiBvYShhLGIsZCl7dmFyIGU9Yj09PSJ3aWR0aCI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodDtpZihkPT09ImJvcmRlciIpcmV0dXJuIGU7Yy5lYWNoKGI9PT0id2lkdGgiP1BhOlFhLGZ1bmN0aW9uKCl7ZHx8KGUtPXBhcnNlRmxvYXQoYy5jc3MoYSwicGFkZGluZyIrdGhpcykpfHwwKTtpZihkPT09Im1hcmdpbiIpZSs9cGFyc2VGbG9hdChjLmNzcyhhLAoibWFyZ2luIit0aGlzKSl8fDA7ZWxzZSBlLT1wYXJzZUZsb2F0KGMuY3NzKGEsImJvcmRlciIrdGhpcysiV2lkdGgiKSl8fDB9KTtyZXR1cm4gZX1mdW5jdGlvbiBkYShhLGIsZCxlKXtpZihjLmlzQXJyYXkoYikmJmIubGVuZ3RoKWMuZWFjaChiLGZ1bmN0aW9uKGYsaCl7ZHx8UmEudGVzdChhKT9lKGEsaCk6ZGEoYSsiWyIrKHR5cGVvZiBoPT09Im9iamVjdCJ8fGMuaXNBcnJheShoKT9mOiIiKSsiXSIsaCxkLGUpfSk7ZWxzZSBpZighZCYmYiE9bnVsbCYmdHlwZW9mIGI9PT0ib2JqZWN0IiljLmlzRW1wdHlPYmplY3QoYik/ZShhLCIiKTpjLmVhY2goYixmdW5jdGlvbihmLGgpe2RhKGErIlsiK2YrIl0iLGgsZCxlKX0pO2Vsc2UgZShhLGIpfWZ1bmN0aW9uIFMoYSxiKXt2YXIgZD17fTtjLmVhY2gocGEuY29uY2F0LmFwcGx5KFtdLHBhLnNsaWNlKDAsYikpLGZ1bmN0aW9uKCl7ZFt0aGlzXT1hfSk7cmV0dXJuIGR9ZnVuY3Rpb24gcWEoYSl7aWYoIWVhW2FdKXt2YXIgYj1jKCI8IisKYSsiPiIpLmFwcGVuZFRvKCJib2R5IiksZD1iLmNzcygiZGlzcGxheSIpO2IucmVtb3ZlKCk7aWYoZD09PSJub25lInx8ZD09PSIiKWQ9ImJsb2NrIjtlYVthXT1kfXJldHVybiBlYVthXX1mdW5jdGlvbiBmYShhKXtyZXR1cm4gYy5pc1dpbmRvdyhhKT9hOmEubm9kZVR5cGU9PT05P2EuZGVmYXVsdFZpZXd8fGEucGFyZW50V2luZG93OmZhbHNlfXZhciB0PUUuZG9jdW1lbnQsYz1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtpZighYi5pc1JlYWR5KXt0cnl7dC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwoImxlZnQiKX1jYXRjaChqKXtzZXRUaW1lb3V0KGEsMSk7cmV0dXJufWIucmVhZHkoKX19dmFyIGI9ZnVuY3Rpb24oaixzKXtyZXR1cm4gbmV3IGIuZm4uaW5pdChqLHMpfSxkPUUualF1ZXJ5LGU9RS4kLGYsaD0vXig/OltePF0qKDxbXHdcV10rPilbXj5dKiR8IyhbXHdcLV0rKSQpLyxsPS9cUy8saz0vXlxzKy8sbz0vXHMrJC8seD0vXFcvLHI9L1xkLyxBPS9ePChcdyspXHMqXC8/Pig/OjxcL1wxPik/JC8sCkM9L15bXF0sOnt9XHNdKiQvLEo9L1xcKD86WyJcXFwvYmZucnRdfHVbMC05YS1mQS1GXXs0fSkvZyx3PS8iW14iXFxcblxyXSoifHRydWV8ZmFsc2V8bnVsbHwtP1xkKyg/OlwuXGQqKT8oPzpbZUVdWytcLV0/XGQrKT8vZyxJPS8oPzpefDp8LCkoPzpccypcWykrL2csTD0vKHdlYmtpdClbIFwvXShbXHcuXSspLyxnPS8ob3BlcmEpKD86Lip2ZXJzaW9uKT9bIFwvXShbXHcuXSspLyxpPS8obXNpZSkgKFtcdy5dKykvLG49Lyhtb3ppbGxhKSg/Oi4qPyBydjooW1x3Ll0rKSk/LyxtPW5hdmlnYXRvci51c2VyQWdlbnQscD1mYWxzZSxxPVtdLHUseT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLEY9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxNPUFycmF5LnByb3RvdHlwZS5wdXNoLE49QXJyYXkucHJvdG90eXBlLnNsaWNlLE89U3RyaW5nLnByb3RvdHlwZS50cmltLEQ9QXJyYXkucHJvdG90eXBlLmluZGV4T2YsUj17fTtiLmZuPWIucHJvdG90eXBlPXtpbml0OmZ1bmN0aW9uKGosCnMpe3ZhciB2LHosSDtpZighailyZXR1cm4gdGhpcztpZihqLm5vZGVUeXBlKXt0aGlzLmNvbnRleHQ9dGhpc1swXT1qO3RoaXMubGVuZ3RoPTE7cmV0dXJuIHRoaXN9aWYoaj09PSJib2R5IiYmIXMmJnQuYm9keSl7dGhpcy5jb250ZXh0PXQ7dGhpc1swXT10LmJvZHk7dGhpcy5zZWxlY3Rvcj0iYm9keSI7dGhpcy5sZW5ndGg9MTtyZXR1cm4gdGhpc31pZih0eXBlb2Ygaj09PSJzdHJpbmciKWlmKCh2PWguZXhlYyhqKSkmJih2WzFdfHwhcykpaWYodlsxXSl7SD1zP3Mub3duZXJEb2N1bWVudHx8czp0O2lmKHo9QS5leGVjKGopKWlmKGIuaXNQbGFpbk9iamVjdChzKSl7aj1bdC5jcmVhdGVFbGVtZW50KHpbMV0pXTtiLmZuLmF0dHIuY2FsbChqLHMsdHJ1ZSl9ZWxzZSBqPVtILmNyZWF0ZUVsZW1lbnQoelsxXSldO2Vsc2V7ej1iLmJ1aWxkRnJhZ21lbnQoW3ZbMV1dLFtIXSk7aj0oei5jYWNoZWFibGU/ei5mcmFnbWVudC5jbG9uZU5vZGUodHJ1ZSk6ei5mcmFnbWVudCkuY2hpbGROb2Rlc31yZXR1cm4gYi5tZXJnZSh0aGlzLApqKX1lbHNle2lmKCh6PXQuZ2V0RWxlbWVudEJ5SWQodlsyXSkpJiZ6LnBhcmVudE5vZGUpe2lmKHouaWQhPT12WzJdKXJldHVybiBmLmZpbmQoaik7dGhpcy5sZW5ndGg9MTt0aGlzWzBdPXp9dGhpcy5jb250ZXh0PXQ7dGhpcy5zZWxlY3Rvcj1qO3JldHVybiB0aGlzfWVsc2UgaWYoIXMmJiF4LnRlc3Qoaikpe3RoaXMuc2VsZWN0b3I9ajt0aGlzLmNvbnRleHQ9dDtqPXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaik7cmV0dXJuIGIubWVyZ2UodGhpcyxqKX1lbHNlIHJldHVybiFzfHxzLmpxdWVyeT8oc3x8ZikuZmluZChqKTpiKHMpLmZpbmQoaik7ZWxzZSBpZihiLmlzRnVuY3Rpb24oaikpcmV0dXJuIGYucmVhZHkoaik7aWYoai5zZWxlY3RvciE9PUIpe3RoaXMuc2VsZWN0b3I9ai5zZWxlY3Rvcjt0aGlzLmNvbnRleHQ9ai5jb250ZXh0fXJldHVybiBiLm1ha2VBcnJheShqLHRoaXMpfSxzZWxlY3RvcjoiIixqcXVlcnk6IjEuNC40IixsZW5ndGg6MCxzaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RofSwKdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBOLmNhbGwodGhpcywwKX0sZ2V0OmZ1bmN0aW9uKGope3JldHVybiBqPT1udWxsP3RoaXMudG9BcnJheSgpOmo8MD90aGlzLnNsaWNlKGopWzBdOnRoaXNbal19LHB1c2hTdGFjazpmdW5jdGlvbihqLHMsdil7dmFyIHo9YigpO2IuaXNBcnJheShqKT9NLmFwcGx5KHosaik6Yi5tZXJnZSh6LGopO3oucHJldk9iamVjdD10aGlzO3ouY29udGV4dD10aGlzLmNvbnRleHQ7aWYocz09PSJmaW5kIil6LnNlbGVjdG9yPXRoaXMuc2VsZWN0b3IrKHRoaXMuc2VsZWN0b3I/IiAiOiIiKSt2O2Vsc2UgaWYocyl6LnNlbGVjdG9yPXRoaXMuc2VsZWN0b3IrIi4iK3MrIigiK3YrIikiO3JldHVybiB6fSxlYWNoOmZ1bmN0aW9uKGoscyl7cmV0dXJuIGIuZWFjaCh0aGlzLGoscyl9LHJlYWR5OmZ1bmN0aW9uKGope2IuYmluZFJlYWR5KCk7aWYoYi5pc1JlYWR5KWouY2FsbCh0LGIpO2Vsc2UgcSYmcS5wdXNoKGopO3JldHVybiB0aGlzfSxlcTpmdW5jdGlvbihqKXtyZXR1cm4gaj09PQotMT90aGlzLnNsaWNlKGopOnRoaXMuc2xpY2UoaiwraisxKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soTi5hcHBseSh0aGlzLGFyZ3VtZW50cyksInNsaWNlIixOLmNhbGwoYXJndW1lbnRzKS5qb2luKCIsIikpfSxtYXA6ZnVuY3Rpb24oail7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGIubWFwKHRoaXMsZnVuY3Rpb24ocyx2KXtyZXR1cm4gai5jYWxsKHMsdixzKX0pKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8YihudWxsKX0scHVzaDpNLHNvcnQ6W10uc29ydCxzcGxpY2U6W10uc3BsaWNlfTtiLmZuLmluaXQucHJvdG90eXBlPWIuZm47Yi5leHRlbmQ9Yi5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgaixzLHYseixILEc9YXJndW1lbnRzWzBdfHx7fSxLPTEsUT1hcmd1bWVudHMubGVuZ3RoLGdhPWZhbHNlOwppZih0eXBlb2YgRz09PSJib29sZWFuIil7Z2E9RztHPWFyZ3VtZW50c1sxXXx8e307Sz0yfWlmKHR5cGVvZiBHIT09Im9iamVjdCImJiFiLmlzRnVuY3Rpb24oRykpRz17fTtpZihRPT09Syl7Rz10aGlzOy0tS31mb3IoO0s8UTtLKyspaWYoKGo9YXJndW1lbnRzW0tdKSE9bnVsbClmb3IocyBpbiBqKXt2PUdbc107ej1qW3NdO2lmKEchPT16KWlmKGdhJiZ6JiYoYi5pc1BsYWluT2JqZWN0KHopfHwoSD1iLmlzQXJyYXkoeikpKSl7aWYoSCl7SD1mYWxzZTt2PXYmJmIuaXNBcnJheSh2KT92OltdfWVsc2Ugdj12JiZiLmlzUGxhaW5PYmplY3Qodik/djp7fTtHW3NdPWIuZXh0ZW5kKGdhLHYseil9ZWxzZSBpZih6IT09QilHW3NdPXp9cmV0dXJuIEd9O2IuZXh0ZW5kKHtub0NvbmZsaWN0OmZ1bmN0aW9uKGope0UuJD1lO2lmKGopRS5qUXVlcnk9ZDtyZXR1cm4gYn0saXNSZWFkeTpmYWxzZSxyZWFkeVdhaXQ6MSxyZWFkeTpmdW5jdGlvbihqKXtqPT09dHJ1ZSYmYi5yZWFkeVdhaXQtLTsKaWYoIWIucmVhZHlXYWl0fHxqIT09dHJ1ZSYmIWIuaXNSZWFkeSl7aWYoIXQuYm9keSlyZXR1cm4gc2V0VGltZW91dChiLnJlYWR5LDEpO2IuaXNSZWFkeT10cnVlO2lmKCEoaiE9PXRydWUmJi0tYi5yZWFkeVdhaXQ+MCkpaWYocSl7dmFyIHM9MCx2PXE7Zm9yKHE9bnVsbDtqPXZbcysrXTspai5jYWxsKHQsYik7Yi5mbi50cmlnZ2VyJiZiKHQpLnRyaWdnZXIoInJlYWR5IikudW5iaW5kKCJyZWFkeSIpfX19LGJpbmRSZWFkeTpmdW5jdGlvbigpe2lmKCFwKXtwPXRydWU7aWYodC5yZWFkeVN0YXRlPT09ImNvbXBsZXRlIilyZXR1cm4gc2V0VGltZW91dChiLnJlYWR5LDEpO2lmKHQuYWRkRXZlbnRMaXN0ZW5lcil7dC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIix1LGZhbHNlKTtFLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGIucmVhZHksZmFsc2UpfWVsc2UgaWYodC5hdHRhY2hFdmVudCl7dC5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIix1KTtFLmF0dGFjaEV2ZW50KCJvbmxvYWQiLApiLnJlYWR5KTt2YXIgaj1mYWxzZTt0cnl7aj1FLmZyYW1lRWxlbWVudD09bnVsbH1jYXRjaChzKXt9dC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwmJmomJmEoKX19fSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGope3JldHVybiBiLnR5cGUoaik9PT0iZnVuY3Rpb24ifSxpc0FycmF5OkFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGope3JldHVybiBiLnR5cGUoaik9PT0iYXJyYXkifSxpc1dpbmRvdzpmdW5jdGlvbihqKXtyZXR1cm4gaiYmdHlwZW9mIGo9PT0ib2JqZWN0IiYmInNldEludGVydmFsImluIGp9LGlzTmFOOmZ1bmN0aW9uKGope3JldHVybiBqPT1udWxsfHwhci50ZXN0KGopfHxpc05hTihqKX0sdHlwZTpmdW5jdGlvbihqKXtyZXR1cm4gaj09bnVsbD9TdHJpbmcoaik6Ult5LmNhbGwoaildfHwib2JqZWN0In0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihqKXtpZighanx8Yi50eXBlKGopIT09Im9iamVjdCJ8fGoubm9kZVR5cGV8fGIuaXNXaW5kb3coaikpcmV0dXJuIGZhbHNlO2lmKGouY29uc3RydWN0b3ImJgohRi5jYWxsKGosImNvbnN0cnVjdG9yIikmJiFGLmNhbGwoai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsImlzUHJvdG90eXBlT2YiKSlyZXR1cm4gZmFsc2U7Zm9yKHZhciBzIGluIGopO3JldHVybiBzPT09Qnx8Ri5jYWxsKGoscyl9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oail7Zm9yKHZhciBzIGluIGopcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlfSxlcnJvcjpmdW5jdGlvbihqKXt0aHJvdyBqO30scGFyc2VKU09OOmZ1bmN0aW9uKGope2lmKHR5cGVvZiBqIT09InN0cmluZyJ8fCFqKXJldHVybiBudWxsO2o9Yi50cmltKGopO2lmKEMudGVzdChqLnJlcGxhY2UoSiwiQCIpLnJlcGxhY2UodywiXSIpLnJlcGxhY2UoSSwiIikpKXJldHVybiBFLkpTT04mJkUuSlNPTi5wYXJzZT9FLkpTT04ucGFyc2Uoaik6KG5ldyBGdW5jdGlvbigicmV0dXJuICIraikpKCk7ZWxzZSBiLmVycm9yKCJJbnZhbGlkIEpTT046ICIrail9LG5vb3A6ZnVuY3Rpb24oKXt9LGdsb2JhbEV2YWw6ZnVuY3Rpb24oail7aWYoaiYmCmwudGVzdChqKSl7dmFyIHM9dC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdfHx0LmRvY3VtZW50RWxlbWVudCx2PXQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7di50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2lmKGIuc3VwcG9ydC5zY3JpcHRFdmFsKXYuYXBwZW5kQ2hpbGQodC5jcmVhdGVUZXh0Tm9kZShqKSk7ZWxzZSB2LnRleHQ9ajtzLmluc2VydEJlZm9yZSh2LHMuZmlyc3RDaGlsZCk7cy5yZW1vdmVDaGlsZCh2KX19LG5vZGVOYW1lOmZ1bmN0aW9uKGoscyl7cmV0dXJuIGoubm9kZU5hbWUmJmoubm9kZU5hbWUudG9VcHBlckNhc2UoKT09PXMudG9VcHBlckNhc2UoKX0sZWFjaDpmdW5jdGlvbihqLHMsdil7dmFyIHosSD0wLEc9ai5sZW5ndGgsSz1HPT09Qnx8Yi5pc0Z1bmN0aW9uKGopO2lmKHYpaWYoSylmb3IoeiBpbiBqKXtpZihzLmFwcGx5KGpbel0sdik9PT1mYWxzZSlicmVha31lbHNlIGZvcig7SDxHOyl7aWYocy5hcHBseShqW0grK10sdik9PT1mYWxzZSlicmVha31lbHNlIGlmKEspZm9yKHogaW4gail7aWYocy5jYWxsKGpbel0sCnosalt6XSk9PT1mYWxzZSlicmVha31lbHNlIGZvcih2PWpbMF07SDxHJiZzLmNhbGwodixILHYpIT09ZmFsc2U7dj1qWysrSF0pO3JldHVybiBqfSx0cmltOk8/ZnVuY3Rpb24oail7cmV0dXJuIGo9PW51bGw/IiI6Ty5jYWxsKGopfTpmdW5jdGlvbihqKXtyZXR1cm4gaj09bnVsbD8iIjpqLnRvU3RyaW5nKCkucmVwbGFjZShrLCIiKS5yZXBsYWNlKG8sIiIpfSxtYWtlQXJyYXk6ZnVuY3Rpb24oaixzKXt2YXIgdj1zfHxbXTtpZihqIT1udWxsKXt2YXIgej1iLnR5cGUoaik7ai5sZW5ndGg9PW51bGx8fHo9PT0ic3RyaW5nInx8ej09PSJmdW5jdGlvbiJ8fHo9PT0icmVnZXhwInx8Yi5pc1dpbmRvdyhqKT9NLmNhbGwodixqKTpiLm1lcmdlKHYsail9cmV0dXJuIHZ9LGluQXJyYXk6ZnVuY3Rpb24oaixzKXtpZihzLmluZGV4T2YpcmV0dXJuIHMuaW5kZXhPZihqKTtmb3IodmFyIHY9MCx6PXMubGVuZ3RoO3Y8ejt2KyspaWYoc1t2XT09PWopcmV0dXJuIHY7cmV0dXJuLTF9LG1lcmdlOmZ1bmN0aW9uKGosCnMpe3ZhciB2PWoubGVuZ3RoLHo9MDtpZih0eXBlb2Ygcy5sZW5ndGg9PT0ibnVtYmVyIilmb3IodmFyIEg9cy5sZW5ndGg7ejxIO3orKylqW3YrK109c1t6XTtlbHNlIGZvcig7c1t6XSE9PUI7KWpbdisrXT1zW3orK107ai5sZW5ndGg9djtyZXR1cm4gan0sZ3JlcDpmdW5jdGlvbihqLHMsdil7dmFyIHo9W10sSDt2PSEhdjtmb3IodmFyIEc9MCxLPWoubGVuZ3RoO0c8SztHKyspe0g9ISFzKGpbR10sRyk7diE9PUgmJnoucHVzaChqW0ddKX1yZXR1cm4gen0sbWFwOmZ1bmN0aW9uKGoscyx2KXtmb3IodmFyIHo9W10sSCxHPTAsSz1qLmxlbmd0aDtHPEs7RysrKXtIPXMoaltHXSxHLHYpO2lmKEghPW51bGwpelt6Lmxlbmd0aF09SH1yZXR1cm4gei5jb25jYXQuYXBwbHkoW10seil9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihqLHMsdil7aWYoYXJndW1lbnRzLmxlbmd0aD09PTIpaWYodHlwZW9mIHM9PT0ic3RyaW5nIil7dj1qO2o9dltzXTtzPUJ9ZWxzZSBpZihzJiYhYi5pc0Z1bmN0aW9uKHMpKXt2PQpzO3M9Qn1pZighcyYmailzPWZ1bmN0aW9uKCl7cmV0dXJuIGouYXBwbHkodnx8dGhpcyxhcmd1bWVudHMpfTtpZihqKXMuZ3VpZD1qLmd1aWQ9ai5ndWlkfHxzLmd1aWR8fGIuZ3VpZCsrO3JldHVybiBzfSxhY2Nlc3M6ZnVuY3Rpb24oaixzLHYseixILEcpe3ZhciBLPWoubGVuZ3RoO2lmKHR5cGVvZiBzPT09Im9iamVjdCIpe2Zvcih2YXIgUSBpbiBzKWIuYWNjZXNzKGosUSxzW1FdLHosSCx2KTtyZXR1cm4gan1pZih2IT09Qil7ej0hRyYmeiYmYi5pc0Z1bmN0aW9uKHYpO2ZvcihRPTA7UTxLO1ErKylIKGpbUV0scyx6P3YuY2FsbChqW1FdLFEsSChqW1FdLHMpKTp2LEcpO3JldHVybiBqfXJldHVybiBLP0goalswXSxzKTpCfSxub3c6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0sdWFNYXRjaDpmdW5jdGlvbihqKXtqPWoudG9Mb3dlckNhc2UoKTtqPUwuZXhlYyhqKXx8Zy5leGVjKGopfHxpLmV4ZWMoail8fGouaW5kZXhPZigiY29tcGF0aWJsZSIpPDAmJm4uZXhlYyhqKXx8CltdO3JldHVybnticm93c2VyOmpbMV18fCIiLHZlcnNpb246alsyXXx8IjAifX0sYnJvd3Nlcjp7fX0pO2IuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCIuc3BsaXQoIiAiKSxmdW5jdGlvbihqLHMpe1JbIltvYmplY3QgIitzKyJdIl09cy50b0xvd2VyQ2FzZSgpfSk7bT1iLnVhTWF0Y2gobSk7aWYobS5icm93c2VyKXtiLmJyb3dzZXJbbS5icm93c2VyXT10cnVlO2IuYnJvd3Nlci52ZXJzaW9uPW0udmVyc2lvbn1pZihiLmJyb3dzZXIud2Via2l0KWIuYnJvd3Nlci5zYWZhcmk9dHJ1ZTtpZihEKWIuaW5BcnJheT1mdW5jdGlvbihqLHMpe3JldHVybiBELmNhbGwocyxqKX07aWYoIS9ccy8udGVzdCgiXHUwMGEwIikpe2s9L15bXHNceEEwXSsvO289L1tcc1x4QTBdKyQvfWY9Yih0KTtpZih0LmFkZEV2ZW50TGlzdGVuZXIpdT1mdW5jdGlvbigpe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsdSwKZmFsc2UpO2IucmVhZHkoKX07ZWxzZSBpZih0LmF0dGFjaEV2ZW50KXU9ZnVuY3Rpb24oKXtpZih0LnJlYWR5U3RhdGU9PT0iY29tcGxldGUiKXt0LmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLHUpO2IucmVhZHkoKX19O3JldHVybiBFLmpRdWVyeT1FLiQ9Yn0oKTsoZnVuY3Rpb24oKXtjLnN1cHBvcnQ9e307dmFyIGE9dC5kb2N1bWVudEVsZW1lbnQsYj10LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGQ9dC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPSJzY3JpcHQiK2Mubm93KCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtkLmlubmVySFRNTD0iICAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJyBzdHlsZT0nY29sb3I6cmVkO2Zsb2F0OmxlZnQ7b3BhY2l0eTouNTU7Jz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiI7dmFyIGY9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLGg9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpWzBdLGw9dC5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKSwKaz1sLmFwcGVuZENoaWxkKHQuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpO2lmKCEoIWZ8fCFmLmxlbmd0aHx8IWgpKXtjLnN1cHBvcnQ9e2xlYWRpbmdXaGl0ZXNwYWNlOmQuZmlyc3RDaGlsZC5ub2RlVHlwZT09PTMsdGJvZHk6IWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IikubGVuZ3RoLGh0bWxTZXJpYWxpemU6ISFkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIikubGVuZ3RoLHN0eWxlOi9yZWQvLnRlc3QoaC5nZXRBdHRyaWJ1dGUoInN0eWxlIikpLGhyZWZOb3JtYWxpemVkOmguZ2V0QXR0cmlidXRlKCJocmVmIik9PT0iL2EiLG9wYWNpdHk6L14wLjU1JC8udGVzdChoLnN0eWxlLm9wYWNpdHkpLGNzc0Zsb2F0OiEhaC5zdHlsZS5jc3NGbG9hdCxjaGVja09uOmQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IilbMF0udmFsdWU9PT0ib24iLG9wdFNlbGVjdGVkOmsuc2VsZWN0ZWQsZGVsZXRlRXhwYW5kbzp0cnVlLG9wdERpc2FibGVkOmZhbHNlLGNoZWNrQ2xvbmU6ZmFsc2UsCnNjcmlwdEV2YWw6ZmFsc2Usbm9DbG9uZUV2ZW50OnRydWUsYm94TW9kZWw6bnVsbCxpbmxpbmVCbG9ja05lZWRzTGF5b3V0OmZhbHNlLHNocmlua1dyYXBCbG9ja3M6ZmFsc2UscmVsaWFibGVIaWRkZW5PZmZzZXRzOnRydWV9O2wuZGlzYWJsZWQ9dHJ1ZTtjLnN1cHBvcnQub3B0RGlzYWJsZWQ9IWsuZGlzYWJsZWQ7Yi50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO3RyeXtiLmFwcGVuZENoaWxkKHQuY3JlYXRlVGV4dE5vZGUoIndpbmRvdy4iK2UrIj0xOyIpKX1jYXRjaChvKXt9YS5pbnNlcnRCZWZvcmUoYixhLmZpcnN0Q2hpbGQpO2lmKEVbZV0pe2Muc3VwcG9ydC5zY3JpcHRFdmFsPXRydWU7ZGVsZXRlIEVbZV19dHJ5e2RlbGV0ZSBiLnRlc3R9Y2F0Y2goeCl7Yy5zdXBwb3J0LmRlbGV0ZUV4cGFuZG89ZmFsc2V9YS5yZW1vdmVDaGlsZChiKTtpZihkLmF0dGFjaEV2ZW50JiZkLmZpcmVFdmVudCl7ZC5hdHRhY2hFdmVudCgib25jbGljayIsZnVuY3Rpb24gcigpe2Muc3VwcG9ydC5ub0Nsb25lRXZlbnQ9CmZhbHNlO2QuZGV0YWNoRXZlbnQoIm9uY2xpY2siLHIpfSk7ZC5jbG9uZU5vZGUodHJ1ZSkuZmlyZUV2ZW50KCJvbmNsaWNrIil9ZD10LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaW5uZXJIVE1MPSI8aW5wdXQgdHlwZT0ncmFkaW8nIG5hbWU9J3JhZGlvdGVzdCcgY2hlY2tlZD0nY2hlY2tlZCcvPiI7YT10LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTthLmFwcGVuZENoaWxkKGQuZmlyc3RDaGlsZCk7Yy5zdXBwb3J0LmNoZWNrQ2xvbmU9YS5jbG9uZU5vZGUodHJ1ZSkuY2xvbmVOb2RlKHRydWUpLmxhc3RDaGlsZC5jaGVja2VkO2MoZnVuY3Rpb24oKXt2YXIgcj10LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3Iuc3R5bGUud2lkdGg9ci5zdHlsZS5wYWRkaW5nTGVmdD0iMXB4Ijt0LmJvZHkuYXBwZW5kQ2hpbGQocik7Yy5ib3hNb2RlbD1jLnN1cHBvcnQuYm94TW9kZWw9ci5vZmZzZXRXaWR0aD09PTI7aWYoInpvb20iaW4gci5zdHlsZSl7ci5zdHlsZS5kaXNwbGF5PSJpbmxpbmUiO3Iuc3R5bGUuem9vbT0KMTtjLnN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dD1yLm9mZnNldFdpZHRoPT09MjtyLnN0eWxlLmRpc3BsYXk9IiI7ci5pbm5lckhUTUw9IjxkaXYgc3R5bGU9J3dpZHRoOjRweDsnPjwvZGl2PiI7Yy5zdXBwb3J0LnNocmlua1dyYXBCbG9ja3M9ci5vZmZzZXRXaWR0aCE9PTJ9ci5pbm5lckhUTUw9Ijx0YWJsZT48dHI+PHRkIHN0eWxlPSdwYWRkaW5nOjA7ZGlzcGxheTpub25lJz48L3RkPjx0ZD50PC90ZD48L3RyPjwvdGFibGU+Ijt2YXIgQT1yLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpO2Muc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHM9QVswXS5vZmZzZXRIZWlnaHQ9PT0wO0FbMF0uc3R5bGUuZGlzcGxheT0iIjtBWzFdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Muc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHM9Yy5zdXBwb3J0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cyYmQVswXS5vZmZzZXRIZWlnaHQ9PT0wO3IuaW5uZXJIVE1MPSIiO3QuYm9keS5yZW1vdmVDaGlsZChyKS5zdHlsZS5kaXNwbGF5PQoibm9uZSJ9KTthPWZ1bmN0aW9uKHIpe3ZhciBBPXQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cj0ib24iK3I7dmFyIEM9ciBpbiBBO2lmKCFDKXtBLnNldEF0dHJpYnV0ZShyLCJyZXR1cm47Iik7Qz10eXBlb2YgQVtyXT09PSJmdW5jdGlvbiJ9cmV0dXJuIEN9O2Muc3VwcG9ydC5zdWJtaXRCdWJibGVzPWEoInN1Ym1pdCIpO2Muc3VwcG9ydC5jaGFuZ2VCdWJibGVzPWEoImNoYW5nZSIpO2E9Yj1kPWY9aD1udWxsfX0pKCk7dmFyIHJhPXt9LEphPS9eKD86XHsuKlx9fFxbLipcXSkkLztjLmV4dGVuZCh7Y2FjaGU6e30sdXVpZDowLGV4cGFuZG86ImpRdWVyeSIrYy5ub3coKSxub0RhdGE6e2VtYmVkOnRydWUsb2JqZWN0OiJjbHNpZDpEMjdDREI2RS1BRTZELTExY2YtOTZCOC00NDQ1NTM1NDAwMDAiLGFwcGxldDp0cnVlfSxkYXRhOmZ1bmN0aW9uKGEsYixkKXtpZihjLmFjY2VwdERhdGEoYSkpe2E9YT09RT9yYTphO3ZhciBlPWEubm9kZVR5cGUsZj1lP2FbYy5leHBhbmRvXTpudWxsLGg9CmMuY2FjaGU7aWYoIShlJiYhZiYmdHlwZW9mIGI9PT0ic3RyaW5nIiYmZD09PUIpKXtpZihlKWZ8fChhW2MuZXhwYW5kb109Zj0rK2MudXVpZCk7ZWxzZSBoPWE7aWYodHlwZW9mIGI9PT0ib2JqZWN0IilpZihlKWhbZl09Yy5leHRlbmQoaFtmXSxiKTtlbHNlIGMuZXh0ZW5kKGgsYik7ZWxzZSBpZihlJiYhaFtmXSloW2ZdPXt9O2E9ZT9oW2ZdOmg7aWYoZCE9PUIpYVtiXT1kO3JldHVybiB0eXBlb2YgYj09PSJzdHJpbmciP2FbYl06YX19fSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYil7aWYoYy5hY2NlcHREYXRhKGEpKXthPWE9PUU/cmE6YTt2YXIgZD1hLm5vZGVUeXBlLGU9ZD9hW2MuZXhwYW5kb106YSxmPWMuY2FjaGUsaD1kP2ZbZV06ZTtpZihiKXtpZihoKXtkZWxldGUgaFtiXTtkJiZjLmlzRW1wdHlPYmplY3QoaCkmJmMucmVtb3ZlRGF0YShhKX19ZWxzZSBpZihkJiZjLnN1cHBvcnQuZGVsZXRlRXhwYW5kbylkZWxldGUgYVtjLmV4cGFuZG9dO2Vsc2UgaWYoYS5yZW1vdmVBdHRyaWJ1dGUpYS5yZW1vdmVBdHRyaWJ1dGUoYy5leHBhbmRvKTsKZWxzZSBpZihkKWRlbGV0ZSBmW2VdO2Vsc2UgZm9yKHZhciBsIGluIGEpZGVsZXRlIGFbbF19fSxhY2NlcHREYXRhOmZ1bmN0aW9uKGEpe2lmKGEubm9kZU5hbWUpe3ZhciBiPWMubm9EYXRhW2Eubm9kZU5hbWUudG9Mb3dlckNhc2UoKV07aWYoYilyZXR1cm4hKGI9PT10cnVlfHxhLmdldEF0dHJpYnV0ZSgiY2xhc3NpZCIpIT09Yil9cmV0dXJuIHRydWV9fSk7Yy5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oYSxiKXt2YXIgZD1udWxsO2lmKHR5cGVvZiBhPT09InVuZGVmaW5lZCIpe2lmKHRoaXMubGVuZ3RoKXt2YXIgZT10aGlzWzBdLmF0dHJpYnV0ZXMsZjtkPWMuZGF0YSh0aGlzWzBdKTtmb3IodmFyIGg9MCxsPWUubGVuZ3RoO2g8bDtoKyspe2Y9ZVtoXS5uYW1lO2lmKGYuaW5kZXhPZigiZGF0YS0iKT09PTApe2Y9Zi5zdWJzdHIoNSk7a2EodGhpc1swXSxmLGRbZl0pfX19cmV0dXJuIGR9ZWxzZSBpZih0eXBlb2YgYT09PSJvYmplY3QiKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtjLmRhdGEodGhpcywKYSl9KTt2YXIgaz1hLnNwbGl0KCIuIik7a1sxXT1rWzFdPyIuIitrWzFdOiIiO2lmKGI9PT1CKXtkPXRoaXMudHJpZ2dlckhhbmRsZXIoImdldERhdGEiK2tbMV0rIiEiLFtrWzBdXSk7aWYoZD09PUImJnRoaXMubGVuZ3RoKXtkPWMuZGF0YSh0aGlzWzBdLGEpO2Q9a2EodGhpc1swXSxhLGQpfXJldHVybiBkPT09QiYma1sxXT90aGlzLmRhdGEoa1swXSk6ZH1lbHNlIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgbz1jKHRoaXMpLHg9W2tbMF0sYl07by50cmlnZ2VySGFuZGxlcigic2V0RGF0YSIra1sxXSsiISIseCk7Yy5kYXRhKHRoaXMsYSxiKTtvLnRyaWdnZXJIYW5kbGVyKCJjaGFuZ2VEYXRhIitrWzFdKyIhIix4KX0pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtjLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pO2MuZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIsZCl7aWYoYSl7Yj0oYnx8ImZ4IikrInF1ZXVlIjt2YXIgZT0KYy5kYXRhKGEsYik7aWYoIWQpcmV0dXJuIGV8fFtdO2lmKCFlfHxjLmlzQXJyYXkoZCkpZT1jLmRhdGEoYSxiLGMubWFrZUFycmF5KGQpKTtlbHNlIGUucHVzaChkKTtyZXR1cm4gZX19LGRlcXVldWU6ZnVuY3Rpb24oYSxiKXtiPWJ8fCJmeCI7dmFyIGQ9Yy5xdWV1ZShhLGIpLGU9ZC5zaGlmdCgpO2lmKGU9PT0iaW5wcm9ncmVzcyIpZT1kLnNoaWZ0KCk7aWYoZSl7Yj09PSJmeCImJmQudW5zaGlmdCgiaW5wcm9ncmVzcyIpO2UuY2FsbChhLGZ1bmN0aW9uKCl7Yy5kZXF1ZXVlKGEsYil9KX19fSk7Yy5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGEhPT0ic3RyaW5nIil7Yj1hO2E9ImZ4In1pZihiPT09QilyZXR1cm4gYy5xdWV1ZSh0aGlzWzBdLGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1jLnF1ZXVlKHRoaXMsYSxiKTthPT09ImZ4IiYmZFswXSE9PSJpbnByb2dyZXNzIiYmYy5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVxdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yy5kZXF1ZXVlKHRoaXMsCmEpfSl9LGRlbGF5OmZ1bmN0aW9uKGEsYil7YT1jLmZ4P2MuZnguc3BlZWRzW2FdfHxhOmE7Yj1ifHwiZngiO3JldHVybiB0aGlzLnF1ZXVlKGIsZnVuY3Rpb24oKXt2YXIgZD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtjLmRlcXVldWUoZCxiKX0sYSl9KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5xdWV1ZShhfHwiZngiLFtdKX19KTt2YXIgc2E9L1tcblx0XS9nLGhhPS9ccysvLFNhPS9cci9nLFRhPS9eKD86aHJlZnxzcmN8c3R5bGUpJC8sVWE9L14oPzpidXR0b258aW5wdXQpJC9pLFZhPS9eKD86YnV0dG9ufGlucHV0fG9iamVjdHxzZWxlY3R8dGV4dGFyZWEpJC9pLFdhPS9eYSg/OnJlYSk/JC9pLHRhPS9eKD86cmFkaW98Y2hlY2tib3gpJC9pO2MucHJvcHM9eyJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUiLHJlYWRvbmx5OiJyZWFkT25seSIsbWF4bGVuZ3RoOiJtYXhMZW5ndGgiLGNlbGxzcGFjaW5nOiJjZWxsU3BhY2luZyIscm93c3Bhbjoicm93U3BhbiIsCmNvbHNwYW46ImNvbFNwYW4iLHRhYmluZGV4OiJ0YWJJbmRleCIsdXNlbWFwOiJ1c2VNYXAiLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciJ9O2MuZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGMuYWNjZXNzKHRoaXMsYSxiLHRydWUsYy5hdHRyKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yy5hdHRyKHRoaXMsYSwiIik7dGhpcy5ub2RlVHlwZT09PTEmJnRoaXMucmVtb3ZlQXR0cmlidXRlKGEpfSl9LGFkZENsYXNzOmZ1bmN0aW9uKGEpe2lmKGMuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHgpe3ZhciByPWModGhpcyk7ci5hZGRDbGFzcyhhLmNhbGwodGhpcyx4LHIuYXR0cigiY2xhc3MiKSkpfSk7aWYoYSYmdHlwZW9mIGE9PT0ic3RyaW5nIilmb3IodmFyIGI9KGF8fCIiKS5zcGxpdChoYSksZD0wLGU9dGhpcy5sZW5ndGg7ZDxlO2QrKyl7dmFyIGY9dGhpc1tkXTtpZihmLm5vZGVUeXBlPT09CjEpaWYoZi5jbGFzc05hbWUpe2Zvcih2YXIgaD0iICIrZi5jbGFzc05hbWUrIiAiLGw9Zi5jbGFzc05hbWUsaz0wLG89Yi5sZW5ndGg7azxvO2srKylpZihoLmluZGV4T2YoIiAiK2Jba10rIiAiKTwwKWwrPSIgIitiW2tdO2YuY2xhc3NOYW1lPWMudHJpbShsKX1lbHNlIGYuY2xhc3NOYW1lPWF9cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGEpe2lmKGMuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG8pe3ZhciB4PWModGhpcyk7eC5yZW1vdmVDbGFzcyhhLmNhbGwodGhpcyxvLHguYXR0cigiY2xhc3MiKSkpfSk7aWYoYSYmdHlwZW9mIGE9PT0ic3RyaW5nInx8YT09PUIpZm9yKHZhciBiPShhfHwiIikuc3BsaXQoaGEpLGQ9MCxlPXRoaXMubGVuZ3RoO2Q8ZTtkKyspe3ZhciBmPXRoaXNbZF07aWYoZi5ub2RlVHlwZT09PTEmJmYuY2xhc3NOYW1lKWlmKGEpe2Zvcih2YXIgaD0oIiAiK2YuY2xhc3NOYW1lKyIgIikucmVwbGFjZShzYSwiICIpLApsPTAsaz1iLmxlbmd0aDtsPGs7bCsrKWg9aC5yZXBsYWNlKCIgIitiW2xdKyIgIiwiICIpO2YuY2xhc3NOYW1lPWMudHJpbShoKX1lbHNlIGYuY2xhc3NOYW1lPSIifXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbihhLGIpe3ZhciBkPXR5cGVvZiBhLGU9dHlwZW9mIGI9PT0iYm9vbGVhbiI7aWYoYy5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZil7dmFyIGg9Yyh0aGlzKTtoLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGYsaC5hdHRyKCJjbGFzcyIpLGIpLGIpfSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2lmKGQ9PT0ic3RyaW5nIilmb3IodmFyIGYsaD0wLGw9Yyh0aGlzKSxrPWIsbz1hLnNwbGl0KGhhKTtmPW9baCsrXTspe2s9ZT9rOiFsLmhhc0NsYXNzKGYpO2xbaz8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFzcyJdKGYpfWVsc2UgaWYoZD09PSJ1bmRlZmluZWQifHxkPT09ImJvb2xlYW4iKXt0aGlzLmNsYXNzTmFtZSYmYy5kYXRhKHRoaXMsCiJfX2NsYXNzTmFtZV9fIix0aGlzLmNsYXNzTmFtZSk7dGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWV8fGE9PT1mYWxzZT8iIjpjLmRhdGEodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIn19KX0saGFzQ2xhc3M6ZnVuY3Rpb24oYSl7YT0iICIrYSsiICI7Zm9yKHZhciBiPTAsZD10aGlzLmxlbmd0aDtiPGQ7YisrKWlmKCgiICIrdGhpc1tiXS5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKHNhLCIgIikuaW5kZXhPZihhKT4tMSlyZXR1cm4gdHJ1ZTtyZXR1cm4gZmFsc2V9LHZhbDpmdW5jdGlvbihhKXtpZighYXJndW1lbnRzLmxlbmd0aCl7dmFyIGI9dGhpc1swXTtpZihiKXtpZihjLm5vZGVOYW1lKGIsIm9wdGlvbiIpKXt2YXIgZD1iLmF0dHJpYnV0ZXMudmFsdWU7cmV0dXJuIWR8fGQuc3BlY2lmaWVkP2IudmFsdWU6Yi50ZXh0fWlmKGMubm9kZU5hbWUoYiwic2VsZWN0Iikpe3ZhciBlPWIuc2VsZWN0ZWRJbmRleDtkPVtdO3ZhciBmPWIub3B0aW9ucztiPWIudHlwZT09PSJzZWxlY3Qtb25lIjsKaWYoZTwwKXJldHVybiBudWxsO3ZhciBoPWI/ZTowO2ZvcihlPWI/ZSsxOmYubGVuZ3RoO2g8ZTtoKyspe3ZhciBsPWZbaF07aWYobC5zZWxlY3RlZCYmKGMuc3VwcG9ydC5vcHREaXNhYmxlZD8hbC5kaXNhYmxlZDpsLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKT09PW51bGwpJiYoIWwucGFyZW50Tm9kZS5kaXNhYmxlZHx8IWMubm9kZU5hbWUobC5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7YT1jKGwpLnZhbCgpO2lmKGIpcmV0dXJuIGE7ZC5wdXNoKGEpfX1yZXR1cm4gZH1pZih0YS50ZXN0KGIudHlwZSkmJiFjLnN1cHBvcnQuY2hlY2tPbilyZXR1cm4gYi5nZXRBdHRyaWJ1dGUoInZhbHVlIik9PT1udWxsPyJvbiI6Yi52YWx1ZTtyZXR1cm4oYi52YWx1ZXx8IiIpLnJlcGxhY2UoU2EsIiIpfXJldHVybiBCfXZhciBrPWMuaXNGdW5jdGlvbihhKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG8pe3ZhciB4PWModGhpcykscj1hO2lmKHRoaXMubm9kZVR5cGU9PT0xKXtpZihrKXI9CmEuY2FsbCh0aGlzLG8seC52YWwoKSk7aWYocj09bnVsbClyPSIiO2Vsc2UgaWYodHlwZW9mIHI9PT0ibnVtYmVyIilyKz0iIjtlbHNlIGlmKGMuaXNBcnJheShyKSlyPWMubWFwKHIsZnVuY3Rpb24oQyl7cmV0dXJuIEM9PW51bGw/IiI6QysiIn0pO2lmKGMuaXNBcnJheShyKSYmdGEudGVzdCh0aGlzLnR5cGUpKXRoaXMuY2hlY2tlZD1jLmluQXJyYXkoeC52YWwoKSxyKT49MDtlbHNlIGlmKGMubm9kZU5hbWUodGhpcywic2VsZWN0Iikpe3ZhciBBPWMubWFrZUFycmF5KHIpO2MoIm9wdGlvbiIsdGhpcykuZWFjaChmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWQ9Yy5pbkFycmF5KGModGhpcykudmFsKCksQSk+PTB9KTtpZighQS5sZW5ndGgpdGhpcy5zZWxlY3RlZEluZGV4PS0xfWVsc2UgdGhpcy52YWx1ZT1yfX0pfX0pO2MuZXh0ZW5kKHthdHRyRm46e3ZhbDp0cnVlLGNzczp0cnVlLGh0bWw6dHJ1ZSx0ZXh0OnRydWUsZGF0YTp0cnVlLHdpZHRoOnRydWUsaGVpZ2h0OnRydWUsb2Zmc2V0OnRydWV9LAphdHRyOmZ1bmN0aW9uKGEsYixkLGUpe2lmKCFhfHxhLm5vZGVUeXBlPT09M3x8YS5ub2RlVHlwZT09PTgpcmV0dXJuIEI7aWYoZSYmYiBpbiBjLmF0dHJGbilyZXR1cm4gYyhhKVtiXShkKTtlPWEubm9kZVR5cGUhPT0xfHwhYy5pc1hNTERvYyhhKTt2YXIgZj1kIT09QjtiPWUmJmMucHJvcHNbYl18fGI7dmFyIGg9VGEudGVzdChiKTtpZigoYiBpbiBhfHxhW2JdIT09QikmJmUmJiFoKXtpZihmKXtiPT09InR5cGUiJiZVYS50ZXN0KGEubm9kZU5hbWUpJiZhLnBhcmVudE5vZGUmJmMuZXJyb3IoInR5cGUgcHJvcGVydHkgY2FuJ3QgYmUgY2hhbmdlZCIpO2lmKGQ9PT1udWxsKWEubm9kZVR5cGU9PT0xJiZhLnJlbW92ZUF0dHJpYnV0ZShiKTtlbHNlIGFbYl09ZH1pZihjLm5vZGVOYW1lKGEsImZvcm0iKSYmYS5nZXRBdHRyaWJ1dGVOb2RlKGIpKXJldHVybiBhLmdldEF0dHJpYnV0ZU5vZGUoYikubm9kZVZhbHVlO2lmKGI9PT0idGFiSW5kZXgiKXJldHVybihiPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiSW5kZXgiKSkmJgpiLnNwZWNpZmllZD9iLnZhbHVlOlZhLnRlc3QoYS5ub2RlTmFtZSl8fFdhLnRlc3QoYS5ub2RlTmFtZSkmJmEuaHJlZj8wOkI7cmV0dXJuIGFbYl19aWYoIWMuc3VwcG9ydC5zdHlsZSYmZSYmYj09PSJzdHlsZSIpe2lmKGYpYS5zdHlsZS5jc3NUZXh0PSIiK2Q7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dH1mJiZhLnNldEF0dHJpYnV0ZShiLCIiK2QpO2lmKCFhLmF0dHJpYnV0ZXNbYl0mJmEuaGFzQXR0cmlidXRlJiYhYS5oYXNBdHRyaWJ1dGUoYikpcmV0dXJuIEI7YT0hYy5zdXBwb3J0LmhyZWZOb3JtYWxpemVkJiZlJiZoP2EuZ2V0QXR0cmlidXRlKGIsMik6YS5nZXRBdHRyaWJ1dGUoYik7cmV0dXJuIGE9PT1udWxsP0I6YX19KTt2YXIgWD0vXC4oLiopJC8saWE9L14oPzp0ZXh0YXJlYXxpbnB1dHxzZWxlY3QpJC9pLExhPS9cLi9nLE1hPS8gL2csWGE9L1teXHdccy58YF0vZyxZYT1mdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKFhhLCJcXCQmIil9LHVhPXtmb2N1c2luOjAsZm9jdXNvdXQ6MH07CmMuZXZlbnQ9e2FkZDpmdW5jdGlvbihhLGIsZCxlKXtpZighKGEubm9kZVR5cGU9PT0zfHxhLm5vZGVUeXBlPT09OCkpe2lmKGMuaXNXaW5kb3coYSkmJmEhPT1FJiYhYS5mcmFtZUVsZW1lbnQpYT1FO2lmKGQ9PT1mYWxzZSlkPVU7ZWxzZSBpZighZClyZXR1cm47dmFyIGYsaDtpZihkLmhhbmRsZXIpe2Y9ZDtkPWYuaGFuZGxlcn1pZighZC5ndWlkKWQuZ3VpZD1jLmd1aWQrKztpZihoPWMuZGF0YShhKSl7dmFyIGw9YS5ub2RlVHlwZT8iZXZlbnRzIjoiX19ldmVudHNfXyIsaz1oW2xdLG89aC5oYW5kbGU7aWYodHlwZW9mIGs9PT0iZnVuY3Rpb24iKXtvPWsuaGFuZGxlO2s9ay5ldmVudHN9ZWxzZSBpZighayl7YS5ub2RlVHlwZXx8KGhbbF09aD1mdW5jdGlvbigpe30pO2guZXZlbnRzPWs9e319aWYoIW8paC5oYW5kbGU9bz1mdW5jdGlvbigpe3JldHVybiB0eXBlb2YgYyE9PSJ1bmRlZmluZWQiJiYhYy5ldmVudC50cmlnZ2VyZWQ/Yy5ldmVudC5oYW5kbGUuYXBwbHkoby5lbGVtLAphcmd1bWVudHMpOkJ9O28uZWxlbT1hO2I9Yi5zcGxpdCgiICIpO2Zvcih2YXIgeD0wLHI7bD1iW3grK107KXtoPWY/Yy5leHRlbmQoe30sZik6e2hhbmRsZXI6ZCxkYXRhOmV9O2lmKGwuaW5kZXhPZigiLiIpPi0xKXtyPWwuc3BsaXQoIi4iKTtsPXIuc2hpZnQoKTtoLm5hbWVzcGFjZT1yLnNsaWNlKDApLnNvcnQoKS5qb2luKCIuIil9ZWxzZXtyPVtdO2gubmFtZXNwYWNlPSIifWgudHlwZT1sO2lmKCFoLmd1aWQpaC5ndWlkPWQuZ3VpZDt2YXIgQT1rW2xdLEM9Yy5ldmVudC5zcGVjaWFsW2xdfHx7fTtpZighQSl7QT1rW2xdPVtdO2lmKCFDLnNldHVwfHxDLnNldHVwLmNhbGwoYSxlLHIsbyk9PT1mYWxzZSlpZihhLmFkZEV2ZW50TGlzdGVuZXIpYS5hZGRFdmVudExpc3RlbmVyKGwsbyxmYWxzZSk7ZWxzZSBhLmF0dGFjaEV2ZW50JiZhLmF0dGFjaEV2ZW50KCJvbiIrbCxvKX1pZihDLmFkZCl7Qy5hZGQuY2FsbChhLGgpO2lmKCFoLmhhbmRsZXIuZ3VpZCloLmhhbmRsZXIuZ3VpZD0KZC5ndWlkfUEucHVzaChoKTtjLmV2ZW50Lmdsb2JhbFtsXT10cnVlfWE9bnVsbH19fSxnbG9iYWw6e30scmVtb3ZlOmZ1bmN0aW9uKGEsYixkLGUpe2lmKCEoYS5ub2RlVHlwZT09PTN8fGEubm9kZVR5cGU9PT04KSl7aWYoZD09PWZhbHNlKWQ9VTt2YXIgZixoLGw9MCxrLG8seCxyLEEsQyxKPWEubm9kZVR5cGU/ImV2ZW50cyI6Il9fZXZlbnRzX18iLHc9Yy5kYXRhKGEpLEk9dyYmd1tKXTtpZih3JiZJKXtpZih0eXBlb2YgST09PSJmdW5jdGlvbiIpe3c9STtJPUkuZXZlbnRzfWlmKGImJmIudHlwZSl7ZD1iLmhhbmRsZXI7Yj1iLnR5cGV9aWYoIWJ8fHR5cGVvZiBiPT09InN0cmluZyImJmIuY2hhckF0KDApPT09Ii4iKXtiPWJ8fCIiO2ZvcihmIGluIEkpYy5ldmVudC5yZW1vdmUoYSxmK2IpfWVsc2V7Zm9yKGI9Yi5zcGxpdCgiICIpO2Y9YltsKytdOyl7cj1mO2s9Zi5pbmRleE9mKCIuIik8MDtvPVtdO2lmKCFrKXtvPWYuc3BsaXQoIi4iKTtmPW8uc2hpZnQoKTt4PVJlZ0V4cCgiKF58XFwuKSIrCmMubWFwKG8uc2xpY2UoMCkuc29ydCgpLFlhKS5qb2luKCJcXC4oPzouKlxcLik/IikrIihcXC58JCkiKX1pZihBPUlbZl0paWYoZCl7cj1jLmV2ZW50LnNwZWNpYWxbZl18fHt9O2ZvcihoPWV8fDA7aDxBLmxlbmd0aDtoKyspe0M9QVtoXTtpZihkLmd1aWQ9PT1DLmd1aWQpe2lmKGt8fHgudGVzdChDLm5hbWVzcGFjZSkpe2U9PW51bGwmJkEuc3BsaWNlKGgtLSwxKTtyLnJlbW92ZSYmci5yZW1vdmUuY2FsbChhLEMpfWlmKGUhPW51bGwpYnJlYWt9fWlmKEEubGVuZ3RoPT09MHx8ZSE9bnVsbCYmQS5sZW5ndGg9PT0xKXtpZighci50ZWFyZG93bnx8ci50ZWFyZG93bi5jYWxsKGEsbyk9PT1mYWxzZSljLnJlbW92ZUV2ZW50KGEsZix3LmhhbmRsZSk7ZGVsZXRlIElbZl19fWVsc2UgZm9yKGg9MDtoPEEubGVuZ3RoO2grKyl7Qz1BW2hdO2lmKGt8fHgudGVzdChDLm5hbWVzcGFjZSkpe2MuZXZlbnQucmVtb3ZlKGEscixDLmhhbmRsZXIsaCk7QS5zcGxpY2UoaC0tLDEpfX19aWYoYy5pc0VtcHR5T2JqZWN0KEkpKXtpZihiPQp3LmhhbmRsZSliLmVsZW09bnVsbDtkZWxldGUgdy5ldmVudHM7ZGVsZXRlIHcuaGFuZGxlO2lmKHR5cGVvZiB3PT09ImZ1bmN0aW9uIiljLnJlbW92ZURhdGEoYSxKKTtlbHNlIGMuaXNFbXB0eU9iamVjdCh3KSYmYy5yZW1vdmVEYXRhKGEpfX19fX0sdHJpZ2dlcjpmdW5jdGlvbihhLGIsZCxlKXt2YXIgZj1hLnR5cGV8fGE7aWYoIWUpe2E9dHlwZW9mIGE9PT0ib2JqZWN0Ij9hW2MuZXhwYW5kb10/YTpjLmV4dGVuZChjLkV2ZW50KGYpLGEpOmMuRXZlbnQoZik7aWYoZi5pbmRleE9mKCIhIik+PTApe2EudHlwZT1mPWYuc2xpY2UoMCwtMSk7YS5leGNsdXNpdmU9dHJ1ZX1pZighZCl7YS5zdG9wUHJvcGFnYXRpb24oKTtjLmV2ZW50Lmdsb2JhbFtmXSYmYy5lYWNoKGMuY2FjaGUsZnVuY3Rpb24oKXt0aGlzLmV2ZW50cyYmdGhpcy5ldmVudHNbZl0mJmMuZXZlbnQudHJpZ2dlcihhLGIsdGhpcy5oYW5kbGUuZWxlbSl9KX1pZighZHx8ZC5ub2RlVHlwZT09PTN8fGQubm9kZVR5cGU9PT0KOClyZXR1cm4gQjthLnJlc3VsdD1CO2EudGFyZ2V0PWQ7Yj1jLm1ha2VBcnJheShiKTtiLnVuc2hpZnQoYSl9YS5jdXJyZW50VGFyZ2V0PWQ7KGU9ZC5ub2RlVHlwZT9jLmRhdGEoZCwiaGFuZGxlIik6KGMuZGF0YShkLCJfX2V2ZW50c19fIil8fHt9KS5oYW5kbGUpJiZlLmFwcGx5KGQsYik7ZT1kLnBhcmVudE5vZGV8fGQub3duZXJEb2N1bWVudDt0cnl7aWYoIShkJiZkLm5vZGVOYW1lJiZjLm5vRGF0YVtkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSlpZihkWyJvbiIrZl0mJmRbIm9uIitmXS5hcHBseShkLGIpPT09ZmFsc2Upe2EucmVzdWx0PWZhbHNlO2EucHJldmVudERlZmF1bHQoKX19Y2F0Y2goaCl7fWlmKCFhLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmUpYy5ldmVudC50cmlnZ2VyKGEsYixlLHRydWUpO2Vsc2UgaWYoIWEuaXNEZWZhdWx0UHJldmVudGVkKCkpe3ZhciBsO2U9YS50YXJnZXQ7dmFyIGs9Zi5yZXBsYWNlKFgsIiIpLG89Yy5ub2RlTmFtZShlLCJhIikmJms9PT0KImNsaWNrIix4PWMuZXZlbnQuc3BlY2lhbFtrXXx8e307aWYoKCF4Ll9kZWZhdWx0fHx4Ll9kZWZhdWx0LmNhbGwoZCxhKT09PWZhbHNlKSYmIW8mJiEoZSYmZS5ub2RlTmFtZSYmYy5ub0RhdGFbZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkpe3RyeXtpZihlW2tdKXtpZihsPWVbIm9uIitrXSllWyJvbiIra109bnVsbDtjLmV2ZW50LnRyaWdnZXJlZD10cnVlO2Vba10oKX19Y2F0Y2gocil7fWlmKGwpZVsib24iK2tdPWw7Yy5ldmVudC50cmlnZ2VyZWQ9ZmFsc2V9fX0saGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBiLGQsZSxmO2Q9W107dmFyIGg9Yy5tYWtlQXJyYXkoYXJndW1lbnRzKTthPWhbMF09Yy5ldmVudC5maXgoYXx8RS5ldmVudCk7YS5jdXJyZW50VGFyZ2V0PXRoaXM7Yj1hLnR5cGUuaW5kZXhPZigiLiIpPDAmJiFhLmV4Y2x1c2l2ZTtpZighYil7ZT1hLnR5cGUuc3BsaXQoIi4iKTthLnR5cGU9ZS5zaGlmdCgpO2Q9ZS5zbGljZSgwKS5zb3J0KCk7ZT1SZWdFeHAoIihefFxcLikiKwpkLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSsiKFxcLnwkKSIpfWEubmFtZXNwYWNlPWEubmFtZXNwYWNlfHxkLmpvaW4oIi4iKTtmPWMuZGF0YSh0aGlzLHRoaXMubm9kZVR5cGU/ImV2ZW50cyI6Il9fZXZlbnRzX18iKTtpZih0eXBlb2YgZj09PSJmdW5jdGlvbiIpZj1mLmV2ZW50cztkPShmfHx7fSlbYS50eXBlXTtpZihmJiZkKXtkPWQuc2xpY2UoMCk7Zj0wO2Zvcih2YXIgbD1kLmxlbmd0aDtmPGw7ZisrKXt2YXIgaz1kW2ZdO2lmKGJ8fGUudGVzdChrLm5hbWVzcGFjZSkpe2EuaGFuZGxlcj1rLmhhbmRsZXI7YS5kYXRhPWsuZGF0YTthLmhhbmRsZU9iaj1rO2s9ay5oYW5kbGVyLmFwcGx5KHRoaXMsaCk7aWYoayE9PUIpe2EucmVzdWx0PWs7aWYoaz09PWZhbHNlKXthLnByZXZlbnREZWZhdWx0KCk7YS5zdG9wUHJvcGFnYXRpb24oKX19aWYoYS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKWJyZWFrfX19cmV0dXJuIGEucmVzdWx0fSxwcm9wczoiYWx0S2V5IGF0dHJDaGFuZ2UgYXR0ck5hbWUgYnViYmxlcyBidXR0b24gY2FuY2VsYWJsZSBjaGFyQ29kZSBjbGllbnRYIGNsaWVudFkgY3RybEtleSBjdXJyZW50VGFyZ2V0IGRhdGEgZGV0YWlsIGV2ZW50UGhhc2UgZnJvbUVsZW1lbnQgaGFuZGxlciBrZXlDb2RlIGxheWVyWCBsYXllclkgbWV0YUtleSBuZXdWYWx1ZSBvZmZzZXRYIG9mZnNldFkgcGFnZVggcGFnZVkgcHJldlZhbHVlIHJlbGF0ZWROb2RlIHJlbGF0ZWRUYXJnZXQgc2NyZWVuWCBzY3JlZW5ZIHNoaWZ0S2V5IHNyY0VsZW1lbnQgdGFyZ2V0IHRvRWxlbWVudCB2aWV3IHdoZWVsRGVsdGEgd2hpY2giLnNwbGl0KCIgIiksCmZpeDpmdW5jdGlvbihhKXtpZihhW2MuZXhwYW5kb10pcmV0dXJuIGE7dmFyIGI9YTthPWMuRXZlbnQoYik7Zm9yKHZhciBkPXRoaXMucHJvcHMubGVuZ3RoLGU7ZDspe2U9dGhpcy5wcm9wc1stLWRdO2FbZV09YltlXX1pZighYS50YXJnZXQpYS50YXJnZXQ9YS5zcmNFbGVtZW50fHx0O2lmKGEudGFyZ2V0Lm5vZGVUeXBlPT09MylhLnRhcmdldD1hLnRhcmdldC5wYXJlbnROb2RlO2lmKCFhLnJlbGF0ZWRUYXJnZXQmJmEuZnJvbUVsZW1lbnQpYS5yZWxhdGVkVGFyZ2V0PWEuZnJvbUVsZW1lbnQ9PT1hLnRhcmdldD9hLnRvRWxlbWVudDphLmZyb21FbGVtZW50O2lmKGEucGFnZVg9PW51bGwmJmEuY2xpZW50WCE9bnVsbCl7Yj10LmRvY3VtZW50RWxlbWVudDtkPXQuYm9keTthLnBhZ2VYPWEuY2xpZW50WCsoYiYmYi5zY3JvbGxMZWZ0fHxkJiZkLnNjcm9sbExlZnR8fDApLShiJiZiLmNsaWVudExlZnR8fGQmJmQuY2xpZW50TGVmdHx8MCk7YS5wYWdlWT1hLmNsaWVudFkrKGImJmIuc2Nyb2xsVG9wfHwKZCYmZC5zY3JvbGxUb3B8fDApLShiJiZiLmNsaWVudFRvcHx8ZCYmZC5jbGllbnRUb3B8fDApfWlmKGEud2hpY2g9PW51bGwmJihhLmNoYXJDb2RlIT1udWxsfHxhLmtleUNvZGUhPW51bGwpKWEud2hpY2g9YS5jaGFyQ29kZSE9bnVsbD9hLmNoYXJDb2RlOmEua2V5Q29kZTtpZighYS5tZXRhS2V5JiZhLmN0cmxLZXkpYS5tZXRhS2V5PWEuY3RybEtleTtpZighYS53aGljaCYmYS5idXR0b24hPT1CKWEud2hpY2g9YS5idXR0b24mMT8xOmEuYnV0dG9uJjI/MzphLmJ1dHRvbiY0PzI6MDtyZXR1cm4gYX0sZ3VpZDoxRTgscHJveHk6Yy5wcm94eSxzcGVjaWFsOntyZWFkeTp7c2V0dXA6Yy5iaW5kUmVhZHksdGVhcmRvd246Yy5ub29wfSxsaXZlOnthZGQ6ZnVuY3Rpb24oYSl7Yy5ldmVudC5hZGQodGhpcyxZKGEub3JpZ1R5cGUsYS5zZWxlY3RvciksYy5leHRlbmQoe30sYSx7aGFuZGxlcjpLYSxndWlkOmEuaGFuZGxlci5ndWlkfSkpfSxyZW1vdmU6ZnVuY3Rpb24oYSl7Yy5ldmVudC5yZW1vdmUodGhpcywKWShhLm9yaWdUeXBlLGEuc2VsZWN0b3IpLGEpfX0sYmVmb3JldW5sb2FkOntzZXR1cDpmdW5jdGlvbihhLGIsZCl7aWYoYy5pc1dpbmRvdyh0aGlzKSl0aGlzLm9uYmVmb3JldW5sb2FkPWR9LHRlYXJkb3duOmZ1bmN0aW9uKGEsYil7aWYodGhpcy5vbmJlZm9yZXVubG9hZD09PWIpdGhpcy5vbmJlZm9yZXVubG9hZD1udWxsfX19fTtjLnJlbW92ZUV2ZW50PXQucmVtb3ZlRXZlbnRMaXN0ZW5lcj9mdW5jdGlvbihhLGIsZCl7YS5yZW1vdmVFdmVudExpc3RlbmVyJiZhLnJlbW92ZUV2ZW50TGlzdGVuZXIoYixkLGZhbHNlKX06ZnVuY3Rpb24oYSxiLGQpe2EuZGV0YWNoRXZlbnQmJmEuZGV0YWNoRXZlbnQoIm9uIitiLGQpfTtjLkV2ZW50PWZ1bmN0aW9uKGEpe2lmKCF0aGlzLnByZXZlbnREZWZhdWx0KXJldHVybiBuZXcgYy5FdmVudChhKTtpZihhJiZhLnR5cGUpe3RoaXMub3JpZ2luYWxFdmVudD1hO3RoaXMudHlwZT1hLnR5cGV9ZWxzZSB0aGlzLnR5cGU9YTt0aGlzLnRpbWVTdGFtcD0KYy5ub3coKTt0aGlzW2MuZXhwYW5kb109dHJ1ZX07Yy5FdmVudC5wcm90b3R5cGU9e3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9Y2E7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O2lmKGEpaWYoYS5wcmV2ZW50RGVmYXVsdClhLnByZXZlbnREZWZhdWx0KCk7ZWxzZSBhLnJldHVyblZhbHVlPWZhbHNlfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPWNhO3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDtpZihhKXthLnN0b3BQcm9wYWdhdGlvbiYmYS5zdG9wUHJvcGFnYXRpb24oKTthLmNhbmNlbEJ1YmJsZT10cnVlfX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1jYTt0aGlzLnN0b3BQcm9wYWdhdGlvbigpfSxpc0RlZmF1bHRQcmV2ZW50ZWQ6VSxpc1Byb3BhZ2F0aW9uU3RvcHBlZDpVLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOlV9Owp2YXIgdmE9ZnVuY3Rpb24oYSl7dmFyIGI9YS5yZWxhdGVkVGFyZ2V0O3RyeXtmb3IoO2ImJmIhPT10aGlzOyliPWIucGFyZW50Tm9kZTtpZihiIT09dGhpcyl7YS50eXBlPWEuZGF0YTtjLmV2ZW50LmhhbmRsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWNhdGNoKGQpe319LHdhPWZ1bmN0aW9uKGEpe2EudHlwZT1hLmRhdGE7Yy5ldmVudC5oYW5kbGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtjLmVhY2goe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSxmdW5jdGlvbihhLGIpe2MuZXZlbnQuc3BlY2lhbFthXT17c2V0dXA6ZnVuY3Rpb24oZCl7Yy5ldmVudC5hZGQodGhpcyxiLGQmJmQuc2VsZWN0b3I/d2E6dmEsYSl9LHRlYXJkb3duOmZ1bmN0aW9uKGQpe2MuZXZlbnQucmVtb3ZlKHRoaXMsYixkJiZkLnNlbGVjdG9yP3dhOnZhKX19fSk7aWYoIWMuc3VwcG9ydC5zdWJtaXRCdWJibGVzKWMuZXZlbnQuc3BlY2lhbC5zdWJtaXQ9e3NldHVwOmZ1bmN0aW9uKCl7aWYodGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09CiJmb3JtIil7Yy5ldmVudC5hZGQodGhpcywiY2xpY2suc3BlY2lhbFN1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsZD1iLnR5cGU7aWYoKGQ9PT0ic3VibWl0Inx8ZD09PSJpbWFnZSIpJiZjKGIpLmNsb3Nlc3QoImZvcm0iKS5sZW5ndGgpe2EubGl2ZUZpcmVkPUI7cmV0dXJuIGxhKCJzdWJtaXQiLHRoaXMsYXJndW1lbnRzKX19KTtjLmV2ZW50LmFkZCh0aGlzLCJrZXlwcmVzcy5zcGVjaWFsU3VibWl0IixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldCxkPWIudHlwZTtpZigoZD09PSJ0ZXh0Inx8ZD09PSJwYXNzd29yZCIpJiZjKGIpLmNsb3Nlc3QoImZvcm0iKS5sZW5ndGgmJmEua2V5Q29kZT09PTEzKXthLmxpdmVGaXJlZD1CO3JldHVybiBsYSgic3VibWl0Iix0aGlzLGFyZ3VtZW50cyl9fSl9ZWxzZSByZXR1cm4gZmFsc2V9LHRlYXJkb3duOmZ1bmN0aW9uKCl7Yy5ldmVudC5yZW1vdmUodGhpcywiLnNwZWNpYWxTdWJtaXQiKX19O2lmKCFjLnN1cHBvcnQuY2hhbmdlQnViYmxlcyl7dmFyIFYsCnhhPWZ1bmN0aW9uKGEpe3ZhciBiPWEudHlwZSxkPWEudmFsdWU7aWYoYj09PSJyYWRpbyJ8fGI9PT0iY2hlY2tib3giKWQ9YS5jaGVja2VkO2Vsc2UgaWYoYj09PSJzZWxlY3QtbXVsdGlwbGUiKWQ9YS5zZWxlY3RlZEluZGV4Pi0xP2MubWFwKGEub3B0aW9ucyxmdW5jdGlvbihlKXtyZXR1cm4gZS5zZWxlY3RlZH0pLmpvaW4oIi0iKToiIjtlbHNlIGlmKGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJzZWxlY3QiKWQ9YS5zZWxlY3RlZEluZGV4O3JldHVybiBkfSxaPWZ1bmN0aW9uKGEsYil7dmFyIGQ9YS50YXJnZXQsZSxmO2lmKCEoIWlhLnRlc3QoZC5ub2RlTmFtZSl8fGQucmVhZE9ubHkpKXtlPWMuZGF0YShkLCJfY2hhbmdlX2RhdGEiKTtmPXhhKGQpO2lmKGEudHlwZSE9PSJmb2N1c291dCJ8fGQudHlwZSE9PSJyYWRpbyIpYy5kYXRhKGQsIl9jaGFuZ2VfZGF0YSIsZik7aWYoIShlPT09Qnx8Zj09PWUpKWlmKGUhPW51bGx8fGYpe2EudHlwZT0iY2hhbmdlIjthLmxpdmVGaXJlZD0KQjtyZXR1cm4gYy5ldmVudC50cmlnZ2VyKGEsYixkKX19fTtjLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtmaWx0ZXJzOntmb2N1c291dDpaLGJlZm9yZWRlYWN0aXZhdGU6WixjbGljazpmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldCxkPWIudHlwZTtpZihkPT09InJhZGlvInx8ZD09PSJjaGVja2JveCJ8fGIubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJzZWxlY3QiKXJldHVybiBaLmNhbGwodGhpcyxhKX0sa2V5ZG93bjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldCxkPWIudHlwZTtpZihhLmtleUNvZGU9PT0xMyYmYi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09InRleHRhcmVhInx8YS5rZXlDb2RlPT09MzImJihkPT09ImNoZWNrYm94Inx8ZD09PSJyYWRpbyIpfHxkPT09InNlbGVjdC1tdWx0aXBsZSIpcmV0dXJuIFouY2FsbCh0aGlzLGEpfSxiZWZvcmVhY3RpdmF0ZTpmdW5jdGlvbihhKXthPWEudGFyZ2V0O2MuZGF0YShhLCJfY2hhbmdlX2RhdGEiLHhhKGEpKX19LHNldHVwOmZ1bmN0aW9uKCl7aWYodGhpcy50eXBlPT09CiJmaWxlIilyZXR1cm4gZmFsc2U7Zm9yKHZhciBhIGluIFYpYy5ldmVudC5hZGQodGhpcyxhKyIuc3BlY2lhbENoYW5nZSIsVlthXSk7cmV0dXJuIGlhLnRlc3QodGhpcy5ub2RlTmFtZSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7Yy5ldmVudC5yZW1vdmUodGhpcywiLnNwZWNpYWxDaGFuZ2UiKTtyZXR1cm4gaWEudGVzdCh0aGlzLm5vZGVOYW1lKX19O1Y9Yy5ldmVudC5zcGVjaWFsLmNoYW5nZS5maWx0ZXJzO1YuZm9jdXM9Vi5iZWZvcmVhY3RpdmF0ZX10LmFkZEV2ZW50TGlzdGVuZXImJmMuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBkKGUpe2U9Yy5ldmVudC5maXgoZSk7ZS50eXBlPWI7cmV0dXJuIGMuZXZlbnQudHJpZ2dlcihlLG51bGwsZS50YXJnZXQpfWMuZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXt1YVtiXSsrPT09MCYmdC5hZGRFdmVudExpc3RlbmVyKGEsZCx0cnVlKX0sdGVhcmRvd246ZnVuY3Rpb24oKXstLXVhW2JdPT09CjAmJnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGQsdHJ1ZSl9fX0pO2MuZWFjaChbImJpbmQiLCJvbmUiXSxmdW5jdGlvbihhLGIpe2MuZm5bYl09ZnVuY3Rpb24oZCxlLGYpe2lmKHR5cGVvZiBkPT09Im9iamVjdCIpe2Zvcih2YXIgaCBpbiBkKXRoaXNbYl0oaCxlLGRbaF0sZik7cmV0dXJuIHRoaXN9aWYoYy5pc0Z1bmN0aW9uKGUpfHxlPT09ZmFsc2Upe2Y9ZTtlPUJ9dmFyIGw9Yj09PSJvbmUiP2MucHJveHkoZixmdW5jdGlvbihvKXtjKHRoaXMpLnVuYmluZChvLGwpO3JldHVybiBmLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pOmY7aWYoZD09PSJ1bmxvYWQiJiZiIT09Im9uZSIpdGhpcy5vbmUoZCxlLGYpO2Vsc2V7aD0wO2Zvcih2YXIgaz10aGlzLmxlbmd0aDtoPGs7aCsrKWMuZXZlbnQuYWRkKHRoaXNbaF0sZCxsLGUpfXJldHVybiB0aGlzfX0pO2MuZm4uZXh0ZW5kKHt1bmJpbmQ6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYT09PSJvYmplY3QiJiYhYS5wcmV2ZW50RGVmYXVsdClmb3IodmFyIGQgaW4gYSl0aGlzLnVuYmluZChkLAphW2RdKTtlbHNle2Q9MDtmb3IodmFyIGU9dGhpcy5sZW5ndGg7ZDxlO2QrKyljLmV2ZW50LnJlbW92ZSh0aGlzW2RdLGEsYil9cmV0dXJuIHRoaXN9LGRlbGVnYXRlOmZ1bmN0aW9uKGEsYixkLGUpe3JldHVybiB0aGlzLmxpdmUoYixkLGUsYSl9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPT09MD90aGlzLnVuYmluZCgibGl2ZSIpOnRoaXMuZGllKGIsbnVsbCxkLGEpfSx0cmlnZ2VyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2MuZXZlbnQudHJpZ2dlcihhLGIsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oYSxiKXtpZih0aGlzWzBdKXt2YXIgZD1jLkV2ZW50KGEpO2QucHJldmVudERlZmF1bHQoKTtkLnN0b3BQcm9wYWdhdGlvbigpO2MuZXZlbnQudHJpZ2dlcihkLGIsdGhpc1swXSk7cmV0dXJuIGQucmVzdWx0fX0sdG9nZ2xlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1hcmd1bWVudHMsZD0KMTtkPGIubGVuZ3RoOyljLnByb3h5KGEsYltkKytdKTtyZXR1cm4gdGhpcy5jbGljayhjLnByb3h5KGEsZnVuY3Rpb24oZSl7dmFyIGY9KGMuZGF0YSh0aGlzLCJsYXN0VG9nZ2xlIithLmd1aWQpfHwwKSVkO2MuZGF0YSh0aGlzLCJsYXN0VG9nZ2xlIithLmd1aWQsZisxKTtlLnByZXZlbnREZWZhdWx0KCk7cmV0dXJuIGJbZl0uYXBwbHkodGhpcyxhcmd1bWVudHMpfHxmYWxzZX0pKX0saG92ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGEpLm1vdXNlbGVhdmUoYnx8YSl9fSk7dmFyIHlhPXtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQiLG1vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifTtjLmVhY2goWyJsaXZlIiwiZGllIl0sZnVuY3Rpb24oYSxiKXtjLmZuW2JdPWZ1bmN0aW9uKGQsZSxmLGgpe3ZhciBsLGs9MCxvLHgscj1ofHx0aGlzLnNlbGVjdG9yO2g9aD90aGlzOmModGhpcy5jb250ZXh0KTtpZih0eXBlb2YgZD09PQoib2JqZWN0IiYmIWQucHJldmVudERlZmF1bHQpe2ZvcihsIGluIGQpaFtiXShsLGUsZFtsXSxyKTtyZXR1cm4gdGhpc31pZihjLmlzRnVuY3Rpb24oZSkpe2Y9ZTtlPUJ9Zm9yKGQ9KGR8fCIiKS5zcGxpdCgiICIpOyhsPWRbaysrXSkhPW51bGw7KXtvPVguZXhlYyhsKTt4PSIiO2lmKG8pe3g9b1swXTtsPWwucmVwbGFjZShYLCIiKX1pZihsPT09ImhvdmVyIilkLnB1c2goIm1vdXNlZW50ZXIiK3gsIm1vdXNlbGVhdmUiK3gpO2Vsc2V7bz1sO2lmKGw9PT0iZm9jdXMifHxsPT09ImJsdXIiKXtkLnB1c2goeWFbbF0reCk7bCs9eH1lbHNlIGw9KHlhW2xdfHxsKSt4O2lmKGI9PT0ibGl2ZSIpe3g9MDtmb3IodmFyIEE9aC5sZW5ndGg7eDxBO3grKyljLmV2ZW50LmFkZChoW3hdLCJsaXZlLiIrWShsLHIpLHtkYXRhOmUsc2VsZWN0b3I6cixoYW5kbGVyOmYsb3JpZ1R5cGU6bCxvcmlnSGFuZGxlcjpmLHByZVR5cGU6b30pfWVsc2UgaC51bmJpbmQoImxpdmUuIitZKGwsciksZil9fXJldHVybiB0aGlzfX0pOwpjLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtjLmZuW2JdPWZ1bmN0aW9uKGQsZSl7aWYoZT09bnVsbCl7ZT1kO2Q9bnVsbH1yZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMuYmluZChiLGQsZSk6dGhpcy50cmlnZ2VyKGIpfTtpZihjLmF0dHJGbiljLmF0dHJGbltiXT10cnVlfSk7RS5hdHRhY2hFdmVudCYmIUUuYWRkRXZlbnRMaXN0ZW5lciYmYyhFKS5iaW5kKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIGMuY2FjaGUpaWYoYy5jYWNoZVthXS5oYW5kbGUpdHJ5e2MuZXZlbnQucmVtb3ZlKGMuY2FjaGVbYV0uaGFuZGxlLmVsZW0pfWNhdGNoKGIpe319KTsKKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShnLGksbixtLHAscSl7cD0wO2Zvcih2YXIgdT1tLmxlbmd0aDtwPHU7cCsrKXt2YXIgeT1tW3BdO2lmKHkpe3ZhciBGPWZhbHNlO2Zvcih5PXlbZ107eTspe2lmKHkuc2l6Y2FjaGU9PT1uKXtGPW1beS5zaXpzZXRdO2JyZWFrfWlmKHkubm9kZVR5cGU9PT0xJiYhcSl7eS5zaXpjYWNoZT1uO3kuc2l6c2V0PXB9aWYoeS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09aSl7Rj15O2JyZWFrfXk9eVtnXX1tW3BdPUZ9fX1mdW5jdGlvbiBiKGcsaSxuLG0scCxxKXtwPTA7Zm9yKHZhciB1PW0ubGVuZ3RoO3A8dTtwKyspe3ZhciB5PW1bcF07aWYoeSl7dmFyIEY9ZmFsc2U7Zm9yKHk9eVtnXTt5Oyl7aWYoeS5zaXpjYWNoZT09PW4pe0Y9bVt5LnNpenNldF07YnJlYWt9aWYoeS5ub2RlVHlwZT09PTEpe2lmKCFxKXt5LnNpemNhY2hlPW47eS5zaXpzZXQ9cH1pZih0eXBlb2YgaSE9PSJzdHJpbmciKXtpZih5PT09aSl7Rj10cnVlO2JyZWFrfX1lbHNlIGlmKGsuZmlsdGVyKGksClt5XSkubGVuZ3RoPjApe0Y9eTticmVha319eT15W2ddfW1bcF09Rn19fXZhciBkPS8oKD86XCgoPzpcKFteKCldK1wpfFteKCldKykrXCl8XFsoPzpcW1teXFtcXV0qXF18WyciXVteJyJdKlsnIl18W15cW1xdJyJdKykrXF18XFwufFteID4rfiwoXFtcXF0rKSt8Wz4rfl0pKFxzKixccyopPygoPzoufFxyfFxuKSopL2csZT0wLGY9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxoPWZhbHNlLGw9dHJ1ZTtbMCwwXS5zb3J0KGZ1bmN0aW9uKCl7bD1mYWxzZTtyZXR1cm4gMH0pO3ZhciBrPWZ1bmN0aW9uKGcsaSxuLG0pe249bnx8W107dmFyIHA9aT1pfHx0O2lmKGkubm9kZVR5cGUhPT0xJiZpLm5vZGVUeXBlIT09OSlyZXR1cm5bXTtpZighZ3x8dHlwZW9mIGchPT0ic3RyaW5nIilyZXR1cm4gbjt2YXIgcSx1LHksRixNLE49dHJ1ZSxPPWsuaXNYTUwoaSksRD1bXSxSPWc7ZG97ZC5leGVjKCIiKTtpZihxPWQuZXhlYyhSKSl7Uj1xWzNdO0QucHVzaChxWzFdKTtpZihxWzJdKXtGPXFbM107CmJyZWFrfX19d2hpbGUocSk7aWYoRC5sZW5ndGg+MSYmeC5leGVjKGcpKWlmKEQubGVuZ3RoPT09MiYmby5yZWxhdGl2ZVtEWzBdXSl1PUwoRFswXStEWzFdLGkpO2Vsc2UgZm9yKHU9by5yZWxhdGl2ZVtEWzBdXT9baV06ayhELnNoaWZ0KCksaSk7RC5sZW5ndGg7KXtnPUQuc2hpZnQoKTtpZihvLnJlbGF0aXZlW2ddKWcrPUQuc2hpZnQoKTt1PUwoZyx1KX1lbHNle2lmKCFtJiZELmxlbmd0aD4xJiZpLm5vZGVUeXBlPT09OSYmIU8mJm8ubWF0Y2guSUQudGVzdChEWzBdKSYmIW8ubWF0Y2guSUQudGVzdChEW0QubGVuZ3RoLTFdKSl7cT1rLmZpbmQoRC5zaGlmdCgpLGksTyk7aT1xLmV4cHI/ay5maWx0ZXIocS5leHByLHEuc2V0KVswXTpxLnNldFswXX1pZihpKXtxPW0/e2V4cHI6RC5wb3AoKSxzZXQ6QyhtKX06ay5maW5kKEQucG9wKCksRC5sZW5ndGg9PT0xJiYoRFswXT09PSJ+Inx8RFswXT09PSIrIikmJmkucGFyZW50Tm9kZT9pLnBhcmVudE5vZGU6aSxPKTt1PXEuZXhwcj9rLmZpbHRlcihxLmV4cHIsCnEuc2V0KTpxLnNldDtpZihELmxlbmd0aD4wKXk9Qyh1KTtlbHNlIE49ZmFsc2U7Zm9yKDtELmxlbmd0aDspe3E9TT1ELnBvcCgpO2lmKG8ucmVsYXRpdmVbTV0pcT1ELnBvcCgpO2Vsc2UgTT0iIjtpZihxPT1udWxsKXE9aTtvLnJlbGF0aXZlW01dKHkscSxPKX19ZWxzZSB5PVtdfXl8fCh5PXUpO3l8fGsuZXJyb3IoTXx8Zyk7aWYoZi5jYWxsKHkpPT09IltvYmplY3QgQXJyYXldIilpZihOKWlmKGkmJmkubm9kZVR5cGU9PT0xKWZvcihnPTA7eVtnXSE9bnVsbDtnKyspe2lmKHlbZ10mJih5W2ddPT09dHJ1ZXx8eVtnXS5ub2RlVHlwZT09PTEmJmsuY29udGFpbnMoaSx5W2ddKSkpbi5wdXNoKHVbZ10pfWVsc2UgZm9yKGc9MDt5W2ddIT1udWxsO2crKyl5W2ddJiZ5W2ddLm5vZGVUeXBlPT09MSYmbi5wdXNoKHVbZ10pO2Vsc2Ugbi5wdXNoLmFwcGx5KG4seSk7ZWxzZSBDKHksbik7aWYoRil7ayhGLHAsbixtKTtrLnVuaXF1ZVNvcnQobil9cmV0dXJuIG59O2sudW5pcXVlU29ydD1mdW5jdGlvbihnKXtpZih3KXtoPQpsO2cuc29ydCh3KTtpZihoKWZvcih2YXIgaT0xO2k8Zy5sZW5ndGg7aSsrKWdbaV09PT1nW2ktMV0mJmcuc3BsaWNlKGktLSwxKX1yZXR1cm4gZ307ay5tYXRjaGVzPWZ1bmN0aW9uKGcsaSl7cmV0dXJuIGsoZyxudWxsLG51bGwsaSl9O2subWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGcsaSl7cmV0dXJuIGsoaSxudWxsLG51bGwsW2ddKS5sZW5ndGg+MH07ay5maW5kPWZ1bmN0aW9uKGcsaSxuKXt2YXIgbTtpZighZylyZXR1cm5bXTtmb3IodmFyIHA9MCxxPW8ub3JkZXIubGVuZ3RoO3A8cTtwKyspe3ZhciB1LHk9by5vcmRlcltwXTtpZih1PW8ubGVmdE1hdGNoW3ldLmV4ZWMoZykpe3ZhciBGPXVbMV07dS5zcGxpY2UoMSwxKTtpZihGLnN1YnN0cihGLmxlbmd0aC0xKSE9PSJcXCIpe3VbMV09KHVbMV18fCIiKS5yZXBsYWNlKC9cXC9nLCIiKTttPW8uZmluZFt5XSh1LGksbik7aWYobSE9bnVsbCl7Zz1nLnJlcGxhY2Uoby5tYXRjaFt5XSwiIik7YnJlYWt9fX19bXx8KG09aS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKTsKcmV0dXJue3NldDptLGV4cHI6Z319O2suZmlsdGVyPWZ1bmN0aW9uKGcsaSxuLG0pe2Zvcih2YXIgcCxxLHU9Zyx5PVtdLEY9aSxNPWkmJmlbMF0mJmsuaXNYTUwoaVswXSk7ZyYmaS5sZW5ndGg7KXtmb3IodmFyIE4gaW4gby5maWx0ZXIpaWYoKHA9by5sZWZ0TWF0Y2hbTl0uZXhlYyhnKSkhPW51bGwmJnBbMl0pe3ZhciBPLEQsUj1vLmZpbHRlcltOXTtEPXBbMV07cT1mYWxzZTtwLnNwbGljZSgxLDEpO2lmKEQuc3Vic3RyKEQubGVuZ3RoLTEpIT09IlxcIil7aWYoRj09PXkpeT1bXTtpZihvLnByZUZpbHRlcltOXSlpZihwPW8ucHJlRmlsdGVyW05dKHAsRixuLHksbSxNKSl7aWYocD09PXRydWUpY29udGludWV9ZWxzZSBxPU89dHJ1ZTtpZihwKWZvcih2YXIgaj0wOyhEPUZbal0pIT1udWxsO2orKylpZihEKXtPPVIoRCxwLGosRik7dmFyIHM9bV4hIU87aWYobiYmTyE9bnVsbClpZihzKXE9dHJ1ZTtlbHNlIEZbal09ZmFsc2U7ZWxzZSBpZihzKXt5LnB1c2goRCk7cT10cnVlfX1pZihPIT09CkIpe258fChGPXkpO2c9Zy5yZXBsYWNlKG8ubWF0Y2hbTl0sIiIpO2lmKCFxKXJldHVybltdO2JyZWFrfX19aWYoZz09PXUpaWYocT09bnVsbClrLmVycm9yKGcpO2Vsc2UgYnJlYWs7dT1nfXJldHVybiBGfTtrLmVycm9yPWZ1bmN0aW9uKGcpe3Rocm93IlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrZzt9O3ZhciBvPWsuc2VsZWN0b3JzPXtvcmRlcjpbIklEIiwiTkFNRSIsIlRBRyJdLG1hdGNoOntJRDovIygoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKS8sQ0xBU1M6L1wuKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspLyxOQU1FOi9cW25hbWU9WyciXSooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylbJyJdKlxdLyxBVFRSOi9cW1xzKigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKVxzKig/OihcUz89KVxzKihbJyJdKikoLio/KVwzfClccypcXS8sVEFHOi9eKCg/Oltcd1x1MDBjMC1cdUZGRkZcKlwtXXxcXC4pKykvLENISUxEOi86KG9ubHl8bnRofGxhc3R8Zmlyc3QpLWNoaWxkKD86XCgoZXZlbnxvZGR8W1xkbitcLV0qKVwpKT8vLApQT1M6LzoobnRofGVxfGd0fGx0fGZpcnN0fGxhc3R8ZXZlbnxvZGQpKD86XCgoXGQqKVwpKT8oPz1bXlwtXXwkKS8sUFNFVURPOi86KCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspKD86XCgoWyciXT8pKCg/OlwoW15cKV0rXCl8W15cKFwpXSopKylcMlwpKT8vfSxsZWZ0TWF0Y2g6e30sYXR0ck1hcDp7ImNsYXNzIjoiY2xhc3NOYW1lIiwiZm9yIjoiaHRtbEZvciJ9LGF0dHJIYW5kbGU6e2hyZWY6ZnVuY3Rpb24oZyl7cmV0dXJuIGcuZ2V0QXR0cmlidXRlKCJocmVmIil9fSxyZWxhdGl2ZTp7IisiOmZ1bmN0aW9uKGcsaSl7dmFyIG49dHlwZW9mIGk9PT0ic3RyaW5nIixtPW4mJiEvXFcvLnRlc3QoaSk7bj1uJiYhbTtpZihtKWk9aS50b0xvd2VyQ2FzZSgpO209MDtmb3IodmFyIHA9Zy5sZW5ndGgscTttPHA7bSsrKWlmKHE9Z1ttXSl7Zm9yKDsocT1xLnByZXZpb3VzU2libGluZykmJnEubm9kZVR5cGUhPT0xOyk7Z1ttXT1ufHxxJiZxLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0KaT9xfHxmYWxzZTpxPT09aX1uJiZrLmZpbHRlcihpLGcsdHJ1ZSl9LCI+IjpmdW5jdGlvbihnLGkpe3ZhciBuLG09dHlwZW9mIGk9PT0ic3RyaW5nIixwPTAscT1nLmxlbmd0aDtpZihtJiYhL1xXLy50ZXN0KGkpKWZvcihpPWkudG9Mb3dlckNhc2UoKTtwPHE7cCsrKXtpZihuPWdbcF0pe249bi5wYXJlbnROb2RlO2dbcF09bi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09aT9uOmZhbHNlfX1lbHNle2Zvcig7cDxxO3ArKylpZihuPWdbcF0pZ1twXT1tP24ucGFyZW50Tm9kZTpuLnBhcmVudE5vZGU9PT1pO20mJmsuZmlsdGVyKGksZyx0cnVlKX19LCIiOmZ1bmN0aW9uKGcsaSxuKXt2YXIgbSxwPWUrKyxxPWI7aWYodHlwZW9mIGk9PT0ic3RyaW5nIiYmIS9cVy8udGVzdChpKSl7bT1pPWkudG9Mb3dlckNhc2UoKTtxPWF9cSgicGFyZW50Tm9kZSIsaSxwLGcsbSxuKX0sIn4iOmZ1bmN0aW9uKGcsaSxuKXt2YXIgbSxwPWUrKyxxPWI7aWYodHlwZW9mIGk9PT0ic3RyaW5nIiYmIS9cVy8udGVzdChpKSl7bT0KaT1pLnRvTG93ZXJDYXNlKCk7cT1hfXEoInByZXZpb3VzU2libGluZyIsaSxwLGcsbSxuKX19LGZpbmQ6e0lEOmZ1bmN0aW9uKGcsaSxuKXtpZih0eXBlb2YgaS5nZXRFbGVtZW50QnlJZCE9PSJ1bmRlZmluZWQiJiYhbilyZXR1cm4oZz1pLmdldEVsZW1lbnRCeUlkKGdbMV0pKSYmZy5wYXJlbnROb2RlP1tnXTpbXX0sTkFNRTpmdW5jdGlvbihnLGkpe2lmKHR5cGVvZiBpLmdldEVsZW1lbnRzQnlOYW1lIT09InVuZGVmaW5lZCIpe2Zvcih2YXIgbj1bXSxtPWkuZ2V0RWxlbWVudHNCeU5hbWUoZ1sxXSkscD0wLHE9bS5sZW5ndGg7cDxxO3ArKyltW3BdLmdldEF0dHJpYnV0ZSgibmFtZSIpPT09Z1sxXSYmbi5wdXNoKG1bcF0pO3JldHVybiBuLmxlbmd0aD09PTA/bnVsbDpufX0sVEFHOmZ1bmN0aW9uKGcsaSl7cmV0dXJuIGkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZ1sxXSl9fSxwcmVGaWx0ZXI6e0NMQVNTOmZ1bmN0aW9uKGcsaSxuLG0scCxxKXtnPSIgIitnWzFdLnJlcGxhY2UoL1xcL2csCiIiKSsiICI7aWYocSlyZXR1cm4gZztxPTA7Zm9yKHZhciB1Oyh1PWlbcV0pIT1udWxsO3ErKylpZih1KWlmKHBeKHUuY2xhc3NOYW1lJiYoIiAiK3UuY2xhc3NOYW1lKyIgIikucmVwbGFjZSgvW1x0XG5dL2csIiAiKS5pbmRleE9mKGcpPj0wKSlufHxtLnB1c2godSk7ZWxzZSBpZihuKWlbcV09ZmFsc2U7cmV0dXJuIGZhbHNlfSxJRDpmdW5jdGlvbihnKXtyZXR1cm4gZ1sxXS5yZXBsYWNlKC9cXC9nLCIiKX0sVEFHOmZ1bmN0aW9uKGcpe3JldHVybiBnWzFdLnRvTG93ZXJDYXNlKCl9LENISUxEOmZ1bmN0aW9uKGcpe2lmKGdbMV09PT0ibnRoIil7dmFyIGk9LygtPykoXGQqKW4oKD86XCt8LSk/XGQqKS8uZXhlYyhnWzJdPT09ImV2ZW4iJiYiMm4ifHxnWzJdPT09Im9kZCImJiIybisxInx8IS9cRC8udGVzdChnWzJdKSYmIjBuKyIrZ1syXXx8Z1syXSk7Z1syXT1pWzFdKyhpWzJdfHwxKS0wO2dbM109aVszXS0wfWdbMF09ZSsrO3JldHVybiBnfSxBVFRSOmZ1bmN0aW9uKGcsaSxuLAptLHAscSl7aT1nWzFdLnJlcGxhY2UoL1xcL2csIiIpO2lmKCFxJiZvLmF0dHJNYXBbaV0pZ1sxXT1vLmF0dHJNYXBbaV07aWYoZ1syXT09PSJ+PSIpZ1s0XT0iICIrZ1s0XSsiICI7cmV0dXJuIGd9LFBTRVVETzpmdW5jdGlvbihnLGksbixtLHApe2lmKGdbMV09PT0ibm90IilpZigoZC5leGVjKGdbM10pfHwiIikubGVuZ3RoPjF8fC9eXHcvLnRlc3QoZ1szXSkpZ1szXT1rKGdbM10sbnVsbCxudWxsLGkpO2Vsc2V7Zz1rLmZpbHRlcihnWzNdLGksbix0cnVlXnApO258fG0ucHVzaC5hcHBseShtLGcpO3JldHVybiBmYWxzZX1lbHNlIGlmKG8ubWF0Y2guUE9TLnRlc3QoZ1swXSl8fG8ubWF0Y2guQ0hJTEQudGVzdChnWzBdKSlyZXR1cm4gdHJ1ZTtyZXR1cm4gZ30sUE9TOmZ1bmN0aW9uKGcpe2cudW5zaGlmdCh0cnVlKTtyZXR1cm4gZ319LGZpbHRlcnM6e2VuYWJsZWQ6ZnVuY3Rpb24oZyl7cmV0dXJuIGcuZGlzYWJsZWQ9PT1mYWxzZSYmZy50eXBlIT09ImhpZGRlbiJ9LGRpc2FibGVkOmZ1bmN0aW9uKGcpe3JldHVybiBnLmRpc2FibGVkPT09CnRydWV9LGNoZWNrZWQ6ZnVuY3Rpb24oZyl7cmV0dXJuIGcuY2hlY2tlZD09PXRydWV9LHNlbGVjdGVkOmZ1bmN0aW9uKGcpe3JldHVybiBnLnNlbGVjdGVkPT09dHJ1ZX0scGFyZW50OmZ1bmN0aW9uKGcpe3JldHVybiEhZy5maXJzdENoaWxkfSxlbXB0eTpmdW5jdGlvbihnKXtyZXR1cm4hZy5maXJzdENoaWxkfSxoYXM6ZnVuY3Rpb24oZyxpLG4pe3JldHVybiEhayhuWzNdLGcpLmxlbmd0aH0saGVhZGVyOmZ1bmN0aW9uKGcpe3JldHVybi9oXGQvaS50ZXN0KGcubm9kZU5hbWUpfSx0ZXh0OmZ1bmN0aW9uKGcpe3JldHVybiJ0ZXh0Ij09PWcudHlwZX0scmFkaW86ZnVuY3Rpb24oZyl7cmV0dXJuInJhZGlvIj09PWcudHlwZX0sY2hlY2tib3g6ZnVuY3Rpb24oZyl7cmV0dXJuImNoZWNrYm94Ij09PWcudHlwZX0sZmlsZTpmdW5jdGlvbihnKXtyZXR1cm4iZmlsZSI9PT1nLnR5cGV9LHBhc3N3b3JkOmZ1bmN0aW9uKGcpe3JldHVybiJwYXNzd29yZCI9PT1nLnR5cGV9LHN1Ym1pdDpmdW5jdGlvbihnKXtyZXR1cm4ic3VibWl0Ij09PQpnLnR5cGV9LGltYWdlOmZ1bmN0aW9uKGcpe3JldHVybiJpbWFnZSI9PT1nLnR5cGV9LHJlc2V0OmZ1bmN0aW9uKGcpe3JldHVybiJyZXNldCI9PT1nLnR5cGV9LGJ1dHRvbjpmdW5jdGlvbihnKXtyZXR1cm4iYnV0dG9uIj09PWcudHlwZXx8Zy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImJ1dHRvbiJ9LGlucHV0OmZ1bmN0aW9uKGcpe3JldHVybi9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uL2kudGVzdChnLm5vZGVOYW1lKX19LHNldEZpbHRlcnM6e2ZpcnN0OmZ1bmN0aW9uKGcsaSl7cmV0dXJuIGk9PT0wfSxsYXN0OmZ1bmN0aW9uKGcsaSxuLG0pe3JldHVybiBpPT09bS5sZW5ndGgtMX0sZXZlbjpmdW5jdGlvbihnLGkpe3JldHVybiBpJTI9PT0wfSxvZGQ6ZnVuY3Rpb24oZyxpKXtyZXR1cm4gaSUyPT09MX0sbHQ6ZnVuY3Rpb24oZyxpLG4pe3JldHVybiBpPG5bM10tMH0sZ3Q6ZnVuY3Rpb24oZyxpLG4pe3JldHVybiBpPm5bM10tMH0sbnRoOmZ1bmN0aW9uKGcsaSxuKXtyZXR1cm4gblszXS0KMD09PWl9LGVxOmZ1bmN0aW9uKGcsaSxuKXtyZXR1cm4gblszXS0wPT09aX19LGZpbHRlcjp7UFNFVURPOmZ1bmN0aW9uKGcsaSxuLG0pe3ZhciBwPWlbMV0scT1vLmZpbHRlcnNbcF07aWYocSlyZXR1cm4gcShnLG4saSxtKTtlbHNlIGlmKHA9PT0iY29udGFpbnMiKXJldHVybihnLnRleHRDb250ZW50fHxnLmlubmVyVGV4dHx8ay5nZXRUZXh0KFtnXSl8fCIiKS5pbmRleE9mKGlbM10pPj0wO2Vsc2UgaWYocD09PSJub3QiKXtpPWlbM107bj0wO2ZvcihtPWkubGVuZ3RoO248bTtuKyspaWYoaVtuXT09PWcpcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlfWVsc2Ugay5lcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIitwKX0sQ0hJTEQ6ZnVuY3Rpb24oZyxpKXt2YXIgbj1pWzFdLG09Zztzd2l0Y2gobil7Y2FzZSAib25seSI6Y2FzZSAiZmlyc3QiOmZvcig7bT1tLnByZXZpb3VzU2libGluZzspaWYobS5ub2RlVHlwZT09PTEpcmV0dXJuIGZhbHNlO2lmKG49PT0KImZpcnN0IilyZXR1cm4gdHJ1ZTttPWc7Y2FzZSAibGFzdCI6Zm9yKDttPW0ubmV4dFNpYmxpbmc7KWlmKG0ubm9kZVR5cGU9PT0xKXJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZTtjYXNlICJudGgiOm49aVsyXTt2YXIgcD1pWzNdO2lmKG49PT0xJiZwPT09MClyZXR1cm4gdHJ1ZTt2YXIgcT1pWzBdLHU9Zy5wYXJlbnROb2RlO2lmKHUmJih1LnNpemNhY2hlIT09cXx8IWcubm9kZUluZGV4KSl7dmFyIHk9MDtmb3IobT11LmZpcnN0Q2hpbGQ7bTttPW0ubmV4dFNpYmxpbmcpaWYobS5ub2RlVHlwZT09PTEpbS5ub2RlSW5kZXg9Kyt5O3Uuc2l6Y2FjaGU9cX1tPWcubm9kZUluZGV4LXA7cmV0dXJuIG49PT0wP209PT0wOm0lbj09PTAmJm0vbj49MH19LElEOmZ1bmN0aW9uKGcsaSl7cmV0dXJuIGcubm9kZVR5cGU9PT0xJiZnLmdldEF0dHJpYnV0ZSgiaWQiKT09PWl9LFRBRzpmdW5jdGlvbihnLGkpe3JldHVybiBpPT09IioiJiZnLm5vZGVUeXBlPT09MXx8Zy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Cml9LENMQVNTOmZ1bmN0aW9uKGcsaSl7cmV0dXJuKCIgIisoZy5jbGFzc05hbWV8fGcuZ2V0QXR0cmlidXRlKCJjbGFzcyIpKSsiICIpLmluZGV4T2YoaSk+LTF9LEFUVFI6ZnVuY3Rpb24oZyxpKXt2YXIgbj1pWzFdO249by5hdHRySGFuZGxlW25dP28uYXR0ckhhbmRsZVtuXShnKTpnW25dIT1udWxsP2dbbl06Zy5nZXRBdHRyaWJ1dGUobik7dmFyIG09bisiIixwPWlbMl0scT1pWzRdO3JldHVybiBuPT1udWxsP3A9PT0iIT0iOnA9PT0iPSI/bT09PXE6cD09PSIqPSI/bS5pbmRleE9mKHEpPj0wOnA9PT0ifj0iPygiICIrbSsiICIpLmluZGV4T2YocSk+PTA6IXE/bSYmbiE9PWZhbHNlOnA9PT0iIT0iP20hPT1xOnA9PT0iXj0iP20uaW5kZXhPZihxKT09PTA6cD09PSIkPSI/bS5zdWJzdHIobS5sZW5ndGgtcS5sZW5ndGgpPT09cTpwPT09Inw9Ij9tPT09cXx8bS5zdWJzdHIoMCxxLmxlbmd0aCsxKT09PXErIi0iOmZhbHNlfSxQT1M6ZnVuY3Rpb24oZyxpLG4sbSl7dmFyIHA9by5zZXRGaWx0ZXJzW2lbMl1dOwppZihwKXJldHVybiBwKGcsbixpLG0pfX19LHg9by5tYXRjaC5QT1Mscj1mdW5jdGlvbihnLGkpe3JldHVybiJcXCIrKGktMCsxKX0sQTtmb3IoQSBpbiBvLm1hdGNoKXtvLm1hdGNoW0FdPVJlZ0V4cChvLm1hdGNoW0FdLnNvdXJjZSsvKD8hW15cW10qXF0pKD8hW15cKF0qXCkpLy5zb3VyY2UpO28ubGVmdE1hdGNoW0FdPVJlZ0V4cCgvKF4oPzoufFxyfFxuKSo/KS8uc291cmNlK28ubWF0Y2hbQV0uc291cmNlLnJlcGxhY2UoL1xcKFxkKykvZyxyKSl9dmFyIEM9ZnVuY3Rpb24oZyxpKXtnPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGcsMCk7aWYoaSl7aS5wdXNoLmFwcGx5KGksZyk7cmV0dXJuIGl9cmV0dXJuIGd9O3RyeXtBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0LmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzLDApfWNhdGNoKEope0M9ZnVuY3Rpb24oZyxpKXt2YXIgbj0wLG09aXx8W107aWYoZi5jYWxsKGcpPT09IltvYmplY3QgQXJyYXldIilBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShtLApnKTtlbHNlIGlmKHR5cGVvZiBnLmxlbmd0aD09PSJudW1iZXIiKWZvcih2YXIgcD1nLmxlbmd0aDtuPHA7bisrKW0ucHVzaChnW25dKTtlbHNlIGZvcig7Z1tuXTtuKyspbS5wdXNoKGdbbl0pO3JldHVybiBtfX12YXIgdyxJO2lmKHQuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKXc9ZnVuY3Rpb24oZyxpKXtpZihnPT09aSl7aD10cnVlO3JldHVybiAwfWlmKCFnLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9ufHwhaS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbilyZXR1cm4gZy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj8tMToxO3JldHVybiBnLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGkpJjQ/LTE6MX07ZWxzZXt3PWZ1bmN0aW9uKGcsaSl7dmFyIG4sbSxwPVtdLHE9W107bj1nLnBhcmVudE5vZGU7bT1pLnBhcmVudE5vZGU7dmFyIHU9bjtpZihnPT09aSl7aD10cnVlO3JldHVybiAwfWVsc2UgaWYobj09PW0pcmV0dXJuIEkoZyxpKTtlbHNlIGlmKG4pe2lmKCFtKXJldHVybiAxfWVsc2UgcmV0dXJuLTE7CmZvcig7dTspe3AudW5zaGlmdCh1KTt1PXUucGFyZW50Tm9kZX1mb3IodT1tO3U7KXtxLnVuc2hpZnQodSk7dT11LnBhcmVudE5vZGV9bj1wLmxlbmd0aDttPXEubGVuZ3RoO2Zvcih1PTA7dTxuJiZ1PG07dSsrKWlmKHBbdV0hPT1xW3VdKXJldHVybiBJKHBbdV0scVt1XSk7cmV0dXJuIHU9PT1uP0koZyxxW3VdLC0xKTpJKHBbdV0saSwxKX07ST1mdW5jdGlvbihnLGksbil7aWYoZz09PWkpcmV0dXJuIG47Zm9yKGc9Zy5uZXh0U2libGluZztnOyl7aWYoZz09PWkpcmV0dXJuLTE7Zz1nLm5leHRTaWJsaW5nfXJldHVybiAxfX1rLmdldFRleHQ9ZnVuY3Rpb24oZyl7Zm9yKHZhciBpPSIiLG4sbT0wO2dbbV07bSsrKXtuPWdbbV07aWYobi5ub2RlVHlwZT09PTN8fG4ubm9kZVR5cGU9PT00KWkrPW4ubm9kZVZhbHVlO2Vsc2UgaWYobi5ub2RlVHlwZSE9PTgpaSs9ay5nZXRUZXh0KG4uY2hpbGROb2Rlcyl9cmV0dXJuIGl9OyhmdW5jdGlvbigpe3ZhciBnPXQuY3JlYXRlRWxlbWVudCgiZGl2IiksCmk9InNjcmlwdCIrKG5ldyBEYXRlKS5nZXRUaW1lKCksbj10LmRvY3VtZW50RWxlbWVudDtnLmlubmVySFRNTD0iPGEgbmFtZT0nIitpKyInLz4iO24uaW5zZXJ0QmVmb3JlKGcsbi5maXJzdENoaWxkKTtpZih0LmdldEVsZW1lbnRCeUlkKGkpKXtvLmZpbmQuSUQ9ZnVuY3Rpb24obSxwLHEpe2lmKHR5cGVvZiBwLmdldEVsZW1lbnRCeUlkIT09InVuZGVmaW5lZCImJiFxKXJldHVybihwPXAuZ2V0RWxlbWVudEJ5SWQobVsxXSkpP3AuaWQ9PT1tWzFdfHx0eXBlb2YgcC5nZXRBdHRyaWJ1dGVOb2RlIT09InVuZGVmaW5lZCImJnAuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKS5ub2RlVmFsdWU9PT1tWzFdP1twXTpCOltdfTtvLmZpbHRlci5JRD1mdW5jdGlvbihtLHApe3ZhciBxPXR5cGVvZiBtLmdldEF0dHJpYnV0ZU5vZGUhPT0idW5kZWZpbmVkIiYmbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBtLm5vZGVUeXBlPT09MSYmcSYmcS5ub2RlVmFsdWU9PT1wfX1uLnJlbW92ZUNoaWxkKGcpOwpuPWc9bnVsbH0pKCk7KGZ1bmN0aW9uKCl7dmFyIGc9dC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLmFwcGVuZENoaWxkKHQuY3JlYXRlQ29tbWVudCgiIikpO2lmKGcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGg+MClvLmZpbmQuVEFHPWZ1bmN0aW9uKGksbil7dmFyIG09bi5nZXRFbGVtZW50c0J5VGFnTmFtZShpWzFdKTtpZihpWzFdPT09IioiKXtmb3IodmFyIHA9W10scT0wO21bcV07cSsrKW1bcV0ubm9kZVR5cGU9PT0xJiZwLnB1c2gobVtxXSk7bT1wfXJldHVybiBtfTtnLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiI7aWYoZy5maXJzdENoaWxkJiZ0eXBlb2YgZy5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSE9PSJ1bmRlZmluZWQiJiZnLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikhPT0iIyIpby5hdHRySGFuZGxlLmhyZWY9ZnVuY3Rpb24oaSl7cmV0dXJuIGkuZ2V0QXR0cmlidXRlKCJocmVmIiwyKX07Zz1udWxsfSkoKTt0LnF1ZXJ5U2VsZWN0b3JBbGwmJgpmdW5jdGlvbigpe3ZhciBnPWssaT10LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2kuaW5uZXJIVE1MPSI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7aWYoIShpLnF1ZXJ5U2VsZWN0b3JBbGwmJmkucXVlcnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5ndGg9PT0wKSl7az1mdW5jdGlvbihtLHAscSx1KXtwPXB8fHQ7bT1tLnJlcGxhY2UoL1w9XHMqKFteJyJcXV0qKVxzKlxdL2csIj0nJDEnXSIpO2lmKCF1JiYhay5pc1hNTChwKSlpZihwLm5vZGVUeXBlPT09OSl0cnl7cmV0dXJuIEMocC5xdWVyeVNlbGVjdG9yQWxsKG0pLHEpfWNhdGNoKHkpe31lbHNlIGlmKHAubm9kZVR5cGU9PT0xJiZwLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPT0ib2JqZWN0Iil7dmFyIEY9cC5nZXRBdHRyaWJ1dGUoImlkIiksTT1GfHwiX19zaXp6bGVfXyI7Rnx8cC5zZXRBdHRyaWJ1dGUoImlkIixNKTt0cnl7cmV0dXJuIEMocC5xdWVyeVNlbGVjdG9yQWxsKCIjIitNKyIgIittKSxxKX1jYXRjaChOKXt9ZmluYWxseXtGfHwKcC5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fXJldHVybiBnKG0scCxxLHUpfTtmb3IodmFyIG4gaW4gZylrW25dPWdbbl07aT1udWxsfX0oKTsoZnVuY3Rpb24oKXt2YXIgZz10LmRvY3VtZW50RWxlbWVudCxpPWcubWF0Y2hlc1NlbGVjdG9yfHxnLm1vek1hdGNoZXNTZWxlY3Rvcnx8Zy53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fGcubXNNYXRjaGVzU2VsZWN0b3Isbj1mYWxzZTt0cnl7aS5jYWxsKHQuZG9jdW1lbnRFbGVtZW50LCJbdGVzdCE9JyddOnNpenpsZSIpfWNhdGNoKG0pe249dHJ1ZX1pZihpKWsubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKHAscSl7cT1xLnJlcGxhY2UoL1w9XHMqKFteJyJcXV0qKVxzKlxdL2csIj0nJDEnXSIpO2lmKCFrLmlzWE1MKHApKXRyeXtpZihufHwhby5tYXRjaC5QU0VVRE8udGVzdChxKSYmIS8hPS8udGVzdChxKSlyZXR1cm4gaS5jYWxsKHAscSl9Y2F0Y2godSl7fXJldHVybiBrKHEsbnVsbCxudWxsLFtwXSkubGVuZ3RoPjB9fSkoKTsoZnVuY3Rpb24oKXt2YXIgZz0KdC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLmlubmVySFRNTD0iPGRpdiBjbGFzcz0ndGVzdCBlJz48L2Rpdj48ZGl2IGNsYXNzPSd0ZXN0Jz48L2Rpdj4iO2lmKCEoIWcuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZXx8Zy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoPT09MCkpe2cubGFzdENoaWxkLmNsYXNzTmFtZT0iZSI7aWYoZy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoIT09MSl7by5vcmRlci5zcGxpY2UoMSwwLCJDTEFTUyIpO28uZmluZC5DTEFTUz1mdW5jdGlvbihpLG4sbSl7aWYodHlwZW9mIG4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSE9PSJ1bmRlZmluZWQiJiYhbSlyZXR1cm4gbi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGlbMV0pfTtnPW51bGx9fX0pKCk7ay5jb250YWlucz10LmRvY3VtZW50RWxlbWVudC5jb250YWlucz9mdW5jdGlvbihnLGkpe3JldHVybiBnIT09aSYmKGcuY29udGFpbnM/Zy5jb250YWlucyhpKTp0cnVlKX06dC5kb2N1bWVudEVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24/CmZ1bmN0aW9uKGcsaSl7cmV0dXJuISEoZy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihpKSYxNil9OmZ1bmN0aW9uKCl7cmV0dXJuIGZhbHNlfTtrLmlzWE1MPWZ1bmN0aW9uKGcpe3JldHVybihnPShnP2cub3duZXJEb2N1bWVudHx8ZzowKS5kb2N1bWVudEVsZW1lbnQpP2cubm9kZU5hbWUhPT0iSFRNTCI6ZmFsc2V9O3ZhciBMPWZ1bmN0aW9uKGcsaSl7Zm9yKHZhciBuLG09W10scD0iIixxPWkubm9kZVR5cGU/W2ldOmk7bj1vLm1hdGNoLlBTRVVETy5leGVjKGcpOyl7cCs9blswXTtnPWcucmVwbGFjZShvLm1hdGNoLlBTRVVETywiIil9Zz1vLnJlbGF0aXZlW2ddP2crIioiOmc7bj0wO2Zvcih2YXIgdT1xLmxlbmd0aDtuPHU7bisrKWsoZyxxW25dLG0pO3JldHVybiBrLmZpbHRlcihwLG0pfTtjLmZpbmQ9aztjLmV4cHI9ay5zZWxlY3RvcnM7Yy5leHByWyI6Il09Yy5leHByLmZpbHRlcnM7Yy51bmlxdWU9ay51bmlxdWVTb3J0O2MudGV4dD1rLmdldFRleHQ7Yy5pc1hNTERvYz1rLmlzWE1MOwpjLmNvbnRhaW5zPWsuY29udGFpbnN9KSgpO3ZhciBaYT0vVW50aWwkLywkYT0vXig/OnBhcmVudHN8cHJldlVudGlsfHByZXZBbGwpLyxhYj0vLC8sTmE9L14uW146I1xbXC4sXSokLyxiYj1BcnJheS5wcm90b3R5cGUuc2xpY2UsY2I9Yy5leHByLm1hdGNoLlBPUztjLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5wdXNoU3RhY2soIiIsImZpbmQiLGEpLGQ9MCxlPTAsZj10aGlzLmxlbmd0aDtlPGY7ZSsrKXtkPWIubGVuZ3RoO2MuZmluZChhLHRoaXNbZV0sYik7aWYoZT4wKWZvcih2YXIgaD1kO2g8Yi5sZW5ndGg7aCsrKWZvcih2YXIgbD0wO2w8ZDtsKyspaWYoYltsXT09PWJbaF0pe2Iuc3BsaWNlKGgtLSwxKTticmVha319cmV0dXJuIGJ9LGhhczpmdW5jdGlvbihhKXt2YXIgYj1jKGEpO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgZD0wLGU9Yi5sZW5ndGg7ZDxlO2QrKylpZihjLmNvbnRhaW5zKHRoaXMsYltkXSkpcmV0dXJuIHRydWV9KX0sCm5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobWEodGhpcyxhLGZhbHNlKSwibm90IixhKX0sZmlsdGVyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhtYSh0aGlzLGEsdHJ1ZSksImZpbHRlciIsYSl9LGlzOmZ1bmN0aW9uKGEpe3JldHVybiEhYSYmYy5maWx0ZXIoYSx0aGlzKS5sZW5ndGg+MH0sY2xvc2VzdDpmdW5jdGlvbihhLGIpe3ZhciBkPVtdLGUsZixoPXRoaXNbMF07aWYoYy5pc0FycmF5KGEpKXt2YXIgbCxrPXt9LG89MTtpZihoJiZhLmxlbmd0aCl7ZT0wO2ZvcihmPWEubGVuZ3RoO2U8ZjtlKyspe2w9YVtlXTtrW2xdfHwoa1tsXT1jLmV4cHIubWF0Y2guUE9TLnRlc3QobCk/YyhsLGJ8fHRoaXMuY29udGV4dCk6bCl9Zm9yKDtoJiZoLm93bmVyRG9jdW1lbnQmJmghPT1iOyl7Zm9yKGwgaW4gayl7ZT1rW2xdO2lmKGUuanF1ZXJ5P2UuaW5kZXgoaCk+LTE6YyhoKS5pcyhlKSlkLnB1c2goe3NlbGVjdG9yOmwsZWxlbTpoLGxldmVsOm99KX1oPQpoLnBhcmVudE5vZGU7bysrfX1yZXR1cm4gZH1sPWNiLnRlc3QoYSk/YyhhLGJ8fHRoaXMuY29udGV4dCk6bnVsbDtlPTA7Zm9yKGY9dGhpcy5sZW5ndGg7ZTxmO2UrKylmb3IoaD10aGlzW2VdO2g7KWlmKGw/bC5pbmRleChoKT4tMTpjLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGgsYSkpe2QucHVzaChoKTticmVha31lbHNle2g9aC5wYXJlbnROb2RlO2lmKCFofHwhaC5vd25lckRvY3VtZW50fHxoPT09YilicmVha31kPWQubGVuZ3RoPjE/Yy51bmlxdWUoZCk6ZDtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZCwiY2xvc2VzdCIsYSl9LGluZGV4OmZ1bmN0aW9uKGEpe2lmKCFhfHx0eXBlb2YgYT09PSJzdHJpbmciKXJldHVybiBjLmluQXJyYXkodGhpc1swXSxhP2MoYSk6dGhpcy5wYXJlbnQoKS5jaGlsZHJlbigpKTtyZXR1cm4gYy5pbkFycmF5KGEuanF1ZXJ5P2FbMF06YSx0aGlzKX0sYWRkOmZ1bmN0aW9uKGEsYil7dmFyIGQ9dHlwZW9mIGE9PT0ic3RyaW5nIj9jKGEsYnx8dGhpcy5jb250ZXh0KToKYy5tYWtlQXJyYXkoYSksZT1jLm1lcmdlKHRoaXMuZ2V0KCksZCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKCFkWzBdfHwhZFswXS5wYXJlbnROb2RlfHxkWzBdLnBhcmVudE5vZGUubm9kZVR5cGU9PT0xMXx8IWVbMF18fCFlWzBdLnBhcmVudE5vZGV8fGVbMF0ucGFyZW50Tm9kZS5ub2RlVHlwZT09PTExP2U6Yy51bmlxdWUoZSkpfSxhbmRTZWxmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWRkKHRoaXMucHJldk9iamVjdCl9fSk7Yy5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuKGE9YS5wYXJlbnROb2RlKSYmYS5ub2RlVHlwZSE9PTExP2E6bnVsbH0scGFyZW50czpmdW5jdGlvbihhKXtyZXR1cm4gYy5kaXIoYSwicGFyZW50Tm9kZSIpfSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBjLmRpcihhLCJwYXJlbnROb2RlIixkKX0sbmV4dDpmdW5jdGlvbihhKXtyZXR1cm4gYy5udGgoYSwyLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGEpe3JldHVybiBjLm50aChhLAoyLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihhKXtyZXR1cm4gYy5kaXIoYSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihhKXtyZXR1cm4gYy5kaXIoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGMuZGlyKGEsIm5leHRTaWJsaW5nIixkKX0scHJldlVudGlsOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gYy5kaXIoYSwicHJldmlvdXNTaWJsaW5nIixkKX0sc2libGluZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIGMuc2libGluZyhhLnBhcmVudE5vZGUuZmlyc3RDaGlsZCxhKX0sY2hpbGRyZW46ZnVuY3Rpb24oYSl7cmV0dXJuIGMuc2libGluZyhhLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihhKXtyZXR1cm4gYy5ub2RlTmFtZShhLCJpZnJhbWUiKT9hLmNvbnRlbnREb2N1bWVudHx8YS5jb250ZW50V2luZG93LmRvY3VtZW50OmMubWFrZUFycmF5KGEuY2hpbGROb2Rlcyl9fSxmdW5jdGlvbihhLApiKXtjLmZuW2FdPWZ1bmN0aW9uKGQsZSl7dmFyIGY9Yy5tYXAodGhpcyxiLGQpO1phLnRlc3QoYSl8fChlPWQpO2lmKGUmJnR5cGVvZiBlPT09InN0cmluZyIpZj1jLmZpbHRlcihlLGYpO2Y9dGhpcy5sZW5ndGg+MT9jLnVuaXF1ZShmKTpmO2lmKCh0aGlzLmxlbmd0aD4xfHxhYi50ZXN0KGUpKSYmJGEudGVzdChhKSlmPWYucmV2ZXJzZSgpO3JldHVybiB0aGlzLnB1c2hTdGFjayhmLGEsYmIuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSl9fSk7Yy5leHRlbmQoe2ZpbHRlcjpmdW5jdGlvbihhLGIsZCl7aWYoZClhPSI6bm90KCIrYSsiKSI7cmV0dXJuIGIubGVuZ3RoPT09MT9jLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGJbMF0sYSk/W2JbMF1dOltdOmMuZmluZC5tYXRjaGVzKGEsYil9LGRpcjpmdW5jdGlvbihhLGIsZCl7dmFyIGU9W107Zm9yKGE9YVtiXTthJiZhLm5vZGVUeXBlIT09OSYmKGQ9PT1CfHxhLm5vZGVUeXBlIT09MXx8IWMoYSkuaXMoZCkpOyl7YS5ub2RlVHlwZT09PTEmJgplLnB1c2goYSk7YT1hW2JdfXJldHVybiBlfSxudGg6ZnVuY3Rpb24oYSxiLGQpe2I9Ynx8MTtmb3IodmFyIGU9MDthO2E9YVtkXSlpZihhLm5vZGVUeXBlPT09MSYmKytlPT09YilicmVhaztyZXR1cm4gYX0sc2libGluZzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXTthO2E9YS5uZXh0U2libGluZylhLm5vZGVUeXBlPT09MSYmYSE9PWImJmQucHVzaChhKTtyZXR1cm4gZH19KTt2YXIgemE9LyBqUXVlcnlcZCs9Iig/OlxkK3xudWxsKSIvZywkPS9eXHMrLyxBYT0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2lnLEJhPS88KFtcdzpdKykvLGRiPS88dGJvZHkvaSxlYj0vPHwmIz9cdys7LyxDYT0vPCg/OnNjcmlwdHxvYmplY3R8ZW1iZWR8b3B0aW9ufHN0eWxlKS9pLERhPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLGZiPS9cPShbXj0iJz5cc10rXC8pPi9nLFA9e29wdGlvbjpbMSwKIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSxsZWdlbmQ6WzEsIjxmaWVsZHNldD4iLCI8L2ZpZWxkc2V0PiJdLHRoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLGNvbDpbMiwiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU+Il0sYXJlYTpbMSwiPG1hcD4iLCI8L21hcD4iXSxfZGVmYXVsdDpbMCwiIiwiIl19O1Aub3B0Z3JvdXA9UC5vcHRpb247UC50Ym9keT1QLnRmb290PVAuY29sZ3JvdXA9UC5jYXB0aW9uPVAudGhlYWQ7UC50aD1QLnRkO2lmKCFjLnN1cHBvcnQuaHRtbFNlcmlhbGl6ZSlQLl9kZWZhdWx0PVsxLCJkaXY8ZGl2PiIsIjwvZGl2PiJdO2MuZm4uZXh0ZW5kKHt0ZXh0OmZ1bmN0aW9uKGEpe2lmKGMuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBkPQpjKHRoaXMpO2QudGV4dChhLmNhbGwodGhpcyxiLGQudGV4dCgpKSl9KTtpZih0eXBlb2YgYSE9PSJvYmplY3QiJiZhIT09QilyZXR1cm4gdGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRvY3VtZW50fHx0KS5jcmVhdGVUZXh0Tm9kZShhKSk7cmV0dXJuIGMudGV4dCh0aGlzKX0sd3JhcEFsbDpmdW5jdGlvbihhKXtpZihjLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihkKXtjKHRoaXMpLndyYXBBbGwoYS5jYWxsKHRoaXMsZCkpfSk7aWYodGhpc1swXSl7dmFyIGI9YyhhLHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUodHJ1ZSk7dGhpc1swXS5wYXJlbnROb2RlJiZiLmluc2VydEJlZm9yZSh0aGlzWzBdKTtiLm1hcChmdW5jdGlvbigpe2Zvcih2YXIgZD10aGlzO2QuZmlyc3RDaGlsZCYmZC5maXJzdENoaWxkLm5vZGVUeXBlPT09MTspZD1kLmZpcnN0Q2hpbGQ7cmV0dXJuIGR9KS5hcHBlbmQodGhpcyl9cmV0dXJuIHRoaXN9LAp3cmFwSW5uZXI6ZnVuY3Rpb24oYSl7aWYoYy5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Yyh0aGlzKS53cmFwSW5uZXIoYS5jYWxsKHRoaXMsYikpfSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWModGhpcyksZD1iLmNvbnRlbnRzKCk7ZC5sZW5ndGg/ZC53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2ModGhpcykud3JhcEFsbChhKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7Yy5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fGModGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsdHJ1ZSxmdW5jdGlvbihhKXt0aGlzLm5vZGVUeXBlPT09MSYmdGhpcy5hcHBlbmRDaGlsZChhKX0pfSwKcHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyx0cnVlLGZ1bmN0aW9uKGEpe3RoaXMubm9kZVR5cGU9PT0xJiZ0aGlzLmluc2VydEJlZm9yZShhLHRoaXMuZmlyc3RDaGlsZCl9KX0sYmVmb3JlOmZ1bmN0aW9uKCl7aWYodGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlKXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmYWxzZSxmdW5jdGlvbihiKXt0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGIsdGhpcyl9KTtlbHNlIGlmKGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBhPWMoYXJndW1lbnRzWzBdKTthLnB1c2guYXBwbHkoYSx0aGlzLnRvQXJyYXkoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGEsImJlZm9yZSIsYXJndW1lbnRzKX19LGFmdGVyOmZ1bmN0aW9uKCl7aWYodGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlKXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmYWxzZSxmdW5jdGlvbihiKXt0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGIsCnRoaXMubmV4dFNpYmxpbmcpfSk7ZWxzZSBpZihhcmd1bWVudHMubGVuZ3RoKXt2YXIgYT10aGlzLnB1c2hTdGFjayh0aGlzLCJhZnRlciIsYXJndW1lbnRzKTthLnB1c2guYXBwbHkoYSxjKGFyZ3VtZW50c1swXSkudG9BcnJheSgpKTtyZXR1cm4gYX19LHJlbW92ZTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD0wLGU7KGU9dGhpc1tkXSkhPW51bGw7ZCsrKWlmKCFhfHxjLmZpbHRlcihhLFtlXSkubGVuZ3RoKXtpZighYiYmZS5ub2RlVHlwZT09PTEpe2MuY2xlYW5EYXRhKGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSk7Yy5jbGVhbkRhdGEoW2VdKX1lLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKX1yZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MCxiOyhiPXRoaXNbYV0pIT1udWxsO2ErKylmb3IoYi5ub2RlVHlwZT09PTEmJmMuY2xlYW5EYXRhKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSk7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7CnJldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm1hcChmdW5jdGlvbigpe2lmKCFjLnN1cHBvcnQubm9DbG9uZUV2ZW50JiYhYy5pc1hNTERvYyh0aGlzKSl7dmFyIGQ9dGhpcy5vdXRlckhUTUwsZT10aGlzLm93bmVyRG9jdW1lbnQ7aWYoIWQpe2Q9ZS5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmFwcGVuZENoaWxkKHRoaXMuY2xvbmVOb2RlKHRydWUpKTtkPWQuaW5uZXJIVE1MfXJldHVybiBjLmNsZWFuKFtkLnJlcGxhY2UoemEsIiIpLnJlcGxhY2UoZmIsJz0iJDEiPicpLnJlcGxhY2UoJCwiIildLGUpWzBdfWVsc2UgcmV0dXJuIHRoaXMuY2xvbmVOb2RlKHRydWUpfSk7aWYoYT09PXRydWUpe25hKHRoaXMsYik7bmEodGhpcy5maW5kKCIqIiksYi5maW5kKCIqIikpfXJldHVybiBifSxodG1sOmZ1bmN0aW9uKGEpe2lmKGE9PT1CKXJldHVybiB0aGlzWzBdJiZ0aGlzWzBdLm5vZGVUeXBlPT09MT90aGlzWzBdLmlubmVySFRNTC5yZXBsYWNlKHphLCIiKTpudWxsOwplbHNlIGlmKHR5cGVvZiBhPT09InN0cmluZyImJiFDYS50ZXN0KGEpJiYoYy5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlfHwhJC50ZXN0KGEpKSYmIVBbKEJhLmV4ZWMoYSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKXthPWEucmVwbGFjZShBYSwiPCQxPjwvJDI+Iik7dHJ5e2Zvcih2YXIgYj0wLGQ9dGhpcy5sZW5ndGg7YjxkO2IrKylpZih0aGlzW2JdLm5vZGVUeXBlPT09MSl7Yy5jbGVhbkRhdGEodGhpc1tiXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKTt0aGlzW2JdLmlubmVySFRNTD1hfX1jYXRjaChlKXt0aGlzLmVtcHR5KCkuYXBwZW5kKGEpfX1lbHNlIGMuaXNGdW5jdGlvbihhKT90aGlzLmVhY2goZnVuY3Rpb24oZil7dmFyIGg9Yyh0aGlzKTtoLmh0bWwoYS5jYWxsKHRoaXMsZixoLmh0bWwoKSkpfSk6dGhpcy5lbXB0eSgpLmFwcGVuZChhKTtyZXR1cm4gdGhpc30scmVwbGFjZVdpdGg6ZnVuY3Rpb24oYSl7aWYodGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlKXtpZihjLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXt2YXIgZD0KYyh0aGlzKSxlPWQuaHRtbCgpO2QucmVwbGFjZVdpdGgoYS5jYWxsKHRoaXMsYixlKSl9KTtpZih0eXBlb2YgYSE9PSJzdHJpbmciKWE9YyhhKS5kZXRhY2goKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5uZXh0U2libGluZyxkPXRoaXMucGFyZW50Tm9kZTtjKHRoaXMpLnJlbW92ZSgpO2I/YyhiKS5iZWZvcmUoYSk6YyhkKS5hcHBlbmQoYSl9KX1lbHNlIHJldHVybiB0aGlzLnB1c2hTdGFjayhjKGMuaXNGdW5jdGlvbihhKT9hKCk6YSksInJlcGxhY2VXaXRoIixhKX0sZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJlbW92ZShhLHRydWUpfSxkb21NYW5pcDpmdW5jdGlvbihhLGIsZCl7dmFyIGUsZixoLGw9YVswXSxrPVtdO2lmKCFjLnN1cHBvcnQuY2hlY2tDbG9uZSYmYXJndW1lbnRzLmxlbmd0aD09PTMmJnR5cGVvZiBsPT09InN0cmluZyImJkRhLnRlc3QobCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2ModGhpcykuZG9tTWFuaXAoYSwKYixkLHRydWUpfSk7aWYoYy5pc0Z1bmN0aW9uKGwpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oeCl7dmFyIHI9Yyh0aGlzKTthWzBdPWwuY2FsbCh0aGlzLHgsYj9yLmh0bWwoKTpCKTtyLmRvbU1hbmlwKGEsYixkKX0pO2lmKHRoaXNbMF0pe2U9bCYmbC5wYXJlbnROb2RlO2U9Yy5zdXBwb3J0LnBhcmVudE5vZGUmJmUmJmUubm9kZVR5cGU9PT0xMSYmZS5jaGlsZE5vZGVzLmxlbmd0aD09PXRoaXMubGVuZ3RoP3tmcmFnbWVudDplfTpjLmJ1aWxkRnJhZ21lbnQoYSx0aGlzLGspO2g9ZS5mcmFnbWVudDtpZihmPWguY2hpbGROb2Rlcy5sZW5ndGg9PT0xP2g9aC5maXJzdENoaWxkOmguZmlyc3RDaGlsZCl7Yj1iJiZjLm5vZGVOYW1lKGYsInRyIik7Zj0wO2Zvcih2YXIgbz10aGlzLmxlbmd0aDtmPG87ZisrKWQuY2FsbChiP2Mubm9kZU5hbWUodGhpc1tmXSwidGFibGUiKT90aGlzW2ZdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdfHx0aGlzW2ZdLmFwcGVuZENoaWxkKHRoaXNbZl0ub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpKToKdGhpc1tmXTp0aGlzW2ZdLGY+MHx8ZS5jYWNoZWFibGV8fHRoaXMubGVuZ3RoPjE/aC5jbG9uZU5vZGUodHJ1ZSk6aCl9ay5sZW5ndGgmJmMuZWFjaChrLE9hKX1yZXR1cm4gdGhpc319KTtjLmJ1aWxkRnJhZ21lbnQ9ZnVuY3Rpb24oYSxiLGQpe3ZhciBlLGYsaDtiPWImJmJbMF0/YlswXS5vd25lckRvY3VtZW50fHxiWzBdOnQ7aWYoYS5sZW5ndGg9PT0xJiZ0eXBlb2YgYVswXT09PSJzdHJpbmciJiZhWzBdLmxlbmd0aDw1MTImJmI9PT10JiYhQ2EudGVzdChhWzBdKSYmKGMuc3VwcG9ydC5jaGVja0Nsb25lfHwhRGEudGVzdChhWzBdKSkpe2Y9dHJ1ZTtpZihoPWMuZnJhZ21lbnRzW2FbMF1dKWlmKGghPT0xKWU9aH1pZighZSl7ZT1iLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtjLmNsZWFuKGEsYixlLGQpfWlmKGYpYy5mcmFnbWVudHNbYVswXV09aD9lOjE7cmV0dXJue2ZyYWdtZW50OmUsY2FjaGVhYmxlOmZ9fTtjLmZyYWdtZW50cz17fTtjLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLApwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oYSxiKXtjLmZuW2FdPWZ1bmN0aW9uKGQpe3ZhciBlPVtdO2Q9YyhkKTt2YXIgZj10aGlzLmxlbmd0aD09PTEmJnRoaXNbMF0ucGFyZW50Tm9kZTtpZihmJiZmLm5vZGVUeXBlPT09MTEmJmYuY2hpbGROb2Rlcy5sZW5ndGg9PT0xJiZkLmxlbmd0aD09PTEpe2RbYl0odGhpc1swXSk7cmV0dXJuIHRoaXN9ZWxzZXtmPTA7Zm9yKHZhciBoPWQubGVuZ3RoO2Y8aDtmKyspe3ZhciBsPShmPjA/dGhpcy5jbG9uZSh0cnVlKTp0aGlzKS5nZXQoKTtjKGRbZl0pW2JdKGwpO2U9ZS5jb25jYXQobCl9cmV0dXJuIHRoaXMucHVzaFN0YWNrKGUsYSxkLnNlbGVjdG9yKX19fSk7Yy5leHRlbmQoe2NsZWFuOmZ1bmN0aW9uKGEsYixkLGUpe2I9Ynx8dDtpZih0eXBlb2YgYi5jcmVhdGVFbGVtZW50PT09InVuZGVmaW5lZCIpYj1iLm93bmVyRG9jdW1lbnR8fApiWzBdJiZiWzBdLm93bmVyRG9jdW1lbnR8fHQ7Zm9yKHZhciBmPVtdLGg9MCxsOyhsPWFbaF0pIT1udWxsO2grKyl7aWYodHlwZW9mIGw9PT0ibnVtYmVyIilsKz0iIjtpZihsKXtpZih0eXBlb2YgbD09PSJzdHJpbmciJiYhZWIudGVzdChsKSlsPWIuY3JlYXRlVGV4dE5vZGUobCk7ZWxzZSBpZih0eXBlb2YgbD09PSJzdHJpbmciKXtsPWwucmVwbGFjZShBYSwiPCQxPjwvJDI+Iik7dmFyIGs9KEJhLmV4ZWMobCl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksbz1QW2tdfHxQLl9kZWZhdWx0LHg9b1swXSxyPWIuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zm9yKHIuaW5uZXJIVE1MPW9bMV0rbCtvWzJdO3gtLTspcj1yLmxhc3RDaGlsZDtpZighYy5zdXBwb3J0LnRib2R5KXt4PWRiLnRlc3QobCk7az1rPT09InRhYmxlIiYmIXg/ci5maXJzdENoaWxkJiZyLmZpcnN0Q2hpbGQuY2hpbGROb2RlczpvWzFdPT09Ijx0YWJsZT4iJiYheD9yLmNoaWxkTm9kZXM6W107Zm9yKG89ay5sZW5ndGgtCjE7bz49MDstLW8pYy5ub2RlTmFtZShrW29dLCJ0Ym9keSIpJiYha1tvXS5jaGlsZE5vZGVzLmxlbmd0aCYma1tvXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGtbb10pfSFjLnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2UmJiQudGVzdChsKSYmci5pbnNlcnRCZWZvcmUoYi5jcmVhdGVUZXh0Tm9kZSgkLmV4ZWMobClbMF0pLHIuZmlyc3RDaGlsZCk7bD1yLmNoaWxkTm9kZXN9aWYobC5ub2RlVHlwZSlmLnB1c2gobCk7ZWxzZSBmPWMubWVyZ2UoZixsKX19aWYoZClmb3IoaD0wO2ZbaF07aCsrKWlmKGUmJmMubm9kZU5hbWUoZltoXSwic2NyaXB0IikmJighZltoXS50eXBlfHxmW2hdLnR5cGUudG9Mb3dlckNhc2UoKT09PSJ0ZXh0L2phdmFzY3JpcHQiKSllLnB1c2goZltoXS5wYXJlbnROb2RlP2ZbaF0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChmW2hdKTpmW2hdKTtlbHNle2ZbaF0ubm9kZVR5cGU9PT0xJiZmLnNwbGljZS5hcHBseShmLFtoKzEsMF0uY29uY2F0KGMubWFrZUFycmF5KGZbaF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpKSkpOwpkLmFwcGVuZENoaWxkKGZbaF0pfXJldHVybiBmfSxjbGVhbkRhdGE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiLGQsZT1jLmNhY2hlLGY9Yy5ldmVudC5zcGVjaWFsLGg9Yy5zdXBwb3J0LmRlbGV0ZUV4cGFuZG8sbD0wLGs7KGs9YVtsXSkhPW51bGw7bCsrKWlmKCEoay5ub2RlTmFtZSYmYy5ub0RhdGFbay5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkpaWYoZD1rW2MuZXhwYW5kb10pe2lmKChiPWVbZF0pJiZiLmV2ZW50cylmb3IodmFyIG8gaW4gYi5ldmVudHMpZltvXT9jLmV2ZW50LnJlbW92ZShrLG8pOmMucmVtb3ZlRXZlbnQoayxvLGIuaGFuZGxlKTtpZihoKWRlbGV0ZSBrW2MuZXhwYW5kb107ZWxzZSBrLnJlbW92ZUF0dHJpYnV0ZSYmay5yZW1vdmVBdHRyaWJ1dGUoYy5leHBhbmRvKTtkZWxldGUgZVtkXX19fSk7dmFyIEVhPS9hbHBoYVwoW14pXSpcKS9pLGdiPS9vcGFjaXR5PShbXildKikvLGhiPS8tKFthLXpdKS9pZyxpYj0vKFtBLVpdKS9nLEZhPS9eLT9cZCsoPzpweCk/JC9pLApqYj0vXi0/XGQvLGtiPXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxQYT1bIkxlZnQiLCJSaWdodCJdLFFhPVsiVG9wIiwiQm90dG9tIl0sVyxHYSxhYSxsYj1mdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9O2MuZm4uY3NzPWZ1bmN0aW9uKGEsYil7aWYoYXJndW1lbnRzLmxlbmd0aD09PTImJmI9PT1CKXJldHVybiB0aGlzO3JldHVybiBjLmFjY2Vzcyh0aGlzLGEsYix0cnVlLGZ1bmN0aW9uKGQsZSxmKXtyZXR1cm4gZiE9PUI/Yy5zdHlsZShkLGUsZik6Yy5jc3MoZCxlKX0pfTtjLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBkPVcoYSwib3BhY2l0eSIsIm9wYWNpdHkiKTtyZXR1cm4gZD09PSIiPyIxIjpkfWVsc2UgcmV0dXJuIGEuc3R5bGUub3BhY2l0eX19fSxjc3NOdW1iZXI6e3pJbmRleDp0cnVlLGZvbnRXZWlnaHQ6dHJ1ZSxvcGFjaXR5OnRydWUsCnpvb206dHJ1ZSxsaW5lSGVpZ2h0OnRydWV9LGNzc1Byb3BzOnsiZmxvYXQiOmMuc3VwcG9ydC5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxiLGQsZSl7aWYoISghYXx8YS5ub2RlVHlwZT09PTN8fGEubm9kZVR5cGU9PT04fHwhYS5zdHlsZSkpe3ZhciBmLGg9Yy5jYW1lbENhc2UoYiksbD1hLnN0eWxlLGs9Yy5jc3NIb29rc1toXTtiPWMuY3NzUHJvcHNbaF18fGg7aWYoZCE9PUIpe2lmKCEodHlwZW9mIGQ9PT0ibnVtYmVyIiYmaXNOYU4oZCl8fGQ9PW51bGwpKXtpZih0eXBlb2YgZD09PSJudW1iZXIiJiYhYy5jc3NOdW1iZXJbaF0pZCs9InB4IjtpZigha3x8ISgic2V0ImluIGspfHwoZD1rLnNldChhLGQpKSE9PUIpdHJ5e2xbYl09ZH1jYXRjaChvKXt9fX1lbHNle2lmKGsmJiJnZXQiaW4gayYmKGY9ay5nZXQoYSxmYWxzZSxlKSkhPT1CKXJldHVybiBmO3JldHVybiBsW2JdfX19LGNzczpmdW5jdGlvbihhLGIsZCl7dmFyIGUsZj1jLmNhbWVsQ2FzZShiKSwKaD1jLmNzc0hvb2tzW2ZdO2I9Yy5jc3NQcm9wc1tmXXx8ZjtpZihoJiYiZ2V0ImluIGgmJihlPWguZ2V0KGEsdHJ1ZSxkKSkhPT1CKXJldHVybiBlO2Vsc2UgaWYoVylyZXR1cm4gVyhhLGIsZil9LHN3YXA6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPXt9LGY7Zm9yKGYgaW4gYil7ZVtmXT1hLnN0eWxlW2ZdO2Euc3R5bGVbZl09YltmXX1kLmNhbGwoYSk7Zm9yKGYgaW4gYilhLnN0eWxlW2ZdPWVbZl19LGNhbWVsQ2FzZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKGhiLGxiKX19KTtjLmN1ckNTUz1jLmNzcztjLmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKGEsYil7Yy5jc3NIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGQsZSxmKXt2YXIgaDtpZihlKXtpZihkLm9mZnNldFdpZHRoIT09MCloPW9hKGQsYixmKTtlbHNlIGMuc3dhcChkLGtiLGZ1bmN0aW9uKCl7aD1vYShkLGIsZil9KTtpZihoPD0wKXtoPVcoZCxiLGIpO2lmKGg9PT0iMHB4IiYmYWEpaD1hYShkLGIsYik7CmlmKGghPW51bGwpcmV0dXJuIGg9PT0iInx8aD09PSJhdXRvIj8iMHB4IjpofWlmKGg8MHx8aD09bnVsbCl7aD1kLnN0eWxlW2JdO3JldHVybiBoPT09IiJ8fGg9PT0iYXV0byI/IjBweCI6aH1yZXR1cm4gdHlwZW9mIGg9PT0ic3RyaW5nIj9oOmgrInB4In19LHNldDpmdW5jdGlvbihkLGUpe2lmKEZhLnRlc3QoZSkpe2U9cGFyc2VGbG9hdChlKTtpZihlPj0wKXJldHVybiBlKyJweCJ9ZWxzZSByZXR1cm4gZX19fSk7aWYoIWMuc3VwcG9ydC5vcGFjaXR5KWMuY3NzSG9va3Mub3BhY2l0eT17Z2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGdiLnRlc3QoKGImJmEuY3VycmVudFN0eWxlP2EuY3VycmVudFN0eWxlLmZpbHRlcjphLnN0eWxlLmZpbHRlcil8fCIiKT9wYXJzZUZsb2F0KFJlZ0V4cC4kMSkvMTAwKyIiOmI/IjEiOiIifSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hLnN0eWxlO2Quem9vbT0xO3ZhciBlPWMuaXNOYU4oYik/IiI6ImFscGhhKG9wYWNpdHk9IitiKjEwMCsiKSIsZj0KZC5maWx0ZXJ8fCIiO2QuZmlsdGVyPUVhLnRlc3QoZik/Zi5yZXBsYWNlKEVhLGUpOmQuZmlsdGVyKyIgIitlfX07aWYodC5kZWZhdWx0VmlldyYmdC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKUdhPWZ1bmN0aW9uKGEsYixkKXt2YXIgZTtkPWQucmVwbGFjZShpYiwiLSQxIikudG9Mb3dlckNhc2UoKTtpZighKGI9YS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KSlyZXR1cm4gQjtpZihiPWIuZ2V0Q29tcHV0ZWRTdHlsZShhLG51bGwpKXtlPWIuZ2V0UHJvcGVydHlWYWx1ZShkKTtpZihlPT09IiImJiFjLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsYSkpZT1jLnN0eWxlKGEsZCl9cmV0dXJuIGV9O2lmKHQuZG9jdW1lbnRFbGVtZW50LmN1cnJlbnRTdHlsZSlhYT1mdW5jdGlvbihhLGIpe3ZhciBkLGUsZj1hLmN1cnJlbnRTdHlsZSYmYS5jdXJyZW50U3R5bGVbYl0saD1hLnN0eWxlO2lmKCFGYS50ZXN0KGYpJiZqYi50ZXN0KGYpKXtkPWgubGVmdDsKZT1hLnJ1bnRpbWVTdHlsZS5sZWZ0O2EucnVudGltZVN0eWxlLmxlZnQ9YS5jdXJyZW50U3R5bGUubGVmdDtoLmxlZnQ9Yj09PSJmb250U2l6ZSI/IjFlbSI6Znx8MDtmPWgucGl4ZWxMZWZ0KyJweCI7aC5sZWZ0PWQ7YS5ydW50aW1lU3R5bGUubGVmdD1lfXJldHVybiBmPT09IiI/ImF1dG8iOmZ9O1c9R2F8fGFhO2lmKGMuZXhwciYmYy5leHByLmZpbHRlcnMpe2MuZXhwci5maWx0ZXJzLmhpZGRlbj1mdW5jdGlvbihhKXt2YXIgYj1hLm9mZnNldEhlaWdodDtyZXR1cm4gYS5vZmZzZXRXaWR0aD09PTAmJmI9PT0wfHwhYy5zdXBwb3J0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cyYmKGEuc3R5bGUuZGlzcGxheXx8Yy5jc3MoYSwiZGlzcGxheSIpKT09PSJub25lIn07Yy5leHByLmZpbHRlcnMudmlzaWJsZT1mdW5jdGlvbihhKXtyZXR1cm4hYy5leHByLmZpbHRlcnMuaGlkZGVuKGEpfX12YXIgbWI9Yy5ub3coKSxuYj0vPHNjcmlwdFxiW148XSooPzooPyE8XC9zY3JpcHQ+KTxbXjxdKikqPFwvc2NyaXB0Pi9naSwKb2I9L14oPzpzZWxlY3R8dGV4dGFyZWEpL2kscGI9L14oPzpjb2xvcnxkYXRlfGRhdGV0aW1lfGVtYWlsfGhpZGRlbnxtb250aHxudW1iZXJ8cGFzc3dvcmR8cmFuZ2V8c2VhcmNofHRlbHx0ZXh0fHRpbWV8dXJsfHdlZWspJC9pLHFiPS9eKD86R0VUfEhFQUQpJC8sUmE9L1xbXF0kLyxUPS9cPVw/KCZ8JCkvLGphPS9cPy8scmI9LyhbPyZdKV89W14mXSovLHNiPS9eKFx3KzopP1wvXC8oW15cLz8jXSspLyx0Yj0vJTIwL2csdWI9LyMuKiQvLEhhPWMuZm4ubG9hZDtjLmZuLmV4dGVuZCh7bG9hZDpmdW5jdGlvbihhLGIsZCl7aWYodHlwZW9mIGEhPT0ic3RyaW5nIiYmSGEpcmV0dXJuIEhhLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtlbHNlIGlmKCF0aGlzLmxlbmd0aClyZXR1cm4gdGhpczt2YXIgZT1hLmluZGV4T2YoIiAiKTtpZihlPj0wKXt2YXIgZj1hLnNsaWNlKGUsYS5sZW5ndGgpO2E9YS5zbGljZSgwLGUpfWU9IkdFVCI7aWYoYilpZihjLmlzRnVuY3Rpb24oYikpe2Q9YjtiPW51bGx9ZWxzZSBpZih0eXBlb2YgYj09PQoib2JqZWN0Iil7Yj1jLnBhcmFtKGIsYy5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpO2U9IlBPU1QifXZhciBoPXRoaXM7Yy5hamF4KHt1cmw6YSx0eXBlOmUsZGF0YVR5cGU6Imh0bWwiLGRhdGE6Yixjb21wbGV0ZTpmdW5jdGlvbihsLGspe2lmKGs9PT0ic3VjY2VzcyJ8fGs9PT0ibm90bW9kaWZpZWQiKWguaHRtbChmP2MoIjxkaXY+IikuYXBwZW5kKGwucmVzcG9uc2VUZXh0LnJlcGxhY2UobmIsIiIpKS5maW5kKGYpOmwucmVzcG9uc2VUZXh0KTtkJiZoLmVhY2goZCxbbC5yZXNwb25zZVRleHQsayxsXSl9fSk7cmV0dXJuIHRoaXN9LHNlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBjLnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudHM/Yy5tYWtlQXJyYXkodGhpcy5lbGVtZW50cyk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWUmJgohdGhpcy5kaXNhYmxlZCYmKHRoaXMuY2hlY2tlZHx8b2IudGVzdCh0aGlzLm5vZGVOYW1lKXx8cGIudGVzdCh0aGlzLnR5cGUpKX0pLm1hcChmdW5jdGlvbihhLGIpe3ZhciBkPWModGhpcykudmFsKCk7cmV0dXJuIGQ9PW51bGw/bnVsbDpjLmlzQXJyYXkoZCk/Yy5tYXAoZCxmdW5jdGlvbihlKXtyZXR1cm57bmFtZTpiLm5hbWUsdmFsdWU6ZX19KTp7bmFtZTpiLm5hbWUsdmFsdWU6ZH19KS5nZXQoKX19KTtjLmVhY2goImFqYXhTdGFydCBhamF4U3RvcCBhamF4Q29tcGxldGUgYWpheEVycm9yIGFqYXhTdWNjZXNzIGFqYXhTZW5kIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7Yy5mbltiXT1mdW5jdGlvbihkKXtyZXR1cm4gdGhpcy5iaW5kKGIsZCl9fSk7Yy5leHRlbmQoe2dldDpmdW5jdGlvbihhLGIsZCxlKXtpZihjLmlzRnVuY3Rpb24oYikpe2U9ZXx8ZDtkPWI7Yj1udWxsfXJldHVybiBjLmFqYXgoe3R5cGU6IkdFVCIsdXJsOmEsZGF0YTpiLHN1Y2Nlc3M6ZCxkYXRhVHlwZTplfSl9LApnZXRTY3JpcHQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYy5nZXQoYSxudWxsLGIsInNjcmlwdCIpfSxnZXRKU09OOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gYy5nZXQoYSxiLGQsImpzb24iKX0scG9zdDpmdW5jdGlvbihhLGIsZCxlKXtpZihjLmlzRnVuY3Rpb24oYikpe2U9ZXx8ZDtkPWI7Yj17fX1yZXR1cm4gYy5hamF4KHt0eXBlOiJQT1NUIix1cmw6YSxkYXRhOmIsc3VjY2VzczpkLGRhdGFUeXBlOmV9KX0sYWpheFNldHVwOmZ1bmN0aW9uKGEpe2MuZXh0ZW5kKGMuYWpheFNldHRpbmdzLGEpfSxhamF4U2V0dGluZ3M6e3VybDpsb2NhdGlvbi5ocmVmLGdsb2JhbDp0cnVlLHR5cGU6IkdFVCIsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIscHJvY2Vzc0RhdGE6dHJ1ZSxhc3luYzp0cnVlLHhocjpmdW5jdGlvbigpe3JldHVybiBuZXcgRS5YTUxIdHRwUmVxdWVzdH0sYWNjZXB0czp7eG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixodG1sOiJ0ZXh0L2h0bWwiLApzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0Iix0ZXh0OiJ0ZXh0L3BsYWluIixfZGVmYXVsdDoiKi8qIn19LGFqYXg6ZnVuY3Rpb24oYSl7dmFyIGI9Yy5leHRlbmQodHJ1ZSx7fSxjLmFqYXhTZXR0aW5ncyxhKSxkLGUsZixoPWIudHlwZS50b1VwcGVyQ2FzZSgpLGw9cWIudGVzdChoKTtiLnVybD1iLnVybC5yZXBsYWNlKHViLCIiKTtiLmNvbnRleHQ9YSYmYS5jb250ZXh0IT1udWxsP2EuY29udGV4dDpiO2lmKGIuZGF0YSYmYi5wcm9jZXNzRGF0YSYmdHlwZW9mIGIuZGF0YSE9PSJzdHJpbmciKWIuZGF0YT1jLnBhcmFtKGIuZGF0YSxiLnRyYWRpdGlvbmFsKTtpZihiLmRhdGFUeXBlPT09Impzb25wIil7aWYoaD09PSJHRVQiKVQudGVzdChiLnVybCl8fChiLnVybCs9KGphLnRlc3QoYi51cmwpPyImIjoiPyIpKyhiLmpzb25wfHwiY2FsbGJhY2siKSsiPT8iKTtlbHNlIGlmKCFiLmRhdGF8fAohVC50ZXN0KGIuZGF0YSkpYi5kYXRhPShiLmRhdGE/Yi5kYXRhKyImIjoiIikrKGIuanNvbnB8fCJjYWxsYmFjayIpKyI9PyI7Yi5kYXRhVHlwZT0ianNvbiJ9aWYoYi5kYXRhVHlwZT09PSJqc29uIiYmKGIuZGF0YSYmVC50ZXN0KGIuZGF0YSl8fFQudGVzdChiLnVybCkpKXtkPWIuanNvbnBDYWxsYmFja3x8Impzb25wIittYisrO2lmKGIuZGF0YSliLmRhdGE9KGIuZGF0YSsiIikucmVwbGFjZShULCI9IitkKyIkMSIpO2IudXJsPWIudXJsLnJlcGxhY2UoVCwiPSIrZCsiJDEiKTtiLmRhdGFUeXBlPSJzY3JpcHQiO3ZhciBrPUVbZF07RVtkXT1mdW5jdGlvbihtKXtpZihjLmlzRnVuY3Rpb24oaykpayhtKTtlbHNle0VbZF09Qjt0cnl7ZGVsZXRlIEVbZF19Y2F0Y2gocCl7fX1mPW07Yy5oYW5kbGVTdWNjZXNzKGIsdyxlLGYpO2MuaGFuZGxlQ29tcGxldGUoYix3LGUsZik7ciYmci5yZW1vdmVDaGlsZChBKX19aWYoYi5kYXRhVHlwZT09PSJzY3JpcHQiJiZiLmNhY2hlPT09bnVsbCliLmNhY2hlPQpmYWxzZTtpZihiLmNhY2hlPT09ZmFsc2UmJmwpe3ZhciBvPWMubm93KCkseD1iLnVybC5yZXBsYWNlKHJiLCIkMV89IitvKTtiLnVybD14Kyh4PT09Yi51cmw/KGphLnRlc3QoYi51cmwpPyImIjoiPyIpKyJfPSIrbzoiIil9aWYoYi5kYXRhJiZsKWIudXJsKz0oamEudGVzdChiLnVybCk/IiYiOiI/IikrYi5kYXRhO2IuZ2xvYmFsJiZjLmFjdGl2ZSsrPT09MCYmYy5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKTtvPShvPXNiLmV4ZWMoYi51cmwpKSYmKG9bMV0mJm9bMV0udG9Mb3dlckNhc2UoKSE9PWxvY2F0aW9uLnByb3RvY29sfHxvWzJdLnRvTG93ZXJDYXNlKCkhPT1sb2NhdGlvbi5ob3N0KTtpZihiLmRhdGFUeXBlPT09InNjcmlwdCImJmg9PT0iR0VUIiYmbyl7dmFyIHI9dC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdfHx0LmRvY3VtZW50RWxlbWVudCxBPXQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7aWYoYi5zY3JpcHRDaGFyc2V0KUEuY2hhcnNldD1iLnNjcmlwdENoYXJzZXQ7CkEuc3JjPWIudXJsO2lmKCFkKXt2YXIgQz1mYWxzZTtBLm9ubG9hZD1BLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2lmKCFDJiYoIXRoaXMucmVhZHlTdGF0ZXx8dGhpcy5yZWFkeVN0YXRlPT09ImxvYWRlZCJ8fHRoaXMucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpKXtDPXRydWU7Yy5oYW5kbGVTdWNjZXNzKGIsdyxlLGYpO2MuaGFuZGxlQ29tcGxldGUoYix3LGUsZik7QS5vbmxvYWQ9QS5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbDtyJiZBLnBhcmVudE5vZGUmJnIucmVtb3ZlQ2hpbGQoQSl9fX1yLmluc2VydEJlZm9yZShBLHIuZmlyc3RDaGlsZCk7cmV0dXJuIEJ9dmFyIEo9ZmFsc2Usdz1iLnhocigpO2lmKHcpe2IudXNlcm5hbWU/dy5vcGVuKGgsYi51cmwsYi5hc3luYyxiLnVzZXJuYW1lLGIucGFzc3dvcmQpOncub3BlbihoLGIudXJsLGIuYXN5bmMpO3RyeXtpZihiLmRhdGEhPW51bGwmJiFsfHxhJiZhLmNvbnRlbnRUeXBlKXcuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIiwKYi5jb250ZW50VHlwZSk7aWYoYi5pZk1vZGlmaWVkKXtjLmxhc3RNb2RpZmllZFtiLnVybF0mJncuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLGMubGFzdE1vZGlmaWVkW2IudXJsXSk7Yy5ldGFnW2IudXJsXSYmdy5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixjLmV0YWdbYi51cmxdKX1vfHx3LnNldFJlcXVlc3RIZWFkZXIoIlgtUmVxdWVzdGVkLVdpdGgiLCJYTUxIdHRwUmVxdWVzdCIpO3cuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixiLmRhdGFUeXBlJiZiLmFjY2VwdHNbYi5kYXRhVHlwZV0/Yi5hY2NlcHRzW2IuZGF0YVR5cGVdKyIsICovKjsgcT0wLjAxIjpiLmFjY2VwdHMuX2RlZmF1bHQpfWNhdGNoKEkpe31pZihiLmJlZm9yZVNlbmQmJmIuYmVmb3JlU2VuZC5jYWxsKGIuY29udGV4dCx3LGIpPT09ZmFsc2Upe2IuZ2xvYmFsJiZjLmFjdGl2ZS0tPT09MSYmYy5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpO3cuYWJvcnQoKTtyZXR1cm4gZmFsc2V9Yi5nbG9iYWwmJgpjLnRyaWdnZXJHbG9iYWwoYiwiYWpheFNlbmQiLFt3LGJdKTt2YXIgTD13Lm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbihtKXtpZighd3x8dy5yZWFkeVN0YXRlPT09MHx8bT09PSJhYm9ydCIpe0p8fGMuaGFuZGxlQ29tcGxldGUoYix3LGUsZik7Sj10cnVlO2lmKHcpdy5vbnJlYWR5c3RhdGVjaGFuZ2U9Yy5ub29wfWVsc2UgaWYoIUomJncmJih3LnJlYWR5U3RhdGU9PT00fHxtPT09InRpbWVvdXQiKSl7Sj10cnVlO3cub25yZWFkeXN0YXRlY2hhbmdlPWMubm9vcDtlPW09PT0idGltZW91dCI/InRpbWVvdXQiOiFjLmh0dHBTdWNjZXNzKHcpPyJlcnJvciI6Yi5pZk1vZGlmaWVkJiZjLmh0dHBOb3RNb2RpZmllZCh3LGIudXJsKT8ibm90bW9kaWZpZWQiOiJzdWNjZXNzIjt2YXIgcDtpZihlPT09InN1Y2Nlc3MiKXRyeXtmPWMuaHR0cERhdGEodyxiLmRhdGFUeXBlLGIpfWNhdGNoKHEpe2U9InBhcnNlcmVycm9yIjtwPXF9aWYoZT09PSJzdWNjZXNzInx8ZT09PSJub3Rtb2RpZmllZCIpZHx8CmMuaGFuZGxlU3VjY2VzcyhiLHcsZSxmKTtlbHNlIGMuaGFuZGxlRXJyb3IoYix3LGUscCk7ZHx8Yy5oYW5kbGVDb21wbGV0ZShiLHcsZSxmKTttPT09InRpbWVvdXQiJiZ3LmFib3J0KCk7aWYoYi5hc3luYyl3PW51bGx9fTt0cnl7dmFyIGc9dy5hYm9ydDt3LmFib3J0PWZ1bmN0aW9uKCl7dyYmRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwuY2FsbChnLHcpO0woImFib3J0Iil9fWNhdGNoKGkpe31iLmFzeW5jJiZiLnRpbWVvdXQ+MCYmc2V0VGltZW91dChmdW5jdGlvbigpe3cmJiFKJiZMKCJ0aW1lb3V0Iil9LGIudGltZW91dCk7dHJ5e3cuc2VuZChsfHxiLmRhdGE9PW51bGw/bnVsbDpiLmRhdGEpfWNhdGNoKG4pe2MuaGFuZGxlRXJyb3IoYix3LG51bGwsbik7Yy5oYW5kbGVDb21wbGV0ZShiLHcsZSxmKX1iLmFzeW5jfHxMKCk7cmV0dXJuIHd9fSxwYXJhbTpmdW5jdGlvbihhLGIpe3ZhciBkPVtdLGU9ZnVuY3Rpb24oaCxsKXtsPWMuaXNGdW5jdGlvbihsKT9sKCk6bDtkW2QubGVuZ3RoXT0KZW5jb2RlVVJJQ29tcG9uZW50KGgpKyI9IitlbmNvZGVVUklDb21wb25lbnQobCl9O2lmKGI9PT1CKWI9Yy5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWw7aWYoYy5pc0FycmF5KGEpfHxhLmpxdWVyeSljLmVhY2goYSxmdW5jdGlvbigpe2UodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IodmFyIGYgaW4gYSlkYShmLGFbZl0sYixlKTtyZXR1cm4gZC5qb2luKCImIikucmVwbGFjZSh0YiwiKyIpfX0pO2MuZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fSxoYW5kbGVFcnJvcjpmdW5jdGlvbihhLGIsZCxlKXthLmVycm9yJiZhLmVycm9yLmNhbGwoYS5jb250ZXh0LGIsZCxlKTthLmdsb2JhbCYmYy50cmlnZ2VyR2xvYmFsKGEsImFqYXhFcnJvciIsW2IsYSxlXSl9LGhhbmRsZVN1Y2Nlc3M6ZnVuY3Rpb24oYSxiLGQsZSl7YS5zdWNjZXNzJiZhLnN1Y2Nlc3MuY2FsbChhLmNvbnRleHQsZSxkLGIpO2EuZ2xvYmFsJiZjLnRyaWdnZXJHbG9iYWwoYSwiYWpheFN1Y2Nlc3MiLApbYixhXSl9LGhhbmRsZUNvbXBsZXRlOmZ1bmN0aW9uKGEsYixkKXthLmNvbXBsZXRlJiZhLmNvbXBsZXRlLmNhbGwoYS5jb250ZXh0LGIsZCk7YS5nbG9iYWwmJmMudHJpZ2dlckdsb2JhbChhLCJhamF4Q29tcGxldGUiLFtiLGFdKTthLmdsb2JhbCYmYy5hY3RpdmUtLT09PTEmJmMuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKX0sdHJpZ2dlckdsb2JhbDpmdW5jdGlvbihhLGIsZCl7KGEuY29udGV4dCYmYS5jb250ZXh0LnVybD09bnVsbD9jKGEuY29udGV4dCk6Yy5ldmVudCkudHJpZ2dlcihiLGQpfSxodHRwU3VjY2VzczpmdW5jdGlvbihhKXt0cnl7cmV0dXJuIWEuc3RhdHVzJiZsb2NhdGlvbi5wcm90b2NvbD09PSJmaWxlOiJ8fGEuc3RhdHVzPj0yMDAmJmEuc3RhdHVzPDMwMHx8YS5zdGF0dXM9PT0zMDR8fGEuc3RhdHVzPT09MTIyM31jYXRjaChiKXt9cmV0dXJuIGZhbHNlfSxodHRwTm90TW9kaWZpZWQ6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hLmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIiksCmU9YS5nZXRSZXNwb25zZUhlYWRlcigiRXRhZyIpO2lmKGQpYy5sYXN0TW9kaWZpZWRbYl09ZDtpZihlKWMuZXRhZ1tiXT1lO3JldHVybiBhLnN0YXR1cz09PTMwNH0saHR0cERhdGE6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPWEuZ2V0UmVzcG9uc2VIZWFkZXIoImNvbnRlbnQtdHlwZSIpfHwiIixmPWI9PT0ieG1sInx8IWImJmUuaW5kZXhPZigieG1sIik+PTA7YT1mP2EucmVzcG9uc2VYTUw6YS5yZXNwb25zZVRleHQ7ZiYmYS5kb2N1bWVudEVsZW1lbnQubm9kZU5hbWU9PT0icGFyc2VyZXJyb3IiJiZjLmVycm9yKCJwYXJzZXJlcnJvciIpO2lmKGQmJmQuZGF0YUZpbHRlcilhPWQuZGF0YUZpbHRlcihhLGIpO2lmKHR5cGVvZiBhPT09InN0cmluZyIpaWYoYj09PSJqc29uInx8IWImJmUuaW5kZXhPZigianNvbiIpPj0wKWE9Yy5wYXJzZUpTT04oYSk7ZWxzZSBpZihiPT09InNjcmlwdCJ8fCFiJiZlLmluZGV4T2YoImphdmFzY3JpcHQiKT49MCljLmdsb2JhbEV2YWwoYSk7cmV0dXJuIGF9fSk7CmlmKEUuQWN0aXZlWE9iamVjdCljLmFqYXhTZXR0aW5ncy54aHI9ZnVuY3Rpb24oKXtpZihFLmxvY2F0aW9uLnByb3RvY29sIT09ImZpbGU6Iil0cnl7cmV0dXJuIG5ldyBFLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGEpe310cnl7cmV0dXJuIG5ldyBFLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2goYil7fX07Yy5zdXBwb3J0LmFqYXg9ISFjLmFqYXhTZXR0aW5ncy54aHIoKTt2YXIgZWE9e30sdmI9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLHdiPS9eKFsrXC1dPSk/KFtcZCsuXC1dKykoLiopJC8sYmEscGE9W1siaGVpZ2h0IiwibWFyZ2luVG9wIiwibWFyZ2luQm90dG9tIiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iXSxbIndpZHRoIiwibWFyZ2luTGVmdCIsIm1hcmdpblJpZ2h0IiwicGFkZGluZ0xlZnQiLCJwYWRkaW5nUmlnaHQiXSxbIm9wYWNpdHkiXV07Yy5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oYSxiLGQpe2lmKGF8fGE9PT0wKXJldHVybiB0aGlzLmFuaW1hdGUoUygic2hvdyIsCjMpLGEsYixkKTtlbHNle2Q9MDtmb3IodmFyIGU9dGhpcy5sZW5ndGg7ZDxlO2QrKyl7YT10aGlzW2RdO2I9YS5zdHlsZS5kaXNwbGF5O2lmKCFjLmRhdGEoYSwib2xkZGlzcGxheSIpJiZiPT09Im5vbmUiKWI9YS5zdHlsZS5kaXNwbGF5PSIiO2I9PT0iIiYmYy5jc3MoYSwiZGlzcGxheSIpPT09Im5vbmUiJiZjLmRhdGEoYSwib2xkZGlzcGxheSIscWEoYS5ub2RlTmFtZSkpfWZvcihkPTA7ZDxlO2QrKyl7YT10aGlzW2RdO2I9YS5zdHlsZS5kaXNwbGF5O2lmKGI9PT0iInx8Yj09PSJub25lIilhLnN0eWxlLmRpc3BsYXk9Yy5kYXRhKGEsIm9sZGRpc3BsYXkiKXx8IiJ9cmV0dXJuIHRoaXN9fSxoaWRlOmZ1bmN0aW9uKGEsYixkKXtpZihhfHxhPT09MClyZXR1cm4gdGhpcy5hbmltYXRlKFMoImhpZGUiLDMpLGEsYixkKTtlbHNle2E9MDtmb3IoYj10aGlzLmxlbmd0aDthPGI7YSsrKXtkPWMuY3NzKHRoaXNbYV0sImRpc3BsYXkiKTtkIT09Im5vbmUiJiZjLmRhdGEodGhpc1thXSwib2xkZGlzcGxheSIsCmQpfWZvcihhPTA7YTxiO2ErKyl0aGlzW2FdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3JldHVybiB0aGlzfX0sX3RvZ2dsZTpjLmZuLnRvZ2dsZSx0b2dnbGU6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPXR5cGVvZiBhPT09ImJvb2xlYW4iO2lmKGMuaXNGdW5jdGlvbihhKSYmYy5pc0Z1bmN0aW9uKGIpKXRoaXMuX3RvZ2dsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZWxzZSBhPT1udWxsfHxlP3RoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBmPWU/YTpjKHRoaXMpLmlzKCI6aGlkZGVuIik7Yyh0aGlzKVtmPyJzaG93IjoiaGlkZSJdKCl9KTp0aGlzLmFuaW1hdGUoUygidG9nZ2xlIiwzKSxhLGIsZCk7cmV0dXJuIHRoaXN9LGZhZGVUbzpmdW5jdGlvbihhLGIsZCxlKXtyZXR1cm4gdGhpcy5maWx0ZXIoIjpoaWRkZW4iKS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OmJ9LGEsZCxlKX0sYW5pbWF0ZTpmdW5jdGlvbihhLGIsZCxlKXt2YXIgZj1jLnNwZWVkKGIsCmQsZSk7aWYoYy5pc0VtcHR5T2JqZWN0KGEpKXJldHVybiB0aGlzLmVhY2goZi5jb21wbGV0ZSk7cmV0dXJuIHRoaXNbZi5xdWV1ZT09PWZhbHNlPyJlYWNoIjoicXVldWUiXShmdW5jdGlvbigpe3ZhciBoPWMuZXh0ZW5kKHt9LGYpLGwsaz10aGlzLm5vZGVUeXBlPT09MSxvPWsmJmModGhpcykuaXMoIjpoaWRkZW4iKSx4PXRoaXM7Zm9yKGwgaW4gYSl7dmFyIHI9Yy5jYW1lbENhc2UobCk7aWYobCE9PXIpe2Fbcl09YVtsXTtkZWxldGUgYVtsXTtsPXJ9aWYoYVtsXT09PSJoaWRlIiYmb3x8YVtsXT09PSJzaG93IiYmIW8pcmV0dXJuIGguY29tcGxldGUuY2FsbCh0aGlzKTtpZihrJiYobD09PSJoZWlnaHQifHxsPT09IndpZHRoIikpe2gub3ZlcmZsb3c9W3RoaXMuc3R5bGUub3ZlcmZsb3csdGhpcy5zdHlsZS5vdmVyZmxvd1gsdGhpcy5zdHlsZS5vdmVyZmxvd1ldO2lmKGMuY3NzKHRoaXMsImRpc3BsYXkiKT09PSJpbmxpbmUiJiZjLmNzcyh0aGlzLCJmbG9hdCIpPT09Im5vbmUiKWlmKGMuc3VwcG9ydC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0KWlmKHFhKHRoaXMubm9kZU5hbWUpPT09CiJpbmxpbmUiKXRoaXMuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIjtlbHNle3RoaXMuc3R5bGUuZGlzcGxheT0iaW5saW5lIjt0aGlzLnN0eWxlLnpvb209MX1lbHNlIHRoaXMuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIn1pZihjLmlzQXJyYXkoYVtsXSkpeyhoLnNwZWNpYWxFYXNpbmc9aC5zcGVjaWFsRWFzaW5nfHx7fSlbbF09YVtsXVsxXTthW2xdPWFbbF1bMF19fWlmKGgub3ZlcmZsb3chPW51bGwpdGhpcy5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIjtoLmN1ckFuaW09Yy5leHRlbmQoe30sYSk7Yy5lYWNoKGEsZnVuY3Rpb24oQSxDKXt2YXIgSj1uZXcgYy5meCh4LGgsQSk7aWYodmIudGVzdChDKSlKW0M9PT0idG9nZ2xlIj9vPyJzaG93IjoiaGlkZSI6Q10oYSk7ZWxzZXt2YXIgdz13Yi5leGVjKEMpLEk9Si5jdXIoKXx8MDtpZih3KXt2YXIgTD1wYXJzZUZsb2F0KHdbMl0pLGc9d1szXXx8InB4IjtpZihnIT09InB4Iil7Yy5zdHlsZSh4LEEsKEx8fDEpK2cpO0k9KEx8fAoxKS9KLmN1cigpKkk7Yy5zdHlsZSh4LEEsSStnKX1pZih3WzFdKUw9KHdbMV09PT0iLT0iPy0xOjEpKkwrSTtKLmN1c3RvbShJLEwsZyl9ZWxzZSBKLmN1c3RvbShJLEMsIiIpfX0pO3JldHVybiB0cnVlfSl9LHN0b3A6ZnVuY3Rpb24oYSxiKXt2YXIgZD1jLnRpbWVyczthJiZ0aGlzLnF1ZXVlKFtdKTt0aGlzLmVhY2goZnVuY3Rpb24oKXtmb3IodmFyIGU9ZC5sZW5ndGgtMTtlPj0wO2UtLSlpZihkW2VdLmVsZW09PT10aGlzKXtiJiZkW2VdKHRydWUpO2Quc3BsaWNlKGUsMSl9fSk7Ynx8dGhpcy5kZXF1ZXVlKCk7cmV0dXJuIHRoaXN9fSk7Yy5lYWNoKHtzbGlkZURvd246Uygic2hvdyIsMSksc2xpZGVVcDpTKCJoaWRlIiwxKSxzbGlkZVRvZ2dsZTpTKCJ0b2dnbGUiLDEpLGZhZGVJbjp7b3BhY2l0eToic2hvdyJ9LGZhZGVPdXQ6e29wYWNpdHk6ImhpZGUifSxmYWRlVG9nZ2xlOntvcGFjaXR5OiJ0b2dnbGUifX0sZnVuY3Rpb24oYSxiKXtjLmZuW2FdPWZ1bmN0aW9uKGQsZSxmKXtyZXR1cm4gdGhpcy5hbmltYXRlKGIsCmQsZSxmKX19KTtjLmV4dGVuZCh7c3BlZWQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPWEmJnR5cGVvZiBhPT09Im9iamVjdCI/Yy5leHRlbmQoe30sYSk6e2NvbXBsZXRlOmR8fCFkJiZifHxjLmlzRnVuY3Rpb24oYSkmJmEsZHVyYXRpb246YSxlYXNpbmc6ZCYmYnx8YiYmIWMuaXNGdW5jdGlvbihiKSYmYn07ZS5kdXJhdGlvbj1jLmZ4Lm9mZj8wOnR5cGVvZiBlLmR1cmF0aW9uPT09Im51bWJlciI/ZS5kdXJhdGlvbjplLmR1cmF0aW9uIGluIGMuZnguc3BlZWRzP2MuZnguc3BlZWRzW2UuZHVyYXRpb25dOmMuZnguc3BlZWRzLl9kZWZhdWx0O2Uub2xkPWUuY29tcGxldGU7ZS5jb21wbGV0ZT1mdW5jdGlvbigpe2UucXVldWUhPT1mYWxzZSYmYyh0aGlzKS5kZXF1ZXVlKCk7Yy5pc0Z1bmN0aW9uKGUub2xkKSYmZS5vbGQuY2FsbCh0aGlzKX07cmV0dXJuIGV9LGVhc2luZzp7bGluZWFyOmZ1bmN0aW9uKGEsYixkLGUpe3JldHVybiBkK2UqYX0sc3dpbmc6ZnVuY3Rpb24oYSxiLGQsZSl7cmV0dXJuKC1NYXRoLmNvcyhhKgpNYXRoLlBJKS8yKzAuNSkqZStkfX0sdGltZXJzOltdLGZ4OmZ1bmN0aW9uKGEsYixkKXt0aGlzLm9wdGlvbnM9Yjt0aGlzLmVsZW09YTt0aGlzLnByb3A9ZDtpZighYi5vcmlnKWIub3JpZz17fX19KTtjLmZ4LnByb3RvdHlwZT17dXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpOyhjLmZ4LnN0ZXBbdGhpcy5wcm9wXXx8Yy5meC5zdGVwLl9kZWZhdWx0KSh0aGlzKX0sY3VyOmZ1bmN0aW9uKCl7aWYodGhpcy5lbGVtW3RoaXMucHJvcF0hPW51bGwmJighdGhpcy5lbGVtLnN0eWxlfHx0aGlzLmVsZW0uc3R5bGVbdGhpcy5wcm9wXT09bnVsbCkpcmV0dXJuIHRoaXMuZWxlbVt0aGlzLnByb3BdO3ZhciBhPXBhcnNlRmxvYXQoYy5jc3ModGhpcy5lbGVtLHRoaXMucHJvcCkpO3JldHVybiBhJiZhPi0xRTQ/YTowfSxjdXN0b206ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGUobCl7cmV0dXJuIGYuc3RlcChsKX0KdmFyIGY9dGhpcyxoPWMuZng7dGhpcy5zdGFydFRpbWU9Yy5ub3coKTt0aGlzLnN0YXJ0PWE7dGhpcy5lbmQ9Yjt0aGlzLnVuaXQ9ZHx8dGhpcy51bml0fHwicHgiO3RoaXMubm93PXRoaXMuc3RhcnQ7dGhpcy5wb3M9dGhpcy5zdGF0ZT0wO2UuZWxlbT10aGlzLmVsZW07aWYoZSgpJiZjLnRpbWVycy5wdXNoKGUpJiYhYmEpYmE9c2V0SW50ZXJ2YWwoaC50aWNrLGguaW50ZXJ2YWwpfSxzaG93OmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXT1jLnN0eWxlKHRoaXMuZWxlbSx0aGlzLnByb3ApO3RoaXMub3B0aW9ucy5zaG93PXRydWU7dGhpcy5jdXN0b20odGhpcy5wcm9wPT09IndpZHRoInx8dGhpcy5wcm9wPT09ImhlaWdodCI/MTowLHRoaXMuY3VyKCkpO2ModGhpcy5lbGVtKS5zaG93KCl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdPWMuc3R5bGUodGhpcy5lbGVtLHRoaXMucHJvcCk7dGhpcy5vcHRpb25zLmhpZGU9dHJ1ZTsKdGhpcy5jdXN0b20odGhpcy5jdXIoKSwwKX0sc3RlcDpmdW5jdGlvbihhKXt2YXIgYj1jLm5vdygpLGQ9dHJ1ZTtpZihhfHxiPj10aGlzLm9wdGlvbnMuZHVyYXRpb24rdGhpcy5zdGFydFRpbWUpe3RoaXMubm93PXRoaXMuZW5kO3RoaXMucG9zPXRoaXMuc3RhdGU9MTt0aGlzLnVwZGF0ZSgpO3RoaXMub3B0aW9ucy5jdXJBbmltW3RoaXMucHJvcF09dHJ1ZTtmb3IodmFyIGUgaW4gdGhpcy5vcHRpb25zLmN1ckFuaW0paWYodGhpcy5vcHRpb25zLmN1ckFuaW1bZV0hPT10cnVlKWQ9ZmFsc2U7aWYoZCl7aWYodGhpcy5vcHRpb25zLm92ZXJmbG93IT1udWxsJiYhYy5zdXBwb3J0LnNocmlua1dyYXBCbG9ja3Mpe3ZhciBmPXRoaXMuZWxlbSxoPXRoaXMub3B0aW9ucztjLmVhY2goWyIiLCJYIiwiWSJdLGZ1bmN0aW9uKGssbyl7Zi5zdHlsZVsib3ZlcmZsb3ciK29dPWgub3ZlcmZsb3dba119KX10aGlzLm9wdGlvbnMuaGlkZSYmYyh0aGlzLmVsZW0pLmhpZGUoKTtpZih0aGlzLm9wdGlvbnMuaGlkZXx8CnRoaXMub3B0aW9ucy5zaG93KWZvcih2YXIgbCBpbiB0aGlzLm9wdGlvbnMuY3VyQW5pbSljLnN0eWxlKHRoaXMuZWxlbSxsLHRoaXMub3B0aW9ucy5vcmlnW2xdKTt0aGlzLm9wdGlvbnMuY29tcGxldGUuY2FsbCh0aGlzLmVsZW0pfXJldHVybiBmYWxzZX1lbHNle2E9Yi10aGlzLnN0YXJ0VGltZTt0aGlzLnN0YXRlPWEvdGhpcy5vcHRpb25zLmR1cmF0aW9uO2I9dGhpcy5vcHRpb25zLmVhc2luZ3x8KGMuZWFzaW5nLnN3aW5nPyJzd2luZyI6ImxpbmVhciIpO3RoaXMucG9zPWMuZWFzaW5nW3RoaXMub3B0aW9ucy5zcGVjaWFsRWFzaW5nJiZ0aGlzLm9wdGlvbnMuc3BlY2lhbEVhc2luZ1t0aGlzLnByb3BdfHxiXSh0aGlzLnN0YXRlLGEsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik7dGhpcy5ub3c9dGhpcy5zdGFydCsodGhpcy5lbmQtdGhpcy5zdGFydCkqdGhpcy5wb3M7dGhpcy51cGRhdGUoKX1yZXR1cm4gdHJ1ZX19O2MuZXh0ZW5kKGMuZngse3RpY2s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CmMudGltZXJzLGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdKCl8fGEuc3BsaWNlKGItLSwxKTthLmxlbmd0aHx8Yy5meC5zdG9wKCl9LGludGVydmFsOjEzLHN0b3A6ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKGJhKTtiYT1udWxsfSxzcGVlZHM6e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0OjQwMH0sc3RlcDp7b3BhY2l0eTpmdW5jdGlvbihhKXtjLnN0eWxlKGEuZWxlbSwib3BhY2l0eSIsYS5ub3cpfSxfZGVmYXVsdDpmdW5jdGlvbihhKXtpZihhLmVsZW0uc3R5bGUmJmEuZWxlbS5zdHlsZVthLnByb3BdIT1udWxsKWEuZWxlbS5zdHlsZVthLnByb3BdPShhLnByb3A9PT0id2lkdGgifHxhLnByb3A9PT0iaGVpZ2h0Ij9NYXRoLm1heCgwLGEubm93KTphLm5vdykrYS51bml0O2Vsc2UgYS5lbGVtW2EucHJvcF09YS5ub3d9fX0pO2lmKGMuZXhwciYmYy5leHByLmZpbHRlcnMpYy5leHByLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGMuZ3JlcChjLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PQpiLmVsZW19KS5sZW5ndGh9O3ZhciB4Yj0vXnQoPzphYmxlfGR8aCkkL2ksSWE9L14oPzpib2R5fGh0bWwpJC9pO2MuZm4ub2Zmc2V0PSJnZXRCb3VuZGluZ0NsaWVudFJlY3QiaW4gdC5kb2N1bWVudEVsZW1lbnQ/ZnVuY3Rpb24oYSl7dmFyIGI9dGhpc1swXSxkO2lmKGEpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihsKXtjLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGwpfSk7aWYoIWJ8fCFiLm93bmVyRG9jdW1lbnQpcmV0dXJuIG51bGw7aWYoYj09PWIub3duZXJEb2N1bWVudC5ib2R5KXJldHVybiBjLm9mZnNldC5ib2R5T2Zmc2V0KGIpO3RyeXtkPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9Y2F0Y2goZSl7fXZhciBmPWIub3duZXJEb2N1bWVudCxoPWYuZG9jdW1lbnRFbGVtZW50O2lmKCFkfHwhYy5jb250YWlucyhoLGIpKXJldHVybiBkfHx7dG9wOjAsbGVmdDowfTtiPWYuYm9keTtmPWZhKGYpO3JldHVybnt0b3A6ZC50b3ArKGYucGFnZVlPZmZzZXR8fGMuc3VwcG9ydC5ib3hNb2RlbCYmCmguc2Nyb2xsVG9wfHxiLnNjcm9sbFRvcCktKGguY2xpZW50VG9wfHxiLmNsaWVudFRvcHx8MCksbGVmdDpkLmxlZnQrKGYucGFnZVhPZmZzZXR8fGMuc3VwcG9ydC5ib3hNb2RlbCYmaC5zY3JvbGxMZWZ0fHxiLnNjcm9sbExlZnQpLShoLmNsaWVudExlZnR8fGIuY2xpZW50TGVmdHx8MCl9fTpmdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdO2lmKGEpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbih4KXtjLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLHgpfSk7aWYoIWJ8fCFiLm93bmVyRG9jdW1lbnQpcmV0dXJuIG51bGw7aWYoYj09PWIub3duZXJEb2N1bWVudC5ib2R5KXJldHVybiBjLm9mZnNldC5ib2R5T2Zmc2V0KGIpO2Mub2Zmc2V0LmluaXRpYWxpemUoKTt2YXIgZCxlPWIub2Zmc2V0UGFyZW50LGY9Yi5vd25lckRvY3VtZW50LGg9Zi5kb2N1bWVudEVsZW1lbnQsbD1mLmJvZHk7ZD0oZj1mLmRlZmF1bHRWaWV3KT9mLmdldENvbXB1dGVkU3R5bGUoYixudWxsKTpiLmN1cnJlbnRTdHlsZTsKZm9yKHZhciBrPWIub2Zmc2V0VG9wLG89Yi5vZmZzZXRMZWZ0OyhiPWIucGFyZW50Tm9kZSkmJmIhPT1sJiZiIT09aDspe2lmKGMub2Zmc2V0LnN1cHBvcnRzRml4ZWRQb3NpdGlvbiYmZC5wb3NpdGlvbj09PSJmaXhlZCIpYnJlYWs7ZD1mP2YuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmIuY3VycmVudFN0eWxlO2stPWIuc2Nyb2xsVG9wO28tPWIuc2Nyb2xsTGVmdDtpZihiPT09ZSl7ays9Yi5vZmZzZXRUb3A7bys9Yi5vZmZzZXRMZWZ0O2lmKGMub2Zmc2V0LmRvZXNOb3RBZGRCb3JkZXImJiEoYy5vZmZzZXQuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHMmJnhiLnRlc3QoYi5ub2RlTmFtZSkpKXtrKz1wYXJzZUZsb2F0KGQuYm9yZGVyVG9wV2lkdGgpfHwwO28rPXBhcnNlRmxvYXQoZC5ib3JkZXJMZWZ0V2lkdGgpfHwwfWU9Yi5vZmZzZXRQYXJlbnR9aWYoYy5vZmZzZXQuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlJiZkLm92ZXJmbG93IT09InZpc2libGUiKXtrKz0KcGFyc2VGbG9hdChkLmJvcmRlclRvcFdpZHRoKXx8MDtvKz1wYXJzZUZsb2F0KGQuYm9yZGVyTGVmdFdpZHRoKXx8MH1kPWR9aWYoZC5wb3NpdGlvbj09PSJyZWxhdGl2ZSJ8fGQucG9zaXRpb249PT0ic3RhdGljIil7ays9bC5vZmZzZXRUb3A7bys9bC5vZmZzZXRMZWZ0fWlmKGMub2Zmc2V0LnN1cHBvcnRzRml4ZWRQb3NpdGlvbiYmZC5wb3NpdGlvbj09PSJmaXhlZCIpe2srPU1hdGgubWF4KGguc2Nyb2xsVG9wLGwuc2Nyb2xsVG9wKTtvKz1NYXRoLm1heChoLnNjcm9sbExlZnQsbC5zY3JvbGxMZWZ0KX1yZXR1cm57dG9wOmssbGVmdDpvfX07Yy5vZmZzZXQ9e2luaXRpYWxpemU6ZnVuY3Rpb24oKXt2YXIgYT10LmJvZHksYj10LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQsZSxmLGg9cGFyc2VGbG9hdChjLmNzcyhhLCJtYXJnaW5Ub3AiKSl8fDA7Yy5leHRlbmQoYi5zdHlsZSx7cG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAsbWFyZ2luOjAsYm9yZGVyOjAsd2lkdGg6IjFweCIsCmhlaWdodDoiMXB4Iix2aXNpYmlsaXR5OiJoaWRkZW4ifSk7Yi5pbm5lckhUTUw9IjxkaXYgc3R5bGU9J3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4Oyc+PGRpdj48L2Rpdj48L2Rpdj48dGFibGUgc3R5bGU9J3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4OycgY2VsbHBhZGRpbmc9JzAnIGNlbGxzcGFjaW5nPScwJz48dHI+PHRkPjwvdGQ+PC90cj48L3RhYmxlPiI7YS5pbnNlcnRCZWZvcmUoYixhLmZpcnN0Q2hpbGQpO2Q9Yi5maXJzdENoaWxkO2U9ZC5maXJzdENoaWxkO2Y9ZC5uZXh0U2libGluZy5maXJzdENoaWxkLmZpcnN0Q2hpbGQ7dGhpcy5kb2VzTm90QWRkQm9yZGVyPWUub2Zmc2V0VG9wIT09NTt0aGlzLmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzPQpmLm9mZnNldFRvcD09PTU7ZS5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiO2Uuc3R5bGUudG9wPSIyMHB4Ijt0aGlzLnN1cHBvcnRzRml4ZWRQb3NpdGlvbj1lLm9mZnNldFRvcD09PTIwfHxlLm9mZnNldFRvcD09PTE1O2Uuc3R5bGUucG9zaXRpb249ZS5zdHlsZS50b3A9IiI7ZC5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIjtkLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSI7dGhpcy5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGU9ZS5vZmZzZXRUb3A9PT0tNTt0aGlzLmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0PWEub2Zmc2V0VG9wIT09aDthLnJlbW92ZUNoaWxkKGIpO2Mub2Zmc2V0LmluaXRpYWxpemU9Yy5ub29wfSxib2R5T2Zmc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEub2Zmc2V0VG9wLGQ9YS5vZmZzZXRMZWZ0O2Mub2Zmc2V0LmluaXRpYWxpemUoKTtpZihjLm9mZnNldC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCl7Yis9cGFyc2VGbG9hdChjLmNzcyhhLAoibWFyZ2luVG9wIikpfHwwO2QrPXBhcnNlRmxvYXQoYy5jc3MoYSwibWFyZ2luTGVmdCIpKXx8MH1yZXR1cm57dG9wOmIsbGVmdDpkfX0sc2V0T2Zmc2V0OmZ1bmN0aW9uKGEsYixkKXt2YXIgZT1jLmNzcyhhLCJwb3NpdGlvbiIpO2lmKGU9PT0ic3RhdGljIilhLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSI7dmFyIGY9YyhhKSxoPWYub2Zmc2V0KCksbD1jLmNzcyhhLCJ0b3AiKSxrPWMuY3NzKGEsImxlZnQiKSxvPWU9PT0iYWJzb2x1dGUiJiZjLmluQXJyYXkoImF1dG8iLFtsLGtdKT4tMTtlPXt9O3ZhciB4PXt9O2lmKG8peD1mLnBvc2l0aW9uKCk7bD1vP3gudG9wOnBhcnNlSW50KGwsMTApfHwwO2s9bz94LmxlZnQ6cGFyc2VJbnQoaywxMCl8fDA7aWYoYy5pc0Z1bmN0aW9uKGIpKWI9Yi5jYWxsKGEsZCxoKTtpZihiLnRvcCE9bnVsbCllLnRvcD1iLnRvcC1oLnRvcCtsO2lmKGIubGVmdCE9bnVsbCllLmxlZnQ9Yi5sZWZ0LWgubGVmdCtrOyJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLAplKTpmLmNzcyhlKX19O2MuZm4uZXh0ZW5kKHtwb3NpdGlvbjpmdW5jdGlvbigpe2lmKCF0aGlzWzBdKXJldHVybiBudWxsO3ZhciBhPXRoaXNbMF0sYj10aGlzLm9mZnNldFBhcmVudCgpLGQ9dGhpcy5vZmZzZXQoKSxlPUlhLnRlc3QoYlswXS5ub2RlTmFtZSk/e3RvcDowLGxlZnQ6MH06Yi5vZmZzZXQoKTtkLnRvcC09cGFyc2VGbG9hdChjLmNzcyhhLCJtYXJnaW5Ub3AiKSl8fDA7ZC5sZWZ0LT1wYXJzZUZsb2F0KGMuY3NzKGEsIm1hcmdpbkxlZnQiKSl8fDA7ZS50b3ArPXBhcnNlRmxvYXQoYy5jc3MoYlswXSwiYm9yZGVyVG9wV2lkdGgiKSl8fDA7ZS5sZWZ0Kz1wYXJzZUZsb2F0KGMuY3NzKGJbMF0sImJvcmRlckxlZnRXaWR0aCIpKXx8MDtyZXR1cm57dG9wOmQudG9wLWUudG9wLGxlZnQ6ZC5sZWZ0LWUubGVmdH19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLm9mZnNldFBhcmVudHx8dC5ib2R5O2EmJiFJYS50ZXN0KGEubm9kZU5hbWUpJiYKYy5jc3MoYSwicG9zaXRpb24iKT09PSJzdGF0aWMiOylhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfSl9fSk7Yy5lYWNoKFsiTGVmdCIsIlRvcCJdLGZ1bmN0aW9uKGEsYil7dmFyIGQ9InNjcm9sbCIrYjtjLmZuW2RdPWZ1bmN0aW9uKGUpe3ZhciBmPXRoaXNbMF0saDtpZighZilyZXR1cm4gbnVsbDtpZihlIT09QilyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYoaD1mYSh0aGlzKSloLnNjcm9sbFRvKCFhP2U6YyhoKS5zY3JvbGxMZWZ0KCksYT9lOmMoaCkuc2Nyb2xsVG9wKCkpO2Vsc2UgdGhpc1tkXT1lfSk7ZWxzZSByZXR1cm4oaD1mYShmKSk/InBhZ2VYT2Zmc2V0ImluIGg/aFthPyJwYWdlWU9mZnNldCI6InBhZ2VYT2Zmc2V0Il06Yy5zdXBwb3J0LmJveE1vZGVsJiZoLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXXx8aC5kb2N1bWVudC5ib2R5W2RdOmZbZF19fSk7Yy5lYWNoKFsiSGVpZ2h0IiwiV2lkdGgiXSxmdW5jdGlvbihhLGIpe3ZhciBkPWIudG9Mb3dlckNhc2UoKTsKYy5mblsiaW5uZXIiK2JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbMF0/cGFyc2VGbG9hdChjLmNzcyh0aGlzWzBdLGQsInBhZGRpbmciKSk6bnVsbH07Yy5mblsib3V0ZXIiK2JdPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzWzBdP3BhcnNlRmxvYXQoYy5jc3ModGhpc1swXSxkLGU/Im1hcmdpbiI6ImJvcmRlciIpKTpudWxsfTtjLmZuW2RdPWZ1bmN0aW9uKGUpe3ZhciBmPXRoaXNbMF07aWYoIWYpcmV0dXJuIGU9PW51bGw/bnVsbDp0aGlzO2lmKGMuaXNGdW5jdGlvbihlKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGwpe3ZhciBrPWModGhpcyk7a1tkXShlLmNhbGwodGhpcyxsLGtbZF0oKSkpfSk7aWYoYy5pc1dpbmRvdyhmKSlyZXR1cm4gZi5kb2N1bWVudC5jb21wYXRNb2RlPT09IkNTUzFDb21wYXQiJiZmLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IitiXXx8Zi5kb2N1bWVudC5ib2R5WyJjbGllbnQiK2JdO2Vsc2UgaWYoZi5ub2RlVHlwZT09PTkpcmV0dXJuIE1hdGgubWF4KGYuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiKwpiXSxmLmJvZHlbInNjcm9sbCIrYl0sZi5kb2N1bWVudEVsZW1lbnRbInNjcm9sbCIrYl0sZi5ib2R5WyJvZmZzZXQiK2JdLGYuZG9jdW1lbnRFbGVtZW50WyJvZmZzZXQiK2JdKTtlbHNlIGlmKGU9PT1CKXtmPWMuY3NzKGYsZCk7dmFyIGg9cGFyc2VGbG9hdChmKTtyZXR1cm4gYy5pc05hTihoKT9mOmh9ZWxzZSByZXR1cm4gdGhpcy5jc3MoZCx0eXBlb2YgZT09PSJzdHJpbmciP2U6ZSsicHgiKX19KX0pKHdpbmRvdyk7Cg=="></script>
	<script id= "script_sl_jqueryui_js" src="data:/text/plain;base64,LyohIGpRdWVyeSBVSSAtIHYxLjguMjQgLSAyMDEyLTA5LTI4CiogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkKKiBJbmNsdWRlczoganF1ZXJ5LnVpLmNvcmUuanMsIGpxdWVyeS51aS53aWRnZXQuanMsIGpxdWVyeS51aS5tb3VzZS5qcywganF1ZXJ5LnVpLmRyYWdnYWJsZS5qcywganF1ZXJ5LnVpLmRyb3BwYWJsZS5qcywganF1ZXJ5LnVpLnJlc2l6YWJsZS5qcywganF1ZXJ5LnVpLnNlbGVjdGFibGUuanMsIGpxdWVyeS51aS5zb3J0YWJsZS5qcywganF1ZXJ5LmVmZmVjdHMuY29yZS5qcywganF1ZXJ5LmVmZmVjdHMuYmxpbmQuanMsIGpxdWVyeS5lZmZlY3RzLmJvdW5jZS5qcywganF1ZXJ5LmVmZmVjdHMuY2xpcC5qcywganF1ZXJ5LmVmZmVjdHMuZHJvcC5qcywganF1ZXJ5LmVmZmVjdHMuZXhwbG9kZS5qcywganF1ZXJ5LmVmZmVjdHMuZmFkZS5qcywganF1ZXJ5LmVmZmVjdHMuZm9sZC5qcywganF1ZXJ5LmVmZmVjdHMuaGlnaGxpZ2h0LmpzLCBqcXVlcnkuZWZmZWN0cy5wdWxzYXRlLmpzLCBqcXVlcnkuZWZmZWN0cy5zY2FsZS5qcywganF1ZXJ5LmVmZmVjdHMuc2hha2UuanMsIGpxdWVyeS5lZmZlY3RzLnNsaWRlLmpzLCBqcXVlcnkuZWZmZWN0cy50cmFuc2Zlci5qcywganF1ZXJ5LnVpLmFjY29yZGlvbi5qcywganF1ZXJ5LnVpLmF1dG9jb21wbGV0ZS5qcywganF1ZXJ5LnVpLmJ1dHRvbi5qcywganF1ZXJ5LnVpLmRhdGVwaWNrZXIuanMsIGpxdWVyeS51aS5kaWFsb2cuanMsIGpxdWVyeS51aS5wb3NpdGlvbi5qcywganF1ZXJ5LnVpLnByb2dyZXNzYmFyLmpzLCBqcXVlcnkudWkuc2xpZGVyLmpzLCBqcXVlcnkudWkudGFicy5qcwoqIENvcHlyaWdodCAoYykgMjAxMiBBVVRIT1JTLnR4dDsgTGljZW5zZWQgTUlULCBHUEwgKi8KKGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhiLGMpe3ZhciBlPWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZigiYXJlYSI9PT1lKXt2YXIgZj1iLnBhcmVudE5vZGUsZz1mLm5hbWUsaDtyZXR1cm4hYi5ocmVmfHwhZ3x8Zi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09Im1hcCI/ITE6KGg9YSgiaW1nW3VzZW1hcD0jIitnKyJdIilbMF0sISFoJiZkKGgpKX1yZXR1cm4oL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0Ly50ZXN0KGUpPyFiLmRpc2FibGVkOiJhIj09ZT9iLmhyZWZ8fGM6YykmJmQoYil9ZnVuY3Rpb24gZChiKXtyZXR1cm4hYShiKS5wYXJlbnRzKCkuYW5kU2VsZigpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiBhLmN1ckNTUyh0aGlzLCJ2aXNpYmlsaXR5Iik9PT0iaGlkZGVuInx8YS5leHByLmZpbHRlcnMuaGlkZGVuKHRoaXMpfSkubGVuZ3RofWEudWk9YS51aXx8e307aWYoYS51aS52ZXJzaW9uKXJldHVybjthLmV4dGVuZChhLnVpLHt2ZXJzaW9uOiIxLjguMjQiLGtleUNvZGU6e0FMVDoxOCxCQUNLU1BBQ0U6OCxDQVBTX0xPQ0s6MjAsQ09NTUE6MTg4LENPTU1BTkQ6OTEsQ09NTUFORF9MRUZUOjkxLENPTU1BTkRfUklHSFQ6OTMsQ09OVFJPTDoxNyxERUxFVEU6NDYsRE9XTjo0MCxFTkQ6MzUsRU5URVI6MTMsRVNDQVBFOjI3LEhPTUU6MzYsSU5TRVJUOjQ1LExFRlQ6MzcsTUVOVTo5MyxOVU1QQURfQUREOjEwNyxOVU1QQURfREVDSU1BTDoxMTAsTlVNUEFEX0RJVklERToxMTEsTlVNUEFEX0VOVEVSOjEwOCxOVU1QQURfTVVMVElQTFk6MTA2LE5VTVBBRF9TVUJUUkFDVDoxMDksUEFHRV9ET1dOOjM0LFBBR0VfVVA6MzMsUEVSSU9EOjE5MCxSSUdIVDozOSxTSElGVDoxNixTUEFDRTozMixUQUI6OSxVUDozOCxXSU5ET1dTOjkxfX0pLGEuZm4uZXh0ZW5kKHtwcm9wQXR0cjphLmZuLnByb3B8fGEuZm4uYXR0cixfZm9jdXM6YS5mbi5mb2N1cyxmb2N1czpmdW5jdGlvbihiLGMpe3JldHVybiB0eXBlb2YgYj09Im51bWJlciI/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YShkKS5mb2N1cygpLGMmJmMuY2FsbChkKX0sYil9KTp0aGlzLl9mb2N1cy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHNjcm9sbFBhcmVudDpmdW5jdGlvbigpe3ZhciBiO3JldHVybiBhLmJyb3dzZXIubXNpZSYmLyhzdGF0aWN8cmVsYXRpdmUpLy50ZXN0KHRoaXMuY3NzKCJwb3NpdGlvbiIpKXx8L2Fic29sdXRlLy50ZXN0KHRoaXMuY3NzKCJwb3NpdGlvbiIpKT9iPXRoaXMucGFyZW50cygpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybi8ocmVsYXRpdmV8YWJzb2x1dGV8Zml4ZWQpLy50ZXN0KGEuY3VyQ1NTKHRoaXMsInBvc2l0aW9uIiwxKSkmJi8oYXV0b3xzY3JvbGwpLy50ZXN0KGEuY3VyQ1NTKHRoaXMsIm92ZXJmbG93IiwxKSthLmN1ckNTUyh0aGlzLCJvdmVyZmxvdy15IiwxKSthLmN1ckNTUyh0aGlzLCJvdmVyZmxvdy14IiwxKSl9KS5lcSgwKTpiPXRoaXMucGFyZW50cygpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybi8oYXV0b3xzY3JvbGwpLy50ZXN0KGEuY3VyQ1NTKHRoaXMsIm92ZXJmbG93IiwxKSthLmN1ckNTUyh0aGlzLCJvdmVyZmxvdy15IiwxKSthLmN1ckNTUyh0aGlzLCJvdmVyZmxvdy14IiwxKSl9KS5lcSgwKSwvZml4ZWQvLnRlc3QodGhpcy5jc3MoInBvc2l0aW9uIikpfHwhYi5sZW5ndGg/YShkb2N1bWVudCk6Yn0sekluZGV4OmZ1bmN0aW9uKGMpe2lmKGMhPT1iKXJldHVybiB0aGlzLmNzcygiekluZGV4IixjKTtpZih0aGlzLmxlbmd0aCl7dmFyIGQ9YSh0aGlzWzBdKSxlLGY7d2hpbGUoZC5sZW5ndGgmJmRbMF0hPT1kb2N1bWVudCl7ZT1kLmNzcygicG9zaXRpb24iKTtpZihlPT09ImFic29sdXRlInx8ZT09PSJyZWxhdGl2ZSJ8fGU9PT0iZml4ZWQiKXtmPXBhcnNlSW50KGQuY3NzKCJ6SW5kZXgiKSwxMCk7aWYoIWlzTmFOKGYpJiZmIT09MClyZXR1cm4gZn1kPWQucGFyZW50KCl9fXJldHVybiAwfSxkaXNhYmxlU2VsZWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmluZCgoYS5zdXBwb3J0LnNlbGVjdHN0YXJ0PyJzZWxlY3RzdGFydCI6Im1vdXNlZG93biIpKyIudWktZGlzYWJsZVNlbGVjdGlvbiIsZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpfSl9LGVuYWJsZVNlbGVjdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVuYmluZCgiLnVpLWRpc2FibGVTZWxlY3Rpb24iKX19KSxhKCI8YT4iKS5vdXRlcldpZHRoKDEpLmpxdWVyeXx8YS5lYWNoKFsiV2lkdGgiLCJIZWlnaHQiXSxmdW5jdGlvbihjLGQpe2Z1bmN0aW9uIGgoYixjLGQsZil7cmV0dXJuIGEuZWFjaChlLGZ1bmN0aW9uKCl7Yy09cGFyc2VGbG9hdChhLmN1ckNTUyhiLCJwYWRkaW5nIit0aGlzLCEwKSl8fDAsZCYmKGMtPXBhcnNlRmxvYXQoYS5jdXJDU1MoYiwiYm9yZGVyIit0aGlzKyJXaWR0aCIsITApKXx8MCksZiYmKGMtPXBhcnNlRmxvYXQoYS5jdXJDU1MoYiwibWFyZ2luIit0aGlzLCEwKSl8fDApfSksY312YXIgZT1kPT09IldpZHRoIj9bIkxlZnQiLCJSaWdodCJdOlsiVG9wIiwiQm90dG9tIl0sZj1kLnRvTG93ZXJDYXNlKCksZz17aW5uZXJXaWR0aDphLmZuLmlubmVyV2lkdGgsaW5uZXJIZWlnaHQ6YS5mbi5pbm5lckhlaWdodCxvdXRlcldpZHRoOmEuZm4ub3V0ZXJXaWR0aCxvdXRlckhlaWdodDphLmZuLm91dGVySGVpZ2h0fTthLmZuWyJpbm5lciIrZF09ZnVuY3Rpb24oYyl7cmV0dXJuIGM9PT1iP2dbImlubmVyIitkXS5jYWxsKHRoaXMpOnRoaXMuZWFjaChmdW5jdGlvbigpe2EodGhpcykuY3NzKGYsaCh0aGlzLGMpKyJweCIpfSl9LGEuZm5bIm91dGVyIitkXT1mdW5jdGlvbihiLGMpe3JldHVybiB0eXBlb2YgYiE9Im51bWJlciI/Z1sib3V0ZXIiK2RdLmNhbGwodGhpcyxiKTp0aGlzLmVhY2goZnVuY3Rpb24oKXthKHRoaXMpLmNzcyhmLGgodGhpcyxiLCEwLGMpKyJweCIpfSl9fSksYS5leHRlbmQoYS5leHByWyI6Il0se2RhdGE6YS5leHByLmNyZWF0ZVBzZXVkbz9hLmV4cHIuY3JlYXRlUHNldWRvKGZ1bmN0aW9uKGIpe3JldHVybiBmdW5jdGlvbihjKXtyZXR1cm4hIWEuZGF0YShjLGIpfX0pOmZ1bmN0aW9uKGIsYyxkKXtyZXR1cm4hIWEuZGF0YShiLGRbM10pfSxmb2N1c2FibGU6ZnVuY3Rpb24oYil7cmV0dXJuIGMoYiwhaXNOYU4oYS5hdHRyKGIsInRhYmluZGV4IikpKX0sdGFiYmFibGU6ZnVuY3Rpb24oYil7dmFyIGQ9YS5hdHRyKGIsInRhYmluZGV4IiksZT1pc05hTihkKTtyZXR1cm4oZXx8ZD49MCkmJmMoYiwhZSl9fSksYShmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmJvZHksYz1iLmFwcGVuZENoaWxkKGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpO2Mub2Zmc2V0SGVpZ2h0LGEuZXh0ZW5kKGMuc3R5bGUse21pbkhlaWdodDoiMTAwcHgiLGhlaWdodDoiYXV0byIscGFkZGluZzowLGJvcmRlcldpZHRoOjB9KSxhLnN1cHBvcnQubWluSGVpZ2h0PWMub2Zmc2V0SGVpZ2h0PT09MTAwLGEuc3VwcG9ydC5zZWxlY3RzdGFydD0ib25zZWxlY3RzdGFydCJpbiBjLGIucmVtb3ZlQ2hpbGQoYykuc3R5bGUuZGlzcGxheT0ibm9uZSJ9KSxhLmN1ckNTU3x8KGEuY3VyQ1NTPWEuY3NzKSxhLmV4dGVuZChhLnVpLHtwbHVnaW46e2FkZDpmdW5jdGlvbihiLGMsZCl7dmFyIGU9YS51aVtiXS5wcm90b3R5cGU7Zm9yKHZhciBmIGluIGQpZS5wbHVnaW5zW2ZdPWUucGx1Z2luc1tmXXx8W10sZS5wbHVnaW5zW2ZdLnB1c2goW2MsZFtmXV0pfSxjYWxsOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLnBsdWdpbnNbYl07aWYoIWR8fCFhLmVsZW1lbnRbMF0ucGFyZW50Tm9kZSlyZXR1cm47Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspYS5vcHRpb25zW2RbZV1bMF1dJiZkW2VdWzFdLmFwcGx5KGEuZWxlbWVudCxjKX19LGNvbnRhaW5zOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGRvY3VtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2EuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTY6YSE9PWImJmEuY29udGFpbnMoYil9LGhhc1Njcm9sbDpmdW5jdGlvbihiLGMpe2lmKGEoYikuY3NzKCJvdmVyZmxvdyIpPT09ImhpZGRlbiIpcmV0dXJuITE7dmFyIGQ9YyYmYz09PSJsZWZ0Ij8ic2Nyb2xsTGVmdCI6InNjcm9sbFRvcCIsZT0hMTtyZXR1cm4gYltkXT4wPyEwOihiW2RdPTEsZT1iW2RdPjAsYltkXT0wLGUpfSxpc092ZXJBeGlzOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYT5iJiZhPGIrY30saXNPdmVyOmZ1bmN0aW9uKGIsYyxkLGUsZixnKXtyZXR1cm4gYS51aS5pc092ZXJBeGlzKGIsZCxmKSYmYS51aS5pc092ZXJBeGlzKGMsZSxnKX19KX0pKGpRdWVyeSksZnVuY3Rpb24oYSxiKXtpZihhLmNsZWFuRGF0YSl7dmFyIGM9YS5jbGVhbkRhdGE7YS5jbGVhbkRhdGE9ZnVuY3Rpb24oYil7Zm9yKHZhciBkPTAsZTsoZT1iW2RdKSE9bnVsbDtkKyspdHJ5e2EoZSkudHJpZ2dlckhhbmRsZXIoInJlbW92ZSIpfWNhdGNoKGYpe31jKGIpfX1lbHNle3ZhciBkPWEuZm4ucmVtb3ZlO2EuZm4ucmVtb3ZlPWZ1bmN0aW9uKGIsYyl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3JldHVybiBjfHwoIWJ8fGEuZmlsdGVyKGIsW3RoaXNdKS5sZW5ndGgpJiZhKCIqIix0aGlzKS5hZGQoW3RoaXNdKS5lYWNoKGZ1bmN0aW9uKCl7dHJ5e2EodGhpcykudHJpZ2dlckhhbmRsZXIoInJlbW92ZSIpfWNhdGNoKGIpe319KSxkLmNhbGwoYSh0aGlzKSxiLGMpfSl9fWEud2lkZ2V0PWZ1bmN0aW9uKGIsYyxkKXt2YXIgZT1iLnNwbGl0KCIuIilbMF0sZjtiPWIuc3BsaXQoIi4iKVsxXSxmPWUrIi0iK2IsZHx8KGQ9YyxjPWEuV2lkZ2V0KSxhLmV4cHJbIjoiXVtmXT1mdW5jdGlvbihjKXtyZXR1cm4hIWEuZGF0YShjLGIpfSxhW2VdPWFbZV18fHt9LGFbZV1bYl09ZnVuY3Rpb24oYSxiKXthcmd1bWVudHMubGVuZ3RoJiZ0aGlzLl9jcmVhdGVXaWRnZXQoYSxiKX07dmFyIGc9bmV3IGM7Zy5vcHRpb25zPWEuZXh0ZW5kKCEwLHt9LGcub3B0aW9ucyksYVtlXVtiXS5wcm90b3R5cGU9YS5leHRlbmQoITAsZyx7bmFtZXNwYWNlOmUsd2lkZ2V0TmFtZTpiLHdpZGdldEV2ZW50UHJlZml4OmFbZV1bYl0ucHJvdG90eXBlLndpZGdldEV2ZW50UHJlZml4fHxiLHdpZGdldEJhc2VDbGFzczpmfSxkKSxhLndpZGdldC5icmlkZ2UoYixhW2VdW2JdKX0sYS53aWRnZXQuYnJpZGdlPWZ1bmN0aW9uKGMsZCl7YS5mbltjXT1mdW5jdGlvbihlKXt2YXIgZj10eXBlb2YgZT09InN0cmluZyIsZz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSksaD10aGlzO3JldHVybiBlPSFmJiZnLmxlbmd0aD9hLmV4dGVuZC5hcHBseShudWxsLFshMCxlXS5jb25jYXQoZykpOmUsZiYmZS5jaGFyQXQoMCk9PT0iXyI/aDooZj90aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1hLmRhdGEodGhpcyxjKSxmPWQmJmEuaXNGdW5jdGlvbihkW2VdKT9kW2VdLmFwcGx5KGQsZyk6ZDtpZihmIT09ZCYmZiE9PWIpcmV0dXJuIGg9ZiwhMX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWEuZGF0YSh0aGlzLGMpO2I/Yi5vcHRpb24oZXx8e30pLl9pbml0KCk6YS5kYXRhKHRoaXMsYyxuZXcgZChlLHRoaXMpKX0pLGgpfX0sYS5XaWRnZXQ9ZnVuY3Rpb24oYSxiKXthcmd1bWVudHMubGVuZ3RoJiZ0aGlzLl9jcmVhdGVXaWRnZXQoYSxiKX0sYS5XaWRnZXQucHJvdG90eXBlPXt3aWRnZXROYW1lOiJ3aWRnZXQiLHdpZGdldEV2ZW50UHJlZml4OiIiLG9wdGlvbnM6e2Rpc2FibGVkOiExfSxfY3JlYXRlV2lkZ2V0OmZ1bmN0aW9uKGIsYyl7YS5kYXRhKGMsdGhpcy53aWRnZXROYW1lLHRoaXMpLHRoaXMuZWxlbWVudD1hKGMpLHRoaXMub3B0aW9ucz1hLmV4dGVuZCghMCx7fSx0aGlzLm9wdGlvbnMsdGhpcy5fZ2V0Q3JlYXRlT3B0aW9ucygpLGIpO3ZhciBkPXRoaXM7dGhpcy5lbGVtZW50LmJpbmQoInJlbW92ZS4iK3RoaXMud2lkZ2V0TmFtZSxmdW5jdGlvbigpe2QuZGVzdHJveSgpfSksdGhpcy5fY3JlYXRlKCksdGhpcy5fdHJpZ2dlcigiY3JlYXRlIiksdGhpcy5faW5pdCgpfSxfZ2V0Q3JlYXRlT3B0aW9uczpmdW5jdGlvbigpe3JldHVybiBhLm1ldGFkYXRhJiZhLm1ldGFkYXRhLmdldCh0aGlzLmVsZW1lbnRbMF0pW3RoaXMud2lkZ2V0TmFtZV19LF9jcmVhdGU6ZnVuY3Rpb24oKXt9LF9pbml0OmZ1bmN0aW9uKCl7fSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnVuYmluZCgiLiIrdGhpcy53aWRnZXROYW1lKS5yZW1vdmVEYXRhKHRoaXMud2lkZ2V0TmFtZSksdGhpcy53aWRnZXQoKS51bmJpbmQoIi4iK3RoaXMud2lkZ2V0TmFtZSkucmVtb3ZlQXR0cigiYXJpYS1kaXNhYmxlZCIpLnJlbW92ZUNsYXNzKHRoaXMud2lkZ2V0QmFzZUNsYXNzKyItZGlzYWJsZWQgIisidWktc3RhdGUtZGlzYWJsZWQiKX0sd2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudH0sb3B0aW9uOmZ1bmN0aW9uKGMsZCl7dmFyIGU9YztpZihhcmd1bWVudHMubGVuZ3RoPT09MClyZXR1cm4gYS5leHRlbmQoe30sdGhpcy5vcHRpb25zKTtpZih0eXBlb2YgYz09InN0cmluZyIpe2lmKGQ9PT1iKXJldHVybiB0aGlzLm9wdGlvbnNbY107ZT17fSxlW2NdPWR9cmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoZSksdGhpc30sX3NldE9wdGlvbnM6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcztyZXR1cm4gYS5lYWNoKGIsZnVuY3Rpb24oYSxiKXtjLl9zZXRPcHRpb24oYSxiKX0pLHRoaXN9LF9zZXRPcHRpb246ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5vcHRpb25zW2FdPWIsYT09PSJkaXNhYmxlZCImJnRoaXMud2lkZ2V0KClbYj8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFzcyJdKHRoaXMud2lkZ2V0QmFzZUNsYXNzKyItZGlzYWJsZWQiKyIgIisidWktc3RhdGUtZGlzYWJsZWQiKS5hdHRyKCJhcmlhLWRpc2FibGVkIixiKSx0aGlzfSxlbmFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2V0T3B0aW9uKCJkaXNhYmxlZCIsITEpfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NldE9wdGlvbigiZGlzYWJsZWQiLCEwKX0sX3RyaWdnZXI6ZnVuY3Rpb24oYixjLGQpe3ZhciBlLGYsZz10aGlzLm9wdGlvbnNbYl07ZD1kfHx7fSxjPWEuRXZlbnQoYyksYy50eXBlPShiPT09dGhpcy53aWRnZXRFdmVudFByZWZpeD9iOnRoaXMud2lkZ2V0RXZlbnRQcmVmaXgrYikudG9Mb3dlckNhc2UoKSxjLnRhcmdldD10aGlzLmVsZW1lbnRbMF0sZj1jLm9yaWdpbmFsRXZlbnQ7aWYoZilmb3IoZSBpbiBmKWUgaW4gY3x8KGNbZV09ZltlXSk7cmV0dXJuIHRoaXMuZWxlbWVudC50cmlnZ2VyKGMsZCksIShhLmlzRnVuY3Rpb24oZykmJmcuY2FsbCh0aGlzLmVsZW1lbnRbMF0sYyxkKT09PSExfHxjLmlzRGVmYXVsdFByZXZlbnRlZCgpKX19fShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7dmFyIGM9ITE7YShkb2N1bWVudCkubW91c2V1cChmdW5jdGlvbihhKXtjPSExfSksYS53aWRnZXQoInVpLm1vdXNlIix7b3B0aW9uczp7Y2FuY2VsOiI6aW5wdXQsb3B0aW9uIixkaXN0YW5jZToxLGRlbGF5OjB9LF9tb3VzZUluaXQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzO3RoaXMuZWxlbWVudC5iaW5kKCJtb3VzZWRvd24uIit0aGlzLndpZGdldE5hbWUsZnVuY3Rpb24oYSl7cmV0dXJuIGIuX21vdXNlRG93bihhKX0pLmJpbmQoImNsaWNrLiIrdGhpcy53aWRnZXROYW1lLGZ1bmN0aW9uKGMpe2lmKCEwPT09YS5kYXRhKGMudGFyZ2V0LGIud2lkZ2V0TmFtZSsiLnByZXZlbnRDbGlja0V2ZW50IikpcmV0dXJuIGEucmVtb3ZlRGF0YShjLnRhcmdldCxiLndpZGdldE5hbWUrIi5wcmV2ZW50Q2xpY2tFdmVudCIpLGMuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksITF9KSx0aGlzLnN0YXJ0ZWQ9ITF9LF9tb3VzZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQudW5iaW5kKCIuIit0aGlzLndpZGdldE5hbWUpLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlJiZhKGRvY3VtZW50KS51bmJpbmQoIm1vdXNlbW92ZS4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSkudW5iaW5kKCJtb3VzZXVwLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlVXBEZWxlZ2F0ZSl9LF9tb3VzZURvd246ZnVuY3Rpb24oYil7aWYoYylyZXR1cm47dGhpcy5fbW91c2VTdGFydGVkJiZ0aGlzLl9tb3VzZVVwKGIpLHRoaXMuX21vdXNlRG93bkV2ZW50PWI7dmFyIGQ9dGhpcyxlPWIud2hpY2g9PTEsZj10eXBlb2YgdGhpcy5vcHRpb25zLmNhbmNlbD09InN0cmluZyImJmIudGFyZ2V0Lm5vZGVOYW1lP2EoYi50YXJnZXQpLmNsb3Nlc3QodGhpcy5vcHRpb25zLmNhbmNlbCkubGVuZ3RoOiExO2lmKCFlfHxmfHwhdGhpcy5fbW91c2VDYXB0dXJlKGIpKXJldHVybiEwO3RoaXMubW91c2VEZWxheU1ldD0hdGhpcy5vcHRpb25zLmRlbGF5LHRoaXMubW91c2VEZWxheU1ldHx8KHRoaXMuX21vdXNlRGVsYXlUaW1lcj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZC5tb3VzZURlbGF5TWV0PSEwfSx0aGlzLm9wdGlvbnMuZGVsYXkpKTtpZih0aGlzLl9tb3VzZURpc3RhbmNlTWV0KGIpJiZ0aGlzLl9tb3VzZURlbGF5TWV0KGIpKXt0aGlzLl9tb3VzZVN0YXJ0ZWQ9dGhpcy5fbW91c2VTdGFydChiKSE9PSExO2lmKCF0aGlzLl9tb3VzZVN0YXJ0ZWQpcmV0dXJuIGIucHJldmVudERlZmF1bHQoKSwhMH1yZXR1cm4hMD09PWEuZGF0YShiLnRhcmdldCx0aGlzLndpZGdldE5hbWUrIi5wcmV2ZW50Q2xpY2tFdmVudCIpJiZhLnJlbW92ZURhdGEoYi50YXJnZXQsdGhpcy53aWRnZXROYW1lKyIucHJldmVudENsaWNrRXZlbnQiKSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZT1mdW5jdGlvbihhKXtyZXR1cm4gZC5fbW91c2VNb3ZlKGEpfSx0aGlzLl9tb3VzZVVwRGVsZWdhdGU9ZnVuY3Rpb24oYSl7cmV0dXJuIGQuX21vdXNlVXAoYSl9LGEoZG9jdW1lbnQpLmJpbmQoIm1vdXNlbW92ZS4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSkuYmluZCgibW91c2V1cC4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZVVwRGVsZWdhdGUpLGIucHJldmVudERlZmF1bHQoKSxjPSEwLCEwfSxfbW91c2VNb3ZlOmZ1bmN0aW9uKGIpe3JldHVybiFhLmJyb3dzZXIubXNpZXx8ZG9jdW1lbnQuZG9jdW1lbnRNb2RlPj05fHwhIWIuYnV0dG9uP3RoaXMuX21vdXNlU3RhcnRlZD8odGhpcy5fbW91c2VEcmFnKGIpLGIucHJldmVudERlZmF1bHQoKSk6KHRoaXMuX21vdXNlRGlzdGFuY2VNZXQoYikmJnRoaXMuX21vdXNlRGVsYXlNZXQoYikmJih0aGlzLl9tb3VzZVN0YXJ0ZWQ9dGhpcy5fbW91c2VTdGFydCh0aGlzLl9tb3VzZURvd25FdmVudCxiKSE9PSExLHRoaXMuX21vdXNlU3RhcnRlZD90aGlzLl9tb3VzZURyYWcoYik6dGhpcy5fbW91c2VVcChiKSksIXRoaXMuX21vdXNlU3RhcnRlZCk6dGhpcy5fbW91c2VVcChiKX0sX21vdXNlVXA6ZnVuY3Rpb24oYil7cmV0dXJuIGEoZG9jdW1lbnQpLnVuYmluZCgibW91c2Vtb3ZlLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlKS51bmJpbmQoIm1vdXNldXAuIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VVcERlbGVnYXRlKSx0aGlzLl9tb3VzZVN0YXJ0ZWQmJih0aGlzLl9tb3VzZVN0YXJ0ZWQ9ITEsYi50YXJnZXQ9PXRoaXMuX21vdXNlRG93bkV2ZW50LnRhcmdldCYmYS5kYXRhKGIudGFyZ2V0LHRoaXMud2lkZ2V0TmFtZSsiLnByZXZlbnRDbGlja0V2ZW50IiwhMCksdGhpcy5fbW91c2VTdG9wKGIpKSwhMX0sX21vdXNlRGlzdGFuY2VNZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgubWF4KE1hdGguYWJzKHRoaXMuX21vdXNlRG93bkV2ZW50LnBhZ2VYLWEucGFnZVgpLE1hdGguYWJzKHRoaXMuX21vdXNlRG93bkV2ZW50LnBhZ2VZLWEucGFnZVkpKT49dGhpcy5vcHRpb25zLmRpc3RhbmNlfSxfbW91c2VEZWxheU1ldDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5tb3VzZURlbGF5TWV0fSxfbW91c2VTdGFydDpmdW5jdGlvbihhKXt9LF9tb3VzZURyYWc6ZnVuY3Rpb24oYSl7fSxfbW91c2VTdG9wOmZ1bmN0aW9uKGEpe30sX21vdXNlQ2FwdHVyZTpmdW5jdGlvbihhKXtyZXR1cm4hMH19KX0oalF1ZXJ5KSxmdW5jdGlvbihhLGIpe2Eud2lkZ2V0KCJ1aS5kcmFnZ2FibGUiLGEudWkubW91c2Use3dpZGdldEV2ZW50UHJlZml4OiJkcmFnIixvcHRpb25zOnthZGRDbGFzc2VzOiEwLGFwcGVuZFRvOiJwYXJlbnQiLGF4aXM6ITEsY29ubmVjdFRvU29ydGFibGU6ITEsY29udGFpbm1lbnQ6ITEsY3Vyc29yOiJhdXRvIixjdXJzb3JBdDohMSxncmlkOiExLGhhbmRsZTohMSxoZWxwZXI6Im9yaWdpbmFsIixpZnJhbWVGaXg6ITEsb3BhY2l0eTohMSxyZWZyZXNoUG9zaXRpb25zOiExLHJldmVydDohMSxyZXZlcnREdXJhdGlvbjo1MDAsc2NvcGU6ImRlZmF1bHQiLHNjcm9sbDohMCxzY3JvbGxTZW5zaXRpdml0eToyMCxzY3JvbGxTcGVlZDoyMCxzbmFwOiExLHNuYXBNb2RlOiJib3RoIixzbmFwVG9sZXJhbmNlOjIwLHN0YWNrOiExLHpJbmRleDohMX0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5oZWxwZXI9PSJvcmlnaW5hbCImJiEvXig/OnJ8YXxmKS8udGVzdCh0aGlzLmVsZW1lbnQuY3NzKCJwb3NpdGlvbiIpKSYmKHRoaXMuZWxlbWVudFswXS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSx0aGlzLm9wdGlvbnMuYWRkQ2xhc3NlcyYmdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1kcmFnZ2FibGUiKSx0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktZHJhZ2dhYmxlLWRpc2FibGVkIiksdGhpcy5fbW91c2VJbml0KCl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXtpZighdGhpcy5lbGVtZW50LmRhdGEoImRyYWdnYWJsZSIpKXJldHVybjtyZXR1cm4gdGhpcy5lbGVtZW50LnJlbW92ZURhdGEoImRyYWdnYWJsZSIpLnVuYmluZCgiLmRyYWdnYWJsZSIpLnJlbW92ZUNsYXNzKCJ1aS1kcmFnZ2FibGUgdWktZHJhZ2dhYmxlLWRyYWdnaW5nIHVpLWRyYWdnYWJsZS1kaXNhYmxlZCIpLHRoaXMuX21vdXNlRGVzdHJveSgpLHRoaXN9LF9tb3VzZUNhcHR1cmU6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5vcHRpb25zO3JldHVybiB0aGlzLmhlbHBlcnx8Yy5kaXNhYmxlZHx8YShiLnRhcmdldCkuaXMoIi51aS1yZXNpemFibGUtaGFuZGxlIik/ITE6KHRoaXMuaGFuZGxlPXRoaXMuX2dldEhhbmRsZShiKSx0aGlzLmhhbmRsZT8oYy5pZnJhbWVGaXgmJmEoYy5pZnJhbWVGaXg9PT0hMD8iaWZyYW1lIjpjLmlmcmFtZUZpeCkuZWFjaChmdW5jdGlvbigpe2EoJzxkaXYgY2xhc3M9InVpLWRyYWdnYWJsZS1pZnJhbWVGaXgiIHN0eWxlPSJiYWNrZ3JvdW5kOiAjZmZmOyI+PC9kaXY+JykuY3NzKHt3aWR0aDp0aGlzLm9mZnNldFdpZHRoKyJweCIsaGVpZ2h0OnRoaXMub2Zmc2V0SGVpZ2h0KyJweCIscG9zaXRpb246ImFic29sdXRlIixvcGFjaXR5OiIwLjAwMSIsekluZGV4OjFlM30pLmNzcyhhKHRoaXMpLm9mZnNldCgpKS5hcHBlbmRUbygiYm9keSIpfSksITApOiExKX0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5vcHRpb25zO3JldHVybiB0aGlzLmhlbHBlcj10aGlzLl9jcmVhdGVIZWxwZXIoYiksdGhpcy5oZWxwZXIuYWRkQ2xhc3MoInVpLWRyYWdnYWJsZS1kcmFnZ2luZyIpLHRoaXMuX2NhY2hlSGVscGVyUHJvcG9ydGlvbnMoKSxhLnVpLmRkbWFuYWdlciYmKGEudWkuZGRtYW5hZ2VyLmN1cnJlbnQ9dGhpcyksdGhpcy5fY2FjaGVNYXJnaW5zKCksdGhpcy5jc3NQb3NpdGlvbj10aGlzLmhlbHBlci5jc3MoInBvc2l0aW9uIiksdGhpcy5zY3JvbGxQYXJlbnQ9dGhpcy5oZWxwZXIuc2Nyb2xsUGFyZW50KCksdGhpcy5vZmZzZXQ9dGhpcy5wb3NpdGlvbkFicz10aGlzLmVsZW1lbnQub2Zmc2V0KCksdGhpcy5vZmZzZXQ9e3RvcDp0aGlzLm9mZnNldC50b3AtdGhpcy5tYXJnaW5zLnRvcCxsZWZ0OnRoaXMub2Zmc2V0LmxlZnQtdGhpcy5tYXJnaW5zLmxlZnR9LGEuZXh0ZW5kKHRoaXMub2Zmc2V0LHtjbGljazp7bGVmdDpiLnBhZ2VYLXRoaXMub2Zmc2V0LmxlZnQsdG9wOmIucGFnZVktdGhpcy5vZmZzZXQudG9wfSxwYXJlbnQ6dGhpcy5fZ2V0UGFyZW50T2Zmc2V0KCkscmVsYXRpdmU6dGhpcy5fZ2V0UmVsYXRpdmVPZmZzZXQoKX0pLHRoaXMub3JpZ2luYWxQb3NpdGlvbj10aGlzLnBvc2l0aW9uPXRoaXMuX2dlbmVyYXRlUG9zaXRpb24oYiksdGhpcy5vcmlnaW5hbFBhZ2VYPWIucGFnZVgsdGhpcy5vcmlnaW5hbFBhZ2VZPWIucGFnZVksYy5jdXJzb3JBdCYmdGhpcy5fYWRqdXN0T2Zmc2V0RnJvbUhlbHBlcihjLmN1cnNvckF0KSxjLmNvbnRhaW5tZW50JiZ0aGlzLl9zZXRDb250YWlubWVudCgpLHRoaXMuX3RyaWdnZXIoInN0YXJ0IixiKT09PSExPyh0aGlzLl9jbGVhcigpLCExKToodGhpcy5fY2FjaGVIZWxwZXJQcm9wb3J0aW9ucygpLGEudWkuZGRtYW5hZ2VyJiYhYy5kcm9wQmVoYXZpb3VyJiZhLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyh0aGlzLGIpLHRoaXMuX21vdXNlRHJhZyhiLCEwKSxhLnVpLmRkbWFuYWdlciYmYS51aS5kZG1hbmFnZXIuZHJhZ1N0YXJ0KHRoaXMsYiksITApfSxfbW91c2VEcmFnOmZ1bmN0aW9uKGIsYyl7dGhpcy5wb3NpdGlvbj10aGlzLl9nZW5lcmF0ZVBvc2l0aW9uKGIpLHRoaXMucG9zaXRpb25BYnM9dGhpcy5fY29udmVydFBvc2l0aW9uVG8oImFic29sdXRlIik7aWYoIWMpe3ZhciBkPXRoaXMuX3VpSGFzaCgpO2lmKHRoaXMuX3RyaWdnZXIoImRyYWciLGIsZCk9PT0hMSlyZXR1cm4gdGhpcy5fbW91c2VVcCh7fSksITE7dGhpcy5wb3NpdGlvbj1kLnBvc2l0aW9ufWlmKCF0aGlzLm9wdGlvbnMuYXhpc3x8dGhpcy5vcHRpb25zLmF4aXMhPSJ5Iil0aGlzLmhlbHBlclswXS5zdHlsZS5sZWZ0PXRoaXMucG9zaXRpb24ubGVmdCsicHgiO2lmKCF0aGlzLm9wdGlvbnMuYXhpc3x8dGhpcy5vcHRpb25zLmF4aXMhPSJ4Iil0aGlzLmhlbHBlclswXS5zdHlsZS50b3A9dGhpcy5wb3NpdGlvbi50b3ArInB4IjtyZXR1cm4gYS51aS5kZG1hbmFnZXImJmEudWkuZGRtYW5hZ2VyLmRyYWcodGhpcyxiKSwhMX0sX21vdXNlU3RvcDpmdW5jdGlvbihiKXt2YXIgYz0hMTthLnVpLmRkbWFuYWdlciYmIXRoaXMub3B0aW9ucy5kcm9wQmVoYXZpb3VyJiYoYz1hLnVpLmRkbWFuYWdlci5kcm9wKHRoaXMsYikpLHRoaXMuZHJvcHBlZCYmKGM9dGhpcy5kcm9wcGVkLHRoaXMuZHJvcHBlZD0hMSk7dmFyIGQ9dGhpcy5lbGVtZW50WzBdLGU9ITE7d2hpbGUoZCYmKGQ9ZC5wYXJlbnROb2RlKSlkPT1kb2N1bWVudCYmKGU9ITApO2lmKCFlJiZ0aGlzLm9wdGlvbnMuaGVscGVyPT09Im9yaWdpbmFsIilyZXR1cm4hMTtpZih0aGlzLm9wdGlvbnMucmV2ZXJ0PT0iaW52YWxpZCImJiFjfHx0aGlzLm9wdGlvbnMucmV2ZXJ0PT0idmFsaWQiJiZjfHx0aGlzLm9wdGlvbnMucmV2ZXJ0PT09ITB8fGEuaXNGdW5jdGlvbih0aGlzLm9wdGlvbnMucmV2ZXJ0KSYmdGhpcy5vcHRpb25zLnJldmVydC5jYWxsKHRoaXMuZWxlbWVudCxjKSl7dmFyIGY9dGhpczthKHRoaXMuaGVscGVyKS5hbmltYXRlKHRoaXMub3JpZ2luYWxQb3NpdGlvbixwYXJzZUludCh0aGlzLm9wdGlvbnMucmV2ZXJ0RHVyYXRpb24sMTApLGZ1bmN0aW9uKCl7Zi5fdHJpZ2dlcigic3RvcCIsYikhPT0hMSYmZi5fY2xlYXIoKX0pfWVsc2UgdGhpcy5fdHJpZ2dlcigic3RvcCIsYikhPT0hMSYmdGhpcy5fY2xlYXIoKTtyZXR1cm4hMX0sX21vdXNlVXA6ZnVuY3Rpb24oYil7cmV0dXJuIGEoImRpdi51aS1kcmFnZ2FibGUtaWZyYW1lRml4IikuZWFjaChmdW5jdGlvbigpe3RoaXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzKX0pLGEudWkuZGRtYW5hZ2VyJiZhLnVpLmRkbWFuYWdlci5kcmFnU3RvcCh0aGlzLGIpLGEudWkubW91c2UucHJvdG90eXBlLl9tb3VzZVVwLmNhbGwodGhpcyxiKX0sY2FuY2VsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGVscGVyLmlzKCIudWktZHJhZ2dhYmxlLWRyYWdnaW5nIik/dGhpcy5fbW91c2VVcCh7fSk6dGhpcy5fY2xlYXIoKSx0aGlzfSxfZ2V0SGFuZGxlOmZ1bmN0aW9uKGIpe3ZhciBjPSF0aGlzLm9wdGlvbnMuaGFuZGxlfHwhYSh0aGlzLm9wdGlvbnMuaGFuZGxlLHRoaXMuZWxlbWVudCkubGVuZ3RoPyEwOiExO3JldHVybiBhKHRoaXMub3B0aW9ucy5oYW5kbGUsdGhpcy5lbGVtZW50KS5maW5kKCIqIikuYW5kU2VsZigpLmVhY2goZnVuY3Rpb24oKXt0aGlzPT1iLnRhcmdldCYmKGM9ITApfSksY30sX2NyZWF0ZUhlbHBlcjpmdW5jdGlvbihiKXt2YXIgYz10aGlzLm9wdGlvbnMsZD1hLmlzRnVuY3Rpb24oYy5oZWxwZXIpP2EoYy5oZWxwZXIuYXBwbHkodGhpcy5lbGVtZW50WzBdLFtiXSkpOmMuaGVscGVyPT0iY2xvbmUiP3RoaXMuZWxlbWVudC5jbG9uZSgpLnJlbW92ZUF0dHIoImlkIik6dGhpcy5lbGVtZW50O3JldHVybiBkLnBhcmVudHMoImJvZHkiKS5sZW5ndGh8fGQuYXBwZW5kVG8oYy5hcHBlbmRUbz09InBhcmVudCI/dGhpcy5lbGVtZW50WzBdLnBhcmVudE5vZGU6Yy5hcHBlbmRUbyksZFswXSE9dGhpcy5lbGVtZW50WzBdJiYhLyhmaXhlZHxhYnNvbHV0ZSkvLnRlc3QoZC5jc3MoInBvc2l0aW9uIikpJiZkLmNzcygicG9zaXRpb24iLCJhYnNvbHV0ZSIpLGR9LF9hZGp1c3RPZmZzZXRGcm9tSGVscGVyOmZ1bmN0aW9uKGIpe3R5cGVvZiBiPT0ic3RyaW5nIiYmKGI9Yi5zcGxpdCgiICIpKSxhLmlzQXJyYXkoYikmJihiPXtsZWZ0OitiWzBdLHRvcDorYlsxXXx8MH0pLCJsZWZ0ImluIGImJih0aGlzLm9mZnNldC5jbGljay5sZWZ0PWIubGVmdCt0aGlzLm1hcmdpbnMubGVmdCksInJpZ2h0ImluIGImJih0aGlzLm9mZnNldC5jbGljay5sZWZ0PXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtYi5yaWdodCt0aGlzLm1hcmdpbnMubGVmdCksInRvcCJpbiBiJiYodGhpcy5vZmZzZXQuY2xpY2sudG9wPWIudG9wK3RoaXMubWFyZ2lucy50b3ApLCJib3R0b20iaW4gYiYmKHRoaXMub2Zmc2V0LmNsaWNrLnRvcD10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC1iLmJvdHRvbSt0aGlzLm1hcmdpbnMudG9wKX0sX2dldFBhcmVudE9mZnNldDpmdW5jdGlvbigpe3RoaXMub2Zmc2V0UGFyZW50PXRoaXMuaGVscGVyLm9mZnNldFBhcmVudCgpO3ZhciBiPXRoaXMub2Zmc2V0UGFyZW50Lm9mZnNldCgpO3RoaXMuY3NzUG9zaXRpb249PSJhYnNvbHV0ZSImJnRoaXMuc2Nyb2xsUGFyZW50WzBdIT1kb2N1bWVudCYmYS51aS5jb250YWlucyh0aGlzLnNjcm9sbFBhcmVudFswXSx0aGlzLm9mZnNldFBhcmVudFswXSkmJihiLmxlZnQrPXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKSxiLnRvcCs9dGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCkpO2lmKHRoaXMub2Zmc2V0UGFyZW50WzBdPT1kb2N1bWVudC5ib2R5fHx0aGlzLm9mZnNldFBhcmVudFswXS50YWdOYW1lJiZ0aGlzLm9mZnNldFBhcmVudFswXS50YWdOYW1lLnRvTG93ZXJDYXNlKCk9PSJodG1sIiYmYS5icm93c2VyLm1zaWUpYj17dG9wOjAsbGVmdDowfTtyZXR1cm57dG9wOmIudG9wKyhwYXJzZUludCh0aGlzLm9mZnNldFBhcmVudC5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKSxsZWZ0OmIubGVmdCsocGFyc2VJbnQodGhpcy5vZmZzZXRQYXJlbnQuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApfX0sX2dldFJlbGF0aXZlT2Zmc2V0OmZ1bmN0aW9uKCl7aWYodGhpcy5jc3NQb3NpdGlvbj09InJlbGF0aXZlIil7dmFyIGE9dGhpcy5lbGVtZW50LnBvc2l0aW9uKCk7cmV0dXJue3RvcDphLnRvcC0ocGFyc2VJbnQodGhpcy5oZWxwZXIuY3NzKCJ0b3AiKSwxMCl8fDApK3RoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpLGxlZnQ6YS5sZWZ0LShwYXJzZUludCh0aGlzLmhlbHBlci5jc3MoImxlZnQiKSwxMCl8fDApK3RoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKX19cmV0dXJue3RvcDowLGxlZnQ6MH19LF9jYWNoZU1hcmdpbnM6ZnVuY3Rpb24oKXt0aGlzLm1hcmdpbnM9e2xlZnQ6cGFyc2VJbnQodGhpcy5lbGVtZW50LmNzcygibWFyZ2luTGVmdCIpLDEwKXx8MCx0b3A6cGFyc2VJbnQodGhpcy5lbGVtZW50LmNzcygibWFyZ2luVG9wIiksMTApfHwwLHJpZ2h0OnBhcnNlSW50KHRoaXMuZWxlbWVudC5jc3MoIm1hcmdpblJpZ2h0IiksMTApfHwwLGJvdHRvbTpwYXJzZUludCh0aGlzLmVsZW1lbnQuY3NzKCJtYXJnaW5Cb3R0b20iKSwxMCl8fDB9fSxfY2FjaGVIZWxwZXJQcm9wb3J0aW9uczpmdW5jdGlvbigpe3RoaXMuaGVscGVyUHJvcG9ydGlvbnM9e3dpZHRoOnRoaXMuaGVscGVyLm91dGVyV2lkdGgoKSxoZWlnaHQ6dGhpcy5oZWxwZXIub3V0ZXJIZWlnaHQoKX19LF9zZXRDb250YWlubWVudDpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3B0aW9ucztiLmNvbnRhaW5tZW50PT0icGFyZW50IiYmKGIuY29udGFpbm1lbnQ9dGhpcy5oZWxwZXJbMF0ucGFyZW50Tm9kZSk7aWYoYi5jb250YWlubWVudD09ImRvY3VtZW50Inx8Yi5jb250YWlubWVudD09IndpbmRvdyIpdGhpcy5jb250YWlubWVudD1bYi5jb250YWlubWVudD09ImRvY3VtZW50Ij8wOmEod2luZG93KS5zY3JvbGxMZWZ0KCktdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdC10aGlzLm9mZnNldC5wYXJlbnQubGVmdCxiLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiPzA6YSh3aW5kb3cpLnNjcm9sbFRvcCgpLXRoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9wLChiLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiPzA6YSh3aW5kb3cpLnNjcm9sbExlZnQoKSkrYShiLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiP2RvY3VtZW50OndpbmRvdykud2lkdGgoKS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXRoaXMubWFyZ2lucy5sZWZ0LChiLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiPzA6YSh3aW5kb3cpLnNjcm9sbFRvcCgpKSsoYShiLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiP2RvY3VtZW50OndpbmRvdykuaGVpZ2h0KCl8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZS5zY3JvbGxIZWlnaHQpLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LXRoaXMubWFyZ2lucy50b3BdO2lmKCEvXihkb2N1bWVudHx3aW5kb3d8cGFyZW50KSQvLnRlc3QoYi5jb250YWlubWVudCkmJmIuY29udGFpbm1lbnQuY29uc3RydWN0b3IhPUFycmF5KXt2YXIgYz1hKGIuY29udGFpbm1lbnQpLGQ9Y1swXTtpZighZClyZXR1cm47dmFyIGU9Yy5vZmZzZXQoKSxmPWEoZCkuY3NzKCJvdmVyZmxvdyIpIT0iaGlkZGVuIjt0aGlzLmNvbnRhaW5tZW50PVsocGFyc2VJbnQoYShkKS5jc3MoImJvcmRlckxlZnRXaWR0aCIpLDEwKXx8MCkrKHBhcnNlSW50KGEoZCkuY3NzKCJwYWRkaW5nTGVmdCIpLDEwKXx8MCksKHBhcnNlSW50KGEoZCkuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKXx8MCkrKHBhcnNlSW50KGEoZCkuY3NzKCJwYWRkaW5nVG9wIiksMTApfHwwKSwoZj9NYXRoLm1heChkLnNjcm9sbFdpZHRoLGQub2Zmc2V0V2lkdGgpOmQub2Zmc2V0V2lkdGgpLShwYXJzZUludChhKGQpLmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQoYShkKS5jc3MoInBhZGRpbmdSaWdodCIpLDEwKXx8MCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC10aGlzLm1hcmdpbnMubGVmdC10aGlzLm1hcmdpbnMucmlnaHQsKGY/TWF0aC5tYXgoZC5zY3JvbGxIZWlnaHQsZC5vZmZzZXRIZWlnaHQpOmQub2Zmc2V0SGVpZ2h0KS0ocGFyc2VJbnQoYShkKS5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQoYShkKS5jc3MoInBhZGRpbmdCb3R0b20iKSwxMCl8fDApLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LXRoaXMubWFyZ2lucy50b3AtdGhpcy5tYXJnaW5zLmJvdHRvbV0sdGhpcy5yZWxhdGl2ZV9jb250YWluZXI9Y31lbHNlIGIuY29udGFpbm1lbnQuY29uc3RydWN0b3I9PUFycmF5JiYodGhpcy5jb250YWlubWVudD1iLmNvbnRhaW5tZW50KX0sX2NvbnZlcnRQb3NpdGlvblRvOmZ1bmN0aW9uKGIsYyl7Y3x8KGM9dGhpcy5wb3NpdGlvbik7dmFyIGQ9Yj09ImFic29sdXRlIj8xOi0xLGU9dGhpcy5vcHRpb25zLGY9dGhpcy5jc3NQb3NpdGlvbj09ImFic29sdXRlIiYmKHRoaXMuc2Nyb2xsUGFyZW50WzBdPT1kb2N1bWVudHx8IWEudWkuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJlbnRbMF0pKT90aGlzLm9mZnNldFBhcmVudDp0aGlzLnNjcm9sbFBhcmVudCxnPS8oaHRtbHxib2R5KS9pLnRlc3QoZlswXS50YWdOYW1lKTtyZXR1cm57dG9wOmMudG9wK3RoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcCpkK3RoaXMub2Zmc2V0LnBhcmVudC50b3AqZC0oYS5icm93c2VyLnNhZmFyaSYmYS5icm93c2VyLnZlcnNpb248NTI2JiZ0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPzA6KHRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpOmc/MDpmLnNjcm9sbFRvcCgpKSpkKSxsZWZ0OmMubGVmdCt0aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0KmQrdGhpcy5vZmZzZXQucGFyZW50LmxlZnQqZC0oYS5icm93c2VyLnNhZmFyaSYmYS5icm93c2VyLnZlcnNpb248NTI2JiZ0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPzA6KHRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKTpnPzA6Zi5zY3JvbGxMZWZ0KCkpKmQpfX0sX2dlbmVyYXRlUG9zaXRpb246ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5vcHRpb25zLGQ9dGhpcy5jc3NQb3NpdGlvbj09ImFic29sdXRlIiYmKHRoaXMuc2Nyb2xsUGFyZW50WzBdPT1kb2N1bWVudHx8IWEudWkuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJlbnRbMF0pKT90aGlzLm9mZnNldFBhcmVudDp0aGlzLnNjcm9sbFBhcmVudCxlPS8oaHRtbHxib2R5KS9pLnRlc3QoZFswXS50YWdOYW1lKSxmPWIucGFnZVgsZz1iLnBhZ2VZO2lmKHRoaXMub3JpZ2luYWxQb3NpdGlvbil7dmFyIGg7aWYodGhpcy5jb250YWlubWVudCl7aWYodGhpcy5yZWxhdGl2ZV9jb250YWluZXIpe3ZhciBpPXRoaXMucmVsYXRpdmVfY29udGFpbmVyLm9mZnNldCgpO2g9W3RoaXMuY29udGFpbm1lbnRbMF0raS5sZWZ0LHRoaXMuY29udGFpbm1lbnRbMV0raS50b3AsdGhpcy5jb250YWlubWVudFsyXStpLmxlZnQsdGhpcy5jb250YWlubWVudFszXStpLnRvcF19ZWxzZSBoPXRoaXMuY29udGFpbm1lbnQ7Yi5wYWdlWC10aGlzLm9mZnNldC5jbGljay5sZWZ0PGhbMF0mJihmPWhbMF0rdGhpcy5vZmZzZXQuY2xpY2subGVmdCksYi5wYWdlWS10aGlzLm9mZnNldC5jbGljay50b3A8aFsxXSYmKGc9aFsxXSt0aGlzLm9mZnNldC5jbGljay50b3ApLGIucGFnZVgtdGhpcy5vZmZzZXQuY2xpY2subGVmdD5oWzJdJiYoZj1oWzJdK3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQpLGIucGFnZVktdGhpcy5vZmZzZXQuY2xpY2sudG9wPmhbM10mJihnPWhbM10rdGhpcy5vZmZzZXQuY2xpY2sudG9wKX1pZihjLmdyaWQpe3ZhciBqPWMuZ3JpZFsxXT90aGlzLm9yaWdpbmFsUGFnZVkrTWF0aC5yb3VuZCgoZy10aGlzLm9yaWdpbmFsUGFnZVkpL2MuZ3JpZFsxXSkqYy5ncmlkWzFdOnRoaXMub3JpZ2luYWxQYWdlWTtnPWg/ai10aGlzLm9mZnNldC5jbGljay50b3A8aFsxXXx8ai10aGlzLm9mZnNldC5jbGljay50b3A+aFszXT9qLXRoaXMub2Zmc2V0LmNsaWNrLnRvcDxoWzFdP2orYy5ncmlkWzFdOmotYy5ncmlkWzFdOmo6ajt2YXIgaz1jLmdyaWRbMF0/dGhpcy5vcmlnaW5hbFBhZ2VYK01hdGgucm91bmQoKGYtdGhpcy5vcmlnaW5hbFBhZ2VYKS9jLmdyaWRbMF0pKmMuZ3JpZFswXTp0aGlzLm9yaWdpbmFsUGFnZVg7Zj1oP2stdGhpcy5vZmZzZXQuY2xpY2subGVmdDxoWzBdfHxrLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+aFsyXT9rLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ8aFswXT9rK2MuZ3JpZFswXTprLWMuZ3JpZFswXTprOmt9fXJldHVybnt0b3A6Zy10aGlzLm9mZnNldC5jbGljay50b3AtdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3ArKGEuYnJvd3Nlci5zYWZhcmkmJmEuYnJvd3Nlci52ZXJzaW9uPDUyNiYmdGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8wOnRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpOmU/MDpkLnNjcm9sbFRvcCgpKSxsZWZ0OmYtdGhpcy5vZmZzZXQuY2xpY2subGVmdC10aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0LXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0KyhhLmJyb3dzZXIuc2FmYXJpJiZhLmJyb3dzZXIudmVyc2lvbjw1MjYmJnRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/MDp0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCk6ZT8wOmQuc2Nyb2xsTGVmdCgpKX19LF9jbGVhcjpmdW5jdGlvbigpe3RoaXMuaGVscGVyLnJlbW92ZUNsYXNzKCJ1aS1kcmFnZ2FibGUtZHJhZ2dpbmciKSx0aGlzLmhlbHBlclswXSE9dGhpcy5lbGVtZW50WzBdJiYhdGhpcy5jYW5jZWxIZWxwZXJSZW1vdmFsJiZ0aGlzLmhlbHBlci5yZW1vdmUoKSx0aGlzLmhlbHBlcj1udWxsLHRoaXMuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMX0sX3RyaWdnZXI6ZnVuY3Rpb24oYixjLGQpe3JldHVybiBkPWR8fHRoaXMuX3VpSGFzaCgpLGEudWkucGx1Z2luLmNhbGwodGhpcyxiLFtjLGRdKSxiPT0iZHJhZyImJih0aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpKSxhLldpZGdldC5wcm90b3R5cGUuX3RyaWdnZXIuY2FsbCh0aGlzLGIsYyxkKX0scGx1Z2luczp7fSxfdWlIYXNoOmZ1bmN0aW9uKGEpe3JldHVybntoZWxwZXI6dGhpcy5oZWxwZXIscG9zaXRpb246dGhpcy5wb3NpdGlvbixvcmlnaW5hbFBvc2l0aW9uOnRoaXMub3JpZ2luYWxQb3NpdGlvbixvZmZzZXQ6dGhpcy5wb3NpdGlvbkFic319fSksYS5leHRlbmQoYS51aS5kcmFnZ2FibGUse3ZlcnNpb246IjEuOC4yNCJ9KSxhLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsImNvbm5lY3RUb1NvcnRhYmxlIix7c3RhcnQ6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLGU9ZC5vcHRpb25zLGY9YS5leHRlbmQoe30sYyx7aXRlbTpkLmVsZW1lbnR9KTtkLnNvcnRhYmxlcz1bXSxhKGUuY29ubmVjdFRvU29ydGFibGUpLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1hLmRhdGEodGhpcywic29ydGFibGUiKTtjJiYhYy5vcHRpb25zLmRpc2FibGVkJiYoZC5zb3J0YWJsZXMucHVzaCh7aW5zdGFuY2U6YyxzaG91bGRSZXZlcnQ6Yy5vcHRpb25zLnJldmVydH0pLGMucmVmcmVzaFBvc2l0aW9ucygpLGMuX3RyaWdnZXIoImFjdGl2YXRlIixiLGYpKX0pfSxzdG9wOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKSxlPWEuZXh0ZW5kKHt9LGMse2l0ZW06ZC5lbGVtZW50fSk7YS5lYWNoKGQuc29ydGFibGVzLGZ1bmN0aW9uKCl7dGhpcy5pbnN0YW5jZS5pc092ZXI/KHRoaXMuaW5zdGFuY2UuaXNPdmVyPTAsZC5jYW5jZWxIZWxwZXJSZW1vdmFsPSEwLHRoaXMuaW5zdGFuY2UuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMSx0aGlzLnNob3VsZFJldmVydCYmKHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5yZXZlcnQ9ITApLHRoaXMuaW5zdGFuY2UuX21vdXNlU3RvcChiKSx0aGlzLmluc3RhbmNlLm9wdGlvbnMuaGVscGVyPXRoaXMuaW5zdGFuY2Uub3B0aW9ucy5faGVscGVyLGQub3B0aW9ucy5oZWxwZXI9PSJvcmlnaW5hbCImJnRoaXMuaW5zdGFuY2UuY3VycmVudEl0ZW0uY3NzKHt0b3A6ImF1dG8iLGxlZnQ6ImF1dG8ifSkpOih0aGlzLmluc3RhbmNlLmNhbmNlbEhlbHBlclJlbW92YWw9ITEsdGhpcy5pbnN0YW5jZS5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsYixlKSl9KX0sZHJhZzpmdW5jdGlvbihiLGMpe3ZhciBkPWEodGhpcykuZGF0YSgiZHJhZ2dhYmxlIiksZT10aGlzLGY9ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5vZmZzZXQuY2xpY2sudG9wLGQ9dGhpcy5vZmZzZXQuY2xpY2subGVmdCxlPXRoaXMucG9zaXRpb25BYnMudG9wLGY9dGhpcy5wb3NpdGlvbkFicy5sZWZ0LGc9Yi5oZWlnaHQsaD1iLndpZHRoLGk9Yi50b3Asaj1iLmxlZnQ7cmV0dXJuIGEudWkuaXNPdmVyKGUrYyxmK2QsaSxqLGcsaCl9O2EuZWFjaChkLnNvcnRhYmxlcyxmdW5jdGlvbihmKXt0aGlzLmluc3RhbmNlLnBvc2l0aW9uQWJzPWQucG9zaXRpb25BYnMsdGhpcy5pbnN0YW5jZS5oZWxwZXJQcm9wb3J0aW9ucz1kLmhlbHBlclByb3BvcnRpb25zLHRoaXMuaW5zdGFuY2Uub2Zmc2V0LmNsaWNrPWQub2Zmc2V0LmNsaWNrLHRoaXMuaW5zdGFuY2UuX2ludGVyc2VjdHNXaXRoKHRoaXMuaW5zdGFuY2UuY29udGFpbmVyQ2FjaGUpPyh0aGlzLmluc3RhbmNlLmlzT3Zlcnx8KHRoaXMuaW5zdGFuY2UuaXNPdmVyPTEsdGhpcy5pbnN0YW5jZS5jdXJyZW50SXRlbT1hKGUpLmNsb25lKCkucmVtb3ZlQXR0cigiaWQiKS5hcHBlbmRUbyh0aGlzLmluc3RhbmNlLmVsZW1lbnQpLmRhdGEoInNvcnRhYmxlLWl0ZW0iLCEwKSx0aGlzLmluc3RhbmNlLm9wdGlvbnMuX2hlbHBlcj10aGlzLmluc3RhbmNlLm9wdGlvbnMuaGVscGVyLHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5oZWxwZXI9ZnVuY3Rpb24oKXtyZXR1cm4gYy5oZWxwZXJbMF19LGIudGFyZ2V0PXRoaXMuaW5zdGFuY2UuY3VycmVudEl0ZW1bMF0sdGhpcy5pbnN0YW5jZS5fbW91c2VDYXB0dXJlKGIsITApLHRoaXMuaW5zdGFuY2UuX21vdXNlU3RhcnQoYiwhMCwhMCksdGhpcy5pbnN0YW5jZS5vZmZzZXQuY2xpY2sudG9wPWQub2Zmc2V0LmNsaWNrLnRvcCx0aGlzLmluc3RhbmNlLm9mZnNldC5jbGljay5sZWZ0PWQub2Zmc2V0LmNsaWNrLmxlZnQsdGhpcy5pbnN0YW5jZS5vZmZzZXQucGFyZW50LmxlZnQtPWQub2Zmc2V0LnBhcmVudC5sZWZ0LXRoaXMuaW5zdGFuY2Uub2Zmc2V0LnBhcmVudC5sZWZ0LHRoaXMuaW5zdGFuY2Uub2Zmc2V0LnBhcmVudC50b3AtPWQub2Zmc2V0LnBhcmVudC50b3AtdGhpcy5pbnN0YW5jZS5vZmZzZXQucGFyZW50LnRvcCxkLl90cmlnZ2VyKCJ0b1NvcnRhYmxlIixiKSxkLmRyb3BwZWQ9dGhpcy5pbnN0YW5jZS5lbGVtZW50LGQuY3VycmVudEl0ZW09ZC5lbGVtZW50LHRoaXMuaW5zdGFuY2UuZnJvbU91dHNpZGU9ZCksdGhpcy5pbnN0YW5jZS5jdXJyZW50SXRlbSYmdGhpcy5pbnN0YW5jZS5fbW91c2VEcmFnKGIpKTp0aGlzLmluc3RhbmNlLmlzT3ZlciYmKHRoaXMuaW5zdGFuY2UuaXNPdmVyPTAsdGhpcy5pbnN0YW5jZS5jYW5jZWxIZWxwZXJSZW1vdmFsPSEwLHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5yZXZlcnQ9ITEsdGhpcy5pbnN0YW5jZS5fdHJpZ2dlcigib3V0IixiLHRoaXMuaW5zdGFuY2UuX3VpSGFzaCh0aGlzLmluc3RhbmNlKSksdGhpcy5pbnN0YW5jZS5fbW91c2VTdG9wKGIsITApLHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5oZWxwZXI9dGhpcy5pbnN0YW5jZS5vcHRpb25zLl9oZWxwZXIsdGhpcy5pbnN0YW5jZS5jdXJyZW50SXRlbS5yZW1vdmUoKSx0aGlzLmluc3RhbmNlLnBsYWNlaG9sZGVyJiZ0aGlzLmluc3RhbmNlLnBsYWNlaG9sZGVyLnJlbW92ZSgpLGQuX3RyaWdnZXIoImZyb21Tb3J0YWJsZSIsYiksZC5kcm9wcGVkPSExKX0pfX0pLGEudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwiY3Vyc29yIix7c3RhcnQ6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKCJib2R5IiksZT1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7ZC5jc3MoImN1cnNvciIpJiYoZS5fY3Vyc29yPWQuY3NzKCJjdXJzb3IiKSksZC5jc3MoImN1cnNvciIsZS5jdXJzb3IpfSxzdG9wOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKS5vcHRpb25zO2QuX2N1cnNvciYmYSgiYm9keSIpLmNzcygiY3Vyc29yIixkLl9jdXJzb3IpfX0pLGEudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwib3BhY2l0eSIse3N0YXJ0OmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YShjLmhlbHBlciksZT1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7ZC5jc3MoIm9wYWNpdHkiKSYmKGUuX29wYWNpdHk9ZC5jc3MoIm9wYWNpdHkiKSksZC5jc3MoIm9wYWNpdHkiLGUub3BhY2l0eSl9LHN0b3A6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7ZC5fb3BhY2l0eSYmYShjLmhlbHBlcikuY3NzKCJvcGFjaXR5IixkLl9vcGFjaXR5KX19KSxhLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsInNjcm9sbCIse3N0YXJ0OmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKTtkLnNjcm9sbFBhcmVudFswXSE9ZG9jdW1lbnQmJmQuc2Nyb2xsUGFyZW50WzBdLnRhZ05hbWUhPSJIVE1MIiYmKGQub3ZlcmZsb3dPZmZzZXQ9ZC5zY3JvbGxQYXJlbnQub2Zmc2V0KCkpfSxkcmFnOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKSxlPWQub3B0aW9ucyxmPSExO2lmKGQuc2Nyb2xsUGFyZW50WzBdIT1kb2N1bWVudCYmZC5zY3JvbGxQYXJlbnRbMF0udGFnTmFtZSE9IkhUTUwiKXtpZighZS5heGlzfHxlLmF4aXMhPSJ4IilkLm92ZXJmbG93T2Zmc2V0LnRvcCtkLnNjcm9sbFBhcmVudFswXS5vZmZzZXRIZWlnaHQtYi5wYWdlWTxlLnNjcm9sbFNlbnNpdGl2aXR5P2Quc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcD1mPWQuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcCtlLnNjcm9sbFNwZWVkOmIucGFnZVktZC5vdmVyZmxvd09mZnNldC50b3A8ZS5zY3JvbGxTZW5zaXRpdml0eSYmKGQuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcD1mPWQuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcC1lLnNjcm9sbFNwZWVkKTtpZighZS5heGlzfHxlLmF4aXMhPSJ5IilkLm92ZXJmbG93T2Zmc2V0LmxlZnQrZC5zY3JvbGxQYXJlbnRbMF0ub2Zmc2V0V2lkdGgtYi5wYWdlWDxlLnNjcm9sbFNlbnNpdGl2aXR5P2Quc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQ9Zj1kLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0K2Uuc2Nyb2xsU3BlZWQ6Yi5wYWdlWC1kLm92ZXJmbG93T2Zmc2V0LmxlZnQ8ZS5zY3JvbGxTZW5zaXRpdml0eSYmKGQuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQ9Zj1kLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0LWUuc2Nyb2xsU3BlZWQpfWVsc2V7aWYoIWUuYXhpc3x8ZS5heGlzIT0ieCIpYi5wYWdlWS1hKGRvY3VtZW50KS5zY3JvbGxUb3AoKTxlLnNjcm9sbFNlbnNpdGl2aXR5P2Y9YShkb2N1bWVudCkuc2Nyb2xsVG9wKGEoZG9jdW1lbnQpLnNjcm9sbFRvcCgpLWUuc2Nyb2xsU3BlZWQpOmEod2luZG93KS5oZWlnaHQoKS0oYi5wYWdlWS1hKGRvY3VtZW50KS5zY3JvbGxUb3AoKSk8ZS5zY3JvbGxTZW5zaXRpdml0eSYmKGY9YShkb2N1bWVudCkuc2Nyb2xsVG9wKGEoZG9jdW1lbnQpLnNjcm9sbFRvcCgpK2Uuc2Nyb2xsU3BlZWQpKTtpZighZS5heGlzfHxlLmF4aXMhPSJ5IiliLnBhZ2VYLWEoZG9jdW1lbnQpLnNjcm9sbExlZnQoKTxlLnNjcm9sbFNlbnNpdGl2aXR5P2Y9YShkb2N1bWVudCkuc2Nyb2xsTGVmdChhKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCktZS5zY3JvbGxTcGVlZCk6YSh3aW5kb3cpLndpZHRoKCktKGIucGFnZVgtYShkb2N1bWVudCkuc2Nyb2xsTGVmdCgpKTxlLnNjcm9sbFNlbnNpdGl2aXR5JiYoZj1hKGRvY3VtZW50KS5zY3JvbGxMZWZ0KGEoZG9jdW1lbnQpLnNjcm9sbExlZnQoKStlLnNjcm9sbFNwZWVkKSl9ZiE9PSExJiZhLnVpLmRkbWFuYWdlciYmIWUuZHJvcEJlaGF2aW91ciYmYS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHMoZCxiKX19KSxhLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsInNuYXAiLHtzdGFydDpmdW5jdGlvbihiLGMpe3ZhciBkPWEodGhpcykuZGF0YSgiZHJhZ2dhYmxlIiksZT1kLm9wdGlvbnM7ZC5zbmFwRWxlbWVudHM9W10sYShlLnNuYXAuY29uc3RydWN0b3IhPVN0cmluZz9lLnNuYXAuaXRlbXN8fCI6ZGF0YShkcmFnZ2FibGUpIjplLnNuYXApLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1hKHRoaXMpLGM9Yi5vZmZzZXQoKTt0aGlzIT1kLmVsZW1lbnRbMF0mJmQuc25hcEVsZW1lbnRzLnB1c2goe2l0ZW06dGhpcyx3aWR0aDpiLm91dGVyV2lkdGgoKSxoZWlnaHQ6Yi5vdXRlckhlaWdodCgpLHRvcDpjLnRvcCxsZWZ0OmMubGVmdH0pfSl9LGRyYWc6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLGU9ZC5vcHRpb25zLGY9ZS5zbmFwVG9sZXJhbmNlLGc9Yy5vZmZzZXQubGVmdCxoPWcrZC5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCxpPWMub2Zmc2V0LnRvcCxqPWkrZC5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQ7Zm9yKHZhciBrPWQuc25hcEVsZW1lbnRzLmxlbmd0aC0xO2s+PTA7ay0tKXt2YXIgbD1kLnNuYXBFbGVtZW50c1trXS5sZWZ0LG09bCtkLnNuYXBFbGVtZW50c1trXS53aWR0aCxuPWQuc25hcEVsZW1lbnRzW2tdLnRvcCxvPW4rZC5zbmFwRWxlbWVudHNba10uaGVpZ2h0O2lmKCEobC1mPGcmJmc8bStmJiZuLWY8aSYmaTxvK2Z8fGwtZjxnJiZnPG0rZiYmbi1mPGomJmo8bytmfHxsLWY8aCYmaDxtK2YmJm4tZjxpJiZpPG8rZnx8bC1mPGgmJmg8bStmJiZuLWY8aiYmajxvK2YpKXtkLnNuYXBFbGVtZW50c1trXS5zbmFwcGluZyYmZC5vcHRpb25zLnNuYXAucmVsZWFzZSYmZC5vcHRpb25zLnNuYXAucmVsZWFzZS5jYWxsKGQuZWxlbWVudCxiLGEuZXh0ZW5kKGQuX3VpSGFzaCgpLHtzbmFwSXRlbTpkLnNuYXBFbGVtZW50c1trXS5pdGVtfSkpLGQuc25hcEVsZW1lbnRzW2tdLnNuYXBwaW5nPSExO2NvbnRpbnVlfWlmKGUuc25hcE1vZGUhPSJpbm5lciIpe3ZhciBwPU1hdGguYWJzKG4taik8PWYscT1NYXRoLmFicyhvLWkpPD1mLHI9TWF0aC5hYnMobC1oKTw9ZixzPU1hdGguYWJzKG0tZyk8PWY7cCYmKGMucG9zaXRpb24udG9wPWQuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDpuLWQuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LGxlZnQ6MH0pLnRvcC1kLm1hcmdpbnMudG9wKSxxJiYoYy5wb3NpdGlvbi50b3A9ZC5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOm8sbGVmdDowfSkudG9wLWQubWFyZ2lucy50b3ApLHImJihjLnBvc2l0aW9uLmxlZnQ9ZC5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOjAsbGVmdDpsLWQuaGVscGVyUHJvcG9ydGlvbnMud2lkdGh9KS5sZWZ0LWQubWFyZ2lucy5sZWZ0KSxzJiYoYy5wb3NpdGlvbi5sZWZ0PWQuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDowLGxlZnQ6bX0pLmxlZnQtZC5tYXJnaW5zLmxlZnQpfXZhciB0PXB8fHF8fHJ8fHM7aWYoZS5zbmFwTW9kZSE9Im91dGVyIil7dmFyIHA9TWF0aC5hYnMobi1pKTw9ZixxPU1hdGguYWJzKG8taik8PWYscj1NYXRoLmFicyhsLWcpPD1mLHM9TWF0aC5hYnMobS1oKTw9ZjtwJiYoYy5wb3NpdGlvbi50b3A9ZC5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOm4sbGVmdDowfSkudG9wLWQubWFyZ2lucy50b3ApLHEmJihjLnBvc2l0aW9uLnRvcD1kLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6by1kLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCxsZWZ0OjB9KS50b3AtZC5tYXJnaW5zLnRvcCksciYmKGMucG9zaXRpb24ubGVmdD1kLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6MCxsZWZ0Omx9KS5sZWZ0LWQubWFyZ2lucy5sZWZ0KSxzJiYoYy5wb3NpdGlvbi5sZWZ0PWQuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDowLGxlZnQ6bS1kLmhlbHBlclByb3BvcnRpb25zLndpZHRofSkubGVmdC1kLm1hcmdpbnMubGVmdCl9IWQuc25hcEVsZW1lbnRzW2tdLnNuYXBwaW5nJiYocHx8cXx8cnx8c3x8dCkmJmQub3B0aW9ucy5zbmFwLnNuYXAmJmQub3B0aW9ucy5zbmFwLnNuYXAuY2FsbChkLmVsZW1lbnQsYixhLmV4dGVuZChkLl91aUhhc2goKSx7c25hcEl0ZW06ZC5zbmFwRWxlbWVudHNba10uaXRlbX0pKSxkLnNuYXBFbGVtZW50c1trXS5zbmFwcGluZz1wfHxxfHxyfHxzfHx0fX19KSxhLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsInN0YWNrIix7c3RhcnQ6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnMsZT1hLm1ha2VBcnJheShhKGQuc3RhY2spKS5zb3J0KGZ1bmN0aW9uKGIsYyl7cmV0dXJuKHBhcnNlSW50KGEoYikuY3NzKCJ6SW5kZXgiKSwxMCl8fDApLShwYXJzZUludChhKGMpLmNzcygiekluZGV4IiksMTApfHwwKX0pO2lmKCFlLmxlbmd0aClyZXR1cm47dmFyIGY9cGFyc2VJbnQoZVswXS5zdHlsZS56SW5kZXgpfHwwO2EoZSkuZWFjaChmdW5jdGlvbihhKXt0aGlzLnN0eWxlLnpJbmRleD1mK2F9KSx0aGlzWzBdLnN0eWxlLnpJbmRleD1mK2UubGVuZ3RofX0pLGEudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwiekluZGV4Iix7c3RhcnQ6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKGMuaGVscGVyKSxlPWEodGhpcykuZGF0YSgiZHJhZ2dhYmxlIikub3B0aW9ucztkLmNzcygiekluZGV4IikmJihlLl96SW5kZXg9ZC5jc3MoInpJbmRleCIpKSxkLmNzcygiekluZGV4IixlLnpJbmRleCl9LHN0b3A6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7ZC5fekluZGV4JiZhKGMuaGVscGVyKS5jc3MoInpJbmRleCIsZC5fekluZGV4KX19KX0oalF1ZXJ5KSxmdW5jdGlvbihhLGIpe2Eud2lkZ2V0KCJ1aS5kcm9wcGFibGUiLHt3aWRnZXRFdmVudFByZWZpeDoiZHJvcCIsb3B0aW9uczp7YWNjZXB0OiIqIixhY3RpdmVDbGFzczohMSxhZGRDbGFzc2VzOiEwLGdyZWVkeTohMSxob3ZlckNsYXNzOiExLHNjb3BlOiJkZWZhdWx0Iix0b2xlcmFuY2U6ImludGVyc2VjdCJ9LF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9wdGlvbnMsYz1iLmFjY2VwdDt0aGlzLmlzb3Zlcj0wLHRoaXMuaXNvdXQ9MSx0aGlzLmFjY2VwdD1hLmlzRnVuY3Rpb24oYyk/YzpmdW5jdGlvbihhKXtyZXR1cm4gYS5pcyhjKX0sdGhpcy5wcm9wb3J0aW9ucz17d2lkdGg6dGhpcy5lbGVtZW50WzBdLm9mZnNldFdpZHRoLGhlaWdodDp0aGlzLmVsZW1lbnRbMF0ub2Zmc2V0SGVpZ2h0fSxhLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW2Iuc2NvcGVdPWEudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbYi5zY29wZV18fFtdLGEudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbYi5zY29wZV0ucHVzaCh0aGlzKSxiLmFkZENsYXNzZXMmJnRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktZHJvcHBhYmxlIil9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt2YXIgYj1hLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW3RoaXMub3B0aW9ucy5zY29wZV07Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspYltjXT09dGhpcyYmYi5zcGxpY2UoYywxKTtyZXR1cm4gdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1kcm9wcGFibGUgdWktZHJvcHBhYmxlLWRpc2FibGVkIikucmVtb3ZlRGF0YSgiZHJvcHBhYmxlIikudW5iaW5kKCIuZHJvcHBhYmxlIiksdGhpc30sX3NldE9wdGlvbjpmdW5jdGlvbihiLGMpe2I9PSJhY2NlcHQiJiYodGhpcy5hY2NlcHQ9YS5pc0Z1bmN0aW9uKGMpP2M6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXMoYyl9KSxhLldpZGdldC5wcm90b3R5cGUuX3NldE9wdGlvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF9hY3RpdmF0ZTpmdW5jdGlvbihiKXt2YXIgYz1hLnVpLmRkbWFuYWdlci5jdXJyZW50O3RoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyYmdGhpcy5lbGVtZW50LmFkZENsYXNzKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyksYyYmdGhpcy5fdHJpZ2dlcigiYWN0aXZhdGUiLGIsdGhpcy51aShjKSl9LF9kZWFjdGl2YXRlOmZ1bmN0aW9uKGIpe3ZhciBjPWEudWkuZGRtYW5hZ2VyLmN1cnJlbnQ7dGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzJiZ0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKSxjJiZ0aGlzLl90cmlnZ2VyKCJkZWFjdGl2YXRlIixiLHRoaXMudWkoYykpfSxfb3ZlcjpmdW5jdGlvbihiKXt2YXIgYz1hLnVpLmRkbWFuYWdlci5jdXJyZW50O2lmKCFjfHwoYy5jdXJyZW50SXRlbXx8Yy5lbGVtZW50KVswXT09dGhpcy5lbGVtZW50WzBdKXJldHVybjt0aGlzLmFjY2VwdC5jYWxsKHRoaXMuZWxlbWVudFswXSxjLmN1cnJlbnRJdGVtfHxjLmVsZW1lbnQpJiYodGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MmJnRoaXMuZWxlbWVudC5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyksdGhpcy5fdHJpZ2dlcigib3ZlciIsYix0aGlzLnVpKGMpKSl9LF9vdXQ6ZnVuY3Rpb24oYil7dmFyIGM9YS51aS5kZG1hbmFnZXIuY3VycmVudDtpZighY3x8KGMuY3VycmVudEl0ZW18fGMuZWxlbWVudClbMF09PXRoaXMuZWxlbWVudFswXSlyZXR1cm47dGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0sYy5jdXJyZW50SXRlbXx8Yy5lbGVtZW50KSYmKHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzJiZ0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MpLHRoaXMuX3RyaWdnZXIoIm91dCIsYix0aGlzLnVpKGMpKSl9LF9kcm9wOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9Y3x8YS51aS5kZG1hbmFnZXIuY3VycmVudDtpZighZHx8KGQuY3VycmVudEl0ZW18fGQuZWxlbWVudClbMF09PXRoaXMuZWxlbWVudFswXSlyZXR1cm4hMTt2YXIgZT0hMTtyZXR1cm4gdGhpcy5lbGVtZW50LmZpbmQoIjpkYXRhKGRyb3BwYWJsZSkiKS5ub3QoIi51aS1kcmFnZ2FibGUtZHJhZ2dpbmciKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9YS5kYXRhKHRoaXMsImRyb3BwYWJsZSIpO2lmKGIub3B0aW9ucy5ncmVlZHkmJiFiLm9wdGlvbnMuZGlzYWJsZWQmJmIub3B0aW9ucy5zY29wZT09ZC5vcHRpb25zLnNjb3BlJiZiLmFjY2VwdC5jYWxsKGIuZWxlbWVudFswXSxkLmN1cnJlbnRJdGVtfHxkLmVsZW1lbnQpJiZhLnVpLmludGVyc2VjdChkLGEuZXh0ZW5kKGIse29mZnNldDpiLmVsZW1lbnQub2Zmc2V0KCl9KSxiLm9wdGlvbnMudG9sZXJhbmNlKSlyZXR1cm4gZT0hMCwhMX0pLGU/ITE6dGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0sZC5jdXJyZW50SXRlbXx8ZC5lbGVtZW50KT8odGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzJiZ0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKSx0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyYmdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzKSx0aGlzLl90cmlnZ2VyKCJkcm9wIixiLHRoaXMudWkoZCkpLHRoaXMuZWxlbWVudCk6ITF9LHVpOmZ1bmN0aW9uKGEpe3JldHVybntkcmFnZ2FibGU6YS5jdXJyZW50SXRlbXx8YS5lbGVtZW50LGhlbHBlcjphLmhlbHBlcixwb3NpdGlvbjphLnBvc2l0aW9uLG9mZnNldDphLnBvc2l0aW9uQWJzfX19KSxhLmV4dGVuZChhLnVpLmRyb3BwYWJsZSx7dmVyc2lvbjoiMS44LjI0In0pLGEudWkuaW50ZXJzZWN0PWZ1bmN0aW9uKGIsYyxkKXtpZighYy5vZmZzZXQpcmV0dXJuITE7dmFyIGU9KGIucG9zaXRpb25BYnN8fGIucG9zaXRpb24uYWJzb2x1dGUpLmxlZnQsZj1lK2IuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgsZz0oYi5wb3NpdGlvbkFic3x8Yi5wb3NpdGlvbi5hYnNvbHV0ZSkudG9wLGg9ZytiLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCxpPWMub2Zmc2V0LmxlZnQsaj1pK2MucHJvcG9ydGlvbnMud2lkdGgsaz1jLm9mZnNldC50b3AsbD1rK2MucHJvcG9ydGlvbnMuaGVpZ2h0O3N3aXRjaChkKXtjYXNlImZpdCI6cmV0dXJuIGk8PWUmJmY8PWomJms8PWcmJmg8PWw7Y2FzZSJpbnRlcnNlY3QiOnJldHVybiBpPGUrYi5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC8yJiZmLWIuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgvMjxqJiZrPGcrYi5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQvMiYmaC1iLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC8yPGw7Y2FzZSJwb2ludGVyIjp2YXIgbT0oYi5wb3NpdGlvbkFic3x8Yi5wb3NpdGlvbi5hYnNvbHV0ZSkubGVmdCsoYi5jbGlja09mZnNldHx8Yi5vZmZzZXQuY2xpY2spLmxlZnQsbj0oYi5wb3NpdGlvbkFic3x8Yi5wb3NpdGlvbi5hYnNvbHV0ZSkudG9wKyhiLmNsaWNrT2Zmc2V0fHxiLm9mZnNldC5jbGljaykudG9wLG89YS51aS5pc092ZXIobixtLGssaSxjLnByb3BvcnRpb25zLmhlaWdodCxjLnByb3BvcnRpb25zLndpZHRoKTtyZXR1cm4gbztjYXNlInRvdWNoIjpyZXR1cm4oZz49ayYmZzw9bHx8aD49ayYmaDw9bHx8ZzxrJiZoPmwpJiYoZT49aSYmZTw9anx8Zj49aSYmZjw9anx8ZTxpJiZmPmopO2RlZmF1bHQ6cmV0dXJuITF9fSxhLnVpLmRkbWFuYWdlcj17Y3VycmVudDpudWxsLGRyb3BwYWJsZXM6eyJkZWZhdWx0IjpbXX0scHJlcGFyZU9mZnNldHM6ZnVuY3Rpb24oYixjKXt2YXIgZD1hLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW2Iub3B0aW9ucy5zY29wZV18fFtdLGU9Yz9jLnR5cGU6bnVsbCxmPShiLmN1cnJlbnRJdGVtfHxiLmVsZW1lbnQpLmZpbmQoIjpkYXRhKGRyb3BwYWJsZSkiKS5hbmRTZWxmKCk7Zzpmb3IodmFyIGg9MDtoPGQubGVuZ3RoO2grKyl7aWYoZFtoXS5vcHRpb25zLmRpc2FibGVkfHxiJiYhZFtoXS5hY2NlcHQuY2FsbChkW2hdLmVsZW1lbnRbMF0sYi5jdXJyZW50SXRlbXx8Yi5lbGVtZW50KSljb250aW51ZTtmb3IodmFyIGk9MDtpPGYubGVuZ3RoO2krKylpZihmW2ldPT1kW2hdLmVsZW1lbnRbMF0pe2RbaF0ucHJvcG9ydGlvbnMuaGVpZ2h0PTA7Y29udGludWUgZ31kW2hdLnZpc2libGU9ZFtoXS5lbGVtZW50LmNzcygiZGlzcGxheSIpIT0ibm9uZSI7aWYoIWRbaF0udmlzaWJsZSljb250aW51ZTtlPT0ibW91c2Vkb3duIiYmZFtoXS5fYWN0aXZhdGUuY2FsbChkW2hdLGMpLGRbaF0ub2Zmc2V0PWRbaF0uZWxlbWVudC5vZmZzZXQoKSxkW2hdLnByb3BvcnRpb25zPXt3aWR0aDpkW2hdLmVsZW1lbnRbMF0ub2Zmc2V0V2lkdGgsaGVpZ2h0OmRbaF0uZWxlbWVudFswXS5vZmZzZXRIZWlnaHR9fX0sZHJvcDpmdW5jdGlvbihiLGMpe3ZhciBkPSExO3JldHVybiBhLmVhY2goYS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1tiLm9wdGlvbnMuc2NvcGVdfHxbXSxmdW5jdGlvbigpe2lmKCF0aGlzLm9wdGlvbnMpcmV0dXJuOyF0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMudmlzaWJsZSYmYS51aS5pbnRlcnNlY3QoYix0aGlzLHRoaXMub3B0aW9ucy50b2xlcmFuY2UpJiYoZD10aGlzLl9kcm9wLmNhbGwodGhpcyxjKXx8ZCksIXRoaXMub3B0aW9ucy5kaXNhYmxlZCYmdGhpcy52aXNpYmxlJiZ0aGlzLmFjY2VwdC5jYWxsKHRoaXMuZWxlbWVudFswXSxiLmN1cnJlbnRJdGVtfHxiLmVsZW1lbnQpJiYodGhpcy5pc291dD0xLHRoaXMuaXNvdmVyPTAsdGhpcy5fZGVhY3RpdmF0ZS5jYWxsKHRoaXMsYykpfSksZH0sZHJhZ1N0YXJ0OmZ1bmN0aW9uKGIsYyl7Yi5lbGVtZW50LnBhcmVudHMoIjpub3QoYm9keSxodG1sKSIpLmJpbmQoInNjcm9sbC5kcm9wcGFibGUiLGZ1bmN0aW9uKCl7Yi5vcHRpb25zLnJlZnJlc2hQb3NpdGlvbnN8fGEudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKGIsYyl9KX0sZHJhZzpmdW5jdGlvbihiLGMpe2Iub3B0aW9ucy5yZWZyZXNoUG9zaXRpb25zJiZhLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyhiLGMpLGEuZWFjaChhLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW2Iub3B0aW9ucy5zY29wZV18fFtdLGZ1bmN0aW9uKCl7aWYodGhpcy5vcHRpb25zLmRpc2FibGVkfHx0aGlzLmdyZWVkeUNoaWxkfHwhdGhpcy52aXNpYmxlKXJldHVybjt2YXIgZD1hLnVpLmludGVyc2VjdChiLHRoaXMsdGhpcy5vcHRpb25zLnRvbGVyYW5jZSksZT0hZCYmdGhpcy5pc292ZXI9PTE/Imlzb3V0IjpkJiZ0aGlzLmlzb3Zlcj09MD8iaXNvdmVyIjpudWxsO2lmKCFlKXJldHVybjt2YXIgZjtpZih0aGlzLm9wdGlvbnMuZ3JlZWR5KXt2YXIgZz10aGlzLm9wdGlvbnMuc2NvcGUsaD10aGlzLmVsZW1lbnQucGFyZW50cygiOmRhdGEoZHJvcHBhYmxlKSIpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiBhLmRhdGEodGhpcywiZHJvcHBhYmxlIikub3B0aW9ucy5zY29wZT09PWd9KTtoLmxlbmd0aCYmKGY9YS5kYXRhKGhbMF0sImRyb3BwYWJsZSIpLGYuZ3JlZWR5Q2hpbGQ9ZT09Imlzb3ZlciI/MTowKX1mJiZlPT0iaXNvdmVyIiYmKGYuaXNvdmVyPTAsZi5pc291dD0xLGYuX291dC5jYWxsKGYsYykpLHRoaXNbZV09MSx0aGlzW2U9PSJpc291dCI/Imlzb3ZlciI6Imlzb3V0Il09MCx0aGlzW2U9PSJpc292ZXIiPyJfb3ZlciI6Il9vdXQiXS5jYWxsKHRoaXMsYyksZiYmZT09Imlzb3V0IiYmKGYuaXNvdXQ9MCxmLmlzb3Zlcj0xLGYuX292ZXIuY2FsbChmLGMpKX0pfSxkcmFnU3RvcDpmdW5jdGlvbihiLGMpe2IuZWxlbWVudC5wYXJlbnRzKCI6bm90KGJvZHksaHRtbCkiKS51bmJpbmQoInNjcm9sbC5kcm9wcGFibGUiKSxiLm9wdGlvbnMucmVmcmVzaFBvc2l0aW9uc3x8YS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHMoYixjKX19fShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7YS53aWRnZXQoInVpLnJlc2l6YWJsZSIsYS51aS5tb3VzZSx7d2lkZ2V0RXZlbnRQcmVmaXg6InJlc2l6ZSIsb3B0aW9uczp7YWxzb1Jlc2l6ZTohMSxhbmltYXRlOiExLGFuaW1hdGVEdXJhdGlvbjoic2xvdyIsYW5pbWF0ZUVhc2luZzoic3dpbmciLGFzcGVjdFJhdGlvOiExLGF1dG9IaWRlOiExLGNvbnRhaW5tZW50OiExLGdob3N0OiExLGdyaWQ6ITEsaGFuZGxlczoiZSxzLHNlIixoZWxwZXI6ITEsbWF4SGVpZ2h0Om51bGwsbWF4V2lkdGg6bnVsbCxtaW5IZWlnaHQ6MTAsbWluV2lkdGg6MTAsekluZGV4OjFlM30sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMsYz10aGlzLm9wdGlvbnM7dGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1yZXNpemFibGUiKSxhLmV4dGVuZCh0aGlzLHtfYXNwZWN0UmF0aW86ISFjLmFzcGVjdFJhdGlvLGFzcGVjdFJhdGlvOmMuYXNwZWN0UmF0aW8sb3JpZ2luYWxFbGVtZW50OnRoaXMuZWxlbWVudCxfcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50czpbXSxfaGVscGVyOmMuaGVscGVyfHxjLmdob3N0fHxjLmFuaW1hdGU/Yy5oZWxwZXJ8fCJ1aS1yZXNpemFibGUtaGVscGVyIjpudWxsfSksdGhpcy5lbGVtZW50WzBdLm5vZGVOYW1lLm1hdGNoKC9jYW52YXN8dGV4dGFyZWF8aW5wdXR8c2VsZWN0fGJ1dHRvbnxpbWcvaSkmJih0aGlzLmVsZW1lbnQud3JhcChhKCc8ZGl2IGNsYXNzPSJ1aS13cmFwcGVyIiBzdHlsZT0ib3ZlcmZsb3c6IGhpZGRlbjsiPjwvZGl2PicpLmNzcyh7cG9zaXRpb246dGhpcy5lbGVtZW50LmNzcygicG9zaXRpb24iKSx3aWR0aDp0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpLGhlaWdodDp0aGlzLmVsZW1lbnQub3V0ZXJIZWlnaHQoKSx0b3A6dGhpcy5lbGVtZW50LmNzcygidG9wIiksbGVmdDp0aGlzLmVsZW1lbnQuY3NzKCJsZWZ0Iil9KSksdGhpcy5lbGVtZW50PXRoaXMuZWxlbWVudC5wYXJlbnQoKS5kYXRhKCJyZXNpemFibGUiLHRoaXMuZWxlbWVudC5kYXRhKCJyZXNpemFibGUiKSksdGhpcy5lbGVtZW50SXNXcmFwcGVyPSEwLHRoaXMuZWxlbWVudC5jc3Moe21hcmdpbkxlZnQ6dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJtYXJnaW5MZWZ0IiksbWFyZ2luVG9wOnRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygibWFyZ2luVG9wIiksbWFyZ2luUmlnaHQ6dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJtYXJnaW5SaWdodCIpLG1hcmdpbkJvdHRvbTp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpbkJvdHRvbSIpfSksdGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKHttYXJnaW5MZWZ0OjAsbWFyZ2luVG9wOjAsbWFyZ2luUmlnaHQ6MCxtYXJnaW5Cb3R0b206MH0pLHRoaXMub3JpZ2luYWxSZXNpemVTdHlsZT10aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoInJlc2l6ZSIpLHRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygicmVzaXplIiwibm9uZSIpLHRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMucHVzaCh0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3Moe3Bvc2l0aW9uOiJzdGF0aWMiLHpvb206MSxkaXNwbGF5OiJibG9jayJ9KSksdGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKHttYXJnaW46dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJtYXJnaW4iKX0pLHRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplKCkpLHRoaXMuaGFuZGxlcz1jLmhhbmRsZXN8fChhKCIudWktcmVzaXphYmxlLWhhbmRsZSIsdGhpcy5lbGVtZW50KS5sZW5ndGg/e246Ii51aS1yZXNpemFibGUtbiIsZToiLnVpLXJlc2l6YWJsZS1lIixzOiIudWktcmVzaXphYmxlLXMiLHc6Ii51aS1yZXNpemFibGUtdyIsc2U6Ii51aS1yZXNpemFibGUtc2UiLHN3OiIudWktcmVzaXphYmxlLXN3IixuZToiLnVpLXJlc2l6YWJsZS1uZSIsbnc6Ii51aS1yZXNpemFibGUtbncifToiZSxzLHNlIik7aWYodGhpcy5oYW5kbGVzLmNvbnN0cnVjdG9yPT1TdHJpbmcpe3RoaXMuaGFuZGxlcz09ImFsbCImJih0aGlzLmhhbmRsZXM9Im4sZSxzLHcsc2Usc3csbmUsbnciKTt2YXIgZD10aGlzLmhhbmRsZXMuc3BsaXQoIiwiKTt0aGlzLmhhbmRsZXM9e307Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspe3ZhciBmPWEudHJpbShkW2VdKSxnPSJ1aS1yZXNpemFibGUtIitmLGg9YSgnPGRpdiBjbGFzcz0idWktcmVzaXphYmxlLWhhbmRsZSAnK2crJyI+PC9kaXY+Jyk7aC5jc3Moe3pJbmRleDpjLnpJbmRleH0pLCJzZSI9PWYmJmguYWRkQ2xhc3MoInVpLWljb24gdWktaWNvbi1ncmlwc21hbGwtZGlhZ29uYWwtc2UiKSx0aGlzLmhhbmRsZXNbZl09Ii51aS1yZXNpemFibGUtIitmLHRoaXMuZWxlbWVudC5hcHBlbmQoaCl9fXRoaXMuX3JlbmRlckF4aXM9ZnVuY3Rpb24oYil7Yj1ifHx0aGlzLmVsZW1lbnQ7Zm9yKHZhciBjIGluIHRoaXMuaGFuZGxlcyl7dGhpcy5oYW5kbGVzW2NdLmNvbnN0cnVjdG9yPT1TdHJpbmcmJih0aGlzLmhhbmRsZXNbY109YSh0aGlzLmhhbmRsZXNbY10sdGhpcy5lbGVtZW50KS5zaG93KCkpO2lmKHRoaXMuZWxlbWVudElzV3JhcHBlciYmdGhpcy5vcmlnaW5hbEVsZW1lbnRbMF0ubm9kZU5hbWUubWF0Y2goL3RleHRhcmVhfGlucHV0fHNlbGVjdHxidXR0b24vaSkpe3ZhciBkPWEodGhpcy5oYW5kbGVzW2NdLHRoaXMuZWxlbWVudCksZT0wO2U9L3N3fG5lfG53fHNlfG58cy8udGVzdChjKT9kLm91dGVySGVpZ2h0KCk6ZC5vdXRlcldpZHRoKCk7dmFyIGY9WyJwYWRkaW5nIiwvbmV8bnd8bi8udGVzdChjKT8iVG9wIjovc2V8c3d8cy8udGVzdChjKT8iQm90dG9tIjovXmUkLy50ZXN0KGMpPyJSaWdodCI6IkxlZnQiXS5qb2luKCIiKTtiLmNzcyhmLGUpLHRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplKCl9aWYoIWEodGhpcy5oYW5kbGVzW2NdKS5sZW5ndGgpY29udGludWV9fSx0aGlzLl9yZW5kZXJBeGlzKHRoaXMuZWxlbWVudCksdGhpcy5faGFuZGxlcz1hKCIudWktcmVzaXphYmxlLWhhbmRsZSIsdGhpcy5lbGVtZW50KS5kaXNhYmxlU2VsZWN0aW9uKCksdGhpcy5faGFuZGxlcy5tb3VzZW92ZXIoZnVuY3Rpb24oKXtpZighYi5yZXNpemluZyl7aWYodGhpcy5jbGFzc05hbWUpdmFyIGE9dGhpcy5jbGFzc05hbWUubWF0Y2goL3VpLXJlc2l6YWJsZS0oc2V8c3d8bmV8bnd8bnxlfHN8dykvaSk7Yi5heGlzPWEmJmFbMV0/YVsxXToic2UifX0pLGMuYXV0b0hpZGUmJih0aGlzLl9oYW5kbGVzLmhpZGUoKSxhKHRoaXMuZWxlbWVudCkuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZS1hdXRvaGlkZSIpLmhvdmVyKGZ1bmN0aW9uKCl7aWYoYy5kaXNhYmxlZClyZXR1cm47YSh0aGlzKS5yZW1vdmVDbGFzcygidWktcmVzaXphYmxlLWF1dG9oaWRlIiksYi5faGFuZGxlcy5zaG93KCl9LGZ1bmN0aW9uKCl7aWYoYy5kaXNhYmxlZClyZXR1cm47Yi5yZXNpemluZ3x8KGEodGhpcykuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZS1hdXRvaGlkZSIpLGIuX2hhbmRsZXMuaGlkZSgpKX0pKSx0aGlzLl9tb3VzZUluaXQoKX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuX21vdXNlRGVzdHJveSgpO3ZhciBiPWZ1bmN0aW9uKGIpe2EoYikucmVtb3ZlQ2xhc3MoInVpLXJlc2l6YWJsZSB1aS1yZXNpemFibGUtZGlzYWJsZWQgdWktcmVzaXphYmxlLXJlc2l6aW5nIikucmVtb3ZlRGF0YSgicmVzaXphYmxlIikudW5iaW5kKCIucmVzaXphYmxlIikuZmluZCgiLnVpLXJlc2l6YWJsZS1oYW5kbGUiKS5yZW1vdmUoKX07aWYodGhpcy5lbGVtZW50SXNXcmFwcGVyKXtiKHRoaXMuZWxlbWVudCk7dmFyIGM9dGhpcy5lbGVtZW50O2MuYWZ0ZXIodGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKHtwb3NpdGlvbjpjLmNzcygicG9zaXRpb24iKSx3aWR0aDpjLm91dGVyV2lkdGgoKSxoZWlnaHQ6Yy5vdXRlckhlaWdodCgpLHRvcDpjLmNzcygidG9wIiksbGVmdDpjLmNzcygibGVmdCIpfSkpLnJlbW92ZSgpfXJldHVybiB0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoInJlc2l6ZSIsdGhpcy5vcmlnaW5hbFJlc2l6ZVN0eWxlKSxiKHRoaXMub3JpZ2luYWxFbGVtZW50KSx0aGlzfSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKGIpe3ZhciBjPSExO2Zvcih2YXIgZCBpbiB0aGlzLmhhbmRsZXMpYSh0aGlzLmhhbmRsZXNbZF0pWzBdPT1iLnRhcmdldCYmKGM9ITApO3JldHVybiF0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJmN9LF9tb3VzZVN0YXJ0OmZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMub3B0aW9ucyxlPXRoaXMuZWxlbWVudC5wb3NpdGlvbigpLGY9dGhpcy5lbGVtZW50O3RoaXMucmVzaXppbmc9ITAsdGhpcy5kb2N1bWVudFNjcm9sbD17dG9wOmEoZG9jdW1lbnQpLnNjcm9sbFRvcCgpLGxlZnQ6YShkb2N1bWVudCkuc2Nyb2xsTGVmdCgpfSwoZi5pcygiLnVpLWRyYWdnYWJsZSIpfHwvYWJzb2x1dGUvLnRlc3QoZi5jc3MoInBvc2l0aW9uIikpKSYmZi5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOmUudG9wLGxlZnQ6ZS5sZWZ0fSksdGhpcy5fcmVuZGVyUHJveHkoKTt2YXIgZz1jKHRoaXMuaGVscGVyLmNzcygibGVmdCIpKSxoPWModGhpcy5oZWxwZXIuY3NzKCJ0b3AiKSk7ZC5jb250YWlubWVudCYmKGcrPWEoZC5jb250YWlubWVudCkuc2Nyb2xsTGVmdCgpfHwwLGgrPWEoZC5jb250YWlubWVudCkuc2Nyb2xsVG9wKCl8fDApLHRoaXMub2Zmc2V0PXRoaXMuaGVscGVyLm9mZnNldCgpLHRoaXMucG9zaXRpb249e2xlZnQ6Zyx0b3A6aH0sdGhpcy5zaXplPXRoaXMuX2hlbHBlcj97d2lkdGg6Zi5vdXRlcldpZHRoKCksaGVpZ2h0OmYub3V0ZXJIZWlnaHQoKX06e3dpZHRoOmYud2lkdGgoKSxoZWlnaHQ6Zi5oZWlnaHQoKX0sdGhpcy5vcmlnaW5hbFNpemU9dGhpcy5faGVscGVyP3t3aWR0aDpmLm91dGVyV2lkdGgoKSxoZWlnaHQ6Zi5vdXRlckhlaWdodCgpfTp7d2lkdGg6Zi53aWR0aCgpLGhlaWdodDpmLmhlaWdodCgpfSx0aGlzLm9yaWdpbmFsUG9zaXRpb249e2xlZnQ6Zyx0b3A6aH0sdGhpcy5zaXplRGlmZj17d2lkdGg6Zi5vdXRlcldpZHRoKCktZi53aWR0aCgpLGhlaWdodDpmLm91dGVySGVpZ2h0KCktZi5oZWlnaHQoKX0sdGhpcy5vcmlnaW5hbE1vdXNlUG9zaXRpb249e2xlZnQ6Yi5wYWdlWCx0b3A6Yi5wYWdlWX0sdGhpcy5hc3BlY3RSYXRpbz10eXBlb2YgZC5hc3BlY3RSYXRpbz09Im51bWJlciI/ZC5hc3BlY3RSYXRpbzp0aGlzLm9yaWdpbmFsU2l6ZS53aWR0aC90aGlzLm9yaWdpbmFsU2l6ZS5oZWlnaHR8fDE7dmFyIGk9YSgiLnVpLXJlc2l6YWJsZS0iK3RoaXMuYXhpcykuY3NzKCJjdXJzb3IiKTtyZXR1cm4gYSgiYm9keSIpLmNzcygiY3Vyc29yIixpPT0iYXV0byI/dGhpcy5heGlzKyItcmVzaXplIjppKSxmLmFkZENsYXNzKCJ1aS1yZXNpemFibGUtcmVzaXppbmciKSx0aGlzLl9wcm9wYWdhdGUoInN0YXJ0IixiKSwhMH0sX21vdXNlRHJhZzpmdW5jdGlvbihiKXt2YXIgYz10aGlzLmhlbHBlcixkPXRoaXMub3B0aW9ucyxlPXt9LGY9dGhpcyxnPXRoaXMub3JpZ2luYWxNb3VzZVBvc2l0aW9uLGg9dGhpcy5heGlzLGk9Yi5wYWdlWC1nLmxlZnR8fDAsaj1iLnBhZ2VZLWcudG9wfHwwLGs9dGhpcy5fY2hhbmdlW2hdO2lmKCFrKXJldHVybiExO3ZhciBsPWsuYXBwbHkodGhpcyxbYixpLGpdKSxtPWEuYnJvd3Nlci5tc2llJiZhLmJyb3dzZXIudmVyc2lvbjw3LG49dGhpcy5zaXplRGlmZjt0aGlzLl91cGRhdGVWaXJ0dWFsQm91bmRhcmllcyhiLnNoaWZ0S2V5KTtpZih0aGlzLl9hc3BlY3RSYXRpb3x8Yi5zaGlmdEtleSlsPXRoaXMuX3VwZGF0ZVJhdGlvKGwsYik7cmV0dXJuIGw9dGhpcy5fcmVzcGVjdFNpemUobCxiKSx0aGlzLl9wcm9wYWdhdGUoInJlc2l6ZSIsYiksYy5jc3Moe3RvcDp0aGlzLnBvc2l0aW9uLnRvcCsicHgiLGxlZnQ6dGhpcy5wb3NpdGlvbi5sZWZ0KyJweCIsd2lkdGg6dGhpcy5zaXplLndpZHRoKyJweCIsaGVpZ2h0OnRoaXMuc2l6ZS5oZWlnaHQrInB4In0pLCF0aGlzLl9oZWxwZXImJnRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoJiZ0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZSgpLHRoaXMuX3VwZGF0ZUNhY2hlKGwpLHRoaXMuX3RyaWdnZXIoInJlc2l6ZSIsYix0aGlzLnVpKCkpLCExfSxfbW91c2VTdG9wOmZ1bmN0aW9uKGIpe3RoaXMucmVzaXppbmc9ITE7dmFyIGM9dGhpcy5vcHRpb25zLGQ9dGhpcztpZih0aGlzLl9oZWxwZXIpe3ZhciBlPXRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMsZj1lLmxlbmd0aCYmL3RleHRhcmVhL2kudGVzdChlWzBdLm5vZGVOYW1lKSxnPWYmJmEudWkuaGFzU2Nyb2xsKGVbMF0sImxlZnQiKT8wOmQuc2l6ZURpZmYuaGVpZ2h0LGg9Zj8wOmQuc2l6ZURpZmYud2lkdGgsaT17d2lkdGg6ZC5oZWxwZXIud2lkdGgoKS1oLGhlaWdodDpkLmhlbHBlci5oZWlnaHQoKS1nfSxqPXBhcnNlSW50KGQuZWxlbWVudC5jc3MoImxlZnQiKSwxMCkrKGQucG9zaXRpb24ubGVmdC1kLm9yaWdpbmFsUG9zaXRpb24ubGVmdCl8fG51bGwsaz1wYXJzZUludChkLmVsZW1lbnQuY3NzKCJ0b3AiKSwxMCkrKGQucG9zaXRpb24udG9wLWQub3JpZ2luYWxQb3NpdGlvbi50b3ApfHxudWxsO2MuYW5pbWF0ZXx8dGhpcy5lbGVtZW50LmNzcyhhLmV4dGVuZChpLHt0b3A6ayxsZWZ0Omp9KSksZC5oZWxwZXIuaGVpZ2h0KGQuc2l6ZS5oZWlnaHQpLGQuaGVscGVyLndpZHRoKGQuc2l6ZS53aWR0aCksdGhpcy5faGVscGVyJiYhYy5hbmltYXRlJiZ0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZSgpfXJldHVybiBhKCJib2R5IikuY3NzKCJjdXJzb3IiLCJhdXRvIiksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1yZXNpemFibGUtcmVzaXppbmciKSx0aGlzLl9wcm9wYWdhdGUoInN0b3AiLGIpLHRoaXMuX2hlbHBlciYmdGhpcy5oZWxwZXIucmVtb3ZlKCksITF9LF91cGRhdGVWaXJ0dWFsQm91bmRhcmllczpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMsYyxlLGYsZyxoO2g9e21pbldpZHRoOmQoYi5taW5XaWR0aCk/Yi5taW5XaWR0aDowLG1heFdpZHRoOmQoYi5tYXhXaWR0aCk/Yi5tYXhXaWR0aDpJbmZpbml0eSxtaW5IZWlnaHQ6ZChiLm1pbkhlaWdodCk/Yi5taW5IZWlnaHQ6MCxtYXhIZWlnaHQ6ZChiLm1heEhlaWdodCk/Yi5tYXhIZWlnaHQ6SW5maW5pdHl9O2lmKHRoaXMuX2FzcGVjdFJhdGlvfHxhKWM9aC5taW5IZWlnaHQqdGhpcy5hc3BlY3RSYXRpbyxmPWgubWluV2lkdGgvdGhpcy5hc3BlY3RSYXRpbyxlPWgubWF4SGVpZ2h0KnRoaXMuYXNwZWN0UmF0aW8sZz1oLm1heFdpZHRoL3RoaXMuYXNwZWN0UmF0aW8sYz5oLm1pbldpZHRoJiYoaC5taW5XaWR0aD1jKSxmPmgubWluSGVpZ2h0JiYoaC5taW5IZWlnaHQ9ZiksZTxoLm1heFdpZHRoJiYoaC5tYXhXaWR0aD1lKSxnPGgubWF4SGVpZ2h0JiYoaC5tYXhIZWlnaHQ9Zyk7dGhpcy5fdkJvdW5kYXJpZXM9aH0sX3VwZGF0ZUNhY2hlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9uczt0aGlzLm9mZnNldD10aGlzLmhlbHBlci5vZmZzZXQoKSxkKGEubGVmdCkmJih0aGlzLnBvc2l0aW9uLmxlZnQ9YS5sZWZ0KSxkKGEudG9wKSYmKHRoaXMucG9zaXRpb24udG9wPWEudG9wKSxkKGEuaGVpZ2h0KSYmKHRoaXMuc2l6ZS5oZWlnaHQ9YS5oZWlnaHQpLGQoYS53aWR0aCkmJih0aGlzLnNpemUud2lkdGg9YS53aWR0aCl9LF91cGRhdGVSYXRpbzpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMub3B0aW9ucyxlPXRoaXMucG9zaXRpb24sZj10aGlzLnNpemUsZz10aGlzLmF4aXM7cmV0dXJuIGQoYS5oZWlnaHQpP2Eud2lkdGg9YS5oZWlnaHQqdGhpcy5hc3BlY3RSYXRpbzpkKGEud2lkdGgpJiYoYS5oZWlnaHQ9YS53aWR0aC90aGlzLmFzcGVjdFJhdGlvKSxnPT0ic3ciJiYoYS5sZWZ0PWUubGVmdCsoZi53aWR0aC1hLndpZHRoKSxhLnRvcD1udWxsKSxnPT0ibnciJiYoYS50b3A9ZS50b3ArKGYuaGVpZ2h0LWEuaGVpZ2h0KSxhLmxlZnQ9ZS5sZWZ0KyhmLndpZHRoLWEud2lkdGgpKSxhfSxfcmVzcGVjdFNpemU6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmhlbHBlcixlPXRoaXMuX3ZCb3VuZGFyaWVzLGY9dGhpcy5fYXNwZWN0UmF0aW98fGIuc2hpZnRLZXksZz10aGlzLmF4aXMsaD1kKGEud2lkdGgpJiZlLm1heFdpZHRoJiZlLm1heFdpZHRoPGEud2lkdGgsaT1kKGEuaGVpZ2h0KSYmZS5tYXhIZWlnaHQmJmUubWF4SGVpZ2h0PGEuaGVpZ2h0LGo9ZChhLndpZHRoKSYmZS5taW5XaWR0aCYmZS5taW5XaWR0aD5hLndpZHRoLGs9ZChhLmhlaWdodCkmJmUubWluSGVpZ2h0JiZlLm1pbkhlaWdodD5hLmhlaWdodDtqJiYoYS53aWR0aD1lLm1pbldpZHRoKSxrJiYoYS5oZWlnaHQ9ZS5taW5IZWlnaHQpLGgmJihhLndpZHRoPWUubWF4V2lkdGgpLGkmJihhLmhlaWdodD1lLm1heEhlaWdodCk7dmFyIGw9dGhpcy5vcmlnaW5hbFBvc2l0aW9uLmxlZnQrdGhpcy5vcmlnaW5hbFNpemUud2lkdGgsbT10aGlzLnBvc2l0aW9uLnRvcCt0aGlzLnNpemUuaGVpZ2h0LG49L3N3fG53fHcvLnRlc3QoZyksbz0vbnd8bmV8bi8udGVzdChnKTtqJiZuJiYoYS5sZWZ0PWwtZS5taW5XaWR0aCksaCYmbiYmKGEubGVmdD1sLWUubWF4V2lkdGgpLGsmJm8mJihhLnRvcD1tLWUubWluSGVpZ2h0KSxpJiZvJiYoYS50b3A9bS1lLm1heEhlaWdodCk7dmFyIHA9IWEud2lkdGgmJiFhLmhlaWdodDtyZXR1cm4gcCYmIWEubGVmdCYmYS50b3A/YS50b3A9bnVsbDpwJiYhYS50b3AmJmEubGVmdCYmKGEubGVmdD1udWxsKSxhfSxfcHJvcG9ydGlvbmFsbHlSZXNpemU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9wdGlvbnM7aWYoIXRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoKXJldHVybjt2YXIgYz10aGlzLmhlbHBlcnx8dGhpcy5lbGVtZW50O2Zvcih2YXIgZD0wO2Q8dGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50cy5sZW5ndGg7ZCsrKXt2YXIgZT10aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzW2RdO2lmKCF0aGlzLmJvcmRlckRpZil7dmFyIGY9W2UuY3NzKCJib3JkZXJUb3BXaWR0aCIpLGUuY3NzKCJib3JkZXJSaWdodFdpZHRoIiksZS5jc3MoImJvcmRlckJvdHRvbVdpZHRoIiksZS5jc3MoImJvcmRlckxlZnRXaWR0aCIpXSxnPVtlLmNzcygicGFkZGluZ1RvcCIpLGUuY3NzKCJwYWRkaW5nUmlnaHQiKSxlLmNzcygicGFkZGluZ0JvdHRvbSIpLGUuY3NzKCJwYWRkaW5nTGVmdCIpXTt0aGlzLmJvcmRlckRpZj1hLm1hcChmLGZ1bmN0aW9uKGEsYil7dmFyIGM9cGFyc2VJbnQoYSwxMCl8fDAsZD1wYXJzZUludChnW2JdLDEwKXx8MDtyZXR1cm4gYytkfSl9aWYoIWEuYnJvd3Nlci5tc2llfHwhYShjKS5pcygiOmhpZGRlbiIpJiYhYShjKS5wYXJlbnRzKCI6aGlkZGVuIikubGVuZ3RoKWUuY3NzKHtoZWlnaHQ6Yy5oZWlnaHQoKS10aGlzLmJvcmRlckRpZlswXS10aGlzLmJvcmRlckRpZlsyXXx8MCx3aWR0aDpjLndpZHRoKCktdGhpcy5ib3JkZXJEaWZbMV0tdGhpcy5ib3JkZXJEaWZbM118fDB9KTtlbHNlIGNvbnRpbnVlfX0sX3JlbmRlclByb3h5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5lbGVtZW50LGM9dGhpcy5vcHRpb25zO3RoaXMuZWxlbWVudE9mZnNldD1iLm9mZnNldCgpO2lmKHRoaXMuX2hlbHBlcil7dGhpcy5oZWxwZXI9dGhpcy5oZWxwZXJ8fGEoJzxkaXYgc3R5bGU9Im92ZXJmbG93OmhpZGRlbjsiPjwvZGl2PicpO3ZhciBkPWEuYnJvd3Nlci5tc2llJiZhLmJyb3dzZXIudmVyc2lvbjw3LGU9ZD8xOjAsZj1kPzI6LTE7dGhpcy5oZWxwZXIuYWRkQ2xhc3ModGhpcy5faGVscGVyKS5jc3Moe3dpZHRoOnRoaXMuZWxlbWVudC5vdXRlcldpZHRoKCkrZixoZWlnaHQ6dGhpcy5lbGVtZW50Lm91dGVySGVpZ2h0KCkrZixwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6dGhpcy5lbGVtZW50T2Zmc2V0LmxlZnQtZSsicHgiLHRvcDp0aGlzLmVsZW1lbnRPZmZzZXQudG9wLWUrInB4Iix6SW5kZXg6KytjLnpJbmRleH0pLHRoaXMuaGVscGVyLmFwcGVuZFRvKCJib2R5IikuZGlzYWJsZVNlbGVjdGlvbigpfWVsc2UgdGhpcy5oZWxwZXI9dGhpcy5lbGVtZW50fSxfY2hhbmdlOntlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm57d2lkdGg6dGhpcy5vcmlnaW5hbFNpemUud2lkdGgrYn19LHc6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMub3B0aW9ucyxlPXRoaXMub3JpZ2luYWxTaXplLGY9dGhpcy5vcmlnaW5hbFBvc2l0aW9uO3JldHVybntsZWZ0OmYubGVmdCtiLHdpZHRoOmUud2lkdGgtYn19LG46ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMub3B0aW9ucyxlPXRoaXMub3JpZ2luYWxTaXplLGY9dGhpcy5vcmlnaW5hbFBvc2l0aW9uO3JldHVybnt0b3A6Zi50b3ArYyxoZWlnaHQ6ZS5oZWlnaHQtY319LHM6ZnVuY3Rpb24oYSxiLGMpe3JldHVybntoZWlnaHQ6dGhpcy5vcmlnaW5hbFNpemUuaGVpZ2h0K2N9fSxzZTpmdW5jdGlvbihiLGMsZCl7cmV0dXJuIGEuZXh0ZW5kKHRoaXMuX2NoYW5nZS5zLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9jaGFuZ2UuZS5hcHBseSh0aGlzLFtiLGMsZF0pKX0sc3c6ZnVuY3Rpb24oYixjLGQpe3JldHVybiBhLmV4dGVuZCh0aGlzLl9jaGFuZ2Uucy5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fY2hhbmdlLncuYXBwbHkodGhpcyxbYixjLGRdKSl9LG5lOmZ1bmN0aW9uKGIsYyxkKXtyZXR1cm4gYS5leHRlbmQodGhpcy5fY2hhbmdlLm4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX2NoYW5nZS5lLmFwcGx5KHRoaXMsW2IsYyxkXSkpfSxudzpmdW5jdGlvbihiLGMsZCl7cmV0dXJuIGEuZXh0ZW5kKHRoaXMuX2NoYW5nZS5uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9jaGFuZ2Uudy5hcHBseSh0aGlzLFtiLGMsZF0pKX19LF9wcm9wYWdhdGU6ZnVuY3Rpb24oYixjKXthLnVpLnBsdWdpbi5jYWxsKHRoaXMsYixbYyx0aGlzLnVpKCldKSxiIT0icmVzaXplIiYmdGhpcy5fdHJpZ2dlcihiLGMsdGhpcy51aSgpKX0scGx1Z2luczp7fSx1aTpmdW5jdGlvbigpe3JldHVybntvcmlnaW5hbEVsZW1lbnQ6dGhpcy5vcmlnaW5hbEVsZW1lbnQsZWxlbWVudDp0aGlzLmVsZW1lbnQsaGVscGVyOnRoaXMuaGVscGVyLHBvc2l0aW9uOnRoaXMucG9zaXRpb24sc2l6ZTp0aGlzLnNpemUsb3JpZ2luYWxTaXplOnRoaXMub3JpZ2luYWxTaXplLG9yaWdpbmFsUG9zaXRpb246dGhpcy5vcmlnaW5hbFBvc2l0aW9ufX19KSxhLmV4dGVuZChhLnVpLnJlc2l6YWJsZSx7dmVyc2lvbjoiMS44LjI0In0pLGEudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiYWxzb1Jlc2l6ZSIse3N0YXJ0OmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSxlPWQub3B0aW9ucyxmPWZ1bmN0aW9uKGIpe2EoYikuZWFjaChmdW5jdGlvbigpe3ZhciBiPWEodGhpcyk7Yi5kYXRhKCJyZXNpemFibGUtYWxzb3Jlc2l6ZSIse3dpZHRoOnBhcnNlSW50KGIud2lkdGgoKSwxMCksaGVpZ2h0OnBhcnNlSW50KGIuaGVpZ2h0KCksMTApLGxlZnQ6cGFyc2VJbnQoYi5jc3MoImxlZnQiKSwxMCksdG9wOnBhcnNlSW50KGIuY3NzKCJ0b3AiKSwxMCl9KX0pfTt0eXBlb2YgZS5hbHNvUmVzaXplPT0ib2JqZWN0IiYmIWUuYWxzb1Jlc2l6ZS5wYXJlbnROb2RlP2UuYWxzb1Jlc2l6ZS5sZW5ndGg/KGUuYWxzb1Jlc2l6ZT1lLmFsc29SZXNpemVbMF0sZihlLmFsc29SZXNpemUpKTphLmVhY2goZS5hbHNvUmVzaXplLGZ1bmN0aW9uKGEpe2YoYSl9KTpmKGUuYWxzb1Jlc2l6ZSl9LHJlc2l6ZTpmdW5jdGlvbihiLGMpe3ZhciBkPWEodGhpcykuZGF0YSgicmVzaXphYmxlIiksZT1kLm9wdGlvbnMsZj1kLm9yaWdpbmFsU2l6ZSxnPWQub3JpZ2luYWxQb3NpdGlvbixoPXtoZWlnaHQ6ZC5zaXplLmhlaWdodC1mLmhlaWdodHx8MCx3aWR0aDpkLnNpemUud2lkdGgtZi53aWR0aHx8MCx0b3A6ZC5wb3NpdGlvbi50b3AtZy50b3B8fDAsbGVmdDpkLnBvc2l0aW9uLmxlZnQtZy5sZWZ0fHwwfSxpPWZ1bmN0aW9uKGIsZCl7YShiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9YSh0aGlzKSxlPWEodGhpcykuZGF0YSgicmVzaXphYmxlLWFsc29yZXNpemUiKSxmPXt9LGc9ZCYmZC5sZW5ndGg/ZDpiLnBhcmVudHMoYy5vcmlnaW5hbEVsZW1lbnRbMF0pLmxlbmd0aD9bIndpZHRoIiwiaGVpZ2h0Il06WyJ3aWR0aCIsImhlaWdodCIsInRvcCIsImxlZnQiXTthLmVhY2goZyxmdW5jdGlvbihhLGIpe3ZhciBjPShlW2JdfHwwKSsoaFtiXXx8MCk7YyYmYz49MCYmKGZbYl09Y3x8bnVsbCl9KSxiLmNzcyhmKX0pfTt0eXBlb2YgZS5hbHNvUmVzaXplPT0ib2JqZWN0IiYmIWUuYWxzb1Jlc2l6ZS5ub2RlVHlwZT9hLmVhY2goZS5hbHNvUmVzaXplLGZ1bmN0aW9uKGEsYil7aShhLGIpfSk6aShlLmFsc29SZXNpemUpfSxzdG9wOmZ1bmN0aW9uKGIsYyl7YSh0aGlzKS5yZW1vdmVEYXRhKCJyZXNpemFibGUtYWxzb3Jlc2l6ZSIpfX0pLGEudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiYW5pbWF0ZSIse3N0b3A6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLGU9ZC5vcHRpb25zLGY9ZC5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50cyxnPWYubGVuZ3RoJiYvdGV4dGFyZWEvaS50ZXN0KGZbMF0ubm9kZU5hbWUpLGg9ZyYmYS51aS5oYXNTY3JvbGwoZlswXSwibGVmdCIpPzA6ZC5zaXplRGlmZi5oZWlnaHQsaT1nPzA6ZC5zaXplRGlmZi53aWR0aCxqPXt3aWR0aDpkLnNpemUud2lkdGgtaSxoZWlnaHQ6ZC5zaXplLmhlaWdodC1ofSxrPXBhcnNlSW50KGQuZWxlbWVudC5jc3MoImxlZnQiKSwxMCkrKGQucG9zaXRpb24ubGVmdC1kLm9yaWdpbmFsUG9zaXRpb24ubGVmdCl8fG51bGwsbD1wYXJzZUludChkLmVsZW1lbnQuY3NzKCJ0b3AiKSwxMCkrKGQucG9zaXRpb24udG9wLWQub3JpZ2luYWxQb3NpdGlvbi50b3ApfHxudWxsO2QuZWxlbWVudC5hbmltYXRlKGEuZXh0ZW5kKGosbCYmaz97dG9wOmwsbGVmdDprfTp7fSkse2R1cmF0aW9uOmUuYW5pbWF0ZUR1cmF0aW9uLGVhc2luZzplLmFuaW1hdGVFYXNpbmcsc3RlcDpmdW5jdGlvbigpe3ZhciBjPXt3aWR0aDpwYXJzZUludChkLmVsZW1lbnQuY3NzKCJ3aWR0aCIpLDEwKSxoZWlnaHQ6cGFyc2VJbnQoZC5lbGVtZW50LmNzcygiaGVpZ2h0IiksMTApLHRvcDpwYXJzZUludChkLmVsZW1lbnQuY3NzKCJ0b3AiKSwxMCksbGVmdDpwYXJzZUludChkLmVsZW1lbnQuY3NzKCJsZWZ0IiksMTApfTtmJiZmLmxlbmd0aCYmYShmWzBdKS5jc3Moe3dpZHRoOmMud2lkdGgsaGVpZ2h0OmMuaGVpZ2h0fSksZC5fdXBkYXRlQ2FjaGUoYyksZC5fcHJvcGFnYXRlKCJyZXNpemUiLGIpfX0pfX0pLGEudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiY29udGFpbm1lbnQiLHtzdGFydDpmdW5jdGlvbihiLGQpe3ZhciBlPWEodGhpcykuZGF0YSgicmVzaXphYmxlIiksZj1lLm9wdGlvbnMsZz1lLmVsZW1lbnQsaD1mLmNvbnRhaW5tZW50LGk9aCBpbnN0YW5jZW9mIGE/aC5nZXQoMCk6L3BhcmVudC8udGVzdChoKT9nLnBhcmVudCgpLmdldCgwKTpoO2lmKCFpKXJldHVybjtlLmNvbnRhaW5lckVsZW1lbnQ9YShpKTtpZigvZG9jdW1lbnQvLnRlc3QoaCl8fGg9PWRvY3VtZW50KWUuY29udGFpbmVyT2Zmc2V0PXtsZWZ0OjAsdG9wOjB9LGUuY29udGFpbmVyUG9zaXRpb249e2xlZnQ6MCx0b3A6MH0sZS5wYXJlbnREYXRhPXtlbGVtZW50OmEoZG9jdW1lbnQpLGxlZnQ6MCx0b3A6MCx3aWR0aDphKGRvY3VtZW50KS53aWR0aCgpLGhlaWdodDphKGRvY3VtZW50KS5oZWlnaHQoKXx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlLnNjcm9sbEhlaWdodH07ZWxzZXt2YXIgaj1hKGkpLGs9W107YShbIlRvcCIsIlJpZ2h0IiwiTGVmdCIsIkJvdHRvbSJdKS5lYWNoKGZ1bmN0aW9uKGEsYil7a1thXT1jKGouY3NzKCJwYWRkaW5nIitiKSl9KSxlLmNvbnRhaW5lck9mZnNldD1qLm9mZnNldCgpLGUuY29udGFpbmVyUG9zaXRpb249ai5wb3NpdGlvbigpLGUuY29udGFpbmVyU2l6ZT17aGVpZ2h0OmouaW5uZXJIZWlnaHQoKS1rWzNdLHdpZHRoOmouaW5uZXJXaWR0aCgpLWtbMV19O3ZhciBsPWUuY29udGFpbmVyT2Zmc2V0LG09ZS5jb250YWluZXJTaXplLmhlaWdodCxuPWUuY29udGFpbmVyU2l6ZS53aWR0aCxvPWEudWkuaGFzU2Nyb2xsKGksImxlZnQiKT9pLnNjcm9sbFdpZHRoOm4scD1hLnVpLmhhc1Njcm9sbChpKT9pLnNjcm9sbEhlaWdodDptO2UucGFyZW50RGF0YT17ZWxlbWVudDppLGxlZnQ6bC5sZWZ0LHRvcDpsLnRvcCx3aWR0aDpvLGhlaWdodDpwfX19LHJlc2l6ZTpmdW5jdGlvbihiLGMpe3ZhciBkPWEodGhpcykuZGF0YSgicmVzaXphYmxlIiksZT1kLm9wdGlvbnMsZj1kLmNvbnRhaW5lclNpemUsZz1kLmNvbnRhaW5lck9mZnNldCxoPWQuc2l6ZSxpPWQucG9zaXRpb24saj1kLl9hc3BlY3RSYXRpb3x8Yi5zaGlmdEtleSxrPXt0b3A6MCxsZWZ0OjB9LGw9ZC5jb250YWluZXJFbGVtZW50O2xbMF0hPWRvY3VtZW50JiYvc3RhdGljLy50ZXN0KGwuY3NzKCJwb3NpdGlvbiIpKSYmKGs9ZyksaS5sZWZ0PChkLl9oZWxwZXI/Zy5sZWZ0OjApJiYoZC5zaXplLndpZHRoPWQuc2l6ZS53aWR0aCsoZC5faGVscGVyP2QucG9zaXRpb24ubGVmdC1nLmxlZnQ6ZC5wb3NpdGlvbi5sZWZ0LWsubGVmdCksaiYmKGQuc2l6ZS5oZWlnaHQ9ZC5zaXplLndpZHRoL2QuYXNwZWN0UmF0aW8pLGQucG9zaXRpb24ubGVmdD1lLmhlbHBlcj9nLmxlZnQ6MCksaS50b3A8KGQuX2hlbHBlcj9nLnRvcDowKSYmKGQuc2l6ZS5oZWlnaHQ9ZC5zaXplLmhlaWdodCsoZC5faGVscGVyP2QucG9zaXRpb24udG9wLWcudG9wOmQucG9zaXRpb24udG9wKSxqJiYoZC5zaXplLndpZHRoPWQuc2l6ZS5oZWlnaHQqZC5hc3BlY3RSYXRpbyksZC5wb3NpdGlvbi50b3A9ZC5faGVscGVyP2cudG9wOjApLGQub2Zmc2V0LmxlZnQ9ZC5wYXJlbnREYXRhLmxlZnQrZC5wb3NpdGlvbi5sZWZ0LGQub2Zmc2V0LnRvcD1kLnBhcmVudERhdGEudG9wK2QucG9zaXRpb24udG9wO3ZhciBtPU1hdGguYWJzKChkLl9oZWxwZXI/ZC5vZmZzZXQubGVmdC1rLmxlZnQ6ZC5vZmZzZXQubGVmdC1rLmxlZnQpK2Quc2l6ZURpZmYud2lkdGgpLG49TWF0aC5hYnMoKGQuX2hlbHBlcj9kLm9mZnNldC50b3Atay50b3A6ZC5vZmZzZXQudG9wLWcudG9wKStkLnNpemVEaWZmLmhlaWdodCksbz1kLmNvbnRhaW5lckVsZW1lbnQuZ2V0KDApPT1kLmVsZW1lbnQucGFyZW50KCkuZ2V0KDApLHA9L3JlbGF0aXZlfGFic29sdXRlLy50ZXN0KGQuY29udGFpbmVyRWxlbWVudC5jc3MoInBvc2l0aW9uIikpO28mJnAmJihtLT1kLnBhcmVudERhdGEubGVmdCksbStkLnNpemUud2lkdGg+PWQucGFyZW50RGF0YS53aWR0aCYmKGQuc2l6ZS53aWR0aD1kLnBhcmVudERhdGEud2lkdGgtbSxqJiYoZC5zaXplLmhlaWdodD1kLnNpemUud2lkdGgvZC5hc3BlY3RSYXRpbykpLG4rZC5zaXplLmhlaWdodD49ZC5wYXJlbnREYXRhLmhlaWdodCYmKGQuc2l6ZS5oZWlnaHQ9ZC5wYXJlbnREYXRhLmhlaWdodC1uLGomJihkLnNpemUud2lkdGg9ZC5zaXplLmhlaWdodCpkLmFzcGVjdFJhdGlvKSl9LHN0b3A6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLGU9ZC5vcHRpb25zLGY9ZC5wb3NpdGlvbixnPWQuY29udGFpbmVyT2Zmc2V0LGg9ZC5jb250YWluZXJQb3NpdGlvbixpPWQuY29udGFpbmVyRWxlbWVudCxqPWEoZC5oZWxwZXIpLGs9ai5vZmZzZXQoKSxsPWoub3V0ZXJXaWR0aCgpLWQuc2l6ZURpZmYud2lkdGgsbT1qLm91dGVySGVpZ2h0KCktZC5zaXplRGlmZi5oZWlnaHQ7ZC5faGVscGVyJiYhZS5hbmltYXRlJiYvcmVsYXRpdmUvLnRlc3QoaS5jc3MoInBvc2l0aW9uIikpJiZhKHRoaXMpLmNzcyh7bGVmdDprLmxlZnQtaC5sZWZ0LWcubGVmdCx3aWR0aDpsLGhlaWdodDptfSksZC5faGVscGVyJiYhZS5hbmltYXRlJiYvc3RhdGljLy50ZXN0KGkuY3NzKCJwb3NpdGlvbiIpKSYmYSh0aGlzKS5jc3Moe2xlZnQ6ay5sZWZ0LWgubGVmdC1nLmxlZnQsd2lkdGg6bCxoZWlnaHQ6bX0pfX0pLGEudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiZ2hvc3QiLHtzdGFydDpmdW5jdGlvbihiLGMpe3ZhciBkPWEodGhpcykuZGF0YSgicmVzaXphYmxlIiksZT1kLm9wdGlvbnMsZj1kLnNpemU7ZC5naG9zdD1kLm9yaWdpbmFsRWxlbWVudC5jbG9uZSgpLGQuZ2hvc3QuY3NzKHtvcGFjaXR5Oi4yNSxkaXNwbGF5OiJibG9jayIscG9zaXRpb246InJlbGF0aXZlIixoZWlnaHQ6Zi5oZWlnaHQsd2lkdGg6Zi53aWR0aCxtYXJnaW46MCxsZWZ0OjAsdG9wOjB9KS5hZGRDbGFzcygidWktcmVzaXphYmxlLWdob3N0IikuYWRkQ2xhc3ModHlwZW9mIGUuZ2hvc3Q9PSJzdHJpbmciP2UuZ2hvc3Q6IiIpLGQuZ2hvc3QuYXBwZW5kVG8oZC5oZWxwZXIpfSxyZXNpemU6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLGU9ZC5vcHRpb25zO2QuZ2hvc3QmJmQuZ2hvc3QuY3NzKHtwb3NpdGlvbjoicmVsYXRpdmUiLGhlaWdodDpkLnNpemUuaGVpZ2h0LHdpZHRoOmQuc2l6ZS53aWR0aH0pfSxzdG9wOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSxlPWQub3B0aW9ucztkLmdob3N0JiZkLmhlbHBlciYmZC5oZWxwZXIuZ2V0KDApLnJlbW92ZUNoaWxkKGQuZ2hvc3QuZ2V0KDApKX19KSxhLnVpLnBsdWdpbi5hZGQoInJlc2l6YWJsZSIsImdyaWQiLHtyZXNpemU6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLGU9ZC5vcHRpb25zLGY9ZC5zaXplLGc9ZC5vcmlnaW5hbFNpemUsaD1kLm9yaWdpbmFsUG9zaXRpb24saT1kLmF4aXMsaj1lLl9hc3BlY3RSYXRpb3x8Yi5zaGlmdEtleTtlLmdyaWQ9dHlwZW9mIGUuZ3JpZD09Im51bWJlciI/W2UuZ3JpZCxlLmdyaWRdOmUuZ3JpZDt2YXIgaz1NYXRoLnJvdW5kKChmLndpZHRoLWcud2lkdGgpLyhlLmdyaWRbMF18fDEpKSooZS5ncmlkWzBdfHwxKSxsPU1hdGgucm91bmQoKGYuaGVpZ2h0LWcuaGVpZ2h0KS8oZS5ncmlkWzFdfHwxKSkqKGUuZ3JpZFsxXXx8MSk7L14oc2V8c3xlKSQvLnRlc3QoaSk/KGQuc2l6ZS53aWR0aD1nLndpZHRoK2ssZC5zaXplLmhlaWdodD1nLmhlaWdodCtsKTovXihuZSkkLy50ZXN0KGkpPyhkLnNpemUud2lkdGg9Zy53aWR0aCtrLGQuc2l6ZS5oZWlnaHQ9Zy5oZWlnaHQrbCxkLnBvc2l0aW9uLnRvcD1oLnRvcC1sKTovXihzdykkLy50ZXN0KGkpPyhkLnNpemUud2lkdGg9Zy53aWR0aCtrLGQuc2l6ZS5oZWlnaHQ9Zy5oZWlnaHQrbCxkLnBvc2l0aW9uLmxlZnQ9aC5sZWZ0LWspOihkLnNpemUud2lkdGg9Zy53aWR0aCtrLGQuc2l6ZS5oZWlnaHQ9Zy5oZWlnaHQrbCxkLnBvc2l0aW9uLnRvcD1oLnRvcC1sLGQucG9zaXRpb24ubGVmdD1oLmxlZnQtayl9fSk7dmFyIGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHBhcnNlSW50KGEsMTApfHwwfSxkPWZ1bmN0aW9uKGEpe3JldHVybiFpc05hTihwYXJzZUludChhLDEwKSl9fShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7YS53aWRnZXQoInVpLnNlbGVjdGFibGUiLGEudWkubW91c2Use29wdGlvbnM6e2FwcGVuZFRvOiJib2R5IixhdXRvUmVmcmVzaDohMCxkaXN0YW5jZTowLGZpbHRlcjoiKiIsdG9sZXJhbmNlOiJ0b3VjaCJ9LF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzO3RoaXMuZWxlbWVudC5hZGRDbGFzcygidWktc2VsZWN0YWJsZSIpLHRoaXMuZHJhZ2dlZD0hMTt2YXIgYzt0aGlzLnJlZnJlc2g9ZnVuY3Rpb24oKXtjPWEoYi5vcHRpb25zLmZpbHRlcixiLmVsZW1lbnRbMF0pLGMuYWRkQ2xhc3MoInVpLXNlbGVjdGVlIiksYy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9YSh0aGlzKSxjPWIub2Zmc2V0KCk7YS5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIse2VsZW1lbnQ6dGhpcywkZWxlbWVudDpiLGxlZnQ6Yy5sZWZ0LHRvcDpjLnRvcCxyaWdodDpjLmxlZnQrYi5vdXRlcldpZHRoKCksYm90dG9tOmMudG9wK2Iub3V0ZXJIZWlnaHQoKSxzdGFydHNlbGVjdGVkOiExLHNlbGVjdGVkOmIuaGFzQ2xhc3MoInVpLXNlbGVjdGVkIiksc2VsZWN0aW5nOmIuaGFzQ2xhc3MoInVpLXNlbGVjdGluZyIpLHVuc2VsZWN0aW5nOmIuaGFzQ2xhc3MoInVpLXVuc2VsZWN0aW5nIil9KX0pfSx0aGlzLnJlZnJlc2goKSx0aGlzLnNlbGVjdGVlcz1jLmFkZENsYXNzKCJ1aS1zZWxlY3RlZSIpLHRoaXMuX21vdXNlSW5pdCgpLHRoaXMuaGVscGVyPWEoIjxkaXYgY2xhc3M9J3VpLXNlbGVjdGFibGUtaGVscGVyJz48L2Rpdj4iKX0sZGVzdHJveTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGVlcy5yZW1vdmVDbGFzcygidWktc2VsZWN0ZWUiKS5yZW1vdmVEYXRhKCJzZWxlY3RhYmxlLWl0ZW0iKSx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGFibGUgdWktc2VsZWN0YWJsZS1kaXNhYmxlZCIpLnJlbW92ZURhdGEoInNlbGVjdGFibGUiKS51bmJpbmQoIi5zZWxlY3RhYmxlIiksdGhpcy5fbW91c2VEZXN0cm95KCksdGhpc30sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oYil7dmFyIGM9dGhpczt0aGlzLm9wb3M9W2IucGFnZVgsYi5wYWdlWV07aWYodGhpcy5vcHRpb25zLmRpc2FibGVkKXJldHVybjt2YXIgZD10aGlzLm9wdGlvbnM7dGhpcy5zZWxlY3RlZXM9YShkLmZpbHRlcix0aGlzLmVsZW1lbnRbMF0pLHRoaXMuX3RyaWdnZXIoInN0YXJ0IixiKSxhKGQuYXBwZW5kVG8pLmFwcGVuZCh0aGlzLmhlbHBlciksdGhpcy5oZWxwZXIuY3NzKHtsZWZ0OmIuY2xpZW50WCx0b3A6Yi5jbGllbnRZLHdpZHRoOjAsaGVpZ2h0OjB9KSxkLmF1dG9SZWZyZXNoJiZ0aGlzLnJlZnJlc2goKSx0aGlzLnNlbGVjdGVlcy5maWx0ZXIoIi51aS1zZWxlY3RlZCIpLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1hLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7ZC5zdGFydHNlbGVjdGVkPSEwLCFiLm1ldGFLZXkmJiFiLmN0cmxLZXkmJihkLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RlZCIpLGQuc2VsZWN0ZWQ9ITEsZC4kZWxlbWVudC5hZGRDbGFzcygidWktdW5zZWxlY3RpbmciKSxkLnVuc2VsZWN0aW5nPSEwLGMuX3RyaWdnZXIoInVuc2VsZWN0aW5nIixiLHt1bnNlbGVjdGluZzpkLmVsZW1lbnR9KSl9KSxhKGIudGFyZ2V0KS5wYXJlbnRzKCkuYW5kU2VsZigpLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1hLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7aWYoZCl7dmFyIGU9IWIubWV0YUtleSYmIWIuY3RybEtleXx8IWQuJGVsZW1lbnQuaGFzQ2xhc3MoInVpLXNlbGVjdGVkIik7cmV0dXJuIGQuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoZT8idWktdW5zZWxlY3RpbmciOiJ1aS1zZWxlY3RlZCIpLmFkZENsYXNzKGU/InVpLXNlbGVjdGluZyI6InVpLXVuc2VsZWN0aW5nIiksZC51bnNlbGVjdGluZz0hZSxkLnNlbGVjdGluZz1lLGQuc2VsZWN0ZWQ9ZSxlP2MuX3RyaWdnZXIoInNlbGVjdGluZyIsYix7c2VsZWN0aW5nOmQuZWxlbWVudH0pOmMuX3RyaWdnZXIoInVuc2VsZWN0aW5nIixiLHt1bnNlbGVjdGluZzpkLmVsZW1lbnR9KSwhMX19KX0sX21vdXNlRHJhZzpmdW5jdGlvbihiKXt2YXIgYz10aGlzO3RoaXMuZHJhZ2dlZD0hMDtpZih0aGlzLm9wdGlvbnMuZGlzYWJsZWQpcmV0dXJuO3ZhciBkPXRoaXMub3B0aW9ucyxlPXRoaXMub3Bvc1swXSxmPXRoaXMub3Bvc1sxXSxnPWIucGFnZVgsaD1iLnBhZ2VZO2lmKGU+Zyl7dmFyIGk9ZztnPWUsZT1pfWlmKGY+aCl7dmFyIGk9aDtoPWYsZj1pfXJldHVybiB0aGlzLmhlbHBlci5jc3Moe2xlZnQ6ZSx0b3A6Zix3aWR0aDpnLWUsaGVpZ2h0OmgtZn0pLHRoaXMuc2VsZWN0ZWVzLmVhY2goZnVuY3Rpb24oKXt2YXIgaT1hLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7aWYoIWl8fGkuZWxlbWVudD09Yy5lbGVtZW50WzBdKXJldHVybjt2YXIgaj0hMTtkLnRvbGVyYW5jZT09InRvdWNoIj9qPSEoaS5sZWZ0Pmd8fGkucmlnaHQ8ZXx8aS50b3A+aHx8aS5ib3R0b208Zik6ZC50b2xlcmFuY2U9PSJmaXQiJiYoaj1pLmxlZnQ+ZSYmaS5yaWdodDxnJiZpLnRvcD5mJiZpLmJvdHRvbTxoKSxqPyhpLnNlbGVjdGVkJiYoaS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0ZWQiKSxpLnNlbGVjdGVkPSExKSxpLnVuc2VsZWN0aW5nJiYoaS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktdW5zZWxlY3RpbmciKSxpLnVuc2VsZWN0aW5nPSExKSxpLnNlbGVjdGluZ3x8KGkuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXNlbGVjdGluZyIpLGkuc2VsZWN0aW5nPSEwLGMuX3RyaWdnZXIoInNlbGVjdGluZyIsYix7c2VsZWN0aW5nOmkuZWxlbWVudH0pKSk6KGkuc2VsZWN0aW5nJiYoKGIubWV0YUtleXx8Yi5jdHJsS2V5KSYmaS5zdGFydHNlbGVjdGVkPyhpLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RpbmciKSxpLnNlbGVjdGluZz0hMSxpLiRlbGVtZW50LmFkZENsYXNzKCJ1aS1zZWxlY3RlZCIpLGkuc2VsZWN0ZWQ9ITApOihpLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RpbmciKSxpLnNlbGVjdGluZz0hMSxpLnN0YXJ0c2VsZWN0ZWQmJihpLiRlbGVtZW50LmFkZENsYXNzKCJ1aS11bnNlbGVjdGluZyIpLGkudW5zZWxlY3Rpbmc9ITApLGMuX3RyaWdnZXIoInVuc2VsZWN0aW5nIixiLHt1bnNlbGVjdGluZzppLmVsZW1lbnR9KSkpLGkuc2VsZWN0ZWQmJiFiLm1ldGFLZXkmJiFiLmN0cmxLZXkmJiFpLnN0YXJ0c2VsZWN0ZWQmJihpLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RlZCIpLGkuc2VsZWN0ZWQ9ITEsaS4kZWxlbWVudC5hZGRDbGFzcygidWktdW5zZWxlY3RpbmciKSxpLnVuc2VsZWN0aW5nPSEwLGMuX3RyaWdnZXIoInVuc2VsZWN0aW5nIixiLHt1bnNlbGVjdGluZzppLmVsZW1lbnR9KSkpfSksITF9LF9tb3VzZVN0b3A6ZnVuY3Rpb24oYil7dmFyIGM9dGhpczt0aGlzLmRyYWdnZWQ9ITE7dmFyIGQ9dGhpcy5vcHRpb25zO3JldHVybiBhKCIudWktdW5zZWxlY3RpbmciLHRoaXMuZWxlbWVudFswXSkuZWFjaChmdW5jdGlvbigpe3ZhciBkPWEuZGF0YSh0aGlzLCJzZWxlY3RhYmxlLWl0ZW0iKTtkLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS11bnNlbGVjdGluZyIpLGQudW5zZWxlY3Rpbmc9ITEsZC5zdGFydHNlbGVjdGVkPSExLGMuX3RyaWdnZXIoInVuc2VsZWN0ZWQiLGIse3Vuc2VsZWN0ZWQ6ZC5lbGVtZW50fSl9KSxhKCIudWktc2VsZWN0aW5nIix0aGlzLmVsZW1lbnRbMF0pLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1hLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7ZC4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0aW5nIikuYWRkQ2xhc3MoInVpLXNlbGVjdGVkIiksZC5zZWxlY3Rpbmc9ITEsZC5zZWxlY3RlZD0hMCxkLnN0YXJ0c2VsZWN0ZWQ9ITAsYy5fdHJpZ2dlcigic2VsZWN0ZWQiLGIse3NlbGVjdGVkOmQuZWxlbWVudH0pfSksdGhpcy5fdHJpZ2dlcigic3RvcCIsYiksdGhpcy5oZWxwZXIucmVtb3ZlKCksITF9fSksYS5leHRlbmQoYS51aS5zZWxlY3RhYmxlLHt2ZXJzaW9uOiIxLjguMjQifSl9KGpRdWVyeSksZnVuY3Rpb24oYSxiKXthLndpZGdldCgidWkuc29ydGFibGUiLGEudWkubW91c2Use3dpZGdldEV2ZW50UHJlZml4OiJzb3J0IixyZWFkeTohMSxvcHRpb25zOnthcHBlbmRUbzoicGFyZW50IixheGlzOiExLGNvbm5lY3RXaXRoOiExLGNvbnRhaW5tZW50OiExLGN1cnNvcjoiYXV0byIsY3Vyc29yQXQ6ITEsZHJvcE9uRW1wdHk6ITAsZm9yY2VQbGFjZWhvbGRlclNpemU6ITEsZm9yY2VIZWxwZXJTaXplOiExLGdyaWQ6ITEsaGFuZGxlOiExLGhlbHBlcjoib3JpZ2luYWwiLGl0ZW1zOiI+ICoiLG9wYWNpdHk6ITEscGxhY2Vob2xkZXI6ITEscmV2ZXJ0OiExLHNjcm9sbDohMCxzY3JvbGxTZW5zaXRpdml0eToyMCxzY3JvbGxTcGVlZDoyMCxzY29wZToiZGVmYXVsdCIsdG9sZXJhbmNlOiJpbnRlcnNlY3QiLHpJbmRleDoxZTN9LF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnM7dGhpcy5jb250YWluZXJDYWNoZT17fSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXNvcnRhYmxlIiksdGhpcy5yZWZyZXNoKCksdGhpcy5mbG9hdGluZz10aGlzLml0ZW1zLmxlbmd0aD9hLmF4aXM9PT0ieCJ8fC9sZWZ0fHJpZ2h0Ly50ZXN0KHRoaXMuaXRlbXNbMF0uaXRlbS5jc3MoImZsb2F0IikpfHwvaW5saW5lfHRhYmxlLWNlbGwvLnRlc3QodGhpcy5pdGVtc1swXS5pdGVtLmNzcygiZGlzcGxheSIpKTohMSx0aGlzLm9mZnNldD10aGlzLmVsZW1lbnQub2Zmc2V0KCksdGhpcy5fbW91c2VJbml0KCksdGhpcy5yZWFkeT0hMH0sZGVzdHJveTpmdW5jdGlvbigpe2EuV2lkZ2V0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zb3J0YWJsZSB1aS1zb3J0YWJsZS1kaXNhYmxlZCIpLHRoaXMuX21vdXNlRGVzdHJveSgpO2Zvcih2YXIgYj10aGlzLml0ZW1zLmxlbmd0aC0xO2I+PTA7Yi0tKXRoaXMuaXRlbXNbYl0uaXRlbS5yZW1vdmVEYXRhKHRoaXMud2lkZ2V0TmFtZSsiLWl0ZW0iKTtyZXR1cm4gdGhpc30sX3NldE9wdGlvbjpmdW5jdGlvbihiLGMpe2I9PT0iZGlzYWJsZWQiPyh0aGlzLm9wdGlvbnNbYl09Yyx0aGlzLndpZGdldCgpW2M/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXSgidWktc29ydGFibGUtZGlzYWJsZWQiKSk6YS5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9dGhpcztpZih0aGlzLnJldmVydGluZylyZXR1cm4hMTtpZih0aGlzLm9wdGlvbnMuZGlzYWJsZWR8fHRoaXMub3B0aW9ucy50eXBlPT0ic3RhdGljIilyZXR1cm4hMTt0aGlzLl9yZWZyZXNoSXRlbXMoYik7dmFyIGU9bnVsbCxmPXRoaXMsZz1hKGIudGFyZ2V0KS5wYXJlbnRzKCkuZWFjaChmdW5jdGlvbigpe2lmKGEuZGF0YSh0aGlzLGQud2lkZ2V0TmFtZSsiLWl0ZW0iKT09ZilyZXR1cm4gZT1hKHRoaXMpLCExfSk7YS5kYXRhKGIudGFyZ2V0LGQud2lkZ2V0TmFtZSsiLWl0ZW0iKT09ZiYmKGU9YShiLnRhcmdldCkpO2lmKCFlKXJldHVybiExO2lmKHRoaXMub3B0aW9ucy5oYW5kbGUmJiFjKXt2YXIgaD0hMTthKHRoaXMub3B0aW9ucy5oYW5kbGUsZSkuZmluZCgiKiIpLmFuZFNlbGYoKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcz09Yi50YXJnZXQmJihoPSEwKX0pO2lmKCFoKXJldHVybiExfXJldHVybiB0aGlzLmN1cnJlbnRJdGVtPWUsdGhpcy5fcmVtb3ZlQ3VycmVudHNGcm9tSXRlbXMoKSwhMH0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oYixjLGQpe3ZhciBlPXRoaXMub3B0aW9ucyxmPXRoaXM7dGhpcy5jdXJyZW50Q29udGFpbmVyPXRoaXMsdGhpcy5yZWZyZXNoUG9zaXRpb25zKCksdGhpcy5oZWxwZXI9dGhpcy5fY3JlYXRlSGVscGVyKGIpLHRoaXMuX2NhY2hlSGVscGVyUHJvcG9ydGlvbnMoKSx0aGlzLl9jYWNoZU1hcmdpbnMoKSx0aGlzLnNjcm9sbFBhcmVudD10aGlzLmhlbHBlci5zY3JvbGxQYXJlbnQoKSx0aGlzLm9mZnNldD10aGlzLmN1cnJlbnRJdGVtLm9mZnNldCgpLHRoaXMub2Zmc2V0PXt0b3A6dGhpcy5vZmZzZXQudG9wLXRoaXMubWFyZ2lucy50b3AsbGVmdDp0aGlzLm9mZnNldC5sZWZ0LXRoaXMubWFyZ2lucy5sZWZ0fSxhLmV4dGVuZCh0aGlzLm9mZnNldCx7Y2xpY2s6e2xlZnQ6Yi5wYWdlWC10aGlzLm9mZnNldC5sZWZ0LHRvcDpiLnBhZ2VZLXRoaXMub2Zmc2V0LnRvcH0scGFyZW50OnRoaXMuX2dldFBhcmVudE9mZnNldCgpLHJlbGF0aXZlOnRoaXMuX2dldFJlbGF0aXZlT2Zmc2V0KCl9KSx0aGlzLmhlbHBlci5jc3MoInBvc2l0aW9uIiwiYWJzb2x1dGUiKSx0aGlzLmNzc1Bvc2l0aW9uPXRoaXMuaGVscGVyLmNzcygicG9zaXRpb24iKSx0aGlzLm9yaWdpbmFsUG9zaXRpb249dGhpcy5fZ2VuZXJhdGVQb3NpdGlvbihiKSx0aGlzLm9yaWdpbmFsUGFnZVg9Yi5wYWdlWCx0aGlzLm9yaWdpbmFsUGFnZVk9Yi5wYWdlWSxlLmN1cnNvckF0JiZ0aGlzLl9hZGp1c3RPZmZzZXRGcm9tSGVscGVyKGUuY3Vyc29yQXQpLHRoaXMuZG9tUG9zaXRpb249e3ByZXY6dGhpcy5jdXJyZW50SXRlbS5wcmV2KClbMF0scGFyZW50OnRoaXMuY3VycmVudEl0ZW0ucGFyZW50KClbMF19LHRoaXMuaGVscGVyWzBdIT10aGlzLmN1cnJlbnRJdGVtWzBdJiZ0aGlzLmN1cnJlbnRJdGVtLmhpZGUoKSx0aGlzLl9jcmVhdGVQbGFjZWhvbGRlcigpLGUuY29udGFpbm1lbnQmJnRoaXMuX3NldENvbnRhaW5tZW50KCksZS5jdXJzb3ImJihhKCJib2R5IikuY3NzKCJjdXJzb3IiKSYmKHRoaXMuX3N0b3JlZEN1cnNvcj1hKCJib2R5IikuY3NzKCJjdXJzb3IiKSksYSgiYm9keSIpLmNzcygiY3Vyc29yIixlLmN1cnNvcikpLGUub3BhY2l0eSYmKHRoaXMuaGVscGVyLmNzcygib3BhY2l0eSIpJiYodGhpcy5fc3RvcmVkT3BhY2l0eT10aGlzLmhlbHBlci5jc3MoIm9wYWNpdHkiKSksdGhpcy5oZWxwZXIuY3NzKCJvcGFjaXR5IixlLm9wYWNpdHkpKSxlLnpJbmRleCYmKHRoaXMuaGVscGVyLmNzcygiekluZGV4IikmJih0aGlzLl9zdG9yZWRaSW5kZXg9dGhpcy5oZWxwZXIuY3NzKCJ6SW5kZXgiKSksdGhpcy5oZWxwZXIuY3NzKCJ6SW5kZXgiLGUuekluZGV4KSksdGhpcy5zY3JvbGxQYXJlbnRbMF0hPWRvY3VtZW50JiZ0aGlzLnNjcm9sbFBhcmVudFswXS50YWdOYW1lIT0iSFRNTCImJih0aGlzLm92ZXJmbG93T2Zmc2V0PXRoaXMuc2Nyb2xsUGFyZW50Lm9mZnNldCgpKSx0aGlzLl90cmlnZ2VyKCJzdGFydCIsYix0aGlzLl91aUhhc2goKSksdGhpcy5fcHJlc2VydmVIZWxwZXJQcm9wb3J0aW9uc3x8dGhpcy5fY2FjaGVIZWxwZXJQcm9wb3J0aW9ucygpO2lmKCFkKWZvcih2YXIgZz10aGlzLmNvbnRhaW5lcnMubGVuZ3RoLTE7Zz49MDtnLS0pdGhpcy5jb250YWluZXJzW2ddLl90cmlnZ2VyKCJhY3RpdmF0ZSIsYixmLl91aUhhc2godGhpcykpO3JldHVybiBhLnVpLmRkbWFuYWdlciYmKGEudWkuZGRtYW5hZ2VyLmN1cnJlbnQ9dGhpcyksYS51aS5kZG1hbmFnZXImJiFlLmRyb3BCZWhhdmlvdXImJmEudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKHRoaXMsYiksdGhpcy5kcmFnZ2luZz0hMCx0aGlzLmhlbHBlci5hZGRDbGFzcygidWktc29ydGFibGUtaGVscGVyIiksdGhpcy5fbW91c2VEcmFnKGIpLCEwfSxfbW91c2VEcmFnOmZ1bmN0aW9uKGIpe3RoaXMucG9zaXRpb249dGhpcy5fZ2VuZXJhdGVQb3NpdGlvbihiKSx0aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpLHRoaXMubGFzdFBvc2l0aW9uQWJzfHwodGhpcy5sYXN0UG9zaXRpb25BYnM9dGhpcy5wb3NpdGlvbkFicyk7aWYodGhpcy5vcHRpb25zLnNjcm9sbCl7dmFyIGM9dGhpcy5vcHRpb25zLGQ9ITE7dGhpcy5zY3JvbGxQYXJlbnRbMF0hPWRvY3VtZW50JiZ0aGlzLnNjcm9sbFBhcmVudFswXS50YWdOYW1lIT0iSFRNTCI/KHRoaXMub3ZlcmZsb3dPZmZzZXQudG9wK3RoaXMuc2Nyb2xsUGFyZW50WzBdLm9mZnNldEhlaWdodC1iLnBhZ2VZPGMuc2Nyb2xsU2Vuc2l0aXZpdHk/dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wPWQ9dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wK2Muc2Nyb2xsU3BlZWQ6Yi5wYWdlWS10aGlzLm92ZXJmbG93T2Zmc2V0LnRvcDxjLnNjcm9sbFNlbnNpdGl2aXR5JiYodGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wPWQ9dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wLWMuc2Nyb2xsU3BlZWQpLHRoaXMub3ZlcmZsb3dPZmZzZXQubGVmdCt0aGlzLnNjcm9sbFBhcmVudFswXS5vZmZzZXRXaWR0aC1iLnBhZ2VYPGMuc2Nyb2xsU2Vuc2l0aXZpdHk/dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsTGVmdD1kPXRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQrYy5zY3JvbGxTcGVlZDpiLnBhZ2VYLXRoaXMub3ZlcmZsb3dPZmZzZXQubGVmdDxjLnNjcm9sbFNlbnNpdGl2aXR5JiYodGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsTGVmdD1kPXRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQtYy5zY3JvbGxTcGVlZCkpOihiLnBhZ2VZLWEoZG9jdW1lbnQpLnNjcm9sbFRvcCgpPGMuc2Nyb2xsU2Vuc2l0aXZpdHk/ZD1hKGRvY3VtZW50KS5zY3JvbGxUb3AoYShkb2N1bWVudCkuc2Nyb2xsVG9wKCktYy5zY3JvbGxTcGVlZCk6YSh3aW5kb3cpLmhlaWdodCgpLShiLnBhZ2VZLWEoZG9jdW1lbnQpLnNjcm9sbFRvcCgpKTxjLnNjcm9sbFNlbnNpdGl2aXR5JiYoZD1hKGRvY3VtZW50KS5zY3JvbGxUb3AoYShkb2N1bWVudCkuc2Nyb2xsVG9wKCkrYy5zY3JvbGxTcGVlZCkpLGIucGFnZVgtYShkb2N1bWVudCkuc2Nyb2xsTGVmdCgpPGMuc2Nyb2xsU2Vuc2l0aXZpdHk/ZD1hKGRvY3VtZW50KS5zY3JvbGxMZWZ0KGEoZG9jdW1lbnQpLnNjcm9sbExlZnQoKS1jLnNjcm9sbFNwZWVkKTphKHdpbmRvdykud2lkdGgoKS0oYi5wYWdlWC1hKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkpPGMuc2Nyb2xsU2Vuc2l0aXZpdHkmJihkPWEoZG9jdW1lbnQpLnNjcm9sbExlZnQoYShkb2N1bWVudCkuc2Nyb2xsTGVmdCgpK2Muc2Nyb2xsU3BlZWQpKSksZCE9PSExJiZhLnVpLmRkbWFuYWdlciYmIWMuZHJvcEJlaGF2aW91ciYmYS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHModGhpcyxiKX10aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpO2lmKCF0aGlzLm9wdGlvbnMuYXhpc3x8dGhpcy5vcHRpb25zLmF4aXMhPSJ5Iil0aGlzLmhlbHBlclswXS5zdHlsZS5sZWZ0PXRoaXMucG9zaXRpb24ubGVmdCsicHgiO2lmKCF0aGlzLm9wdGlvbnMuYXhpc3x8dGhpcy5vcHRpb25zLmF4aXMhPSJ4Iil0aGlzLmhlbHBlclswXS5zdHlsZS50b3A9dGhpcy5wb3NpdGlvbi50b3ArInB4Ijtmb3IodmFyIGU9dGhpcy5pdGVtcy5sZW5ndGgtMTtlPj0wO2UtLSl7dmFyIGY9dGhpcy5pdGVtc1tlXSxnPWYuaXRlbVswXSxoPXRoaXMuX2ludGVyc2VjdHNXaXRoUG9pbnRlcihmKTtpZighaCljb250aW51ZTtpZihmLmluc3RhbmNlIT09dGhpcy5jdXJyZW50Q29udGFpbmVyKWNvbnRpbnVlO2lmKGchPXRoaXMuY3VycmVudEl0ZW1bMF0mJnRoaXMucGxhY2Vob2xkZXJbaD09MT8ibmV4dCI6InByZXYiXSgpWzBdIT1nJiYhYS51aS5jb250YWlucyh0aGlzLnBsYWNlaG9sZGVyWzBdLGcpJiYodGhpcy5vcHRpb25zLnR5cGU9PSJzZW1pLWR5bmFtaWMiPyFhLnVpLmNvbnRhaW5zKHRoaXMuZWxlbWVudFswXSxnKTohMCkpe3RoaXMuZGlyZWN0aW9uPWg9PTE/ImRvd24iOiJ1cCI7aWYodGhpcy5vcHRpb25zLnRvbGVyYW5jZT09InBvaW50ZXIifHx0aGlzLl9pbnRlcnNlY3RzV2l0aFNpZGVzKGYpKXRoaXMuX3JlYXJyYW5nZShiLGYpO2Vsc2UgYnJlYWs7dGhpcy5fdHJpZ2dlcigiY2hhbmdlIixiLHRoaXMuX3VpSGFzaCgpKTticmVha319cmV0dXJuIHRoaXMuX2NvbnRhY3RDb250YWluZXJzKGIpLGEudWkuZGRtYW5hZ2VyJiZhLnVpLmRkbWFuYWdlci5kcmFnKHRoaXMsYiksdGhpcy5fdHJpZ2dlcigic29ydCIsYix0aGlzLl91aUhhc2goKSksdGhpcy5sYXN0UG9zaXRpb25BYnM9dGhpcy5wb3NpdGlvbkFicywhMX0sX21vdXNlU3RvcDpmdW5jdGlvbihiLGMpe2lmKCFiKXJldHVybjthLnVpLmRkbWFuYWdlciYmIXRoaXMub3B0aW9ucy5kcm9wQmVoYXZpb3VyJiZhLnVpLmRkbWFuYWdlci5kcm9wKHRoaXMsYik7aWYodGhpcy5vcHRpb25zLnJldmVydCl7dmFyIGQ9dGhpcyxlPWQucGxhY2Vob2xkZXIub2Zmc2V0KCk7ZC5yZXZlcnRpbmc9ITAsYSh0aGlzLmhlbHBlcikuYW5pbWF0ZSh7bGVmdDplLmxlZnQtdGhpcy5vZmZzZXQucGFyZW50LmxlZnQtZC5tYXJnaW5zLmxlZnQrKHRoaXMub2Zmc2V0UGFyZW50WzBdPT1kb2N1bWVudC5ib2R5PzA6dGhpcy5vZmZzZXRQYXJlbnRbMF0uc2Nyb2xsTGVmdCksdG9wOmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3AtZC5tYXJnaW5zLnRvcCsodGhpcy5vZmZzZXRQYXJlbnRbMF09PWRvY3VtZW50LmJvZHk/MDp0aGlzLm9mZnNldFBhcmVudFswXS5zY3JvbGxUb3ApfSxwYXJzZUludCh0aGlzLm9wdGlvbnMucmV2ZXJ0LDEwKXx8NTAwLGZ1bmN0aW9uKCl7ZC5fY2xlYXIoYil9KX1lbHNlIHRoaXMuX2NsZWFyKGIsYyk7cmV0dXJuITF9LGNhbmNlbDpmdW5jdGlvbigpe3ZhciBiPXRoaXM7aWYodGhpcy5kcmFnZ2luZyl7dGhpcy5fbW91c2VVcCh7dGFyZ2V0Om51bGx9KSx0aGlzLm9wdGlvbnMuaGVscGVyPT0ib3JpZ2luYWwiP3RoaXMuY3VycmVudEl0ZW0uY3NzKHRoaXMuX3N0b3JlZENTUykucmVtb3ZlQ2xhc3MoInVpLXNvcnRhYmxlLWhlbHBlciIpOnRoaXMuY3VycmVudEl0ZW0uc2hvdygpO2Zvcih2YXIgYz10aGlzLmNvbnRhaW5lcnMubGVuZ3RoLTE7Yz49MDtjLS0pdGhpcy5jb250YWluZXJzW2NdLl90cmlnZ2VyKCJkZWFjdGl2YXRlIixudWxsLGIuX3VpSGFzaCh0aGlzKSksdGhpcy5jb250YWluZXJzW2NdLmNvbnRhaW5lckNhY2hlLm92ZXImJih0aGlzLmNvbnRhaW5lcnNbY10uX3RyaWdnZXIoIm91dCIsbnVsbCxiLl91aUhhc2godGhpcykpLHRoaXMuY29udGFpbmVyc1tjXS5jb250YWluZXJDYWNoZS5vdmVyPTApfXJldHVybiB0aGlzLnBsYWNlaG9sZGVyJiYodGhpcy5wbGFjZWhvbGRlclswXS5wYXJlbnROb2RlJiZ0aGlzLnBsYWNlaG9sZGVyWzBdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5wbGFjZWhvbGRlclswXSksdGhpcy5vcHRpb25zLmhlbHBlciE9Im9yaWdpbmFsIiYmdGhpcy5oZWxwZXImJnRoaXMuaGVscGVyWzBdLnBhcmVudE5vZGUmJnRoaXMuaGVscGVyLnJlbW92ZSgpLGEuZXh0ZW5kKHRoaXMse2hlbHBlcjpudWxsLGRyYWdnaW5nOiExLHJldmVydGluZzohMSxfbm9GaW5hbFNvcnQ6bnVsbH0pLHRoaXMuZG9tUG9zaXRpb24ucHJldj9hKHRoaXMuZG9tUG9zaXRpb24ucHJldikuYWZ0ZXIodGhpcy5jdXJyZW50SXRlbSk6YSh0aGlzLmRvbVBvc2l0aW9uLnBhcmVudCkucHJlcGVuZCh0aGlzLmN1cnJlbnRJdGVtKSksdGhpc30sc2VyaWFsaXplOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMuX2dldEl0ZW1zQXNqUXVlcnkoYiYmYi5jb25uZWN0ZWQpLGQ9W107cmV0dXJuIGI9Ynx8e30sYShjKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGM9KGEoYi5pdGVtfHx0aGlzKS5hdHRyKGIuYXR0cmlidXRlfHwiaWQiKXx8IiIpLm1hdGNoKGIuZXhwcmVzc2lvbnx8LyguKylbLT1fXSguKykvKTtjJiZkLnB1c2goKGIua2V5fHxjWzFdKyJbXSIpKyI9IisoYi5rZXkmJmIuZXhwcmVzc2lvbj9jWzFdOmNbMl0pKX0pLCFkLmxlbmd0aCYmYi5rZXkmJmQucHVzaChiLmtleSsiPSIpLGQuam9pbigiJiIpfSx0b0FycmF5OmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMuX2dldEl0ZW1zQXNqUXVlcnkoYiYmYi5jb25uZWN0ZWQpLGQ9W107cmV0dXJuIGI9Ynx8e30sYy5lYWNoKGZ1bmN0aW9uKCl7ZC5wdXNoKGEoYi5pdGVtfHx0aGlzKS5hdHRyKGIuYXR0cmlidXRlfHwiaWQiKXx8IiIpfSksZH0sX2ludGVyc2VjdHNXaXRoOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucG9zaXRpb25BYnMubGVmdCxjPWIrdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCxkPXRoaXMucG9zaXRpb25BYnMudG9wLGU9ZCt0aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCxmPWEubGVmdCxnPWYrYS53aWR0aCxoPWEudG9wLGk9aCthLmhlaWdodCxqPXRoaXMub2Zmc2V0LmNsaWNrLnRvcCxrPXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQsbD1kK2o+aCYmZCtqPGkmJmIraz5mJiZiK2s8ZztyZXR1cm4gdGhpcy5vcHRpb25zLnRvbGVyYW5jZT09InBvaW50ZXIifHx0aGlzLm9wdGlvbnMuZm9yY2VQb2ludGVyRm9yQ29udGFpbmVyc3x8dGhpcy5vcHRpb25zLnRvbGVyYW5jZSE9InBvaW50ZXIiJiZ0aGlzLmhlbHBlclByb3BvcnRpb25zW3RoaXMuZmxvYXRpbmc/IndpZHRoIjoiaGVpZ2h0Il0+YVt0aGlzLmZsb2F0aW5nPyJ3aWR0aCI6ImhlaWdodCJdP2w6ZjxiK3RoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgvMiYmYy10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLzI8ZyYmaDxkK3RoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LzImJmUtdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQvMjxpfSxfaW50ZXJzZWN0c1dpdGhQb2ludGVyOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMub3B0aW9ucy5heGlzPT09IngifHxhLnVpLmlzT3ZlckF4aXModGhpcy5wb3NpdGlvbkFicy50b3ArdGhpcy5vZmZzZXQuY2xpY2sudG9wLGIudG9wLGIuaGVpZ2h0KSxkPXRoaXMub3B0aW9ucy5heGlzPT09InkifHxhLnVpLmlzT3ZlckF4aXModGhpcy5wb3NpdGlvbkFicy5sZWZ0K3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQsYi5sZWZ0LGIud2lkdGgpLGU9YyYmZCxmPXRoaXMuX2dldERyYWdWZXJ0aWNhbERpcmVjdGlvbigpLGc9dGhpcy5fZ2V0RHJhZ0hvcml6b250YWxEaXJlY3Rpb24oKTtyZXR1cm4gZT90aGlzLmZsb2F0aW5nP2cmJmc9PSJyaWdodCJ8fGY9PSJkb3duIj8yOjE6ZiYmKGY9PSJkb3duIj8yOjEpOiExfSxfaW50ZXJzZWN0c1dpdGhTaWRlczpmdW5jdGlvbihiKXt2YXIgYz1hLnVpLmlzT3ZlckF4aXModGhpcy5wb3NpdGlvbkFicy50b3ArdGhpcy5vZmZzZXQuY2xpY2sudG9wLGIudG9wK2IuaGVpZ2h0LzIsYi5oZWlnaHQpLGQ9YS51aS5pc092ZXJBeGlzKHRoaXMucG9zaXRpb25BYnMubGVmdCt0aGlzLm9mZnNldC5jbGljay5sZWZ0LGIubGVmdCtiLndpZHRoLzIsYi53aWR0aCksZT10aGlzLl9nZXREcmFnVmVydGljYWxEaXJlY3Rpb24oKSxmPXRoaXMuX2dldERyYWdIb3Jpem9udGFsRGlyZWN0aW9uKCk7cmV0dXJuIHRoaXMuZmxvYXRpbmcmJmY/Zj09InJpZ2h0IiYmZHx8Zj09ImxlZnQiJiYhZDplJiYoZT09ImRvd24iJiZjfHxlPT0idXAiJiYhYyl9LF9nZXREcmFnVmVydGljYWxEaXJlY3Rpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBvc2l0aW9uQWJzLnRvcC10aGlzLmxhc3RQb3NpdGlvbkFicy50b3A7cmV0dXJuIGEhPTAmJihhPjA/ImRvd24iOiJ1cCIpfSxfZ2V0RHJhZ0hvcml6b250YWxEaXJlY3Rpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBvc2l0aW9uQWJzLmxlZnQtdGhpcy5sYXN0UG9zaXRpb25BYnMubGVmdDtyZXR1cm4gYSE9MCYmKGE+MD8icmlnaHQiOiJsZWZ0Iil9LHJlZnJlc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX3JlZnJlc2hJdGVtcyhhKSx0aGlzLnJlZnJlc2hQb3NpdGlvbnMoKSx0aGlzfSxfY29ubmVjdFdpdGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnM7cmV0dXJuIGEuY29ubmVjdFdpdGguY29uc3RydWN0b3I9PVN0cmluZz9bYS5jb25uZWN0V2l0aF06YS5jb25uZWN0V2l0aH0sX2dldEl0ZW1zQXNqUXVlcnk6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcyxkPVtdLGU9W10sZj10aGlzLl9jb25uZWN0V2l0aCgpO2lmKGYmJmIpZm9yKHZhciBnPWYubGVuZ3RoLTE7Zz49MDtnLS0pe3ZhciBoPWEoZltnXSk7Zm9yKHZhciBpPWgubGVuZ3RoLTE7aT49MDtpLS0pe3ZhciBqPWEuZGF0YShoW2ldLHRoaXMud2lkZ2V0TmFtZSk7aiYmaiE9dGhpcyYmIWoub3B0aW9ucy5kaXNhYmxlZCYmZS5wdXNoKFthLmlzRnVuY3Rpb24oai5vcHRpb25zLml0ZW1zKT9qLm9wdGlvbnMuaXRlbXMuY2FsbChqLmVsZW1lbnQpOmEoai5vcHRpb25zLml0ZW1zLGouZWxlbWVudCkubm90KCIudWktc29ydGFibGUtaGVscGVyIikubm90KCIudWktc29ydGFibGUtcGxhY2Vob2xkZXIiKSxqXSl9fWUucHVzaChbYS5pc0Z1bmN0aW9uKHRoaXMub3B0aW9ucy5pdGVtcyk/dGhpcy5vcHRpb25zLml0ZW1zLmNhbGwodGhpcy5lbGVtZW50LG51bGwse29wdGlvbnM6dGhpcy5vcHRpb25zLGl0ZW06dGhpcy5jdXJyZW50SXRlbX0pOmEodGhpcy5vcHRpb25zLml0ZW1zLHRoaXMuZWxlbWVudCkubm90KCIudWktc29ydGFibGUtaGVscGVyIikubm90KCIudWktc29ydGFibGUtcGxhY2Vob2xkZXIiKSx0aGlzXSk7Zm9yKHZhciBnPWUubGVuZ3RoLTE7Zz49MDtnLS0pZVtnXVswXS5lYWNoKGZ1bmN0aW9uKCl7ZC5wdXNoKHRoaXMpfSk7cmV0dXJuIGEoZCl9LF9yZW1vdmVDdXJyZW50c0Zyb21JdGVtczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuY3VycmVudEl0ZW0uZmluZCgiOmRhdGEoIit0aGlzLndpZGdldE5hbWUrIi1pdGVtKSIpO2Zvcih2YXIgYj0wO2I8dGhpcy5pdGVtcy5sZW5ndGg7YisrKWZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWFbY109PXRoaXMuaXRlbXNbYl0uaXRlbVswXSYmdGhpcy5pdGVtcy5zcGxpY2UoYiwxKX0sX3JlZnJlc2hJdGVtczpmdW5jdGlvbihiKXt0aGlzLml0ZW1zPVtdLHRoaXMuY29udGFpbmVycz1bdGhpc107dmFyIGM9dGhpcy5pdGVtcyxkPXRoaXMsZT1bW2EuaXNGdW5jdGlvbih0aGlzLm9wdGlvbnMuaXRlbXMpP3RoaXMub3B0aW9ucy5pdGVtcy5jYWxsKHRoaXMuZWxlbWVudFswXSxiLHtpdGVtOnRoaXMuY3VycmVudEl0ZW19KTphKHRoaXMub3B0aW9ucy5pdGVtcyx0aGlzLmVsZW1lbnQpLHRoaXNdXSxmPXRoaXMuX2Nvbm5lY3RXaXRoKCk7aWYoZiYmdGhpcy5yZWFkeSlmb3IodmFyIGc9Zi5sZW5ndGgtMTtnPj0wO2ctLSl7dmFyIGg9YShmW2ddKTtmb3IodmFyIGk9aC5sZW5ndGgtMTtpPj0wO2ktLSl7dmFyIGo9YS5kYXRhKGhbaV0sdGhpcy53aWRnZXROYW1lKTtqJiZqIT10aGlzJiYhai5vcHRpb25zLmRpc2FibGVkJiYoZS5wdXNoKFthLmlzRnVuY3Rpb24oai5vcHRpb25zLml0ZW1zKT9qLm9wdGlvbnMuaXRlbXMuY2FsbChqLmVsZW1lbnRbMF0sYix7aXRlbTp0aGlzLmN1cnJlbnRJdGVtfSk6YShqLm9wdGlvbnMuaXRlbXMsai5lbGVtZW50KSxqXSksdGhpcy5jb250YWluZXJzLnB1c2goaikpfX1mb3IodmFyIGc9ZS5sZW5ndGgtMTtnPj0wO2ctLSl7dmFyIGs9ZVtnXVsxXSxsPWVbZ11bMF07Zm9yKHZhciBpPTAsbT1sLmxlbmd0aDtpPG07aSsrKXt2YXIgbj1hKGxbaV0pO24uZGF0YSh0aGlzLndpZGdldE5hbWUrIi1pdGVtIixrKSxjLnB1c2goe2l0ZW06bixpbnN0YW5jZTprLHdpZHRoOjAsaGVpZ2h0OjAsbGVmdDowLHRvcDowfSl9fX0scmVmcmVzaFBvc2l0aW9uczpmdW5jdGlvbihiKXt0aGlzLm9mZnNldFBhcmVudCYmdGhpcy5oZWxwZXImJih0aGlzLm9mZnNldC5wYXJlbnQ9dGhpcy5fZ2V0UGFyZW50T2Zmc2V0KCkpO2Zvcih2YXIgYz10aGlzLml0ZW1zLmxlbmd0aC0xO2M+PTA7Yy0tKXt2YXIgZD10aGlzLml0ZW1zW2NdO2lmKGQuaW5zdGFuY2UhPXRoaXMuY3VycmVudENvbnRhaW5lciYmdGhpcy5jdXJyZW50Q29udGFpbmVyJiZkLml0ZW1bMF0hPXRoaXMuY3VycmVudEl0ZW1bMF0pY29udGludWU7dmFyIGU9dGhpcy5vcHRpb25zLnRvbGVyYW5jZUVsZW1lbnQ/YSh0aGlzLm9wdGlvbnMudG9sZXJhbmNlRWxlbWVudCxkLml0ZW0pOmQuaXRlbTtifHwoZC53aWR0aD1lLm91dGVyV2lkdGgoKSxkLmhlaWdodD1lLm91dGVySGVpZ2h0KCkpO3ZhciBmPWUub2Zmc2V0KCk7ZC5sZWZ0PWYubGVmdCxkLnRvcD1mLnRvcH1pZih0aGlzLm9wdGlvbnMuY3VzdG9tJiZ0aGlzLm9wdGlvbnMuY3VzdG9tLnJlZnJlc2hDb250YWluZXJzKXRoaXMub3B0aW9ucy5jdXN0b20ucmVmcmVzaENvbnRhaW5lcnMuY2FsbCh0aGlzKTtlbHNlIGZvcih2YXIgYz10aGlzLmNvbnRhaW5lcnMubGVuZ3RoLTE7Yz49MDtjLS0pe3ZhciBmPXRoaXMuY29udGFpbmVyc1tjXS5lbGVtZW50Lm9mZnNldCgpO3RoaXMuY29udGFpbmVyc1tjXS5jb250YWluZXJDYWNoZS5sZWZ0PWYubGVmdCx0aGlzLmNvbnRhaW5lcnNbY10uY29udGFpbmVyQ2FjaGUudG9wPWYudG9wLHRoaXMuY29udGFpbmVyc1tjXS5jb250YWluZXJDYWNoZS53aWR0aD10aGlzLmNvbnRhaW5lcnNbY10uZWxlbWVudC5vdXRlcldpZHRoKCksdGhpcy5jb250YWluZXJzW2NdLmNvbnRhaW5lckNhY2hlLmhlaWdodD10aGlzLmNvbnRhaW5lcnNbY10uZWxlbWVudC5vdXRlckhlaWdodCgpfXJldHVybiB0aGlzfSxfY3JlYXRlUGxhY2Vob2xkZXI6ZnVuY3Rpb24oYil7dmFyIGM9Ynx8dGhpcyxkPWMub3B0aW9ucztpZighZC5wbGFjZWhvbGRlcnx8ZC5wbGFjZWhvbGRlci5jb25zdHJ1Y3Rvcj09U3RyaW5nKXt2YXIgZT1kLnBsYWNlaG9sZGVyO2QucGxhY2Vob2xkZXI9e2VsZW1lbnQ6ZnVuY3Rpb24oKXt2YXIgYj1hKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYy5jdXJyZW50SXRlbVswXS5ub2RlTmFtZSkpLmFkZENsYXNzKGV8fGMuY3VycmVudEl0ZW1bMF0uY2xhc3NOYW1lKyIgdWktc29ydGFibGUtcGxhY2Vob2xkZXIiKS5yZW1vdmVDbGFzcygidWktc29ydGFibGUtaGVscGVyIilbMF07cmV0dXJuIGV8fChiLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIpLGJ9LHVwZGF0ZTpmdW5jdGlvbihhLGIpe2lmKGUmJiFkLmZvcmNlUGxhY2Vob2xkZXJTaXplKXJldHVybjtiLmhlaWdodCgpfHxiLmhlaWdodChjLmN1cnJlbnRJdGVtLmlubmVySGVpZ2h0KCktcGFyc2VJbnQoYy5jdXJyZW50SXRlbS5jc3MoInBhZGRpbmdUb3AiKXx8MCwxMCktcGFyc2VJbnQoYy5jdXJyZW50SXRlbS5jc3MoInBhZGRpbmdCb3R0b20iKXx8MCwxMCkpLGIud2lkdGgoKXx8Yi53aWR0aChjLmN1cnJlbnRJdGVtLmlubmVyV2lkdGgoKS1wYXJzZUludChjLmN1cnJlbnRJdGVtLmNzcygicGFkZGluZ0xlZnQiKXx8MCwxMCktcGFyc2VJbnQoYy5jdXJyZW50SXRlbS5jc3MoInBhZGRpbmdSaWdodCIpfHwwLDEwKSl9fX1jLnBsYWNlaG9sZGVyPWEoZC5wbGFjZWhvbGRlci5lbGVtZW50LmNhbGwoYy5lbGVtZW50LGMuY3VycmVudEl0ZW0pKSxjLmN1cnJlbnRJdGVtLmFmdGVyKGMucGxhY2Vob2xkZXIpLGQucGxhY2Vob2xkZXIudXBkYXRlKGMsYy5wbGFjZWhvbGRlcil9LF9jb250YWN0Q29udGFpbmVyczpmdW5jdGlvbihiKXt2YXIgYz1udWxsLGQ9bnVsbDtmb3IodmFyIGU9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO2U+PTA7ZS0tKXtpZihhLnVpLmNvbnRhaW5zKHRoaXMuY3VycmVudEl0ZW1bMF0sdGhpcy5jb250YWluZXJzW2VdLmVsZW1lbnRbMF0pKWNvbnRpbnVlO2lmKHRoaXMuX2ludGVyc2VjdHNXaXRoKHRoaXMuY29udGFpbmVyc1tlXS5jb250YWluZXJDYWNoZSkpe2lmKGMmJmEudWkuY29udGFpbnModGhpcy5jb250YWluZXJzW2VdLmVsZW1lbnRbMF0sYy5lbGVtZW50WzBdKSljb250aW51ZTtjPXRoaXMuY29udGFpbmVyc1tlXSxkPWV9ZWxzZSB0aGlzLmNvbnRhaW5lcnNbZV0uY29udGFpbmVyQ2FjaGUub3ZlciYmKHRoaXMuY29udGFpbmVyc1tlXS5fdHJpZ2dlcigib3V0IixiLHRoaXMuX3VpSGFzaCh0aGlzKSksdGhpcy5jb250YWluZXJzW2VdLmNvbnRhaW5lckNhY2hlLm92ZXI9MCl9aWYoIWMpcmV0dXJuO2lmKHRoaXMuY29udGFpbmVycy5sZW5ndGg9PT0xKXRoaXMuY29udGFpbmVyc1tkXS5fdHJpZ2dlcigib3ZlciIsYix0aGlzLl91aUhhc2godGhpcykpLHRoaXMuY29udGFpbmVyc1tkXS5jb250YWluZXJDYWNoZS5vdmVyPTE7ZWxzZSBpZih0aGlzLmN1cnJlbnRDb250YWluZXIhPXRoaXMuY29udGFpbmVyc1tkXSl7dmFyIGY9MWU0LGc9bnVsbCxoPXRoaXMucG9zaXRpb25BYnNbdGhpcy5jb250YWluZXJzW2RdLmZsb2F0aW5nPyJsZWZ0IjoidG9wIl07Zm9yKHZhciBpPXRoaXMuaXRlbXMubGVuZ3RoLTE7aT49MDtpLS0pe2lmKCFhLnVpLmNvbnRhaW5zKHRoaXMuY29udGFpbmVyc1tkXS5lbGVtZW50WzBdLHRoaXMuaXRlbXNbaV0uaXRlbVswXSkpY29udGludWU7dmFyIGo9dGhpcy5jb250YWluZXJzW2RdLmZsb2F0aW5nP3RoaXMuaXRlbXNbaV0uaXRlbS5vZmZzZXQoKS5sZWZ0OnRoaXMuaXRlbXNbaV0uaXRlbS5vZmZzZXQoKS50b3A7TWF0aC5hYnMoai1oKTxmJiYoZj1NYXRoLmFicyhqLWgpLGc9dGhpcy5pdGVtc1tpXSx0aGlzLmRpcmVjdGlvbj1qLWg+MD8iZG93biI6InVwIil9aWYoIWcmJiF0aGlzLm9wdGlvbnMuZHJvcE9uRW1wdHkpcmV0dXJuO3RoaXMuY3VycmVudENvbnRhaW5lcj10aGlzLmNvbnRhaW5lcnNbZF0sZz90aGlzLl9yZWFycmFuZ2UoYixnLG51bGwsITApOnRoaXMuX3JlYXJyYW5nZShiLG51bGwsdGhpcy5jb250YWluZXJzW2RdLmVsZW1lbnQsITApLHRoaXMuX3RyaWdnZXIoImNoYW5nZSIsYix0aGlzLl91aUhhc2goKSksdGhpcy5jb250YWluZXJzW2RdLl90cmlnZ2VyKCJjaGFuZ2UiLGIsdGhpcy5fdWlIYXNoKHRoaXMpKSx0aGlzLm9wdGlvbnMucGxhY2Vob2xkZXIudXBkYXRlKHRoaXMuY3VycmVudENvbnRhaW5lcix0aGlzLnBsYWNlaG9sZGVyKSx0aGlzLmNvbnRhaW5lcnNbZF0uX3RyaWdnZXIoIm92ZXIiLGIsdGhpcy5fdWlIYXNoKHRoaXMpKSx0aGlzLmNvbnRhaW5lcnNbZF0uY29udGFpbmVyQ2FjaGUub3Zlcj0xfX0sX2NyZWF0ZUhlbHBlcjpmdW5jdGlvbihiKXt2YXIgYz10aGlzLm9wdGlvbnMsZD1hLmlzRnVuY3Rpb24oYy5oZWxwZXIpP2EoYy5oZWxwZXIuYXBwbHkodGhpcy5lbGVtZW50WzBdLFtiLHRoaXMuY3VycmVudEl0ZW1dKSk6Yy5oZWxwZXI9PSJjbG9uZSI/dGhpcy5jdXJyZW50SXRlbS5jbG9uZSgpOnRoaXMuY3VycmVudEl0ZW07cmV0dXJuIGQucGFyZW50cygiYm9keSIpLmxlbmd0aHx8YShjLmFwcGVuZFRvIT0icGFyZW50Ij9jLmFwcGVuZFRvOnRoaXMuY3VycmVudEl0ZW1bMF0ucGFyZW50Tm9kZSlbMF0uYXBwZW5kQ2hpbGQoZFswXSksZFswXT09dGhpcy5jdXJyZW50SXRlbVswXSYmKHRoaXMuX3N0b3JlZENTUz17d2lkdGg6dGhpcy5jdXJyZW50SXRlbVswXS5zdHlsZS53aWR0aCxoZWlnaHQ6dGhpcy5jdXJyZW50SXRlbVswXS5zdHlsZS5oZWlnaHQscG9zaXRpb246dGhpcy5jdXJyZW50SXRlbS5jc3MoInBvc2l0aW9uIiksdG9wOnRoaXMuY3VycmVudEl0ZW0uY3NzKCJ0b3AiKSxsZWZ0OnRoaXMuY3VycmVudEl0ZW0uY3NzKCJsZWZ0Iil9KSwoZFswXS5zdHlsZS53aWR0aD09IiJ8fGMuZm9yY2VIZWxwZXJTaXplKSYmZC53aWR0aCh0aGlzLmN1cnJlbnRJdGVtLndpZHRoKCkpLChkWzBdLnN0eWxlLmhlaWdodD09IiJ8fGMuZm9yY2VIZWxwZXJTaXplKSYmZC5oZWlnaHQodGhpcy5jdXJyZW50SXRlbS5oZWlnaHQoKSksZH0sX2FkanVzdE9mZnNldEZyb21IZWxwZXI6ZnVuY3Rpb24oYil7dHlwZW9mIGI9PSJzdHJpbmciJiYoYj1iLnNwbGl0KCIgIikpLGEuaXNBcnJheShiKSYmKGI9e2xlZnQ6K2JbMF0sdG9wOitiWzFdfHwwfSksImxlZnQiaW4gYiYmKHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ9Yi5sZWZ0K3RoaXMubWFyZ2lucy5sZWZ0KSwicmlnaHQiaW4gYiYmKHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ9dGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC1iLnJpZ2h0K3RoaXMubWFyZ2lucy5sZWZ0KSwidG9wImluIGImJih0aGlzLm9mZnNldC5jbGljay50b3A9Yi50b3ArdGhpcy5tYXJnaW5zLnRvcCksImJvdHRvbSJpbiBiJiYodGhpcy5vZmZzZXQuY2xpY2sudG9wPXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LWIuYm90dG9tK3RoaXMubWFyZ2lucy50b3ApfSxfZ2V0UGFyZW50T2Zmc2V0OmZ1bmN0aW9uKCl7dGhpcy5vZmZzZXRQYXJlbnQ9dGhpcy5oZWxwZXIub2Zmc2V0UGFyZW50KCk7dmFyIGI9dGhpcy5vZmZzZXRQYXJlbnQub2Zmc2V0KCk7dGhpcy5jc3NQb3NpdGlvbj09ImFic29sdXRlIiYmdGhpcy5zY3JvbGxQYXJlbnRbMF0hPWRvY3VtZW50JiZhLnVpLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLHRoaXMub2Zmc2V0UGFyZW50WzBdKSYmKGIubGVmdCs9dGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpLGIudG9wKz10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKSk7aWYodGhpcy5vZmZzZXRQYXJlbnRbMF09PWRvY3VtZW50LmJvZHl8fHRoaXMub2Zmc2V0UGFyZW50WzBdLnRhZ05hbWUmJnRoaXMub2Zmc2V0UGFyZW50WzBdLnRhZ05hbWUudG9Mb3dlckNhc2UoKT09Imh0bWwiJiZhLmJyb3dzZXIubXNpZSliPXt0b3A6MCxsZWZ0OjB9O3JldHVybnt0b3A6Yi50b3ArKHBhcnNlSW50KHRoaXMub2Zmc2V0UGFyZW50LmNzcygiYm9yZGVyVG9wV2lkdGgiKSwxMCl8fDApLGxlZnQ6Yi5sZWZ0KyhwYXJzZUludCh0aGlzLm9mZnNldFBhcmVudC5jc3MoImJvcmRlckxlZnRXaWR0aCIpLDEwKXx8MCl9fSxfZ2V0UmVsYXRpdmVPZmZzZXQ6ZnVuY3Rpb24oKXtpZih0aGlzLmNzc1Bvc2l0aW9uPT0icmVsYXRpdmUiKXt2YXIgYT10aGlzLmN1cnJlbnRJdGVtLnBvc2l0aW9uKCk7cmV0dXJue3RvcDphLnRvcC0ocGFyc2VJbnQodGhpcy5oZWxwZXIuY3NzKCJ0b3AiKSwxMCl8fDApK3RoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpLGxlZnQ6YS5sZWZ0LShwYXJzZUludCh0aGlzLmhlbHBlci5jc3MoImxlZnQiKSwxMCl8fDApK3RoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKX19cmV0dXJue3RvcDowLGxlZnQ6MH19LF9jYWNoZU1hcmdpbnM6ZnVuY3Rpb24oKXt0aGlzLm1hcmdpbnM9e2xlZnQ6cGFyc2VJbnQodGhpcy5jdXJyZW50SXRlbS5jc3MoIm1hcmdpbkxlZnQiKSwxMCl8fDAsdG9wOnBhcnNlSW50KHRoaXMuY3VycmVudEl0ZW0uY3NzKCJtYXJnaW5Ub3AiKSwxMCl8fDB9fSxfY2FjaGVIZWxwZXJQcm9wb3J0aW9uczpmdW5jdGlvbigpe3RoaXMuaGVscGVyUHJvcG9ydGlvbnM9e3dpZHRoOnRoaXMuaGVscGVyLm91dGVyV2lkdGgoKSxoZWlnaHQ6dGhpcy5oZWxwZXIub3V0ZXJIZWlnaHQoKX19LF9zZXRDb250YWlubWVudDpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3B0aW9ucztiLmNvbnRhaW5tZW50PT0icGFyZW50IiYmKGIuY29udGFpbm1lbnQ9dGhpcy5oZWxwZXJbMF0ucGFyZW50Tm9kZSk7aWYoYi5jb250YWlubWVudD09ImRvY3VtZW50Inx8Yi5jb250YWlubWVudD09IndpbmRvdyIpdGhpcy5jb250YWlubWVudD1bMC10aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0LXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0LDAtdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3AsYShiLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiP2RvY3VtZW50OndpbmRvdykud2lkdGgoKS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXRoaXMubWFyZ2lucy5sZWZ0LChhKGIuY29udGFpbm1lbnQ9PSJkb2N1bWVudCI/ZG9jdW1lbnQ6d2luZG93KS5oZWlnaHQoKXx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlLnNjcm9sbEhlaWdodCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQtdGhpcy5tYXJnaW5zLnRvcF07aWYoIS9eKGRvY3VtZW50fHdpbmRvd3xwYXJlbnQpJC8udGVzdChiLmNvbnRhaW5tZW50KSl7dmFyIGM9YShiLmNvbnRhaW5tZW50KVswXSxkPWEoYi5jb250YWlubWVudCkub2Zmc2V0KCksZT1hKGMpLmNzcygib3ZlcmZsb3ciKSE9ImhpZGRlbiI7dGhpcy5jb250YWlubWVudD1bZC5sZWZ0KyhwYXJzZUludChhKGMpLmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoYShjKS5jc3MoInBhZGRpbmdMZWZ0IiksMTApfHwwKS10aGlzLm1hcmdpbnMubGVmdCxkLnRvcCsocGFyc2VJbnQoYShjKS5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoYShjKS5jc3MoInBhZGRpbmdUb3AiKSwxMCl8fDApLXRoaXMubWFyZ2lucy50b3AsZC5sZWZ0KyhlP01hdGgubWF4KGMuc2Nyb2xsV2lkdGgsYy5vZmZzZXRXaWR0aCk6Yy5vZmZzZXRXaWR0aCktKHBhcnNlSW50KGEoYykuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApLShwYXJzZUludChhKGMpLmNzcygicGFkZGluZ1JpZ2h0IiksMTApfHwwKS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXRoaXMubWFyZ2lucy5sZWZ0LGQudG9wKyhlP01hdGgubWF4KGMuc2Nyb2xsSGVpZ2h0LGMub2Zmc2V0SGVpZ2h0KTpjLm9mZnNldEhlaWdodCktKHBhcnNlSW50KGEoYykuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKXx8MCktKHBhcnNlSW50KGEoYykuY3NzKCJwYWRkaW5nQm90dG9tIiksMTApfHwwKS10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC10aGlzLm1hcmdpbnMudG9wXX19LF9jb252ZXJ0UG9zaXRpb25UbzpmdW5jdGlvbihiLGMpe2N8fChjPXRoaXMucG9zaXRpb24pO3ZhciBkPWI9PSJhYnNvbHV0ZSI/MTotMSxlPXRoaXMub3B0aW9ucyxmPXRoaXMuY3NzUG9zaXRpb249PSJhYnNvbHV0ZSImJih0aGlzLnNjcm9sbFBhcmVudFswXT09ZG9jdW1lbnR8fCFhLnVpLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLHRoaXMub2Zmc2V0UGFyZW50WzBdKSk/dGhpcy5vZmZzZXRQYXJlbnQ6dGhpcy5zY3JvbGxQYXJlbnQsZz0vKGh0bWx8Ym9keSkvaS50ZXN0KGZbMF0udGFnTmFtZSk7cmV0dXJue3RvcDpjLnRvcCt0aGlzLm9mZnNldC5yZWxhdGl2ZS50b3AqZCt0aGlzLm9mZnNldC5wYXJlbnQudG9wKmQtKGEuYnJvd3Nlci5zYWZhcmkmJnRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/MDoodGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8tdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCk6Zz8wOmYuc2Nyb2xsVG9wKCkpKmQpLGxlZnQ6Yy5sZWZ0K3RoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQqZCt0aGlzLm9mZnNldC5wYXJlbnQubGVmdCpkLShhLmJyb3dzZXIuc2FmYXJpJiZ0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPzA6KHRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKTpnPzA6Zi5zY3JvbGxMZWZ0KCkpKmQpfX0sX2dlbmVyYXRlUG9zaXRpb246ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5vcHRpb25zLGQ9dGhpcy5jc3NQb3NpdGlvbj09ImFic29sdXRlIiYmKHRoaXMuc2Nyb2xsUGFyZW50WzBdPT1kb2N1bWVudHx8IWEudWkuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJlbnRbMF0pKT90aGlzLm9mZnNldFBhcmVudDp0aGlzLnNjcm9sbFBhcmVudCxlPS8oaHRtbHxib2R5KS9pLnRlc3QoZFswXS50YWdOYW1lKTt0aGlzLmNzc1Bvc2l0aW9uPT0icmVsYXRpdmUiJiYodGhpcy5zY3JvbGxQYXJlbnRbMF09PWRvY3VtZW50fHx0aGlzLnNjcm9sbFBhcmVudFswXT09dGhpcy5vZmZzZXRQYXJlbnRbMF0pJiYodGhpcy5vZmZzZXQucmVsYXRpdmU9dGhpcy5fZ2V0UmVsYXRpdmVPZmZzZXQoKSk7dmFyIGY9Yi5wYWdlWCxnPWIucGFnZVk7aWYodGhpcy5vcmlnaW5hbFBvc2l0aW9uKXt0aGlzLmNvbnRhaW5tZW50JiYoYi5wYWdlWC10aGlzLm9mZnNldC5jbGljay5sZWZ0PHRoaXMuY29udGFpbm1lbnRbMF0mJihmPXRoaXMuY29udGFpbm1lbnRbMF0rdGhpcy5vZmZzZXQuY2xpY2subGVmdCksYi5wYWdlWS10aGlzLm9mZnNldC5jbGljay50b3A8dGhpcy5jb250YWlubWVudFsxXSYmKGc9dGhpcy5jb250YWlubWVudFsxXSt0aGlzLm9mZnNldC5jbGljay50b3ApLGIucGFnZVgtdGhpcy5vZmZzZXQuY2xpY2subGVmdD50aGlzLmNvbnRhaW5tZW50WzJdJiYoZj10aGlzLmNvbnRhaW5tZW50WzJdK3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQpLGIucGFnZVktdGhpcy5vZmZzZXQuY2xpY2sudG9wPnRoaXMuY29udGFpbm1lbnRbM10mJihnPXRoaXMuY29udGFpbm1lbnRbM10rdGhpcy5vZmZzZXQuY2xpY2sudG9wKSk7aWYoYy5ncmlkKXt2YXIgaD10aGlzLm9yaWdpbmFsUGFnZVkrTWF0aC5yb3VuZCgoZy10aGlzLm9yaWdpbmFsUGFnZVkpL2MuZ3JpZFsxXSkqYy5ncmlkWzFdO2c9dGhpcy5jb250YWlubWVudD9oLXRoaXMub2Zmc2V0LmNsaWNrLnRvcDx0aGlzLmNvbnRhaW5tZW50WzFdfHxoLXRoaXMub2Zmc2V0LmNsaWNrLnRvcD50aGlzLmNvbnRhaW5tZW50WzNdP2gtdGhpcy5vZmZzZXQuY2xpY2sudG9wPHRoaXMuY29udGFpbm1lbnRbMV0/aCtjLmdyaWRbMV06aC1jLmdyaWRbMV06aDpoO3ZhciBpPXRoaXMub3JpZ2luYWxQYWdlWCtNYXRoLnJvdW5kKChmLXRoaXMub3JpZ2luYWxQYWdlWCkvYy5ncmlkWzBdKSpjLmdyaWRbMF07Zj10aGlzLmNvbnRhaW5tZW50P2ktdGhpcy5vZmZzZXQuY2xpY2subGVmdDx0aGlzLmNvbnRhaW5tZW50WzBdfHxpLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+dGhpcy5jb250YWlubWVudFsyXT9pLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ8dGhpcy5jb250YWlubWVudFswXT9pK2MuZ3JpZFswXTppLWMuZ3JpZFswXTppOml9fXJldHVybnt0b3A6Zy10aGlzLm9mZnNldC5jbGljay50b3AtdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3ArKGEuYnJvd3Nlci5zYWZhcmkmJnRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/MDp0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKTplPzA6ZC5zY3JvbGxUb3AoKSksbGVmdDpmLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQtdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdC10aGlzLm9mZnNldC5wYXJlbnQubGVmdCsoYS5icm93c2VyLnNhZmFyaSYmdGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8wOnRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKTplPzA6ZC5zY3JvbGxMZWZ0KCkpfX0sX3JlYXJyYW5nZTpmdW5jdGlvbihhLGIsYyxkKXtjP2NbMF0uYXBwZW5kQ2hpbGQodGhpcy5wbGFjZWhvbGRlclswXSk6Yi5pdGVtWzBdLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMucGxhY2Vob2xkZXJbMF0sdGhpcy5kaXJlY3Rpb249PSJkb3duIj9iLml0ZW1bMF06Yi5pdGVtWzBdLm5leHRTaWJsaW5nKSx0aGlzLmNvdW50ZXI9dGhpcy5jb3VudGVyPysrdGhpcy5jb3VudGVyOjE7dmFyIGU9dGhpcyxmPXRoaXMuY291bnRlcjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Y9PWUuY291bnRlciYmZS5yZWZyZXNoUG9zaXRpb25zKCFkKX0sMCl9LF9jbGVhcjpmdW5jdGlvbihiLGMpe3RoaXMucmV2ZXJ0aW5nPSExO3ZhciBkPVtdLGU9dGhpczshdGhpcy5fbm9GaW5hbFNvcnQmJnRoaXMuY3VycmVudEl0ZW0ucGFyZW50KCkubGVuZ3RoJiZ0aGlzLnBsYWNlaG9sZGVyLmJlZm9yZSh0aGlzLmN1cnJlbnRJdGVtKSx0aGlzLl9ub0ZpbmFsU29ydD1udWxsO2lmKHRoaXMuaGVscGVyWzBdPT10aGlzLmN1cnJlbnRJdGVtWzBdKXtmb3IodmFyIGYgaW4gdGhpcy5fc3RvcmVkQ1NTKWlmKHRoaXMuX3N0b3JlZENTU1tmXT09ImF1dG8ifHx0aGlzLl9zdG9yZWRDU1NbZl09PSJzdGF0aWMiKXRoaXMuX3N0b3JlZENTU1tmXT0iIjt0aGlzLmN1cnJlbnRJdGVtLmNzcyh0aGlzLl9zdG9yZWRDU1MpLnJlbW92ZUNsYXNzKCJ1aS1zb3J0YWJsZS1oZWxwZXIiKX1lbHNlIHRoaXMuY3VycmVudEl0ZW0uc2hvdygpO3RoaXMuZnJvbU91dHNpZGUmJiFjJiZkLnB1c2goZnVuY3Rpb24oYSl7dGhpcy5fdHJpZ2dlcigicmVjZWl2ZSIsYSx0aGlzLl91aUhhc2godGhpcy5mcm9tT3V0c2lkZSkpfSksKHRoaXMuZnJvbU91dHNpZGV8fHRoaXMuZG9tUG9zaXRpb24ucHJldiE9dGhpcy5jdXJyZW50SXRlbS5wcmV2KCkubm90KCIudWktc29ydGFibGUtaGVscGVyIilbMF18fHRoaXMuZG9tUG9zaXRpb24ucGFyZW50IT10aGlzLmN1cnJlbnRJdGVtLnBhcmVudCgpWzBdKSYmIWMmJmQucHVzaChmdW5jdGlvbihhKXt0aGlzLl90cmlnZ2VyKCJ1cGRhdGUiLGEsdGhpcy5fdWlIYXNoKCkpfSksdGhpcyE9PXRoaXMuY3VycmVudENvbnRhaW5lciYmKGN8fChkLnB1c2goZnVuY3Rpb24oYSl7dGhpcy5fdHJpZ2dlcigicmVtb3ZlIixhLHRoaXMuX3VpSGFzaCgpKX0pLGQucHVzaChmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7YS5fdHJpZ2dlcigicmVjZWl2ZSIsYix0aGlzLl91aUhhc2godGhpcykpfX0uY2FsbCh0aGlzLHRoaXMuY3VycmVudENvbnRhaW5lcikpLGQucHVzaChmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7YS5fdHJpZ2dlcigidXBkYXRlIixiLHRoaXMuX3VpSGFzaCh0aGlzKSl9fS5jYWxsKHRoaXMsdGhpcy5jdXJyZW50Q29udGFpbmVyKSkpKTtmb3IodmFyIGY9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO2Y+PTA7Zi0tKWN8fGQucHVzaChmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7YS5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsYix0aGlzLl91aUhhc2godGhpcykpfX0uY2FsbCh0aGlzLHRoaXMuY29udGFpbmVyc1tmXSkpLHRoaXMuY29udGFpbmVyc1tmXS5jb250YWluZXJDYWNoZS5vdmVyJiYoZC5wdXNoKGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXthLl90cmlnZ2VyKCJvdXQiLGIsdGhpcy5fdWlIYXNoKHRoaXMpKX19LmNhbGwodGhpcyx0aGlzLmNvbnRhaW5lcnNbZl0pKSx0aGlzLmNvbnRhaW5lcnNbZl0uY29udGFpbmVyQ2FjaGUub3Zlcj0wKTt0aGlzLl9zdG9yZWRDdXJzb3ImJmEoImJvZHkiKS5jc3MoImN1cnNvciIsdGhpcy5fc3RvcmVkQ3Vyc29yKSx0aGlzLl9zdG9yZWRPcGFjaXR5JiZ0aGlzLmhlbHBlci5jc3MoIm9wYWNpdHkiLHRoaXMuX3N0b3JlZE9wYWNpdHkpLHRoaXMuX3N0b3JlZFpJbmRleCYmdGhpcy5oZWxwZXIuY3NzKCJ6SW5kZXgiLHRoaXMuX3N0b3JlZFpJbmRleD09ImF1dG8iPyIiOnRoaXMuX3N0b3JlZFpJbmRleCksdGhpcy5kcmFnZ2luZz0hMTtpZih0aGlzLmNhbmNlbEhlbHBlclJlbW92YWwpe2lmKCFjKXt0aGlzLl90cmlnZ2VyKCJiZWZvcmVTdG9wIixiLHRoaXMuX3VpSGFzaCgpKTtmb3IodmFyIGY9MDtmPGQubGVuZ3RoO2YrKylkW2ZdLmNhbGwodGhpcyxiKTt0aGlzLl90cmlnZ2VyKCJzdG9wIixiLHRoaXMuX3VpSGFzaCgpKX1yZXR1cm4gdGhpcy5mcm9tT3V0c2lkZT0hMSwhMX1jfHx0aGlzLl90cmlnZ2VyKCJiZWZvcmVTdG9wIixiLHRoaXMuX3VpSGFzaCgpKSx0aGlzLnBsYWNlaG9sZGVyWzBdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5wbGFjZWhvbGRlclswXSksdGhpcy5oZWxwZXJbMF0hPXRoaXMuY3VycmVudEl0ZW1bMF0mJnRoaXMuaGVscGVyLnJlbW92ZSgpLHRoaXMuaGVscGVyPW51bGw7aWYoIWMpe2Zvcih2YXIgZj0wO2Y8ZC5sZW5ndGg7ZisrKWRbZl0uY2FsbCh0aGlzLGIpO3RoaXMuX3RyaWdnZXIoInN0b3AiLGIsdGhpcy5fdWlIYXNoKCkpfXJldHVybiB0aGlzLmZyb21PdXRzaWRlPSExLCEwfSxfdHJpZ2dlcjpmdW5jdGlvbigpe2EuV2lkZ2V0LnByb3RvdHlwZS5fdHJpZ2dlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk9PT0hMSYmdGhpcy5jYW5jZWwoKX0sX3VpSGFzaDpmdW5jdGlvbihiKXt2YXIgYz1ifHx0aGlzO3JldHVybntoZWxwZXI6Yy5oZWxwZXIscGxhY2Vob2xkZXI6Yy5wbGFjZWhvbGRlcnx8YShbXSkscG9zaXRpb246Yy5wb3NpdGlvbixvcmlnaW5hbFBvc2l0aW9uOmMub3JpZ2luYWxQb3NpdGlvbixvZmZzZXQ6Yy5wb3NpdGlvbkFicyxpdGVtOmMuY3VycmVudEl0ZW0sc2VuZGVyOmI/Yi5lbGVtZW50Om51bGx9fX0pLGEuZXh0ZW5kKGEudWkuc29ydGFibGUse3ZlcnNpb246IjEuOC4yNCJ9KX0oalF1ZXJ5KSxqUXVlcnkuZWZmZWN0c3x8ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGIpe3ZhciBjO3JldHVybiBiJiZiLmNvbnN0cnVjdG9yPT1BcnJheSYmYi5sZW5ndGg9PTM/YjooYz0vcmdiXChccyooWzAtOV17MSwzfSlccyosXHMqKFswLTldezEsM30pXHMqLFxzKihbMC05XXsxLDN9KVxzKlwpLy5leGVjKGIpKT9bcGFyc2VJbnQoY1sxXSwxMCkscGFyc2VJbnQoY1syXSwxMCkscGFyc2VJbnQoY1szXSwxMCldOihjPS9yZ2JcKFxzKihbMC05XSsoPzpcLlswLTldKyk/KVwlXHMqLFxzKihbMC05XSsoPzpcLlswLTldKyk/KVwlXHMqLFxzKihbMC05XSsoPzpcLlswLTldKyk/KVwlXHMqXCkvLmV4ZWMoYikpP1twYXJzZUZsb2F0KGNbMV0pKjIuNTUscGFyc2VGbG9hdChjWzJdKSoyLjU1LHBhcnNlRmxvYXQoY1szXSkqMi41NV06KGM9LyMoW2EtZkEtRjAtOV17Mn0pKFthLWZBLUYwLTldezJ9KShbYS1mQS1GMC05XXsyfSkvLmV4ZWMoYikpP1twYXJzZUludChjWzFdLDE2KSxwYXJzZUludChjWzJdLDE2KSxwYXJzZUludChjWzNdLDE2KV06KGM9LyMoW2EtZkEtRjAtOV0pKFthLWZBLUYwLTldKShbYS1mQS1GMC05XSkvLmV4ZWMoYikpP1twYXJzZUludChjWzFdK2NbMV0sMTYpLHBhcnNlSW50KGNbMl0rY1syXSwxNikscGFyc2VJbnQoY1szXStjWzNdLDE2KV06KGM9L3JnYmFcKDAsIDAsIDAsIDBcKS8uZXhlYyhiKSk/ZS50cmFuc3BhcmVudDplW2EudHJpbShiKS50b0xvd2VyQ2FzZSgpXX1mdW5jdGlvbiBkKGIsZCl7dmFyIGU7ZG97ZT0oYS5jdXJDU1N8fGEuY3NzKShiLGQpO2lmKGUhPSIiJiZlIT0idHJhbnNwYXJlbnQifHxhLm5vZGVOYW1lKGIsImJvZHkiKSlicmVhaztkPSJiYWNrZ3JvdW5kQ29sb3IifXdoaWxlKGI9Yi5wYXJlbnROb2RlKTtyZXR1cm4gYyhlKX1mdW5jdGlvbiBoKCl7dmFyIGE9ZG9jdW1lbnQuZGVmYXVsdFZpZXc/ZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLG51bGwpOnRoaXMuY3VycmVudFN0eWxlLGI9e30sYyxkO2lmKGEmJmEubGVuZ3RoJiZhWzBdJiZhW2FbMF1dKXt2YXIgZT1hLmxlbmd0aDt3aGlsZShlLS0pYz1hW2VdLHR5cGVvZiBhW2NdPT0ic3RyaW5nIiYmKGQ9Yy5yZXBsYWNlKC9cLShcdykvZyxmdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9KSxiW2RdPWFbY10pfWVsc2UgZm9yKGMgaW4gYSl0eXBlb2YgYVtjXT09InN0cmluZyImJihiW2NdPWFbY10pO3JldHVybiBifWZ1bmN0aW9uIGkoYil7dmFyIGMsZDtmb3IoYyBpbiBiKWQ9YltjXSwoZD09bnVsbHx8YS5pc0Z1bmN0aW9uKGQpfHxjIGluIGd8fC9zY3JvbGxiYXIvLnRlc3QoYyl8fCEvY29sb3IvaS50ZXN0KGMpJiZpc05hTihwYXJzZUZsb2F0KGQpKSkmJmRlbGV0ZSBiW2NdO3JldHVybiBifWZ1bmN0aW9uIGooYSxiKXt2YXIgYz17XzowfSxkO2ZvcihkIGluIGIpYVtkXSE9YltkXSYmKGNbZF09YltkXSk7cmV0dXJuIGN9ZnVuY3Rpb24gayhiLGMsZCxlKXt0eXBlb2YgYj09Im9iamVjdCImJihlPWMsZD1udWxsLGM9YixiPWMuZWZmZWN0KSxhLmlzRnVuY3Rpb24oYykmJihlPWMsZD1udWxsLGM9e30pO2lmKHR5cGVvZiBjPT0ibnVtYmVyInx8YS5meC5zcGVlZHNbY10pZT1kLGQ9YyxjPXt9O3JldHVybiBhLmlzRnVuY3Rpb24oZCkmJihlPWQsZD1udWxsKSxjPWN8fHt9LGQ9ZHx8Yy5kdXJhdGlvbixkPWEuZngub2ZmPzA6dHlwZW9mIGQ9PSJudW1iZXIiP2Q6ZCBpbiBhLmZ4LnNwZWVkcz9hLmZ4LnNwZWVkc1tkXTphLmZ4LnNwZWVkcy5fZGVmYXVsdCxlPWV8fGMuY29tcGxldGUsW2IsYyxkLGVdfWZ1bmN0aW9uIGwoYil7cmV0dXJuIWJ8fHR5cGVvZiBiPT0ibnVtYmVyInx8YS5meC5zcGVlZHNbYl0/ITA6dHlwZW9mIGI9PSJzdHJpbmciJiYhYS5lZmZlY3RzW2JdPyEwOiExfWEuZWZmZWN0cz17fSxhLmVhY2goWyJiYWNrZ3JvdW5kQ29sb3IiLCJib3JkZXJCb3R0b21Db2xvciIsImJvcmRlckxlZnRDb2xvciIsImJvcmRlclJpZ2h0Q29sb3IiLCJib3JkZXJUb3BDb2xvciIsImJvcmRlckNvbG9yIiwiY29sb3IiLCJvdXRsaW5lQ29sb3IiXSxmdW5jdGlvbihiLGUpe2EuZnguc3RlcFtlXT1mdW5jdGlvbihhKXthLmNvbG9ySW5pdHx8KGEuc3RhcnQ9ZChhLmVsZW0sZSksYS5lbmQ9YyhhLmVuZCksYS5jb2xvckluaXQ9ITApLGEuZWxlbS5zdHlsZVtlXT0icmdiKCIrTWF0aC5tYXgoTWF0aC5taW4ocGFyc2VJbnQoYS5wb3MqKGEuZW5kWzBdLWEuc3RhcnRbMF0pK2Euc3RhcnRbMF0sMTApLDI1NSksMCkrIiwiK01hdGgubWF4KE1hdGgubWluKHBhcnNlSW50KGEucG9zKihhLmVuZFsxXS1hLnN0YXJ0WzFdKSthLnN0YXJ0WzFdLDEwKSwyNTUpLDApKyIsIitNYXRoLm1heChNYXRoLm1pbihwYXJzZUludChhLnBvcyooYS5lbmRbMl0tYS5zdGFydFsyXSkrYS5zdGFydFsyXSwxMCksMjU1KSwwKSsiKSJ9fSk7dmFyIGU9e2FxdWE6WzAsMjU1LDI1NV0sYXp1cmU6WzI0MCwyNTUsMjU1XSxiZWlnZTpbMjQ1LDI0NSwyMjBdLGJsYWNrOlswLDAsMF0sYmx1ZTpbMCwwLDI1NV0sYnJvd246WzE2NSw0Miw0Ml0sY3lhbjpbMCwyNTUsMjU1XSxkYXJrYmx1ZTpbMCwwLDEzOV0sZGFya2N5YW46WzAsMTM5LDEzOV0sZGFya2dyZXk6WzE2OSwxNjksMTY5XSxkYXJrZ3JlZW46WzAsMTAwLDBdLGRhcmtraGFraTpbMTg5LDE4MywxMDddLGRhcmttYWdlbnRhOlsxMzksMCwxMzldLGRhcmtvbGl2ZWdyZWVuOls4NSwxMDcsNDddLGRhcmtvcmFuZ2U6WzI1NSwxNDAsMF0sZGFya29yY2hpZDpbMTUzLDUwLDIwNF0sZGFya3JlZDpbMTM5LDAsMF0sZGFya3NhbG1vbjpbMjMzLDE1MCwxMjJdLGRhcmt2aW9sZXQ6WzE0OCwwLDIxMV0sZnVjaHNpYTpbMjU1LDAsMjU1XSxnb2xkOlsyNTUsMjE1LDBdLGdyZWVuOlswLDEyOCwwXSxpbmRpZ286Wzc1LDAsMTMwXSxraGFraTpbMjQwLDIzMCwxNDBdLGxpZ2h0Ymx1ZTpbMTczLDIxNiwyMzBdLGxpZ2h0Y3lhbjpbMjI0LDI1NSwyNTVdLGxpZ2h0Z3JlZW46WzE0NCwyMzgsMTQ0XSxsaWdodGdyZXk6WzIxMSwyMTEsMjExXSxsaWdodHBpbms6WzI1NSwxODIsMTkzXSxsaWdodHllbGxvdzpbMjU1LDI1NSwyMjRdLGxpbWU6WzAsMjU1LDBdLG1hZ2VudGE6WzI1NSwwLDI1NV0sbWFyb29uOlsxMjgsMCwwXSxuYXZ5OlswLDAsMTI4XSxvbGl2ZTpbMTI4LDEyOCwwXSxvcmFuZ2U6WzI1NSwxNjUsMF0scGluazpbMjU1LDE5MiwyMDNdLHB1cnBsZTpbMTI4LDAsMTI4XSx2aW9sZXQ6WzEyOCwwLDEyOF0scmVkOlsyNTUsMCwwXSxzaWx2ZXI6WzE5MiwxOTIsMTkyXSx3aGl0ZTpbMjU1LDI1NSwyNTVdLHllbGxvdzpbMjU1LDI1NSwwXSx0cmFuc3BhcmVudDpbMjU1LDI1NSwyNTVdfSxmPVsiYWRkIiwicmVtb3ZlIiwidG9nZ2xlIl0sZz17Ym9yZGVyOjEsYm9yZGVyQm90dG9tOjEsYm9yZGVyQ29sb3I6MSxib3JkZXJMZWZ0OjEsYm9yZGVyUmlnaHQ6MSxib3JkZXJUb3A6MSxib3JkZXJXaWR0aDoxLG1hcmdpbjoxLHBhZGRpbmc6MX07YS5lZmZlY3RzLmFuaW1hdGVDbGFzcz1mdW5jdGlvbihiLGMsZCxlKXtyZXR1cm4gYS5pc0Z1bmN0aW9uKGQpJiYoZT1kLGQ9bnVsbCksdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBnPWEodGhpcyksaz1nLmF0dHIoInN0eWxlIil8fCIgIixsPWkoaC5jYWxsKHRoaXMpKSxtLG49Zy5hdHRyKCJjbGFzcyIpfHwiIjthLmVhY2goZixmdW5jdGlvbihhLGMpe2JbY10mJmdbYysiQ2xhc3MiXShiW2NdKX0pLG09aShoLmNhbGwodGhpcykpLGcuYXR0cigiY2xhc3MiLG4pLGcuYW5pbWF0ZShqKGwsbSkse3F1ZXVlOiExLGR1cmF0aW9uOmMsZWFzaW5nOmQsY29tcGxldGU6ZnVuY3Rpb24oKXthLmVhY2goZixmdW5jdGlvbihhLGMpe2JbY10mJmdbYysiQ2xhc3MiXShiW2NdKX0pLHR5cGVvZiBnLmF0dHIoInN0eWxlIik9PSJvYmplY3QiPyhnLmF0dHIoInN0eWxlIikuY3NzVGV4dD0iIixnLmF0dHIoInN0eWxlIikuY3NzVGV4dD1rKTpnLmF0dHIoInN0eWxlIixrKSxlJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxhLmRlcXVldWUodGhpcyl9fSl9KX0sYS5mbi5leHRlbmQoe19hZGRDbGFzczphLmZuLmFkZENsYXNzLGFkZENsYXNzOmZ1bmN0aW9uKGIsYyxkLGUpe3JldHVybiBjP2EuZWZmZWN0cy5hbmltYXRlQ2xhc3MuYXBwbHkodGhpcyxbe2FkZDpifSxjLGQsZV0pOnRoaXMuX2FkZENsYXNzKGIpfSxfcmVtb3ZlQ2xhc3M6YS5mbi5yZW1vdmVDbGFzcyxyZW1vdmVDbGFzczpmdW5jdGlvbihiLGMsZCxlKXtyZXR1cm4gYz9hLmVmZmVjdHMuYW5pbWF0ZUNsYXNzLmFwcGx5KHRoaXMsW3tyZW1vdmU6Yn0sYyxkLGVdKTp0aGlzLl9yZW1vdmVDbGFzcyhiKX0sX3RvZ2dsZUNsYXNzOmEuZm4udG9nZ2xlQ2xhc3MsdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oYyxkLGUsZixnKXtyZXR1cm4gdHlwZW9mIGQ9PSJib29sZWFuInx8ZD09PWI/ZT9hLmVmZmVjdHMuYW5pbWF0ZUNsYXNzLmFwcGx5KHRoaXMsW2Q/e2FkZDpjfTp7cmVtb3ZlOmN9LGUsZixnXSk6dGhpcy5fdG9nZ2xlQ2xhc3MoYyxkKTphLmVmZmVjdHMuYW5pbWF0ZUNsYXNzLmFwcGx5KHRoaXMsW3t0b2dnbGU6Y30sZCxlLGZdKX0sc3dpdGNoQ2xhc3M6ZnVuY3Rpb24oYixjLGQsZSxmKXtyZXR1cm4gYS5lZmZlY3RzLmFuaW1hdGVDbGFzcy5hcHBseSh0aGlzLFt7YWRkOmMscmVtb3ZlOmJ9LGQsZSxmXSl9fSksYS5leHRlbmQoYS5lZmZlY3RzLHt2ZXJzaW9uOiIxLjguMjQiLHNhdmU6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdIT09bnVsbCYmYS5kYXRhKCJlYy5zdG9yYWdlLiIrYltjXSxhWzBdLnN0eWxlW2JbY11dKX0scmVzdG9yZTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10hPT1udWxsJiZhLmNzcyhiW2NdLGEuZGF0YSgiZWMuc3RvcmFnZS4iK2JbY10pKX0sc2V0TW9kZTpmdW5jdGlvbihhLGIpe3JldHVybiBiPT0idG9nZ2xlIiYmKGI9YS5pcygiOmhpZGRlbiIpPyJzaG93IjoiaGlkZSIpLGJ9LGdldEJhc2VsaW5lOmZ1bmN0aW9uKGEsYil7dmFyIGMsZDtzd2l0Y2goYVswXSl7Y2FzZSJ0b3AiOmM9MDticmVhaztjYXNlIm1pZGRsZSI6Yz0uNTticmVhaztjYXNlImJvdHRvbSI6Yz0xO2JyZWFrO2RlZmF1bHQ6Yz1hWzBdL2IuaGVpZ2h0fXN3aXRjaChhWzFdKXtjYXNlImxlZnQiOmQ9MDticmVhaztjYXNlImNlbnRlciI6ZD0uNTticmVhaztjYXNlInJpZ2h0IjpkPTE7YnJlYWs7ZGVmYXVsdDpkPWFbMV0vYi53aWR0aH1yZXR1cm57eDpkLHk6Y319LGNyZWF0ZVdyYXBwZXI6ZnVuY3Rpb24oYil7aWYoYi5wYXJlbnQoKS5pcygiLnVpLWVmZmVjdHMtd3JhcHBlciIpKXJldHVybiBiLnBhcmVudCgpO3ZhciBjPXt3aWR0aDpiLm91dGVyV2lkdGgoITApLGhlaWdodDpiLm91dGVySGVpZ2h0KCEwKSwiZmxvYXQiOmIuY3NzKCJmbG9hdCIpfSxkPWEoIjxkaXY+PC9kaXY+IikuYWRkQ2xhc3MoInVpLWVmZmVjdHMtd3JhcHBlciIpLmNzcyh7Zm9udFNpemU6IjEwMCUiLGJhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLG1hcmdpbjowLHBhZGRpbmc6MH0pLGU9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDt0cnl7ZS5pZH1jYXRjaChmKXtlPWRvY3VtZW50LmJvZHl9cmV0dXJuIGIud3JhcChkKSwoYlswXT09PWV8fGEuY29udGFpbnMoYlswXSxlKSkmJmEoZSkuZm9jdXMoKSxkPWIucGFyZW50KCksYi5jc3MoInBvc2l0aW9uIik9PSJzdGF0aWMiPyhkLmNzcyh7cG9zaXRpb246InJlbGF0aXZlIn0pLGIuY3NzKHtwb3NpdGlvbjoicmVsYXRpdmUifSkpOihhLmV4dGVuZChjLHtwb3NpdGlvbjpiLmNzcygicG9zaXRpb24iKSx6SW5kZXg6Yi5jc3MoInotaW5kZXgiKX0pLGEuZWFjaChbInRvcCIsImxlZnQiLCJib3R0b20iLCJyaWdodCJdLGZ1bmN0aW9uKGEsZCl7Y1tkXT1iLmNzcyhkKSxpc05hTihwYXJzZUludChjW2RdLDEwKSkmJihjW2RdPSJhdXRvIil9KSxiLmNzcyh7cG9zaXRpb246InJlbGF0aXZlIix0b3A6MCxsZWZ0OjAscmlnaHQ6ImF1dG8iLGJvdHRvbToiYXV0byJ9KSksZC5jc3MoYykuc2hvdygpfSxyZW1vdmVXcmFwcGVyOmZ1bmN0aW9uKGIpe3ZhciBjLGQ9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtyZXR1cm4gYi5wYXJlbnQoKS5pcygiLnVpLWVmZmVjdHMtd3JhcHBlciIpPyhjPWIucGFyZW50KCkucmVwbGFjZVdpdGgoYiksKGJbMF09PT1kfHxhLmNvbnRhaW5zKGJbMF0sZCkpJiZhKGQpLmZvY3VzKCksYyk6Yn0sc2V0VHJhbnNpdGlvbjpmdW5jdGlvbihiLGMsZCxlKXtyZXR1cm4gZT1lfHx7fSxhLmVhY2goYyxmdW5jdGlvbihhLGMpe3ZhciBmPWIuY3NzVW5pdChjKTtmWzBdPjAmJihlW2NdPWZbMF0qZCtmWzFdKX0pLGV9fSksYS5mbi5leHRlbmQoe2VmZmVjdDpmdW5jdGlvbihiLGMsZCxlKXt2YXIgZj1rLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxnPXtvcHRpb25zOmZbMV0sZHVyYXRpb246ZlsyXSxjYWxsYmFjazpmWzNdfSxoPWcub3B0aW9ucy5tb2RlLGk9YS5lZmZlY3RzW2JdO3JldHVybiBhLmZ4Lm9mZnx8IWk/aD90aGlzW2hdKGcuZHVyYXRpb24sZy5jYWxsYmFjayk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zy5jYWxsYmFjayYmZy5jYWxsYmFjay5jYWxsKHRoaXMpfSk6aS5jYWxsKHRoaXMsZyl9LF9zaG93OmEuZm4uc2hvdyxzaG93OmZ1bmN0aW9uKGEpe2lmKGwoYSkpcmV0dXJuIHRoaXMuX3Nob3cuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBiPWsuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBiWzFdLm1vZGU9InNob3ciLHRoaXMuZWZmZWN0LmFwcGx5KHRoaXMsYil9LF9oaWRlOmEuZm4uaGlkZSxoaWRlOmZ1bmN0aW9uKGEpe2lmKGwoYSkpcmV0dXJuIHRoaXMuX2hpZGUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBiPWsuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBiWzFdLm1vZGU9ImhpZGUiLHRoaXMuZWZmZWN0LmFwcGx5KHRoaXMsYil9LF9fdG9nZ2xlOmEuZm4udG9nZ2xlLHRvZ2dsZTpmdW5jdGlvbihiKXtpZihsKGIpfHx0eXBlb2YgYj09ImJvb2xlYW4ifHxhLmlzRnVuY3Rpb24oYikpcmV0dXJuIHRoaXMuX190b2dnbGUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBjPWsuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBjWzFdLm1vZGU9InRvZ2dsZSIsdGhpcy5lZmZlY3QuYXBwbHkodGhpcyxjKX0sY3NzVW5pdDpmdW5jdGlvbihiKXt2YXIgYz10aGlzLmNzcyhiKSxkPVtdO3JldHVybiBhLmVhY2goWyJlbSIsInB4IiwiJSIsInB0Il0sZnVuY3Rpb24oYSxiKXtjLmluZGV4T2YoYik+MCYmKGQ9W3BhcnNlRmxvYXQoYyksYl0pfSksZH19KTt2YXIgbT17fTthLmVhY2goWyJRdWFkIiwiQ3ViaWMiLCJRdWFydCIsIlF1aW50IiwiRXhwbyJdLGZ1bmN0aW9uKGEsYil7bVtiXT1mdW5jdGlvbihiKXtyZXR1cm4gTWF0aC5wb3coYixhKzIpfX0pLGEuZXh0ZW5kKG0se1NpbmU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEtTWF0aC5jb3MoYSpNYXRoLlBJLzIpfSxDaXJjOmZ1bmN0aW9uKGEpe3JldHVybiAxLU1hdGguc3FydCgxLWEqYSl9LEVsYXN0aWM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT0wfHxhPT09MT9hOi1NYXRoLnBvdygyLDgqKGEtMSkpKk1hdGguc2luKCgoYS0xKSo4MC03LjUpKk1hdGguUEkvMTUpfSxCYWNrOmZ1bmN0aW9uKGEpe3JldHVybiBhKmEqKDMqYS0yKX0sQm91bmNlOmZ1bmN0aW9uKGEpe3ZhciBiLGM9NDt3aGlsZShhPCgoYj1NYXRoLnBvdygyLC0tYykpLTEpLzExKTtyZXR1cm4gMS9NYXRoLnBvdyg0LDMtYyktNy41NjI1Kk1hdGgucG93KChiKjMtMikvMjItYSwyKX19KSxhLmVhY2gobSxmdW5jdGlvbihiLGMpe2EuZWFzaW5nWyJlYXNlSW4iK2JdPWMsYS5lYXNpbmdbImVhc2VPdXQiK2JdPWZ1bmN0aW9uKGEpe3JldHVybiAxLWMoMS1hKX0sYS5lYXNpbmdbImVhc2VJbk91dCIrYl09ZnVuY3Rpb24oYSl7cmV0dXJuIGE8LjU/YyhhKjIpLzI6YyhhKi0yKzIpLy0yKzF9fSl9KGpRdWVyeSksZnVuY3Rpb24oYSxiKXthLmVmZmVjdHMuYmxpbmQ9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCJdLGU9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8ImhpZGUiKSxmPWIub3B0aW9ucy5kaXJlY3Rpb258fCJ2ZXJ0aWNhbCI7YS5lZmZlY3RzLnNhdmUoYyxkKSxjLnNob3coKTt2YXIgZz1hLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihjKS5jc3Moe292ZXJmbG93OiJoaWRkZW4ifSksaD1mPT0idmVydGljYWwiPyJoZWlnaHQiOiJ3aWR0aCIsaT1mPT0idmVydGljYWwiP2cuaGVpZ2h0KCk6Zy53aWR0aCgpO2U9PSJzaG93IiYmZy5jc3MoaCwwKTt2YXIgaj17fTtqW2hdPWU9PSJzaG93Ij9pOjAsZy5hbmltYXRlKGosYi5kdXJhdGlvbixiLm9wdGlvbnMuZWFzaW5nLGZ1bmN0aW9uKCl7ZT09ImhpZGUiJiZjLmhpZGUoKSxhLmVmZmVjdHMucmVzdG9yZShjLGQpLGEuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKGMpLGIuY2FsbGJhY2smJmIuY2FsbGJhY2suYXBwbHkoY1swXSxhcmd1bWVudHMpLGMuZGVxdWV1ZSgpfSl9KX19KGpRdWVyeSksZnVuY3Rpb24oYSxiKXthLmVmZmVjdHMuYm91bmNlPWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKSxkPVsicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiXSxlPWEuZWZmZWN0cy5zZXRNb2RlKGMsYi5vcHRpb25zLm1vZGV8fCJlZmZlY3QiKSxmPWIub3B0aW9ucy5kaXJlY3Rpb258fCJ1cCIsZz1iLm9wdGlvbnMuZGlzdGFuY2V8fDIwLGg9Yi5vcHRpb25zLnRpbWVzfHw1LGk9Yi5kdXJhdGlvbnx8MjUwOy9zaG93fGhpZGUvLnRlc3QoZSkmJmQucHVzaCgib3BhY2l0eSIpLGEuZWZmZWN0cy5zYXZlKGMsZCksYy5zaG93KCksYS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoYyk7dmFyIGo9Zj09InVwInx8Zj09ImRvd24iPyJ0b3AiOiJsZWZ0IixrPWY9PSJ1cCJ8fGY9PSJsZWZ0Ij8icG9zIjoibmVnIixnPWIub3B0aW9ucy5kaXN0YW5jZXx8KGo9PSJ0b3AiP2Mub3V0ZXJIZWlnaHQoITApLzM6Yy5vdXRlcldpZHRoKCEwKS8zKTtlPT0ic2hvdyImJmMuY3NzKCJvcGFjaXR5IiwwKS5jc3MoaixrPT0icG9zIj8tZzpnKSxlPT0iaGlkZSImJihnPWcvKGgqMikpLGUhPSJoaWRlIiYmaC0tO2lmKGU9PSJzaG93Iil7dmFyIGw9e29wYWNpdHk6MX07bFtqXT0oaz09InBvcyI/Iis9IjoiLT0iKStnLGMuYW5pbWF0ZShsLGkvMixiLm9wdGlvbnMuZWFzaW5nKSxnPWcvMixoLS19Zm9yKHZhciBtPTA7bTxoO20rKyl7dmFyIG49e30scD17fTtuW2pdPShrPT0icG9zIj8iLT0iOiIrPSIpK2cscFtqXT0oaz09InBvcyI/Iis9IjoiLT0iKStnLGMuYW5pbWF0ZShuLGkvMixiLm9wdGlvbnMuZWFzaW5nKS5hbmltYXRlKHAsaS8yLGIub3B0aW9ucy5lYXNpbmcpLGc9ZT09ImhpZGUiP2cqMjpnLzJ9aWYoZT09ImhpZGUiKXt2YXIgbD17b3BhY2l0eTowfTtsW2pdPShrPT0icG9zIj8iLT0iOiIrPSIpK2csYy5hbmltYXRlKGwsaS8yLGIub3B0aW9ucy5lYXNpbmcsZnVuY3Rpb24oKXtjLmhpZGUoKSxhLmVmZmVjdHMucmVzdG9yZShjLGQpLGEuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKGMpLGIuY2FsbGJhY2smJmIuY2FsbGJhY2suYXBwbHkodGhpcyxhcmd1bWVudHMpfSl9ZWxzZXt2YXIgbj17fSxwPXt9O25bal09KGs9PSJwb3MiPyItPSI6Iis9IikrZyxwW2pdPShrPT0icG9zIj8iKz0iOiItPSIpK2csYy5hbmltYXRlKG4saS8yLGIub3B0aW9ucy5lYXNpbmcpLmFuaW1hdGUocCxpLzIsYi5vcHRpb25zLmVhc2luZyxmdW5jdGlvbigpe2EuZWZmZWN0cy5yZXN0b3JlKGMsZCksYS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoYyksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX1jLnF1ZXVlKCJmeCIsZnVuY3Rpb24oKXtjLmRlcXVldWUoKX0pLGMuZGVxdWV1ZSgpfSl9fShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7YS5lZmZlY3RzLmNsaXA9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsImhlaWdodCIsIndpZHRoIl0sZT1hLmVmZmVjdHMuc2V0TW9kZShjLGIub3B0aW9ucy5tb2RlfHwiaGlkZSIpLGY9Yi5vcHRpb25zLmRpcmVjdGlvbnx8InZlcnRpY2FsIjthLmVmZmVjdHMuc2F2ZShjLGQpLGMuc2hvdygpO3ZhciBnPWEuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKGMpLmNzcyh7b3ZlcmZsb3c6ImhpZGRlbiJ9KSxoPWNbMF0udGFnTmFtZT09IklNRyI/ZzpjLGk9e3NpemU6Zj09InZlcnRpY2FsIj8iaGVpZ2h0Ijoid2lkdGgiLHBvc2l0aW9uOmY9PSJ2ZXJ0aWNhbCI/InRvcCI6ImxlZnQifSxqPWY9PSJ2ZXJ0aWNhbCI/aC5oZWlnaHQoKTpoLndpZHRoKCk7ZT09InNob3ciJiYoaC5jc3MoaS5zaXplLDApLGguY3NzKGkucG9zaXRpb24sai8yKSk7dmFyIGs9e307a1tpLnNpemVdPWU9PSJzaG93Ij9qOjAsa1tpLnBvc2l0aW9uXT1lPT0ic2hvdyI/MDpqLzIsaC5hbmltYXRlKGsse3F1ZXVlOiExLGR1cmF0aW9uOmIuZHVyYXRpb24sZWFzaW5nOmIub3B0aW9ucy5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtlPT0iaGlkZSImJmMuaGlkZSgpLGEuZWZmZWN0cy5yZXN0b3JlKGMsZCksYS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoYyksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseShjWzBdLGFyZ3VtZW50cyksYy5kZXF1ZXVlKCl9fSl9KX19KGpRdWVyeSksZnVuY3Rpb24oYSxiKXthLmVmZmVjdHMuZHJvcD1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZD1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0Iiwib3BhY2l0eSJdLGU9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8ImhpZGUiKSxmPWIub3B0aW9ucy5kaXJlY3Rpb258fCJsZWZ0IjthLmVmZmVjdHMuc2F2ZShjLGQpLGMuc2hvdygpLGEuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKGMpO3ZhciBnPWY9PSJ1cCJ8fGY9PSJkb3duIj8idG9wIjoibGVmdCIsaD1mPT0idXAifHxmPT0ibGVmdCI/InBvcyI6Im5lZyIsaT1iLm9wdGlvbnMuZGlzdGFuY2V8fChnPT0idG9wIj9jLm91dGVySGVpZ2h0KCEwKS8yOmMub3V0ZXJXaWR0aCghMCkvMik7ZT09InNob3ciJiZjLmNzcygib3BhY2l0eSIsMCkuY3NzKGcsaD09InBvcyI/LWk6aSk7dmFyIGo9e29wYWNpdHk6ZT09InNob3ciPzE6MH07altnXT0oZT09InNob3ciP2g9PSJwb3MiPyIrPSI6Ii09IjpoPT0icG9zIj8iLT0iOiIrPSIpK2ksYy5hbmltYXRlKGose3F1ZXVlOiExLGR1cmF0aW9uOmIuZHVyYXRpb24sZWFzaW5nOmIub3B0aW9ucy5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtlPT0iaGlkZSImJmMuaGlkZSgpLGEuZWZmZWN0cy5yZXN0b3JlKGMsZCksYS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoYyksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseSh0aGlzLGFyZ3VtZW50cyksYy5kZXF1ZXVlKCl9fSl9KX19KGpRdWVyeSksZnVuY3Rpb24oYSxiKXthLmVmZmVjdHMuZXhwbG9kZT1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBjPWIub3B0aW9ucy5waWVjZXM/TWF0aC5yb3VuZChNYXRoLnNxcnQoYi5vcHRpb25zLnBpZWNlcykpOjMsZD1iLm9wdGlvbnMucGllY2VzP01hdGgucm91bmQoTWF0aC5zcXJ0KGIub3B0aW9ucy5waWVjZXMpKTozO2Iub3B0aW9ucy5tb2RlPWIub3B0aW9ucy5tb2RlPT0idG9nZ2xlIj9hKHRoaXMpLmlzKCI6dmlzaWJsZSIpPyJoaWRlIjoic2hvdyI6Yi5vcHRpb25zLm1vZGU7dmFyIGU9YSh0aGlzKS5zaG93KCkuY3NzKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIiksZj1lLm9mZnNldCgpO2YudG9wLT1wYXJzZUludChlLmNzcygibWFyZ2luVG9wIiksMTApfHwwLGYubGVmdC09cGFyc2VJbnQoZS5jc3MoIm1hcmdpbkxlZnQiKSwxMCl8fDA7dmFyIGc9ZS5vdXRlcldpZHRoKCEwKSxoPWUub3V0ZXJIZWlnaHQoITApO2Zvcih2YXIgaT0wO2k8YztpKyspZm9yKHZhciBqPTA7ajxkO2orKyllLmNsb25lKCkuYXBwZW5kVG8oImJvZHkiKS53cmFwKCI8ZGl2PjwvZGl2PiIpLmNzcyh7cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJ2aXNpYmxlIixsZWZ0Oi1qKihnL2QpLHRvcDotaSooaC9jKX0pLnBhcmVudCgpLmFkZENsYXNzKCJ1aS1lZmZlY3RzLWV4cGxvZGUiKS5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsb3ZlcmZsb3c6ImhpZGRlbiIsd2lkdGg6Zy9kLGhlaWdodDpoL2MsbGVmdDpmLmxlZnQraiooZy9kKSsoYi5vcHRpb25zLm1vZGU9PSJzaG93Ij8oai1NYXRoLmZsb29yKGQvMikpKihnL2QpOjApLHRvcDpmLnRvcCtpKihoL2MpKyhiLm9wdGlvbnMubW9kZT09InNob3ciPyhpLU1hdGguZmxvb3IoYy8yKSkqKGgvYyk6MCksb3BhY2l0eTpiLm9wdGlvbnMubW9kZT09InNob3ciPzA6MX0pLmFuaW1hdGUoe2xlZnQ6Zi5sZWZ0K2oqKGcvZCkrKGIub3B0aW9ucy5tb2RlPT0ic2hvdyI/MDooai1NYXRoLmZsb29yKGQvMikpKihnL2QpKSx0b3A6Zi50b3AraSooaC9jKSsoYi5vcHRpb25zLm1vZGU9PSJzaG93Ij8wOihpLU1hdGguZmxvb3IoYy8yKSkqKGgvYykpLG9wYWNpdHk6Yi5vcHRpb25zLm1vZGU9PSJzaG93Ij8xOjB9LGIuZHVyYXRpb258fDUwMCk7c2V0VGltZW91dChmdW5jdGlvbigpe2Iub3B0aW9ucy5tb2RlPT0ic2hvdyI/ZS5jc3Moe3Zpc2liaWxpdHk6InZpc2libGUifSk6ZS5jc3Moe3Zpc2liaWxpdHk6InZpc2libGUifSkuaGlkZSgpLGIuY2FsbGJhY2smJmIuY2FsbGJhY2suYXBwbHkoZVswXSksZS5kZXF1ZXVlKCksYSgiZGl2LnVpLWVmZmVjdHMtZXhwbG9kZSIpLnJlbW92ZSgpfSxiLmR1cmF0aW9ufHw1MDApfSl9fShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7YS5lZmZlY3RzLmZhZGU9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8ImhpZGUiKTtjLmFuaW1hdGUoe29wYWNpdHk6ZH0se3F1ZXVlOiExLGR1cmF0aW9uOmIuZHVyYXRpb24sZWFzaW5nOmIub3B0aW9ucy5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtiLmNhbGxiYWNrJiZiLmNhbGxiYWNrLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxjLmRlcXVldWUoKX19KX0pfX0oalF1ZXJ5KSxmdW5jdGlvbihhLGIpe2EuZWZmZWN0cy5mb2xkPWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKSxkPVsicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiXSxlPWEuZWZmZWN0cy5zZXRNb2RlKGMsYi5vcHRpb25zLm1vZGV8fCJoaWRlIiksZj1iLm9wdGlvbnMuc2l6ZXx8MTUsZz0hIWIub3B0aW9ucy5ob3JpekZpcnN0LGg9Yi5kdXJhdGlvbj9iLmR1cmF0aW9uLzI6YS5meC5zcGVlZHMuX2RlZmF1bHQvMjthLmVmZmVjdHMuc2F2ZShjLGQpLGMuc2hvdygpO3ZhciBpPWEuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKGMpLmNzcyh7b3ZlcmZsb3c6ImhpZGRlbiJ9KSxqPWU9PSJzaG93IiE9ZyxrPWo/WyJ3aWR0aCIsImhlaWdodCJdOlsiaGVpZ2h0Iiwid2lkdGgiXSxsPWo/W2kud2lkdGgoKSxpLmhlaWdodCgpXTpbaS5oZWlnaHQoKSxpLndpZHRoKCldLG09LyhbMC05XSspJS8uZXhlYyhmKTttJiYoZj1wYXJzZUludChtWzFdLDEwKS8xMDAqbFtlPT0iaGlkZSI/MDoxXSksZT09InNob3ciJiZpLmNzcyhnP3toZWlnaHQ6MCx3aWR0aDpmfTp7aGVpZ2h0OmYsd2lkdGg6MH0pO3ZhciBuPXt9LHA9e307bltrWzBdXT1lPT0ic2hvdyI/bFswXTpmLHBba1sxXV09ZT09InNob3ciP2xbMV06MCxpLmFuaW1hdGUobixoLGIub3B0aW9ucy5lYXNpbmcpLmFuaW1hdGUocCxoLGIub3B0aW9ucy5lYXNpbmcsZnVuY3Rpb24oKXtlPT0iaGlkZSImJmMuaGlkZSgpLGEuZWZmZWN0cy5yZXN0b3JlKGMsZCksYS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoYyksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseShjWzBdLGFyZ3VtZW50cyksYy5kZXF1ZXVlKCl9KX0pfX0oalF1ZXJ5KSxmdW5jdGlvbihhLGIpe2EuZWZmZWN0cy5oaWdobGlnaHQ9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9WyJiYWNrZ3JvdW5kSW1hZ2UiLCJiYWNrZ3JvdW5kQ29sb3IiLCJvcGFjaXR5Il0sZT1hLmVmZmVjdHMuc2V0TW9kZShjLGIub3B0aW9ucy5tb2RlfHwic2hvdyIpLGY9e2JhY2tncm91bmRDb2xvcjpjLmNzcygiYmFja2dyb3VuZENvbG9yIil9O2U9PSJoaWRlIiYmKGYub3BhY2l0eT0wKSxhLmVmZmVjdHMuc2F2ZShjLGQpLGMuc2hvdygpLmNzcyh7YmFja2dyb3VuZEltYWdlOiJub25lIixiYWNrZ3JvdW5kQ29sb3I6Yi5vcHRpb25zLmNvbG9yfHwiI2ZmZmY5OSJ9KS5hbmltYXRlKGYse3F1ZXVlOiExLGR1cmF0aW9uOmIuZHVyYXRpb24sZWFzaW5nOmIub3B0aW9ucy5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtlPT0iaGlkZSImJmMuaGlkZSgpLGEuZWZmZWN0cy5yZXN0b3JlKGMsZCksZT09InNob3ciJiYhYS5zdXBwb3J0Lm9wYWNpdHkmJnRoaXMuc3R5bGUucmVtb3ZlQXR0cmlidXRlKCJmaWx0ZXIiKSxiLmNhbGxiYWNrJiZiLmNhbGxiYWNrLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxjLmRlcXVldWUoKX19KX0pfX0oalF1ZXJ5KSxmdW5jdGlvbihhLGIpe2EuZWZmZWN0cy5wdWxzYXRlPWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKSxkPWEuZWZmZWN0cy5zZXRNb2RlKGMsYi5vcHRpb25zLm1vZGV8fCJzaG93IiksZT0oYi5vcHRpb25zLnRpbWVzfHw1KSoyLTEsZj1iLmR1cmF0aW9uP2IuZHVyYXRpb24vMjphLmZ4LnNwZWVkcy5fZGVmYXVsdC8yLGc9Yy5pcygiOnZpc2libGUiKSxoPTA7Z3x8KGMuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCksaD0xKSwoZD09ImhpZGUiJiZnfHxkPT0ic2hvdyImJiFnKSYmZS0tO2Zvcih2YXIgaT0wO2k8ZTtpKyspYy5hbmltYXRlKHtvcGFjaXR5Omh9LGYsYi5vcHRpb25zLmVhc2luZyksaD0oaCsxKSUyO2MuYW5pbWF0ZSh7b3BhY2l0eTpofSxmLGIub3B0aW9ucy5lYXNpbmcsZnVuY3Rpb24oKXtoPT0wJiZjLmhpZGUoKSxiLmNhbGxiYWNrJiZiLmNhbGxiYWNrLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLGMucXVldWUoImZ4IixmdW5jdGlvbigpe2MuZGVxdWV1ZSgpfSkuZGVxdWV1ZSgpfSl9fShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7YS5lZmZlY3RzLnB1ZmY9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8ImhpZGUiKSxlPXBhcnNlSW50KGIub3B0aW9ucy5wZXJjZW50LDEwKXx8MTUwLGY9ZS8xMDAsZz17aGVpZ2h0OmMuaGVpZ2h0KCksd2lkdGg6Yy53aWR0aCgpfTthLmV4dGVuZChiLm9wdGlvbnMse2ZhZGU6ITAsbW9kZTpkLHBlcmNlbnQ6ZD09ImhpZGUiP2U6MTAwLGZyb206ZD09ImhpZGUiP2c6e2hlaWdodDpnLmhlaWdodCpmLHdpZHRoOmcud2lkdGgqZn19KSxjLmVmZmVjdCgic2NhbGUiLGIub3B0aW9ucyxiLmR1cmF0aW9uLGIuY2FsbGJhY2spLGMuZGVxdWV1ZSgpfSl9LGEuZWZmZWN0cy5zY2FsZT1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZD1hLmV4dGVuZCghMCx7fSxiLm9wdGlvbnMpLGU9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8ImVmZmVjdCIpLGY9cGFyc2VJbnQoYi5vcHRpb25zLnBlcmNlbnQsMTApfHwocGFyc2VJbnQoYi5vcHRpb25zLnBlcmNlbnQsMTApPT0wPzA6ZT09ImhpZGUiPzA6MTAwKSxnPWIub3B0aW9ucy5kaXJlY3Rpb258fCJib3RoIixoPWIub3B0aW9ucy5vcmlnaW47ZSE9ImVmZmVjdCImJihkLm9yaWdpbj1ofHxbIm1pZGRsZSIsImNlbnRlciJdLGQucmVzdG9yZT0hMCk7dmFyIGk9e2hlaWdodDpjLmhlaWdodCgpLHdpZHRoOmMud2lkdGgoKX07Yy5mcm9tPWIub3B0aW9ucy5mcm9tfHwoZT09InNob3ciP3toZWlnaHQ6MCx3aWR0aDowfTppKTt2YXIgaj17eTpnIT0iaG9yaXpvbnRhbCI/Zi8xMDA6MSx4OmchPSJ2ZXJ0aWNhbCI/Zi8xMDA6MX07Yy50bz17aGVpZ2h0OmkuaGVpZ2h0KmoueSx3aWR0aDppLndpZHRoKmoueH0sYi5vcHRpb25zLmZhZGUmJihlPT0ic2hvdyImJihjLmZyb20ub3BhY2l0eT0wLGMudG8ub3BhY2l0eT0xKSxlPT0iaGlkZSImJihjLmZyb20ub3BhY2l0eT0xLGMudG8ub3BhY2l0eT0wKSksZC5mcm9tPWMuZnJvbSxkLnRvPWMudG8sZC5tb2RlPWUsYy5lZmZlY3QoInNpemUiLGQsYi5kdXJhdGlvbixiLmNhbGxiYWNrKSxjLmRlcXVldWUoKX0pfSxhLmVmZmVjdHMuc2l6ZT1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZD1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0Iiwid2lkdGgiLCJoZWlnaHQiLCJvdmVyZmxvdyIsIm9wYWNpdHkiXSxlPVsicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiLCJvdmVyZmxvdyIsIm9wYWNpdHkiXSxmPVsid2lkdGgiLCJoZWlnaHQiLCJvdmVyZmxvdyJdLGc9WyJmb250U2l6ZSJdLGg9WyJib3JkZXJUb3BXaWR0aCIsImJvcmRlckJvdHRvbVdpZHRoIiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iXSxpPVsiYm9yZGVyTGVmdFdpZHRoIiwiYm9yZGVyUmlnaHRXaWR0aCIsInBhZGRpbmdMZWZ0IiwicGFkZGluZ1JpZ2h0Il0saj1hLmVmZmVjdHMuc2V0TW9kZShjLGIub3B0aW9ucy5tb2RlfHwiZWZmZWN0Iiksaz1iLm9wdGlvbnMucmVzdG9yZXx8ITEsbD1iLm9wdGlvbnMuc2NhbGV8fCJib3RoIixtPWIub3B0aW9ucy5vcmlnaW4sbj17aGVpZ2h0OmMuaGVpZ2h0KCksd2lkdGg6Yy53aWR0aCgpfTtjLmZyb209Yi5vcHRpb25zLmZyb218fG4sYy50bz1iLm9wdGlvbnMudG98fG47aWYobSl7dmFyIHA9YS5lZmZlY3RzLmdldEJhc2VsaW5lKG0sbik7Yy5mcm9tLnRvcD0obi5oZWlnaHQtYy5mcm9tLmhlaWdodCkqcC55LGMuZnJvbS5sZWZ0PShuLndpZHRoLWMuZnJvbS53aWR0aCkqcC54LGMudG8udG9wPShuLmhlaWdodC1jLnRvLmhlaWdodCkqcC55LGMudG8ubGVmdD0obi53aWR0aC1jLnRvLndpZHRoKSpwLnh9dmFyIHE9e2Zyb206e3k6Yy5mcm9tLmhlaWdodC9uLmhlaWdodCx4OmMuZnJvbS53aWR0aC9uLndpZHRofSx0bzp7eTpjLnRvLmhlaWdodC9uLmhlaWdodCx4OmMudG8ud2lkdGgvbi53aWR0aH19O2lmKGw9PSJib3gifHxsPT0iYm90aCIpcS5mcm9tLnkhPXEudG8ueSYmKGQ9ZC5jb25jYXQoaCksYy5mcm9tPWEuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGMsaCxxLmZyb20ueSxjLmZyb20pLGMudG89YS5lZmZlY3RzLnNldFRyYW5zaXRpb24oYyxoLHEudG8ueSxjLnRvKSkscS5mcm9tLnghPXEudG8ueCYmKGQ9ZC5jb25jYXQoaSksYy5mcm9tPWEuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGMsaSxxLmZyb20ueCxjLmZyb20pLGMudG89YS5lZmZlY3RzLnNldFRyYW5zaXRpb24oYyxpLHEudG8ueCxjLnRvKSk7KGw9PSJjb250ZW50Inx8bD09ImJvdGgiKSYmcS5mcm9tLnkhPXEudG8ueSYmKGQ9ZC5jb25jYXQoZyksYy5mcm9tPWEuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGMsZyxxLmZyb20ueSxjLmZyb20pLGMudG89YS5lZmZlY3RzLnNldFRyYW5zaXRpb24oYyxnLHEudG8ueSxjLnRvKSksYS5lZmZlY3RzLnNhdmUoYyxrP2Q6ZSksYy5zaG93KCksYS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoYyksYy5jc3MoIm92ZXJmbG93IiwiaGlkZGVuIikuY3NzKGMuZnJvbSk7aWYobD09ImNvbnRlbnQifHxsPT0iYm90aCIpaD1oLmNvbmNhdChbIm1hcmdpblRvcCIsIm1hcmdpbkJvdHRvbSJdKS5jb25jYXQoZyksaT1pLmNvbmNhdChbIm1hcmdpbkxlZnQiLCJtYXJnaW5SaWdodCJdKSxmPWQuY29uY2F0KGgpLmNvbmNhdChpKSxjLmZpbmQoIipbd2lkdGhdIikuZWFjaChmdW5jdGlvbigpe3ZhciBjPWEodGhpcyk7ayYmYS5lZmZlY3RzLnNhdmUoYyxmKTt2YXIgZD17aGVpZ2h0OmMuaGVpZ2h0KCksd2lkdGg6Yy53aWR0aCgpfTtjLmZyb209e2hlaWdodDpkLmhlaWdodCpxLmZyb20ueSx3aWR0aDpkLndpZHRoKnEuZnJvbS54fSxjLnRvPXtoZWlnaHQ6ZC5oZWlnaHQqcS50by55LHdpZHRoOmQud2lkdGgqcS50by54fSxxLmZyb20ueSE9cS50by55JiYoYy5mcm9tPWEuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGMsaCxxLmZyb20ueSxjLmZyb20pLGMudG89YS5lZmZlY3RzLnNldFRyYW5zaXRpb24oYyxoLHEudG8ueSxjLnRvKSkscS5mcm9tLnghPXEudG8ueCYmKGMuZnJvbT1hLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihjLGkscS5mcm9tLngsYy5mcm9tKSxjLnRvPWEuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGMsaSxxLnRvLngsYy50bykpLGMuY3NzKGMuZnJvbSksYy5hbmltYXRlKGMudG8sYi5kdXJhdGlvbixiLm9wdGlvbnMuZWFzaW5nLGZ1bmN0aW9uKCl7ayYmYS5lZmZlY3RzLnJlc3RvcmUoYyxmKX0pfSk7Yy5hbmltYXRlKGMudG8se3F1ZXVlOiExLGR1cmF0aW9uOmIuZHVyYXRpb24sZWFzaW5nOmIub3B0aW9ucy5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtjLnRvLm9wYWNpdHk9PT0wJiZjLmNzcygib3BhY2l0eSIsYy5mcm9tLm9wYWNpdHkpLGo9PSJoaWRlIiYmYy5oaWRlKCksYS5lZmZlY3RzLnJlc3RvcmUoYyxrP2Q6ZSksYS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoYyksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseSh0aGlzLGFyZ3VtZW50cyksYy5kZXF1ZXVlKCl9fSl9KX19KGpRdWVyeSksZnVuY3Rpb24oYSxiKXthLmVmZmVjdHMuc2hha2U9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCJdLGU9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8ImVmZmVjdCIpLGY9Yi5vcHRpb25zLmRpcmVjdGlvbnx8ImxlZnQiLGc9Yi5vcHRpb25zLmRpc3RhbmNlfHwyMCxoPWIub3B0aW9ucy50aW1lc3x8MyxpPWIuZHVyYXRpb258fGIub3B0aW9ucy5kdXJhdGlvbnx8MTQwO2EuZWZmZWN0cy5zYXZlKGMsZCksYy5zaG93KCksYS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoYyk7dmFyIGo9Zj09InVwInx8Zj09ImRvd24iPyJ0b3AiOiJsZWZ0IixrPWY9PSJ1cCJ8fGY9PSJsZWZ0Ij8icG9zIjoibmVnIixsPXt9LG09e30sbj17fTtsW2pdPShrPT0icG9zIj8iLT0iOiIrPSIpK2csbVtqXT0oaz09InBvcyI/Iis9IjoiLT0iKStnKjIsbltqXT0oaz09InBvcyI/Ii09IjoiKz0iKStnKjIsYy5hbmltYXRlKGwsaSxiLm9wdGlvbnMuZWFzaW5nKTtmb3IodmFyIHA9MTtwPGg7cCsrKWMuYW5pbWF0ZShtLGksYi5vcHRpb25zLmVhc2luZykuYW5pbWF0ZShuLGksYi5vcHRpb25zLmVhc2luZyk7Yy5hbmltYXRlKG0saSxiLm9wdGlvbnMuZWFzaW5nKS5hbmltYXRlKGwsaS8yLGIub3B0aW9ucy5lYXNpbmcsZnVuY3Rpb24oKXthLmVmZmVjdHMucmVzdG9yZShjLGQpLGEuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKGMpLGIuY2FsbGJhY2smJmIuY2FsbGJhY2suYXBwbHkodGhpcyxhcmd1bWVudHMpfSksYy5xdWV1ZSgiZngiLGZ1bmN0aW9uKCl7Yy5kZXF1ZXVlKCl9KSxjLmRlcXVldWUoKX0pfX0oalF1ZXJ5KSxmdW5jdGlvbihhLGIpe2EuZWZmZWN0cy5zbGlkZT1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZD1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0Il0sZT1hLmVmZmVjdHMuc2V0TW9kZShjLGIub3B0aW9ucy5tb2RlfHwic2hvdyIpLGY9Yi5vcHRpb25zLmRpcmVjdGlvbnx8ImxlZnQiO2EuZWZmZWN0cy5zYXZlKGMsZCksYy5zaG93KCksYS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoYykuY3NzKHtvdmVyZmxvdzoiaGlkZGVuIn0pO3ZhciBnPWY9PSJ1cCJ8fGY9PSJkb3duIj8idG9wIjoibGVmdCIsaD1mPT0idXAifHxmPT0ibGVmdCI/InBvcyI6Im5lZyIsaT1iLm9wdGlvbnMuZGlzdGFuY2V8fChnPT0idG9wIj9jLm91dGVySGVpZ2h0KCEwKTpjLm91dGVyV2lkdGgoITApKTtlPT0ic2hvdyImJmMuY3NzKGcsaD09InBvcyI/aXNOYU4oaSk/Ii0iK2k6LWk6aSk7dmFyIGo9e307altnXT0oZT09InNob3ciP2g9PSJwb3MiPyIrPSI6Ii09IjpoPT0icG9zIj8iLT0iOiIrPSIpK2ksYy5hbmltYXRlKGose3F1ZXVlOiExLGR1cmF0aW9uOmIuZHVyYXRpb24sZWFzaW5nOmIub3B0aW9ucy5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtlPT0iaGlkZSImJmMuaGlkZSgpLGEuZWZmZWN0cy5yZXN0b3JlKGMsZCksYS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoYyksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseSh0aGlzLGFyZ3VtZW50cyksYy5kZXF1ZXVlKCl9fSl9KX19KGpRdWVyeSksZnVuY3Rpb24oYSxiKXthLmVmZmVjdHMudHJhbnNmZXI9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9YShiLm9wdGlvbnMudG8pLGU9ZC5vZmZzZXQoKSxmPXt0b3A6ZS50b3AsbGVmdDplLmxlZnQsaGVpZ2h0OmQuaW5uZXJIZWlnaHQoKSx3aWR0aDpkLmlubmVyV2lkdGgoKX0sZz1jLm9mZnNldCgpLGg9YSgnPGRpdiBjbGFzcz0idWktZWZmZWN0cy10cmFuc2ZlciI+PC9kaXY+JykuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSkuYWRkQ2xhc3MoYi5vcHRpb25zLmNsYXNzTmFtZSkuY3NzKHt0b3A6Zy50b3AsbGVmdDpnLmxlZnQsaGVpZ2h0OmMuaW5uZXJIZWlnaHQoKSx3aWR0aDpjLmlubmVyV2lkdGgoKSxwb3NpdGlvbjoiYWJzb2x1dGUifSkuYW5pbWF0ZShmLGIuZHVyYXRpb24sYi5vcHRpb25zLmVhc2luZyxmdW5jdGlvbigpe2gucmVtb3ZlKCksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseShjWzBdLGFyZ3VtZW50cyksYy5kZXF1ZXVlKCl9KX0pfX0oalF1ZXJ5KSxmdW5jdGlvbihhLGIpe2Eud2lkZ2V0KCJ1aS5hY2NvcmRpb24iLHtvcHRpb25zOnthY3RpdmU6MCxhbmltYXRlZDoic2xpZGUiLGF1dG9IZWlnaHQ6ITAsY2xlYXJTdHlsZTohMSxjb2xsYXBzaWJsZTohMSxldmVudDoiY2xpY2siLGZpbGxTcGFjZTohMSxoZWFkZXI6Ij4gbGkgPiA6Zmlyc3QtY2hpbGQsPiA6bm90KGxpKTpldmVuIixpY29uczp7aGVhZGVyOiJ1aS1pY29uLXRyaWFuZ2xlLTEtZSIsaGVhZGVyU2VsZWN0ZWQ6InVpLWljb24tdHJpYW5nbGUtMS1zIn0sbmF2aWdhdGlvbjohMSxuYXZpZ2F0aW9uRmlsdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaHJlZi50b0xvd2VyQ2FzZSgpPT09bG9jYXRpb24uaHJlZi50b0xvd2VyQ2FzZSgpfX0sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMsYz1iLm9wdGlvbnM7Yi5ydW5uaW5nPTAsYi5lbGVtZW50LmFkZENsYXNzKCJ1aS1hY2NvcmRpb24gdWktd2lkZ2V0IHVpLWhlbHBlci1yZXNldCIpLmNoaWxkcmVuKCJsaSIpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24tbGktZml4IiksYi5oZWFkZXJzPWIuZWxlbWVudC5maW5kKGMuaGVhZGVyKS5hZGRDbGFzcygidWktYWNjb3JkaW9uLWhlYWRlciB1aS1oZWxwZXItcmVzZXQgdWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIikuYmluZCgibW91c2VlbnRlci5hY2NvcmRpb24iLGZ1bmN0aW9uKCl7aWYoYy5kaXNhYmxlZClyZXR1cm47YSh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtaG92ZXIiKX0pLmJpbmQoIm1vdXNlbGVhdmUuYWNjb3JkaW9uIixmdW5jdGlvbigpe2lmKGMuZGlzYWJsZWQpcmV0dXJuO2EodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIil9KS5iaW5kKCJmb2N1cy5hY2NvcmRpb24iLGZ1bmN0aW9uKCl7aWYoYy5kaXNhYmxlZClyZXR1cm47YSh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtZm9jdXMiKX0pLmJpbmQoImJsdXIuYWNjb3JkaW9uIixmdW5jdGlvbigpe2lmKGMuZGlzYWJsZWQpcmV0dXJuO2EodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWZvY3VzIil9KSxiLmhlYWRlcnMubmV4dCgpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24tY29udGVudCB1aS1oZWxwZXItcmVzZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSIpO2lmKGMubmF2aWdhdGlvbil7dmFyIGQ9Yi5lbGVtZW50LmZpbmQoImEiKS5maWx0ZXIoYy5uYXZpZ2F0aW9uRmlsdGVyKS5lcSgwKTtpZihkLmxlbmd0aCl7dmFyIGU9ZC5jbG9zZXN0KCIudWktYWNjb3JkaW9uLWhlYWRlciIpO2UubGVuZ3RoP2IuYWN0aXZlPWU6Yi5hY3RpdmU9ZC5jbG9zZXN0KCIudWktYWNjb3JkaW9uLWNvbnRlbnQiKS5wcmV2KCl9fWIuYWN0aXZlPWIuX2ZpbmRBY3RpdmUoYi5hY3RpdmV8fGMuYWN0aXZlKS5hZGRDbGFzcygidWktc3RhdGUtZGVmYXVsdCB1aS1zdGF0ZS1hY3RpdmUiKS50b2dnbGVDbGFzcygidWktY29ybmVyLWFsbCIpLnRvZ2dsZUNsYXNzKCJ1aS1jb3JuZXItdG9wIiksYi5hY3RpdmUubmV4dCgpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24tY29udGVudC1hY3RpdmUiKSxiLl9jcmVhdGVJY29ucygpLGIucmVzaXplKCksYi5lbGVtZW50LmF0dHIoInJvbGUiLCJ0YWJsaXN0IiksYi5oZWFkZXJzLmF0dHIoInJvbGUiLCJ0YWIiKS5iaW5kKCJrZXlkb3duLmFjY29yZGlvbiIsZnVuY3Rpb24oYSl7cmV0dXJuIGIuX2tleWRvd24oYSl9KS5uZXh0KCkuYXR0cigicm9sZSIsInRhYnBhbmVsIiksYi5oZWFkZXJzLm5vdChiLmFjdGl2ZXx8IiIpLmF0dHIoeyJhcmlhLWV4cGFuZGVkIjoiZmFsc2UiLCJhcmlhLXNlbGVjdGVkIjoiZmFsc2UiLHRhYkluZGV4Oi0xfSkubmV4dCgpLmhpZGUoKSxiLmFjdGl2ZS5sZW5ndGg/Yi5hY3RpdmUuYXR0cih7ImFyaWEtZXhwYW5kZWQiOiJ0cnVlIiwiYXJpYS1zZWxlY3RlZCI6InRydWUiLHRhYkluZGV4OjB9KTpiLmhlYWRlcnMuZXEoMCkuYXR0cigidGFiSW5kZXgiLDApLGEuYnJvd3Nlci5zYWZhcml8fGIuaGVhZGVycy5maW5kKCJhIikuYXR0cigidGFiSW5kZXgiLC0xKSxjLmV2ZW50JiZiLmhlYWRlcnMuYmluZChjLmV2ZW50LnNwbGl0KCIgIikuam9pbigiLmFjY29yZGlvbiAiKSsiLmFjY29yZGlvbiIsZnVuY3Rpb24oYSl7Yi5fY2xpY2tIYW5kbGVyLmNhbGwoYixhLHRoaXMpLGEucHJldmVudERlZmF1bHQoKX0pfSxfY3JlYXRlSWNvbnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9wdGlvbnM7Yi5pY29ucyYmKGEoIjxzcGFuPjwvc3Bhbj4iKS5hZGRDbGFzcygidWktaWNvbiAiK2IuaWNvbnMuaGVhZGVyKS5wcmVwZW5kVG8odGhpcy5oZWFkZXJzKSx0aGlzLmFjdGl2ZS5jaGlsZHJlbigiLnVpLWljb24iKS50b2dnbGVDbGFzcyhiLmljb25zLmhlYWRlcikudG9nZ2xlQ2xhc3MoYi5pY29ucy5oZWFkZXJTZWxlY3RlZCksdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1hY2NvcmRpb24taWNvbnMiKSl9LF9kZXN0cm95SWNvbnM6ZnVuY3Rpb24oKXt0aGlzLmhlYWRlcnMuY2hpbGRyZW4oIi51aS1pY29uIikucmVtb3ZlKCksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1hY2NvcmRpb24taWNvbnMiKX0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3B0aW9uczt0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLWFjY29yZGlvbiB1aS13aWRnZXQgdWktaGVscGVyLXJlc2V0IikucmVtb3ZlQXR0cigicm9sZSIpLHRoaXMuaGVhZGVycy51bmJpbmQoIi5hY2NvcmRpb24iKS5yZW1vdmVDbGFzcygidWktYWNjb3JkaW9uLWhlYWRlciB1aS1hY2NvcmRpb24tZGlzYWJsZWQgdWktaGVscGVyLXJlc2V0IHVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCB1aS1zdGF0ZS1hY3RpdmUgdWktc3RhdGUtZGlzYWJsZWQgdWktY29ybmVyLXRvcCIpLnJlbW92ZUF0dHIoInJvbGUiKS5yZW1vdmVBdHRyKCJhcmlhLWV4cGFuZGVkIikucmVtb3ZlQXR0cigiYXJpYS1zZWxlY3RlZCIpLnJlbW92ZUF0dHIoInRhYkluZGV4IiksdGhpcy5oZWFkZXJzLmZpbmQoImEiKS5yZW1vdmVBdHRyKCJ0YWJJbmRleCIpLHRoaXMuX2Rlc3Ryb3lJY29ucygpO3ZhciBjPXRoaXMuaGVhZGVycy5uZXh0KCkuY3NzKCJkaXNwbGF5IiwiIikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUNsYXNzKCJ1aS1oZWxwZXItcmVzZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSB1aS1hY2NvcmRpb24tY29udGVudCB1aS1hY2NvcmRpb24tY29udGVudC1hY3RpdmUgdWktYWNjb3JkaW9uLWRpc2FibGVkIHVpLXN0YXRlLWRpc2FibGVkIik7cmV0dXJuKGIuYXV0b0hlaWdodHx8Yi5maWxsSGVpZ2h0KSYmYy5jc3MoImhlaWdodCIsIiIpLGEuV2lkZ2V0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyl9LF9zZXRPcHRpb246ZnVuY3Rpb24oYixjKXthLldpZGdldC5wcm90b3R5cGUuX3NldE9wdGlvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyksYj09ImFjdGl2ZSImJnRoaXMuYWN0aXZhdGUoYyksYj09Imljb25zIiYmKHRoaXMuX2Rlc3Ryb3lJY29ucygpLGMmJnRoaXMuX2NyZWF0ZUljb25zKCkpLGI9PSJkaXNhYmxlZCImJnRoaXMuaGVhZGVycy5hZGQodGhpcy5oZWFkZXJzLm5leHQoKSlbYz8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFzcyJdKCJ1aS1hY2NvcmRpb24tZGlzYWJsZWQgdWktc3RhdGUtZGlzYWJsZWQiKX0sX2tleWRvd246ZnVuY3Rpb24oYil7aWYodGhpcy5vcHRpb25zLmRpc2FibGVkfHxiLmFsdEtleXx8Yi5jdHJsS2V5KXJldHVybjt2YXIgYz1hLnVpLmtleUNvZGUsZD10aGlzLmhlYWRlcnMubGVuZ3RoLGU9dGhpcy5oZWFkZXJzLmluZGV4KGIudGFyZ2V0KSxmPSExO3N3aXRjaChiLmtleUNvZGUpe2Nhc2UgYy5SSUdIVDpjYXNlIGMuRE9XTjpmPXRoaXMuaGVhZGVyc1soZSsxKSVkXTticmVhaztjYXNlIGMuTEVGVDpjYXNlIGMuVVA6Zj10aGlzLmhlYWRlcnNbKGUtMStkKSVkXTticmVhaztjYXNlIGMuU1BBQ0U6Y2FzZSBjLkVOVEVSOnRoaXMuX2NsaWNrSGFuZGxlcih7dGFyZ2V0OmIudGFyZ2V0fSxiLnRhcmdldCksYi5wcmV2ZW50RGVmYXVsdCgpfXJldHVybiBmPyhhKGIudGFyZ2V0KS5hdHRyKCJ0YWJJbmRleCIsLTEpLGEoZikuYXR0cigidGFiSW5kZXgiLDApLGYuZm9jdXMoKSwhMSk6ITB9LHJlc2l6ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3B0aW9ucyxjO2lmKGIuZmlsbFNwYWNlKXtpZihhLmJyb3dzZXIubXNpZSl7dmFyIGQ9dGhpcy5lbGVtZW50LnBhcmVudCgpLmNzcygib3ZlcmZsb3ciKTt0aGlzLmVsZW1lbnQucGFyZW50KCkuY3NzKCJvdmVyZmxvdyIsImhpZGRlbiIpfWM9dGhpcy5lbGVtZW50LnBhcmVudCgpLmhlaWdodCgpLGEuYnJvd3Nlci5tc2llJiZ0aGlzLmVsZW1lbnQucGFyZW50KCkuY3NzKCJvdmVyZmxvdyIsZCksdGhpcy5oZWFkZXJzLmVhY2goZnVuY3Rpb24oKXtjLT1hKHRoaXMpLm91dGVySGVpZ2h0KCEwKX0pLHRoaXMuaGVhZGVycy5uZXh0KCkuZWFjaChmdW5jdGlvbigpe2EodGhpcykuaGVpZ2h0KE1hdGgubWF4KDAsYy1hKHRoaXMpLmlubmVySGVpZ2h0KCkrYSh0aGlzKS5oZWlnaHQoKSkpfSkuY3NzKCJvdmVyZmxvdyIsImF1dG8iKX1lbHNlIGIuYXV0b0hlaWdodCYmKGM9MCx0aGlzLmhlYWRlcnMubmV4dCgpLmVhY2goZnVuY3Rpb24oKXtjPU1hdGgubWF4KGMsYSh0aGlzKS5oZWlnaHQoIiIpLmhlaWdodCgpKX0pLmhlaWdodChjKSk7cmV0dXJuIHRoaXN9LGFjdGl2YXRlOmZ1bmN0aW9uKGEpe3RoaXMub3B0aW9ucy5hY3RpdmU9YTt2YXIgYj10aGlzLl9maW5kQWN0aXZlKGEpWzBdO3JldHVybiB0aGlzLl9jbGlja0hhbmRsZXIoe3RhcmdldDpifSxiKSx0aGlzfSxfZmluZEFjdGl2ZTpmdW5jdGlvbihiKXtyZXR1cm4gYj90eXBlb2YgYj09Im51bWJlciI/dGhpcy5oZWFkZXJzLmZpbHRlcigiOmVxKCIrYisiKSIpOnRoaXMuaGVhZGVycy5ub3QodGhpcy5oZWFkZXJzLm5vdChiKSk6Yj09PSExP2EoW10pOnRoaXMuaGVhZGVycy5maWx0ZXIoIjplcSgwKSIpfSxfY2xpY2tIYW5kbGVyOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9dGhpcy5vcHRpb25zO2lmKGQuZGlzYWJsZWQpcmV0dXJuO2lmKCFiLnRhcmdldCl7aWYoIWQuY29sbGFwc2libGUpcmV0dXJuO3RoaXMuYWN0aXZlLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUgdWktY29ybmVyLXRvcCIpLmFkZENsYXNzKCJ1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiKS5jaGlsZHJlbigiLnVpLWljb24iKS5yZW1vdmVDbGFzcyhkLmljb25zLmhlYWRlclNlbGVjdGVkKS5hZGRDbGFzcyhkLmljb25zLmhlYWRlciksdGhpcy5hY3RpdmUubmV4dCgpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24tY29udGVudC1hY3RpdmUiKTt2YXIgZT10aGlzLmFjdGl2ZS5uZXh0KCksZj17b3B0aW9uczpkLG5ld0hlYWRlcjphKFtdKSxvbGRIZWFkZXI6ZC5hY3RpdmUsbmV3Q29udGVudDphKFtdKSxvbGRDb250ZW50OmV9LGc9dGhpcy5hY3RpdmU9YShbXSk7dGhpcy5fdG9nZ2xlKGcsZSxmKTtyZXR1cm59dmFyIGg9YShiLmN1cnJlbnRUYXJnZXR8fGMpLGk9aFswXT09PXRoaXMuYWN0aXZlWzBdO2QuYWN0aXZlPWQuY29sbGFwc2libGUmJmk/ITE6dGhpcy5oZWFkZXJzLmluZGV4KGgpO2lmKHRoaXMucnVubmluZ3x8IWQuY29sbGFwc2libGUmJmkpcmV0dXJuO3ZhciBqPXRoaXMuYWN0aXZlLGc9aC5uZXh0KCksZT10aGlzLmFjdGl2ZS5uZXh0KCksZj17b3B0aW9uczpkLG5ld0hlYWRlcjppJiZkLmNvbGxhcHNpYmxlP2EoW10pOmgsb2xkSGVhZGVyOnRoaXMuYWN0aXZlLG5ld0NvbnRlbnQ6aSYmZC5jb2xsYXBzaWJsZT9hKFtdKTpnLG9sZENvbnRlbnQ6ZX0saz10aGlzLmhlYWRlcnMuaW5kZXgodGhpcy5hY3RpdmVbMF0pPnRoaXMuaGVhZGVycy5pbmRleChoWzBdKTt0aGlzLmFjdGl2ZT1pP2EoW10pOmgsdGhpcy5fdG9nZ2xlKGcsZSxmLGksayksai5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIHVpLWNvcm5lci10b3AiKS5hZGRDbGFzcygidWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIikuY2hpbGRyZW4oIi51aS1pY29uIikucmVtb3ZlQ2xhc3MoZC5pY29ucy5oZWFkZXJTZWxlY3RlZCkuYWRkQ2xhc3MoZC5pY29ucy5oZWFkZXIpLGl8fChoLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiKS5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIHVpLWNvcm5lci10b3AiKS5jaGlsZHJlbigiLnVpLWljb24iKS5yZW1vdmVDbGFzcyhkLmljb25zLmhlYWRlcikuYWRkQ2xhc3MoZC5pY29ucy5oZWFkZXJTZWxlY3RlZCksaC5uZXh0KCkuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1jb250ZW50LWFjdGl2ZSIpKTtyZXR1cm59LF90b2dnbGU6ZnVuY3Rpb24oYixjLGQsZSxmKXt2YXIgZz10aGlzLGg9Zy5vcHRpb25zO2cudG9TaG93PWIsZy50b0hpZGU9YyxnLmRhdGE9ZDt2YXIgaT1mdW5jdGlvbigpe2lmKCFnKXJldHVybjtyZXR1cm4gZy5fY29tcGxldGVkLmFwcGx5KGcsYXJndW1lbnRzKX07Zy5fdHJpZ2dlcigiY2hhbmdlc3RhcnQiLG51bGwsZy5kYXRhKSxnLnJ1bm5pbmc9Yy5zaXplKCk9PT0wP2Iuc2l6ZSgpOmMuc2l6ZSgpO2lmKGguYW5pbWF0ZWQpe3ZhciBqPXt9O2guY29sbGFwc2libGUmJmU/aj17dG9TaG93OmEoW10pLHRvSGlkZTpjLGNvbXBsZXRlOmksZG93bjpmLGF1dG9IZWlnaHQ6aC5hdXRvSGVpZ2h0fHxoLmZpbGxTcGFjZX06aj17dG9TaG93OmIsdG9IaWRlOmMsY29tcGxldGU6aSxkb3duOmYsYXV0b0hlaWdodDpoLmF1dG9IZWlnaHR8fGguZmlsbFNwYWNlfSxoLnByb3hpZWR8fChoLnByb3hpZWQ9aC5hbmltYXRlZCksaC5wcm94aWVkRHVyYXRpb258fChoLnByb3hpZWREdXJhdGlvbj1oLmR1cmF0aW9uKSxoLmFuaW1hdGVkPWEuaXNGdW5jdGlvbihoLnByb3hpZWQpP2gucHJveGllZChqKTpoLnByb3hpZWQsaC5kdXJhdGlvbj1hLmlzRnVuY3Rpb24oaC5wcm94aWVkRHVyYXRpb24pP2gucHJveGllZER1cmF0aW9uKGopOmgucHJveGllZER1cmF0aW9uO3ZhciBrPWEudWkuYWNjb3JkaW9uLmFuaW1hdGlvbnMsbD1oLmR1cmF0aW9uLG09aC5hbmltYXRlZDttJiYha1ttXSYmIWEuZWFzaW5nW21dJiYobT0ic2xpZGUiKSxrW21dfHwoa1ttXT1mdW5jdGlvbihhKXt0aGlzLnNsaWRlKGEse2Vhc2luZzptLGR1cmF0aW9uOmx8fDcwMH0pfSksa1ttXShqKX1lbHNlIGguY29sbGFwc2libGUmJmU/Yi50b2dnbGUoKTooYy5oaWRlKCksYi5zaG93KCkpLGkoITApO2MucHJldigpLmF0dHIoeyJhcmlhLWV4cGFuZGVkIjoiZmFsc2UiLCJhcmlhLXNlbGVjdGVkIjoiZmFsc2UiLHRhYkluZGV4Oi0xfSkuYmx1cigpLGIucHJldigpLmF0dHIoeyJhcmlhLWV4cGFuZGVkIjoidHJ1ZSIsImFyaWEtc2VsZWN0ZWQiOiJ0cnVlIix0YWJJbmRleDowfSkuZm9jdXMoKX0sX2NvbXBsZXRlZDpmdW5jdGlvbihhKXt0aGlzLnJ1bm5pbmc9YT8wOi0tdGhpcy5ydW5uaW5nO2lmKHRoaXMucnVubmluZylyZXR1cm47dGhpcy5vcHRpb25zLmNsZWFyU3R5bGUmJnRoaXMudG9TaG93LmFkZCh0aGlzLnRvSGlkZSkuY3NzKHtoZWlnaHQ6IiIsb3ZlcmZsb3c6IiJ9KSx0aGlzLnRvSGlkZS5yZW1vdmVDbGFzcygidWktYWNjb3JkaW9uLWNvbnRlbnQtYWN0aXZlIiksdGhpcy50b0hpZGUubGVuZ3RoJiYodGhpcy50b0hpZGUucGFyZW50KClbMF0uY2xhc3NOYW1lPXRoaXMudG9IaWRlLnBhcmVudCgpWzBdLmNsYXNzTmFtZSksdGhpcy5fdHJpZ2dlcigiY2hhbmdlIixudWxsLHRoaXMuZGF0YSl9fSksYS5leHRlbmQoYS51aS5hY2NvcmRpb24se3ZlcnNpb246IjEuOC4yNCIsYW5pbWF0aW9uczp7c2xpZGU6ZnVuY3Rpb24oYixjKXtiPWEuZXh0ZW5kKHtlYXNpbmc6InN3aW5nIixkdXJhdGlvbjozMDB9LGIsYyk7aWYoIWIudG9IaWRlLnNpemUoKSl7Yi50b1Nob3cuYW5pbWF0ZSh7aGVpZ2h0OiJzaG93IixwYWRkaW5nVG9wOiJzaG93IixwYWRkaW5nQm90dG9tOiJzaG93In0sYik7cmV0dXJufWlmKCFiLnRvU2hvdy5zaXplKCkpe2IudG9IaWRlLmFuaW1hdGUoe2hlaWdodDoiaGlkZSIscGFkZGluZ1RvcDoiaGlkZSIscGFkZGluZ0JvdHRvbToiaGlkZSJ9LGIpO3JldHVybn12YXIgZD1iLnRvU2hvdy5jc3MoIm92ZXJmbG93IiksZT0wLGY9e30sZz17fSxoPVsiaGVpZ2h0IiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iXSxpLGo9Yi50b1Nob3c7aT1qWzBdLnN0eWxlLndpZHRoLGoud2lkdGgoai5wYXJlbnQoKS53aWR0aCgpLXBhcnNlRmxvYXQoai5jc3MoInBhZGRpbmdMZWZ0IikpLXBhcnNlRmxvYXQoai5jc3MoInBhZGRpbmdSaWdodCIpKS0ocGFyc2VGbG9hdChqLmNzcygiYm9yZGVyTGVmdFdpZHRoIikpfHwwKS0ocGFyc2VGbG9hdChqLmNzcygiYm9yZGVyUmlnaHRXaWR0aCIpKXx8MCkpLGEuZWFjaChoLGZ1bmN0aW9uKGMsZCl7Z1tkXT0iaGlkZSI7dmFyIGU9KCIiK2EuY3NzKGIudG9TaG93WzBdLGQpKS5tYXRjaCgvXihbXGQrLS5dKykoLiopJC8pO2ZbZF09e3ZhbHVlOmVbMV0sdW5pdDplWzJdfHwicHgifX0pLGIudG9TaG93LmNzcyh7aGVpZ2h0OjAsb3ZlcmZsb3c6ImhpZGRlbiJ9KS5zaG93KCksYi50b0hpZGUuZmlsdGVyKCI6aGlkZGVuIikuZWFjaChiLmNvbXBsZXRlKS5lbmQoKS5maWx0ZXIoIjp2aXNpYmxlIikuYW5pbWF0ZShnLHtzdGVwOmZ1bmN0aW9uKGEsYyl7Yy5wcm9wPT0iaGVpZ2h0IiYmKGU9Yy5lbmQtYy5zdGFydD09PTA/MDooYy5ub3ctYy5zdGFydCkvKGMuZW5kLWMuc3RhcnQpKSxiLnRvU2hvd1swXS5zdHlsZVtjLnByb3BdPWUqZltjLnByb3BdLnZhbHVlK2ZbYy5wcm9wXS51bml0fSxkdXJhdGlvbjpiLmR1cmF0aW9uLGVhc2luZzpiLmVhc2luZyxjb21wbGV0ZTpmdW5jdGlvbigpe2IuYXV0b0hlaWdodHx8Yi50b1Nob3cuY3NzKCJoZWlnaHQiLCIiKSxiLnRvU2hvdy5jc3Moe3dpZHRoOmksb3ZlcmZsb3c6ZH0pLGIuY29tcGxldGUoKX19KX0sYm91bmNlc2xpZGU6ZnVuY3Rpb24oYSl7dGhpcy5zbGlkZShhLHtlYXNpbmc6YS5kb3duPyJlYXNlT3V0Qm91bmNlIjoic3dpbmciLGR1cmF0aW9uOmEuZG93bj8xZTM6MjAwfSl9fX0pfShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7dmFyIGM9MDthLndpZGdldCgidWkuYXV0b2NvbXBsZXRlIix7b3B0aW9uczp7YXBwZW5kVG86ImJvZHkiLGF1dG9Gb2N1czohMSxkZWxheTozMDAsbWluTGVuZ3RoOjEscG9zaXRpb246e215OiJsZWZ0IHRvcCIsYXQ6ImxlZnQgYm90dG9tIixjb2xsaXNpb246Im5vbmUifSxzb3VyY2U6bnVsbH0scGVuZGluZzowLF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLGM9dGhpcy5lbGVtZW50WzBdLm93bmVyRG9jdW1lbnQsZDt0aGlzLmlzTXVsdGlMaW5lPXRoaXMuZWxlbWVudC5pcygidGV4dGFyZWEiKSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWF1dG9jb21wbGV0ZS1pbnB1dCIpLmF0dHIoImF1dG9jb21wbGV0ZSIsIm9mZiIpLmF0dHIoe3JvbGU6InRleHRib3giLCJhcmlhLWF1dG9jb21wbGV0ZSI6Imxpc3QiLCJhcmlhLWhhc3BvcHVwIjoidHJ1ZSJ9KS5iaW5kKCJrZXlkb3duLmF1dG9jb21wbGV0ZSIsZnVuY3Rpb24oYyl7aWYoYi5vcHRpb25zLmRpc2FibGVkfHxiLmVsZW1lbnQucHJvcEF0dHIoInJlYWRPbmx5IikpcmV0dXJuO2Q9ITE7dmFyIGU9YS51aS5rZXlDb2RlO3N3aXRjaChjLmtleUNvZGUpe2Nhc2UgZS5QQUdFX1VQOmIuX21vdmUoInByZXZpb3VzUGFnZSIsYyk7YnJlYWs7Y2FzZSBlLlBBR0VfRE9XTjpiLl9tb3ZlKCJuZXh0UGFnZSIsYyk7YnJlYWs7Y2FzZSBlLlVQOmIuX2tleUV2ZW50KCJwcmV2aW91cyIsYyk7YnJlYWs7Y2FzZSBlLkRPV046Yi5fa2V5RXZlbnQoIm5leHQiLGMpO2JyZWFrO2Nhc2UgZS5FTlRFUjpjYXNlIGUuTlVNUEFEX0VOVEVSOmIubWVudS5hY3RpdmUmJihkPSEwLGMucHJldmVudERlZmF1bHQoKSk7Y2FzZSBlLlRBQjppZighYi5tZW51LmFjdGl2ZSlyZXR1cm47Yi5tZW51LnNlbGVjdChjKTticmVhaztjYXNlIGUuRVNDQVBFOmIuZWxlbWVudC52YWwoYi50ZXJtKSxiLmNsb3NlKGMpO2JyZWFrO2RlZmF1bHQ6Y2xlYXJUaW1lb3V0KGIuc2VhcmNoaW5nKSxiLnNlYXJjaGluZz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yi50ZXJtIT1iLmVsZW1lbnQudmFsKCkmJihiLnNlbGVjdGVkSXRlbT1udWxsLGIuc2VhcmNoKG51bGwsYykpfSxiLm9wdGlvbnMuZGVsYXkpfX0pLmJpbmQoImtleXByZXNzLmF1dG9jb21wbGV0ZSIsZnVuY3Rpb24oYSl7ZCYmKGQ9ITEsYS5wcmV2ZW50RGVmYXVsdCgpKX0pLmJpbmQoImZvY3VzLmF1dG9jb21wbGV0ZSIsZnVuY3Rpb24oKXtpZihiLm9wdGlvbnMuZGlzYWJsZWQpcmV0dXJuO2Iuc2VsZWN0ZWRJdGVtPW51bGwsYi5wcmV2aW91cz1iLmVsZW1lbnQudmFsKCl9KS5iaW5kKCJibHVyLmF1dG9jb21wbGV0ZSIsZnVuY3Rpb24oYSl7aWYoYi5vcHRpb25zLmRpc2FibGVkKXJldHVybjtjbGVhclRpbWVvdXQoYi5zZWFyY2hpbmcpLGIuY2xvc2luZz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yi5jbG9zZShhKSxiLl9jaGFuZ2UoYSl9LDE1MCl9KSx0aGlzLl9pbml0U291cmNlKCksdGhpcy5tZW51PWEoIjx1bD48L3VsPiIpLmFkZENsYXNzKCJ1aS1hdXRvY29tcGxldGUiKS5hcHBlbmRUbyhhKHRoaXMub3B0aW9ucy5hcHBlbmRUb3x8ImJvZHkiLGMpWzBdKS5tb3VzZWRvd24oZnVuY3Rpb24oYyl7dmFyIGQ9Yi5tZW51LmVsZW1lbnRbMF07YShjLnRhcmdldCkuY2xvc2VzdCgiLnVpLW1lbnUtaXRlbSIpLmxlbmd0aHx8c2V0VGltZW91dChmdW5jdGlvbigpe2EoZG9jdW1lbnQpLm9uZSgibW91c2Vkb3duIixmdW5jdGlvbihjKXtjLnRhcmdldCE9PWIuZWxlbWVudFswXSYmYy50YXJnZXQhPT1kJiYhYS51aS5jb250YWlucyhkLGMudGFyZ2V0KSYmYi5jbG9zZSgpfSl9LDEpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoYi5jbG9zaW5nKX0sMTMpfSkubWVudSh7Zm9jdXM6ZnVuY3Rpb24oYSxjKXt2YXIgZD1jLml0ZW0uZGF0YSgiaXRlbS5hdXRvY29tcGxldGUiKTshMSE9PWIuX3RyaWdnZXIoImZvY3VzIixhLHtpdGVtOmR9KSYmL15rZXkvLnRlc3QoYS5vcmlnaW5hbEV2ZW50LnR5cGUpJiZiLmVsZW1lbnQudmFsKGQudmFsdWUpfSxzZWxlY3RlZDpmdW5jdGlvbihhLGQpe3ZhciBlPWQuaXRlbS5kYXRhKCJpdGVtLmF1dG9jb21wbGV0ZSIpLGY9Yi5wcmV2aW91cztiLmVsZW1lbnRbMF0hPT1jLmFjdGl2ZUVsZW1lbnQmJihiLmVsZW1lbnQuZm9jdXMoKSxiLnByZXZpb3VzPWYsc2V0VGltZW91dChmdW5jdGlvbigpe2IucHJldmlvdXM9ZixiLnNlbGVjdGVkSXRlbT1lfSwxKSksITEhPT1iLl90cmlnZ2VyKCJzZWxlY3QiLGEse2l0ZW06ZX0pJiZiLmVsZW1lbnQudmFsKGUudmFsdWUpLGIudGVybT1iLmVsZW1lbnQudmFsKCksYi5jbG9zZShhKSxiLnNlbGVjdGVkSXRlbT1lfSxibHVyOmZ1bmN0aW9uKGEsYyl7Yi5tZW51LmVsZW1lbnQuaXMoIjp2aXNpYmxlIikmJmIuZWxlbWVudC52YWwoKSE9PWIudGVybSYmYi5lbGVtZW50LnZhbChiLnRlcm0pfX0pLnpJbmRleCh0aGlzLmVsZW1lbnQuekluZGV4KCkrMSkuY3NzKHt0b3A6MCxsZWZ0OjB9KS5oaWRlKCkuZGF0YSgibWVudSIpLGEuZm4uYmdpZnJhbWUmJnRoaXMubWVudS5lbGVtZW50LmJnaWZyYW1lKCksYi5iZWZvcmV1bmxvYWRIYW5kbGVyPWZ1bmN0aW9uKCl7Yi5lbGVtZW50LnJlbW92ZUF0dHIoImF1dG9jb21wbGV0ZSIpfSxhKHdpbmRvdykuYmluZCgiYmVmb3JldW5sb2FkIixiLmJlZm9yZXVubG9hZEhhbmRsZXIpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1hdXRvY29tcGxldGUtaW5wdXQiKS5yZW1vdmVBdHRyKCJhdXRvY29tcGxldGUiKS5yZW1vdmVBdHRyKCJyb2xlIikucmVtb3ZlQXR0cigiYXJpYS1hdXRvY29tcGxldGUiKS5yZW1vdmVBdHRyKCJhcmlhLWhhc3BvcHVwIiksdGhpcy5tZW51LmVsZW1lbnQucmVtb3ZlKCksYSh3aW5kb3cpLnVuYmluZCgiYmVmb3JldW5sb2FkIix0aGlzLmJlZm9yZXVubG9hZEhhbmRsZXIpLGEuV2lkZ2V0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyl9LF9zZXRPcHRpb246ZnVuY3Rpb24oYixjKXthLldpZGdldC5wcm90b3R5cGUuX3NldE9wdGlvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyksYj09PSJzb3VyY2UiJiZ0aGlzLl9pbml0U291cmNlKCksYj09PSJhcHBlbmRUbyImJnRoaXMubWVudS5lbGVtZW50LmFwcGVuZFRvKGEoY3x8ImJvZHkiLHRoaXMuZWxlbWVudFswXS5vd25lckRvY3VtZW50KVswXSksYj09PSJkaXNhYmxlZCImJmMmJnRoaXMueGhyJiZ0aGlzLnhoci5hYm9ydCgpfSxfaW5pdFNvdXJjZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMsYyxkO2EuaXNBcnJheSh0aGlzLm9wdGlvbnMuc291cmNlKT8oYz10aGlzLm9wdGlvbnMuc291cmNlLHRoaXMuc291cmNlPWZ1bmN0aW9uKGIsZCl7ZChhLnVpLmF1dG9jb21wbGV0ZS5maWx0ZXIoYyxiLnRlcm0pKX0pOnR5cGVvZiB0aGlzLm9wdGlvbnMuc291cmNlPT0ic3RyaW5nIj8oZD10aGlzLm9wdGlvbnMuc291cmNlLHRoaXMuc291cmNlPWZ1bmN0aW9uKGMsZSl7Yi54aHImJmIueGhyLmFib3J0KCksYi54aHI9YS5hamF4KHt1cmw6ZCxkYXRhOmMsZGF0YVR5cGU6Impzb24iLHN1Y2Nlc3M6ZnVuY3Rpb24oYSxiKXtlKGEpfSxlcnJvcjpmdW5jdGlvbigpe2UoW10pfX0pfSk6dGhpcy5zb3VyY2U9dGhpcy5vcHRpb25zLnNvdXJjZX0sc2VhcmNoOmZ1bmN0aW9uKGEsYil7YT1hIT1udWxsP2E6dGhpcy5lbGVtZW50LnZhbCgpLHRoaXMudGVybT10aGlzLmVsZW1lbnQudmFsKCk7aWYoYS5sZW5ndGg8dGhpcy5vcHRpb25zLm1pbkxlbmd0aClyZXR1cm4gdGhpcy5jbG9zZShiKTtjbGVhclRpbWVvdXQodGhpcy5jbG9zaW5nKTtpZih0aGlzLl90cmlnZ2VyKCJzZWFyY2giLGIpPT09ITEpcmV0dXJuO3JldHVybiB0aGlzLl9zZWFyY2goYSl9LF9zZWFyY2g6ZnVuY3Rpb24oYSl7dGhpcy5wZW5kaW5nKyssdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1hdXRvY29tcGxldGUtbG9hZGluZyIpLHRoaXMuc291cmNlKHt0ZXJtOmF9LHRoaXMuX3Jlc3BvbnNlKCkpfSxfcmVzcG9uc2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGI9KytjO3JldHVybiBmdW5jdGlvbihkKXtiPT09YyYmYS5fX3Jlc3BvbnNlKGQpLGEucGVuZGluZy0tLGEucGVuZGluZ3x8YS5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1hdXRvY29tcGxldGUtbG9hZGluZyIpfX0sX19yZXNwb25zZTpmdW5jdGlvbihhKXshdGhpcy5vcHRpb25zLmRpc2FibGVkJiZhJiZhLmxlbmd0aD8oYT10aGlzLl9ub3JtYWxpemUoYSksdGhpcy5fc3VnZ2VzdChhKSx0aGlzLl90cmlnZ2VyKCJvcGVuIikpOnRoaXMuY2xvc2UoKX0sY2xvc2U6ZnVuY3Rpb24oYSl7Y2xlYXJUaW1lb3V0KHRoaXMuY2xvc2luZyksdGhpcy5tZW51LmVsZW1lbnQuaXMoIjp2aXNpYmxlIikmJih0aGlzLm1lbnUuZWxlbWVudC5oaWRlKCksdGhpcy5tZW51LmRlYWN0aXZhdGUoKSx0aGlzLl90cmlnZ2VyKCJjbG9zZSIsYSkpfSxfY2hhbmdlOmZ1bmN0aW9uKGEpe3RoaXMucHJldmlvdXMhPT10aGlzLmVsZW1lbnQudmFsKCkmJnRoaXMuX3RyaWdnZXIoImNoYW5nZSIsYSx7aXRlbTp0aGlzLnNlbGVjdGVkSXRlbX0pfSxfbm9ybWFsaXplOmZ1bmN0aW9uKGIpe3JldHVybiBiLmxlbmd0aCYmYlswXS5sYWJlbCYmYlswXS52YWx1ZT9iOmEubWFwKGIsZnVuY3Rpb24oYil7cmV0dXJuIHR5cGVvZiBiPT0ic3RyaW5nIj97bGFiZWw6Yix2YWx1ZTpifTphLmV4dGVuZCh7bGFiZWw6Yi5sYWJlbHx8Yi52YWx1ZSx2YWx1ZTpiLnZhbHVlfHxiLmxhYmVsfSxiKX0pfSxfc3VnZ2VzdDpmdW5jdGlvbihiKXt2YXIgYz10aGlzLm1lbnUuZWxlbWVudC5lbXB0eSgpLnpJbmRleCh0aGlzLmVsZW1lbnQuekluZGV4KCkrMSk7dGhpcy5fcmVuZGVyTWVudShjLGIpLHRoaXMubWVudS5kZWFjdGl2YXRlKCksdGhpcy5tZW51LnJlZnJlc2goKSxjLnNob3coKSx0aGlzLl9yZXNpemVNZW51KCksYy5wb3NpdGlvbihhLmV4dGVuZCh7b2Y6dGhpcy5lbGVtZW50fSx0aGlzLm9wdGlvbnMucG9zaXRpb24pKSx0aGlzLm9wdGlvbnMuYXV0b0ZvY3VzJiZ0aGlzLm1lbnUubmV4dChuZXcgYS5FdmVudCgibW91c2VvdmVyIikpfSxfcmVzaXplTWVudTpmdW5jdGlvbigpe3ZhciBhPXRoaXMubWVudS5lbGVtZW50O2Eub3V0ZXJXaWR0aChNYXRoLm1heChhLndpZHRoKCIiKS5vdXRlcldpZHRoKCkrMSx0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpKSl9LF9yZW5kZXJNZW51OmZ1bmN0aW9uKGIsYyl7dmFyIGQ9dGhpczthLmVhY2goYyxmdW5jdGlvbihhLGMpe2QuX3JlbmRlckl0ZW0oYixjKX0pfSxfcmVuZGVySXRlbTpmdW5jdGlvbihiLGMpe3JldHVybiBhKCI8bGk+PC9saT4iKS5kYXRhKCJpdGVtLmF1dG9jb21wbGV0ZSIsYykuYXBwZW5kKGEoIjxhPjwvYT4iKS50ZXh0KGMubGFiZWwpKS5hcHBlbmRUbyhiKX0sX21vdmU6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5tZW51LmVsZW1lbnQuaXMoIjp2aXNpYmxlIikpe3RoaXMuc2VhcmNoKG51bGwsYik7cmV0dXJufWlmKHRoaXMubWVudS5maXJzdCgpJiYvXnByZXZpb3VzLy50ZXN0KGEpfHx0aGlzLm1lbnUubGFzdCgpJiYvXm5leHQvLnRlc3QoYSkpe3RoaXMuZWxlbWVudC52YWwodGhpcy50ZXJtKSx0aGlzLm1lbnUuZGVhY3RpdmF0ZSgpO3JldHVybn10aGlzLm1lbnVbYV0oYil9LHdpZGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1lbnUuZWxlbWVudH0sX2tleUV2ZW50OmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuaXNNdWx0aUxpbmV8fHRoaXMubWVudS5lbGVtZW50LmlzKCI6dmlzaWJsZSIpKXRoaXMuX21vdmUoYSxiKSxiLnByZXZlbnREZWZhdWx0KCl9fSksYS5leHRlbmQoYS51aS5hdXRvY29tcGxldGUse2VzY2FwZVJlZ2V4OmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoL1stW1xde30oKSorPy4sXFxeJHwjXHNdL2csIlxcJCYiKX0sZmlsdGVyOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9bmV3IFJlZ0V4cChhLnVpLmF1dG9jb21wbGV0ZS5lc2NhcGVSZWdleChjKSwiaSIpO3JldHVybiBhLmdyZXAoYixmdW5jdGlvbihhKXtyZXR1cm4gZC50ZXN0KGEubGFiZWx8fGEudmFsdWV8fGEpfSl9fSl9KGpRdWVyeSksZnVuY3Rpb24oYSl7YS53aWRnZXQoInVpLm1lbnUiLHtfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpczt0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLW1lbnUgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwiKS5hdHRyKHtyb2xlOiJsaXN0Ym94IiwiYXJpYS1hY3RpdmVkZXNjZW5kYW50IjoidWktYWN0aXZlLW1lbnVpdGVtIn0pLmNsaWNrKGZ1bmN0aW9uKGMpe2lmKCFhKGMudGFyZ2V0KS5jbG9zZXN0KCIudWktbWVudS1pdGVtIGEiKS5sZW5ndGgpcmV0dXJuO2MucHJldmVudERlZmF1bHQoKSxiLnNlbGVjdChjKX0pLHRoaXMucmVmcmVzaCgpfSxyZWZyZXNoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcyxjPXRoaXMuZWxlbWVudC5jaGlsZHJlbigibGk6bm90KC51aS1tZW51LWl0ZW0pOmhhcyhhKSIpLmFkZENsYXNzKCJ1aS1tZW51LWl0ZW0iKS5hdHRyKCJyb2xlIiwibWVudWl0ZW0iKTtjLmNoaWxkcmVuKCJhIikuYWRkQ2xhc3MoInVpLWNvcm5lci1hbGwiKS5hdHRyKCJ0YWJpbmRleCIsLTEpLm1vdXNlZW50ZXIoZnVuY3Rpb24oYyl7Yi5hY3RpdmF0ZShjLGEodGhpcykucGFyZW50KCkpfSkubW91c2VsZWF2ZShmdW5jdGlvbigpe2IuZGVhY3RpdmF0ZSgpfSl9LGFjdGl2YXRlOmZ1bmN0aW9uKGEsYil7dGhpcy5kZWFjdGl2YXRlKCk7aWYodGhpcy5oYXNTY3JvbGwoKSl7dmFyIGM9Yi5vZmZzZXQoKS50b3AtdGhpcy5lbGVtZW50Lm9mZnNldCgpLnRvcCxkPXRoaXMuZWxlbWVudC5zY3JvbGxUb3AoKSxlPXRoaXMuZWxlbWVudC5oZWlnaHQoKTtjPDA/dGhpcy5lbGVtZW50LnNjcm9sbFRvcChkK2MpOmM+PWUmJnRoaXMuZWxlbWVudC5zY3JvbGxUb3AoZCtjLWUrYi5oZWlnaHQoKSl9dGhpcy5hY3RpdmU9Yi5lcSgwKS5jaGlsZHJlbigiYSIpLmFkZENsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLmF0dHIoImlkIiwidWktYWN0aXZlLW1lbnVpdGVtIikuZW5kKCksdGhpcy5fdHJpZ2dlcigiZm9jdXMiLGEse2l0ZW06Yn0pfSxkZWFjdGl2YXRlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuYWN0aXZlKXJldHVybjt0aGlzLmFjdGl2ZS5jaGlsZHJlbigiYSIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLnJlbW92ZUF0dHIoImlkIiksdGhpcy5fdHJpZ2dlcigiYmx1ciIpLHRoaXMuYWN0aXZlPW51bGx9LG5leHQ6ZnVuY3Rpb24oYSl7dGhpcy5tb3ZlKCJuZXh0IiwiLnVpLW1lbnUtaXRlbTpmaXJzdCIsYSl9LHByZXZpb3VzOmZ1bmN0aW9uKGEpe3RoaXMubW92ZSgicHJldiIsIi51aS1tZW51LWl0ZW06bGFzdCIsYSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWN0aXZlJiYhdGhpcy5hY3RpdmUucHJldkFsbCgiLnVpLW1lbnUtaXRlbSIpLmxlbmd0aH0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFjdGl2ZSYmIXRoaXMuYWN0aXZlLm5leHRBbGwoIi51aS1tZW51LWl0ZW0iKS5sZW5ndGh9LG1vdmU6ZnVuY3Rpb24oYSxiLGMpe2lmKCF0aGlzLmFjdGl2ZSl7dGhpcy5hY3RpdmF0ZShjLHRoaXMuZWxlbWVudC5jaGlsZHJlbihiKSk7cmV0dXJufXZhciBkPXRoaXMuYWN0aXZlW2ErIkFsbCJdKCIudWktbWVudS1pdGVtIikuZXEoMCk7ZC5sZW5ndGg/dGhpcy5hY3RpdmF0ZShjLGQpOnRoaXMuYWN0aXZhdGUoYyx0aGlzLmVsZW1lbnQuY2hpbGRyZW4oYikpfSxuZXh0UGFnZTpmdW5jdGlvbihiKXtpZih0aGlzLmhhc1Njcm9sbCgpKXtpZighdGhpcy5hY3RpdmV8fHRoaXMubGFzdCgpKXt0aGlzLmFjdGl2YXRlKGIsdGhpcy5lbGVtZW50LmNoaWxkcmVuKCIudWktbWVudS1pdGVtOmZpcnN0IikpO3JldHVybn12YXIgYz10aGlzLmFjdGl2ZS5vZmZzZXQoKS50b3AsZD10aGlzLmVsZW1lbnQuaGVpZ2h0KCksZT10aGlzLmVsZW1lbnQuY2hpbGRyZW4oIi51aS1tZW51LWl0ZW0iKS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgYj1hKHRoaXMpLm9mZnNldCgpLnRvcC1jLWQrYSh0aGlzKS5oZWlnaHQoKTtyZXR1cm4gYjwxMCYmYj4tMTB9KTtlLmxlbmd0aHx8KGU9dGhpcy5lbGVtZW50LmNoaWxkcmVuKCIudWktbWVudS1pdGVtOmxhc3QiKSksdGhpcy5hY3RpdmF0ZShiLGUpfWVsc2UgdGhpcy5hY3RpdmF0ZShiLHRoaXMuZWxlbWVudC5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbSIpLmZpbHRlcighdGhpcy5hY3RpdmV8fHRoaXMubGFzdCgpPyI6Zmlyc3QiOiI6bGFzdCIpKX0scHJldmlvdXNQYWdlOmZ1bmN0aW9uKGIpe2lmKHRoaXMuaGFzU2Nyb2xsKCkpe2lmKCF0aGlzLmFjdGl2ZXx8dGhpcy5maXJzdCgpKXt0aGlzLmFjdGl2YXRlKGIsdGhpcy5lbGVtZW50LmNoaWxkcmVuKCIudWktbWVudS1pdGVtOmxhc3QiKSk7cmV0dXJufXZhciBjPXRoaXMuYWN0aXZlLm9mZnNldCgpLnRvcCxkPXRoaXMuZWxlbWVudC5oZWlnaHQoKSxlPXRoaXMuZWxlbWVudC5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbSIpLmZpbHRlcihmdW5jdGlvbigpe3ZhciBiPWEodGhpcykub2Zmc2V0KCkudG9wLWMrZC1hKHRoaXMpLmhlaWdodCgpO3JldHVybiBiPDEwJiZiPi0xMH0pO2UubGVuZ3RofHwoZT10aGlzLmVsZW1lbnQuY2hpbGRyZW4oIi51aS1tZW51LWl0ZW06Zmlyc3QiKSksdGhpcy5hY3RpdmF0ZShiLGUpfWVsc2UgdGhpcy5hY3RpdmF0ZShiLHRoaXMuZWxlbWVudC5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbSIpLmZpbHRlcighdGhpcy5hY3RpdmV8fHRoaXMuZmlyc3QoKT8iOmxhc3QiOiI6Zmlyc3QiKSl9LGhhc1Njcm9sbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnQuaGVpZ2h0KCk8dGhpcy5lbGVtZW50W2EuZm4ucHJvcD8icHJvcCI6ImF0dHIiXSgic2Nyb2xsSGVpZ2h0Iil9LHNlbGVjdDpmdW5jdGlvbihhKXt0aGlzLl90cmlnZ2VyKCJzZWxlY3RlZCIsYSx7aXRlbTp0aGlzLmFjdGl2ZX0pfX0pfShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGYsZz0idWktYnV0dG9uIHVpLXdpZGdldCB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiLGg9InVpLXN0YXRlLWhvdmVyIHVpLXN0YXRlLWFjdGl2ZSAiLGk9InVpLWJ1dHRvbi1pY29ucy1vbmx5IHVpLWJ1dHRvbi1pY29uLW9ubHkgdWktYnV0dG9uLXRleHQtaWNvbnMgdWktYnV0dG9uLXRleHQtaWNvbi1wcmltYXJ5IHVpLWJ1dHRvbi10ZXh0LWljb24tc2Vjb25kYXJ5IHVpLWJ1dHRvbi10ZXh0LW9ubHkiLGo9ZnVuY3Rpb24oKXt2YXIgYj1hKHRoaXMpLmZpbmQoIjp1aS1idXR0b24iKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yi5idXR0b24oInJlZnJlc2giKX0sMSl9LGs9ZnVuY3Rpb24oYil7dmFyIGM9Yi5uYW1lLGQ9Yi5mb3JtLGU9YShbXSk7cmV0dXJuIGMmJihkP2U9YShkKS5maW5kKCJbbmFtZT0nIitjKyInXSIpOmU9YSgiW25hbWU9JyIrYysiJ10iLGIub3duZXJEb2N1bWVudCkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuZm9ybX0pKSxlfTthLndpZGdldCgidWkuYnV0dG9uIix7b3B0aW9uczp7ZGlzYWJsZWQ6bnVsbCx0ZXh0OiEwLGxhYmVsOm51bGwsaWNvbnM6e3ByaW1hcnk6bnVsbCxzZWNvbmRhcnk6bnVsbH19LF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQuY2xvc2VzdCgiZm9ybSIpLnVuYmluZCgicmVzZXQuYnV0dG9uIikuYmluZCgicmVzZXQuYnV0dG9uIixqKSx0eXBlb2YgdGhpcy5vcHRpb25zLmRpc2FibGVkIT0iYm9vbGVhbiI/dGhpcy5vcHRpb25zLmRpc2FibGVkPSEhdGhpcy5lbGVtZW50LnByb3BBdHRyKCJkaXNhYmxlZCIpOnRoaXMuZWxlbWVudC5wcm9wQXR0cigiZGlzYWJsZWQiLHRoaXMub3B0aW9ucy5kaXNhYmxlZCksdGhpcy5fZGV0ZXJtaW5lQnV0dG9uVHlwZSgpLHRoaXMuaGFzVGl0bGU9ISF0aGlzLmJ1dHRvbkVsZW1lbnQuYXR0cigidGl0bGUiKTt2YXIgYj10aGlzLGg9dGhpcy5vcHRpb25zLGk9dGhpcy50eXBlPT09ImNoZWNrYm94Inx8dGhpcy50eXBlPT09InJhZGlvIixsPSJ1aS1zdGF0ZS1ob3ZlciIrKGk/IiI6IiB1aS1zdGF0ZS1hY3RpdmUiKSxtPSJ1aS1zdGF0ZS1mb2N1cyI7aC5sYWJlbD09PW51bGwmJihoLmxhYmVsPXRoaXMuYnV0dG9uRWxlbWVudC5odG1sKCkpLHRoaXMuYnV0dG9uRWxlbWVudC5hZGRDbGFzcyhnKS5hdHRyKCJyb2xlIiwiYnV0dG9uIikuYmluZCgibW91c2VlbnRlci5idXR0b24iLGZ1bmN0aW9uKCl7aWYoaC5kaXNhYmxlZClyZXR1cm47YSh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtaG92ZXIiKSx0aGlzPT09YyYmYSh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIil9KS5iaW5kKCJtb3VzZWxlYXZlLmJ1dHRvbiIsZnVuY3Rpb24oKXtpZihoLmRpc2FibGVkKXJldHVybjthKHRoaXMpLnJlbW92ZUNsYXNzKGwpfSkuYmluZCgiY2xpY2suYnV0dG9uIixmdW5jdGlvbihhKXtoLmRpc2FibGVkJiYoYS5wcmV2ZW50RGVmYXVsdCgpLGEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkpfSksdGhpcy5lbGVtZW50LmJpbmQoImZvY3VzLmJ1dHRvbiIsZnVuY3Rpb24oKXtiLmJ1dHRvbkVsZW1lbnQuYWRkQ2xhc3MobSl9KS5iaW5kKCJibHVyLmJ1dHRvbiIsZnVuY3Rpb24oKXtiLmJ1dHRvbkVsZW1lbnQucmVtb3ZlQ2xhc3MobSl9KSxpJiYodGhpcy5lbGVtZW50LmJpbmQoImNoYW5nZS5idXR0b24iLGZ1bmN0aW9uKCl7aWYoZilyZXR1cm47Yi5yZWZyZXNoKCl9KSx0aGlzLmJ1dHRvbkVsZW1lbnQuYmluZCgibW91c2Vkb3duLmJ1dHRvbiIsZnVuY3Rpb24oYSl7aWYoaC5kaXNhYmxlZClyZXR1cm47Zj0hMSxkPWEucGFnZVgsZT1hLnBhZ2VZfSkuYmluZCgibW91c2V1cC5idXR0b24iLGZ1bmN0aW9uKGEpe2lmKGguZGlzYWJsZWQpcmV0dXJuO2lmKGQhPT1hLnBhZ2VYfHxlIT09YS5wYWdlWSlmPSEwfSkpLHRoaXMudHlwZT09PSJjaGVja2JveCI/dGhpcy5idXR0b25FbGVtZW50LmJpbmQoImNsaWNrLmJ1dHRvbiIsZnVuY3Rpb24oKXtpZihoLmRpc2FibGVkfHxmKXJldHVybiExO2EodGhpcykudG9nZ2xlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLGIuYnV0dG9uRWxlbWVudC5hdHRyKCJhcmlhLXByZXNzZWQiLGIuZWxlbWVudFswXS5jaGVja2VkKX0pOnRoaXMudHlwZT09PSJyYWRpbyI/dGhpcy5idXR0b25FbGVtZW50LmJpbmQoImNsaWNrLmJ1dHRvbiIsZnVuY3Rpb24oKXtpZihoLmRpc2FibGVkfHxmKXJldHVybiExO2EodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLGIuYnV0dG9uRWxlbWVudC5hdHRyKCJhcmlhLXByZXNzZWQiLCJ0cnVlIik7dmFyIGM9Yi5lbGVtZW50WzBdO2soYykubm90KGMpLm1hcChmdW5jdGlvbigpe3JldHVybiBhKHRoaXMpLmJ1dHRvbigid2lkZ2V0IilbMF19KS5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIikuYXR0cigiYXJpYS1wcmVzc2VkIiwiZmFsc2UiKX0pOih0aGlzLmJ1dHRvbkVsZW1lbnQuYmluZCgibW91c2Vkb3duLmJ1dHRvbiIsZnVuY3Rpb24oKXtpZihoLmRpc2FibGVkKXJldHVybiExO2EodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLGM9dGhpcyxhKGRvY3VtZW50KS5vbmUoIm1vdXNldXAiLGZ1bmN0aW9uKCl7Yz1udWxsfSl9KS5iaW5kKCJtb3VzZXVwLmJ1dHRvbiIsZnVuY3Rpb24oKXtpZihoLmRpc2FibGVkKXJldHVybiExO2EodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpfSkuYmluZCgia2V5ZG93bi5idXR0b24iLGZ1bmN0aW9uKGIpe2lmKGguZGlzYWJsZWQpcmV0dXJuITE7KGIua2V5Q29kZT09YS51aS5rZXlDb2RlLlNQQUNFfHxiLmtleUNvZGU9PWEudWkua2V5Q29kZS5FTlRFUikmJmEodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpfSkuYmluZCgia2V5dXAuYnV0dG9uIixmdW5jdGlvbigpe2EodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpfSksdGhpcy5idXR0b25FbGVtZW50LmlzKCJhIikmJnRoaXMuYnV0dG9uRWxlbWVudC5rZXl1cChmdW5jdGlvbihiKXtiLmtleUNvZGU9PT1hLnVpLmtleUNvZGUuU1BBQ0UmJmEodGhpcykuY2xpY2soKX0pKSx0aGlzLl9zZXRPcHRpb24oImRpc2FibGVkIixoLmRpc2FibGVkKSx0aGlzLl9yZXNldEJ1dHRvbigpfSxfZGV0ZXJtaW5lQnV0dG9uVHlwZTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5pcygiOmNoZWNrYm94Iik/dGhpcy50eXBlPSJjaGVja2JveCI6dGhpcy5lbGVtZW50LmlzKCI6cmFkaW8iKT90aGlzLnR5cGU9InJhZGlvIjp0aGlzLmVsZW1lbnQuaXMoImlucHV0Iik/dGhpcy50eXBlPSJpbnB1dCI6dGhpcy50eXBlPSJidXR0b24iO2lmKHRoaXMudHlwZT09PSJjaGVja2JveCJ8fHRoaXMudHlwZT09PSJyYWRpbyIpe3ZhciBhPXRoaXMuZWxlbWVudC5wYXJlbnRzKCkuZmlsdGVyKCI6bGFzdCIpLGI9ImxhYmVsW2Zvcj0nIit0aGlzLmVsZW1lbnQuYXR0cigiaWQiKSsiJ10iO3RoaXMuYnV0dG9uRWxlbWVudD1hLmZpbmQoYiksdGhpcy5idXR0b25FbGVtZW50Lmxlbmd0aHx8KGE9YS5sZW5ndGg/YS5zaWJsaW5ncygpOnRoaXMuZWxlbWVudC5zaWJsaW5ncygpLHRoaXMuYnV0dG9uRWxlbWVudD1hLmZpbHRlcihiKSx0aGlzLmJ1dHRvbkVsZW1lbnQubGVuZ3RofHwodGhpcy5idXR0b25FbGVtZW50PWEuZmluZChiKSkpLHRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlIik7dmFyIGM9dGhpcy5lbGVtZW50LmlzKCI6Y2hlY2tlZCIpO2MmJnRoaXMuYnV0dG9uRWxlbWVudC5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIiksdGhpcy5idXR0b25FbGVtZW50LmF0dHIoImFyaWEtcHJlc3NlZCIsYyl9ZWxzZSB0aGlzLmJ1dHRvbkVsZW1lbnQ9dGhpcy5lbGVtZW50fSx3aWRnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5idXR0b25FbGVtZW50fSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1oZWxwZXItaGlkZGVuLWFjY2Vzc2libGUiKSx0aGlzLmJ1dHRvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoZysiICIraCsiICIraSkucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoImFyaWEtcHJlc3NlZCIpLmh0bWwodGhpcy5idXR0b25FbGVtZW50LmZpbmQoIi51aS1idXR0b24tdGV4dCIpLmh0bWwoKSksdGhpcy5oYXNUaXRsZXx8dGhpcy5idXR0b25FbGVtZW50LnJlbW92ZUF0dHIoInRpdGxlIiksYS5XaWRnZXQucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKX0sX3NldE9wdGlvbjpmdW5jdGlvbihiLGMpe2EuV2lkZ2V0LnByb3RvdHlwZS5fc2V0T3B0aW9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZihiPT09ImRpc2FibGVkIil7Yz90aGlzLmVsZW1lbnQucHJvcEF0dHIoImRpc2FibGVkIiwhMCk6dGhpcy5lbGVtZW50LnByb3BBdHRyKCJkaXNhYmxlZCIsITEpO3JldHVybn10aGlzLl9yZXNldEJ1dHRvbigpfSxyZWZyZXNoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5lbGVtZW50LmlzKCI6ZGlzYWJsZWQiKTtiIT09dGhpcy5vcHRpb25zLmRpc2FibGVkJiZ0aGlzLl9zZXRPcHRpb24oImRpc2FibGVkIixiKSx0aGlzLnR5cGU9PT0icmFkaW8iP2sodGhpcy5lbGVtZW50WzBdKS5lYWNoKGZ1bmN0aW9uKCl7YSh0aGlzKS5pcygiOmNoZWNrZWQiKT9hKHRoaXMpLmJ1dHRvbigid2lkZ2V0IikuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLmF0dHIoImFyaWEtcHJlc3NlZCIsInRydWUiKTphKHRoaXMpLmJ1dHRvbigid2lkZ2V0IikucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLmF0dHIoImFyaWEtcHJlc3NlZCIsImZhbHNlIil9KTp0aGlzLnR5cGU9PT0iY2hlY2tib3giJiYodGhpcy5lbGVtZW50LmlzKCI6Y2hlY2tlZCIpP3RoaXMuYnV0dG9uRWxlbWVudC5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIikuYXR0cigiYXJpYS1wcmVzc2VkIiwidHJ1ZSIpOnRoaXMuYnV0dG9uRWxlbWVudC5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIikuYXR0cigiYXJpYS1wcmVzc2VkIiwiZmFsc2UiKSl9LF9yZXNldEJ1dHRvbjpmdW5jdGlvbigpe2lmKHRoaXMudHlwZT09PSJpbnB1dCIpe3RoaXMub3B0aW9ucy5sYWJlbCYmdGhpcy5lbGVtZW50LnZhbCh0aGlzLm9wdGlvbnMubGFiZWwpO3JldHVybn12YXIgYj10aGlzLmJ1dHRvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoaSksYz1hKCI8c3Bhbj48L3NwYW4+Iix0aGlzLmVsZW1lbnRbMF0ub3duZXJEb2N1bWVudCkuYWRkQ2xhc3MoInVpLWJ1dHRvbi10ZXh0IikuaHRtbCh0aGlzLm9wdGlvbnMubGFiZWwpLmFwcGVuZFRvKGIuZW1wdHkoKSkudGV4dCgpLGQ9dGhpcy5vcHRpb25zLmljb25zLGU9ZC5wcmltYXJ5JiZkLnNlY29uZGFyeSxmPVtdO2QucHJpbWFyeXx8ZC5zZWNvbmRhcnk/KHRoaXMub3B0aW9ucy50ZXh0JiZmLnB1c2goInVpLWJ1dHRvbi10ZXh0LWljb24iKyhlPyJzIjpkLnByaW1hcnk/Ii1wcmltYXJ5IjoiLXNlY29uZGFyeSIpKSxkLnByaW1hcnkmJmIucHJlcGVuZCgiPHNwYW4gY2xhc3M9J3VpLWJ1dHRvbi1pY29uLXByaW1hcnkgdWktaWNvbiAiK2QucHJpbWFyeSsiJz48L3NwYW4+IiksZC5zZWNvbmRhcnkmJmIuYXBwZW5kKCI8c3BhbiBjbGFzcz0ndWktYnV0dG9uLWljb24tc2Vjb25kYXJ5IHVpLWljb24gIitkLnNlY29uZGFyeSsiJz48L3NwYW4+IiksdGhpcy5vcHRpb25zLnRleHR8fChmLnB1c2goZT8idWktYnV0dG9uLWljb25zLW9ubHkiOiJ1aS1idXR0b24taWNvbi1vbmx5IiksdGhpcy5oYXNUaXRsZXx8Yi5hdHRyKCJ0aXRsZSIsYykpKTpmLnB1c2goInVpLWJ1dHRvbi10ZXh0LW9ubHkiKSxiLmFkZENsYXNzKGYuam9pbigiICIpKX19KSxhLndpZGdldCgidWkuYnV0dG9uc2V0Iix7b3B0aW9uczp7aXRlbXM6IjpidXR0b24sIDpzdWJtaXQsIDpyZXNldCwgOmNoZWNrYm94LCA6cmFkaW8sIGEsIDpkYXRhKGJ1dHRvbikifSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1idXR0b25zZXQiKX0sX2luaXQ6ZnVuY3Rpb24oKXt0aGlzLnJlZnJlc2goKX0sX3NldE9wdGlvbjpmdW5jdGlvbihiLGMpe2I9PT0iZGlzYWJsZWQiJiZ0aGlzLmJ1dHRvbnMuYnV0dG9uKCJvcHRpb24iLGIsYyksYS5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxyZWZyZXNoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5lbGVtZW50LmNzcygiZGlyZWN0aW9uIik9PT0icnRsIjt0aGlzLmJ1dHRvbnM9dGhpcy5lbGVtZW50LmZpbmQodGhpcy5vcHRpb25zLml0ZW1zKS5maWx0ZXIoIjp1aS1idXR0b24iKS5idXR0b24oInJlZnJlc2giKS5lbmQoKS5ub3QoIjp1aS1idXR0b24iKS5idXR0b24oKS5lbmQoKS5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gYSh0aGlzKS5idXR0b24oIndpZGdldCIpWzBdfSkucmVtb3ZlQ2xhc3MoInVpLWNvcm5lci1hbGwgdWktY29ybmVyLWxlZnQgdWktY29ybmVyLXJpZ2h0IikuZmlsdGVyKCI6Zmlyc3QiKS5hZGRDbGFzcyhiPyJ1aS1jb3JuZXItcmlnaHQiOiJ1aS1jb3JuZXItbGVmdCIpLmVuZCgpLmZpbHRlcigiOmxhc3QiKS5hZGRDbGFzcyhiPyJ1aS1jb3JuZXItbGVmdCI6InVpLWNvcm5lci1yaWdodCIpLmVuZCgpLmVuZCgpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1idXR0b25zZXQiKSx0aGlzLmJ1dHRvbnMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIGEodGhpcykuYnV0dG9uKCJ3aWRnZXQiKVswXX0pLnJlbW92ZUNsYXNzKCJ1aS1jb3JuZXItbGVmdCB1aS1jb3JuZXItcmlnaHQiKS5lbmQoKS5idXR0b24oImRlc3Ryb3kiKSxhLldpZGdldC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpfX0pfShqUXVlcnkpLGZ1bmN0aW9uKCQsdW5kZWZpbmVkKXtmdW5jdGlvbiBEYXRlcGlja2VyKCl7dGhpcy5kZWJ1Zz0hMSx0aGlzLl9jdXJJbnN0PW51bGwsdGhpcy5fa2V5RXZlbnQ9ITEsdGhpcy5fZGlzYWJsZWRJbnB1dHM9W10sdGhpcy5fZGF0ZXBpY2tlclNob3dpbmc9ITEsdGhpcy5faW5EaWFsb2c9ITEsdGhpcy5fbWFpbkRpdklkPSJ1aS1kYXRlcGlja2VyLWRpdiIsdGhpcy5faW5saW5lQ2xhc3M9InVpLWRhdGVwaWNrZXItaW5saW5lIix0aGlzLl9hcHBlbmRDbGFzcz0idWktZGF0ZXBpY2tlci1hcHBlbmQiLHRoaXMuX3RyaWdnZXJDbGFzcz0idWktZGF0ZXBpY2tlci10cmlnZ2VyIix0aGlzLl9kaWFsb2dDbGFzcz0idWktZGF0ZXBpY2tlci1kaWFsb2ciLHRoaXMuX2Rpc2FibGVDbGFzcz0idWktZGF0ZXBpY2tlci1kaXNhYmxlZCIsdGhpcy5fdW5zZWxlY3RhYmxlQ2xhc3M9InVpLWRhdGVwaWNrZXItdW5zZWxlY3RhYmxlIix0aGlzLl9jdXJyZW50Q2xhc3M9InVpLWRhdGVwaWNrZXItY3VycmVudC1kYXkiLHRoaXMuX2RheU92ZXJDbGFzcz0idWktZGF0ZXBpY2tlci1kYXlzLWNlbGwtb3ZlciIsdGhpcy5yZWdpb25hbD1bXSx0aGlzLnJlZ2lvbmFsWyIiXT17Y2xvc2VUZXh0OiJEb25lIixwcmV2VGV4dDoiUHJldiIsbmV4dFRleHQ6Ik5leHQiLGN1cnJlbnRUZXh0OiJUb2RheSIsbW9udGhOYW1lczpbIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sbW9udGhOYW1lc1Nob3J0OlsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl0sZGF5TmFtZXM6WyJTdW5kYXkiLCJNb25kYXkiLCJUdWVzZGF5IiwiV2VkbmVzZGF5IiwiVGh1cnNkYXkiLCJGcmlkYXkiLCJTYXR1cmRheSJdLGRheU5hbWVzU2hvcnQ6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxkYXlOYW1lc01pbjpbIlN1IiwiTW8iLCJUdSIsIldlIiwiVGgiLCJGciIsIlNhIl0sd2Vla0hlYWRlcjoiV2siLGRhdGVGb3JtYXQ6Im1tL2RkL3l5IixmaXJzdERheTowLGlzUlRMOiExLHNob3dNb250aEFmdGVyWWVhcjohMSx5ZWFyU3VmZml4OiIifSx0aGlzLl9kZWZhdWx0cz17c2hvd09uOiJmb2N1cyIsc2hvd0FuaW06ImZhZGVJbiIsc2hvd09wdGlvbnM6e30sZGVmYXVsdERhdGU6bnVsbCxhcHBlbmRUZXh0OiIiLGJ1dHRvblRleHQ6Ii4uLiIsYnV0dG9uSW1hZ2U6IiIsYnV0dG9uSW1hZ2VPbmx5OiExLGhpZGVJZk5vUHJldk5leHQ6ITEsbmF2aWdhdGlvbkFzRGF0ZUZvcm1hdDohMSxnb3RvQ3VycmVudDohMSxjaGFuZ2VNb250aDohMSxjaGFuZ2VZZWFyOiExLHllYXJSYW5nZToiYy0xMDpjKzEwIixzaG93T3RoZXJNb250aHM6ITEsc2VsZWN0T3RoZXJNb250aHM6ITEsc2hvd1dlZWs6ITEsY2FsY3VsYXRlV2Vlazp0aGlzLmlzbzg2MDFXZWVrLHNob3J0WWVhckN1dG9mZjoiKzEwIixtaW5EYXRlOm51bGwsbWF4RGF0ZTpudWxsLGR1cmF0aW9uOiJmYXN0IixiZWZvcmVTaG93RGF5Om51bGwsYmVmb3JlU2hvdzpudWxsLG9uU2VsZWN0Om51bGwsb25DaGFuZ2VNb250aFllYXI6bnVsbCxvbkNsb3NlOm51bGwsbnVtYmVyT2ZNb250aHM6MSxzaG93Q3VycmVudEF0UG9zOjAsc3RlcE1vbnRoczoxLHN0ZXBCaWdNb250aHM6MTIsYWx0RmllbGQ6IiIsYWx0Rm9ybWF0OiIiLGNvbnN0cmFpbklucHV0OiEwLHNob3dCdXR0b25QYW5lbDohMSxhdXRvU2l6ZTohMSxkaXNhYmxlZDohMX0sJC5leHRlbmQodGhpcy5fZGVmYXVsdHMsdGhpcy5yZWdpb25hbFsiIl0pLHRoaXMuZHBEaXY9YmluZEhvdmVyKCQoJzxkaXYgaWQ9IicrdGhpcy5fbWFpbkRpdklkKyciIGNsYXNzPSJ1aS1kYXRlcGlja2VyIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1oZWxwZXItY2xlYXJmaXggdWktY29ybmVyLWFsbCI+PC9kaXY+JykpfWZ1bmN0aW9uIGJpbmRIb3ZlcihhKXt2YXIgYj0iYnV0dG9uLCAudWktZGF0ZXBpY2tlci1wcmV2LCAudWktZGF0ZXBpY2tlci1uZXh0LCAudWktZGF0ZXBpY2tlci1jYWxlbmRhciB0ZCBhIjtyZXR1cm4gYS5iaW5kKCJtb3VzZW91dCIsZnVuY3Rpb24oYSl7dmFyIGM9JChhLnRhcmdldCkuY2xvc2VzdChiKTtpZighYy5sZW5ndGgpcmV0dXJuO2MucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIHVpLWRhdGVwaWNrZXItcHJldi1ob3ZlciB1aS1kYXRlcGlja2VyLW5leHQtaG92ZXIiKX0pLmJpbmQoIm1vdXNlb3ZlciIsZnVuY3Rpb24oYyl7dmFyIGQ9JChjLnRhcmdldCkuY2xvc2VzdChiKTtpZigkLmRhdGVwaWNrZXIuX2lzRGlzYWJsZWREYXRlcGlja2VyKGluc3RBY3RpdmUuaW5saW5lP2EucGFyZW50KClbMF06aW5zdEFjdGl2ZS5pbnB1dFswXSl8fCFkLmxlbmd0aClyZXR1cm47ZC5wYXJlbnRzKCIudWktZGF0ZXBpY2tlci1jYWxlbmRhciIpLmZpbmQoImEiKS5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKSxkLmFkZENsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLGQuaGFzQ2xhc3MoInVpLWRhdGVwaWNrZXItcHJldiIpJiZkLmFkZENsYXNzKCJ1aS1kYXRlcGlja2VyLXByZXYtaG92ZXIiKSxkLmhhc0NsYXNzKCJ1aS1kYXRlcGlja2VyLW5leHQiKSYmZC5hZGRDbGFzcygidWktZGF0ZXBpY2tlci1uZXh0LWhvdmVyIil9KX1mdW5jdGlvbiBleHRlbmRSZW1vdmUoYSxiKXskLmV4dGVuZChhLGIpO2Zvcih2YXIgYyBpbiBiKWlmKGJbY109PW51bGx8fGJbY109PXVuZGVmaW5lZClhW2NdPWJbY107cmV0dXJuIGF9ZnVuY3Rpb24gaXNBcnJheShhKXtyZXR1cm4gYSYmKCQuYnJvd3Nlci5zYWZhcmkmJnR5cGVvZiBhPT0ib2JqZWN0IiYmYS5sZW5ndGh8fGEuY29uc3RydWN0b3ImJmEuY29uc3RydWN0b3IudG9TdHJpbmcoKS5tYXRjaCgvXEFycmF5XChcKS8pKX0kLmV4dGVuZCgkLnVpLHtkYXRlcGlja2VyOnt2ZXJzaW9uOiIxLjguMjQifX0pO3ZhciBQUk9QX05BTUU9ImRhdGVwaWNrZXIiLGRwdXVpZD0obmV3IERhdGUpLmdldFRpbWUoKSxpbnN0QWN0aXZlOyQuZXh0ZW5kKERhdGVwaWNrZXIucHJvdG90eXBlLHttYXJrZXJDbGFzc05hbWU6Imhhc0RhdGVwaWNrZXIiLG1heFJvd3M6NCxsb2c6ZnVuY3Rpb24oKXt0aGlzLmRlYnVnJiZjb25zb2xlLmxvZy5hcHBseSgiIixhcmd1bWVudHMpfSxfd2lkZ2V0RGF0ZXBpY2tlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRwRGl2fSxzZXREZWZhdWx0czpmdW5jdGlvbihhKXtyZXR1cm4gZXh0ZW5kUmVtb3ZlKHRoaXMuX2RlZmF1bHRzLGF8fHt9KSx0aGlzfSxfYXR0YWNoRGF0ZXBpY2tlcjpmdW5jdGlvbih0YXJnZXQsc2V0dGluZ3Mpe3ZhciBpbmxpbmVTZXR0aW5ncz1udWxsO2Zvcih2YXIgYXR0ck5hbWUgaW4gdGhpcy5fZGVmYXVsdHMpe3ZhciBhdHRyVmFsdWU9dGFyZ2V0LmdldEF0dHJpYnV0ZSgiZGF0ZToiK2F0dHJOYW1lKTtpZihhdHRyVmFsdWUpe2lubGluZVNldHRpbmdzPWlubGluZVNldHRpbmdzfHx7fTt0cnl7aW5saW5lU2V0dGluZ3NbYXR0ck5hbWVdPWV2YWwoYXR0clZhbHVlKX1jYXRjaChlcnIpe2lubGluZVNldHRpbmdzW2F0dHJOYW1lXT1hdHRyVmFsdWV9fX12YXIgbm9kZU5hbWU9dGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksaW5saW5lPW5vZGVOYW1lPT0iZGl2Inx8bm9kZU5hbWU9PSJzcGFuIjt0YXJnZXQuaWR8fCh0aGlzLnV1aWQrPTEsdGFyZ2V0LmlkPSJkcCIrdGhpcy51dWlkKTt2YXIgaW5zdD10aGlzLl9uZXdJbnN0KCQodGFyZ2V0KSxpbmxpbmUpO2luc3Quc2V0dGluZ3M9JC5leHRlbmQoe30sc2V0dGluZ3N8fHt9LGlubGluZVNldHRpbmdzfHx7fSksbm9kZU5hbWU9PSJpbnB1dCI/dGhpcy5fY29ubmVjdERhdGVwaWNrZXIodGFyZ2V0LGluc3QpOmlubGluZSYmdGhpcy5faW5saW5lRGF0ZXBpY2tlcih0YXJnZXQsaW5zdCl9LF9uZXdJbnN0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YVswXS5pZC5yZXBsYWNlKC8oW15BLVphLXowLTlfLV0pL2csIlxcXFwkMSIpO3JldHVybntpZDpjLGlucHV0OmEsc2VsZWN0ZWREYXk6MCxzZWxlY3RlZE1vbnRoOjAsc2VsZWN0ZWRZZWFyOjAsZHJhd01vbnRoOjAsZHJhd1llYXI6MCxpbmxpbmU6YixkcERpdjpiP2JpbmRIb3ZlcigkKCc8ZGl2IGNsYXNzPSInK3RoaXMuX2lubGluZUNsYXNzKycgdWktZGF0ZXBpY2tlciB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktaGVscGVyLWNsZWFyZml4IHVpLWNvcm5lci1hbGwiPjwvZGl2PicpKTp0aGlzLmRwRGl2fX0sX2Nvbm5lY3REYXRlcGlja2VyOmZ1bmN0aW9uKGEsYil7dmFyIGM9JChhKTtiLmFwcGVuZD0kKFtdKSxiLnRyaWdnZXI9JChbXSk7aWYoYy5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkpcmV0dXJuO3RoaXMuX2F0dGFjaG1lbnRzKGMsYiksYy5hZGRDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkua2V5ZG93bih0aGlzLl9kb0tleURvd24pLmtleXByZXNzKHRoaXMuX2RvS2V5UHJlc3MpLmtleXVwKHRoaXMuX2RvS2V5VXApLmJpbmQoInNldERhdGEuZGF0ZXBpY2tlciIsZnVuY3Rpb24oYSxjLGQpe2Iuc2V0dGluZ3NbY109ZH0pLmJpbmQoImdldERhdGEuZGF0ZXBpY2tlciIsZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5fZ2V0KGIsYyl9KSx0aGlzLl9hdXRvU2l6ZShiKSwkLmRhdGEoYSxQUk9QX05BTUUsYiksYi5zZXR0aW5ncy5kaXNhYmxlZCYmdGhpcy5fZGlzYWJsZURhdGVwaWNrZXIoYSl9LF9hdHRhY2htZW50czpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuX2dldChiLCJhcHBlbmRUZXh0IiksZD10aGlzLl9nZXQoYiwiaXNSVEwiKTtiLmFwcGVuZCYmYi5hcHBlbmQucmVtb3ZlKCksYyYmKGIuYXBwZW5kPSQoJzxzcGFuIGNsYXNzPSInK3RoaXMuX2FwcGVuZENsYXNzKyciPicrYysiPC9zcGFuPiIpLGFbZD8iYmVmb3JlIjoiYWZ0ZXIiXShiLmFwcGVuZCkpLGEudW5iaW5kKCJmb2N1cyIsdGhpcy5fc2hvd0RhdGVwaWNrZXIpLGIudHJpZ2dlciYmYi50cmlnZ2VyLnJlbW92ZSgpO3ZhciBlPXRoaXMuX2dldChiLCJzaG93T24iKTsoZT09ImZvY3VzInx8ZT09ImJvdGgiKSYmYS5mb2N1cyh0aGlzLl9zaG93RGF0ZXBpY2tlcik7aWYoZT09ImJ1dHRvbiJ8fGU9PSJib3RoIil7dmFyIGY9dGhpcy5fZ2V0KGIsImJ1dHRvblRleHQiKSxnPXRoaXMuX2dldChiLCJidXR0b25JbWFnZSIpO2IudHJpZ2dlcj0kKHRoaXMuX2dldChiLCJidXR0b25JbWFnZU9ubHkiKT8kKCI8aW1nLz4iKS5hZGRDbGFzcyh0aGlzLl90cmlnZ2VyQ2xhc3MpLmF0dHIoe3NyYzpnLGFsdDpmLHRpdGxlOmZ9KTokKCc8YnV0dG9uIHR5cGU9ImJ1dHRvbiI+PC9idXR0b24+JykuYWRkQ2xhc3ModGhpcy5fdHJpZ2dlckNsYXNzKS5odG1sKGc9PSIiP2Y6JCgiPGltZy8+IikuYXR0cih7c3JjOmcsYWx0OmYsdGl0bGU6Zn0pKSksYVtkPyJiZWZvcmUiOiJhZnRlciJdKGIudHJpZ2dlciksYi50cmlnZ2VyLmNsaWNrKGZ1bmN0aW9uKCl7cmV0dXJuICQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcmJiQuZGF0ZXBpY2tlci5fbGFzdElucHV0PT1hWzBdPyQuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKTokLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nJiYkLmRhdGVwaWNrZXIuX2xhc3RJbnB1dCE9YVswXT8oJC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpLCQuZGF0ZXBpY2tlci5fc2hvd0RhdGVwaWNrZXIoYVswXSkpOiQuZGF0ZXBpY2tlci5fc2hvd0RhdGVwaWNrZXIoYVswXSksITF9KX19LF9hdXRvU2l6ZTpmdW5jdGlvbihhKXtpZih0aGlzLl9nZXQoYSwiYXV0b1NpemUiKSYmIWEuaW5saW5lKXt2YXIgYj1uZXcgRGF0ZSgyMDA5LDExLDIwKSxjPXRoaXMuX2dldChhLCJkYXRlRm9ybWF0Iik7aWYoYy5tYXRjaCgvW0RNXS8pKXt2YXIgZD1mdW5jdGlvbihhKXt2YXIgYj0wLGM9MDtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKylhW2RdLmxlbmd0aD5iJiYoYj1hW2RdLmxlbmd0aCxjPWQpO3JldHVybiBjfTtiLnNldE1vbnRoKGQodGhpcy5fZ2V0KGEsYy5tYXRjaCgvTU0vKT8ibW9udGhOYW1lcyI6Im1vbnRoTmFtZXNTaG9ydCIpKSksYi5zZXREYXRlKGQodGhpcy5fZ2V0KGEsYy5tYXRjaCgvREQvKT8iZGF5TmFtZXMiOiJkYXlOYW1lc1Nob3J0IikpKzIwLWIuZ2V0RGF5KCkpfWEuaW5wdXQuYXR0cigic2l6ZSIsdGhpcy5fZm9ybWF0RGF0ZShhLGIpLmxlbmd0aCl9fSxfaW5saW5lRGF0ZXBpY2tlcjpmdW5jdGlvbihhLGIpe3ZhciBjPSQoYSk7aWYoYy5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkpcmV0dXJuO2MuYWRkQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpLmFwcGVuZChiLmRwRGl2KS5iaW5kKCJzZXREYXRhLmRhdGVwaWNrZXIiLGZ1bmN0aW9uKGEsYyxkKXtiLnNldHRpbmdzW2NdPWR9KS5iaW5kKCJnZXREYXRhLmRhdGVwaWNrZXIiLGZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuX2dldChiLGMpfSksJC5kYXRhKGEsUFJPUF9OQU1FLGIpLHRoaXMuX3NldERhdGUoYix0aGlzLl9nZXREZWZhdWx0RGF0ZShiKSwhMCksdGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihiKSx0aGlzLl91cGRhdGVBbHRlcm5hdGUoYiksYi5zZXR0aW5ncy5kaXNhYmxlZCYmdGhpcy5fZGlzYWJsZURhdGVwaWNrZXIoYSksYi5kcERpdi5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxfZGlhbG9nRGF0ZXBpY2tlcjpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPXRoaXMuX2RpYWxvZ0luc3Q7aWYoIWYpe3RoaXMudXVpZCs9MTt2YXIgZz0iZHAiK3RoaXMudXVpZDt0aGlzLl9kaWFsb2dJbnB1dD0kKCc8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IicrZysnIiBzdHlsZT0icG9zaXRpb246IGFic29sdXRlOyB0b3A6IC0xMDBweDsgd2lkdGg6IDBweDsiLz4nKSx0aGlzLl9kaWFsb2dJbnB1dC5rZXlkb3duKHRoaXMuX2RvS2V5RG93biksJCgiYm9keSIpLmFwcGVuZCh0aGlzLl9kaWFsb2dJbnB1dCksZj10aGlzLl9kaWFsb2dJbnN0PXRoaXMuX25ld0luc3QodGhpcy5fZGlhbG9nSW5wdXQsITEpLGYuc2V0dGluZ3M9e30sJC5kYXRhKHRoaXMuX2RpYWxvZ0lucHV0WzBdLFBST1BfTkFNRSxmKX1leHRlbmRSZW1vdmUoZi5zZXR0aW5ncyxkfHx7fSksYj1iJiZiLmNvbnN0cnVjdG9yPT1EYXRlP3RoaXMuX2Zvcm1hdERhdGUoZixiKTpiLHRoaXMuX2RpYWxvZ0lucHV0LnZhbChiKSx0aGlzLl9wb3M9ZT9lLmxlbmd0aD9lOltlLnBhZ2VYLGUucGFnZVldOm51bGw7aWYoIXRoaXMuX3Bvcyl7dmFyIGg9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLGk9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCxqPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0fHxkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQsaz1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wfHxkb2N1bWVudC5ib2R5LnNjcm9sbFRvcDt0aGlzLl9wb3M9W2gvMi0xMDAraixpLzItMTUwK2tdfXJldHVybiB0aGlzLl9kaWFsb2dJbnB1dC5jc3MoImxlZnQiLHRoaXMuX3Bvc1swXSsyMCsicHgiKS5jc3MoInRvcCIsdGhpcy5fcG9zWzFdKyJweCIpLGYuc2V0dGluZ3Mub25TZWxlY3Q9Yyx0aGlzLl9pbkRpYWxvZz0hMCx0aGlzLmRwRGl2LmFkZENsYXNzKHRoaXMuX2RpYWxvZ0NsYXNzKSx0aGlzLl9zaG93RGF0ZXBpY2tlcih0aGlzLl9kaWFsb2dJbnB1dFswXSksJC5ibG9ja1VJJiYkLmJsb2NrVUkodGhpcy5kcERpdiksJC5kYXRhKHRoaXMuX2RpYWxvZ0lucHV0WzBdLFBST1BfTkFNRSxmKSx0aGlzfSxfZGVzdHJveURhdGVwaWNrZXI6ZnVuY3Rpb24oYSl7dmFyIGI9JChhKSxjPSQuZGF0YShhLFBST1BfTkFNRSk7aWYoIWIuaGFzQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpKXJldHVybjt2YXIgZD1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7JC5yZW1vdmVEYXRhKGEsUFJPUF9OQU1FKSxkPT0iaW5wdXQiPyhjLmFwcGVuZC5yZW1vdmUoKSxjLnRyaWdnZXIucmVtb3ZlKCksYi5yZW1vdmVDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkudW5iaW5kKCJmb2N1cyIsdGhpcy5fc2hvd0RhdGVwaWNrZXIpLnVuYmluZCgia2V5ZG93biIsdGhpcy5fZG9LZXlEb3duKS51bmJpbmQoImtleXByZXNzIix0aGlzLl9kb0tleVByZXNzKS51bmJpbmQoImtleXVwIix0aGlzLl9kb0tleVVwKSk6KGQ9PSJkaXYifHxkPT0ic3BhbiIpJiZiLnJlbW92ZUNsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKS5lbXB0eSgpfSxfZW5hYmxlRGF0ZXBpY2tlcjpmdW5jdGlvbihhKXt2YXIgYj0kKGEpLGM9JC5kYXRhKGEsUFJPUF9OQU1FKTtpZighYi5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkpcmV0dXJuO3ZhciBkPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZihkPT0iaW5wdXQiKWEuZGlzYWJsZWQ9ITEsYy50cmlnZ2VyLmZpbHRlcigiYnV0dG9uIikuZWFjaChmdW5jdGlvbigpe3RoaXMuZGlzYWJsZWQ9ITF9KS5lbmQoKS5maWx0ZXIoImltZyIpLmNzcyh7b3BhY2l0eToiMS4wIixjdXJzb3I6IiJ9KTtlbHNlIGlmKGQ9PSJkaXYifHxkPT0ic3BhbiIpe3ZhciBlPWIuY2hpbGRyZW4oIi4iK3RoaXMuX2lubGluZUNsYXNzKTtlLmNoaWxkcmVuKCkucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIiksZS5maW5kKCJzZWxlY3QudWktZGF0ZXBpY2tlci1tb250aCwgc2VsZWN0LnVpLWRhdGVwaWNrZXIteWVhciIpLnJlbW92ZUF0dHIoImRpc2FibGVkIil9dGhpcy5fZGlzYWJsZWRJbnB1dHM9JC5tYXAodGhpcy5fZGlzYWJsZWRJbnB1dHMsZnVuY3Rpb24oYil7cmV0dXJuIGI9PWE/bnVsbDpifSl9LF9kaXNhYmxlRGF0ZXBpY2tlcjpmdW5jdGlvbihhKXt2YXIgYj0kKGEpLGM9JC5kYXRhKGEsUFJPUF9OQU1FKTtpZighYi5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkpcmV0dXJuO3ZhciBkPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZihkPT0iaW5wdXQiKWEuZGlzYWJsZWQ9ITAsYy50cmlnZ2VyLmZpbHRlcigiYnV0dG9uIikuZWFjaChmdW5jdGlvbigpe3RoaXMuZGlzYWJsZWQ9ITB9KS5lbmQoKS5maWx0ZXIoImltZyIpLmNzcyh7b3BhY2l0eToiMC41IixjdXJzb3I6ImRlZmF1bHQifSk7ZWxzZSBpZihkPT0iZGl2Inx8ZD09InNwYW4iKXt2YXIgZT1iLmNoaWxkcmVuKCIuIit0aGlzLl9pbmxpbmVDbGFzcyk7ZS5jaGlsZHJlbigpLmFkZENsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpLGUuZmluZCgic2VsZWN0LnVpLWRhdGVwaWNrZXItbW9udGgsIHNlbGVjdC51aS1kYXRlcGlja2VyLXllYXIiKS5hdHRyKCJkaXNhYmxlZCIsImRpc2FibGVkIil9dGhpcy5fZGlzYWJsZWRJbnB1dHM9JC5tYXAodGhpcy5fZGlzYWJsZWRJbnB1dHMsZnVuY3Rpb24oYil7cmV0dXJuIGI9PWE/bnVsbDpifSksdGhpcy5fZGlzYWJsZWRJbnB1dHNbdGhpcy5fZGlzYWJsZWRJbnB1dHMubGVuZ3RoXT1hfSxfaXNEaXNhYmxlZERhdGVwaWNrZXI6ZnVuY3Rpb24oYSl7aWYoIWEpcmV0dXJuITE7Zm9yKHZhciBiPTA7Yjx0aGlzLl9kaXNhYmxlZElucHV0cy5sZW5ndGg7YisrKWlmKHRoaXMuX2Rpc2FibGVkSW5wdXRzW2JdPT1hKXJldHVybiEwO3JldHVybiExfSxfZ2V0SW5zdDpmdW5jdGlvbihhKXt0cnl7cmV0dXJuICQuZGF0YShhLFBST1BfTkFNRSl9Y2F0Y2goYil7dGhyb3ciTWlzc2luZyBpbnN0YW5jZSBkYXRhIGZvciB0aGlzIGRhdGVwaWNrZXIifX0sX29wdGlvbkRhdGVwaWNrZXI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuX2dldEluc3QoYSk7aWYoYXJndW1lbnRzLmxlbmd0aD09MiYmdHlwZW9mIGI9PSJzdHJpbmciKXJldHVybiBiPT0iZGVmYXVsdHMiPyQuZXh0ZW5kKHt9LCQuZGF0ZXBpY2tlci5fZGVmYXVsdHMpOmQ/Yj09ImFsbCI/JC5leHRlbmQoe30sZC5zZXR0aW5ncyk6dGhpcy5fZ2V0KGQsYik6bnVsbDt2YXIgZT1ifHx7fTt0eXBlb2YgYj09InN0cmluZyImJihlPXt9LGVbYl09Yyk7aWYoZCl7dGhpcy5fY3VySW5zdD09ZCYmdGhpcy5faGlkZURhdGVwaWNrZXIoKTt2YXIgZj10aGlzLl9nZXREYXRlRGF0ZXBpY2tlcihhLCEwKSxnPXRoaXMuX2dldE1pbk1heERhdGUoZCwibWluIiksaD10aGlzLl9nZXRNaW5NYXhEYXRlKGQsIm1heCIpO2V4dGVuZFJlbW92ZShkLnNldHRpbmdzLGUpLGchPT1udWxsJiZlLmRhdGVGb3JtYXQhPT11bmRlZmluZWQmJmUubWluRGF0ZT09PXVuZGVmaW5lZCYmKGQuc2V0dGluZ3MubWluRGF0ZT10aGlzLl9mb3JtYXREYXRlKGQsZykpLGghPT1udWxsJiZlLmRhdGVGb3JtYXQhPT11bmRlZmluZWQmJmUubWF4RGF0ZT09PXVuZGVmaW5lZCYmKGQuc2V0dGluZ3MubWF4RGF0ZT10aGlzLl9mb3JtYXREYXRlKGQsaCkpLHRoaXMuX2F0dGFjaG1lbnRzKCQoYSksZCksdGhpcy5fYXV0b1NpemUoZCksdGhpcy5fc2V0RGF0ZShkLGYpLHRoaXMuX3VwZGF0ZUFsdGVybmF0ZShkKSx0aGlzLl91cGRhdGVEYXRlcGlja2VyKGQpfX0sX2NoYW5nZURhdGVwaWNrZXI6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuX29wdGlvbkRhdGVwaWNrZXIoYSxiLGMpfSxfcmVmcmVzaERhdGVwaWNrZXI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fZ2V0SW5zdChhKTtiJiZ0aGlzLl91cGRhdGVEYXRlcGlja2VyKGIpfSxfc2V0RGF0ZURhdGVwaWNrZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLl9nZXRJbnN0KGEpO2MmJih0aGlzLl9zZXREYXRlKGMsYiksdGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihjKSx0aGlzLl91cGRhdGVBbHRlcm5hdGUoYykpfSxfZ2V0RGF0ZURhdGVwaWNrZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLl9nZXRJbnN0KGEpO3JldHVybiBjJiYhYy5pbmxpbmUmJnRoaXMuX3NldERhdGVGcm9tRmllbGQoYyxiKSxjP3RoaXMuX2dldERhdGUoYyk6bnVsbH0sX2RvS2V5RG93bjpmdW5jdGlvbihhKXt2YXIgYj0kLmRhdGVwaWNrZXIuX2dldEluc3QoYS50YXJnZXQpLGM9ITAsZD1iLmRwRGl2LmlzKCIudWktZGF0ZXBpY2tlci1ydGwiKTtiLl9rZXlFdmVudD0hMDtpZigkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nKXN3aXRjaChhLmtleUNvZGUpe2Nhc2UgOTokLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCksYz0hMTticmVhaztjYXNlIDEzOnZhciBlPSQoInRkLiIrJC5kYXRlcGlja2VyLl9kYXlPdmVyQ2xhc3MrIjpub3QoLiIrJC5kYXRlcGlja2VyLl9jdXJyZW50Q2xhc3MrIikiLGIuZHBEaXYpO2VbMF0mJiQuZGF0ZXBpY2tlci5fc2VsZWN0RGF5KGEudGFyZ2V0LGIuc2VsZWN0ZWRNb250aCxiLnNlbGVjdGVkWWVhcixlWzBdKTt2YXIgZj0kLmRhdGVwaWNrZXIuX2dldChiLCJvblNlbGVjdCIpO2lmKGYpe3ZhciBnPSQuZGF0ZXBpY2tlci5fZm9ybWF0RGF0ZShiKTtmLmFwcGx5KGIuaW5wdXQ/Yi5pbnB1dFswXTpudWxsLFtnLGJdKX1lbHNlICQuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKTtyZXR1cm4hMTtjYXNlIDI3OiQuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKTticmVhaztjYXNlIDMzOiQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShhLnRhcmdldCxhLmN0cmxLZXk/LSQuZGF0ZXBpY2tlci5fZ2V0KGIsInN0ZXBCaWdNb250aHMiKTotJC5kYXRlcGlja2VyLl9nZXQoYiwic3RlcE1vbnRocyIpLCJNIik7YnJlYWs7Y2FzZSAzNDokLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoYS50YXJnZXQsYS5jdHJsS2V5PyskLmRhdGVwaWNrZXIuX2dldChiLCJzdGVwQmlnTW9udGhzIik6KyQuZGF0ZXBpY2tlci5fZ2V0KGIsInN0ZXBNb250aHMiKSwiTSIpO2JyZWFrO2Nhc2UgMzU6KGEuY3RybEtleXx8YS5tZXRhS2V5KSYmJC5kYXRlcGlja2VyLl9jbGVhckRhdGUoYS50YXJnZXQpLGM9YS5jdHJsS2V5fHxhLm1ldGFLZXk7YnJlYWs7Y2FzZSAzNjooYS5jdHJsS2V5fHxhLm1ldGFLZXkpJiYkLmRhdGVwaWNrZXIuX2dvdG9Ub2RheShhLnRhcmdldCksYz1hLmN0cmxLZXl8fGEubWV0YUtleTticmVhaztjYXNlIDM3OihhLmN0cmxLZXl8fGEubWV0YUtleSkmJiQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShhLnRhcmdldCxkPzE6LTEsIkQiKSxjPWEuY3RybEtleXx8YS5tZXRhS2V5LGEub3JpZ2luYWxFdmVudC5hbHRLZXkmJiQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShhLnRhcmdldCxhLmN0cmxLZXk/LSQuZGF0ZXBpY2tlci5fZ2V0KGIsInN0ZXBCaWdNb250aHMiKTotJC5kYXRlcGlja2VyLl9nZXQoYiwic3RlcE1vbnRocyIpLCJNIik7YnJlYWs7Y2FzZSAzODooYS5jdHJsS2V5fHxhLm1ldGFLZXkpJiYkLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoYS50YXJnZXQsLTcsIkQiKSxjPWEuY3RybEtleXx8YS5tZXRhS2V5O2JyZWFrO2Nhc2UgMzk6KGEuY3RybEtleXx8YS5tZXRhS2V5KSYmJC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGEudGFyZ2V0LGQ/LTE6MSwiRCIpLGM9YS5jdHJsS2V5fHxhLm1ldGFLZXksYS5vcmlnaW5hbEV2ZW50LmFsdEtleSYmJC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGEudGFyZ2V0LGEuY3RybEtleT8rJC5kYXRlcGlja2VyLl9nZXQoYiwic3RlcEJpZ01vbnRocyIpOiskLmRhdGVwaWNrZXIuX2dldChiLCJzdGVwTW9udGhzIiksIk0iKTticmVhaztjYXNlIDQwOihhLmN0cmxLZXl8fGEubWV0YUtleSkmJiQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShhLnRhcmdldCw3LCJEIiksYz1hLmN0cmxLZXl8fGEubWV0YUtleTticmVhaztkZWZhdWx0OmM9ITF9ZWxzZSBhLmtleUNvZGU9PTM2JiZhLmN0cmxLZXk/JC5kYXRlcGlja2VyLl9zaG93RGF0ZXBpY2tlcih0aGlzKTpjPSExO2MmJihhLnByZXZlbnREZWZhdWx0KCksYS5zdG9wUHJvcGFnYXRpb24oKSl9LF9kb0tleVByZXNzOmZ1bmN0aW9uKGEpe3ZhciBiPSQuZGF0ZXBpY2tlci5fZ2V0SW5zdChhLnRhcmdldCk7aWYoJC5kYXRlcGlja2VyLl9nZXQoYiwiY29uc3RyYWluSW5wdXQiKSl7dmFyIGM9JC5kYXRlcGlja2VyLl9wb3NzaWJsZUNoYXJzKCQuZGF0ZXBpY2tlci5fZ2V0KGIsImRhdGVGb3JtYXQiKSksZD1TdHJpbmcuZnJvbUNoYXJDb2RlKGEuY2hhckNvZGU9PXVuZGVmaW5lZD9hLmtleUNvZGU6YS5jaGFyQ29kZSk7cmV0dXJuIGEuY3RybEtleXx8YS5tZXRhS2V5fHxkPCIgInx8IWN8fGMuaW5kZXhPZihkKT4tMX19LF9kb0tleVVwOmZ1bmN0aW9uKGEpe3ZhciBiPSQuZGF0ZXBpY2tlci5fZ2V0SW5zdChhLnRhcmdldCk7aWYoYi5pbnB1dC52YWwoKSE9Yi5sYXN0VmFsKXRyeXt2YXIgYz0kLmRhdGVwaWNrZXIucGFyc2VEYXRlKCQuZGF0ZXBpY2tlci5fZ2V0KGIsImRhdGVGb3JtYXQiKSxiLmlucHV0P2IuaW5wdXQudmFsKCk6bnVsbCwkLmRhdGVwaWNrZXIuX2dldEZvcm1hdENvbmZpZyhiKSk7YyYmKCQuZGF0ZXBpY2tlci5fc2V0RGF0ZUZyb21GaWVsZChiKSwkLmRhdGVwaWNrZXIuX3VwZGF0ZUFsdGVybmF0ZShiKSwkLmRhdGVwaWNrZXIuX3VwZGF0ZURhdGVwaWNrZXIoYikpfWNhdGNoKGQpeyQuZGF0ZXBpY2tlci5sb2coZCl9cmV0dXJuITB9LF9zaG93RGF0ZXBpY2tlcjpmdW5jdGlvbihhKXthPWEudGFyZ2V0fHxhLGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9ImlucHV0IiYmKGE9JCgiaW5wdXQiLGEucGFyZW50Tm9kZSlbMF0pO2lmKCQuZGF0ZXBpY2tlci5faXNEaXNhYmxlZERhdGVwaWNrZXIoYSl8fCQuZGF0ZXBpY2tlci5fbGFzdElucHV0PT1hKXJldHVybjt2YXIgYj0kLmRhdGVwaWNrZXIuX2dldEluc3QoYSk7JC5kYXRlcGlja2VyLl9jdXJJbnN0JiYkLmRhdGVwaWNrZXIuX2N1ckluc3QhPWImJigkLmRhdGVwaWNrZXIuX2N1ckluc3QuZHBEaXYuc3RvcCghMCwhMCksYiYmJC5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZyYmJC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigkLmRhdGVwaWNrZXIuX2N1ckluc3QuaW5wdXRbMF0pKTt2YXIgYz0kLmRhdGVwaWNrZXIuX2dldChiLCJiZWZvcmVTaG93IiksZD1jP2MuYXBwbHkoYSxbYSxiXSk6e307aWYoZD09PSExKXJldHVybjtleHRlbmRSZW1vdmUoYi5zZXR0aW5ncyxkKSxiLmxhc3RWYWw9bnVsbCwkLmRhdGVwaWNrZXIuX2xhc3RJbnB1dD1hLCQuZGF0ZXBpY2tlci5fc2V0RGF0ZUZyb21GaWVsZChiKSwkLmRhdGVwaWNrZXIuX2luRGlhbG9nJiYoYS52YWx1ZT0iIiksJC5kYXRlcGlja2VyLl9wb3N8fCgkLmRhdGVwaWNrZXIuX3Bvcz0kLmRhdGVwaWNrZXIuX2ZpbmRQb3MoYSksJC5kYXRlcGlja2VyLl9wb3NbMV0rPWEub2Zmc2V0SGVpZ2h0KTt2YXIgZT0hMTskKGEpLnBhcmVudHMoKS5lYWNoKGZ1bmN0aW9uKCl7cmV0dXJuIGV8PSQodGhpcykuY3NzKCJwb3NpdGlvbiIpPT0iZml4ZWQiLCFlfSksZSYmJC5icm93c2VyLm9wZXJhJiYoJC5kYXRlcGlja2VyLl9wb3NbMF0tPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0LCQuZGF0ZXBpY2tlci5fcG9zWzFdLT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wKTt2YXIgZj17bGVmdDokLmRhdGVwaWNrZXIuX3Bvc1swXSx0b3A6JC5kYXRlcGlja2VyLl9wb3NbMV19OyQuZGF0ZXBpY2tlci5fcG9zPW51bGwsYi5kcERpdi5lbXB0eSgpLGIuZHBEaXYuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLGRpc3BsYXk6ImJsb2NrIix0b3A6Ii0xMDAwcHgifSksJC5kYXRlcGlja2VyLl91cGRhdGVEYXRlcGlja2VyKGIpLGY9JC5kYXRlcGlja2VyLl9jaGVja09mZnNldChiLGYsZSksYi5kcERpdi5jc3Moe3Bvc2l0aW9uOiQuZGF0ZXBpY2tlci5faW5EaWFsb2cmJiQuYmxvY2tVST8ic3RhdGljIjplPyJmaXhlZCI6ImFic29sdXRlIixkaXNwbGF5OiJub25lIixsZWZ0OmYubGVmdCsicHgiLHRvcDpmLnRvcCsicHgifSk7aWYoIWIuaW5saW5lKXt2YXIgZz0kLmRhdGVwaWNrZXIuX2dldChiLCJzaG93QW5pbSIpLGg9JC5kYXRlcGlja2VyLl9nZXQoYiwiZHVyYXRpb24iKSxpPWZ1bmN0aW9uKCl7dmFyIGE9Yi5kcERpdi5maW5kKCJpZnJhbWUudWktZGF0ZXBpY2tlci1jb3ZlciIpO2lmKCEhYS5sZW5ndGgpe3ZhciBjPSQuZGF0ZXBpY2tlci5fZ2V0Qm9yZGVycyhiLmRwRGl2KTthLmNzcyh7bGVmdDotY1swXSx0b3A6LWNbMV0sd2lkdGg6Yi5kcERpdi5vdXRlcldpZHRoKCksaGVpZ2h0OmIuZHBEaXYub3V0ZXJIZWlnaHQoKX0pfX07Yi5kcERpdi56SW5kZXgoJChhKS56SW5kZXgoKSsxKSwkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nPSEwLCQuZWZmZWN0cyYmJC5lZmZlY3RzW2ddP2IuZHBEaXYuc2hvdyhnLCQuZGF0ZXBpY2tlci5fZ2V0KGIsInNob3dPcHRpb25zIiksaCxpKTpiLmRwRGl2W2d8fCJzaG93Il0oZz9oOm51bGwsaSksKCFnfHwhaCkmJmkoKSxiLmlucHV0LmlzKCI6dmlzaWJsZSIpJiYhYi5pbnB1dC5pcygiOmRpc2FibGVkIikmJmIuaW5wdXQuZm9jdXMoKSwkLmRhdGVwaWNrZXIuX2N1ckluc3Q9Yn19LF91cGRhdGVEYXRlcGlja2VyOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7Yi5tYXhSb3dzPTQ7dmFyIGM9JC5kYXRlcGlja2VyLl9nZXRCb3JkZXJzKGEuZHBEaXYpO2luc3RBY3RpdmU9YSxhLmRwRGl2LmVtcHR5KCkuYXBwZW5kKHRoaXMuX2dlbmVyYXRlSFRNTChhKSksdGhpcy5fYXR0YWNoSGFuZGxlcnMoYSk7dmFyIGQ9YS5kcERpdi5maW5kKCJpZnJhbWUudWktZGF0ZXBpY2tlci1jb3ZlciIpOyFkLmxlbmd0aHx8ZC5jc3Moe2xlZnQ6LWNbMF0sdG9wOi1jWzFdLHdpZHRoOmEuZHBEaXYub3V0ZXJXaWR0aCgpLGhlaWdodDphLmRwRGl2Lm91dGVySGVpZ2h0KCl9KSxhLmRwRGl2LmZpbmQoIi4iK3RoaXMuX2RheU92ZXJDbGFzcysiIGEiKS5tb3VzZW92ZXIoKTt2YXIgZT10aGlzLl9nZXROdW1iZXJPZk1vbnRocyhhKSxmPWVbMV0sZz0xNzthLmRwRGl2LnJlbW92ZUNsYXNzKCJ1aS1kYXRlcGlja2VyLW11bHRpLTIgdWktZGF0ZXBpY2tlci1tdWx0aS0zIHVpLWRhdGVwaWNrZXItbXVsdGktNCIpLndpZHRoKCIiKSxmPjEmJmEuZHBEaXYuYWRkQ2xhc3MoInVpLWRhdGVwaWNrZXItbXVsdGktIitmKS5jc3MoIndpZHRoIixnKmYrImVtIiksYS5kcERpdlsoZVswXSE9MXx8ZVsxXSE9MT8iYWRkIjoicmVtb3ZlIikrIkNsYXNzIl0oInVpLWRhdGVwaWNrZXItbXVsdGkiKSxhLmRwRGl2Wyh0aGlzLl9nZXQoYSwiaXNSVEwiKT8iYWRkIjoicmVtb3ZlIikrIkNsYXNzIl0oInVpLWRhdGVwaWNrZXItcnRsIiksYT09JC5kYXRlcGlja2VyLl9jdXJJbnN0JiYkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nJiZhLmlucHV0JiZhLmlucHV0LmlzKCI6dmlzaWJsZSIpJiYhYS5pbnB1dC5pcygiOmRpc2FibGVkIikmJmEuaW5wdXRbMF0hPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQmJmEuaW5wdXQuZm9jdXMoKTtpZihhLnllYXJzaHRtbCl7dmFyIGg9YS55ZWFyc2h0bWw7c2V0VGltZW91dChmdW5jdGlvbigpe2g9PT1hLnllYXJzaHRtbCYmYS55ZWFyc2h0bWwmJmEuZHBEaXYuZmluZCgic2VsZWN0LnVpLWRhdGVwaWNrZXIteWVhcjpmaXJzdCIpLnJlcGxhY2VXaXRoKGEueWVhcnNodG1sKSxoPWEueWVhcnNodG1sPW51bGx9LDApfX0sX2dldEJvcmRlcnM6ZnVuY3Rpb24oYSl7dmFyIGI9ZnVuY3Rpb24oYSl7cmV0dXJue3RoaW46MSxtZWRpdW06Mix0aGljazozfVthXXx8YX07cmV0dXJuW3BhcnNlRmxvYXQoYihhLmNzcygiYm9yZGVyLWxlZnQtd2lkdGgiKSkpLHBhcnNlRmxvYXQoYihhLmNzcygiYm9yZGVyLXRvcC13aWR0aCIpKSldfSxfY2hlY2tPZmZzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZHBEaXYub3V0ZXJXaWR0aCgpLGU9YS5kcERpdi5vdXRlckhlaWdodCgpLGY9YS5pbnB1dD9hLmlucHV0Lm91dGVyV2lkdGgoKTowLGc9YS5pbnB1dD9hLmlucHV0Lm91dGVySGVpZ2h0KCk6MCxoPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCsoYz8wOiQoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSksaT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KyhjPzA6JChkb2N1bWVudCkuc2Nyb2xsVG9wKCkpO3JldHVybiBiLmxlZnQtPXRoaXMuX2dldChhLCJpc1JUTCIpP2QtZjowLGIubGVmdC09YyYmYi5sZWZ0PT1hLmlucHV0Lm9mZnNldCgpLmxlZnQ/JChkb2N1bWVudCkuc2Nyb2xsTGVmdCgpOjAsYi50b3AtPWMmJmIudG9wPT1hLmlucHV0Lm9mZnNldCgpLnRvcCtnPyQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpOjAsYi5sZWZ0LT1NYXRoLm1pbihiLmxlZnQsYi5sZWZ0K2Q+aCYmaD5kP01hdGguYWJzKGIubGVmdCtkLWgpOjApLGIudG9wLT1NYXRoLm1pbihiLnRvcCxiLnRvcCtlPmkmJmk+ZT9NYXRoLmFicyhlK2cpOjApLGJ9LF9maW5kUG9zOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuX2dldEluc3QoYSksYz10aGlzLl9nZXQoYiwiaXNSVEwiKTt3aGlsZShhJiYoYS50eXBlPT0iaGlkZGVuInx8YS5ub2RlVHlwZSE9MXx8JC5leHByLmZpbHRlcnMuaGlkZGVuKGEpKSlhPWFbYz8icHJldmlvdXNTaWJsaW5nIjoibmV4dFNpYmxpbmciXTt2YXIgZD0kKGEpLm9mZnNldCgpO3JldHVybltkLmxlZnQsZC50b3BdfSxfaGlkZURhdGVwaWNrZXI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fY3VySW5zdDtpZighYnx8YSYmYiE9JC5kYXRhKGEsUFJPUF9OQU1FKSlyZXR1cm47aWYodGhpcy5fZGF0ZXBpY2tlclNob3dpbmcpe3ZhciBjPXRoaXMuX2dldChiLCJzaG93QW5pbSIpLGQ9dGhpcy5fZ2V0KGIsImR1cmF0aW9uIiksZT1mdW5jdGlvbigpeyQuZGF0ZXBpY2tlci5fdGlkeURpYWxvZyhiKX07JC5lZmZlY3RzJiYkLmVmZmVjdHNbY10/Yi5kcERpdi5oaWRlKGMsJC5kYXRlcGlja2VyLl9nZXQoYiwic2hvd09wdGlvbnMiKSxkLGUpOmIuZHBEaXZbYz09InNsaWRlRG93biI/InNsaWRlVXAiOmM9PSJmYWRlSW4iPyJmYWRlT3V0IjoiaGlkZSJdKGM/ZDpudWxsLGUpLGN8fGUoKSx0aGlzLl9kYXRlcGlja2VyU2hvd2luZz0hMTt2YXIgZj10aGlzLl9nZXQoYiwib25DbG9zZSIpO2YmJmYuYXBwbHkoYi5pbnB1dD9iLmlucHV0WzBdOm51bGwsW2IuaW5wdXQ/Yi5pbnB1dC52YWwoKToiIixiXSksdGhpcy5fbGFzdElucHV0PW51bGwsdGhpcy5faW5EaWFsb2cmJih0aGlzLl9kaWFsb2dJbnB1dC5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDoiMCIsdG9wOiItMTAwcHgifSksJC5ibG9ja1VJJiYoJC51bmJsb2NrVUkoKSwkKCJib2R5IikuYXBwZW5kKHRoaXMuZHBEaXYpKSksdGhpcy5faW5EaWFsb2c9ITF9fSxfdGlkeURpYWxvZzpmdW5jdGlvbihhKXthLmRwRGl2LnJlbW92ZUNsYXNzKHRoaXMuX2RpYWxvZ0NsYXNzKS51bmJpbmQoIi51aS1kYXRlcGlja2VyLWNhbGVuZGFyIil9LF9jaGVja0V4dGVybmFsQ2xpY2s6ZnVuY3Rpb24oYSl7aWYoISQuZGF0ZXBpY2tlci5fY3VySW5zdClyZXR1cm47dmFyIGI9JChhLnRhcmdldCksYz0kLmRhdGVwaWNrZXIuX2dldEluc3QoYlswXSk7KGJbMF0uaWQhPSQuZGF0ZXBpY2tlci5fbWFpbkRpdklkJiZiLnBhcmVudHMoIiMiKyQuZGF0ZXBpY2tlci5fbWFpbkRpdklkKS5sZW5ndGg9PTAmJiFiLmhhc0NsYXNzKCQuZGF0ZXBpY2tlci5tYXJrZXJDbGFzc05hbWUpJiYhYi5jbG9zZXN0KCIuIiskLmRhdGVwaWNrZXIuX3RyaWdnZXJDbGFzcykubGVuZ3RoJiYkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nJiYoISQuZGF0ZXBpY2tlci5faW5EaWFsb2d8fCEkLmJsb2NrVUkpfHxiLmhhc0NsYXNzKCQuZGF0ZXBpY2tlci5tYXJrZXJDbGFzc05hbWUpJiYkLmRhdGVwaWNrZXIuX2N1ckluc3QhPWMpJiYkLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCl9LF9hZGp1c3REYXRlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0kKGEpLGU9dGhpcy5fZ2V0SW5zdChkWzBdKTtpZih0aGlzLl9pc0Rpc2FibGVkRGF0ZXBpY2tlcihkWzBdKSlyZXR1cm47dGhpcy5fYWRqdXN0SW5zdERhdGUoZSxiKyhjPT0iTSI/dGhpcy5fZ2V0KGUsInNob3dDdXJyZW50QXRQb3MiKTowKSxjKSx0aGlzLl91cGRhdGVEYXRlcGlja2VyKGUpfSxfZ290b1RvZGF5OmZ1bmN0aW9uKGEpe3ZhciBiPSQoYSksYz10aGlzLl9nZXRJbnN0KGJbMF0pO2lmKHRoaXMuX2dldChjLCJnb3RvQ3VycmVudCIpJiZjLmN1cnJlbnREYXkpYy5zZWxlY3RlZERheT1jLmN1cnJlbnREYXksYy5kcmF3TW9udGg9Yy5zZWxlY3RlZE1vbnRoPWMuY3VycmVudE1vbnRoLGMuZHJhd1llYXI9Yy5zZWxlY3RlZFllYXI9Yy5jdXJyZW50WWVhcjtlbHNle3ZhciBkPW5ldyBEYXRlO2Muc2VsZWN0ZWREYXk9ZC5nZXREYXRlKCksYy5kcmF3TW9udGg9Yy5zZWxlY3RlZE1vbnRoPWQuZ2V0TW9udGgoKSxjLmRyYXdZZWFyPWMuc2VsZWN0ZWRZZWFyPWQuZ2V0RnVsbFllYXIoKX10aGlzLl9ub3RpZnlDaGFuZ2UoYyksdGhpcy5fYWRqdXN0RGF0ZShiKX0sX3NlbGVjdE1vbnRoWWVhcjpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9JChhKSxlPXRoaXMuX2dldEluc3QoZFswXSk7ZVsic2VsZWN0ZWQiKyhjPT0iTSI/Ik1vbnRoIjoiWWVhciIpXT1lWyJkcmF3IisoYz09Ik0iPyJNb250aCI6IlllYXIiKV09cGFyc2VJbnQoYi5vcHRpb25zW2Iuc2VsZWN0ZWRJbmRleF0udmFsdWUsMTApLHRoaXMuX25vdGlmeUNoYW5nZShlKSx0aGlzLl9hZGp1c3REYXRlKGQpfSxfc2VsZWN0RGF5OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSQoYSk7aWYoJChkKS5oYXNDbGFzcyh0aGlzLl91bnNlbGVjdGFibGVDbGFzcyl8fHRoaXMuX2lzRGlzYWJsZWREYXRlcGlja2VyKGVbMF0pKXJldHVybjt2YXIgZj10aGlzLl9nZXRJbnN0KGVbMF0pO2Yuc2VsZWN0ZWREYXk9Zi5jdXJyZW50RGF5PSQoImEiLGQpLmh0bWwoKSxmLnNlbGVjdGVkTW9udGg9Zi5jdXJyZW50TW9udGg9YixmLnNlbGVjdGVkWWVhcj1mLmN1cnJlbnRZZWFyPWMsdGhpcy5fc2VsZWN0RGF0ZShhLHRoaXMuX2Zvcm1hdERhdGUoZixmLmN1cnJlbnREYXksZi5jdXJyZW50TW9udGgsZi5jdXJyZW50WWVhcikpfSxfY2xlYXJEYXRlOmZ1bmN0aW9uKGEpe3ZhciBiPSQoYSksYz10aGlzLl9nZXRJbnN0KGJbMF0pO3RoaXMuX3NlbGVjdERhdGUoYiwiIil9LF9zZWxlY3REYXRlOmZ1bmN0aW9uKGEsYil7dmFyIGM9JChhKSxkPXRoaXMuX2dldEluc3QoY1swXSk7Yj1iIT1udWxsP2I6dGhpcy5fZm9ybWF0RGF0ZShkKSxkLmlucHV0JiZkLmlucHV0LnZhbChiKSx0aGlzLl91cGRhdGVBbHRlcm5hdGUoZCk7dmFyIGU9dGhpcy5fZ2V0KGQsIm9uU2VsZWN0Iik7ZT9lLmFwcGx5KGQuaW5wdXQ/ZC5pbnB1dFswXTpudWxsLFtiLGRdKTpkLmlucHV0JiZkLmlucHV0LnRyaWdnZXIoImNoYW5nZSIpLGQuaW5saW5lP3RoaXMuX3VwZGF0ZURhdGVwaWNrZXIoZCk6KHRoaXMuX2hpZGVEYXRlcGlja2VyKCksdGhpcy5fbGFzdElucHV0PWQuaW5wdXRbMF0sdHlwZW9mIGQuaW5wdXRbMF0hPSJvYmplY3QiJiZkLmlucHV0LmZvY3VzKCksdGhpcy5fbGFzdElucHV0PW51bGwpfSxfdXBkYXRlQWx0ZXJuYXRlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuX2dldChhLCJhbHRGaWVsZCIpO2lmKGIpe3ZhciBjPXRoaXMuX2dldChhLCJhbHRGb3JtYXQiKXx8dGhpcy5fZ2V0KGEsImRhdGVGb3JtYXQiKSxkPXRoaXMuX2dldERhdGUoYSksZT10aGlzLmZvcm1hdERhdGUoYyxkLHRoaXMuX2dldEZvcm1hdENvbmZpZyhhKSk7JChiKS5lYWNoKGZ1bmN0aW9uKCl7JCh0aGlzKS52YWwoZSl9KX19LG5vV2Vla2VuZHM6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXREYXkoKTtyZXR1cm5bYj4wJiZiPDYsIiJdfSxpc284NjAxV2VlazpmdW5jdGlvbihhKXt2YXIgYj1uZXcgRGF0ZShhLmdldFRpbWUoKSk7Yi5zZXREYXRlKGIuZ2V0RGF0ZSgpKzQtKGIuZ2V0RGF5KCl8fDcpKTt2YXIgYz1iLmdldFRpbWUoKTtyZXR1cm4gYi5zZXRNb250aCgwKSxiLnNldERhdGUoMSksTWF0aC5mbG9vcihNYXRoLnJvdW5kKChjLWIpLzg2NGU1KS83KSsxfSxwYXJzZURhdGU6ZnVuY3Rpb24oYSxiLGMpe2lmKGE9PW51bGx8fGI9PW51bGwpdGhyb3ciSW52YWxpZCBhcmd1bWVudHMiO2I9dHlwZW9mIGI9PSJvYmplY3QiP2IudG9TdHJpbmcoKTpiKyIiO2lmKGI9PSIiKXJldHVybiBudWxsO3ZhciBkPShjP2Muc2hvcnRZZWFyQ3V0b2ZmOm51bGwpfHx0aGlzLl9kZWZhdWx0cy5zaG9ydFllYXJDdXRvZmY7ZD10eXBlb2YgZCE9InN0cmluZyI/ZDoobmV3IERhdGUpLmdldEZ1bGxZZWFyKCklMTAwK3BhcnNlSW50KGQsMTApO3ZhciBlPShjP2MuZGF5TmFtZXNTaG9ydDpudWxsKXx8dGhpcy5fZGVmYXVsdHMuZGF5TmFtZXNTaG9ydCxmPShjP2MuZGF5TmFtZXM6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLmRheU5hbWVzLGc9KGM/Yy5tb250aE5hbWVzU2hvcnQ6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLm1vbnRoTmFtZXNTaG9ydCxoPShjP2MubW9udGhOYW1lczpudWxsKXx8dGhpcy5fZGVmYXVsdHMubW9udGhOYW1lcyxpPS0xLGo9LTEsaz0tMSxsPS0xLG09ITEsbj1mdW5jdGlvbihiKXt2YXIgYz1zKzE8YS5sZW5ndGgmJmEuY2hhckF0KHMrMSk9PWI7cmV0dXJuIGMmJnMrKyxjfSxvPWZ1bmN0aW9uKGEpe3ZhciBjPW4oYSksZD1hPT0iQCI/MTQ6YT09IiEiPzIwOmE9PSJ5IiYmYz80OmE9PSJvIj8zOjIsZT1uZXcgUmVnRXhwKCJeXFxkezEsIitkKyJ9IiksZj1iLnN1YnN0cmluZyhyKS5tYXRjaChlKTtpZighZil0aHJvdyJNaXNzaW5nIG51bWJlciBhdCBwb3NpdGlvbiAiK3I7cmV0dXJuIHIrPWZbMF0ubGVuZ3RoLHBhcnNlSW50KGZbMF0sMTApfSxwPWZ1bmN0aW9uKGEsYyxkKXt2YXIgZT0kLm1hcChuKGEpP2Q6YyxmdW5jdGlvbihhLGIpe3JldHVybltbYixhXV19KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuLShhWzFdLmxlbmd0aC1iWzFdLmxlbmd0aCl9KSxmPS0xOyQuZWFjaChlLGZ1bmN0aW9uKGEsYyl7dmFyIGQ9Y1sxXTtpZihiLnN1YnN0cihyLGQubGVuZ3RoKS50b0xvd2VyQ2FzZSgpPT1kLnRvTG93ZXJDYXNlKCkpcmV0dXJuIGY9Y1swXSxyKz1kLmxlbmd0aCwhMX0pO2lmKGYhPS0xKXJldHVybiBmKzE7dGhyb3ciVW5rbm93biBuYW1lIGF0IHBvc2l0aW9uICIrcn0scT1mdW5jdGlvbigpe2lmKGIuY2hhckF0KHIpIT1hLmNoYXJBdChzKSl0aHJvdyJVbmV4cGVjdGVkIGxpdGVyYWwgYXQgcG9zaXRpb24gIityO3IrK30scj0wO2Zvcih2YXIgcz0wO3M8YS5sZW5ndGg7cysrKWlmKG0pYS5jaGFyQXQocyk9PSInIiYmIW4oIiciKT9tPSExOnEoKTtlbHNlIHN3aXRjaChhLmNoYXJBdChzKSl7Y2FzZSJkIjprPW8oImQiKTticmVhaztjYXNlIkQiOnAoIkQiLGUsZik7YnJlYWs7Y2FzZSJvIjpsPW8oIm8iKTticmVhaztjYXNlIm0iOmo9bygibSIpO2JyZWFrO2Nhc2UiTSI6aj1wKCJNIixnLGgpO2JyZWFrO2Nhc2UieSI6aT1vKCJ5Iik7YnJlYWs7Y2FzZSJAIjp2YXIgdD1uZXcgRGF0ZShvKCJAIikpO2k9dC5nZXRGdWxsWWVhcigpLGo9dC5nZXRNb250aCgpKzEsaz10LmdldERhdGUoKTticmVhaztjYXNlIiEiOnZhciB0PW5ldyBEYXRlKChvKCIhIiktdGhpcy5fdGlja3NUbzE5NzApLzFlNCk7aT10LmdldEZ1bGxZZWFyKCksaj10LmdldE1vbnRoKCkrMSxrPXQuZ2V0RGF0ZSgpO2JyZWFrO2Nhc2UiJyI6bigiJyIpP3EoKTptPSEwO2JyZWFrO2RlZmF1bHQ6cSgpfWlmKHI8Yi5sZW5ndGgpdGhyb3ciRXh0cmEvdW5wYXJzZWQgY2hhcmFjdGVycyBmb3VuZCBpbiBkYXRlOiAiK2Iuc3Vic3RyaW5nKHIpO2k9PS0xP2k9KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpOmk8MTAwJiYoaSs9KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpLShuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSUxMDArKGk8PWQ/MDotMTAwKSk7aWYobD4tMSl7aj0xLGs9bDtkb3t2YXIgdT10aGlzLl9nZXREYXlzSW5Nb250aChpLGotMSk7aWYoazw9dSlicmVhaztqKyssay09dX13aGlsZSghMCl9dmFyIHQ9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoaSxqLTEsaykpO2lmKHQuZ2V0RnVsbFllYXIoKSE9aXx8dC5nZXRNb250aCgpKzEhPWp8fHQuZ2V0RGF0ZSgpIT1rKXRocm93IkludmFsaWQgZGF0ZSI7cmV0dXJuIHR9LEFUT006Inl5LW1tLWRkIixDT09LSUU6IkQsIGRkIE0geXkiLElTT184NjAxOiJ5eS1tbS1kZCIsUkZDXzgyMjoiRCwgZCBNIHkiLFJGQ184NTA6IkRELCBkZC1NLXkiLFJGQ18xMDM2OiJELCBkIE0geSIsUkZDXzExMjM6IkQsIGQgTSB5eSIsUkZDXzI4MjI6IkQsIGQgTSB5eSIsUlNTOiJELCBkIE0geSIsVElDS1M6IiEiLFRJTUVTVEFNUDoiQCIsVzNDOiJ5eS1tbS1kZCIsX3RpY2tzVG8xOTcwOig3MTg2ODUrTWF0aC5mbG9vcig0OTIuNSktTWF0aC5mbG9vcigxOS43KStNYXRoLmZsb29yKDQuOTI1KSkqMjQqNjAqNjAqMWU3LGZvcm1hdERhdGU6ZnVuY3Rpb24oYSxiLGMpe2lmKCFiKXJldHVybiIiO3ZhciBkPShjP2MuZGF5TmFtZXNTaG9ydDpudWxsKXx8dGhpcy5fZGVmYXVsdHMuZGF5TmFtZXNTaG9ydCxlPShjP2MuZGF5TmFtZXM6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLmRheU5hbWVzLGY9KGM/Yy5tb250aE5hbWVzU2hvcnQ6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLm1vbnRoTmFtZXNTaG9ydCxnPShjP2MubW9udGhOYW1lczpudWxsKXx8dGhpcy5fZGVmYXVsdHMubW9udGhOYW1lcyxoPWZ1bmN0aW9uKGIpe3ZhciBjPW0rMTxhLmxlbmd0aCYmYS5jaGFyQXQobSsxKT09YjtyZXR1cm4gYyYmbSsrLGN9LGk9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSIiK2I7aWYoaChhKSl3aGlsZShkLmxlbmd0aDxjKWQ9IjAiK2Q7cmV0dXJuIGR9LGo9ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGgoYSk/ZFtiXTpjW2JdfSxrPSIiLGw9ITE7aWYoYilmb3IodmFyIG09MDttPGEubGVuZ3RoO20rKylpZihsKWEuY2hhckF0KG0pPT0iJyImJiFoKCInIik/bD0hMTprKz1hLmNoYXJBdChtKTtlbHNlIHN3aXRjaChhLmNoYXJBdChtKSl7Y2FzZSJkIjprKz1pKCJkIixiLmdldERhdGUoKSwyKTticmVhaztjYXNlIkQiOmsrPWooIkQiLGIuZ2V0RGF5KCksZCxlKTticmVhaztjYXNlIm8iOmsrPWkoIm8iLE1hdGgucm91bmQoKChuZXcgRGF0ZShiLmdldEZ1bGxZZWFyKCksYi5nZXRNb250aCgpLGIuZ2V0RGF0ZSgpKSkuZ2V0VGltZSgpLShuZXcgRGF0ZShiLmdldEZ1bGxZZWFyKCksMCwwKSkuZ2V0VGltZSgpKS84NjRlNSksMyk7YnJlYWs7Y2FzZSJtIjprKz1pKCJtIixiLmdldE1vbnRoKCkrMSwyKTticmVhaztjYXNlIk0iOmsrPWooIk0iLGIuZ2V0TW9udGgoKSxmLGcpO2JyZWFrO2Nhc2UieSI6ays9aCgieSIpP2IuZ2V0RnVsbFllYXIoKTooYi5nZXRZZWFyKCklMTAwPDEwPyIwIjoiIikrYi5nZXRZZWFyKCklMTAwO2JyZWFrO2Nhc2UiQCI6ays9Yi5nZXRUaW1lKCk7YnJlYWs7Y2FzZSIhIjprKz1iLmdldFRpbWUoKSoxZTQrdGhpcy5fdGlja3NUbzE5NzA7YnJlYWs7Y2FzZSInIjpoKCInIik/ays9IiciOmw9ITA7YnJlYWs7ZGVmYXVsdDprKz1hLmNoYXJBdChtKX1yZXR1cm4ga30sX3Bvc3NpYmxlQ2hhcnM6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz0hMSxkPWZ1bmN0aW9uKGIpe3ZhciBjPWUrMTxhLmxlbmd0aCYmYS5jaGFyQXQoZSsxKT09YjtyZXR1cm4gYyYmZSsrLGN9O2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWlmKGMpYS5jaGFyQXQoZSk9PSInIiYmIWQoIiciKT9jPSExOmIrPWEuY2hhckF0KGUpO2Vsc2Ugc3dpdGNoKGEuY2hhckF0KGUpKXtjYXNlImQiOmNhc2UibSI6Y2FzZSJ5IjpjYXNlIkAiOmIrPSIwMTIzNDU2Nzg5IjticmVhaztjYXNlIkQiOmNhc2UiTSI6cmV0dXJuIG51bGw7Y2FzZSInIjpkKCInIik/Yis9IiciOmM9ITA7YnJlYWs7ZGVmYXVsdDpiKz1hLmNoYXJBdChlKX1yZXR1cm4gYn0sX2dldDpmdW5jdGlvbihhLGIpe3JldHVybiBhLnNldHRpbmdzW2JdIT09dW5kZWZpbmVkP2Euc2V0dGluZ3NbYl06dGhpcy5fZGVmYXVsdHNbYl19LF9zZXREYXRlRnJvbUZpZWxkOmZ1bmN0aW9uKGEsYil7aWYoYS5pbnB1dC52YWwoKT09YS5sYXN0VmFsKXJldHVybjt2YXIgYz10aGlzLl9nZXQoYSwiZGF0ZUZvcm1hdCIpLGQ9YS5sYXN0VmFsPWEuaW5wdXQ/YS5pbnB1dC52YWwoKTpudWxsLGUsZjtlPWY9dGhpcy5fZ2V0RGVmYXVsdERhdGUoYSk7dmFyIGc9dGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGEpO3RyeXtlPXRoaXMucGFyc2VEYXRlKGMsZCxnKXx8Zn1jYXRjaChoKXt0aGlzLmxvZyhoKSxkPWI/IiI6ZH1hLnNlbGVjdGVkRGF5PWUuZ2V0RGF0ZSgpLGEuZHJhd01vbnRoPWEuc2VsZWN0ZWRNb250aD1lLmdldE1vbnRoKCksYS5kcmF3WWVhcj1hLnNlbGVjdGVkWWVhcj1lLmdldEZ1bGxZZWFyKCksYS5jdXJyZW50RGF5PWQ/ZS5nZXREYXRlKCk6MCxhLmN1cnJlbnRNb250aD1kP2UuZ2V0TW9udGgoKTowLGEuY3VycmVudFllYXI9ZD9lLmdldEZ1bGxZZWFyKCk6MCx0aGlzLl9hZGp1c3RJbnN0RGF0ZShhKX0sX2dldERlZmF1bHREYXRlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9yZXN0cmljdE1pbk1heChhLHRoaXMuX2RldGVybWluZURhdGUoYSx0aGlzLl9nZXQoYSwiZGVmYXVsdERhdGUiKSxuZXcgRGF0ZSkpfSxfZGV0ZXJtaW5lRGF0ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IERhdGU7cmV0dXJuIGIuc2V0RGF0ZShiLmdldERhdGUoKSthKSxifSxlPWZ1bmN0aW9uKGIpe3RyeXtyZXR1cm4gJC5kYXRlcGlja2VyLnBhcnNlRGF0ZSgkLmRhdGVwaWNrZXIuX2dldChhLCJkYXRlRm9ybWF0IiksYiwkLmRhdGVwaWNrZXIuX2dldEZvcm1hdENvbmZpZyhhKSl9Y2F0Y2goYyl7fXZhciBkPShiLnRvTG93ZXJDYXNlKCkubWF0Y2goL15jLyk/JC5kYXRlcGlja2VyLl9nZXREYXRlKGEpOm51bGwpfHxuZXcgRGF0ZSxlPWQuZ2V0RnVsbFllYXIoKSxmPWQuZ2V0TW9udGgoKSxnPWQuZ2V0RGF0ZSgpLGg9LyhbKy1dP1swLTldKylccyooZHxEfHd8V3xtfE18eXxZKT8vZyxpPWguZXhlYyhiKTt3aGlsZShpKXtzd2l0Y2goaVsyXXx8ImQiKXtjYXNlImQiOmNhc2UiRCI6Zys9cGFyc2VJbnQoaVsxXSwxMCk7YnJlYWs7Y2FzZSJ3IjpjYXNlIlciOmcrPXBhcnNlSW50KGlbMV0sMTApKjc7YnJlYWs7Y2FzZSJtIjpjYXNlIk0iOmYrPXBhcnNlSW50KGlbMV0sMTApLGc9TWF0aC5taW4oZywkLmRhdGVwaWNrZXIuX2dldERheXNJbk1vbnRoKGUsZikpO2JyZWFrO2Nhc2UieSI6Y2FzZSJZIjplKz1wYXJzZUludChpWzFdLDEwKSxnPU1hdGgubWluKGcsJC5kYXRlcGlja2VyLl9nZXREYXlzSW5Nb250aChlLGYpKX1pPWguZXhlYyhiKX1yZXR1cm4gbmV3IERhdGUoZSxmLGcpfSxmPWI9PW51bGx8fGI9PT0iIj9jOnR5cGVvZiBiPT0ic3RyaW5nIj9lKGIpOnR5cGVvZiBiPT0ibnVtYmVyIj9pc05hTihiKT9jOmQoYik6bmV3IERhdGUoYi5nZXRUaW1lKCkpO3JldHVybiBmPWYmJmYudG9TdHJpbmcoKT09IkludmFsaWQgRGF0ZSI/YzpmLGYmJihmLnNldEhvdXJzKDApLGYuc2V0TWludXRlcygwKSxmLnNldFNlY29uZHMoMCksZi5zZXRNaWxsaXNlY29uZHMoMCkpLHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KGYpfSxfZGF5bGlnaHRTYXZpbmdBZGp1c3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/KGEuc2V0SG91cnMoYS5nZXRIb3VycygpPjEyP2EuZ2V0SG91cnMoKSsyOjApLGEpOm51bGx9LF9zZXREYXRlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0hYixlPWEuc2VsZWN0ZWRNb250aCxmPWEuc2VsZWN0ZWRZZWFyLGc9dGhpcy5fcmVzdHJpY3RNaW5NYXgoYSx0aGlzLl9kZXRlcm1pbmVEYXRlKGEsYixuZXcgRGF0ZSkpO2Euc2VsZWN0ZWREYXk9YS5jdXJyZW50RGF5PWcuZ2V0RGF0ZSgpLGEuZHJhd01vbnRoPWEuc2VsZWN0ZWRNb250aD1hLmN1cnJlbnRNb250aD1nLmdldE1vbnRoKCksYS5kcmF3WWVhcj1hLnNlbGVjdGVkWWVhcj1hLmN1cnJlbnRZZWFyPWcuZ2V0RnVsbFllYXIoKSwoZSE9YS5zZWxlY3RlZE1vbnRofHxmIT1hLnNlbGVjdGVkWWVhcikmJiFjJiZ0aGlzLl9ub3RpZnlDaGFuZ2UoYSksdGhpcy5fYWRqdXN0SW5zdERhdGUoYSksYS5pbnB1dCYmYS5pbnB1dC52YWwoZD8iIjp0aGlzLl9mb3JtYXREYXRlKGEpKX0sX2dldERhdGU6ZnVuY3Rpb24oYSl7dmFyIGI9IWEuY3VycmVudFllYXJ8fGEuaW5wdXQmJmEuaW5wdXQudmFsKCk9PSIiP251bGw6dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoYS5jdXJyZW50WWVhcixhLmN1cnJlbnRNb250aCxhLmN1cnJlbnREYXkpKTtyZXR1cm4gYn0sX2F0dGFjaEhhbmRsZXJzOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuX2dldChhLCJzdGVwTW9udGhzIiksYz0iIyIrYS5pZC5yZXBsYWNlKC9cXFxcL2csIlxcIik7YS5kcERpdi5maW5kKCJbZGF0YS1oYW5kbGVyXSIpLm1hcChmdW5jdGlvbigpe3ZhciBhPXtwcmV2OmZ1bmN0aW9uKCl7d2luZG93WyJEUF9qUXVlcnlfIitkcHV1aWRdLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoYywtYiwiTSIpfSxuZXh0OmZ1bmN0aW9uKCl7d2luZG93WyJEUF9qUXVlcnlfIitkcHV1aWRdLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoYywrYiwiTSIpfSxoaWRlOmZ1bmN0aW9uKCl7d2luZG93WyJEUF9qUXVlcnlfIitkcHV1aWRdLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCl9LHRvZGF5OmZ1bmN0aW9uKCl7d2luZG93WyJEUF9qUXVlcnlfIitkcHV1aWRdLmRhdGVwaWNrZXIuX2dvdG9Ub2RheShjKX0sc2VsZWN0RGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvd1siRFBfalF1ZXJ5XyIrZHB1dWlkXS5kYXRlcGlja2VyLl9zZWxlY3REYXkoYywrdGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEtbW9udGgiKSwrdGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEteWVhciIpLHRoaXMpLCExfSxzZWxlY3RNb250aDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3dbIkRQX2pRdWVyeV8iK2RwdXVpZF0uZGF0ZXBpY2tlci5fc2VsZWN0TW9udGhZZWFyKGMsdGhpcywiTSIpLCExfSxzZWxlY3RZZWFyOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvd1siRFBfalF1ZXJ5XyIrZHB1dWlkXS5kYXRlcGlja2VyLl9zZWxlY3RNb250aFllYXIoYyx0aGlzLCJZIiksITF9fTskKHRoaXMpLmJpbmQodGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEtZXZlbnQiKSxhW3RoaXMuZ2V0QXR0cmlidXRlKCJkYXRhLWhhbmRsZXIiKV0pfSl9LF9nZW5lcmF0ZUhUTUw6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IERhdGU7Yj10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShiLmdldEZ1bGxZZWFyKCksYi5nZXRNb250aCgpLGIuZ2V0RGF0ZSgpKSk7dmFyIGM9dGhpcy5fZ2V0KGEsImlzUlRMIiksZD10aGlzLl9nZXQoYSwic2hvd0J1dHRvblBhbmVsIiksZT10aGlzLl9nZXQoYSwiaGlkZUlmTm9QcmV2TmV4dCIpLGY9dGhpcy5fZ2V0KGEsIm5hdmlnYXRpb25Bc0RhdGVGb3JtYXQiKSxnPXRoaXMuX2dldE51bWJlck9mTW9udGhzKGEpLGg9dGhpcy5fZ2V0KGEsInNob3dDdXJyZW50QXRQb3MiKSxpPXRoaXMuX2dldChhLCJzdGVwTW9udGhzIiksaj1nWzBdIT0xfHxnWzFdIT0xLGs9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QoYS5jdXJyZW50RGF5P25ldyBEYXRlKGEuY3VycmVudFllYXIsYS5jdXJyZW50TW9udGgsYS5jdXJyZW50RGF5KTpuZXcgRGF0ZSg5OTk5LDksOSkpLGw9dGhpcy5fZ2V0TWluTWF4RGF0ZShhLCJtaW4iKSxtPXRoaXMuX2dldE1pbk1heERhdGUoYSwibWF4Iiksbj1hLmRyYXdNb250aC1oLG89YS5kcmF3WWVhcjtuPDAmJihuKz0xMixvLS0pO2lmKG0pe3ZhciBwPXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKG0uZ2V0RnVsbFllYXIoKSxtLmdldE1vbnRoKCktZ1swXSpnWzFdKzEsbS5nZXREYXRlKCkpKTtwPWwmJnA8bD9sOnA7d2hpbGUodGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUobyxuLDEpKT5wKW4tLSxuPDAmJihuPTExLG8tLSl9YS5kcmF3TW9udGg9bixhLmRyYXdZZWFyPW87dmFyIHE9dGhpcy5fZ2V0KGEsInByZXZUZXh0Iik7cT1mP3RoaXMuZm9ybWF0RGF0ZShxLHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKG8sbi1pLDEpKSx0aGlzLl9nZXRGb3JtYXRDb25maWcoYSkpOnE7dmFyIHI9dGhpcy5fY2FuQWRqdXN0TW9udGgoYSwtMSxvLG4pPyc8YSBjbGFzcz0idWktZGF0ZXBpY2tlci1wcmV2IHVpLWNvcm5lci1hbGwiIGRhdGEtaGFuZGxlcj0icHJldiIgZGF0YS1ldmVudD0iY2xpY2siIHRpdGxlPSInK3ErJyI+PHNwYW4gY2xhc3M9InVpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtJysoYz8iZSI6InciKSsnIj4nK3ErIjwvc3Bhbj48L2E+IjplPyIiOic8YSBjbGFzcz0idWktZGF0ZXBpY2tlci1wcmV2IHVpLWNvcm5lci1hbGwgdWktc3RhdGUtZGlzYWJsZWQiIHRpdGxlPSInK3ErJyI+PHNwYW4gY2xhc3M9InVpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtJysoYz8iZSI6InciKSsnIj4nK3ErIjwvc3Bhbj48L2E+IixzPXRoaXMuX2dldChhLCJuZXh0VGV4dCIpO3M9Zj90aGlzLmZvcm1hdERhdGUocyx0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShvLG4raSwxKSksdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGEpKTpzO3ZhciB0PXRoaXMuX2NhbkFkanVzdE1vbnRoKGEsMSxvLG4pPyc8YSBjbGFzcz0idWktZGF0ZXBpY2tlci1uZXh0IHVpLWNvcm5lci1hbGwiIGRhdGEtaGFuZGxlcj0ibmV4dCIgZGF0YS1ldmVudD0iY2xpY2siIHRpdGxlPSInK3MrJyI+PHNwYW4gY2xhc3M9InVpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtJysoYz8idyI6ImUiKSsnIj4nK3MrIjwvc3Bhbj48L2E+IjplPyIiOic8YSBjbGFzcz0idWktZGF0ZXBpY2tlci1uZXh0IHVpLWNvcm5lci1hbGwgdWktc3RhdGUtZGlzYWJsZWQiIHRpdGxlPSInK3MrJyI+PHNwYW4gY2xhc3M9InVpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtJysoYz8idyI6ImUiKSsnIj4nK3MrIjwvc3Bhbj48L2E+Iix1PXRoaXMuX2dldChhLCJjdXJyZW50VGV4dCIpLHY9dGhpcy5fZ2V0KGEsImdvdG9DdXJyZW50IikmJmEuY3VycmVudERheT9rOmI7dT1mP3RoaXMuZm9ybWF0RGF0ZSh1LHYsdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGEpKTp1O3ZhciB3PWEuaW5saW5lPyIiOic8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InVpLWRhdGVwaWNrZXItY2xvc2UgdWktc3RhdGUtZGVmYXVsdCB1aS1wcmlvcml0eS1wcmltYXJ5IHVpLWNvcm5lci1hbGwiIGRhdGEtaGFuZGxlcj0iaGlkZSIgZGF0YS1ldmVudD0iY2xpY2siPicrdGhpcy5fZ2V0KGEsImNsb3NlVGV4dCIpKyI8L2J1dHRvbj4iLHg9ZD8nPGRpdiBjbGFzcz0idWktZGF0ZXBpY2tlci1idXR0b25wYW5lIHVpLXdpZGdldC1jb250ZW50Ij4nKyhjP3c6IiIpKyh0aGlzLl9pc0luUmFuZ2UoYSx2KT8nPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJ1aS1kYXRlcGlja2VyLWN1cnJlbnQgdWktc3RhdGUtZGVmYXVsdCB1aS1wcmlvcml0eS1zZWNvbmRhcnkgdWktY29ybmVyLWFsbCIgZGF0YS1oYW5kbGVyPSJ0b2RheSIgZGF0YS1ldmVudD0iY2xpY2siPicrdSsiPC9idXR0b24+IjoiIikrKGM/IiI6dykrIjwvZGl2PiI6IiIseT1wYXJzZUludCh0aGlzLl9nZXQoYSwiZmlyc3REYXkiKSwxMCk7eT1pc05hTih5KT8wOnk7dmFyIHo9dGhpcy5fZ2V0KGEsInNob3dXZWVrIiksQT10aGlzLl9nZXQoYSwiZGF5TmFtZXMiKSxCPXRoaXMuX2dldChhLCJkYXlOYW1lc1Nob3J0IiksQz10aGlzLl9nZXQoYSwiZGF5TmFtZXNNaW4iKSxEPXRoaXMuX2dldChhLCJtb250aE5hbWVzIiksRT10aGlzLl9nZXQoYSwibW9udGhOYW1lc1Nob3J0IiksRj10aGlzLl9nZXQoYSwiYmVmb3JlU2hvd0RheSIpLEc9dGhpcy5fZ2V0KGEsInNob3dPdGhlck1vbnRocyIpLEg9dGhpcy5fZ2V0KGEsInNlbGVjdE90aGVyTW9udGhzIiksST10aGlzLl9nZXQoYSwiY2FsY3VsYXRlV2VlayIpfHx0aGlzLmlzbzg2MDFXZWVrLEo9dGhpcy5fZ2V0RGVmYXVsdERhdGUoYSksSz0iIjtmb3IodmFyIEw9MDtMPGdbMF07TCsrKXt2YXIgTT0iIjt0aGlzLm1heFJvd3M9NDtmb3IodmFyIE49MDtOPGdbMV07TisrKXt2YXIgTz10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShvLG4sYS5zZWxlY3RlZERheSkpLFA9IiB1aS1jb3JuZXItYWxsIixRPSIiO2lmKGope1ErPSc8ZGl2IGNsYXNzPSJ1aS1kYXRlcGlja2VyLWdyb3VwJztpZihnWzFdPjEpc3dpdGNoKE4pe2Nhc2UgMDpRKz0iIHVpLWRhdGVwaWNrZXItZ3JvdXAtZmlyc3QiLFA9IiB1aS1jb3JuZXItIisoYz8icmlnaHQiOiJsZWZ0Iik7YnJlYWs7Y2FzZSBnWzFdLTE6USs9IiB1aS1kYXRlcGlja2VyLWdyb3VwLWxhc3QiLFA9IiB1aS1jb3JuZXItIisoYz8ibGVmdCI6InJpZ2h0Iik7YnJlYWs7ZGVmYXVsdDpRKz0iIHVpLWRhdGVwaWNrZXItZ3JvdXAtbWlkZGxlIixQPSIifVErPSciPid9USs9JzxkaXYgY2xhc3M9InVpLWRhdGVwaWNrZXItaGVhZGVyIHVpLXdpZGdldC1oZWFkZXIgdWktaGVscGVyLWNsZWFyZml4JytQKyciPicrKC9hbGx8bGVmdC8udGVzdChQKSYmTD09MD9jP3Q6cjoiIikrKC9hbGx8cmlnaHQvLnRlc3QoUCkmJkw9PTA/Yz9yOnQ6IiIpK3RoaXMuX2dlbmVyYXRlTW9udGhZZWFySGVhZGVyKGEsbixvLGwsbSxMPjB8fE4+MCxELEUpKyc8L2Rpdj48dGFibGUgY2xhc3M9InVpLWRhdGVwaWNrZXItY2FsZW5kYXIiPjx0aGVhZD4nKyI8dHI+Ijt2YXIgUj16Pyc8dGggY2xhc3M9InVpLWRhdGVwaWNrZXItd2Vlay1jb2wiPicrdGhpcy5fZ2V0KGEsIndlZWtIZWFkZXIiKSsiPC90aD4iOiIiO2Zvcih2YXIgUz0wO1M8NztTKyspe3ZhciBUPShTK3kpJTc7Uis9Ijx0aCIrKChTK3krNiklNz49NT8nIGNsYXNzPSJ1aS1kYXRlcGlja2VyLXdlZWstZW5kIic6IiIpKyI+IisnPHNwYW4gdGl0bGU9IicrQVtUXSsnIj4nK0NbVF0rIjwvc3Bhbj48L3RoPiJ9USs9UisiPC90cj48L3RoZWFkPjx0Ym9keT4iO3ZhciBVPXRoaXMuX2dldERheXNJbk1vbnRoKG8sbik7bz09YS5zZWxlY3RlZFllYXImJm49PWEuc2VsZWN0ZWRNb250aCYmKGEuc2VsZWN0ZWREYXk9TWF0aC5taW4oYS5zZWxlY3RlZERheSxVKSk7dmFyIFY9KHRoaXMuX2dldEZpcnN0RGF5T2ZNb250aChvLG4pLXkrNyklNyxXPU1hdGguY2VpbCgoVitVKS83KSxYPWo/dGhpcy5tYXhSb3dzPlc/dGhpcy5tYXhSb3dzOlc6Vzt0aGlzLm1heFJvd3M9WDt2YXIgWT10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShvLG4sMS1WKSk7Zm9yKHZhciBaPTA7WjxYO1orKyl7USs9Ijx0cj4iO3ZhciBfPXo/Jzx0ZCBjbGFzcz0idWktZGF0ZXBpY2tlci13ZWVrLWNvbCI+Jyt0aGlzLl9nZXQoYSwiY2FsY3VsYXRlV2VlayIpKFkpKyI8L3RkPiI6IiI7Zm9yKHZhciBTPTA7Uzw3O1MrKyl7dmFyIGJhPUY/Ri5hcHBseShhLmlucHV0P2EuaW5wdXRbMF06bnVsbCxbWV0pOlshMCwiIl0sYmI9WS5nZXRNb250aCgpIT1uLGJjPWJiJiYhSHx8IWJhWzBdfHxsJiZZPGx8fG0mJlk+bTtfKz0nPHRkIGNsYXNzPSInKygoUyt5KzYpJTc+PTU/IiB1aS1kYXRlcGlja2VyLXdlZWstZW5kIjoiIikrKGJiPyIgdWktZGF0ZXBpY2tlci1vdGhlci1tb250aCI6IiIpKyhZLmdldFRpbWUoKT09Ty5nZXRUaW1lKCkmJm49PWEuc2VsZWN0ZWRNb250aCYmYS5fa2V5RXZlbnR8fEouZ2V0VGltZSgpPT1ZLmdldFRpbWUoKSYmSi5nZXRUaW1lKCk9PU8uZ2V0VGltZSgpPyIgIit0aGlzLl9kYXlPdmVyQ2xhc3M6IiIpKyhiYz8iICIrdGhpcy5fdW5zZWxlY3RhYmxlQ2xhc3MrIiB1aS1zdGF0ZS1kaXNhYmxlZCI6IiIpKyhiYiYmIUc/IiI6IiAiK2JhWzFdKyhZLmdldFRpbWUoKT09ay5nZXRUaW1lKCk/IiAiK3RoaXMuX2N1cnJlbnRDbGFzczoiIikrKFkuZ2V0VGltZSgpPT1iLmdldFRpbWUoKT8iIHVpLWRhdGVwaWNrZXItdG9kYXkiOiIiKSkrJyInKygoIWJifHxHKSYmYmFbMl0/JyB0aXRsZT0iJytiYVsyXSsnIic6IiIpKyhiYz8iIjonIGRhdGEtaGFuZGxlcj0ic2VsZWN0RGF5IiBkYXRhLWV2ZW50PSJjbGljayIgZGF0YS1tb250aD0iJytZLmdldE1vbnRoKCkrJyIgZGF0YS15ZWFyPSInK1kuZ2V0RnVsbFllYXIoKSsnIicpKyI+IisoYmImJiFHPyImI3hhMDsiOmJjPyc8c3BhbiBjbGFzcz0idWktc3RhdGUtZGVmYXVsdCI+JytZLmdldERhdGUoKSsiPC9zcGFuPiI6JzxhIGNsYXNzPSJ1aS1zdGF0ZS1kZWZhdWx0JysoWS5nZXRUaW1lKCk9PWIuZ2V0VGltZSgpPyIgdWktc3RhdGUtaGlnaGxpZ2h0IjoiIikrKFkuZ2V0VGltZSgpPT1rLmdldFRpbWUoKT8iIHVpLXN0YXRlLWFjdGl2ZSI6IiIpKyhiYj8iIHVpLXByaW9yaXR5LXNlY29uZGFyeSI6IiIpKyciIGhyZWY9IiMiPicrWS5nZXREYXRlKCkrIjwvYT4iKSsiPC90ZD4iLFkuc2V0RGF0ZShZLmdldERhdGUoKSsxKSxZPXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KFkpfVErPV8rIjwvdHI+In1uKyssbj4xMSYmKG49MCxvKyspLFErPSI8L3Rib2R5PjwvdGFibGU+Iisoaj8iPC9kaXY+IisoZ1swXT4wJiZOPT1nWzFdLTE/JzxkaXYgY2xhc3M9InVpLWRhdGVwaWNrZXItcm93LWJyZWFrIj48L2Rpdj4nOiIiKToiIiksTSs9UX1LKz1NfXJldHVybiBLKz14KygkLmJyb3dzZXIubXNpZSYmcGFyc2VJbnQoJC5icm93c2VyLnZlcnNpb24sMTApPDcmJiFhLmlubGluZT8nPGlmcmFtZSBzcmM9ImphdmFzY3JpcHQ6ZmFsc2U7IiBjbGFzcz0idWktZGF0ZXBpY2tlci1jb3ZlciIgZnJhbWVib3JkZXI9IjAiPjwvaWZyYW1lPic6IiIpLGEuX2tleUV2ZW50PSExLEt9LF9nZW5lcmF0ZU1vbnRoWWVhckhlYWRlcjpmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgpe3ZhciBpPXRoaXMuX2dldChhLCJjaGFuZ2VNb250aCIpLGo9dGhpcy5fZ2V0KGEsImNoYW5nZVllYXIiKSxrPXRoaXMuX2dldChhLCJzaG93TW9udGhBZnRlclllYXIiKSxsPSc8ZGl2IGNsYXNzPSJ1aS1kYXRlcGlja2VyLXRpdGxlIj4nLG09IiI7aWYoZnx8IWkpbSs9JzxzcGFuIGNsYXNzPSJ1aS1kYXRlcGlja2VyLW1vbnRoIj4nK2dbYl0rIjwvc3Bhbj4iO2Vsc2V7dmFyIG49ZCYmZC5nZXRGdWxsWWVhcigpPT1jLG89ZSYmZS5nZXRGdWxsWWVhcigpPT1jO20rPSc8c2VsZWN0IGNsYXNzPSJ1aS1kYXRlcGlja2VyLW1vbnRoIiBkYXRhLWhhbmRsZXI9InNlbGVjdE1vbnRoIiBkYXRhLWV2ZW50PSJjaGFuZ2UiPic7Zm9yKHZhciBwPTA7cDwxMjtwKyspKCFufHxwPj1kLmdldE1vbnRoKCkpJiYoIW98fHA8PWUuZ2V0TW9udGgoKSkmJihtKz0nPG9wdGlvbiB2YWx1ZT0iJytwKyciJysocD09Yj8nIHNlbGVjdGVkPSJzZWxlY3RlZCInOiIiKSsiPiIraFtwXSsiPC9vcHRpb24+Iik7bSs9Ijwvc2VsZWN0PiJ9a3x8KGwrPW0rKGZ8fCFpfHwhaj8iJiN4YTA7IjoiIikpO2lmKCFhLnllYXJzaHRtbCl7YS55ZWFyc2h0bWw9IiI7aWYoZnx8IWopbCs9JzxzcGFuIGNsYXNzPSJ1aS1kYXRlcGlja2VyLXllYXIiPicrYysiPC9zcGFuPiI7ZWxzZXt2YXIgcT10aGlzLl9nZXQoYSwieWVhclJhbmdlIikuc3BsaXQoIjoiKSxyPShuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSxzPWZ1bmN0aW9uKGEpe3ZhciBiPWEubWF0Y2goL2NbKy1dLiovKT9jK3BhcnNlSW50KGEuc3Vic3RyaW5nKDEpLDEwKTphLm1hdGNoKC9bKy1dLiovKT9yK3BhcnNlSW50KGEsMTApOnBhcnNlSW50KGEsMTApO3JldHVybiBpc05hTihiKT9yOmJ9LHQ9cyhxWzBdKSx1PU1hdGgubWF4KHQscyhxWzFdfHwiIikpO3Q9ZD9NYXRoLm1heCh0LGQuZ2V0RnVsbFllYXIoKSk6dCx1PWU/TWF0aC5taW4odSxlLmdldEZ1bGxZZWFyKCkpOnUsYS55ZWFyc2h0bWwrPSc8c2VsZWN0IGNsYXNzPSJ1aS1kYXRlcGlja2VyLXllYXIiIGRhdGEtaGFuZGxlcj0ic2VsZWN0WWVhciIgZGF0YS1ldmVudD0iY2hhbmdlIj4nO2Zvcig7dDw9dTt0KyspYS55ZWFyc2h0bWwrPSc8b3B0aW9uIHZhbHVlPSInK3QrJyInKyh0PT1jPycgc2VsZWN0ZWQ9InNlbGVjdGVkIic6IiIpKyI+Iit0KyI8L29wdGlvbj4iO2EueWVhcnNodG1sKz0iPC9zZWxlY3Q+IixsKz1hLnllYXJzaHRtbCxhLnllYXJzaHRtbD1udWxsfX1yZXR1cm4gbCs9dGhpcy5fZ2V0KGEsInllYXJTdWZmaXgiKSxrJiYobCs9KGZ8fCFpfHwhaj8iJiN4YTA7IjoiIikrbSksbCs9IjwvZGl2PiIsbH0sX2FkanVzdEluc3REYXRlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmRyYXdZZWFyKyhjPT0iWSI/YjowKSxlPWEuZHJhd01vbnRoKyhjPT0iTSI/YjowKSxmPU1hdGgubWluKGEuc2VsZWN0ZWREYXksdGhpcy5fZ2V0RGF5c0luTW9udGgoZCxlKSkrKGM9PSJEIj9iOjApLGc9dGhpcy5fcmVzdHJpY3RNaW5NYXgoYSx0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShkLGUsZikpKTthLnNlbGVjdGVkRGF5PWcuZ2V0RGF0ZSgpLGEuZHJhd01vbnRoPWEuc2VsZWN0ZWRNb250aD1nLmdldE1vbnRoKCksYS5kcmF3WWVhcj1hLnNlbGVjdGVkWWVhcj1nLmdldEZ1bGxZZWFyKCksKGM9PSJNInx8Yz09IlkiKSYmdGhpcy5fbm90aWZ5Q2hhbmdlKGEpfSxfcmVzdHJpY3RNaW5NYXg6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLl9nZXRNaW5NYXhEYXRlKGEsIm1pbiIpLGQ9dGhpcy5fZ2V0TWluTWF4RGF0ZShhLCJtYXgiKSxlPWMmJmI8Yz9jOmI7cmV0dXJuIGU9ZCYmZT5kP2Q6ZSxlfSxfbm90aWZ5Q2hhbmdlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuX2dldChhLCJvbkNoYW5nZU1vbnRoWWVhciIpO2ImJmIuYXBwbHkoYS5pbnB1dD9hLmlucHV0WzBdOm51bGwsW2Euc2VsZWN0ZWRZZWFyLGEuc2VsZWN0ZWRNb250aCsxLGFdKX0sX2dldE51bWJlck9mTW9udGhzOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuX2dldChhLCJudW1iZXJPZk1vbnRocyIpO3JldHVybiBiPT1udWxsP1sxLDFdOnR5cGVvZiBiPT0ibnVtYmVyIj9bMSxiXTpifSxfZ2V0TWluTWF4RGF0ZTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLl9kZXRlcm1pbmVEYXRlKGEsdGhpcy5fZ2V0KGEsYisiRGF0ZSIpLG51bGwpfSxfZ2V0RGF5c0luTW9udGg6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMzItdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoYSxiLDMyKSkuZ2V0RGF0ZSgpfSxfZ2V0Rmlyc3REYXlPZk1vbnRoOmZ1bmN0aW9uKGEsYil7cmV0dXJuKG5ldyBEYXRlKGEsYiwxKSkuZ2V0RGF5KCl9LF9jYW5BZGp1c3RNb250aDpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT10aGlzLl9nZXROdW1iZXJPZk1vbnRocyhhKSxmPXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGMsZCsoYjwwP2I6ZVswXSplWzFdKSwxKSk7cmV0dXJuIGI8MCYmZi5zZXREYXRlKHRoaXMuX2dldERheXNJbk1vbnRoKGYuZ2V0RnVsbFllYXIoKSxmLmdldE1vbnRoKCkpKSx0aGlzLl9pc0luUmFuZ2UoYSxmKX0sX2lzSW5SYW5nZTpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuX2dldE1pbk1heERhdGUoYSwibWluIiksZD10aGlzLl9nZXRNaW5NYXhEYXRlKGEsIm1heCIpO3JldHVybighY3x8Yi5nZXRUaW1lKCk+PWMuZ2V0VGltZSgpKSYmKCFkfHxiLmdldFRpbWUoKTw9ZC5nZXRUaW1lKCkpfSxfZ2V0Rm9ybWF0Q29uZmlnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuX2dldChhLCJzaG9ydFllYXJDdXRvZmYiKTtyZXR1cm4gYj10eXBlb2YgYiE9InN0cmluZyI/YjoobmV3IERhdGUpLmdldEZ1bGxZZWFyKCklMTAwK3BhcnNlSW50KGIsMTApLHtzaG9ydFllYXJDdXRvZmY6YixkYXlOYW1lc1Nob3J0OnRoaXMuX2dldChhLCJkYXlOYW1lc1Nob3J0IiksZGF5TmFtZXM6dGhpcy5fZ2V0KGEsImRheU5hbWVzIiksbW9udGhOYW1lc1Nob3J0OnRoaXMuX2dldChhLCJtb250aE5hbWVzU2hvcnQiKSxtb250aE5hbWVzOnRoaXMuX2dldChhLCJtb250aE5hbWVzIil9fSxfZm9ybWF0RGF0ZTpmdW5jdGlvbihhLGIsYyxkKXtifHwoYS5jdXJyZW50RGF5PWEuc2VsZWN0ZWREYXksYS5jdXJyZW50TW9udGg9YS5zZWxlY3RlZE1vbnRoLGEuY3VycmVudFllYXI9YS5zZWxlY3RlZFllYXIpO3ZhciBlPWI/dHlwZW9mIGI9PSJvYmplY3QiP2I6dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZCxjLGIpKTp0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShhLmN1cnJlbnRZZWFyLGEuY3VycmVudE1vbnRoLGEuY3VycmVudERheSkpO3JldHVybiB0aGlzLmZvcm1hdERhdGUodGhpcy5fZ2V0KGEsImRhdGVGb3JtYXQiKSxlLHRoaXMuX2dldEZvcm1hdENvbmZpZyhhKSl9fSksJC5mbi5kYXRlcGlja2VyPWZ1bmN0aW9uKGEpe2lmKCF0aGlzLmxlbmd0aClyZXR1cm4gdGhpczskLmRhdGVwaWNrZXIuaW5pdGlhbGl6ZWR8fCgkKGRvY3VtZW50KS5tb3VzZWRvd24oJC5kYXRlcGlja2VyLl9jaGVja0V4dGVybmFsQ2xpY2spLmZpbmQoImJvZHkiKS5hcHBlbmQoJC5kYXRlcGlja2VyLmRwRGl2KSwkLmRhdGVwaWNrZXIuaW5pdGlhbGl6ZWQ9ITApO3ZhciBiPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4gdHlwZW9mIGEhPSJzdHJpbmcifHxhIT0iaXNEaXNhYmxlZCImJmEhPSJnZXREYXRlIiYmYSE9IndpZGdldCI/YT09Im9wdGlvbiImJmFyZ3VtZW50cy5sZW5ndGg9PTImJnR5cGVvZiBhcmd1bWVudHNbMV09PSJzdHJpbmciPyQuZGF0ZXBpY2tlclsiXyIrYSsiRGF0ZXBpY2tlciJdLmFwcGx5KCQuZGF0ZXBpY2tlcixbdGhpc1swXV0uY29uY2F0KGIpKTp0aGlzLmVhY2goZnVuY3Rpb24oKXt0eXBlb2YgYT09InN0cmluZyI/JC5kYXRlcGlja2VyWyJfIithKyJEYXRlcGlja2VyIl0uYXBwbHkoJC5kYXRlcGlja2VyLFt0aGlzXS5jb25jYXQoYikpOiQuZGF0ZXBpY2tlci5fYXR0YWNoRGF0ZXBpY2tlcih0aGlzLGEpfSk6JC5kYXRlcGlja2VyWyJfIithKyJEYXRlcGlja2VyIl0uYXBwbHkoJC5kYXRlcGlja2VyLFt0aGlzWzBdXS5jb25jYXQoYikpfSwkLmRhdGVwaWNrZXI9bmV3IERhdGVwaWNrZXIsJC5kYXRlcGlja2VyLmluaXRpYWxpemVkPSExLCQuZGF0ZXBpY2tlci51dWlkPShuZXcgRGF0ZSkuZ2V0VGltZSgpLCQuZGF0ZXBpY2tlci52ZXJzaW9uPSIxLjguMjQiLHdpbmRvd1siRFBfalF1ZXJ5XyIrZHB1dWlkXT0kfShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7dmFyIGM9InVpLWRpYWxvZyB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCAiLGQ9e2J1dHRvbnM6ITAsaGVpZ2h0OiEwLG1heEhlaWdodDohMCxtYXhXaWR0aDohMCxtaW5IZWlnaHQ6ITAsbWluV2lkdGg6ITAsd2lkdGg6ITB9LGU9e21heEhlaWdodDohMCxtYXhXaWR0aDohMCxtaW5IZWlnaHQ6ITAsbWluV2lkdGg6ITB9O2Eud2lkZ2V0KCJ1aS5kaWFsb2ciLHtvcHRpb25zOnthdXRvT3BlbjohMCxidXR0b25zOnt9LGNsb3NlT25Fc2NhcGU6ITAsY2xvc2VUZXh0OiJjbG9zZSIsZGlhbG9nQ2xhc3M6IiIsZHJhZ2dhYmxlOiEwLGhpZGU6bnVsbCxoZWlnaHQ6ImF1dG8iLG1heEhlaWdodDohMSxtYXhXaWR0aDohMSxtaW5IZWlnaHQ6MTUwLG1pbldpZHRoOjE1MCxtb2RhbDohMSxwb3NpdGlvbjp7bXk6ImNlbnRlciIsYXQ6ImNlbnRlciIsY29sbGlzaW9uOiJmaXQiLHVzaW5nOmZ1bmN0aW9uKGIpe3ZhciBjPWEodGhpcykuY3NzKGIpLm9mZnNldCgpLnRvcDtjPDAmJmEodGhpcykuY3NzKCJ0b3AiLGIudG9wLWMpfX0scmVzaXphYmxlOiEwLHNob3c6bnVsbCxzdGFjazohMCx0aXRsZToiIix3aWR0aDozMDAsekluZGV4OjFlM30sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMub3JpZ2luYWxUaXRsZT10aGlzLmVsZW1lbnQuYXR0cigidGl0bGUiKSx0eXBlb2YgdGhpcy5vcmlnaW5hbFRpdGxlIT0ic3RyaW5nIiYmKHRoaXMub3JpZ2luYWxUaXRsZT0iIiksdGhpcy5vcHRpb25zLnRpdGxlPXRoaXMub3B0aW9ucy50aXRsZXx8dGhpcy5vcmlnaW5hbFRpdGxlO3ZhciBiPXRoaXMsZD1iLm9wdGlvbnMsZT1kLnRpdGxlfHwiJiMxNjA7IixmPWEudWkuZGlhbG9nLmdldFRpdGxlSWQoYi5lbGVtZW50KSxnPShiLnVpRGlhbG9nPWEoIjxkaXY+PC9kaXY+IikpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpLmhpZGUoKS5hZGRDbGFzcyhjK2QuZGlhbG9nQ2xhc3MpLmNzcyh7ekluZGV4OmQuekluZGV4fSkuYXR0cigidGFiSW5kZXgiLC0xKS5jc3MoIm91dGxpbmUiLDApLmtleWRvd24oZnVuY3Rpb24oYyl7ZC5jbG9zZU9uRXNjYXBlJiYhYy5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYy5rZXlDb2RlJiZjLmtleUNvZGU9PT1hLnVpLmtleUNvZGUuRVNDQVBFJiYoYi5jbG9zZShjKSxjLnByZXZlbnREZWZhdWx0KCkpfSkuYXR0cih7cm9sZToiZGlhbG9nIiwiYXJpYS1sYWJlbGxlZGJ5IjpmfSkubW91c2Vkb3duKGZ1bmN0aW9uKGEpe2IubW92ZVRvVG9wKCExLGEpfSksaD1iLmVsZW1lbnQuc2hvdygpLnJlbW92ZUF0dHIoInRpdGxlIikuYWRkQ2xhc3MoInVpLWRpYWxvZy1jb250ZW50IHVpLXdpZGdldC1jb250ZW50IikuYXBwZW5kVG8oZyksaT0oYi51aURpYWxvZ1RpdGxlYmFyPWEoIjxkaXY+PC9kaXY+IikpLmFkZENsYXNzKCJ1aS1kaWFsb2ctdGl0bGViYXIgdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItYWxsIHVpLWhlbHBlci1jbGVhcmZpeCIpLnByZXBlbmRUbyhnKSxqPWEoJzxhIGhyZWY9IiMiPjwvYT4nKS5hZGRDbGFzcygidWktZGlhbG9nLXRpdGxlYmFyLWNsb3NlIHVpLWNvcm5lci1hbGwiKS5hdHRyKCJyb2xlIiwiYnV0dG9uIikuaG92ZXIoZnVuY3Rpb24oKXtqLmFkZENsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpfSxmdW5jdGlvbigpe2oucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIil9KS5mb2N1cyhmdW5jdGlvbigpe2ouYWRkQ2xhc3MoInVpLXN0YXRlLWZvY3VzIil9KS5ibHVyKGZ1bmN0aW9uKCl7ai5yZW1vdmVDbGFzcygidWktc3RhdGUtZm9jdXMiKX0pLmNsaWNrKGZ1bmN0aW9uKGEpe3JldHVybiBiLmNsb3NlKGEpLCExfSkuYXBwZW5kVG8oaSksaz0oYi51aURpYWxvZ1RpdGxlYmFyQ2xvc2VUZXh0PWEoIjxzcGFuPjwvc3Bhbj4iKSkuYWRkQ2xhc3MoInVpLWljb24gdWktaWNvbi1jbG9zZXRoaWNrIikudGV4dChkLmNsb3NlVGV4dCkuYXBwZW5kVG8oaiksbD1hKCI8c3Bhbj48L3NwYW4+IikuYWRkQ2xhc3MoInVpLWRpYWxvZy10aXRsZSIpLmF0dHIoImlkIixmKS5odG1sKGUpLnByZXBlbmRUbyhpKTthLmlzRnVuY3Rpb24oZC5iZWZvcmVjbG9zZSkmJiFhLmlzRnVuY3Rpb24oZC5iZWZvcmVDbG9zZSkmJihkLmJlZm9yZUNsb3NlPWQuYmVmb3JlY2xvc2UpLGkuZmluZCgiKiIpLmFkZChpKS5kaXNhYmxlU2VsZWN0aW9uKCksZC5kcmFnZ2FibGUmJmEuZm4uZHJhZ2dhYmxlJiZiLl9tYWtlRHJhZ2dhYmxlKCksZC5yZXNpemFibGUmJmEuZm4ucmVzaXphYmxlJiZiLl9tYWtlUmVzaXphYmxlKCksYi5fY3JlYXRlQnV0dG9ucyhkLmJ1dHRvbnMpLGIuX2lzT3Blbj0hMSxhLmZuLmJnaWZyYW1lJiZnLmJnaWZyYW1lKCl9LF9pbml0OmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLmF1dG9PcGVuJiZ0aGlzLm9wZW4oKX0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBhPXRoaXM7cmV0dXJuIGEub3ZlcmxheSYmYS5vdmVybGF5LmRlc3Ryb3koKSxhLnVpRGlhbG9nLmhpZGUoKSxhLmVsZW1lbnQudW5iaW5kKCIuZGlhbG9nIikucmVtb3ZlRGF0YSgiZGlhbG9nIikucmVtb3ZlQ2xhc3MoInVpLWRpYWxvZy1jb250ZW50IHVpLXdpZGdldC1jb250ZW50IikuaGlkZSgpLmFwcGVuZFRvKCJib2R5IiksYS51aURpYWxvZy5yZW1vdmUoKSxhLm9yaWdpbmFsVGl0bGUmJmEuZWxlbWVudC5hdHRyKCJ0aXRsZSIsYS5vcmlnaW5hbFRpdGxlKSxhfSx3aWRnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51aURpYWxvZ30sY2xvc2U6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcyxkLGU7aWYoITE9PT1jLl90cmlnZ2VyKCJiZWZvcmVDbG9zZSIsYikpcmV0dXJuO3JldHVybiBjLm92ZXJsYXkmJmMub3ZlcmxheS5kZXN0cm95KCksYy51aURpYWxvZy51bmJpbmQoImtleXByZXNzLnVpLWRpYWxvZyIpLGMuX2lzT3Blbj0hMSxjLm9wdGlvbnMuaGlkZT9jLnVpRGlhbG9nLmhpZGUoYy5vcHRpb25zLmhpZGUsZnVuY3Rpb24oKXtjLl90cmlnZ2VyKCJjbG9zZSIsYil9KTooYy51aURpYWxvZy5oaWRlKCksYy5fdHJpZ2dlcigiY2xvc2UiLGIpKSxhLnVpLmRpYWxvZy5vdmVybGF5LnJlc2l6ZSgpLGMub3B0aW9ucy5tb2RhbCYmKGQ9MCxhKCIudWktZGlhbG9nIikuZWFjaChmdW5jdGlvbigpe3RoaXMhPT1jLnVpRGlhbG9nWzBdJiYoZT1hKHRoaXMpLmNzcygiei1pbmRleCIpLGlzTmFOKGUpfHwoZD1NYXRoLm1heChkLGUpKSl9KSxhLnVpLmRpYWxvZy5tYXhaPWQpLGN9LGlzT3BlbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc09wZW59LG1vdmVUb1RvcDpmdW5jdGlvbihiLGMpe3ZhciBkPXRoaXMsZT1kLm9wdGlvbnMsZjtyZXR1cm4gZS5tb2RhbCYmIWJ8fCFlLnN0YWNrJiYhZS5tb2RhbD9kLl90cmlnZ2VyKCJmb2N1cyIsYyk6KGUuekluZGV4PmEudWkuZGlhbG9nLm1heFomJihhLnVpLmRpYWxvZy5tYXhaPWUuekluZGV4KSxkLm92ZXJsYXkmJihhLnVpLmRpYWxvZy5tYXhaKz0xLGQub3ZlcmxheS4kZWwuY3NzKCJ6LWluZGV4IixhLnVpLmRpYWxvZy5vdmVybGF5Lm1heFo9YS51aS5kaWFsb2cubWF4WikpLGY9e3Njcm9sbFRvcDpkLmVsZW1lbnQuc2Nyb2xsVG9wKCksc2Nyb2xsTGVmdDpkLmVsZW1lbnQuc2Nyb2xsTGVmdCgpfSxhLnVpLmRpYWxvZy5tYXhaKz0xLGQudWlEaWFsb2cuY3NzKCJ6LWluZGV4IixhLnVpLmRpYWxvZy5tYXhaKSxkLmVsZW1lbnQuYXR0cihmKSxkLl90cmlnZ2VyKCJmb2N1cyIsYyksZCl9LG9wZW46ZnVuY3Rpb24oKXtpZih0aGlzLl9pc09wZW4pcmV0dXJuO3ZhciBiPXRoaXMsYz1iLm9wdGlvbnMsZD1iLnVpRGlhbG9nO3JldHVybiBiLm92ZXJsYXk9Yy5tb2RhbD9uZXcgYS51aS5kaWFsb2cub3ZlcmxheShiKTpudWxsLGIuX3NpemUoKSxiLl9wb3NpdGlvbihjLnBvc2l0aW9uKSxkLnNob3coYy5zaG93KSxiLm1vdmVUb1RvcCghMCksYy5tb2RhbCYmZC5iaW5kKCJrZXlkb3duLnVpLWRpYWxvZyIsZnVuY3Rpb24oYil7aWYoYi5rZXlDb2RlIT09YS51aS5rZXlDb2RlLlRBQilyZXR1cm47dmFyIGM9YSgiOnRhYmJhYmxlIix0aGlzKSxkPWMuZmlsdGVyKCI6Zmlyc3QiKSxlPWMuZmlsdGVyKCI6bGFzdCIpO2lmKGIudGFyZ2V0PT09ZVswXSYmIWIuc2hpZnRLZXkpcmV0dXJuIGQuZm9jdXMoMSksITE7aWYoYi50YXJnZXQ9PT1kWzBdJiZiLnNoaWZ0S2V5KXJldHVybiBlLmZvY3VzKDEpLCExfSksYShiLmVsZW1lbnQuZmluZCgiOnRhYmJhYmxlIikuZ2V0KCkuY29uY2F0KGQuZmluZCgiLnVpLWRpYWxvZy1idXR0b25wYW5lIDp0YWJiYWJsZSIpLmdldCgpLmNvbmNhdChkLmdldCgpKSkpLmVxKDApLmZvY3VzKCksYi5faXNPcGVuPSEwLGIuX3RyaWdnZXIoIm9wZW4iKSxifSxfY3JlYXRlQnV0dG9uczpmdW5jdGlvbihiKXt2YXIgYz10aGlzLGQ9ITEsZT1hKCI8ZGl2PjwvZGl2PiIpLmFkZENsYXNzKCJ1aS1kaWFsb2ctYnV0dG9ucGFuZSB1aS13aWRnZXQtY29udGVudCB1aS1oZWxwZXItY2xlYXJmaXgiKSxmPWEoIjxkaXY+PC9kaXY+IikuYWRkQ2xhc3MoInVpLWRpYWxvZy1idXR0b25zZXQiKS5hcHBlbmRUbyhlKTtjLnVpRGlhbG9nLmZpbmQoIi51aS1kaWFsb2ctYnV0dG9ucGFuZSIpLnJlbW92ZSgpLHR5cGVvZiBiPT0ib2JqZWN0IiYmYiE9PW51bGwmJmEuZWFjaChiLGZ1bmN0aW9uKCl7cmV0dXJuIShkPSEwKX0pLGQmJihhLmVhY2goYixmdW5jdGlvbihiLGQpe2Q9YS5pc0Z1bmN0aW9uKGQpP3tjbGljazpkLHRleHQ6Yn06ZDt2YXIgZT1hKCc8YnV0dG9uIHR5cGU9ImJ1dHRvbiI+PC9idXR0b24+JykuY2xpY2soZnVuY3Rpb24oKXtkLmNsaWNrLmFwcGx5KGMuZWxlbWVudFswXSxhcmd1bWVudHMpfSkuYXBwZW5kVG8oZik7YS5lYWNoKGQsZnVuY3Rpb24oYSxiKXtpZihhPT09ImNsaWNrIilyZXR1cm47YSBpbiBlP2VbYV0oYik6ZS5hdHRyKGEsYil9KSxhLmZuLmJ1dHRvbiYmZS5idXR0b24oKX0pLGUuYXBwZW5kVG8oYy51aURpYWxvZykpfSxfbWFrZURyYWdnYWJsZTpmdW5jdGlvbigpe2Z1bmN0aW9uIGYoYSl7cmV0dXJue3Bvc2l0aW9uOmEucG9zaXRpb24sb2Zmc2V0OmEub2Zmc2V0fX12YXIgYj10aGlzLGM9Yi5vcHRpb25zLGQ9YShkb2N1bWVudCksZTtiLnVpRGlhbG9nLmRyYWdnYWJsZSh7Y2FuY2VsOiIudWktZGlhbG9nLWNvbnRlbnQsIC51aS1kaWFsb2ctdGl0bGViYXItY2xvc2UiLGhhbmRsZToiLnVpLWRpYWxvZy10aXRsZWJhciIsY29udGFpbm1lbnQ6ImRvY3VtZW50IixzdGFydDpmdW5jdGlvbihkLGcpe2U9Yy5oZWlnaHQ9PT0iYXV0byI/ImF1dG8iOmEodGhpcykuaGVpZ2h0KCksYSh0aGlzKS5oZWlnaHQoYSh0aGlzKS5oZWlnaHQoKSkuYWRkQ2xhc3MoInVpLWRpYWxvZy1kcmFnZ2luZyIpLGIuX3RyaWdnZXIoImRyYWdTdGFydCIsZCxmKGcpKX0sZHJhZzpmdW5jdGlvbihhLGMpe2IuX3RyaWdnZXIoImRyYWciLGEsZihjKSl9LHN0b3A6ZnVuY3Rpb24oZyxoKXtjLnBvc2l0aW9uPVtoLnBvc2l0aW9uLmxlZnQtZC5zY3JvbGxMZWZ0KCksaC5wb3NpdGlvbi50b3AtZC5zY3JvbGxUb3AoKV0sYSh0aGlzKS5yZW1vdmVDbGFzcygidWktZGlhbG9nLWRyYWdnaW5nIikuaGVpZ2h0KGUpLGIuX3RyaWdnZXIoImRyYWdTdG9wIixnLGYoaCkpLGEudWkuZGlhbG9nLm92ZXJsYXkucmVzaXplKCl9fSl9LF9tYWtlUmVzaXphYmxlOmZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGgoYSl7cmV0dXJue29yaWdpbmFsUG9zaXRpb246YS5vcmlnaW5hbFBvc2l0aW9uLG9yaWdpbmFsU2l6ZTphLm9yaWdpbmFsU2l6ZSxwb3NpdGlvbjphLnBvc2l0aW9uLHNpemU6YS5zaXplfX1jPWM9PT1iP3RoaXMub3B0aW9ucy5yZXNpemFibGU6Yzt2YXIgZD10aGlzLGU9ZC5vcHRpb25zLGY9ZC51aURpYWxvZy5jc3MoInBvc2l0aW9uIiksZz10eXBlb2YgYz09InN0cmluZyI/YzoibixlLHMsdyxzZSxzdyxuZSxudyI7ZC51aURpYWxvZy5yZXNpemFibGUoe2NhbmNlbDoiLnVpLWRpYWxvZy1jb250ZW50Iixjb250YWlubWVudDoiZG9jdW1lbnQiLGFsc29SZXNpemU6ZC5lbGVtZW50LG1heFdpZHRoOmUubWF4V2lkdGgsbWF4SGVpZ2h0OmUubWF4SGVpZ2h0LG1pbldpZHRoOmUubWluV2lkdGgsbWluSGVpZ2h0OmQuX21pbkhlaWdodCgpLGhhbmRsZXM6ZyxzdGFydDpmdW5jdGlvbihiLGMpe2EodGhpcykuYWRkQ2xhc3MoInVpLWRpYWxvZy1yZXNpemluZyIpLGQuX3RyaWdnZXIoInJlc2l6ZVN0YXJ0IixiLGgoYykpfSxyZXNpemU6ZnVuY3Rpb24oYSxiKXtkLl90cmlnZ2VyKCJyZXNpemUiLGEsaChiKSl9LHN0b3A6ZnVuY3Rpb24oYixjKXthKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1kaWFsb2ctcmVzaXppbmciKSxlLmhlaWdodD1hKHRoaXMpLmhlaWdodCgpLGUud2lkdGg9YSh0aGlzKS53aWR0aCgpLGQuX3RyaWdnZXIoInJlc2l6ZVN0b3AiLGIsaChjKSksYS51aS5kaWFsb2cub3ZlcmxheS5yZXNpemUoKX19KS5jc3MoInBvc2l0aW9uIixmKS5maW5kKCIudWktcmVzaXphYmxlLXNlIikuYWRkQ2xhc3MoInVpLWljb24gdWktaWNvbi1ncmlwLWRpYWdvbmFsLXNlIil9LF9taW5IZWlnaHQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnM7cmV0dXJuIGEuaGVpZ2h0PT09ImF1dG8iP2EubWluSGVpZ2h0Ok1hdGgubWluKGEubWluSGVpZ2h0LGEuaGVpZ2h0KX0sX3Bvc2l0aW9uOmZ1bmN0aW9uKGIpe3ZhciBjPVtdLGQ9WzAsMF0sZTtpZihiKXtpZih0eXBlb2YgYj09InN0cmluZyJ8fHR5cGVvZiBiPT0ib2JqZWN0IiYmIjAiaW4gYiljPWIuc3BsaXQ/Yi5zcGxpdCgiICIpOltiWzBdLGJbMV1dLGMubGVuZ3RoPT09MSYmKGNbMV09Y1swXSksYS5lYWNoKFsibGVmdCIsInRvcCJdLGZ1bmN0aW9uKGEsYil7K2NbYV09PT1jW2FdJiYoZFthXT1jW2FdLGNbYV09Yil9KSxiPXtteTpjLmpvaW4oIiAiKSxhdDpjLmpvaW4oIiAiKSxvZmZzZXQ6ZC5qb2luKCIgIil9O2I9YS5leHRlbmQoe30sYS51aS5kaWFsb2cucHJvdG90eXBlLm9wdGlvbnMucG9zaXRpb24sYil9ZWxzZSBiPWEudWkuZGlhbG9nLnByb3RvdHlwZS5vcHRpb25zLnBvc2l0aW9uO2U9dGhpcy51aURpYWxvZy5pcygiOnZpc2libGUiKSxlfHx0aGlzLnVpRGlhbG9nLnNob3coKSx0aGlzLnVpRGlhbG9nLmNzcyh7dG9wOjAsbGVmdDowfSkucG9zaXRpb24oYS5leHRlbmQoe29mOndpbmRvd30sYikpLGV8fHRoaXMudWlEaWFsb2cuaGlkZSgpfSxfc2V0T3B0aW9uczpmdW5jdGlvbihiKXt2YXIgYz10aGlzLGY9e30sZz0hMTthLmVhY2goYixmdW5jdGlvbihhLGIpe2MuX3NldE9wdGlvbihhLGIpLGEgaW4gZCYmKGc9ITApLGEgaW4gZSYmKGZbYV09Yil9KSxnJiZ0aGlzLl9zaXplKCksdGhpcy51aURpYWxvZy5pcygiOmRhdGEocmVzaXphYmxlKSIpJiZ0aGlzLnVpRGlhbG9nLnJlc2l6YWJsZSgib3B0aW9uIixmKX0sX3NldE9wdGlvbjpmdW5jdGlvbihiLGQpe3ZhciBlPXRoaXMsZj1lLnVpRGlhbG9nO3N3aXRjaChiKXtjYXNlImJlZm9yZWNsb3NlIjpiPSJiZWZvcmVDbG9zZSI7YnJlYWs7Y2FzZSJidXR0b25zIjplLl9jcmVhdGVCdXR0b25zKGQpO2JyZWFrO2Nhc2UiY2xvc2VUZXh0IjplLnVpRGlhbG9nVGl0bGViYXJDbG9zZVRleHQudGV4dCgiIitkKTticmVhaztjYXNlImRpYWxvZ0NsYXNzIjpmLnJlbW92ZUNsYXNzKGUub3B0aW9ucy5kaWFsb2dDbGFzcykuYWRkQ2xhc3MoYytkKTticmVhaztjYXNlImRpc2FibGVkIjpkP2YuYWRkQ2xhc3MoInVpLWRpYWxvZy1kaXNhYmxlZCIpOmYucmVtb3ZlQ2xhc3MoInVpLWRpYWxvZy1kaXNhYmxlZCIpO2JyZWFrO2Nhc2UiZHJhZ2dhYmxlIjp2YXIgZz1mLmlzKCI6ZGF0YShkcmFnZ2FibGUpIik7ZyYmIWQmJmYuZHJhZ2dhYmxlKCJkZXN0cm95IiksIWcmJmQmJmUuX21ha2VEcmFnZ2FibGUoKTticmVhaztjYXNlInBvc2l0aW9uIjplLl9wb3NpdGlvbihkKTticmVhaztjYXNlInJlc2l6YWJsZSI6dmFyIGg9Zi5pcygiOmRhdGEocmVzaXphYmxlKSIpO2gmJiFkJiZmLnJlc2l6YWJsZSgiZGVzdHJveSIpLGgmJnR5cGVvZiBkPT0ic3RyaW5nIiYmZi5yZXNpemFibGUoIm9wdGlvbiIsImhhbmRsZXMiLGQpLCFoJiZkIT09ITEmJmUuX21ha2VSZXNpemFibGUoZCk7YnJlYWs7Y2FzZSJ0aXRsZSI6YSgiLnVpLWRpYWxvZy10aXRsZSIsZS51aURpYWxvZ1RpdGxlYmFyKS5odG1sKCIiKyhkfHwiJiMxNjA7IikpfWEuV2lkZ2V0LnByb3RvdHlwZS5fc2V0T3B0aW9uLmFwcGx5KGUsYXJndW1lbnRzKX0sX3NpemU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9wdGlvbnMsYyxkLGU9dGhpcy51aURpYWxvZy5pcygiOnZpc2libGUiKTt0aGlzLmVsZW1lbnQuc2hvdygpLmNzcyh7d2lkdGg6ImF1dG8iLG1pbkhlaWdodDowLGhlaWdodDowfSksYi5taW5XaWR0aD5iLndpZHRoJiYoYi53aWR0aD1iLm1pbldpZHRoKSxjPXRoaXMudWlEaWFsb2cuY3NzKHtoZWlnaHQ6ImF1dG8iLHdpZHRoOmIud2lkdGh9KS5oZWlnaHQoKSxkPU1hdGgubWF4KDAsYi5taW5IZWlnaHQtYyk7aWYoYi5oZWlnaHQ9PT0iYXV0byIpaWYoYS5zdXBwb3J0Lm1pbkhlaWdodCl0aGlzLmVsZW1lbnQuY3NzKHttaW5IZWlnaHQ6ZCxoZWlnaHQ6ImF1dG8ifSk7ZWxzZXt0aGlzLnVpRGlhbG9nLnNob3coKTt2YXIgZj10aGlzLmVsZW1lbnQuY3NzKCJoZWlnaHQiLCJhdXRvIikuaGVpZ2h0KCk7ZXx8dGhpcy51aURpYWxvZy5oaWRlKCksdGhpcy5lbGVtZW50LmhlaWdodChNYXRoLm1heChmLGQpKX1lbHNlIHRoaXMuZWxlbWVudC5oZWlnaHQoTWF0aC5tYXgoYi5oZWlnaHQtYywwKSk7dGhpcy51aURpYWxvZy5pcygiOmRhdGEocmVzaXphYmxlKSIpJiZ0aGlzLnVpRGlhbG9nLnJlc2l6YWJsZSgib3B0aW9uIiwibWluSGVpZ2h0Iix0aGlzLl9taW5IZWlnaHQoKSl9fSksYS5leHRlbmQoYS51aS5kaWFsb2cse3ZlcnNpb246IjEuOC4yNCIsdXVpZDowLG1heFo6MCxnZXRUaXRsZUlkOmZ1bmN0aW9uKGEpe3ZhciBiPWEuYXR0cigiaWQiKTtyZXR1cm4gYnx8KHRoaXMudXVpZCs9MSxiPXRoaXMudXVpZCksInVpLWRpYWxvZy10aXRsZS0iK2J9LG92ZXJsYXk6ZnVuY3Rpb24oYil7dGhpcy4kZWw9YS51aS5kaWFsb2cub3ZlcmxheS5jcmVhdGUoYil9fSksYS5leHRlbmQoYS51aS5kaWFsb2cub3ZlcmxheSx7aW5zdGFuY2VzOltdLG9sZEluc3RhbmNlczpbXSxtYXhaOjAsZXZlbnRzOmEubWFwKCJmb2N1cyxtb3VzZWRvd24sbW91c2V1cCxrZXlkb3duLGtleXByZXNzLGNsaWNrIi5zcGxpdCgiLCIpLGZ1bmN0aW9uKGEpe3JldHVybiBhKyIuZGlhbG9nLW92ZXJsYXkifSkuam9pbigiICIpLGNyZWF0ZTpmdW5jdGlvbihiKXt0aGlzLmluc3RhbmNlcy5sZW5ndGg9PT0wJiYoc2V0VGltZW91dChmdW5jdGlvbigpe2EudWkuZGlhbG9nLm92ZXJsYXkuaW5zdGFuY2VzLmxlbmd0aCYmYShkb2N1bWVudCkuYmluZChhLnVpLmRpYWxvZy5vdmVybGF5LmV2ZW50cyxmdW5jdGlvbihiKXtpZihhKGIudGFyZ2V0KS56SW5kZXgoKTxhLnVpLmRpYWxvZy5vdmVybGF5Lm1heFopcmV0dXJuITF9KX0sMSksYShkb2N1bWVudCkuYmluZCgia2V5ZG93bi5kaWFsb2ctb3ZlcmxheSIsZnVuY3Rpb24oYyl7Yi5vcHRpb25zLmNsb3NlT25Fc2NhcGUmJiFjLmlzRGVmYXVsdFByZXZlbnRlZCgpJiZjLmtleUNvZGUmJmMua2V5Q29kZT09PWEudWkua2V5Q29kZS5FU0NBUEUmJihiLmNsb3NlKGMpLGMucHJldmVudERlZmF1bHQoKSl9KSxhKHdpbmRvdykuYmluZCgicmVzaXplLmRpYWxvZy1vdmVybGF5IixhLnVpLmRpYWxvZy5vdmVybGF5LnJlc2l6ZSkpO3ZhciBjPSh0aGlzLm9sZEluc3RhbmNlcy5wb3AoKXx8YSgiPGRpdj48L2Rpdj4iKS5hZGRDbGFzcygidWktd2lkZ2V0LW92ZXJsYXkiKSkuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSkuY3NzKHt3aWR0aDp0aGlzLndpZHRoKCksaGVpZ2h0OnRoaXMuaGVpZ2h0KCl9KTtyZXR1cm4gYS5mbi5iZ2lmcmFtZSYmYy5iZ2lmcmFtZSgpLHRoaXMuaW5zdGFuY2VzLnB1c2goYyksY30sZGVzdHJveTpmdW5jdGlvbihiKXt2YXIgYz1hLmluQXJyYXkoYix0aGlzLmluc3RhbmNlcyk7YyE9LTEmJnRoaXMub2xkSW5zdGFuY2VzLnB1c2godGhpcy5pbnN0YW5jZXMuc3BsaWNlKGMsMSlbMF0pLHRoaXMuaW5zdGFuY2VzLmxlbmd0aD09PTAmJmEoW2RvY3VtZW50LHdpbmRvd10pLnVuYmluZCgiLmRpYWxvZy1vdmVybGF5IiksYi5yZW1vdmUoKTt2YXIgZD0wO2EuZWFjaCh0aGlzLmluc3RhbmNlcyxmdW5jdGlvbigpe2Q9TWF0aC5tYXgoZCx0aGlzLmNzcygiei1pbmRleCIpKX0pLHRoaXMubWF4Wj1kfSxoZWlnaHQ6ZnVuY3Rpb24oKXt2YXIgYixjO3JldHVybiBhLmJyb3dzZXIubXNpZSYmYS5icm93c2VyLnZlcnNpb248Nz8oYj1NYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0LGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0KSxjPU1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vZmZzZXRIZWlnaHQsZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQpLGI8Yz9hKHdpbmRvdykuaGVpZ2h0KCkrInB4IjpiKyJweCIpOmEoZG9jdW1lbnQpLmhlaWdodCgpKyJweCJ9LHdpZHRoOmZ1bmN0aW9uKCl7dmFyIGIsYztyZXR1cm4gYS5icm93c2VyLm1zaWU/KGI9TWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoLGRvY3VtZW50LmJvZHkuc2Nyb2xsV2lkdGgpLGM9TWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm9mZnNldFdpZHRoLGRvY3VtZW50LmJvZHkub2Zmc2V0V2lkdGgpLGI8Yz9hKHdpbmRvdykud2lkdGgoKSsicHgiOmIrInB4Iik6YShkb2N1bWVudCkud2lkdGgoKSsicHgifSxyZXNpemU6ZnVuY3Rpb24oKXt2YXIgYj1hKFtdKTthLmVhY2goYS51aS5kaWFsb2cub3ZlcmxheS5pbnN0YW5jZXMsZnVuY3Rpb24oKXtiPWIuYWRkKHRoaXMpfSksYi5jc3Moe3dpZHRoOjAsaGVpZ2h0OjB9KS5jc3Moe3dpZHRoOmEudWkuZGlhbG9nLm92ZXJsYXkud2lkdGgoKSxoZWlnaHQ6YS51aS5kaWFsb2cub3ZlcmxheS5oZWlnaHQoKX0pfX0pLGEuZXh0ZW5kKGEudWkuZGlhbG9nLm92ZXJsYXkucHJvdG90eXBlLHtkZXN0cm95OmZ1bmN0aW9uKCl7YS51aS5kaWFsb2cub3ZlcmxheS5kZXN0cm95KHRoaXMuJGVsKX19KX0oalF1ZXJ5KSxmdW5jdGlvbihhLGIpe2EudWk9YS51aXx8e307dmFyIGM9L2xlZnR8Y2VudGVyfHJpZ2h0LyxkPS90b3B8Y2VudGVyfGJvdHRvbS8sZT0iY2VudGVyIixmPXt9LGc9YS5mbi5wb3NpdGlvbixoPWEuZm4ub2Zmc2V0O2EuZm4ucG9zaXRpb249ZnVuY3Rpb24oYil7aWYoIWJ8fCFiLm9mKXJldHVybiBnLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtiPWEuZXh0ZW5kKHt9LGIpO3ZhciBoPWEoYi5vZiksaT1oWzBdLGo9KGIuY29sbGlzaW9ufHwiZmxpcCIpLnNwbGl0KCIgIiksaz1iLm9mZnNldD9iLm9mZnNldC5zcGxpdCgiICIpOlswLDBdLGwsbSxuO3JldHVybiBpLm5vZGVUeXBlPT09OT8obD1oLndpZHRoKCksbT1oLmhlaWdodCgpLG49e3RvcDowLGxlZnQ6MH0pOmkuc2V0VGltZW91dD8obD1oLndpZHRoKCksbT1oLmhlaWdodCgpLG49e3RvcDpoLnNjcm9sbFRvcCgpLGxlZnQ6aC5zY3JvbGxMZWZ0KCl9KTppLnByZXZlbnREZWZhdWx0PyhiLmF0PSJsZWZ0IHRvcCIsbD1tPTAsbj17dG9wOmIub2YucGFnZVksbGVmdDpiLm9mLnBhZ2VYfSk6KGw9aC5vdXRlcldpZHRoKCksbT1oLm91dGVySGVpZ2h0KCksbj1oLm9mZnNldCgpKSxhLmVhY2goWyJteSIsImF0Il0sZnVuY3Rpb24oKXt2YXIgYT0oYlt0aGlzXXx8IiIpLnNwbGl0KCIgIik7YS5sZW5ndGg9PT0xJiYoYT1jLnRlc3QoYVswXSk/YS5jb25jYXQoW2VdKTpkLnRlc3QoYVswXSk/W2VdLmNvbmNhdChhKTpbZSxlXSksYVswXT1jLnRlc3QoYVswXSk/YVswXTplLGFbMV09ZC50ZXN0KGFbMV0pP2FbMV06ZSxiW3RoaXNdPWF9KSxqLmxlbmd0aD09PTEmJihqWzFdPWpbMF0pLGtbMF09cGFyc2VJbnQoa1swXSwxMCl8fDAsay5sZW5ndGg9PT0xJiYoa1sxXT1rWzBdKSxrWzFdPXBhcnNlSW50KGtbMV0sMTApfHwwLGIuYXRbMF09PT0icmlnaHQiP24ubGVmdCs9bDpiLmF0WzBdPT09ZSYmKG4ubGVmdCs9bC8yKSxiLmF0WzFdPT09ImJvdHRvbSI/bi50b3ArPW06Yi5hdFsxXT09PWUmJihuLnRvcCs9bS8yKSxuLmxlZnQrPWtbMF0sbi50b3ArPWtbMV0sdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKSxkPWMub3V0ZXJXaWR0aCgpLGc9Yy5vdXRlckhlaWdodCgpLGg9cGFyc2VJbnQoYS5jdXJDU1ModGhpcywibWFyZ2luTGVmdCIsITApKXx8MCxpPXBhcnNlSW50KGEuY3VyQ1NTKHRoaXMsIm1hcmdpblRvcCIsITApKXx8MCxvPWQraCsocGFyc2VJbnQoYS5jdXJDU1ModGhpcywibWFyZ2luUmlnaHQiLCEwKSl8fDApLHA9ZytpKyhwYXJzZUludChhLmN1ckNTUyh0aGlzLCJtYXJnaW5Cb3R0b20iLCEwKSl8fDApLHE9YS5leHRlbmQoe30sbikscjtiLm15WzBdPT09InJpZ2h0Ij9xLmxlZnQtPWQ6Yi5teVswXT09PWUmJihxLmxlZnQtPWQvMiksYi5teVsxXT09PSJib3R0b20iP3EudG9wLT1nOmIubXlbMV09PT1lJiYocS50b3AtPWcvMiksZi5mcmFjdGlvbnN8fChxLmxlZnQ9TWF0aC5yb3VuZChxLmxlZnQpLHEudG9wPU1hdGgucm91bmQocS50b3ApKSxyPXtsZWZ0OnEubGVmdC1oLHRvcDpxLnRvcC1pfSxhLmVhY2goWyJsZWZ0IiwidG9wIl0sZnVuY3Rpb24oYyxlKXthLnVpLnBvc2l0aW9uW2pbY11dJiZhLnVpLnBvc2l0aW9uW2pbY11dW2VdKHEse3RhcmdldFdpZHRoOmwsdGFyZ2V0SGVpZ2h0Om0sZWxlbVdpZHRoOmQsZWxlbUhlaWdodDpnLGNvbGxpc2lvblBvc2l0aW9uOnIsY29sbGlzaW9uV2lkdGg6byxjb2xsaXNpb25IZWlnaHQ6cCxvZmZzZXQ6ayxteTpiLm15LGF0OmIuYXR9KX0pLGEuZm4uYmdpZnJhbWUmJmMuYmdpZnJhbWUoKSxjLm9mZnNldChhLmV4dGVuZChxLHt1c2luZzpiLnVzaW5nfSkpfSl9LGEudWkucG9zaXRpb249e2ZpdDp7bGVmdDpmdW5jdGlvbihiLGMpe3ZhciBkPWEod2luZG93KSxlPWMuY29sbGlzaW9uUG9zaXRpb24ubGVmdCtjLmNvbGxpc2lvbldpZHRoLWQud2lkdGgoKS1kLnNjcm9sbExlZnQoKTtiLmxlZnQ9ZT4wP2IubGVmdC1lOk1hdGgubWF4KGIubGVmdC1jLmNvbGxpc2lvblBvc2l0aW9uLmxlZnQsYi5sZWZ0KX0sdG9wOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh3aW5kb3cpLGU9Yy5jb2xsaXNpb25Qb3NpdGlvbi50b3ArYy5jb2xsaXNpb25IZWlnaHQtZC5oZWlnaHQoKS1kLnNjcm9sbFRvcCgpO2IudG9wPWU+MD9iLnRvcC1lOk1hdGgubWF4KGIudG9wLWMuY29sbGlzaW9uUG9zaXRpb24udG9wLGIudG9wKX19LGZsaXA6e2xlZnQ6ZnVuY3Rpb24oYixjKXtpZihjLmF0WzBdPT09ZSlyZXR1cm47dmFyIGQ9YSh3aW5kb3cpLGY9Yy5jb2xsaXNpb25Qb3NpdGlvbi5sZWZ0K2MuY29sbGlzaW9uV2lkdGgtZC53aWR0aCgpLWQuc2Nyb2xsTGVmdCgpLGc9Yy5teVswXT09PSJsZWZ0Ij8tYy5lbGVtV2lkdGg6Yy5teVswXT09PSJyaWdodCI/Yy5lbGVtV2lkdGg6MCxoPWMuYXRbMF09PT0ibGVmdCI/Yy50YXJnZXRXaWR0aDotYy50YXJnZXRXaWR0aCxpPS0yKmMub2Zmc2V0WzBdO2IubGVmdCs9Yy5jb2xsaXNpb25Qb3NpdGlvbi5sZWZ0PDA/ZytoK2k6Zj4wP2craCtpOjB9LHRvcDpmdW5jdGlvbihiLGMpe2lmKGMuYXRbMV09PT1lKXJldHVybjt2YXIgZD1hKHdpbmRvdyksZj1jLmNvbGxpc2lvblBvc2l0aW9uLnRvcCtjLmNvbGxpc2lvbkhlaWdodC1kLmhlaWdodCgpLWQuc2Nyb2xsVG9wKCksZz1jLm15WzFdPT09InRvcCI/LWMuZWxlbUhlaWdodDpjLm15WzFdPT09ImJvdHRvbSI/Yy5lbGVtSGVpZ2h0OjAsaD1jLmF0WzFdPT09InRvcCI/Yy50YXJnZXRIZWlnaHQ6LWMudGFyZ2V0SGVpZ2h0LGk9LTIqYy5vZmZzZXRbMV07Yi50b3ArPWMuY29sbGlzaW9uUG9zaXRpb24udG9wPDA/ZytoK2k6Zj4wP2craCtpOjB9fX0sYS5vZmZzZXQuc2V0T2Zmc2V0fHwoYS5vZmZzZXQuc2V0T2Zmc2V0PWZ1bmN0aW9uKGIsYyl7L3N0YXRpYy8udGVzdChhLmN1ckNTUyhiLCJwb3NpdGlvbiIpKSYmKGIuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIik7dmFyIGQ9YShiKSxlPWQub2Zmc2V0KCksZj1wYXJzZUludChhLmN1ckNTUyhiLCJ0b3AiLCEwKSwxMCl8fDAsZz1wYXJzZUludChhLmN1ckNTUyhiLCJsZWZ0IiwhMCksMTApfHwwLGg9e3RvcDpjLnRvcC1lLnRvcCtmLGxlZnQ6Yy5sZWZ0LWUubGVmdCtnfTsidXNpbmciaW4gYz9jLnVzaW5nLmNhbGwoYixoKTpkLmNzcyhoKX0sYS5mbi5vZmZzZXQ9ZnVuY3Rpb24oYil7dmFyIGM9dGhpc1swXTtyZXR1cm4hY3x8IWMub3duZXJEb2N1bWVudD9udWxsOmI/YS5pc0Z1bmN0aW9uKGIpP3RoaXMuZWFjaChmdW5jdGlvbihjKXthKHRoaXMpLm9mZnNldChiLmNhbGwodGhpcyxjLGEodGhpcykub2Zmc2V0KCkpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe2Eub2Zmc2V0LnNldE9mZnNldCh0aGlzLGIpfSk6aC5jYWxsKHRoaXMpfSksYS5jdXJDU1N8fChhLmN1ckNTUz1hLmNzcyksZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZCxlLGcsaCxpO2Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChiPyJkaXYiOiJib2R5IiksZz17dmlzaWJpbGl0eToiaGlkZGVuIix3aWR0aDowLGhlaWdodDowLGJvcmRlcjowLG1hcmdpbjowLGJhY2tncm91bmQ6Im5vbmUifSxiJiZhLmV4dGVuZChnLHtwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6Ii0xMDAwcHgiLHRvcDoiLTEwMDBweCJ9KTtmb3IodmFyIGogaW4gZylkLnN0eWxlW2pdPWdbal07ZC5hcHBlbmRDaGlsZChjKSxlPWJ8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxlLmluc2VydEJlZm9yZShkLGUuZmlyc3RDaGlsZCksYy5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IDEwLjc0MzIyMjJweDsgdG9wOiAxMC40MzIzMjVweDsgaGVpZ2h0OiAzMHB4OyB3aWR0aDogMjAxcHg7IixoPWEoYykub2Zmc2V0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGJ9KS5vZmZzZXQoKSxkLmlubmVySFRNTD0iIixlLnJlbW92ZUNoaWxkKGQpLGk9aC50b3AraC5sZWZ0KyhiPzJlMzowKSxmLmZyYWN0aW9ucz1pPjIxJiZpPDIyfSgpfShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7YS53aWRnZXQoInVpLnByb2dyZXNzYmFyIix7b3B0aW9uczp7dmFsdWU6MCxtYXg6MTAwfSxtaW46MCxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1wcm9ncmVzc2JhciB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCIpLmF0dHIoe3JvbGU6InByb2dyZXNzYmFyIiwiYXJpYS12YWx1ZW1pbiI6dGhpcy5taW4sImFyaWEtdmFsdWVtYXgiOnRoaXMub3B0aW9ucy5tYXgsImFyaWEtdmFsdWVub3ciOnRoaXMuX3ZhbHVlKCl9KSx0aGlzLnZhbHVlRGl2PWEoIjxkaXYgY2xhc3M9J3VpLXByb2dyZXNzYmFyLXZhbHVlIHVpLXdpZGdldC1oZWFkZXIgdWktY29ybmVyLWxlZnQnPjwvZGl2PiIpLmFwcGVuZFRvKHRoaXMuZWxlbWVudCksdGhpcy5vbGRWYWx1ZT10aGlzLl92YWx1ZSgpLHRoaXMuX3JlZnJlc2hWYWx1ZSgpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1wcm9ncmVzc2JhciB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCIpLnJlbW92ZUF0dHIoInJvbGUiKS5yZW1vdmVBdHRyKCJhcmlhLXZhbHVlbWluIikucmVtb3ZlQXR0cigiYXJpYS12YWx1ZW1heCIpLnJlbW92ZUF0dHIoImFyaWEtdmFsdWVub3ciKSx0aGlzLnZhbHVlRGl2LnJlbW92ZSgpLGEuV2lkZ2V0LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sdmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1iP3RoaXMuX3ZhbHVlKCk6KHRoaXMuX3NldE9wdGlvbigidmFsdWUiLGEpLHRoaXMpfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGIsYyl7Yj09PSJ2YWx1ZSImJih0aGlzLm9wdGlvbnMudmFsdWU9Yyx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl92YWx1ZSgpPT09dGhpcy5vcHRpb25zLm1heCYmdGhpcy5fdHJpZ2dlcigiY29tcGxldGUiKSksYS5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfdmFsdWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnMudmFsdWU7cmV0dXJuIHR5cGVvZiBhIT0ibnVtYmVyIiYmKGE9MCksTWF0aC5taW4odGhpcy5vcHRpb25zLm1heCxNYXRoLm1heCh0aGlzLm1pbixhKSl9LF9wZXJjZW50YWdlOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCp0aGlzLl92YWx1ZSgpL3RoaXMub3B0aW9ucy5tYXh9LF9yZWZyZXNoVmFsdWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZhbHVlKCksYj10aGlzLl9wZXJjZW50YWdlKCk7dGhpcy5vbGRWYWx1ZSE9PWEmJih0aGlzLm9sZFZhbHVlPWEsdGhpcy5fdHJpZ2dlcigiY2hhbmdlIikpLHRoaXMudmFsdWVEaXYudG9nZ2xlKGE+dGhpcy5taW4pLnRvZ2dsZUNsYXNzKCJ1aS1jb3JuZXItcmlnaHQiLGE9PT10aGlzLm9wdGlvbnMubWF4KS53aWR0aChiLnRvRml4ZWQoMCkrIiUiKSx0aGlzLmVsZW1lbnQuYXR0cigiYXJpYS12YWx1ZW5vdyIsYSl9fSksYS5leHRlbmQoYS51aS5wcm9ncmVzc2Jhcix7dmVyc2lvbjoiMS44LjI0In0pfShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7dmFyIGM9NTthLndpZGdldCgidWkuc2xpZGVyIixhLnVpLm1vdXNlLHt3aWRnZXRFdmVudFByZWZpeDoic2xpZGUiLG9wdGlvbnM6e2FuaW1hdGU6ITEsZGlzdGFuY2U6MCxtYXg6MTAwLG1pbjowLG9yaWVudGF0aW9uOiJob3Jpem9udGFsIixyYW5nZTohMSxzdGVwOjEsdmFsdWU6MCx2YWx1ZXM6bnVsbH0sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMsZD10aGlzLm9wdGlvbnMsZT10aGlzLmVsZW1lbnQuZmluZCgiLnVpLXNsaWRlci1oYW5kbGUiKS5hZGRDbGFzcygidWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIiksZj0iPGEgY2xhc3M9J3VpLXNsaWRlci1oYW5kbGUgdWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsJyBocmVmPScjJz48L2E+IixnPWQudmFsdWVzJiZkLnZhbHVlcy5sZW5ndGh8fDEsaD1bXTt0aGlzLl9rZXlTbGlkaW5nPSExLHRoaXMuX21vdXNlU2xpZGluZz0hMSx0aGlzLl9hbmltYXRlT2ZmPSEwLHRoaXMuX2hhbmRsZUluZGV4PW51bGwsdGhpcy5fZGV0ZWN0T3JpZW50YXRpb24oKSx0aGlzLl9tb3VzZUluaXQoKSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXNsaWRlciB1aS1zbGlkZXItIit0aGlzLm9yaWVudGF0aW9uKyIgdWktd2lkZ2V0IisiIHVpLXdpZGdldC1jb250ZW50IisiIHVpLWNvcm5lci1hbGwiKyhkLmRpc2FibGVkPyIgdWktc2xpZGVyLWRpc2FibGVkIHVpLWRpc2FibGVkIjoiIikpLHRoaXMucmFuZ2U9YShbXSksZC5yYW5nZSYmKGQucmFuZ2U9PT0hMCYmKGQudmFsdWVzfHwoZC52YWx1ZXM9W3RoaXMuX3ZhbHVlTWluKCksdGhpcy5fdmFsdWVNaW4oKV0pLGQudmFsdWVzLmxlbmd0aCYmZC52YWx1ZXMubGVuZ3RoIT09MiYmKGQudmFsdWVzPVtkLnZhbHVlc1swXSxkLnZhbHVlc1swXV0pKSx0aGlzLnJhbmdlPWEoIjxkaXY+PC9kaXY+IikuYXBwZW5kVG8odGhpcy5lbGVtZW50KS5hZGRDbGFzcygidWktc2xpZGVyLXJhbmdlIHVpLXdpZGdldC1oZWFkZXIiKyhkLnJhbmdlPT09Im1pbiJ8fGQucmFuZ2U9PT0ibWF4Ij8iIHVpLXNsaWRlci1yYW5nZS0iK2QucmFuZ2U6IiIpKSk7Zm9yKHZhciBpPWUubGVuZ3RoO2k8ZztpKz0xKWgucHVzaChmKTt0aGlzLmhhbmRsZXM9ZS5hZGQoYShoLmpvaW4oIiIpKS5hcHBlbmRUbyhiLmVsZW1lbnQpKSx0aGlzLmhhbmRsZT10aGlzLmhhbmRsZXMuZXEoMCksdGhpcy5oYW5kbGVzLmFkZCh0aGlzLnJhbmdlKS5maWx0ZXIoImEiKS5jbGljayhmdW5jdGlvbihhKXthLnByZXZlbnREZWZhdWx0KCl9KS5ob3ZlcihmdW5jdGlvbigpe2QuZGlzYWJsZWR8fGEodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWhvdmVyIil9LGZ1bmN0aW9uKCl7YSh0aGlzKS5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKX0pLmZvY3VzKGZ1bmN0aW9uKCl7ZC5kaXNhYmxlZD9hKHRoaXMpLmJsdXIoKTooYSgiLnVpLXNsaWRlciAudWktc3RhdGUtZm9jdXMiKS5yZW1vdmVDbGFzcygidWktc3RhdGUtZm9jdXMiKSxhKHRoaXMpLmFkZENsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpKX0pLmJsdXIoZnVuY3Rpb24oKXthKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpfSksdGhpcy5oYW5kbGVzLmVhY2goZnVuY3Rpb24oYil7YSh0aGlzKS5kYXRhKCJpbmRleC51aS1zbGlkZXItaGFuZGxlIixiKX0pLHRoaXMuaGFuZGxlcy5rZXlkb3duKGZ1bmN0aW9uKGQpe3ZhciBlPWEodGhpcykuZGF0YSgiaW5kZXgudWktc2xpZGVyLWhhbmRsZSIpLGYsZyxoLGk7aWYoYi5vcHRpb25zLmRpc2FibGVkKXJldHVybjtzd2l0Y2goZC5rZXlDb2RlKXtjYXNlIGEudWkua2V5Q29kZS5IT01FOmNhc2UgYS51aS5rZXlDb2RlLkVORDpjYXNlIGEudWkua2V5Q29kZS5QQUdFX1VQOmNhc2UgYS51aS5rZXlDb2RlLlBBR0VfRE9XTjpjYXNlIGEudWkua2V5Q29kZS5VUDpjYXNlIGEudWkua2V5Q29kZS5SSUdIVDpjYXNlIGEudWkua2V5Q29kZS5ET1dOOmNhc2UgYS51aS5rZXlDb2RlLkxFRlQ6ZC5wcmV2ZW50RGVmYXVsdCgpO2lmKCFiLl9rZXlTbGlkaW5nKXtiLl9rZXlTbGlkaW5nPSEwLGEodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLGY9Yi5fc3RhcnQoZCxlKTtpZihmPT09ITEpcmV0dXJufX1pPWIub3B0aW9ucy5zdGVwLGIub3B0aW9ucy52YWx1ZXMmJmIub3B0aW9ucy52YWx1ZXMubGVuZ3RoP2c9aD1iLnZhbHVlcyhlKTpnPWg9Yi52YWx1ZSgpO3N3aXRjaChkLmtleUNvZGUpe2Nhc2UgYS51aS5rZXlDb2RlLkhPTUU6aD1iLl92YWx1ZU1pbigpO2JyZWFrO2Nhc2UgYS51aS5rZXlDb2RlLkVORDpoPWIuX3ZhbHVlTWF4KCk7YnJlYWs7Y2FzZSBhLnVpLmtleUNvZGUuUEFHRV9VUDpoPWIuX3RyaW1BbGlnblZhbHVlKGcrKGIuX3ZhbHVlTWF4KCktYi5fdmFsdWVNaW4oKSkvYyk7YnJlYWs7Y2FzZSBhLnVpLmtleUNvZGUuUEFHRV9ET1dOOmg9Yi5fdHJpbUFsaWduVmFsdWUoZy0oYi5fdmFsdWVNYXgoKS1iLl92YWx1ZU1pbigpKS9jKTticmVhaztjYXNlIGEudWkua2V5Q29kZS5VUDpjYXNlIGEudWkua2V5Q29kZS5SSUdIVDppZihnPT09Yi5fdmFsdWVNYXgoKSlyZXR1cm47aD1iLl90cmltQWxpZ25WYWx1ZShnK2kpO2JyZWFrO2Nhc2UgYS51aS5rZXlDb2RlLkRPV046Y2FzZSBhLnVpLmtleUNvZGUuTEVGVDppZihnPT09Yi5fdmFsdWVNaW4oKSlyZXR1cm47aD1iLl90cmltQWxpZ25WYWx1ZShnLWkpfWIuX3NsaWRlKGQsZSxoKX0pLmtleXVwKGZ1bmN0aW9uKGMpe3ZhciBkPWEodGhpcykuZGF0YSgiaW5kZXgudWktc2xpZGVyLWhhbmRsZSIpO2IuX2tleVNsaWRpbmcmJihiLl9rZXlTbGlkaW5nPSExLGIuX3N0b3AoYyxkKSxiLl9jaGFuZ2UoYyxkKSxhKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSl9KSx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl9hbmltYXRlT2ZmPSExfSxkZXN0cm95OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGFuZGxlcy5yZW1vdmUoKSx0aGlzLnJhbmdlLnJlbW92ZSgpLHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2xpZGVyIHVpLXNsaWRlci1ob3Jpem9udGFsIHVpLXNsaWRlci12ZXJ0aWNhbCB1aS1zbGlkZXItZGlzYWJsZWQgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwiKS5yZW1vdmVEYXRhKCJzbGlkZXIiKS51bmJpbmQoIi5zbGlkZXIiKSx0aGlzLl9tb3VzZURlc3Ryb3koKSx0aGlzfSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMub3B0aW9ucyxkLGUsZixnLGgsaSxqLGssbDtyZXR1cm4gYy5kaXNhYmxlZD8hMToodGhpcy5lbGVtZW50U2l6ZT17d2lkdGg6dGhpcy5lbGVtZW50Lm91dGVyV2lkdGgoKSxoZWlnaHQ6dGhpcy5lbGVtZW50Lm91dGVySGVpZ2h0KCl9LHRoaXMuZWxlbWVudE9mZnNldD10aGlzLmVsZW1lbnQub2Zmc2V0KCksZD17eDpiLnBhZ2VYLHk6Yi5wYWdlWX0sZT10aGlzLl9ub3JtVmFsdWVGcm9tTW91c2UoZCksZj10aGlzLl92YWx1ZU1heCgpLXRoaXMuX3ZhbHVlTWluKCkrMSxoPXRoaXMsdGhpcy5oYW5kbGVzLmVhY2goZnVuY3Rpb24oYil7dmFyIGM9TWF0aC5hYnMoZS1oLnZhbHVlcyhiKSk7Zj5jJiYoZj1jLGc9YSh0aGlzKSxpPWIpfSksYy5yYW5nZT09PSEwJiZ0aGlzLnZhbHVlcygxKT09PWMubWluJiYoaSs9MSxnPWEodGhpcy5oYW5kbGVzW2ldKSksaj10aGlzLl9zdGFydChiLGkpLGo9PT0hMT8hMToodGhpcy5fbW91c2VTbGlkaW5nPSEwLGguX2hhbmRsZUluZGV4PWksZy5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIikuZm9jdXMoKSxrPWcub2Zmc2V0KCksbD0hYShiLnRhcmdldCkucGFyZW50cygpLmFuZFNlbGYoKS5pcygiLnVpLXNsaWRlci1oYW5kbGUiKSx0aGlzLl9jbGlja09mZnNldD1sP3tsZWZ0OjAsdG9wOjB9OntsZWZ0OmIucGFnZVgtay5sZWZ0LWcud2lkdGgoKS8yLHRvcDpiLnBhZ2VZLWsudG9wLWcuaGVpZ2h0KCkvMi0ocGFyc2VJbnQoZy5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQoZy5jc3MoImJvcmRlckJvdHRvbVdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoZy5jc3MoIm1hcmdpblRvcCIpLDEwKXx8MCl9LHRoaXMuaGFuZGxlcy5oYXNDbGFzcygidWktc3RhdGUtaG92ZXIiKXx8dGhpcy5fc2xpZGUoYixpLGUpLHRoaXMuX2FuaW1hdGVPZmY9ITAsITApKX0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oYSl7cmV0dXJuITB9LF9tb3VzZURyYWc6ZnVuY3Rpb24oYSl7dmFyIGI9e3g6YS5wYWdlWCx5OmEucGFnZVl9LGM9dGhpcy5fbm9ybVZhbHVlRnJvbU1vdXNlKGIpO3JldHVybiB0aGlzLl9zbGlkZShhLHRoaXMuX2hhbmRsZUluZGV4LGMpLCExfSxfbW91c2VTdG9wOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmhhbmRsZXMucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLHRoaXMuX21vdXNlU2xpZGluZz0hMSx0aGlzLl9zdG9wKGEsdGhpcy5faGFuZGxlSW5kZXgpLHRoaXMuX2NoYW5nZShhLHRoaXMuX2hhbmRsZUluZGV4KSx0aGlzLl9oYW5kbGVJbmRleD1udWxsLHRoaXMuX2NsaWNrT2Zmc2V0PW51bGwsdGhpcy5fYW5pbWF0ZU9mZj0hMSwhMX0sX2RldGVjdE9yaWVudGF0aW9uOmZ1bmN0aW9uKCl7dGhpcy5vcmllbnRhdGlvbj10aGlzLm9wdGlvbnMub3JpZW50YXRpb249PT0idmVydGljYWwiPyJ2ZXJ0aWNhbCI6Imhvcml6b250YWwifSxfbm9ybVZhbHVlRnJvbU1vdXNlOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGY7cmV0dXJuIHRoaXMub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCI/KGI9dGhpcy5lbGVtZW50U2l6ZS53aWR0aCxjPWEueC10aGlzLmVsZW1lbnRPZmZzZXQubGVmdC0odGhpcy5fY2xpY2tPZmZzZXQ/dGhpcy5fY2xpY2tPZmZzZXQubGVmdDowKSk6KGI9dGhpcy5lbGVtZW50U2l6ZS5oZWlnaHQsYz1hLnktdGhpcy5lbGVtZW50T2Zmc2V0LnRvcC0odGhpcy5fY2xpY2tPZmZzZXQ/dGhpcy5fY2xpY2tPZmZzZXQudG9wOjApKSxkPWMvYixkPjEmJihkPTEpLGQ8MCYmKGQ9MCksdGhpcy5vcmllbnRhdGlvbj09PSJ2ZXJ0aWNhbCImJihkPTEtZCksZT10aGlzLl92YWx1ZU1heCgpLXRoaXMuX3ZhbHVlTWluKCksZj10aGlzLl92YWx1ZU1pbigpK2QqZSx0aGlzLl90cmltQWxpZ25WYWx1ZShmKX0sX3N0YXJ0OmZ1bmN0aW9uKGEsYil7dmFyIGM9e2hhbmRsZTp0aGlzLmhhbmRsZXNbYl0sdmFsdWU6dGhpcy52YWx1ZSgpfTtyZXR1cm4gdGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGgmJihjLnZhbHVlPXRoaXMudmFsdWVzKGIpLGMudmFsdWVzPXRoaXMudmFsdWVzKCkpLHRoaXMuX3RyaWdnZXIoInN0YXJ0IixhLGMpfSxfc2xpZGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZjt0aGlzLm9wdGlvbnMudmFsdWVzJiZ0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aD8oZD10aGlzLnZhbHVlcyhiPzA6MSksdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGg9PT0yJiZ0aGlzLm9wdGlvbnMucmFuZ2U9PT0hMCYmKGI9PT0wJiZjPmR8fGI9PT0xJiZjPGQpJiYoYz1kKSxjIT09dGhpcy52YWx1ZXMoYikmJihlPXRoaXMudmFsdWVzKCksZVtiXT1jLGY9dGhpcy5fdHJpZ2dlcigic2xpZGUiLGEse2hhbmRsZTp0aGlzLmhhbmRsZXNbYl0sdmFsdWU6Yyx2YWx1ZXM6ZX0pLGQ9dGhpcy52YWx1ZXMoYj8wOjEpLGYhPT0hMSYmdGhpcy52YWx1ZXMoYixjLCEwKSkpOmMhPT10aGlzLnZhbHVlKCkmJihmPXRoaXMuX3RyaWdnZXIoInNsaWRlIixhLHtoYW5kbGU6dGhpcy5oYW5kbGVzW2JdLHZhbHVlOmN9KSxmIT09ITEmJnRoaXMudmFsdWUoYykpfSxfc3RvcDpmdW5jdGlvbihhLGIpe3ZhciBjPXtoYW5kbGU6dGhpcy5oYW5kbGVzW2JdLHZhbHVlOnRoaXMudmFsdWUoKX07dGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGgmJihjLnZhbHVlPXRoaXMudmFsdWVzKGIpLGMudmFsdWVzPXRoaXMudmFsdWVzKCkpLHRoaXMuX3RyaWdnZXIoInN0b3AiLGEsYyl9LF9jaGFuZ2U6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5fa2V5U2xpZGluZyYmIXRoaXMuX21vdXNlU2xpZGluZyl7dmFyIGM9e2hhbmRsZTp0aGlzLmhhbmRsZXNbYl0sdmFsdWU6dGhpcy52YWx1ZSgpfTt0aGlzLm9wdGlvbnMudmFsdWVzJiZ0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aCYmKGMudmFsdWU9dGhpcy52YWx1ZXMoYiksYy52YWx1ZXM9dGhpcy52YWx1ZXMoKSksdGhpcy5fdHJpZ2dlcigiY2hhbmdlIixhLGMpfX0sdmFsdWU6ZnVuY3Rpb24oYSl7aWYoYXJndW1lbnRzLmxlbmd0aCl7dGhpcy5vcHRpb25zLnZhbHVlPXRoaXMuX3RyaW1BbGlnblZhbHVlKGEpLHRoaXMuX3JlZnJlc2hWYWx1ZSgpLHRoaXMuX2NoYW5nZShudWxsLDApO3JldHVybn1yZXR1cm4gdGhpcy5fdmFsdWUoKX0sdmFsdWVzOmZ1bmN0aW9uKGIsYyl7dmFyIGQsZSxmO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSl7dGhpcy5vcHRpb25zLnZhbHVlc1tiXT10aGlzLl90cmltQWxpZ25WYWx1ZShjKSx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl9jaGFuZ2UobnVsbCxiKTtyZXR1cm59aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuX3ZhbHVlcygpO2lmKCFhLmlzQXJyYXkoYXJndW1lbnRzWzBdKSlyZXR1cm4gdGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGg/dGhpcy5fdmFsdWVzKGIpOnRoaXMudmFsdWUoKTtkPXRoaXMub3B0aW9ucy52YWx1ZXMsZT1hcmd1bWVudHNbMF07Zm9yKGY9MDtmPGQubGVuZ3RoO2YrPTEpZFtmXT10aGlzLl90cmltQWxpZ25WYWx1ZShlW2ZdKSx0aGlzLl9jaGFuZ2UobnVsbCxmKTt0aGlzLl9yZWZyZXNoVmFsdWUoKX0sX3NldE9wdGlvbjpmdW5jdGlvbihiLGMpe3ZhciBkLGU9MDthLmlzQXJyYXkodGhpcy5vcHRpb25zLnZhbHVlcykmJihlPXRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoKSxhLldpZGdldC5wcm90b3R5cGUuX3NldE9wdGlvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7c3dpdGNoKGIpe2Nhc2UiZGlzYWJsZWQiOmM/KHRoaXMuaGFuZGxlcy5maWx0ZXIoIi51aS1zdGF0ZS1mb2N1cyIpLmJsdXIoKSx0aGlzLmhhbmRsZXMucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIiksdGhpcy5oYW5kbGVzLnByb3BBdHRyKCJkaXNhYmxlZCIsITApLHRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktZGlzYWJsZWQiKSk6KHRoaXMuaGFuZGxlcy5wcm9wQXR0cigiZGlzYWJsZWQiLCExKSx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLWRpc2FibGVkIikpO2JyZWFrO2Nhc2Uib3JpZW50YXRpb24iOnRoaXMuX2RldGVjdE9yaWVudGF0aW9uKCksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zbGlkZXItaG9yaXpvbnRhbCB1aS1zbGlkZXItdmVydGljYWwiKS5hZGRDbGFzcygidWktc2xpZGVyLSIrdGhpcy5vcmllbnRhdGlvbiksdGhpcy5fcmVmcmVzaFZhbHVlKCk7YnJlYWs7Y2FzZSJ2YWx1ZSI6dGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl9jaGFuZ2UobnVsbCwwKSx0aGlzLl9hbmltYXRlT2ZmPSExO2JyZWFrO2Nhc2UidmFsdWVzIjp0aGlzLl9hbmltYXRlT2ZmPSEwLHRoaXMuX3JlZnJlc2hWYWx1ZSgpO2ZvcihkPTA7ZDxlO2QrPTEpdGhpcy5fY2hhbmdlKG51bGwsZCk7dGhpcy5fYW5pbWF0ZU9mZj0hMX19LF92YWx1ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucy52YWx1ZTtyZXR1cm4gYT10aGlzLl90cmltQWxpZ25WYWx1ZShhKSxhfSxfdmFsdWVzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZDtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBiPXRoaXMub3B0aW9ucy52YWx1ZXNbYV0sYj10aGlzLl90cmltQWxpZ25WYWx1ZShiKSxiO2M9dGhpcy5vcHRpb25zLnZhbHVlcy5zbGljZSgpO2ZvcihkPTA7ZDxjLmxlbmd0aDtkKz0xKWNbZF09dGhpcy5fdHJpbUFsaWduVmFsdWUoY1tkXSk7cmV0dXJuIGN9LF90cmltQWxpZ25WYWx1ZTpmdW5jdGlvbihhKXtpZihhPD10aGlzLl92YWx1ZU1pbigpKXJldHVybiB0aGlzLl92YWx1ZU1pbigpO2lmKGE+PXRoaXMuX3ZhbHVlTWF4KCkpcmV0dXJuIHRoaXMuX3ZhbHVlTWF4KCk7dmFyIGI9dGhpcy5vcHRpb25zLnN0ZXA+MD90aGlzLm9wdGlvbnMuc3RlcDoxLGM9KGEtdGhpcy5fdmFsdWVNaW4oKSklYixkPWEtYztyZXR1cm4gTWF0aC5hYnMoYykqMj49YiYmKGQrPWM+MD9iOi1iKSxwYXJzZUZsb2F0KGQudG9GaXhlZCg1KSl9LF92YWx1ZU1pbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMubWlufSxfdmFsdWVNYXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLm1heH0sX3JlZnJlc2hWYWx1ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3B0aW9ucy5yYW5nZSxjPXRoaXMub3B0aW9ucyxkPXRoaXMsZT10aGlzLl9hbmltYXRlT2ZmPyExOmMuYW5pbWF0ZSxmLGc9e30saCxpLGosazt0aGlzLm9wdGlvbnMudmFsdWVzJiZ0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aD90aGlzLmhhbmRsZXMuZWFjaChmdW5jdGlvbihiLGkpe2Y9KGQudmFsdWVzKGIpLWQuX3ZhbHVlTWluKCkpLyhkLl92YWx1ZU1heCgpLWQuX3ZhbHVlTWluKCkpKjEwMCxnW2Qub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCI/ImxlZnQiOiJib3R0b20iXT1mKyIlIixhKHRoaXMpLnN0b3AoMSwxKVtlPyJhbmltYXRlIjoiY3NzIl0oZyxjLmFuaW1hdGUpLGQub3B0aW9ucy5yYW5nZT09PSEwJiYoZC5vcmllbnRhdGlvbj09PSJob3Jpem9udGFsIj8oYj09PTAmJmQucmFuZ2Uuc3RvcCgxLDEpW2U/ImFuaW1hdGUiOiJjc3MiXSh7bGVmdDpmKyIlIn0sYy5hbmltYXRlKSxiPT09MSYmZC5yYW5nZVtlPyJhbmltYXRlIjoiY3NzIl0oe3dpZHRoOmYtaCsiJSJ9LHtxdWV1ZTohMSxkdXJhdGlvbjpjLmFuaW1hdGV9KSk6KGI9PT0wJiZkLnJhbmdlLnN0b3AoMSwxKVtlPyJhbmltYXRlIjoiY3NzIl0oe2JvdHRvbTpmKyIlIn0sYy5hbmltYXRlKSxiPT09MSYmZC5yYW5nZVtlPyJhbmltYXRlIjoiY3NzIl0oe2hlaWdodDpmLWgrIiUifSx7cXVldWU6ITEsZHVyYXRpb246Yy5hbmltYXRlfSkpKSxoPWZ9KTooaT10aGlzLnZhbHVlKCksaj10aGlzLl92YWx1ZU1pbigpLGs9dGhpcy5fdmFsdWVNYXgoKSxmPWshPT1qPyhpLWopLyhrLWopKjEwMDowLGdbZC5vcmllbnRhdGlvbj09PSJob3Jpem9udGFsIj8ibGVmdCI6ImJvdHRvbSJdPWYrIiUiLHRoaXMuaGFuZGxlLnN0b3AoMSwxKVtlPyJhbmltYXRlIjoiY3NzIl0oZyxjLmFuaW1hdGUpLGI9PT0ibWluIiYmdGhpcy5vcmllbnRhdGlvbj09PSJob3Jpem9udGFsIiYmdGhpcy5yYW5nZS5zdG9wKDEsMSlbZT8iYW5pbWF0ZSI6ImNzcyJdKHt3aWR0aDpmKyIlIn0sYy5hbmltYXRlKSxiPT09Im1heCImJnRoaXMub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCImJnRoaXMucmFuZ2VbZT8iYW5pbWF0ZSI6ImNzcyJdKHt3aWR0aDoxMDAtZisiJSJ9LHtxdWV1ZTohMSxkdXJhdGlvbjpjLmFuaW1hdGV9KSxiPT09Im1pbiImJnRoaXMub3JpZW50YXRpb249PT0idmVydGljYWwiJiZ0aGlzLnJhbmdlLnN0b3AoMSwxKVtlPyJhbmltYXRlIjoiY3NzIl0oe2hlaWdodDpmKyIlIn0sYy5hbmltYXRlKSxiPT09Im1heCImJnRoaXMub3JpZW50YXRpb249PT0idmVydGljYWwiJiZ0aGlzLnJhbmdlW2U/ImFuaW1hdGUiOiJjc3MiXSh7aGVpZ2h0OjEwMC1mKyIlIn0se3F1ZXVlOiExLGR1cmF0aW9uOmMuYW5pbWF0ZX0pKX19KSxhLmV4dGVuZChhLnVpLnNsaWRlcix7dmVyc2lvbjoiMS44LjI0In0pfShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gZSgpe3JldHVybisrY31mdW5jdGlvbiBmKCl7cmV0dXJuKytkfXZhciBjPTAsZD0wO2Eud2lkZ2V0KCJ1aS50YWJzIix7b3B0aW9uczp7YWRkOm51bGwsYWpheE9wdGlvbnM6bnVsbCxjYWNoZTohMSxjb29raWU6bnVsbCxjb2xsYXBzaWJsZTohMSxkaXNhYmxlOm51bGwsZGlzYWJsZWQ6W10sZW5hYmxlOm51bGwsZXZlbnQ6ImNsaWNrIixmeDpudWxsLGlkUHJlZml4OiJ1aS10YWJzLSIsbG9hZDpudWxsLHBhbmVsVGVtcGxhdGU6IjxkaXY+PC9kaXY+IixyZW1vdmU6bnVsbCxzZWxlY3Q6bnVsbCxzaG93Om51bGwsc3Bpbm5lcjoiPGVtPkxvYWRpbmcmIzgyMzA7PC9lbT4iLHRhYlRlbXBsYXRlOiI8bGk+PGEgaHJlZj0nI3tocmVmfSc+PHNwYW4+I3tsYWJlbH08L3NwYW4+PC9hPjwvbGk+In0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuX3RhYmlmeSghMCl9LF9zZXRPcHRpb246ZnVuY3Rpb24oYSxiKXtpZihhPT0ic2VsZWN0ZWQiKXtpZih0aGlzLm9wdGlvbnMuY29sbGFwc2libGUmJmI9PXRoaXMub3B0aW9ucy5zZWxlY3RlZClyZXR1cm47dGhpcy5zZWxlY3QoYil9ZWxzZSB0aGlzLm9wdGlvbnNbYV09Yix0aGlzLl90YWJpZnkoKX0sX3RhYklkOmZ1bmN0aW9uKGEpe3JldHVybiBhLnRpdGxlJiZhLnRpdGxlLnJlcGxhY2UoL1xzL2csIl8iKS5yZXBsYWNlKC9bXlx3XHUwMGMwLVx1RkZGRi1dL2csIiIpfHx0aGlzLm9wdGlvbnMuaWRQcmVmaXgrZSgpfSxfc2FuaXRpemVTZWxlY3RvcjpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKC86L2csIlxcOiIpfSxfY29va2llOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5jb29raWV8fCh0aGlzLmNvb2tpZT10aGlzLm9wdGlvbnMuY29va2llLm5hbWV8fCJ1aS10YWJzLSIrZigpKTtyZXR1cm4gYS5jb29raWUuYXBwbHkobnVsbCxbYl0uY29uY2F0KGEubWFrZUFycmF5KGFyZ3VtZW50cykpKX0sX3VpOmZ1bmN0aW9uKGEsYil7cmV0dXJue3RhYjphLHBhbmVsOmIsaW5kZXg6dGhpcy5hbmNob3JzLmluZGV4KGEpfX0sX2NsZWFudXA6ZnVuY3Rpb24oKXt0aGlzLmxpcy5maWx0ZXIoIi51aS1zdGF0ZS1wcm9jZXNzaW5nIikucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLXByb2Nlc3NpbmciKS5maW5kKCJzcGFuOmRhdGEobGFiZWwudGFicykiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9YSh0aGlzKTtiLmh0bWwoYi5kYXRhKCJsYWJlbC50YWJzIikpLnJlbW92ZURhdGEoImxhYmVsLnRhYnMiKX0pfSxfdGFiaWZ5OmZ1bmN0aW9uKGMpe2Z1bmN0aW9uIG0oYixjKXtiLmNzcygiZGlzcGxheSIsIiIpLCFhLnN1cHBvcnQub3BhY2l0eSYmYy5vcGFjaXR5JiZiWzBdLnN0eWxlLnJlbW92ZUF0dHJpYnV0ZSgiZmlsdGVyIil9dmFyIGQ9dGhpcyxlPXRoaXMub3B0aW9ucyxmPS9eIy4rLzt0aGlzLmxpc3Q9dGhpcy5lbGVtZW50LmZpbmQoIm9sLHVsIikuZXEoMCksdGhpcy5saXM9YSgiID4gbGk6aGFzKGFbaHJlZl0pIix0aGlzLmxpc3QpLHRoaXMuYW5jaG9ycz10aGlzLmxpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gYSgiYSIsdGhpcylbMF19KSx0aGlzLnBhbmVscz1hKFtdKSx0aGlzLmFuY2hvcnMuZWFjaChmdW5jdGlvbihiLGMpe3ZhciBnPWEoYykuYXR0cigiaHJlZiIpLGg9Zy5zcGxpdCgiIyIpWzBdLGk7aCYmKGg9PT1sb2NhdGlvbi50b1N0cmluZygpLnNwbGl0KCIjIilbMF18fChpPWEoImJhc2UiKVswXSkmJmg9PT1pLmhyZWYpJiYoZz1jLmhhc2gsYy5ocmVmPWcpO2lmKGYudGVzdChnKSlkLnBhbmVscz1kLnBhbmVscy5hZGQoZC5lbGVtZW50LmZpbmQoZC5fc2FuaXRpemVTZWxlY3RvcihnKSkpO2Vsc2UgaWYoZyYmZyE9PSIjIil7YS5kYXRhKGMsImhyZWYudGFicyIsZyksYS5kYXRhKGMsImxvYWQudGFicyIsZy5yZXBsYWNlKC8jLiokLywiIikpO3ZhciBqPWQuX3RhYklkKGMpO2MuaHJlZj0iIyIrajt2YXIgaz1kLmVsZW1lbnQuZmluZCgiIyIraik7ay5sZW5ndGh8fChrPWEoZS5wYW5lbFRlbXBsYXRlKS5hdHRyKCJpZCIsaikuYWRkQ2xhc3MoInVpLXRhYnMtcGFuZWwgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSIpLmluc2VydEFmdGVyKGQucGFuZWxzW2ItMV18fGQubGlzdCksay5kYXRhKCJkZXN0cm95LnRhYnMiLCEwKSksZC5wYW5lbHM9ZC5wYW5lbHMuYWRkKGspfWVsc2UgZS5kaXNhYmxlZC5wdXNoKGIpfSksYz8odGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS10YWJzIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIiksdGhpcy5saXN0LmFkZENsYXNzKCJ1aS10YWJzLW5hdiB1aS1oZWxwZXItcmVzZXQgdWktaGVscGVyLWNsZWFyZml4IHVpLXdpZGdldC1oZWFkZXIgdWktY29ybmVyLWFsbCIpLHRoaXMubGlzLmFkZENsYXNzKCJ1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci10b3AiKSx0aGlzLnBhbmVscy5hZGRDbGFzcygidWktdGFicy1wYW5lbCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYm90dG9tIiksZS5zZWxlY3RlZD09PWI/KGxvY2F0aW9uLmhhc2gmJnRoaXMuYW5jaG9ycy5lYWNoKGZ1bmN0aW9uKGEsYil7aWYoYi5oYXNoPT1sb2NhdGlvbi5oYXNoKXJldHVybiBlLnNlbGVjdGVkPWEsITF9KSx0eXBlb2YgZS5zZWxlY3RlZCE9Im51bWJlciImJmUuY29va2llJiYoZS5zZWxlY3RlZD1wYXJzZUludChkLl9jb29raWUoKSwxMCkpLHR5cGVvZiBlLnNlbGVjdGVkIT0ibnVtYmVyIiYmdGhpcy5saXMuZmlsdGVyKCIudWktdGFicy1zZWxlY3RlZCIpLmxlbmd0aCYmKGUuc2VsZWN0ZWQ9dGhpcy5saXMuaW5kZXgodGhpcy5saXMuZmlsdGVyKCIudWktdGFicy1zZWxlY3RlZCIpKSksZS5zZWxlY3RlZD1lLnNlbGVjdGVkfHwodGhpcy5saXMubGVuZ3RoPzA6LTEpKTplLnNlbGVjdGVkPT09bnVsbCYmKGUuc2VsZWN0ZWQ9LTEpLGUuc2VsZWN0ZWQ9ZS5zZWxlY3RlZD49MCYmdGhpcy5hbmNob3JzW2Uuc2VsZWN0ZWRdfHxlLnNlbGVjdGVkPDA/ZS5zZWxlY3RlZDowLGUuZGlzYWJsZWQ9YS51bmlxdWUoZS5kaXNhYmxlZC5jb25jYXQoYS5tYXAodGhpcy5saXMuZmlsdGVyKCIudWktc3RhdGUtZGlzYWJsZWQiKSxmdW5jdGlvbihhLGIpe3JldHVybiBkLmxpcy5pbmRleChhKX0pKSkuc29ydCgpLGEuaW5BcnJheShlLnNlbGVjdGVkLGUuZGlzYWJsZWQpIT0tMSYmZS5kaXNhYmxlZC5zcGxpY2UoYS5pbkFycmF5KGUuc2VsZWN0ZWQsZS5kaXNhYmxlZCksMSksdGhpcy5wYW5lbHMuYWRkQ2xhc3MoInVpLXRhYnMtaGlkZSIpLHRoaXMubGlzLnJlbW92ZUNsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSIpLGUuc2VsZWN0ZWQ+PTAmJnRoaXMuYW5jaG9ycy5sZW5ndGgmJihkLmVsZW1lbnQuZmluZChkLl9zYW5pdGl6ZVNlbGVjdG9yKGQuYW5jaG9yc1tlLnNlbGVjdGVkXS5oYXNoKSkucmVtb3ZlQ2xhc3MoInVpLXRhYnMtaGlkZSIpLHRoaXMubGlzLmVxKGUuc2VsZWN0ZWQpLmFkZENsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSIpLGQuZWxlbWVudC5xdWV1ZSgidGFicyIsZnVuY3Rpb24oKXtkLl90cmlnZ2VyKCJzaG93IixudWxsLGQuX3VpKGQuYW5jaG9yc1tlLnNlbGVjdGVkXSxkLmVsZW1lbnQuZmluZChkLl9zYW5pdGl6ZVNlbGVjdG9yKGQuYW5jaG9yc1tlLnNlbGVjdGVkXS5oYXNoKSlbMF0pKX0pLHRoaXMubG9hZChlLnNlbGVjdGVkKSksYSh3aW5kb3cpLmJpbmQoInVubG9hZCIsZnVuY3Rpb24oKXtkLmxpcy5hZGQoZC5hbmNob3JzKS51bmJpbmQoIi50YWJzIiksZC5saXM9ZC5hbmNob3JzPWQucGFuZWxzPW51bGx9KSk6ZS5zZWxlY3RlZD10aGlzLmxpcy5pbmRleCh0aGlzLmxpcy5maWx0ZXIoIi51aS10YWJzLXNlbGVjdGVkIikpLHRoaXMuZWxlbWVudFtlLmNvbGxhcHNpYmxlPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oInVpLXRhYnMtY29sbGFwc2libGUiKSxlLmNvb2tpZSYmdGhpcy5fY29va2llKGUuc2VsZWN0ZWQsZS5jb29raWUpO2Zvcih2YXIgZz0wLGg7aD10aGlzLmxpc1tnXTtnKyspYShoKVthLmluQXJyYXkoZyxlLmRpc2FibGVkKSE9LTEmJiFhKGgpLmhhc0NsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIik/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXSgidWktc3RhdGUtZGlzYWJsZWQiKTtlLmNhY2hlPT09ITEmJnRoaXMuYW5jaG9ycy5yZW1vdmVEYXRhKCJjYWNoZS50YWJzIiksdGhpcy5saXMuYWRkKHRoaXMuYW5jaG9ycykudW5iaW5kKCIudGFicyIpO2lmKGUuZXZlbnQhPT0ibW91c2VvdmVyIil7dmFyIGk9ZnVuY3Rpb24oYSxiKXtiLmlzKCI6bm90KC51aS1zdGF0ZS1kaXNhYmxlZCkiKSYmYi5hZGRDbGFzcygidWktc3RhdGUtIithKX0saj1mdW5jdGlvbihhLGIpe2IucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLSIrYSl9O3RoaXMubGlzLmJpbmQoIm1vdXNlb3Zlci50YWJzIixmdW5jdGlvbigpe2koImhvdmVyIixhKHRoaXMpKX0pLHRoaXMubGlzLmJpbmQoIm1vdXNlb3V0LnRhYnMiLGZ1bmN0aW9uKCl7aigiaG92ZXIiLGEodGhpcykpfSksdGhpcy5hbmNob3JzLmJpbmQoImZvY3VzLnRhYnMiLGZ1bmN0aW9uKCl7aSgiZm9jdXMiLGEodGhpcykuY2xvc2VzdCgibGkiKSl9KSx0aGlzLmFuY2hvcnMuYmluZCgiYmx1ci50YWJzIixmdW5jdGlvbigpe2ooImZvY3VzIixhKHRoaXMpLmNsb3Nlc3QoImxpIikpfSl9dmFyIGssbDtlLmZ4JiYoYS5pc0FycmF5KGUuZngpPyhrPWUuZnhbMF0sbD1lLmZ4WzFdKTprPWw9ZS5meCk7dmFyIG49bD9mdW5jdGlvbihiLGMpe2EoYikuY2xvc2VzdCgibGkiKS5hZGRDbGFzcygidWktdGFicy1zZWxlY3RlZCB1aS1zdGF0ZS1hY3RpdmUiKSxjLmhpZGUoKS5yZW1vdmVDbGFzcygidWktdGFicy1oaWRlIikuYW5pbWF0ZShsLGwuZHVyYXRpb258fCJub3JtYWwiLGZ1bmN0aW9uKCl7bShjLGwpLGQuX3RyaWdnZXIoInNob3ciLG51bGwsZC5fdWkoYixjWzBdKSl9KX06ZnVuY3Rpb24oYixjKXthKGIpLmNsb3Nlc3QoImxpIikuYWRkQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQgdWktc3RhdGUtYWN0aXZlIiksYy5yZW1vdmVDbGFzcygidWktdGFicy1oaWRlIiksZC5fdHJpZ2dlcigic2hvdyIsbnVsbCxkLl91aShiLGNbMF0pKX0sbz1rP2Z1bmN0aW9uKGEsYil7Yi5hbmltYXRlKGssay5kdXJhdGlvbnx8Im5vcm1hbCIsZnVuY3Rpb24oKXtkLmxpcy5yZW1vdmVDbGFzcygidWktdGFicy1zZWxlY3RlZCB1aS1zdGF0ZS1hY3RpdmUiKSxiLmFkZENsYXNzKCJ1aS10YWJzLWhpZGUiKSxtKGIsayksZC5lbGVtZW50LmRlcXVldWUoInRhYnMiKX0pfTpmdW5jdGlvbihhLGIsYyl7ZC5saXMucmVtb3ZlQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQgdWktc3RhdGUtYWN0aXZlIiksYi5hZGRDbGFzcygidWktdGFicy1oaWRlIiksZC5lbGVtZW50LmRlcXVldWUoInRhYnMiKX07dGhpcy5hbmNob3JzLmJpbmQoZS5ldmVudCsiLnRhYnMiLGZ1bmN0aW9uKCl7dmFyIGI9dGhpcyxjPWEoYikuY2xvc2VzdCgibGkiKSxmPWQucGFuZWxzLmZpbHRlcigiOm5vdCgudWktdGFicy1oaWRlKSIpLGc9ZC5lbGVtZW50LmZpbmQoZC5fc2FuaXRpemVTZWxlY3RvcihiLmhhc2gpKTtpZihjLmhhc0NsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIikmJiFlLmNvbGxhcHNpYmxlfHxjLmhhc0NsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpfHxjLmhhc0NsYXNzKCJ1aS1zdGF0ZS1wcm9jZXNzaW5nIil8fGQucGFuZWxzLmZpbHRlcigiOmFuaW1hdGVkIikubGVuZ3RofHxkLl90cmlnZ2VyKCJzZWxlY3QiLG51bGwsZC5fdWkodGhpcyxnWzBdKSk9PT0hMSlyZXR1cm4gdGhpcy5ibHVyKCksITE7ZS5zZWxlY3RlZD1kLmFuY2hvcnMuaW5kZXgodGhpcyksZC5hYm9ydCgpO2lmKGUuY29sbGFwc2libGUpe2lmKGMuaGFzQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQiKSlyZXR1cm4gZS5zZWxlY3RlZD0tMSxlLmNvb2tpZSYmZC5fY29va2llKGUuc2VsZWN0ZWQsZS5jb29raWUpLGQuZWxlbWVudC5xdWV1ZSgidGFicyIsZnVuY3Rpb24oKXtvKGIsZil9KS5kZXF1ZXVlKCJ0YWJzIiksdGhpcy5ibHVyKCksITE7aWYoIWYubGVuZ3RoKXJldHVybiBlLmNvb2tpZSYmZC5fY29va2llKGUuc2VsZWN0ZWQsZS5jb29raWUpLGQuZWxlbWVudC5xdWV1ZSgidGFicyIsZnVuY3Rpb24oKXtuKGIsZyl9KSxkLmxvYWQoZC5hbmNob3JzLmluZGV4KHRoaXMpKSx0aGlzLmJsdXIoKSwhMX1lLmNvb2tpZSYmZC5fY29va2llKGUuc2VsZWN0ZWQsZS5jb29raWUpO2lmKGcubGVuZ3RoKWYubGVuZ3RoJiZkLmVsZW1lbnQucXVldWUoInRhYnMiLGZ1bmN0aW9uKCl7byhiLGYpfSksZC5lbGVtZW50LnF1ZXVlKCJ0YWJzIixmdW5jdGlvbigpe24oYixnKX0pLGQubG9hZChkLmFuY2hvcnMuaW5kZXgodGhpcykpO2Vsc2UgdGhyb3cialF1ZXJ5IFVJIFRhYnM6IE1pc21hdGNoaW5nIGZyYWdtZW50IGlkZW50aWZpZXIuIjthLmJyb3dzZXIubXNpZSYmdGhpcy5ibHVyKCl9KSx0aGlzLmFuY2hvcnMuYmluZCgiY2xpY2sudGFicyIsZnVuY3Rpb24oKXtyZXR1cm4hMX0pfSxfZ2V0SW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhPT0ic3RyaW5nIiYmKGE9dGhpcy5hbmNob3JzLmluZGV4KHRoaXMuYW5jaG9ycy5maWx0ZXIoIltocmVmJD0nIithKyInXSIpKSksYX0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3B0aW9ucztyZXR1cm4gdGhpcy5hYm9ydCgpLHRoaXMuZWxlbWVudC51bmJpbmQoIi50YWJzIikucmVtb3ZlQ2xhc3MoInVpLXRhYnMgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwgdWktdGFicy1jb2xsYXBzaWJsZSIpLnJlbW92ZURhdGEoInRhYnMiKSx0aGlzLmxpc3QucmVtb3ZlQ2xhc3MoInVpLXRhYnMtbmF2IHVpLWhlbHBlci1yZXNldCB1aS1oZWxwZXItY2xlYXJmaXggdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItYWxsIiksdGhpcy5hbmNob3JzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1hLmRhdGEodGhpcywiaHJlZi50YWJzIik7YiYmKHRoaXMuaHJlZj1iKTt2YXIgYz1hKHRoaXMpLnVuYmluZCgiLnRhYnMiKTthLmVhY2goWyJocmVmIiwibG9hZCIsImNhY2hlIl0sZnVuY3Rpb24oYSxiKXtjLnJlbW92ZURhdGEoYisiLnRhYnMiKX0pfSksdGhpcy5saXMudW5iaW5kKCIudGFicyIpLmFkZCh0aGlzLnBhbmVscykuZWFjaChmdW5jdGlvbigpe2EuZGF0YSh0aGlzLCJkZXN0cm95LnRhYnMiKT9hKHRoaXMpLnJlbW92ZSgpOmEodGhpcykucmVtb3ZlQ2xhc3MoWyJ1aS1zdGF0ZS1kZWZhdWx0IiwidWktY29ybmVyLXRvcCIsInVpLXRhYnMtc2VsZWN0ZWQiLCJ1aS1zdGF0ZS1hY3RpdmUiLCJ1aS1zdGF0ZS1ob3ZlciIsInVpLXN0YXRlLWZvY3VzIiwidWktc3RhdGUtZGlzYWJsZWQiLCJ1aS10YWJzLXBhbmVsIiwidWktd2lkZ2V0LWNvbnRlbnQiLCJ1aS1jb3JuZXItYm90dG9tIiwidWktdGFicy1oaWRlIl0uam9pbigiICIpKX0pLGIuY29va2llJiZ0aGlzLl9jb29raWUobnVsbCxiLmNvb2tpZSksdGhpc30sYWRkOmZ1bmN0aW9uKGMsZCxlKXtlPT09YiYmKGU9dGhpcy5hbmNob3JzLmxlbmd0aCk7dmFyIGY9dGhpcyxnPXRoaXMub3B0aW9ucyxoPWEoZy50YWJUZW1wbGF0ZS5yZXBsYWNlKC8jXHtocmVmXH0vZyxjKS5yZXBsYWNlKC8jXHtsYWJlbFx9L2csZCkpLGk9Yy5pbmRleE9mKCIjIik/dGhpcy5fdGFiSWQoYSgiYSIsaClbMF0pOmMucmVwbGFjZSgiIyIsIiIpO2guYWRkQ2xhc3MoInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLXRvcCIpLmRhdGEoImRlc3Ryb3kudGFicyIsITApO3ZhciBqPWYuZWxlbWVudC5maW5kKCIjIitpKTtyZXR1cm4gai5sZW5ndGh8fChqPWEoZy5wYW5lbFRlbXBsYXRlKS5hdHRyKCJpZCIsaSkuZGF0YSgiZGVzdHJveS50YWJzIiwhMCkpLGouYWRkQ2xhc3MoInVpLXRhYnMtcGFuZWwgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSB1aS10YWJzLWhpZGUiKSxlPj10aGlzLmxpcy5sZW5ndGg/KGguYXBwZW5kVG8odGhpcy5saXN0KSxqLmFwcGVuZFRvKHRoaXMubGlzdFswXS5wYXJlbnROb2RlKSk6KGguaW5zZXJ0QmVmb3JlKHRoaXMubGlzW2VdKSxqLmluc2VydEJlZm9yZSh0aGlzLnBhbmVsc1tlXSkpLGcuZGlzYWJsZWQ9YS5tYXAoZy5kaXNhYmxlZCxmdW5jdGlvbihhLGIpe3JldHVybiBhPj1lPysrYTphfSksdGhpcy5fdGFiaWZ5KCksdGhpcy5hbmNob3JzLmxlbmd0aD09MSYmKGcuc2VsZWN0ZWQ9MCxoLmFkZENsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSIpLGoucmVtb3ZlQ2xhc3MoInVpLXRhYnMtaGlkZSIpLHRoaXMuZWxlbWVudC5xdWV1ZSgidGFicyIsZnVuY3Rpb24oKXtmLl90cmlnZ2VyKCJzaG93IixudWxsLGYuX3VpKGYuYW5jaG9yc1swXSxmLnBhbmVsc1swXSkpfSksdGhpcy5sb2FkKDApKSx0aGlzLl90cmlnZ2VyKCJhZGQiLG51bGwsdGhpcy5fdWkodGhpcy5hbmNob3JzW2VdLHRoaXMucGFuZWxzW2VdKSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKGIpe2I9dGhpcy5fZ2V0SW5kZXgoYik7dmFyIGM9dGhpcy5vcHRpb25zLGQ9dGhpcy5saXMuZXEoYikucmVtb3ZlKCksZT10aGlzLnBhbmVscy5lcShiKS5yZW1vdmUoKTtyZXR1cm4gZC5oYXNDbGFzcygidWktdGFicy1zZWxlY3RlZCIpJiZ0aGlzLmFuY2hvcnMubGVuZ3RoPjEmJnRoaXMuc2VsZWN0KGIrKGIrMTx0aGlzLmFuY2hvcnMubGVuZ3RoPzE6LTEpKSxjLmRpc2FibGVkPWEubWFwKGEuZ3JlcChjLmRpc2FibGVkLGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEhPWJ9KSxmdW5jdGlvbihhLGMpe3JldHVybiBhPj1iPy0tYTphfSksdGhpcy5fdGFiaWZ5KCksdGhpcy5fdHJpZ2dlcigicmVtb3ZlIixudWxsLHRoaXMuX3VpKGQuZmluZCgiYSIpWzBdLGVbMF0pKSx0aGlzfSxlbmFibGU6ZnVuY3Rpb24oYil7Yj10aGlzLl9nZXRJbmRleChiKTt2YXIgYz10aGlzLm9wdGlvbnM7aWYoYS5pbkFycmF5KGIsYy5kaXNhYmxlZCk9PS0xKXJldHVybjtyZXR1cm4gdGhpcy5saXMuZXEoYikucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIiksYy5kaXNhYmxlZD1hLmdyZXAoYy5kaXNhYmxlZCxmdW5jdGlvbihhLGMpe3JldHVybiBhIT1ifSksdGhpcy5fdHJpZ2dlcigiZW5hYmxlIixudWxsLHRoaXMuX3VpKHRoaXMuYW5jaG9yc1tiXSx0aGlzLnBhbmVsc1tiXSkpLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oYSl7YT10aGlzLl9nZXRJbmRleChhKTt2YXIgYj10aGlzLGM9dGhpcy5vcHRpb25zO3JldHVybiBhIT1jLnNlbGVjdGVkJiYodGhpcy5saXMuZXEoYSkuYWRkQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIiksYy5kaXNhYmxlZC5wdXNoKGEpLGMuZGlzYWJsZWQuc29ydCgpLHRoaXMuX3RyaWdnZXIoImRpc2FibGUiLG51bGwsdGhpcy5fdWkodGhpcy5hbmNob3JzW2FdLHRoaXMucGFuZWxzW2FdKSkpLHRoaXN9LHNlbGVjdDpmdW5jdGlvbihhKXthPXRoaXMuX2dldEluZGV4KGEpO2lmKGE9PS0xKWlmKHRoaXMub3B0aW9ucy5jb2xsYXBzaWJsZSYmdGhpcy5vcHRpb25zLnNlbGVjdGVkIT0tMSlhPXRoaXMub3B0aW9ucy5zZWxlY3RlZDtlbHNlIHJldHVybiB0aGlzO3JldHVybiB0aGlzLmFuY2hvcnMuZXEoYSkudHJpZ2dlcih0aGlzLm9wdGlvbnMuZXZlbnQrIi50YWJzIiksdGhpc30sbG9hZDpmdW5jdGlvbihiKXtiPXRoaXMuX2dldEluZGV4KGIpO3ZhciBjPXRoaXMsZD10aGlzLm9wdGlvbnMsZT10aGlzLmFuY2hvcnMuZXEoYilbMF0sZj1hLmRhdGEoZSwibG9hZC50YWJzIik7dGhpcy5hYm9ydCgpO2lmKCFmfHx0aGlzLmVsZW1lbnQucXVldWUoInRhYnMiKS5sZW5ndGghPT0wJiZhLmRhdGEoZSwiY2FjaGUudGFicyIpKXt0aGlzLmVsZW1lbnQuZGVxdWV1ZSgidGFicyIpO3JldHVybn10aGlzLmxpcy5lcShiKS5hZGRDbGFzcygidWktc3RhdGUtcHJvY2Vzc2luZyIpO2lmKGQuc3Bpbm5lcil7dmFyIGc9YSgic3BhbiIsZSk7Zy5kYXRhKCJsYWJlbC50YWJzIixnLmh0bWwoKSkuaHRtbChkLnNwaW5uZXIpfXJldHVybiB0aGlzLnhocj1hLmFqYXgoYS5leHRlbmQoe30sZC5hamF4T3B0aW9ucyx7dXJsOmYsc3VjY2VzczpmdW5jdGlvbihmLGcpe2MuZWxlbWVudC5maW5kKGMuX3Nhbml0aXplU2VsZWN0b3IoZS5oYXNoKSkuaHRtbChmKSxjLl9jbGVhbnVwKCksZC5jYWNoZSYmYS5kYXRhKGUsImNhY2hlLnRhYnMiLCEwKSxjLl90cmlnZ2VyKCJsb2FkIixudWxsLGMuX3VpKGMuYW5jaG9yc1tiXSxjLnBhbmVsc1tiXSkpO3RyeXtkLmFqYXhPcHRpb25zLnN1Y2Nlc3MoZixnKX1jYXRjaChoKXt9fSxlcnJvcjpmdW5jdGlvbihhLGYsZyl7Yy5fY2xlYW51cCgpLGMuX3RyaWdnZXIoImxvYWQiLG51bGwsYy5fdWkoYy5hbmNob3JzW2JdLGMucGFuZWxzW2JdKSk7dHJ5e2QuYWpheE9wdGlvbnMuZXJyb3IoYSxmLGIsZSl9Y2F0Y2goZyl7fX19KSksYy5lbGVtZW50LmRlcXVldWUoInRhYnMiKSx0aGlzfSxhYm9ydDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnQucXVldWUoW10pLHRoaXMucGFuZWxzLnN0b3AoITEsITApLHRoaXMuZWxlbWVudC5xdWV1ZSgidGFicyIsdGhpcy5lbGVtZW50LnF1ZXVlKCJ0YWJzIikuc3BsaWNlKC0yLDIpKSx0aGlzLnhociYmKHRoaXMueGhyLmFib3J0KCksZGVsZXRlIHRoaXMueGhyKSx0aGlzLl9jbGVhbnVwKCksdGhpc30sdXJsOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYW5jaG9ycy5lcShhKS5yZW1vdmVEYXRhKCJjYWNoZS50YWJzIikuZGF0YSgibG9hZC50YWJzIixiKSx0aGlzfSxsZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hbmNob3JzLmxlbmd0aH19KSxhLmV4dGVuZChhLnVpLnRhYnMse3ZlcnNpb246IjEuOC4yNCJ9KSxhLmV4dGVuZChhLnVpLnRhYnMucHJvdG90eXBlLHtyb3RhdGlvbjpudWxsLHJvdGF0ZTpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMsZD10aGlzLm9wdGlvbnMsZT1jLl9yb3RhdGV8fChjLl9yb3RhdGU9ZnVuY3Rpb24oYil7Y2xlYXJUaW1lb3V0KGMucm90YXRpb24pLGMucm90YXRpb249c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPWQuc2VsZWN0ZWQ7Yy5zZWxlY3QoKythPGMuYW5jaG9ycy5sZW5ndGg/YTowKX0sYSksYiYmYi5zdG9wUHJvcGFnYXRpb24oKX0pLGY9Yy5fdW5yb3RhdGV8fChjLl91bnJvdGF0ZT1iP2Z1bmN0aW9uKGEpe2UoKX06ZnVuY3Rpb24oYSl7YS5jbGllbnRYJiZjLnJvdGF0ZShudWxsKX0pO3JldHVybiBhPyh0aGlzLmVsZW1lbnQuYmluZCgidGFic3Nob3ciLGUpLHRoaXMuYW5jaG9ycy5iaW5kKGQuZXZlbnQrIi50YWJzIixmKSxlKCkpOihjbGVhclRpbWVvdXQoYy5yb3RhdGlvbiksdGhpcy5lbGVtZW50LnVuYmluZCgidGFic3Nob3ciLGUpLHRoaXMuYW5jaG9ycy51bmJpbmQoZC5ldmVudCsiLnRhYnMiLGYpLGRlbGV0ZSB0aGlzLl9yb3RhdGUsZGVsZXRlIHRoaXMuX3Vucm90YXRlKSx0aGlzfX0pfShqUXVlcnkpOwoK"></script>
	<script id= "script_sl_jquery_easing_js" src="data:/text/plain;base64,LyoKICogalF1ZXJ5IEVhc2luZyB2MS4zIC0gaHR0cDovL2dzZ2QuY28udWsvc2FuZGJveC9qcXVlcnkvZWFzaW5nLwogKgogKiBVc2VzIHRoZSBidWlsdCBpbiBlYXNpbmcgY2FwYWJpbGl0aWVzIGFkZGVkIEluIGpRdWVyeSAxLjEKICogdG8gb2ZmZXIgbXVsdGlwbGUgZWFzaW5nIG9wdGlvbnMKICoKICogVEVSTVMgT0YgVVNFIC0galF1ZXJ5IEVhc2luZwogKiAKICogT3BlbiBzb3VyY2UgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLiAKICogCiAqIENvcHlyaWdodCDCqSAyMDA4IEdlb3JnZSBNY0dpbmxleSBTbWl0aAogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiAKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCiAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKICogCiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIAogKiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IAogKiBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAKICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKiAKICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgYXV0aG9yIG5vciB0aGUgbmFtZXMgb2YgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UgCiAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqIAogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSAKICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQogKiAgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAogKiAgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCiAqICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgCiAqIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCiAqICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCAKICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKICoKKi8KCi8vIHQ6IGN1cnJlbnQgdGltZSwgYjogYmVnSW5uSW5nIHZhbHVlLCBjOiBjaGFuZ2UgSW4gdmFsdWUsIGQ6IGR1cmF0aW9uCmpRdWVyeS5lYXNpbmdbJ2pzd2luZyddID0galF1ZXJ5LmVhc2luZ1snc3dpbmcnXTsKCmpRdWVyeS5leHRlbmQoIGpRdWVyeS5lYXNpbmcsCnsKCWRlZjogJ2Vhc2VPdXRRdWFkJywKCXN3aW5nOiBmdW5jdGlvbiAoeCwgdCwgYiwgYywgZCkgewoJCS8vYWxlcnQoalF1ZXJ5LmVhc2luZy5kZWZhdWx0KTsKCQlyZXR1cm4galF1ZXJ5LmVhc2luZ1tqUXVlcnkuZWFzaW5nLmRlZl0oeCwgdCwgYiwgYywgZCk7Cgl9LAoJZWFzZUluUXVhZDogZnVuY3Rpb24gKHgsIHQsIGIsIGMsIGQpIHsKCQlyZXR1cm4gYyoodC89ZCkqdCArIGI7Cgl9LAoJZWFzZU91dFF1YWQ6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJcmV0dXJuIC1jICoodC89ZCkqKHQtMikgKyBiOwoJfSwKCWVhc2VJbk91dFF1YWQ6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJaWYgKCh0Lz1kLzIpIDwgMSkgcmV0dXJuIGMvMip0KnQgKyBiOwoJCXJldHVybiAtYy8yICogKCgtLXQpKih0LTIpIC0gMSkgKyBiOwoJfSwKCWVhc2VJbkN1YmljOiBmdW5jdGlvbiAoeCwgdCwgYiwgYywgZCkgewoJCXJldHVybiBjKih0Lz1kKSp0KnQgKyBiOwoJfSwKCWVhc2VPdXRDdWJpYzogZnVuY3Rpb24gKHgsIHQsIGIsIGMsIGQpIHsKCQlyZXR1cm4gYyooKHQ9dC9kLTEpKnQqdCArIDEpICsgYjsKCX0sCgllYXNlSW5PdXRDdWJpYzogZnVuY3Rpb24gKHgsIHQsIGIsIGMsIGQpIHsKCQlpZiAoKHQvPWQvMikgPCAxKSByZXR1cm4gYy8yKnQqdCp0ICsgYjsKCQlyZXR1cm4gYy8yKigodC09MikqdCp0ICsgMikgKyBiOwoJfSwKCWVhc2VJblF1YXJ0OiBmdW5jdGlvbiAoeCwgdCwgYiwgYywgZCkgewoJCXJldHVybiBjKih0Lz1kKSp0KnQqdCArIGI7Cgl9LAoJZWFzZU91dFF1YXJ0OiBmdW5jdGlvbiAoeCwgdCwgYiwgYywgZCkgewoJCXJldHVybiAtYyAqICgodD10L2QtMSkqdCp0KnQgLSAxKSArIGI7Cgl9LAoJZWFzZUluT3V0UXVhcnQ6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJaWYgKCh0Lz1kLzIpIDwgMSkgcmV0dXJuIGMvMip0KnQqdCp0ICsgYjsKCQlyZXR1cm4gLWMvMiAqICgodC09MikqdCp0KnQgLSAyKSArIGI7Cgl9LAoJZWFzZUluUXVpbnQ6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJcmV0dXJuIGMqKHQvPWQpKnQqdCp0KnQgKyBiOwoJfSwKCWVhc2VPdXRRdWludDogZnVuY3Rpb24gKHgsIHQsIGIsIGMsIGQpIHsKCQlyZXR1cm4gYyooKHQ9dC9kLTEpKnQqdCp0KnQgKyAxKSArIGI7Cgl9LAoJZWFzZUluT3V0UXVpbnQ6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJaWYgKCh0Lz1kLzIpIDwgMSkgcmV0dXJuIGMvMip0KnQqdCp0KnQgKyBiOwoJCXJldHVybiBjLzIqKCh0LT0yKSp0KnQqdCp0ICsgMikgKyBiOwoJfSwKCWVhc2VJblNpbmU6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJcmV0dXJuIC1jICogTWF0aC5jb3ModC9kICogKE1hdGguUEkvMikpICsgYyArIGI7Cgl9LAoJZWFzZU91dFNpbmU6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJcmV0dXJuIGMgKiBNYXRoLnNpbih0L2QgKiAoTWF0aC5QSS8yKSkgKyBiOwoJfSwKCWVhc2VJbk91dFNpbmU6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJcmV0dXJuIC1jLzIgKiAoTWF0aC5jb3MoTWF0aC5QSSp0L2QpIC0gMSkgKyBiOwoJfSwKCWVhc2VJbkV4cG86IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJcmV0dXJuICh0PT0wKSA/IGIgOiBjICogTWF0aC5wb3coMiwgMTAgKiAodC9kIC0gMSkpICsgYjsKCX0sCgllYXNlT3V0RXhwbzogZnVuY3Rpb24gKHgsIHQsIGIsIGMsIGQpIHsKCQlyZXR1cm4gKHQ9PWQpID8gYitjIDogYyAqICgtTWF0aC5wb3coMiwgLTEwICogdC9kKSArIDEpICsgYjsKCX0sCgllYXNlSW5PdXRFeHBvOiBmdW5jdGlvbiAoeCwgdCwgYiwgYywgZCkgewoJCWlmICh0PT0wKSByZXR1cm4gYjsKCQlpZiAodD09ZCkgcmV0dXJuIGIrYzsKCQlpZiAoKHQvPWQvMikgPCAxKSByZXR1cm4gYy8yICogTWF0aC5wb3coMiwgMTAgKiAodCAtIDEpKSArIGI7CgkJcmV0dXJuIGMvMiAqICgtTWF0aC5wb3coMiwgLTEwICogLS10KSArIDIpICsgYjsKCX0sCgllYXNlSW5DaXJjOiBmdW5jdGlvbiAoeCwgdCwgYiwgYywgZCkgewoJCXJldHVybiAtYyAqIChNYXRoLnNxcnQoMSAtICh0Lz1kKSp0KSAtIDEpICsgYjsKCX0sCgllYXNlT3V0Q2lyYzogZnVuY3Rpb24gKHgsIHQsIGIsIGMsIGQpIHsKCQlyZXR1cm4gYyAqIE1hdGguc3FydCgxIC0gKHQ9dC9kLTEpKnQpICsgYjsKCX0sCgllYXNlSW5PdXRDaXJjOiBmdW5jdGlvbiAoeCwgdCwgYiwgYywgZCkgewoJCWlmICgodC89ZC8yKSA8IDEpIHJldHVybiAtYy8yICogKE1hdGguc3FydCgxIC0gdCp0KSAtIDEpICsgYjsKCQlyZXR1cm4gYy8yICogKE1hdGguc3FydCgxIC0gKHQtPTIpKnQpICsgMSkgKyBiOwoJfSwKCWVhc2VJbkVsYXN0aWM6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJdmFyIHM9MS43MDE1ODt2YXIgcD0wO3ZhciBhPWM7CgkJaWYgKHQ9PTApIHJldHVybiBiOyAgaWYgKCh0Lz1kKT09MSkgcmV0dXJuIGIrYzsgIGlmICghcCkgcD1kKi4zOwoJCWlmIChhIDwgTWF0aC5hYnMoYykpIHsgYT1jOyB2YXIgcz1wLzQ7IH0KCQllbHNlIHZhciBzID0gcC8oMipNYXRoLlBJKSAqIE1hdGguYXNpbiAoYy9hKTsKCQlyZXR1cm4gLShhKk1hdGgucG93KDIsMTAqKHQtPTEpKSAqIE1hdGguc2luKCAodCpkLXMpKigyKk1hdGguUEkpL3AgKSkgKyBiOwoJfSwKCWVhc2VPdXRFbGFzdGljOiBmdW5jdGlvbiAoeCwgdCwgYiwgYywgZCkgewoJCXZhciBzPTEuNzAxNTg7dmFyIHA9MDt2YXIgYT1jOwoJCWlmICh0PT0wKSByZXR1cm4gYjsgIGlmICgodC89ZCk9PTEpIHJldHVybiBiK2M7ICBpZiAoIXApIHA9ZCouMzsKCQlpZiAoYSA8IE1hdGguYWJzKGMpKSB7IGE9YzsgdmFyIHM9cC80OyB9CgkJZWxzZSB2YXIgcyA9IHAvKDIqTWF0aC5QSSkgKiBNYXRoLmFzaW4gKGMvYSk7CgkJcmV0dXJuIGEqTWF0aC5wb3coMiwtMTAqdCkgKiBNYXRoLnNpbiggKHQqZC1zKSooMipNYXRoLlBJKS9wICkgKyBjICsgYjsKCX0sCgllYXNlSW5PdXRFbGFzdGljOiBmdW5jdGlvbiAoeCwgdCwgYiwgYywgZCkgewoJCXZhciBzPTEuNzAxNTg7dmFyIHA9MDt2YXIgYT1jOwoJCWlmICh0PT0wKSByZXR1cm4gYjsgIGlmICgodC89ZC8yKT09MikgcmV0dXJuIGIrYzsgIGlmICghcCkgcD1kKiguMyoxLjUpOwoJCWlmIChhIDwgTWF0aC5hYnMoYykpIHsgYT1jOyB2YXIgcz1wLzQ7IH0KCQllbHNlIHZhciBzID0gcC8oMipNYXRoLlBJKSAqIE1hdGguYXNpbiAoYy9hKTsKCQlpZiAodCA8IDEpIHJldHVybiAtLjUqKGEqTWF0aC5wb3coMiwxMCoodC09MSkpICogTWF0aC5zaW4oICh0KmQtcykqKDIqTWF0aC5QSSkvcCApKSArIGI7CgkJcmV0dXJuIGEqTWF0aC5wb3coMiwtMTAqKHQtPTEpKSAqIE1hdGguc2luKCAodCpkLXMpKigyKk1hdGguUEkpL3AgKSouNSArIGMgKyBiOwoJfSwKCWVhc2VJbkJhY2s6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkLCBzKSB7CgkJaWYgKHMgPT0gdW5kZWZpbmVkKSBzID0gMS43MDE1ODsKCQlyZXR1cm4gYyoodC89ZCkqdCooKHMrMSkqdCAtIHMpICsgYjsKCX0sCgllYXNlT3V0QmFjazogZnVuY3Rpb24gKHgsIHQsIGIsIGMsIGQsIHMpIHsKCQlpZiAocyA9PSB1bmRlZmluZWQpIHMgPSAxLjcwMTU4OwoJCXJldHVybiBjKigodD10L2QtMSkqdCooKHMrMSkqdCArIHMpICsgMSkgKyBiOwoJfSwKCWVhc2VJbk91dEJhY2s6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkLCBzKSB7CgkJaWYgKHMgPT0gdW5kZWZpbmVkKSBzID0gMS43MDE1ODsgCgkJaWYgKCh0Lz1kLzIpIDwgMSkgcmV0dXJuIGMvMioodCp0KigoKHMqPSgxLjUyNSkpKzEpKnQgLSBzKSkgKyBiOwoJCXJldHVybiBjLzIqKCh0LT0yKSp0KigoKHMqPSgxLjUyNSkpKzEpKnQgKyBzKSArIDIpICsgYjsKCX0sCgllYXNlSW5Cb3VuY2U6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJcmV0dXJuIGMgLSBqUXVlcnkuZWFzaW5nLmVhc2VPdXRCb3VuY2UgKHgsIGQtdCwgMCwgYywgZCkgKyBiOwoJfSwKCWVhc2VPdXRCb3VuY2U6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJaWYgKCh0Lz1kKSA8ICgxLzIuNzUpKSB7CgkJCXJldHVybiBjKig3LjU2MjUqdCp0KSArIGI7CgkJfSBlbHNlIGlmICh0IDwgKDIvMi43NSkpIHsKCQkJcmV0dXJuIGMqKDcuNTYyNSoodC09KDEuNS8yLjc1KSkqdCArIC43NSkgKyBiOwoJCX0gZWxzZSBpZiAodCA8ICgyLjUvMi43NSkpIHsKCQkJcmV0dXJuIGMqKDcuNTYyNSoodC09KDIuMjUvMi43NSkpKnQgKyAuOTM3NSkgKyBiOwoJCX0gZWxzZSB7CgkJCXJldHVybiBjKig3LjU2MjUqKHQtPSgyLjYyNS8yLjc1KSkqdCArIC45ODQzNzUpICsgYjsKCQl9Cgl9LAoJZWFzZUluT3V0Qm91bmNlOiBmdW5jdGlvbiAoeCwgdCwgYiwgYywgZCkgewoJCWlmICh0IDwgZC8yKSByZXR1cm4galF1ZXJ5LmVhc2luZy5lYXNlSW5Cb3VuY2UgKHgsIHQqMiwgMCwgYywgZCkgKiAuNSArIGI7CgkJcmV0dXJuIGpRdWVyeS5lYXNpbmcuZWFzZU91dEJvdW5jZSAoeCwgdCoyLWQsIDAsIGMsIGQpICogLjUgKyBjKi41ICsgYjsKCX0KfSk7CgovKgogKgogKiBURVJNUyBPRiBVU0UgLSBFQVNJTkcgRVFVQVRJT05TCiAqIAogKiBPcGVuIHNvdXJjZSB1bmRlciB0aGUgQlNEIExpY2Vuc2UuIAogKiAKICogQ29weXJpZ2h0IMKpIDIwMDEgUm9iZXJ0IFBlbm5lcgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiAKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCiAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKICogCiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIAogKiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IAogKiBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAKICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKiAKICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgYXV0aG9yIG5vciB0aGUgbmFtZXMgb2YgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UgCiAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqIAogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSAKICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQogKiAgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAogKiAgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCiAqICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgCiAqIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCiAqICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCAKICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKICoKICov"></script>
	<script id= "script_sl_jquery_mousewheel_js" src="data:/text/plain;base64,LyogQ29weXJpZ2h0IChjKSAyMDA5IEJyYW5kb24gQWFyb24gKGh0dHA6Ly9icmFuZG9uYWFyb24ubmV0KQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwKQogKiBhbmQgR1BMIChodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLnBocCkgbGljZW5zZXMuCiAqIFRoYW5rcyB0bzogaHR0cDovL2Fkb21hcy5vcmcvamF2YXNjcmlwdC1tb3VzZS13aGVlbC8gZm9yIHNvbWUgcG9pbnRlcnMuCiAqIFRoYW5rcyB0bzogTWF0aGlhcyBCYW5rKGh0dHA6Ly93d3cubWF0aGlhcy1iYW5rLmRlKSBmb3IgYSBzY29wZSBidWcgZml4LgogKgogKiBWZXJzaW9uOiAzLjAuMgogKiAKICogUmVxdWlyZXM6IDEuMi4yKwogKi8KKGZ1bmN0aW9uKGMpe3ZhciBhPVsiRE9NTW91c2VTY3JvbGwiLCJtb3VzZXdoZWVsIl07Yy5ldmVudC5zcGVjaWFsLm1vdXNld2hlZWw9e3NldHVwOmZ1bmN0aW9uKCl7aWYodGhpcy5hZGRFdmVudExpc3RlbmVyKXtmb3IodmFyIGQ9YS5sZW5ndGg7ZDspe3RoaXMuYWRkRXZlbnRMaXN0ZW5lcihhWy0tZF0sYixmYWxzZSl9fWVsc2V7dGhpcy5vbm1vdXNld2hlZWw9Yn19LHRlYXJkb3duOmZ1bmN0aW9uKCl7aWYodGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKXtmb3IodmFyIGQ9YS5sZW5ndGg7ZDspe3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihhWy0tZF0sYixmYWxzZSl9fWVsc2V7dGhpcy5vbm1vdXNld2hlZWw9bnVsbH19fTtjLmZuLmV4dGVuZCh7bW91c2V3aGVlbDpmdW5jdGlvbihkKXtyZXR1cm4gZD90aGlzLmJpbmQoIm1vdXNld2hlZWwiLGQpOnRoaXMudHJpZ2dlcigibW91c2V3aGVlbCIpfSx1bm1vdXNld2hlZWw6ZnVuY3Rpb24oZCl7cmV0dXJuIHRoaXMudW5iaW5kKCJtb3VzZXdoZWVsIixkKX19KTtmdW5jdGlvbiBiKGYpe3ZhciBkPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLGc9MCxlPXRydWU7Zj1jLmV2ZW50LmZpeChmfHx3aW5kb3cuZXZlbnQpO2YudHlwZT0ibW91c2V3aGVlbCI7aWYoZi53aGVlbERlbHRhKXtnPWYud2hlZWxEZWx0YS8xMjB9aWYoZi5kZXRhaWwpe2c9LWYuZGV0YWlsLzN9ZC51bnNoaWZ0KGYsZyk7cmV0dXJuIGMuZXZlbnQuaGFuZGxlLmFwcGx5KHRoaXMsZCl9fSkoalF1ZXJ5KTs=" ></script>
	</head>

<body>
<div id="outer_container">
<div id="customScrollBox">
	<div class="container">
    	<div class="content">
        	<h1>side<span class="lightgrey">ways</span> <br /><span class="light"><span class="grey"><span class="s36">index_sl.html 201800604_1600 slides</span></span></span></h1>
<!--
            <p>A simple, yet elegant fullscreen image gallery created with the jQuery framework and some simple CSS. <a href="http://manos.malihu.gr/sideways-jquery-fullscreen-image-gallery" target="_blank">Full post and download files.</a></p>
	-->


            <div id="toolbar"></div><div class="clear"></div>
		<div id="div_sl_links">

            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_lucernarium.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_lucernarium.jpg" title="Supremus Lucernarium" alt="Supremus Lucernarium" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_denebola.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_denebola.jpg" title="Denebola" alt="Denebola" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_lux.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_lux.jpg" title="Lux Aeterna" alt="Lux Aeterna" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_dk.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_dk.jpg" title="X-Wing on patrol" alt="X-Wing on patrol" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_albireo.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_albireo.jpg" title="Albireo Outpost" alt="Albireo Outpost" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_church.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_church.jpg" title="Church of Heaven" alt="Church of Heaven" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_Decampment.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_Decampment.jpg" title="Decampment" alt="Decampment" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_Hibernaculum.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_Hibernaculum.jpg" title="Hibernaculum" alt="Hibernaculum" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_moons.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_moons.jpg" title="Aurea Mediocritas" alt="Aurea Mediocritas" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_praedestinatio.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_praedestinatio.jpg" title="Praedestinatio" alt="Praedestinatio" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_transitorius.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_transitorius.jpg" title="Transitorius" alt="Transitorius" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_victimofgravity.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_victimofgravity.jpg" title="Victim of Gravity" alt="Victim of Gravity" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_lucernarium.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_lucernarium.jpg" title="Supremus Lucernarium" alt="Supremus Lucernarium" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_denebola.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_denebola.jpg" title="Denebola" alt="Denebola" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_lux.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_lux.jpg" title="Lux Aeterna" alt="Lux Aeterna" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_dk.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_dk.jpg" title="X-Wing on patrol" alt="X-Wing on patrol" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_albireo.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_albireo.jpg" title="Albireo Outpost" alt="Albireo Outpost" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_church.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_church.jpg" title="Church of Heaven" alt="Church of Heaven" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_Decampment.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_Decampment.jpg" title="Decampment" alt="Decampment" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_Hibernaculum.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_Hibernaculum.jpg" title="Hibernaculum" alt="Hibernaculum" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_moons.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_moons.jpg" title="Aurea Mediocritas" alt="Aurea Mediocritas" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_praedestinatio.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_praedestinatio.jpg" title="Praedestinatio" alt="Praedestinatio" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_transitorius.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_transitorius.jpg" title="Transitorius" alt="Transitorius" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_victimofgravity.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_victimofgravity.jpg" title="Victim of Gravity" alt="Victim of Gravity" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_dk.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_dk.jpg" title="X-Wing on patrol" alt="X-Wing on patrol" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_albireo.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_albireo.jpg" title="Albireo Outpost" alt="Albireo Outpost" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_church.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_church.jpg" title="Church of Heaven" alt="Church of Heaven" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_Decampment.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_Decampment.jpg" title="Decampment" alt="Decampment" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_Hibernaculum.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_Hibernaculum.jpg" title="Hibernaculum" alt="Hibernaculum" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_moons.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_moons.jpg" title="Aurea Mediocritas" alt="Aurea Mediocritas" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_praedestinatio.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_praedestinatio.jpg" title="Praedestinatio" alt="Praedestinatio" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_transitorius.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_transitorius.jpg" title="Transitorius" alt="Transitorius" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_victimofgravity.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_victimofgravity.jpg" title="Victim of Gravity" alt="Victim of Gravity" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_victimofgravity.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_victimofgravity.jpg" title="Victim of Gravity" alt="Victim of Gravity" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_lucernarium.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_lucernarium.jpg" title="Supremus Lucernarium" alt="Supremus Lucernarium" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_denebola.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_denebola.jpg" title="Denebola" alt="Denebola" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_lux.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_lux.jpg" title="Lux Aeterna" alt="Lux Aeterna" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_dk.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_dk.jpg" title="X-Wing on patrol" alt="X-Wing on patrol" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_albireo.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_albireo.jpg" title="Albireo Outpost" alt="Albireo Outpost" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_church.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_church.jpg" title="Church of Heaven" alt="Church of Heaven" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_Decampment.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_Decampment.jpg" title="Decampment" alt="Decampment" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_praedestinatio.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_praedestinatio.jpg" title="Praedestinatio" alt="Praedestinatio" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_transitorius.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_transitorius.jpg" title="Transitorius" alt="Transitorius" class="thumb" /></a>
            <a href="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_victimofgravity.jpg" class="thumb_link"><span class="selected"></span><img src="./sl/bg/imgs/space/tn/tn_Universe_and_planets_digital_art_wallpaper_victimofgravity.jpg" title="Victim of Gravity" alt="Victim of Gravity" class="thumb" /></a>
		</div>
            <p class="clear"></p>
            <p>Created by <a href="http://manos.malihu.gr" target="_blank">malihu</a> and his cats on a hot summer day.</p>

		<hr color=red><hr color=white><hr color=blue>
		<hr><h1>go</h1><hr>
<!--
		<a href=./index_sl_kb-books-go-200807.html target=_blank>index_sl_kb-books-go-200807</a><br>
		<a href=./index_sl_kb-books-go-200808.html target=_blank>index_sl_kb-books-go-200808</a><br>
	-->
		<a href=./index_sl_kb-books-go-20130726.html target=_blank>index_sl_kb-books-go-20130726</a><br>
		<hr><h1>jmh</h1><hr>
		<a href=./index_sl_kb-books-jmh-cleveland.html target=_blank>index_sl_kb-books-jmh-cleveland</a><br>
		<a href=./index_sl_kb-books-jmh-jmh2015.html target=_blank>index_sl_kb-books-jmh-jmh2015</a><br>
		<a href=./index_sl_kb-books-jmh-jmh71-jmh71a.html target=_blank>index_sl_kb-books-jmh-jmh71-jmh71a</a><br>
		<a href=./index_sl_kb-books-jmh-jmh71-jmh71b.html target=_blank>index_sl_kb-books-jmh-jmh71-jmh71b</a><br>
		<a href=./index_sl_kb-books-jmh-userguide_80_bw.html target=_blank>index_sl_kb-books-jmh-userguide_80_bw</a><br>
		<a href=./index_sl_kb-jmh71.html target=_blank>index_sl_kb-jmh71</a><br>
		<hr><h1>kids</h1><hr>
		<a href=./index_sl_kb-books-kids-rumplestiltskin.html target=_blank>index_sl_kb-books-kids-rumplestiltskin</a><br>
		<a href=./index_sl_kb-books-kids-schruvelpeter.html target=_blank>index_sl_kb-books-kids-schruvelpeter</a><br>
		<hr><h1>mil</h1><hr>
		<a href=./index_sl_kb-books-mil-korea74.html target=_blank>index_sl_kb-books-mil-korea74</a><br>
		<a href=./index_sl_kb-books-mil-leonardwood90.html target=_blank>index_sl_kb-books-mil-leonardwood90</a><br>
		<a href=./index_sl_kb-books-mil-iperms.html target=_blank>index_sl_kb-books-mil-iperms</a><br>
		<hr><h1>tech</h1><hr>
		<a href=./index_sl_kb-books-tech-time.html target=_blank>index_sl_kb-books-tech-time</a><br>
		<a href=./index_sl_kb-books-tech-digitalmag.html target=_blank>index_sl_kb-books-tech-digitalmag</a><br>
		<a href=./index_sl_kb-books-tech-astronomy_lacross_menschic.html target=_blank>index_sl_kb-books-tech-astronomy_lacross_menschic</a><br>
		<a href=./index_sl_kb-books-tech-calculus.html target=_blank>index_sl_kb-books-tech-calculus</a><br>
		<a href=./index_sl_kb-books-tech-physics.html target=_blank>index_sl_kb-books-tech-physics</a><br>
		<hr><h1>intl</h1><hr>
		<a href=./index_sl_kb-books-tech-duden.html target=_blank>index_sl_kb-books-tech-duden</a><br>
		<a href=./index_sl_kb-intl-ein_hundes_leben.html target=_blank>index_sl_kb-intl-ein_hundes_leben</a><br>
		<a href=./index_sl_kb-intl-deutsche_memories.html target=_blank>index_sl_kb-intl-deutsche_memories</a><br>
		<a href=./index_sl_kb-intl-romanian_bocc.html target=_blank>index_sl_kb-intl-romanian_bocc</a><br>
		<hr><h1>kt</h1><hr>
		<a href=./index_sl_kb-kt-muschi_five_rings.html target=_blank>index_sl_kb-kt-muschi_five_rings</a><br>
		<a href=./index_sl_kb-kt-asian_fighting_arats_dragger.html target=_blank>index_sl_kb-kt-asian_fighting_arats_dragger</a><br>
		<a href=./index_sl_kb-kt-aikido_dynamic_sphere.html target=_blank>index_sl_kb-kt-aikido_dynamic_sphere</a><br>
		<a href=./index_sl_kb-kt-masters.html target=_blank>index_sl_kb-kt-masters</a><br>
		<hr color=blue><hr color=white><hr color=red>



        </div>
	</div>
    <div id="dragger_container"><div id="dragger"></div></div>
</div>
</div>
<div id="bg">
    <img src="./sl/bg/imgs/space/Universe_and_planets_digital_art_wallpaper_lucernarium.jpg" title="Supremus Lucernarium" id="bgimg" />
	<div id="preloader"><img src="ajax-loader_dark.gif" width="32" height="32" align="absmiddle" />LOADING...</div>
    <div id="arrow_indicator"><img src="sw_arrow_indicator.png" width="50" height="50"  /></div>
    <div id="nextimage_tip">Click for next image</div>
</div>
<script>
//set default view mode
//	$defaultViewMode="full"; //full (fullscreen background), fit (fit to window), original (no scale)
	$defaultViewMode="fit"; //full (fullscreen background), fit (fit to window), original (no scale)
//cache vars
	$bg=$("#bg");
	$bgimg=$("#bg #bgimg");
	$preloader=$("#preloader");
	$outer_container=$("#outer_container");
	$outer_container_a=$("#outer_container a.thumb_link");
	$toolbar=$("#toolbar");
	$nextimage_tip=$("#nextimage_tip");
	
$(window).load(function() {
	$toolbar.data("imageViewMode",$defaultViewMode); //default view mode
	ImageViewMode($toolbar.data("imageViewMode"));
	//cache vars
	$customScrollBox=$("#customScrollBox");
	$customScrollBox_container=$("#customScrollBox .container");
	$customScrollBox_content=$("#customScrollBox .content");
	$dragger_container=$("#dragger_container");
	$dragger=$("#dragger");
	
	CustomScroller();
	
	function CustomScroller(){
		outerMargin=0;
		innerMargin=20;
		$customScrollBox.height($(window).height()-outerMargin);
		$dragger_container.height($(window).height()-innerMargin);
		visibleHeight=$(window).height()-outerMargin;
		if($customScrollBox_container.height()>visibleHeight){ //custom scroll depends on content height
			$dragger_container,$dragger.css("display","block");
			totalContent=$customScrollBox_content.height();
			draggerContainerHeight=$(window).height()-innerMargin;
			animSpeed=400; //animation speed
			easeType="easeOutCirc"; //easing type
			bottomSpace=1.05; //bottom scrolling space
			targY=0;
			draggerHeight=$dragger.height();
			$dragger.draggable({ 
				axis: "y", 
				containment: "parent", 
				drag: function(event, ui) {
					Scroll();
				}, 
				stop: function(event, ui) {
					DraggerOut();
				}
			});

			//scrollbar click
			$dragger_container.click(function(e) {
				var mouseCoord=(e.pageY - $(this).offset().top);
				var targetPos=mouseCoord+$dragger.height();
				if(targetPos<draggerContainerHeight){
					$dragger.css("top",mouseCoord);
					Scroll();
				} else {
					$dragger.css("top",draggerContainerHeight-$dragger.height());
					Scroll();
				}
			});

			//mousewheel
			$(function($) {
				$customScrollBox.bind("mousewheel", function(event, delta) {
					vel = Math.abs(delta*10);
					$dragger.css("top", $dragger.position().top-(delta*vel));
					Scroll();
					if($dragger.position().top<0){
						$dragger.css("top", 0);
						$customScrollBox_container.stop();
						Scroll();
					}
					if($dragger.position().top>draggerContainerHeight-$dragger.height()){
						$dragger.css("top", draggerContainerHeight-$dragger.height());
						$customScrollBox_container.stop();
						Scroll();
					}
					return false;
				});
			});

			function Scroll(){
				var scrollAmount=(totalContent-(visibleHeight/bottomSpace))/(draggerContainerHeight-draggerHeight);
				var draggerY=$dragger.position().top;
				targY=-draggerY*scrollAmount;
				var thePos=$customScrollBox_container.position().top-targY;
				$customScrollBox_container.stop().animate({top: "-="+thePos}, animSpeed, easeType); //with easing
			}

			//dragger hover
			$dragger.mouseup(function(){
				DraggerOut();
			}).mousedown(function(){
				DraggerOver();
			});

			function DraggerOver(){
				$dragger.css("background", "url(round_custom_scrollbar_bg_over.png)");
			}

			function DraggerOut(){
				$dragger.css("background", "url(round_custom_scrollbar_bg.png)");
			}
		} else { //hide custom scrollbar if content is short
			$dragger,$dragger_container.css("display","none");
		}
	}

	//resize browser window functions
	$(window).resize(function() {
		FullScreenBackground("#bgimg"); //scale bg image
		$dragger.css("top",0); //reset content scroll
		$customScrollBox_container.css("top",0);
		$customScrollBox.unbind("mousewheel");
		CustomScroller();
	});
	
	LargeImageLoad($bgimg);
});
	
	//loading bg image
	$bgimg.load(function() {
		LargeImageLoad($(this));
	});
	
	function LargeImageLoad($this){
		$preloader.fadeOut("fast"); //hide preloader
		$this.removeAttr("width").removeAttr("height").css({ width: "", height: "" }); //lose all previous dimensions in order to rescale new image data
		$bg.data("originalImageWidth",$this.width()).data("originalImageHeight",$this.height());
		if($bg.data("newTitle")){
			$this.attr("title",$bg.data("newTitle")); //set new image title attribute
		}
		FullScreenBackground($this); //scale new image
		$bg.data("nextImage",$($outer_container.data("selectedThumb")).next().attr("href")); //get and store next image
		if(typeof itemIndex!="undefined"){
			if(itemIndex==lastItemIndex){ //check if it is the last image
				$bg.data("lastImageReached","Y");
				$bg.data("nextImage",$outer_container_a.first().attr("href")); //get and store next image
			} else {
				$bg.data("lastImageReached","N");
			}
		} else {
			$bg.data("lastImageReached","N");
		}
		$this.fadeIn("slow"); //fadein background image
		if($bg.data("nextImage") || $bg.data("lastImageReached")=="Y"){ //don't close thumbs pane on 1st load
			SlidePanels("close"); //close the left pane
		}
		NextImageTip();
	}

	//slide in/out left pane
	$outer_container.hover(
		function(){ //mouse over
			SlidePanels("open");
		},
		function(){ //mouse out
			SlidePanels("close");
		}
	);
	
	//Clicking on thumbnail changes the background image
	$outer_container_a.click(function(event){
		event.preventDefault();
		var $this=this;
		$bgimg.css("display","none");
		$preloader.fadeIn("fast"); //show preloader
		//style clicked thumbnail
		$outer_container_a.each(function() {
    		$(this).children(".selected").css("display","none");
  		});
		$(this).children(".selected").css("display","block");
		//get and store next image and selected thumb 
		$outer_container.data("selectedThumb",$this); 
		$bg.data("nextImage",$(this).next().attr("href")); 	
		$bg.data("newTitle",$(this).children("img").attr("title")); //get and store new image title attribute
		itemIndex=getIndex($this); //get clicked item index
		lastItemIndex=($outer_container_a.length)-1; //get last item index
		$bgimg.attr("src", "").attr("src", $this); //switch image
	}); 

	//clicking on large image loads the next one
	$bgimg.click(function(event){
		var $this=$(this);
		if($bg.data("nextImage")){ //if next image data is stored
			$this.css("display","none");
			$preloader.fadeIn("fast"); //show preloader
			$($outer_container.data("selectedThumb")).children(".selected").css("display","none"); //deselect thumb
			if($bg.data("lastImageReached")!="Y"){
				$($outer_container.data("selectedThumb")).next().children(".selected").css("display","block"); //select new thumb
			} else {
				$outer_container_a.first().children(".selected").css("display","block"); //select new thumb - first
			}
			//store new selected thumb
			var selThumb=$outer_container.data("selectedThumb");
			if($bg.data("lastImageReached")!="Y"){
				$outer_container.data("selectedThumb",$(selThumb).next()); 
			} else {
				$outer_container.data("selectedThumb",$outer_container_a.first()); 
			}
			$bg.data("newTitle",$($outer_container.data("selectedThumb")).children("img").attr("title")); //get and store new image title attribute
			if($bg.data("lastImageReached")!="Y"){
				itemIndex++;
			} else {
				itemIndex=0;
			}
			$this.attr("src", "").attr("src", $bg.data("nextImage")); //switch image
		}
	});
	
	//function to get element index (fuck you IE!)
	function getIndex(theItem){
		for ( var i = 0, length = $outer_container_a.length; i < length; i++ ) {
			if ( $outer_container_a[i] === theItem ) {
				return i;
			}
		}
	}
	
	//toolbar (image view mode button) hover
	$toolbar.hover(
		function(){ //mouse over
			$(this).stop().fadeTo("fast",1);
		},
		function(){ //mouse out
			$(this).stop().fadeTo("fast",0.8);
		}
	); 
	$toolbar.stop().fadeTo("fast",0.8); //set its original state
	
	//Clicking on toolbar changes the image view mode
	$toolbar.click(function(event){
		if($toolbar.data("imageViewMode")=="full"){
			ImageViewMode("fit");
		} else if($toolbar.data("imageViewMode")=="fit") {
			ImageViewMode("original");
		} else if($toolbar.data("imageViewMode")=="original"){
			ImageViewMode("full");
		}
	});

	//next image balloon tip
	//slide in/out left pane function
//Image scale function
function FullScreenBackground(theItem){
	var winWidth=$(window).width();
	var winHeight=$(window).height();
	var imageWidth=$(theItem).width();
	var imageHeight=$(theItem).height();
	if($toolbar.data("imageViewMode")!="original"){ //scale
		$(theItem).removeClass("with_border").removeClass("with_shadow"); //remove extra styles of orininal view mode
		var picHeight = imageHeight / imageWidth;
		var picWidth = imageWidth / imageHeight;
		if($toolbar.data("imageViewMode")!="fit"){ //image view mode: full
			if ((winHeight / winWidth) < picHeight) {
				$(theItem).css("width",winWidth).css("height",picHeight*winWidth);
			} else {
				$(theItem).css("height",winHeight).css("width",picWidth*winHeight);
			};
		} else { //image view mode: fit
			if ((winHeight / winWidth) > picHeight) {
				$(theItem).css("width",winWidth).css("height",picHeight*winWidth);
			} else {
				$(theItem).css("height",winHeight).css("width",picWidth*winHeight);
			};
		}
		//center it
		$(theItem).css("margin-left",((winWidth - $(theItem).width())/2)).css("margin-top",((winHeight - $(theItem).height())/2));
	} else { //no scale
		//add extra styles for orininal view mode
		$(theItem).addClass("with_border").addClass("with_shadow");
		//set original dimensions
		$(theItem).css("width",$bg.data("originalImageWidth")).css("height",$bg.data("originalImageHeight"));
		//center it
		$(theItem).css("margin-left",((winWidth-$(theItem).outerWidth())/2)).css("margin-top",((winHeight-$(theItem).outerHeight())/2));
	}
}

//image view mode function - full or fit
function ImageViewMode(theMode){
	$toolbar.data("imageViewMode", theMode); //store new mode
	FullScreenBackground($bgimg); //scale bg image
	//re-style button
	if(theMode=="full"){
		$toolbar.html("<span class='lightgrey'>IMAGE VIEW MODE &rsaquo;</span> FULL");
	} else if(theMode=="fit") {
		$toolbar.html("<span class='lightgrey'>IMAGE VIEW MODE &rsaquo;</span> FIT");
	} else {
		$toolbar.html("<span class='lightgrey'>IMAGE VIEW MODE &rsaquo;</span> ORIGINAL");
	}
}

//preload script images
var images=["ajax-loader_dark.gif","round_custom_scrollbar_bg_over.png"];
$.each(images, function(i) {
  images[i] = new Image();
  images[i].src = this;
});
</script>
</body>
</html>
	<script id="script_b64_sl_load" >
		var b64_sl_js = new Array();
		var j = 0;
		var b64_sl_js_names = new Array();
		b64_sl_js_names[0] = "script_sl_jquery_js';
		b64_sl_js_names[1] = "script_sl_jqueryui_js';
		b64_sl_js_names[2] = "script_sl_jquery_easing_js';
		b64_sl_js_names[3] = "script_sl_jquery_mousewheel_js';
		b64_sl_js['script_sl_jquery_js'] = "LyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuNC40CiAqIGh0dHA6Ly9qcXVlcnkuY29tLwogKgogKiBDb3B5cmlnaHQgMjAxMCwgSm9obiBSZXNpZwogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBJbmNsdWRlcyBTaXp6bGUuanMKICogaHR0cDovL3NpenpsZWpzLmNvbS8KICogQ29weXJpZ2h0IDIwMTAsIFRoZSBEb2pvIEZvdW5kYXRpb24KICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCwgQlNELCBhbmQgR1BMIExpY2Vuc2VzLgogKgogKiBEYXRlOiBUaHUgTm92IDExIDE5OjA0OjUzIDIwMTAgLTA1MDAKICovCihmdW5jdGlvbihFLEIpe2Z1bmN0aW9uIGthKGEsYixkKXtpZihkPT09QiYmYS5ub2RlVHlwZT09PTEpe2Q9YS5nZXRBdHRyaWJ1dGUoImRhdGEtIitiKTtpZih0eXBlb2YgZD09PSJzdHJpbmciKXt0cnl7ZD1kPT09InRydWUiP3RydWU6ZD09PSJmYWxzZSI/ZmFsc2U6ZD09PSJudWxsIj9udWxsOiFjLmlzTmFOKGQpP3BhcnNlRmxvYXQoZCk6SmEudGVzdChkKT9jLnBhcnNlSlNPTihkKTpkfWNhdGNoKGUpe31jLmRhdGEoYSxiLGQpfWVsc2UgZD1CfXJldHVybiBkfWZ1bmN0aW9uIFUoKXtyZXR1cm4gZmFsc2V9ZnVuY3Rpb24gY2EoKXtyZXR1cm4gdHJ1ZX1mdW5jdGlvbiBsYShhLGIsZCl7ZFswXS50eXBlPWE7cmV0dXJuIGMuZXZlbnQuaGFuZGxlLmFwcGx5KGIsZCl9ZnVuY3Rpb24gS2EoYSl7dmFyIGIsZCxlLGYsaCxsLGssbyx4LHIsQSxDPVtdO2Y9W107aD1jLmRhdGEodGhpcyx0aGlzLm5vZGVUeXBlPyJldmVudHMiOiJfX2V2ZW50c19fIik7aWYodHlwZW9mIGg9PT0iZnVuY3Rpb24iKWg9CmguZXZlbnRzO2lmKCEoYS5saXZlRmlyZWQ9PT10aGlzfHwhaHx8IWgubGl2ZXx8YS5idXR0b24mJmEudHlwZT09PSJjbGljayIpKXtpZihhLm5hbWVzcGFjZSlBPVJlZ0V4cCgiKF58XFwuKSIrYS5uYW1lc3BhY2Uuc3BsaXQoIi4iKS5qb2luKCJcXC4oPzouKlxcLik/IikrIihcXC58JCkiKTthLmxpdmVGaXJlZD10aGlzO3ZhciBKPWgubGl2ZS5zbGljZSgwKTtmb3Ioaz0wO2s8Si5sZW5ndGg7aysrKXtoPUpba107aC5vcmlnVHlwZS5yZXBsYWNlKFgsIiIpPT09YS50eXBlP2YucHVzaChoLnNlbGVjdG9yKTpKLnNwbGljZShrLS0sMSl9Zj1jKGEudGFyZ2V0KS5jbG9zZXN0KGYsYS5jdXJyZW50VGFyZ2V0KTtvPTA7Zm9yKHg9Zi5sZW5ndGg7bzx4O28rKyl7cj1mW29dO2ZvcihrPTA7azxKLmxlbmd0aDtrKyspe2g9SltrXTtpZihyLnNlbGVjdG9yPT09aC5zZWxlY3RvciYmKCFBfHxBLnRlc3QoaC5uYW1lc3BhY2UpKSl7bD1yLmVsZW07ZT1udWxsO2lmKGgucHJlVHlwZT09PSJtb3VzZWVudGVyInx8CmgucHJlVHlwZT09PSJtb3VzZWxlYXZlIil7YS50eXBlPWgucHJlVHlwZTtlPWMoYS5yZWxhdGVkVGFyZ2V0KS5jbG9zZXN0KGguc2VsZWN0b3IpWzBdfWlmKCFlfHxlIT09bClDLnB1c2goe2VsZW06bCxoYW5kbGVPYmo6aCxsZXZlbDpyLmxldmVsfSl9fX1vPTA7Zm9yKHg9Qy5sZW5ndGg7bzx4O28rKyl7Zj1DW29dO2lmKGQmJmYubGV2ZWw+ZClicmVhazthLmN1cnJlbnRUYXJnZXQ9Zi5lbGVtO2EuZGF0YT1mLmhhbmRsZU9iai5kYXRhO2EuaGFuZGxlT2JqPWYuaGFuZGxlT2JqO0E9Zi5oYW5kbGVPYmoub3JpZ0hhbmRsZXIuYXBwbHkoZi5lbGVtLGFyZ3VtZW50cyk7aWYoQT09PWZhbHNlfHxhLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpe2Q9Zi5sZXZlbDtpZihBPT09ZmFsc2UpYj1mYWxzZTtpZihhLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkpYnJlYWt9fXJldHVybiBifX1mdW5jdGlvbiBZKGEsYil7cmV0dXJuKGEmJmEhPT0iKiI/YSsiLiI6IiIpK2IucmVwbGFjZShMYSwKImAiKS5yZXBsYWNlKE1hLCImIil9ZnVuY3Rpb24gbWEoYSxiLGQpe2lmKGMuaXNGdW5jdGlvbihiKSlyZXR1cm4gYy5ncmVwKGEsZnVuY3Rpb24oZixoKXtyZXR1cm4hIWIuY2FsbChmLGgsZik9PT1kfSk7ZWxzZSBpZihiLm5vZGVUeXBlKXJldHVybiBjLmdyZXAoYSxmdW5jdGlvbihmKXtyZXR1cm4gZj09PWI9PT1kfSk7ZWxzZSBpZih0eXBlb2YgYj09PSJzdHJpbmciKXt2YXIgZT1jLmdyZXAoYSxmdW5jdGlvbihmKXtyZXR1cm4gZi5ub2RlVHlwZT09PTF9KTtpZihOYS50ZXN0KGIpKXJldHVybiBjLmZpbHRlcihiLGUsIWQpO2Vsc2UgYj1jLmZpbHRlcihiLGUpfXJldHVybiBjLmdyZXAoYSxmdW5jdGlvbihmKXtyZXR1cm4gYy5pbkFycmF5KGYsYik+PTA9PT1kfSl9ZnVuY3Rpb24gbmEoYSxiKXt2YXIgZD0wO2IuZWFjaChmdW5jdGlvbigpe2lmKHRoaXMubm9kZU5hbWU9PT0oYVtkXSYmYVtkXS5ub2RlTmFtZSkpe3ZhciBlPWMuZGF0YShhW2QrK10pLGY9Yy5kYXRhKHRoaXMsCmUpO2lmKGU9ZSYmZS5ldmVudHMpe2RlbGV0ZSBmLmhhbmRsZTtmLmV2ZW50cz17fTtmb3IodmFyIGggaW4gZSlmb3IodmFyIGwgaW4gZVtoXSljLmV2ZW50LmFkZCh0aGlzLGgsZVtoXVtsXSxlW2hdW2xdLmRhdGEpfX19KX1mdW5jdGlvbiBPYShhLGIpe2Iuc3JjP2MuYWpheCh7dXJsOmIuc3JjLGFzeW5jOmZhbHNlLGRhdGFUeXBlOiJzY3JpcHQifSk6Yy5nbG9iYWxFdmFsKGIudGV4dHx8Yi50ZXh0Q29udGVudHx8Yi5pbm5lckhUTUx8fCIiKTtiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKX1mdW5jdGlvbiBvYShhLGIsZCl7dmFyIGU9Yj09PSJ3aWR0aCI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodDtpZihkPT09ImJvcmRlciIpcmV0dXJuIGU7Yy5lYWNoKGI9PT0id2lkdGgiP1BhOlFhLGZ1bmN0aW9uKCl7ZHx8KGUtPXBhcnNlRmxvYXQoYy5jc3MoYSwicGFkZGluZyIrdGhpcykpfHwwKTtpZihkPT09Im1hcmdpbiIpZSs9cGFyc2VGbG9hdChjLmNzcyhhLAoibWFyZ2luIit0aGlzKSl8fDA7ZWxzZSBlLT1wYXJzZUZsb2F0KGMuY3NzKGEsImJvcmRlciIrdGhpcysiV2lkdGgiKSl8fDB9KTtyZXR1cm4gZX1mdW5jdGlvbiBkYShhLGIsZCxlKXtpZihjLmlzQXJyYXkoYikmJmIubGVuZ3RoKWMuZWFjaChiLGZ1bmN0aW9uKGYsaCl7ZHx8UmEudGVzdChhKT9lKGEsaCk6ZGEoYSsiWyIrKHR5cGVvZiBoPT09Im9iamVjdCJ8fGMuaXNBcnJheShoKT9mOiIiKSsiXSIsaCxkLGUpfSk7ZWxzZSBpZighZCYmYiE9bnVsbCYmdHlwZW9mIGI9PT0ib2JqZWN0IiljLmlzRW1wdHlPYmplY3QoYik/ZShhLCIiKTpjLmVhY2goYixmdW5jdGlvbihmLGgpe2RhKGErIlsiK2YrIl0iLGgsZCxlKX0pO2Vsc2UgZShhLGIpfWZ1bmN0aW9uIFMoYSxiKXt2YXIgZD17fTtjLmVhY2gocGEuY29uY2F0LmFwcGx5KFtdLHBhLnNsaWNlKDAsYikpLGZ1bmN0aW9uKCl7ZFt0aGlzXT1hfSk7cmV0dXJuIGR9ZnVuY3Rpb24gcWEoYSl7aWYoIWVhW2FdKXt2YXIgYj1jKCI8IisKYSsiPiIpLmFwcGVuZFRvKCJib2R5IiksZD1iLmNzcygiZGlzcGxheSIpO2IucmVtb3ZlKCk7aWYoZD09PSJub25lInx8ZD09PSIiKWQ9ImJsb2NrIjtlYVthXT1kfXJldHVybiBlYVthXX1mdW5jdGlvbiBmYShhKXtyZXR1cm4gYy5pc1dpbmRvdyhhKT9hOmEubm9kZVR5cGU9PT05P2EuZGVmYXVsdFZpZXd8fGEucGFyZW50V2luZG93OmZhbHNlfXZhciB0PUUuZG9jdW1lbnQsYz1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtpZighYi5pc1JlYWR5KXt0cnl7dC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwoImxlZnQiKX1jYXRjaChqKXtzZXRUaW1lb3V0KGEsMSk7cmV0dXJufWIucmVhZHkoKX19dmFyIGI9ZnVuY3Rpb24oaixzKXtyZXR1cm4gbmV3IGIuZm4uaW5pdChqLHMpfSxkPUUualF1ZXJ5LGU9RS4kLGYsaD0vXig/OltePF0qKDxbXHdcV10rPilbXj5dKiR8IyhbXHdcLV0rKSQpLyxsPS9cUy8saz0vXlxzKy8sbz0vXHMrJC8seD0vXFcvLHI9L1xkLyxBPS9ePChcdyspXHMqXC8/Pig/OjxcL1wxPik/JC8sCkM9L15bXF0sOnt9XHNdKiQvLEo9L1xcKD86WyJcXFwvYmZucnRdfHVbMC05YS1mQS1GXXs0fSkvZyx3PS8iW14iXFxcblxyXSoifHRydWV8ZmFsc2V8bnVsbHwtP1xkKyg/OlwuXGQqKT8oPzpbZUVdWytcLV0/XGQrKT8vZyxJPS8oPzpefDp8LCkoPzpccypcWykrL2csTD0vKHdlYmtpdClbIFwvXShbXHcuXSspLyxnPS8ob3BlcmEpKD86Lip2ZXJzaW9uKT9bIFwvXShbXHcuXSspLyxpPS8obXNpZSkgKFtcdy5dKykvLG49Lyhtb3ppbGxhKSg/Oi4qPyBydjooW1x3Ll0rKSk/LyxtPW5hdmlnYXRvci51c2VyQWdlbnQscD1mYWxzZSxxPVtdLHUseT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLEY9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxNPUFycmF5LnByb3RvdHlwZS5wdXNoLE49QXJyYXkucHJvdG90eXBlLnNsaWNlLE89U3RyaW5nLnByb3RvdHlwZS50cmltLEQ9QXJyYXkucHJvdG90eXBlLmluZGV4T2YsUj17fTtiLmZuPWIucHJvdG90eXBlPXtpbml0OmZ1bmN0aW9uKGosCnMpe3ZhciB2LHosSDtpZighailyZXR1cm4gdGhpcztpZihqLm5vZGVUeXBlKXt0aGlzLmNvbnRleHQ9dGhpc1swXT1qO3RoaXMubGVuZ3RoPTE7cmV0dXJuIHRoaXN9aWYoaj09PSJib2R5IiYmIXMmJnQuYm9keSl7dGhpcy5jb250ZXh0PXQ7dGhpc1swXT10LmJvZHk7dGhpcy5zZWxlY3Rvcj0iYm9keSI7dGhpcy5sZW5ndGg9MTtyZXR1cm4gdGhpc31pZih0eXBlb2Ygaj09PSJzdHJpbmciKWlmKCh2PWguZXhlYyhqKSkmJih2WzFdfHwhcykpaWYodlsxXSl7SD1zP3Mub3duZXJEb2N1bWVudHx8czp0O2lmKHo9QS5leGVjKGopKWlmKGIuaXNQbGFpbk9iamVjdChzKSl7aj1bdC5jcmVhdGVFbGVtZW50KHpbMV0pXTtiLmZuLmF0dHIuY2FsbChqLHMsdHJ1ZSl9ZWxzZSBqPVtILmNyZWF0ZUVsZW1lbnQoelsxXSldO2Vsc2V7ej1iLmJ1aWxkRnJhZ21lbnQoW3ZbMV1dLFtIXSk7aj0oei5jYWNoZWFibGU/ei5mcmFnbWVudC5jbG9uZU5vZGUodHJ1ZSk6ei5mcmFnbWVudCkuY2hpbGROb2Rlc31yZXR1cm4gYi5tZXJnZSh0aGlzLApqKX1lbHNle2lmKCh6PXQuZ2V0RWxlbWVudEJ5SWQodlsyXSkpJiZ6LnBhcmVudE5vZGUpe2lmKHouaWQhPT12WzJdKXJldHVybiBmLmZpbmQoaik7dGhpcy5sZW5ndGg9MTt0aGlzWzBdPXp9dGhpcy5jb250ZXh0PXQ7dGhpcy5zZWxlY3Rvcj1qO3JldHVybiB0aGlzfWVsc2UgaWYoIXMmJiF4LnRlc3Qoaikpe3RoaXMuc2VsZWN0b3I9ajt0aGlzLmNvbnRleHQ9dDtqPXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaik7cmV0dXJuIGIubWVyZ2UodGhpcyxqKX1lbHNlIHJldHVybiFzfHxzLmpxdWVyeT8oc3x8ZikuZmluZChqKTpiKHMpLmZpbmQoaik7ZWxzZSBpZihiLmlzRnVuY3Rpb24oaikpcmV0dXJuIGYucmVhZHkoaik7aWYoai5zZWxlY3RvciE9PUIpe3RoaXMuc2VsZWN0b3I9ai5zZWxlY3Rvcjt0aGlzLmNvbnRleHQ9ai5jb250ZXh0fXJldHVybiBiLm1ha2VBcnJheShqLHRoaXMpfSxzZWxlY3RvcjoiIixqcXVlcnk6IjEuNC40IixsZW5ndGg6MCxzaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RofSwKdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBOLmNhbGwodGhpcywwKX0sZ2V0OmZ1bmN0aW9uKGope3JldHVybiBqPT1udWxsP3RoaXMudG9BcnJheSgpOmo8MD90aGlzLnNsaWNlKGopWzBdOnRoaXNbal19LHB1c2hTdGFjazpmdW5jdGlvbihqLHMsdil7dmFyIHo9YigpO2IuaXNBcnJheShqKT9NLmFwcGx5KHosaik6Yi5tZXJnZSh6LGopO3oucHJldk9iamVjdD10aGlzO3ouY29udGV4dD10aGlzLmNvbnRleHQ7aWYocz09PSJmaW5kIil6LnNlbGVjdG9yPXRoaXMuc2VsZWN0b3IrKHRoaXMuc2VsZWN0b3I/IiAiOiIiKSt2O2Vsc2UgaWYocyl6LnNlbGVjdG9yPXRoaXMuc2VsZWN0b3IrIi4iK3MrIigiK3YrIikiO3JldHVybiB6fSxlYWNoOmZ1bmN0aW9uKGoscyl7cmV0dXJuIGIuZWFjaCh0aGlzLGoscyl9LHJlYWR5OmZ1bmN0aW9uKGope2IuYmluZFJlYWR5KCk7aWYoYi5pc1JlYWR5KWouY2FsbCh0LGIpO2Vsc2UgcSYmcS5wdXNoKGopO3JldHVybiB0aGlzfSxlcTpmdW5jdGlvbihqKXtyZXR1cm4gaj09PQotMT90aGlzLnNsaWNlKGopOnRoaXMuc2xpY2UoaiwraisxKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soTi5hcHBseSh0aGlzLGFyZ3VtZW50cyksInNsaWNlIixOLmNhbGwoYXJndW1lbnRzKS5qb2luKCIsIikpfSxtYXA6ZnVuY3Rpb24oail7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGIubWFwKHRoaXMsZnVuY3Rpb24ocyx2KXtyZXR1cm4gai5jYWxsKHMsdixzKX0pKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8YihudWxsKX0scHVzaDpNLHNvcnQ6W10uc29ydCxzcGxpY2U6W10uc3BsaWNlfTtiLmZuLmluaXQucHJvdG90eXBlPWIuZm47Yi5leHRlbmQ9Yi5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgaixzLHYseixILEc9YXJndW1lbnRzWzBdfHx7fSxLPTEsUT1hcmd1bWVudHMubGVuZ3RoLGdhPWZhbHNlOwppZih0eXBlb2YgRz09PSJib29sZWFuIil7Z2E9RztHPWFyZ3VtZW50c1sxXXx8e307Sz0yfWlmKHR5cGVvZiBHIT09Im9iamVjdCImJiFiLmlzRnVuY3Rpb24oRykpRz17fTtpZihRPT09Syl7Rz10aGlzOy0tS31mb3IoO0s8UTtLKyspaWYoKGo9YXJndW1lbnRzW0tdKSE9bnVsbClmb3IocyBpbiBqKXt2PUdbc107ej1qW3NdO2lmKEchPT16KWlmKGdhJiZ6JiYoYi5pc1BsYWluT2JqZWN0KHopfHwoSD1iLmlzQXJyYXkoeikpKSl7aWYoSCl7SD1mYWxzZTt2PXYmJmIuaXNBcnJheSh2KT92OltdfWVsc2Ugdj12JiZiLmlzUGxhaW5PYmplY3Qodik/djp7fTtHW3NdPWIuZXh0ZW5kKGdhLHYseil9ZWxzZSBpZih6IT09QilHW3NdPXp9cmV0dXJuIEd9O2IuZXh0ZW5kKHtub0NvbmZsaWN0OmZ1bmN0aW9uKGope0UuJD1lO2lmKGopRS5qUXVlcnk9ZDtyZXR1cm4gYn0saXNSZWFkeTpmYWxzZSxyZWFkeVdhaXQ6MSxyZWFkeTpmdW5jdGlvbihqKXtqPT09dHJ1ZSYmYi5yZWFkeVdhaXQtLTsKaWYoIWIucmVhZHlXYWl0fHxqIT09dHJ1ZSYmIWIuaXNSZWFkeSl7aWYoIXQuYm9keSlyZXR1cm4gc2V0VGltZW91dChiLnJlYWR5LDEpO2IuaXNSZWFkeT10cnVlO2lmKCEoaiE9PXRydWUmJi0tYi5yZWFkeVdhaXQ+MCkpaWYocSl7dmFyIHM9MCx2PXE7Zm9yKHE9bnVsbDtqPXZbcysrXTspai5jYWxsKHQsYik7Yi5mbi50cmlnZ2VyJiZiKHQpLnRyaWdnZXIoInJlYWR5IikudW5iaW5kKCJyZWFkeSIpfX19LGJpbmRSZWFkeTpmdW5jdGlvbigpe2lmKCFwKXtwPXRydWU7aWYodC5yZWFkeVN0YXRlPT09ImNvbXBsZXRlIilyZXR1cm4gc2V0VGltZW91dChiLnJlYWR5LDEpO2lmKHQuYWRkRXZlbnRMaXN0ZW5lcil7dC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIix1LGZhbHNlKTtFLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGIucmVhZHksZmFsc2UpfWVsc2UgaWYodC5hdHRhY2hFdmVudCl7dC5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIix1KTtFLmF0dGFjaEV2ZW50KCJvbmxvYWQiLApiLnJlYWR5KTt2YXIgaj1mYWxzZTt0cnl7aj1FLmZyYW1lRWxlbWVudD09bnVsbH1jYXRjaChzKXt9dC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwmJmomJmEoKX19fSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGope3JldHVybiBiLnR5cGUoaik9PT0iZnVuY3Rpb24ifSxpc0FycmF5OkFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGope3JldHVybiBiLnR5cGUoaik9PT0iYXJyYXkifSxpc1dpbmRvdzpmdW5jdGlvbihqKXtyZXR1cm4gaiYmdHlwZW9mIGo9PT0ib2JqZWN0IiYmInNldEludGVydmFsImluIGp9LGlzTmFOOmZ1bmN0aW9uKGope3JldHVybiBqPT1udWxsfHwhci50ZXN0KGopfHxpc05hTihqKX0sdHlwZTpmdW5jdGlvbihqKXtyZXR1cm4gaj09bnVsbD9TdHJpbmcoaik6Ult5LmNhbGwoaildfHwib2JqZWN0In0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihqKXtpZighanx8Yi50eXBlKGopIT09Im9iamVjdCJ8fGoubm9kZVR5cGV8fGIuaXNXaW5kb3coaikpcmV0dXJuIGZhbHNlO2lmKGouY29uc3RydWN0b3ImJgohRi5jYWxsKGosImNvbnN0cnVjdG9yIikmJiFGLmNhbGwoai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsImlzUHJvdG90eXBlT2YiKSlyZXR1cm4gZmFsc2U7Zm9yKHZhciBzIGluIGopO3JldHVybiBzPT09Qnx8Ri5jYWxsKGoscyl9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oail7Zm9yKHZhciBzIGluIGopcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlfSxlcnJvcjpmdW5jdGlvbihqKXt0aHJvdyBqO30scGFyc2VKU09OOmZ1bmN0aW9uKGope2lmKHR5cGVvZiBqIT09InN0cmluZyJ8fCFqKXJldHVybiBudWxsO2o9Yi50cmltKGopO2lmKEMudGVzdChqLnJlcGxhY2UoSiwiQCIpLnJlcGxhY2UodywiXSIpLnJlcGxhY2UoSSwiIikpKXJldHVybiBFLkpTT04mJkUuSlNPTi5wYXJzZT9FLkpTT04ucGFyc2Uoaik6KG5ldyBGdW5jdGlvbigicmV0dXJuICIraikpKCk7ZWxzZSBiLmVycm9yKCJJbnZhbGlkIEpTT046ICIrail9LG5vb3A6ZnVuY3Rpb24oKXt9LGdsb2JhbEV2YWw6ZnVuY3Rpb24oail7aWYoaiYmCmwudGVzdChqKSl7dmFyIHM9dC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdfHx0LmRvY3VtZW50RWxlbWVudCx2PXQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7di50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2lmKGIuc3VwcG9ydC5zY3JpcHRFdmFsKXYuYXBwZW5kQ2hpbGQodC5jcmVhdGVUZXh0Tm9kZShqKSk7ZWxzZSB2LnRleHQ9ajtzLmluc2VydEJlZm9yZSh2LHMuZmlyc3RDaGlsZCk7cy5yZW1vdmVDaGlsZCh2KX19LG5vZGVOYW1lOmZ1bmN0aW9uKGoscyl7cmV0dXJuIGoubm9kZU5hbWUmJmoubm9kZU5hbWUudG9VcHBlckNhc2UoKT09PXMudG9VcHBlckNhc2UoKX0sZWFjaDpmdW5jdGlvbihqLHMsdil7dmFyIHosSD0wLEc9ai5sZW5ndGgsSz1HPT09Qnx8Yi5pc0Z1bmN0aW9uKGopO2lmKHYpaWYoSylmb3IoeiBpbiBqKXtpZihzLmFwcGx5KGpbel0sdik9PT1mYWxzZSlicmVha31lbHNlIGZvcig7SDxHOyl7aWYocy5hcHBseShqW0grK10sdik9PT1mYWxzZSlicmVha31lbHNlIGlmKEspZm9yKHogaW4gail7aWYocy5jYWxsKGpbel0sCnosalt6XSk9PT1mYWxzZSlicmVha31lbHNlIGZvcih2PWpbMF07SDxHJiZzLmNhbGwodixILHYpIT09ZmFsc2U7dj1qWysrSF0pO3JldHVybiBqfSx0cmltOk8/ZnVuY3Rpb24oail7cmV0dXJuIGo9PW51bGw/IiI6Ty5jYWxsKGopfTpmdW5jdGlvbihqKXtyZXR1cm4gaj09bnVsbD8iIjpqLnRvU3RyaW5nKCkucmVwbGFjZShrLCIiKS5yZXBsYWNlKG8sIiIpfSxtYWtlQXJyYXk6ZnVuY3Rpb24oaixzKXt2YXIgdj1zfHxbXTtpZihqIT1udWxsKXt2YXIgej1iLnR5cGUoaik7ai5sZW5ndGg9PW51bGx8fHo9PT0ic3RyaW5nInx8ej09PSJmdW5jdGlvbiJ8fHo9PT0icmVnZXhwInx8Yi5pc1dpbmRvdyhqKT9NLmNhbGwodixqKTpiLm1lcmdlKHYsail9cmV0dXJuIHZ9LGluQXJyYXk6ZnVuY3Rpb24oaixzKXtpZihzLmluZGV4T2YpcmV0dXJuIHMuaW5kZXhPZihqKTtmb3IodmFyIHY9MCx6PXMubGVuZ3RoO3Y8ejt2KyspaWYoc1t2XT09PWopcmV0dXJuIHY7cmV0dXJuLTF9LG1lcmdlOmZ1bmN0aW9uKGosCnMpe3ZhciB2PWoubGVuZ3RoLHo9MDtpZih0eXBlb2Ygcy5sZW5ndGg9PT0ibnVtYmVyIilmb3IodmFyIEg9cy5sZW5ndGg7ejxIO3orKylqW3YrK109c1t6XTtlbHNlIGZvcig7c1t6XSE9PUI7KWpbdisrXT1zW3orK107ai5sZW5ndGg9djtyZXR1cm4gan0sZ3JlcDpmdW5jdGlvbihqLHMsdil7dmFyIHo9W10sSDt2PSEhdjtmb3IodmFyIEc9MCxLPWoubGVuZ3RoO0c8SztHKyspe0g9ISFzKGpbR10sRyk7diE9PUgmJnoucHVzaChqW0ddKX1yZXR1cm4gen0sbWFwOmZ1bmN0aW9uKGoscyx2KXtmb3IodmFyIHo9W10sSCxHPTAsSz1qLmxlbmd0aDtHPEs7RysrKXtIPXMoaltHXSxHLHYpO2lmKEghPW51bGwpelt6Lmxlbmd0aF09SH1yZXR1cm4gei5jb25jYXQuYXBwbHkoW10seil9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihqLHMsdil7aWYoYXJndW1lbnRzLmxlbmd0aD09PTIpaWYodHlwZW9mIHM9PT0ic3RyaW5nIil7dj1qO2o9dltzXTtzPUJ9ZWxzZSBpZihzJiYhYi5pc0Z1bmN0aW9uKHMpKXt2PQpzO3M9Qn1pZighcyYmailzPWZ1bmN0aW9uKCl7cmV0dXJuIGouYXBwbHkodnx8dGhpcyxhcmd1bWVudHMpfTtpZihqKXMuZ3VpZD1qLmd1aWQ9ai5ndWlkfHxzLmd1aWR8fGIuZ3VpZCsrO3JldHVybiBzfSxhY2Nlc3M6ZnVuY3Rpb24oaixzLHYseixILEcpe3ZhciBLPWoubGVuZ3RoO2lmKHR5cGVvZiBzPT09Im9iamVjdCIpe2Zvcih2YXIgUSBpbiBzKWIuYWNjZXNzKGosUSxzW1FdLHosSCx2KTtyZXR1cm4gan1pZih2IT09Qil7ej0hRyYmeiYmYi5pc0Z1bmN0aW9uKHYpO2ZvcihRPTA7UTxLO1ErKylIKGpbUV0scyx6P3YuY2FsbChqW1FdLFEsSChqW1FdLHMpKTp2LEcpO3JldHVybiBqfXJldHVybiBLP0goalswXSxzKTpCfSxub3c6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0sdWFNYXRjaDpmdW5jdGlvbihqKXtqPWoudG9Mb3dlckNhc2UoKTtqPUwuZXhlYyhqKXx8Zy5leGVjKGopfHxpLmV4ZWMoail8fGouaW5kZXhPZigiY29tcGF0aWJsZSIpPDAmJm4uZXhlYyhqKXx8CltdO3JldHVybnticm93c2VyOmpbMV18fCIiLHZlcnNpb246alsyXXx8IjAifX0sYnJvd3Nlcjp7fX0pO2IuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCIuc3BsaXQoIiAiKSxmdW5jdGlvbihqLHMpe1JbIltvYmplY3QgIitzKyJdIl09cy50b0xvd2VyQ2FzZSgpfSk7bT1iLnVhTWF0Y2gobSk7aWYobS5icm93c2VyKXtiLmJyb3dzZXJbbS5icm93c2VyXT10cnVlO2IuYnJvd3Nlci52ZXJzaW9uPW0udmVyc2lvbn1pZihiLmJyb3dzZXIud2Via2l0KWIuYnJvd3Nlci5zYWZhcmk9dHJ1ZTtpZihEKWIuaW5BcnJheT1mdW5jdGlvbihqLHMpe3JldHVybiBELmNhbGwocyxqKX07aWYoIS9ccy8udGVzdCgiXHUwMGEwIikpe2s9L15bXHNceEEwXSsvO289L1tcc1x4QTBdKyQvfWY9Yih0KTtpZih0LmFkZEV2ZW50TGlzdGVuZXIpdT1mdW5jdGlvbigpe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsdSwKZmFsc2UpO2IucmVhZHkoKX07ZWxzZSBpZih0LmF0dGFjaEV2ZW50KXU9ZnVuY3Rpb24oKXtpZih0LnJlYWR5U3RhdGU9PT0iY29tcGxldGUiKXt0LmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLHUpO2IucmVhZHkoKX19O3JldHVybiBFLmpRdWVyeT1FLiQ9Yn0oKTsoZnVuY3Rpb24oKXtjLnN1cHBvcnQ9e307dmFyIGE9dC5kb2N1bWVudEVsZW1lbnQsYj10LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGQ9dC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPSJzY3JpcHQiK2Mubm93KCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtkLmlubmVySFRNTD0iICAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJyBzdHlsZT0nY29sb3I6cmVkO2Zsb2F0OmxlZnQ7b3BhY2l0eTouNTU7Jz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiI7dmFyIGY9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLGg9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpWzBdLGw9dC5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKSwKaz1sLmFwcGVuZENoaWxkKHQuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpO2lmKCEoIWZ8fCFmLmxlbmd0aHx8IWgpKXtjLnN1cHBvcnQ9e2xlYWRpbmdXaGl0ZXNwYWNlOmQuZmlyc3RDaGlsZC5ub2RlVHlwZT09PTMsdGJvZHk6IWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IikubGVuZ3RoLGh0bWxTZXJpYWxpemU6ISFkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIikubGVuZ3RoLHN0eWxlOi9yZWQvLnRlc3QoaC5nZXRBdHRyaWJ1dGUoInN0eWxlIikpLGhyZWZOb3JtYWxpemVkOmguZ2V0QXR0cmlidXRlKCJocmVmIik9PT0iL2EiLG9wYWNpdHk6L14wLjU1JC8udGVzdChoLnN0eWxlLm9wYWNpdHkpLGNzc0Zsb2F0OiEhaC5zdHlsZS5jc3NGbG9hdCxjaGVja09uOmQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IilbMF0udmFsdWU9PT0ib24iLG9wdFNlbGVjdGVkOmsuc2VsZWN0ZWQsZGVsZXRlRXhwYW5kbzp0cnVlLG9wdERpc2FibGVkOmZhbHNlLGNoZWNrQ2xvbmU6ZmFsc2UsCnNjcmlwdEV2YWw6ZmFsc2Usbm9DbG9uZUV2ZW50OnRydWUsYm94TW9kZWw6bnVsbCxpbmxpbmVCbG9ja05lZWRzTGF5b3V0OmZhbHNlLHNocmlua1dyYXBCbG9ja3M6ZmFsc2UscmVsaWFibGVIaWRkZW5PZmZzZXRzOnRydWV9O2wuZGlzYWJsZWQ9dHJ1ZTtjLnN1cHBvcnQub3B0RGlzYWJsZWQ9IWsuZGlzYWJsZWQ7Yi50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO3RyeXtiLmFwcGVuZENoaWxkKHQuY3JlYXRlVGV4dE5vZGUoIndpbmRvdy4iK2UrIj0xOyIpKX1jYXRjaChvKXt9YS5pbnNlcnRCZWZvcmUoYixhLmZpcnN0Q2hpbGQpO2lmKEVbZV0pe2Muc3VwcG9ydC5zY3JpcHRFdmFsPXRydWU7ZGVsZXRlIEVbZV19dHJ5e2RlbGV0ZSBiLnRlc3R9Y2F0Y2goeCl7Yy5zdXBwb3J0LmRlbGV0ZUV4cGFuZG89ZmFsc2V9YS5yZW1vdmVDaGlsZChiKTtpZihkLmF0dGFjaEV2ZW50JiZkLmZpcmVFdmVudCl7ZC5hdHRhY2hFdmVudCgib25jbGljayIsZnVuY3Rpb24gcigpe2Muc3VwcG9ydC5ub0Nsb25lRXZlbnQ9CmZhbHNlO2QuZGV0YWNoRXZlbnQoIm9uY2xpY2siLHIpfSk7ZC5jbG9uZU5vZGUodHJ1ZSkuZmlyZUV2ZW50KCJvbmNsaWNrIil9ZD10LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaW5uZXJIVE1MPSI8aW5wdXQgdHlwZT0ncmFkaW8nIG5hbWU9J3JhZGlvdGVzdCcgY2hlY2tlZD0nY2hlY2tlZCcvPiI7YT10LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTthLmFwcGVuZENoaWxkKGQuZmlyc3RDaGlsZCk7Yy5zdXBwb3J0LmNoZWNrQ2xvbmU9YS5jbG9uZU5vZGUodHJ1ZSkuY2xvbmVOb2RlKHRydWUpLmxhc3RDaGlsZC5jaGVja2VkO2MoZnVuY3Rpb24oKXt2YXIgcj10LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3Iuc3R5bGUud2lkdGg9ci5zdHlsZS5wYWRkaW5nTGVmdD0iMXB4Ijt0LmJvZHkuYXBwZW5kQ2hpbGQocik7Yy5ib3hNb2RlbD1jLnN1cHBvcnQuYm94TW9kZWw9ci5vZmZzZXRXaWR0aD09PTI7aWYoInpvb20iaW4gci5zdHlsZSl7ci5zdHlsZS5kaXNwbGF5PSJpbmxpbmUiO3Iuc3R5bGUuem9vbT0KMTtjLnN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dD1yLm9mZnNldFdpZHRoPT09MjtyLnN0eWxlLmRpc3BsYXk9IiI7ci5pbm5lckhUTUw9IjxkaXYgc3R5bGU9J3dpZHRoOjRweDsnPjwvZGl2PiI7Yy5zdXBwb3J0LnNocmlua1dyYXBCbG9ja3M9ci5vZmZzZXRXaWR0aCE9PTJ9ci5pbm5lckhUTUw9Ijx0YWJsZT48dHI+PHRkIHN0eWxlPSdwYWRkaW5nOjA7ZGlzcGxheTpub25lJz48L3RkPjx0ZD50PC90ZD48L3RyPjwvdGFibGU+Ijt2YXIgQT1yLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpO2Muc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHM9QVswXS5vZmZzZXRIZWlnaHQ9PT0wO0FbMF0uc3R5bGUuZGlzcGxheT0iIjtBWzFdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Muc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHM9Yy5zdXBwb3J0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cyYmQVswXS5vZmZzZXRIZWlnaHQ9PT0wO3IuaW5uZXJIVE1MPSIiO3QuYm9keS5yZW1vdmVDaGlsZChyKS5zdHlsZS5kaXNwbGF5PQoibm9uZSJ9KTthPWZ1bmN0aW9uKHIpe3ZhciBBPXQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cj0ib24iK3I7dmFyIEM9ciBpbiBBO2lmKCFDKXtBLnNldEF0dHJpYnV0ZShyLCJyZXR1cm47Iik7Qz10eXBlb2YgQVtyXT09PSJmdW5jdGlvbiJ9cmV0dXJuIEN9O2Muc3VwcG9ydC5zdWJtaXRCdWJibGVzPWEoInN1Ym1pdCIpO2Muc3VwcG9ydC5jaGFuZ2VCdWJibGVzPWEoImNoYW5nZSIpO2E9Yj1kPWY9aD1udWxsfX0pKCk7dmFyIHJhPXt9LEphPS9eKD86XHsuKlx9fFxbLipcXSkkLztjLmV4dGVuZCh7Y2FjaGU6e30sdXVpZDowLGV4cGFuZG86ImpRdWVyeSIrYy5ub3coKSxub0RhdGE6e2VtYmVkOnRydWUsb2JqZWN0OiJjbHNpZDpEMjdDREI2RS1BRTZELTExY2YtOTZCOC00NDQ1NTM1NDAwMDAiLGFwcGxldDp0cnVlfSxkYXRhOmZ1bmN0aW9uKGEsYixkKXtpZihjLmFjY2VwdERhdGEoYSkpe2E9YT09RT9yYTphO3ZhciBlPWEubm9kZVR5cGUsZj1lP2FbYy5leHBhbmRvXTpudWxsLGg9CmMuY2FjaGU7aWYoIShlJiYhZiYmdHlwZW9mIGI9PT0ic3RyaW5nIiYmZD09PUIpKXtpZihlKWZ8fChhW2MuZXhwYW5kb109Zj0rK2MudXVpZCk7ZWxzZSBoPWE7aWYodHlwZW9mIGI9PT0ib2JqZWN0IilpZihlKWhbZl09Yy5leHRlbmQoaFtmXSxiKTtlbHNlIGMuZXh0ZW5kKGgsYik7ZWxzZSBpZihlJiYhaFtmXSloW2ZdPXt9O2E9ZT9oW2ZdOmg7aWYoZCE9PUIpYVtiXT1kO3JldHVybiB0eXBlb2YgYj09PSJzdHJpbmciP2FbYl06YX19fSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYil7aWYoYy5hY2NlcHREYXRhKGEpKXthPWE9PUU/cmE6YTt2YXIgZD1hLm5vZGVUeXBlLGU9ZD9hW2MuZXhwYW5kb106YSxmPWMuY2FjaGUsaD1kP2ZbZV06ZTtpZihiKXtpZihoKXtkZWxldGUgaFtiXTtkJiZjLmlzRW1wdHlPYmplY3QoaCkmJmMucmVtb3ZlRGF0YShhKX19ZWxzZSBpZihkJiZjLnN1cHBvcnQuZGVsZXRlRXhwYW5kbylkZWxldGUgYVtjLmV4cGFuZG9dO2Vsc2UgaWYoYS5yZW1vdmVBdHRyaWJ1dGUpYS5yZW1vdmVBdHRyaWJ1dGUoYy5leHBhbmRvKTsKZWxzZSBpZihkKWRlbGV0ZSBmW2VdO2Vsc2UgZm9yKHZhciBsIGluIGEpZGVsZXRlIGFbbF19fSxhY2NlcHREYXRhOmZ1bmN0aW9uKGEpe2lmKGEubm9kZU5hbWUpe3ZhciBiPWMubm9EYXRhW2Eubm9kZU5hbWUudG9Mb3dlckNhc2UoKV07aWYoYilyZXR1cm4hKGI9PT10cnVlfHxhLmdldEF0dHJpYnV0ZSgiY2xhc3NpZCIpIT09Yil9cmV0dXJuIHRydWV9fSk7Yy5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oYSxiKXt2YXIgZD1udWxsO2lmKHR5cGVvZiBhPT09InVuZGVmaW5lZCIpe2lmKHRoaXMubGVuZ3RoKXt2YXIgZT10aGlzWzBdLmF0dHJpYnV0ZXMsZjtkPWMuZGF0YSh0aGlzWzBdKTtmb3IodmFyIGg9MCxsPWUubGVuZ3RoO2g8bDtoKyspe2Y9ZVtoXS5uYW1lO2lmKGYuaW5kZXhPZigiZGF0YS0iKT09PTApe2Y9Zi5zdWJzdHIoNSk7a2EodGhpc1swXSxmLGRbZl0pfX19cmV0dXJuIGR9ZWxzZSBpZih0eXBlb2YgYT09PSJvYmplY3QiKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtjLmRhdGEodGhpcywKYSl9KTt2YXIgaz1hLnNwbGl0KCIuIik7a1sxXT1rWzFdPyIuIitrWzFdOiIiO2lmKGI9PT1CKXtkPXRoaXMudHJpZ2dlckhhbmRsZXIoImdldERhdGEiK2tbMV0rIiEiLFtrWzBdXSk7aWYoZD09PUImJnRoaXMubGVuZ3RoKXtkPWMuZGF0YSh0aGlzWzBdLGEpO2Q9a2EodGhpc1swXSxhLGQpfXJldHVybiBkPT09QiYma1sxXT90aGlzLmRhdGEoa1swXSk6ZH1lbHNlIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgbz1jKHRoaXMpLHg9W2tbMF0sYl07by50cmlnZ2VySGFuZGxlcigic2V0RGF0YSIra1sxXSsiISIseCk7Yy5kYXRhKHRoaXMsYSxiKTtvLnRyaWdnZXJIYW5kbGVyKCJjaGFuZ2VEYXRhIitrWzFdKyIhIix4KX0pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtjLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pO2MuZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIsZCl7aWYoYSl7Yj0oYnx8ImZ4IikrInF1ZXVlIjt2YXIgZT0KYy5kYXRhKGEsYik7aWYoIWQpcmV0dXJuIGV8fFtdO2lmKCFlfHxjLmlzQXJyYXkoZCkpZT1jLmRhdGEoYSxiLGMubWFrZUFycmF5KGQpKTtlbHNlIGUucHVzaChkKTtyZXR1cm4gZX19LGRlcXVldWU6ZnVuY3Rpb24oYSxiKXtiPWJ8fCJmeCI7dmFyIGQ9Yy5xdWV1ZShhLGIpLGU9ZC5zaGlmdCgpO2lmKGU9PT0iaW5wcm9ncmVzcyIpZT1kLnNoaWZ0KCk7aWYoZSl7Yj09PSJmeCImJmQudW5zaGlmdCgiaW5wcm9ncmVzcyIpO2UuY2FsbChhLGZ1bmN0aW9uKCl7Yy5kZXF1ZXVlKGEsYil9KX19fSk7Yy5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGEhPT0ic3RyaW5nIil7Yj1hO2E9ImZ4In1pZihiPT09QilyZXR1cm4gYy5xdWV1ZSh0aGlzWzBdLGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1jLnF1ZXVlKHRoaXMsYSxiKTthPT09ImZ4IiYmZFswXSE9PSJpbnByb2dyZXNzIiYmYy5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVxdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yy5kZXF1ZXVlKHRoaXMsCmEpfSl9LGRlbGF5OmZ1bmN0aW9uKGEsYil7YT1jLmZ4P2MuZnguc3BlZWRzW2FdfHxhOmE7Yj1ifHwiZngiO3JldHVybiB0aGlzLnF1ZXVlKGIsZnVuY3Rpb24oKXt2YXIgZD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtjLmRlcXVldWUoZCxiKX0sYSl9KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5xdWV1ZShhfHwiZngiLFtdKX19KTt2YXIgc2E9L1tcblx0XS9nLGhhPS9ccysvLFNhPS9cci9nLFRhPS9eKD86aHJlZnxzcmN8c3R5bGUpJC8sVWE9L14oPzpidXR0b258aW5wdXQpJC9pLFZhPS9eKD86YnV0dG9ufGlucHV0fG9iamVjdHxzZWxlY3R8dGV4dGFyZWEpJC9pLFdhPS9eYSg/OnJlYSk/JC9pLHRhPS9eKD86cmFkaW98Y2hlY2tib3gpJC9pO2MucHJvcHM9eyJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUiLHJlYWRvbmx5OiJyZWFkT25seSIsbWF4bGVuZ3RoOiJtYXhMZW5ndGgiLGNlbGxzcGFjaW5nOiJjZWxsU3BhY2luZyIscm93c3Bhbjoicm93U3BhbiIsCmNvbHNwYW46ImNvbFNwYW4iLHRhYmluZGV4OiJ0YWJJbmRleCIsdXNlbWFwOiJ1c2VNYXAiLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciJ9O2MuZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGMuYWNjZXNzKHRoaXMsYSxiLHRydWUsYy5hdHRyKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yy5hdHRyKHRoaXMsYSwiIik7dGhpcy5ub2RlVHlwZT09PTEmJnRoaXMucmVtb3ZlQXR0cmlidXRlKGEpfSl9LGFkZENsYXNzOmZ1bmN0aW9uKGEpe2lmKGMuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHgpe3ZhciByPWModGhpcyk7ci5hZGRDbGFzcyhhLmNhbGwodGhpcyx4LHIuYXR0cigiY2xhc3MiKSkpfSk7aWYoYSYmdHlwZW9mIGE9PT0ic3RyaW5nIilmb3IodmFyIGI9KGF8fCIiKS5zcGxpdChoYSksZD0wLGU9dGhpcy5sZW5ndGg7ZDxlO2QrKyl7dmFyIGY9dGhpc1tkXTtpZihmLm5vZGVUeXBlPT09CjEpaWYoZi5jbGFzc05hbWUpe2Zvcih2YXIgaD0iICIrZi5jbGFzc05hbWUrIiAiLGw9Zi5jbGFzc05hbWUsaz0wLG89Yi5sZW5ndGg7azxvO2srKylpZihoLmluZGV4T2YoIiAiK2Jba10rIiAiKTwwKWwrPSIgIitiW2tdO2YuY2xhc3NOYW1lPWMudHJpbShsKX1lbHNlIGYuY2xhc3NOYW1lPWF9cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGEpe2lmKGMuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG8pe3ZhciB4PWModGhpcyk7eC5yZW1vdmVDbGFzcyhhLmNhbGwodGhpcyxvLHguYXR0cigiY2xhc3MiKSkpfSk7aWYoYSYmdHlwZW9mIGE9PT0ic3RyaW5nInx8YT09PUIpZm9yKHZhciBiPShhfHwiIikuc3BsaXQoaGEpLGQ9MCxlPXRoaXMubGVuZ3RoO2Q8ZTtkKyspe3ZhciBmPXRoaXNbZF07aWYoZi5ub2RlVHlwZT09PTEmJmYuY2xhc3NOYW1lKWlmKGEpe2Zvcih2YXIgaD0oIiAiK2YuY2xhc3NOYW1lKyIgIikucmVwbGFjZShzYSwiICIpLApsPTAsaz1iLmxlbmd0aDtsPGs7bCsrKWg9aC5yZXBsYWNlKCIgIitiW2xdKyIgIiwiICIpO2YuY2xhc3NOYW1lPWMudHJpbShoKX1lbHNlIGYuY2xhc3NOYW1lPSIifXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbihhLGIpe3ZhciBkPXR5cGVvZiBhLGU9dHlwZW9mIGI9PT0iYm9vbGVhbiI7aWYoYy5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZil7dmFyIGg9Yyh0aGlzKTtoLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGYsaC5hdHRyKCJjbGFzcyIpLGIpLGIpfSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2lmKGQ9PT0ic3RyaW5nIilmb3IodmFyIGYsaD0wLGw9Yyh0aGlzKSxrPWIsbz1hLnNwbGl0KGhhKTtmPW9baCsrXTspe2s9ZT9rOiFsLmhhc0NsYXNzKGYpO2xbaz8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFzcyJdKGYpfWVsc2UgaWYoZD09PSJ1bmRlZmluZWQifHxkPT09ImJvb2xlYW4iKXt0aGlzLmNsYXNzTmFtZSYmYy5kYXRhKHRoaXMsCiJfX2NsYXNzTmFtZV9fIix0aGlzLmNsYXNzTmFtZSk7dGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWV8fGE9PT1mYWxzZT8iIjpjLmRhdGEodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIn19KX0saGFzQ2xhc3M6ZnVuY3Rpb24oYSl7YT0iICIrYSsiICI7Zm9yKHZhciBiPTAsZD10aGlzLmxlbmd0aDtiPGQ7YisrKWlmKCgiICIrdGhpc1tiXS5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKHNhLCIgIikuaW5kZXhPZihhKT4tMSlyZXR1cm4gdHJ1ZTtyZXR1cm4gZmFsc2V9LHZhbDpmdW5jdGlvbihhKXtpZighYXJndW1lbnRzLmxlbmd0aCl7dmFyIGI9dGhpc1swXTtpZihiKXtpZihjLm5vZGVOYW1lKGIsIm9wdGlvbiIpKXt2YXIgZD1iLmF0dHJpYnV0ZXMudmFsdWU7cmV0dXJuIWR8fGQuc3BlY2lmaWVkP2IudmFsdWU6Yi50ZXh0fWlmKGMubm9kZU5hbWUoYiwic2VsZWN0Iikpe3ZhciBlPWIuc2VsZWN0ZWRJbmRleDtkPVtdO3ZhciBmPWIub3B0aW9ucztiPWIudHlwZT09PSJzZWxlY3Qtb25lIjsKaWYoZTwwKXJldHVybiBudWxsO3ZhciBoPWI/ZTowO2ZvcihlPWI/ZSsxOmYubGVuZ3RoO2g8ZTtoKyspe3ZhciBsPWZbaF07aWYobC5zZWxlY3RlZCYmKGMuc3VwcG9ydC5vcHREaXNhYmxlZD8hbC5kaXNhYmxlZDpsLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKT09PW51bGwpJiYoIWwucGFyZW50Tm9kZS5kaXNhYmxlZHx8IWMubm9kZU5hbWUobC5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7YT1jKGwpLnZhbCgpO2lmKGIpcmV0dXJuIGE7ZC5wdXNoKGEpfX1yZXR1cm4gZH1pZih0YS50ZXN0KGIudHlwZSkmJiFjLnN1cHBvcnQuY2hlY2tPbilyZXR1cm4gYi5nZXRBdHRyaWJ1dGUoInZhbHVlIik9PT1udWxsPyJvbiI6Yi52YWx1ZTtyZXR1cm4oYi52YWx1ZXx8IiIpLnJlcGxhY2UoU2EsIiIpfXJldHVybiBCfXZhciBrPWMuaXNGdW5jdGlvbihhKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG8pe3ZhciB4PWModGhpcykscj1hO2lmKHRoaXMubm9kZVR5cGU9PT0xKXtpZihrKXI9CmEuY2FsbCh0aGlzLG8seC52YWwoKSk7aWYocj09bnVsbClyPSIiO2Vsc2UgaWYodHlwZW9mIHI9PT0ibnVtYmVyIilyKz0iIjtlbHNlIGlmKGMuaXNBcnJheShyKSlyPWMubWFwKHIsZnVuY3Rpb24oQyl7cmV0dXJuIEM9PW51bGw/IiI6QysiIn0pO2lmKGMuaXNBcnJheShyKSYmdGEudGVzdCh0aGlzLnR5cGUpKXRoaXMuY2hlY2tlZD1jLmluQXJyYXkoeC52YWwoKSxyKT49MDtlbHNlIGlmKGMubm9kZU5hbWUodGhpcywic2VsZWN0Iikpe3ZhciBBPWMubWFrZUFycmF5KHIpO2MoIm9wdGlvbiIsdGhpcykuZWFjaChmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWQ9Yy5pbkFycmF5KGModGhpcykudmFsKCksQSk+PTB9KTtpZighQS5sZW5ndGgpdGhpcy5zZWxlY3RlZEluZGV4PS0xfWVsc2UgdGhpcy52YWx1ZT1yfX0pfX0pO2MuZXh0ZW5kKHthdHRyRm46e3ZhbDp0cnVlLGNzczp0cnVlLGh0bWw6dHJ1ZSx0ZXh0OnRydWUsZGF0YTp0cnVlLHdpZHRoOnRydWUsaGVpZ2h0OnRydWUsb2Zmc2V0OnRydWV9LAphdHRyOmZ1bmN0aW9uKGEsYixkLGUpe2lmKCFhfHxhLm5vZGVUeXBlPT09M3x8YS5ub2RlVHlwZT09PTgpcmV0dXJuIEI7aWYoZSYmYiBpbiBjLmF0dHJGbilyZXR1cm4gYyhhKVtiXShkKTtlPWEubm9kZVR5cGUhPT0xfHwhYy5pc1hNTERvYyhhKTt2YXIgZj1kIT09QjtiPWUmJmMucHJvcHNbYl18fGI7dmFyIGg9VGEudGVzdChiKTtpZigoYiBpbiBhfHxhW2JdIT09QikmJmUmJiFoKXtpZihmKXtiPT09InR5cGUiJiZVYS50ZXN0KGEubm9kZU5hbWUpJiZhLnBhcmVudE5vZGUmJmMuZXJyb3IoInR5cGUgcHJvcGVydHkgY2FuJ3QgYmUgY2hhbmdlZCIpO2lmKGQ9PT1udWxsKWEubm9kZVR5cGU9PT0xJiZhLnJlbW92ZUF0dHJpYnV0ZShiKTtlbHNlIGFbYl09ZH1pZihjLm5vZGVOYW1lKGEsImZvcm0iKSYmYS5nZXRBdHRyaWJ1dGVOb2RlKGIpKXJldHVybiBhLmdldEF0dHJpYnV0ZU5vZGUoYikubm9kZVZhbHVlO2lmKGI9PT0idGFiSW5kZXgiKXJldHVybihiPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiSW5kZXgiKSkmJgpiLnNwZWNpZmllZD9iLnZhbHVlOlZhLnRlc3QoYS5ub2RlTmFtZSl8fFdhLnRlc3QoYS5ub2RlTmFtZSkmJmEuaHJlZj8wOkI7cmV0dXJuIGFbYl19aWYoIWMuc3VwcG9ydC5zdHlsZSYmZSYmYj09PSJzdHlsZSIpe2lmKGYpYS5zdHlsZS5jc3NUZXh0PSIiK2Q7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dH1mJiZhLnNldEF0dHJpYnV0ZShiLCIiK2QpO2lmKCFhLmF0dHJpYnV0ZXNbYl0mJmEuaGFzQXR0cmlidXRlJiYhYS5oYXNBdHRyaWJ1dGUoYikpcmV0dXJuIEI7YT0hYy5zdXBwb3J0LmhyZWZOb3JtYWxpemVkJiZlJiZoP2EuZ2V0QXR0cmlidXRlKGIsMik6YS5nZXRBdHRyaWJ1dGUoYik7cmV0dXJuIGE9PT1udWxsP0I6YX19KTt2YXIgWD0vXC4oLiopJC8saWE9L14oPzp0ZXh0YXJlYXxpbnB1dHxzZWxlY3QpJC9pLExhPS9cLi9nLE1hPS8gL2csWGE9L1teXHdccy58YF0vZyxZYT1mdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKFhhLCJcXCQmIil9LHVhPXtmb2N1c2luOjAsZm9jdXNvdXQ6MH07CmMuZXZlbnQ9e2FkZDpmdW5jdGlvbihhLGIsZCxlKXtpZighKGEubm9kZVR5cGU9PT0zfHxhLm5vZGVUeXBlPT09OCkpe2lmKGMuaXNXaW5kb3coYSkmJmEhPT1FJiYhYS5mcmFtZUVsZW1lbnQpYT1FO2lmKGQ9PT1mYWxzZSlkPVU7ZWxzZSBpZighZClyZXR1cm47dmFyIGYsaDtpZihkLmhhbmRsZXIpe2Y9ZDtkPWYuaGFuZGxlcn1pZighZC5ndWlkKWQuZ3VpZD1jLmd1aWQrKztpZihoPWMuZGF0YShhKSl7dmFyIGw9YS5ub2RlVHlwZT8iZXZlbnRzIjoiX19ldmVudHNfXyIsaz1oW2xdLG89aC5oYW5kbGU7aWYodHlwZW9mIGs9PT0iZnVuY3Rpb24iKXtvPWsuaGFuZGxlO2s9ay5ldmVudHN9ZWxzZSBpZighayl7YS5ub2RlVHlwZXx8KGhbbF09aD1mdW5jdGlvbigpe30pO2guZXZlbnRzPWs9e319aWYoIW8paC5oYW5kbGU9bz1mdW5jdGlvbigpe3JldHVybiB0eXBlb2YgYyE9PSJ1bmRlZmluZWQiJiYhYy5ldmVudC50cmlnZ2VyZWQ/Yy5ldmVudC5oYW5kbGUuYXBwbHkoby5lbGVtLAphcmd1bWVudHMpOkJ9O28uZWxlbT1hO2I9Yi5zcGxpdCgiICIpO2Zvcih2YXIgeD0wLHI7bD1iW3grK107KXtoPWY/Yy5leHRlbmQoe30sZik6e2hhbmRsZXI6ZCxkYXRhOmV9O2lmKGwuaW5kZXhPZigiLiIpPi0xKXtyPWwuc3BsaXQoIi4iKTtsPXIuc2hpZnQoKTtoLm5hbWVzcGFjZT1yLnNsaWNlKDApLnNvcnQoKS5qb2luKCIuIil9ZWxzZXtyPVtdO2gubmFtZXNwYWNlPSIifWgudHlwZT1sO2lmKCFoLmd1aWQpaC5ndWlkPWQuZ3VpZDt2YXIgQT1rW2xdLEM9Yy5ldmVudC5zcGVjaWFsW2xdfHx7fTtpZighQSl7QT1rW2xdPVtdO2lmKCFDLnNldHVwfHxDLnNldHVwLmNhbGwoYSxlLHIsbyk9PT1mYWxzZSlpZihhLmFkZEV2ZW50TGlzdGVuZXIpYS5hZGRFdmVudExpc3RlbmVyKGwsbyxmYWxzZSk7ZWxzZSBhLmF0dGFjaEV2ZW50JiZhLmF0dGFjaEV2ZW50KCJvbiIrbCxvKX1pZihDLmFkZCl7Qy5hZGQuY2FsbChhLGgpO2lmKCFoLmhhbmRsZXIuZ3VpZCloLmhhbmRsZXIuZ3VpZD0KZC5ndWlkfUEucHVzaChoKTtjLmV2ZW50Lmdsb2JhbFtsXT10cnVlfWE9bnVsbH19fSxnbG9iYWw6e30scmVtb3ZlOmZ1bmN0aW9uKGEsYixkLGUpe2lmKCEoYS5ub2RlVHlwZT09PTN8fGEubm9kZVR5cGU9PT04KSl7aWYoZD09PWZhbHNlKWQ9VTt2YXIgZixoLGw9MCxrLG8seCxyLEEsQyxKPWEubm9kZVR5cGU/ImV2ZW50cyI6Il9fZXZlbnRzX18iLHc9Yy5kYXRhKGEpLEk9dyYmd1tKXTtpZih3JiZJKXtpZih0eXBlb2YgST09PSJmdW5jdGlvbiIpe3c9STtJPUkuZXZlbnRzfWlmKGImJmIudHlwZSl7ZD1iLmhhbmRsZXI7Yj1iLnR5cGV9aWYoIWJ8fHR5cGVvZiBiPT09InN0cmluZyImJmIuY2hhckF0KDApPT09Ii4iKXtiPWJ8fCIiO2ZvcihmIGluIEkpYy5ldmVudC5yZW1vdmUoYSxmK2IpfWVsc2V7Zm9yKGI9Yi5zcGxpdCgiICIpO2Y9YltsKytdOyl7cj1mO2s9Zi5pbmRleE9mKCIuIik8MDtvPVtdO2lmKCFrKXtvPWYuc3BsaXQoIi4iKTtmPW8uc2hpZnQoKTt4PVJlZ0V4cCgiKF58XFwuKSIrCmMubWFwKG8uc2xpY2UoMCkuc29ydCgpLFlhKS5qb2luKCJcXC4oPzouKlxcLik/IikrIihcXC58JCkiKX1pZihBPUlbZl0paWYoZCl7cj1jLmV2ZW50LnNwZWNpYWxbZl18fHt9O2ZvcihoPWV8fDA7aDxBLmxlbmd0aDtoKyspe0M9QVtoXTtpZihkLmd1aWQ9PT1DLmd1aWQpe2lmKGt8fHgudGVzdChDLm5hbWVzcGFjZSkpe2U9PW51bGwmJkEuc3BsaWNlKGgtLSwxKTtyLnJlbW92ZSYmci5yZW1vdmUuY2FsbChhLEMpfWlmKGUhPW51bGwpYnJlYWt9fWlmKEEubGVuZ3RoPT09MHx8ZSE9bnVsbCYmQS5sZW5ndGg9PT0xKXtpZighci50ZWFyZG93bnx8ci50ZWFyZG93bi5jYWxsKGEsbyk9PT1mYWxzZSljLnJlbW92ZUV2ZW50KGEsZix3LmhhbmRsZSk7ZGVsZXRlIElbZl19fWVsc2UgZm9yKGg9MDtoPEEubGVuZ3RoO2grKyl7Qz1BW2hdO2lmKGt8fHgudGVzdChDLm5hbWVzcGFjZSkpe2MuZXZlbnQucmVtb3ZlKGEscixDLmhhbmRsZXIsaCk7QS5zcGxpY2UoaC0tLDEpfX19aWYoYy5pc0VtcHR5T2JqZWN0KEkpKXtpZihiPQp3LmhhbmRsZSliLmVsZW09bnVsbDtkZWxldGUgdy5ldmVudHM7ZGVsZXRlIHcuaGFuZGxlO2lmKHR5cGVvZiB3PT09ImZ1bmN0aW9uIiljLnJlbW92ZURhdGEoYSxKKTtlbHNlIGMuaXNFbXB0eU9iamVjdCh3KSYmYy5yZW1vdmVEYXRhKGEpfX19fX0sdHJpZ2dlcjpmdW5jdGlvbihhLGIsZCxlKXt2YXIgZj1hLnR5cGV8fGE7aWYoIWUpe2E9dHlwZW9mIGE9PT0ib2JqZWN0Ij9hW2MuZXhwYW5kb10/YTpjLmV4dGVuZChjLkV2ZW50KGYpLGEpOmMuRXZlbnQoZik7aWYoZi5pbmRleE9mKCIhIik+PTApe2EudHlwZT1mPWYuc2xpY2UoMCwtMSk7YS5leGNsdXNpdmU9dHJ1ZX1pZighZCl7YS5zdG9wUHJvcGFnYXRpb24oKTtjLmV2ZW50Lmdsb2JhbFtmXSYmYy5lYWNoKGMuY2FjaGUsZnVuY3Rpb24oKXt0aGlzLmV2ZW50cyYmdGhpcy5ldmVudHNbZl0mJmMuZXZlbnQudHJpZ2dlcihhLGIsdGhpcy5oYW5kbGUuZWxlbSl9KX1pZighZHx8ZC5ub2RlVHlwZT09PTN8fGQubm9kZVR5cGU9PT0KOClyZXR1cm4gQjthLnJlc3VsdD1CO2EudGFyZ2V0PWQ7Yj1jLm1ha2VBcnJheShiKTtiLnVuc2hpZnQoYSl9YS5jdXJyZW50VGFyZ2V0PWQ7KGU9ZC5ub2RlVHlwZT9jLmRhdGEoZCwiaGFuZGxlIik6KGMuZGF0YShkLCJfX2V2ZW50c19fIil8fHt9KS5oYW5kbGUpJiZlLmFwcGx5KGQsYik7ZT1kLnBhcmVudE5vZGV8fGQub3duZXJEb2N1bWVudDt0cnl7aWYoIShkJiZkLm5vZGVOYW1lJiZjLm5vRGF0YVtkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSlpZihkWyJvbiIrZl0mJmRbIm9uIitmXS5hcHBseShkLGIpPT09ZmFsc2Upe2EucmVzdWx0PWZhbHNlO2EucHJldmVudERlZmF1bHQoKX19Y2F0Y2goaCl7fWlmKCFhLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmUpYy5ldmVudC50cmlnZ2VyKGEsYixlLHRydWUpO2Vsc2UgaWYoIWEuaXNEZWZhdWx0UHJldmVudGVkKCkpe3ZhciBsO2U9YS50YXJnZXQ7dmFyIGs9Zi5yZXBsYWNlKFgsIiIpLG89Yy5ub2RlTmFtZShlLCJhIikmJms9PT0KImNsaWNrIix4PWMuZXZlbnQuc3BlY2lhbFtrXXx8e307aWYoKCF4Ll9kZWZhdWx0fHx4Ll9kZWZhdWx0LmNhbGwoZCxhKT09PWZhbHNlKSYmIW8mJiEoZSYmZS5ub2RlTmFtZSYmYy5ub0RhdGFbZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkpe3RyeXtpZihlW2tdKXtpZihsPWVbIm9uIitrXSllWyJvbiIra109bnVsbDtjLmV2ZW50LnRyaWdnZXJlZD10cnVlO2Vba10oKX19Y2F0Y2gocil7fWlmKGwpZVsib24iK2tdPWw7Yy5ldmVudC50cmlnZ2VyZWQ9ZmFsc2V9fX0saGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBiLGQsZSxmO2Q9W107dmFyIGg9Yy5tYWtlQXJyYXkoYXJndW1lbnRzKTthPWhbMF09Yy5ldmVudC5maXgoYXx8RS5ldmVudCk7YS5jdXJyZW50VGFyZ2V0PXRoaXM7Yj1hLnR5cGUuaW5kZXhPZigiLiIpPDAmJiFhLmV4Y2x1c2l2ZTtpZighYil7ZT1hLnR5cGUuc3BsaXQoIi4iKTthLnR5cGU9ZS5zaGlmdCgpO2Q9ZS5zbGljZSgwKS5zb3J0KCk7ZT1SZWdFeHAoIihefFxcLikiKwpkLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSsiKFxcLnwkKSIpfWEubmFtZXNwYWNlPWEubmFtZXNwYWNlfHxkLmpvaW4oIi4iKTtmPWMuZGF0YSh0aGlzLHRoaXMubm9kZVR5cGU/ImV2ZW50cyI6Il9fZXZlbnRzX18iKTtpZih0eXBlb2YgZj09PSJmdW5jdGlvbiIpZj1mLmV2ZW50cztkPShmfHx7fSlbYS50eXBlXTtpZihmJiZkKXtkPWQuc2xpY2UoMCk7Zj0wO2Zvcih2YXIgbD1kLmxlbmd0aDtmPGw7ZisrKXt2YXIgaz1kW2ZdO2lmKGJ8fGUudGVzdChrLm5hbWVzcGFjZSkpe2EuaGFuZGxlcj1rLmhhbmRsZXI7YS5kYXRhPWsuZGF0YTthLmhhbmRsZU9iaj1rO2s9ay5oYW5kbGVyLmFwcGx5KHRoaXMsaCk7aWYoayE9PUIpe2EucmVzdWx0PWs7aWYoaz09PWZhbHNlKXthLnByZXZlbnREZWZhdWx0KCk7YS5zdG9wUHJvcGFnYXRpb24oKX19aWYoYS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKWJyZWFrfX19cmV0dXJuIGEucmVzdWx0fSxwcm9wczoiYWx0S2V5IGF0dHJDaGFuZ2UgYXR0ck5hbWUgYnViYmxlcyBidXR0b24gY2FuY2VsYWJsZSBjaGFyQ29kZSBjbGllbnRYIGNsaWVudFkgY3RybEtleSBjdXJyZW50VGFyZ2V0IGRhdGEgZGV0YWlsIGV2ZW50UGhhc2UgZnJvbUVsZW1lbnQgaGFuZGxlciBrZXlDb2RlIGxheWVyWCBsYXllclkgbWV0YUtleSBuZXdWYWx1ZSBvZmZzZXRYIG9mZnNldFkgcGFnZVggcGFnZVkgcHJldlZhbHVlIHJlbGF0ZWROb2RlIHJlbGF0ZWRUYXJnZXQgc2NyZWVuWCBzY3JlZW5ZIHNoaWZ0S2V5IHNyY0VsZW1lbnQgdGFyZ2V0IHRvRWxlbWVudCB2aWV3IHdoZWVsRGVsdGEgd2hpY2giLnNwbGl0KCIgIiksCmZpeDpmdW5jdGlvbihhKXtpZihhW2MuZXhwYW5kb10pcmV0dXJuIGE7dmFyIGI9YTthPWMuRXZlbnQoYik7Zm9yKHZhciBkPXRoaXMucHJvcHMubGVuZ3RoLGU7ZDspe2U9dGhpcy5wcm9wc1stLWRdO2FbZV09YltlXX1pZighYS50YXJnZXQpYS50YXJnZXQ9YS5zcmNFbGVtZW50fHx0O2lmKGEudGFyZ2V0Lm5vZGVUeXBlPT09MylhLnRhcmdldD1hLnRhcmdldC5wYXJlbnROb2RlO2lmKCFhLnJlbGF0ZWRUYXJnZXQmJmEuZnJvbUVsZW1lbnQpYS5yZWxhdGVkVGFyZ2V0PWEuZnJvbUVsZW1lbnQ9PT1hLnRhcmdldD9hLnRvRWxlbWVudDphLmZyb21FbGVtZW50O2lmKGEucGFnZVg9PW51bGwmJmEuY2xpZW50WCE9bnVsbCl7Yj10LmRvY3VtZW50RWxlbWVudDtkPXQuYm9keTthLnBhZ2VYPWEuY2xpZW50WCsoYiYmYi5zY3JvbGxMZWZ0fHxkJiZkLnNjcm9sbExlZnR8fDApLShiJiZiLmNsaWVudExlZnR8fGQmJmQuY2xpZW50TGVmdHx8MCk7YS5wYWdlWT1hLmNsaWVudFkrKGImJmIuc2Nyb2xsVG9wfHwKZCYmZC5zY3JvbGxUb3B8fDApLShiJiZiLmNsaWVudFRvcHx8ZCYmZC5jbGllbnRUb3B8fDApfWlmKGEud2hpY2g9PW51bGwmJihhLmNoYXJDb2RlIT1udWxsfHxhLmtleUNvZGUhPW51bGwpKWEud2hpY2g9YS5jaGFyQ29kZSE9bnVsbD9hLmNoYXJDb2RlOmEua2V5Q29kZTtpZighYS5tZXRhS2V5JiZhLmN0cmxLZXkpYS5tZXRhS2V5PWEuY3RybEtleTtpZighYS53aGljaCYmYS5idXR0b24hPT1CKWEud2hpY2g9YS5idXR0b24mMT8xOmEuYnV0dG9uJjI/MzphLmJ1dHRvbiY0PzI6MDtyZXR1cm4gYX0sZ3VpZDoxRTgscHJveHk6Yy5wcm94eSxzcGVjaWFsOntyZWFkeTp7c2V0dXA6Yy5iaW5kUmVhZHksdGVhcmRvd246Yy5ub29wfSxsaXZlOnthZGQ6ZnVuY3Rpb24oYSl7Yy5ldmVudC5hZGQodGhpcyxZKGEub3JpZ1R5cGUsYS5zZWxlY3RvciksYy5leHRlbmQoe30sYSx7aGFuZGxlcjpLYSxndWlkOmEuaGFuZGxlci5ndWlkfSkpfSxyZW1vdmU6ZnVuY3Rpb24oYSl7Yy5ldmVudC5yZW1vdmUodGhpcywKWShhLm9yaWdUeXBlLGEuc2VsZWN0b3IpLGEpfX0sYmVmb3JldW5sb2FkOntzZXR1cDpmdW5jdGlvbihhLGIsZCl7aWYoYy5pc1dpbmRvdyh0aGlzKSl0aGlzLm9uYmVmb3JldW5sb2FkPWR9LHRlYXJkb3duOmZ1bmN0aW9uKGEsYil7aWYodGhpcy5vbmJlZm9yZXVubG9hZD09PWIpdGhpcy5vbmJlZm9yZXVubG9hZD1udWxsfX19fTtjLnJlbW92ZUV2ZW50PXQucmVtb3ZlRXZlbnRMaXN0ZW5lcj9mdW5jdGlvbihhLGIsZCl7YS5yZW1vdmVFdmVudExpc3RlbmVyJiZhLnJlbW92ZUV2ZW50TGlzdGVuZXIoYixkLGZhbHNlKX06ZnVuY3Rpb24oYSxiLGQpe2EuZGV0YWNoRXZlbnQmJmEuZGV0YWNoRXZlbnQoIm9uIitiLGQpfTtjLkV2ZW50PWZ1bmN0aW9uKGEpe2lmKCF0aGlzLnByZXZlbnREZWZhdWx0KXJldHVybiBuZXcgYy5FdmVudChhKTtpZihhJiZhLnR5cGUpe3RoaXMub3JpZ2luYWxFdmVudD1hO3RoaXMudHlwZT1hLnR5cGV9ZWxzZSB0aGlzLnR5cGU9YTt0aGlzLnRpbWVTdGFtcD0KYy5ub3coKTt0aGlzW2MuZXhwYW5kb109dHJ1ZX07Yy5FdmVudC5wcm90b3R5cGU9e3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9Y2E7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O2lmKGEpaWYoYS5wcmV2ZW50RGVmYXVsdClhLnByZXZlbnREZWZhdWx0KCk7ZWxzZSBhLnJldHVyblZhbHVlPWZhbHNlfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPWNhO3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDtpZihhKXthLnN0b3BQcm9wYWdhdGlvbiYmYS5zdG9wUHJvcGFnYXRpb24oKTthLmNhbmNlbEJ1YmJsZT10cnVlfX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1jYTt0aGlzLnN0b3BQcm9wYWdhdGlvbigpfSxpc0RlZmF1bHRQcmV2ZW50ZWQ6VSxpc1Byb3BhZ2F0aW9uU3RvcHBlZDpVLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOlV9Owp2YXIgdmE9ZnVuY3Rpb24oYSl7dmFyIGI9YS5yZWxhdGVkVGFyZ2V0O3RyeXtmb3IoO2ImJmIhPT10aGlzOyliPWIucGFyZW50Tm9kZTtpZihiIT09dGhpcyl7YS50eXBlPWEuZGF0YTtjLmV2ZW50LmhhbmRsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWNhdGNoKGQpe319LHdhPWZ1bmN0aW9uKGEpe2EudHlwZT1hLmRhdGE7Yy5ldmVudC5oYW5kbGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtjLmVhY2goe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSxmdW5jdGlvbihhLGIpe2MuZXZlbnQuc3BlY2lhbFthXT17c2V0dXA6ZnVuY3Rpb24oZCl7Yy5ldmVudC5hZGQodGhpcyxiLGQmJmQuc2VsZWN0b3I/d2E6dmEsYSl9LHRlYXJkb3duOmZ1bmN0aW9uKGQpe2MuZXZlbnQucmVtb3ZlKHRoaXMsYixkJiZkLnNlbGVjdG9yP3dhOnZhKX19fSk7aWYoIWMuc3VwcG9ydC5zdWJtaXRCdWJibGVzKWMuZXZlbnQuc3BlY2lhbC5zdWJtaXQ9e3NldHVwOmZ1bmN0aW9uKCl7aWYodGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09CiJmb3JtIil7Yy5ldmVudC5hZGQodGhpcywiY2xpY2suc3BlY2lhbFN1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsZD1iLnR5cGU7aWYoKGQ9PT0ic3VibWl0Inx8ZD09PSJpbWFnZSIpJiZjKGIpLmNsb3Nlc3QoImZvcm0iKS5sZW5ndGgpe2EubGl2ZUZpcmVkPUI7cmV0dXJuIGxhKCJzdWJtaXQiLHRoaXMsYXJndW1lbnRzKX19KTtjLmV2ZW50LmFkZCh0aGlzLCJrZXlwcmVzcy5zcGVjaWFsU3VibWl0IixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldCxkPWIudHlwZTtpZigoZD09PSJ0ZXh0Inx8ZD09PSJwYXNzd29yZCIpJiZjKGIpLmNsb3Nlc3QoImZvcm0iKS5sZW5ndGgmJmEua2V5Q29kZT09PTEzKXthLmxpdmVGaXJlZD1CO3JldHVybiBsYSgic3VibWl0Iix0aGlzLGFyZ3VtZW50cyl9fSl9ZWxzZSByZXR1cm4gZmFsc2V9LHRlYXJkb3duOmZ1bmN0aW9uKCl7Yy5ldmVudC5yZW1vdmUodGhpcywiLnNwZWNpYWxTdWJtaXQiKX19O2lmKCFjLnN1cHBvcnQuY2hhbmdlQnViYmxlcyl7dmFyIFYsCnhhPWZ1bmN0aW9uKGEpe3ZhciBiPWEudHlwZSxkPWEudmFsdWU7aWYoYj09PSJyYWRpbyJ8fGI9PT0iY2hlY2tib3giKWQ9YS5jaGVja2VkO2Vsc2UgaWYoYj09PSJzZWxlY3QtbXVsdGlwbGUiKWQ9YS5zZWxlY3RlZEluZGV4Pi0xP2MubWFwKGEub3B0aW9ucyxmdW5jdGlvbihlKXtyZXR1cm4gZS5zZWxlY3RlZH0pLmpvaW4oIi0iKToiIjtlbHNlIGlmKGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJzZWxlY3QiKWQ9YS5zZWxlY3RlZEluZGV4O3JldHVybiBkfSxaPWZ1bmN0aW9uKGEsYil7dmFyIGQ9YS50YXJnZXQsZSxmO2lmKCEoIWlhLnRlc3QoZC5ub2RlTmFtZSl8fGQucmVhZE9ubHkpKXtlPWMuZGF0YShkLCJfY2hhbmdlX2RhdGEiKTtmPXhhKGQpO2lmKGEudHlwZSE9PSJmb2N1c291dCJ8fGQudHlwZSE9PSJyYWRpbyIpYy5kYXRhKGQsIl9jaGFuZ2VfZGF0YSIsZik7aWYoIShlPT09Qnx8Zj09PWUpKWlmKGUhPW51bGx8fGYpe2EudHlwZT0iY2hhbmdlIjthLmxpdmVGaXJlZD0KQjtyZXR1cm4gYy5ldmVudC50cmlnZ2VyKGEsYixkKX19fTtjLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtmaWx0ZXJzOntmb2N1c291dDpaLGJlZm9yZWRlYWN0aXZhdGU6WixjbGljazpmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldCxkPWIudHlwZTtpZihkPT09InJhZGlvInx8ZD09PSJjaGVja2JveCJ8fGIubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJzZWxlY3QiKXJldHVybiBaLmNhbGwodGhpcyxhKX0sa2V5ZG93bjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldCxkPWIudHlwZTtpZihhLmtleUNvZGU9PT0xMyYmYi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09InRleHRhcmVhInx8YS5rZXlDb2RlPT09MzImJihkPT09ImNoZWNrYm94Inx8ZD09PSJyYWRpbyIpfHxkPT09InNlbGVjdC1tdWx0aXBsZSIpcmV0dXJuIFouY2FsbCh0aGlzLGEpfSxiZWZvcmVhY3RpdmF0ZTpmdW5jdGlvbihhKXthPWEudGFyZ2V0O2MuZGF0YShhLCJfY2hhbmdlX2RhdGEiLHhhKGEpKX19LHNldHVwOmZ1bmN0aW9uKCl7aWYodGhpcy50eXBlPT09CiJmaWxlIilyZXR1cm4gZmFsc2U7Zm9yKHZhciBhIGluIFYpYy5ldmVudC5hZGQodGhpcyxhKyIuc3BlY2lhbENoYW5nZSIsVlthXSk7cmV0dXJuIGlhLnRlc3QodGhpcy5ub2RlTmFtZSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7Yy5ldmVudC5yZW1vdmUodGhpcywiLnNwZWNpYWxDaGFuZ2UiKTtyZXR1cm4gaWEudGVzdCh0aGlzLm5vZGVOYW1lKX19O1Y9Yy5ldmVudC5zcGVjaWFsLmNoYW5nZS5maWx0ZXJzO1YuZm9jdXM9Vi5iZWZvcmVhY3RpdmF0ZX10LmFkZEV2ZW50TGlzdGVuZXImJmMuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBkKGUpe2U9Yy5ldmVudC5maXgoZSk7ZS50eXBlPWI7cmV0dXJuIGMuZXZlbnQudHJpZ2dlcihlLG51bGwsZS50YXJnZXQpfWMuZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXt1YVtiXSsrPT09MCYmdC5hZGRFdmVudExpc3RlbmVyKGEsZCx0cnVlKX0sdGVhcmRvd246ZnVuY3Rpb24oKXstLXVhW2JdPT09CjAmJnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGQsdHJ1ZSl9fX0pO2MuZWFjaChbImJpbmQiLCJvbmUiXSxmdW5jdGlvbihhLGIpe2MuZm5bYl09ZnVuY3Rpb24oZCxlLGYpe2lmKHR5cGVvZiBkPT09Im9iamVjdCIpe2Zvcih2YXIgaCBpbiBkKXRoaXNbYl0oaCxlLGRbaF0sZik7cmV0dXJuIHRoaXN9aWYoYy5pc0Z1bmN0aW9uKGUpfHxlPT09ZmFsc2Upe2Y9ZTtlPUJ9dmFyIGw9Yj09PSJvbmUiP2MucHJveHkoZixmdW5jdGlvbihvKXtjKHRoaXMpLnVuYmluZChvLGwpO3JldHVybiBmLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pOmY7aWYoZD09PSJ1bmxvYWQiJiZiIT09Im9uZSIpdGhpcy5vbmUoZCxlLGYpO2Vsc2V7aD0wO2Zvcih2YXIgaz10aGlzLmxlbmd0aDtoPGs7aCsrKWMuZXZlbnQuYWRkKHRoaXNbaF0sZCxsLGUpfXJldHVybiB0aGlzfX0pO2MuZm4uZXh0ZW5kKHt1bmJpbmQ6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYT09PSJvYmplY3QiJiYhYS5wcmV2ZW50RGVmYXVsdClmb3IodmFyIGQgaW4gYSl0aGlzLnVuYmluZChkLAphW2RdKTtlbHNle2Q9MDtmb3IodmFyIGU9dGhpcy5sZW5ndGg7ZDxlO2QrKyljLmV2ZW50LnJlbW92ZSh0aGlzW2RdLGEsYil9cmV0dXJuIHRoaXN9LGRlbGVnYXRlOmZ1bmN0aW9uKGEsYixkLGUpe3JldHVybiB0aGlzLmxpdmUoYixkLGUsYSl9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPT09MD90aGlzLnVuYmluZCgibGl2ZSIpOnRoaXMuZGllKGIsbnVsbCxkLGEpfSx0cmlnZ2VyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2MuZXZlbnQudHJpZ2dlcihhLGIsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oYSxiKXtpZih0aGlzWzBdKXt2YXIgZD1jLkV2ZW50KGEpO2QucHJldmVudERlZmF1bHQoKTtkLnN0b3BQcm9wYWdhdGlvbigpO2MuZXZlbnQudHJpZ2dlcihkLGIsdGhpc1swXSk7cmV0dXJuIGQucmVzdWx0fX0sdG9nZ2xlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1hcmd1bWVudHMsZD0KMTtkPGIubGVuZ3RoOyljLnByb3h5KGEsYltkKytdKTtyZXR1cm4gdGhpcy5jbGljayhjLnByb3h5KGEsZnVuY3Rpb24oZSl7dmFyIGY9KGMuZGF0YSh0aGlzLCJsYXN0VG9nZ2xlIithLmd1aWQpfHwwKSVkO2MuZGF0YSh0aGlzLCJsYXN0VG9nZ2xlIithLmd1aWQsZisxKTtlLnByZXZlbnREZWZhdWx0KCk7cmV0dXJuIGJbZl0uYXBwbHkodGhpcyxhcmd1bWVudHMpfHxmYWxzZX0pKX0saG92ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGEpLm1vdXNlbGVhdmUoYnx8YSl9fSk7dmFyIHlhPXtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQiLG1vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifTtjLmVhY2goWyJsaXZlIiwiZGllIl0sZnVuY3Rpb24oYSxiKXtjLmZuW2JdPWZ1bmN0aW9uKGQsZSxmLGgpe3ZhciBsLGs9MCxvLHgscj1ofHx0aGlzLnNlbGVjdG9yO2g9aD90aGlzOmModGhpcy5jb250ZXh0KTtpZih0eXBlb2YgZD09PQoib2JqZWN0IiYmIWQucHJldmVudERlZmF1bHQpe2ZvcihsIGluIGQpaFtiXShsLGUsZFtsXSxyKTtyZXR1cm4gdGhpc31pZihjLmlzRnVuY3Rpb24oZSkpe2Y9ZTtlPUJ9Zm9yKGQ9KGR8fCIiKS5zcGxpdCgiICIpOyhsPWRbaysrXSkhPW51bGw7KXtvPVguZXhlYyhsKTt4PSIiO2lmKG8pe3g9b1swXTtsPWwucmVwbGFjZShYLCIiKX1pZihsPT09ImhvdmVyIilkLnB1c2goIm1vdXNlZW50ZXIiK3gsIm1vdXNlbGVhdmUiK3gpO2Vsc2V7bz1sO2lmKGw9PT0iZm9jdXMifHxsPT09ImJsdXIiKXtkLnB1c2goeWFbbF0reCk7bCs9eH1lbHNlIGw9KHlhW2xdfHxsKSt4O2lmKGI9PT0ibGl2ZSIpe3g9MDtmb3IodmFyIEE9aC5sZW5ndGg7eDxBO3grKyljLmV2ZW50LmFkZChoW3hdLCJsaXZlLiIrWShsLHIpLHtkYXRhOmUsc2VsZWN0b3I6cixoYW5kbGVyOmYsb3JpZ1R5cGU6bCxvcmlnSGFuZGxlcjpmLHByZVR5cGU6b30pfWVsc2UgaC51bmJpbmQoImxpdmUuIitZKGwsciksZil9fXJldHVybiB0aGlzfX0pOwpjLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtjLmZuW2JdPWZ1bmN0aW9uKGQsZSl7aWYoZT09bnVsbCl7ZT1kO2Q9bnVsbH1yZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMuYmluZChiLGQsZSk6dGhpcy50cmlnZ2VyKGIpfTtpZihjLmF0dHJGbiljLmF0dHJGbltiXT10cnVlfSk7RS5hdHRhY2hFdmVudCYmIUUuYWRkRXZlbnRMaXN0ZW5lciYmYyhFKS5iaW5kKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIGMuY2FjaGUpaWYoYy5jYWNoZVthXS5oYW5kbGUpdHJ5e2MuZXZlbnQucmVtb3ZlKGMuY2FjaGVbYV0uaGFuZGxlLmVsZW0pfWNhdGNoKGIpe319KTsKKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShnLGksbixtLHAscSl7cD0wO2Zvcih2YXIgdT1tLmxlbmd0aDtwPHU7cCsrKXt2YXIgeT1tW3BdO2lmKHkpe3ZhciBGPWZhbHNlO2Zvcih5PXlbZ107eTspe2lmKHkuc2l6Y2FjaGU9PT1uKXtGPW1beS5zaXpzZXRdO2JyZWFrfWlmKHkubm9kZVR5cGU9PT0xJiYhcSl7eS5zaXpjYWNoZT1uO3kuc2l6c2V0PXB9aWYoeS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09aSl7Rj15O2JyZWFrfXk9eVtnXX1tW3BdPUZ9fX1mdW5jdGlvbiBiKGcsaSxuLG0scCxxKXtwPTA7Zm9yKHZhciB1PW0ubGVuZ3RoO3A8dTtwKyspe3ZhciB5PW1bcF07aWYoeSl7dmFyIEY9ZmFsc2U7Zm9yKHk9eVtnXTt5Oyl7aWYoeS5zaXpjYWNoZT09PW4pe0Y9bVt5LnNpenNldF07YnJlYWt9aWYoeS5ub2RlVHlwZT09PTEpe2lmKCFxKXt5LnNpemNhY2hlPW47eS5zaXpzZXQ9cH1pZih0eXBlb2YgaSE9PSJzdHJpbmciKXtpZih5PT09aSl7Rj10cnVlO2JyZWFrfX1lbHNlIGlmKGsuZmlsdGVyKGksClt5XSkubGVuZ3RoPjApe0Y9eTticmVha319eT15W2ddfW1bcF09Rn19fXZhciBkPS8oKD86XCgoPzpcKFteKCldK1wpfFteKCldKykrXCl8XFsoPzpcW1teXFtcXV0qXF18WyciXVteJyJdKlsnIl18W15cW1xdJyJdKykrXF18XFwufFteID4rfiwoXFtcXF0rKSt8Wz4rfl0pKFxzKixccyopPygoPzoufFxyfFxuKSopL2csZT0wLGY9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxoPWZhbHNlLGw9dHJ1ZTtbMCwwXS5zb3J0KGZ1bmN0aW9uKCl7bD1mYWxzZTtyZXR1cm4gMH0pO3ZhciBrPWZ1bmN0aW9uKGcsaSxuLG0pe249bnx8W107dmFyIHA9aT1pfHx0O2lmKGkubm9kZVR5cGUhPT0xJiZpLm5vZGVUeXBlIT09OSlyZXR1cm5bXTtpZighZ3x8dHlwZW9mIGchPT0ic3RyaW5nIilyZXR1cm4gbjt2YXIgcSx1LHksRixNLE49dHJ1ZSxPPWsuaXNYTUwoaSksRD1bXSxSPWc7ZG97ZC5leGVjKCIiKTtpZihxPWQuZXhlYyhSKSl7Uj1xWzNdO0QucHVzaChxWzFdKTtpZihxWzJdKXtGPXFbM107CmJyZWFrfX19d2hpbGUocSk7aWYoRC5sZW5ndGg+MSYmeC5leGVjKGcpKWlmKEQubGVuZ3RoPT09MiYmby5yZWxhdGl2ZVtEWzBdXSl1PUwoRFswXStEWzFdLGkpO2Vsc2UgZm9yKHU9by5yZWxhdGl2ZVtEWzBdXT9baV06ayhELnNoaWZ0KCksaSk7RC5sZW5ndGg7KXtnPUQuc2hpZnQoKTtpZihvLnJlbGF0aXZlW2ddKWcrPUQuc2hpZnQoKTt1PUwoZyx1KX1lbHNle2lmKCFtJiZELmxlbmd0aD4xJiZpLm5vZGVUeXBlPT09OSYmIU8mJm8ubWF0Y2guSUQudGVzdChEWzBdKSYmIW8ubWF0Y2guSUQudGVzdChEW0QubGVuZ3RoLTFdKSl7cT1rLmZpbmQoRC5zaGlmdCgpLGksTyk7aT1xLmV4cHI/ay5maWx0ZXIocS5leHByLHEuc2V0KVswXTpxLnNldFswXX1pZihpKXtxPW0/e2V4cHI6RC5wb3AoKSxzZXQ6QyhtKX06ay5maW5kKEQucG9wKCksRC5sZW5ndGg9PT0xJiYoRFswXT09PSJ+Inx8RFswXT09PSIrIikmJmkucGFyZW50Tm9kZT9pLnBhcmVudE5vZGU6aSxPKTt1PXEuZXhwcj9rLmZpbHRlcihxLmV4cHIsCnEuc2V0KTpxLnNldDtpZihELmxlbmd0aD4wKXk9Qyh1KTtlbHNlIE49ZmFsc2U7Zm9yKDtELmxlbmd0aDspe3E9TT1ELnBvcCgpO2lmKG8ucmVsYXRpdmVbTV0pcT1ELnBvcCgpO2Vsc2UgTT0iIjtpZihxPT1udWxsKXE9aTtvLnJlbGF0aXZlW01dKHkscSxPKX19ZWxzZSB5PVtdfXl8fCh5PXUpO3l8fGsuZXJyb3IoTXx8Zyk7aWYoZi5jYWxsKHkpPT09IltvYmplY3QgQXJyYXldIilpZihOKWlmKGkmJmkubm9kZVR5cGU9PT0xKWZvcihnPTA7eVtnXSE9bnVsbDtnKyspe2lmKHlbZ10mJih5W2ddPT09dHJ1ZXx8eVtnXS5ub2RlVHlwZT09PTEmJmsuY29udGFpbnMoaSx5W2ddKSkpbi5wdXNoKHVbZ10pfWVsc2UgZm9yKGc9MDt5W2ddIT1udWxsO2crKyl5W2ddJiZ5W2ddLm5vZGVUeXBlPT09MSYmbi5wdXNoKHVbZ10pO2Vsc2Ugbi5wdXNoLmFwcGx5KG4seSk7ZWxzZSBDKHksbik7aWYoRil7ayhGLHAsbixtKTtrLnVuaXF1ZVNvcnQobil9cmV0dXJuIG59O2sudW5pcXVlU29ydD1mdW5jdGlvbihnKXtpZih3KXtoPQpsO2cuc29ydCh3KTtpZihoKWZvcih2YXIgaT0xO2k8Zy5sZW5ndGg7aSsrKWdbaV09PT1nW2ktMV0mJmcuc3BsaWNlKGktLSwxKX1yZXR1cm4gZ307ay5tYXRjaGVzPWZ1bmN0aW9uKGcsaSl7cmV0dXJuIGsoZyxudWxsLG51bGwsaSl9O2subWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGcsaSl7cmV0dXJuIGsoaSxudWxsLG51bGwsW2ddKS5sZW5ndGg+MH07ay5maW5kPWZ1bmN0aW9uKGcsaSxuKXt2YXIgbTtpZighZylyZXR1cm5bXTtmb3IodmFyIHA9MCxxPW8ub3JkZXIubGVuZ3RoO3A8cTtwKyspe3ZhciB1LHk9by5vcmRlcltwXTtpZih1PW8ubGVmdE1hdGNoW3ldLmV4ZWMoZykpe3ZhciBGPXVbMV07dS5zcGxpY2UoMSwxKTtpZihGLnN1YnN0cihGLmxlbmd0aC0xKSE9PSJcXCIpe3VbMV09KHVbMV18fCIiKS5yZXBsYWNlKC9cXC9nLCIiKTttPW8uZmluZFt5XSh1LGksbik7aWYobSE9bnVsbCl7Zz1nLnJlcGxhY2Uoby5tYXRjaFt5XSwiIik7YnJlYWt9fX19bXx8KG09aS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKTsKcmV0dXJue3NldDptLGV4cHI6Z319O2suZmlsdGVyPWZ1bmN0aW9uKGcsaSxuLG0pe2Zvcih2YXIgcCxxLHU9Zyx5PVtdLEY9aSxNPWkmJmlbMF0mJmsuaXNYTUwoaVswXSk7ZyYmaS5sZW5ndGg7KXtmb3IodmFyIE4gaW4gby5maWx0ZXIpaWYoKHA9by5sZWZ0TWF0Y2hbTl0uZXhlYyhnKSkhPW51bGwmJnBbMl0pe3ZhciBPLEQsUj1vLmZpbHRlcltOXTtEPXBbMV07cT1mYWxzZTtwLnNwbGljZSgxLDEpO2lmKEQuc3Vic3RyKEQubGVuZ3RoLTEpIT09IlxcIil7aWYoRj09PXkpeT1bXTtpZihvLnByZUZpbHRlcltOXSlpZihwPW8ucHJlRmlsdGVyW05dKHAsRixuLHksbSxNKSl7aWYocD09PXRydWUpY29udGludWV9ZWxzZSBxPU89dHJ1ZTtpZihwKWZvcih2YXIgaj0wOyhEPUZbal0pIT1udWxsO2orKylpZihEKXtPPVIoRCxwLGosRik7dmFyIHM9bV4hIU87aWYobiYmTyE9bnVsbClpZihzKXE9dHJ1ZTtlbHNlIEZbal09ZmFsc2U7ZWxzZSBpZihzKXt5LnB1c2goRCk7cT10cnVlfX1pZihPIT09CkIpe258fChGPXkpO2c9Zy5yZXBsYWNlKG8ubWF0Y2hbTl0sIiIpO2lmKCFxKXJldHVybltdO2JyZWFrfX19aWYoZz09PXUpaWYocT09bnVsbClrLmVycm9yKGcpO2Vsc2UgYnJlYWs7dT1nfXJldHVybiBGfTtrLmVycm9yPWZ1bmN0aW9uKGcpe3Rocm93IlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrZzt9O3ZhciBvPWsuc2VsZWN0b3JzPXtvcmRlcjpbIklEIiwiTkFNRSIsIlRBRyJdLG1hdGNoOntJRDovIygoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKS8sQ0xBU1M6L1wuKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspLyxOQU1FOi9cW25hbWU9WyciXSooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylbJyJdKlxdLyxBVFRSOi9cW1xzKigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKVxzKig/OihcUz89KVxzKihbJyJdKikoLio/KVwzfClccypcXS8sVEFHOi9eKCg/Oltcd1x1MDBjMC1cdUZGRkZcKlwtXXxcXC4pKykvLENISUxEOi86KG9ubHl8bnRofGxhc3R8Zmlyc3QpLWNoaWxkKD86XCgoZXZlbnxvZGR8W1xkbitcLV0qKVwpKT8vLApQT1M6LzoobnRofGVxfGd0fGx0fGZpcnN0fGxhc3R8ZXZlbnxvZGQpKD86XCgoXGQqKVwpKT8oPz1bXlwtXXwkKS8sUFNFVURPOi86KCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspKD86XCgoWyciXT8pKCg/OlwoW15cKV0rXCl8W15cKFwpXSopKylcMlwpKT8vfSxsZWZ0TWF0Y2g6e30sYXR0ck1hcDp7ImNsYXNzIjoiY2xhc3NOYW1lIiwiZm9yIjoiaHRtbEZvciJ9LGF0dHJIYW5kbGU6e2hyZWY6ZnVuY3Rpb24oZyl7cmV0dXJuIGcuZ2V0QXR0cmlidXRlKCJocmVmIil9fSxyZWxhdGl2ZTp7IisiOmZ1bmN0aW9uKGcsaSl7dmFyIG49dHlwZW9mIGk9PT0ic3RyaW5nIixtPW4mJiEvXFcvLnRlc3QoaSk7bj1uJiYhbTtpZihtKWk9aS50b0xvd2VyQ2FzZSgpO209MDtmb3IodmFyIHA9Zy5sZW5ndGgscTttPHA7bSsrKWlmKHE9Z1ttXSl7Zm9yKDsocT1xLnByZXZpb3VzU2libGluZykmJnEubm9kZVR5cGUhPT0xOyk7Z1ttXT1ufHxxJiZxLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0KaT9xfHxmYWxzZTpxPT09aX1uJiZrLmZpbHRlcihpLGcsdHJ1ZSl9LCI+IjpmdW5jdGlvbihnLGkpe3ZhciBuLG09dHlwZW9mIGk9PT0ic3RyaW5nIixwPTAscT1nLmxlbmd0aDtpZihtJiYhL1xXLy50ZXN0KGkpKWZvcihpPWkudG9Mb3dlckNhc2UoKTtwPHE7cCsrKXtpZihuPWdbcF0pe249bi5wYXJlbnROb2RlO2dbcF09bi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09aT9uOmZhbHNlfX1lbHNle2Zvcig7cDxxO3ArKylpZihuPWdbcF0pZ1twXT1tP24ucGFyZW50Tm9kZTpuLnBhcmVudE5vZGU9PT1pO20mJmsuZmlsdGVyKGksZyx0cnVlKX19LCIiOmZ1bmN0aW9uKGcsaSxuKXt2YXIgbSxwPWUrKyxxPWI7aWYodHlwZW9mIGk9PT0ic3RyaW5nIiYmIS9cVy8udGVzdChpKSl7bT1pPWkudG9Mb3dlckNhc2UoKTtxPWF9cSgicGFyZW50Tm9kZSIsaSxwLGcsbSxuKX0sIn4iOmZ1bmN0aW9uKGcsaSxuKXt2YXIgbSxwPWUrKyxxPWI7aWYodHlwZW9mIGk9PT0ic3RyaW5nIiYmIS9cVy8udGVzdChpKSl7bT0KaT1pLnRvTG93ZXJDYXNlKCk7cT1hfXEoInByZXZpb3VzU2libGluZyIsaSxwLGcsbSxuKX19LGZpbmQ6e0lEOmZ1bmN0aW9uKGcsaSxuKXtpZih0eXBlb2YgaS5nZXRFbGVtZW50QnlJZCE9PSJ1bmRlZmluZWQiJiYhbilyZXR1cm4oZz1pLmdldEVsZW1lbnRCeUlkKGdbMV0pKSYmZy5wYXJlbnROb2RlP1tnXTpbXX0sTkFNRTpmdW5jdGlvbihnLGkpe2lmKHR5cGVvZiBpLmdldEVsZW1lbnRzQnlOYW1lIT09InVuZGVmaW5lZCIpe2Zvcih2YXIgbj1bXSxtPWkuZ2V0RWxlbWVudHNCeU5hbWUoZ1sxXSkscD0wLHE9bS5sZW5ndGg7cDxxO3ArKyltW3BdLmdldEF0dHJpYnV0ZSgibmFtZSIpPT09Z1sxXSYmbi5wdXNoKG1bcF0pO3JldHVybiBuLmxlbmd0aD09PTA/bnVsbDpufX0sVEFHOmZ1bmN0aW9uKGcsaSl7cmV0dXJuIGkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZ1sxXSl9fSxwcmVGaWx0ZXI6e0NMQVNTOmZ1bmN0aW9uKGcsaSxuLG0scCxxKXtnPSIgIitnWzFdLnJlcGxhY2UoL1xcL2csCiIiKSsiICI7aWYocSlyZXR1cm4gZztxPTA7Zm9yKHZhciB1Oyh1PWlbcV0pIT1udWxsO3ErKylpZih1KWlmKHBeKHUuY2xhc3NOYW1lJiYoIiAiK3UuY2xhc3NOYW1lKyIgIikucmVwbGFjZSgvW1x0XG5dL2csIiAiKS5pbmRleE9mKGcpPj0wKSlufHxtLnB1c2godSk7ZWxzZSBpZihuKWlbcV09ZmFsc2U7cmV0dXJuIGZhbHNlfSxJRDpmdW5jdGlvbihnKXtyZXR1cm4gZ1sxXS5yZXBsYWNlKC9cXC9nLCIiKX0sVEFHOmZ1bmN0aW9uKGcpe3JldHVybiBnWzFdLnRvTG93ZXJDYXNlKCl9LENISUxEOmZ1bmN0aW9uKGcpe2lmKGdbMV09PT0ibnRoIil7dmFyIGk9LygtPykoXGQqKW4oKD86XCt8LSk/XGQqKS8uZXhlYyhnWzJdPT09ImV2ZW4iJiYiMm4ifHxnWzJdPT09Im9kZCImJiIybisxInx8IS9cRC8udGVzdChnWzJdKSYmIjBuKyIrZ1syXXx8Z1syXSk7Z1syXT1pWzFdKyhpWzJdfHwxKS0wO2dbM109aVszXS0wfWdbMF09ZSsrO3JldHVybiBnfSxBVFRSOmZ1bmN0aW9uKGcsaSxuLAptLHAscSl7aT1nWzFdLnJlcGxhY2UoL1xcL2csIiIpO2lmKCFxJiZvLmF0dHJNYXBbaV0pZ1sxXT1vLmF0dHJNYXBbaV07aWYoZ1syXT09PSJ+PSIpZ1s0XT0iICIrZ1s0XSsiICI7cmV0dXJuIGd9LFBTRVVETzpmdW5jdGlvbihnLGksbixtLHApe2lmKGdbMV09PT0ibm90IilpZigoZC5leGVjKGdbM10pfHwiIikubGVuZ3RoPjF8fC9eXHcvLnRlc3QoZ1szXSkpZ1szXT1rKGdbM10sbnVsbCxudWxsLGkpO2Vsc2V7Zz1rLmZpbHRlcihnWzNdLGksbix0cnVlXnApO258fG0ucHVzaC5hcHBseShtLGcpO3JldHVybiBmYWxzZX1lbHNlIGlmKG8ubWF0Y2guUE9TLnRlc3QoZ1swXSl8fG8ubWF0Y2guQ0hJTEQudGVzdChnWzBdKSlyZXR1cm4gdHJ1ZTtyZXR1cm4gZ30sUE9TOmZ1bmN0aW9uKGcpe2cudW5zaGlmdCh0cnVlKTtyZXR1cm4gZ319LGZpbHRlcnM6e2VuYWJsZWQ6ZnVuY3Rpb24oZyl7cmV0dXJuIGcuZGlzYWJsZWQ9PT1mYWxzZSYmZy50eXBlIT09ImhpZGRlbiJ9LGRpc2FibGVkOmZ1bmN0aW9uKGcpe3JldHVybiBnLmRpc2FibGVkPT09CnRydWV9LGNoZWNrZWQ6ZnVuY3Rpb24oZyl7cmV0dXJuIGcuY2hlY2tlZD09PXRydWV9LHNlbGVjdGVkOmZ1bmN0aW9uKGcpe3JldHVybiBnLnNlbGVjdGVkPT09dHJ1ZX0scGFyZW50OmZ1bmN0aW9uKGcpe3JldHVybiEhZy5maXJzdENoaWxkfSxlbXB0eTpmdW5jdGlvbihnKXtyZXR1cm4hZy5maXJzdENoaWxkfSxoYXM6ZnVuY3Rpb24oZyxpLG4pe3JldHVybiEhayhuWzNdLGcpLmxlbmd0aH0saGVhZGVyOmZ1bmN0aW9uKGcpe3JldHVybi9oXGQvaS50ZXN0KGcubm9kZU5hbWUpfSx0ZXh0OmZ1bmN0aW9uKGcpe3JldHVybiJ0ZXh0Ij09PWcudHlwZX0scmFkaW86ZnVuY3Rpb24oZyl7cmV0dXJuInJhZGlvIj09PWcudHlwZX0sY2hlY2tib3g6ZnVuY3Rpb24oZyl7cmV0dXJuImNoZWNrYm94Ij09PWcudHlwZX0sZmlsZTpmdW5jdGlvbihnKXtyZXR1cm4iZmlsZSI9PT1nLnR5cGV9LHBhc3N3b3JkOmZ1bmN0aW9uKGcpe3JldHVybiJwYXNzd29yZCI9PT1nLnR5cGV9LHN1Ym1pdDpmdW5jdGlvbihnKXtyZXR1cm4ic3VibWl0Ij09PQpnLnR5cGV9LGltYWdlOmZ1bmN0aW9uKGcpe3JldHVybiJpbWFnZSI9PT1nLnR5cGV9LHJlc2V0OmZ1bmN0aW9uKGcpe3JldHVybiJyZXNldCI9PT1nLnR5cGV9LGJ1dHRvbjpmdW5jdGlvbihnKXtyZXR1cm4iYnV0dG9uIj09PWcudHlwZXx8Zy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImJ1dHRvbiJ9LGlucHV0OmZ1bmN0aW9uKGcpe3JldHVybi9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uL2kudGVzdChnLm5vZGVOYW1lKX19LHNldEZpbHRlcnM6e2ZpcnN0OmZ1bmN0aW9uKGcsaSl7cmV0dXJuIGk9PT0wfSxsYXN0OmZ1bmN0aW9uKGcsaSxuLG0pe3JldHVybiBpPT09bS5sZW5ndGgtMX0sZXZlbjpmdW5jdGlvbihnLGkpe3JldHVybiBpJTI9PT0wfSxvZGQ6ZnVuY3Rpb24oZyxpKXtyZXR1cm4gaSUyPT09MX0sbHQ6ZnVuY3Rpb24oZyxpLG4pe3JldHVybiBpPG5bM10tMH0sZ3Q6ZnVuY3Rpb24oZyxpLG4pe3JldHVybiBpPm5bM10tMH0sbnRoOmZ1bmN0aW9uKGcsaSxuKXtyZXR1cm4gblszXS0KMD09PWl9LGVxOmZ1bmN0aW9uKGcsaSxuKXtyZXR1cm4gblszXS0wPT09aX19LGZpbHRlcjp7UFNFVURPOmZ1bmN0aW9uKGcsaSxuLG0pe3ZhciBwPWlbMV0scT1vLmZpbHRlcnNbcF07aWYocSlyZXR1cm4gcShnLG4saSxtKTtlbHNlIGlmKHA9PT0iY29udGFpbnMiKXJldHVybihnLnRleHRDb250ZW50fHxnLmlubmVyVGV4dHx8ay5nZXRUZXh0KFtnXSl8fCIiKS5pbmRleE9mKGlbM10pPj0wO2Vsc2UgaWYocD09PSJub3QiKXtpPWlbM107bj0wO2ZvcihtPWkubGVuZ3RoO248bTtuKyspaWYoaVtuXT09PWcpcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlfWVsc2Ugay5lcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIitwKX0sQ0hJTEQ6ZnVuY3Rpb24oZyxpKXt2YXIgbj1pWzFdLG09Zztzd2l0Y2gobil7Y2FzZSAib25seSI6Y2FzZSAiZmlyc3QiOmZvcig7bT1tLnByZXZpb3VzU2libGluZzspaWYobS5ub2RlVHlwZT09PTEpcmV0dXJuIGZhbHNlO2lmKG49PT0KImZpcnN0IilyZXR1cm4gdHJ1ZTttPWc7Y2FzZSAibGFzdCI6Zm9yKDttPW0ubmV4dFNpYmxpbmc7KWlmKG0ubm9kZVR5cGU9PT0xKXJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZTtjYXNlICJudGgiOm49aVsyXTt2YXIgcD1pWzNdO2lmKG49PT0xJiZwPT09MClyZXR1cm4gdHJ1ZTt2YXIgcT1pWzBdLHU9Zy5wYXJlbnROb2RlO2lmKHUmJih1LnNpemNhY2hlIT09cXx8IWcubm9kZUluZGV4KSl7dmFyIHk9MDtmb3IobT11LmZpcnN0Q2hpbGQ7bTttPW0ubmV4dFNpYmxpbmcpaWYobS5ub2RlVHlwZT09PTEpbS5ub2RlSW5kZXg9Kyt5O3Uuc2l6Y2FjaGU9cX1tPWcubm9kZUluZGV4LXA7cmV0dXJuIG49PT0wP209PT0wOm0lbj09PTAmJm0vbj49MH19LElEOmZ1bmN0aW9uKGcsaSl7cmV0dXJuIGcubm9kZVR5cGU9PT0xJiZnLmdldEF0dHJpYnV0ZSgiaWQiKT09PWl9LFRBRzpmdW5jdGlvbihnLGkpe3JldHVybiBpPT09IioiJiZnLm5vZGVUeXBlPT09MXx8Zy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Cml9LENMQVNTOmZ1bmN0aW9uKGcsaSl7cmV0dXJuKCIgIisoZy5jbGFzc05hbWV8fGcuZ2V0QXR0cmlidXRlKCJjbGFzcyIpKSsiICIpLmluZGV4T2YoaSk+LTF9LEFUVFI6ZnVuY3Rpb24oZyxpKXt2YXIgbj1pWzFdO249by5hdHRySGFuZGxlW25dP28uYXR0ckhhbmRsZVtuXShnKTpnW25dIT1udWxsP2dbbl06Zy5nZXRBdHRyaWJ1dGUobik7dmFyIG09bisiIixwPWlbMl0scT1pWzRdO3JldHVybiBuPT1udWxsP3A9PT0iIT0iOnA9PT0iPSI/bT09PXE6cD09PSIqPSI/bS5pbmRleE9mKHEpPj0wOnA9PT0ifj0iPygiICIrbSsiICIpLmluZGV4T2YocSk+PTA6IXE/bSYmbiE9PWZhbHNlOnA9PT0iIT0iP20hPT1xOnA9PT0iXj0iP20uaW5kZXhPZihxKT09PTA6cD09PSIkPSI/bS5zdWJzdHIobS5sZW5ndGgtcS5sZW5ndGgpPT09cTpwPT09Inw9Ij9tPT09cXx8bS5zdWJzdHIoMCxxLmxlbmd0aCsxKT09PXErIi0iOmZhbHNlfSxQT1M6ZnVuY3Rpb24oZyxpLG4sbSl7dmFyIHA9by5zZXRGaWx0ZXJzW2lbMl1dOwppZihwKXJldHVybiBwKGcsbixpLG0pfX19LHg9by5tYXRjaC5QT1Mscj1mdW5jdGlvbihnLGkpe3JldHVybiJcXCIrKGktMCsxKX0sQTtmb3IoQSBpbiBvLm1hdGNoKXtvLm1hdGNoW0FdPVJlZ0V4cChvLm1hdGNoW0FdLnNvdXJjZSsvKD8hW15cW10qXF0pKD8hW15cKF0qXCkpLy5zb3VyY2UpO28ubGVmdE1hdGNoW0FdPVJlZ0V4cCgvKF4oPzoufFxyfFxuKSo/KS8uc291cmNlK28ubWF0Y2hbQV0uc291cmNlLnJlcGxhY2UoL1xcKFxkKykvZyxyKSl9dmFyIEM9ZnVuY3Rpb24oZyxpKXtnPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGcsMCk7aWYoaSl7aS5wdXNoLmFwcGx5KGksZyk7cmV0dXJuIGl9cmV0dXJuIGd9O3RyeXtBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0LmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzLDApfWNhdGNoKEope0M9ZnVuY3Rpb24oZyxpKXt2YXIgbj0wLG09aXx8W107aWYoZi5jYWxsKGcpPT09IltvYmplY3QgQXJyYXldIilBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShtLApnKTtlbHNlIGlmKHR5cGVvZiBnLmxlbmd0aD09PSJudW1iZXIiKWZvcih2YXIgcD1nLmxlbmd0aDtuPHA7bisrKW0ucHVzaChnW25dKTtlbHNlIGZvcig7Z1tuXTtuKyspbS5wdXNoKGdbbl0pO3JldHVybiBtfX12YXIgdyxJO2lmKHQuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKXc9ZnVuY3Rpb24oZyxpKXtpZihnPT09aSl7aD10cnVlO3JldHVybiAwfWlmKCFnLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9ufHwhaS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbilyZXR1cm4gZy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj8tMToxO3JldHVybiBnLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGkpJjQ/LTE6MX07ZWxzZXt3PWZ1bmN0aW9uKGcsaSl7dmFyIG4sbSxwPVtdLHE9W107bj1nLnBhcmVudE5vZGU7bT1pLnBhcmVudE5vZGU7dmFyIHU9bjtpZihnPT09aSl7aD10cnVlO3JldHVybiAwfWVsc2UgaWYobj09PW0pcmV0dXJuIEkoZyxpKTtlbHNlIGlmKG4pe2lmKCFtKXJldHVybiAxfWVsc2UgcmV0dXJuLTE7CmZvcig7dTspe3AudW5zaGlmdCh1KTt1PXUucGFyZW50Tm9kZX1mb3IodT1tO3U7KXtxLnVuc2hpZnQodSk7dT11LnBhcmVudE5vZGV9bj1wLmxlbmd0aDttPXEubGVuZ3RoO2Zvcih1PTA7dTxuJiZ1PG07dSsrKWlmKHBbdV0hPT1xW3VdKXJldHVybiBJKHBbdV0scVt1XSk7cmV0dXJuIHU9PT1uP0koZyxxW3VdLC0xKTpJKHBbdV0saSwxKX07ST1mdW5jdGlvbihnLGksbil7aWYoZz09PWkpcmV0dXJuIG47Zm9yKGc9Zy5uZXh0U2libGluZztnOyl7aWYoZz09PWkpcmV0dXJuLTE7Zz1nLm5leHRTaWJsaW5nfXJldHVybiAxfX1rLmdldFRleHQ9ZnVuY3Rpb24oZyl7Zm9yKHZhciBpPSIiLG4sbT0wO2dbbV07bSsrKXtuPWdbbV07aWYobi5ub2RlVHlwZT09PTN8fG4ubm9kZVR5cGU9PT00KWkrPW4ubm9kZVZhbHVlO2Vsc2UgaWYobi5ub2RlVHlwZSE9PTgpaSs9ay5nZXRUZXh0KG4uY2hpbGROb2Rlcyl9cmV0dXJuIGl9OyhmdW5jdGlvbigpe3ZhciBnPXQuY3JlYXRlRWxlbWVudCgiZGl2IiksCmk9InNjcmlwdCIrKG5ldyBEYXRlKS5nZXRUaW1lKCksbj10LmRvY3VtZW50RWxlbWVudDtnLmlubmVySFRNTD0iPGEgbmFtZT0nIitpKyInLz4iO24uaW5zZXJ0QmVmb3JlKGcsbi5maXJzdENoaWxkKTtpZih0LmdldEVsZW1lbnRCeUlkKGkpKXtvLmZpbmQuSUQ9ZnVuY3Rpb24obSxwLHEpe2lmKHR5cGVvZiBwLmdldEVsZW1lbnRCeUlkIT09InVuZGVmaW5lZCImJiFxKXJldHVybihwPXAuZ2V0RWxlbWVudEJ5SWQobVsxXSkpP3AuaWQ9PT1tWzFdfHx0eXBlb2YgcC5nZXRBdHRyaWJ1dGVOb2RlIT09InVuZGVmaW5lZCImJnAuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKS5ub2RlVmFsdWU9PT1tWzFdP1twXTpCOltdfTtvLmZpbHRlci5JRD1mdW5jdGlvbihtLHApe3ZhciBxPXR5cGVvZiBtLmdldEF0dHJpYnV0ZU5vZGUhPT0idW5kZWZpbmVkIiYmbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBtLm5vZGVUeXBlPT09MSYmcSYmcS5ub2RlVmFsdWU9PT1wfX1uLnJlbW92ZUNoaWxkKGcpOwpuPWc9bnVsbH0pKCk7KGZ1bmN0aW9uKCl7dmFyIGc9dC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLmFwcGVuZENoaWxkKHQuY3JlYXRlQ29tbWVudCgiIikpO2lmKGcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGg+MClvLmZpbmQuVEFHPWZ1bmN0aW9uKGksbil7dmFyIG09bi5nZXRFbGVtZW50c0J5VGFnTmFtZShpWzFdKTtpZihpWzFdPT09IioiKXtmb3IodmFyIHA9W10scT0wO21bcV07cSsrKW1bcV0ubm9kZVR5cGU9PT0xJiZwLnB1c2gobVtxXSk7bT1wfXJldHVybiBtfTtnLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiI7aWYoZy5maXJzdENoaWxkJiZ0eXBlb2YgZy5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSE9PSJ1bmRlZmluZWQiJiZnLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikhPT0iIyIpby5hdHRySGFuZGxlLmhyZWY9ZnVuY3Rpb24oaSl7cmV0dXJuIGkuZ2V0QXR0cmlidXRlKCJocmVmIiwyKX07Zz1udWxsfSkoKTt0LnF1ZXJ5U2VsZWN0b3JBbGwmJgpmdW5jdGlvbigpe3ZhciBnPWssaT10LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2kuaW5uZXJIVE1MPSI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7aWYoIShpLnF1ZXJ5U2VsZWN0b3JBbGwmJmkucXVlcnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5ndGg9PT0wKSl7az1mdW5jdGlvbihtLHAscSx1KXtwPXB8fHQ7bT1tLnJlcGxhY2UoL1w9XHMqKFteJyJcXV0qKVxzKlxdL2csIj0nJDEnXSIpO2lmKCF1JiYhay5pc1hNTChwKSlpZihwLm5vZGVUeXBlPT09OSl0cnl7cmV0dXJuIEMocC5xdWVyeVNlbGVjdG9yQWxsKG0pLHEpfWNhdGNoKHkpe31lbHNlIGlmKHAubm9kZVR5cGU9PT0xJiZwLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPT0ib2JqZWN0Iil7dmFyIEY9cC5nZXRBdHRyaWJ1dGUoImlkIiksTT1GfHwiX19zaXp6bGVfXyI7Rnx8cC5zZXRBdHRyaWJ1dGUoImlkIixNKTt0cnl7cmV0dXJuIEMocC5xdWVyeVNlbGVjdG9yQWxsKCIjIitNKyIgIittKSxxKX1jYXRjaChOKXt9ZmluYWxseXtGfHwKcC5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fXJldHVybiBnKG0scCxxLHUpfTtmb3IodmFyIG4gaW4gZylrW25dPWdbbl07aT1udWxsfX0oKTsoZnVuY3Rpb24oKXt2YXIgZz10LmRvY3VtZW50RWxlbWVudCxpPWcubWF0Y2hlc1NlbGVjdG9yfHxnLm1vek1hdGNoZXNTZWxlY3Rvcnx8Zy53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fGcubXNNYXRjaGVzU2VsZWN0b3Isbj1mYWxzZTt0cnl7aS5jYWxsKHQuZG9jdW1lbnRFbGVtZW50LCJbdGVzdCE9JyddOnNpenpsZSIpfWNhdGNoKG0pe249dHJ1ZX1pZihpKWsubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKHAscSl7cT1xLnJlcGxhY2UoL1w9XHMqKFteJyJcXV0qKVxzKlxdL2csIj0nJDEnXSIpO2lmKCFrLmlzWE1MKHApKXRyeXtpZihufHwhby5tYXRjaC5QU0VVRE8udGVzdChxKSYmIS8hPS8udGVzdChxKSlyZXR1cm4gaS5jYWxsKHAscSl9Y2F0Y2godSl7fXJldHVybiBrKHEsbnVsbCxudWxsLFtwXSkubGVuZ3RoPjB9fSkoKTsoZnVuY3Rpb24oKXt2YXIgZz0KdC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLmlubmVySFRNTD0iPGRpdiBjbGFzcz0ndGVzdCBlJz48L2Rpdj48ZGl2IGNsYXNzPSd0ZXN0Jz48L2Rpdj4iO2lmKCEoIWcuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZXx8Zy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoPT09MCkpe2cubGFzdENoaWxkLmNsYXNzTmFtZT0iZSI7aWYoZy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoIT09MSl7by5vcmRlci5zcGxpY2UoMSwwLCJDTEFTUyIpO28uZmluZC5DTEFTUz1mdW5jdGlvbihpLG4sbSl7aWYodHlwZW9mIG4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSE9PSJ1bmRlZmluZWQiJiYhbSlyZXR1cm4gbi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGlbMV0pfTtnPW51bGx9fX0pKCk7ay5jb250YWlucz10LmRvY3VtZW50RWxlbWVudC5jb250YWlucz9mdW5jdGlvbihnLGkpe3JldHVybiBnIT09aSYmKGcuY29udGFpbnM/Zy5jb250YWlucyhpKTp0cnVlKX06dC5kb2N1bWVudEVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24/CmZ1bmN0aW9uKGcsaSl7cmV0dXJuISEoZy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihpKSYxNil9OmZ1bmN0aW9uKCl7cmV0dXJuIGZhbHNlfTtrLmlzWE1MPWZ1bmN0aW9uKGcpe3JldHVybihnPShnP2cub3duZXJEb2N1bWVudHx8ZzowKS5kb2N1bWVudEVsZW1lbnQpP2cubm9kZU5hbWUhPT0iSFRNTCI6ZmFsc2V9O3ZhciBMPWZ1bmN0aW9uKGcsaSl7Zm9yKHZhciBuLG09W10scD0iIixxPWkubm9kZVR5cGU/W2ldOmk7bj1vLm1hdGNoLlBTRVVETy5leGVjKGcpOyl7cCs9blswXTtnPWcucmVwbGFjZShvLm1hdGNoLlBTRVVETywiIil9Zz1vLnJlbGF0aXZlW2ddP2crIioiOmc7bj0wO2Zvcih2YXIgdT1xLmxlbmd0aDtuPHU7bisrKWsoZyxxW25dLG0pO3JldHVybiBrLmZpbHRlcihwLG0pfTtjLmZpbmQ9aztjLmV4cHI9ay5zZWxlY3RvcnM7Yy5leHByWyI6Il09Yy5leHByLmZpbHRlcnM7Yy51bmlxdWU9ay51bmlxdWVTb3J0O2MudGV4dD1rLmdldFRleHQ7Yy5pc1hNTERvYz1rLmlzWE1MOwpjLmNvbnRhaW5zPWsuY29udGFpbnN9KSgpO3ZhciBaYT0vVW50aWwkLywkYT0vXig/OnBhcmVudHN8cHJldlVudGlsfHByZXZBbGwpLyxhYj0vLC8sTmE9L14uW146I1xbXC4sXSokLyxiYj1BcnJheS5wcm90b3R5cGUuc2xpY2UsY2I9Yy5leHByLm1hdGNoLlBPUztjLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5wdXNoU3RhY2soIiIsImZpbmQiLGEpLGQ9MCxlPTAsZj10aGlzLmxlbmd0aDtlPGY7ZSsrKXtkPWIubGVuZ3RoO2MuZmluZChhLHRoaXNbZV0sYik7aWYoZT4wKWZvcih2YXIgaD1kO2g8Yi5sZW5ndGg7aCsrKWZvcih2YXIgbD0wO2w8ZDtsKyspaWYoYltsXT09PWJbaF0pe2Iuc3BsaWNlKGgtLSwxKTticmVha319cmV0dXJuIGJ9LGhhczpmdW5jdGlvbihhKXt2YXIgYj1jKGEpO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgZD0wLGU9Yi5sZW5ndGg7ZDxlO2QrKylpZihjLmNvbnRhaW5zKHRoaXMsYltkXSkpcmV0dXJuIHRydWV9KX0sCm5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobWEodGhpcyxhLGZhbHNlKSwibm90IixhKX0sZmlsdGVyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhtYSh0aGlzLGEsdHJ1ZSksImZpbHRlciIsYSl9LGlzOmZ1bmN0aW9uKGEpe3JldHVybiEhYSYmYy5maWx0ZXIoYSx0aGlzKS5sZW5ndGg+MH0sY2xvc2VzdDpmdW5jdGlvbihhLGIpe3ZhciBkPVtdLGUsZixoPXRoaXNbMF07aWYoYy5pc0FycmF5KGEpKXt2YXIgbCxrPXt9LG89MTtpZihoJiZhLmxlbmd0aCl7ZT0wO2ZvcihmPWEubGVuZ3RoO2U8ZjtlKyspe2w9YVtlXTtrW2xdfHwoa1tsXT1jLmV4cHIubWF0Y2guUE9TLnRlc3QobCk/YyhsLGJ8fHRoaXMuY29udGV4dCk6bCl9Zm9yKDtoJiZoLm93bmVyRG9jdW1lbnQmJmghPT1iOyl7Zm9yKGwgaW4gayl7ZT1rW2xdO2lmKGUuanF1ZXJ5P2UuaW5kZXgoaCk+LTE6YyhoKS5pcyhlKSlkLnB1c2goe3NlbGVjdG9yOmwsZWxlbTpoLGxldmVsOm99KX1oPQpoLnBhcmVudE5vZGU7bysrfX1yZXR1cm4gZH1sPWNiLnRlc3QoYSk/YyhhLGJ8fHRoaXMuY29udGV4dCk6bnVsbDtlPTA7Zm9yKGY9dGhpcy5sZW5ndGg7ZTxmO2UrKylmb3IoaD10aGlzW2VdO2g7KWlmKGw/bC5pbmRleChoKT4tMTpjLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGgsYSkpe2QucHVzaChoKTticmVha31lbHNle2g9aC5wYXJlbnROb2RlO2lmKCFofHwhaC5vd25lckRvY3VtZW50fHxoPT09YilicmVha31kPWQubGVuZ3RoPjE/Yy51bmlxdWUoZCk6ZDtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZCwiY2xvc2VzdCIsYSl9LGluZGV4OmZ1bmN0aW9uKGEpe2lmKCFhfHx0eXBlb2YgYT09PSJzdHJpbmciKXJldHVybiBjLmluQXJyYXkodGhpc1swXSxhP2MoYSk6dGhpcy5wYXJlbnQoKS5jaGlsZHJlbigpKTtyZXR1cm4gYy5pbkFycmF5KGEuanF1ZXJ5P2FbMF06YSx0aGlzKX0sYWRkOmZ1bmN0aW9uKGEsYil7dmFyIGQ9dHlwZW9mIGE9PT0ic3RyaW5nIj9jKGEsYnx8dGhpcy5jb250ZXh0KToKYy5tYWtlQXJyYXkoYSksZT1jLm1lcmdlKHRoaXMuZ2V0KCksZCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKCFkWzBdfHwhZFswXS5wYXJlbnROb2RlfHxkWzBdLnBhcmVudE5vZGUubm9kZVR5cGU9PT0xMXx8IWVbMF18fCFlWzBdLnBhcmVudE5vZGV8fGVbMF0ucGFyZW50Tm9kZS5ub2RlVHlwZT09PTExP2U6Yy51bmlxdWUoZSkpfSxhbmRTZWxmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWRkKHRoaXMucHJldk9iamVjdCl9fSk7Yy5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuKGE9YS5wYXJlbnROb2RlKSYmYS5ub2RlVHlwZSE9PTExP2E6bnVsbH0scGFyZW50czpmdW5jdGlvbihhKXtyZXR1cm4gYy5kaXIoYSwicGFyZW50Tm9kZSIpfSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBjLmRpcihhLCJwYXJlbnROb2RlIixkKX0sbmV4dDpmdW5jdGlvbihhKXtyZXR1cm4gYy5udGgoYSwyLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGEpe3JldHVybiBjLm50aChhLAoyLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihhKXtyZXR1cm4gYy5kaXIoYSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihhKXtyZXR1cm4gYy5kaXIoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGMuZGlyKGEsIm5leHRTaWJsaW5nIixkKX0scHJldlVudGlsOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gYy5kaXIoYSwicHJldmlvdXNTaWJsaW5nIixkKX0sc2libGluZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIGMuc2libGluZyhhLnBhcmVudE5vZGUuZmlyc3RDaGlsZCxhKX0sY2hpbGRyZW46ZnVuY3Rpb24oYSl7cmV0dXJuIGMuc2libGluZyhhLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihhKXtyZXR1cm4gYy5ub2RlTmFtZShhLCJpZnJhbWUiKT9hLmNvbnRlbnREb2N1bWVudHx8YS5jb250ZW50V2luZG93LmRvY3VtZW50OmMubWFrZUFycmF5KGEuY2hpbGROb2Rlcyl9fSxmdW5jdGlvbihhLApiKXtjLmZuW2FdPWZ1bmN0aW9uKGQsZSl7dmFyIGY9Yy5tYXAodGhpcyxiLGQpO1phLnRlc3QoYSl8fChlPWQpO2lmKGUmJnR5cGVvZiBlPT09InN0cmluZyIpZj1jLmZpbHRlcihlLGYpO2Y9dGhpcy5sZW5ndGg+MT9jLnVuaXF1ZShmKTpmO2lmKCh0aGlzLmxlbmd0aD4xfHxhYi50ZXN0KGUpKSYmJGEudGVzdChhKSlmPWYucmV2ZXJzZSgpO3JldHVybiB0aGlzLnB1c2hTdGFjayhmLGEsYmIuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSl9fSk7Yy5leHRlbmQoe2ZpbHRlcjpmdW5jdGlvbihhLGIsZCl7aWYoZClhPSI6bm90KCIrYSsiKSI7cmV0dXJuIGIubGVuZ3RoPT09MT9jLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGJbMF0sYSk/W2JbMF1dOltdOmMuZmluZC5tYXRjaGVzKGEsYil9LGRpcjpmdW5jdGlvbihhLGIsZCl7dmFyIGU9W107Zm9yKGE9YVtiXTthJiZhLm5vZGVUeXBlIT09OSYmKGQ9PT1CfHxhLm5vZGVUeXBlIT09MXx8IWMoYSkuaXMoZCkpOyl7YS5ub2RlVHlwZT09PTEmJgplLnB1c2goYSk7YT1hW2JdfXJldHVybiBlfSxudGg6ZnVuY3Rpb24oYSxiLGQpe2I9Ynx8MTtmb3IodmFyIGU9MDthO2E9YVtkXSlpZihhLm5vZGVUeXBlPT09MSYmKytlPT09YilicmVhaztyZXR1cm4gYX0sc2libGluZzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXTthO2E9YS5uZXh0U2libGluZylhLm5vZGVUeXBlPT09MSYmYSE9PWImJmQucHVzaChhKTtyZXR1cm4gZH19KTt2YXIgemE9LyBqUXVlcnlcZCs9Iig/OlxkK3xudWxsKSIvZywkPS9eXHMrLyxBYT0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2lnLEJhPS88KFtcdzpdKykvLGRiPS88dGJvZHkvaSxlYj0vPHwmIz9cdys7LyxDYT0vPCg/OnNjcmlwdHxvYmplY3R8ZW1iZWR8b3B0aW9ufHN0eWxlKS9pLERhPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLGZiPS9cPShbXj0iJz5cc10rXC8pPi9nLFA9e29wdGlvbjpbMSwKIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSxsZWdlbmQ6WzEsIjxmaWVsZHNldD4iLCI8L2ZpZWxkc2V0PiJdLHRoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLGNvbDpbMiwiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU+Il0sYXJlYTpbMSwiPG1hcD4iLCI8L21hcD4iXSxfZGVmYXVsdDpbMCwiIiwiIl19O1Aub3B0Z3JvdXA9UC5vcHRpb247UC50Ym9keT1QLnRmb290PVAuY29sZ3JvdXA9UC5jYXB0aW9uPVAudGhlYWQ7UC50aD1QLnRkO2lmKCFjLnN1cHBvcnQuaHRtbFNlcmlhbGl6ZSlQLl9kZWZhdWx0PVsxLCJkaXY8ZGl2PiIsIjwvZGl2PiJdO2MuZm4uZXh0ZW5kKHt0ZXh0OmZ1bmN0aW9uKGEpe2lmKGMuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBkPQpjKHRoaXMpO2QudGV4dChhLmNhbGwodGhpcyxiLGQudGV4dCgpKSl9KTtpZih0eXBlb2YgYSE9PSJvYmplY3QiJiZhIT09QilyZXR1cm4gdGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRvY3VtZW50fHx0KS5jcmVhdGVUZXh0Tm9kZShhKSk7cmV0dXJuIGMudGV4dCh0aGlzKX0sd3JhcEFsbDpmdW5jdGlvbihhKXtpZihjLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihkKXtjKHRoaXMpLndyYXBBbGwoYS5jYWxsKHRoaXMsZCkpfSk7aWYodGhpc1swXSl7dmFyIGI9YyhhLHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUodHJ1ZSk7dGhpc1swXS5wYXJlbnROb2RlJiZiLmluc2VydEJlZm9yZSh0aGlzWzBdKTtiLm1hcChmdW5jdGlvbigpe2Zvcih2YXIgZD10aGlzO2QuZmlyc3RDaGlsZCYmZC5maXJzdENoaWxkLm5vZGVUeXBlPT09MTspZD1kLmZpcnN0Q2hpbGQ7cmV0dXJuIGR9KS5hcHBlbmQodGhpcyl9cmV0dXJuIHRoaXN9LAp3cmFwSW5uZXI6ZnVuY3Rpb24oYSl7aWYoYy5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Yyh0aGlzKS53cmFwSW5uZXIoYS5jYWxsKHRoaXMsYikpfSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWModGhpcyksZD1iLmNvbnRlbnRzKCk7ZC5sZW5ndGg/ZC53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2ModGhpcykud3JhcEFsbChhKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7Yy5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fGModGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsdHJ1ZSxmdW5jdGlvbihhKXt0aGlzLm5vZGVUeXBlPT09MSYmdGhpcy5hcHBlbmRDaGlsZChhKX0pfSwKcHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyx0cnVlLGZ1bmN0aW9uKGEpe3RoaXMubm9kZVR5cGU9PT0xJiZ0aGlzLmluc2VydEJlZm9yZShhLHRoaXMuZmlyc3RDaGlsZCl9KX0sYmVmb3JlOmZ1bmN0aW9uKCl7aWYodGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlKXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmYWxzZSxmdW5jdGlvbihiKXt0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGIsdGhpcyl9KTtlbHNlIGlmKGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBhPWMoYXJndW1lbnRzWzBdKTthLnB1c2guYXBwbHkoYSx0aGlzLnRvQXJyYXkoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGEsImJlZm9yZSIsYXJndW1lbnRzKX19LGFmdGVyOmZ1bmN0aW9uKCl7aWYodGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlKXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmYWxzZSxmdW5jdGlvbihiKXt0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGIsCnRoaXMubmV4dFNpYmxpbmcpfSk7ZWxzZSBpZihhcmd1bWVudHMubGVuZ3RoKXt2YXIgYT10aGlzLnB1c2hTdGFjayh0aGlzLCJhZnRlciIsYXJndW1lbnRzKTthLnB1c2guYXBwbHkoYSxjKGFyZ3VtZW50c1swXSkudG9BcnJheSgpKTtyZXR1cm4gYX19LHJlbW92ZTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD0wLGU7KGU9dGhpc1tkXSkhPW51bGw7ZCsrKWlmKCFhfHxjLmZpbHRlcihhLFtlXSkubGVuZ3RoKXtpZighYiYmZS5ub2RlVHlwZT09PTEpe2MuY2xlYW5EYXRhKGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSk7Yy5jbGVhbkRhdGEoW2VdKX1lLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKX1yZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MCxiOyhiPXRoaXNbYV0pIT1udWxsO2ErKylmb3IoYi5ub2RlVHlwZT09PTEmJmMuY2xlYW5EYXRhKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSk7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7CnJldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm1hcChmdW5jdGlvbigpe2lmKCFjLnN1cHBvcnQubm9DbG9uZUV2ZW50JiYhYy5pc1hNTERvYyh0aGlzKSl7dmFyIGQ9dGhpcy5vdXRlckhUTUwsZT10aGlzLm93bmVyRG9jdW1lbnQ7aWYoIWQpe2Q9ZS5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmFwcGVuZENoaWxkKHRoaXMuY2xvbmVOb2RlKHRydWUpKTtkPWQuaW5uZXJIVE1MfXJldHVybiBjLmNsZWFuKFtkLnJlcGxhY2UoemEsIiIpLnJlcGxhY2UoZmIsJz0iJDEiPicpLnJlcGxhY2UoJCwiIildLGUpWzBdfWVsc2UgcmV0dXJuIHRoaXMuY2xvbmVOb2RlKHRydWUpfSk7aWYoYT09PXRydWUpe25hKHRoaXMsYik7bmEodGhpcy5maW5kKCIqIiksYi5maW5kKCIqIikpfXJldHVybiBifSxodG1sOmZ1bmN0aW9uKGEpe2lmKGE9PT1CKXJldHVybiB0aGlzWzBdJiZ0aGlzWzBdLm5vZGVUeXBlPT09MT90aGlzWzBdLmlubmVySFRNTC5yZXBsYWNlKHphLCIiKTpudWxsOwplbHNlIGlmKHR5cGVvZiBhPT09InN0cmluZyImJiFDYS50ZXN0KGEpJiYoYy5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlfHwhJC50ZXN0KGEpKSYmIVBbKEJhLmV4ZWMoYSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKXthPWEucmVwbGFjZShBYSwiPCQxPjwvJDI+Iik7dHJ5e2Zvcih2YXIgYj0wLGQ9dGhpcy5sZW5ndGg7YjxkO2IrKylpZih0aGlzW2JdLm5vZGVUeXBlPT09MSl7Yy5jbGVhbkRhdGEodGhpc1tiXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKTt0aGlzW2JdLmlubmVySFRNTD1hfX1jYXRjaChlKXt0aGlzLmVtcHR5KCkuYXBwZW5kKGEpfX1lbHNlIGMuaXNGdW5jdGlvbihhKT90aGlzLmVhY2goZnVuY3Rpb24oZil7dmFyIGg9Yyh0aGlzKTtoLmh0bWwoYS5jYWxsKHRoaXMsZixoLmh0bWwoKSkpfSk6dGhpcy5lbXB0eSgpLmFwcGVuZChhKTtyZXR1cm4gdGhpc30scmVwbGFjZVdpdGg6ZnVuY3Rpb24oYSl7aWYodGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlKXtpZihjLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXt2YXIgZD0KYyh0aGlzKSxlPWQuaHRtbCgpO2QucmVwbGFjZVdpdGgoYS5jYWxsKHRoaXMsYixlKSl9KTtpZih0eXBlb2YgYSE9PSJzdHJpbmciKWE9YyhhKS5kZXRhY2goKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5uZXh0U2libGluZyxkPXRoaXMucGFyZW50Tm9kZTtjKHRoaXMpLnJlbW92ZSgpO2I/YyhiKS5iZWZvcmUoYSk6YyhkKS5hcHBlbmQoYSl9KX1lbHNlIHJldHVybiB0aGlzLnB1c2hTdGFjayhjKGMuaXNGdW5jdGlvbihhKT9hKCk6YSksInJlcGxhY2VXaXRoIixhKX0sZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJlbW92ZShhLHRydWUpfSxkb21NYW5pcDpmdW5jdGlvbihhLGIsZCl7dmFyIGUsZixoLGw9YVswXSxrPVtdO2lmKCFjLnN1cHBvcnQuY2hlY2tDbG9uZSYmYXJndW1lbnRzLmxlbmd0aD09PTMmJnR5cGVvZiBsPT09InN0cmluZyImJkRhLnRlc3QobCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2ModGhpcykuZG9tTWFuaXAoYSwKYixkLHRydWUpfSk7aWYoYy5pc0Z1bmN0aW9uKGwpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oeCl7dmFyIHI9Yyh0aGlzKTthWzBdPWwuY2FsbCh0aGlzLHgsYj9yLmh0bWwoKTpCKTtyLmRvbU1hbmlwKGEsYixkKX0pO2lmKHRoaXNbMF0pe2U9bCYmbC5wYXJlbnROb2RlO2U9Yy5zdXBwb3J0LnBhcmVudE5vZGUmJmUmJmUubm9kZVR5cGU9PT0xMSYmZS5jaGlsZE5vZGVzLmxlbmd0aD09PXRoaXMubGVuZ3RoP3tmcmFnbWVudDplfTpjLmJ1aWxkRnJhZ21lbnQoYSx0aGlzLGspO2g9ZS5mcmFnbWVudDtpZihmPWguY2hpbGROb2Rlcy5sZW5ndGg9PT0xP2g9aC5maXJzdENoaWxkOmguZmlyc3RDaGlsZCl7Yj1iJiZjLm5vZGVOYW1lKGYsInRyIik7Zj0wO2Zvcih2YXIgbz10aGlzLmxlbmd0aDtmPG87ZisrKWQuY2FsbChiP2Mubm9kZU5hbWUodGhpc1tmXSwidGFibGUiKT90aGlzW2ZdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdfHx0aGlzW2ZdLmFwcGVuZENoaWxkKHRoaXNbZl0ub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpKToKdGhpc1tmXTp0aGlzW2ZdLGY+MHx8ZS5jYWNoZWFibGV8fHRoaXMubGVuZ3RoPjE/aC5jbG9uZU5vZGUodHJ1ZSk6aCl9ay5sZW5ndGgmJmMuZWFjaChrLE9hKX1yZXR1cm4gdGhpc319KTtjLmJ1aWxkRnJhZ21lbnQ9ZnVuY3Rpb24oYSxiLGQpe3ZhciBlLGYsaDtiPWImJmJbMF0/YlswXS5vd25lckRvY3VtZW50fHxiWzBdOnQ7aWYoYS5sZW5ndGg9PT0xJiZ0eXBlb2YgYVswXT09PSJzdHJpbmciJiZhWzBdLmxlbmd0aDw1MTImJmI9PT10JiYhQ2EudGVzdChhWzBdKSYmKGMuc3VwcG9ydC5jaGVja0Nsb25lfHwhRGEudGVzdChhWzBdKSkpe2Y9dHJ1ZTtpZihoPWMuZnJhZ21lbnRzW2FbMF1dKWlmKGghPT0xKWU9aH1pZighZSl7ZT1iLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtjLmNsZWFuKGEsYixlLGQpfWlmKGYpYy5mcmFnbWVudHNbYVswXV09aD9lOjE7cmV0dXJue2ZyYWdtZW50OmUsY2FjaGVhYmxlOmZ9fTtjLmZyYWdtZW50cz17fTtjLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLApwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oYSxiKXtjLmZuW2FdPWZ1bmN0aW9uKGQpe3ZhciBlPVtdO2Q9YyhkKTt2YXIgZj10aGlzLmxlbmd0aD09PTEmJnRoaXNbMF0ucGFyZW50Tm9kZTtpZihmJiZmLm5vZGVUeXBlPT09MTEmJmYuY2hpbGROb2Rlcy5sZW5ndGg9PT0xJiZkLmxlbmd0aD09PTEpe2RbYl0odGhpc1swXSk7cmV0dXJuIHRoaXN9ZWxzZXtmPTA7Zm9yKHZhciBoPWQubGVuZ3RoO2Y8aDtmKyspe3ZhciBsPShmPjA/dGhpcy5jbG9uZSh0cnVlKTp0aGlzKS5nZXQoKTtjKGRbZl0pW2JdKGwpO2U9ZS5jb25jYXQobCl9cmV0dXJuIHRoaXMucHVzaFN0YWNrKGUsYSxkLnNlbGVjdG9yKX19fSk7Yy5leHRlbmQoe2NsZWFuOmZ1bmN0aW9uKGEsYixkLGUpe2I9Ynx8dDtpZih0eXBlb2YgYi5jcmVhdGVFbGVtZW50PT09InVuZGVmaW5lZCIpYj1iLm93bmVyRG9jdW1lbnR8fApiWzBdJiZiWzBdLm93bmVyRG9jdW1lbnR8fHQ7Zm9yKHZhciBmPVtdLGg9MCxsOyhsPWFbaF0pIT1udWxsO2grKyl7aWYodHlwZW9mIGw9PT0ibnVtYmVyIilsKz0iIjtpZihsKXtpZih0eXBlb2YgbD09PSJzdHJpbmciJiYhZWIudGVzdChsKSlsPWIuY3JlYXRlVGV4dE5vZGUobCk7ZWxzZSBpZih0eXBlb2YgbD09PSJzdHJpbmciKXtsPWwucmVwbGFjZShBYSwiPCQxPjwvJDI+Iik7dmFyIGs9KEJhLmV4ZWMobCl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksbz1QW2tdfHxQLl9kZWZhdWx0LHg9b1swXSxyPWIuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zm9yKHIuaW5uZXJIVE1MPW9bMV0rbCtvWzJdO3gtLTspcj1yLmxhc3RDaGlsZDtpZighYy5zdXBwb3J0LnRib2R5KXt4PWRiLnRlc3QobCk7az1rPT09InRhYmxlIiYmIXg/ci5maXJzdENoaWxkJiZyLmZpcnN0Q2hpbGQuY2hpbGROb2RlczpvWzFdPT09Ijx0YWJsZT4iJiYheD9yLmNoaWxkTm9kZXM6W107Zm9yKG89ay5sZW5ndGgtCjE7bz49MDstLW8pYy5ub2RlTmFtZShrW29dLCJ0Ym9keSIpJiYha1tvXS5jaGlsZE5vZGVzLmxlbmd0aCYma1tvXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGtbb10pfSFjLnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2UmJiQudGVzdChsKSYmci5pbnNlcnRCZWZvcmUoYi5jcmVhdGVUZXh0Tm9kZSgkLmV4ZWMobClbMF0pLHIuZmlyc3RDaGlsZCk7bD1yLmNoaWxkTm9kZXN9aWYobC5ub2RlVHlwZSlmLnB1c2gobCk7ZWxzZSBmPWMubWVyZ2UoZixsKX19aWYoZClmb3IoaD0wO2ZbaF07aCsrKWlmKGUmJmMubm9kZU5hbWUoZltoXSwic2NyaXB0IikmJighZltoXS50eXBlfHxmW2hdLnR5cGUudG9Mb3dlckNhc2UoKT09PSJ0ZXh0L2phdmFzY3JpcHQiKSllLnB1c2goZltoXS5wYXJlbnROb2RlP2ZbaF0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChmW2hdKTpmW2hdKTtlbHNle2ZbaF0ubm9kZVR5cGU9PT0xJiZmLnNwbGljZS5hcHBseShmLFtoKzEsMF0uY29uY2F0KGMubWFrZUFycmF5KGZbaF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpKSkpOwpkLmFwcGVuZENoaWxkKGZbaF0pfXJldHVybiBmfSxjbGVhbkRhdGE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiLGQsZT1jLmNhY2hlLGY9Yy5ldmVudC5zcGVjaWFsLGg9Yy5zdXBwb3J0LmRlbGV0ZUV4cGFuZG8sbD0wLGs7KGs9YVtsXSkhPW51bGw7bCsrKWlmKCEoay5ub2RlTmFtZSYmYy5ub0RhdGFbay5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkpaWYoZD1rW2MuZXhwYW5kb10pe2lmKChiPWVbZF0pJiZiLmV2ZW50cylmb3IodmFyIG8gaW4gYi5ldmVudHMpZltvXT9jLmV2ZW50LnJlbW92ZShrLG8pOmMucmVtb3ZlRXZlbnQoayxvLGIuaGFuZGxlKTtpZihoKWRlbGV0ZSBrW2MuZXhwYW5kb107ZWxzZSBrLnJlbW92ZUF0dHJpYnV0ZSYmay5yZW1vdmVBdHRyaWJ1dGUoYy5leHBhbmRvKTtkZWxldGUgZVtkXX19fSk7dmFyIEVhPS9hbHBoYVwoW14pXSpcKS9pLGdiPS9vcGFjaXR5PShbXildKikvLGhiPS8tKFthLXpdKS9pZyxpYj0vKFtBLVpdKS9nLEZhPS9eLT9cZCsoPzpweCk/JC9pLApqYj0vXi0/XGQvLGtiPXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxQYT1bIkxlZnQiLCJSaWdodCJdLFFhPVsiVG9wIiwiQm90dG9tIl0sVyxHYSxhYSxsYj1mdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9O2MuZm4uY3NzPWZ1bmN0aW9uKGEsYil7aWYoYXJndW1lbnRzLmxlbmd0aD09PTImJmI9PT1CKXJldHVybiB0aGlzO3JldHVybiBjLmFjY2Vzcyh0aGlzLGEsYix0cnVlLGZ1bmN0aW9uKGQsZSxmKXtyZXR1cm4gZiE9PUI/Yy5zdHlsZShkLGUsZik6Yy5jc3MoZCxlKX0pfTtjLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBkPVcoYSwib3BhY2l0eSIsIm9wYWNpdHkiKTtyZXR1cm4gZD09PSIiPyIxIjpkfWVsc2UgcmV0dXJuIGEuc3R5bGUub3BhY2l0eX19fSxjc3NOdW1iZXI6e3pJbmRleDp0cnVlLGZvbnRXZWlnaHQ6dHJ1ZSxvcGFjaXR5OnRydWUsCnpvb206dHJ1ZSxsaW5lSGVpZ2h0OnRydWV9LGNzc1Byb3BzOnsiZmxvYXQiOmMuc3VwcG9ydC5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxiLGQsZSl7aWYoISghYXx8YS5ub2RlVHlwZT09PTN8fGEubm9kZVR5cGU9PT04fHwhYS5zdHlsZSkpe3ZhciBmLGg9Yy5jYW1lbENhc2UoYiksbD1hLnN0eWxlLGs9Yy5jc3NIb29rc1toXTtiPWMuY3NzUHJvcHNbaF18fGg7aWYoZCE9PUIpe2lmKCEodHlwZW9mIGQ9PT0ibnVtYmVyIiYmaXNOYU4oZCl8fGQ9PW51bGwpKXtpZih0eXBlb2YgZD09PSJudW1iZXIiJiYhYy5jc3NOdW1iZXJbaF0pZCs9InB4IjtpZigha3x8ISgic2V0ImluIGspfHwoZD1rLnNldChhLGQpKSE9PUIpdHJ5e2xbYl09ZH1jYXRjaChvKXt9fX1lbHNle2lmKGsmJiJnZXQiaW4gayYmKGY9ay5nZXQoYSxmYWxzZSxlKSkhPT1CKXJldHVybiBmO3JldHVybiBsW2JdfX19LGNzczpmdW5jdGlvbihhLGIsZCl7dmFyIGUsZj1jLmNhbWVsQ2FzZShiKSwKaD1jLmNzc0hvb2tzW2ZdO2I9Yy5jc3NQcm9wc1tmXXx8ZjtpZihoJiYiZ2V0ImluIGgmJihlPWguZ2V0KGEsdHJ1ZSxkKSkhPT1CKXJldHVybiBlO2Vsc2UgaWYoVylyZXR1cm4gVyhhLGIsZil9LHN3YXA6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPXt9LGY7Zm9yKGYgaW4gYil7ZVtmXT1hLnN0eWxlW2ZdO2Euc3R5bGVbZl09YltmXX1kLmNhbGwoYSk7Zm9yKGYgaW4gYilhLnN0eWxlW2ZdPWVbZl19LGNhbWVsQ2FzZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKGhiLGxiKX19KTtjLmN1ckNTUz1jLmNzcztjLmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKGEsYil7Yy5jc3NIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGQsZSxmKXt2YXIgaDtpZihlKXtpZihkLm9mZnNldFdpZHRoIT09MCloPW9hKGQsYixmKTtlbHNlIGMuc3dhcChkLGtiLGZ1bmN0aW9uKCl7aD1vYShkLGIsZil9KTtpZihoPD0wKXtoPVcoZCxiLGIpO2lmKGg9PT0iMHB4IiYmYWEpaD1hYShkLGIsYik7CmlmKGghPW51bGwpcmV0dXJuIGg9PT0iInx8aD09PSJhdXRvIj8iMHB4IjpofWlmKGg8MHx8aD09bnVsbCl7aD1kLnN0eWxlW2JdO3JldHVybiBoPT09IiJ8fGg9PT0iYXV0byI/IjBweCI6aH1yZXR1cm4gdHlwZW9mIGg9PT0ic3RyaW5nIj9oOmgrInB4In19LHNldDpmdW5jdGlvbihkLGUpe2lmKEZhLnRlc3QoZSkpe2U9cGFyc2VGbG9hdChlKTtpZihlPj0wKXJldHVybiBlKyJweCJ9ZWxzZSByZXR1cm4gZX19fSk7aWYoIWMuc3VwcG9ydC5vcGFjaXR5KWMuY3NzSG9va3Mub3BhY2l0eT17Z2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGdiLnRlc3QoKGImJmEuY3VycmVudFN0eWxlP2EuY3VycmVudFN0eWxlLmZpbHRlcjphLnN0eWxlLmZpbHRlcil8fCIiKT9wYXJzZUZsb2F0KFJlZ0V4cC4kMSkvMTAwKyIiOmI/IjEiOiIifSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hLnN0eWxlO2Quem9vbT0xO3ZhciBlPWMuaXNOYU4oYik/IiI6ImFscGhhKG9wYWNpdHk9IitiKjEwMCsiKSIsZj0KZC5maWx0ZXJ8fCIiO2QuZmlsdGVyPUVhLnRlc3QoZik/Zi5yZXBsYWNlKEVhLGUpOmQuZmlsdGVyKyIgIitlfX07aWYodC5kZWZhdWx0VmlldyYmdC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKUdhPWZ1bmN0aW9uKGEsYixkKXt2YXIgZTtkPWQucmVwbGFjZShpYiwiLSQxIikudG9Mb3dlckNhc2UoKTtpZighKGI9YS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KSlyZXR1cm4gQjtpZihiPWIuZ2V0Q29tcHV0ZWRTdHlsZShhLG51bGwpKXtlPWIuZ2V0UHJvcGVydHlWYWx1ZShkKTtpZihlPT09IiImJiFjLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsYSkpZT1jLnN0eWxlKGEsZCl9cmV0dXJuIGV9O2lmKHQuZG9jdW1lbnRFbGVtZW50LmN1cnJlbnRTdHlsZSlhYT1mdW5jdGlvbihhLGIpe3ZhciBkLGUsZj1hLmN1cnJlbnRTdHlsZSYmYS5jdXJyZW50U3R5bGVbYl0saD1hLnN0eWxlO2lmKCFGYS50ZXN0KGYpJiZqYi50ZXN0KGYpKXtkPWgubGVmdDsKZT1hLnJ1bnRpbWVTdHlsZS5sZWZ0O2EucnVudGltZVN0eWxlLmxlZnQ9YS5jdXJyZW50U3R5bGUubGVmdDtoLmxlZnQ9Yj09PSJmb250U2l6ZSI/IjFlbSI6Znx8MDtmPWgucGl4ZWxMZWZ0KyJweCI7aC5sZWZ0PWQ7YS5ydW50aW1lU3R5bGUubGVmdD1lfXJldHVybiBmPT09IiI/ImF1dG8iOmZ9O1c9R2F8fGFhO2lmKGMuZXhwciYmYy5leHByLmZpbHRlcnMpe2MuZXhwci5maWx0ZXJzLmhpZGRlbj1mdW5jdGlvbihhKXt2YXIgYj1hLm9mZnNldEhlaWdodDtyZXR1cm4gYS5vZmZzZXRXaWR0aD09PTAmJmI9PT0wfHwhYy5zdXBwb3J0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cyYmKGEuc3R5bGUuZGlzcGxheXx8Yy5jc3MoYSwiZGlzcGxheSIpKT09PSJub25lIn07Yy5leHByLmZpbHRlcnMudmlzaWJsZT1mdW5jdGlvbihhKXtyZXR1cm4hYy5leHByLmZpbHRlcnMuaGlkZGVuKGEpfX12YXIgbWI9Yy5ub3coKSxuYj0vPHNjcmlwdFxiW148XSooPzooPyE8XC9zY3JpcHQ+KTxbXjxdKikqPFwvc2NyaXB0Pi9naSwKb2I9L14oPzpzZWxlY3R8dGV4dGFyZWEpL2kscGI9L14oPzpjb2xvcnxkYXRlfGRhdGV0aW1lfGVtYWlsfGhpZGRlbnxtb250aHxudW1iZXJ8cGFzc3dvcmR8cmFuZ2V8c2VhcmNofHRlbHx0ZXh0fHRpbWV8dXJsfHdlZWspJC9pLHFiPS9eKD86R0VUfEhFQUQpJC8sUmE9L1xbXF0kLyxUPS9cPVw/KCZ8JCkvLGphPS9cPy8scmI9LyhbPyZdKV89W14mXSovLHNiPS9eKFx3KzopP1wvXC8oW15cLz8jXSspLyx0Yj0vJTIwL2csdWI9LyMuKiQvLEhhPWMuZm4ubG9hZDtjLmZuLmV4dGVuZCh7bG9hZDpmdW5jdGlvbihhLGIsZCl7aWYodHlwZW9mIGEhPT0ic3RyaW5nIiYmSGEpcmV0dXJuIEhhLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtlbHNlIGlmKCF0aGlzLmxlbmd0aClyZXR1cm4gdGhpczt2YXIgZT1hLmluZGV4T2YoIiAiKTtpZihlPj0wKXt2YXIgZj1hLnNsaWNlKGUsYS5sZW5ndGgpO2E9YS5zbGljZSgwLGUpfWU9IkdFVCI7aWYoYilpZihjLmlzRnVuY3Rpb24oYikpe2Q9YjtiPW51bGx9ZWxzZSBpZih0eXBlb2YgYj09PQoib2JqZWN0Iil7Yj1jLnBhcmFtKGIsYy5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpO2U9IlBPU1QifXZhciBoPXRoaXM7Yy5hamF4KHt1cmw6YSx0eXBlOmUsZGF0YVR5cGU6Imh0bWwiLGRhdGE6Yixjb21wbGV0ZTpmdW5jdGlvbihsLGspe2lmKGs9PT0ic3VjY2VzcyJ8fGs9PT0ibm90bW9kaWZpZWQiKWguaHRtbChmP2MoIjxkaXY+IikuYXBwZW5kKGwucmVzcG9uc2VUZXh0LnJlcGxhY2UobmIsIiIpKS5maW5kKGYpOmwucmVzcG9uc2VUZXh0KTtkJiZoLmVhY2goZCxbbC5yZXNwb25zZVRleHQsayxsXSl9fSk7cmV0dXJuIHRoaXN9LHNlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBjLnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudHM/Yy5tYWtlQXJyYXkodGhpcy5lbGVtZW50cyk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWUmJgohdGhpcy5kaXNhYmxlZCYmKHRoaXMuY2hlY2tlZHx8b2IudGVzdCh0aGlzLm5vZGVOYW1lKXx8cGIudGVzdCh0aGlzLnR5cGUpKX0pLm1hcChmdW5jdGlvbihhLGIpe3ZhciBkPWModGhpcykudmFsKCk7cmV0dXJuIGQ9PW51bGw/bnVsbDpjLmlzQXJyYXkoZCk/Yy5tYXAoZCxmdW5jdGlvbihlKXtyZXR1cm57bmFtZTpiLm5hbWUsdmFsdWU6ZX19KTp7bmFtZTpiLm5hbWUsdmFsdWU6ZH19KS5nZXQoKX19KTtjLmVhY2goImFqYXhTdGFydCBhamF4U3RvcCBhamF4Q29tcGxldGUgYWpheEVycm9yIGFqYXhTdWNjZXNzIGFqYXhTZW5kIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7Yy5mbltiXT1mdW5jdGlvbihkKXtyZXR1cm4gdGhpcy5iaW5kKGIsZCl9fSk7Yy5leHRlbmQoe2dldDpmdW5jdGlvbihhLGIsZCxlKXtpZihjLmlzRnVuY3Rpb24oYikpe2U9ZXx8ZDtkPWI7Yj1udWxsfXJldHVybiBjLmFqYXgoe3R5cGU6IkdFVCIsdXJsOmEsZGF0YTpiLHN1Y2Nlc3M6ZCxkYXRhVHlwZTplfSl9LApnZXRTY3JpcHQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYy5nZXQoYSxudWxsLGIsInNjcmlwdCIpfSxnZXRKU09OOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gYy5nZXQoYSxiLGQsImpzb24iKX0scG9zdDpmdW5jdGlvbihhLGIsZCxlKXtpZihjLmlzRnVuY3Rpb24oYikpe2U9ZXx8ZDtkPWI7Yj17fX1yZXR1cm4gYy5hamF4KHt0eXBlOiJQT1NUIix1cmw6YSxkYXRhOmIsc3VjY2VzczpkLGRhdGFUeXBlOmV9KX0sYWpheFNldHVwOmZ1bmN0aW9uKGEpe2MuZXh0ZW5kKGMuYWpheFNldHRpbmdzLGEpfSxhamF4U2V0dGluZ3M6e3VybDpsb2NhdGlvbi5ocmVmLGdsb2JhbDp0cnVlLHR5cGU6IkdFVCIsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIscHJvY2Vzc0RhdGE6dHJ1ZSxhc3luYzp0cnVlLHhocjpmdW5jdGlvbigpe3JldHVybiBuZXcgRS5YTUxIdHRwUmVxdWVzdH0sYWNjZXB0czp7eG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixodG1sOiJ0ZXh0L2h0bWwiLApzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0Iix0ZXh0OiJ0ZXh0L3BsYWluIixfZGVmYXVsdDoiKi8qIn19LGFqYXg6ZnVuY3Rpb24oYSl7dmFyIGI9Yy5leHRlbmQodHJ1ZSx7fSxjLmFqYXhTZXR0aW5ncyxhKSxkLGUsZixoPWIudHlwZS50b1VwcGVyQ2FzZSgpLGw9cWIudGVzdChoKTtiLnVybD1iLnVybC5yZXBsYWNlKHViLCIiKTtiLmNvbnRleHQ9YSYmYS5jb250ZXh0IT1udWxsP2EuY29udGV4dDpiO2lmKGIuZGF0YSYmYi5wcm9jZXNzRGF0YSYmdHlwZW9mIGIuZGF0YSE9PSJzdHJpbmciKWIuZGF0YT1jLnBhcmFtKGIuZGF0YSxiLnRyYWRpdGlvbmFsKTtpZihiLmRhdGFUeXBlPT09Impzb25wIil7aWYoaD09PSJHRVQiKVQudGVzdChiLnVybCl8fChiLnVybCs9KGphLnRlc3QoYi51cmwpPyImIjoiPyIpKyhiLmpzb25wfHwiY2FsbGJhY2siKSsiPT8iKTtlbHNlIGlmKCFiLmRhdGF8fAohVC50ZXN0KGIuZGF0YSkpYi5kYXRhPShiLmRhdGE/Yi5kYXRhKyImIjoiIikrKGIuanNvbnB8fCJjYWxsYmFjayIpKyI9PyI7Yi5kYXRhVHlwZT0ianNvbiJ9aWYoYi5kYXRhVHlwZT09PSJqc29uIiYmKGIuZGF0YSYmVC50ZXN0KGIuZGF0YSl8fFQudGVzdChiLnVybCkpKXtkPWIuanNvbnBDYWxsYmFja3x8Impzb25wIittYisrO2lmKGIuZGF0YSliLmRhdGE9KGIuZGF0YSsiIikucmVwbGFjZShULCI9IitkKyIkMSIpO2IudXJsPWIudXJsLnJlcGxhY2UoVCwiPSIrZCsiJDEiKTtiLmRhdGFUeXBlPSJzY3JpcHQiO3ZhciBrPUVbZF07RVtkXT1mdW5jdGlvbihtKXtpZihjLmlzRnVuY3Rpb24oaykpayhtKTtlbHNle0VbZF09Qjt0cnl7ZGVsZXRlIEVbZF19Y2F0Y2gocCl7fX1mPW07Yy5oYW5kbGVTdWNjZXNzKGIsdyxlLGYpO2MuaGFuZGxlQ29tcGxldGUoYix3LGUsZik7ciYmci5yZW1vdmVDaGlsZChBKX19aWYoYi5kYXRhVHlwZT09PSJzY3JpcHQiJiZiLmNhY2hlPT09bnVsbCliLmNhY2hlPQpmYWxzZTtpZihiLmNhY2hlPT09ZmFsc2UmJmwpe3ZhciBvPWMubm93KCkseD1iLnVybC5yZXBsYWNlKHJiLCIkMV89IitvKTtiLnVybD14Kyh4PT09Yi51cmw/KGphLnRlc3QoYi51cmwpPyImIjoiPyIpKyJfPSIrbzoiIil9aWYoYi5kYXRhJiZsKWIudXJsKz0oamEudGVzdChiLnVybCk/IiYiOiI/IikrYi5kYXRhO2IuZ2xvYmFsJiZjLmFjdGl2ZSsrPT09MCYmYy5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKTtvPShvPXNiLmV4ZWMoYi51cmwpKSYmKG9bMV0mJm9bMV0udG9Mb3dlckNhc2UoKSE9PWxvY2F0aW9uLnByb3RvY29sfHxvWzJdLnRvTG93ZXJDYXNlKCkhPT1sb2NhdGlvbi5ob3N0KTtpZihiLmRhdGFUeXBlPT09InNjcmlwdCImJmg9PT0iR0VUIiYmbyl7dmFyIHI9dC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdfHx0LmRvY3VtZW50RWxlbWVudCxBPXQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7aWYoYi5zY3JpcHRDaGFyc2V0KUEuY2hhcnNldD1iLnNjcmlwdENoYXJzZXQ7CkEuc3JjPWIudXJsO2lmKCFkKXt2YXIgQz1mYWxzZTtBLm9ubG9hZD1BLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2lmKCFDJiYoIXRoaXMucmVhZHlTdGF0ZXx8dGhpcy5yZWFkeVN0YXRlPT09ImxvYWRlZCJ8fHRoaXMucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpKXtDPXRydWU7Yy5oYW5kbGVTdWNjZXNzKGIsdyxlLGYpO2MuaGFuZGxlQ29tcGxldGUoYix3LGUsZik7QS5vbmxvYWQ9QS5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbDtyJiZBLnBhcmVudE5vZGUmJnIucmVtb3ZlQ2hpbGQoQSl9fX1yLmluc2VydEJlZm9yZShBLHIuZmlyc3RDaGlsZCk7cmV0dXJuIEJ9dmFyIEo9ZmFsc2Usdz1iLnhocigpO2lmKHcpe2IudXNlcm5hbWU/dy5vcGVuKGgsYi51cmwsYi5hc3luYyxiLnVzZXJuYW1lLGIucGFzc3dvcmQpOncub3BlbihoLGIudXJsLGIuYXN5bmMpO3RyeXtpZihiLmRhdGEhPW51bGwmJiFsfHxhJiZhLmNvbnRlbnRUeXBlKXcuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIiwKYi5jb250ZW50VHlwZSk7aWYoYi5pZk1vZGlmaWVkKXtjLmxhc3RNb2RpZmllZFtiLnVybF0mJncuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLGMubGFzdE1vZGlmaWVkW2IudXJsXSk7Yy5ldGFnW2IudXJsXSYmdy5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixjLmV0YWdbYi51cmxdKX1vfHx3LnNldFJlcXVlc3RIZWFkZXIoIlgtUmVxdWVzdGVkLVdpdGgiLCJYTUxIdHRwUmVxdWVzdCIpO3cuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixiLmRhdGFUeXBlJiZiLmFjY2VwdHNbYi5kYXRhVHlwZV0/Yi5hY2NlcHRzW2IuZGF0YVR5cGVdKyIsICovKjsgcT0wLjAxIjpiLmFjY2VwdHMuX2RlZmF1bHQpfWNhdGNoKEkpe31pZihiLmJlZm9yZVNlbmQmJmIuYmVmb3JlU2VuZC5jYWxsKGIuY29udGV4dCx3LGIpPT09ZmFsc2Upe2IuZ2xvYmFsJiZjLmFjdGl2ZS0tPT09MSYmYy5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpO3cuYWJvcnQoKTtyZXR1cm4gZmFsc2V9Yi5nbG9iYWwmJgpjLnRyaWdnZXJHbG9iYWwoYiwiYWpheFNlbmQiLFt3LGJdKTt2YXIgTD13Lm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbihtKXtpZighd3x8dy5yZWFkeVN0YXRlPT09MHx8bT09PSJhYm9ydCIpe0p8fGMuaGFuZGxlQ29tcGxldGUoYix3LGUsZik7Sj10cnVlO2lmKHcpdy5vbnJlYWR5c3RhdGVjaGFuZ2U9Yy5ub29wfWVsc2UgaWYoIUomJncmJih3LnJlYWR5U3RhdGU9PT00fHxtPT09InRpbWVvdXQiKSl7Sj10cnVlO3cub25yZWFkeXN0YXRlY2hhbmdlPWMubm9vcDtlPW09PT0idGltZW91dCI/InRpbWVvdXQiOiFjLmh0dHBTdWNjZXNzKHcpPyJlcnJvciI6Yi5pZk1vZGlmaWVkJiZjLmh0dHBOb3RNb2RpZmllZCh3LGIudXJsKT8ibm90bW9kaWZpZWQiOiJzdWNjZXNzIjt2YXIgcDtpZihlPT09InN1Y2Nlc3MiKXRyeXtmPWMuaHR0cERhdGEodyxiLmRhdGFUeXBlLGIpfWNhdGNoKHEpe2U9InBhcnNlcmVycm9yIjtwPXF9aWYoZT09PSJzdWNjZXNzInx8ZT09PSJub3Rtb2RpZmllZCIpZHx8CmMuaGFuZGxlU3VjY2VzcyhiLHcsZSxmKTtlbHNlIGMuaGFuZGxlRXJyb3IoYix3LGUscCk7ZHx8Yy5oYW5kbGVDb21wbGV0ZShiLHcsZSxmKTttPT09InRpbWVvdXQiJiZ3LmFib3J0KCk7aWYoYi5hc3luYyl3PW51bGx9fTt0cnl7dmFyIGc9dy5hYm9ydDt3LmFib3J0PWZ1bmN0aW9uKCl7dyYmRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwuY2FsbChnLHcpO0woImFib3J0Iil9fWNhdGNoKGkpe31iLmFzeW5jJiZiLnRpbWVvdXQ+MCYmc2V0VGltZW91dChmdW5jdGlvbigpe3cmJiFKJiZMKCJ0aW1lb3V0Iil9LGIudGltZW91dCk7dHJ5e3cuc2VuZChsfHxiLmRhdGE9PW51bGw/bnVsbDpiLmRhdGEpfWNhdGNoKG4pe2MuaGFuZGxlRXJyb3IoYix3LG51bGwsbik7Yy5oYW5kbGVDb21wbGV0ZShiLHcsZSxmKX1iLmFzeW5jfHxMKCk7cmV0dXJuIHd9fSxwYXJhbTpmdW5jdGlvbihhLGIpe3ZhciBkPVtdLGU9ZnVuY3Rpb24oaCxsKXtsPWMuaXNGdW5jdGlvbihsKT9sKCk6bDtkW2QubGVuZ3RoXT0KZW5jb2RlVVJJQ29tcG9uZW50KGgpKyI9IitlbmNvZGVVUklDb21wb25lbnQobCl9O2lmKGI9PT1CKWI9Yy5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWw7aWYoYy5pc0FycmF5KGEpfHxhLmpxdWVyeSljLmVhY2goYSxmdW5jdGlvbigpe2UodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IodmFyIGYgaW4gYSlkYShmLGFbZl0sYixlKTtyZXR1cm4gZC5qb2luKCImIikucmVwbGFjZSh0YiwiKyIpfX0pO2MuZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fSxoYW5kbGVFcnJvcjpmdW5jdGlvbihhLGIsZCxlKXthLmVycm9yJiZhLmVycm9yLmNhbGwoYS5jb250ZXh0LGIsZCxlKTthLmdsb2JhbCYmYy50cmlnZ2VyR2xvYmFsKGEsImFqYXhFcnJvciIsW2IsYSxlXSl9LGhhbmRsZVN1Y2Nlc3M6ZnVuY3Rpb24oYSxiLGQsZSl7YS5zdWNjZXNzJiZhLnN1Y2Nlc3MuY2FsbChhLmNvbnRleHQsZSxkLGIpO2EuZ2xvYmFsJiZjLnRyaWdnZXJHbG9iYWwoYSwiYWpheFN1Y2Nlc3MiLApbYixhXSl9LGhhbmRsZUNvbXBsZXRlOmZ1bmN0aW9uKGEsYixkKXthLmNvbXBsZXRlJiZhLmNvbXBsZXRlLmNhbGwoYS5jb250ZXh0LGIsZCk7YS5nbG9iYWwmJmMudHJpZ2dlckdsb2JhbChhLCJhamF4Q29tcGxldGUiLFtiLGFdKTthLmdsb2JhbCYmYy5hY3RpdmUtLT09PTEmJmMuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKX0sdHJpZ2dlckdsb2JhbDpmdW5jdGlvbihhLGIsZCl7KGEuY29udGV4dCYmYS5jb250ZXh0LnVybD09bnVsbD9jKGEuY29udGV4dCk6Yy5ldmVudCkudHJpZ2dlcihiLGQpfSxodHRwU3VjY2VzczpmdW5jdGlvbihhKXt0cnl7cmV0dXJuIWEuc3RhdHVzJiZsb2NhdGlvbi5wcm90b2NvbD09PSJmaWxlOiJ8fGEuc3RhdHVzPj0yMDAmJmEuc3RhdHVzPDMwMHx8YS5zdGF0dXM9PT0zMDR8fGEuc3RhdHVzPT09MTIyM31jYXRjaChiKXt9cmV0dXJuIGZhbHNlfSxodHRwTm90TW9kaWZpZWQ6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hLmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIiksCmU9YS5nZXRSZXNwb25zZUhlYWRlcigiRXRhZyIpO2lmKGQpYy5sYXN0TW9kaWZpZWRbYl09ZDtpZihlKWMuZXRhZ1tiXT1lO3JldHVybiBhLnN0YXR1cz09PTMwNH0saHR0cERhdGE6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPWEuZ2V0UmVzcG9uc2VIZWFkZXIoImNvbnRlbnQtdHlwZSIpfHwiIixmPWI9PT0ieG1sInx8IWImJmUuaW5kZXhPZigieG1sIik+PTA7YT1mP2EucmVzcG9uc2VYTUw6YS5yZXNwb25zZVRleHQ7ZiYmYS5kb2N1bWVudEVsZW1lbnQubm9kZU5hbWU9PT0icGFyc2VyZXJyb3IiJiZjLmVycm9yKCJwYXJzZXJlcnJvciIpO2lmKGQmJmQuZGF0YUZpbHRlcilhPWQuZGF0YUZpbHRlcihhLGIpO2lmKHR5cGVvZiBhPT09InN0cmluZyIpaWYoYj09PSJqc29uInx8IWImJmUuaW5kZXhPZigianNvbiIpPj0wKWE9Yy5wYXJzZUpTT04oYSk7ZWxzZSBpZihiPT09InNjcmlwdCJ8fCFiJiZlLmluZGV4T2YoImphdmFzY3JpcHQiKT49MCljLmdsb2JhbEV2YWwoYSk7cmV0dXJuIGF9fSk7CmlmKEUuQWN0aXZlWE9iamVjdCljLmFqYXhTZXR0aW5ncy54aHI9ZnVuY3Rpb24oKXtpZihFLmxvY2F0aW9uLnByb3RvY29sIT09ImZpbGU6Iil0cnl7cmV0dXJuIG5ldyBFLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGEpe310cnl7cmV0dXJuIG5ldyBFLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2goYil7fX07Yy5zdXBwb3J0LmFqYXg9ISFjLmFqYXhTZXR0aW5ncy54aHIoKTt2YXIgZWE9e30sdmI9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLHdiPS9eKFsrXC1dPSk/KFtcZCsuXC1dKykoLiopJC8sYmEscGE9W1siaGVpZ2h0IiwibWFyZ2luVG9wIiwibWFyZ2luQm90dG9tIiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iXSxbIndpZHRoIiwibWFyZ2luTGVmdCIsIm1hcmdpblJpZ2h0IiwicGFkZGluZ0xlZnQiLCJwYWRkaW5nUmlnaHQiXSxbIm9wYWNpdHkiXV07Yy5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oYSxiLGQpe2lmKGF8fGE9PT0wKXJldHVybiB0aGlzLmFuaW1hdGUoUygic2hvdyIsCjMpLGEsYixkKTtlbHNle2Q9MDtmb3IodmFyIGU9dGhpcy5sZW5ndGg7ZDxlO2QrKyl7YT10aGlzW2RdO2I9YS5zdHlsZS5kaXNwbGF5O2lmKCFjLmRhdGEoYSwib2xkZGlzcGxheSIpJiZiPT09Im5vbmUiKWI9YS5zdHlsZS5kaXNwbGF5PSIiO2I9PT0iIiYmYy5jc3MoYSwiZGlzcGxheSIpPT09Im5vbmUiJiZjLmRhdGEoYSwib2xkZGlzcGxheSIscWEoYS5ub2RlTmFtZSkpfWZvcihkPTA7ZDxlO2QrKyl7YT10aGlzW2RdO2I9YS5zdHlsZS5kaXNwbGF5O2lmKGI9PT0iInx8Yj09PSJub25lIilhLnN0eWxlLmRpc3BsYXk9Yy5kYXRhKGEsIm9sZGRpc3BsYXkiKXx8IiJ9cmV0dXJuIHRoaXN9fSxoaWRlOmZ1bmN0aW9uKGEsYixkKXtpZihhfHxhPT09MClyZXR1cm4gdGhpcy5hbmltYXRlKFMoImhpZGUiLDMpLGEsYixkKTtlbHNle2E9MDtmb3IoYj10aGlzLmxlbmd0aDthPGI7YSsrKXtkPWMuY3NzKHRoaXNbYV0sImRpc3BsYXkiKTtkIT09Im5vbmUiJiZjLmRhdGEodGhpc1thXSwib2xkZGlzcGxheSIsCmQpfWZvcihhPTA7YTxiO2ErKyl0aGlzW2FdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3JldHVybiB0aGlzfX0sX3RvZ2dsZTpjLmZuLnRvZ2dsZSx0b2dnbGU6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPXR5cGVvZiBhPT09ImJvb2xlYW4iO2lmKGMuaXNGdW5jdGlvbihhKSYmYy5pc0Z1bmN0aW9uKGIpKXRoaXMuX3RvZ2dsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZWxzZSBhPT1udWxsfHxlP3RoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBmPWU/YTpjKHRoaXMpLmlzKCI6aGlkZGVuIik7Yyh0aGlzKVtmPyJzaG93IjoiaGlkZSJdKCl9KTp0aGlzLmFuaW1hdGUoUygidG9nZ2xlIiwzKSxhLGIsZCk7cmV0dXJuIHRoaXN9LGZhZGVUbzpmdW5jdGlvbihhLGIsZCxlKXtyZXR1cm4gdGhpcy5maWx0ZXIoIjpoaWRkZW4iKS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OmJ9LGEsZCxlKX0sYW5pbWF0ZTpmdW5jdGlvbihhLGIsZCxlKXt2YXIgZj1jLnNwZWVkKGIsCmQsZSk7aWYoYy5pc0VtcHR5T2JqZWN0KGEpKXJldHVybiB0aGlzLmVhY2goZi5jb21wbGV0ZSk7cmV0dXJuIHRoaXNbZi5xdWV1ZT09PWZhbHNlPyJlYWNoIjoicXVldWUiXShmdW5jdGlvbigpe3ZhciBoPWMuZXh0ZW5kKHt9LGYpLGwsaz10aGlzLm5vZGVUeXBlPT09MSxvPWsmJmModGhpcykuaXMoIjpoaWRkZW4iKSx4PXRoaXM7Zm9yKGwgaW4gYSl7dmFyIHI9Yy5jYW1lbENhc2UobCk7aWYobCE9PXIpe2Fbcl09YVtsXTtkZWxldGUgYVtsXTtsPXJ9aWYoYVtsXT09PSJoaWRlIiYmb3x8YVtsXT09PSJzaG93IiYmIW8pcmV0dXJuIGguY29tcGxldGUuY2FsbCh0aGlzKTtpZihrJiYobD09PSJoZWlnaHQifHxsPT09IndpZHRoIikpe2gub3ZlcmZsb3c9W3RoaXMuc3R5bGUub3ZlcmZsb3csdGhpcy5zdHlsZS5vdmVyZmxvd1gsdGhpcy5zdHlsZS5vdmVyZmxvd1ldO2lmKGMuY3NzKHRoaXMsImRpc3BsYXkiKT09PSJpbmxpbmUiJiZjLmNzcyh0aGlzLCJmbG9hdCIpPT09Im5vbmUiKWlmKGMuc3VwcG9ydC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0KWlmKHFhKHRoaXMubm9kZU5hbWUpPT09CiJpbmxpbmUiKXRoaXMuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIjtlbHNle3RoaXMuc3R5bGUuZGlzcGxheT0iaW5saW5lIjt0aGlzLnN0eWxlLnpvb209MX1lbHNlIHRoaXMuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIn1pZihjLmlzQXJyYXkoYVtsXSkpeyhoLnNwZWNpYWxFYXNpbmc9aC5zcGVjaWFsRWFzaW5nfHx7fSlbbF09YVtsXVsxXTthW2xdPWFbbF1bMF19fWlmKGgub3ZlcmZsb3chPW51bGwpdGhpcy5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIjtoLmN1ckFuaW09Yy5leHRlbmQoe30sYSk7Yy5lYWNoKGEsZnVuY3Rpb24oQSxDKXt2YXIgSj1uZXcgYy5meCh4LGgsQSk7aWYodmIudGVzdChDKSlKW0M9PT0idG9nZ2xlIj9vPyJzaG93IjoiaGlkZSI6Q10oYSk7ZWxzZXt2YXIgdz13Yi5leGVjKEMpLEk9Si5jdXIoKXx8MDtpZih3KXt2YXIgTD1wYXJzZUZsb2F0KHdbMl0pLGc9d1szXXx8InB4IjtpZihnIT09InB4Iil7Yy5zdHlsZSh4LEEsKEx8fDEpK2cpO0k9KEx8fAoxKS9KLmN1cigpKkk7Yy5zdHlsZSh4LEEsSStnKX1pZih3WzFdKUw9KHdbMV09PT0iLT0iPy0xOjEpKkwrSTtKLmN1c3RvbShJLEwsZyl9ZWxzZSBKLmN1c3RvbShJLEMsIiIpfX0pO3JldHVybiB0cnVlfSl9LHN0b3A6ZnVuY3Rpb24oYSxiKXt2YXIgZD1jLnRpbWVyczthJiZ0aGlzLnF1ZXVlKFtdKTt0aGlzLmVhY2goZnVuY3Rpb24oKXtmb3IodmFyIGU9ZC5sZW5ndGgtMTtlPj0wO2UtLSlpZihkW2VdLmVsZW09PT10aGlzKXtiJiZkW2VdKHRydWUpO2Quc3BsaWNlKGUsMSl9fSk7Ynx8dGhpcy5kZXF1ZXVlKCk7cmV0dXJuIHRoaXN9fSk7Yy5lYWNoKHtzbGlkZURvd246Uygic2hvdyIsMSksc2xpZGVVcDpTKCJoaWRlIiwxKSxzbGlkZVRvZ2dsZTpTKCJ0b2dnbGUiLDEpLGZhZGVJbjp7b3BhY2l0eToic2hvdyJ9LGZhZGVPdXQ6e29wYWNpdHk6ImhpZGUifSxmYWRlVG9nZ2xlOntvcGFjaXR5OiJ0b2dnbGUifX0sZnVuY3Rpb24oYSxiKXtjLmZuW2FdPWZ1bmN0aW9uKGQsZSxmKXtyZXR1cm4gdGhpcy5hbmltYXRlKGIsCmQsZSxmKX19KTtjLmV4dGVuZCh7c3BlZWQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPWEmJnR5cGVvZiBhPT09Im9iamVjdCI/Yy5leHRlbmQoe30sYSk6e2NvbXBsZXRlOmR8fCFkJiZifHxjLmlzRnVuY3Rpb24oYSkmJmEsZHVyYXRpb246YSxlYXNpbmc6ZCYmYnx8YiYmIWMuaXNGdW5jdGlvbihiKSYmYn07ZS5kdXJhdGlvbj1jLmZ4Lm9mZj8wOnR5cGVvZiBlLmR1cmF0aW9uPT09Im51bWJlciI/ZS5kdXJhdGlvbjplLmR1cmF0aW9uIGluIGMuZnguc3BlZWRzP2MuZnguc3BlZWRzW2UuZHVyYXRpb25dOmMuZnguc3BlZWRzLl9kZWZhdWx0O2Uub2xkPWUuY29tcGxldGU7ZS5jb21wbGV0ZT1mdW5jdGlvbigpe2UucXVldWUhPT1mYWxzZSYmYyh0aGlzKS5kZXF1ZXVlKCk7Yy5pc0Z1bmN0aW9uKGUub2xkKSYmZS5vbGQuY2FsbCh0aGlzKX07cmV0dXJuIGV9LGVhc2luZzp7bGluZWFyOmZ1bmN0aW9uKGEsYixkLGUpe3JldHVybiBkK2UqYX0sc3dpbmc6ZnVuY3Rpb24oYSxiLGQsZSl7cmV0dXJuKC1NYXRoLmNvcyhhKgpNYXRoLlBJKS8yKzAuNSkqZStkfX0sdGltZXJzOltdLGZ4OmZ1bmN0aW9uKGEsYixkKXt0aGlzLm9wdGlvbnM9Yjt0aGlzLmVsZW09YTt0aGlzLnByb3A9ZDtpZighYi5vcmlnKWIub3JpZz17fX19KTtjLmZ4LnByb3RvdHlwZT17dXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpOyhjLmZ4LnN0ZXBbdGhpcy5wcm9wXXx8Yy5meC5zdGVwLl9kZWZhdWx0KSh0aGlzKX0sY3VyOmZ1bmN0aW9uKCl7aWYodGhpcy5lbGVtW3RoaXMucHJvcF0hPW51bGwmJighdGhpcy5lbGVtLnN0eWxlfHx0aGlzLmVsZW0uc3R5bGVbdGhpcy5wcm9wXT09bnVsbCkpcmV0dXJuIHRoaXMuZWxlbVt0aGlzLnByb3BdO3ZhciBhPXBhcnNlRmxvYXQoYy5jc3ModGhpcy5lbGVtLHRoaXMucHJvcCkpO3JldHVybiBhJiZhPi0xRTQ/YTowfSxjdXN0b206ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGUobCl7cmV0dXJuIGYuc3RlcChsKX0KdmFyIGY9dGhpcyxoPWMuZng7dGhpcy5zdGFydFRpbWU9Yy5ub3coKTt0aGlzLnN0YXJ0PWE7dGhpcy5lbmQ9Yjt0aGlzLnVuaXQ9ZHx8dGhpcy51bml0fHwicHgiO3RoaXMubm93PXRoaXMuc3RhcnQ7dGhpcy5wb3M9dGhpcy5zdGF0ZT0wO2UuZWxlbT10aGlzLmVsZW07aWYoZSgpJiZjLnRpbWVycy5wdXNoKGUpJiYhYmEpYmE9c2V0SW50ZXJ2YWwoaC50aWNrLGguaW50ZXJ2YWwpfSxzaG93OmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXT1jLnN0eWxlKHRoaXMuZWxlbSx0aGlzLnByb3ApO3RoaXMub3B0aW9ucy5zaG93PXRydWU7dGhpcy5jdXN0b20odGhpcy5wcm9wPT09IndpZHRoInx8dGhpcy5wcm9wPT09ImhlaWdodCI/MTowLHRoaXMuY3VyKCkpO2ModGhpcy5lbGVtKS5zaG93KCl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdPWMuc3R5bGUodGhpcy5lbGVtLHRoaXMucHJvcCk7dGhpcy5vcHRpb25zLmhpZGU9dHJ1ZTsKdGhpcy5jdXN0b20odGhpcy5jdXIoKSwwKX0sc3RlcDpmdW5jdGlvbihhKXt2YXIgYj1jLm5vdygpLGQ9dHJ1ZTtpZihhfHxiPj10aGlzLm9wdGlvbnMuZHVyYXRpb24rdGhpcy5zdGFydFRpbWUpe3RoaXMubm93PXRoaXMuZW5kO3RoaXMucG9zPXRoaXMuc3RhdGU9MTt0aGlzLnVwZGF0ZSgpO3RoaXMub3B0aW9ucy5jdXJBbmltW3RoaXMucHJvcF09dHJ1ZTtmb3IodmFyIGUgaW4gdGhpcy5vcHRpb25zLmN1ckFuaW0paWYodGhpcy5vcHRpb25zLmN1ckFuaW1bZV0hPT10cnVlKWQ9ZmFsc2U7aWYoZCl7aWYodGhpcy5vcHRpb25zLm92ZXJmbG93IT1udWxsJiYhYy5zdXBwb3J0LnNocmlua1dyYXBCbG9ja3Mpe3ZhciBmPXRoaXMuZWxlbSxoPXRoaXMub3B0aW9ucztjLmVhY2goWyIiLCJYIiwiWSJdLGZ1bmN0aW9uKGssbyl7Zi5zdHlsZVsib3ZlcmZsb3ciK29dPWgub3ZlcmZsb3dba119KX10aGlzLm9wdGlvbnMuaGlkZSYmYyh0aGlzLmVsZW0pLmhpZGUoKTtpZih0aGlzLm9wdGlvbnMuaGlkZXx8CnRoaXMub3B0aW9ucy5zaG93KWZvcih2YXIgbCBpbiB0aGlzLm9wdGlvbnMuY3VyQW5pbSljLnN0eWxlKHRoaXMuZWxlbSxsLHRoaXMub3B0aW9ucy5vcmlnW2xdKTt0aGlzLm9wdGlvbnMuY29tcGxldGUuY2FsbCh0aGlzLmVsZW0pfXJldHVybiBmYWxzZX1lbHNle2E9Yi10aGlzLnN0YXJ0VGltZTt0aGlzLnN0YXRlPWEvdGhpcy5vcHRpb25zLmR1cmF0aW9uO2I9dGhpcy5vcHRpb25zLmVhc2luZ3x8KGMuZWFzaW5nLnN3aW5nPyJzd2luZyI6ImxpbmVhciIpO3RoaXMucG9zPWMuZWFzaW5nW3RoaXMub3B0aW9ucy5zcGVjaWFsRWFzaW5nJiZ0aGlzLm9wdGlvbnMuc3BlY2lhbEVhc2luZ1t0aGlzLnByb3BdfHxiXSh0aGlzLnN0YXRlLGEsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik7dGhpcy5ub3c9dGhpcy5zdGFydCsodGhpcy5lbmQtdGhpcy5zdGFydCkqdGhpcy5wb3M7dGhpcy51cGRhdGUoKX1yZXR1cm4gdHJ1ZX19O2MuZXh0ZW5kKGMuZngse3RpY2s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CmMudGltZXJzLGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdKCl8fGEuc3BsaWNlKGItLSwxKTthLmxlbmd0aHx8Yy5meC5zdG9wKCl9LGludGVydmFsOjEzLHN0b3A6ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKGJhKTtiYT1udWxsfSxzcGVlZHM6e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0OjQwMH0sc3RlcDp7b3BhY2l0eTpmdW5jdGlvbihhKXtjLnN0eWxlKGEuZWxlbSwib3BhY2l0eSIsYS5ub3cpfSxfZGVmYXVsdDpmdW5jdGlvbihhKXtpZihhLmVsZW0uc3R5bGUmJmEuZWxlbS5zdHlsZVthLnByb3BdIT1udWxsKWEuZWxlbS5zdHlsZVthLnByb3BdPShhLnByb3A9PT0id2lkdGgifHxhLnByb3A9PT0iaGVpZ2h0Ij9NYXRoLm1heCgwLGEubm93KTphLm5vdykrYS51bml0O2Vsc2UgYS5lbGVtW2EucHJvcF09YS5ub3d9fX0pO2lmKGMuZXhwciYmYy5leHByLmZpbHRlcnMpYy5leHByLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGMuZ3JlcChjLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PQpiLmVsZW19KS5sZW5ndGh9O3ZhciB4Yj0vXnQoPzphYmxlfGR8aCkkL2ksSWE9L14oPzpib2R5fGh0bWwpJC9pO2MuZm4ub2Zmc2V0PSJnZXRCb3VuZGluZ0NsaWVudFJlY3QiaW4gdC5kb2N1bWVudEVsZW1lbnQ/ZnVuY3Rpb24oYSl7dmFyIGI9dGhpc1swXSxkO2lmKGEpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihsKXtjLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGwpfSk7aWYoIWJ8fCFiLm93bmVyRG9jdW1lbnQpcmV0dXJuIG51bGw7aWYoYj09PWIub3duZXJEb2N1bWVudC5ib2R5KXJldHVybiBjLm9mZnNldC5ib2R5T2Zmc2V0KGIpO3RyeXtkPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9Y2F0Y2goZSl7fXZhciBmPWIub3duZXJEb2N1bWVudCxoPWYuZG9jdW1lbnRFbGVtZW50O2lmKCFkfHwhYy5jb250YWlucyhoLGIpKXJldHVybiBkfHx7dG9wOjAsbGVmdDowfTtiPWYuYm9keTtmPWZhKGYpO3JldHVybnt0b3A6ZC50b3ArKGYucGFnZVlPZmZzZXR8fGMuc3VwcG9ydC5ib3hNb2RlbCYmCmguc2Nyb2xsVG9wfHxiLnNjcm9sbFRvcCktKGguY2xpZW50VG9wfHxiLmNsaWVudFRvcHx8MCksbGVmdDpkLmxlZnQrKGYucGFnZVhPZmZzZXR8fGMuc3VwcG9ydC5ib3hNb2RlbCYmaC5zY3JvbGxMZWZ0fHxiLnNjcm9sbExlZnQpLShoLmNsaWVudExlZnR8fGIuY2xpZW50TGVmdHx8MCl9fTpmdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdO2lmKGEpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbih4KXtjLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLHgpfSk7aWYoIWJ8fCFiLm93bmVyRG9jdW1lbnQpcmV0dXJuIG51bGw7aWYoYj09PWIub3duZXJEb2N1bWVudC5ib2R5KXJldHVybiBjLm9mZnNldC5ib2R5T2Zmc2V0KGIpO2Mub2Zmc2V0LmluaXRpYWxpemUoKTt2YXIgZCxlPWIub2Zmc2V0UGFyZW50LGY9Yi5vd25lckRvY3VtZW50LGg9Zi5kb2N1bWVudEVsZW1lbnQsbD1mLmJvZHk7ZD0oZj1mLmRlZmF1bHRWaWV3KT9mLmdldENvbXB1dGVkU3R5bGUoYixudWxsKTpiLmN1cnJlbnRTdHlsZTsKZm9yKHZhciBrPWIub2Zmc2V0VG9wLG89Yi5vZmZzZXRMZWZ0OyhiPWIucGFyZW50Tm9kZSkmJmIhPT1sJiZiIT09aDspe2lmKGMub2Zmc2V0LnN1cHBvcnRzRml4ZWRQb3NpdGlvbiYmZC5wb3NpdGlvbj09PSJmaXhlZCIpYnJlYWs7ZD1mP2YuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmIuY3VycmVudFN0eWxlO2stPWIuc2Nyb2xsVG9wO28tPWIuc2Nyb2xsTGVmdDtpZihiPT09ZSl7ays9Yi5vZmZzZXRUb3A7bys9Yi5vZmZzZXRMZWZ0O2lmKGMub2Zmc2V0LmRvZXNOb3RBZGRCb3JkZXImJiEoYy5vZmZzZXQuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHMmJnhiLnRlc3QoYi5ub2RlTmFtZSkpKXtrKz1wYXJzZUZsb2F0KGQuYm9yZGVyVG9wV2lkdGgpfHwwO28rPXBhcnNlRmxvYXQoZC5ib3JkZXJMZWZ0V2lkdGgpfHwwfWU9Yi5vZmZzZXRQYXJlbnR9aWYoYy5vZmZzZXQuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlJiZkLm92ZXJmbG93IT09InZpc2libGUiKXtrKz0KcGFyc2VGbG9hdChkLmJvcmRlclRvcFdpZHRoKXx8MDtvKz1wYXJzZUZsb2F0KGQuYm9yZGVyTGVmdFdpZHRoKXx8MH1kPWR9aWYoZC5wb3NpdGlvbj09PSJyZWxhdGl2ZSJ8fGQucG9zaXRpb249PT0ic3RhdGljIil7ays9bC5vZmZzZXRUb3A7bys9bC5vZmZzZXRMZWZ0fWlmKGMub2Zmc2V0LnN1cHBvcnRzRml4ZWRQb3NpdGlvbiYmZC5wb3NpdGlvbj09PSJmaXhlZCIpe2srPU1hdGgubWF4KGguc2Nyb2xsVG9wLGwuc2Nyb2xsVG9wKTtvKz1NYXRoLm1heChoLnNjcm9sbExlZnQsbC5zY3JvbGxMZWZ0KX1yZXR1cm57dG9wOmssbGVmdDpvfX07Yy5vZmZzZXQ9e2luaXRpYWxpemU6ZnVuY3Rpb24oKXt2YXIgYT10LmJvZHksYj10LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQsZSxmLGg9cGFyc2VGbG9hdChjLmNzcyhhLCJtYXJnaW5Ub3AiKSl8fDA7Yy5leHRlbmQoYi5zdHlsZSx7cG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAsbWFyZ2luOjAsYm9yZGVyOjAsd2lkdGg6IjFweCIsCmhlaWdodDoiMXB4Iix2aXNpYmlsaXR5OiJoaWRkZW4ifSk7Yi5pbm5lckhUTUw9IjxkaXYgc3R5bGU9J3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4Oyc+PGRpdj48L2Rpdj48L2Rpdj48dGFibGUgc3R5bGU9J3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4OycgY2VsbHBhZGRpbmc9JzAnIGNlbGxzcGFjaW5nPScwJz48dHI+PHRkPjwvdGQ+PC90cj48L3RhYmxlPiI7YS5pbnNlcnRCZWZvcmUoYixhLmZpcnN0Q2hpbGQpO2Q9Yi5maXJzdENoaWxkO2U9ZC5maXJzdENoaWxkO2Y9ZC5uZXh0U2libGluZy5maXJzdENoaWxkLmZpcnN0Q2hpbGQ7dGhpcy5kb2VzTm90QWRkQm9yZGVyPWUub2Zmc2V0VG9wIT09NTt0aGlzLmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzPQpmLm9mZnNldFRvcD09PTU7ZS5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiO2Uuc3R5bGUudG9wPSIyMHB4Ijt0aGlzLnN1cHBvcnRzRml4ZWRQb3NpdGlvbj1lLm9mZnNldFRvcD09PTIwfHxlLm9mZnNldFRvcD09PTE1O2Uuc3R5bGUucG9zaXRpb249ZS5zdHlsZS50b3A9IiI7ZC5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIjtkLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSI7dGhpcy5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGU9ZS5vZmZzZXRUb3A9PT0tNTt0aGlzLmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0PWEub2Zmc2V0VG9wIT09aDthLnJlbW92ZUNoaWxkKGIpO2Mub2Zmc2V0LmluaXRpYWxpemU9Yy5ub29wfSxib2R5T2Zmc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEub2Zmc2V0VG9wLGQ9YS5vZmZzZXRMZWZ0O2Mub2Zmc2V0LmluaXRpYWxpemUoKTtpZihjLm9mZnNldC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCl7Yis9cGFyc2VGbG9hdChjLmNzcyhhLAoibWFyZ2luVG9wIikpfHwwO2QrPXBhcnNlRmxvYXQoYy5jc3MoYSwibWFyZ2luTGVmdCIpKXx8MH1yZXR1cm57dG9wOmIsbGVmdDpkfX0sc2V0T2Zmc2V0OmZ1bmN0aW9uKGEsYixkKXt2YXIgZT1jLmNzcyhhLCJwb3NpdGlvbiIpO2lmKGU9PT0ic3RhdGljIilhLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSI7dmFyIGY9YyhhKSxoPWYub2Zmc2V0KCksbD1jLmNzcyhhLCJ0b3AiKSxrPWMuY3NzKGEsImxlZnQiKSxvPWU9PT0iYWJzb2x1dGUiJiZjLmluQXJyYXkoImF1dG8iLFtsLGtdKT4tMTtlPXt9O3ZhciB4PXt9O2lmKG8peD1mLnBvc2l0aW9uKCk7bD1vP3gudG9wOnBhcnNlSW50KGwsMTApfHwwO2s9bz94LmxlZnQ6cGFyc2VJbnQoaywxMCl8fDA7aWYoYy5pc0Z1bmN0aW9uKGIpKWI9Yi5jYWxsKGEsZCxoKTtpZihiLnRvcCE9bnVsbCllLnRvcD1iLnRvcC1oLnRvcCtsO2lmKGIubGVmdCE9bnVsbCllLmxlZnQ9Yi5sZWZ0LWgubGVmdCtrOyJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLAplKTpmLmNzcyhlKX19O2MuZm4uZXh0ZW5kKHtwb3NpdGlvbjpmdW5jdGlvbigpe2lmKCF0aGlzWzBdKXJldHVybiBudWxsO3ZhciBhPXRoaXNbMF0sYj10aGlzLm9mZnNldFBhcmVudCgpLGQ9dGhpcy5vZmZzZXQoKSxlPUlhLnRlc3QoYlswXS5ub2RlTmFtZSk/e3RvcDowLGxlZnQ6MH06Yi5vZmZzZXQoKTtkLnRvcC09cGFyc2VGbG9hdChjLmNzcyhhLCJtYXJnaW5Ub3AiKSl8fDA7ZC5sZWZ0LT1wYXJzZUZsb2F0KGMuY3NzKGEsIm1hcmdpbkxlZnQiKSl8fDA7ZS50b3ArPXBhcnNlRmxvYXQoYy5jc3MoYlswXSwiYm9yZGVyVG9wV2lkdGgiKSl8fDA7ZS5sZWZ0Kz1wYXJzZUZsb2F0KGMuY3NzKGJbMF0sImJvcmRlckxlZnRXaWR0aCIpKXx8MDtyZXR1cm57dG9wOmQudG9wLWUudG9wLGxlZnQ6ZC5sZWZ0LWUubGVmdH19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLm9mZnNldFBhcmVudHx8dC5ib2R5O2EmJiFJYS50ZXN0KGEubm9kZU5hbWUpJiYKYy5jc3MoYSwicG9zaXRpb24iKT09PSJzdGF0aWMiOylhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfSl9fSk7Yy5lYWNoKFsiTGVmdCIsIlRvcCJdLGZ1bmN0aW9uKGEsYil7dmFyIGQ9InNjcm9sbCIrYjtjLmZuW2RdPWZ1bmN0aW9uKGUpe3ZhciBmPXRoaXNbMF0saDtpZighZilyZXR1cm4gbnVsbDtpZihlIT09QilyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYoaD1mYSh0aGlzKSloLnNjcm9sbFRvKCFhP2U6YyhoKS5zY3JvbGxMZWZ0KCksYT9lOmMoaCkuc2Nyb2xsVG9wKCkpO2Vsc2UgdGhpc1tkXT1lfSk7ZWxzZSByZXR1cm4oaD1mYShmKSk/InBhZ2VYT2Zmc2V0ImluIGg/aFthPyJwYWdlWU9mZnNldCI6InBhZ2VYT2Zmc2V0Il06Yy5zdXBwb3J0LmJveE1vZGVsJiZoLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXXx8aC5kb2N1bWVudC5ib2R5W2RdOmZbZF19fSk7Yy5lYWNoKFsiSGVpZ2h0IiwiV2lkdGgiXSxmdW5jdGlvbihhLGIpe3ZhciBkPWIudG9Mb3dlckNhc2UoKTsKYy5mblsiaW5uZXIiK2JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbMF0/cGFyc2VGbG9hdChjLmNzcyh0aGlzWzBdLGQsInBhZGRpbmciKSk6bnVsbH07Yy5mblsib3V0ZXIiK2JdPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzWzBdP3BhcnNlRmxvYXQoYy5jc3ModGhpc1swXSxkLGU/Im1hcmdpbiI6ImJvcmRlciIpKTpudWxsfTtjLmZuW2RdPWZ1bmN0aW9uKGUpe3ZhciBmPXRoaXNbMF07aWYoIWYpcmV0dXJuIGU9PW51bGw/bnVsbDp0aGlzO2lmKGMuaXNGdW5jdGlvbihlKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGwpe3ZhciBrPWModGhpcyk7a1tkXShlLmNhbGwodGhpcyxsLGtbZF0oKSkpfSk7aWYoYy5pc1dpbmRvdyhmKSlyZXR1cm4gZi5kb2N1bWVudC5jb21wYXRNb2RlPT09IkNTUzFDb21wYXQiJiZmLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IitiXXx8Zi5kb2N1bWVudC5ib2R5WyJjbGllbnQiK2JdO2Vsc2UgaWYoZi5ub2RlVHlwZT09PTkpcmV0dXJuIE1hdGgubWF4KGYuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiKwpiXSxmLmJvZHlbInNjcm9sbCIrYl0sZi5kb2N1bWVudEVsZW1lbnRbInNjcm9sbCIrYl0sZi5ib2R5WyJvZmZzZXQiK2JdLGYuZG9jdW1lbnRFbGVtZW50WyJvZmZzZXQiK2JdKTtlbHNlIGlmKGU9PT1CKXtmPWMuY3NzKGYsZCk7dmFyIGg9cGFyc2VGbG9hdChmKTtyZXR1cm4gYy5pc05hTihoKT9mOmh9ZWxzZSByZXR1cm4gdGhpcy5jc3MoZCx0eXBlb2YgZT09PSJzdHJpbmciP2U6ZSsicHgiKX19KX0pKHdpbmRvdyk7Cg==";
	b64_sl_js['script_sl_jquery_ui_js']= "LyohIGpRdWVyeSBVSSAtIHYxLjguMjQgLSAyMDEyLTA5LTI4CiogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkKKiBJbmNsdWRlczoganF1ZXJ5LnVpLmNvcmUuanMsIGpxdWVyeS51aS53aWRnZXQuanMsIGpxdWVyeS51aS5tb3VzZS5qcywganF1ZXJ5LnVpLmRyYWdnYWJsZS5qcywganF1ZXJ5LnVpLmRyb3BwYWJsZS5qcywganF1ZXJ5LnVpLnJlc2l6YWJsZS5qcywganF1ZXJ5LnVpLnNlbGVjdGFibGUuanMsIGpxdWVyeS51aS5zb3J0YWJsZS5qcywganF1ZXJ5LmVmZmVjdHMuY29yZS5qcywganF1ZXJ5LmVmZmVjdHMuYmxpbmQuanMsIGpxdWVyeS5lZmZlY3RzLmJvdW5jZS5qcywganF1ZXJ5LmVmZmVjdHMuY2xpcC5qcywganF1ZXJ5LmVmZmVjdHMuZHJvcC5qcywganF1ZXJ5LmVmZmVjdHMuZXhwbG9kZS5qcywganF1ZXJ5LmVmZmVjdHMuZmFkZS5qcywganF1ZXJ5LmVmZmVjdHMuZm9sZC5qcywganF1ZXJ5LmVmZmVjdHMuaGlnaGxpZ2h0LmpzLCBqcXVlcnkuZWZmZWN0cy5wdWxzYXRlLmpzLCBqcXVlcnkuZWZmZWN0cy5zY2FsZS5qcywganF1ZXJ5LmVmZmVjdHMuc2hha2UuanMsIGpxdWVyeS5lZmZlY3RzLnNsaWRlLmpzLCBqcXVlcnkuZWZmZWN0cy50cmFuc2Zlci5qcywganF1ZXJ5LnVpLmFjY29yZGlvbi5qcywganF1ZXJ5LnVpLmF1dG9jb21wbGV0ZS5qcywganF1ZXJ5LnVpLmJ1dHRvbi5qcywganF1ZXJ5LnVpLmRhdGVwaWNrZXIuanMsIGpxdWVyeS51aS5kaWFsb2cuanMsIGpxdWVyeS51aS5wb3NpdGlvbi5qcywganF1ZXJ5LnVpLnByb2dyZXNzYmFyLmpzLCBqcXVlcnkudWkuc2xpZGVyLmpzLCBqcXVlcnkudWkudGFicy5qcwoqIENvcHlyaWdodCAoYykgMjAxMiBBVVRIT1JTLnR4dDsgTGljZW5zZWQgTUlULCBHUEwgKi8KKGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhiLGMpe3ZhciBlPWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZigiYXJlYSI9PT1lKXt2YXIgZj1iLnBhcmVudE5vZGUsZz1mLm5hbWUsaDtyZXR1cm4hYi5ocmVmfHwhZ3x8Zi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09Im1hcCI/ITE6KGg9YSgiaW1nW3VzZW1hcD0jIitnKyJdIilbMF0sISFoJiZkKGgpKX1yZXR1cm4oL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0Ly50ZXN0KGUpPyFiLmRpc2FibGVkOiJhIj09ZT9iLmhyZWZ8fGM6YykmJmQoYil9ZnVuY3Rpb24gZChiKXtyZXR1cm4hYShiKS5wYXJlbnRzKCkuYW5kU2VsZigpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiBhLmN1ckNTUyh0aGlzLCJ2aXNpYmlsaXR5Iik9PT0iaGlkZGVuInx8YS5leHByLmZpbHRlcnMuaGlkZGVuKHRoaXMpfSkubGVuZ3RofWEudWk9YS51aXx8e307aWYoYS51aS52ZXJzaW9uKXJldHVybjthLmV4dGVuZChhLnVpLHt2ZXJzaW9uOiIxLjguMjQiLGtleUNvZGU6e0FMVDoxOCxCQUNLU1BBQ0U6OCxDQVBTX0xPQ0s6MjAsQ09NTUE6MTg4LENPTU1BTkQ6OTEsQ09NTUFORF9MRUZUOjkxLENPTU1BTkRfUklHSFQ6OTMsQ09OVFJPTDoxNyxERUxFVEU6NDYsRE9XTjo0MCxFTkQ6MzUsRU5URVI6MTMsRVNDQVBFOjI3LEhPTUU6MzYsSU5TRVJUOjQ1LExFRlQ6MzcsTUVOVTo5MyxOVU1QQURfQUREOjEwNyxOVU1QQURfREVDSU1BTDoxMTAsTlVNUEFEX0RJVklERToxMTEsTlVNUEFEX0VOVEVSOjEwOCxOVU1QQURfTVVMVElQTFk6MTA2LE5VTVBBRF9TVUJUUkFDVDoxMDksUEFHRV9ET1dOOjM0LFBBR0VfVVA6MzMsUEVSSU9EOjE5MCxSSUdIVDozOSxTSElGVDoxNixTUEFDRTozMixUQUI6OSxVUDozOCxXSU5ET1dTOjkxfX0pLGEuZm4uZXh0ZW5kKHtwcm9wQXR0cjphLmZuLnByb3B8fGEuZm4uYXR0cixfZm9jdXM6YS5mbi5mb2N1cyxmb2N1czpmdW5jdGlvbihiLGMpe3JldHVybiB0eXBlb2YgYj09Im51bWJlciI/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YShkKS5mb2N1cygpLGMmJmMuY2FsbChkKX0sYil9KTp0aGlzLl9mb2N1cy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHNjcm9sbFBhcmVudDpmdW5jdGlvbigpe3ZhciBiO3JldHVybiBhLmJyb3dzZXIubXNpZSYmLyhzdGF0aWN8cmVsYXRpdmUpLy50ZXN0KHRoaXMuY3NzKCJwb3NpdGlvbiIpKXx8L2Fic29sdXRlLy50ZXN0KHRoaXMuY3NzKCJwb3NpdGlvbiIpKT9iPXRoaXMucGFyZW50cygpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybi8ocmVsYXRpdmV8YWJzb2x1dGV8Zml4ZWQpLy50ZXN0KGEuY3VyQ1NTKHRoaXMsInBvc2l0aW9uIiwxKSkmJi8oYXV0b3xzY3JvbGwpLy50ZXN0KGEuY3VyQ1NTKHRoaXMsIm92ZXJmbG93IiwxKSthLmN1ckNTUyh0aGlzLCJvdmVyZmxvdy15IiwxKSthLmN1ckNTUyh0aGlzLCJvdmVyZmxvdy14IiwxKSl9KS5lcSgwKTpiPXRoaXMucGFyZW50cygpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybi8oYXV0b3xzY3JvbGwpLy50ZXN0KGEuY3VyQ1NTKHRoaXMsIm92ZXJmbG93IiwxKSthLmN1ckNTUyh0aGlzLCJvdmVyZmxvdy15IiwxKSthLmN1ckNTUyh0aGlzLCJvdmVyZmxvdy14IiwxKSl9KS5lcSgwKSwvZml4ZWQvLnRlc3QodGhpcy5jc3MoInBvc2l0aW9uIikpfHwhYi5sZW5ndGg/YShkb2N1bWVudCk6Yn0sekluZGV4OmZ1bmN0aW9uKGMpe2lmKGMhPT1iKXJldHVybiB0aGlzLmNzcygiekluZGV4IixjKTtpZih0aGlzLmxlbmd0aCl7dmFyIGQ9YSh0aGlzWzBdKSxlLGY7d2hpbGUoZC5sZW5ndGgmJmRbMF0hPT1kb2N1bWVudCl7ZT1kLmNzcygicG9zaXRpb24iKTtpZihlPT09ImFic29sdXRlInx8ZT09PSJyZWxhdGl2ZSJ8fGU9PT0iZml4ZWQiKXtmPXBhcnNlSW50KGQuY3NzKCJ6SW5kZXgiKSwxMCk7aWYoIWlzTmFOKGYpJiZmIT09MClyZXR1cm4gZn1kPWQucGFyZW50KCl9fXJldHVybiAwfSxkaXNhYmxlU2VsZWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmluZCgoYS5zdXBwb3J0LnNlbGVjdHN0YXJ0PyJzZWxlY3RzdGFydCI6Im1vdXNlZG93biIpKyIudWktZGlzYWJsZVNlbGVjdGlvbiIsZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpfSl9LGVuYWJsZVNlbGVjdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVuYmluZCgiLnVpLWRpc2FibGVTZWxlY3Rpb24iKX19KSxhKCI8YT4iKS5vdXRlcldpZHRoKDEpLmpxdWVyeXx8YS5lYWNoKFsiV2lkdGgiLCJIZWlnaHQiXSxmdW5jdGlvbihjLGQpe2Z1bmN0aW9uIGgoYixjLGQsZil7cmV0dXJuIGEuZWFjaChlLGZ1bmN0aW9uKCl7Yy09cGFyc2VGbG9hdChhLmN1ckNTUyhiLCJwYWRkaW5nIit0aGlzLCEwKSl8fDAsZCYmKGMtPXBhcnNlRmxvYXQoYS5jdXJDU1MoYiwiYm9yZGVyIit0aGlzKyJXaWR0aCIsITApKXx8MCksZiYmKGMtPXBhcnNlRmxvYXQoYS5jdXJDU1MoYiwibWFyZ2luIit0aGlzLCEwKSl8fDApfSksY312YXIgZT1kPT09IldpZHRoIj9bIkxlZnQiLCJSaWdodCJdOlsiVG9wIiwiQm90dG9tIl0sZj1kLnRvTG93ZXJDYXNlKCksZz17aW5uZXJXaWR0aDphLmZuLmlubmVyV2lkdGgsaW5uZXJIZWlnaHQ6YS5mbi5pbm5lckhlaWdodCxvdXRlcldpZHRoOmEuZm4ub3V0ZXJXaWR0aCxvdXRlckhlaWdodDphLmZuLm91dGVySGVpZ2h0fTthLmZuWyJpbm5lciIrZF09ZnVuY3Rpb24oYyl7cmV0dXJuIGM9PT1iP2dbImlubmVyIitkXS5jYWxsKHRoaXMpOnRoaXMuZWFjaChmdW5jdGlvbigpe2EodGhpcykuY3NzKGYsaCh0aGlzLGMpKyJweCIpfSl9LGEuZm5bIm91dGVyIitkXT1mdW5jdGlvbihiLGMpe3JldHVybiB0eXBlb2YgYiE9Im51bWJlciI/Z1sib3V0ZXIiK2RdLmNhbGwodGhpcyxiKTp0aGlzLmVhY2goZnVuY3Rpb24oKXthKHRoaXMpLmNzcyhmLGgodGhpcyxiLCEwLGMpKyJweCIpfSl9fSksYS5leHRlbmQoYS5leHByWyI6Il0se2RhdGE6YS5leHByLmNyZWF0ZVBzZXVkbz9hLmV4cHIuY3JlYXRlUHNldWRvKGZ1bmN0aW9uKGIpe3JldHVybiBmdW5jdGlvbihjKXtyZXR1cm4hIWEuZGF0YShjLGIpfX0pOmZ1bmN0aW9uKGIsYyxkKXtyZXR1cm4hIWEuZGF0YShiLGRbM10pfSxmb2N1c2FibGU6ZnVuY3Rpb24oYil7cmV0dXJuIGMoYiwhaXNOYU4oYS5hdHRyKGIsInRhYmluZGV4IikpKX0sdGFiYmFibGU6ZnVuY3Rpb24oYil7dmFyIGQ9YS5hdHRyKGIsInRhYmluZGV4IiksZT1pc05hTihkKTtyZXR1cm4oZXx8ZD49MCkmJmMoYiwhZSl9fSksYShmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmJvZHksYz1iLmFwcGVuZENoaWxkKGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpO2Mub2Zmc2V0SGVpZ2h0LGEuZXh0ZW5kKGMuc3R5bGUse21pbkhlaWdodDoiMTAwcHgiLGhlaWdodDoiYXV0byIscGFkZGluZzowLGJvcmRlcldpZHRoOjB9KSxhLnN1cHBvcnQubWluSGVpZ2h0PWMub2Zmc2V0SGVpZ2h0PT09MTAwLGEuc3VwcG9ydC5zZWxlY3RzdGFydD0ib25zZWxlY3RzdGFydCJpbiBjLGIucmVtb3ZlQ2hpbGQoYykuc3R5bGUuZGlzcGxheT0ibm9uZSJ9KSxhLmN1ckNTU3x8KGEuY3VyQ1NTPWEuY3NzKSxhLmV4dGVuZChhLnVpLHtwbHVnaW46e2FkZDpmdW5jdGlvbihiLGMsZCl7dmFyIGU9YS51aVtiXS5wcm90b3R5cGU7Zm9yKHZhciBmIGluIGQpZS5wbHVnaW5zW2ZdPWUucGx1Z2luc1tmXXx8W10sZS5wbHVnaW5zW2ZdLnB1c2goW2MsZFtmXV0pfSxjYWxsOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLnBsdWdpbnNbYl07aWYoIWR8fCFhLmVsZW1lbnRbMF0ucGFyZW50Tm9kZSlyZXR1cm47Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspYS5vcHRpb25zW2RbZV1bMF1dJiZkW2VdWzFdLmFwcGx5KGEuZWxlbWVudCxjKX19LGNvbnRhaW5zOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGRvY3VtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2EuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTY6YSE9PWImJmEuY29udGFpbnMoYil9LGhhc1Njcm9sbDpmdW5jdGlvbihiLGMpe2lmKGEoYikuY3NzKCJvdmVyZmxvdyIpPT09ImhpZGRlbiIpcmV0dXJuITE7dmFyIGQ9YyYmYz09PSJsZWZ0Ij8ic2Nyb2xsTGVmdCI6InNjcm9sbFRvcCIsZT0hMTtyZXR1cm4gYltkXT4wPyEwOihiW2RdPTEsZT1iW2RdPjAsYltkXT0wLGUpfSxpc092ZXJBeGlzOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYT5iJiZhPGIrY30saXNPdmVyOmZ1bmN0aW9uKGIsYyxkLGUsZixnKXtyZXR1cm4gYS51aS5pc092ZXJBeGlzKGIsZCxmKSYmYS51aS5pc092ZXJBeGlzKGMsZSxnKX19KX0pKGpRdWVyeSksZnVuY3Rpb24oYSxiKXtpZihhLmNsZWFuRGF0YSl7dmFyIGM9YS5jbGVhbkRhdGE7YS5jbGVhbkRhdGE9ZnVuY3Rpb24oYil7Zm9yKHZhciBkPTAsZTsoZT1iW2RdKSE9bnVsbDtkKyspdHJ5e2EoZSkudHJpZ2dlckhhbmRsZXIoInJlbW92ZSIpfWNhdGNoKGYpe31jKGIpfX1lbHNle3ZhciBkPWEuZm4ucmVtb3ZlO2EuZm4ucmVtb3ZlPWZ1bmN0aW9uKGIsYyl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3JldHVybiBjfHwoIWJ8fGEuZmlsdGVyKGIsW3RoaXNdKS5sZW5ndGgpJiZhKCIqIix0aGlzKS5hZGQoW3RoaXNdKS5lYWNoKGZ1bmN0aW9uKCl7dHJ5e2EodGhpcykudHJpZ2dlckhhbmRsZXIoInJlbW92ZSIpfWNhdGNoKGIpe319KSxkLmNhbGwoYSh0aGlzKSxiLGMpfSl9fWEud2lkZ2V0PWZ1bmN0aW9uKGIsYyxkKXt2YXIgZT1iLnNwbGl0KCIuIilbMF0sZjtiPWIuc3BsaXQoIi4iKVsxXSxmPWUrIi0iK2IsZHx8KGQ9YyxjPWEuV2lkZ2V0KSxhLmV4cHJbIjoiXVtmXT1mdW5jdGlvbihjKXtyZXR1cm4hIWEuZGF0YShjLGIpfSxhW2VdPWFbZV18fHt9LGFbZV1bYl09ZnVuY3Rpb24oYSxiKXthcmd1bWVudHMubGVuZ3RoJiZ0aGlzLl9jcmVhdGVXaWRnZXQoYSxiKX07dmFyIGc9bmV3IGM7Zy5vcHRpb25zPWEuZXh0ZW5kKCEwLHt9LGcub3B0aW9ucyksYVtlXVtiXS5wcm90b3R5cGU9YS5leHRlbmQoITAsZyx7bmFtZXNwYWNlOmUsd2lkZ2V0TmFtZTpiLHdpZGdldEV2ZW50UHJlZml4OmFbZV1bYl0ucHJvdG90eXBlLndpZGdldEV2ZW50UHJlZml4fHxiLHdpZGdldEJhc2VDbGFzczpmfSxkKSxhLndpZGdldC5icmlkZ2UoYixhW2VdW2JdKX0sYS53aWRnZXQuYnJpZGdlPWZ1bmN0aW9uKGMsZCl7YS5mbltjXT1mdW5jdGlvbihlKXt2YXIgZj10eXBlb2YgZT09InN0cmluZyIsZz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSksaD10aGlzO3JldHVybiBlPSFmJiZnLmxlbmd0aD9hLmV4dGVuZC5hcHBseShudWxsLFshMCxlXS5jb25jYXQoZykpOmUsZiYmZS5jaGFyQXQoMCk9PT0iXyI/aDooZj90aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1hLmRhdGEodGhpcyxjKSxmPWQmJmEuaXNGdW5jdGlvbihkW2VdKT9kW2VdLmFwcGx5KGQsZyk6ZDtpZihmIT09ZCYmZiE9PWIpcmV0dXJuIGg9ZiwhMX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWEuZGF0YSh0aGlzLGMpO2I/Yi5vcHRpb24oZXx8e30pLl9pbml0KCk6YS5kYXRhKHRoaXMsYyxuZXcgZChlLHRoaXMpKX0pLGgpfX0sYS5XaWRnZXQ9ZnVuY3Rpb24oYSxiKXthcmd1bWVudHMubGVuZ3RoJiZ0aGlzLl9jcmVhdGVXaWRnZXQoYSxiKX0sYS5XaWRnZXQucHJvdG90eXBlPXt3aWRnZXROYW1lOiJ3aWRnZXQiLHdpZGdldEV2ZW50UHJlZml4OiIiLG9wdGlvbnM6e2Rpc2FibGVkOiExfSxfY3JlYXRlV2lkZ2V0OmZ1bmN0aW9uKGIsYyl7YS5kYXRhKGMsdGhpcy53aWRnZXROYW1lLHRoaXMpLHRoaXMuZWxlbWVudD1hKGMpLHRoaXMub3B0aW9ucz1hLmV4dGVuZCghMCx7fSx0aGlzLm9wdGlvbnMsdGhpcy5fZ2V0Q3JlYXRlT3B0aW9ucygpLGIpO3ZhciBkPXRoaXM7dGhpcy5lbGVtZW50LmJpbmQoInJlbW92ZS4iK3RoaXMud2lkZ2V0TmFtZSxmdW5jdGlvbigpe2QuZGVzdHJveSgpfSksdGhpcy5fY3JlYXRlKCksdGhpcy5fdHJpZ2dlcigiY3JlYXRlIiksdGhpcy5faW5pdCgpfSxfZ2V0Q3JlYXRlT3B0aW9uczpmdW5jdGlvbigpe3JldHVybiBhLm1ldGFkYXRhJiZhLm1ldGFkYXRhLmdldCh0aGlzLmVsZW1lbnRbMF0pW3RoaXMud2lkZ2V0TmFtZV19LF9jcmVhdGU6ZnVuY3Rpb24oKXt9LF9pbml0OmZ1bmN0aW9uKCl7fSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnVuYmluZCgiLiIrdGhpcy53aWRnZXROYW1lKS5yZW1vdmVEYXRhKHRoaXMud2lkZ2V0TmFtZSksdGhpcy53aWRnZXQoKS51bmJpbmQoIi4iK3RoaXMud2lkZ2V0TmFtZSkucmVtb3ZlQXR0cigiYXJpYS1kaXNhYmxlZCIpLnJlbW92ZUNsYXNzKHRoaXMud2lkZ2V0QmFzZUNsYXNzKyItZGlzYWJsZWQgIisidWktc3RhdGUtZGlzYWJsZWQiKX0sd2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudH0sb3B0aW9uOmZ1bmN0aW9uKGMsZCl7dmFyIGU9YztpZihhcmd1bWVudHMubGVuZ3RoPT09MClyZXR1cm4gYS5leHRlbmQoe30sdGhpcy5vcHRpb25zKTtpZih0eXBlb2YgYz09InN0cmluZyIpe2lmKGQ9PT1iKXJldHVybiB0aGlzLm9wdGlvbnNbY107ZT17fSxlW2NdPWR9cmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoZSksdGhpc30sX3NldE9wdGlvbnM6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcztyZXR1cm4gYS5lYWNoKGIsZnVuY3Rpb24oYSxiKXtjLl9zZXRPcHRpb24oYSxiKX0pLHRoaXN9LF9zZXRPcHRpb246ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5vcHRpb25zW2FdPWIsYT09PSJkaXNhYmxlZCImJnRoaXMud2lkZ2V0KClbYj8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFzcyJdKHRoaXMud2lkZ2V0QmFzZUNsYXNzKyItZGlzYWJsZWQiKyIgIisidWktc3RhdGUtZGlzYWJsZWQiKS5hdHRyKCJhcmlhLWRpc2FibGVkIixiKSx0aGlzfSxlbmFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2V0T3B0aW9uKCJkaXNhYmxlZCIsITEpfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NldE9wdGlvbigiZGlzYWJsZWQiLCEwKX0sX3RyaWdnZXI6ZnVuY3Rpb24oYixjLGQpe3ZhciBlLGYsZz10aGlzLm9wdGlvbnNbYl07ZD1kfHx7fSxjPWEuRXZlbnQoYyksYy50eXBlPShiPT09dGhpcy53aWRnZXRFdmVudFByZWZpeD9iOnRoaXMud2lkZ2V0RXZlbnRQcmVmaXgrYikudG9Mb3dlckNhc2UoKSxjLnRhcmdldD10aGlzLmVsZW1lbnRbMF0sZj1jLm9yaWdpbmFsRXZlbnQ7aWYoZilmb3IoZSBpbiBmKWUgaW4gY3x8KGNbZV09ZltlXSk7cmV0dXJuIHRoaXMuZWxlbWVudC50cmlnZ2VyKGMsZCksIShhLmlzRnVuY3Rpb24oZykmJmcuY2FsbCh0aGlzLmVsZW1lbnRbMF0sYyxkKT09PSExfHxjLmlzRGVmYXVsdFByZXZlbnRlZCgpKX19fShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7dmFyIGM9ITE7YShkb2N1bWVudCkubW91c2V1cChmdW5jdGlvbihhKXtjPSExfSksYS53aWRnZXQoInVpLm1vdXNlIix7b3B0aW9uczp7Y2FuY2VsOiI6aW5wdXQsb3B0aW9uIixkaXN0YW5jZToxLGRlbGF5OjB9LF9tb3VzZUluaXQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzO3RoaXMuZWxlbWVudC5iaW5kKCJtb3VzZWRvd24uIit0aGlzLndpZGdldE5hbWUsZnVuY3Rpb24oYSl7cmV0dXJuIGIuX21vdXNlRG93bihhKX0pLmJpbmQoImNsaWNrLiIrdGhpcy53aWRnZXROYW1lLGZ1bmN0aW9uKGMpe2lmKCEwPT09YS5kYXRhKGMudGFyZ2V0LGIud2lkZ2V0TmFtZSsiLnByZXZlbnRDbGlja0V2ZW50IikpcmV0dXJuIGEucmVtb3ZlRGF0YShjLnRhcmdldCxiLndpZGdldE5hbWUrIi5wcmV2ZW50Q2xpY2tFdmVudCIpLGMuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksITF9KSx0aGlzLnN0YXJ0ZWQ9ITF9LF9tb3VzZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQudW5iaW5kKCIuIit0aGlzLndpZGdldE5hbWUpLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlJiZhKGRvY3VtZW50KS51bmJpbmQoIm1vdXNlbW92ZS4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSkudW5iaW5kKCJtb3VzZXVwLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlVXBEZWxlZ2F0ZSl9LF9tb3VzZURvd246ZnVuY3Rpb24oYil7aWYoYylyZXR1cm47dGhpcy5fbW91c2VTdGFydGVkJiZ0aGlzLl9tb3VzZVVwKGIpLHRoaXMuX21vdXNlRG93bkV2ZW50PWI7dmFyIGQ9dGhpcyxlPWIud2hpY2g9PTEsZj10eXBlb2YgdGhpcy5vcHRpb25zLmNhbmNlbD09InN0cmluZyImJmIudGFyZ2V0Lm5vZGVOYW1lP2EoYi50YXJnZXQpLmNsb3Nlc3QodGhpcy5vcHRpb25zLmNhbmNlbCkubGVuZ3RoOiExO2lmKCFlfHxmfHwhdGhpcy5fbW91c2VDYXB0dXJlKGIpKXJldHVybiEwO3RoaXMubW91c2VEZWxheU1ldD0hdGhpcy5vcHRpb25zLmRlbGF5LHRoaXMubW91c2VEZWxheU1ldHx8KHRoaXMuX21vdXNlRGVsYXlUaW1lcj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZC5tb3VzZURlbGF5TWV0PSEwfSx0aGlzLm9wdGlvbnMuZGVsYXkpKTtpZih0aGlzLl9tb3VzZURpc3RhbmNlTWV0KGIpJiZ0aGlzLl9tb3VzZURlbGF5TWV0KGIpKXt0aGlzLl9tb3VzZVN0YXJ0ZWQ9dGhpcy5fbW91c2VTdGFydChiKSE9PSExO2lmKCF0aGlzLl9tb3VzZVN0YXJ0ZWQpcmV0dXJuIGIucHJldmVudERlZmF1bHQoKSwhMH1yZXR1cm4hMD09PWEuZGF0YShiLnRhcmdldCx0aGlzLndpZGdldE5hbWUrIi5wcmV2ZW50Q2xpY2tFdmVudCIpJiZhLnJlbW92ZURhdGEoYi50YXJnZXQsdGhpcy53aWRnZXROYW1lKyIucHJldmVudENsaWNrRXZlbnQiKSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZT1mdW5jdGlvbihhKXtyZXR1cm4gZC5fbW91c2VNb3ZlKGEpfSx0aGlzLl9tb3VzZVVwRGVsZWdhdGU9ZnVuY3Rpb24oYSl7cmV0dXJuIGQuX21vdXNlVXAoYSl9LGEoZG9jdW1lbnQpLmJpbmQoIm1vdXNlbW92ZS4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSkuYmluZCgibW91c2V1cC4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZVVwRGVsZWdhdGUpLGIucHJldmVudERlZmF1bHQoKSxjPSEwLCEwfSxfbW91c2VNb3ZlOmZ1bmN0aW9uKGIpe3JldHVybiFhLmJyb3dzZXIubXNpZXx8ZG9jdW1lbnQuZG9jdW1lbnRNb2RlPj05fHwhIWIuYnV0dG9uP3RoaXMuX21vdXNlU3RhcnRlZD8odGhpcy5fbW91c2VEcmFnKGIpLGIucHJldmVudERlZmF1bHQoKSk6KHRoaXMuX21vdXNlRGlzdGFuY2VNZXQoYikmJnRoaXMuX21vdXNlRGVsYXlNZXQoYikmJih0aGlzLl9tb3VzZVN0YXJ0ZWQ9dGhpcy5fbW91c2VTdGFydCh0aGlzLl9tb3VzZURvd25FdmVudCxiKSE9PSExLHRoaXMuX21vdXNlU3RhcnRlZD90aGlzLl9tb3VzZURyYWcoYik6dGhpcy5fbW91c2VVcChiKSksIXRoaXMuX21vdXNlU3RhcnRlZCk6dGhpcy5fbW91c2VVcChiKX0sX21vdXNlVXA6ZnVuY3Rpb24oYil7cmV0dXJuIGEoZG9jdW1lbnQpLnVuYmluZCgibW91c2Vtb3ZlLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlKS51bmJpbmQoIm1vdXNldXAuIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VVcERlbGVnYXRlKSx0aGlzLl9tb3VzZVN0YXJ0ZWQmJih0aGlzLl9tb3VzZVN0YXJ0ZWQ9ITEsYi50YXJnZXQ9PXRoaXMuX21vdXNlRG93bkV2ZW50LnRhcmdldCYmYS5kYXRhKGIudGFyZ2V0LHRoaXMud2lkZ2V0TmFtZSsiLnByZXZlbnRDbGlja0V2ZW50IiwhMCksdGhpcy5fbW91c2VTdG9wKGIpKSwhMX0sX21vdXNlRGlzdGFuY2VNZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgubWF4KE1hdGguYWJzKHRoaXMuX21vdXNlRG93bkV2ZW50LnBhZ2VYLWEucGFnZVgpLE1hdGguYWJzKHRoaXMuX21vdXNlRG93bkV2ZW50LnBhZ2VZLWEucGFnZVkpKT49dGhpcy5vcHRpb25zLmRpc3RhbmNlfSxfbW91c2VEZWxheU1ldDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5tb3VzZURlbGF5TWV0fSxfbW91c2VTdGFydDpmdW5jdGlvbihhKXt9LF9tb3VzZURyYWc6ZnVuY3Rpb24oYSl7fSxfbW91c2VTdG9wOmZ1bmN0aW9uKGEpe30sX21vdXNlQ2FwdHVyZTpmdW5jdGlvbihhKXtyZXR1cm4hMH19KX0oalF1ZXJ5KSxmdW5jdGlvbihhLGIpe2Eud2lkZ2V0KCJ1aS5kcmFnZ2FibGUiLGEudWkubW91c2Use3dpZGdldEV2ZW50UHJlZml4OiJkcmFnIixvcHRpb25zOnthZGRDbGFzc2VzOiEwLGFwcGVuZFRvOiJwYXJlbnQiLGF4aXM6ITEsY29ubmVjdFRvU29ydGFibGU6ITEsY29udGFpbm1lbnQ6ITEsY3Vyc29yOiJhdXRvIixjdXJzb3JBdDohMSxncmlkOiExLGhhbmRsZTohMSxoZWxwZXI6Im9yaWdpbmFsIixpZnJhbWVGaXg6ITEsb3BhY2l0eTohMSxyZWZyZXNoUG9zaXRpb25zOiExLHJldmVydDohMSxyZXZlcnREdXJhdGlvbjo1MDAsc2NvcGU6ImRlZmF1bHQiLHNjcm9sbDohMCxzY3JvbGxTZW5zaXRpdml0eToyMCxzY3JvbGxTcGVlZDoyMCxzbmFwOiExLHNuYXBNb2RlOiJib3RoIixzbmFwVG9sZXJhbmNlOjIwLHN0YWNrOiExLHpJbmRleDohMX0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5oZWxwZXI9PSJvcmlnaW5hbCImJiEvXig/OnJ8YXxmKS8udGVzdCh0aGlzLmVsZW1lbnQuY3NzKCJwb3NpdGlvbiIpKSYmKHRoaXMuZWxlbWVudFswXS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSx0aGlzLm9wdGlvbnMuYWRkQ2xhc3NlcyYmdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1kcmFnZ2FibGUiKSx0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktZHJhZ2dhYmxlLWRpc2FibGVkIiksdGhpcy5fbW91c2VJbml0KCl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXtpZighdGhpcy5lbGVtZW50LmRhdGEoImRyYWdnYWJsZSIpKXJldHVybjtyZXR1cm4gdGhpcy5lbGVtZW50LnJlbW92ZURhdGEoImRyYWdnYWJsZSIpLnVuYmluZCgiLmRyYWdnYWJsZSIpLnJlbW92ZUNsYXNzKCJ1aS1kcmFnZ2FibGUgdWktZHJhZ2dhYmxlLWRyYWdnaW5nIHVpLWRyYWdnYWJsZS1kaXNhYmxlZCIpLHRoaXMuX21vdXNlRGVzdHJveSgpLHRoaXN9LF9tb3VzZUNhcHR1cmU6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5vcHRpb25zO3JldHVybiB0aGlzLmhlbHBlcnx8Yy5kaXNhYmxlZHx8YShiLnRhcmdldCkuaXMoIi51aS1yZXNpemFibGUtaGFuZGxlIik/ITE6KHRoaXMuaGFuZGxlPXRoaXMuX2dldEhhbmRsZShiKSx0aGlzLmhhbmRsZT8oYy5pZnJhbWVGaXgmJmEoYy5pZnJhbWVGaXg9PT0hMD8iaWZyYW1lIjpjLmlmcmFtZUZpeCkuZWFjaChmdW5jdGlvbigpe2EoJzxkaXYgY2xhc3M9InVpLWRyYWdnYWJsZS1pZnJhbWVGaXgiIHN0eWxlPSJiYWNrZ3JvdW5kOiAjZmZmOyI+PC9kaXY+JykuY3NzKHt3aWR0aDp0aGlzLm9mZnNldFdpZHRoKyJweCIsaGVpZ2h0OnRoaXMub2Zmc2V0SGVpZ2h0KyJweCIscG9zaXRpb246ImFic29sdXRlIixvcGFjaXR5OiIwLjAwMSIsekluZGV4OjFlM30pLmNzcyhhKHRoaXMpLm9mZnNldCgpKS5hcHBlbmRUbygiYm9keSIpfSksITApOiExKX0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5vcHRpb25zO3JldHVybiB0aGlzLmhlbHBlcj10aGlzLl9jcmVhdGVIZWxwZXIoYiksdGhpcy5oZWxwZXIuYWRkQ2xhc3MoInVpLWRyYWdnYWJsZS1kcmFnZ2luZyIpLHRoaXMuX2NhY2hlSGVscGVyUHJvcG9ydGlvbnMoKSxhLnVpLmRkbWFuYWdlciYmKGEudWkuZGRtYW5hZ2VyLmN1cnJlbnQ9dGhpcyksdGhpcy5fY2FjaGVNYXJnaW5zKCksdGhpcy5jc3NQb3NpdGlvbj10aGlzLmhlbHBlci5jc3MoInBvc2l0aW9uIiksdGhpcy5zY3JvbGxQYXJlbnQ9dGhpcy5oZWxwZXIuc2Nyb2xsUGFyZW50KCksdGhpcy5vZmZzZXQ9dGhpcy5wb3NpdGlvbkFicz10aGlzLmVsZW1lbnQub2Zmc2V0KCksdGhpcy5vZmZzZXQ9e3RvcDp0aGlzLm9mZnNldC50b3AtdGhpcy5tYXJnaW5zLnRvcCxsZWZ0OnRoaXMub2Zmc2V0LmxlZnQtdGhpcy5tYXJnaW5zLmxlZnR9LGEuZXh0ZW5kKHRoaXMub2Zmc2V0LHtjbGljazp7bGVmdDpiLnBhZ2VYLXRoaXMub2Zmc2V0LmxlZnQsdG9wOmIucGFnZVktdGhpcy5vZmZzZXQudG9wfSxwYXJlbnQ6dGhpcy5fZ2V0UGFyZW50T2Zmc2V0KCkscmVsYXRpdmU6dGhpcy5fZ2V0UmVsYXRpdmVPZmZzZXQoKX0pLHRoaXMub3JpZ2luYWxQb3NpdGlvbj10aGlzLnBvc2l0aW9uPXRoaXMuX2dlbmVyYXRlUG9zaXRpb24oYiksdGhpcy5vcmlnaW5hbFBhZ2VYPWIucGFnZVgsdGhpcy5vcmlnaW5hbFBhZ2VZPWIucGFnZVksYy5jdXJzb3JBdCYmdGhpcy5fYWRqdXN0T2Zmc2V0RnJvbUhlbHBlcihjLmN1cnNvckF0KSxjLmNvbnRhaW5tZW50JiZ0aGlzLl9zZXRDb250YWlubWVudCgpLHRoaXMuX3RyaWdnZXIoInN0YXJ0IixiKT09PSExPyh0aGlzLl9jbGVhcigpLCExKToodGhpcy5fY2FjaGVIZWxwZXJQcm9wb3J0aW9ucygpLGEudWkuZGRtYW5hZ2VyJiYhYy5kcm9wQmVoYXZpb3VyJiZhLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyh0aGlzLGIpLHRoaXMuX21vdXNlRHJhZyhiLCEwKSxhLnVpLmRkbWFuYWdlciYmYS51aS5kZG1hbmFnZXIuZHJhZ1N0YXJ0KHRoaXMsYiksITApfSxfbW91c2VEcmFnOmZ1bmN0aW9uKGIsYyl7dGhpcy5wb3NpdGlvbj10aGlzLl9nZW5lcmF0ZVBvc2l0aW9uKGIpLHRoaXMucG9zaXRpb25BYnM9dGhpcy5fY29udmVydFBvc2l0aW9uVG8oImFic29sdXRlIik7aWYoIWMpe3ZhciBkPXRoaXMuX3VpSGFzaCgpO2lmKHRoaXMuX3RyaWdnZXIoImRyYWciLGIsZCk9PT0hMSlyZXR1cm4gdGhpcy5fbW91c2VVcCh7fSksITE7dGhpcy5wb3NpdGlvbj1kLnBvc2l0aW9ufWlmKCF0aGlzLm9wdGlvbnMuYXhpc3x8dGhpcy5vcHRpb25zLmF4aXMhPSJ5Iil0aGlzLmhlbHBlclswXS5zdHlsZS5sZWZ0PXRoaXMucG9zaXRpb24ubGVmdCsicHgiO2lmKCF0aGlzLm9wdGlvbnMuYXhpc3x8dGhpcy5vcHRpb25zLmF4aXMhPSJ4Iil0aGlzLmhlbHBlclswXS5zdHlsZS50b3A9dGhpcy5wb3NpdGlvbi50b3ArInB4IjtyZXR1cm4gYS51aS5kZG1hbmFnZXImJmEudWkuZGRtYW5hZ2VyLmRyYWcodGhpcyxiKSwhMX0sX21vdXNlU3RvcDpmdW5jdGlvbihiKXt2YXIgYz0hMTthLnVpLmRkbWFuYWdlciYmIXRoaXMub3B0aW9ucy5kcm9wQmVoYXZpb3VyJiYoYz1hLnVpLmRkbWFuYWdlci5kcm9wKHRoaXMsYikpLHRoaXMuZHJvcHBlZCYmKGM9dGhpcy5kcm9wcGVkLHRoaXMuZHJvcHBlZD0hMSk7dmFyIGQ9dGhpcy5lbGVtZW50WzBdLGU9ITE7d2hpbGUoZCYmKGQ9ZC5wYXJlbnROb2RlKSlkPT1kb2N1bWVudCYmKGU9ITApO2lmKCFlJiZ0aGlzLm9wdGlvbnMuaGVscGVyPT09Im9yaWdpbmFsIilyZXR1cm4hMTtpZih0aGlzLm9wdGlvbnMucmV2ZXJ0PT0iaW52YWxpZCImJiFjfHx0aGlzLm9wdGlvbnMucmV2ZXJ0PT0idmFsaWQiJiZjfHx0aGlzLm9wdGlvbnMucmV2ZXJ0PT09ITB8fGEuaXNGdW5jdGlvbih0aGlzLm9wdGlvbnMucmV2ZXJ0KSYmdGhpcy5vcHRpb25zLnJldmVydC5jYWxsKHRoaXMuZWxlbWVudCxjKSl7dmFyIGY9dGhpczthKHRoaXMuaGVscGVyKS5hbmltYXRlKHRoaXMub3JpZ2luYWxQb3NpdGlvbixwYXJzZUludCh0aGlzLm9wdGlvbnMucmV2ZXJ0RHVyYXRpb24sMTApLGZ1bmN0aW9uKCl7Zi5fdHJpZ2dlcigic3RvcCIsYikhPT0hMSYmZi5fY2xlYXIoKX0pfWVsc2UgdGhpcy5fdHJpZ2dlcigic3RvcCIsYikhPT0hMSYmdGhpcy5fY2xlYXIoKTtyZXR1cm4hMX0sX21vdXNlVXA6ZnVuY3Rpb24oYil7cmV0dXJuIGEoImRpdi51aS1kcmFnZ2FibGUtaWZyYW1lRml4IikuZWFjaChmdW5jdGlvbigpe3RoaXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzKX0pLGEudWkuZGRtYW5hZ2VyJiZhLnVpLmRkbWFuYWdlci5kcmFnU3RvcCh0aGlzLGIpLGEudWkubW91c2UucHJvdG90eXBlLl9tb3VzZVVwLmNhbGwodGhpcyxiKX0sY2FuY2VsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGVscGVyLmlzKCIudWktZHJhZ2dhYmxlLWRyYWdnaW5nIik/dGhpcy5fbW91c2VVcCh7fSk6dGhpcy5fY2xlYXIoKSx0aGlzfSxfZ2V0SGFuZGxlOmZ1bmN0aW9uKGIpe3ZhciBjPSF0aGlzLm9wdGlvbnMuaGFuZGxlfHwhYSh0aGlzLm9wdGlvbnMuaGFuZGxlLHRoaXMuZWxlbWVudCkubGVuZ3RoPyEwOiExO3JldHVybiBhKHRoaXMub3B0aW9ucy5oYW5kbGUsdGhpcy5lbGVtZW50KS5maW5kKCIqIikuYW5kU2VsZigpLmVhY2goZnVuY3Rpb24oKXt0aGlzPT1iLnRhcmdldCYmKGM9ITApfSksY30sX2NyZWF0ZUhlbHBlcjpmdW5jdGlvbihiKXt2YXIgYz10aGlzLm9wdGlvbnMsZD1hLmlzRnVuY3Rpb24oYy5oZWxwZXIpP2EoYy5oZWxwZXIuYXBwbHkodGhpcy5lbGVtZW50WzBdLFtiXSkpOmMuaGVscGVyPT0iY2xvbmUiP3RoaXMuZWxlbWVudC5jbG9uZSgpLnJlbW92ZUF0dHIoImlkIik6dGhpcy5lbGVtZW50O3JldHVybiBkLnBhcmVudHMoImJvZHkiKS5sZW5ndGh8fGQuYXBwZW5kVG8oYy5hcHBlbmRUbz09InBhcmVudCI/dGhpcy5lbGVtZW50WzBdLnBhcmVudE5vZGU6Yy5hcHBlbmRUbyksZFswXSE9dGhpcy5lbGVtZW50WzBdJiYhLyhmaXhlZHxhYnNvbHV0ZSkvLnRlc3QoZC5jc3MoInBvc2l0aW9uIikpJiZkLmNzcygicG9zaXRpb24iLCJhYnNvbHV0ZSIpLGR9LF9hZGp1c3RPZmZzZXRGcm9tSGVscGVyOmZ1bmN0aW9uKGIpe3R5cGVvZiBiPT0ic3RyaW5nIiYmKGI9Yi5zcGxpdCgiICIpKSxhLmlzQXJyYXkoYikmJihiPXtsZWZ0OitiWzBdLHRvcDorYlsxXXx8MH0pLCJsZWZ0ImluIGImJih0aGlzLm9mZnNldC5jbGljay5sZWZ0PWIubGVmdCt0aGlzLm1hcmdpbnMubGVmdCksInJpZ2h0ImluIGImJih0aGlzLm9mZnNldC5jbGljay5sZWZ0PXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtYi5yaWdodCt0aGlzLm1hcmdpbnMubGVmdCksInRvcCJpbiBiJiYodGhpcy5vZmZzZXQuY2xpY2sudG9wPWIudG9wK3RoaXMubWFyZ2lucy50b3ApLCJib3R0b20iaW4gYiYmKHRoaXMub2Zmc2V0LmNsaWNrLnRvcD10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC1iLmJvdHRvbSt0aGlzLm1hcmdpbnMudG9wKX0sX2dldFBhcmVudE9mZnNldDpmdW5jdGlvbigpe3RoaXMub2Zmc2V0UGFyZW50PXRoaXMuaGVscGVyLm9mZnNldFBhcmVudCgpO3ZhciBiPXRoaXMub2Zmc2V0UGFyZW50Lm9mZnNldCgpO3RoaXMuY3NzUG9zaXRpb249PSJhYnNvbHV0ZSImJnRoaXMuc2Nyb2xsUGFyZW50WzBdIT1kb2N1bWVudCYmYS51aS5jb250YWlucyh0aGlzLnNjcm9sbFBhcmVudFswXSx0aGlzLm9mZnNldFBhcmVudFswXSkmJihiLmxlZnQrPXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKSxiLnRvcCs9dGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCkpO2lmKHRoaXMub2Zmc2V0UGFyZW50WzBdPT1kb2N1bWVudC5ib2R5fHx0aGlzLm9mZnNldFBhcmVudFswXS50YWdOYW1lJiZ0aGlzLm9mZnNldFBhcmVudFswXS50YWdOYW1lLnRvTG93ZXJDYXNlKCk9PSJodG1sIiYmYS5icm93c2VyLm1zaWUpYj17dG9wOjAsbGVmdDowfTtyZXR1cm57dG9wOmIudG9wKyhwYXJzZUludCh0aGlzLm9mZnNldFBhcmVudC5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKSxsZWZ0OmIubGVmdCsocGFyc2VJbnQodGhpcy5vZmZzZXRQYXJlbnQuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApfX0sX2dldFJlbGF0aXZlT2Zmc2V0OmZ1bmN0aW9uKCl7aWYodGhpcy5jc3NQb3NpdGlvbj09InJlbGF0aXZlIil7dmFyIGE9dGhpcy5lbGVtZW50LnBvc2l0aW9uKCk7cmV0dXJue3RvcDphLnRvcC0ocGFyc2VJbnQodGhpcy5oZWxwZXIuY3NzKCJ0b3AiKSwxMCl8fDApK3RoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpLGxlZnQ6YS5sZWZ0LShwYXJzZUludCh0aGlzLmhlbHBlci5jc3MoImxlZnQiKSwxMCl8fDApK3RoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKX19cmV0dXJue3RvcDowLGxlZnQ6MH19LF9jYWNoZU1hcmdpbnM6ZnVuY3Rpb24oKXt0aGlzLm1hcmdpbnM9e2xlZnQ6cGFyc2VJbnQodGhpcy5lbGVtZW50LmNzcygibWFyZ2luTGVmdCIpLDEwKXx8MCx0b3A6cGFyc2VJbnQodGhpcy5lbGVtZW50LmNzcygibWFyZ2luVG9wIiksMTApfHwwLHJpZ2h0OnBhcnNlSW50KHRoaXMuZWxlbWVudC5jc3MoIm1hcmdpblJpZ2h0IiksMTApfHwwLGJvdHRvbTpwYXJzZUludCh0aGlzLmVsZW1lbnQuY3NzKCJtYXJnaW5Cb3R0b20iKSwxMCl8fDB9fSxfY2FjaGVIZWxwZXJQcm9wb3J0aW9uczpmdW5jdGlvbigpe3RoaXMuaGVscGVyUHJvcG9ydGlvbnM9e3dpZHRoOnRoaXMuaGVscGVyLm91dGVyV2lkdGgoKSxoZWlnaHQ6dGhpcy5oZWxwZXIub3V0ZXJIZWlnaHQoKX19LF9zZXRDb250YWlubWVudDpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3B0aW9ucztiLmNvbnRhaW5tZW50PT0icGFyZW50IiYmKGIuY29udGFpbm1lbnQ9dGhpcy5oZWxwZXJbMF0ucGFyZW50Tm9kZSk7aWYoYi5jb250YWlubWVudD09ImRvY3VtZW50Inx8Yi5jb250YWlubWVudD09IndpbmRvdyIpdGhpcy5jb250YWlubWVudD1bYi5jb250YWlubWVudD09ImRvY3VtZW50Ij8wOmEod2luZG93KS5zY3JvbGxMZWZ0KCktdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdC10aGlzLm9mZnNldC5wYXJlbnQubGVmdCxiLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiPzA6YSh3aW5kb3cpLnNjcm9sbFRvcCgpLXRoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9wLChiLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiPzA6YSh3aW5kb3cpLnNjcm9sbExlZnQoKSkrYShiLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiP2RvY3VtZW50OndpbmRvdykud2lkdGgoKS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXRoaXMubWFyZ2lucy5sZWZ0LChiLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiPzA6YSh3aW5kb3cpLnNjcm9sbFRvcCgpKSsoYShiLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiP2RvY3VtZW50OndpbmRvdykuaGVpZ2h0KCl8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZS5zY3JvbGxIZWlnaHQpLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LXRoaXMubWFyZ2lucy50b3BdO2lmKCEvXihkb2N1bWVudHx3aW5kb3d8cGFyZW50KSQvLnRlc3QoYi5jb250YWlubWVudCkmJmIuY29udGFpbm1lbnQuY29uc3RydWN0b3IhPUFycmF5KXt2YXIgYz1hKGIuY29udGFpbm1lbnQpLGQ9Y1swXTtpZighZClyZXR1cm47dmFyIGU9Yy5vZmZzZXQoKSxmPWEoZCkuY3NzKCJvdmVyZmxvdyIpIT0iaGlkZGVuIjt0aGlzLmNvbnRhaW5tZW50PVsocGFyc2VJbnQoYShkKS5jc3MoImJvcmRlckxlZnRXaWR0aCIpLDEwKXx8MCkrKHBhcnNlSW50KGEoZCkuY3NzKCJwYWRkaW5nTGVmdCIpLDEwKXx8MCksKHBhcnNlSW50KGEoZCkuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKXx8MCkrKHBhcnNlSW50KGEoZCkuY3NzKCJwYWRkaW5nVG9wIiksMTApfHwwKSwoZj9NYXRoLm1heChkLnNjcm9sbFdpZHRoLGQub2Zmc2V0V2lkdGgpOmQub2Zmc2V0V2lkdGgpLShwYXJzZUludChhKGQpLmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQoYShkKS5jc3MoInBhZGRpbmdSaWdodCIpLDEwKXx8MCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC10aGlzLm1hcmdpbnMubGVmdC10aGlzLm1hcmdpbnMucmlnaHQsKGY/TWF0aC5tYXgoZC5zY3JvbGxIZWlnaHQsZC5vZmZzZXRIZWlnaHQpOmQub2Zmc2V0SGVpZ2h0KS0ocGFyc2VJbnQoYShkKS5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQoYShkKS5jc3MoInBhZGRpbmdCb3R0b20iKSwxMCl8fDApLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LXRoaXMubWFyZ2lucy50b3AtdGhpcy5tYXJnaW5zLmJvdHRvbV0sdGhpcy5yZWxhdGl2ZV9jb250YWluZXI9Y31lbHNlIGIuY29udGFpbm1lbnQuY29uc3RydWN0b3I9PUFycmF5JiYodGhpcy5jb250YWlubWVudD1iLmNvbnRhaW5tZW50KX0sX2NvbnZlcnRQb3NpdGlvblRvOmZ1bmN0aW9uKGIsYyl7Y3x8KGM9dGhpcy5wb3NpdGlvbik7dmFyIGQ9Yj09ImFic29sdXRlIj8xOi0xLGU9dGhpcy5vcHRpb25zLGY9dGhpcy5jc3NQb3NpdGlvbj09ImFic29sdXRlIiYmKHRoaXMuc2Nyb2xsUGFyZW50WzBdPT1kb2N1bWVudHx8IWEudWkuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJlbnRbMF0pKT90aGlzLm9mZnNldFBhcmVudDp0aGlzLnNjcm9sbFBhcmVudCxnPS8oaHRtbHxib2R5KS9pLnRlc3QoZlswXS50YWdOYW1lKTtyZXR1cm57dG9wOmMudG9wK3RoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcCpkK3RoaXMub2Zmc2V0LnBhcmVudC50b3AqZC0oYS5icm93c2VyLnNhZmFyaSYmYS5icm93c2VyLnZlcnNpb248NTI2JiZ0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPzA6KHRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpOmc/MDpmLnNjcm9sbFRvcCgpKSpkKSxsZWZ0OmMubGVmdCt0aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0KmQrdGhpcy5vZmZzZXQucGFyZW50LmxlZnQqZC0oYS5icm93c2VyLnNhZmFyaSYmYS5icm93c2VyLnZlcnNpb248NTI2JiZ0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPzA6KHRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKTpnPzA6Zi5zY3JvbGxMZWZ0KCkpKmQpfX0sX2dlbmVyYXRlUG9zaXRpb246ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5vcHRpb25zLGQ9dGhpcy5jc3NQb3NpdGlvbj09ImFic29sdXRlIiYmKHRoaXMuc2Nyb2xsUGFyZW50WzBdPT1kb2N1bWVudHx8IWEudWkuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJlbnRbMF0pKT90aGlzLm9mZnNldFBhcmVudDp0aGlzLnNjcm9sbFBhcmVudCxlPS8oaHRtbHxib2R5KS9pLnRlc3QoZFswXS50YWdOYW1lKSxmPWIucGFnZVgsZz1iLnBhZ2VZO2lmKHRoaXMub3JpZ2luYWxQb3NpdGlvbil7dmFyIGg7aWYodGhpcy5jb250YWlubWVudCl7aWYodGhpcy5yZWxhdGl2ZV9jb250YWluZXIpe3ZhciBpPXRoaXMucmVsYXRpdmVfY29udGFpbmVyLm9mZnNldCgpO2g9W3RoaXMuY29udGFpbm1lbnRbMF0raS5sZWZ0LHRoaXMuY29udGFpbm1lbnRbMV0raS50b3AsdGhpcy5jb250YWlubWVudFsyXStpLmxlZnQsdGhpcy5jb250YWlubWVudFszXStpLnRvcF19ZWxzZSBoPXRoaXMuY29udGFpbm1lbnQ7Yi5wYWdlWC10aGlzLm9mZnNldC5jbGljay5sZWZ0PGhbMF0mJihmPWhbMF0rdGhpcy5vZmZzZXQuY2xpY2subGVmdCksYi5wYWdlWS10aGlzLm9mZnNldC5jbGljay50b3A8aFsxXSYmKGc9aFsxXSt0aGlzLm9mZnNldC5jbGljay50b3ApLGIucGFnZVgtdGhpcy5vZmZzZXQuY2xpY2subGVmdD5oWzJdJiYoZj1oWzJdK3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQpLGIucGFnZVktdGhpcy5vZmZzZXQuY2xpY2sudG9wPmhbM10mJihnPWhbM10rdGhpcy5vZmZzZXQuY2xpY2sudG9wKX1pZihjLmdyaWQpe3ZhciBqPWMuZ3JpZFsxXT90aGlzLm9yaWdpbmFsUGFnZVkrTWF0aC5yb3VuZCgoZy10aGlzLm9yaWdpbmFsUGFnZVkpL2MuZ3JpZFsxXSkqYy5ncmlkWzFdOnRoaXMub3JpZ2luYWxQYWdlWTtnPWg/ai10aGlzLm9mZnNldC5jbGljay50b3A8aFsxXXx8ai10aGlzLm9mZnNldC5jbGljay50b3A+aFszXT9qLXRoaXMub2Zmc2V0LmNsaWNrLnRvcDxoWzFdP2orYy5ncmlkWzFdOmotYy5ncmlkWzFdOmo6ajt2YXIgaz1jLmdyaWRbMF0/dGhpcy5vcmlnaW5hbFBhZ2VYK01hdGgucm91bmQoKGYtdGhpcy5vcmlnaW5hbFBhZ2VYKS9jLmdyaWRbMF0pKmMuZ3JpZFswXTp0aGlzLm9yaWdpbmFsUGFnZVg7Zj1oP2stdGhpcy5vZmZzZXQuY2xpY2subGVmdDxoWzBdfHxrLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+aFsyXT9rLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ8aFswXT9rK2MuZ3JpZFswXTprLWMuZ3JpZFswXTprOmt9fXJldHVybnt0b3A6Zy10aGlzLm9mZnNldC5jbGljay50b3AtdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3ArKGEuYnJvd3Nlci5zYWZhcmkmJmEuYnJvd3Nlci52ZXJzaW9uPDUyNiYmdGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8wOnRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpOmU/MDpkLnNjcm9sbFRvcCgpKSxsZWZ0OmYtdGhpcy5vZmZzZXQuY2xpY2subGVmdC10aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0LXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0KyhhLmJyb3dzZXIuc2FmYXJpJiZhLmJyb3dzZXIudmVyc2lvbjw1MjYmJnRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/MDp0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCk6ZT8wOmQuc2Nyb2xsTGVmdCgpKX19LF9jbGVhcjpmdW5jdGlvbigpe3RoaXMuaGVscGVyLnJlbW92ZUNsYXNzKCJ1aS1kcmFnZ2FibGUtZHJhZ2dpbmciKSx0aGlzLmhlbHBlclswXSE9dGhpcy5lbGVtZW50WzBdJiYhdGhpcy5jYW5jZWxIZWxwZXJSZW1vdmFsJiZ0aGlzLmhlbHBlci5yZW1vdmUoKSx0aGlzLmhlbHBlcj1udWxsLHRoaXMuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMX0sX3RyaWdnZXI6ZnVuY3Rpb24oYixjLGQpe3JldHVybiBkPWR8fHRoaXMuX3VpSGFzaCgpLGEudWkucGx1Z2luLmNhbGwodGhpcyxiLFtjLGRdKSxiPT0iZHJhZyImJih0aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpKSxhLldpZGdldC5wcm90b3R5cGUuX3RyaWdnZXIuY2FsbCh0aGlzLGIsYyxkKX0scGx1Z2luczp7fSxfdWlIYXNoOmZ1bmN0aW9uKGEpe3JldHVybntoZWxwZXI6dGhpcy5oZWxwZXIscG9zaXRpb246dGhpcy5wb3NpdGlvbixvcmlnaW5hbFBvc2l0aW9uOnRoaXMub3JpZ2luYWxQb3NpdGlvbixvZmZzZXQ6dGhpcy5wb3NpdGlvbkFic319fSksYS5leHRlbmQoYS51aS5kcmFnZ2FibGUse3ZlcnNpb246IjEuOC4yNCJ9KSxhLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsImNvbm5lY3RUb1NvcnRhYmxlIix7c3RhcnQ6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLGU9ZC5vcHRpb25zLGY9YS5leHRlbmQoe30sYyx7aXRlbTpkLmVsZW1lbnR9KTtkLnNvcnRhYmxlcz1bXSxhKGUuY29ubmVjdFRvU29ydGFibGUpLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1hLmRhdGEodGhpcywic29ydGFibGUiKTtjJiYhYy5vcHRpb25zLmRpc2FibGVkJiYoZC5zb3J0YWJsZXMucHVzaCh7aW5zdGFuY2U6YyxzaG91bGRSZXZlcnQ6Yy5vcHRpb25zLnJldmVydH0pLGMucmVmcmVzaFBvc2l0aW9ucygpLGMuX3RyaWdnZXIoImFjdGl2YXRlIixiLGYpKX0pfSxzdG9wOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKSxlPWEuZXh0ZW5kKHt9LGMse2l0ZW06ZC5lbGVtZW50fSk7YS5lYWNoKGQuc29ydGFibGVzLGZ1bmN0aW9uKCl7dGhpcy5pbnN0YW5jZS5pc092ZXI/KHRoaXMuaW5zdGFuY2UuaXNPdmVyPTAsZC5jYW5jZWxIZWxwZXJSZW1vdmFsPSEwLHRoaXMuaW5zdGFuY2UuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMSx0aGlzLnNob3VsZFJldmVydCYmKHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5yZXZlcnQ9ITApLHRoaXMuaW5zdGFuY2UuX21vdXNlU3RvcChiKSx0aGlzLmluc3RhbmNlLm9wdGlvbnMuaGVscGVyPXRoaXMuaW5zdGFuY2Uub3B0aW9ucy5faGVscGVyLGQub3B0aW9ucy5oZWxwZXI9PSJvcmlnaW5hbCImJnRoaXMuaW5zdGFuY2UuY3VycmVudEl0ZW0uY3NzKHt0b3A6ImF1dG8iLGxlZnQ6ImF1dG8ifSkpOih0aGlzLmluc3RhbmNlLmNhbmNlbEhlbHBlclJlbW92YWw9ITEsdGhpcy5pbnN0YW5jZS5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsYixlKSl9KX0sZHJhZzpmdW5jdGlvbihiLGMpe3ZhciBkPWEodGhpcykuZGF0YSgiZHJhZ2dhYmxlIiksZT10aGlzLGY9ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5vZmZzZXQuY2xpY2sudG9wLGQ9dGhpcy5vZmZzZXQuY2xpY2subGVmdCxlPXRoaXMucG9zaXRpb25BYnMudG9wLGY9dGhpcy5wb3NpdGlvbkFicy5sZWZ0LGc9Yi5oZWlnaHQsaD1iLndpZHRoLGk9Yi50b3Asaj1iLmxlZnQ7cmV0dXJuIGEudWkuaXNPdmVyKGUrYyxmK2QsaSxqLGcsaCl9O2EuZWFjaChkLnNvcnRhYmxlcyxmdW5jdGlvbihmKXt0aGlzLmluc3RhbmNlLnBvc2l0aW9uQWJzPWQucG9zaXRpb25BYnMsdGhpcy5pbnN0YW5jZS5oZWxwZXJQcm9wb3J0aW9ucz1kLmhlbHBlclByb3BvcnRpb25zLHRoaXMuaW5zdGFuY2Uub2Zmc2V0LmNsaWNrPWQub2Zmc2V0LmNsaWNrLHRoaXMuaW5zdGFuY2UuX2ludGVyc2VjdHNXaXRoKHRoaXMuaW5zdGFuY2UuY29udGFpbmVyQ2FjaGUpPyh0aGlzLmluc3RhbmNlLmlzT3Zlcnx8KHRoaXMuaW5zdGFuY2UuaXNPdmVyPTEsdGhpcy5pbnN0YW5jZS5jdXJyZW50SXRlbT1hKGUpLmNsb25lKCkucmVtb3ZlQXR0cigiaWQiKS5hcHBlbmRUbyh0aGlzLmluc3RhbmNlLmVsZW1lbnQpLmRhdGEoInNvcnRhYmxlLWl0ZW0iLCEwKSx0aGlzLmluc3RhbmNlLm9wdGlvbnMuX2hlbHBlcj10aGlzLmluc3RhbmNlLm9wdGlvbnMuaGVscGVyLHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5oZWxwZXI9ZnVuY3Rpb24oKXtyZXR1cm4gYy5oZWxwZXJbMF19LGIudGFyZ2V0PXRoaXMuaW5zdGFuY2UuY3VycmVudEl0ZW1bMF0sdGhpcy5pbnN0YW5jZS5fbW91c2VDYXB0dXJlKGIsITApLHRoaXMuaW5zdGFuY2UuX21vdXNlU3RhcnQoYiwhMCwhMCksdGhpcy5pbnN0YW5jZS5vZmZzZXQuY2xpY2sudG9wPWQub2Zmc2V0LmNsaWNrLnRvcCx0aGlzLmluc3RhbmNlLm9mZnNldC5jbGljay5sZWZ0PWQub2Zmc2V0LmNsaWNrLmxlZnQsdGhpcy5pbnN0YW5jZS5vZmZzZXQucGFyZW50LmxlZnQtPWQub2Zmc2V0LnBhcmVudC5sZWZ0LXRoaXMuaW5zdGFuY2Uub2Zmc2V0LnBhcmVudC5sZWZ0LHRoaXMuaW5zdGFuY2Uub2Zmc2V0LnBhcmVudC50b3AtPWQub2Zmc2V0LnBhcmVudC50b3AtdGhpcy5pbnN0YW5jZS5vZmZzZXQucGFyZW50LnRvcCxkLl90cmlnZ2VyKCJ0b1NvcnRhYmxlIixiKSxkLmRyb3BwZWQ9dGhpcy5pbnN0YW5jZS5lbGVtZW50LGQuY3VycmVudEl0ZW09ZC5lbGVtZW50LHRoaXMuaW5zdGFuY2UuZnJvbU91dHNpZGU9ZCksdGhpcy5pbnN0YW5jZS5jdXJyZW50SXRlbSYmdGhpcy5pbnN0YW5jZS5fbW91c2VEcmFnKGIpKTp0aGlzLmluc3RhbmNlLmlzT3ZlciYmKHRoaXMuaW5zdGFuY2UuaXNPdmVyPTAsdGhpcy5pbnN0YW5jZS5jYW5jZWxIZWxwZXJSZW1vdmFsPSEwLHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5yZXZlcnQ9ITEsdGhpcy5pbnN0YW5jZS5fdHJpZ2dlcigib3V0IixiLHRoaXMuaW5zdGFuY2UuX3VpSGFzaCh0aGlzLmluc3RhbmNlKSksdGhpcy5pbnN0YW5jZS5fbW91c2VTdG9wKGIsITApLHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5oZWxwZXI9dGhpcy5pbnN0YW5jZS5vcHRpb25zLl9oZWxwZXIsdGhpcy5pbnN0YW5jZS5jdXJyZW50SXRlbS5yZW1vdmUoKSx0aGlzLmluc3RhbmNlLnBsYWNlaG9sZGVyJiZ0aGlzLmluc3RhbmNlLnBsYWNlaG9sZGVyLnJlbW92ZSgpLGQuX3RyaWdnZXIoImZyb21Tb3J0YWJsZSIsYiksZC5kcm9wcGVkPSExKX0pfX0pLGEudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwiY3Vyc29yIix7c3RhcnQ6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKCJib2R5IiksZT1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7ZC5jc3MoImN1cnNvciIpJiYoZS5fY3Vyc29yPWQuY3NzKCJjdXJzb3IiKSksZC5jc3MoImN1cnNvciIsZS5jdXJzb3IpfSxzdG9wOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKS5vcHRpb25zO2QuX2N1cnNvciYmYSgiYm9keSIpLmNzcygiY3Vyc29yIixkLl9jdXJzb3IpfX0pLGEudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwib3BhY2l0eSIse3N0YXJ0OmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YShjLmhlbHBlciksZT1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7ZC5jc3MoIm9wYWNpdHkiKSYmKGUuX29wYWNpdHk9ZC5jc3MoIm9wYWNpdHkiKSksZC5jc3MoIm9wYWNpdHkiLGUub3BhY2l0eSl9LHN0b3A6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7ZC5fb3BhY2l0eSYmYShjLmhlbHBlcikuY3NzKCJvcGFjaXR5IixkLl9vcGFjaXR5KX19KSxhLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsInNjcm9sbCIse3N0YXJ0OmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKTtkLnNjcm9sbFBhcmVudFswXSE9ZG9jdW1lbnQmJmQuc2Nyb2xsUGFyZW50WzBdLnRhZ05hbWUhPSJIVE1MIiYmKGQub3ZlcmZsb3dPZmZzZXQ9ZC5zY3JvbGxQYXJlbnQub2Zmc2V0KCkpfSxkcmFnOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKSxlPWQub3B0aW9ucyxmPSExO2lmKGQuc2Nyb2xsUGFyZW50WzBdIT1kb2N1bWVudCYmZC5zY3JvbGxQYXJlbnRbMF0udGFnTmFtZSE9IkhUTUwiKXtpZighZS5heGlzfHxlLmF4aXMhPSJ4IilkLm92ZXJmbG93T2Zmc2V0LnRvcCtkLnNjcm9sbFBhcmVudFswXS5vZmZzZXRIZWlnaHQtYi5wYWdlWTxlLnNjcm9sbFNlbnNpdGl2aXR5P2Quc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcD1mPWQuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcCtlLnNjcm9sbFNwZWVkOmIucGFnZVktZC5vdmVyZmxvd09mZnNldC50b3A8ZS5zY3JvbGxTZW5zaXRpdml0eSYmKGQuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcD1mPWQuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcC1lLnNjcm9sbFNwZWVkKTtpZighZS5heGlzfHxlLmF4aXMhPSJ5IilkLm92ZXJmbG93T2Zmc2V0LmxlZnQrZC5zY3JvbGxQYXJlbnRbMF0ub2Zmc2V0V2lkdGgtYi5wYWdlWDxlLnNjcm9sbFNlbnNpdGl2aXR5P2Quc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQ9Zj1kLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0K2Uuc2Nyb2xsU3BlZWQ6Yi5wYWdlWC1kLm92ZXJmbG93T2Zmc2V0LmxlZnQ8ZS5zY3JvbGxTZW5zaXRpdml0eSYmKGQuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQ9Zj1kLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0LWUuc2Nyb2xsU3BlZWQpfWVsc2V7aWYoIWUuYXhpc3x8ZS5heGlzIT0ieCIpYi5wYWdlWS1hKGRvY3VtZW50KS5zY3JvbGxUb3AoKTxlLnNjcm9sbFNlbnNpdGl2aXR5P2Y9YShkb2N1bWVudCkuc2Nyb2xsVG9wKGEoZG9jdW1lbnQpLnNjcm9sbFRvcCgpLWUuc2Nyb2xsU3BlZWQpOmEod2luZG93KS5oZWlnaHQoKS0oYi5wYWdlWS1hKGRvY3VtZW50KS5zY3JvbGxUb3AoKSk8ZS5zY3JvbGxTZW5zaXRpdml0eSYmKGY9YShkb2N1bWVudCkuc2Nyb2xsVG9wKGEoZG9jdW1lbnQpLnNjcm9sbFRvcCgpK2Uuc2Nyb2xsU3BlZWQpKTtpZighZS5heGlzfHxlLmF4aXMhPSJ5IiliLnBhZ2VYLWEoZG9jdW1lbnQpLnNjcm9sbExlZnQoKTxlLnNjcm9sbFNlbnNpdGl2aXR5P2Y9YShkb2N1bWVudCkuc2Nyb2xsTGVmdChhKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCktZS5zY3JvbGxTcGVlZCk6YSh3aW5kb3cpLndpZHRoKCktKGIucGFnZVgtYShkb2N1bWVudCkuc2Nyb2xsTGVmdCgpKTxlLnNjcm9sbFNlbnNpdGl2aXR5JiYoZj1hKGRvY3VtZW50KS5zY3JvbGxMZWZ0KGEoZG9jdW1lbnQpLnNjcm9sbExlZnQoKStlLnNjcm9sbFNwZWVkKSl9ZiE9PSExJiZhLnVpLmRkbWFuYWdlciYmIWUuZHJvcEJlaGF2aW91ciYmYS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHMoZCxiKX19KSxhLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsInNuYXAiLHtzdGFydDpmdW5jdGlvbihiLGMpe3ZhciBkPWEodGhpcykuZGF0YSgiZHJhZ2dhYmxlIiksZT1kLm9wdGlvbnM7ZC5zbmFwRWxlbWVudHM9W10sYShlLnNuYXAuY29uc3RydWN0b3IhPVN0cmluZz9lLnNuYXAuaXRlbXN8fCI6ZGF0YShkcmFnZ2FibGUpIjplLnNuYXApLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1hKHRoaXMpLGM9Yi5vZmZzZXQoKTt0aGlzIT1kLmVsZW1lbnRbMF0mJmQuc25hcEVsZW1lbnRzLnB1c2goe2l0ZW06dGhpcyx3aWR0aDpiLm91dGVyV2lkdGgoKSxoZWlnaHQ6Yi5vdXRlckhlaWdodCgpLHRvcDpjLnRvcCxsZWZ0OmMubGVmdH0pfSl9LGRyYWc6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLGU9ZC5vcHRpb25zLGY9ZS5zbmFwVG9sZXJhbmNlLGc9Yy5vZmZzZXQubGVmdCxoPWcrZC5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCxpPWMub2Zmc2V0LnRvcCxqPWkrZC5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQ7Zm9yKHZhciBrPWQuc25hcEVsZW1lbnRzLmxlbmd0aC0xO2s+PTA7ay0tKXt2YXIgbD1kLnNuYXBFbGVtZW50c1trXS5sZWZ0LG09bCtkLnNuYXBFbGVtZW50c1trXS53aWR0aCxuPWQuc25hcEVsZW1lbnRzW2tdLnRvcCxvPW4rZC5zbmFwRWxlbWVudHNba10uaGVpZ2h0O2lmKCEobC1mPGcmJmc8bStmJiZuLWY8aSYmaTxvK2Z8fGwtZjxnJiZnPG0rZiYmbi1mPGomJmo8bytmfHxsLWY8aCYmaDxtK2YmJm4tZjxpJiZpPG8rZnx8bC1mPGgmJmg8bStmJiZuLWY8aiYmajxvK2YpKXtkLnNuYXBFbGVtZW50c1trXS5zbmFwcGluZyYmZC5vcHRpb25zLnNuYXAucmVsZWFzZSYmZC5vcHRpb25zLnNuYXAucmVsZWFzZS5jYWxsKGQuZWxlbWVudCxiLGEuZXh0ZW5kKGQuX3VpSGFzaCgpLHtzbmFwSXRlbTpkLnNuYXBFbGVtZW50c1trXS5pdGVtfSkpLGQuc25hcEVsZW1lbnRzW2tdLnNuYXBwaW5nPSExO2NvbnRpbnVlfWlmKGUuc25hcE1vZGUhPSJpbm5lciIpe3ZhciBwPU1hdGguYWJzKG4taik8PWYscT1NYXRoLmFicyhvLWkpPD1mLHI9TWF0aC5hYnMobC1oKTw9ZixzPU1hdGguYWJzKG0tZyk8PWY7cCYmKGMucG9zaXRpb24udG9wPWQuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDpuLWQuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LGxlZnQ6MH0pLnRvcC1kLm1hcmdpbnMudG9wKSxxJiYoYy5wb3NpdGlvbi50b3A9ZC5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOm8sbGVmdDowfSkudG9wLWQubWFyZ2lucy50b3ApLHImJihjLnBvc2l0aW9uLmxlZnQ9ZC5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOjAsbGVmdDpsLWQuaGVscGVyUHJvcG9ydGlvbnMud2lkdGh9KS5sZWZ0LWQubWFyZ2lucy5sZWZ0KSxzJiYoYy5wb3NpdGlvbi5sZWZ0PWQuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDowLGxlZnQ6bX0pLmxlZnQtZC5tYXJnaW5zLmxlZnQpfXZhciB0PXB8fHF8fHJ8fHM7aWYoZS5zbmFwTW9kZSE9Im91dGVyIil7dmFyIHA9TWF0aC5hYnMobi1pKTw9ZixxPU1hdGguYWJzKG8taik8PWYscj1NYXRoLmFicyhsLWcpPD1mLHM9TWF0aC5hYnMobS1oKTw9ZjtwJiYoYy5wb3NpdGlvbi50b3A9ZC5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOm4sbGVmdDowfSkudG9wLWQubWFyZ2lucy50b3ApLHEmJihjLnBvc2l0aW9uLnRvcD1kLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6by1kLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCxsZWZ0OjB9KS50b3AtZC5tYXJnaW5zLnRvcCksciYmKGMucG9zaXRpb24ubGVmdD1kLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6MCxsZWZ0Omx9KS5sZWZ0LWQubWFyZ2lucy5sZWZ0KSxzJiYoYy5wb3NpdGlvbi5sZWZ0PWQuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDowLGxlZnQ6bS1kLmhlbHBlclByb3BvcnRpb25zLndpZHRofSkubGVmdC1kLm1hcmdpbnMubGVmdCl9IWQuc25hcEVsZW1lbnRzW2tdLnNuYXBwaW5nJiYocHx8cXx8cnx8c3x8dCkmJmQub3B0aW9ucy5zbmFwLnNuYXAmJmQub3B0aW9ucy5zbmFwLnNuYXAuY2FsbChkLmVsZW1lbnQsYixhLmV4dGVuZChkLl91aUhhc2goKSx7c25hcEl0ZW06ZC5zbmFwRWxlbWVudHNba10uaXRlbX0pKSxkLnNuYXBFbGVtZW50c1trXS5zbmFwcGluZz1wfHxxfHxyfHxzfHx0fX19KSxhLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsInN0YWNrIix7c3RhcnQ6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnMsZT1hLm1ha2VBcnJheShhKGQuc3RhY2spKS5zb3J0KGZ1bmN0aW9uKGIsYyl7cmV0dXJuKHBhcnNlSW50KGEoYikuY3NzKCJ6SW5kZXgiKSwxMCl8fDApLShwYXJzZUludChhKGMpLmNzcygiekluZGV4IiksMTApfHwwKX0pO2lmKCFlLmxlbmd0aClyZXR1cm47dmFyIGY9cGFyc2VJbnQoZVswXS5zdHlsZS56SW5kZXgpfHwwO2EoZSkuZWFjaChmdW5jdGlvbihhKXt0aGlzLnN0eWxlLnpJbmRleD1mK2F9KSx0aGlzWzBdLnN0eWxlLnpJbmRleD1mK2UubGVuZ3RofX0pLGEudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwiekluZGV4Iix7c3RhcnQ6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKGMuaGVscGVyKSxlPWEodGhpcykuZGF0YSgiZHJhZ2dhYmxlIikub3B0aW9ucztkLmNzcygiekluZGV4IikmJihlLl96SW5kZXg9ZC5jc3MoInpJbmRleCIpKSxkLmNzcygiekluZGV4IixlLnpJbmRleCl9LHN0b3A6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7ZC5fekluZGV4JiZhKGMuaGVscGVyKS5jc3MoInpJbmRleCIsZC5fekluZGV4KX19KX0oalF1ZXJ5KSxmdW5jdGlvbihhLGIpe2Eud2lkZ2V0KCJ1aS5kcm9wcGFibGUiLHt3aWRnZXRFdmVudFByZWZpeDoiZHJvcCIsb3B0aW9uczp7YWNjZXB0OiIqIixhY3RpdmVDbGFzczohMSxhZGRDbGFzc2VzOiEwLGdyZWVkeTohMSxob3ZlckNsYXNzOiExLHNjb3BlOiJkZWZhdWx0Iix0b2xlcmFuY2U6ImludGVyc2VjdCJ9LF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9wdGlvbnMsYz1iLmFjY2VwdDt0aGlzLmlzb3Zlcj0wLHRoaXMuaXNvdXQ9MSx0aGlzLmFjY2VwdD1hLmlzRnVuY3Rpb24oYyk/YzpmdW5jdGlvbihhKXtyZXR1cm4gYS5pcyhjKX0sdGhpcy5wcm9wb3J0aW9ucz17d2lkdGg6dGhpcy5lbGVtZW50WzBdLm9mZnNldFdpZHRoLGhlaWdodDp0aGlzLmVsZW1lbnRbMF0ub2Zmc2V0SGVpZ2h0fSxhLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW2Iuc2NvcGVdPWEudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbYi5zY29wZV18fFtdLGEudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbYi5zY29wZV0ucHVzaCh0aGlzKSxiLmFkZENsYXNzZXMmJnRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktZHJvcHBhYmxlIil9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt2YXIgYj1hLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW3RoaXMub3B0aW9ucy5zY29wZV07Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspYltjXT09dGhpcyYmYi5zcGxpY2UoYywxKTtyZXR1cm4gdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1kcm9wcGFibGUgdWktZHJvcHBhYmxlLWRpc2FibGVkIikucmVtb3ZlRGF0YSgiZHJvcHBhYmxlIikudW5iaW5kKCIuZHJvcHBhYmxlIiksdGhpc30sX3NldE9wdGlvbjpmdW5jdGlvbihiLGMpe2I9PSJhY2NlcHQiJiYodGhpcy5hY2NlcHQ9YS5pc0Z1bmN0aW9uKGMpP2M6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXMoYyl9KSxhLldpZGdldC5wcm90b3R5cGUuX3NldE9wdGlvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF9hY3RpdmF0ZTpmdW5jdGlvbihiKXt2YXIgYz1hLnVpLmRkbWFuYWdlci5jdXJyZW50O3RoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyYmdGhpcy5lbGVtZW50LmFkZENsYXNzKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyksYyYmdGhpcy5fdHJpZ2dlcigiYWN0aXZhdGUiLGIsdGhpcy51aShjKSl9LF9kZWFjdGl2YXRlOmZ1bmN0aW9uKGIpe3ZhciBjPWEudWkuZGRtYW5hZ2VyLmN1cnJlbnQ7dGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzJiZ0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKSxjJiZ0aGlzLl90cmlnZ2VyKCJkZWFjdGl2YXRlIixiLHRoaXMudWkoYykpfSxfb3ZlcjpmdW5jdGlvbihiKXt2YXIgYz1hLnVpLmRkbWFuYWdlci5jdXJyZW50O2lmKCFjfHwoYy5jdXJyZW50SXRlbXx8Yy5lbGVtZW50KVswXT09dGhpcy5lbGVtZW50WzBdKXJldHVybjt0aGlzLmFjY2VwdC5jYWxsKHRoaXMuZWxlbWVudFswXSxjLmN1cnJlbnRJdGVtfHxjLmVsZW1lbnQpJiYodGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MmJnRoaXMuZWxlbWVudC5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyksdGhpcy5fdHJpZ2dlcigib3ZlciIsYix0aGlzLnVpKGMpKSl9LF9vdXQ6ZnVuY3Rpb24oYil7dmFyIGM9YS51aS5kZG1hbmFnZXIuY3VycmVudDtpZighY3x8KGMuY3VycmVudEl0ZW18fGMuZWxlbWVudClbMF09PXRoaXMuZWxlbWVudFswXSlyZXR1cm47dGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0sYy5jdXJyZW50SXRlbXx8Yy5lbGVtZW50KSYmKHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzJiZ0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MpLHRoaXMuX3RyaWdnZXIoIm91dCIsYix0aGlzLnVpKGMpKSl9LF9kcm9wOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9Y3x8YS51aS5kZG1hbmFnZXIuY3VycmVudDtpZighZHx8KGQuY3VycmVudEl0ZW18fGQuZWxlbWVudClbMF09PXRoaXMuZWxlbWVudFswXSlyZXR1cm4hMTt2YXIgZT0hMTtyZXR1cm4gdGhpcy5lbGVtZW50LmZpbmQoIjpkYXRhKGRyb3BwYWJsZSkiKS5ub3QoIi51aS1kcmFnZ2FibGUtZHJhZ2dpbmciKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9YS5kYXRhKHRoaXMsImRyb3BwYWJsZSIpO2lmKGIub3B0aW9ucy5ncmVlZHkmJiFiLm9wdGlvbnMuZGlzYWJsZWQmJmIub3B0aW9ucy5zY29wZT09ZC5vcHRpb25zLnNjb3BlJiZiLmFjY2VwdC5jYWxsKGIuZWxlbWVudFswXSxkLmN1cnJlbnRJdGVtfHxkLmVsZW1lbnQpJiZhLnVpLmludGVyc2VjdChkLGEuZXh0ZW5kKGIse29mZnNldDpiLmVsZW1lbnQub2Zmc2V0KCl9KSxiLm9wdGlvbnMudG9sZXJhbmNlKSlyZXR1cm4gZT0hMCwhMX0pLGU/ITE6dGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0sZC5jdXJyZW50SXRlbXx8ZC5lbGVtZW50KT8odGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzJiZ0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKSx0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyYmdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzKSx0aGlzLl90cmlnZ2VyKCJkcm9wIixiLHRoaXMudWkoZCkpLHRoaXMuZWxlbWVudCk6ITF9LHVpOmZ1bmN0aW9uKGEpe3JldHVybntkcmFnZ2FibGU6YS5jdXJyZW50SXRlbXx8YS5lbGVtZW50LGhlbHBlcjphLmhlbHBlcixwb3NpdGlvbjphLnBvc2l0aW9uLG9mZnNldDphLnBvc2l0aW9uQWJzfX19KSxhLmV4dGVuZChhLnVpLmRyb3BwYWJsZSx7dmVyc2lvbjoiMS44LjI0In0pLGEudWkuaW50ZXJzZWN0PWZ1bmN0aW9uKGIsYyxkKXtpZighYy5vZmZzZXQpcmV0dXJuITE7dmFyIGU9KGIucG9zaXRpb25BYnN8fGIucG9zaXRpb24uYWJzb2x1dGUpLmxlZnQsZj1lK2IuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgsZz0oYi5wb3NpdGlvbkFic3x8Yi5wb3NpdGlvbi5hYnNvbHV0ZSkudG9wLGg9ZytiLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCxpPWMub2Zmc2V0LmxlZnQsaj1pK2MucHJvcG9ydGlvbnMud2lkdGgsaz1jLm9mZnNldC50b3AsbD1rK2MucHJvcG9ydGlvbnMuaGVpZ2h0O3N3aXRjaChkKXtjYXNlImZpdCI6cmV0dXJuIGk8PWUmJmY8PWomJms8PWcmJmg8PWw7Y2FzZSJpbnRlcnNlY3QiOnJldHVybiBpPGUrYi5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC8yJiZmLWIuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgvMjxqJiZrPGcrYi5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQvMiYmaC1iLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC8yPGw7Y2FzZSJwb2ludGVyIjp2YXIgbT0oYi5wb3NpdGlvbkFic3x8Yi5wb3NpdGlvbi5hYnNvbHV0ZSkubGVmdCsoYi5jbGlja09mZnNldHx8Yi5vZmZzZXQuY2xpY2spLmxlZnQsbj0oYi5wb3NpdGlvbkFic3x8Yi5wb3NpdGlvbi5hYnNvbHV0ZSkudG9wKyhiLmNsaWNrT2Zmc2V0fHxiLm9mZnNldC5jbGljaykudG9wLG89YS51aS5pc092ZXIobixtLGssaSxjLnByb3BvcnRpb25zLmhlaWdodCxjLnByb3BvcnRpb25zLndpZHRoKTtyZXR1cm4gbztjYXNlInRvdWNoIjpyZXR1cm4oZz49ayYmZzw9bHx8aD49ayYmaDw9bHx8ZzxrJiZoPmwpJiYoZT49aSYmZTw9anx8Zj49aSYmZjw9anx8ZTxpJiZmPmopO2RlZmF1bHQ6cmV0dXJuITF9fSxhLnVpLmRkbWFuYWdlcj17Y3VycmVudDpudWxsLGRyb3BwYWJsZXM6eyJkZWZhdWx0IjpbXX0scHJlcGFyZU9mZnNldHM6ZnVuY3Rpb24oYixjKXt2YXIgZD1hLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW2Iub3B0aW9ucy5zY29wZV18fFtdLGU9Yz9jLnR5cGU6bnVsbCxmPShiLmN1cnJlbnRJdGVtfHxiLmVsZW1lbnQpLmZpbmQoIjpkYXRhKGRyb3BwYWJsZSkiKS5hbmRTZWxmKCk7Zzpmb3IodmFyIGg9MDtoPGQubGVuZ3RoO2grKyl7aWYoZFtoXS5vcHRpb25zLmRpc2FibGVkfHxiJiYhZFtoXS5hY2NlcHQuY2FsbChkW2hdLmVsZW1lbnRbMF0sYi5jdXJyZW50SXRlbXx8Yi5lbGVtZW50KSljb250aW51ZTtmb3IodmFyIGk9MDtpPGYubGVuZ3RoO2krKylpZihmW2ldPT1kW2hdLmVsZW1lbnRbMF0pe2RbaF0ucHJvcG9ydGlvbnMuaGVpZ2h0PTA7Y29udGludWUgZ31kW2hdLnZpc2libGU9ZFtoXS5lbGVtZW50LmNzcygiZGlzcGxheSIpIT0ibm9uZSI7aWYoIWRbaF0udmlzaWJsZSljb250aW51ZTtlPT0ibW91c2Vkb3duIiYmZFtoXS5fYWN0aXZhdGUuY2FsbChkW2hdLGMpLGRbaF0ub2Zmc2V0PWRbaF0uZWxlbWVudC5vZmZzZXQoKSxkW2hdLnByb3BvcnRpb25zPXt3aWR0aDpkW2hdLmVsZW1lbnRbMF0ub2Zmc2V0V2lkdGgsaGVpZ2h0OmRbaF0uZWxlbWVudFswXS5vZmZzZXRIZWlnaHR9fX0sZHJvcDpmdW5jdGlvbihiLGMpe3ZhciBkPSExO3JldHVybiBhLmVhY2goYS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1tiLm9wdGlvbnMuc2NvcGVdfHxbXSxmdW5jdGlvbigpe2lmKCF0aGlzLm9wdGlvbnMpcmV0dXJuOyF0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMudmlzaWJsZSYmYS51aS5pbnRlcnNlY3QoYix0aGlzLHRoaXMub3B0aW9ucy50b2xlcmFuY2UpJiYoZD10aGlzLl9kcm9wLmNhbGwodGhpcyxjKXx8ZCksIXRoaXMub3B0aW9ucy5kaXNhYmxlZCYmdGhpcy52aXNpYmxlJiZ0aGlzLmFjY2VwdC5jYWxsKHRoaXMuZWxlbWVudFswXSxiLmN1cnJlbnRJdGVtfHxiLmVsZW1lbnQpJiYodGhpcy5pc291dD0xLHRoaXMuaXNvdmVyPTAsdGhpcy5fZGVhY3RpdmF0ZS5jYWxsKHRoaXMsYykpfSksZH0sZHJhZ1N0YXJ0OmZ1bmN0aW9uKGIsYyl7Yi5lbGVtZW50LnBhcmVudHMoIjpub3QoYm9keSxodG1sKSIpLmJpbmQoInNjcm9sbC5kcm9wcGFibGUiLGZ1bmN0aW9uKCl7Yi5vcHRpb25zLnJlZnJlc2hQb3NpdGlvbnN8fGEudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKGIsYyl9KX0sZHJhZzpmdW5jdGlvbihiLGMpe2Iub3B0aW9ucy5yZWZyZXNoUG9zaXRpb25zJiZhLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyhiLGMpLGEuZWFjaChhLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW2Iub3B0aW9ucy5zY29wZV18fFtdLGZ1bmN0aW9uKCl7aWYodGhpcy5vcHRpb25zLmRpc2FibGVkfHx0aGlzLmdyZWVkeUNoaWxkfHwhdGhpcy52aXNpYmxlKXJldHVybjt2YXIgZD1hLnVpLmludGVyc2VjdChiLHRoaXMsdGhpcy5vcHRpb25zLnRvbGVyYW5jZSksZT0hZCYmdGhpcy5pc292ZXI9PTE/Imlzb3V0IjpkJiZ0aGlzLmlzb3Zlcj09MD8iaXNvdmVyIjpudWxsO2lmKCFlKXJldHVybjt2YXIgZjtpZih0aGlzLm9wdGlvbnMuZ3JlZWR5KXt2YXIgZz10aGlzLm9wdGlvbnMuc2NvcGUsaD10aGlzLmVsZW1lbnQucGFyZW50cygiOmRhdGEoZHJvcHBhYmxlKSIpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiBhLmRhdGEodGhpcywiZHJvcHBhYmxlIikub3B0aW9ucy5zY29wZT09PWd9KTtoLmxlbmd0aCYmKGY9YS5kYXRhKGhbMF0sImRyb3BwYWJsZSIpLGYuZ3JlZWR5Q2hpbGQ9ZT09Imlzb3ZlciI/MTowKX1mJiZlPT0iaXNvdmVyIiYmKGYuaXNvdmVyPTAsZi5pc291dD0xLGYuX291dC5jYWxsKGYsYykpLHRoaXNbZV09MSx0aGlzW2U9PSJpc291dCI/Imlzb3ZlciI6Imlzb3V0Il09MCx0aGlzW2U9PSJpc292ZXIiPyJfb3ZlciI6Il9vdXQiXS5jYWxsKHRoaXMsYyksZiYmZT09Imlzb3V0IiYmKGYuaXNvdXQ9MCxmLmlzb3Zlcj0xLGYuX292ZXIuY2FsbChmLGMpKX0pfSxkcmFnU3RvcDpmdW5jdGlvbihiLGMpe2IuZWxlbWVudC5wYXJlbnRzKCI6bm90KGJvZHksaHRtbCkiKS51bmJpbmQoInNjcm9sbC5kcm9wcGFibGUiKSxiLm9wdGlvbnMucmVmcmVzaFBvc2l0aW9uc3x8YS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHMoYixjKX19fShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7YS53aWRnZXQoInVpLnJlc2l6YWJsZSIsYS51aS5tb3VzZSx7d2lkZ2V0RXZlbnRQcmVmaXg6InJlc2l6ZSIsb3B0aW9uczp7YWxzb1Jlc2l6ZTohMSxhbmltYXRlOiExLGFuaW1hdGVEdXJhdGlvbjoic2xvdyIsYW5pbWF0ZUVhc2luZzoic3dpbmciLGFzcGVjdFJhdGlvOiExLGF1dG9IaWRlOiExLGNvbnRhaW5tZW50OiExLGdob3N0OiExLGdyaWQ6ITEsaGFuZGxlczoiZSxzLHNlIixoZWxwZXI6ITEsbWF4SGVpZ2h0Om51bGwsbWF4V2lkdGg6bnVsbCxtaW5IZWlnaHQ6MTAsbWluV2lkdGg6MTAsekluZGV4OjFlM30sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMsYz10aGlzLm9wdGlvbnM7dGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1yZXNpemFibGUiKSxhLmV4dGVuZCh0aGlzLHtfYXNwZWN0UmF0aW86ISFjLmFzcGVjdFJhdGlvLGFzcGVjdFJhdGlvOmMuYXNwZWN0UmF0aW8sb3JpZ2luYWxFbGVtZW50OnRoaXMuZWxlbWVudCxfcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50czpbXSxfaGVscGVyOmMuaGVscGVyfHxjLmdob3N0fHxjLmFuaW1hdGU/Yy5oZWxwZXJ8fCJ1aS1yZXNpemFibGUtaGVscGVyIjpudWxsfSksdGhpcy5lbGVtZW50WzBdLm5vZGVOYW1lLm1hdGNoKC9jYW52YXN8dGV4dGFyZWF8aW5wdXR8c2VsZWN0fGJ1dHRvbnxpbWcvaSkmJih0aGlzLmVsZW1lbnQud3JhcChhKCc8ZGl2IGNsYXNzPSJ1aS13cmFwcGVyIiBzdHlsZT0ib3ZlcmZsb3c6IGhpZGRlbjsiPjwvZGl2PicpLmNzcyh7cG9zaXRpb246dGhpcy5lbGVtZW50LmNzcygicG9zaXRpb24iKSx3aWR0aDp0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpLGhlaWdodDp0aGlzLmVsZW1lbnQub3V0ZXJIZWlnaHQoKSx0b3A6dGhpcy5lbGVtZW50LmNzcygidG9wIiksbGVmdDp0aGlzLmVsZW1lbnQuY3NzKCJsZWZ0Iil9KSksdGhpcy5lbGVtZW50PXRoaXMuZWxlbWVudC5wYXJlbnQoKS5kYXRhKCJyZXNpemFibGUiLHRoaXMuZWxlbWVudC5kYXRhKCJyZXNpemFibGUiKSksdGhpcy5lbGVtZW50SXNXcmFwcGVyPSEwLHRoaXMuZWxlbWVudC5jc3Moe21hcmdpbkxlZnQ6dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJtYXJnaW5MZWZ0IiksbWFyZ2luVG9wOnRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygibWFyZ2luVG9wIiksbWFyZ2luUmlnaHQ6dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJtYXJnaW5SaWdodCIpLG1hcmdpbkJvdHRvbTp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpbkJvdHRvbSIpfSksdGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKHttYXJnaW5MZWZ0OjAsbWFyZ2luVG9wOjAsbWFyZ2luUmlnaHQ6MCxtYXJnaW5Cb3R0b206MH0pLHRoaXMub3JpZ2luYWxSZXNpemVTdHlsZT10aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoInJlc2l6ZSIpLHRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygicmVzaXplIiwibm9uZSIpLHRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMucHVzaCh0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3Moe3Bvc2l0aW9uOiJzdGF0aWMiLHpvb206MSxkaXNwbGF5OiJibG9jayJ9KSksdGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKHttYXJnaW46dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJtYXJnaW4iKX0pLHRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplKCkpLHRoaXMuaGFuZGxlcz1jLmhhbmRsZXN8fChhKCIudWktcmVzaXphYmxlLWhhbmRsZSIsdGhpcy5lbGVtZW50KS5sZW5ndGg/e246Ii51aS1yZXNpemFibGUtbiIsZToiLnVpLXJlc2l6YWJsZS1lIixzOiIudWktcmVzaXphYmxlLXMiLHc6Ii51aS1yZXNpemFibGUtdyIsc2U6Ii51aS1yZXNpemFibGUtc2UiLHN3OiIudWktcmVzaXphYmxlLXN3IixuZToiLnVpLXJlc2l6YWJsZS1uZSIsbnc6Ii51aS1yZXNpemFibGUtbncifToiZSxzLHNlIik7aWYodGhpcy5oYW5kbGVzLmNvbnN0cnVjdG9yPT1TdHJpbmcpe3RoaXMuaGFuZGxlcz09ImFsbCImJih0aGlzLmhhbmRsZXM9Im4sZSxzLHcsc2Usc3csbmUsbnciKTt2YXIgZD10aGlzLmhhbmRsZXMuc3BsaXQoIiwiKTt0aGlzLmhhbmRsZXM9e307Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspe3ZhciBmPWEudHJpbShkW2VdKSxnPSJ1aS1yZXNpemFibGUtIitmLGg9YSgnPGRpdiBjbGFzcz0idWktcmVzaXphYmxlLWhhbmRsZSAnK2crJyI+PC9kaXY+Jyk7aC5jc3Moe3pJbmRleDpjLnpJbmRleH0pLCJzZSI9PWYmJmguYWRkQ2xhc3MoInVpLWljb24gdWktaWNvbi1ncmlwc21hbGwtZGlhZ29uYWwtc2UiKSx0aGlzLmhhbmRsZXNbZl09Ii51aS1yZXNpemFibGUtIitmLHRoaXMuZWxlbWVudC5hcHBlbmQoaCl9fXRoaXMuX3JlbmRlckF4aXM9ZnVuY3Rpb24oYil7Yj1ifHx0aGlzLmVsZW1lbnQ7Zm9yKHZhciBjIGluIHRoaXMuaGFuZGxlcyl7dGhpcy5oYW5kbGVzW2NdLmNvbnN0cnVjdG9yPT1TdHJpbmcmJih0aGlzLmhhbmRsZXNbY109YSh0aGlzLmhhbmRsZXNbY10sdGhpcy5lbGVtZW50KS5zaG93KCkpO2lmKHRoaXMuZWxlbWVudElzV3JhcHBlciYmdGhpcy5vcmlnaW5hbEVsZW1lbnRbMF0ubm9kZU5hbWUubWF0Y2goL3RleHRhcmVhfGlucHV0fHNlbGVjdHxidXR0b24vaSkpe3ZhciBkPWEodGhpcy5oYW5kbGVzW2NdLHRoaXMuZWxlbWVudCksZT0wO2U9L3N3fG5lfG53fHNlfG58cy8udGVzdChjKT9kLm91dGVySGVpZ2h0KCk6ZC5vdXRlcldpZHRoKCk7dmFyIGY9WyJwYWRkaW5nIiwvbmV8bnd8bi8udGVzdChjKT8iVG9wIjovc2V8c3d8cy8udGVzdChjKT8iQm90dG9tIjovXmUkLy50ZXN0KGMpPyJSaWdodCI6IkxlZnQiXS5qb2luKCIiKTtiLmNzcyhmLGUpLHRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplKCl9aWYoIWEodGhpcy5oYW5kbGVzW2NdKS5sZW5ndGgpY29udGludWV9fSx0aGlzLl9yZW5kZXJBeGlzKHRoaXMuZWxlbWVudCksdGhpcy5faGFuZGxlcz1hKCIudWktcmVzaXphYmxlLWhhbmRsZSIsdGhpcy5lbGVtZW50KS5kaXNhYmxlU2VsZWN0aW9uKCksdGhpcy5faGFuZGxlcy5tb3VzZW92ZXIoZnVuY3Rpb24oKXtpZighYi5yZXNpemluZyl7aWYodGhpcy5jbGFzc05hbWUpdmFyIGE9dGhpcy5jbGFzc05hbWUubWF0Y2goL3VpLXJlc2l6YWJsZS0oc2V8c3d8bmV8bnd8bnxlfHN8dykvaSk7Yi5heGlzPWEmJmFbMV0/YVsxXToic2UifX0pLGMuYXV0b0hpZGUmJih0aGlzLl9oYW5kbGVzLmhpZGUoKSxhKHRoaXMuZWxlbWVudCkuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZS1hdXRvaGlkZSIpLmhvdmVyKGZ1bmN0aW9uKCl7aWYoYy5kaXNhYmxlZClyZXR1cm47YSh0aGlzKS5yZW1vdmVDbGFzcygidWktcmVzaXphYmxlLWF1dG9oaWRlIiksYi5faGFuZGxlcy5zaG93KCl9LGZ1bmN0aW9uKCl7aWYoYy5kaXNhYmxlZClyZXR1cm47Yi5yZXNpemluZ3x8KGEodGhpcykuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZS1hdXRvaGlkZSIpLGIuX2hhbmRsZXMuaGlkZSgpKX0pKSx0aGlzLl9tb3VzZUluaXQoKX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuX21vdXNlRGVzdHJveSgpO3ZhciBiPWZ1bmN0aW9uKGIpe2EoYikucmVtb3ZlQ2xhc3MoInVpLXJlc2l6YWJsZSB1aS1yZXNpemFibGUtZGlzYWJsZWQgdWktcmVzaXphYmxlLXJlc2l6aW5nIikucmVtb3ZlRGF0YSgicmVzaXphYmxlIikudW5iaW5kKCIucmVzaXphYmxlIikuZmluZCgiLnVpLXJlc2l6YWJsZS1oYW5kbGUiKS5yZW1vdmUoKX07aWYodGhpcy5lbGVtZW50SXNXcmFwcGVyKXtiKHRoaXMuZWxlbWVudCk7dmFyIGM9dGhpcy5lbGVtZW50O2MuYWZ0ZXIodGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKHtwb3NpdGlvbjpjLmNzcygicG9zaXRpb24iKSx3aWR0aDpjLm91dGVyV2lkdGgoKSxoZWlnaHQ6Yy5vdXRlckhlaWdodCgpLHRvcDpjLmNzcygidG9wIiksbGVmdDpjLmNzcygibGVmdCIpfSkpLnJlbW92ZSgpfXJldHVybiB0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoInJlc2l6ZSIsdGhpcy5vcmlnaW5hbFJlc2l6ZVN0eWxlKSxiKHRoaXMub3JpZ2luYWxFbGVtZW50KSx0aGlzfSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKGIpe3ZhciBjPSExO2Zvcih2YXIgZCBpbiB0aGlzLmhhbmRsZXMpYSh0aGlzLmhhbmRsZXNbZF0pWzBdPT1iLnRhcmdldCYmKGM9ITApO3JldHVybiF0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJmN9LF9tb3VzZVN0YXJ0OmZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMub3B0aW9ucyxlPXRoaXMuZWxlbWVudC5wb3NpdGlvbigpLGY9dGhpcy5lbGVtZW50O3RoaXMucmVzaXppbmc9ITAsdGhpcy5kb2N1bWVudFNjcm9sbD17dG9wOmEoZG9jdW1lbnQpLnNjcm9sbFRvcCgpLGxlZnQ6YShkb2N1bWVudCkuc2Nyb2xsTGVmdCgpfSwoZi5pcygiLnVpLWRyYWdnYWJsZSIpfHwvYWJzb2x1dGUvLnRlc3QoZi5jc3MoInBvc2l0aW9uIikpKSYmZi5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOmUudG9wLGxlZnQ6ZS5sZWZ0fSksdGhpcy5fcmVuZGVyUHJveHkoKTt2YXIgZz1jKHRoaXMuaGVscGVyLmNzcygibGVmdCIpKSxoPWModGhpcy5oZWxwZXIuY3NzKCJ0b3AiKSk7ZC5jb250YWlubWVudCYmKGcrPWEoZC5jb250YWlubWVudCkuc2Nyb2xsTGVmdCgpfHwwLGgrPWEoZC5jb250YWlubWVudCkuc2Nyb2xsVG9wKCl8fDApLHRoaXMub2Zmc2V0PXRoaXMuaGVscGVyLm9mZnNldCgpLHRoaXMucG9zaXRpb249e2xlZnQ6Zyx0b3A6aH0sdGhpcy5zaXplPXRoaXMuX2hlbHBlcj97d2lkdGg6Zi5vdXRlcldpZHRoKCksaGVpZ2h0OmYub3V0ZXJIZWlnaHQoKX06e3dpZHRoOmYud2lkdGgoKSxoZWlnaHQ6Zi5oZWlnaHQoKX0sdGhpcy5vcmlnaW5hbFNpemU9dGhpcy5faGVscGVyP3t3aWR0aDpmLm91dGVyV2lkdGgoKSxoZWlnaHQ6Zi5vdXRlckhlaWdodCgpfTp7d2lkdGg6Zi53aWR0aCgpLGhlaWdodDpmLmhlaWdodCgpfSx0aGlzLm9yaWdpbmFsUG9zaXRpb249e2xlZnQ6Zyx0b3A6aH0sdGhpcy5zaXplRGlmZj17d2lkdGg6Zi5vdXRlcldpZHRoKCktZi53aWR0aCgpLGhlaWdodDpmLm91dGVySGVpZ2h0KCktZi5oZWlnaHQoKX0sdGhpcy5vcmlnaW5hbE1vdXNlUG9zaXRpb249e2xlZnQ6Yi5wYWdlWCx0b3A6Yi5wYWdlWX0sdGhpcy5hc3BlY3RSYXRpbz10eXBlb2YgZC5hc3BlY3RSYXRpbz09Im51bWJlciI/ZC5hc3BlY3RSYXRpbzp0aGlzLm9yaWdpbmFsU2l6ZS53aWR0aC90aGlzLm9yaWdpbmFsU2l6ZS5oZWlnaHR8fDE7dmFyIGk9YSgiLnVpLXJlc2l6YWJsZS0iK3RoaXMuYXhpcykuY3NzKCJjdXJzb3IiKTtyZXR1cm4gYSgiYm9keSIpLmNzcygiY3Vyc29yIixpPT0iYXV0byI/dGhpcy5heGlzKyItcmVzaXplIjppKSxmLmFkZENsYXNzKCJ1aS1yZXNpemFibGUtcmVzaXppbmciKSx0aGlzLl9wcm9wYWdhdGUoInN0YXJ0IixiKSwhMH0sX21vdXNlRHJhZzpmdW5jdGlvbihiKXt2YXIgYz10aGlzLmhlbHBlcixkPXRoaXMub3B0aW9ucyxlPXt9LGY9dGhpcyxnPXRoaXMub3JpZ2luYWxNb3VzZVBvc2l0aW9uLGg9dGhpcy5heGlzLGk9Yi5wYWdlWC1nLmxlZnR8fDAsaj1iLnBhZ2VZLWcudG9wfHwwLGs9dGhpcy5fY2hhbmdlW2hdO2lmKCFrKXJldHVybiExO3ZhciBsPWsuYXBwbHkodGhpcyxbYixpLGpdKSxtPWEuYnJvd3Nlci5tc2llJiZhLmJyb3dzZXIudmVyc2lvbjw3LG49dGhpcy5zaXplRGlmZjt0aGlzLl91cGRhdGVWaXJ0dWFsQm91bmRhcmllcyhiLnNoaWZ0S2V5KTtpZih0aGlzLl9hc3BlY3RSYXRpb3x8Yi5zaGlmdEtleSlsPXRoaXMuX3VwZGF0ZVJhdGlvKGwsYik7cmV0dXJuIGw9dGhpcy5fcmVzcGVjdFNpemUobCxiKSx0aGlzLl9wcm9wYWdhdGUoInJlc2l6ZSIsYiksYy5jc3Moe3RvcDp0aGlzLnBvc2l0aW9uLnRvcCsicHgiLGxlZnQ6dGhpcy5wb3NpdGlvbi5sZWZ0KyJweCIsd2lkdGg6dGhpcy5zaXplLndpZHRoKyJweCIsaGVpZ2h0OnRoaXMuc2l6ZS5oZWlnaHQrInB4In0pLCF0aGlzLl9oZWxwZXImJnRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoJiZ0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZSgpLHRoaXMuX3VwZGF0ZUNhY2hlKGwpLHRoaXMuX3RyaWdnZXIoInJlc2l6ZSIsYix0aGlzLnVpKCkpLCExfSxfbW91c2VTdG9wOmZ1bmN0aW9uKGIpe3RoaXMucmVzaXppbmc9ITE7dmFyIGM9dGhpcy5vcHRpb25zLGQ9dGhpcztpZih0aGlzLl9oZWxwZXIpe3ZhciBlPXRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMsZj1lLmxlbmd0aCYmL3RleHRhcmVhL2kudGVzdChlWzBdLm5vZGVOYW1lKSxnPWYmJmEudWkuaGFzU2Nyb2xsKGVbMF0sImxlZnQiKT8wOmQuc2l6ZURpZmYuaGVpZ2h0LGg9Zj8wOmQuc2l6ZURpZmYud2lkdGgsaT17d2lkdGg6ZC5oZWxwZXIud2lkdGgoKS1oLGhlaWdodDpkLmhlbHBlci5oZWlnaHQoKS1nfSxqPXBhcnNlSW50KGQuZWxlbWVudC5jc3MoImxlZnQiKSwxMCkrKGQucG9zaXRpb24ubGVmdC1kLm9yaWdpbmFsUG9zaXRpb24ubGVmdCl8fG51bGwsaz1wYXJzZUludChkLmVsZW1lbnQuY3NzKCJ0b3AiKSwxMCkrKGQucG9zaXRpb24udG9wLWQub3JpZ2luYWxQb3NpdGlvbi50b3ApfHxudWxsO2MuYW5pbWF0ZXx8dGhpcy5lbGVtZW50LmNzcyhhLmV4dGVuZChpLHt0b3A6ayxsZWZ0Omp9KSksZC5oZWxwZXIuaGVpZ2h0KGQuc2l6ZS5oZWlnaHQpLGQuaGVscGVyLndpZHRoKGQuc2l6ZS53aWR0aCksdGhpcy5faGVscGVyJiYhYy5hbmltYXRlJiZ0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZSgpfXJldHVybiBhKCJib2R5IikuY3NzKCJjdXJzb3IiLCJhdXRvIiksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1yZXNpemFibGUtcmVzaXppbmciKSx0aGlzLl9wcm9wYWdhdGUoInN0b3AiLGIpLHRoaXMuX2hlbHBlciYmdGhpcy5oZWxwZXIucmVtb3ZlKCksITF9LF91cGRhdGVWaXJ0dWFsQm91bmRhcmllczpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMsYyxlLGYsZyxoO2g9e21pbldpZHRoOmQoYi5taW5XaWR0aCk/Yi5taW5XaWR0aDowLG1heFdpZHRoOmQoYi5tYXhXaWR0aCk/Yi5tYXhXaWR0aDpJbmZpbml0eSxtaW5IZWlnaHQ6ZChiLm1pbkhlaWdodCk/Yi5taW5IZWlnaHQ6MCxtYXhIZWlnaHQ6ZChiLm1heEhlaWdodCk/Yi5tYXhIZWlnaHQ6SW5maW5pdHl9O2lmKHRoaXMuX2FzcGVjdFJhdGlvfHxhKWM9aC5taW5IZWlnaHQqdGhpcy5hc3BlY3RSYXRpbyxmPWgubWluV2lkdGgvdGhpcy5hc3BlY3RSYXRpbyxlPWgubWF4SGVpZ2h0KnRoaXMuYXNwZWN0UmF0aW8sZz1oLm1heFdpZHRoL3RoaXMuYXNwZWN0UmF0aW8sYz5oLm1pbldpZHRoJiYoaC5taW5XaWR0aD1jKSxmPmgubWluSGVpZ2h0JiYoaC5taW5IZWlnaHQ9ZiksZTxoLm1heFdpZHRoJiYoaC5tYXhXaWR0aD1lKSxnPGgubWF4SGVpZ2h0JiYoaC5tYXhIZWlnaHQ9Zyk7dGhpcy5fdkJvdW5kYXJpZXM9aH0sX3VwZGF0ZUNhY2hlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9uczt0aGlzLm9mZnNldD10aGlzLmhlbHBlci5vZmZzZXQoKSxkKGEubGVmdCkmJih0aGlzLnBvc2l0aW9uLmxlZnQ9YS5sZWZ0KSxkKGEudG9wKSYmKHRoaXMucG9zaXRpb24udG9wPWEudG9wKSxkKGEuaGVpZ2h0KSYmKHRoaXMuc2l6ZS5oZWlnaHQ9YS5oZWlnaHQpLGQoYS53aWR0aCkmJih0aGlzLnNpemUud2lkdGg9YS53aWR0aCl9LF91cGRhdGVSYXRpbzpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMub3B0aW9ucyxlPXRoaXMucG9zaXRpb24sZj10aGlzLnNpemUsZz10aGlzLmF4aXM7cmV0dXJuIGQoYS5oZWlnaHQpP2Eud2lkdGg9YS5oZWlnaHQqdGhpcy5hc3BlY3RSYXRpbzpkKGEud2lkdGgpJiYoYS5oZWlnaHQ9YS53aWR0aC90aGlzLmFzcGVjdFJhdGlvKSxnPT0ic3ciJiYoYS5sZWZ0PWUubGVmdCsoZi53aWR0aC1hLndpZHRoKSxhLnRvcD1udWxsKSxnPT0ibnciJiYoYS50b3A9ZS50b3ArKGYuaGVpZ2h0LWEuaGVpZ2h0KSxhLmxlZnQ9ZS5sZWZ0KyhmLndpZHRoLWEud2lkdGgpKSxhfSxfcmVzcGVjdFNpemU6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmhlbHBlcixlPXRoaXMuX3ZCb3VuZGFyaWVzLGY9dGhpcy5fYXNwZWN0UmF0aW98fGIuc2hpZnRLZXksZz10aGlzLmF4aXMsaD1kKGEud2lkdGgpJiZlLm1heFdpZHRoJiZlLm1heFdpZHRoPGEud2lkdGgsaT1kKGEuaGVpZ2h0KSYmZS5tYXhIZWlnaHQmJmUubWF4SGVpZ2h0PGEuaGVpZ2h0LGo9ZChhLndpZHRoKSYmZS5taW5XaWR0aCYmZS5taW5XaWR0aD5hLndpZHRoLGs9ZChhLmhlaWdodCkmJmUubWluSGVpZ2h0JiZlLm1pbkhlaWdodD5hLmhlaWdodDtqJiYoYS53aWR0aD1lLm1pbldpZHRoKSxrJiYoYS5oZWlnaHQ9ZS5taW5IZWlnaHQpLGgmJihhLndpZHRoPWUubWF4V2lkdGgpLGkmJihhLmhlaWdodD1lLm1heEhlaWdodCk7dmFyIGw9dGhpcy5vcmlnaW5hbFBvc2l0aW9uLmxlZnQrdGhpcy5vcmlnaW5hbFNpemUud2lkdGgsbT10aGlzLnBvc2l0aW9uLnRvcCt0aGlzLnNpemUuaGVpZ2h0LG49L3N3fG53fHcvLnRlc3QoZyksbz0vbnd8bmV8bi8udGVzdChnKTtqJiZuJiYoYS5sZWZ0PWwtZS5taW5XaWR0aCksaCYmbiYmKGEubGVmdD1sLWUubWF4V2lkdGgpLGsmJm8mJihhLnRvcD1tLWUubWluSGVpZ2h0KSxpJiZvJiYoYS50b3A9bS1lLm1heEhlaWdodCk7dmFyIHA9IWEud2lkdGgmJiFhLmhlaWdodDtyZXR1cm4gcCYmIWEubGVmdCYmYS50b3A/YS50b3A9bnVsbDpwJiYhYS50b3AmJmEubGVmdCYmKGEubGVmdD1udWxsKSxhfSxfcHJvcG9ydGlvbmFsbHlSZXNpemU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9wdGlvbnM7aWYoIXRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoKXJldHVybjt2YXIgYz10aGlzLmhlbHBlcnx8dGhpcy5lbGVtZW50O2Zvcih2YXIgZD0wO2Q8dGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50cy5sZW5ndGg7ZCsrKXt2YXIgZT10aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzW2RdO2lmKCF0aGlzLmJvcmRlckRpZil7dmFyIGY9W2UuY3NzKCJib3JkZXJUb3BXaWR0aCIpLGUuY3NzKCJib3JkZXJSaWdodFdpZHRoIiksZS5jc3MoImJvcmRlckJvdHRvbVdpZHRoIiksZS5jc3MoImJvcmRlckxlZnRXaWR0aCIpXSxnPVtlLmNzcygicGFkZGluZ1RvcCIpLGUuY3NzKCJwYWRkaW5nUmlnaHQiKSxlLmNzcygicGFkZGluZ0JvdHRvbSIpLGUuY3NzKCJwYWRkaW5nTGVmdCIpXTt0aGlzLmJvcmRlckRpZj1hLm1hcChmLGZ1bmN0aW9uKGEsYil7dmFyIGM9cGFyc2VJbnQoYSwxMCl8fDAsZD1wYXJzZUludChnW2JdLDEwKXx8MDtyZXR1cm4gYytkfSl9aWYoIWEuYnJvd3Nlci5tc2llfHwhYShjKS5pcygiOmhpZGRlbiIpJiYhYShjKS5wYXJlbnRzKCI6aGlkZGVuIikubGVuZ3RoKWUuY3NzKHtoZWlnaHQ6Yy5oZWlnaHQoKS10aGlzLmJvcmRlckRpZlswXS10aGlzLmJvcmRlckRpZlsyXXx8MCx3aWR0aDpjLndpZHRoKCktdGhpcy5ib3JkZXJEaWZbMV0tdGhpcy5ib3JkZXJEaWZbM118fDB9KTtlbHNlIGNvbnRpbnVlfX0sX3JlbmRlclByb3h5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5lbGVtZW50LGM9dGhpcy5vcHRpb25zO3RoaXMuZWxlbWVudE9mZnNldD1iLm9mZnNldCgpO2lmKHRoaXMuX2hlbHBlcil7dGhpcy5oZWxwZXI9dGhpcy5oZWxwZXJ8fGEoJzxkaXYgc3R5bGU9Im92ZXJmbG93OmhpZGRlbjsiPjwvZGl2PicpO3ZhciBkPWEuYnJvd3Nlci5tc2llJiZhLmJyb3dzZXIudmVyc2lvbjw3LGU9ZD8xOjAsZj1kPzI6LTE7dGhpcy5oZWxwZXIuYWRkQ2xhc3ModGhpcy5faGVscGVyKS5jc3Moe3dpZHRoOnRoaXMuZWxlbWVudC5vdXRlcldpZHRoKCkrZixoZWlnaHQ6dGhpcy5lbGVtZW50Lm91dGVySGVpZ2h0KCkrZixwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6dGhpcy5lbGVtZW50T2Zmc2V0LmxlZnQtZSsicHgiLHRvcDp0aGlzLmVsZW1lbnRPZmZzZXQudG9wLWUrInB4Iix6SW5kZXg6KytjLnpJbmRleH0pLHRoaXMuaGVscGVyLmFwcGVuZFRvKCJib2R5IikuZGlzYWJsZVNlbGVjdGlvbigpfWVsc2UgdGhpcy5oZWxwZXI9dGhpcy5lbGVtZW50fSxfY2hhbmdlOntlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm57d2lkdGg6dGhpcy5vcmlnaW5hbFNpemUud2lkdGgrYn19LHc6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMub3B0aW9ucyxlPXRoaXMub3JpZ2luYWxTaXplLGY9dGhpcy5vcmlnaW5hbFBvc2l0aW9uO3JldHVybntsZWZ0OmYubGVmdCtiLHdpZHRoOmUud2lkdGgtYn19LG46ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMub3B0aW9ucyxlPXRoaXMub3JpZ2luYWxTaXplLGY9dGhpcy5vcmlnaW5hbFBvc2l0aW9uO3JldHVybnt0b3A6Zi50b3ArYyxoZWlnaHQ6ZS5oZWlnaHQtY319LHM6ZnVuY3Rpb24oYSxiLGMpe3JldHVybntoZWlnaHQ6dGhpcy5vcmlnaW5hbFNpemUuaGVpZ2h0K2N9fSxzZTpmdW5jdGlvbihiLGMsZCl7cmV0dXJuIGEuZXh0ZW5kKHRoaXMuX2NoYW5nZS5zLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9jaGFuZ2UuZS5hcHBseSh0aGlzLFtiLGMsZF0pKX0sc3c6ZnVuY3Rpb24oYixjLGQpe3JldHVybiBhLmV4dGVuZCh0aGlzLl9jaGFuZ2Uucy5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fY2hhbmdlLncuYXBwbHkodGhpcyxbYixjLGRdKSl9LG5lOmZ1bmN0aW9uKGIsYyxkKXtyZXR1cm4gYS5leHRlbmQodGhpcy5fY2hhbmdlLm4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX2NoYW5nZS5lLmFwcGx5KHRoaXMsW2IsYyxkXSkpfSxudzpmdW5jdGlvbihiLGMsZCl7cmV0dXJuIGEuZXh0ZW5kKHRoaXMuX2NoYW5nZS5uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9jaGFuZ2Uudy5hcHBseSh0aGlzLFtiLGMsZF0pKX19LF9wcm9wYWdhdGU6ZnVuY3Rpb24oYixjKXthLnVpLnBsdWdpbi5jYWxsKHRoaXMsYixbYyx0aGlzLnVpKCldKSxiIT0icmVzaXplIiYmdGhpcy5fdHJpZ2dlcihiLGMsdGhpcy51aSgpKX0scGx1Z2luczp7fSx1aTpmdW5jdGlvbigpe3JldHVybntvcmlnaW5hbEVsZW1lbnQ6dGhpcy5vcmlnaW5hbEVsZW1lbnQsZWxlbWVudDp0aGlzLmVsZW1lbnQsaGVscGVyOnRoaXMuaGVscGVyLHBvc2l0aW9uOnRoaXMucG9zaXRpb24sc2l6ZTp0aGlzLnNpemUsb3JpZ2luYWxTaXplOnRoaXMub3JpZ2luYWxTaXplLG9yaWdpbmFsUG9zaXRpb246dGhpcy5vcmlnaW5hbFBvc2l0aW9ufX19KSxhLmV4dGVuZChhLnVpLnJlc2l6YWJsZSx7dmVyc2lvbjoiMS44LjI0In0pLGEudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiYWxzb1Jlc2l6ZSIse3N0YXJ0OmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSxlPWQub3B0aW9ucyxmPWZ1bmN0aW9uKGIpe2EoYikuZWFjaChmdW5jdGlvbigpe3ZhciBiPWEodGhpcyk7Yi5kYXRhKCJyZXNpemFibGUtYWxzb3Jlc2l6ZSIse3dpZHRoOnBhcnNlSW50KGIud2lkdGgoKSwxMCksaGVpZ2h0OnBhcnNlSW50KGIuaGVpZ2h0KCksMTApLGxlZnQ6cGFyc2VJbnQoYi5jc3MoImxlZnQiKSwxMCksdG9wOnBhcnNlSW50KGIuY3NzKCJ0b3AiKSwxMCl9KX0pfTt0eXBlb2YgZS5hbHNvUmVzaXplPT0ib2JqZWN0IiYmIWUuYWxzb1Jlc2l6ZS5wYXJlbnROb2RlP2UuYWxzb1Jlc2l6ZS5sZW5ndGg/KGUuYWxzb1Jlc2l6ZT1lLmFsc29SZXNpemVbMF0sZihlLmFsc29SZXNpemUpKTphLmVhY2goZS5hbHNvUmVzaXplLGZ1bmN0aW9uKGEpe2YoYSl9KTpmKGUuYWxzb1Jlc2l6ZSl9LHJlc2l6ZTpmdW5jdGlvbihiLGMpe3ZhciBkPWEodGhpcykuZGF0YSgicmVzaXphYmxlIiksZT1kLm9wdGlvbnMsZj1kLm9yaWdpbmFsU2l6ZSxnPWQub3JpZ2luYWxQb3NpdGlvbixoPXtoZWlnaHQ6ZC5zaXplLmhlaWdodC1mLmhlaWdodHx8MCx3aWR0aDpkLnNpemUud2lkdGgtZi53aWR0aHx8MCx0b3A6ZC5wb3NpdGlvbi50b3AtZy50b3B8fDAsbGVmdDpkLnBvc2l0aW9uLmxlZnQtZy5sZWZ0fHwwfSxpPWZ1bmN0aW9uKGIsZCl7YShiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9YSh0aGlzKSxlPWEodGhpcykuZGF0YSgicmVzaXphYmxlLWFsc29yZXNpemUiKSxmPXt9LGc9ZCYmZC5sZW5ndGg/ZDpiLnBhcmVudHMoYy5vcmlnaW5hbEVsZW1lbnRbMF0pLmxlbmd0aD9bIndpZHRoIiwiaGVpZ2h0Il06WyJ3aWR0aCIsImhlaWdodCIsInRvcCIsImxlZnQiXTthLmVhY2goZyxmdW5jdGlvbihhLGIpe3ZhciBjPShlW2JdfHwwKSsoaFtiXXx8MCk7YyYmYz49MCYmKGZbYl09Y3x8bnVsbCl9KSxiLmNzcyhmKX0pfTt0eXBlb2YgZS5hbHNvUmVzaXplPT0ib2JqZWN0IiYmIWUuYWxzb1Jlc2l6ZS5ub2RlVHlwZT9hLmVhY2goZS5hbHNvUmVzaXplLGZ1bmN0aW9uKGEsYil7aShhLGIpfSk6aShlLmFsc29SZXNpemUpfSxzdG9wOmZ1bmN0aW9uKGIsYyl7YSh0aGlzKS5yZW1vdmVEYXRhKCJyZXNpemFibGUtYWxzb3Jlc2l6ZSIpfX0pLGEudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiYW5pbWF0ZSIse3N0b3A6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLGU9ZC5vcHRpb25zLGY9ZC5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50cyxnPWYubGVuZ3RoJiYvdGV4dGFyZWEvaS50ZXN0KGZbMF0ubm9kZU5hbWUpLGg9ZyYmYS51aS5oYXNTY3JvbGwoZlswXSwibGVmdCIpPzA6ZC5zaXplRGlmZi5oZWlnaHQsaT1nPzA6ZC5zaXplRGlmZi53aWR0aCxqPXt3aWR0aDpkLnNpemUud2lkdGgtaSxoZWlnaHQ6ZC5zaXplLmhlaWdodC1ofSxrPXBhcnNlSW50KGQuZWxlbWVudC5jc3MoImxlZnQiKSwxMCkrKGQucG9zaXRpb24ubGVmdC1kLm9yaWdpbmFsUG9zaXRpb24ubGVmdCl8fG51bGwsbD1wYXJzZUludChkLmVsZW1lbnQuY3NzKCJ0b3AiKSwxMCkrKGQucG9zaXRpb24udG9wLWQub3JpZ2luYWxQb3NpdGlvbi50b3ApfHxudWxsO2QuZWxlbWVudC5hbmltYXRlKGEuZXh0ZW5kKGosbCYmaz97dG9wOmwsbGVmdDprfTp7fSkse2R1cmF0aW9uOmUuYW5pbWF0ZUR1cmF0aW9uLGVhc2luZzplLmFuaW1hdGVFYXNpbmcsc3RlcDpmdW5jdGlvbigpe3ZhciBjPXt3aWR0aDpwYXJzZUludChkLmVsZW1lbnQuY3NzKCJ3aWR0aCIpLDEwKSxoZWlnaHQ6cGFyc2VJbnQoZC5lbGVtZW50LmNzcygiaGVpZ2h0IiksMTApLHRvcDpwYXJzZUludChkLmVsZW1lbnQuY3NzKCJ0b3AiKSwxMCksbGVmdDpwYXJzZUludChkLmVsZW1lbnQuY3NzKCJsZWZ0IiksMTApfTtmJiZmLmxlbmd0aCYmYShmWzBdKS5jc3Moe3dpZHRoOmMud2lkdGgsaGVpZ2h0OmMuaGVpZ2h0fSksZC5fdXBkYXRlQ2FjaGUoYyksZC5fcHJvcGFnYXRlKCJyZXNpemUiLGIpfX0pfX0pLGEudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiY29udGFpbm1lbnQiLHtzdGFydDpmdW5jdGlvbihiLGQpe3ZhciBlPWEodGhpcykuZGF0YSgicmVzaXphYmxlIiksZj1lLm9wdGlvbnMsZz1lLmVsZW1lbnQsaD1mLmNvbnRhaW5tZW50LGk9aCBpbnN0YW5jZW9mIGE/aC5nZXQoMCk6L3BhcmVudC8udGVzdChoKT9nLnBhcmVudCgpLmdldCgwKTpoO2lmKCFpKXJldHVybjtlLmNvbnRhaW5lckVsZW1lbnQ9YShpKTtpZigvZG9jdW1lbnQvLnRlc3QoaCl8fGg9PWRvY3VtZW50KWUuY29udGFpbmVyT2Zmc2V0PXtsZWZ0OjAsdG9wOjB9LGUuY29udGFpbmVyUG9zaXRpb249e2xlZnQ6MCx0b3A6MH0sZS5wYXJlbnREYXRhPXtlbGVtZW50OmEoZG9jdW1lbnQpLGxlZnQ6MCx0b3A6MCx3aWR0aDphKGRvY3VtZW50KS53aWR0aCgpLGhlaWdodDphKGRvY3VtZW50KS5oZWlnaHQoKXx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlLnNjcm9sbEhlaWdodH07ZWxzZXt2YXIgaj1hKGkpLGs9W107YShbIlRvcCIsIlJpZ2h0IiwiTGVmdCIsIkJvdHRvbSJdKS5lYWNoKGZ1bmN0aW9uKGEsYil7a1thXT1jKGouY3NzKCJwYWRkaW5nIitiKSl9KSxlLmNvbnRhaW5lck9mZnNldD1qLm9mZnNldCgpLGUuY29udGFpbmVyUG9zaXRpb249ai5wb3NpdGlvbigpLGUuY29udGFpbmVyU2l6ZT17aGVpZ2h0OmouaW5uZXJIZWlnaHQoKS1rWzNdLHdpZHRoOmouaW5uZXJXaWR0aCgpLWtbMV19O3ZhciBsPWUuY29udGFpbmVyT2Zmc2V0LG09ZS5jb250YWluZXJTaXplLmhlaWdodCxuPWUuY29udGFpbmVyU2l6ZS53aWR0aCxvPWEudWkuaGFzU2Nyb2xsKGksImxlZnQiKT9pLnNjcm9sbFdpZHRoOm4scD1hLnVpLmhhc1Njcm9sbChpKT9pLnNjcm9sbEhlaWdodDptO2UucGFyZW50RGF0YT17ZWxlbWVudDppLGxlZnQ6bC5sZWZ0LHRvcDpsLnRvcCx3aWR0aDpvLGhlaWdodDpwfX19LHJlc2l6ZTpmdW5jdGlvbihiLGMpe3ZhciBkPWEodGhpcykuZGF0YSgicmVzaXphYmxlIiksZT1kLm9wdGlvbnMsZj1kLmNvbnRhaW5lclNpemUsZz1kLmNvbnRhaW5lck9mZnNldCxoPWQuc2l6ZSxpPWQucG9zaXRpb24saj1kLl9hc3BlY3RSYXRpb3x8Yi5zaGlmdEtleSxrPXt0b3A6MCxsZWZ0OjB9LGw9ZC5jb250YWluZXJFbGVtZW50O2xbMF0hPWRvY3VtZW50JiYvc3RhdGljLy50ZXN0KGwuY3NzKCJwb3NpdGlvbiIpKSYmKGs9ZyksaS5sZWZ0PChkLl9oZWxwZXI/Zy5sZWZ0OjApJiYoZC5zaXplLndpZHRoPWQuc2l6ZS53aWR0aCsoZC5faGVscGVyP2QucG9zaXRpb24ubGVmdC1nLmxlZnQ6ZC5wb3NpdGlvbi5sZWZ0LWsubGVmdCksaiYmKGQuc2l6ZS5oZWlnaHQ9ZC5zaXplLndpZHRoL2QuYXNwZWN0UmF0aW8pLGQucG9zaXRpb24ubGVmdD1lLmhlbHBlcj9nLmxlZnQ6MCksaS50b3A8KGQuX2hlbHBlcj9nLnRvcDowKSYmKGQuc2l6ZS5oZWlnaHQ9ZC5zaXplLmhlaWdodCsoZC5faGVscGVyP2QucG9zaXRpb24udG9wLWcudG9wOmQucG9zaXRpb24udG9wKSxqJiYoZC5zaXplLndpZHRoPWQuc2l6ZS5oZWlnaHQqZC5hc3BlY3RSYXRpbyksZC5wb3NpdGlvbi50b3A9ZC5faGVscGVyP2cudG9wOjApLGQub2Zmc2V0LmxlZnQ9ZC5wYXJlbnREYXRhLmxlZnQrZC5wb3NpdGlvbi5sZWZ0LGQub2Zmc2V0LnRvcD1kLnBhcmVudERhdGEudG9wK2QucG9zaXRpb24udG9wO3ZhciBtPU1hdGguYWJzKChkLl9oZWxwZXI/ZC5vZmZzZXQubGVmdC1rLmxlZnQ6ZC5vZmZzZXQubGVmdC1rLmxlZnQpK2Quc2l6ZURpZmYud2lkdGgpLG49TWF0aC5hYnMoKGQuX2hlbHBlcj9kLm9mZnNldC50b3Atay50b3A6ZC5vZmZzZXQudG9wLWcudG9wKStkLnNpemVEaWZmLmhlaWdodCksbz1kLmNvbnRhaW5lckVsZW1lbnQuZ2V0KDApPT1kLmVsZW1lbnQucGFyZW50KCkuZ2V0KDApLHA9L3JlbGF0aXZlfGFic29sdXRlLy50ZXN0KGQuY29udGFpbmVyRWxlbWVudC5jc3MoInBvc2l0aW9uIikpO28mJnAmJihtLT1kLnBhcmVudERhdGEubGVmdCksbStkLnNpemUud2lkdGg+PWQucGFyZW50RGF0YS53aWR0aCYmKGQuc2l6ZS53aWR0aD1kLnBhcmVudERhdGEud2lkdGgtbSxqJiYoZC5zaXplLmhlaWdodD1kLnNpemUud2lkdGgvZC5hc3BlY3RSYXRpbykpLG4rZC5zaXplLmhlaWdodD49ZC5wYXJlbnREYXRhLmhlaWdodCYmKGQuc2l6ZS5oZWlnaHQ9ZC5wYXJlbnREYXRhLmhlaWdodC1uLGomJihkLnNpemUud2lkdGg9ZC5zaXplLmhlaWdodCpkLmFzcGVjdFJhdGlvKSl9LHN0b3A6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLGU9ZC5vcHRpb25zLGY9ZC5wb3NpdGlvbixnPWQuY29udGFpbmVyT2Zmc2V0LGg9ZC5jb250YWluZXJQb3NpdGlvbixpPWQuY29udGFpbmVyRWxlbWVudCxqPWEoZC5oZWxwZXIpLGs9ai5vZmZzZXQoKSxsPWoub3V0ZXJXaWR0aCgpLWQuc2l6ZURpZmYud2lkdGgsbT1qLm91dGVySGVpZ2h0KCktZC5zaXplRGlmZi5oZWlnaHQ7ZC5faGVscGVyJiYhZS5hbmltYXRlJiYvcmVsYXRpdmUvLnRlc3QoaS5jc3MoInBvc2l0aW9uIikpJiZhKHRoaXMpLmNzcyh7bGVmdDprLmxlZnQtaC5sZWZ0LWcubGVmdCx3aWR0aDpsLGhlaWdodDptfSksZC5faGVscGVyJiYhZS5hbmltYXRlJiYvc3RhdGljLy50ZXN0KGkuY3NzKCJwb3NpdGlvbiIpKSYmYSh0aGlzKS5jc3Moe2xlZnQ6ay5sZWZ0LWgubGVmdC1nLmxlZnQsd2lkdGg6bCxoZWlnaHQ6bX0pfX0pLGEudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiZ2hvc3QiLHtzdGFydDpmdW5jdGlvbihiLGMpe3ZhciBkPWEodGhpcykuZGF0YSgicmVzaXphYmxlIiksZT1kLm9wdGlvbnMsZj1kLnNpemU7ZC5naG9zdD1kLm9yaWdpbmFsRWxlbWVudC5jbG9uZSgpLGQuZ2hvc3QuY3NzKHtvcGFjaXR5Oi4yNSxkaXNwbGF5OiJibG9jayIscG9zaXRpb246InJlbGF0aXZlIixoZWlnaHQ6Zi5oZWlnaHQsd2lkdGg6Zi53aWR0aCxtYXJnaW46MCxsZWZ0OjAsdG9wOjB9KS5hZGRDbGFzcygidWktcmVzaXphYmxlLWdob3N0IikuYWRkQ2xhc3ModHlwZW9mIGUuZ2hvc3Q9PSJzdHJpbmciP2UuZ2hvc3Q6IiIpLGQuZ2hvc3QuYXBwZW5kVG8oZC5oZWxwZXIpfSxyZXNpemU6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLGU9ZC5vcHRpb25zO2QuZ2hvc3QmJmQuZ2hvc3QuY3NzKHtwb3NpdGlvbjoicmVsYXRpdmUiLGhlaWdodDpkLnNpemUuaGVpZ2h0LHdpZHRoOmQuc2l6ZS53aWR0aH0pfSxzdG9wOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSxlPWQub3B0aW9ucztkLmdob3N0JiZkLmhlbHBlciYmZC5oZWxwZXIuZ2V0KDApLnJlbW92ZUNoaWxkKGQuZ2hvc3QuZ2V0KDApKX19KSxhLnVpLnBsdWdpbi5hZGQoInJlc2l6YWJsZSIsImdyaWQiLHtyZXNpemU6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLGU9ZC5vcHRpb25zLGY9ZC5zaXplLGc9ZC5vcmlnaW5hbFNpemUsaD1kLm9yaWdpbmFsUG9zaXRpb24saT1kLmF4aXMsaj1lLl9hc3BlY3RSYXRpb3x8Yi5zaGlmdEtleTtlLmdyaWQ9dHlwZW9mIGUuZ3JpZD09Im51bWJlciI/W2UuZ3JpZCxlLmdyaWRdOmUuZ3JpZDt2YXIgaz1NYXRoLnJvdW5kKChmLndpZHRoLWcud2lkdGgpLyhlLmdyaWRbMF18fDEpKSooZS5ncmlkWzBdfHwxKSxsPU1hdGgucm91bmQoKGYuaGVpZ2h0LWcuaGVpZ2h0KS8oZS5ncmlkWzFdfHwxKSkqKGUuZ3JpZFsxXXx8MSk7L14oc2V8c3xlKSQvLnRlc3QoaSk/KGQuc2l6ZS53aWR0aD1nLndpZHRoK2ssZC5zaXplLmhlaWdodD1nLmhlaWdodCtsKTovXihuZSkkLy50ZXN0KGkpPyhkLnNpemUud2lkdGg9Zy53aWR0aCtrLGQuc2l6ZS5oZWlnaHQ9Zy5oZWlnaHQrbCxkLnBvc2l0aW9uLnRvcD1oLnRvcC1sKTovXihzdykkLy50ZXN0KGkpPyhkLnNpemUud2lkdGg9Zy53aWR0aCtrLGQuc2l6ZS5oZWlnaHQ9Zy5oZWlnaHQrbCxkLnBvc2l0aW9uLmxlZnQ9aC5sZWZ0LWspOihkLnNpemUud2lkdGg9Zy53aWR0aCtrLGQuc2l6ZS5oZWlnaHQ9Zy5oZWlnaHQrbCxkLnBvc2l0aW9uLnRvcD1oLnRvcC1sLGQucG9zaXRpb24ubGVmdD1oLmxlZnQtayl9fSk7dmFyIGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHBhcnNlSW50KGEsMTApfHwwfSxkPWZ1bmN0aW9uKGEpe3JldHVybiFpc05hTihwYXJzZUludChhLDEwKSl9fShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7YS53aWRnZXQoInVpLnNlbGVjdGFibGUiLGEudWkubW91c2Use29wdGlvbnM6e2FwcGVuZFRvOiJib2R5IixhdXRvUmVmcmVzaDohMCxkaXN0YW5jZTowLGZpbHRlcjoiKiIsdG9sZXJhbmNlOiJ0b3VjaCJ9LF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzO3RoaXMuZWxlbWVudC5hZGRDbGFzcygidWktc2VsZWN0YWJsZSIpLHRoaXMuZHJhZ2dlZD0hMTt2YXIgYzt0aGlzLnJlZnJlc2g9ZnVuY3Rpb24oKXtjPWEoYi5vcHRpb25zLmZpbHRlcixiLmVsZW1lbnRbMF0pLGMuYWRkQ2xhc3MoInVpLXNlbGVjdGVlIiksYy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9YSh0aGlzKSxjPWIub2Zmc2V0KCk7YS5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIse2VsZW1lbnQ6dGhpcywkZWxlbWVudDpiLGxlZnQ6Yy5sZWZ0LHRvcDpjLnRvcCxyaWdodDpjLmxlZnQrYi5vdXRlcldpZHRoKCksYm90dG9tOmMudG9wK2Iub3V0ZXJIZWlnaHQoKSxzdGFydHNlbGVjdGVkOiExLHNlbGVjdGVkOmIuaGFzQ2xhc3MoInVpLXNlbGVjdGVkIiksc2VsZWN0aW5nOmIuaGFzQ2xhc3MoInVpLXNlbGVjdGluZyIpLHVuc2VsZWN0aW5nOmIuaGFzQ2xhc3MoInVpLXVuc2VsZWN0aW5nIil9KX0pfSx0aGlzLnJlZnJlc2goKSx0aGlzLnNlbGVjdGVlcz1jLmFkZENsYXNzKCJ1aS1zZWxlY3RlZSIpLHRoaXMuX21vdXNlSW5pdCgpLHRoaXMuaGVscGVyPWEoIjxkaXYgY2xhc3M9J3VpLXNlbGVjdGFibGUtaGVscGVyJz48L2Rpdj4iKX0sZGVzdHJveTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGVlcy5yZW1vdmVDbGFzcygidWktc2VsZWN0ZWUiKS5yZW1vdmVEYXRhKCJzZWxlY3RhYmxlLWl0ZW0iKSx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGFibGUgdWktc2VsZWN0YWJsZS1kaXNhYmxlZCIpLnJlbW92ZURhdGEoInNlbGVjdGFibGUiKS51bmJpbmQoIi5zZWxlY3RhYmxlIiksdGhpcy5fbW91c2VEZXN0cm95KCksdGhpc30sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oYil7dmFyIGM9dGhpczt0aGlzLm9wb3M9W2IucGFnZVgsYi5wYWdlWV07aWYodGhpcy5vcHRpb25zLmRpc2FibGVkKXJldHVybjt2YXIgZD10aGlzLm9wdGlvbnM7dGhpcy5zZWxlY3RlZXM9YShkLmZpbHRlcix0aGlzLmVsZW1lbnRbMF0pLHRoaXMuX3RyaWdnZXIoInN0YXJ0IixiKSxhKGQuYXBwZW5kVG8pLmFwcGVuZCh0aGlzLmhlbHBlciksdGhpcy5oZWxwZXIuY3NzKHtsZWZ0OmIuY2xpZW50WCx0b3A6Yi5jbGllbnRZLHdpZHRoOjAsaGVpZ2h0OjB9KSxkLmF1dG9SZWZyZXNoJiZ0aGlzLnJlZnJlc2goKSx0aGlzLnNlbGVjdGVlcy5maWx0ZXIoIi51aS1zZWxlY3RlZCIpLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1hLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7ZC5zdGFydHNlbGVjdGVkPSEwLCFiLm1ldGFLZXkmJiFiLmN0cmxLZXkmJihkLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RlZCIpLGQuc2VsZWN0ZWQ9ITEsZC4kZWxlbWVudC5hZGRDbGFzcygidWktdW5zZWxlY3RpbmciKSxkLnVuc2VsZWN0aW5nPSEwLGMuX3RyaWdnZXIoInVuc2VsZWN0aW5nIixiLHt1bnNlbGVjdGluZzpkLmVsZW1lbnR9KSl9KSxhKGIudGFyZ2V0KS5wYXJlbnRzKCkuYW5kU2VsZigpLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1hLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7aWYoZCl7dmFyIGU9IWIubWV0YUtleSYmIWIuY3RybEtleXx8IWQuJGVsZW1lbnQuaGFzQ2xhc3MoInVpLXNlbGVjdGVkIik7cmV0dXJuIGQuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoZT8idWktdW5zZWxlY3RpbmciOiJ1aS1zZWxlY3RlZCIpLmFkZENsYXNzKGU/InVpLXNlbGVjdGluZyI6InVpLXVuc2VsZWN0aW5nIiksZC51bnNlbGVjdGluZz0hZSxkLnNlbGVjdGluZz1lLGQuc2VsZWN0ZWQ9ZSxlP2MuX3RyaWdnZXIoInNlbGVjdGluZyIsYix7c2VsZWN0aW5nOmQuZWxlbWVudH0pOmMuX3RyaWdnZXIoInVuc2VsZWN0aW5nIixiLHt1bnNlbGVjdGluZzpkLmVsZW1lbnR9KSwhMX19KX0sX21vdXNlRHJhZzpmdW5jdGlvbihiKXt2YXIgYz10aGlzO3RoaXMuZHJhZ2dlZD0hMDtpZih0aGlzLm9wdGlvbnMuZGlzYWJsZWQpcmV0dXJuO3ZhciBkPXRoaXMub3B0aW9ucyxlPXRoaXMub3Bvc1swXSxmPXRoaXMub3Bvc1sxXSxnPWIucGFnZVgsaD1iLnBhZ2VZO2lmKGU+Zyl7dmFyIGk9ZztnPWUsZT1pfWlmKGY+aCl7dmFyIGk9aDtoPWYsZj1pfXJldHVybiB0aGlzLmhlbHBlci5jc3Moe2xlZnQ6ZSx0b3A6Zix3aWR0aDpnLWUsaGVpZ2h0OmgtZn0pLHRoaXMuc2VsZWN0ZWVzLmVhY2goZnVuY3Rpb24oKXt2YXIgaT1hLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7aWYoIWl8fGkuZWxlbWVudD09Yy5lbGVtZW50WzBdKXJldHVybjt2YXIgaj0hMTtkLnRvbGVyYW5jZT09InRvdWNoIj9qPSEoaS5sZWZ0Pmd8fGkucmlnaHQ8ZXx8aS50b3A+aHx8aS5ib3R0b208Zik6ZC50b2xlcmFuY2U9PSJmaXQiJiYoaj1pLmxlZnQ+ZSYmaS5yaWdodDxnJiZpLnRvcD5mJiZpLmJvdHRvbTxoKSxqPyhpLnNlbGVjdGVkJiYoaS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0ZWQiKSxpLnNlbGVjdGVkPSExKSxpLnVuc2VsZWN0aW5nJiYoaS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktdW5zZWxlY3RpbmciKSxpLnVuc2VsZWN0aW5nPSExKSxpLnNlbGVjdGluZ3x8KGkuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXNlbGVjdGluZyIpLGkuc2VsZWN0aW5nPSEwLGMuX3RyaWdnZXIoInNlbGVjdGluZyIsYix7c2VsZWN0aW5nOmkuZWxlbWVudH0pKSk6KGkuc2VsZWN0aW5nJiYoKGIubWV0YUtleXx8Yi5jdHJsS2V5KSYmaS5zdGFydHNlbGVjdGVkPyhpLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RpbmciKSxpLnNlbGVjdGluZz0hMSxpLiRlbGVtZW50LmFkZENsYXNzKCJ1aS1zZWxlY3RlZCIpLGkuc2VsZWN0ZWQ9ITApOihpLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RpbmciKSxpLnNlbGVjdGluZz0hMSxpLnN0YXJ0c2VsZWN0ZWQmJihpLiRlbGVtZW50LmFkZENsYXNzKCJ1aS11bnNlbGVjdGluZyIpLGkudW5zZWxlY3Rpbmc9ITApLGMuX3RyaWdnZXIoInVuc2VsZWN0aW5nIixiLHt1bnNlbGVjdGluZzppLmVsZW1lbnR9KSkpLGkuc2VsZWN0ZWQmJiFiLm1ldGFLZXkmJiFiLmN0cmxLZXkmJiFpLnN0YXJ0c2VsZWN0ZWQmJihpLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RlZCIpLGkuc2VsZWN0ZWQ9ITEsaS4kZWxlbWVudC5hZGRDbGFzcygidWktdW5zZWxlY3RpbmciKSxpLnVuc2VsZWN0aW5nPSEwLGMuX3RyaWdnZXIoInVuc2VsZWN0aW5nIixiLHt1bnNlbGVjdGluZzppLmVsZW1lbnR9KSkpfSksITF9LF9tb3VzZVN0b3A6ZnVuY3Rpb24oYil7dmFyIGM9dGhpczt0aGlzLmRyYWdnZWQ9ITE7dmFyIGQ9dGhpcy5vcHRpb25zO3JldHVybiBhKCIudWktdW5zZWxlY3RpbmciLHRoaXMuZWxlbWVudFswXSkuZWFjaChmdW5jdGlvbigpe3ZhciBkPWEuZGF0YSh0aGlzLCJzZWxlY3RhYmxlLWl0ZW0iKTtkLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS11bnNlbGVjdGluZyIpLGQudW5zZWxlY3Rpbmc9ITEsZC5zdGFydHNlbGVjdGVkPSExLGMuX3RyaWdnZXIoInVuc2VsZWN0ZWQiLGIse3Vuc2VsZWN0ZWQ6ZC5lbGVtZW50fSl9KSxhKCIudWktc2VsZWN0aW5nIix0aGlzLmVsZW1lbnRbMF0pLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1hLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7ZC4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0aW5nIikuYWRkQ2xhc3MoInVpLXNlbGVjdGVkIiksZC5zZWxlY3Rpbmc9ITEsZC5zZWxlY3RlZD0hMCxkLnN0YXJ0c2VsZWN0ZWQ9ITAsYy5fdHJpZ2dlcigic2VsZWN0ZWQiLGIse3NlbGVjdGVkOmQuZWxlbWVudH0pfSksdGhpcy5fdHJpZ2dlcigic3RvcCIsYiksdGhpcy5oZWxwZXIucmVtb3ZlKCksITF9fSksYS5leHRlbmQoYS51aS5zZWxlY3RhYmxlLHt2ZXJzaW9uOiIxLjguMjQifSl9KGpRdWVyeSksZnVuY3Rpb24oYSxiKXthLndpZGdldCgidWkuc29ydGFibGUiLGEudWkubW91c2Use3dpZGdldEV2ZW50UHJlZml4OiJzb3J0IixyZWFkeTohMSxvcHRpb25zOnthcHBlbmRUbzoicGFyZW50IixheGlzOiExLGNvbm5lY3RXaXRoOiExLGNvbnRhaW5tZW50OiExLGN1cnNvcjoiYXV0byIsY3Vyc29yQXQ6ITEsZHJvcE9uRW1wdHk6ITAsZm9yY2VQbGFjZWhvbGRlclNpemU6ITEsZm9yY2VIZWxwZXJTaXplOiExLGdyaWQ6ITEsaGFuZGxlOiExLGhlbHBlcjoib3JpZ2luYWwiLGl0ZW1zOiI+ICoiLG9wYWNpdHk6ITEscGxhY2Vob2xkZXI6ITEscmV2ZXJ0OiExLHNjcm9sbDohMCxzY3JvbGxTZW5zaXRpdml0eToyMCxzY3JvbGxTcGVlZDoyMCxzY29wZToiZGVmYXVsdCIsdG9sZXJhbmNlOiJpbnRlcnNlY3QiLHpJbmRleDoxZTN9LF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnM7dGhpcy5jb250YWluZXJDYWNoZT17fSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXNvcnRhYmxlIiksdGhpcy5yZWZyZXNoKCksdGhpcy5mbG9hdGluZz10aGlzLml0ZW1zLmxlbmd0aD9hLmF4aXM9PT0ieCJ8fC9sZWZ0fHJpZ2h0Ly50ZXN0KHRoaXMuaXRlbXNbMF0uaXRlbS5jc3MoImZsb2F0IikpfHwvaW5saW5lfHRhYmxlLWNlbGwvLnRlc3QodGhpcy5pdGVtc1swXS5pdGVtLmNzcygiZGlzcGxheSIpKTohMSx0aGlzLm9mZnNldD10aGlzLmVsZW1lbnQub2Zmc2V0KCksdGhpcy5fbW91c2VJbml0KCksdGhpcy5yZWFkeT0hMH0sZGVzdHJveTpmdW5jdGlvbigpe2EuV2lkZ2V0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zb3J0YWJsZSB1aS1zb3J0YWJsZS1kaXNhYmxlZCIpLHRoaXMuX21vdXNlRGVzdHJveSgpO2Zvcih2YXIgYj10aGlzLml0ZW1zLmxlbmd0aC0xO2I+PTA7Yi0tKXRoaXMuaXRlbXNbYl0uaXRlbS5yZW1vdmVEYXRhKHRoaXMud2lkZ2V0TmFtZSsiLWl0ZW0iKTtyZXR1cm4gdGhpc30sX3NldE9wdGlvbjpmdW5jdGlvbihiLGMpe2I9PT0iZGlzYWJsZWQiPyh0aGlzLm9wdGlvbnNbYl09Yyx0aGlzLndpZGdldCgpW2M/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXSgidWktc29ydGFibGUtZGlzYWJsZWQiKSk6YS5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9dGhpcztpZih0aGlzLnJldmVydGluZylyZXR1cm4hMTtpZih0aGlzLm9wdGlvbnMuZGlzYWJsZWR8fHRoaXMub3B0aW9ucy50eXBlPT0ic3RhdGljIilyZXR1cm4hMTt0aGlzLl9yZWZyZXNoSXRlbXMoYik7dmFyIGU9bnVsbCxmPXRoaXMsZz1hKGIudGFyZ2V0KS5wYXJlbnRzKCkuZWFjaChmdW5jdGlvbigpe2lmKGEuZGF0YSh0aGlzLGQud2lkZ2V0TmFtZSsiLWl0ZW0iKT09ZilyZXR1cm4gZT1hKHRoaXMpLCExfSk7YS5kYXRhKGIudGFyZ2V0LGQud2lkZ2V0TmFtZSsiLWl0ZW0iKT09ZiYmKGU9YShiLnRhcmdldCkpO2lmKCFlKXJldHVybiExO2lmKHRoaXMub3B0aW9ucy5oYW5kbGUmJiFjKXt2YXIgaD0hMTthKHRoaXMub3B0aW9ucy5oYW5kbGUsZSkuZmluZCgiKiIpLmFuZFNlbGYoKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcz09Yi50YXJnZXQmJihoPSEwKX0pO2lmKCFoKXJldHVybiExfXJldHVybiB0aGlzLmN1cnJlbnRJdGVtPWUsdGhpcy5fcmVtb3ZlQ3VycmVudHNGcm9tSXRlbXMoKSwhMH0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oYixjLGQpe3ZhciBlPXRoaXMub3B0aW9ucyxmPXRoaXM7dGhpcy5jdXJyZW50Q29udGFpbmVyPXRoaXMsdGhpcy5yZWZyZXNoUG9zaXRpb25zKCksdGhpcy5oZWxwZXI9dGhpcy5fY3JlYXRlSGVscGVyKGIpLHRoaXMuX2NhY2hlSGVscGVyUHJvcG9ydGlvbnMoKSx0aGlzLl9jYWNoZU1hcmdpbnMoKSx0aGlzLnNjcm9sbFBhcmVudD10aGlzLmhlbHBlci5zY3JvbGxQYXJlbnQoKSx0aGlzLm9mZnNldD10aGlzLmN1cnJlbnRJdGVtLm9mZnNldCgpLHRoaXMub2Zmc2V0PXt0b3A6dGhpcy5vZmZzZXQudG9wLXRoaXMubWFyZ2lucy50b3AsbGVmdDp0aGlzLm9mZnNldC5sZWZ0LXRoaXMubWFyZ2lucy5sZWZ0fSxhLmV4dGVuZCh0aGlzLm9mZnNldCx7Y2xpY2s6e2xlZnQ6Yi5wYWdlWC10aGlzLm9mZnNldC5sZWZ0LHRvcDpiLnBhZ2VZLXRoaXMub2Zmc2V0LnRvcH0scGFyZW50OnRoaXMuX2dldFBhcmVudE9mZnNldCgpLHJlbGF0aXZlOnRoaXMuX2dldFJlbGF0aXZlT2Zmc2V0KCl9KSx0aGlzLmhlbHBlci5jc3MoInBvc2l0aW9uIiwiYWJzb2x1dGUiKSx0aGlzLmNzc1Bvc2l0aW9uPXRoaXMuaGVscGVyLmNzcygicG9zaXRpb24iKSx0aGlzLm9yaWdpbmFsUG9zaXRpb249dGhpcy5fZ2VuZXJhdGVQb3NpdGlvbihiKSx0aGlzLm9yaWdpbmFsUGFnZVg9Yi5wYWdlWCx0aGlzLm9yaWdpbmFsUGFnZVk9Yi5wYWdlWSxlLmN1cnNvckF0JiZ0aGlzLl9hZGp1c3RPZmZzZXRGcm9tSGVscGVyKGUuY3Vyc29yQXQpLHRoaXMuZG9tUG9zaXRpb249e3ByZXY6dGhpcy5jdXJyZW50SXRlbS5wcmV2KClbMF0scGFyZW50OnRoaXMuY3VycmVudEl0ZW0ucGFyZW50KClbMF19LHRoaXMuaGVscGVyWzBdIT10aGlzLmN1cnJlbnRJdGVtWzBdJiZ0aGlzLmN1cnJlbnRJdGVtLmhpZGUoKSx0aGlzLl9jcmVhdGVQbGFjZWhvbGRlcigpLGUuY29udGFpbm1lbnQmJnRoaXMuX3NldENvbnRhaW5tZW50KCksZS5jdXJzb3ImJihhKCJib2R5IikuY3NzKCJjdXJzb3IiKSYmKHRoaXMuX3N0b3JlZEN1cnNvcj1hKCJib2R5IikuY3NzKCJjdXJzb3IiKSksYSgiYm9keSIpLmNzcygiY3Vyc29yIixlLmN1cnNvcikpLGUub3BhY2l0eSYmKHRoaXMuaGVscGVyLmNzcygib3BhY2l0eSIpJiYodGhpcy5fc3RvcmVkT3BhY2l0eT10aGlzLmhlbHBlci5jc3MoIm9wYWNpdHkiKSksdGhpcy5oZWxwZXIuY3NzKCJvcGFjaXR5IixlLm9wYWNpdHkpKSxlLnpJbmRleCYmKHRoaXMuaGVscGVyLmNzcygiekluZGV4IikmJih0aGlzLl9zdG9yZWRaSW5kZXg9dGhpcy5oZWxwZXIuY3NzKCJ6SW5kZXgiKSksdGhpcy5oZWxwZXIuY3NzKCJ6SW5kZXgiLGUuekluZGV4KSksdGhpcy5zY3JvbGxQYXJlbnRbMF0hPWRvY3VtZW50JiZ0aGlzLnNjcm9sbFBhcmVudFswXS50YWdOYW1lIT0iSFRNTCImJih0aGlzLm92ZXJmbG93T2Zmc2V0PXRoaXMuc2Nyb2xsUGFyZW50Lm9mZnNldCgpKSx0aGlzLl90cmlnZ2VyKCJzdGFydCIsYix0aGlzLl91aUhhc2goKSksdGhpcy5fcHJlc2VydmVIZWxwZXJQcm9wb3J0aW9uc3x8dGhpcy5fY2FjaGVIZWxwZXJQcm9wb3J0aW9ucygpO2lmKCFkKWZvcih2YXIgZz10aGlzLmNvbnRhaW5lcnMubGVuZ3RoLTE7Zz49MDtnLS0pdGhpcy5jb250YWluZXJzW2ddLl90cmlnZ2VyKCJhY3RpdmF0ZSIsYixmLl91aUhhc2godGhpcykpO3JldHVybiBhLnVpLmRkbWFuYWdlciYmKGEudWkuZGRtYW5hZ2VyLmN1cnJlbnQ9dGhpcyksYS51aS5kZG1hbmFnZXImJiFlLmRyb3BCZWhhdmlvdXImJmEudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKHRoaXMsYiksdGhpcy5kcmFnZ2luZz0hMCx0aGlzLmhlbHBlci5hZGRDbGFzcygidWktc29ydGFibGUtaGVscGVyIiksdGhpcy5fbW91c2VEcmFnKGIpLCEwfSxfbW91c2VEcmFnOmZ1bmN0aW9uKGIpe3RoaXMucG9zaXRpb249dGhpcy5fZ2VuZXJhdGVQb3NpdGlvbihiKSx0aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpLHRoaXMubGFzdFBvc2l0aW9uQWJzfHwodGhpcy5sYXN0UG9zaXRpb25BYnM9dGhpcy5wb3NpdGlvbkFicyk7aWYodGhpcy5vcHRpb25zLnNjcm9sbCl7dmFyIGM9dGhpcy5vcHRpb25zLGQ9ITE7dGhpcy5zY3JvbGxQYXJlbnRbMF0hPWRvY3VtZW50JiZ0aGlzLnNjcm9sbFBhcmVudFswXS50YWdOYW1lIT0iSFRNTCI/KHRoaXMub3ZlcmZsb3dPZmZzZXQudG9wK3RoaXMuc2Nyb2xsUGFyZW50WzBdLm9mZnNldEhlaWdodC1iLnBhZ2VZPGMuc2Nyb2xsU2Vuc2l0aXZpdHk/dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wPWQ9dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wK2Muc2Nyb2xsU3BlZWQ6Yi5wYWdlWS10aGlzLm92ZXJmbG93T2Zmc2V0LnRvcDxjLnNjcm9sbFNlbnNpdGl2aXR5JiYodGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wPWQ9dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wLWMuc2Nyb2xsU3BlZWQpLHRoaXMub3ZlcmZsb3dPZmZzZXQubGVmdCt0aGlzLnNjcm9sbFBhcmVudFswXS5vZmZzZXRXaWR0aC1iLnBhZ2VYPGMuc2Nyb2xsU2Vuc2l0aXZpdHk/dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsTGVmdD1kPXRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQrYy5zY3JvbGxTcGVlZDpiLnBhZ2VYLXRoaXMub3ZlcmZsb3dPZmZzZXQubGVmdDxjLnNjcm9sbFNlbnNpdGl2aXR5JiYodGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsTGVmdD1kPXRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQtYy5zY3JvbGxTcGVlZCkpOihiLnBhZ2VZLWEoZG9jdW1lbnQpLnNjcm9sbFRvcCgpPGMuc2Nyb2xsU2Vuc2l0aXZpdHk/ZD1hKGRvY3VtZW50KS5zY3JvbGxUb3AoYShkb2N1bWVudCkuc2Nyb2xsVG9wKCktYy5zY3JvbGxTcGVlZCk6YSh3aW5kb3cpLmhlaWdodCgpLShiLnBhZ2VZLWEoZG9jdW1lbnQpLnNjcm9sbFRvcCgpKTxjLnNjcm9sbFNlbnNpdGl2aXR5JiYoZD1hKGRvY3VtZW50KS5zY3JvbGxUb3AoYShkb2N1bWVudCkuc2Nyb2xsVG9wKCkrYy5zY3JvbGxTcGVlZCkpLGIucGFnZVgtYShkb2N1bWVudCkuc2Nyb2xsTGVmdCgpPGMuc2Nyb2xsU2Vuc2l0aXZpdHk/ZD1hKGRvY3VtZW50KS5zY3JvbGxMZWZ0KGEoZG9jdW1lbnQpLnNjcm9sbExlZnQoKS1jLnNjcm9sbFNwZWVkKTphKHdpbmRvdykud2lkdGgoKS0oYi5wYWdlWC1hKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkpPGMuc2Nyb2xsU2Vuc2l0aXZpdHkmJihkPWEoZG9jdW1lbnQpLnNjcm9sbExlZnQoYShkb2N1bWVudCkuc2Nyb2xsTGVmdCgpK2Muc2Nyb2xsU3BlZWQpKSksZCE9PSExJiZhLnVpLmRkbWFuYWdlciYmIWMuZHJvcEJlaGF2aW91ciYmYS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHModGhpcyxiKX10aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpO2lmKCF0aGlzLm9wdGlvbnMuYXhpc3x8dGhpcy5vcHRpb25zLmF4aXMhPSJ5Iil0aGlzLmhlbHBlclswXS5zdHlsZS5sZWZ0PXRoaXMucG9zaXRpb24ubGVmdCsicHgiO2lmKCF0aGlzLm9wdGlvbnMuYXhpc3x8dGhpcy5vcHRpb25zLmF4aXMhPSJ4Iil0aGlzLmhlbHBlclswXS5zdHlsZS50b3A9dGhpcy5wb3NpdGlvbi50b3ArInB4Ijtmb3IodmFyIGU9dGhpcy5pdGVtcy5sZW5ndGgtMTtlPj0wO2UtLSl7dmFyIGY9dGhpcy5pdGVtc1tlXSxnPWYuaXRlbVswXSxoPXRoaXMuX2ludGVyc2VjdHNXaXRoUG9pbnRlcihmKTtpZighaCljb250aW51ZTtpZihmLmluc3RhbmNlIT09dGhpcy5jdXJyZW50Q29udGFpbmVyKWNvbnRpbnVlO2lmKGchPXRoaXMuY3VycmVudEl0ZW1bMF0mJnRoaXMucGxhY2Vob2xkZXJbaD09MT8ibmV4dCI6InByZXYiXSgpWzBdIT1nJiYhYS51aS5jb250YWlucyh0aGlzLnBsYWNlaG9sZGVyWzBdLGcpJiYodGhpcy5vcHRpb25zLnR5cGU9PSJzZW1pLWR5bmFtaWMiPyFhLnVpLmNvbnRhaW5zKHRoaXMuZWxlbWVudFswXSxnKTohMCkpe3RoaXMuZGlyZWN0aW9uPWg9PTE/ImRvd24iOiJ1cCI7aWYodGhpcy5vcHRpb25zLnRvbGVyYW5jZT09InBvaW50ZXIifHx0aGlzLl9pbnRlcnNlY3RzV2l0aFNpZGVzKGYpKXRoaXMuX3JlYXJyYW5nZShiLGYpO2Vsc2UgYnJlYWs7dGhpcy5fdHJpZ2dlcigiY2hhbmdlIixiLHRoaXMuX3VpSGFzaCgpKTticmVha319cmV0dXJuIHRoaXMuX2NvbnRhY3RDb250YWluZXJzKGIpLGEudWkuZGRtYW5hZ2VyJiZhLnVpLmRkbWFuYWdlci5kcmFnKHRoaXMsYiksdGhpcy5fdHJpZ2dlcigic29ydCIsYix0aGlzLl91aUhhc2goKSksdGhpcy5sYXN0UG9zaXRpb25BYnM9dGhpcy5wb3NpdGlvbkFicywhMX0sX21vdXNlU3RvcDpmdW5jdGlvbihiLGMpe2lmKCFiKXJldHVybjthLnVpLmRkbWFuYWdlciYmIXRoaXMub3B0aW9ucy5kcm9wQmVoYXZpb3VyJiZhLnVpLmRkbWFuYWdlci5kcm9wKHRoaXMsYik7aWYodGhpcy5vcHRpb25zLnJldmVydCl7dmFyIGQ9dGhpcyxlPWQucGxhY2Vob2xkZXIub2Zmc2V0KCk7ZC5yZXZlcnRpbmc9ITAsYSh0aGlzLmhlbHBlcikuYW5pbWF0ZSh7bGVmdDplLmxlZnQtdGhpcy5vZmZzZXQucGFyZW50LmxlZnQtZC5tYXJnaW5zLmxlZnQrKHRoaXMub2Zmc2V0UGFyZW50WzBdPT1kb2N1bWVudC5ib2R5PzA6dGhpcy5vZmZzZXRQYXJlbnRbMF0uc2Nyb2xsTGVmdCksdG9wOmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3AtZC5tYXJnaW5zLnRvcCsodGhpcy5vZmZzZXRQYXJlbnRbMF09PWRvY3VtZW50LmJvZHk/MDp0aGlzLm9mZnNldFBhcmVudFswXS5zY3JvbGxUb3ApfSxwYXJzZUludCh0aGlzLm9wdGlvbnMucmV2ZXJ0LDEwKXx8NTAwLGZ1bmN0aW9uKCl7ZC5fY2xlYXIoYil9KX1lbHNlIHRoaXMuX2NsZWFyKGIsYyk7cmV0dXJuITF9LGNhbmNlbDpmdW5jdGlvbigpe3ZhciBiPXRoaXM7aWYodGhpcy5kcmFnZ2luZyl7dGhpcy5fbW91c2VVcCh7dGFyZ2V0Om51bGx9KSx0aGlzLm9wdGlvbnMuaGVscGVyPT0ib3JpZ2luYWwiP3RoaXMuY3VycmVudEl0ZW0uY3NzKHRoaXMuX3N0b3JlZENTUykucmVtb3ZlQ2xhc3MoInVpLXNvcnRhYmxlLWhlbHBlciIpOnRoaXMuY3VycmVudEl0ZW0uc2hvdygpO2Zvcih2YXIgYz10aGlzLmNvbnRhaW5lcnMubGVuZ3RoLTE7Yz49MDtjLS0pdGhpcy5jb250YWluZXJzW2NdLl90cmlnZ2VyKCJkZWFjdGl2YXRlIixudWxsLGIuX3VpSGFzaCh0aGlzKSksdGhpcy5jb250YWluZXJzW2NdLmNvbnRhaW5lckNhY2hlLm92ZXImJih0aGlzLmNvbnRhaW5lcnNbY10uX3RyaWdnZXIoIm91dCIsbnVsbCxiLl91aUhhc2godGhpcykpLHRoaXMuY29udGFpbmVyc1tjXS5jb250YWluZXJDYWNoZS5vdmVyPTApfXJldHVybiB0aGlzLnBsYWNlaG9sZGVyJiYodGhpcy5wbGFjZWhvbGRlclswXS5wYXJlbnROb2RlJiZ0aGlzLnBsYWNlaG9sZGVyWzBdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5wbGFjZWhvbGRlclswXSksdGhpcy5vcHRpb25zLmhlbHBlciE9Im9yaWdpbmFsIiYmdGhpcy5oZWxwZXImJnRoaXMuaGVscGVyWzBdLnBhcmVudE5vZGUmJnRoaXMuaGVscGVyLnJlbW92ZSgpLGEuZXh0ZW5kKHRoaXMse2hlbHBlcjpudWxsLGRyYWdnaW5nOiExLHJldmVydGluZzohMSxfbm9GaW5hbFNvcnQ6bnVsbH0pLHRoaXMuZG9tUG9zaXRpb24ucHJldj9hKHRoaXMuZG9tUG9zaXRpb24ucHJldikuYWZ0ZXIodGhpcy5jdXJyZW50SXRlbSk6YSh0aGlzLmRvbVBvc2l0aW9uLnBhcmVudCkucHJlcGVuZCh0aGlzLmN1cnJlbnRJdGVtKSksdGhpc30sc2VyaWFsaXplOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMuX2dldEl0ZW1zQXNqUXVlcnkoYiYmYi5jb25uZWN0ZWQpLGQ9W107cmV0dXJuIGI9Ynx8e30sYShjKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGM9KGEoYi5pdGVtfHx0aGlzKS5hdHRyKGIuYXR0cmlidXRlfHwiaWQiKXx8IiIpLm1hdGNoKGIuZXhwcmVzc2lvbnx8LyguKylbLT1fXSguKykvKTtjJiZkLnB1c2goKGIua2V5fHxjWzFdKyJbXSIpKyI9IisoYi5rZXkmJmIuZXhwcmVzc2lvbj9jWzFdOmNbMl0pKX0pLCFkLmxlbmd0aCYmYi5rZXkmJmQucHVzaChiLmtleSsiPSIpLGQuam9pbigiJiIpfSx0b0FycmF5OmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMuX2dldEl0ZW1zQXNqUXVlcnkoYiYmYi5jb25uZWN0ZWQpLGQ9W107cmV0dXJuIGI9Ynx8e30sYy5lYWNoKGZ1bmN0aW9uKCl7ZC5wdXNoKGEoYi5pdGVtfHx0aGlzKS5hdHRyKGIuYXR0cmlidXRlfHwiaWQiKXx8IiIpfSksZH0sX2ludGVyc2VjdHNXaXRoOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucG9zaXRpb25BYnMubGVmdCxjPWIrdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCxkPXRoaXMucG9zaXRpb25BYnMudG9wLGU9ZCt0aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCxmPWEubGVmdCxnPWYrYS53aWR0aCxoPWEudG9wLGk9aCthLmhlaWdodCxqPXRoaXMub2Zmc2V0LmNsaWNrLnRvcCxrPXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQsbD1kK2o+aCYmZCtqPGkmJmIraz5mJiZiK2s8ZztyZXR1cm4gdGhpcy5vcHRpb25zLnRvbGVyYW5jZT09InBvaW50ZXIifHx0aGlzLm9wdGlvbnMuZm9yY2VQb2ludGVyRm9yQ29udGFpbmVyc3x8dGhpcy5vcHRpb25zLnRvbGVyYW5jZSE9InBvaW50ZXIiJiZ0aGlzLmhlbHBlclByb3BvcnRpb25zW3RoaXMuZmxvYXRpbmc/IndpZHRoIjoiaGVpZ2h0Il0+YVt0aGlzLmZsb2F0aW5nPyJ3aWR0aCI6ImhlaWdodCJdP2w6ZjxiK3RoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgvMiYmYy10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLzI8ZyYmaDxkK3RoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LzImJmUtdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQvMjxpfSxfaW50ZXJzZWN0c1dpdGhQb2ludGVyOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMub3B0aW9ucy5heGlzPT09IngifHxhLnVpLmlzT3ZlckF4aXModGhpcy5wb3NpdGlvbkFicy50b3ArdGhpcy5vZmZzZXQuY2xpY2sudG9wLGIudG9wLGIuaGVpZ2h0KSxkPXRoaXMub3B0aW9ucy5heGlzPT09InkifHxhLnVpLmlzT3ZlckF4aXModGhpcy5wb3NpdGlvbkFicy5sZWZ0K3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQsYi5sZWZ0LGIud2lkdGgpLGU9YyYmZCxmPXRoaXMuX2dldERyYWdWZXJ0aWNhbERpcmVjdGlvbigpLGc9dGhpcy5fZ2V0RHJhZ0hvcml6b250YWxEaXJlY3Rpb24oKTtyZXR1cm4gZT90aGlzLmZsb2F0aW5nP2cmJmc9PSJyaWdodCJ8fGY9PSJkb3duIj8yOjE6ZiYmKGY9PSJkb3duIj8yOjEpOiExfSxfaW50ZXJzZWN0c1dpdGhTaWRlczpmdW5jdGlvbihiKXt2YXIgYz1hLnVpLmlzT3ZlckF4aXModGhpcy5wb3NpdGlvbkFicy50b3ArdGhpcy5vZmZzZXQuY2xpY2sudG9wLGIudG9wK2IuaGVpZ2h0LzIsYi5oZWlnaHQpLGQ9YS51aS5pc092ZXJBeGlzKHRoaXMucG9zaXRpb25BYnMubGVmdCt0aGlzLm9mZnNldC5jbGljay5sZWZ0LGIubGVmdCtiLndpZHRoLzIsYi53aWR0aCksZT10aGlzLl9nZXREcmFnVmVydGljYWxEaXJlY3Rpb24oKSxmPXRoaXMuX2dldERyYWdIb3Jpem9udGFsRGlyZWN0aW9uKCk7cmV0dXJuIHRoaXMuZmxvYXRpbmcmJmY/Zj09InJpZ2h0IiYmZHx8Zj09ImxlZnQiJiYhZDplJiYoZT09ImRvd24iJiZjfHxlPT0idXAiJiYhYyl9LF9nZXREcmFnVmVydGljYWxEaXJlY3Rpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBvc2l0aW9uQWJzLnRvcC10aGlzLmxhc3RQb3NpdGlvbkFicy50b3A7cmV0dXJuIGEhPTAmJihhPjA/ImRvd24iOiJ1cCIpfSxfZ2V0RHJhZ0hvcml6b250YWxEaXJlY3Rpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBvc2l0aW9uQWJzLmxlZnQtdGhpcy5sYXN0UG9zaXRpb25BYnMubGVmdDtyZXR1cm4gYSE9MCYmKGE+MD8icmlnaHQiOiJsZWZ0Iil9LHJlZnJlc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX3JlZnJlc2hJdGVtcyhhKSx0aGlzLnJlZnJlc2hQb3NpdGlvbnMoKSx0aGlzfSxfY29ubmVjdFdpdGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnM7cmV0dXJuIGEuY29ubmVjdFdpdGguY29uc3RydWN0b3I9PVN0cmluZz9bYS5jb25uZWN0V2l0aF06YS5jb25uZWN0V2l0aH0sX2dldEl0ZW1zQXNqUXVlcnk6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcyxkPVtdLGU9W10sZj10aGlzLl9jb25uZWN0V2l0aCgpO2lmKGYmJmIpZm9yKHZhciBnPWYubGVuZ3RoLTE7Zz49MDtnLS0pe3ZhciBoPWEoZltnXSk7Zm9yKHZhciBpPWgubGVuZ3RoLTE7aT49MDtpLS0pe3ZhciBqPWEuZGF0YShoW2ldLHRoaXMud2lkZ2V0TmFtZSk7aiYmaiE9dGhpcyYmIWoub3B0aW9ucy5kaXNhYmxlZCYmZS5wdXNoKFthLmlzRnVuY3Rpb24oai5vcHRpb25zLml0ZW1zKT9qLm9wdGlvbnMuaXRlbXMuY2FsbChqLmVsZW1lbnQpOmEoai5vcHRpb25zLml0ZW1zLGouZWxlbWVudCkubm90KCIudWktc29ydGFibGUtaGVscGVyIikubm90KCIudWktc29ydGFibGUtcGxhY2Vob2xkZXIiKSxqXSl9fWUucHVzaChbYS5pc0Z1bmN0aW9uKHRoaXMub3B0aW9ucy5pdGVtcyk/dGhpcy5vcHRpb25zLml0ZW1zLmNhbGwodGhpcy5lbGVtZW50LG51bGwse29wdGlvbnM6dGhpcy5vcHRpb25zLGl0ZW06dGhpcy5jdXJyZW50SXRlbX0pOmEodGhpcy5vcHRpb25zLml0ZW1zLHRoaXMuZWxlbWVudCkubm90KCIudWktc29ydGFibGUtaGVscGVyIikubm90KCIudWktc29ydGFibGUtcGxhY2Vob2xkZXIiKSx0aGlzXSk7Zm9yKHZhciBnPWUubGVuZ3RoLTE7Zz49MDtnLS0pZVtnXVswXS5lYWNoKGZ1bmN0aW9uKCl7ZC5wdXNoKHRoaXMpfSk7cmV0dXJuIGEoZCl9LF9yZW1vdmVDdXJyZW50c0Zyb21JdGVtczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuY3VycmVudEl0ZW0uZmluZCgiOmRhdGEoIit0aGlzLndpZGdldE5hbWUrIi1pdGVtKSIpO2Zvcih2YXIgYj0wO2I8dGhpcy5pdGVtcy5sZW5ndGg7YisrKWZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWFbY109PXRoaXMuaXRlbXNbYl0uaXRlbVswXSYmdGhpcy5pdGVtcy5zcGxpY2UoYiwxKX0sX3JlZnJlc2hJdGVtczpmdW5jdGlvbihiKXt0aGlzLml0ZW1zPVtdLHRoaXMuY29udGFpbmVycz1bdGhpc107dmFyIGM9dGhpcy5pdGVtcyxkPXRoaXMsZT1bW2EuaXNGdW5jdGlvbih0aGlzLm9wdGlvbnMuaXRlbXMpP3RoaXMub3B0aW9ucy5pdGVtcy5jYWxsKHRoaXMuZWxlbWVudFswXSxiLHtpdGVtOnRoaXMuY3VycmVudEl0ZW19KTphKHRoaXMub3B0aW9ucy5pdGVtcyx0aGlzLmVsZW1lbnQpLHRoaXNdXSxmPXRoaXMuX2Nvbm5lY3RXaXRoKCk7aWYoZiYmdGhpcy5yZWFkeSlmb3IodmFyIGc9Zi5sZW5ndGgtMTtnPj0wO2ctLSl7dmFyIGg9YShmW2ddKTtmb3IodmFyIGk9aC5sZW5ndGgtMTtpPj0wO2ktLSl7dmFyIGo9YS5kYXRhKGhbaV0sdGhpcy53aWRnZXROYW1lKTtqJiZqIT10aGlzJiYhai5vcHRpb25zLmRpc2FibGVkJiYoZS5wdXNoKFthLmlzRnVuY3Rpb24oai5vcHRpb25zLml0ZW1zKT9qLm9wdGlvbnMuaXRlbXMuY2FsbChqLmVsZW1lbnRbMF0sYix7aXRlbTp0aGlzLmN1cnJlbnRJdGVtfSk6YShqLm9wdGlvbnMuaXRlbXMsai5lbGVtZW50KSxqXSksdGhpcy5jb250YWluZXJzLnB1c2goaikpfX1mb3IodmFyIGc9ZS5sZW5ndGgtMTtnPj0wO2ctLSl7dmFyIGs9ZVtnXVsxXSxsPWVbZ11bMF07Zm9yKHZhciBpPTAsbT1sLmxlbmd0aDtpPG07aSsrKXt2YXIgbj1hKGxbaV0pO24uZGF0YSh0aGlzLndpZGdldE5hbWUrIi1pdGVtIixrKSxjLnB1c2goe2l0ZW06bixpbnN0YW5jZTprLHdpZHRoOjAsaGVpZ2h0OjAsbGVmdDowLHRvcDowfSl9fX0scmVmcmVzaFBvc2l0aW9uczpmdW5jdGlvbihiKXt0aGlzLm9mZnNldFBhcmVudCYmdGhpcy5oZWxwZXImJih0aGlzLm9mZnNldC5wYXJlbnQ9dGhpcy5fZ2V0UGFyZW50T2Zmc2V0KCkpO2Zvcih2YXIgYz10aGlzLml0ZW1zLmxlbmd0aC0xO2M+PTA7Yy0tKXt2YXIgZD10aGlzLml0ZW1zW2NdO2lmKGQuaW5zdGFuY2UhPXRoaXMuY3VycmVudENvbnRhaW5lciYmdGhpcy5jdXJyZW50Q29udGFpbmVyJiZkLml0ZW1bMF0hPXRoaXMuY3VycmVudEl0ZW1bMF0pY29udGludWU7dmFyIGU9dGhpcy5vcHRpb25zLnRvbGVyYW5jZUVsZW1lbnQ/YSh0aGlzLm9wdGlvbnMudG9sZXJhbmNlRWxlbWVudCxkLml0ZW0pOmQuaXRlbTtifHwoZC53aWR0aD1lLm91dGVyV2lkdGgoKSxkLmhlaWdodD1lLm91dGVySGVpZ2h0KCkpO3ZhciBmPWUub2Zmc2V0KCk7ZC5sZWZ0PWYubGVmdCxkLnRvcD1mLnRvcH1pZih0aGlzLm9wdGlvbnMuY3VzdG9tJiZ0aGlzLm9wdGlvbnMuY3VzdG9tLnJlZnJlc2hDb250YWluZXJzKXRoaXMub3B0aW9ucy5jdXN0b20ucmVmcmVzaENvbnRhaW5lcnMuY2FsbCh0aGlzKTtlbHNlIGZvcih2YXIgYz10aGlzLmNvbnRhaW5lcnMubGVuZ3RoLTE7Yz49MDtjLS0pe3ZhciBmPXRoaXMuY29udGFpbmVyc1tjXS5lbGVtZW50Lm9mZnNldCgpO3RoaXMuY29udGFpbmVyc1tjXS5jb250YWluZXJDYWNoZS5sZWZ0PWYubGVmdCx0aGlzLmNvbnRhaW5lcnNbY10uY29udGFpbmVyQ2FjaGUudG9wPWYudG9wLHRoaXMuY29udGFpbmVyc1tjXS5jb250YWluZXJDYWNoZS53aWR0aD10aGlzLmNvbnRhaW5lcnNbY10uZWxlbWVudC5vdXRlcldpZHRoKCksdGhpcy5jb250YWluZXJzW2NdLmNvbnRhaW5lckNhY2hlLmhlaWdodD10aGlzLmNvbnRhaW5lcnNbY10uZWxlbWVudC5vdXRlckhlaWdodCgpfXJldHVybiB0aGlzfSxfY3JlYXRlUGxhY2Vob2xkZXI6ZnVuY3Rpb24oYil7dmFyIGM9Ynx8dGhpcyxkPWMub3B0aW9ucztpZighZC5wbGFjZWhvbGRlcnx8ZC5wbGFjZWhvbGRlci5jb25zdHJ1Y3Rvcj09U3RyaW5nKXt2YXIgZT1kLnBsYWNlaG9sZGVyO2QucGxhY2Vob2xkZXI9e2VsZW1lbnQ6ZnVuY3Rpb24oKXt2YXIgYj1hKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYy5jdXJyZW50SXRlbVswXS5ub2RlTmFtZSkpLmFkZENsYXNzKGV8fGMuY3VycmVudEl0ZW1bMF0uY2xhc3NOYW1lKyIgdWktc29ydGFibGUtcGxhY2Vob2xkZXIiKS5yZW1vdmVDbGFzcygidWktc29ydGFibGUtaGVscGVyIilbMF07cmV0dXJuIGV8fChiLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIpLGJ9LHVwZGF0ZTpmdW5jdGlvbihhLGIpe2lmKGUmJiFkLmZvcmNlUGxhY2Vob2xkZXJTaXplKXJldHVybjtiLmhlaWdodCgpfHxiLmhlaWdodChjLmN1cnJlbnRJdGVtLmlubmVySGVpZ2h0KCktcGFyc2VJbnQoYy5jdXJyZW50SXRlbS5jc3MoInBhZGRpbmdUb3AiKXx8MCwxMCktcGFyc2VJbnQoYy5jdXJyZW50SXRlbS5jc3MoInBhZGRpbmdCb3R0b20iKXx8MCwxMCkpLGIud2lkdGgoKXx8Yi53aWR0aChjLmN1cnJlbnRJdGVtLmlubmVyV2lkdGgoKS1wYXJzZUludChjLmN1cnJlbnRJdGVtLmNzcygicGFkZGluZ0xlZnQiKXx8MCwxMCktcGFyc2VJbnQoYy5jdXJyZW50SXRlbS5jc3MoInBhZGRpbmdSaWdodCIpfHwwLDEwKSl9fX1jLnBsYWNlaG9sZGVyPWEoZC5wbGFjZWhvbGRlci5lbGVtZW50LmNhbGwoYy5lbGVtZW50LGMuY3VycmVudEl0ZW0pKSxjLmN1cnJlbnRJdGVtLmFmdGVyKGMucGxhY2Vob2xkZXIpLGQucGxhY2Vob2xkZXIudXBkYXRlKGMsYy5wbGFjZWhvbGRlcil9LF9jb250YWN0Q29udGFpbmVyczpmdW5jdGlvbihiKXt2YXIgYz1udWxsLGQ9bnVsbDtmb3IodmFyIGU9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO2U+PTA7ZS0tKXtpZihhLnVpLmNvbnRhaW5zKHRoaXMuY3VycmVudEl0ZW1bMF0sdGhpcy5jb250YWluZXJzW2VdLmVsZW1lbnRbMF0pKWNvbnRpbnVlO2lmKHRoaXMuX2ludGVyc2VjdHNXaXRoKHRoaXMuY29udGFpbmVyc1tlXS5jb250YWluZXJDYWNoZSkpe2lmKGMmJmEudWkuY29udGFpbnModGhpcy5jb250YWluZXJzW2VdLmVsZW1lbnRbMF0sYy5lbGVtZW50WzBdKSljb250aW51ZTtjPXRoaXMuY29udGFpbmVyc1tlXSxkPWV9ZWxzZSB0aGlzLmNvbnRhaW5lcnNbZV0uY29udGFpbmVyQ2FjaGUub3ZlciYmKHRoaXMuY29udGFpbmVyc1tlXS5fdHJpZ2dlcigib3V0IixiLHRoaXMuX3VpSGFzaCh0aGlzKSksdGhpcy5jb250YWluZXJzW2VdLmNvbnRhaW5lckNhY2hlLm92ZXI9MCl9aWYoIWMpcmV0dXJuO2lmKHRoaXMuY29udGFpbmVycy5sZW5ndGg9PT0xKXRoaXMuY29udGFpbmVyc1tkXS5fdHJpZ2dlcigib3ZlciIsYix0aGlzLl91aUhhc2godGhpcykpLHRoaXMuY29udGFpbmVyc1tkXS5jb250YWluZXJDYWNoZS5vdmVyPTE7ZWxzZSBpZih0aGlzLmN1cnJlbnRDb250YWluZXIhPXRoaXMuY29udGFpbmVyc1tkXSl7dmFyIGY9MWU0LGc9bnVsbCxoPXRoaXMucG9zaXRpb25BYnNbdGhpcy5jb250YWluZXJzW2RdLmZsb2F0aW5nPyJsZWZ0IjoidG9wIl07Zm9yKHZhciBpPXRoaXMuaXRlbXMubGVuZ3RoLTE7aT49MDtpLS0pe2lmKCFhLnVpLmNvbnRhaW5zKHRoaXMuY29udGFpbmVyc1tkXS5lbGVtZW50WzBdLHRoaXMuaXRlbXNbaV0uaXRlbVswXSkpY29udGludWU7dmFyIGo9dGhpcy5jb250YWluZXJzW2RdLmZsb2F0aW5nP3RoaXMuaXRlbXNbaV0uaXRlbS5vZmZzZXQoKS5sZWZ0OnRoaXMuaXRlbXNbaV0uaXRlbS5vZmZzZXQoKS50b3A7TWF0aC5hYnMoai1oKTxmJiYoZj1NYXRoLmFicyhqLWgpLGc9dGhpcy5pdGVtc1tpXSx0aGlzLmRpcmVjdGlvbj1qLWg+MD8iZG93biI6InVwIil9aWYoIWcmJiF0aGlzLm9wdGlvbnMuZHJvcE9uRW1wdHkpcmV0dXJuO3RoaXMuY3VycmVudENvbnRhaW5lcj10aGlzLmNvbnRhaW5lcnNbZF0sZz90aGlzLl9yZWFycmFuZ2UoYixnLG51bGwsITApOnRoaXMuX3JlYXJyYW5nZShiLG51bGwsdGhpcy5jb250YWluZXJzW2RdLmVsZW1lbnQsITApLHRoaXMuX3RyaWdnZXIoImNoYW5nZSIsYix0aGlzLl91aUhhc2goKSksdGhpcy5jb250YWluZXJzW2RdLl90cmlnZ2VyKCJjaGFuZ2UiLGIsdGhpcy5fdWlIYXNoKHRoaXMpKSx0aGlzLm9wdGlvbnMucGxhY2Vob2xkZXIudXBkYXRlKHRoaXMuY3VycmVudENvbnRhaW5lcix0aGlzLnBsYWNlaG9sZGVyKSx0aGlzLmNvbnRhaW5lcnNbZF0uX3RyaWdnZXIoIm92ZXIiLGIsdGhpcy5fdWlIYXNoKHRoaXMpKSx0aGlzLmNvbnRhaW5lcnNbZF0uY29udGFpbmVyQ2FjaGUub3Zlcj0xfX0sX2NyZWF0ZUhlbHBlcjpmdW5jdGlvbihiKXt2YXIgYz10aGlzLm9wdGlvbnMsZD1hLmlzRnVuY3Rpb24oYy5oZWxwZXIpP2EoYy5oZWxwZXIuYXBwbHkodGhpcy5lbGVtZW50WzBdLFtiLHRoaXMuY3VycmVudEl0ZW1dKSk6Yy5oZWxwZXI9PSJjbG9uZSI/dGhpcy5jdXJyZW50SXRlbS5jbG9uZSgpOnRoaXMuY3VycmVudEl0ZW07cmV0dXJuIGQucGFyZW50cygiYm9keSIpLmxlbmd0aHx8YShjLmFwcGVuZFRvIT0icGFyZW50Ij9jLmFwcGVuZFRvOnRoaXMuY3VycmVudEl0ZW1bMF0ucGFyZW50Tm9kZSlbMF0uYXBwZW5kQ2hpbGQoZFswXSksZFswXT09dGhpcy5jdXJyZW50SXRlbVswXSYmKHRoaXMuX3N0b3JlZENTUz17d2lkdGg6dGhpcy5jdXJyZW50SXRlbVswXS5zdHlsZS53aWR0aCxoZWlnaHQ6dGhpcy5jdXJyZW50SXRlbVswXS5zdHlsZS5oZWlnaHQscG9zaXRpb246dGhpcy5jdXJyZW50SXRlbS5jc3MoInBvc2l0aW9uIiksdG9wOnRoaXMuY3VycmVudEl0ZW0uY3NzKCJ0b3AiKSxsZWZ0OnRoaXMuY3VycmVudEl0ZW0uY3NzKCJsZWZ0Iil9KSwoZFswXS5zdHlsZS53aWR0aD09IiJ8fGMuZm9yY2VIZWxwZXJTaXplKSYmZC53aWR0aCh0aGlzLmN1cnJlbnRJdGVtLndpZHRoKCkpLChkWzBdLnN0eWxlLmhlaWdodD09IiJ8fGMuZm9yY2VIZWxwZXJTaXplKSYmZC5oZWlnaHQodGhpcy5jdXJyZW50SXRlbS5oZWlnaHQoKSksZH0sX2FkanVzdE9mZnNldEZyb21IZWxwZXI6ZnVuY3Rpb24oYil7dHlwZW9mIGI9PSJzdHJpbmciJiYoYj1iLnNwbGl0KCIgIikpLGEuaXNBcnJheShiKSYmKGI9e2xlZnQ6K2JbMF0sdG9wOitiWzFdfHwwfSksImxlZnQiaW4gYiYmKHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ9Yi5sZWZ0K3RoaXMubWFyZ2lucy5sZWZ0KSwicmlnaHQiaW4gYiYmKHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ9dGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC1iLnJpZ2h0K3RoaXMubWFyZ2lucy5sZWZ0KSwidG9wImluIGImJih0aGlzLm9mZnNldC5jbGljay50b3A9Yi50b3ArdGhpcy5tYXJnaW5zLnRvcCksImJvdHRvbSJpbiBiJiYodGhpcy5vZmZzZXQuY2xpY2sudG9wPXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LWIuYm90dG9tK3RoaXMubWFyZ2lucy50b3ApfSxfZ2V0UGFyZW50T2Zmc2V0OmZ1bmN0aW9uKCl7dGhpcy5vZmZzZXRQYXJlbnQ9dGhpcy5oZWxwZXIub2Zmc2V0UGFyZW50KCk7dmFyIGI9dGhpcy5vZmZzZXRQYXJlbnQub2Zmc2V0KCk7dGhpcy5jc3NQb3NpdGlvbj09ImFic29sdXRlIiYmdGhpcy5zY3JvbGxQYXJlbnRbMF0hPWRvY3VtZW50JiZhLnVpLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLHRoaXMub2Zmc2V0UGFyZW50WzBdKSYmKGIubGVmdCs9dGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpLGIudG9wKz10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKSk7aWYodGhpcy5vZmZzZXRQYXJlbnRbMF09PWRvY3VtZW50LmJvZHl8fHRoaXMub2Zmc2V0UGFyZW50WzBdLnRhZ05hbWUmJnRoaXMub2Zmc2V0UGFyZW50WzBdLnRhZ05hbWUudG9Mb3dlckNhc2UoKT09Imh0bWwiJiZhLmJyb3dzZXIubXNpZSliPXt0b3A6MCxsZWZ0OjB9O3JldHVybnt0b3A6Yi50b3ArKHBhcnNlSW50KHRoaXMub2Zmc2V0UGFyZW50LmNzcygiYm9yZGVyVG9wV2lkdGgiKSwxMCl8fDApLGxlZnQ6Yi5sZWZ0KyhwYXJzZUludCh0aGlzLm9mZnNldFBhcmVudC5jc3MoImJvcmRlckxlZnRXaWR0aCIpLDEwKXx8MCl9fSxfZ2V0UmVsYXRpdmVPZmZzZXQ6ZnVuY3Rpb24oKXtpZih0aGlzLmNzc1Bvc2l0aW9uPT0icmVsYXRpdmUiKXt2YXIgYT10aGlzLmN1cnJlbnRJdGVtLnBvc2l0aW9uKCk7cmV0dXJue3RvcDphLnRvcC0ocGFyc2VJbnQodGhpcy5oZWxwZXIuY3NzKCJ0b3AiKSwxMCl8fDApK3RoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpLGxlZnQ6YS5sZWZ0LShwYXJzZUludCh0aGlzLmhlbHBlci5jc3MoImxlZnQiKSwxMCl8fDApK3RoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKX19cmV0dXJue3RvcDowLGxlZnQ6MH19LF9jYWNoZU1hcmdpbnM6ZnVuY3Rpb24oKXt0aGlzLm1hcmdpbnM9e2xlZnQ6cGFyc2VJbnQodGhpcy5jdXJyZW50SXRlbS5jc3MoIm1hcmdpbkxlZnQiKSwxMCl8fDAsdG9wOnBhcnNlSW50KHRoaXMuY3VycmVudEl0ZW0uY3NzKCJtYXJnaW5Ub3AiKSwxMCl8fDB9fSxfY2FjaGVIZWxwZXJQcm9wb3J0aW9uczpmdW5jdGlvbigpe3RoaXMuaGVscGVyUHJvcG9ydGlvbnM9e3dpZHRoOnRoaXMuaGVscGVyLm91dGVyV2lkdGgoKSxoZWlnaHQ6dGhpcy5oZWxwZXIub3V0ZXJIZWlnaHQoKX19LF9zZXRDb250YWlubWVudDpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3B0aW9ucztiLmNvbnRhaW5tZW50PT0icGFyZW50IiYmKGIuY29udGFpbm1lbnQ9dGhpcy5oZWxwZXJbMF0ucGFyZW50Tm9kZSk7aWYoYi5jb250YWlubWVudD09ImRvY3VtZW50Inx8Yi5jb250YWlubWVudD09IndpbmRvdyIpdGhpcy5jb250YWlubWVudD1bMC10aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0LXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0LDAtdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3AsYShiLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiP2RvY3VtZW50OndpbmRvdykud2lkdGgoKS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXRoaXMubWFyZ2lucy5sZWZ0LChhKGIuY29udGFpbm1lbnQ9PSJkb2N1bWVudCI/ZG9jdW1lbnQ6d2luZG93KS5oZWlnaHQoKXx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlLnNjcm9sbEhlaWdodCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQtdGhpcy5tYXJnaW5zLnRvcF07aWYoIS9eKGRvY3VtZW50fHdpbmRvd3xwYXJlbnQpJC8udGVzdChiLmNvbnRhaW5tZW50KSl7dmFyIGM9YShiLmNvbnRhaW5tZW50KVswXSxkPWEoYi5jb250YWlubWVudCkub2Zmc2V0KCksZT1hKGMpLmNzcygib3ZlcmZsb3ciKSE9ImhpZGRlbiI7dGhpcy5jb250YWlubWVudD1bZC5sZWZ0KyhwYXJzZUludChhKGMpLmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoYShjKS5jc3MoInBhZGRpbmdMZWZ0IiksMTApfHwwKS10aGlzLm1hcmdpbnMubGVmdCxkLnRvcCsocGFyc2VJbnQoYShjKS5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoYShjKS5jc3MoInBhZGRpbmdUb3AiKSwxMCl8fDApLXRoaXMubWFyZ2lucy50b3AsZC5sZWZ0KyhlP01hdGgubWF4KGMuc2Nyb2xsV2lkdGgsYy5vZmZzZXRXaWR0aCk6Yy5vZmZzZXRXaWR0aCktKHBhcnNlSW50KGEoYykuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApLShwYXJzZUludChhKGMpLmNzcygicGFkZGluZ1JpZ2h0IiksMTApfHwwKS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXRoaXMubWFyZ2lucy5sZWZ0LGQudG9wKyhlP01hdGgubWF4KGMuc2Nyb2xsSGVpZ2h0LGMub2Zmc2V0SGVpZ2h0KTpjLm9mZnNldEhlaWdodCktKHBhcnNlSW50KGEoYykuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKXx8MCktKHBhcnNlSW50KGEoYykuY3NzKCJwYWRkaW5nQm90dG9tIiksMTApfHwwKS10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC10aGlzLm1hcmdpbnMudG9wXX19LF9jb252ZXJ0UG9zaXRpb25UbzpmdW5jdGlvbihiLGMpe2N8fChjPXRoaXMucG9zaXRpb24pO3ZhciBkPWI9PSJhYnNvbHV0ZSI/MTotMSxlPXRoaXMub3B0aW9ucyxmPXRoaXMuY3NzUG9zaXRpb249PSJhYnNvbHV0ZSImJih0aGlzLnNjcm9sbFBhcmVudFswXT09ZG9jdW1lbnR8fCFhLnVpLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLHRoaXMub2Zmc2V0UGFyZW50WzBdKSk/dGhpcy5vZmZzZXRQYXJlbnQ6dGhpcy5zY3JvbGxQYXJlbnQsZz0vKGh0bWx8Ym9keSkvaS50ZXN0KGZbMF0udGFnTmFtZSk7cmV0dXJue3RvcDpjLnRvcCt0aGlzLm9mZnNldC5yZWxhdGl2ZS50b3AqZCt0aGlzLm9mZnNldC5wYXJlbnQudG9wKmQtKGEuYnJvd3Nlci5zYWZhcmkmJnRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/MDoodGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8tdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCk6Zz8wOmYuc2Nyb2xsVG9wKCkpKmQpLGxlZnQ6Yy5sZWZ0K3RoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQqZCt0aGlzLm9mZnNldC5wYXJlbnQubGVmdCpkLShhLmJyb3dzZXIuc2FmYXJpJiZ0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPzA6KHRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKTpnPzA6Zi5zY3JvbGxMZWZ0KCkpKmQpfX0sX2dlbmVyYXRlUG9zaXRpb246ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5vcHRpb25zLGQ9dGhpcy5jc3NQb3NpdGlvbj09ImFic29sdXRlIiYmKHRoaXMuc2Nyb2xsUGFyZW50WzBdPT1kb2N1bWVudHx8IWEudWkuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJlbnRbMF0pKT90aGlzLm9mZnNldFBhcmVudDp0aGlzLnNjcm9sbFBhcmVudCxlPS8oaHRtbHxib2R5KS9pLnRlc3QoZFswXS50YWdOYW1lKTt0aGlzLmNzc1Bvc2l0aW9uPT0icmVsYXRpdmUiJiYodGhpcy5zY3JvbGxQYXJlbnRbMF09PWRvY3VtZW50fHx0aGlzLnNjcm9sbFBhcmVudFswXT09dGhpcy5vZmZzZXRQYXJlbnRbMF0pJiYodGhpcy5vZmZzZXQucmVsYXRpdmU9dGhpcy5fZ2V0UmVsYXRpdmVPZmZzZXQoKSk7dmFyIGY9Yi5wYWdlWCxnPWIucGFnZVk7aWYodGhpcy5vcmlnaW5hbFBvc2l0aW9uKXt0aGlzLmNvbnRhaW5tZW50JiYoYi5wYWdlWC10aGlzLm9mZnNldC5jbGljay5sZWZ0PHRoaXMuY29udGFpbm1lbnRbMF0mJihmPXRoaXMuY29udGFpbm1lbnRbMF0rdGhpcy5vZmZzZXQuY2xpY2subGVmdCksYi5wYWdlWS10aGlzLm9mZnNldC5jbGljay50b3A8dGhpcy5jb250YWlubWVudFsxXSYmKGc9dGhpcy5jb250YWlubWVudFsxXSt0aGlzLm9mZnNldC5jbGljay50b3ApLGIucGFnZVgtdGhpcy5vZmZzZXQuY2xpY2subGVmdD50aGlzLmNvbnRhaW5tZW50WzJdJiYoZj10aGlzLmNvbnRhaW5tZW50WzJdK3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQpLGIucGFnZVktdGhpcy5vZmZzZXQuY2xpY2sudG9wPnRoaXMuY29udGFpbm1lbnRbM10mJihnPXRoaXMuY29udGFpbm1lbnRbM10rdGhpcy5vZmZzZXQuY2xpY2sudG9wKSk7aWYoYy5ncmlkKXt2YXIgaD10aGlzLm9yaWdpbmFsUGFnZVkrTWF0aC5yb3VuZCgoZy10aGlzLm9yaWdpbmFsUGFnZVkpL2MuZ3JpZFsxXSkqYy5ncmlkWzFdO2c9dGhpcy5jb250YWlubWVudD9oLXRoaXMub2Zmc2V0LmNsaWNrLnRvcDx0aGlzLmNvbnRhaW5tZW50WzFdfHxoLXRoaXMub2Zmc2V0LmNsaWNrLnRvcD50aGlzLmNvbnRhaW5tZW50WzNdP2gtdGhpcy5vZmZzZXQuY2xpY2sudG9wPHRoaXMuY29udGFpbm1lbnRbMV0/aCtjLmdyaWRbMV06aC1jLmdyaWRbMV06aDpoO3ZhciBpPXRoaXMub3JpZ2luYWxQYWdlWCtNYXRoLnJvdW5kKChmLXRoaXMub3JpZ2luYWxQYWdlWCkvYy5ncmlkWzBdKSpjLmdyaWRbMF07Zj10aGlzLmNvbnRhaW5tZW50P2ktdGhpcy5vZmZzZXQuY2xpY2subGVmdDx0aGlzLmNvbnRhaW5tZW50WzBdfHxpLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+dGhpcy5jb250YWlubWVudFsyXT9pLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ8dGhpcy5jb250YWlubWVudFswXT9pK2MuZ3JpZFswXTppLWMuZ3JpZFswXTppOml9fXJldHVybnt0b3A6Zy10aGlzLm9mZnNldC5jbGljay50b3AtdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3ArKGEuYnJvd3Nlci5zYWZhcmkmJnRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/MDp0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKTplPzA6ZC5zY3JvbGxUb3AoKSksbGVmdDpmLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQtdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdC10aGlzLm9mZnNldC5wYXJlbnQubGVmdCsoYS5icm93c2VyLnNhZmFyaSYmdGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8wOnRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKTplPzA6ZC5zY3JvbGxMZWZ0KCkpfX0sX3JlYXJyYW5nZTpmdW5jdGlvbihhLGIsYyxkKXtjP2NbMF0uYXBwZW5kQ2hpbGQodGhpcy5wbGFjZWhvbGRlclswXSk6Yi5pdGVtWzBdLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMucGxhY2Vob2xkZXJbMF0sdGhpcy5kaXJlY3Rpb249PSJkb3duIj9iLml0ZW1bMF06Yi5pdGVtWzBdLm5leHRTaWJsaW5nKSx0aGlzLmNvdW50ZXI9dGhpcy5jb3VudGVyPysrdGhpcy5jb3VudGVyOjE7dmFyIGU9dGhpcyxmPXRoaXMuY291bnRlcjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Y9PWUuY291bnRlciYmZS5yZWZyZXNoUG9zaXRpb25zKCFkKX0sMCl9LF9jbGVhcjpmdW5jdGlvbihiLGMpe3RoaXMucmV2ZXJ0aW5nPSExO3ZhciBkPVtdLGU9dGhpczshdGhpcy5fbm9GaW5hbFNvcnQmJnRoaXMuY3VycmVudEl0ZW0ucGFyZW50KCkubGVuZ3RoJiZ0aGlzLnBsYWNlaG9sZGVyLmJlZm9yZSh0aGlzLmN1cnJlbnRJdGVtKSx0aGlzLl9ub0ZpbmFsU29ydD1udWxsO2lmKHRoaXMuaGVscGVyWzBdPT10aGlzLmN1cnJlbnRJdGVtWzBdKXtmb3IodmFyIGYgaW4gdGhpcy5fc3RvcmVkQ1NTKWlmKHRoaXMuX3N0b3JlZENTU1tmXT09ImF1dG8ifHx0aGlzLl9zdG9yZWRDU1NbZl09PSJzdGF0aWMiKXRoaXMuX3N0b3JlZENTU1tmXT0iIjt0aGlzLmN1cnJlbnRJdGVtLmNzcyh0aGlzLl9zdG9yZWRDU1MpLnJlbW92ZUNsYXNzKCJ1aS1zb3J0YWJsZS1oZWxwZXIiKX1lbHNlIHRoaXMuY3VycmVudEl0ZW0uc2hvdygpO3RoaXMuZnJvbU91dHNpZGUmJiFjJiZkLnB1c2goZnVuY3Rpb24oYSl7dGhpcy5fdHJpZ2dlcigicmVjZWl2ZSIsYSx0aGlzLl91aUhhc2godGhpcy5mcm9tT3V0c2lkZSkpfSksKHRoaXMuZnJvbU91dHNpZGV8fHRoaXMuZG9tUG9zaXRpb24ucHJldiE9dGhpcy5jdXJyZW50SXRlbS5wcmV2KCkubm90KCIudWktc29ydGFibGUtaGVscGVyIilbMF18fHRoaXMuZG9tUG9zaXRpb24ucGFyZW50IT10aGlzLmN1cnJlbnRJdGVtLnBhcmVudCgpWzBdKSYmIWMmJmQucHVzaChmdW5jdGlvbihhKXt0aGlzLl90cmlnZ2VyKCJ1cGRhdGUiLGEsdGhpcy5fdWlIYXNoKCkpfSksdGhpcyE9PXRoaXMuY3VycmVudENvbnRhaW5lciYmKGN8fChkLnB1c2goZnVuY3Rpb24oYSl7dGhpcy5fdHJpZ2dlcigicmVtb3ZlIixhLHRoaXMuX3VpSGFzaCgpKX0pLGQucHVzaChmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7YS5fdHJpZ2dlcigicmVjZWl2ZSIsYix0aGlzLl91aUhhc2godGhpcykpfX0uY2FsbCh0aGlzLHRoaXMuY3VycmVudENvbnRhaW5lcikpLGQucHVzaChmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7YS5fdHJpZ2dlcigidXBkYXRlIixiLHRoaXMuX3VpSGFzaCh0aGlzKSl9fS5jYWxsKHRoaXMsdGhpcy5jdXJyZW50Q29udGFpbmVyKSkpKTtmb3IodmFyIGY9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO2Y+PTA7Zi0tKWN8fGQucHVzaChmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7YS5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsYix0aGlzLl91aUhhc2godGhpcykpfX0uY2FsbCh0aGlzLHRoaXMuY29udGFpbmVyc1tmXSkpLHRoaXMuY29udGFpbmVyc1tmXS5jb250YWluZXJDYWNoZS5vdmVyJiYoZC5wdXNoKGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXthLl90cmlnZ2VyKCJvdXQiLGIsdGhpcy5fdWlIYXNoKHRoaXMpKX19LmNhbGwodGhpcyx0aGlzLmNvbnRhaW5lcnNbZl0pKSx0aGlzLmNvbnRhaW5lcnNbZl0uY29udGFpbmVyQ2FjaGUub3Zlcj0wKTt0aGlzLl9zdG9yZWRDdXJzb3ImJmEoImJvZHkiKS5jc3MoImN1cnNvciIsdGhpcy5fc3RvcmVkQ3Vyc29yKSx0aGlzLl9zdG9yZWRPcGFjaXR5JiZ0aGlzLmhlbHBlci5jc3MoIm9wYWNpdHkiLHRoaXMuX3N0b3JlZE9wYWNpdHkpLHRoaXMuX3N0b3JlZFpJbmRleCYmdGhpcy5oZWxwZXIuY3NzKCJ6SW5kZXgiLHRoaXMuX3N0b3JlZFpJbmRleD09ImF1dG8iPyIiOnRoaXMuX3N0b3JlZFpJbmRleCksdGhpcy5kcmFnZ2luZz0hMTtpZih0aGlzLmNhbmNlbEhlbHBlclJlbW92YWwpe2lmKCFjKXt0aGlzLl90cmlnZ2VyKCJiZWZvcmVTdG9wIixiLHRoaXMuX3VpSGFzaCgpKTtmb3IodmFyIGY9MDtmPGQubGVuZ3RoO2YrKylkW2ZdLmNhbGwodGhpcyxiKTt0aGlzLl90cmlnZ2VyKCJzdG9wIixiLHRoaXMuX3VpSGFzaCgpKX1yZXR1cm4gdGhpcy5mcm9tT3V0c2lkZT0hMSwhMX1jfHx0aGlzLl90cmlnZ2VyKCJiZWZvcmVTdG9wIixiLHRoaXMuX3VpSGFzaCgpKSx0aGlzLnBsYWNlaG9sZGVyWzBdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5wbGFjZWhvbGRlclswXSksdGhpcy5oZWxwZXJbMF0hPXRoaXMuY3VycmVudEl0ZW1bMF0mJnRoaXMuaGVscGVyLnJlbW92ZSgpLHRoaXMuaGVscGVyPW51bGw7aWYoIWMpe2Zvcih2YXIgZj0wO2Y8ZC5sZW5ndGg7ZisrKWRbZl0uY2FsbCh0aGlzLGIpO3RoaXMuX3RyaWdnZXIoInN0b3AiLGIsdGhpcy5fdWlIYXNoKCkpfXJldHVybiB0aGlzLmZyb21PdXRzaWRlPSExLCEwfSxfdHJpZ2dlcjpmdW5jdGlvbigpe2EuV2lkZ2V0LnByb3RvdHlwZS5fdHJpZ2dlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk9PT0hMSYmdGhpcy5jYW5jZWwoKX0sX3VpSGFzaDpmdW5jdGlvbihiKXt2YXIgYz1ifHx0aGlzO3JldHVybntoZWxwZXI6Yy5oZWxwZXIscGxhY2Vob2xkZXI6Yy5wbGFjZWhvbGRlcnx8YShbXSkscG9zaXRpb246Yy5wb3NpdGlvbixvcmlnaW5hbFBvc2l0aW9uOmMub3JpZ2luYWxQb3NpdGlvbixvZmZzZXQ6Yy5wb3NpdGlvbkFicyxpdGVtOmMuY3VycmVudEl0ZW0sc2VuZGVyOmI/Yi5lbGVtZW50Om51bGx9fX0pLGEuZXh0ZW5kKGEudWkuc29ydGFibGUse3ZlcnNpb246IjEuOC4yNCJ9KX0oalF1ZXJ5KSxqUXVlcnkuZWZmZWN0c3x8ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGIpe3ZhciBjO3JldHVybiBiJiZiLmNvbnN0cnVjdG9yPT1BcnJheSYmYi5sZW5ndGg9PTM/YjooYz0vcmdiXChccyooWzAtOV17MSwzfSlccyosXHMqKFswLTldezEsM30pXHMqLFxzKihbMC05XXsxLDN9KVxzKlwpLy5leGVjKGIpKT9bcGFyc2VJbnQoY1sxXSwxMCkscGFyc2VJbnQoY1syXSwxMCkscGFyc2VJbnQoY1szXSwxMCldOihjPS9yZ2JcKFxzKihbMC05XSsoPzpcLlswLTldKyk/KVwlXHMqLFxzKihbMC05XSsoPzpcLlswLTldKyk/KVwlXHMqLFxzKihbMC05XSsoPzpcLlswLTldKyk/KVwlXHMqXCkvLmV4ZWMoYikpP1twYXJzZUZsb2F0KGNbMV0pKjIuNTUscGFyc2VGbG9hdChjWzJdKSoyLjU1LHBhcnNlRmxvYXQoY1szXSkqMi41NV06KGM9LyMoW2EtZkEtRjAtOV17Mn0pKFthLWZBLUYwLTldezJ9KShbYS1mQS1GMC05XXsyfSkvLmV4ZWMoYikpP1twYXJzZUludChjWzFdLDE2KSxwYXJzZUludChjWzJdLDE2KSxwYXJzZUludChjWzNdLDE2KV06KGM9LyMoW2EtZkEtRjAtOV0pKFthLWZBLUYwLTldKShbYS1mQS1GMC05XSkvLmV4ZWMoYikpP1twYXJzZUludChjWzFdK2NbMV0sMTYpLHBhcnNlSW50KGNbMl0rY1syXSwxNikscGFyc2VJbnQoY1szXStjWzNdLDE2KV06KGM9L3JnYmFcKDAsIDAsIDAsIDBcKS8uZXhlYyhiKSk/ZS50cmFuc3BhcmVudDplW2EudHJpbShiKS50b0xvd2VyQ2FzZSgpXX1mdW5jdGlvbiBkKGIsZCl7dmFyIGU7ZG97ZT0oYS5jdXJDU1N8fGEuY3NzKShiLGQpO2lmKGUhPSIiJiZlIT0idHJhbnNwYXJlbnQifHxhLm5vZGVOYW1lKGIsImJvZHkiKSlicmVhaztkPSJiYWNrZ3JvdW5kQ29sb3IifXdoaWxlKGI9Yi5wYXJlbnROb2RlKTtyZXR1cm4gYyhlKX1mdW5jdGlvbiBoKCl7dmFyIGE9ZG9jdW1lbnQuZGVmYXVsdFZpZXc/ZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLG51bGwpOnRoaXMuY3VycmVudFN0eWxlLGI9e30sYyxkO2lmKGEmJmEubGVuZ3RoJiZhWzBdJiZhW2FbMF1dKXt2YXIgZT1hLmxlbmd0aDt3aGlsZShlLS0pYz1hW2VdLHR5cGVvZiBhW2NdPT0ic3RyaW5nIiYmKGQ9Yy5yZXBsYWNlKC9cLShcdykvZyxmdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9KSxiW2RdPWFbY10pfWVsc2UgZm9yKGMgaW4gYSl0eXBlb2YgYVtjXT09InN0cmluZyImJihiW2NdPWFbY10pO3JldHVybiBifWZ1bmN0aW9uIGkoYil7dmFyIGMsZDtmb3IoYyBpbiBiKWQ9YltjXSwoZD09bnVsbHx8YS5pc0Z1bmN0aW9uKGQpfHxjIGluIGd8fC9zY3JvbGxiYXIvLnRlc3QoYyl8fCEvY29sb3IvaS50ZXN0KGMpJiZpc05hTihwYXJzZUZsb2F0KGQpKSkmJmRlbGV0ZSBiW2NdO3JldHVybiBifWZ1bmN0aW9uIGooYSxiKXt2YXIgYz17XzowfSxkO2ZvcihkIGluIGIpYVtkXSE9YltkXSYmKGNbZF09YltkXSk7cmV0dXJuIGN9ZnVuY3Rpb24gayhiLGMsZCxlKXt0eXBlb2YgYj09Im9iamVjdCImJihlPWMsZD1udWxsLGM9YixiPWMuZWZmZWN0KSxhLmlzRnVuY3Rpb24oYykmJihlPWMsZD1udWxsLGM9e30pO2lmKHR5cGVvZiBjPT0ibnVtYmVyInx8YS5meC5zcGVlZHNbY10pZT1kLGQ9YyxjPXt9O3JldHVybiBhLmlzRnVuY3Rpb24oZCkmJihlPWQsZD1udWxsKSxjPWN8fHt9LGQ9ZHx8Yy5kdXJhdGlvbixkPWEuZngub2ZmPzA6dHlwZW9mIGQ9PSJudW1iZXIiP2Q6ZCBpbiBhLmZ4LnNwZWVkcz9hLmZ4LnNwZWVkc1tkXTphLmZ4LnNwZWVkcy5fZGVmYXVsdCxlPWV8fGMuY29tcGxldGUsW2IsYyxkLGVdfWZ1bmN0aW9uIGwoYil7cmV0dXJuIWJ8fHR5cGVvZiBiPT0ibnVtYmVyInx8YS5meC5zcGVlZHNbYl0/ITA6dHlwZW9mIGI9PSJzdHJpbmciJiYhYS5lZmZlY3RzW2JdPyEwOiExfWEuZWZmZWN0cz17fSxhLmVhY2goWyJiYWNrZ3JvdW5kQ29sb3IiLCJib3JkZXJCb3R0b21Db2xvciIsImJvcmRlckxlZnRDb2xvciIsImJvcmRlclJpZ2h0Q29sb3IiLCJib3JkZXJUb3BDb2xvciIsImJvcmRlckNvbG9yIiwiY29sb3IiLCJvdXRsaW5lQ29sb3IiXSxmdW5jdGlvbihiLGUpe2EuZnguc3RlcFtlXT1mdW5jdGlvbihhKXthLmNvbG9ySW5pdHx8KGEuc3RhcnQ9ZChhLmVsZW0sZSksYS5lbmQ9YyhhLmVuZCksYS5jb2xvckluaXQ9ITApLGEuZWxlbS5zdHlsZVtlXT0icmdiKCIrTWF0aC5tYXgoTWF0aC5taW4ocGFyc2VJbnQoYS5wb3MqKGEuZW5kWzBdLWEuc3RhcnRbMF0pK2Euc3RhcnRbMF0sMTApLDI1NSksMCkrIiwiK01hdGgubWF4KE1hdGgubWluKHBhcnNlSW50KGEucG9zKihhLmVuZFsxXS1hLnN0YXJ0WzFdKSthLnN0YXJ0WzFdLDEwKSwyNTUpLDApKyIsIitNYXRoLm1heChNYXRoLm1pbihwYXJzZUludChhLnBvcyooYS5lbmRbMl0tYS5zdGFydFsyXSkrYS5zdGFydFsyXSwxMCksMjU1KSwwKSsiKSJ9fSk7dmFyIGU9e2FxdWE6WzAsMjU1LDI1NV0sYXp1cmU6WzI0MCwyNTUsMjU1XSxiZWlnZTpbMjQ1LDI0NSwyMjBdLGJsYWNrOlswLDAsMF0sYmx1ZTpbMCwwLDI1NV0sYnJvd246WzE2NSw0Miw0Ml0sY3lhbjpbMCwyNTUsMjU1XSxkYXJrYmx1ZTpbMCwwLDEzOV0sZGFya2N5YW46WzAsMTM5LDEzOV0sZGFya2dyZXk6WzE2OSwxNjksMTY5XSxkYXJrZ3JlZW46WzAsMTAwLDBdLGRhcmtraGFraTpbMTg5LDE4MywxMDddLGRhcmttYWdlbnRhOlsxMzksMCwxMzldLGRhcmtvbGl2ZWdyZWVuOls4NSwxMDcsNDddLGRhcmtvcmFuZ2U6WzI1NSwxNDAsMF0sZGFya29yY2hpZDpbMTUzLDUwLDIwNF0sZGFya3JlZDpbMTM5LDAsMF0sZGFya3NhbG1vbjpbMjMzLDE1MCwxMjJdLGRhcmt2aW9sZXQ6WzE0OCwwLDIxMV0sZnVjaHNpYTpbMjU1LDAsMjU1XSxnb2xkOlsyNTUsMjE1LDBdLGdyZWVuOlswLDEyOCwwXSxpbmRpZ286Wzc1LDAsMTMwXSxraGFraTpbMjQwLDIzMCwxNDBdLGxpZ2h0Ymx1ZTpbMTczLDIxNiwyMzBdLGxpZ2h0Y3lhbjpbMjI0LDI1NSwyNTVdLGxpZ2h0Z3JlZW46WzE0NCwyMzgsMTQ0XSxsaWdodGdyZXk6WzIxMSwyMTEsMjExXSxsaWdodHBpbms6WzI1NSwxODIsMTkzXSxsaWdodHllbGxvdzpbMjU1LDI1NSwyMjRdLGxpbWU6WzAsMjU1LDBdLG1hZ2VudGE6WzI1NSwwLDI1NV0sbWFyb29uOlsxMjgsMCwwXSxuYXZ5OlswLDAsMTI4XSxvbGl2ZTpbMTI4LDEyOCwwXSxvcmFuZ2U6WzI1NSwxNjUsMF0scGluazpbMjU1LDE5MiwyMDNdLHB1cnBsZTpbMTI4LDAsMTI4XSx2aW9sZXQ6WzEyOCwwLDEyOF0scmVkOlsyNTUsMCwwXSxzaWx2ZXI6WzE5MiwxOTIsMTkyXSx3aGl0ZTpbMjU1LDI1NSwyNTVdLHllbGxvdzpbMjU1LDI1NSwwXSx0cmFuc3BhcmVudDpbMjU1LDI1NSwyNTVdfSxmPVsiYWRkIiwicmVtb3ZlIiwidG9nZ2xlIl0sZz17Ym9yZGVyOjEsYm9yZGVyQm90dG9tOjEsYm9yZGVyQ29sb3I6MSxib3JkZXJMZWZ0OjEsYm9yZGVyUmlnaHQ6MSxib3JkZXJUb3A6MSxib3JkZXJXaWR0aDoxLG1hcmdpbjoxLHBhZGRpbmc6MX07YS5lZmZlY3RzLmFuaW1hdGVDbGFzcz1mdW5jdGlvbihiLGMsZCxlKXtyZXR1cm4gYS5pc0Z1bmN0aW9uKGQpJiYoZT1kLGQ9bnVsbCksdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBnPWEodGhpcyksaz1nLmF0dHIoInN0eWxlIil8fCIgIixsPWkoaC5jYWxsKHRoaXMpKSxtLG49Zy5hdHRyKCJjbGFzcyIpfHwiIjthLmVhY2goZixmdW5jdGlvbihhLGMpe2JbY10mJmdbYysiQ2xhc3MiXShiW2NdKX0pLG09aShoLmNhbGwodGhpcykpLGcuYXR0cigiY2xhc3MiLG4pLGcuYW5pbWF0ZShqKGwsbSkse3F1ZXVlOiExLGR1cmF0aW9uOmMsZWFzaW5nOmQsY29tcGxldGU6ZnVuY3Rpb24oKXthLmVhY2goZixmdW5jdGlvbihhLGMpe2JbY10mJmdbYysiQ2xhc3MiXShiW2NdKX0pLHR5cGVvZiBnLmF0dHIoInN0eWxlIik9PSJvYmplY3QiPyhnLmF0dHIoInN0eWxlIikuY3NzVGV4dD0iIixnLmF0dHIoInN0eWxlIikuY3NzVGV4dD1rKTpnLmF0dHIoInN0eWxlIixrKSxlJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxhLmRlcXVldWUodGhpcyl9fSl9KX0sYS5mbi5leHRlbmQoe19hZGRDbGFzczphLmZuLmFkZENsYXNzLGFkZENsYXNzOmZ1bmN0aW9uKGIsYyxkLGUpe3JldHVybiBjP2EuZWZmZWN0cy5hbmltYXRlQ2xhc3MuYXBwbHkodGhpcyxbe2FkZDpifSxjLGQsZV0pOnRoaXMuX2FkZENsYXNzKGIpfSxfcmVtb3ZlQ2xhc3M6YS5mbi5yZW1vdmVDbGFzcyxyZW1vdmVDbGFzczpmdW5jdGlvbihiLGMsZCxlKXtyZXR1cm4gYz9hLmVmZmVjdHMuYW5pbWF0ZUNsYXNzLmFwcGx5KHRoaXMsW3tyZW1vdmU6Yn0sYyxkLGVdKTp0aGlzLl9yZW1vdmVDbGFzcyhiKX0sX3RvZ2dsZUNsYXNzOmEuZm4udG9nZ2xlQ2xhc3MsdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oYyxkLGUsZixnKXtyZXR1cm4gdHlwZW9mIGQ9PSJib29sZWFuInx8ZD09PWI/ZT9hLmVmZmVjdHMuYW5pbWF0ZUNsYXNzLmFwcGx5KHRoaXMsW2Q/e2FkZDpjfTp7cmVtb3ZlOmN9LGUsZixnXSk6dGhpcy5fdG9nZ2xlQ2xhc3MoYyxkKTphLmVmZmVjdHMuYW5pbWF0ZUNsYXNzLmFwcGx5KHRoaXMsW3t0b2dnbGU6Y30sZCxlLGZdKX0sc3dpdGNoQ2xhc3M6ZnVuY3Rpb24oYixjLGQsZSxmKXtyZXR1cm4gYS5lZmZlY3RzLmFuaW1hdGVDbGFzcy5hcHBseSh0aGlzLFt7YWRkOmMscmVtb3ZlOmJ9LGQsZSxmXSl9fSksYS5leHRlbmQoYS5lZmZlY3RzLHt2ZXJzaW9uOiIxLjguMjQiLHNhdmU6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdIT09bnVsbCYmYS5kYXRhKCJlYy5zdG9yYWdlLiIrYltjXSxhWzBdLnN0eWxlW2JbY11dKX0scmVzdG9yZTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10hPT1udWxsJiZhLmNzcyhiW2NdLGEuZGF0YSgiZWMuc3RvcmFnZS4iK2JbY10pKX0sc2V0TW9kZTpmdW5jdGlvbihhLGIpe3JldHVybiBiPT0idG9nZ2xlIiYmKGI9YS5pcygiOmhpZGRlbiIpPyJzaG93IjoiaGlkZSIpLGJ9LGdldEJhc2VsaW5lOmZ1bmN0aW9uKGEsYil7dmFyIGMsZDtzd2l0Y2goYVswXSl7Y2FzZSJ0b3AiOmM9MDticmVhaztjYXNlIm1pZGRsZSI6Yz0uNTticmVhaztjYXNlImJvdHRvbSI6Yz0xO2JyZWFrO2RlZmF1bHQ6Yz1hWzBdL2IuaGVpZ2h0fXN3aXRjaChhWzFdKXtjYXNlImxlZnQiOmQ9MDticmVhaztjYXNlImNlbnRlciI6ZD0uNTticmVhaztjYXNlInJpZ2h0IjpkPTE7YnJlYWs7ZGVmYXVsdDpkPWFbMV0vYi53aWR0aH1yZXR1cm57eDpkLHk6Y319LGNyZWF0ZVdyYXBwZXI6ZnVuY3Rpb24oYil7aWYoYi5wYXJlbnQoKS5pcygiLnVpLWVmZmVjdHMtd3JhcHBlciIpKXJldHVybiBiLnBhcmVudCgpO3ZhciBjPXt3aWR0aDpiLm91dGVyV2lkdGgoITApLGhlaWdodDpiLm91dGVySGVpZ2h0KCEwKSwiZmxvYXQiOmIuY3NzKCJmbG9hdCIpfSxkPWEoIjxkaXY+PC9kaXY+IikuYWRkQ2xhc3MoInVpLWVmZmVjdHMtd3JhcHBlciIpLmNzcyh7Zm9udFNpemU6IjEwMCUiLGJhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLG1hcmdpbjowLHBhZGRpbmc6MH0pLGU9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDt0cnl7ZS5pZH1jYXRjaChmKXtlPWRvY3VtZW50LmJvZHl9cmV0dXJuIGIud3JhcChkKSwoYlswXT09PWV8fGEuY29udGFpbnMoYlswXSxlKSkmJmEoZSkuZm9jdXMoKSxkPWIucGFyZW50KCksYi5jc3MoInBvc2l0aW9uIik9PSJzdGF0aWMiPyhkLmNzcyh7cG9zaXRpb246InJlbGF0aXZlIn0pLGIuY3NzKHtwb3NpdGlvbjoicmVsYXRpdmUifSkpOihhLmV4dGVuZChjLHtwb3NpdGlvbjpiLmNzcygicG9zaXRpb24iKSx6SW5kZXg6Yi5jc3MoInotaW5kZXgiKX0pLGEuZWFjaChbInRvcCIsImxlZnQiLCJib3R0b20iLCJyaWdodCJdLGZ1bmN0aW9uKGEsZCl7Y1tkXT1iLmNzcyhkKSxpc05hTihwYXJzZUludChjW2RdLDEwKSkmJihjW2RdPSJhdXRvIil9KSxiLmNzcyh7cG9zaXRpb246InJlbGF0aXZlIix0b3A6MCxsZWZ0OjAscmlnaHQ6ImF1dG8iLGJvdHRvbToiYXV0byJ9KSksZC5jc3MoYykuc2hvdygpfSxyZW1vdmVXcmFwcGVyOmZ1bmN0aW9uKGIpe3ZhciBjLGQ9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtyZXR1cm4gYi5wYXJlbnQoKS5pcygiLnVpLWVmZmVjdHMtd3JhcHBlciIpPyhjPWIucGFyZW50KCkucmVwbGFjZVdpdGgoYiksKGJbMF09PT1kfHxhLmNvbnRhaW5zKGJbMF0sZCkpJiZhKGQpLmZvY3VzKCksYyk6Yn0sc2V0VHJhbnNpdGlvbjpmdW5jdGlvbihiLGMsZCxlKXtyZXR1cm4gZT1lfHx7fSxhLmVhY2goYyxmdW5jdGlvbihhLGMpe3ZhciBmPWIuY3NzVW5pdChjKTtmWzBdPjAmJihlW2NdPWZbMF0qZCtmWzFdKX0pLGV9fSksYS5mbi5leHRlbmQoe2VmZmVjdDpmdW5jdGlvbihiLGMsZCxlKXt2YXIgZj1rLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxnPXtvcHRpb25zOmZbMV0sZHVyYXRpb246ZlsyXSxjYWxsYmFjazpmWzNdfSxoPWcub3B0aW9ucy5tb2RlLGk9YS5lZmZlY3RzW2JdO3JldHVybiBhLmZ4Lm9mZnx8IWk/aD90aGlzW2hdKGcuZHVyYXRpb24sZy5jYWxsYmFjayk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zy5jYWxsYmFjayYmZy5jYWxsYmFjay5jYWxsKHRoaXMpfSk6aS5jYWxsKHRoaXMsZyl9LF9zaG93OmEuZm4uc2hvdyxzaG93OmZ1bmN0aW9uKGEpe2lmKGwoYSkpcmV0dXJuIHRoaXMuX3Nob3cuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBiPWsuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBiWzFdLm1vZGU9InNob3ciLHRoaXMuZWZmZWN0LmFwcGx5KHRoaXMsYil9LF9oaWRlOmEuZm4uaGlkZSxoaWRlOmZ1bmN0aW9uKGEpe2lmKGwoYSkpcmV0dXJuIHRoaXMuX2hpZGUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBiPWsuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBiWzFdLm1vZGU9ImhpZGUiLHRoaXMuZWZmZWN0LmFwcGx5KHRoaXMsYil9LF9fdG9nZ2xlOmEuZm4udG9nZ2xlLHRvZ2dsZTpmdW5jdGlvbihiKXtpZihsKGIpfHx0eXBlb2YgYj09ImJvb2xlYW4ifHxhLmlzRnVuY3Rpb24oYikpcmV0dXJuIHRoaXMuX190b2dnbGUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBjPWsuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBjWzFdLm1vZGU9InRvZ2dsZSIsdGhpcy5lZmZlY3QuYXBwbHkodGhpcyxjKX0sY3NzVW5pdDpmdW5jdGlvbihiKXt2YXIgYz10aGlzLmNzcyhiKSxkPVtdO3JldHVybiBhLmVhY2goWyJlbSIsInB4IiwiJSIsInB0Il0sZnVuY3Rpb24oYSxiKXtjLmluZGV4T2YoYik+MCYmKGQ9W3BhcnNlRmxvYXQoYyksYl0pfSksZH19KTt2YXIgbT17fTthLmVhY2goWyJRdWFkIiwiQ3ViaWMiLCJRdWFydCIsIlF1aW50IiwiRXhwbyJdLGZ1bmN0aW9uKGEsYil7bVtiXT1mdW5jdGlvbihiKXtyZXR1cm4gTWF0aC5wb3coYixhKzIpfX0pLGEuZXh0ZW5kKG0se1NpbmU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEtTWF0aC5jb3MoYSpNYXRoLlBJLzIpfSxDaXJjOmZ1bmN0aW9uKGEpe3JldHVybiAxLU1hdGguc3FydCgxLWEqYSl9LEVsYXN0aWM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT0wfHxhPT09MT9hOi1NYXRoLnBvdygyLDgqKGEtMSkpKk1hdGguc2luKCgoYS0xKSo4MC03LjUpKk1hdGguUEkvMTUpfSxCYWNrOmZ1bmN0aW9uKGEpe3JldHVybiBhKmEqKDMqYS0yKX0sQm91bmNlOmZ1bmN0aW9uKGEpe3ZhciBiLGM9NDt3aGlsZShhPCgoYj1NYXRoLnBvdygyLC0tYykpLTEpLzExKTtyZXR1cm4gMS9NYXRoLnBvdyg0LDMtYyktNy41NjI1Kk1hdGgucG93KChiKjMtMikvMjItYSwyKX19KSxhLmVhY2gobSxmdW5jdGlvbihiLGMpe2EuZWFzaW5nWyJlYXNlSW4iK2JdPWMsYS5lYXNpbmdbImVhc2VPdXQiK2JdPWZ1bmN0aW9uKGEpe3JldHVybiAxLWMoMS1hKX0sYS5lYXNpbmdbImVhc2VJbk91dCIrYl09ZnVuY3Rpb24oYSl7cmV0dXJuIGE8LjU/YyhhKjIpLzI6YyhhKi0yKzIpLy0yKzF9fSl9KGpRdWVyeSksZnVuY3Rpb24oYSxiKXthLmVmZmVjdHMuYmxpbmQ9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCJdLGU9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8ImhpZGUiKSxmPWIub3B0aW9ucy5kaXJlY3Rpb258fCJ2ZXJ0aWNhbCI7YS5lZmZlY3RzLnNhdmUoYyxkKSxjLnNob3coKTt2YXIgZz1hLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihjKS5jc3Moe292ZXJmbG93OiJoaWRkZW4ifSksaD1mPT0idmVydGljYWwiPyJoZWlnaHQiOiJ3aWR0aCIsaT1mPT0idmVydGljYWwiP2cuaGVpZ2h0KCk6Zy53aWR0aCgpO2U9PSJzaG93IiYmZy5jc3MoaCwwKTt2YXIgaj17fTtqW2hdPWU9PSJzaG93Ij9pOjAsZy5hbmltYXRlKGosYi5kdXJhdGlvbixiLm9wdGlvbnMuZWFzaW5nLGZ1bmN0aW9uKCl7ZT09ImhpZGUiJiZjLmhpZGUoKSxhLmVmZmVjdHMucmVzdG9yZShjLGQpLGEuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKGMpLGIuY2FsbGJhY2smJmIuY2FsbGJhY2suYXBwbHkoY1swXSxhcmd1bWVudHMpLGMuZGVxdWV1ZSgpfSl9KX19KGpRdWVyeSksZnVuY3Rpb24oYSxiKXthLmVmZmVjdHMuYm91bmNlPWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKSxkPVsicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiXSxlPWEuZWZmZWN0cy5zZXRNb2RlKGMsYi5vcHRpb25zLm1vZGV8fCJlZmZlY3QiKSxmPWIub3B0aW9ucy5kaXJlY3Rpb258fCJ1cCIsZz1iLm9wdGlvbnMuZGlzdGFuY2V8fDIwLGg9Yi5vcHRpb25zLnRpbWVzfHw1LGk9Yi5kdXJhdGlvbnx8MjUwOy9zaG93fGhpZGUvLnRlc3QoZSkmJmQucHVzaCgib3BhY2l0eSIpLGEuZWZmZWN0cy5zYXZlKGMsZCksYy5zaG93KCksYS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoYyk7dmFyIGo9Zj09InVwInx8Zj09ImRvd24iPyJ0b3AiOiJsZWZ0IixrPWY9PSJ1cCJ8fGY9PSJsZWZ0Ij8icG9zIjoibmVnIixnPWIub3B0aW9ucy5kaXN0YW5jZXx8KGo9PSJ0b3AiP2Mub3V0ZXJIZWlnaHQoITApLzM6Yy5vdXRlcldpZHRoKCEwKS8zKTtlPT0ic2hvdyImJmMuY3NzKCJvcGFjaXR5IiwwKS5jc3MoaixrPT0icG9zIj8tZzpnKSxlPT0iaGlkZSImJihnPWcvKGgqMikpLGUhPSJoaWRlIiYmaC0tO2lmKGU9PSJzaG93Iil7dmFyIGw9e29wYWNpdHk6MX07bFtqXT0oaz09InBvcyI/Iis9IjoiLT0iKStnLGMuYW5pbWF0ZShsLGkvMixiLm9wdGlvbnMuZWFzaW5nKSxnPWcvMixoLS19Zm9yKHZhciBtPTA7bTxoO20rKyl7dmFyIG49e30scD17fTtuW2pdPShrPT0icG9zIj8iLT0iOiIrPSIpK2cscFtqXT0oaz09InBvcyI/Iis9IjoiLT0iKStnLGMuYW5pbWF0ZShuLGkvMixiLm9wdGlvbnMuZWFzaW5nKS5hbmltYXRlKHAsaS8yLGIub3B0aW9ucy5lYXNpbmcpLGc9ZT09ImhpZGUiP2cqMjpnLzJ9aWYoZT09ImhpZGUiKXt2YXIgbD17b3BhY2l0eTowfTtsW2pdPShrPT0icG9zIj8iLT0iOiIrPSIpK2csYy5hbmltYXRlKGwsaS8yLGIub3B0aW9ucy5lYXNpbmcsZnVuY3Rpb24oKXtjLmhpZGUoKSxhLmVmZmVjdHMucmVzdG9yZShjLGQpLGEuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKGMpLGIuY2FsbGJhY2smJmIuY2FsbGJhY2suYXBwbHkodGhpcyxhcmd1bWVudHMpfSl9ZWxzZXt2YXIgbj17fSxwPXt9O25bal09KGs9PSJwb3MiPyItPSI6Iis9IikrZyxwW2pdPShrPT0icG9zIj8iKz0iOiItPSIpK2csYy5hbmltYXRlKG4saS8yLGIub3B0aW9ucy5lYXNpbmcpLmFuaW1hdGUocCxpLzIsYi5vcHRpb25zLmVhc2luZyxmdW5jdGlvbigpe2EuZWZmZWN0cy5yZXN0b3JlKGMsZCksYS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoYyksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX1jLnF1ZXVlKCJmeCIsZnVuY3Rpb24oKXtjLmRlcXVldWUoKX0pLGMuZGVxdWV1ZSgpfSl9fShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7YS5lZmZlY3RzLmNsaXA9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsImhlaWdodCIsIndpZHRoIl0sZT1hLmVmZmVjdHMuc2V0TW9kZShjLGIub3B0aW9ucy5tb2RlfHwiaGlkZSIpLGY9Yi5vcHRpb25zLmRpcmVjdGlvbnx8InZlcnRpY2FsIjthLmVmZmVjdHMuc2F2ZShjLGQpLGMuc2hvdygpO3ZhciBnPWEuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKGMpLmNzcyh7b3ZlcmZsb3c6ImhpZGRlbiJ9KSxoPWNbMF0udGFnTmFtZT09IklNRyI/ZzpjLGk9e3NpemU6Zj09InZlcnRpY2FsIj8iaGVpZ2h0Ijoid2lkdGgiLHBvc2l0aW9uOmY9PSJ2ZXJ0aWNhbCI/InRvcCI6ImxlZnQifSxqPWY9PSJ2ZXJ0aWNhbCI/aC5oZWlnaHQoKTpoLndpZHRoKCk7ZT09InNob3ciJiYoaC5jc3MoaS5zaXplLDApLGguY3NzKGkucG9zaXRpb24sai8yKSk7dmFyIGs9e307a1tpLnNpemVdPWU9PSJzaG93Ij9qOjAsa1tpLnBvc2l0aW9uXT1lPT0ic2hvdyI/MDpqLzIsaC5hbmltYXRlKGsse3F1ZXVlOiExLGR1cmF0aW9uOmIuZHVyYXRpb24sZWFzaW5nOmIub3B0aW9ucy5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtlPT0iaGlkZSImJmMuaGlkZSgpLGEuZWZmZWN0cy5yZXN0b3JlKGMsZCksYS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoYyksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseShjWzBdLGFyZ3VtZW50cyksYy5kZXF1ZXVlKCl9fSl9KX19KGpRdWVyeSksZnVuY3Rpb24oYSxiKXthLmVmZmVjdHMuZHJvcD1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZD1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0Iiwib3BhY2l0eSJdLGU9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8ImhpZGUiKSxmPWIub3B0aW9ucy5kaXJlY3Rpb258fCJsZWZ0IjthLmVmZmVjdHMuc2F2ZShjLGQpLGMuc2hvdygpLGEuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKGMpO3ZhciBnPWY9PSJ1cCJ8fGY9PSJkb3duIj8idG9wIjoibGVmdCIsaD1mPT0idXAifHxmPT0ibGVmdCI/InBvcyI6Im5lZyIsaT1iLm9wdGlvbnMuZGlzdGFuY2V8fChnPT0idG9wIj9jLm91dGVySGVpZ2h0KCEwKS8yOmMub3V0ZXJXaWR0aCghMCkvMik7ZT09InNob3ciJiZjLmNzcygib3BhY2l0eSIsMCkuY3NzKGcsaD09InBvcyI/LWk6aSk7dmFyIGo9e29wYWNpdHk6ZT09InNob3ciPzE6MH07altnXT0oZT09InNob3ciP2g9PSJwb3MiPyIrPSI6Ii09IjpoPT0icG9zIj8iLT0iOiIrPSIpK2ksYy5hbmltYXRlKGose3F1ZXVlOiExLGR1cmF0aW9uOmIuZHVyYXRpb24sZWFzaW5nOmIub3B0aW9ucy5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtlPT0iaGlkZSImJmMuaGlkZSgpLGEuZWZmZWN0cy5yZXN0b3JlKGMsZCksYS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoYyksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseSh0aGlzLGFyZ3VtZW50cyksYy5kZXF1ZXVlKCl9fSl9KX19KGpRdWVyeSksZnVuY3Rpb24oYSxiKXthLmVmZmVjdHMuZXhwbG9kZT1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBjPWIub3B0aW9ucy5waWVjZXM/TWF0aC5yb3VuZChNYXRoLnNxcnQoYi5vcHRpb25zLnBpZWNlcykpOjMsZD1iLm9wdGlvbnMucGllY2VzP01hdGgucm91bmQoTWF0aC5zcXJ0KGIub3B0aW9ucy5waWVjZXMpKTozO2Iub3B0aW9ucy5tb2RlPWIub3B0aW9ucy5tb2RlPT0idG9nZ2xlIj9hKHRoaXMpLmlzKCI6dmlzaWJsZSIpPyJoaWRlIjoic2hvdyI6Yi5vcHRpb25zLm1vZGU7dmFyIGU9YSh0aGlzKS5zaG93KCkuY3NzKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIiksZj1lLm9mZnNldCgpO2YudG9wLT1wYXJzZUludChlLmNzcygibWFyZ2luVG9wIiksMTApfHwwLGYubGVmdC09cGFyc2VJbnQoZS5jc3MoIm1hcmdpbkxlZnQiKSwxMCl8fDA7dmFyIGc9ZS5vdXRlcldpZHRoKCEwKSxoPWUub3V0ZXJIZWlnaHQoITApO2Zvcih2YXIgaT0wO2k8YztpKyspZm9yKHZhciBqPTA7ajxkO2orKyllLmNsb25lKCkuYXBwZW5kVG8oImJvZHkiKS53cmFwKCI8ZGl2PjwvZGl2PiIpLmNzcyh7cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJ2aXNpYmxlIixsZWZ0Oi1qKihnL2QpLHRvcDotaSooaC9jKX0pLnBhcmVudCgpLmFkZENsYXNzKCJ1aS1lZmZlY3RzLWV4cGxvZGUiKS5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsb3ZlcmZsb3c6ImhpZGRlbiIsd2lkdGg6Zy9kLGhlaWdodDpoL2MsbGVmdDpmLmxlZnQraiooZy9kKSsoYi5vcHRpb25zLm1vZGU9PSJzaG93Ij8oai1NYXRoLmZsb29yKGQvMikpKihnL2QpOjApLHRvcDpmLnRvcCtpKihoL2MpKyhiLm9wdGlvbnMubW9kZT09InNob3ciPyhpLU1hdGguZmxvb3IoYy8yKSkqKGgvYyk6MCksb3BhY2l0eTpiLm9wdGlvbnMubW9kZT09InNob3ciPzA6MX0pLmFuaW1hdGUoe2xlZnQ6Zi5sZWZ0K2oqKGcvZCkrKGIub3B0aW9ucy5tb2RlPT0ic2hvdyI/MDooai1NYXRoLmZsb29yKGQvMikpKihnL2QpKSx0b3A6Zi50b3AraSooaC9jKSsoYi5vcHRpb25zLm1vZGU9PSJzaG93Ij8wOihpLU1hdGguZmxvb3IoYy8yKSkqKGgvYykpLG9wYWNpdHk6Yi5vcHRpb25zLm1vZGU9PSJzaG93Ij8xOjB9LGIuZHVyYXRpb258fDUwMCk7c2V0VGltZW91dChmdW5jdGlvbigpe2Iub3B0aW9ucy5tb2RlPT0ic2hvdyI/ZS5jc3Moe3Zpc2liaWxpdHk6InZpc2libGUifSk6ZS5jc3Moe3Zpc2liaWxpdHk6InZpc2libGUifSkuaGlkZSgpLGIuY2FsbGJhY2smJmIuY2FsbGJhY2suYXBwbHkoZVswXSksZS5kZXF1ZXVlKCksYSgiZGl2LnVpLWVmZmVjdHMtZXhwbG9kZSIpLnJlbW92ZSgpfSxiLmR1cmF0aW9ufHw1MDApfSl9fShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7YS5lZmZlY3RzLmZhZGU9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8ImhpZGUiKTtjLmFuaW1hdGUoe29wYWNpdHk6ZH0se3F1ZXVlOiExLGR1cmF0aW9uOmIuZHVyYXRpb24sZWFzaW5nOmIub3B0aW9ucy5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtiLmNhbGxiYWNrJiZiLmNhbGxiYWNrLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxjLmRlcXVldWUoKX19KX0pfX0oalF1ZXJ5KSxmdW5jdGlvbihhLGIpe2EuZWZmZWN0cy5mb2xkPWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKSxkPVsicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiXSxlPWEuZWZmZWN0cy5zZXRNb2RlKGMsYi5vcHRpb25zLm1vZGV8fCJoaWRlIiksZj1iLm9wdGlvbnMuc2l6ZXx8MTUsZz0hIWIub3B0aW9ucy5ob3JpekZpcnN0LGg9Yi5kdXJhdGlvbj9iLmR1cmF0aW9uLzI6YS5meC5zcGVlZHMuX2RlZmF1bHQvMjthLmVmZmVjdHMuc2F2ZShjLGQpLGMuc2hvdygpO3ZhciBpPWEuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKGMpLmNzcyh7b3ZlcmZsb3c6ImhpZGRlbiJ9KSxqPWU9PSJzaG93IiE9ZyxrPWo/WyJ3aWR0aCIsImhlaWdodCJdOlsiaGVpZ2h0Iiwid2lkdGgiXSxsPWo/W2kud2lkdGgoKSxpLmhlaWdodCgpXTpbaS5oZWlnaHQoKSxpLndpZHRoKCldLG09LyhbMC05XSspJS8uZXhlYyhmKTttJiYoZj1wYXJzZUludChtWzFdLDEwKS8xMDAqbFtlPT0iaGlkZSI/MDoxXSksZT09InNob3ciJiZpLmNzcyhnP3toZWlnaHQ6MCx3aWR0aDpmfTp7aGVpZ2h0OmYsd2lkdGg6MH0pO3ZhciBuPXt9LHA9e307bltrWzBdXT1lPT0ic2hvdyI/bFswXTpmLHBba1sxXV09ZT09InNob3ciP2xbMV06MCxpLmFuaW1hdGUobixoLGIub3B0aW9ucy5lYXNpbmcpLmFuaW1hdGUocCxoLGIub3B0aW9ucy5lYXNpbmcsZnVuY3Rpb24oKXtlPT0iaGlkZSImJmMuaGlkZSgpLGEuZWZmZWN0cy5yZXN0b3JlKGMsZCksYS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoYyksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseShjWzBdLGFyZ3VtZW50cyksYy5kZXF1ZXVlKCl9KX0pfX0oalF1ZXJ5KSxmdW5jdGlvbihhLGIpe2EuZWZmZWN0cy5oaWdobGlnaHQ9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9WyJiYWNrZ3JvdW5kSW1hZ2UiLCJiYWNrZ3JvdW5kQ29sb3IiLCJvcGFjaXR5Il0sZT1hLmVmZmVjdHMuc2V0TW9kZShjLGIub3B0aW9ucy5tb2RlfHwic2hvdyIpLGY9e2JhY2tncm91bmRDb2xvcjpjLmNzcygiYmFja2dyb3VuZENvbG9yIil9O2U9PSJoaWRlIiYmKGYub3BhY2l0eT0wKSxhLmVmZmVjdHMuc2F2ZShjLGQpLGMuc2hvdygpLmNzcyh7YmFja2dyb3VuZEltYWdlOiJub25lIixiYWNrZ3JvdW5kQ29sb3I6Yi5vcHRpb25zLmNvbG9yfHwiI2ZmZmY5OSJ9KS5hbmltYXRlKGYse3F1ZXVlOiExLGR1cmF0aW9uOmIuZHVyYXRpb24sZWFzaW5nOmIub3B0aW9ucy5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtlPT0iaGlkZSImJmMuaGlkZSgpLGEuZWZmZWN0cy5yZXN0b3JlKGMsZCksZT09InNob3ciJiYhYS5zdXBwb3J0Lm9wYWNpdHkmJnRoaXMuc3R5bGUucmVtb3ZlQXR0cmlidXRlKCJmaWx0ZXIiKSxiLmNhbGxiYWNrJiZiLmNhbGxiYWNrLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxjLmRlcXVldWUoKX19KX0pfX0oalF1ZXJ5KSxmdW5jdGlvbihhLGIpe2EuZWZmZWN0cy5wdWxzYXRlPWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKSxkPWEuZWZmZWN0cy5zZXRNb2RlKGMsYi5vcHRpb25zLm1vZGV8fCJzaG93IiksZT0oYi5vcHRpb25zLnRpbWVzfHw1KSoyLTEsZj1iLmR1cmF0aW9uP2IuZHVyYXRpb24vMjphLmZ4LnNwZWVkcy5fZGVmYXVsdC8yLGc9Yy5pcygiOnZpc2libGUiKSxoPTA7Z3x8KGMuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCksaD0xKSwoZD09ImhpZGUiJiZnfHxkPT0ic2hvdyImJiFnKSYmZS0tO2Zvcih2YXIgaT0wO2k8ZTtpKyspYy5hbmltYXRlKHtvcGFjaXR5Omh9LGYsYi5vcHRpb25zLmVhc2luZyksaD0oaCsxKSUyO2MuYW5pbWF0ZSh7b3BhY2l0eTpofSxmLGIub3B0aW9ucy5lYXNpbmcsZnVuY3Rpb24oKXtoPT0wJiZjLmhpZGUoKSxiLmNhbGxiYWNrJiZiLmNhbGxiYWNrLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLGMucXVldWUoImZ4IixmdW5jdGlvbigpe2MuZGVxdWV1ZSgpfSkuZGVxdWV1ZSgpfSl9fShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7YS5lZmZlY3RzLnB1ZmY9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8ImhpZGUiKSxlPXBhcnNlSW50KGIub3B0aW9ucy5wZXJjZW50LDEwKXx8MTUwLGY9ZS8xMDAsZz17aGVpZ2h0OmMuaGVpZ2h0KCksd2lkdGg6Yy53aWR0aCgpfTthLmV4dGVuZChiLm9wdGlvbnMse2ZhZGU6ITAsbW9kZTpkLHBlcmNlbnQ6ZD09ImhpZGUiP2U6MTAwLGZyb206ZD09ImhpZGUiP2c6e2hlaWdodDpnLmhlaWdodCpmLHdpZHRoOmcud2lkdGgqZn19KSxjLmVmZmVjdCgic2NhbGUiLGIub3B0aW9ucyxiLmR1cmF0aW9uLGIuY2FsbGJhY2spLGMuZGVxdWV1ZSgpfSl9LGEuZWZmZWN0cy5zY2FsZT1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZD1hLmV4dGVuZCghMCx7fSxiLm9wdGlvbnMpLGU9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8ImVmZmVjdCIpLGY9cGFyc2VJbnQoYi5vcHRpb25zLnBlcmNlbnQsMTApfHwocGFyc2VJbnQoYi5vcHRpb25zLnBlcmNlbnQsMTApPT0wPzA6ZT09ImhpZGUiPzA6MTAwKSxnPWIub3B0aW9ucy5kaXJlY3Rpb258fCJib3RoIixoPWIub3B0aW9ucy5vcmlnaW47ZSE9ImVmZmVjdCImJihkLm9yaWdpbj1ofHxbIm1pZGRsZSIsImNlbnRlciJdLGQucmVzdG9yZT0hMCk7dmFyIGk9e2hlaWdodDpjLmhlaWdodCgpLHdpZHRoOmMud2lkdGgoKX07Yy5mcm9tPWIub3B0aW9ucy5mcm9tfHwoZT09InNob3ciP3toZWlnaHQ6MCx3aWR0aDowfTppKTt2YXIgaj17eTpnIT0iaG9yaXpvbnRhbCI/Zi8xMDA6MSx4OmchPSJ2ZXJ0aWNhbCI/Zi8xMDA6MX07Yy50bz17aGVpZ2h0OmkuaGVpZ2h0KmoueSx3aWR0aDppLndpZHRoKmoueH0sYi5vcHRpb25zLmZhZGUmJihlPT0ic2hvdyImJihjLmZyb20ub3BhY2l0eT0wLGMudG8ub3BhY2l0eT0xKSxlPT0iaGlkZSImJihjLmZyb20ub3BhY2l0eT0xLGMudG8ub3BhY2l0eT0wKSksZC5mcm9tPWMuZnJvbSxkLnRvPWMudG8sZC5tb2RlPWUsYy5lZmZlY3QoInNpemUiLGQsYi5kdXJhdGlvbixiLmNhbGxiYWNrKSxjLmRlcXVldWUoKX0pfSxhLmVmZmVjdHMuc2l6ZT1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZD1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0Iiwid2lkdGgiLCJoZWlnaHQiLCJvdmVyZmxvdyIsIm9wYWNpdHkiXSxlPVsicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiLCJvdmVyZmxvdyIsIm9wYWNpdHkiXSxmPVsid2lkdGgiLCJoZWlnaHQiLCJvdmVyZmxvdyJdLGc9WyJmb250U2l6ZSJdLGg9WyJib3JkZXJUb3BXaWR0aCIsImJvcmRlckJvdHRvbVdpZHRoIiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iXSxpPVsiYm9yZGVyTGVmdFdpZHRoIiwiYm9yZGVyUmlnaHRXaWR0aCIsInBhZGRpbmdMZWZ0IiwicGFkZGluZ1JpZ2h0Il0saj1hLmVmZmVjdHMuc2V0TW9kZShjLGIub3B0aW9ucy5tb2RlfHwiZWZmZWN0Iiksaz1iLm9wdGlvbnMucmVzdG9yZXx8ITEsbD1iLm9wdGlvbnMuc2NhbGV8fCJib3RoIixtPWIub3B0aW9ucy5vcmlnaW4sbj17aGVpZ2h0OmMuaGVpZ2h0KCksd2lkdGg6Yy53aWR0aCgpfTtjLmZyb209Yi5vcHRpb25zLmZyb218fG4sYy50bz1iLm9wdGlvbnMudG98fG47aWYobSl7dmFyIHA9YS5lZmZlY3RzLmdldEJhc2VsaW5lKG0sbik7Yy5mcm9tLnRvcD0obi5oZWlnaHQtYy5mcm9tLmhlaWdodCkqcC55LGMuZnJvbS5sZWZ0PShuLndpZHRoLWMuZnJvbS53aWR0aCkqcC54LGMudG8udG9wPShuLmhlaWdodC1jLnRvLmhlaWdodCkqcC55LGMudG8ubGVmdD0obi53aWR0aC1jLnRvLndpZHRoKSpwLnh9dmFyIHE9e2Zyb206e3k6Yy5mcm9tLmhlaWdodC9uLmhlaWdodCx4OmMuZnJvbS53aWR0aC9uLndpZHRofSx0bzp7eTpjLnRvLmhlaWdodC9uLmhlaWdodCx4OmMudG8ud2lkdGgvbi53aWR0aH19O2lmKGw9PSJib3gifHxsPT0iYm90aCIpcS5mcm9tLnkhPXEudG8ueSYmKGQ9ZC5jb25jYXQoaCksYy5mcm9tPWEuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGMsaCxxLmZyb20ueSxjLmZyb20pLGMudG89YS5lZmZlY3RzLnNldFRyYW5zaXRpb24oYyxoLHEudG8ueSxjLnRvKSkscS5mcm9tLnghPXEudG8ueCYmKGQ9ZC5jb25jYXQoaSksYy5mcm9tPWEuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGMsaSxxLmZyb20ueCxjLmZyb20pLGMudG89YS5lZmZlY3RzLnNldFRyYW5zaXRpb24oYyxpLHEudG8ueCxjLnRvKSk7KGw9PSJjb250ZW50Inx8bD09ImJvdGgiKSYmcS5mcm9tLnkhPXEudG8ueSYmKGQ9ZC5jb25jYXQoZyksYy5mcm9tPWEuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGMsZyxxLmZyb20ueSxjLmZyb20pLGMudG89YS5lZmZlY3RzLnNldFRyYW5zaXRpb24oYyxnLHEudG8ueSxjLnRvKSksYS5lZmZlY3RzLnNhdmUoYyxrP2Q6ZSksYy5zaG93KCksYS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoYyksYy5jc3MoIm92ZXJmbG93IiwiaGlkZGVuIikuY3NzKGMuZnJvbSk7aWYobD09ImNvbnRlbnQifHxsPT0iYm90aCIpaD1oLmNvbmNhdChbIm1hcmdpblRvcCIsIm1hcmdpbkJvdHRvbSJdKS5jb25jYXQoZyksaT1pLmNvbmNhdChbIm1hcmdpbkxlZnQiLCJtYXJnaW5SaWdodCJdKSxmPWQuY29uY2F0KGgpLmNvbmNhdChpKSxjLmZpbmQoIipbd2lkdGhdIikuZWFjaChmdW5jdGlvbigpe3ZhciBjPWEodGhpcyk7ayYmYS5lZmZlY3RzLnNhdmUoYyxmKTt2YXIgZD17aGVpZ2h0OmMuaGVpZ2h0KCksd2lkdGg6Yy53aWR0aCgpfTtjLmZyb209e2hlaWdodDpkLmhlaWdodCpxLmZyb20ueSx3aWR0aDpkLndpZHRoKnEuZnJvbS54fSxjLnRvPXtoZWlnaHQ6ZC5oZWlnaHQqcS50by55LHdpZHRoOmQud2lkdGgqcS50by54fSxxLmZyb20ueSE9cS50by55JiYoYy5mcm9tPWEuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGMsaCxxLmZyb20ueSxjLmZyb20pLGMudG89YS5lZmZlY3RzLnNldFRyYW5zaXRpb24oYyxoLHEudG8ueSxjLnRvKSkscS5mcm9tLnghPXEudG8ueCYmKGMuZnJvbT1hLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihjLGkscS5mcm9tLngsYy5mcm9tKSxjLnRvPWEuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGMsaSxxLnRvLngsYy50bykpLGMuY3NzKGMuZnJvbSksYy5hbmltYXRlKGMudG8sYi5kdXJhdGlvbixiLm9wdGlvbnMuZWFzaW5nLGZ1bmN0aW9uKCl7ayYmYS5lZmZlY3RzLnJlc3RvcmUoYyxmKX0pfSk7Yy5hbmltYXRlKGMudG8se3F1ZXVlOiExLGR1cmF0aW9uOmIuZHVyYXRpb24sZWFzaW5nOmIub3B0aW9ucy5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtjLnRvLm9wYWNpdHk9PT0wJiZjLmNzcygib3BhY2l0eSIsYy5mcm9tLm9wYWNpdHkpLGo9PSJoaWRlIiYmYy5oaWRlKCksYS5lZmZlY3RzLnJlc3RvcmUoYyxrP2Q6ZSksYS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoYyksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseSh0aGlzLGFyZ3VtZW50cyksYy5kZXF1ZXVlKCl9fSl9KX19KGpRdWVyeSksZnVuY3Rpb24oYSxiKXthLmVmZmVjdHMuc2hha2U9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCJdLGU9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8ImVmZmVjdCIpLGY9Yi5vcHRpb25zLmRpcmVjdGlvbnx8ImxlZnQiLGc9Yi5vcHRpb25zLmRpc3RhbmNlfHwyMCxoPWIub3B0aW9ucy50aW1lc3x8MyxpPWIuZHVyYXRpb258fGIub3B0aW9ucy5kdXJhdGlvbnx8MTQwO2EuZWZmZWN0cy5zYXZlKGMsZCksYy5zaG93KCksYS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoYyk7dmFyIGo9Zj09InVwInx8Zj09ImRvd24iPyJ0b3AiOiJsZWZ0IixrPWY9PSJ1cCJ8fGY9PSJsZWZ0Ij8icG9zIjoibmVnIixsPXt9LG09e30sbj17fTtsW2pdPShrPT0icG9zIj8iLT0iOiIrPSIpK2csbVtqXT0oaz09InBvcyI/Iis9IjoiLT0iKStnKjIsbltqXT0oaz09InBvcyI/Ii09IjoiKz0iKStnKjIsYy5hbmltYXRlKGwsaSxiLm9wdGlvbnMuZWFzaW5nKTtmb3IodmFyIHA9MTtwPGg7cCsrKWMuYW5pbWF0ZShtLGksYi5vcHRpb25zLmVhc2luZykuYW5pbWF0ZShuLGksYi5vcHRpb25zLmVhc2luZyk7Yy5hbmltYXRlKG0saSxiLm9wdGlvbnMuZWFzaW5nKS5hbmltYXRlKGwsaS8yLGIub3B0aW9ucy5lYXNpbmcsZnVuY3Rpb24oKXthLmVmZmVjdHMucmVzdG9yZShjLGQpLGEuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKGMpLGIuY2FsbGJhY2smJmIuY2FsbGJhY2suYXBwbHkodGhpcyxhcmd1bWVudHMpfSksYy5xdWV1ZSgiZngiLGZ1bmN0aW9uKCl7Yy5kZXF1ZXVlKCl9KSxjLmRlcXVldWUoKX0pfX0oalF1ZXJ5KSxmdW5jdGlvbihhLGIpe2EuZWZmZWN0cy5zbGlkZT1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZD1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0Il0sZT1hLmVmZmVjdHMuc2V0TW9kZShjLGIub3B0aW9ucy5tb2RlfHwic2hvdyIpLGY9Yi5vcHRpb25zLmRpcmVjdGlvbnx8ImxlZnQiO2EuZWZmZWN0cy5zYXZlKGMsZCksYy5zaG93KCksYS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoYykuY3NzKHtvdmVyZmxvdzoiaGlkZGVuIn0pO3ZhciBnPWY9PSJ1cCJ8fGY9PSJkb3duIj8idG9wIjoibGVmdCIsaD1mPT0idXAifHxmPT0ibGVmdCI/InBvcyI6Im5lZyIsaT1iLm9wdGlvbnMuZGlzdGFuY2V8fChnPT0idG9wIj9jLm91dGVySGVpZ2h0KCEwKTpjLm91dGVyV2lkdGgoITApKTtlPT0ic2hvdyImJmMuY3NzKGcsaD09InBvcyI/aXNOYU4oaSk/Ii0iK2k6LWk6aSk7dmFyIGo9e307altnXT0oZT09InNob3ciP2g9PSJwb3MiPyIrPSI6Ii09IjpoPT0icG9zIj8iLT0iOiIrPSIpK2ksYy5hbmltYXRlKGose3F1ZXVlOiExLGR1cmF0aW9uOmIuZHVyYXRpb24sZWFzaW5nOmIub3B0aW9ucy5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtlPT0iaGlkZSImJmMuaGlkZSgpLGEuZWZmZWN0cy5yZXN0b3JlKGMsZCksYS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoYyksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseSh0aGlzLGFyZ3VtZW50cyksYy5kZXF1ZXVlKCl9fSl9KX19KGpRdWVyeSksZnVuY3Rpb24oYSxiKXthLmVmZmVjdHMudHJhbnNmZXI9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9YShiLm9wdGlvbnMudG8pLGU9ZC5vZmZzZXQoKSxmPXt0b3A6ZS50b3AsbGVmdDplLmxlZnQsaGVpZ2h0OmQuaW5uZXJIZWlnaHQoKSx3aWR0aDpkLmlubmVyV2lkdGgoKX0sZz1jLm9mZnNldCgpLGg9YSgnPGRpdiBjbGFzcz0idWktZWZmZWN0cy10cmFuc2ZlciI+PC9kaXY+JykuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSkuYWRkQ2xhc3MoYi5vcHRpb25zLmNsYXNzTmFtZSkuY3NzKHt0b3A6Zy50b3AsbGVmdDpnLmxlZnQsaGVpZ2h0OmMuaW5uZXJIZWlnaHQoKSx3aWR0aDpjLmlubmVyV2lkdGgoKSxwb3NpdGlvbjoiYWJzb2x1dGUifSkuYW5pbWF0ZShmLGIuZHVyYXRpb24sYi5vcHRpb25zLmVhc2luZyxmdW5jdGlvbigpe2gucmVtb3ZlKCksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseShjWzBdLGFyZ3VtZW50cyksYy5kZXF1ZXVlKCl9KX0pfX0oalF1ZXJ5KSxmdW5jdGlvbihhLGIpe2Eud2lkZ2V0KCJ1aS5hY2NvcmRpb24iLHtvcHRpb25zOnthY3RpdmU6MCxhbmltYXRlZDoic2xpZGUiLGF1dG9IZWlnaHQ6ITAsY2xlYXJTdHlsZTohMSxjb2xsYXBzaWJsZTohMSxldmVudDoiY2xpY2siLGZpbGxTcGFjZTohMSxoZWFkZXI6Ij4gbGkgPiA6Zmlyc3QtY2hpbGQsPiA6bm90KGxpKTpldmVuIixpY29uczp7aGVhZGVyOiJ1aS1pY29uLXRyaWFuZ2xlLTEtZSIsaGVhZGVyU2VsZWN0ZWQ6InVpLWljb24tdHJpYW5nbGUtMS1zIn0sbmF2aWdhdGlvbjohMSxuYXZpZ2F0aW9uRmlsdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaHJlZi50b0xvd2VyQ2FzZSgpPT09bG9jYXRpb24uaHJlZi50b0xvd2VyQ2FzZSgpfX0sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMsYz1iLm9wdGlvbnM7Yi5ydW5uaW5nPTAsYi5lbGVtZW50LmFkZENsYXNzKCJ1aS1hY2NvcmRpb24gdWktd2lkZ2V0IHVpLWhlbHBlci1yZXNldCIpLmNoaWxkcmVuKCJsaSIpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24tbGktZml4IiksYi5oZWFkZXJzPWIuZWxlbWVudC5maW5kKGMuaGVhZGVyKS5hZGRDbGFzcygidWktYWNjb3JkaW9uLWhlYWRlciB1aS1oZWxwZXItcmVzZXQgdWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIikuYmluZCgibW91c2VlbnRlci5hY2NvcmRpb24iLGZ1bmN0aW9uKCl7aWYoYy5kaXNhYmxlZClyZXR1cm47YSh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtaG92ZXIiKX0pLmJpbmQoIm1vdXNlbGVhdmUuYWNjb3JkaW9uIixmdW5jdGlvbigpe2lmKGMuZGlzYWJsZWQpcmV0dXJuO2EodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIil9KS5iaW5kKCJmb2N1cy5hY2NvcmRpb24iLGZ1bmN0aW9uKCl7aWYoYy5kaXNhYmxlZClyZXR1cm47YSh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtZm9jdXMiKX0pLmJpbmQoImJsdXIuYWNjb3JkaW9uIixmdW5jdGlvbigpe2lmKGMuZGlzYWJsZWQpcmV0dXJuO2EodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWZvY3VzIil9KSxiLmhlYWRlcnMubmV4dCgpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24tY29udGVudCB1aS1oZWxwZXItcmVzZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSIpO2lmKGMubmF2aWdhdGlvbil7dmFyIGQ9Yi5lbGVtZW50LmZpbmQoImEiKS5maWx0ZXIoYy5uYXZpZ2F0aW9uRmlsdGVyKS5lcSgwKTtpZihkLmxlbmd0aCl7dmFyIGU9ZC5jbG9zZXN0KCIudWktYWNjb3JkaW9uLWhlYWRlciIpO2UubGVuZ3RoP2IuYWN0aXZlPWU6Yi5hY3RpdmU9ZC5jbG9zZXN0KCIudWktYWNjb3JkaW9uLWNvbnRlbnQiKS5wcmV2KCl9fWIuYWN0aXZlPWIuX2ZpbmRBY3RpdmUoYi5hY3RpdmV8fGMuYWN0aXZlKS5hZGRDbGFzcygidWktc3RhdGUtZGVmYXVsdCB1aS1zdGF0ZS1hY3RpdmUiKS50b2dnbGVDbGFzcygidWktY29ybmVyLWFsbCIpLnRvZ2dsZUNsYXNzKCJ1aS1jb3JuZXItdG9wIiksYi5hY3RpdmUubmV4dCgpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24tY29udGVudC1hY3RpdmUiKSxiLl9jcmVhdGVJY29ucygpLGIucmVzaXplKCksYi5lbGVtZW50LmF0dHIoInJvbGUiLCJ0YWJsaXN0IiksYi5oZWFkZXJzLmF0dHIoInJvbGUiLCJ0YWIiKS5iaW5kKCJrZXlkb3duLmFjY29yZGlvbiIsZnVuY3Rpb24oYSl7cmV0dXJuIGIuX2tleWRvd24oYSl9KS5uZXh0KCkuYXR0cigicm9sZSIsInRhYnBhbmVsIiksYi5oZWFkZXJzLm5vdChiLmFjdGl2ZXx8IiIpLmF0dHIoeyJhcmlhLWV4cGFuZGVkIjoiZmFsc2UiLCJhcmlhLXNlbGVjdGVkIjoiZmFsc2UiLHRhYkluZGV4Oi0xfSkubmV4dCgpLmhpZGUoKSxiLmFjdGl2ZS5sZW5ndGg/Yi5hY3RpdmUuYXR0cih7ImFyaWEtZXhwYW5kZWQiOiJ0cnVlIiwiYXJpYS1zZWxlY3RlZCI6InRydWUiLHRhYkluZGV4OjB9KTpiLmhlYWRlcnMuZXEoMCkuYXR0cigidGFiSW5kZXgiLDApLGEuYnJvd3Nlci5zYWZhcml8fGIuaGVhZGVycy5maW5kKCJhIikuYXR0cigidGFiSW5kZXgiLC0xKSxjLmV2ZW50JiZiLmhlYWRlcnMuYmluZChjLmV2ZW50LnNwbGl0KCIgIikuam9pbigiLmFjY29yZGlvbiAiKSsiLmFjY29yZGlvbiIsZnVuY3Rpb24oYSl7Yi5fY2xpY2tIYW5kbGVyLmNhbGwoYixhLHRoaXMpLGEucHJldmVudERlZmF1bHQoKX0pfSxfY3JlYXRlSWNvbnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9wdGlvbnM7Yi5pY29ucyYmKGEoIjxzcGFuPjwvc3Bhbj4iKS5hZGRDbGFzcygidWktaWNvbiAiK2IuaWNvbnMuaGVhZGVyKS5wcmVwZW5kVG8odGhpcy5oZWFkZXJzKSx0aGlzLmFjdGl2ZS5jaGlsZHJlbigiLnVpLWljb24iKS50b2dnbGVDbGFzcyhiLmljb25zLmhlYWRlcikudG9nZ2xlQ2xhc3MoYi5pY29ucy5oZWFkZXJTZWxlY3RlZCksdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1hY2NvcmRpb24taWNvbnMiKSl9LF9kZXN0cm95SWNvbnM6ZnVuY3Rpb24oKXt0aGlzLmhlYWRlcnMuY2hpbGRyZW4oIi51aS1pY29uIikucmVtb3ZlKCksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1hY2NvcmRpb24taWNvbnMiKX0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3B0aW9uczt0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLWFjY29yZGlvbiB1aS13aWRnZXQgdWktaGVscGVyLXJlc2V0IikucmVtb3ZlQXR0cigicm9sZSIpLHRoaXMuaGVhZGVycy51bmJpbmQoIi5hY2NvcmRpb24iKS5yZW1vdmVDbGFzcygidWktYWNjb3JkaW9uLWhlYWRlciB1aS1hY2NvcmRpb24tZGlzYWJsZWQgdWktaGVscGVyLXJlc2V0IHVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCB1aS1zdGF0ZS1hY3RpdmUgdWktc3RhdGUtZGlzYWJsZWQgdWktY29ybmVyLXRvcCIpLnJlbW92ZUF0dHIoInJvbGUiKS5yZW1vdmVBdHRyKCJhcmlhLWV4cGFuZGVkIikucmVtb3ZlQXR0cigiYXJpYS1zZWxlY3RlZCIpLnJlbW92ZUF0dHIoInRhYkluZGV4IiksdGhpcy5oZWFkZXJzLmZpbmQoImEiKS5yZW1vdmVBdHRyKCJ0YWJJbmRleCIpLHRoaXMuX2Rlc3Ryb3lJY29ucygpO3ZhciBjPXRoaXMuaGVhZGVycy5uZXh0KCkuY3NzKCJkaXNwbGF5IiwiIikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUNsYXNzKCJ1aS1oZWxwZXItcmVzZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSB1aS1hY2NvcmRpb24tY29udGVudCB1aS1hY2NvcmRpb24tY29udGVudC1hY3RpdmUgdWktYWNjb3JkaW9uLWRpc2FibGVkIHVpLXN0YXRlLWRpc2FibGVkIik7cmV0dXJuKGIuYXV0b0hlaWdodHx8Yi5maWxsSGVpZ2h0KSYmYy5jc3MoImhlaWdodCIsIiIpLGEuV2lkZ2V0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyl9LF9zZXRPcHRpb246ZnVuY3Rpb24oYixjKXthLldpZGdldC5wcm90b3R5cGUuX3NldE9wdGlvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyksYj09ImFjdGl2ZSImJnRoaXMuYWN0aXZhdGUoYyksYj09Imljb25zIiYmKHRoaXMuX2Rlc3Ryb3lJY29ucygpLGMmJnRoaXMuX2NyZWF0ZUljb25zKCkpLGI9PSJkaXNhYmxlZCImJnRoaXMuaGVhZGVycy5hZGQodGhpcy5oZWFkZXJzLm5leHQoKSlbYz8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFzcyJdKCJ1aS1hY2NvcmRpb24tZGlzYWJsZWQgdWktc3RhdGUtZGlzYWJsZWQiKX0sX2tleWRvd246ZnVuY3Rpb24oYil7aWYodGhpcy5vcHRpb25zLmRpc2FibGVkfHxiLmFsdEtleXx8Yi5jdHJsS2V5KXJldHVybjt2YXIgYz1hLnVpLmtleUNvZGUsZD10aGlzLmhlYWRlcnMubGVuZ3RoLGU9dGhpcy5oZWFkZXJzLmluZGV4KGIudGFyZ2V0KSxmPSExO3N3aXRjaChiLmtleUNvZGUpe2Nhc2UgYy5SSUdIVDpjYXNlIGMuRE9XTjpmPXRoaXMuaGVhZGVyc1soZSsxKSVkXTticmVhaztjYXNlIGMuTEVGVDpjYXNlIGMuVVA6Zj10aGlzLmhlYWRlcnNbKGUtMStkKSVkXTticmVhaztjYXNlIGMuU1BBQ0U6Y2FzZSBjLkVOVEVSOnRoaXMuX2NsaWNrSGFuZGxlcih7dGFyZ2V0OmIudGFyZ2V0fSxiLnRhcmdldCksYi5wcmV2ZW50RGVmYXVsdCgpfXJldHVybiBmPyhhKGIudGFyZ2V0KS5hdHRyKCJ0YWJJbmRleCIsLTEpLGEoZikuYXR0cigidGFiSW5kZXgiLDApLGYuZm9jdXMoKSwhMSk6ITB9LHJlc2l6ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3B0aW9ucyxjO2lmKGIuZmlsbFNwYWNlKXtpZihhLmJyb3dzZXIubXNpZSl7dmFyIGQ9dGhpcy5lbGVtZW50LnBhcmVudCgpLmNzcygib3ZlcmZsb3ciKTt0aGlzLmVsZW1lbnQucGFyZW50KCkuY3NzKCJvdmVyZmxvdyIsImhpZGRlbiIpfWM9dGhpcy5lbGVtZW50LnBhcmVudCgpLmhlaWdodCgpLGEuYnJvd3Nlci5tc2llJiZ0aGlzLmVsZW1lbnQucGFyZW50KCkuY3NzKCJvdmVyZmxvdyIsZCksdGhpcy5oZWFkZXJzLmVhY2goZnVuY3Rpb24oKXtjLT1hKHRoaXMpLm91dGVySGVpZ2h0KCEwKX0pLHRoaXMuaGVhZGVycy5uZXh0KCkuZWFjaChmdW5jdGlvbigpe2EodGhpcykuaGVpZ2h0KE1hdGgubWF4KDAsYy1hKHRoaXMpLmlubmVySGVpZ2h0KCkrYSh0aGlzKS5oZWlnaHQoKSkpfSkuY3NzKCJvdmVyZmxvdyIsImF1dG8iKX1lbHNlIGIuYXV0b0hlaWdodCYmKGM9MCx0aGlzLmhlYWRlcnMubmV4dCgpLmVhY2goZnVuY3Rpb24oKXtjPU1hdGgubWF4KGMsYSh0aGlzKS5oZWlnaHQoIiIpLmhlaWdodCgpKX0pLmhlaWdodChjKSk7cmV0dXJuIHRoaXN9LGFjdGl2YXRlOmZ1bmN0aW9uKGEpe3RoaXMub3B0aW9ucy5hY3RpdmU9YTt2YXIgYj10aGlzLl9maW5kQWN0aXZlKGEpWzBdO3JldHVybiB0aGlzLl9jbGlja0hhbmRsZXIoe3RhcmdldDpifSxiKSx0aGlzfSxfZmluZEFjdGl2ZTpmdW5jdGlvbihiKXtyZXR1cm4gYj90eXBlb2YgYj09Im51bWJlciI/dGhpcy5oZWFkZXJzLmZpbHRlcigiOmVxKCIrYisiKSIpOnRoaXMuaGVhZGVycy5ub3QodGhpcy5oZWFkZXJzLm5vdChiKSk6Yj09PSExP2EoW10pOnRoaXMuaGVhZGVycy5maWx0ZXIoIjplcSgwKSIpfSxfY2xpY2tIYW5kbGVyOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9dGhpcy5vcHRpb25zO2lmKGQuZGlzYWJsZWQpcmV0dXJuO2lmKCFiLnRhcmdldCl7aWYoIWQuY29sbGFwc2libGUpcmV0dXJuO3RoaXMuYWN0aXZlLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUgdWktY29ybmVyLXRvcCIpLmFkZENsYXNzKCJ1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiKS5jaGlsZHJlbigiLnVpLWljb24iKS5yZW1vdmVDbGFzcyhkLmljb25zLmhlYWRlclNlbGVjdGVkKS5hZGRDbGFzcyhkLmljb25zLmhlYWRlciksdGhpcy5hY3RpdmUubmV4dCgpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24tY29udGVudC1hY3RpdmUiKTt2YXIgZT10aGlzLmFjdGl2ZS5uZXh0KCksZj17b3B0aW9uczpkLG5ld0hlYWRlcjphKFtdKSxvbGRIZWFkZXI6ZC5hY3RpdmUsbmV3Q29udGVudDphKFtdKSxvbGRDb250ZW50OmV9LGc9dGhpcy5hY3RpdmU9YShbXSk7dGhpcy5fdG9nZ2xlKGcsZSxmKTtyZXR1cm59dmFyIGg9YShiLmN1cnJlbnRUYXJnZXR8fGMpLGk9aFswXT09PXRoaXMuYWN0aXZlWzBdO2QuYWN0aXZlPWQuY29sbGFwc2libGUmJmk/ITE6dGhpcy5oZWFkZXJzLmluZGV4KGgpO2lmKHRoaXMucnVubmluZ3x8IWQuY29sbGFwc2libGUmJmkpcmV0dXJuO3ZhciBqPXRoaXMuYWN0aXZlLGc9aC5uZXh0KCksZT10aGlzLmFjdGl2ZS5uZXh0KCksZj17b3B0aW9uczpkLG5ld0hlYWRlcjppJiZkLmNvbGxhcHNpYmxlP2EoW10pOmgsb2xkSGVhZGVyOnRoaXMuYWN0aXZlLG5ld0NvbnRlbnQ6aSYmZC5jb2xsYXBzaWJsZT9hKFtdKTpnLG9sZENvbnRlbnQ6ZX0saz10aGlzLmhlYWRlcnMuaW5kZXgodGhpcy5hY3RpdmVbMF0pPnRoaXMuaGVhZGVycy5pbmRleChoWzBdKTt0aGlzLmFjdGl2ZT1pP2EoW10pOmgsdGhpcy5fdG9nZ2xlKGcsZSxmLGksayksai5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIHVpLWNvcm5lci10b3AiKS5hZGRDbGFzcygidWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIikuY2hpbGRyZW4oIi51aS1pY29uIikucmVtb3ZlQ2xhc3MoZC5pY29ucy5oZWFkZXJTZWxlY3RlZCkuYWRkQ2xhc3MoZC5pY29ucy5oZWFkZXIpLGl8fChoLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiKS5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIHVpLWNvcm5lci10b3AiKS5jaGlsZHJlbigiLnVpLWljb24iKS5yZW1vdmVDbGFzcyhkLmljb25zLmhlYWRlcikuYWRkQ2xhc3MoZC5pY29ucy5oZWFkZXJTZWxlY3RlZCksaC5uZXh0KCkuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1jb250ZW50LWFjdGl2ZSIpKTtyZXR1cm59LF90b2dnbGU6ZnVuY3Rpb24oYixjLGQsZSxmKXt2YXIgZz10aGlzLGg9Zy5vcHRpb25zO2cudG9TaG93PWIsZy50b0hpZGU9YyxnLmRhdGE9ZDt2YXIgaT1mdW5jdGlvbigpe2lmKCFnKXJldHVybjtyZXR1cm4gZy5fY29tcGxldGVkLmFwcGx5KGcsYXJndW1lbnRzKX07Zy5fdHJpZ2dlcigiY2hhbmdlc3RhcnQiLG51bGwsZy5kYXRhKSxnLnJ1bm5pbmc9Yy5zaXplKCk9PT0wP2Iuc2l6ZSgpOmMuc2l6ZSgpO2lmKGguYW5pbWF0ZWQpe3ZhciBqPXt9O2guY29sbGFwc2libGUmJmU/aj17dG9TaG93OmEoW10pLHRvSGlkZTpjLGNvbXBsZXRlOmksZG93bjpmLGF1dG9IZWlnaHQ6aC5hdXRvSGVpZ2h0fHxoLmZpbGxTcGFjZX06aj17dG9TaG93OmIsdG9IaWRlOmMsY29tcGxldGU6aSxkb3duOmYsYXV0b0hlaWdodDpoLmF1dG9IZWlnaHR8fGguZmlsbFNwYWNlfSxoLnByb3hpZWR8fChoLnByb3hpZWQ9aC5hbmltYXRlZCksaC5wcm94aWVkRHVyYXRpb258fChoLnByb3hpZWREdXJhdGlvbj1oLmR1cmF0aW9uKSxoLmFuaW1hdGVkPWEuaXNGdW5jdGlvbihoLnByb3hpZWQpP2gucHJveGllZChqKTpoLnByb3hpZWQsaC5kdXJhdGlvbj1hLmlzRnVuY3Rpb24oaC5wcm94aWVkRHVyYXRpb24pP2gucHJveGllZER1cmF0aW9uKGopOmgucHJveGllZER1cmF0aW9uO3ZhciBrPWEudWkuYWNjb3JkaW9uLmFuaW1hdGlvbnMsbD1oLmR1cmF0aW9uLG09aC5hbmltYXRlZDttJiYha1ttXSYmIWEuZWFzaW5nW21dJiYobT0ic2xpZGUiKSxrW21dfHwoa1ttXT1mdW5jdGlvbihhKXt0aGlzLnNsaWRlKGEse2Vhc2luZzptLGR1cmF0aW9uOmx8fDcwMH0pfSksa1ttXShqKX1lbHNlIGguY29sbGFwc2libGUmJmU/Yi50b2dnbGUoKTooYy5oaWRlKCksYi5zaG93KCkpLGkoITApO2MucHJldigpLmF0dHIoeyJhcmlhLWV4cGFuZGVkIjoiZmFsc2UiLCJhcmlhLXNlbGVjdGVkIjoiZmFsc2UiLHRhYkluZGV4Oi0xfSkuYmx1cigpLGIucHJldigpLmF0dHIoeyJhcmlhLWV4cGFuZGVkIjoidHJ1ZSIsImFyaWEtc2VsZWN0ZWQiOiJ0cnVlIix0YWJJbmRleDowfSkuZm9jdXMoKX0sX2NvbXBsZXRlZDpmdW5jdGlvbihhKXt0aGlzLnJ1bm5pbmc9YT8wOi0tdGhpcy5ydW5uaW5nO2lmKHRoaXMucnVubmluZylyZXR1cm47dGhpcy5vcHRpb25zLmNsZWFyU3R5bGUmJnRoaXMudG9TaG93LmFkZCh0aGlzLnRvSGlkZSkuY3NzKHtoZWlnaHQ6IiIsb3ZlcmZsb3c6IiJ9KSx0aGlzLnRvSGlkZS5yZW1vdmVDbGFzcygidWktYWNjb3JkaW9uLWNvbnRlbnQtYWN0aXZlIiksdGhpcy50b0hpZGUubGVuZ3RoJiYodGhpcy50b0hpZGUucGFyZW50KClbMF0uY2xhc3NOYW1lPXRoaXMudG9IaWRlLnBhcmVudCgpWzBdLmNsYXNzTmFtZSksdGhpcy5fdHJpZ2dlcigiY2hhbmdlIixudWxsLHRoaXMuZGF0YSl9fSksYS5leHRlbmQoYS51aS5hY2NvcmRpb24se3ZlcnNpb246IjEuOC4yNCIsYW5pbWF0aW9uczp7c2xpZGU6ZnVuY3Rpb24oYixjKXtiPWEuZXh0ZW5kKHtlYXNpbmc6InN3aW5nIixkdXJhdGlvbjozMDB9LGIsYyk7aWYoIWIudG9IaWRlLnNpemUoKSl7Yi50b1Nob3cuYW5pbWF0ZSh7aGVpZ2h0OiJzaG93IixwYWRkaW5nVG9wOiJzaG93IixwYWRkaW5nQm90dG9tOiJzaG93In0sYik7cmV0dXJufWlmKCFiLnRvU2hvdy5zaXplKCkpe2IudG9IaWRlLmFuaW1hdGUoe2hlaWdodDoiaGlkZSIscGFkZGluZ1RvcDoiaGlkZSIscGFkZGluZ0JvdHRvbToiaGlkZSJ9LGIpO3JldHVybn12YXIgZD1iLnRvU2hvdy5jc3MoIm92ZXJmbG93IiksZT0wLGY9e30sZz17fSxoPVsiaGVpZ2h0IiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iXSxpLGo9Yi50b1Nob3c7aT1qWzBdLnN0eWxlLndpZHRoLGoud2lkdGgoai5wYXJlbnQoKS53aWR0aCgpLXBhcnNlRmxvYXQoai5jc3MoInBhZGRpbmdMZWZ0IikpLXBhcnNlRmxvYXQoai5jc3MoInBhZGRpbmdSaWdodCIpKS0ocGFyc2VGbG9hdChqLmNzcygiYm9yZGVyTGVmdFdpZHRoIikpfHwwKS0ocGFyc2VGbG9hdChqLmNzcygiYm9yZGVyUmlnaHRXaWR0aCIpKXx8MCkpLGEuZWFjaChoLGZ1bmN0aW9uKGMsZCl7Z1tkXT0iaGlkZSI7dmFyIGU9KCIiK2EuY3NzKGIudG9TaG93WzBdLGQpKS5tYXRjaCgvXihbXGQrLS5dKykoLiopJC8pO2ZbZF09e3ZhbHVlOmVbMV0sdW5pdDplWzJdfHwicHgifX0pLGIudG9TaG93LmNzcyh7aGVpZ2h0OjAsb3ZlcmZsb3c6ImhpZGRlbiJ9KS5zaG93KCksYi50b0hpZGUuZmlsdGVyKCI6aGlkZGVuIikuZWFjaChiLmNvbXBsZXRlKS5lbmQoKS5maWx0ZXIoIjp2aXNpYmxlIikuYW5pbWF0ZShnLHtzdGVwOmZ1bmN0aW9uKGEsYyl7Yy5wcm9wPT0iaGVpZ2h0IiYmKGU9Yy5lbmQtYy5zdGFydD09PTA/MDooYy5ub3ctYy5zdGFydCkvKGMuZW5kLWMuc3RhcnQpKSxiLnRvU2hvd1swXS5zdHlsZVtjLnByb3BdPWUqZltjLnByb3BdLnZhbHVlK2ZbYy5wcm9wXS51bml0fSxkdXJhdGlvbjpiLmR1cmF0aW9uLGVhc2luZzpiLmVhc2luZyxjb21wbGV0ZTpmdW5jdGlvbigpe2IuYXV0b0hlaWdodHx8Yi50b1Nob3cuY3NzKCJoZWlnaHQiLCIiKSxiLnRvU2hvdy5jc3Moe3dpZHRoOmksb3ZlcmZsb3c6ZH0pLGIuY29tcGxldGUoKX19KX0sYm91bmNlc2xpZGU6ZnVuY3Rpb24oYSl7dGhpcy5zbGlkZShhLHtlYXNpbmc6YS5kb3duPyJlYXNlT3V0Qm91bmNlIjoic3dpbmciLGR1cmF0aW9uOmEuZG93bj8xZTM6MjAwfSl9fX0pfShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7dmFyIGM9MDthLndpZGdldCgidWkuYXV0b2NvbXBsZXRlIix7b3B0aW9uczp7YXBwZW5kVG86ImJvZHkiLGF1dG9Gb2N1czohMSxkZWxheTozMDAsbWluTGVuZ3RoOjEscG9zaXRpb246e215OiJsZWZ0IHRvcCIsYXQ6ImxlZnQgYm90dG9tIixjb2xsaXNpb246Im5vbmUifSxzb3VyY2U6bnVsbH0scGVuZGluZzowLF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLGM9dGhpcy5lbGVtZW50WzBdLm93bmVyRG9jdW1lbnQsZDt0aGlzLmlzTXVsdGlMaW5lPXRoaXMuZWxlbWVudC5pcygidGV4dGFyZWEiKSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWF1dG9jb21wbGV0ZS1pbnB1dCIpLmF0dHIoImF1dG9jb21wbGV0ZSIsIm9mZiIpLmF0dHIoe3JvbGU6InRleHRib3giLCJhcmlhLWF1dG9jb21wbGV0ZSI6Imxpc3QiLCJhcmlhLWhhc3BvcHVwIjoidHJ1ZSJ9KS5iaW5kKCJrZXlkb3duLmF1dG9jb21wbGV0ZSIsZnVuY3Rpb24oYyl7aWYoYi5vcHRpb25zLmRpc2FibGVkfHxiLmVsZW1lbnQucHJvcEF0dHIoInJlYWRPbmx5IikpcmV0dXJuO2Q9ITE7dmFyIGU9YS51aS5rZXlDb2RlO3N3aXRjaChjLmtleUNvZGUpe2Nhc2UgZS5QQUdFX1VQOmIuX21vdmUoInByZXZpb3VzUGFnZSIsYyk7YnJlYWs7Y2FzZSBlLlBBR0VfRE9XTjpiLl9tb3ZlKCJuZXh0UGFnZSIsYyk7YnJlYWs7Y2FzZSBlLlVQOmIuX2tleUV2ZW50KCJwcmV2aW91cyIsYyk7YnJlYWs7Y2FzZSBlLkRPV046Yi5fa2V5RXZlbnQoIm5leHQiLGMpO2JyZWFrO2Nhc2UgZS5FTlRFUjpjYXNlIGUuTlVNUEFEX0VOVEVSOmIubWVudS5hY3RpdmUmJihkPSEwLGMucHJldmVudERlZmF1bHQoKSk7Y2FzZSBlLlRBQjppZighYi5tZW51LmFjdGl2ZSlyZXR1cm47Yi5tZW51LnNlbGVjdChjKTticmVhaztjYXNlIGUuRVNDQVBFOmIuZWxlbWVudC52YWwoYi50ZXJtKSxiLmNsb3NlKGMpO2JyZWFrO2RlZmF1bHQ6Y2xlYXJUaW1lb3V0KGIuc2VhcmNoaW5nKSxiLnNlYXJjaGluZz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yi50ZXJtIT1iLmVsZW1lbnQudmFsKCkmJihiLnNlbGVjdGVkSXRlbT1udWxsLGIuc2VhcmNoKG51bGwsYykpfSxiLm9wdGlvbnMuZGVsYXkpfX0pLmJpbmQoImtleXByZXNzLmF1dG9jb21wbGV0ZSIsZnVuY3Rpb24oYSl7ZCYmKGQ9ITEsYS5wcmV2ZW50RGVmYXVsdCgpKX0pLmJpbmQoImZvY3VzLmF1dG9jb21wbGV0ZSIsZnVuY3Rpb24oKXtpZihiLm9wdGlvbnMuZGlzYWJsZWQpcmV0dXJuO2Iuc2VsZWN0ZWRJdGVtPW51bGwsYi5wcmV2aW91cz1iLmVsZW1lbnQudmFsKCl9KS5iaW5kKCJibHVyLmF1dG9jb21wbGV0ZSIsZnVuY3Rpb24oYSl7aWYoYi5vcHRpb25zLmRpc2FibGVkKXJldHVybjtjbGVhclRpbWVvdXQoYi5zZWFyY2hpbmcpLGIuY2xvc2luZz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yi5jbG9zZShhKSxiLl9jaGFuZ2UoYSl9LDE1MCl9KSx0aGlzLl9pbml0U291cmNlKCksdGhpcy5tZW51PWEoIjx1bD48L3VsPiIpLmFkZENsYXNzKCJ1aS1hdXRvY29tcGxldGUiKS5hcHBlbmRUbyhhKHRoaXMub3B0aW9ucy5hcHBlbmRUb3x8ImJvZHkiLGMpWzBdKS5tb3VzZWRvd24oZnVuY3Rpb24oYyl7dmFyIGQ9Yi5tZW51LmVsZW1lbnRbMF07YShjLnRhcmdldCkuY2xvc2VzdCgiLnVpLW1lbnUtaXRlbSIpLmxlbmd0aHx8c2V0VGltZW91dChmdW5jdGlvbigpe2EoZG9jdW1lbnQpLm9uZSgibW91c2Vkb3duIixmdW5jdGlvbihjKXtjLnRhcmdldCE9PWIuZWxlbWVudFswXSYmYy50YXJnZXQhPT1kJiYhYS51aS5jb250YWlucyhkLGMudGFyZ2V0KSYmYi5jbG9zZSgpfSl9LDEpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoYi5jbG9zaW5nKX0sMTMpfSkubWVudSh7Zm9jdXM6ZnVuY3Rpb24oYSxjKXt2YXIgZD1jLml0ZW0uZGF0YSgiaXRlbS5hdXRvY29tcGxldGUiKTshMSE9PWIuX3RyaWdnZXIoImZvY3VzIixhLHtpdGVtOmR9KSYmL15rZXkvLnRlc3QoYS5vcmlnaW5hbEV2ZW50LnR5cGUpJiZiLmVsZW1lbnQudmFsKGQudmFsdWUpfSxzZWxlY3RlZDpmdW5jdGlvbihhLGQpe3ZhciBlPWQuaXRlbS5kYXRhKCJpdGVtLmF1dG9jb21wbGV0ZSIpLGY9Yi5wcmV2aW91cztiLmVsZW1lbnRbMF0hPT1jLmFjdGl2ZUVsZW1lbnQmJihiLmVsZW1lbnQuZm9jdXMoKSxiLnByZXZpb3VzPWYsc2V0VGltZW91dChmdW5jdGlvbigpe2IucHJldmlvdXM9ZixiLnNlbGVjdGVkSXRlbT1lfSwxKSksITEhPT1iLl90cmlnZ2VyKCJzZWxlY3QiLGEse2l0ZW06ZX0pJiZiLmVsZW1lbnQudmFsKGUudmFsdWUpLGIudGVybT1iLmVsZW1lbnQudmFsKCksYi5jbG9zZShhKSxiLnNlbGVjdGVkSXRlbT1lfSxibHVyOmZ1bmN0aW9uKGEsYyl7Yi5tZW51LmVsZW1lbnQuaXMoIjp2aXNpYmxlIikmJmIuZWxlbWVudC52YWwoKSE9PWIudGVybSYmYi5lbGVtZW50LnZhbChiLnRlcm0pfX0pLnpJbmRleCh0aGlzLmVsZW1lbnQuekluZGV4KCkrMSkuY3NzKHt0b3A6MCxsZWZ0OjB9KS5oaWRlKCkuZGF0YSgibWVudSIpLGEuZm4uYmdpZnJhbWUmJnRoaXMubWVudS5lbGVtZW50LmJnaWZyYW1lKCksYi5iZWZvcmV1bmxvYWRIYW5kbGVyPWZ1bmN0aW9uKCl7Yi5lbGVtZW50LnJlbW92ZUF0dHIoImF1dG9jb21wbGV0ZSIpfSxhKHdpbmRvdykuYmluZCgiYmVmb3JldW5sb2FkIixiLmJlZm9yZXVubG9hZEhhbmRsZXIpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1hdXRvY29tcGxldGUtaW5wdXQiKS5yZW1vdmVBdHRyKCJhdXRvY29tcGxldGUiKS5yZW1vdmVBdHRyKCJyb2xlIikucmVtb3ZlQXR0cigiYXJpYS1hdXRvY29tcGxldGUiKS5yZW1vdmVBdHRyKCJhcmlhLWhhc3BvcHVwIiksdGhpcy5tZW51LmVsZW1lbnQucmVtb3ZlKCksYSh3aW5kb3cpLnVuYmluZCgiYmVmb3JldW5sb2FkIix0aGlzLmJlZm9yZXVubG9hZEhhbmRsZXIpLGEuV2lkZ2V0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyl9LF9zZXRPcHRpb246ZnVuY3Rpb24oYixjKXthLldpZGdldC5wcm90b3R5cGUuX3NldE9wdGlvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyksYj09PSJzb3VyY2UiJiZ0aGlzLl9pbml0U291cmNlKCksYj09PSJhcHBlbmRUbyImJnRoaXMubWVudS5lbGVtZW50LmFwcGVuZFRvKGEoY3x8ImJvZHkiLHRoaXMuZWxlbWVudFswXS5vd25lckRvY3VtZW50KVswXSksYj09PSJkaXNhYmxlZCImJmMmJnRoaXMueGhyJiZ0aGlzLnhoci5hYm9ydCgpfSxfaW5pdFNvdXJjZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMsYyxkO2EuaXNBcnJheSh0aGlzLm9wdGlvbnMuc291cmNlKT8oYz10aGlzLm9wdGlvbnMuc291cmNlLHRoaXMuc291cmNlPWZ1bmN0aW9uKGIsZCl7ZChhLnVpLmF1dG9jb21wbGV0ZS5maWx0ZXIoYyxiLnRlcm0pKX0pOnR5cGVvZiB0aGlzLm9wdGlvbnMuc291cmNlPT0ic3RyaW5nIj8oZD10aGlzLm9wdGlvbnMuc291cmNlLHRoaXMuc291cmNlPWZ1bmN0aW9uKGMsZSl7Yi54aHImJmIueGhyLmFib3J0KCksYi54aHI9YS5hamF4KHt1cmw6ZCxkYXRhOmMsZGF0YVR5cGU6Impzb24iLHN1Y2Nlc3M6ZnVuY3Rpb24oYSxiKXtlKGEpfSxlcnJvcjpmdW5jdGlvbigpe2UoW10pfX0pfSk6dGhpcy5zb3VyY2U9dGhpcy5vcHRpb25zLnNvdXJjZX0sc2VhcmNoOmZ1bmN0aW9uKGEsYil7YT1hIT1udWxsP2E6dGhpcy5lbGVtZW50LnZhbCgpLHRoaXMudGVybT10aGlzLmVsZW1lbnQudmFsKCk7aWYoYS5sZW5ndGg8dGhpcy5vcHRpb25zLm1pbkxlbmd0aClyZXR1cm4gdGhpcy5jbG9zZShiKTtjbGVhclRpbWVvdXQodGhpcy5jbG9zaW5nKTtpZih0aGlzLl90cmlnZ2VyKCJzZWFyY2giLGIpPT09ITEpcmV0dXJuO3JldHVybiB0aGlzLl9zZWFyY2goYSl9LF9zZWFyY2g6ZnVuY3Rpb24oYSl7dGhpcy5wZW5kaW5nKyssdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1hdXRvY29tcGxldGUtbG9hZGluZyIpLHRoaXMuc291cmNlKHt0ZXJtOmF9LHRoaXMuX3Jlc3BvbnNlKCkpfSxfcmVzcG9uc2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGI9KytjO3JldHVybiBmdW5jdGlvbihkKXtiPT09YyYmYS5fX3Jlc3BvbnNlKGQpLGEucGVuZGluZy0tLGEucGVuZGluZ3x8YS5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1hdXRvY29tcGxldGUtbG9hZGluZyIpfX0sX19yZXNwb25zZTpmdW5jdGlvbihhKXshdGhpcy5vcHRpb25zLmRpc2FibGVkJiZhJiZhLmxlbmd0aD8oYT10aGlzLl9ub3JtYWxpemUoYSksdGhpcy5fc3VnZ2VzdChhKSx0aGlzLl90cmlnZ2VyKCJvcGVuIikpOnRoaXMuY2xvc2UoKX0sY2xvc2U6ZnVuY3Rpb24oYSl7Y2xlYXJUaW1lb3V0KHRoaXMuY2xvc2luZyksdGhpcy5tZW51LmVsZW1lbnQuaXMoIjp2aXNpYmxlIikmJih0aGlzLm1lbnUuZWxlbWVudC5oaWRlKCksdGhpcy5tZW51LmRlYWN0aXZhdGUoKSx0aGlzLl90cmlnZ2VyKCJjbG9zZSIsYSkpfSxfY2hhbmdlOmZ1bmN0aW9uKGEpe3RoaXMucHJldmlvdXMhPT10aGlzLmVsZW1lbnQudmFsKCkmJnRoaXMuX3RyaWdnZXIoImNoYW5nZSIsYSx7aXRlbTp0aGlzLnNlbGVjdGVkSXRlbX0pfSxfbm9ybWFsaXplOmZ1bmN0aW9uKGIpe3JldHVybiBiLmxlbmd0aCYmYlswXS5sYWJlbCYmYlswXS52YWx1ZT9iOmEubWFwKGIsZnVuY3Rpb24oYil7cmV0dXJuIHR5cGVvZiBiPT0ic3RyaW5nIj97bGFiZWw6Yix2YWx1ZTpifTphLmV4dGVuZCh7bGFiZWw6Yi5sYWJlbHx8Yi52YWx1ZSx2YWx1ZTpiLnZhbHVlfHxiLmxhYmVsfSxiKX0pfSxfc3VnZ2VzdDpmdW5jdGlvbihiKXt2YXIgYz10aGlzLm1lbnUuZWxlbWVudC5lbXB0eSgpLnpJbmRleCh0aGlzLmVsZW1lbnQuekluZGV4KCkrMSk7dGhpcy5fcmVuZGVyTWVudShjLGIpLHRoaXMubWVudS5kZWFjdGl2YXRlKCksdGhpcy5tZW51LnJlZnJlc2goKSxjLnNob3coKSx0aGlzLl9yZXNpemVNZW51KCksYy5wb3NpdGlvbihhLmV4dGVuZCh7b2Y6dGhpcy5lbGVtZW50fSx0aGlzLm9wdGlvbnMucG9zaXRpb24pKSx0aGlzLm9wdGlvbnMuYXV0b0ZvY3VzJiZ0aGlzLm1lbnUubmV4dChuZXcgYS5FdmVudCgibW91c2VvdmVyIikpfSxfcmVzaXplTWVudTpmdW5jdGlvbigpe3ZhciBhPXRoaXMubWVudS5lbGVtZW50O2Eub3V0ZXJXaWR0aChNYXRoLm1heChhLndpZHRoKCIiKS5vdXRlcldpZHRoKCkrMSx0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpKSl9LF9yZW5kZXJNZW51OmZ1bmN0aW9uKGIsYyl7dmFyIGQ9dGhpczthLmVhY2goYyxmdW5jdGlvbihhLGMpe2QuX3JlbmRlckl0ZW0oYixjKX0pfSxfcmVuZGVySXRlbTpmdW5jdGlvbihiLGMpe3JldHVybiBhKCI8bGk+PC9saT4iKS5kYXRhKCJpdGVtLmF1dG9jb21wbGV0ZSIsYykuYXBwZW5kKGEoIjxhPjwvYT4iKS50ZXh0KGMubGFiZWwpKS5hcHBlbmRUbyhiKX0sX21vdmU6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5tZW51LmVsZW1lbnQuaXMoIjp2aXNpYmxlIikpe3RoaXMuc2VhcmNoKG51bGwsYik7cmV0dXJufWlmKHRoaXMubWVudS5maXJzdCgpJiYvXnByZXZpb3VzLy50ZXN0KGEpfHx0aGlzLm1lbnUubGFzdCgpJiYvXm5leHQvLnRlc3QoYSkpe3RoaXMuZWxlbWVudC52YWwodGhpcy50ZXJtKSx0aGlzLm1lbnUuZGVhY3RpdmF0ZSgpO3JldHVybn10aGlzLm1lbnVbYV0oYil9LHdpZGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1lbnUuZWxlbWVudH0sX2tleUV2ZW50OmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuaXNNdWx0aUxpbmV8fHRoaXMubWVudS5lbGVtZW50LmlzKCI6dmlzaWJsZSIpKXRoaXMuX21vdmUoYSxiKSxiLnByZXZlbnREZWZhdWx0KCl9fSksYS5leHRlbmQoYS51aS5hdXRvY29tcGxldGUse2VzY2FwZVJlZ2V4OmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoL1stW1xde30oKSorPy4sXFxeJHwjXHNdL2csIlxcJCYiKX0sZmlsdGVyOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9bmV3IFJlZ0V4cChhLnVpLmF1dG9jb21wbGV0ZS5lc2NhcGVSZWdleChjKSwiaSIpO3JldHVybiBhLmdyZXAoYixmdW5jdGlvbihhKXtyZXR1cm4gZC50ZXN0KGEubGFiZWx8fGEudmFsdWV8fGEpfSl9fSl9KGpRdWVyeSksZnVuY3Rpb24oYSl7YS53aWRnZXQoInVpLm1lbnUiLHtfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpczt0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLW1lbnUgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwiKS5hdHRyKHtyb2xlOiJsaXN0Ym94IiwiYXJpYS1hY3RpdmVkZXNjZW5kYW50IjoidWktYWN0aXZlLW1lbnVpdGVtIn0pLmNsaWNrKGZ1bmN0aW9uKGMpe2lmKCFhKGMudGFyZ2V0KS5jbG9zZXN0KCIudWktbWVudS1pdGVtIGEiKS5sZW5ndGgpcmV0dXJuO2MucHJldmVudERlZmF1bHQoKSxiLnNlbGVjdChjKX0pLHRoaXMucmVmcmVzaCgpfSxyZWZyZXNoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcyxjPXRoaXMuZWxlbWVudC5jaGlsZHJlbigibGk6bm90KC51aS1tZW51LWl0ZW0pOmhhcyhhKSIpLmFkZENsYXNzKCJ1aS1tZW51LWl0ZW0iKS5hdHRyKCJyb2xlIiwibWVudWl0ZW0iKTtjLmNoaWxkcmVuKCJhIikuYWRkQ2xhc3MoInVpLWNvcm5lci1hbGwiKS5hdHRyKCJ0YWJpbmRleCIsLTEpLm1vdXNlZW50ZXIoZnVuY3Rpb24oYyl7Yi5hY3RpdmF0ZShjLGEodGhpcykucGFyZW50KCkpfSkubW91c2VsZWF2ZShmdW5jdGlvbigpe2IuZGVhY3RpdmF0ZSgpfSl9LGFjdGl2YXRlOmZ1bmN0aW9uKGEsYil7dGhpcy5kZWFjdGl2YXRlKCk7aWYodGhpcy5oYXNTY3JvbGwoKSl7dmFyIGM9Yi5vZmZzZXQoKS50b3AtdGhpcy5lbGVtZW50Lm9mZnNldCgpLnRvcCxkPXRoaXMuZWxlbWVudC5zY3JvbGxUb3AoKSxlPXRoaXMuZWxlbWVudC5oZWlnaHQoKTtjPDA/dGhpcy5lbGVtZW50LnNjcm9sbFRvcChkK2MpOmM+PWUmJnRoaXMuZWxlbWVudC5zY3JvbGxUb3AoZCtjLWUrYi5oZWlnaHQoKSl9dGhpcy5hY3RpdmU9Yi5lcSgwKS5jaGlsZHJlbigiYSIpLmFkZENsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLmF0dHIoImlkIiwidWktYWN0aXZlLW1lbnVpdGVtIikuZW5kKCksdGhpcy5fdHJpZ2dlcigiZm9jdXMiLGEse2l0ZW06Yn0pfSxkZWFjdGl2YXRlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuYWN0aXZlKXJldHVybjt0aGlzLmFjdGl2ZS5jaGlsZHJlbigiYSIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLnJlbW92ZUF0dHIoImlkIiksdGhpcy5fdHJpZ2dlcigiYmx1ciIpLHRoaXMuYWN0aXZlPW51bGx9LG5leHQ6ZnVuY3Rpb24oYSl7dGhpcy5tb3ZlKCJuZXh0IiwiLnVpLW1lbnUtaXRlbTpmaXJzdCIsYSl9LHByZXZpb3VzOmZ1bmN0aW9uKGEpe3RoaXMubW92ZSgicHJldiIsIi51aS1tZW51LWl0ZW06bGFzdCIsYSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWN0aXZlJiYhdGhpcy5hY3RpdmUucHJldkFsbCgiLnVpLW1lbnUtaXRlbSIpLmxlbmd0aH0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFjdGl2ZSYmIXRoaXMuYWN0aXZlLm5leHRBbGwoIi51aS1tZW51LWl0ZW0iKS5sZW5ndGh9LG1vdmU6ZnVuY3Rpb24oYSxiLGMpe2lmKCF0aGlzLmFjdGl2ZSl7dGhpcy5hY3RpdmF0ZShjLHRoaXMuZWxlbWVudC5jaGlsZHJlbihiKSk7cmV0dXJufXZhciBkPXRoaXMuYWN0aXZlW2ErIkFsbCJdKCIudWktbWVudS1pdGVtIikuZXEoMCk7ZC5sZW5ndGg/dGhpcy5hY3RpdmF0ZShjLGQpOnRoaXMuYWN0aXZhdGUoYyx0aGlzLmVsZW1lbnQuY2hpbGRyZW4oYikpfSxuZXh0UGFnZTpmdW5jdGlvbihiKXtpZih0aGlzLmhhc1Njcm9sbCgpKXtpZighdGhpcy5hY3RpdmV8fHRoaXMubGFzdCgpKXt0aGlzLmFjdGl2YXRlKGIsdGhpcy5lbGVtZW50LmNoaWxkcmVuKCIudWktbWVudS1pdGVtOmZpcnN0IikpO3JldHVybn12YXIgYz10aGlzLmFjdGl2ZS5vZmZzZXQoKS50b3AsZD10aGlzLmVsZW1lbnQuaGVpZ2h0KCksZT10aGlzLmVsZW1lbnQuY2hpbGRyZW4oIi51aS1tZW51LWl0ZW0iKS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgYj1hKHRoaXMpLm9mZnNldCgpLnRvcC1jLWQrYSh0aGlzKS5oZWlnaHQoKTtyZXR1cm4gYjwxMCYmYj4tMTB9KTtlLmxlbmd0aHx8KGU9dGhpcy5lbGVtZW50LmNoaWxkcmVuKCIudWktbWVudS1pdGVtOmxhc3QiKSksdGhpcy5hY3RpdmF0ZShiLGUpfWVsc2UgdGhpcy5hY3RpdmF0ZShiLHRoaXMuZWxlbWVudC5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbSIpLmZpbHRlcighdGhpcy5hY3RpdmV8fHRoaXMubGFzdCgpPyI6Zmlyc3QiOiI6bGFzdCIpKX0scHJldmlvdXNQYWdlOmZ1bmN0aW9uKGIpe2lmKHRoaXMuaGFzU2Nyb2xsKCkpe2lmKCF0aGlzLmFjdGl2ZXx8dGhpcy5maXJzdCgpKXt0aGlzLmFjdGl2YXRlKGIsdGhpcy5lbGVtZW50LmNoaWxkcmVuKCIudWktbWVudS1pdGVtOmxhc3QiKSk7cmV0dXJufXZhciBjPXRoaXMuYWN0aXZlLm9mZnNldCgpLnRvcCxkPXRoaXMuZWxlbWVudC5oZWlnaHQoKSxlPXRoaXMuZWxlbWVudC5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbSIpLmZpbHRlcihmdW5jdGlvbigpe3ZhciBiPWEodGhpcykub2Zmc2V0KCkudG9wLWMrZC1hKHRoaXMpLmhlaWdodCgpO3JldHVybiBiPDEwJiZiPi0xMH0pO2UubGVuZ3RofHwoZT10aGlzLmVsZW1lbnQuY2hpbGRyZW4oIi51aS1tZW51LWl0ZW06Zmlyc3QiKSksdGhpcy5hY3RpdmF0ZShiLGUpfWVsc2UgdGhpcy5hY3RpdmF0ZShiLHRoaXMuZWxlbWVudC5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbSIpLmZpbHRlcighdGhpcy5hY3RpdmV8fHRoaXMuZmlyc3QoKT8iOmxhc3QiOiI6Zmlyc3QiKSl9LGhhc1Njcm9sbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnQuaGVpZ2h0KCk8dGhpcy5lbGVtZW50W2EuZm4ucHJvcD8icHJvcCI6ImF0dHIiXSgic2Nyb2xsSGVpZ2h0Iil9LHNlbGVjdDpmdW5jdGlvbihhKXt0aGlzLl90cmlnZ2VyKCJzZWxlY3RlZCIsYSx7aXRlbTp0aGlzLmFjdGl2ZX0pfX0pfShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGYsZz0idWktYnV0dG9uIHVpLXdpZGdldCB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiLGg9InVpLXN0YXRlLWhvdmVyIHVpLXN0YXRlLWFjdGl2ZSAiLGk9InVpLWJ1dHRvbi1pY29ucy1vbmx5IHVpLWJ1dHRvbi1pY29uLW9ubHkgdWktYnV0dG9uLXRleHQtaWNvbnMgdWktYnV0dG9uLXRleHQtaWNvbi1wcmltYXJ5IHVpLWJ1dHRvbi10ZXh0LWljb24tc2Vjb25kYXJ5IHVpLWJ1dHRvbi10ZXh0LW9ubHkiLGo9ZnVuY3Rpb24oKXt2YXIgYj1hKHRoaXMpLmZpbmQoIjp1aS1idXR0b24iKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yi5idXR0b24oInJlZnJlc2giKX0sMSl9LGs9ZnVuY3Rpb24oYil7dmFyIGM9Yi5uYW1lLGQ9Yi5mb3JtLGU9YShbXSk7cmV0dXJuIGMmJihkP2U9YShkKS5maW5kKCJbbmFtZT0nIitjKyInXSIpOmU9YSgiW25hbWU9JyIrYysiJ10iLGIub3duZXJEb2N1bWVudCkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuZm9ybX0pKSxlfTthLndpZGdldCgidWkuYnV0dG9uIix7b3B0aW9uczp7ZGlzYWJsZWQ6bnVsbCx0ZXh0OiEwLGxhYmVsOm51bGwsaWNvbnM6e3ByaW1hcnk6bnVsbCxzZWNvbmRhcnk6bnVsbH19LF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQuY2xvc2VzdCgiZm9ybSIpLnVuYmluZCgicmVzZXQuYnV0dG9uIikuYmluZCgicmVzZXQuYnV0dG9uIixqKSx0eXBlb2YgdGhpcy5vcHRpb25zLmRpc2FibGVkIT0iYm9vbGVhbiI/dGhpcy5vcHRpb25zLmRpc2FibGVkPSEhdGhpcy5lbGVtZW50LnByb3BBdHRyKCJkaXNhYmxlZCIpOnRoaXMuZWxlbWVudC5wcm9wQXR0cigiZGlzYWJsZWQiLHRoaXMub3B0aW9ucy5kaXNhYmxlZCksdGhpcy5fZGV0ZXJtaW5lQnV0dG9uVHlwZSgpLHRoaXMuaGFzVGl0bGU9ISF0aGlzLmJ1dHRvbkVsZW1lbnQuYXR0cigidGl0bGUiKTt2YXIgYj10aGlzLGg9dGhpcy5vcHRpb25zLGk9dGhpcy50eXBlPT09ImNoZWNrYm94Inx8dGhpcy50eXBlPT09InJhZGlvIixsPSJ1aS1zdGF0ZS1ob3ZlciIrKGk/IiI6IiB1aS1zdGF0ZS1hY3RpdmUiKSxtPSJ1aS1zdGF0ZS1mb2N1cyI7aC5sYWJlbD09PW51bGwmJihoLmxhYmVsPXRoaXMuYnV0dG9uRWxlbWVudC5odG1sKCkpLHRoaXMuYnV0dG9uRWxlbWVudC5hZGRDbGFzcyhnKS5hdHRyKCJyb2xlIiwiYnV0dG9uIikuYmluZCgibW91c2VlbnRlci5idXR0b24iLGZ1bmN0aW9uKCl7aWYoaC5kaXNhYmxlZClyZXR1cm47YSh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtaG92ZXIiKSx0aGlzPT09YyYmYSh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIil9KS5iaW5kKCJtb3VzZWxlYXZlLmJ1dHRvbiIsZnVuY3Rpb24oKXtpZihoLmRpc2FibGVkKXJldHVybjthKHRoaXMpLnJlbW92ZUNsYXNzKGwpfSkuYmluZCgiY2xpY2suYnV0dG9uIixmdW5jdGlvbihhKXtoLmRpc2FibGVkJiYoYS5wcmV2ZW50RGVmYXVsdCgpLGEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkpfSksdGhpcy5lbGVtZW50LmJpbmQoImZvY3VzLmJ1dHRvbiIsZnVuY3Rpb24oKXtiLmJ1dHRvbkVsZW1lbnQuYWRkQ2xhc3MobSl9KS5iaW5kKCJibHVyLmJ1dHRvbiIsZnVuY3Rpb24oKXtiLmJ1dHRvbkVsZW1lbnQucmVtb3ZlQ2xhc3MobSl9KSxpJiYodGhpcy5lbGVtZW50LmJpbmQoImNoYW5nZS5idXR0b24iLGZ1bmN0aW9uKCl7aWYoZilyZXR1cm47Yi5yZWZyZXNoKCl9KSx0aGlzLmJ1dHRvbkVsZW1lbnQuYmluZCgibW91c2Vkb3duLmJ1dHRvbiIsZnVuY3Rpb24oYSl7aWYoaC5kaXNhYmxlZClyZXR1cm47Zj0hMSxkPWEucGFnZVgsZT1hLnBhZ2VZfSkuYmluZCgibW91c2V1cC5idXR0b24iLGZ1bmN0aW9uKGEpe2lmKGguZGlzYWJsZWQpcmV0dXJuO2lmKGQhPT1hLnBhZ2VYfHxlIT09YS5wYWdlWSlmPSEwfSkpLHRoaXMudHlwZT09PSJjaGVja2JveCI/dGhpcy5idXR0b25FbGVtZW50LmJpbmQoImNsaWNrLmJ1dHRvbiIsZnVuY3Rpb24oKXtpZihoLmRpc2FibGVkfHxmKXJldHVybiExO2EodGhpcykudG9nZ2xlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLGIuYnV0dG9uRWxlbWVudC5hdHRyKCJhcmlhLXByZXNzZWQiLGIuZWxlbWVudFswXS5jaGVja2VkKX0pOnRoaXMudHlwZT09PSJyYWRpbyI/dGhpcy5idXR0b25FbGVtZW50LmJpbmQoImNsaWNrLmJ1dHRvbiIsZnVuY3Rpb24oKXtpZihoLmRpc2FibGVkfHxmKXJldHVybiExO2EodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLGIuYnV0dG9uRWxlbWVudC5hdHRyKCJhcmlhLXByZXNzZWQiLCJ0cnVlIik7dmFyIGM9Yi5lbGVtZW50WzBdO2soYykubm90KGMpLm1hcChmdW5jdGlvbigpe3JldHVybiBhKHRoaXMpLmJ1dHRvbigid2lkZ2V0IilbMF19KS5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIikuYXR0cigiYXJpYS1wcmVzc2VkIiwiZmFsc2UiKX0pOih0aGlzLmJ1dHRvbkVsZW1lbnQuYmluZCgibW91c2Vkb3duLmJ1dHRvbiIsZnVuY3Rpb24oKXtpZihoLmRpc2FibGVkKXJldHVybiExO2EodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLGM9dGhpcyxhKGRvY3VtZW50KS5vbmUoIm1vdXNldXAiLGZ1bmN0aW9uKCl7Yz1udWxsfSl9KS5iaW5kKCJtb3VzZXVwLmJ1dHRvbiIsZnVuY3Rpb24oKXtpZihoLmRpc2FibGVkKXJldHVybiExO2EodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpfSkuYmluZCgia2V5ZG93bi5idXR0b24iLGZ1bmN0aW9uKGIpe2lmKGguZGlzYWJsZWQpcmV0dXJuITE7KGIua2V5Q29kZT09YS51aS5rZXlDb2RlLlNQQUNFfHxiLmtleUNvZGU9PWEudWkua2V5Q29kZS5FTlRFUikmJmEodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpfSkuYmluZCgia2V5dXAuYnV0dG9uIixmdW5jdGlvbigpe2EodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpfSksdGhpcy5idXR0b25FbGVtZW50LmlzKCJhIikmJnRoaXMuYnV0dG9uRWxlbWVudC5rZXl1cChmdW5jdGlvbihiKXtiLmtleUNvZGU9PT1hLnVpLmtleUNvZGUuU1BBQ0UmJmEodGhpcykuY2xpY2soKX0pKSx0aGlzLl9zZXRPcHRpb24oImRpc2FibGVkIixoLmRpc2FibGVkKSx0aGlzLl9yZXNldEJ1dHRvbigpfSxfZGV0ZXJtaW5lQnV0dG9uVHlwZTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5pcygiOmNoZWNrYm94Iik/dGhpcy50eXBlPSJjaGVja2JveCI6dGhpcy5lbGVtZW50LmlzKCI6cmFkaW8iKT90aGlzLnR5cGU9InJhZGlvIjp0aGlzLmVsZW1lbnQuaXMoImlucHV0Iik/dGhpcy50eXBlPSJpbnB1dCI6dGhpcy50eXBlPSJidXR0b24iO2lmKHRoaXMudHlwZT09PSJjaGVja2JveCJ8fHRoaXMudHlwZT09PSJyYWRpbyIpe3ZhciBhPXRoaXMuZWxlbWVudC5wYXJlbnRzKCkuZmlsdGVyKCI6bGFzdCIpLGI9ImxhYmVsW2Zvcj0nIit0aGlzLmVsZW1lbnQuYXR0cigiaWQiKSsiJ10iO3RoaXMuYnV0dG9uRWxlbWVudD1hLmZpbmQoYiksdGhpcy5idXR0b25FbGVtZW50Lmxlbmd0aHx8KGE9YS5sZW5ndGg/YS5zaWJsaW5ncygpOnRoaXMuZWxlbWVudC5zaWJsaW5ncygpLHRoaXMuYnV0dG9uRWxlbWVudD1hLmZpbHRlcihiKSx0aGlzLmJ1dHRvbkVsZW1lbnQubGVuZ3RofHwodGhpcy5idXR0b25FbGVtZW50PWEuZmluZChiKSkpLHRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlIik7dmFyIGM9dGhpcy5lbGVtZW50LmlzKCI6Y2hlY2tlZCIpO2MmJnRoaXMuYnV0dG9uRWxlbWVudC5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIiksdGhpcy5idXR0b25FbGVtZW50LmF0dHIoImFyaWEtcHJlc3NlZCIsYyl9ZWxzZSB0aGlzLmJ1dHRvbkVsZW1lbnQ9dGhpcy5lbGVtZW50fSx3aWRnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5idXR0b25FbGVtZW50fSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1oZWxwZXItaGlkZGVuLWFjY2Vzc2libGUiKSx0aGlzLmJ1dHRvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoZysiICIraCsiICIraSkucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoImFyaWEtcHJlc3NlZCIpLmh0bWwodGhpcy5idXR0b25FbGVtZW50LmZpbmQoIi51aS1idXR0b24tdGV4dCIpLmh0bWwoKSksdGhpcy5oYXNUaXRsZXx8dGhpcy5idXR0b25FbGVtZW50LnJlbW92ZUF0dHIoInRpdGxlIiksYS5XaWRnZXQucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKX0sX3NldE9wdGlvbjpmdW5jdGlvbihiLGMpe2EuV2lkZ2V0LnByb3RvdHlwZS5fc2V0T3B0aW9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZihiPT09ImRpc2FibGVkIil7Yz90aGlzLmVsZW1lbnQucHJvcEF0dHIoImRpc2FibGVkIiwhMCk6dGhpcy5lbGVtZW50LnByb3BBdHRyKCJkaXNhYmxlZCIsITEpO3JldHVybn10aGlzLl9yZXNldEJ1dHRvbigpfSxyZWZyZXNoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5lbGVtZW50LmlzKCI6ZGlzYWJsZWQiKTtiIT09dGhpcy5vcHRpb25zLmRpc2FibGVkJiZ0aGlzLl9zZXRPcHRpb24oImRpc2FibGVkIixiKSx0aGlzLnR5cGU9PT0icmFkaW8iP2sodGhpcy5lbGVtZW50WzBdKS5lYWNoKGZ1bmN0aW9uKCl7YSh0aGlzKS5pcygiOmNoZWNrZWQiKT9hKHRoaXMpLmJ1dHRvbigid2lkZ2V0IikuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLmF0dHIoImFyaWEtcHJlc3NlZCIsInRydWUiKTphKHRoaXMpLmJ1dHRvbigid2lkZ2V0IikucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLmF0dHIoImFyaWEtcHJlc3NlZCIsImZhbHNlIil9KTp0aGlzLnR5cGU9PT0iY2hlY2tib3giJiYodGhpcy5lbGVtZW50LmlzKCI6Y2hlY2tlZCIpP3RoaXMuYnV0dG9uRWxlbWVudC5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIikuYXR0cigiYXJpYS1wcmVzc2VkIiwidHJ1ZSIpOnRoaXMuYnV0dG9uRWxlbWVudC5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIikuYXR0cigiYXJpYS1wcmVzc2VkIiwiZmFsc2UiKSl9LF9yZXNldEJ1dHRvbjpmdW5jdGlvbigpe2lmKHRoaXMudHlwZT09PSJpbnB1dCIpe3RoaXMub3B0aW9ucy5sYWJlbCYmdGhpcy5lbGVtZW50LnZhbCh0aGlzLm9wdGlvbnMubGFiZWwpO3JldHVybn12YXIgYj10aGlzLmJ1dHRvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoaSksYz1hKCI8c3Bhbj48L3NwYW4+Iix0aGlzLmVsZW1lbnRbMF0ub3duZXJEb2N1bWVudCkuYWRkQ2xhc3MoInVpLWJ1dHRvbi10ZXh0IikuaHRtbCh0aGlzLm9wdGlvbnMubGFiZWwpLmFwcGVuZFRvKGIuZW1wdHkoKSkudGV4dCgpLGQ9dGhpcy5vcHRpb25zLmljb25zLGU9ZC5wcmltYXJ5JiZkLnNlY29uZGFyeSxmPVtdO2QucHJpbWFyeXx8ZC5zZWNvbmRhcnk/KHRoaXMub3B0aW9ucy50ZXh0JiZmLnB1c2goInVpLWJ1dHRvbi10ZXh0LWljb24iKyhlPyJzIjpkLnByaW1hcnk/Ii1wcmltYXJ5IjoiLXNlY29uZGFyeSIpKSxkLnByaW1hcnkmJmIucHJlcGVuZCgiPHNwYW4gY2xhc3M9J3VpLWJ1dHRvbi1pY29uLXByaW1hcnkgdWktaWNvbiAiK2QucHJpbWFyeSsiJz48L3NwYW4+IiksZC5zZWNvbmRhcnkmJmIuYXBwZW5kKCI8c3BhbiBjbGFzcz0ndWktYnV0dG9uLWljb24tc2Vjb25kYXJ5IHVpLWljb24gIitkLnNlY29uZGFyeSsiJz48L3NwYW4+IiksdGhpcy5vcHRpb25zLnRleHR8fChmLnB1c2goZT8idWktYnV0dG9uLWljb25zLW9ubHkiOiJ1aS1idXR0b24taWNvbi1vbmx5IiksdGhpcy5oYXNUaXRsZXx8Yi5hdHRyKCJ0aXRsZSIsYykpKTpmLnB1c2goInVpLWJ1dHRvbi10ZXh0LW9ubHkiKSxiLmFkZENsYXNzKGYuam9pbigiICIpKX19KSxhLndpZGdldCgidWkuYnV0dG9uc2V0Iix7b3B0aW9uczp7aXRlbXM6IjpidXR0b24sIDpzdWJtaXQsIDpyZXNldCwgOmNoZWNrYm94LCA6cmFkaW8sIGEsIDpkYXRhKGJ1dHRvbikifSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1idXR0b25zZXQiKX0sX2luaXQ6ZnVuY3Rpb24oKXt0aGlzLnJlZnJlc2goKX0sX3NldE9wdGlvbjpmdW5jdGlvbihiLGMpe2I9PT0iZGlzYWJsZWQiJiZ0aGlzLmJ1dHRvbnMuYnV0dG9uKCJvcHRpb24iLGIsYyksYS5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxyZWZyZXNoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5lbGVtZW50LmNzcygiZGlyZWN0aW9uIik9PT0icnRsIjt0aGlzLmJ1dHRvbnM9dGhpcy5lbGVtZW50LmZpbmQodGhpcy5vcHRpb25zLml0ZW1zKS5maWx0ZXIoIjp1aS1idXR0b24iKS5idXR0b24oInJlZnJlc2giKS5lbmQoKS5ub3QoIjp1aS1idXR0b24iKS5idXR0b24oKS5lbmQoKS5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gYSh0aGlzKS5idXR0b24oIndpZGdldCIpWzBdfSkucmVtb3ZlQ2xhc3MoInVpLWNvcm5lci1hbGwgdWktY29ybmVyLWxlZnQgdWktY29ybmVyLXJpZ2h0IikuZmlsdGVyKCI6Zmlyc3QiKS5hZGRDbGFzcyhiPyJ1aS1jb3JuZXItcmlnaHQiOiJ1aS1jb3JuZXItbGVmdCIpLmVuZCgpLmZpbHRlcigiOmxhc3QiKS5hZGRDbGFzcyhiPyJ1aS1jb3JuZXItbGVmdCI6InVpLWNvcm5lci1yaWdodCIpLmVuZCgpLmVuZCgpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1idXR0b25zZXQiKSx0aGlzLmJ1dHRvbnMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIGEodGhpcykuYnV0dG9uKCJ3aWRnZXQiKVswXX0pLnJlbW92ZUNsYXNzKCJ1aS1jb3JuZXItbGVmdCB1aS1jb3JuZXItcmlnaHQiKS5lbmQoKS5idXR0b24oImRlc3Ryb3kiKSxhLldpZGdldC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpfX0pfShqUXVlcnkpLGZ1bmN0aW9uKCQsdW5kZWZpbmVkKXtmdW5jdGlvbiBEYXRlcGlja2VyKCl7dGhpcy5kZWJ1Zz0hMSx0aGlzLl9jdXJJbnN0PW51bGwsdGhpcy5fa2V5RXZlbnQ9ITEsdGhpcy5fZGlzYWJsZWRJbnB1dHM9W10sdGhpcy5fZGF0ZXBpY2tlclNob3dpbmc9ITEsdGhpcy5faW5EaWFsb2c9ITEsdGhpcy5fbWFpbkRpdklkPSJ1aS1kYXRlcGlja2VyLWRpdiIsdGhpcy5faW5saW5lQ2xhc3M9InVpLWRhdGVwaWNrZXItaW5saW5lIix0aGlzLl9hcHBlbmRDbGFzcz0idWktZGF0ZXBpY2tlci1hcHBlbmQiLHRoaXMuX3RyaWdnZXJDbGFzcz0idWktZGF0ZXBpY2tlci10cmlnZ2VyIix0aGlzLl9kaWFsb2dDbGFzcz0idWktZGF0ZXBpY2tlci1kaWFsb2ciLHRoaXMuX2Rpc2FibGVDbGFzcz0idWktZGF0ZXBpY2tlci1kaXNhYmxlZCIsdGhpcy5fdW5zZWxlY3RhYmxlQ2xhc3M9InVpLWRhdGVwaWNrZXItdW5zZWxlY3RhYmxlIix0aGlzLl9jdXJyZW50Q2xhc3M9InVpLWRhdGVwaWNrZXItY3VycmVudC1kYXkiLHRoaXMuX2RheU92ZXJDbGFzcz0idWktZGF0ZXBpY2tlci1kYXlzLWNlbGwtb3ZlciIsdGhpcy5yZWdpb25hbD1bXSx0aGlzLnJlZ2lvbmFsWyIiXT17Y2xvc2VUZXh0OiJEb25lIixwcmV2VGV4dDoiUHJldiIsbmV4dFRleHQ6Ik5leHQiLGN1cnJlbnRUZXh0OiJUb2RheSIsbW9udGhOYW1lczpbIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sbW9udGhOYW1lc1Nob3J0OlsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl0sZGF5TmFtZXM6WyJTdW5kYXkiLCJNb25kYXkiLCJUdWVzZGF5IiwiV2VkbmVzZGF5IiwiVGh1cnNkYXkiLCJGcmlkYXkiLCJTYXR1cmRheSJdLGRheU5hbWVzU2hvcnQ6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxkYXlOYW1lc01pbjpbIlN1IiwiTW8iLCJUdSIsIldlIiwiVGgiLCJGciIsIlNhIl0sd2Vla0hlYWRlcjoiV2siLGRhdGVGb3JtYXQ6Im1tL2RkL3l5IixmaXJzdERheTowLGlzUlRMOiExLHNob3dNb250aEFmdGVyWWVhcjohMSx5ZWFyU3VmZml4OiIifSx0aGlzLl9kZWZhdWx0cz17c2hvd09uOiJmb2N1cyIsc2hvd0FuaW06ImZhZGVJbiIsc2hvd09wdGlvbnM6e30sZGVmYXVsdERhdGU6bnVsbCxhcHBlbmRUZXh0OiIiLGJ1dHRvblRleHQ6Ii4uLiIsYnV0dG9uSW1hZ2U6IiIsYnV0dG9uSW1hZ2VPbmx5OiExLGhpZGVJZk5vUHJldk5leHQ6ITEsbmF2aWdhdGlvbkFzRGF0ZUZvcm1hdDohMSxnb3RvQ3VycmVudDohMSxjaGFuZ2VNb250aDohMSxjaGFuZ2VZZWFyOiExLHllYXJSYW5nZToiYy0xMDpjKzEwIixzaG93T3RoZXJNb250aHM6ITEsc2VsZWN0T3RoZXJNb250aHM6ITEsc2hvd1dlZWs6ITEsY2FsY3VsYXRlV2Vlazp0aGlzLmlzbzg2MDFXZWVrLHNob3J0WWVhckN1dG9mZjoiKzEwIixtaW5EYXRlOm51bGwsbWF4RGF0ZTpudWxsLGR1cmF0aW9uOiJmYXN0IixiZWZvcmVTaG93RGF5Om51bGwsYmVmb3JlU2hvdzpudWxsLG9uU2VsZWN0Om51bGwsb25DaGFuZ2VNb250aFllYXI6bnVsbCxvbkNsb3NlOm51bGwsbnVtYmVyT2ZNb250aHM6MSxzaG93Q3VycmVudEF0UG9zOjAsc3RlcE1vbnRoczoxLHN0ZXBCaWdNb250aHM6MTIsYWx0RmllbGQ6IiIsYWx0Rm9ybWF0OiIiLGNvbnN0cmFpbklucHV0OiEwLHNob3dCdXR0b25QYW5lbDohMSxhdXRvU2l6ZTohMSxkaXNhYmxlZDohMX0sJC5leHRlbmQodGhpcy5fZGVmYXVsdHMsdGhpcy5yZWdpb25hbFsiIl0pLHRoaXMuZHBEaXY9YmluZEhvdmVyKCQoJzxkaXYgaWQ9IicrdGhpcy5fbWFpbkRpdklkKyciIGNsYXNzPSJ1aS1kYXRlcGlja2VyIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1oZWxwZXItY2xlYXJmaXggdWktY29ybmVyLWFsbCI+PC9kaXY+JykpfWZ1bmN0aW9uIGJpbmRIb3ZlcihhKXt2YXIgYj0iYnV0dG9uLCAudWktZGF0ZXBpY2tlci1wcmV2LCAudWktZGF0ZXBpY2tlci1uZXh0LCAudWktZGF0ZXBpY2tlci1jYWxlbmRhciB0ZCBhIjtyZXR1cm4gYS5iaW5kKCJtb3VzZW91dCIsZnVuY3Rpb24oYSl7dmFyIGM9JChhLnRhcmdldCkuY2xvc2VzdChiKTtpZighYy5sZW5ndGgpcmV0dXJuO2MucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIHVpLWRhdGVwaWNrZXItcHJldi1ob3ZlciB1aS1kYXRlcGlja2VyLW5leHQtaG92ZXIiKX0pLmJpbmQoIm1vdXNlb3ZlciIsZnVuY3Rpb24oYyl7dmFyIGQ9JChjLnRhcmdldCkuY2xvc2VzdChiKTtpZigkLmRhdGVwaWNrZXIuX2lzRGlzYWJsZWREYXRlcGlja2VyKGluc3RBY3RpdmUuaW5saW5lP2EucGFyZW50KClbMF06aW5zdEFjdGl2ZS5pbnB1dFswXSl8fCFkLmxlbmd0aClyZXR1cm47ZC5wYXJlbnRzKCIudWktZGF0ZXBpY2tlci1jYWxlbmRhciIpLmZpbmQoImEiKS5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKSxkLmFkZENsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLGQuaGFzQ2xhc3MoInVpLWRhdGVwaWNrZXItcHJldiIpJiZkLmFkZENsYXNzKCJ1aS1kYXRlcGlja2VyLXByZXYtaG92ZXIiKSxkLmhhc0NsYXNzKCJ1aS1kYXRlcGlja2VyLW5leHQiKSYmZC5hZGRDbGFzcygidWktZGF0ZXBpY2tlci1uZXh0LWhvdmVyIil9KX1mdW5jdGlvbiBleHRlbmRSZW1vdmUoYSxiKXskLmV4dGVuZChhLGIpO2Zvcih2YXIgYyBpbiBiKWlmKGJbY109PW51bGx8fGJbY109PXVuZGVmaW5lZClhW2NdPWJbY107cmV0dXJuIGF9ZnVuY3Rpb24gaXNBcnJheShhKXtyZXR1cm4gYSYmKCQuYnJvd3Nlci5zYWZhcmkmJnR5cGVvZiBhPT0ib2JqZWN0IiYmYS5sZW5ndGh8fGEuY29uc3RydWN0b3ImJmEuY29uc3RydWN0b3IudG9TdHJpbmcoKS5tYXRjaCgvXEFycmF5XChcKS8pKX0kLmV4dGVuZCgkLnVpLHtkYXRlcGlja2VyOnt2ZXJzaW9uOiIxLjguMjQifX0pO3ZhciBQUk9QX05BTUU9ImRhdGVwaWNrZXIiLGRwdXVpZD0obmV3IERhdGUpLmdldFRpbWUoKSxpbnN0QWN0aXZlOyQuZXh0ZW5kKERhdGVwaWNrZXIucHJvdG90eXBlLHttYXJrZXJDbGFzc05hbWU6Imhhc0RhdGVwaWNrZXIiLG1heFJvd3M6NCxsb2c6ZnVuY3Rpb24oKXt0aGlzLmRlYnVnJiZjb25zb2xlLmxvZy5hcHBseSgiIixhcmd1bWVudHMpfSxfd2lkZ2V0RGF0ZXBpY2tlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRwRGl2fSxzZXREZWZhdWx0czpmdW5jdGlvbihhKXtyZXR1cm4gZXh0ZW5kUmVtb3ZlKHRoaXMuX2RlZmF1bHRzLGF8fHt9KSx0aGlzfSxfYXR0YWNoRGF0ZXBpY2tlcjpmdW5jdGlvbih0YXJnZXQsc2V0dGluZ3Mpe3ZhciBpbmxpbmVTZXR0aW5ncz1udWxsO2Zvcih2YXIgYXR0ck5hbWUgaW4gdGhpcy5fZGVmYXVsdHMpe3ZhciBhdHRyVmFsdWU9dGFyZ2V0LmdldEF0dHJpYnV0ZSgiZGF0ZToiK2F0dHJOYW1lKTtpZihhdHRyVmFsdWUpe2lubGluZVNldHRpbmdzPWlubGluZVNldHRpbmdzfHx7fTt0cnl7aW5saW5lU2V0dGluZ3NbYXR0ck5hbWVdPWV2YWwoYXR0clZhbHVlKX1jYXRjaChlcnIpe2lubGluZVNldHRpbmdzW2F0dHJOYW1lXT1hdHRyVmFsdWV9fX12YXIgbm9kZU5hbWU9dGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksaW5saW5lPW5vZGVOYW1lPT0iZGl2Inx8bm9kZU5hbWU9PSJzcGFuIjt0YXJnZXQuaWR8fCh0aGlzLnV1aWQrPTEsdGFyZ2V0LmlkPSJkcCIrdGhpcy51dWlkKTt2YXIgaW5zdD10aGlzLl9uZXdJbnN0KCQodGFyZ2V0KSxpbmxpbmUpO2luc3Quc2V0dGluZ3M9JC5leHRlbmQoe30sc2V0dGluZ3N8fHt9LGlubGluZVNldHRpbmdzfHx7fSksbm9kZU5hbWU9PSJpbnB1dCI/dGhpcy5fY29ubmVjdERhdGVwaWNrZXIodGFyZ2V0LGluc3QpOmlubGluZSYmdGhpcy5faW5saW5lRGF0ZXBpY2tlcih0YXJnZXQsaW5zdCl9LF9uZXdJbnN0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YVswXS5pZC5yZXBsYWNlKC8oW15BLVphLXowLTlfLV0pL2csIlxcXFwkMSIpO3JldHVybntpZDpjLGlucHV0OmEsc2VsZWN0ZWREYXk6MCxzZWxlY3RlZE1vbnRoOjAsc2VsZWN0ZWRZZWFyOjAsZHJhd01vbnRoOjAsZHJhd1llYXI6MCxpbmxpbmU6YixkcERpdjpiP2JpbmRIb3ZlcigkKCc8ZGl2IGNsYXNzPSInK3RoaXMuX2lubGluZUNsYXNzKycgdWktZGF0ZXBpY2tlciB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktaGVscGVyLWNsZWFyZml4IHVpLWNvcm5lci1hbGwiPjwvZGl2PicpKTp0aGlzLmRwRGl2fX0sX2Nvbm5lY3REYXRlcGlja2VyOmZ1bmN0aW9uKGEsYil7dmFyIGM9JChhKTtiLmFwcGVuZD0kKFtdKSxiLnRyaWdnZXI9JChbXSk7aWYoYy5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkpcmV0dXJuO3RoaXMuX2F0dGFjaG1lbnRzKGMsYiksYy5hZGRDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkua2V5ZG93bih0aGlzLl9kb0tleURvd24pLmtleXByZXNzKHRoaXMuX2RvS2V5UHJlc3MpLmtleXVwKHRoaXMuX2RvS2V5VXApLmJpbmQoInNldERhdGEuZGF0ZXBpY2tlciIsZnVuY3Rpb24oYSxjLGQpe2Iuc2V0dGluZ3NbY109ZH0pLmJpbmQoImdldERhdGEuZGF0ZXBpY2tlciIsZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5fZ2V0KGIsYyl9KSx0aGlzLl9hdXRvU2l6ZShiKSwkLmRhdGEoYSxQUk9QX05BTUUsYiksYi5zZXR0aW5ncy5kaXNhYmxlZCYmdGhpcy5fZGlzYWJsZURhdGVwaWNrZXIoYSl9LF9hdHRhY2htZW50czpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuX2dldChiLCJhcHBlbmRUZXh0IiksZD10aGlzLl9nZXQoYiwiaXNSVEwiKTtiLmFwcGVuZCYmYi5hcHBlbmQucmVtb3ZlKCksYyYmKGIuYXBwZW5kPSQoJzxzcGFuIGNsYXNzPSInK3RoaXMuX2FwcGVuZENsYXNzKyciPicrYysiPC9zcGFuPiIpLGFbZD8iYmVmb3JlIjoiYWZ0ZXIiXShiLmFwcGVuZCkpLGEudW5iaW5kKCJmb2N1cyIsdGhpcy5fc2hvd0RhdGVwaWNrZXIpLGIudHJpZ2dlciYmYi50cmlnZ2VyLnJlbW92ZSgpO3ZhciBlPXRoaXMuX2dldChiLCJzaG93T24iKTsoZT09ImZvY3VzInx8ZT09ImJvdGgiKSYmYS5mb2N1cyh0aGlzLl9zaG93RGF0ZXBpY2tlcik7aWYoZT09ImJ1dHRvbiJ8fGU9PSJib3RoIil7dmFyIGY9dGhpcy5fZ2V0KGIsImJ1dHRvblRleHQiKSxnPXRoaXMuX2dldChiLCJidXR0b25JbWFnZSIpO2IudHJpZ2dlcj0kKHRoaXMuX2dldChiLCJidXR0b25JbWFnZU9ubHkiKT8kKCI8aW1nLz4iKS5hZGRDbGFzcyh0aGlzLl90cmlnZ2VyQ2xhc3MpLmF0dHIoe3NyYzpnLGFsdDpmLHRpdGxlOmZ9KTokKCc8YnV0dG9uIHR5cGU9ImJ1dHRvbiI+PC9idXR0b24+JykuYWRkQ2xhc3ModGhpcy5fdHJpZ2dlckNsYXNzKS5odG1sKGc9PSIiP2Y6JCgiPGltZy8+IikuYXR0cih7c3JjOmcsYWx0OmYsdGl0bGU6Zn0pKSksYVtkPyJiZWZvcmUiOiJhZnRlciJdKGIudHJpZ2dlciksYi50cmlnZ2VyLmNsaWNrKGZ1bmN0aW9uKCl7cmV0dXJuICQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcmJiQuZGF0ZXBpY2tlci5fbGFzdElucHV0PT1hWzBdPyQuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKTokLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nJiYkLmRhdGVwaWNrZXIuX2xhc3RJbnB1dCE9YVswXT8oJC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpLCQuZGF0ZXBpY2tlci5fc2hvd0RhdGVwaWNrZXIoYVswXSkpOiQuZGF0ZXBpY2tlci5fc2hvd0RhdGVwaWNrZXIoYVswXSksITF9KX19LF9hdXRvU2l6ZTpmdW5jdGlvbihhKXtpZih0aGlzLl9nZXQoYSwiYXV0b1NpemUiKSYmIWEuaW5saW5lKXt2YXIgYj1uZXcgRGF0ZSgyMDA5LDExLDIwKSxjPXRoaXMuX2dldChhLCJkYXRlRm9ybWF0Iik7aWYoYy5tYXRjaCgvW0RNXS8pKXt2YXIgZD1mdW5jdGlvbihhKXt2YXIgYj0wLGM9MDtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKylhW2RdLmxlbmd0aD5iJiYoYj1hW2RdLmxlbmd0aCxjPWQpO3JldHVybiBjfTtiLnNldE1vbnRoKGQodGhpcy5fZ2V0KGEsYy5tYXRjaCgvTU0vKT8ibW9udGhOYW1lcyI6Im1vbnRoTmFtZXNTaG9ydCIpKSksYi5zZXREYXRlKGQodGhpcy5fZ2V0KGEsYy5tYXRjaCgvREQvKT8iZGF5TmFtZXMiOiJkYXlOYW1lc1Nob3J0IikpKzIwLWIuZ2V0RGF5KCkpfWEuaW5wdXQuYXR0cigic2l6ZSIsdGhpcy5fZm9ybWF0RGF0ZShhLGIpLmxlbmd0aCl9fSxfaW5saW5lRGF0ZXBpY2tlcjpmdW5jdGlvbihhLGIpe3ZhciBjPSQoYSk7aWYoYy5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkpcmV0dXJuO2MuYWRkQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpLmFwcGVuZChiLmRwRGl2KS5iaW5kKCJzZXREYXRhLmRhdGVwaWNrZXIiLGZ1bmN0aW9uKGEsYyxkKXtiLnNldHRpbmdzW2NdPWR9KS5iaW5kKCJnZXREYXRhLmRhdGVwaWNrZXIiLGZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuX2dldChiLGMpfSksJC5kYXRhKGEsUFJPUF9OQU1FLGIpLHRoaXMuX3NldERhdGUoYix0aGlzLl9nZXREZWZhdWx0RGF0ZShiKSwhMCksdGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihiKSx0aGlzLl91cGRhdGVBbHRlcm5hdGUoYiksYi5zZXR0aW5ncy5kaXNhYmxlZCYmdGhpcy5fZGlzYWJsZURhdGVwaWNrZXIoYSksYi5kcERpdi5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxfZGlhbG9nRGF0ZXBpY2tlcjpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPXRoaXMuX2RpYWxvZ0luc3Q7aWYoIWYpe3RoaXMudXVpZCs9MTt2YXIgZz0iZHAiK3RoaXMudXVpZDt0aGlzLl9kaWFsb2dJbnB1dD0kKCc8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IicrZysnIiBzdHlsZT0icG9zaXRpb246IGFic29sdXRlOyB0b3A6IC0xMDBweDsgd2lkdGg6IDBweDsiLz4nKSx0aGlzLl9kaWFsb2dJbnB1dC5rZXlkb3duKHRoaXMuX2RvS2V5RG93biksJCgiYm9keSIpLmFwcGVuZCh0aGlzLl9kaWFsb2dJbnB1dCksZj10aGlzLl9kaWFsb2dJbnN0PXRoaXMuX25ld0luc3QodGhpcy5fZGlhbG9nSW5wdXQsITEpLGYuc2V0dGluZ3M9e30sJC5kYXRhKHRoaXMuX2RpYWxvZ0lucHV0WzBdLFBST1BfTkFNRSxmKX1leHRlbmRSZW1vdmUoZi5zZXR0aW5ncyxkfHx7fSksYj1iJiZiLmNvbnN0cnVjdG9yPT1EYXRlP3RoaXMuX2Zvcm1hdERhdGUoZixiKTpiLHRoaXMuX2RpYWxvZ0lucHV0LnZhbChiKSx0aGlzLl9wb3M9ZT9lLmxlbmd0aD9lOltlLnBhZ2VYLGUucGFnZVldOm51bGw7aWYoIXRoaXMuX3Bvcyl7dmFyIGg9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLGk9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCxqPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0fHxkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQsaz1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wfHxkb2N1bWVudC5ib2R5LnNjcm9sbFRvcDt0aGlzLl9wb3M9W2gvMi0xMDAraixpLzItMTUwK2tdfXJldHVybiB0aGlzLl9kaWFsb2dJbnB1dC5jc3MoImxlZnQiLHRoaXMuX3Bvc1swXSsyMCsicHgiKS5jc3MoInRvcCIsdGhpcy5fcG9zWzFdKyJweCIpLGYuc2V0dGluZ3Mub25TZWxlY3Q9Yyx0aGlzLl9pbkRpYWxvZz0hMCx0aGlzLmRwRGl2LmFkZENsYXNzKHRoaXMuX2RpYWxvZ0NsYXNzKSx0aGlzLl9zaG93RGF0ZXBpY2tlcih0aGlzLl9kaWFsb2dJbnB1dFswXSksJC5ibG9ja1VJJiYkLmJsb2NrVUkodGhpcy5kcERpdiksJC5kYXRhKHRoaXMuX2RpYWxvZ0lucHV0WzBdLFBST1BfTkFNRSxmKSx0aGlzfSxfZGVzdHJveURhdGVwaWNrZXI6ZnVuY3Rpb24oYSl7dmFyIGI9JChhKSxjPSQuZGF0YShhLFBST1BfTkFNRSk7aWYoIWIuaGFzQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpKXJldHVybjt2YXIgZD1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7JC5yZW1vdmVEYXRhKGEsUFJPUF9OQU1FKSxkPT0iaW5wdXQiPyhjLmFwcGVuZC5yZW1vdmUoKSxjLnRyaWdnZXIucmVtb3ZlKCksYi5yZW1vdmVDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkudW5iaW5kKCJmb2N1cyIsdGhpcy5fc2hvd0RhdGVwaWNrZXIpLnVuYmluZCgia2V5ZG93biIsdGhpcy5fZG9LZXlEb3duKS51bmJpbmQoImtleXByZXNzIix0aGlzLl9kb0tleVByZXNzKS51bmJpbmQoImtleXVwIix0aGlzLl9kb0tleVVwKSk6KGQ9PSJkaXYifHxkPT0ic3BhbiIpJiZiLnJlbW92ZUNsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKS5lbXB0eSgpfSxfZW5hYmxlRGF0ZXBpY2tlcjpmdW5jdGlvbihhKXt2YXIgYj0kKGEpLGM9JC5kYXRhKGEsUFJPUF9OQU1FKTtpZighYi5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkpcmV0dXJuO3ZhciBkPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZihkPT0iaW5wdXQiKWEuZGlzYWJsZWQ9ITEsYy50cmlnZ2VyLmZpbHRlcigiYnV0dG9uIikuZWFjaChmdW5jdGlvbigpe3RoaXMuZGlzYWJsZWQ9ITF9KS5lbmQoKS5maWx0ZXIoImltZyIpLmNzcyh7b3BhY2l0eToiMS4wIixjdXJzb3I6IiJ9KTtlbHNlIGlmKGQ9PSJkaXYifHxkPT0ic3BhbiIpe3ZhciBlPWIuY2hpbGRyZW4oIi4iK3RoaXMuX2lubGluZUNsYXNzKTtlLmNoaWxkcmVuKCkucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIiksZS5maW5kKCJzZWxlY3QudWktZGF0ZXBpY2tlci1tb250aCwgc2VsZWN0LnVpLWRhdGVwaWNrZXIteWVhciIpLnJlbW92ZUF0dHIoImRpc2FibGVkIil9dGhpcy5fZGlzYWJsZWRJbnB1dHM9JC5tYXAodGhpcy5fZGlzYWJsZWRJbnB1dHMsZnVuY3Rpb24oYil7cmV0dXJuIGI9PWE/bnVsbDpifSl9LF9kaXNhYmxlRGF0ZXBpY2tlcjpmdW5jdGlvbihhKXt2YXIgYj0kKGEpLGM9JC5kYXRhKGEsUFJPUF9OQU1FKTtpZighYi5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkpcmV0dXJuO3ZhciBkPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZihkPT0iaW5wdXQiKWEuZGlzYWJsZWQ9ITAsYy50cmlnZ2VyLmZpbHRlcigiYnV0dG9uIikuZWFjaChmdW5jdGlvbigpe3RoaXMuZGlzYWJsZWQ9ITB9KS5lbmQoKS5maWx0ZXIoImltZyIpLmNzcyh7b3BhY2l0eToiMC41IixjdXJzb3I6ImRlZmF1bHQifSk7ZWxzZSBpZihkPT0iZGl2Inx8ZD09InNwYW4iKXt2YXIgZT1iLmNoaWxkcmVuKCIuIit0aGlzLl9pbmxpbmVDbGFzcyk7ZS5jaGlsZHJlbigpLmFkZENsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpLGUuZmluZCgic2VsZWN0LnVpLWRhdGVwaWNrZXItbW9udGgsIHNlbGVjdC51aS1kYXRlcGlja2VyLXllYXIiKS5hdHRyKCJkaXNhYmxlZCIsImRpc2FibGVkIil9dGhpcy5fZGlzYWJsZWRJbnB1dHM9JC5tYXAodGhpcy5fZGlzYWJsZWRJbnB1dHMsZnVuY3Rpb24oYil7cmV0dXJuIGI9PWE/bnVsbDpifSksdGhpcy5fZGlzYWJsZWRJbnB1dHNbdGhpcy5fZGlzYWJsZWRJbnB1dHMubGVuZ3RoXT1hfSxfaXNEaXNhYmxlZERhdGVwaWNrZXI6ZnVuY3Rpb24oYSl7aWYoIWEpcmV0dXJuITE7Zm9yKHZhciBiPTA7Yjx0aGlzLl9kaXNhYmxlZElucHV0cy5sZW5ndGg7YisrKWlmKHRoaXMuX2Rpc2FibGVkSW5wdXRzW2JdPT1hKXJldHVybiEwO3JldHVybiExfSxfZ2V0SW5zdDpmdW5jdGlvbihhKXt0cnl7cmV0dXJuICQuZGF0YShhLFBST1BfTkFNRSl9Y2F0Y2goYil7dGhyb3ciTWlzc2luZyBpbnN0YW5jZSBkYXRhIGZvciB0aGlzIGRhdGVwaWNrZXIifX0sX29wdGlvbkRhdGVwaWNrZXI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuX2dldEluc3QoYSk7aWYoYXJndW1lbnRzLmxlbmd0aD09MiYmdHlwZW9mIGI9PSJzdHJpbmciKXJldHVybiBiPT0iZGVmYXVsdHMiPyQuZXh0ZW5kKHt9LCQuZGF0ZXBpY2tlci5fZGVmYXVsdHMpOmQ/Yj09ImFsbCI/JC5leHRlbmQoe30sZC5zZXR0aW5ncyk6dGhpcy5fZ2V0KGQsYik6bnVsbDt2YXIgZT1ifHx7fTt0eXBlb2YgYj09InN0cmluZyImJihlPXt9LGVbYl09Yyk7aWYoZCl7dGhpcy5fY3VySW5zdD09ZCYmdGhpcy5faGlkZURhdGVwaWNrZXIoKTt2YXIgZj10aGlzLl9nZXREYXRlRGF0ZXBpY2tlcihhLCEwKSxnPXRoaXMuX2dldE1pbk1heERhdGUoZCwibWluIiksaD10aGlzLl9nZXRNaW5NYXhEYXRlKGQsIm1heCIpO2V4dGVuZFJlbW92ZShkLnNldHRpbmdzLGUpLGchPT1udWxsJiZlLmRhdGVGb3JtYXQhPT11bmRlZmluZWQmJmUubWluRGF0ZT09PXVuZGVmaW5lZCYmKGQuc2V0dGluZ3MubWluRGF0ZT10aGlzLl9mb3JtYXREYXRlKGQsZykpLGghPT1udWxsJiZlLmRhdGVGb3JtYXQhPT11bmRlZmluZWQmJmUubWF4RGF0ZT09PXVuZGVmaW5lZCYmKGQuc2V0dGluZ3MubWF4RGF0ZT10aGlzLl9mb3JtYXREYXRlKGQsaCkpLHRoaXMuX2F0dGFjaG1lbnRzKCQoYSksZCksdGhpcy5fYXV0b1NpemUoZCksdGhpcy5fc2V0RGF0ZShkLGYpLHRoaXMuX3VwZGF0ZUFsdGVybmF0ZShkKSx0aGlzLl91cGRhdGVEYXRlcGlja2VyKGQpfX0sX2NoYW5nZURhdGVwaWNrZXI6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuX29wdGlvbkRhdGVwaWNrZXIoYSxiLGMpfSxfcmVmcmVzaERhdGVwaWNrZXI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fZ2V0SW5zdChhKTtiJiZ0aGlzLl91cGRhdGVEYXRlcGlja2VyKGIpfSxfc2V0RGF0ZURhdGVwaWNrZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLl9nZXRJbnN0KGEpO2MmJih0aGlzLl9zZXREYXRlKGMsYiksdGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihjKSx0aGlzLl91cGRhdGVBbHRlcm5hdGUoYykpfSxfZ2V0RGF0ZURhdGVwaWNrZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLl9nZXRJbnN0KGEpO3JldHVybiBjJiYhYy5pbmxpbmUmJnRoaXMuX3NldERhdGVGcm9tRmllbGQoYyxiKSxjP3RoaXMuX2dldERhdGUoYyk6bnVsbH0sX2RvS2V5RG93bjpmdW5jdGlvbihhKXt2YXIgYj0kLmRhdGVwaWNrZXIuX2dldEluc3QoYS50YXJnZXQpLGM9ITAsZD1iLmRwRGl2LmlzKCIudWktZGF0ZXBpY2tlci1ydGwiKTtiLl9rZXlFdmVudD0hMDtpZigkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nKXN3aXRjaChhLmtleUNvZGUpe2Nhc2UgOTokLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCksYz0hMTticmVhaztjYXNlIDEzOnZhciBlPSQoInRkLiIrJC5kYXRlcGlja2VyLl9kYXlPdmVyQ2xhc3MrIjpub3QoLiIrJC5kYXRlcGlja2VyLl9jdXJyZW50Q2xhc3MrIikiLGIuZHBEaXYpO2VbMF0mJiQuZGF0ZXBpY2tlci5fc2VsZWN0RGF5KGEudGFyZ2V0LGIuc2VsZWN0ZWRNb250aCxiLnNlbGVjdGVkWWVhcixlWzBdKTt2YXIgZj0kLmRhdGVwaWNrZXIuX2dldChiLCJvblNlbGVjdCIpO2lmKGYpe3ZhciBnPSQuZGF0ZXBpY2tlci5fZm9ybWF0RGF0ZShiKTtmLmFwcGx5KGIuaW5wdXQ/Yi5pbnB1dFswXTpudWxsLFtnLGJdKX1lbHNlICQuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKTtyZXR1cm4hMTtjYXNlIDI3OiQuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKTticmVhaztjYXNlIDMzOiQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShhLnRhcmdldCxhLmN0cmxLZXk/LSQuZGF0ZXBpY2tlci5fZ2V0KGIsInN0ZXBCaWdNb250aHMiKTotJC5kYXRlcGlja2VyLl9nZXQoYiwic3RlcE1vbnRocyIpLCJNIik7YnJlYWs7Y2FzZSAzNDokLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoYS50YXJnZXQsYS5jdHJsS2V5PyskLmRhdGVwaWNrZXIuX2dldChiLCJzdGVwQmlnTW9udGhzIik6KyQuZGF0ZXBpY2tlci5fZ2V0KGIsInN0ZXBNb250aHMiKSwiTSIpO2JyZWFrO2Nhc2UgMzU6KGEuY3RybEtleXx8YS5tZXRhS2V5KSYmJC5kYXRlcGlja2VyLl9jbGVhckRhdGUoYS50YXJnZXQpLGM9YS5jdHJsS2V5fHxhLm1ldGFLZXk7YnJlYWs7Y2FzZSAzNjooYS5jdHJsS2V5fHxhLm1ldGFLZXkpJiYkLmRhdGVwaWNrZXIuX2dvdG9Ub2RheShhLnRhcmdldCksYz1hLmN0cmxLZXl8fGEubWV0YUtleTticmVhaztjYXNlIDM3OihhLmN0cmxLZXl8fGEubWV0YUtleSkmJiQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShhLnRhcmdldCxkPzE6LTEsIkQiKSxjPWEuY3RybEtleXx8YS5tZXRhS2V5LGEub3JpZ2luYWxFdmVudC5hbHRLZXkmJiQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShhLnRhcmdldCxhLmN0cmxLZXk/LSQuZGF0ZXBpY2tlci5fZ2V0KGIsInN0ZXBCaWdNb250aHMiKTotJC5kYXRlcGlja2VyLl9nZXQoYiwic3RlcE1vbnRocyIpLCJNIik7YnJlYWs7Y2FzZSAzODooYS5jdHJsS2V5fHxhLm1ldGFLZXkpJiYkLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoYS50YXJnZXQsLTcsIkQiKSxjPWEuY3RybEtleXx8YS5tZXRhS2V5O2JyZWFrO2Nhc2UgMzk6KGEuY3RybEtleXx8YS5tZXRhS2V5KSYmJC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGEudGFyZ2V0LGQ/LTE6MSwiRCIpLGM9YS5jdHJsS2V5fHxhLm1ldGFLZXksYS5vcmlnaW5hbEV2ZW50LmFsdEtleSYmJC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGEudGFyZ2V0LGEuY3RybEtleT8rJC5kYXRlcGlja2VyLl9nZXQoYiwic3RlcEJpZ01vbnRocyIpOiskLmRhdGVwaWNrZXIuX2dldChiLCJzdGVwTW9udGhzIiksIk0iKTticmVhaztjYXNlIDQwOihhLmN0cmxLZXl8fGEubWV0YUtleSkmJiQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShhLnRhcmdldCw3LCJEIiksYz1hLmN0cmxLZXl8fGEubWV0YUtleTticmVhaztkZWZhdWx0OmM9ITF9ZWxzZSBhLmtleUNvZGU9PTM2JiZhLmN0cmxLZXk/JC5kYXRlcGlja2VyLl9zaG93RGF0ZXBpY2tlcih0aGlzKTpjPSExO2MmJihhLnByZXZlbnREZWZhdWx0KCksYS5zdG9wUHJvcGFnYXRpb24oKSl9LF9kb0tleVByZXNzOmZ1bmN0aW9uKGEpe3ZhciBiPSQuZGF0ZXBpY2tlci5fZ2V0SW5zdChhLnRhcmdldCk7aWYoJC5kYXRlcGlja2VyLl9nZXQoYiwiY29uc3RyYWluSW5wdXQiKSl7dmFyIGM9JC5kYXRlcGlja2VyLl9wb3NzaWJsZUNoYXJzKCQuZGF0ZXBpY2tlci5fZ2V0KGIsImRhdGVGb3JtYXQiKSksZD1TdHJpbmcuZnJvbUNoYXJDb2RlKGEuY2hhckNvZGU9PXVuZGVmaW5lZD9hLmtleUNvZGU6YS5jaGFyQ29kZSk7cmV0dXJuIGEuY3RybEtleXx8YS5tZXRhS2V5fHxkPCIgInx8IWN8fGMuaW5kZXhPZihkKT4tMX19LF9kb0tleVVwOmZ1bmN0aW9uKGEpe3ZhciBiPSQuZGF0ZXBpY2tlci5fZ2V0SW5zdChhLnRhcmdldCk7aWYoYi5pbnB1dC52YWwoKSE9Yi5sYXN0VmFsKXRyeXt2YXIgYz0kLmRhdGVwaWNrZXIucGFyc2VEYXRlKCQuZGF0ZXBpY2tlci5fZ2V0KGIsImRhdGVGb3JtYXQiKSxiLmlucHV0P2IuaW5wdXQudmFsKCk6bnVsbCwkLmRhdGVwaWNrZXIuX2dldEZvcm1hdENvbmZpZyhiKSk7YyYmKCQuZGF0ZXBpY2tlci5fc2V0RGF0ZUZyb21GaWVsZChiKSwkLmRhdGVwaWNrZXIuX3VwZGF0ZUFsdGVybmF0ZShiKSwkLmRhdGVwaWNrZXIuX3VwZGF0ZURhdGVwaWNrZXIoYikpfWNhdGNoKGQpeyQuZGF0ZXBpY2tlci5sb2coZCl9cmV0dXJuITB9LF9zaG93RGF0ZXBpY2tlcjpmdW5jdGlvbihhKXthPWEudGFyZ2V0fHxhLGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9ImlucHV0IiYmKGE9JCgiaW5wdXQiLGEucGFyZW50Tm9kZSlbMF0pO2lmKCQuZGF0ZXBpY2tlci5faXNEaXNhYmxlZERhdGVwaWNrZXIoYSl8fCQuZGF0ZXBpY2tlci5fbGFzdElucHV0PT1hKXJldHVybjt2YXIgYj0kLmRhdGVwaWNrZXIuX2dldEluc3QoYSk7JC5kYXRlcGlja2VyLl9jdXJJbnN0JiYkLmRhdGVwaWNrZXIuX2N1ckluc3QhPWImJigkLmRhdGVwaWNrZXIuX2N1ckluc3QuZHBEaXYuc3RvcCghMCwhMCksYiYmJC5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZyYmJC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigkLmRhdGVwaWNrZXIuX2N1ckluc3QuaW5wdXRbMF0pKTt2YXIgYz0kLmRhdGVwaWNrZXIuX2dldChiLCJiZWZvcmVTaG93IiksZD1jP2MuYXBwbHkoYSxbYSxiXSk6e307aWYoZD09PSExKXJldHVybjtleHRlbmRSZW1vdmUoYi5zZXR0aW5ncyxkKSxiLmxhc3RWYWw9bnVsbCwkLmRhdGVwaWNrZXIuX2xhc3RJbnB1dD1hLCQuZGF0ZXBpY2tlci5fc2V0RGF0ZUZyb21GaWVsZChiKSwkLmRhdGVwaWNrZXIuX2luRGlhbG9nJiYoYS52YWx1ZT0iIiksJC5kYXRlcGlja2VyLl9wb3N8fCgkLmRhdGVwaWNrZXIuX3Bvcz0kLmRhdGVwaWNrZXIuX2ZpbmRQb3MoYSksJC5kYXRlcGlja2VyLl9wb3NbMV0rPWEub2Zmc2V0SGVpZ2h0KTt2YXIgZT0hMTskKGEpLnBhcmVudHMoKS5lYWNoKGZ1bmN0aW9uKCl7cmV0dXJuIGV8PSQodGhpcykuY3NzKCJwb3NpdGlvbiIpPT0iZml4ZWQiLCFlfSksZSYmJC5icm93c2VyLm9wZXJhJiYoJC5kYXRlcGlja2VyLl9wb3NbMF0tPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0LCQuZGF0ZXBpY2tlci5fcG9zWzFdLT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wKTt2YXIgZj17bGVmdDokLmRhdGVwaWNrZXIuX3Bvc1swXSx0b3A6JC5kYXRlcGlja2VyLl9wb3NbMV19OyQuZGF0ZXBpY2tlci5fcG9zPW51bGwsYi5kcERpdi5lbXB0eSgpLGIuZHBEaXYuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLGRpc3BsYXk6ImJsb2NrIix0b3A6Ii0xMDAwcHgifSksJC5kYXRlcGlja2VyLl91cGRhdGVEYXRlcGlja2VyKGIpLGY9JC5kYXRlcGlja2VyLl9jaGVja09mZnNldChiLGYsZSksYi5kcERpdi5jc3Moe3Bvc2l0aW9uOiQuZGF0ZXBpY2tlci5faW5EaWFsb2cmJiQuYmxvY2tVST8ic3RhdGljIjplPyJmaXhlZCI6ImFic29sdXRlIixkaXNwbGF5OiJub25lIixsZWZ0OmYubGVmdCsicHgiLHRvcDpmLnRvcCsicHgifSk7aWYoIWIuaW5saW5lKXt2YXIgZz0kLmRhdGVwaWNrZXIuX2dldChiLCJzaG93QW5pbSIpLGg9JC5kYXRlcGlja2VyLl9nZXQoYiwiZHVyYXRpb24iKSxpPWZ1bmN0aW9uKCl7dmFyIGE9Yi5kcERpdi5maW5kKCJpZnJhbWUudWktZGF0ZXBpY2tlci1jb3ZlciIpO2lmKCEhYS5sZW5ndGgpe3ZhciBjPSQuZGF0ZXBpY2tlci5fZ2V0Qm9yZGVycyhiLmRwRGl2KTthLmNzcyh7bGVmdDotY1swXSx0b3A6LWNbMV0sd2lkdGg6Yi5kcERpdi5vdXRlcldpZHRoKCksaGVpZ2h0OmIuZHBEaXYub3V0ZXJIZWlnaHQoKX0pfX07Yi5kcERpdi56SW5kZXgoJChhKS56SW5kZXgoKSsxKSwkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nPSEwLCQuZWZmZWN0cyYmJC5lZmZlY3RzW2ddP2IuZHBEaXYuc2hvdyhnLCQuZGF0ZXBpY2tlci5fZ2V0KGIsInNob3dPcHRpb25zIiksaCxpKTpiLmRwRGl2W2d8fCJzaG93Il0oZz9oOm51bGwsaSksKCFnfHwhaCkmJmkoKSxiLmlucHV0LmlzKCI6dmlzaWJsZSIpJiYhYi5pbnB1dC5pcygiOmRpc2FibGVkIikmJmIuaW5wdXQuZm9jdXMoKSwkLmRhdGVwaWNrZXIuX2N1ckluc3Q9Yn19LF91cGRhdGVEYXRlcGlja2VyOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7Yi5tYXhSb3dzPTQ7dmFyIGM9JC5kYXRlcGlja2VyLl9nZXRCb3JkZXJzKGEuZHBEaXYpO2luc3RBY3RpdmU9YSxhLmRwRGl2LmVtcHR5KCkuYXBwZW5kKHRoaXMuX2dlbmVyYXRlSFRNTChhKSksdGhpcy5fYXR0YWNoSGFuZGxlcnMoYSk7dmFyIGQ9YS5kcERpdi5maW5kKCJpZnJhbWUudWktZGF0ZXBpY2tlci1jb3ZlciIpOyFkLmxlbmd0aHx8ZC5jc3Moe2xlZnQ6LWNbMF0sdG9wOi1jWzFdLHdpZHRoOmEuZHBEaXYub3V0ZXJXaWR0aCgpLGhlaWdodDphLmRwRGl2Lm91dGVySGVpZ2h0KCl9KSxhLmRwRGl2LmZpbmQoIi4iK3RoaXMuX2RheU92ZXJDbGFzcysiIGEiKS5tb3VzZW92ZXIoKTt2YXIgZT10aGlzLl9nZXROdW1iZXJPZk1vbnRocyhhKSxmPWVbMV0sZz0xNzthLmRwRGl2LnJlbW92ZUNsYXNzKCJ1aS1kYXRlcGlja2VyLW11bHRpLTIgdWktZGF0ZXBpY2tlci1tdWx0aS0zIHVpLWRhdGVwaWNrZXItbXVsdGktNCIpLndpZHRoKCIiKSxmPjEmJmEuZHBEaXYuYWRkQ2xhc3MoInVpLWRhdGVwaWNrZXItbXVsdGktIitmKS5jc3MoIndpZHRoIixnKmYrImVtIiksYS5kcERpdlsoZVswXSE9MXx8ZVsxXSE9MT8iYWRkIjoicmVtb3ZlIikrIkNsYXNzIl0oInVpLWRhdGVwaWNrZXItbXVsdGkiKSxhLmRwRGl2Wyh0aGlzLl9nZXQoYSwiaXNSVEwiKT8iYWRkIjoicmVtb3ZlIikrIkNsYXNzIl0oInVpLWRhdGVwaWNrZXItcnRsIiksYT09JC5kYXRlcGlja2VyLl9jdXJJbnN0JiYkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nJiZhLmlucHV0JiZhLmlucHV0LmlzKCI6dmlzaWJsZSIpJiYhYS5pbnB1dC5pcygiOmRpc2FibGVkIikmJmEuaW5wdXRbMF0hPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQmJmEuaW5wdXQuZm9jdXMoKTtpZihhLnllYXJzaHRtbCl7dmFyIGg9YS55ZWFyc2h0bWw7c2V0VGltZW91dChmdW5jdGlvbigpe2g9PT1hLnllYXJzaHRtbCYmYS55ZWFyc2h0bWwmJmEuZHBEaXYuZmluZCgic2VsZWN0LnVpLWRhdGVwaWNrZXIteWVhcjpmaXJzdCIpLnJlcGxhY2VXaXRoKGEueWVhcnNodG1sKSxoPWEueWVhcnNodG1sPW51bGx9LDApfX0sX2dldEJvcmRlcnM6ZnVuY3Rpb24oYSl7dmFyIGI9ZnVuY3Rpb24oYSl7cmV0dXJue3RoaW46MSxtZWRpdW06Mix0aGljazozfVthXXx8YX07cmV0dXJuW3BhcnNlRmxvYXQoYihhLmNzcygiYm9yZGVyLWxlZnQtd2lkdGgiKSkpLHBhcnNlRmxvYXQoYihhLmNzcygiYm9yZGVyLXRvcC13aWR0aCIpKSldfSxfY2hlY2tPZmZzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZHBEaXYub3V0ZXJXaWR0aCgpLGU9YS5kcERpdi5vdXRlckhlaWdodCgpLGY9YS5pbnB1dD9hLmlucHV0Lm91dGVyV2lkdGgoKTowLGc9YS5pbnB1dD9hLmlucHV0Lm91dGVySGVpZ2h0KCk6MCxoPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCsoYz8wOiQoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSksaT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KyhjPzA6JChkb2N1bWVudCkuc2Nyb2xsVG9wKCkpO3JldHVybiBiLmxlZnQtPXRoaXMuX2dldChhLCJpc1JUTCIpP2QtZjowLGIubGVmdC09YyYmYi5sZWZ0PT1hLmlucHV0Lm9mZnNldCgpLmxlZnQ/JChkb2N1bWVudCkuc2Nyb2xsTGVmdCgpOjAsYi50b3AtPWMmJmIudG9wPT1hLmlucHV0Lm9mZnNldCgpLnRvcCtnPyQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpOjAsYi5sZWZ0LT1NYXRoLm1pbihiLmxlZnQsYi5sZWZ0K2Q+aCYmaD5kP01hdGguYWJzKGIubGVmdCtkLWgpOjApLGIudG9wLT1NYXRoLm1pbihiLnRvcCxiLnRvcCtlPmkmJmk+ZT9NYXRoLmFicyhlK2cpOjApLGJ9LF9maW5kUG9zOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuX2dldEluc3QoYSksYz10aGlzLl9nZXQoYiwiaXNSVEwiKTt3aGlsZShhJiYoYS50eXBlPT0iaGlkZGVuInx8YS5ub2RlVHlwZSE9MXx8JC5leHByLmZpbHRlcnMuaGlkZGVuKGEpKSlhPWFbYz8icHJldmlvdXNTaWJsaW5nIjoibmV4dFNpYmxpbmciXTt2YXIgZD0kKGEpLm9mZnNldCgpO3JldHVybltkLmxlZnQsZC50b3BdfSxfaGlkZURhdGVwaWNrZXI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fY3VySW5zdDtpZighYnx8YSYmYiE9JC5kYXRhKGEsUFJPUF9OQU1FKSlyZXR1cm47aWYodGhpcy5fZGF0ZXBpY2tlclNob3dpbmcpe3ZhciBjPXRoaXMuX2dldChiLCJzaG93QW5pbSIpLGQ9dGhpcy5fZ2V0KGIsImR1cmF0aW9uIiksZT1mdW5jdGlvbigpeyQuZGF0ZXBpY2tlci5fdGlkeURpYWxvZyhiKX07JC5lZmZlY3RzJiYkLmVmZmVjdHNbY10/Yi5kcERpdi5oaWRlKGMsJC5kYXRlcGlja2VyLl9nZXQoYiwic2hvd09wdGlvbnMiKSxkLGUpOmIuZHBEaXZbYz09InNsaWRlRG93biI/InNsaWRlVXAiOmM9PSJmYWRlSW4iPyJmYWRlT3V0IjoiaGlkZSJdKGM/ZDpudWxsLGUpLGN8fGUoKSx0aGlzLl9kYXRlcGlja2VyU2hvd2luZz0hMTt2YXIgZj10aGlzLl9nZXQoYiwib25DbG9zZSIpO2YmJmYuYXBwbHkoYi5pbnB1dD9iLmlucHV0WzBdOm51bGwsW2IuaW5wdXQ/Yi5pbnB1dC52YWwoKToiIixiXSksdGhpcy5fbGFzdElucHV0PW51bGwsdGhpcy5faW5EaWFsb2cmJih0aGlzLl9kaWFsb2dJbnB1dC5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDoiMCIsdG9wOiItMTAwcHgifSksJC5ibG9ja1VJJiYoJC51bmJsb2NrVUkoKSwkKCJib2R5IikuYXBwZW5kKHRoaXMuZHBEaXYpKSksdGhpcy5faW5EaWFsb2c9ITF9fSxfdGlkeURpYWxvZzpmdW5jdGlvbihhKXthLmRwRGl2LnJlbW92ZUNsYXNzKHRoaXMuX2RpYWxvZ0NsYXNzKS51bmJpbmQoIi51aS1kYXRlcGlja2VyLWNhbGVuZGFyIil9LF9jaGVja0V4dGVybmFsQ2xpY2s6ZnVuY3Rpb24oYSl7aWYoISQuZGF0ZXBpY2tlci5fY3VySW5zdClyZXR1cm47dmFyIGI9JChhLnRhcmdldCksYz0kLmRhdGVwaWNrZXIuX2dldEluc3QoYlswXSk7KGJbMF0uaWQhPSQuZGF0ZXBpY2tlci5fbWFpbkRpdklkJiZiLnBhcmVudHMoIiMiKyQuZGF0ZXBpY2tlci5fbWFpbkRpdklkKS5sZW5ndGg9PTAmJiFiLmhhc0NsYXNzKCQuZGF0ZXBpY2tlci5tYXJrZXJDbGFzc05hbWUpJiYhYi5jbG9zZXN0KCIuIiskLmRhdGVwaWNrZXIuX3RyaWdnZXJDbGFzcykubGVuZ3RoJiYkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nJiYoISQuZGF0ZXBpY2tlci5faW5EaWFsb2d8fCEkLmJsb2NrVUkpfHxiLmhhc0NsYXNzKCQuZGF0ZXBpY2tlci5tYXJrZXJDbGFzc05hbWUpJiYkLmRhdGVwaWNrZXIuX2N1ckluc3QhPWMpJiYkLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCl9LF9hZGp1c3REYXRlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0kKGEpLGU9dGhpcy5fZ2V0SW5zdChkWzBdKTtpZih0aGlzLl9pc0Rpc2FibGVkRGF0ZXBpY2tlcihkWzBdKSlyZXR1cm47dGhpcy5fYWRqdXN0SW5zdERhdGUoZSxiKyhjPT0iTSI/dGhpcy5fZ2V0KGUsInNob3dDdXJyZW50QXRQb3MiKTowKSxjKSx0aGlzLl91cGRhdGVEYXRlcGlja2VyKGUpfSxfZ290b1RvZGF5OmZ1bmN0aW9uKGEpe3ZhciBiPSQoYSksYz10aGlzLl9nZXRJbnN0KGJbMF0pO2lmKHRoaXMuX2dldChjLCJnb3RvQ3VycmVudCIpJiZjLmN1cnJlbnREYXkpYy5zZWxlY3RlZERheT1jLmN1cnJlbnREYXksYy5kcmF3TW9udGg9Yy5zZWxlY3RlZE1vbnRoPWMuY3VycmVudE1vbnRoLGMuZHJhd1llYXI9Yy5zZWxlY3RlZFllYXI9Yy5jdXJyZW50WWVhcjtlbHNle3ZhciBkPW5ldyBEYXRlO2Muc2VsZWN0ZWREYXk9ZC5nZXREYXRlKCksYy5kcmF3TW9udGg9Yy5zZWxlY3RlZE1vbnRoPWQuZ2V0TW9udGgoKSxjLmRyYXdZZWFyPWMuc2VsZWN0ZWRZZWFyPWQuZ2V0RnVsbFllYXIoKX10aGlzLl9ub3RpZnlDaGFuZ2UoYyksdGhpcy5fYWRqdXN0RGF0ZShiKX0sX3NlbGVjdE1vbnRoWWVhcjpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9JChhKSxlPXRoaXMuX2dldEluc3QoZFswXSk7ZVsic2VsZWN0ZWQiKyhjPT0iTSI/Ik1vbnRoIjoiWWVhciIpXT1lWyJkcmF3IisoYz09Ik0iPyJNb250aCI6IlllYXIiKV09cGFyc2VJbnQoYi5vcHRpb25zW2Iuc2VsZWN0ZWRJbmRleF0udmFsdWUsMTApLHRoaXMuX25vdGlmeUNoYW5nZShlKSx0aGlzLl9hZGp1c3REYXRlKGQpfSxfc2VsZWN0RGF5OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSQoYSk7aWYoJChkKS5oYXNDbGFzcyh0aGlzLl91bnNlbGVjdGFibGVDbGFzcyl8fHRoaXMuX2lzRGlzYWJsZWREYXRlcGlja2VyKGVbMF0pKXJldHVybjt2YXIgZj10aGlzLl9nZXRJbnN0KGVbMF0pO2Yuc2VsZWN0ZWREYXk9Zi5jdXJyZW50RGF5PSQoImEiLGQpLmh0bWwoKSxmLnNlbGVjdGVkTW9udGg9Zi5jdXJyZW50TW9udGg9YixmLnNlbGVjdGVkWWVhcj1mLmN1cnJlbnRZZWFyPWMsdGhpcy5fc2VsZWN0RGF0ZShhLHRoaXMuX2Zvcm1hdERhdGUoZixmLmN1cnJlbnREYXksZi5jdXJyZW50TW9udGgsZi5jdXJyZW50WWVhcikpfSxfY2xlYXJEYXRlOmZ1bmN0aW9uKGEpe3ZhciBiPSQoYSksYz10aGlzLl9nZXRJbnN0KGJbMF0pO3RoaXMuX3NlbGVjdERhdGUoYiwiIil9LF9zZWxlY3REYXRlOmZ1bmN0aW9uKGEsYil7dmFyIGM9JChhKSxkPXRoaXMuX2dldEluc3QoY1swXSk7Yj1iIT1udWxsP2I6dGhpcy5fZm9ybWF0RGF0ZShkKSxkLmlucHV0JiZkLmlucHV0LnZhbChiKSx0aGlzLl91cGRhdGVBbHRlcm5hdGUoZCk7dmFyIGU9dGhpcy5fZ2V0KGQsIm9uU2VsZWN0Iik7ZT9lLmFwcGx5KGQuaW5wdXQ/ZC5pbnB1dFswXTpudWxsLFtiLGRdKTpkLmlucHV0JiZkLmlucHV0LnRyaWdnZXIoImNoYW5nZSIpLGQuaW5saW5lP3RoaXMuX3VwZGF0ZURhdGVwaWNrZXIoZCk6KHRoaXMuX2hpZGVEYXRlcGlja2VyKCksdGhpcy5fbGFzdElucHV0PWQuaW5wdXRbMF0sdHlwZW9mIGQuaW5wdXRbMF0hPSJvYmplY3QiJiZkLmlucHV0LmZvY3VzKCksdGhpcy5fbGFzdElucHV0PW51bGwpfSxfdXBkYXRlQWx0ZXJuYXRlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuX2dldChhLCJhbHRGaWVsZCIpO2lmKGIpe3ZhciBjPXRoaXMuX2dldChhLCJhbHRGb3JtYXQiKXx8dGhpcy5fZ2V0KGEsImRhdGVGb3JtYXQiKSxkPXRoaXMuX2dldERhdGUoYSksZT10aGlzLmZvcm1hdERhdGUoYyxkLHRoaXMuX2dldEZvcm1hdENvbmZpZyhhKSk7JChiKS5lYWNoKGZ1bmN0aW9uKCl7JCh0aGlzKS52YWwoZSl9KX19LG5vV2Vla2VuZHM6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXREYXkoKTtyZXR1cm5bYj4wJiZiPDYsIiJdfSxpc284NjAxV2VlazpmdW5jdGlvbihhKXt2YXIgYj1uZXcgRGF0ZShhLmdldFRpbWUoKSk7Yi5zZXREYXRlKGIuZ2V0RGF0ZSgpKzQtKGIuZ2V0RGF5KCl8fDcpKTt2YXIgYz1iLmdldFRpbWUoKTtyZXR1cm4gYi5zZXRNb250aCgwKSxiLnNldERhdGUoMSksTWF0aC5mbG9vcihNYXRoLnJvdW5kKChjLWIpLzg2NGU1KS83KSsxfSxwYXJzZURhdGU6ZnVuY3Rpb24oYSxiLGMpe2lmKGE9PW51bGx8fGI9PW51bGwpdGhyb3ciSW52YWxpZCBhcmd1bWVudHMiO2I9dHlwZW9mIGI9PSJvYmplY3QiP2IudG9TdHJpbmcoKTpiKyIiO2lmKGI9PSIiKXJldHVybiBudWxsO3ZhciBkPShjP2Muc2hvcnRZZWFyQ3V0b2ZmOm51bGwpfHx0aGlzLl9kZWZhdWx0cy5zaG9ydFllYXJDdXRvZmY7ZD10eXBlb2YgZCE9InN0cmluZyI/ZDoobmV3IERhdGUpLmdldEZ1bGxZZWFyKCklMTAwK3BhcnNlSW50KGQsMTApO3ZhciBlPShjP2MuZGF5TmFtZXNTaG9ydDpudWxsKXx8dGhpcy5fZGVmYXVsdHMuZGF5TmFtZXNTaG9ydCxmPShjP2MuZGF5TmFtZXM6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLmRheU5hbWVzLGc9KGM/Yy5tb250aE5hbWVzU2hvcnQ6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLm1vbnRoTmFtZXNTaG9ydCxoPShjP2MubW9udGhOYW1lczpudWxsKXx8dGhpcy5fZGVmYXVsdHMubW9udGhOYW1lcyxpPS0xLGo9LTEsaz0tMSxsPS0xLG09ITEsbj1mdW5jdGlvbihiKXt2YXIgYz1zKzE8YS5sZW5ndGgmJmEuY2hhckF0KHMrMSk9PWI7cmV0dXJuIGMmJnMrKyxjfSxvPWZ1bmN0aW9uKGEpe3ZhciBjPW4oYSksZD1hPT0iQCI/MTQ6YT09IiEiPzIwOmE9PSJ5IiYmYz80OmE9PSJvIj8zOjIsZT1uZXcgUmVnRXhwKCJeXFxkezEsIitkKyJ9IiksZj1iLnN1YnN0cmluZyhyKS5tYXRjaChlKTtpZighZil0aHJvdyJNaXNzaW5nIG51bWJlciBhdCBwb3NpdGlvbiAiK3I7cmV0dXJuIHIrPWZbMF0ubGVuZ3RoLHBhcnNlSW50KGZbMF0sMTApfSxwPWZ1bmN0aW9uKGEsYyxkKXt2YXIgZT0kLm1hcChuKGEpP2Q6YyxmdW5jdGlvbihhLGIpe3JldHVybltbYixhXV19KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuLShhWzFdLmxlbmd0aC1iWzFdLmxlbmd0aCl9KSxmPS0xOyQuZWFjaChlLGZ1bmN0aW9uKGEsYyl7dmFyIGQ9Y1sxXTtpZihiLnN1YnN0cihyLGQubGVuZ3RoKS50b0xvd2VyQ2FzZSgpPT1kLnRvTG93ZXJDYXNlKCkpcmV0dXJuIGY9Y1swXSxyKz1kLmxlbmd0aCwhMX0pO2lmKGYhPS0xKXJldHVybiBmKzE7dGhyb3ciVW5rbm93biBuYW1lIGF0IHBvc2l0aW9uICIrcn0scT1mdW5jdGlvbigpe2lmKGIuY2hhckF0KHIpIT1hLmNoYXJBdChzKSl0aHJvdyJVbmV4cGVjdGVkIGxpdGVyYWwgYXQgcG9zaXRpb24gIityO3IrK30scj0wO2Zvcih2YXIgcz0wO3M8YS5sZW5ndGg7cysrKWlmKG0pYS5jaGFyQXQocyk9PSInIiYmIW4oIiciKT9tPSExOnEoKTtlbHNlIHN3aXRjaChhLmNoYXJBdChzKSl7Y2FzZSJkIjprPW8oImQiKTticmVhaztjYXNlIkQiOnAoIkQiLGUsZik7YnJlYWs7Y2FzZSJvIjpsPW8oIm8iKTticmVhaztjYXNlIm0iOmo9bygibSIpO2JyZWFrO2Nhc2UiTSI6aj1wKCJNIixnLGgpO2JyZWFrO2Nhc2UieSI6aT1vKCJ5Iik7YnJlYWs7Y2FzZSJAIjp2YXIgdD1uZXcgRGF0ZShvKCJAIikpO2k9dC5nZXRGdWxsWWVhcigpLGo9dC5nZXRNb250aCgpKzEsaz10LmdldERhdGUoKTticmVhaztjYXNlIiEiOnZhciB0PW5ldyBEYXRlKChvKCIhIiktdGhpcy5fdGlja3NUbzE5NzApLzFlNCk7aT10LmdldEZ1bGxZZWFyKCksaj10LmdldE1vbnRoKCkrMSxrPXQuZ2V0RGF0ZSgpO2JyZWFrO2Nhc2UiJyI6bigiJyIpP3EoKTptPSEwO2JyZWFrO2RlZmF1bHQ6cSgpfWlmKHI8Yi5sZW5ndGgpdGhyb3ciRXh0cmEvdW5wYXJzZWQgY2hhcmFjdGVycyBmb3VuZCBpbiBkYXRlOiAiK2Iuc3Vic3RyaW5nKHIpO2k9PS0xP2k9KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpOmk8MTAwJiYoaSs9KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpLShuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSUxMDArKGk8PWQ/MDotMTAwKSk7aWYobD4tMSl7aj0xLGs9bDtkb3t2YXIgdT10aGlzLl9nZXREYXlzSW5Nb250aChpLGotMSk7aWYoazw9dSlicmVhaztqKyssay09dX13aGlsZSghMCl9dmFyIHQ9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoaSxqLTEsaykpO2lmKHQuZ2V0RnVsbFllYXIoKSE9aXx8dC5nZXRNb250aCgpKzEhPWp8fHQuZ2V0RGF0ZSgpIT1rKXRocm93IkludmFsaWQgZGF0ZSI7cmV0dXJuIHR9LEFUT006Inl5LW1tLWRkIixDT09LSUU6IkQsIGRkIE0geXkiLElTT184NjAxOiJ5eS1tbS1kZCIsUkZDXzgyMjoiRCwgZCBNIHkiLFJGQ184NTA6IkRELCBkZC1NLXkiLFJGQ18xMDM2OiJELCBkIE0geSIsUkZDXzExMjM6IkQsIGQgTSB5eSIsUkZDXzI4MjI6IkQsIGQgTSB5eSIsUlNTOiJELCBkIE0geSIsVElDS1M6IiEiLFRJTUVTVEFNUDoiQCIsVzNDOiJ5eS1tbS1kZCIsX3RpY2tzVG8xOTcwOig3MTg2ODUrTWF0aC5mbG9vcig0OTIuNSktTWF0aC5mbG9vcigxOS43KStNYXRoLmZsb29yKDQuOTI1KSkqMjQqNjAqNjAqMWU3LGZvcm1hdERhdGU6ZnVuY3Rpb24oYSxiLGMpe2lmKCFiKXJldHVybiIiO3ZhciBkPShjP2MuZGF5TmFtZXNTaG9ydDpudWxsKXx8dGhpcy5fZGVmYXVsdHMuZGF5TmFtZXNTaG9ydCxlPShjP2MuZGF5TmFtZXM6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLmRheU5hbWVzLGY9KGM/Yy5tb250aE5hbWVzU2hvcnQ6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLm1vbnRoTmFtZXNTaG9ydCxnPShjP2MubW9udGhOYW1lczpudWxsKXx8dGhpcy5fZGVmYXVsdHMubW9udGhOYW1lcyxoPWZ1bmN0aW9uKGIpe3ZhciBjPW0rMTxhLmxlbmd0aCYmYS5jaGFyQXQobSsxKT09YjtyZXR1cm4gYyYmbSsrLGN9LGk9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSIiK2I7aWYoaChhKSl3aGlsZShkLmxlbmd0aDxjKWQ9IjAiK2Q7cmV0dXJuIGR9LGo9ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGgoYSk/ZFtiXTpjW2JdfSxrPSIiLGw9ITE7aWYoYilmb3IodmFyIG09MDttPGEubGVuZ3RoO20rKylpZihsKWEuY2hhckF0KG0pPT0iJyImJiFoKCInIik/bD0hMTprKz1hLmNoYXJBdChtKTtlbHNlIHN3aXRjaChhLmNoYXJBdChtKSl7Y2FzZSJkIjprKz1pKCJkIixiLmdldERhdGUoKSwyKTticmVhaztjYXNlIkQiOmsrPWooIkQiLGIuZ2V0RGF5KCksZCxlKTticmVhaztjYXNlIm8iOmsrPWkoIm8iLE1hdGgucm91bmQoKChuZXcgRGF0ZShiLmdldEZ1bGxZZWFyKCksYi5nZXRNb250aCgpLGIuZ2V0RGF0ZSgpKSkuZ2V0VGltZSgpLShuZXcgRGF0ZShiLmdldEZ1bGxZZWFyKCksMCwwKSkuZ2V0VGltZSgpKS84NjRlNSksMyk7YnJlYWs7Y2FzZSJtIjprKz1pKCJtIixiLmdldE1vbnRoKCkrMSwyKTticmVhaztjYXNlIk0iOmsrPWooIk0iLGIuZ2V0TW9udGgoKSxmLGcpO2JyZWFrO2Nhc2UieSI6ays9aCgieSIpP2IuZ2V0RnVsbFllYXIoKTooYi5nZXRZZWFyKCklMTAwPDEwPyIwIjoiIikrYi5nZXRZZWFyKCklMTAwO2JyZWFrO2Nhc2UiQCI6ays9Yi5nZXRUaW1lKCk7YnJlYWs7Y2FzZSIhIjprKz1iLmdldFRpbWUoKSoxZTQrdGhpcy5fdGlja3NUbzE5NzA7YnJlYWs7Y2FzZSInIjpoKCInIik/ays9IiciOmw9ITA7YnJlYWs7ZGVmYXVsdDprKz1hLmNoYXJBdChtKX1yZXR1cm4ga30sX3Bvc3NpYmxlQ2hhcnM6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz0hMSxkPWZ1bmN0aW9uKGIpe3ZhciBjPWUrMTxhLmxlbmd0aCYmYS5jaGFyQXQoZSsxKT09YjtyZXR1cm4gYyYmZSsrLGN9O2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWlmKGMpYS5jaGFyQXQoZSk9PSInIiYmIWQoIiciKT9jPSExOmIrPWEuY2hhckF0KGUpO2Vsc2Ugc3dpdGNoKGEuY2hhckF0KGUpKXtjYXNlImQiOmNhc2UibSI6Y2FzZSJ5IjpjYXNlIkAiOmIrPSIwMTIzNDU2Nzg5IjticmVhaztjYXNlIkQiOmNhc2UiTSI6cmV0dXJuIG51bGw7Y2FzZSInIjpkKCInIik/Yis9IiciOmM9ITA7YnJlYWs7ZGVmYXVsdDpiKz1hLmNoYXJBdChlKX1yZXR1cm4gYn0sX2dldDpmdW5jdGlvbihhLGIpe3JldHVybiBhLnNldHRpbmdzW2JdIT09dW5kZWZpbmVkP2Euc2V0dGluZ3NbYl06dGhpcy5fZGVmYXVsdHNbYl19LF9zZXREYXRlRnJvbUZpZWxkOmZ1bmN0aW9uKGEsYil7aWYoYS5pbnB1dC52YWwoKT09YS5sYXN0VmFsKXJldHVybjt2YXIgYz10aGlzLl9nZXQoYSwiZGF0ZUZvcm1hdCIpLGQ9YS5sYXN0VmFsPWEuaW5wdXQ/YS5pbnB1dC52YWwoKTpudWxsLGUsZjtlPWY9dGhpcy5fZ2V0RGVmYXVsdERhdGUoYSk7dmFyIGc9dGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGEpO3RyeXtlPXRoaXMucGFyc2VEYXRlKGMsZCxnKXx8Zn1jYXRjaChoKXt0aGlzLmxvZyhoKSxkPWI/IiI6ZH1hLnNlbGVjdGVkRGF5PWUuZ2V0RGF0ZSgpLGEuZHJhd01vbnRoPWEuc2VsZWN0ZWRNb250aD1lLmdldE1vbnRoKCksYS5kcmF3WWVhcj1hLnNlbGVjdGVkWWVhcj1lLmdldEZ1bGxZZWFyKCksYS5jdXJyZW50RGF5PWQ/ZS5nZXREYXRlKCk6MCxhLmN1cnJlbnRNb250aD1kP2UuZ2V0TW9udGgoKTowLGEuY3VycmVudFllYXI9ZD9lLmdldEZ1bGxZZWFyKCk6MCx0aGlzLl9hZGp1c3RJbnN0RGF0ZShhKX0sX2dldERlZmF1bHREYXRlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9yZXN0cmljdE1pbk1heChhLHRoaXMuX2RldGVybWluZURhdGUoYSx0aGlzLl9nZXQoYSwiZGVmYXVsdERhdGUiKSxuZXcgRGF0ZSkpfSxfZGV0ZXJtaW5lRGF0ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IERhdGU7cmV0dXJuIGIuc2V0RGF0ZShiLmdldERhdGUoKSthKSxifSxlPWZ1bmN0aW9uKGIpe3RyeXtyZXR1cm4gJC5kYXRlcGlja2VyLnBhcnNlRGF0ZSgkLmRhdGVwaWNrZXIuX2dldChhLCJkYXRlRm9ybWF0IiksYiwkLmRhdGVwaWNrZXIuX2dldEZvcm1hdENvbmZpZyhhKSl9Y2F0Y2goYyl7fXZhciBkPShiLnRvTG93ZXJDYXNlKCkubWF0Y2goL15jLyk/JC5kYXRlcGlja2VyLl9nZXREYXRlKGEpOm51bGwpfHxuZXcgRGF0ZSxlPWQuZ2V0RnVsbFllYXIoKSxmPWQuZ2V0TW9udGgoKSxnPWQuZ2V0RGF0ZSgpLGg9LyhbKy1dP1swLTldKylccyooZHxEfHd8V3xtfE18eXxZKT8vZyxpPWguZXhlYyhiKTt3aGlsZShpKXtzd2l0Y2goaVsyXXx8ImQiKXtjYXNlImQiOmNhc2UiRCI6Zys9cGFyc2VJbnQoaVsxXSwxMCk7YnJlYWs7Y2FzZSJ3IjpjYXNlIlciOmcrPXBhcnNlSW50KGlbMV0sMTApKjc7YnJlYWs7Y2FzZSJtIjpjYXNlIk0iOmYrPXBhcnNlSW50KGlbMV0sMTApLGc9TWF0aC5taW4oZywkLmRhdGVwaWNrZXIuX2dldERheXNJbk1vbnRoKGUsZikpO2JyZWFrO2Nhc2UieSI6Y2FzZSJZIjplKz1wYXJzZUludChpWzFdLDEwKSxnPU1hdGgubWluKGcsJC5kYXRlcGlja2VyLl9nZXREYXlzSW5Nb250aChlLGYpKX1pPWguZXhlYyhiKX1yZXR1cm4gbmV3IERhdGUoZSxmLGcpfSxmPWI9PW51bGx8fGI9PT0iIj9jOnR5cGVvZiBiPT0ic3RyaW5nIj9lKGIpOnR5cGVvZiBiPT0ibnVtYmVyIj9pc05hTihiKT9jOmQoYik6bmV3IERhdGUoYi5nZXRUaW1lKCkpO3JldHVybiBmPWYmJmYudG9TdHJpbmcoKT09IkludmFsaWQgRGF0ZSI/YzpmLGYmJihmLnNldEhvdXJzKDApLGYuc2V0TWludXRlcygwKSxmLnNldFNlY29uZHMoMCksZi5zZXRNaWxsaXNlY29uZHMoMCkpLHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KGYpfSxfZGF5bGlnaHRTYXZpbmdBZGp1c3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/KGEuc2V0SG91cnMoYS5nZXRIb3VycygpPjEyP2EuZ2V0SG91cnMoKSsyOjApLGEpOm51bGx9LF9zZXREYXRlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0hYixlPWEuc2VsZWN0ZWRNb250aCxmPWEuc2VsZWN0ZWRZZWFyLGc9dGhpcy5fcmVzdHJpY3RNaW5NYXgoYSx0aGlzLl9kZXRlcm1pbmVEYXRlKGEsYixuZXcgRGF0ZSkpO2Euc2VsZWN0ZWREYXk9YS5jdXJyZW50RGF5PWcuZ2V0RGF0ZSgpLGEuZHJhd01vbnRoPWEuc2VsZWN0ZWRNb250aD1hLmN1cnJlbnRNb250aD1nLmdldE1vbnRoKCksYS5kcmF3WWVhcj1hLnNlbGVjdGVkWWVhcj1hLmN1cnJlbnRZZWFyPWcuZ2V0RnVsbFllYXIoKSwoZSE9YS5zZWxlY3RlZE1vbnRofHxmIT1hLnNlbGVjdGVkWWVhcikmJiFjJiZ0aGlzLl9ub3RpZnlDaGFuZ2UoYSksdGhpcy5fYWRqdXN0SW5zdERhdGUoYSksYS5pbnB1dCYmYS5pbnB1dC52YWwoZD8iIjp0aGlzLl9mb3JtYXREYXRlKGEpKX0sX2dldERhdGU6ZnVuY3Rpb24oYSl7dmFyIGI9IWEuY3VycmVudFllYXJ8fGEuaW5wdXQmJmEuaW5wdXQudmFsKCk9PSIiP251bGw6dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoYS5jdXJyZW50WWVhcixhLmN1cnJlbnRNb250aCxhLmN1cnJlbnREYXkpKTtyZXR1cm4gYn0sX2F0dGFjaEhhbmRsZXJzOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuX2dldChhLCJzdGVwTW9udGhzIiksYz0iIyIrYS5pZC5yZXBsYWNlKC9cXFxcL2csIlxcIik7YS5kcERpdi5maW5kKCJbZGF0YS1oYW5kbGVyXSIpLm1hcChmdW5jdGlvbigpe3ZhciBhPXtwcmV2OmZ1bmN0aW9uKCl7d2luZG93WyJEUF9qUXVlcnlfIitkcHV1aWRdLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoYywtYiwiTSIpfSxuZXh0OmZ1bmN0aW9uKCl7d2luZG93WyJEUF9qUXVlcnlfIitkcHV1aWRdLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoYywrYiwiTSIpfSxoaWRlOmZ1bmN0aW9uKCl7d2luZG93WyJEUF9qUXVlcnlfIitkcHV1aWRdLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCl9LHRvZGF5OmZ1bmN0aW9uKCl7d2luZG93WyJEUF9qUXVlcnlfIitkcHV1aWRdLmRhdGVwaWNrZXIuX2dvdG9Ub2RheShjKX0sc2VsZWN0RGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvd1siRFBfalF1ZXJ5XyIrZHB1dWlkXS5kYXRlcGlja2VyLl9zZWxlY3REYXkoYywrdGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEtbW9udGgiKSwrdGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEteWVhciIpLHRoaXMpLCExfSxzZWxlY3RNb250aDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3dbIkRQX2pRdWVyeV8iK2RwdXVpZF0uZGF0ZXBpY2tlci5fc2VsZWN0TW9udGhZZWFyKGMsdGhpcywiTSIpLCExfSxzZWxlY3RZZWFyOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvd1siRFBfalF1ZXJ5XyIrZHB1dWlkXS5kYXRlcGlja2VyLl9zZWxlY3RNb250aFllYXIoYyx0aGlzLCJZIiksITF9fTskKHRoaXMpLmJpbmQodGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEtZXZlbnQiKSxhW3RoaXMuZ2V0QXR0cmlidXRlKCJkYXRhLWhhbmRsZXIiKV0pfSl9LF9nZW5lcmF0ZUhUTUw6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IERhdGU7Yj10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShiLmdldEZ1bGxZZWFyKCksYi5nZXRNb250aCgpLGIuZ2V0RGF0ZSgpKSk7dmFyIGM9dGhpcy5fZ2V0KGEsImlzUlRMIiksZD10aGlzLl9nZXQoYSwic2hvd0J1dHRvblBhbmVsIiksZT10aGlzLl9nZXQoYSwiaGlkZUlmTm9QcmV2TmV4dCIpLGY9dGhpcy5fZ2V0KGEsIm5hdmlnYXRpb25Bc0RhdGVGb3JtYXQiKSxnPXRoaXMuX2dldE51bWJlck9mTW9udGhzKGEpLGg9dGhpcy5fZ2V0KGEsInNob3dDdXJyZW50QXRQb3MiKSxpPXRoaXMuX2dldChhLCJzdGVwTW9udGhzIiksaj1nWzBdIT0xfHxnWzFdIT0xLGs9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QoYS5jdXJyZW50RGF5P25ldyBEYXRlKGEuY3VycmVudFllYXIsYS5jdXJyZW50TW9udGgsYS5jdXJyZW50RGF5KTpuZXcgRGF0ZSg5OTk5LDksOSkpLGw9dGhpcy5fZ2V0TWluTWF4RGF0ZShhLCJtaW4iKSxtPXRoaXMuX2dldE1pbk1heERhdGUoYSwibWF4Iiksbj1hLmRyYXdNb250aC1oLG89YS5kcmF3WWVhcjtuPDAmJihuKz0xMixvLS0pO2lmKG0pe3ZhciBwPXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKG0uZ2V0RnVsbFllYXIoKSxtLmdldE1vbnRoKCktZ1swXSpnWzFdKzEsbS5nZXREYXRlKCkpKTtwPWwmJnA8bD9sOnA7d2hpbGUodGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUobyxuLDEpKT5wKW4tLSxuPDAmJihuPTExLG8tLSl9YS5kcmF3TW9udGg9bixhLmRyYXdZZWFyPW87dmFyIHE9dGhpcy5fZ2V0KGEsInByZXZUZXh0Iik7cT1mP3RoaXMuZm9ybWF0RGF0ZShxLHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKG8sbi1pLDEpKSx0aGlzLl9nZXRGb3JtYXRDb25maWcoYSkpOnE7dmFyIHI9dGhpcy5fY2FuQWRqdXN0TW9udGgoYSwtMSxvLG4pPyc8YSBjbGFzcz0idWktZGF0ZXBpY2tlci1wcmV2IHVpLWNvcm5lci1hbGwiIGRhdGEtaGFuZGxlcj0icHJldiIgZGF0YS1ldmVudD0iY2xpY2siIHRpdGxlPSInK3ErJyI+PHNwYW4gY2xhc3M9InVpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtJysoYz8iZSI6InciKSsnIj4nK3ErIjwvc3Bhbj48L2E+IjplPyIiOic8YSBjbGFzcz0idWktZGF0ZXBpY2tlci1wcmV2IHVpLWNvcm5lci1hbGwgdWktc3RhdGUtZGlzYWJsZWQiIHRpdGxlPSInK3ErJyI+PHNwYW4gY2xhc3M9InVpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtJysoYz8iZSI6InciKSsnIj4nK3ErIjwvc3Bhbj48L2E+IixzPXRoaXMuX2dldChhLCJuZXh0VGV4dCIpO3M9Zj90aGlzLmZvcm1hdERhdGUocyx0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShvLG4raSwxKSksdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGEpKTpzO3ZhciB0PXRoaXMuX2NhbkFkanVzdE1vbnRoKGEsMSxvLG4pPyc8YSBjbGFzcz0idWktZGF0ZXBpY2tlci1uZXh0IHVpLWNvcm5lci1hbGwiIGRhdGEtaGFuZGxlcj0ibmV4dCIgZGF0YS1ldmVudD0iY2xpY2siIHRpdGxlPSInK3MrJyI+PHNwYW4gY2xhc3M9InVpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtJysoYz8idyI6ImUiKSsnIj4nK3MrIjwvc3Bhbj48L2E+IjplPyIiOic8YSBjbGFzcz0idWktZGF0ZXBpY2tlci1uZXh0IHVpLWNvcm5lci1hbGwgdWktc3RhdGUtZGlzYWJsZWQiIHRpdGxlPSInK3MrJyI+PHNwYW4gY2xhc3M9InVpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtJysoYz8idyI6ImUiKSsnIj4nK3MrIjwvc3Bhbj48L2E+Iix1PXRoaXMuX2dldChhLCJjdXJyZW50VGV4dCIpLHY9dGhpcy5fZ2V0KGEsImdvdG9DdXJyZW50IikmJmEuY3VycmVudERheT9rOmI7dT1mP3RoaXMuZm9ybWF0RGF0ZSh1LHYsdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGEpKTp1O3ZhciB3PWEuaW5saW5lPyIiOic8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InVpLWRhdGVwaWNrZXItY2xvc2UgdWktc3RhdGUtZGVmYXVsdCB1aS1wcmlvcml0eS1wcmltYXJ5IHVpLWNvcm5lci1hbGwiIGRhdGEtaGFuZGxlcj0iaGlkZSIgZGF0YS1ldmVudD0iY2xpY2siPicrdGhpcy5fZ2V0KGEsImNsb3NlVGV4dCIpKyI8L2J1dHRvbj4iLHg9ZD8nPGRpdiBjbGFzcz0idWktZGF0ZXBpY2tlci1idXR0b25wYW5lIHVpLXdpZGdldC1jb250ZW50Ij4nKyhjP3c6IiIpKyh0aGlzLl9pc0luUmFuZ2UoYSx2KT8nPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJ1aS1kYXRlcGlja2VyLWN1cnJlbnQgdWktc3RhdGUtZGVmYXVsdCB1aS1wcmlvcml0eS1zZWNvbmRhcnkgdWktY29ybmVyLWFsbCIgZGF0YS1oYW5kbGVyPSJ0b2RheSIgZGF0YS1ldmVudD0iY2xpY2siPicrdSsiPC9idXR0b24+IjoiIikrKGM/IiI6dykrIjwvZGl2PiI6IiIseT1wYXJzZUludCh0aGlzLl9nZXQoYSwiZmlyc3REYXkiKSwxMCk7eT1pc05hTih5KT8wOnk7dmFyIHo9dGhpcy5fZ2V0KGEsInNob3dXZWVrIiksQT10aGlzLl9nZXQoYSwiZGF5TmFtZXMiKSxCPXRoaXMuX2dldChhLCJkYXlOYW1lc1Nob3J0IiksQz10aGlzLl9nZXQoYSwiZGF5TmFtZXNNaW4iKSxEPXRoaXMuX2dldChhLCJtb250aE5hbWVzIiksRT10aGlzLl9nZXQoYSwibW9udGhOYW1lc1Nob3J0IiksRj10aGlzLl9nZXQoYSwiYmVmb3JlU2hvd0RheSIpLEc9dGhpcy5fZ2V0KGEsInNob3dPdGhlck1vbnRocyIpLEg9dGhpcy5fZ2V0KGEsInNlbGVjdE90aGVyTW9udGhzIiksST10aGlzLl9nZXQoYSwiY2FsY3VsYXRlV2VlayIpfHx0aGlzLmlzbzg2MDFXZWVrLEo9dGhpcy5fZ2V0RGVmYXVsdERhdGUoYSksSz0iIjtmb3IodmFyIEw9MDtMPGdbMF07TCsrKXt2YXIgTT0iIjt0aGlzLm1heFJvd3M9NDtmb3IodmFyIE49MDtOPGdbMV07TisrKXt2YXIgTz10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShvLG4sYS5zZWxlY3RlZERheSkpLFA9IiB1aS1jb3JuZXItYWxsIixRPSIiO2lmKGope1ErPSc8ZGl2IGNsYXNzPSJ1aS1kYXRlcGlja2VyLWdyb3VwJztpZihnWzFdPjEpc3dpdGNoKE4pe2Nhc2UgMDpRKz0iIHVpLWRhdGVwaWNrZXItZ3JvdXAtZmlyc3QiLFA9IiB1aS1jb3JuZXItIisoYz8icmlnaHQiOiJsZWZ0Iik7YnJlYWs7Y2FzZSBnWzFdLTE6USs9IiB1aS1kYXRlcGlja2VyLWdyb3VwLWxhc3QiLFA9IiB1aS1jb3JuZXItIisoYz8ibGVmdCI6InJpZ2h0Iik7YnJlYWs7ZGVmYXVsdDpRKz0iIHVpLWRhdGVwaWNrZXItZ3JvdXAtbWlkZGxlIixQPSIifVErPSciPid9USs9JzxkaXYgY2xhc3M9InVpLWRhdGVwaWNrZXItaGVhZGVyIHVpLXdpZGdldC1oZWFkZXIgdWktaGVscGVyLWNsZWFyZml4JytQKyciPicrKC9hbGx8bGVmdC8udGVzdChQKSYmTD09MD9jP3Q6cjoiIikrKC9hbGx8cmlnaHQvLnRlc3QoUCkmJkw9PTA/Yz9yOnQ6IiIpK3RoaXMuX2dlbmVyYXRlTW9udGhZZWFySGVhZGVyKGEsbixvLGwsbSxMPjB8fE4+MCxELEUpKyc8L2Rpdj48dGFibGUgY2xhc3M9InVpLWRhdGVwaWNrZXItY2FsZW5kYXIiPjx0aGVhZD4nKyI8dHI+Ijt2YXIgUj16Pyc8dGggY2xhc3M9InVpLWRhdGVwaWNrZXItd2Vlay1jb2wiPicrdGhpcy5fZ2V0KGEsIndlZWtIZWFkZXIiKSsiPC90aD4iOiIiO2Zvcih2YXIgUz0wO1M8NztTKyspe3ZhciBUPShTK3kpJTc7Uis9Ijx0aCIrKChTK3krNiklNz49NT8nIGNsYXNzPSJ1aS1kYXRlcGlja2VyLXdlZWstZW5kIic6IiIpKyI+IisnPHNwYW4gdGl0bGU9IicrQVtUXSsnIj4nK0NbVF0rIjwvc3Bhbj48L3RoPiJ9USs9UisiPC90cj48L3RoZWFkPjx0Ym9keT4iO3ZhciBVPXRoaXMuX2dldERheXNJbk1vbnRoKG8sbik7bz09YS5zZWxlY3RlZFllYXImJm49PWEuc2VsZWN0ZWRNb250aCYmKGEuc2VsZWN0ZWREYXk9TWF0aC5taW4oYS5zZWxlY3RlZERheSxVKSk7dmFyIFY9KHRoaXMuX2dldEZpcnN0RGF5T2ZNb250aChvLG4pLXkrNyklNyxXPU1hdGguY2VpbCgoVitVKS83KSxYPWo/dGhpcy5tYXhSb3dzPlc/dGhpcy5tYXhSb3dzOlc6Vzt0aGlzLm1heFJvd3M9WDt2YXIgWT10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShvLG4sMS1WKSk7Zm9yKHZhciBaPTA7WjxYO1orKyl7USs9Ijx0cj4iO3ZhciBfPXo/Jzx0ZCBjbGFzcz0idWktZGF0ZXBpY2tlci13ZWVrLWNvbCI+Jyt0aGlzLl9nZXQoYSwiY2FsY3VsYXRlV2VlayIpKFkpKyI8L3RkPiI6IiI7Zm9yKHZhciBTPTA7Uzw3O1MrKyl7dmFyIGJhPUY/Ri5hcHBseShhLmlucHV0P2EuaW5wdXRbMF06bnVsbCxbWV0pOlshMCwiIl0sYmI9WS5nZXRNb250aCgpIT1uLGJjPWJiJiYhSHx8IWJhWzBdfHxsJiZZPGx8fG0mJlk+bTtfKz0nPHRkIGNsYXNzPSInKygoUyt5KzYpJTc+PTU/IiB1aS1kYXRlcGlja2VyLXdlZWstZW5kIjoiIikrKGJiPyIgdWktZGF0ZXBpY2tlci1vdGhlci1tb250aCI6IiIpKyhZLmdldFRpbWUoKT09Ty5nZXRUaW1lKCkmJm49PWEuc2VsZWN0ZWRNb250aCYmYS5fa2V5RXZlbnR8fEouZ2V0VGltZSgpPT1ZLmdldFRpbWUoKSYmSi5nZXRUaW1lKCk9PU8uZ2V0VGltZSgpPyIgIit0aGlzLl9kYXlPdmVyQ2xhc3M6IiIpKyhiYz8iICIrdGhpcy5fdW5zZWxlY3RhYmxlQ2xhc3MrIiB1aS1zdGF0ZS1kaXNhYmxlZCI6IiIpKyhiYiYmIUc/IiI6IiAiK2JhWzFdKyhZLmdldFRpbWUoKT09ay5nZXRUaW1lKCk/IiAiK3RoaXMuX2N1cnJlbnRDbGFzczoiIikrKFkuZ2V0VGltZSgpPT1iLmdldFRpbWUoKT8iIHVpLWRhdGVwaWNrZXItdG9kYXkiOiIiKSkrJyInKygoIWJifHxHKSYmYmFbMl0/JyB0aXRsZT0iJytiYVsyXSsnIic6IiIpKyhiYz8iIjonIGRhdGEtaGFuZGxlcj0ic2VsZWN0RGF5IiBkYXRhLWV2ZW50PSJjbGljayIgZGF0YS1tb250aD0iJytZLmdldE1vbnRoKCkrJyIgZGF0YS15ZWFyPSInK1kuZ2V0RnVsbFllYXIoKSsnIicpKyI+IisoYmImJiFHPyImI3hhMDsiOmJjPyc8c3BhbiBjbGFzcz0idWktc3RhdGUtZGVmYXVsdCI+JytZLmdldERhdGUoKSsiPC9zcGFuPiI6JzxhIGNsYXNzPSJ1aS1zdGF0ZS1kZWZhdWx0JysoWS5nZXRUaW1lKCk9PWIuZ2V0VGltZSgpPyIgdWktc3RhdGUtaGlnaGxpZ2h0IjoiIikrKFkuZ2V0VGltZSgpPT1rLmdldFRpbWUoKT8iIHVpLXN0YXRlLWFjdGl2ZSI6IiIpKyhiYj8iIHVpLXByaW9yaXR5LXNlY29uZGFyeSI6IiIpKyciIGhyZWY9IiMiPicrWS5nZXREYXRlKCkrIjwvYT4iKSsiPC90ZD4iLFkuc2V0RGF0ZShZLmdldERhdGUoKSsxKSxZPXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KFkpfVErPV8rIjwvdHI+In1uKyssbj4xMSYmKG49MCxvKyspLFErPSI8L3Rib2R5PjwvdGFibGU+Iisoaj8iPC9kaXY+IisoZ1swXT4wJiZOPT1nWzFdLTE/JzxkaXYgY2xhc3M9InVpLWRhdGVwaWNrZXItcm93LWJyZWFrIj48L2Rpdj4nOiIiKToiIiksTSs9UX1LKz1NfXJldHVybiBLKz14KygkLmJyb3dzZXIubXNpZSYmcGFyc2VJbnQoJC5icm93c2VyLnZlcnNpb24sMTApPDcmJiFhLmlubGluZT8nPGlmcmFtZSBzcmM9ImphdmFzY3JpcHQ6ZmFsc2U7IiBjbGFzcz0idWktZGF0ZXBpY2tlci1jb3ZlciIgZnJhbWVib3JkZXI9IjAiPjwvaWZyYW1lPic6IiIpLGEuX2tleUV2ZW50PSExLEt9LF9nZW5lcmF0ZU1vbnRoWWVhckhlYWRlcjpmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgpe3ZhciBpPXRoaXMuX2dldChhLCJjaGFuZ2VNb250aCIpLGo9dGhpcy5fZ2V0KGEsImNoYW5nZVllYXIiKSxrPXRoaXMuX2dldChhLCJzaG93TW9udGhBZnRlclllYXIiKSxsPSc8ZGl2IGNsYXNzPSJ1aS1kYXRlcGlja2VyLXRpdGxlIj4nLG09IiI7aWYoZnx8IWkpbSs9JzxzcGFuIGNsYXNzPSJ1aS1kYXRlcGlja2VyLW1vbnRoIj4nK2dbYl0rIjwvc3Bhbj4iO2Vsc2V7dmFyIG49ZCYmZC5nZXRGdWxsWWVhcigpPT1jLG89ZSYmZS5nZXRGdWxsWWVhcigpPT1jO20rPSc8c2VsZWN0IGNsYXNzPSJ1aS1kYXRlcGlja2VyLW1vbnRoIiBkYXRhLWhhbmRsZXI9InNlbGVjdE1vbnRoIiBkYXRhLWV2ZW50PSJjaGFuZ2UiPic7Zm9yKHZhciBwPTA7cDwxMjtwKyspKCFufHxwPj1kLmdldE1vbnRoKCkpJiYoIW98fHA8PWUuZ2V0TW9udGgoKSkmJihtKz0nPG9wdGlvbiB2YWx1ZT0iJytwKyciJysocD09Yj8nIHNlbGVjdGVkPSJzZWxlY3RlZCInOiIiKSsiPiIraFtwXSsiPC9vcHRpb24+Iik7bSs9Ijwvc2VsZWN0PiJ9a3x8KGwrPW0rKGZ8fCFpfHwhaj8iJiN4YTA7IjoiIikpO2lmKCFhLnllYXJzaHRtbCl7YS55ZWFyc2h0bWw9IiI7aWYoZnx8IWopbCs9JzxzcGFuIGNsYXNzPSJ1aS1kYXRlcGlja2VyLXllYXIiPicrYysiPC9zcGFuPiI7ZWxzZXt2YXIgcT10aGlzLl9nZXQoYSwieWVhclJhbmdlIikuc3BsaXQoIjoiKSxyPShuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSxzPWZ1bmN0aW9uKGEpe3ZhciBiPWEubWF0Y2goL2NbKy1dLiovKT9jK3BhcnNlSW50KGEuc3Vic3RyaW5nKDEpLDEwKTphLm1hdGNoKC9bKy1dLiovKT9yK3BhcnNlSW50KGEsMTApOnBhcnNlSW50KGEsMTApO3JldHVybiBpc05hTihiKT9yOmJ9LHQ9cyhxWzBdKSx1PU1hdGgubWF4KHQscyhxWzFdfHwiIikpO3Q9ZD9NYXRoLm1heCh0LGQuZ2V0RnVsbFllYXIoKSk6dCx1PWU/TWF0aC5taW4odSxlLmdldEZ1bGxZZWFyKCkpOnUsYS55ZWFyc2h0bWwrPSc8c2VsZWN0IGNsYXNzPSJ1aS1kYXRlcGlja2VyLXllYXIiIGRhdGEtaGFuZGxlcj0ic2VsZWN0WWVhciIgZGF0YS1ldmVudD0iY2hhbmdlIj4nO2Zvcig7dDw9dTt0KyspYS55ZWFyc2h0bWwrPSc8b3B0aW9uIHZhbHVlPSInK3QrJyInKyh0PT1jPycgc2VsZWN0ZWQ9InNlbGVjdGVkIic6IiIpKyI+Iit0KyI8L29wdGlvbj4iO2EueWVhcnNodG1sKz0iPC9zZWxlY3Q+IixsKz1hLnllYXJzaHRtbCxhLnllYXJzaHRtbD1udWxsfX1yZXR1cm4gbCs9dGhpcy5fZ2V0KGEsInllYXJTdWZmaXgiKSxrJiYobCs9KGZ8fCFpfHwhaj8iJiN4YTA7IjoiIikrbSksbCs9IjwvZGl2PiIsbH0sX2FkanVzdEluc3REYXRlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmRyYXdZZWFyKyhjPT0iWSI/YjowKSxlPWEuZHJhd01vbnRoKyhjPT0iTSI/YjowKSxmPU1hdGgubWluKGEuc2VsZWN0ZWREYXksdGhpcy5fZ2V0RGF5c0luTW9udGgoZCxlKSkrKGM9PSJEIj9iOjApLGc9dGhpcy5fcmVzdHJpY3RNaW5NYXgoYSx0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShkLGUsZikpKTthLnNlbGVjdGVkRGF5PWcuZ2V0RGF0ZSgpLGEuZHJhd01vbnRoPWEuc2VsZWN0ZWRNb250aD1nLmdldE1vbnRoKCksYS5kcmF3WWVhcj1hLnNlbGVjdGVkWWVhcj1nLmdldEZ1bGxZZWFyKCksKGM9PSJNInx8Yz09IlkiKSYmdGhpcy5fbm90aWZ5Q2hhbmdlKGEpfSxfcmVzdHJpY3RNaW5NYXg6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLl9nZXRNaW5NYXhEYXRlKGEsIm1pbiIpLGQ9dGhpcy5fZ2V0TWluTWF4RGF0ZShhLCJtYXgiKSxlPWMmJmI8Yz9jOmI7cmV0dXJuIGU9ZCYmZT5kP2Q6ZSxlfSxfbm90aWZ5Q2hhbmdlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuX2dldChhLCJvbkNoYW5nZU1vbnRoWWVhciIpO2ImJmIuYXBwbHkoYS5pbnB1dD9hLmlucHV0WzBdOm51bGwsW2Euc2VsZWN0ZWRZZWFyLGEuc2VsZWN0ZWRNb250aCsxLGFdKX0sX2dldE51bWJlck9mTW9udGhzOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuX2dldChhLCJudW1iZXJPZk1vbnRocyIpO3JldHVybiBiPT1udWxsP1sxLDFdOnR5cGVvZiBiPT0ibnVtYmVyIj9bMSxiXTpifSxfZ2V0TWluTWF4RGF0ZTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLl9kZXRlcm1pbmVEYXRlKGEsdGhpcy5fZ2V0KGEsYisiRGF0ZSIpLG51bGwpfSxfZ2V0RGF5c0luTW9udGg6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMzItdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoYSxiLDMyKSkuZ2V0RGF0ZSgpfSxfZ2V0Rmlyc3REYXlPZk1vbnRoOmZ1bmN0aW9uKGEsYil7cmV0dXJuKG5ldyBEYXRlKGEsYiwxKSkuZ2V0RGF5KCl9LF9jYW5BZGp1c3RNb250aDpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT10aGlzLl9nZXROdW1iZXJPZk1vbnRocyhhKSxmPXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGMsZCsoYjwwP2I6ZVswXSplWzFdKSwxKSk7cmV0dXJuIGI8MCYmZi5zZXREYXRlKHRoaXMuX2dldERheXNJbk1vbnRoKGYuZ2V0RnVsbFllYXIoKSxmLmdldE1vbnRoKCkpKSx0aGlzLl9pc0luUmFuZ2UoYSxmKX0sX2lzSW5SYW5nZTpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuX2dldE1pbk1heERhdGUoYSwibWluIiksZD10aGlzLl9nZXRNaW5NYXhEYXRlKGEsIm1heCIpO3JldHVybighY3x8Yi5nZXRUaW1lKCk+PWMuZ2V0VGltZSgpKSYmKCFkfHxiLmdldFRpbWUoKTw9ZC5nZXRUaW1lKCkpfSxfZ2V0Rm9ybWF0Q29uZmlnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuX2dldChhLCJzaG9ydFllYXJDdXRvZmYiKTtyZXR1cm4gYj10eXBlb2YgYiE9InN0cmluZyI/YjoobmV3IERhdGUpLmdldEZ1bGxZZWFyKCklMTAwK3BhcnNlSW50KGIsMTApLHtzaG9ydFllYXJDdXRvZmY6YixkYXlOYW1lc1Nob3J0OnRoaXMuX2dldChhLCJkYXlOYW1lc1Nob3J0IiksZGF5TmFtZXM6dGhpcy5fZ2V0KGEsImRheU5hbWVzIiksbW9udGhOYW1lc1Nob3J0OnRoaXMuX2dldChhLCJtb250aE5hbWVzU2hvcnQiKSxtb250aE5hbWVzOnRoaXMuX2dldChhLCJtb250aE5hbWVzIil9fSxfZm9ybWF0RGF0ZTpmdW5jdGlvbihhLGIsYyxkKXtifHwoYS5jdXJyZW50RGF5PWEuc2VsZWN0ZWREYXksYS5jdXJyZW50TW9udGg9YS5zZWxlY3RlZE1vbnRoLGEuY3VycmVudFllYXI9YS5zZWxlY3RlZFllYXIpO3ZhciBlPWI/dHlwZW9mIGI9PSJvYmplY3QiP2I6dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZCxjLGIpKTp0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShhLmN1cnJlbnRZZWFyLGEuY3VycmVudE1vbnRoLGEuY3VycmVudERheSkpO3JldHVybiB0aGlzLmZvcm1hdERhdGUodGhpcy5fZ2V0KGEsImRhdGVGb3JtYXQiKSxlLHRoaXMuX2dldEZvcm1hdENvbmZpZyhhKSl9fSksJC5mbi5kYXRlcGlja2VyPWZ1bmN0aW9uKGEpe2lmKCF0aGlzLmxlbmd0aClyZXR1cm4gdGhpczskLmRhdGVwaWNrZXIuaW5pdGlhbGl6ZWR8fCgkKGRvY3VtZW50KS5tb3VzZWRvd24oJC5kYXRlcGlja2VyLl9jaGVja0V4dGVybmFsQ2xpY2spLmZpbmQoImJvZHkiKS5hcHBlbmQoJC5kYXRlcGlja2VyLmRwRGl2KSwkLmRhdGVwaWNrZXIuaW5pdGlhbGl6ZWQ9ITApO3ZhciBiPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4gdHlwZW9mIGEhPSJzdHJpbmcifHxhIT0iaXNEaXNhYmxlZCImJmEhPSJnZXREYXRlIiYmYSE9IndpZGdldCI/YT09Im9wdGlvbiImJmFyZ3VtZW50cy5sZW5ndGg9PTImJnR5cGVvZiBhcmd1bWVudHNbMV09PSJzdHJpbmciPyQuZGF0ZXBpY2tlclsiXyIrYSsiRGF0ZXBpY2tlciJdLmFwcGx5KCQuZGF0ZXBpY2tlcixbdGhpc1swXV0uY29uY2F0KGIpKTp0aGlzLmVhY2goZnVuY3Rpb24oKXt0eXBlb2YgYT09InN0cmluZyI/JC5kYXRlcGlja2VyWyJfIithKyJEYXRlcGlja2VyIl0uYXBwbHkoJC5kYXRlcGlja2VyLFt0aGlzXS5jb25jYXQoYikpOiQuZGF0ZXBpY2tlci5fYXR0YWNoRGF0ZXBpY2tlcih0aGlzLGEpfSk6JC5kYXRlcGlja2VyWyJfIithKyJEYXRlcGlja2VyIl0uYXBwbHkoJC5kYXRlcGlja2VyLFt0aGlzWzBdXS5jb25jYXQoYikpfSwkLmRhdGVwaWNrZXI9bmV3IERhdGVwaWNrZXIsJC5kYXRlcGlja2VyLmluaXRpYWxpemVkPSExLCQuZGF0ZXBpY2tlci51dWlkPShuZXcgRGF0ZSkuZ2V0VGltZSgpLCQuZGF0ZXBpY2tlci52ZXJzaW9uPSIxLjguMjQiLHdpbmRvd1siRFBfalF1ZXJ5XyIrZHB1dWlkXT0kfShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7dmFyIGM9InVpLWRpYWxvZyB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCAiLGQ9e2J1dHRvbnM6ITAsaGVpZ2h0OiEwLG1heEhlaWdodDohMCxtYXhXaWR0aDohMCxtaW5IZWlnaHQ6ITAsbWluV2lkdGg6ITAsd2lkdGg6ITB9LGU9e21heEhlaWdodDohMCxtYXhXaWR0aDohMCxtaW5IZWlnaHQ6ITAsbWluV2lkdGg6ITB9O2Eud2lkZ2V0KCJ1aS5kaWFsb2ciLHtvcHRpb25zOnthdXRvT3BlbjohMCxidXR0b25zOnt9LGNsb3NlT25Fc2NhcGU6ITAsY2xvc2VUZXh0OiJjbG9zZSIsZGlhbG9nQ2xhc3M6IiIsZHJhZ2dhYmxlOiEwLGhpZGU6bnVsbCxoZWlnaHQ6ImF1dG8iLG1heEhlaWdodDohMSxtYXhXaWR0aDohMSxtaW5IZWlnaHQ6MTUwLG1pbldpZHRoOjE1MCxtb2RhbDohMSxwb3NpdGlvbjp7bXk6ImNlbnRlciIsYXQ6ImNlbnRlciIsY29sbGlzaW9uOiJmaXQiLHVzaW5nOmZ1bmN0aW9uKGIpe3ZhciBjPWEodGhpcykuY3NzKGIpLm9mZnNldCgpLnRvcDtjPDAmJmEodGhpcykuY3NzKCJ0b3AiLGIudG9wLWMpfX0scmVzaXphYmxlOiEwLHNob3c6bnVsbCxzdGFjazohMCx0aXRsZToiIix3aWR0aDozMDAsekluZGV4OjFlM30sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMub3JpZ2luYWxUaXRsZT10aGlzLmVsZW1lbnQuYXR0cigidGl0bGUiKSx0eXBlb2YgdGhpcy5vcmlnaW5hbFRpdGxlIT0ic3RyaW5nIiYmKHRoaXMub3JpZ2luYWxUaXRsZT0iIiksdGhpcy5vcHRpb25zLnRpdGxlPXRoaXMub3B0aW9ucy50aXRsZXx8dGhpcy5vcmlnaW5hbFRpdGxlO3ZhciBiPXRoaXMsZD1iLm9wdGlvbnMsZT1kLnRpdGxlfHwiJiMxNjA7IixmPWEudWkuZGlhbG9nLmdldFRpdGxlSWQoYi5lbGVtZW50KSxnPShiLnVpRGlhbG9nPWEoIjxkaXY+PC9kaXY+IikpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpLmhpZGUoKS5hZGRDbGFzcyhjK2QuZGlhbG9nQ2xhc3MpLmNzcyh7ekluZGV4OmQuekluZGV4fSkuYXR0cigidGFiSW5kZXgiLC0xKS5jc3MoIm91dGxpbmUiLDApLmtleWRvd24oZnVuY3Rpb24oYyl7ZC5jbG9zZU9uRXNjYXBlJiYhYy5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYy5rZXlDb2RlJiZjLmtleUNvZGU9PT1hLnVpLmtleUNvZGUuRVNDQVBFJiYoYi5jbG9zZShjKSxjLnByZXZlbnREZWZhdWx0KCkpfSkuYXR0cih7cm9sZToiZGlhbG9nIiwiYXJpYS1sYWJlbGxlZGJ5IjpmfSkubW91c2Vkb3duKGZ1bmN0aW9uKGEpe2IubW92ZVRvVG9wKCExLGEpfSksaD1iLmVsZW1lbnQuc2hvdygpLnJlbW92ZUF0dHIoInRpdGxlIikuYWRkQ2xhc3MoInVpLWRpYWxvZy1jb250ZW50IHVpLXdpZGdldC1jb250ZW50IikuYXBwZW5kVG8oZyksaT0oYi51aURpYWxvZ1RpdGxlYmFyPWEoIjxkaXY+PC9kaXY+IikpLmFkZENsYXNzKCJ1aS1kaWFsb2ctdGl0bGViYXIgdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItYWxsIHVpLWhlbHBlci1jbGVhcmZpeCIpLnByZXBlbmRUbyhnKSxqPWEoJzxhIGhyZWY9IiMiPjwvYT4nKS5hZGRDbGFzcygidWktZGlhbG9nLXRpdGxlYmFyLWNsb3NlIHVpLWNvcm5lci1hbGwiKS5hdHRyKCJyb2xlIiwiYnV0dG9uIikuaG92ZXIoZnVuY3Rpb24oKXtqLmFkZENsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpfSxmdW5jdGlvbigpe2oucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIil9KS5mb2N1cyhmdW5jdGlvbigpe2ouYWRkQ2xhc3MoInVpLXN0YXRlLWZvY3VzIil9KS5ibHVyKGZ1bmN0aW9uKCl7ai5yZW1vdmVDbGFzcygidWktc3RhdGUtZm9jdXMiKX0pLmNsaWNrKGZ1bmN0aW9uKGEpe3JldHVybiBiLmNsb3NlKGEpLCExfSkuYXBwZW5kVG8oaSksaz0oYi51aURpYWxvZ1RpdGxlYmFyQ2xvc2VUZXh0PWEoIjxzcGFuPjwvc3Bhbj4iKSkuYWRkQ2xhc3MoInVpLWljb24gdWktaWNvbi1jbG9zZXRoaWNrIikudGV4dChkLmNsb3NlVGV4dCkuYXBwZW5kVG8oaiksbD1hKCI8c3Bhbj48L3NwYW4+IikuYWRkQ2xhc3MoInVpLWRpYWxvZy10aXRsZSIpLmF0dHIoImlkIixmKS5odG1sKGUpLnByZXBlbmRUbyhpKTthLmlzRnVuY3Rpb24oZC5iZWZvcmVjbG9zZSkmJiFhLmlzRnVuY3Rpb24oZC5iZWZvcmVDbG9zZSkmJihkLmJlZm9yZUNsb3NlPWQuYmVmb3JlY2xvc2UpLGkuZmluZCgiKiIpLmFkZChpKS5kaXNhYmxlU2VsZWN0aW9uKCksZC5kcmFnZ2FibGUmJmEuZm4uZHJhZ2dhYmxlJiZiLl9tYWtlRHJhZ2dhYmxlKCksZC5yZXNpemFibGUmJmEuZm4ucmVzaXphYmxlJiZiLl9tYWtlUmVzaXphYmxlKCksYi5fY3JlYXRlQnV0dG9ucyhkLmJ1dHRvbnMpLGIuX2lzT3Blbj0hMSxhLmZuLmJnaWZyYW1lJiZnLmJnaWZyYW1lKCl9LF9pbml0OmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLmF1dG9PcGVuJiZ0aGlzLm9wZW4oKX0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBhPXRoaXM7cmV0dXJuIGEub3ZlcmxheSYmYS5vdmVybGF5LmRlc3Ryb3koKSxhLnVpRGlhbG9nLmhpZGUoKSxhLmVsZW1lbnQudW5iaW5kKCIuZGlhbG9nIikucmVtb3ZlRGF0YSgiZGlhbG9nIikucmVtb3ZlQ2xhc3MoInVpLWRpYWxvZy1jb250ZW50IHVpLXdpZGdldC1jb250ZW50IikuaGlkZSgpLmFwcGVuZFRvKCJib2R5IiksYS51aURpYWxvZy5yZW1vdmUoKSxhLm9yaWdpbmFsVGl0bGUmJmEuZWxlbWVudC5hdHRyKCJ0aXRsZSIsYS5vcmlnaW5hbFRpdGxlKSxhfSx3aWRnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51aURpYWxvZ30sY2xvc2U6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcyxkLGU7aWYoITE9PT1jLl90cmlnZ2VyKCJiZWZvcmVDbG9zZSIsYikpcmV0dXJuO3JldHVybiBjLm92ZXJsYXkmJmMub3ZlcmxheS5kZXN0cm95KCksYy51aURpYWxvZy51bmJpbmQoImtleXByZXNzLnVpLWRpYWxvZyIpLGMuX2lzT3Blbj0hMSxjLm9wdGlvbnMuaGlkZT9jLnVpRGlhbG9nLmhpZGUoYy5vcHRpb25zLmhpZGUsZnVuY3Rpb24oKXtjLl90cmlnZ2VyKCJjbG9zZSIsYil9KTooYy51aURpYWxvZy5oaWRlKCksYy5fdHJpZ2dlcigiY2xvc2UiLGIpKSxhLnVpLmRpYWxvZy5vdmVybGF5LnJlc2l6ZSgpLGMub3B0aW9ucy5tb2RhbCYmKGQ9MCxhKCIudWktZGlhbG9nIikuZWFjaChmdW5jdGlvbigpe3RoaXMhPT1jLnVpRGlhbG9nWzBdJiYoZT1hKHRoaXMpLmNzcygiei1pbmRleCIpLGlzTmFOKGUpfHwoZD1NYXRoLm1heChkLGUpKSl9KSxhLnVpLmRpYWxvZy5tYXhaPWQpLGN9LGlzT3BlbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc09wZW59LG1vdmVUb1RvcDpmdW5jdGlvbihiLGMpe3ZhciBkPXRoaXMsZT1kLm9wdGlvbnMsZjtyZXR1cm4gZS5tb2RhbCYmIWJ8fCFlLnN0YWNrJiYhZS5tb2RhbD9kLl90cmlnZ2VyKCJmb2N1cyIsYyk6KGUuekluZGV4PmEudWkuZGlhbG9nLm1heFomJihhLnVpLmRpYWxvZy5tYXhaPWUuekluZGV4KSxkLm92ZXJsYXkmJihhLnVpLmRpYWxvZy5tYXhaKz0xLGQub3ZlcmxheS4kZWwuY3NzKCJ6LWluZGV4IixhLnVpLmRpYWxvZy5vdmVybGF5Lm1heFo9YS51aS5kaWFsb2cubWF4WikpLGY9e3Njcm9sbFRvcDpkLmVsZW1lbnQuc2Nyb2xsVG9wKCksc2Nyb2xsTGVmdDpkLmVsZW1lbnQuc2Nyb2xsTGVmdCgpfSxhLnVpLmRpYWxvZy5tYXhaKz0xLGQudWlEaWFsb2cuY3NzKCJ6LWluZGV4IixhLnVpLmRpYWxvZy5tYXhaKSxkLmVsZW1lbnQuYXR0cihmKSxkLl90cmlnZ2VyKCJmb2N1cyIsYyksZCl9LG9wZW46ZnVuY3Rpb24oKXtpZih0aGlzLl9pc09wZW4pcmV0dXJuO3ZhciBiPXRoaXMsYz1iLm9wdGlvbnMsZD1iLnVpRGlhbG9nO3JldHVybiBiLm92ZXJsYXk9Yy5tb2RhbD9uZXcgYS51aS5kaWFsb2cub3ZlcmxheShiKTpudWxsLGIuX3NpemUoKSxiLl9wb3NpdGlvbihjLnBvc2l0aW9uKSxkLnNob3coYy5zaG93KSxiLm1vdmVUb1RvcCghMCksYy5tb2RhbCYmZC5iaW5kKCJrZXlkb3duLnVpLWRpYWxvZyIsZnVuY3Rpb24oYil7aWYoYi5rZXlDb2RlIT09YS51aS5rZXlDb2RlLlRBQilyZXR1cm47dmFyIGM9YSgiOnRhYmJhYmxlIix0aGlzKSxkPWMuZmlsdGVyKCI6Zmlyc3QiKSxlPWMuZmlsdGVyKCI6bGFzdCIpO2lmKGIudGFyZ2V0PT09ZVswXSYmIWIuc2hpZnRLZXkpcmV0dXJuIGQuZm9jdXMoMSksITE7aWYoYi50YXJnZXQ9PT1kWzBdJiZiLnNoaWZ0S2V5KXJldHVybiBlLmZvY3VzKDEpLCExfSksYShiLmVsZW1lbnQuZmluZCgiOnRhYmJhYmxlIikuZ2V0KCkuY29uY2F0KGQuZmluZCgiLnVpLWRpYWxvZy1idXR0b25wYW5lIDp0YWJiYWJsZSIpLmdldCgpLmNvbmNhdChkLmdldCgpKSkpLmVxKDApLmZvY3VzKCksYi5faXNPcGVuPSEwLGIuX3RyaWdnZXIoIm9wZW4iKSxifSxfY3JlYXRlQnV0dG9uczpmdW5jdGlvbihiKXt2YXIgYz10aGlzLGQ9ITEsZT1hKCI8ZGl2PjwvZGl2PiIpLmFkZENsYXNzKCJ1aS1kaWFsb2ctYnV0dG9ucGFuZSB1aS13aWRnZXQtY29udGVudCB1aS1oZWxwZXItY2xlYXJmaXgiKSxmPWEoIjxkaXY+PC9kaXY+IikuYWRkQ2xhc3MoInVpLWRpYWxvZy1idXR0b25zZXQiKS5hcHBlbmRUbyhlKTtjLnVpRGlhbG9nLmZpbmQoIi51aS1kaWFsb2ctYnV0dG9ucGFuZSIpLnJlbW92ZSgpLHR5cGVvZiBiPT0ib2JqZWN0IiYmYiE9PW51bGwmJmEuZWFjaChiLGZ1bmN0aW9uKCl7cmV0dXJuIShkPSEwKX0pLGQmJihhLmVhY2goYixmdW5jdGlvbihiLGQpe2Q9YS5pc0Z1bmN0aW9uKGQpP3tjbGljazpkLHRleHQ6Yn06ZDt2YXIgZT1hKCc8YnV0dG9uIHR5cGU9ImJ1dHRvbiI+PC9idXR0b24+JykuY2xpY2soZnVuY3Rpb24oKXtkLmNsaWNrLmFwcGx5KGMuZWxlbWVudFswXSxhcmd1bWVudHMpfSkuYXBwZW5kVG8oZik7YS5lYWNoKGQsZnVuY3Rpb24oYSxiKXtpZihhPT09ImNsaWNrIilyZXR1cm47YSBpbiBlP2VbYV0oYik6ZS5hdHRyKGEsYil9KSxhLmZuLmJ1dHRvbiYmZS5idXR0b24oKX0pLGUuYXBwZW5kVG8oYy51aURpYWxvZykpfSxfbWFrZURyYWdnYWJsZTpmdW5jdGlvbigpe2Z1bmN0aW9uIGYoYSl7cmV0dXJue3Bvc2l0aW9uOmEucG9zaXRpb24sb2Zmc2V0OmEub2Zmc2V0fX12YXIgYj10aGlzLGM9Yi5vcHRpb25zLGQ9YShkb2N1bWVudCksZTtiLnVpRGlhbG9nLmRyYWdnYWJsZSh7Y2FuY2VsOiIudWktZGlhbG9nLWNvbnRlbnQsIC51aS1kaWFsb2ctdGl0bGViYXItY2xvc2UiLGhhbmRsZToiLnVpLWRpYWxvZy10aXRsZWJhciIsY29udGFpbm1lbnQ6ImRvY3VtZW50IixzdGFydDpmdW5jdGlvbihkLGcpe2U9Yy5oZWlnaHQ9PT0iYXV0byI/ImF1dG8iOmEodGhpcykuaGVpZ2h0KCksYSh0aGlzKS5oZWlnaHQoYSh0aGlzKS5oZWlnaHQoKSkuYWRkQ2xhc3MoInVpLWRpYWxvZy1kcmFnZ2luZyIpLGIuX3RyaWdnZXIoImRyYWdTdGFydCIsZCxmKGcpKX0sZHJhZzpmdW5jdGlvbihhLGMpe2IuX3RyaWdnZXIoImRyYWciLGEsZihjKSl9LHN0b3A6ZnVuY3Rpb24oZyxoKXtjLnBvc2l0aW9uPVtoLnBvc2l0aW9uLmxlZnQtZC5zY3JvbGxMZWZ0KCksaC5wb3NpdGlvbi50b3AtZC5zY3JvbGxUb3AoKV0sYSh0aGlzKS5yZW1vdmVDbGFzcygidWktZGlhbG9nLWRyYWdnaW5nIikuaGVpZ2h0KGUpLGIuX3RyaWdnZXIoImRyYWdTdG9wIixnLGYoaCkpLGEudWkuZGlhbG9nLm92ZXJsYXkucmVzaXplKCl9fSl9LF9tYWtlUmVzaXphYmxlOmZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGgoYSl7cmV0dXJue29yaWdpbmFsUG9zaXRpb246YS5vcmlnaW5hbFBvc2l0aW9uLG9yaWdpbmFsU2l6ZTphLm9yaWdpbmFsU2l6ZSxwb3NpdGlvbjphLnBvc2l0aW9uLHNpemU6YS5zaXplfX1jPWM9PT1iP3RoaXMub3B0aW9ucy5yZXNpemFibGU6Yzt2YXIgZD10aGlzLGU9ZC5vcHRpb25zLGY9ZC51aURpYWxvZy5jc3MoInBvc2l0aW9uIiksZz10eXBlb2YgYz09InN0cmluZyI/YzoibixlLHMsdyxzZSxzdyxuZSxudyI7ZC51aURpYWxvZy5yZXNpemFibGUoe2NhbmNlbDoiLnVpLWRpYWxvZy1jb250ZW50Iixjb250YWlubWVudDoiZG9jdW1lbnQiLGFsc29SZXNpemU6ZC5lbGVtZW50LG1heFdpZHRoOmUubWF4V2lkdGgsbWF4SGVpZ2h0OmUubWF4SGVpZ2h0LG1pbldpZHRoOmUubWluV2lkdGgsbWluSGVpZ2h0OmQuX21pbkhlaWdodCgpLGhhbmRsZXM6ZyxzdGFydDpmdW5jdGlvbihiLGMpe2EodGhpcykuYWRkQ2xhc3MoInVpLWRpYWxvZy1yZXNpemluZyIpLGQuX3RyaWdnZXIoInJlc2l6ZVN0YXJ0IixiLGgoYykpfSxyZXNpemU6ZnVuY3Rpb24oYSxiKXtkLl90cmlnZ2VyKCJyZXNpemUiLGEsaChiKSl9LHN0b3A6ZnVuY3Rpb24oYixjKXthKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1kaWFsb2ctcmVzaXppbmciKSxlLmhlaWdodD1hKHRoaXMpLmhlaWdodCgpLGUud2lkdGg9YSh0aGlzKS53aWR0aCgpLGQuX3RyaWdnZXIoInJlc2l6ZVN0b3AiLGIsaChjKSksYS51aS5kaWFsb2cub3ZlcmxheS5yZXNpemUoKX19KS5jc3MoInBvc2l0aW9uIixmKS5maW5kKCIudWktcmVzaXphYmxlLXNlIikuYWRkQ2xhc3MoInVpLWljb24gdWktaWNvbi1ncmlwLWRpYWdvbmFsLXNlIil9LF9taW5IZWlnaHQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnM7cmV0dXJuIGEuaGVpZ2h0PT09ImF1dG8iP2EubWluSGVpZ2h0Ok1hdGgubWluKGEubWluSGVpZ2h0LGEuaGVpZ2h0KX0sX3Bvc2l0aW9uOmZ1bmN0aW9uKGIpe3ZhciBjPVtdLGQ9WzAsMF0sZTtpZihiKXtpZih0eXBlb2YgYj09InN0cmluZyJ8fHR5cGVvZiBiPT0ib2JqZWN0IiYmIjAiaW4gYiljPWIuc3BsaXQ/Yi5zcGxpdCgiICIpOltiWzBdLGJbMV1dLGMubGVuZ3RoPT09MSYmKGNbMV09Y1swXSksYS5lYWNoKFsibGVmdCIsInRvcCJdLGZ1bmN0aW9uKGEsYil7K2NbYV09PT1jW2FdJiYoZFthXT1jW2FdLGNbYV09Yil9KSxiPXtteTpjLmpvaW4oIiAiKSxhdDpjLmpvaW4oIiAiKSxvZmZzZXQ6ZC5qb2luKCIgIil9O2I9YS5leHRlbmQoe30sYS51aS5kaWFsb2cucHJvdG90eXBlLm9wdGlvbnMucG9zaXRpb24sYil9ZWxzZSBiPWEudWkuZGlhbG9nLnByb3RvdHlwZS5vcHRpb25zLnBvc2l0aW9uO2U9dGhpcy51aURpYWxvZy5pcygiOnZpc2libGUiKSxlfHx0aGlzLnVpRGlhbG9nLnNob3coKSx0aGlzLnVpRGlhbG9nLmNzcyh7dG9wOjAsbGVmdDowfSkucG9zaXRpb24oYS5leHRlbmQoe29mOndpbmRvd30sYikpLGV8fHRoaXMudWlEaWFsb2cuaGlkZSgpfSxfc2V0T3B0aW9uczpmdW5jdGlvbihiKXt2YXIgYz10aGlzLGY9e30sZz0hMTthLmVhY2goYixmdW5jdGlvbihhLGIpe2MuX3NldE9wdGlvbihhLGIpLGEgaW4gZCYmKGc9ITApLGEgaW4gZSYmKGZbYV09Yil9KSxnJiZ0aGlzLl9zaXplKCksdGhpcy51aURpYWxvZy5pcygiOmRhdGEocmVzaXphYmxlKSIpJiZ0aGlzLnVpRGlhbG9nLnJlc2l6YWJsZSgib3B0aW9uIixmKX0sX3NldE9wdGlvbjpmdW5jdGlvbihiLGQpe3ZhciBlPXRoaXMsZj1lLnVpRGlhbG9nO3N3aXRjaChiKXtjYXNlImJlZm9yZWNsb3NlIjpiPSJiZWZvcmVDbG9zZSI7YnJlYWs7Y2FzZSJidXR0b25zIjplLl9jcmVhdGVCdXR0b25zKGQpO2JyZWFrO2Nhc2UiY2xvc2VUZXh0IjplLnVpRGlhbG9nVGl0bGViYXJDbG9zZVRleHQudGV4dCgiIitkKTticmVhaztjYXNlImRpYWxvZ0NsYXNzIjpmLnJlbW92ZUNsYXNzKGUub3B0aW9ucy5kaWFsb2dDbGFzcykuYWRkQ2xhc3MoYytkKTticmVhaztjYXNlImRpc2FibGVkIjpkP2YuYWRkQ2xhc3MoInVpLWRpYWxvZy1kaXNhYmxlZCIpOmYucmVtb3ZlQ2xhc3MoInVpLWRpYWxvZy1kaXNhYmxlZCIpO2JyZWFrO2Nhc2UiZHJhZ2dhYmxlIjp2YXIgZz1mLmlzKCI6ZGF0YShkcmFnZ2FibGUpIik7ZyYmIWQmJmYuZHJhZ2dhYmxlKCJkZXN0cm95IiksIWcmJmQmJmUuX21ha2VEcmFnZ2FibGUoKTticmVhaztjYXNlInBvc2l0aW9uIjplLl9wb3NpdGlvbihkKTticmVhaztjYXNlInJlc2l6YWJsZSI6dmFyIGg9Zi5pcygiOmRhdGEocmVzaXphYmxlKSIpO2gmJiFkJiZmLnJlc2l6YWJsZSgiZGVzdHJveSIpLGgmJnR5cGVvZiBkPT0ic3RyaW5nIiYmZi5yZXNpemFibGUoIm9wdGlvbiIsImhhbmRsZXMiLGQpLCFoJiZkIT09ITEmJmUuX21ha2VSZXNpemFibGUoZCk7YnJlYWs7Y2FzZSJ0aXRsZSI6YSgiLnVpLWRpYWxvZy10aXRsZSIsZS51aURpYWxvZ1RpdGxlYmFyKS5odG1sKCIiKyhkfHwiJiMxNjA7IikpfWEuV2lkZ2V0LnByb3RvdHlwZS5fc2V0T3B0aW9uLmFwcGx5KGUsYXJndW1lbnRzKX0sX3NpemU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9wdGlvbnMsYyxkLGU9dGhpcy51aURpYWxvZy5pcygiOnZpc2libGUiKTt0aGlzLmVsZW1lbnQuc2hvdygpLmNzcyh7d2lkdGg6ImF1dG8iLG1pbkhlaWdodDowLGhlaWdodDowfSksYi5taW5XaWR0aD5iLndpZHRoJiYoYi53aWR0aD1iLm1pbldpZHRoKSxjPXRoaXMudWlEaWFsb2cuY3NzKHtoZWlnaHQ6ImF1dG8iLHdpZHRoOmIud2lkdGh9KS5oZWlnaHQoKSxkPU1hdGgubWF4KDAsYi5taW5IZWlnaHQtYyk7aWYoYi5oZWlnaHQ9PT0iYXV0byIpaWYoYS5zdXBwb3J0Lm1pbkhlaWdodCl0aGlzLmVsZW1lbnQuY3NzKHttaW5IZWlnaHQ6ZCxoZWlnaHQ6ImF1dG8ifSk7ZWxzZXt0aGlzLnVpRGlhbG9nLnNob3coKTt2YXIgZj10aGlzLmVsZW1lbnQuY3NzKCJoZWlnaHQiLCJhdXRvIikuaGVpZ2h0KCk7ZXx8dGhpcy51aURpYWxvZy5oaWRlKCksdGhpcy5lbGVtZW50LmhlaWdodChNYXRoLm1heChmLGQpKX1lbHNlIHRoaXMuZWxlbWVudC5oZWlnaHQoTWF0aC5tYXgoYi5oZWlnaHQtYywwKSk7dGhpcy51aURpYWxvZy5pcygiOmRhdGEocmVzaXphYmxlKSIpJiZ0aGlzLnVpRGlhbG9nLnJlc2l6YWJsZSgib3B0aW9uIiwibWluSGVpZ2h0Iix0aGlzLl9taW5IZWlnaHQoKSl9fSksYS5leHRlbmQoYS51aS5kaWFsb2cse3ZlcnNpb246IjEuOC4yNCIsdXVpZDowLG1heFo6MCxnZXRUaXRsZUlkOmZ1bmN0aW9uKGEpe3ZhciBiPWEuYXR0cigiaWQiKTtyZXR1cm4gYnx8KHRoaXMudXVpZCs9MSxiPXRoaXMudXVpZCksInVpLWRpYWxvZy10aXRsZS0iK2J9LG92ZXJsYXk6ZnVuY3Rpb24oYil7dGhpcy4kZWw9YS51aS5kaWFsb2cub3ZlcmxheS5jcmVhdGUoYil9fSksYS5leHRlbmQoYS51aS5kaWFsb2cub3ZlcmxheSx7aW5zdGFuY2VzOltdLG9sZEluc3RhbmNlczpbXSxtYXhaOjAsZXZlbnRzOmEubWFwKCJmb2N1cyxtb3VzZWRvd24sbW91c2V1cCxrZXlkb3duLGtleXByZXNzLGNsaWNrIi5zcGxpdCgiLCIpLGZ1bmN0aW9uKGEpe3JldHVybiBhKyIuZGlhbG9nLW92ZXJsYXkifSkuam9pbigiICIpLGNyZWF0ZTpmdW5jdGlvbihiKXt0aGlzLmluc3RhbmNlcy5sZW5ndGg9PT0wJiYoc2V0VGltZW91dChmdW5jdGlvbigpe2EudWkuZGlhbG9nLm92ZXJsYXkuaW5zdGFuY2VzLmxlbmd0aCYmYShkb2N1bWVudCkuYmluZChhLnVpLmRpYWxvZy5vdmVybGF5LmV2ZW50cyxmdW5jdGlvbihiKXtpZihhKGIudGFyZ2V0KS56SW5kZXgoKTxhLnVpLmRpYWxvZy5vdmVybGF5Lm1heFopcmV0dXJuITF9KX0sMSksYShkb2N1bWVudCkuYmluZCgia2V5ZG93bi5kaWFsb2ctb3ZlcmxheSIsZnVuY3Rpb24oYyl7Yi5vcHRpb25zLmNsb3NlT25Fc2NhcGUmJiFjLmlzRGVmYXVsdFByZXZlbnRlZCgpJiZjLmtleUNvZGUmJmMua2V5Q29kZT09PWEudWkua2V5Q29kZS5FU0NBUEUmJihiLmNsb3NlKGMpLGMucHJldmVudERlZmF1bHQoKSl9KSxhKHdpbmRvdykuYmluZCgicmVzaXplLmRpYWxvZy1vdmVybGF5IixhLnVpLmRpYWxvZy5vdmVybGF5LnJlc2l6ZSkpO3ZhciBjPSh0aGlzLm9sZEluc3RhbmNlcy5wb3AoKXx8YSgiPGRpdj48L2Rpdj4iKS5hZGRDbGFzcygidWktd2lkZ2V0LW92ZXJsYXkiKSkuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSkuY3NzKHt3aWR0aDp0aGlzLndpZHRoKCksaGVpZ2h0OnRoaXMuaGVpZ2h0KCl9KTtyZXR1cm4gYS5mbi5iZ2lmcmFtZSYmYy5iZ2lmcmFtZSgpLHRoaXMuaW5zdGFuY2VzLnB1c2goYyksY30sZGVzdHJveTpmdW5jdGlvbihiKXt2YXIgYz1hLmluQXJyYXkoYix0aGlzLmluc3RhbmNlcyk7YyE9LTEmJnRoaXMub2xkSW5zdGFuY2VzLnB1c2godGhpcy5pbnN0YW5jZXMuc3BsaWNlKGMsMSlbMF0pLHRoaXMuaW5zdGFuY2VzLmxlbmd0aD09PTAmJmEoW2RvY3VtZW50LHdpbmRvd10pLnVuYmluZCgiLmRpYWxvZy1vdmVybGF5IiksYi5yZW1vdmUoKTt2YXIgZD0wO2EuZWFjaCh0aGlzLmluc3RhbmNlcyxmdW5jdGlvbigpe2Q9TWF0aC5tYXgoZCx0aGlzLmNzcygiei1pbmRleCIpKX0pLHRoaXMubWF4Wj1kfSxoZWlnaHQ6ZnVuY3Rpb24oKXt2YXIgYixjO3JldHVybiBhLmJyb3dzZXIubXNpZSYmYS5icm93c2VyLnZlcnNpb248Nz8oYj1NYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0LGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0KSxjPU1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vZmZzZXRIZWlnaHQsZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQpLGI8Yz9hKHdpbmRvdykuaGVpZ2h0KCkrInB4IjpiKyJweCIpOmEoZG9jdW1lbnQpLmhlaWdodCgpKyJweCJ9LHdpZHRoOmZ1bmN0aW9uKCl7dmFyIGIsYztyZXR1cm4gYS5icm93c2VyLm1zaWU/KGI9TWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoLGRvY3VtZW50LmJvZHkuc2Nyb2xsV2lkdGgpLGM9TWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm9mZnNldFdpZHRoLGRvY3VtZW50LmJvZHkub2Zmc2V0V2lkdGgpLGI8Yz9hKHdpbmRvdykud2lkdGgoKSsicHgiOmIrInB4Iik6YShkb2N1bWVudCkud2lkdGgoKSsicHgifSxyZXNpemU6ZnVuY3Rpb24oKXt2YXIgYj1hKFtdKTthLmVhY2goYS51aS5kaWFsb2cub3ZlcmxheS5pbnN0YW5jZXMsZnVuY3Rpb24oKXtiPWIuYWRkKHRoaXMpfSksYi5jc3Moe3dpZHRoOjAsaGVpZ2h0OjB9KS5jc3Moe3dpZHRoOmEudWkuZGlhbG9nLm92ZXJsYXkud2lkdGgoKSxoZWlnaHQ6YS51aS5kaWFsb2cub3ZlcmxheS5oZWlnaHQoKX0pfX0pLGEuZXh0ZW5kKGEudWkuZGlhbG9nLm92ZXJsYXkucHJvdG90eXBlLHtkZXN0cm95OmZ1bmN0aW9uKCl7YS51aS5kaWFsb2cub3ZlcmxheS5kZXN0cm95KHRoaXMuJGVsKX19KX0oalF1ZXJ5KSxmdW5jdGlvbihhLGIpe2EudWk9YS51aXx8e307dmFyIGM9L2xlZnR8Y2VudGVyfHJpZ2h0LyxkPS90b3B8Y2VudGVyfGJvdHRvbS8sZT0iY2VudGVyIixmPXt9LGc9YS5mbi5wb3NpdGlvbixoPWEuZm4ub2Zmc2V0O2EuZm4ucG9zaXRpb249ZnVuY3Rpb24oYil7aWYoIWJ8fCFiLm9mKXJldHVybiBnLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtiPWEuZXh0ZW5kKHt9LGIpO3ZhciBoPWEoYi5vZiksaT1oWzBdLGo9KGIuY29sbGlzaW9ufHwiZmxpcCIpLnNwbGl0KCIgIiksaz1iLm9mZnNldD9iLm9mZnNldC5zcGxpdCgiICIpOlswLDBdLGwsbSxuO3JldHVybiBpLm5vZGVUeXBlPT09OT8obD1oLndpZHRoKCksbT1oLmhlaWdodCgpLG49e3RvcDowLGxlZnQ6MH0pOmkuc2V0VGltZW91dD8obD1oLndpZHRoKCksbT1oLmhlaWdodCgpLG49e3RvcDpoLnNjcm9sbFRvcCgpLGxlZnQ6aC5zY3JvbGxMZWZ0KCl9KTppLnByZXZlbnREZWZhdWx0PyhiLmF0PSJsZWZ0IHRvcCIsbD1tPTAsbj17dG9wOmIub2YucGFnZVksbGVmdDpiLm9mLnBhZ2VYfSk6KGw9aC5vdXRlcldpZHRoKCksbT1oLm91dGVySGVpZ2h0KCksbj1oLm9mZnNldCgpKSxhLmVhY2goWyJteSIsImF0Il0sZnVuY3Rpb24oKXt2YXIgYT0oYlt0aGlzXXx8IiIpLnNwbGl0KCIgIik7YS5sZW5ndGg9PT0xJiYoYT1jLnRlc3QoYVswXSk/YS5jb25jYXQoW2VdKTpkLnRlc3QoYVswXSk/W2VdLmNvbmNhdChhKTpbZSxlXSksYVswXT1jLnRlc3QoYVswXSk/YVswXTplLGFbMV09ZC50ZXN0KGFbMV0pP2FbMV06ZSxiW3RoaXNdPWF9KSxqLmxlbmd0aD09PTEmJihqWzFdPWpbMF0pLGtbMF09cGFyc2VJbnQoa1swXSwxMCl8fDAsay5sZW5ndGg9PT0xJiYoa1sxXT1rWzBdKSxrWzFdPXBhcnNlSW50KGtbMV0sMTApfHwwLGIuYXRbMF09PT0icmlnaHQiP24ubGVmdCs9bDpiLmF0WzBdPT09ZSYmKG4ubGVmdCs9bC8yKSxiLmF0WzFdPT09ImJvdHRvbSI/bi50b3ArPW06Yi5hdFsxXT09PWUmJihuLnRvcCs9bS8yKSxuLmxlZnQrPWtbMF0sbi50b3ArPWtbMV0sdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKSxkPWMub3V0ZXJXaWR0aCgpLGc9Yy5vdXRlckhlaWdodCgpLGg9cGFyc2VJbnQoYS5jdXJDU1ModGhpcywibWFyZ2luTGVmdCIsITApKXx8MCxpPXBhcnNlSW50KGEuY3VyQ1NTKHRoaXMsIm1hcmdpblRvcCIsITApKXx8MCxvPWQraCsocGFyc2VJbnQoYS5jdXJDU1ModGhpcywibWFyZ2luUmlnaHQiLCEwKSl8fDApLHA9ZytpKyhwYXJzZUludChhLmN1ckNTUyh0aGlzLCJtYXJnaW5Cb3R0b20iLCEwKSl8fDApLHE9YS5leHRlbmQoe30sbikscjtiLm15WzBdPT09InJpZ2h0Ij9xLmxlZnQtPWQ6Yi5teVswXT09PWUmJihxLmxlZnQtPWQvMiksYi5teVsxXT09PSJib3R0b20iP3EudG9wLT1nOmIubXlbMV09PT1lJiYocS50b3AtPWcvMiksZi5mcmFjdGlvbnN8fChxLmxlZnQ9TWF0aC5yb3VuZChxLmxlZnQpLHEudG9wPU1hdGgucm91bmQocS50b3ApKSxyPXtsZWZ0OnEubGVmdC1oLHRvcDpxLnRvcC1pfSxhLmVhY2goWyJsZWZ0IiwidG9wIl0sZnVuY3Rpb24oYyxlKXthLnVpLnBvc2l0aW9uW2pbY11dJiZhLnVpLnBvc2l0aW9uW2pbY11dW2VdKHEse3RhcmdldFdpZHRoOmwsdGFyZ2V0SGVpZ2h0Om0sZWxlbVdpZHRoOmQsZWxlbUhlaWdodDpnLGNvbGxpc2lvblBvc2l0aW9uOnIsY29sbGlzaW9uV2lkdGg6byxjb2xsaXNpb25IZWlnaHQ6cCxvZmZzZXQ6ayxteTpiLm15LGF0OmIuYXR9KX0pLGEuZm4uYmdpZnJhbWUmJmMuYmdpZnJhbWUoKSxjLm9mZnNldChhLmV4dGVuZChxLHt1c2luZzpiLnVzaW5nfSkpfSl9LGEudWkucG9zaXRpb249e2ZpdDp7bGVmdDpmdW5jdGlvbihiLGMpe3ZhciBkPWEod2luZG93KSxlPWMuY29sbGlzaW9uUG9zaXRpb24ubGVmdCtjLmNvbGxpc2lvbldpZHRoLWQud2lkdGgoKS1kLnNjcm9sbExlZnQoKTtiLmxlZnQ9ZT4wP2IubGVmdC1lOk1hdGgubWF4KGIubGVmdC1jLmNvbGxpc2lvblBvc2l0aW9uLmxlZnQsYi5sZWZ0KX0sdG9wOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh3aW5kb3cpLGU9Yy5jb2xsaXNpb25Qb3NpdGlvbi50b3ArYy5jb2xsaXNpb25IZWlnaHQtZC5oZWlnaHQoKS1kLnNjcm9sbFRvcCgpO2IudG9wPWU+MD9iLnRvcC1lOk1hdGgubWF4KGIudG9wLWMuY29sbGlzaW9uUG9zaXRpb24udG9wLGIudG9wKX19LGZsaXA6e2xlZnQ6ZnVuY3Rpb24oYixjKXtpZihjLmF0WzBdPT09ZSlyZXR1cm47dmFyIGQ9YSh3aW5kb3cpLGY9Yy5jb2xsaXNpb25Qb3NpdGlvbi5sZWZ0K2MuY29sbGlzaW9uV2lkdGgtZC53aWR0aCgpLWQuc2Nyb2xsTGVmdCgpLGc9Yy5teVswXT09PSJsZWZ0Ij8tYy5lbGVtV2lkdGg6Yy5teVswXT09PSJyaWdodCI/Yy5lbGVtV2lkdGg6MCxoPWMuYXRbMF09PT0ibGVmdCI/Yy50YXJnZXRXaWR0aDotYy50YXJnZXRXaWR0aCxpPS0yKmMub2Zmc2V0WzBdO2IubGVmdCs9Yy5jb2xsaXNpb25Qb3NpdGlvbi5sZWZ0PDA/ZytoK2k6Zj4wP2craCtpOjB9LHRvcDpmdW5jdGlvbihiLGMpe2lmKGMuYXRbMV09PT1lKXJldHVybjt2YXIgZD1hKHdpbmRvdyksZj1jLmNvbGxpc2lvblBvc2l0aW9uLnRvcCtjLmNvbGxpc2lvbkhlaWdodC1kLmhlaWdodCgpLWQuc2Nyb2xsVG9wKCksZz1jLm15WzFdPT09InRvcCI/LWMuZWxlbUhlaWdodDpjLm15WzFdPT09ImJvdHRvbSI/Yy5lbGVtSGVpZ2h0OjAsaD1jLmF0WzFdPT09InRvcCI/Yy50YXJnZXRIZWlnaHQ6LWMudGFyZ2V0SGVpZ2h0LGk9LTIqYy5vZmZzZXRbMV07Yi50b3ArPWMuY29sbGlzaW9uUG9zaXRpb24udG9wPDA/ZytoK2k6Zj4wP2craCtpOjB9fX0sYS5vZmZzZXQuc2V0T2Zmc2V0fHwoYS5vZmZzZXQuc2V0T2Zmc2V0PWZ1bmN0aW9uKGIsYyl7L3N0YXRpYy8udGVzdChhLmN1ckNTUyhiLCJwb3NpdGlvbiIpKSYmKGIuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIik7dmFyIGQ9YShiKSxlPWQub2Zmc2V0KCksZj1wYXJzZUludChhLmN1ckNTUyhiLCJ0b3AiLCEwKSwxMCl8fDAsZz1wYXJzZUludChhLmN1ckNTUyhiLCJsZWZ0IiwhMCksMTApfHwwLGg9e3RvcDpjLnRvcC1lLnRvcCtmLGxlZnQ6Yy5sZWZ0LWUubGVmdCtnfTsidXNpbmciaW4gYz9jLnVzaW5nLmNhbGwoYixoKTpkLmNzcyhoKX0sYS5mbi5vZmZzZXQ9ZnVuY3Rpb24oYil7dmFyIGM9dGhpc1swXTtyZXR1cm4hY3x8IWMub3duZXJEb2N1bWVudD9udWxsOmI/YS5pc0Z1bmN0aW9uKGIpP3RoaXMuZWFjaChmdW5jdGlvbihjKXthKHRoaXMpLm9mZnNldChiLmNhbGwodGhpcyxjLGEodGhpcykub2Zmc2V0KCkpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe2Eub2Zmc2V0LnNldE9mZnNldCh0aGlzLGIpfSk6aC5jYWxsKHRoaXMpfSksYS5jdXJDU1N8fChhLmN1ckNTUz1hLmNzcyksZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZCxlLGcsaCxpO2Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChiPyJkaXYiOiJib2R5IiksZz17dmlzaWJpbGl0eToiaGlkZGVuIix3aWR0aDowLGhlaWdodDowLGJvcmRlcjowLG1hcmdpbjowLGJhY2tncm91bmQ6Im5vbmUifSxiJiZhLmV4dGVuZChnLHtwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6Ii0xMDAwcHgiLHRvcDoiLTEwMDBweCJ9KTtmb3IodmFyIGogaW4gZylkLnN0eWxlW2pdPWdbal07ZC5hcHBlbmRDaGlsZChjKSxlPWJ8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxlLmluc2VydEJlZm9yZShkLGUuZmlyc3RDaGlsZCksYy5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IDEwLjc0MzIyMjJweDsgdG9wOiAxMC40MzIzMjVweDsgaGVpZ2h0OiAzMHB4OyB3aWR0aDogMjAxcHg7IixoPWEoYykub2Zmc2V0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGJ9KS5vZmZzZXQoKSxkLmlubmVySFRNTD0iIixlLnJlbW92ZUNoaWxkKGQpLGk9aC50b3AraC5sZWZ0KyhiPzJlMzowKSxmLmZyYWN0aW9ucz1pPjIxJiZpPDIyfSgpfShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7YS53aWRnZXQoInVpLnByb2dyZXNzYmFyIix7b3B0aW9uczp7dmFsdWU6MCxtYXg6MTAwfSxtaW46MCxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1wcm9ncmVzc2JhciB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCIpLmF0dHIoe3JvbGU6InByb2dyZXNzYmFyIiwiYXJpYS12YWx1ZW1pbiI6dGhpcy5taW4sImFyaWEtdmFsdWVtYXgiOnRoaXMub3B0aW9ucy5tYXgsImFyaWEtdmFsdWVub3ciOnRoaXMuX3ZhbHVlKCl9KSx0aGlzLnZhbHVlRGl2PWEoIjxkaXYgY2xhc3M9J3VpLXByb2dyZXNzYmFyLXZhbHVlIHVpLXdpZGdldC1oZWFkZXIgdWktY29ybmVyLWxlZnQnPjwvZGl2PiIpLmFwcGVuZFRvKHRoaXMuZWxlbWVudCksdGhpcy5vbGRWYWx1ZT10aGlzLl92YWx1ZSgpLHRoaXMuX3JlZnJlc2hWYWx1ZSgpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1wcm9ncmVzc2JhciB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCIpLnJlbW92ZUF0dHIoInJvbGUiKS5yZW1vdmVBdHRyKCJhcmlhLXZhbHVlbWluIikucmVtb3ZlQXR0cigiYXJpYS12YWx1ZW1heCIpLnJlbW92ZUF0dHIoImFyaWEtdmFsdWVub3ciKSx0aGlzLnZhbHVlRGl2LnJlbW92ZSgpLGEuV2lkZ2V0LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sdmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1iP3RoaXMuX3ZhbHVlKCk6KHRoaXMuX3NldE9wdGlvbigidmFsdWUiLGEpLHRoaXMpfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGIsYyl7Yj09PSJ2YWx1ZSImJih0aGlzLm9wdGlvbnMudmFsdWU9Yyx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl92YWx1ZSgpPT09dGhpcy5vcHRpb25zLm1heCYmdGhpcy5fdHJpZ2dlcigiY29tcGxldGUiKSksYS5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfdmFsdWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnMudmFsdWU7cmV0dXJuIHR5cGVvZiBhIT0ibnVtYmVyIiYmKGE9MCksTWF0aC5taW4odGhpcy5vcHRpb25zLm1heCxNYXRoLm1heCh0aGlzLm1pbixhKSl9LF9wZXJjZW50YWdlOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCp0aGlzLl92YWx1ZSgpL3RoaXMub3B0aW9ucy5tYXh9LF9yZWZyZXNoVmFsdWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZhbHVlKCksYj10aGlzLl9wZXJjZW50YWdlKCk7dGhpcy5vbGRWYWx1ZSE9PWEmJih0aGlzLm9sZFZhbHVlPWEsdGhpcy5fdHJpZ2dlcigiY2hhbmdlIikpLHRoaXMudmFsdWVEaXYudG9nZ2xlKGE+dGhpcy5taW4pLnRvZ2dsZUNsYXNzKCJ1aS1jb3JuZXItcmlnaHQiLGE9PT10aGlzLm9wdGlvbnMubWF4KS53aWR0aChiLnRvRml4ZWQoMCkrIiUiKSx0aGlzLmVsZW1lbnQuYXR0cigiYXJpYS12YWx1ZW5vdyIsYSl9fSksYS5leHRlbmQoYS51aS5wcm9ncmVzc2Jhcix7dmVyc2lvbjoiMS44LjI0In0pfShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7dmFyIGM9NTthLndpZGdldCgidWkuc2xpZGVyIixhLnVpLm1vdXNlLHt3aWRnZXRFdmVudFByZWZpeDoic2xpZGUiLG9wdGlvbnM6e2FuaW1hdGU6ITEsZGlzdGFuY2U6MCxtYXg6MTAwLG1pbjowLG9yaWVudGF0aW9uOiJob3Jpem9udGFsIixyYW5nZTohMSxzdGVwOjEsdmFsdWU6MCx2YWx1ZXM6bnVsbH0sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMsZD10aGlzLm9wdGlvbnMsZT10aGlzLmVsZW1lbnQuZmluZCgiLnVpLXNsaWRlci1oYW5kbGUiKS5hZGRDbGFzcygidWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIiksZj0iPGEgY2xhc3M9J3VpLXNsaWRlci1oYW5kbGUgdWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsJyBocmVmPScjJz48L2E+IixnPWQudmFsdWVzJiZkLnZhbHVlcy5sZW5ndGh8fDEsaD1bXTt0aGlzLl9rZXlTbGlkaW5nPSExLHRoaXMuX21vdXNlU2xpZGluZz0hMSx0aGlzLl9hbmltYXRlT2ZmPSEwLHRoaXMuX2hhbmRsZUluZGV4PW51bGwsdGhpcy5fZGV0ZWN0T3JpZW50YXRpb24oKSx0aGlzLl9tb3VzZUluaXQoKSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXNsaWRlciB1aS1zbGlkZXItIit0aGlzLm9yaWVudGF0aW9uKyIgdWktd2lkZ2V0IisiIHVpLXdpZGdldC1jb250ZW50IisiIHVpLWNvcm5lci1hbGwiKyhkLmRpc2FibGVkPyIgdWktc2xpZGVyLWRpc2FibGVkIHVpLWRpc2FibGVkIjoiIikpLHRoaXMucmFuZ2U9YShbXSksZC5yYW5nZSYmKGQucmFuZ2U9PT0hMCYmKGQudmFsdWVzfHwoZC52YWx1ZXM9W3RoaXMuX3ZhbHVlTWluKCksdGhpcy5fdmFsdWVNaW4oKV0pLGQudmFsdWVzLmxlbmd0aCYmZC52YWx1ZXMubGVuZ3RoIT09MiYmKGQudmFsdWVzPVtkLnZhbHVlc1swXSxkLnZhbHVlc1swXV0pKSx0aGlzLnJhbmdlPWEoIjxkaXY+PC9kaXY+IikuYXBwZW5kVG8odGhpcy5lbGVtZW50KS5hZGRDbGFzcygidWktc2xpZGVyLXJhbmdlIHVpLXdpZGdldC1oZWFkZXIiKyhkLnJhbmdlPT09Im1pbiJ8fGQucmFuZ2U9PT0ibWF4Ij8iIHVpLXNsaWRlci1yYW5nZS0iK2QucmFuZ2U6IiIpKSk7Zm9yKHZhciBpPWUubGVuZ3RoO2k8ZztpKz0xKWgucHVzaChmKTt0aGlzLmhhbmRsZXM9ZS5hZGQoYShoLmpvaW4oIiIpKS5hcHBlbmRUbyhiLmVsZW1lbnQpKSx0aGlzLmhhbmRsZT10aGlzLmhhbmRsZXMuZXEoMCksdGhpcy5oYW5kbGVzLmFkZCh0aGlzLnJhbmdlKS5maWx0ZXIoImEiKS5jbGljayhmdW5jdGlvbihhKXthLnByZXZlbnREZWZhdWx0KCl9KS5ob3ZlcihmdW5jdGlvbigpe2QuZGlzYWJsZWR8fGEodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWhvdmVyIil9LGZ1bmN0aW9uKCl7YSh0aGlzKS5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKX0pLmZvY3VzKGZ1bmN0aW9uKCl7ZC5kaXNhYmxlZD9hKHRoaXMpLmJsdXIoKTooYSgiLnVpLXNsaWRlciAudWktc3RhdGUtZm9jdXMiKS5yZW1vdmVDbGFzcygidWktc3RhdGUtZm9jdXMiKSxhKHRoaXMpLmFkZENsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpKX0pLmJsdXIoZnVuY3Rpb24oKXthKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpfSksdGhpcy5oYW5kbGVzLmVhY2goZnVuY3Rpb24oYil7YSh0aGlzKS5kYXRhKCJpbmRleC51aS1zbGlkZXItaGFuZGxlIixiKX0pLHRoaXMuaGFuZGxlcy5rZXlkb3duKGZ1bmN0aW9uKGQpe3ZhciBlPWEodGhpcykuZGF0YSgiaW5kZXgudWktc2xpZGVyLWhhbmRsZSIpLGYsZyxoLGk7aWYoYi5vcHRpb25zLmRpc2FibGVkKXJldHVybjtzd2l0Y2goZC5rZXlDb2RlKXtjYXNlIGEudWkua2V5Q29kZS5IT01FOmNhc2UgYS51aS5rZXlDb2RlLkVORDpjYXNlIGEudWkua2V5Q29kZS5QQUdFX1VQOmNhc2UgYS51aS5rZXlDb2RlLlBBR0VfRE9XTjpjYXNlIGEudWkua2V5Q29kZS5VUDpjYXNlIGEudWkua2V5Q29kZS5SSUdIVDpjYXNlIGEudWkua2V5Q29kZS5ET1dOOmNhc2UgYS51aS5rZXlDb2RlLkxFRlQ6ZC5wcmV2ZW50RGVmYXVsdCgpO2lmKCFiLl9rZXlTbGlkaW5nKXtiLl9rZXlTbGlkaW5nPSEwLGEodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLGY9Yi5fc3RhcnQoZCxlKTtpZihmPT09ITEpcmV0dXJufX1pPWIub3B0aW9ucy5zdGVwLGIub3B0aW9ucy52YWx1ZXMmJmIub3B0aW9ucy52YWx1ZXMubGVuZ3RoP2c9aD1iLnZhbHVlcyhlKTpnPWg9Yi52YWx1ZSgpO3N3aXRjaChkLmtleUNvZGUpe2Nhc2UgYS51aS5rZXlDb2RlLkhPTUU6aD1iLl92YWx1ZU1pbigpO2JyZWFrO2Nhc2UgYS51aS5rZXlDb2RlLkVORDpoPWIuX3ZhbHVlTWF4KCk7YnJlYWs7Y2FzZSBhLnVpLmtleUNvZGUuUEFHRV9VUDpoPWIuX3RyaW1BbGlnblZhbHVlKGcrKGIuX3ZhbHVlTWF4KCktYi5fdmFsdWVNaW4oKSkvYyk7YnJlYWs7Y2FzZSBhLnVpLmtleUNvZGUuUEFHRV9ET1dOOmg9Yi5fdHJpbUFsaWduVmFsdWUoZy0oYi5fdmFsdWVNYXgoKS1iLl92YWx1ZU1pbigpKS9jKTticmVhaztjYXNlIGEudWkua2V5Q29kZS5VUDpjYXNlIGEudWkua2V5Q29kZS5SSUdIVDppZihnPT09Yi5fdmFsdWVNYXgoKSlyZXR1cm47aD1iLl90cmltQWxpZ25WYWx1ZShnK2kpO2JyZWFrO2Nhc2UgYS51aS5rZXlDb2RlLkRPV046Y2FzZSBhLnVpLmtleUNvZGUuTEVGVDppZihnPT09Yi5fdmFsdWVNaW4oKSlyZXR1cm47aD1iLl90cmltQWxpZ25WYWx1ZShnLWkpfWIuX3NsaWRlKGQsZSxoKX0pLmtleXVwKGZ1bmN0aW9uKGMpe3ZhciBkPWEodGhpcykuZGF0YSgiaW5kZXgudWktc2xpZGVyLWhhbmRsZSIpO2IuX2tleVNsaWRpbmcmJihiLl9rZXlTbGlkaW5nPSExLGIuX3N0b3AoYyxkKSxiLl9jaGFuZ2UoYyxkKSxhKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSl9KSx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl9hbmltYXRlT2ZmPSExfSxkZXN0cm95OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGFuZGxlcy5yZW1vdmUoKSx0aGlzLnJhbmdlLnJlbW92ZSgpLHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2xpZGVyIHVpLXNsaWRlci1ob3Jpem9udGFsIHVpLXNsaWRlci12ZXJ0aWNhbCB1aS1zbGlkZXItZGlzYWJsZWQgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwiKS5yZW1vdmVEYXRhKCJzbGlkZXIiKS51bmJpbmQoIi5zbGlkZXIiKSx0aGlzLl9tb3VzZURlc3Ryb3koKSx0aGlzfSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMub3B0aW9ucyxkLGUsZixnLGgsaSxqLGssbDtyZXR1cm4gYy5kaXNhYmxlZD8hMToodGhpcy5lbGVtZW50U2l6ZT17d2lkdGg6dGhpcy5lbGVtZW50Lm91dGVyV2lkdGgoKSxoZWlnaHQ6dGhpcy5lbGVtZW50Lm91dGVySGVpZ2h0KCl9LHRoaXMuZWxlbWVudE9mZnNldD10aGlzLmVsZW1lbnQub2Zmc2V0KCksZD17eDpiLnBhZ2VYLHk6Yi5wYWdlWX0sZT10aGlzLl9ub3JtVmFsdWVGcm9tTW91c2UoZCksZj10aGlzLl92YWx1ZU1heCgpLXRoaXMuX3ZhbHVlTWluKCkrMSxoPXRoaXMsdGhpcy5oYW5kbGVzLmVhY2goZnVuY3Rpb24oYil7dmFyIGM9TWF0aC5hYnMoZS1oLnZhbHVlcyhiKSk7Zj5jJiYoZj1jLGc9YSh0aGlzKSxpPWIpfSksYy5yYW5nZT09PSEwJiZ0aGlzLnZhbHVlcygxKT09PWMubWluJiYoaSs9MSxnPWEodGhpcy5oYW5kbGVzW2ldKSksaj10aGlzLl9zdGFydChiLGkpLGo9PT0hMT8hMToodGhpcy5fbW91c2VTbGlkaW5nPSEwLGguX2hhbmRsZUluZGV4PWksZy5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIikuZm9jdXMoKSxrPWcub2Zmc2V0KCksbD0hYShiLnRhcmdldCkucGFyZW50cygpLmFuZFNlbGYoKS5pcygiLnVpLXNsaWRlci1oYW5kbGUiKSx0aGlzLl9jbGlja09mZnNldD1sP3tsZWZ0OjAsdG9wOjB9OntsZWZ0OmIucGFnZVgtay5sZWZ0LWcud2lkdGgoKS8yLHRvcDpiLnBhZ2VZLWsudG9wLWcuaGVpZ2h0KCkvMi0ocGFyc2VJbnQoZy5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQoZy5jc3MoImJvcmRlckJvdHRvbVdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoZy5jc3MoIm1hcmdpblRvcCIpLDEwKXx8MCl9LHRoaXMuaGFuZGxlcy5oYXNDbGFzcygidWktc3RhdGUtaG92ZXIiKXx8dGhpcy5fc2xpZGUoYixpLGUpLHRoaXMuX2FuaW1hdGVPZmY9ITAsITApKX0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oYSl7cmV0dXJuITB9LF9tb3VzZURyYWc6ZnVuY3Rpb24oYSl7dmFyIGI9e3g6YS5wYWdlWCx5OmEucGFnZVl9LGM9dGhpcy5fbm9ybVZhbHVlRnJvbU1vdXNlKGIpO3JldHVybiB0aGlzLl9zbGlkZShhLHRoaXMuX2hhbmRsZUluZGV4LGMpLCExfSxfbW91c2VTdG9wOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmhhbmRsZXMucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLHRoaXMuX21vdXNlU2xpZGluZz0hMSx0aGlzLl9zdG9wKGEsdGhpcy5faGFuZGxlSW5kZXgpLHRoaXMuX2NoYW5nZShhLHRoaXMuX2hhbmRsZUluZGV4KSx0aGlzLl9oYW5kbGVJbmRleD1udWxsLHRoaXMuX2NsaWNrT2Zmc2V0PW51bGwsdGhpcy5fYW5pbWF0ZU9mZj0hMSwhMX0sX2RldGVjdE9yaWVudGF0aW9uOmZ1bmN0aW9uKCl7dGhpcy5vcmllbnRhdGlvbj10aGlzLm9wdGlvbnMub3JpZW50YXRpb249PT0idmVydGljYWwiPyJ2ZXJ0aWNhbCI6Imhvcml6b250YWwifSxfbm9ybVZhbHVlRnJvbU1vdXNlOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGY7cmV0dXJuIHRoaXMub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCI/KGI9dGhpcy5lbGVtZW50U2l6ZS53aWR0aCxjPWEueC10aGlzLmVsZW1lbnRPZmZzZXQubGVmdC0odGhpcy5fY2xpY2tPZmZzZXQ/dGhpcy5fY2xpY2tPZmZzZXQubGVmdDowKSk6KGI9dGhpcy5lbGVtZW50U2l6ZS5oZWlnaHQsYz1hLnktdGhpcy5lbGVtZW50T2Zmc2V0LnRvcC0odGhpcy5fY2xpY2tPZmZzZXQ/dGhpcy5fY2xpY2tPZmZzZXQudG9wOjApKSxkPWMvYixkPjEmJihkPTEpLGQ8MCYmKGQ9MCksdGhpcy5vcmllbnRhdGlvbj09PSJ2ZXJ0aWNhbCImJihkPTEtZCksZT10aGlzLl92YWx1ZU1heCgpLXRoaXMuX3ZhbHVlTWluKCksZj10aGlzLl92YWx1ZU1pbigpK2QqZSx0aGlzLl90cmltQWxpZ25WYWx1ZShmKX0sX3N0YXJ0OmZ1bmN0aW9uKGEsYil7dmFyIGM9e2hhbmRsZTp0aGlzLmhhbmRsZXNbYl0sdmFsdWU6dGhpcy52YWx1ZSgpfTtyZXR1cm4gdGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGgmJihjLnZhbHVlPXRoaXMudmFsdWVzKGIpLGMudmFsdWVzPXRoaXMudmFsdWVzKCkpLHRoaXMuX3RyaWdnZXIoInN0YXJ0IixhLGMpfSxfc2xpZGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZjt0aGlzLm9wdGlvbnMudmFsdWVzJiZ0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aD8oZD10aGlzLnZhbHVlcyhiPzA6MSksdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGg9PT0yJiZ0aGlzLm9wdGlvbnMucmFuZ2U9PT0hMCYmKGI9PT0wJiZjPmR8fGI9PT0xJiZjPGQpJiYoYz1kKSxjIT09dGhpcy52YWx1ZXMoYikmJihlPXRoaXMudmFsdWVzKCksZVtiXT1jLGY9dGhpcy5fdHJpZ2dlcigic2xpZGUiLGEse2hhbmRsZTp0aGlzLmhhbmRsZXNbYl0sdmFsdWU6Yyx2YWx1ZXM6ZX0pLGQ9dGhpcy52YWx1ZXMoYj8wOjEpLGYhPT0hMSYmdGhpcy52YWx1ZXMoYixjLCEwKSkpOmMhPT10aGlzLnZhbHVlKCkmJihmPXRoaXMuX3RyaWdnZXIoInNsaWRlIixhLHtoYW5kbGU6dGhpcy5oYW5kbGVzW2JdLHZhbHVlOmN9KSxmIT09ITEmJnRoaXMudmFsdWUoYykpfSxfc3RvcDpmdW5jdGlvbihhLGIpe3ZhciBjPXtoYW5kbGU6dGhpcy5oYW5kbGVzW2JdLHZhbHVlOnRoaXMudmFsdWUoKX07dGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGgmJihjLnZhbHVlPXRoaXMudmFsdWVzKGIpLGMudmFsdWVzPXRoaXMudmFsdWVzKCkpLHRoaXMuX3RyaWdnZXIoInN0b3AiLGEsYyl9LF9jaGFuZ2U6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5fa2V5U2xpZGluZyYmIXRoaXMuX21vdXNlU2xpZGluZyl7dmFyIGM9e2hhbmRsZTp0aGlzLmhhbmRsZXNbYl0sdmFsdWU6dGhpcy52YWx1ZSgpfTt0aGlzLm9wdGlvbnMudmFsdWVzJiZ0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aCYmKGMudmFsdWU9dGhpcy52YWx1ZXMoYiksYy52YWx1ZXM9dGhpcy52YWx1ZXMoKSksdGhpcy5fdHJpZ2dlcigiY2hhbmdlIixhLGMpfX0sdmFsdWU6ZnVuY3Rpb24oYSl7aWYoYXJndW1lbnRzLmxlbmd0aCl7dGhpcy5vcHRpb25zLnZhbHVlPXRoaXMuX3RyaW1BbGlnblZhbHVlKGEpLHRoaXMuX3JlZnJlc2hWYWx1ZSgpLHRoaXMuX2NoYW5nZShudWxsLDApO3JldHVybn1yZXR1cm4gdGhpcy5fdmFsdWUoKX0sdmFsdWVzOmZ1bmN0aW9uKGIsYyl7dmFyIGQsZSxmO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSl7dGhpcy5vcHRpb25zLnZhbHVlc1tiXT10aGlzLl90cmltQWxpZ25WYWx1ZShjKSx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl9jaGFuZ2UobnVsbCxiKTtyZXR1cm59aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuX3ZhbHVlcygpO2lmKCFhLmlzQXJyYXkoYXJndW1lbnRzWzBdKSlyZXR1cm4gdGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGg/dGhpcy5fdmFsdWVzKGIpOnRoaXMudmFsdWUoKTtkPXRoaXMub3B0aW9ucy52YWx1ZXMsZT1hcmd1bWVudHNbMF07Zm9yKGY9MDtmPGQubGVuZ3RoO2YrPTEpZFtmXT10aGlzLl90cmltQWxpZ25WYWx1ZShlW2ZdKSx0aGlzLl9jaGFuZ2UobnVsbCxmKTt0aGlzLl9yZWZyZXNoVmFsdWUoKX0sX3NldE9wdGlvbjpmdW5jdGlvbihiLGMpe3ZhciBkLGU9MDthLmlzQXJyYXkodGhpcy5vcHRpb25zLnZhbHVlcykmJihlPXRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoKSxhLldpZGdldC5wcm90b3R5cGUuX3NldE9wdGlvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7c3dpdGNoKGIpe2Nhc2UiZGlzYWJsZWQiOmM/KHRoaXMuaGFuZGxlcy5maWx0ZXIoIi51aS1zdGF0ZS1mb2N1cyIpLmJsdXIoKSx0aGlzLmhhbmRsZXMucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIiksdGhpcy5oYW5kbGVzLnByb3BBdHRyKCJkaXNhYmxlZCIsITApLHRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktZGlzYWJsZWQiKSk6KHRoaXMuaGFuZGxlcy5wcm9wQXR0cigiZGlzYWJsZWQiLCExKSx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLWRpc2FibGVkIikpO2JyZWFrO2Nhc2Uib3JpZW50YXRpb24iOnRoaXMuX2RldGVjdE9yaWVudGF0aW9uKCksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zbGlkZXItaG9yaXpvbnRhbCB1aS1zbGlkZXItdmVydGljYWwiKS5hZGRDbGFzcygidWktc2xpZGVyLSIrdGhpcy5vcmllbnRhdGlvbiksdGhpcy5fcmVmcmVzaFZhbHVlKCk7YnJlYWs7Y2FzZSJ2YWx1ZSI6dGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl9jaGFuZ2UobnVsbCwwKSx0aGlzLl9hbmltYXRlT2ZmPSExO2JyZWFrO2Nhc2UidmFsdWVzIjp0aGlzLl9hbmltYXRlT2ZmPSEwLHRoaXMuX3JlZnJlc2hWYWx1ZSgpO2ZvcihkPTA7ZDxlO2QrPTEpdGhpcy5fY2hhbmdlKG51bGwsZCk7dGhpcy5fYW5pbWF0ZU9mZj0hMX19LF92YWx1ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucy52YWx1ZTtyZXR1cm4gYT10aGlzLl90cmltQWxpZ25WYWx1ZShhKSxhfSxfdmFsdWVzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZDtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBiPXRoaXMub3B0aW9ucy52YWx1ZXNbYV0sYj10aGlzLl90cmltQWxpZ25WYWx1ZShiKSxiO2M9dGhpcy5vcHRpb25zLnZhbHVlcy5zbGljZSgpO2ZvcihkPTA7ZDxjLmxlbmd0aDtkKz0xKWNbZF09dGhpcy5fdHJpbUFsaWduVmFsdWUoY1tkXSk7cmV0dXJuIGN9LF90cmltQWxpZ25WYWx1ZTpmdW5jdGlvbihhKXtpZihhPD10aGlzLl92YWx1ZU1pbigpKXJldHVybiB0aGlzLl92YWx1ZU1pbigpO2lmKGE+PXRoaXMuX3ZhbHVlTWF4KCkpcmV0dXJuIHRoaXMuX3ZhbHVlTWF4KCk7dmFyIGI9dGhpcy5vcHRpb25zLnN0ZXA+MD90aGlzLm9wdGlvbnMuc3RlcDoxLGM9KGEtdGhpcy5fdmFsdWVNaW4oKSklYixkPWEtYztyZXR1cm4gTWF0aC5hYnMoYykqMj49YiYmKGQrPWM+MD9iOi1iKSxwYXJzZUZsb2F0KGQudG9GaXhlZCg1KSl9LF92YWx1ZU1pbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMubWlufSxfdmFsdWVNYXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLm1heH0sX3JlZnJlc2hWYWx1ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3B0aW9ucy5yYW5nZSxjPXRoaXMub3B0aW9ucyxkPXRoaXMsZT10aGlzLl9hbmltYXRlT2ZmPyExOmMuYW5pbWF0ZSxmLGc9e30saCxpLGosazt0aGlzLm9wdGlvbnMudmFsdWVzJiZ0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aD90aGlzLmhhbmRsZXMuZWFjaChmdW5jdGlvbihiLGkpe2Y9KGQudmFsdWVzKGIpLWQuX3ZhbHVlTWluKCkpLyhkLl92YWx1ZU1heCgpLWQuX3ZhbHVlTWluKCkpKjEwMCxnW2Qub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCI/ImxlZnQiOiJib3R0b20iXT1mKyIlIixhKHRoaXMpLnN0b3AoMSwxKVtlPyJhbmltYXRlIjoiY3NzIl0oZyxjLmFuaW1hdGUpLGQub3B0aW9ucy5yYW5nZT09PSEwJiYoZC5vcmllbnRhdGlvbj09PSJob3Jpem9udGFsIj8oYj09PTAmJmQucmFuZ2Uuc3RvcCgxLDEpW2U/ImFuaW1hdGUiOiJjc3MiXSh7bGVmdDpmKyIlIn0sYy5hbmltYXRlKSxiPT09MSYmZC5yYW5nZVtlPyJhbmltYXRlIjoiY3NzIl0oe3dpZHRoOmYtaCsiJSJ9LHtxdWV1ZTohMSxkdXJhdGlvbjpjLmFuaW1hdGV9KSk6KGI9PT0wJiZkLnJhbmdlLnN0b3AoMSwxKVtlPyJhbmltYXRlIjoiY3NzIl0oe2JvdHRvbTpmKyIlIn0sYy5hbmltYXRlKSxiPT09MSYmZC5yYW5nZVtlPyJhbmltYXRlIjoiY3NzIl0oe2hlaWdodDpmLWgrIiUifSx7cXVldWU6ITEsZHVyYXRpb246Yy5hbmltYXRlfSkpKSxoPWZ9KTooaT10aGlzLnZhbHVlKCksaj10aGlzLl92YWx1ZU1pbigpLGs9dGhpcy5fdmFsdWVNYXgoKSxmPWshPT1qPyhpLWopLyhrLWopKjEwMDowLGdbZC5vcmllbnRhdGlvbj09PSJob3Jpem9udGFsIj8ibGVmdCI6ImJvdHRvbSJdPWYrIiUiLHRoaXMuaGFuZGxlLnN0b3AoMSwxKVtlPyJhbmltYXRlIjoiY3NzIl0oZyxjLmFuaW1hdGUpLGI9PT0ibWluIiYmdGhpcy5vcmllbnRhdGlvbj09PSJob3Jpem9udGFsIiYmdGhpcy5yYW5nZS5zdG9wKDEsMSlbZT8iYW5pbWF0ZSI6ImNzcyJdKHt3aWR0aDpmKyIlIn0sYy5hbmltYXRlKSxiPT09Im1heCImJnRoaXMub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCImJnRoaXMucmFuZ2VbZT8iYW5pbWF0ZSI6ImNzcyJdKHt3aWR0aDoxMDAtZisiJSJ9LHtxdWV1ZTohMSxkdXJhdGlvbjpjLmFuaW1hdGV9KSxiPT09Im1pbiImJnRoaXMub3JpZW50YXRpb249PT0idmVydGljYWwiJiZ0aGlzLnJhbmdlLnN0b3AoMSwxKVtlPyJhbmltYXRlIjoiY3NzIl0oe2hlaWdodDpmKyIlIn0sYy5hbmltYXRlKSxiPT09Im1heCImJnRoaXMub3JpZW50YXRpb249PT0idmVydGljYWwiJiZ0aGlzLnJhbmdlW2U/ImFuaW1hdGUiOiJjc3MiXSh7aGVpZ2h0OjEwMC1mKyIlIn0se3F1ZXVlOiExLGR1cmF0aW9uOmMuYW5pbWF0ZX0pKX19KSxhLmV4dGVuZChhLnVpLnNsaWRlcix7dmVyc2lvbjoiMS44LjI0In0pfShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gZSgpe3JldHVybisrY31mdW5jdGlvbiBmKCl7cmV0dXJuKytkfXZhciBjPTAsZD0wO2Eud2lkZ2V0KCJ1aS50YWJzIix7b3B0aW9uczp7YWRkOm51bGwsYWpheE9wdGlvbnM6bnVsbCxjYWNoZTohMSxjb29raWU6bnVsbCxjb2xsYXBzaWJsZTohMSxkaXNhYmxlOm51bGwsZGlzYWJsZWQ6W10sZW5hYmxlOm51bGwsZXZlbnQ6ImNsaWNrIixmeDpudWxsLGlkUHJlZml4OiJ1aS10YWJzLSIsbG9hZDpudWxsLHBhbmVsVGVtcGxhdGU6IjxkaXY+PC9kaXY+IixyZW1vdmU6bnVsbCxzZWxlY3Q6bnVsbCxzaG93Om51bGwsc3Bpbm5lcjoiPGVtPkxvYWRpbmcmIzgyMzA7PC9lbT4iLHRhYlRlbXBsYXRlOiI8bGk+PGEgaHJlZj0nI3tocmVmfSc+PHNwYW4+I3tsYWJlbH08L3NwYW4+PC9hPjwvbGk+In0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuX3RhYmlmeSghMCl9LF9zZXRPcHRpb246ZnVuY3Rpb24oYSxiKXtpZihhPT0ic2VsZWN0ZWQiKXtpZih0aGlzLm9wdGlvbnMuY29sbGFwc2libGUmJmI9PXRoaXMub3B0aW9ucy5zZWxlY3RlZClyZXR1cm47dGhpcy5zZWxlY3QoYil9ZWxzZSB0aGlzLm9wdGlvbnNbYV09Yix0aGlzLl90YWJpZnkoKX0sX3RhYklkOmZ1bmN0aW9uKGEpe3JldHVybiBhLnRpdGxlJiZhLnRpdGxlLnJlcGxhY2UoL1xzL2csIl8iKS5yZXBsYWNlKC9bXlx3XHUwMGMwLVx1RkZGRi1dL2csIiIpfHx0aGlzLm9wdGlvbnMuaWRQcmVmaXgrZSgpfSxfc2FuaXRpemVTZWxlY3RvcjpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKC86L2csIlxcOiIpfSxfY29va2llOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5jb29raWV8fCh0aGlzLmNvb2tpZT10aGlzLm9wdGlvbnMuY29va2llLm5hbWV8fCJ1aS10YWJzLSIrZigpKTtyZXR1cm4gYS5jb29raWUuYXBwbHkobnVsbCxbYl0uY29uY2F0KGEubWFrZUFycmF5KGFyZ3VtZW50cykpKX0sX3VpOmZ1bmN0aW9uKGEsYil7cmV0dXJue3RhYjphLHBhbmVsOmIsaW5kZXg6dGhpcy5hbmNob3JzLmluZGV4KGEpfX0sX2NsZWFudXA6ZnVuY3Rpb24oKXt0aGlzLmxpcy5maWx0ZXIoIi51aS1zdGF0ZS1wcm9jZXNzaW5nIikucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLXByb2Nlc3NpbmciKS5maW5kKCJzcGFuOmRhdGEobGFiZWwudGFicykiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9YSh0aGlzKTtiLmh0bWwoYi5kYXRhKCJsYWJlbC50YWJzIikpLnJlbW92ZURhdGEoImxhYmVsLnRhYnMiKX0pfSxfdGFiaWZ5OmZ1bmN0aW9uKGMpe2Z1bmN0aW9uIG0oYixjKXtiLmNzcygiZGlzcGxheSIsIiIpLCFhLnN1cHBvcnQub3BhY2l0eSYmYy5vcGFjaXR5JiZiWzBdLnN0eWxlLnJlbW92ZUF0dHJpYnV0ZSgiZmlsdGVyIil9dmFyIGQ9dGhpcyxlPXRoaXMub3B0aW9ucyxmPS9eIy4rLzt0aGlzLmxpc3Q9dGhpcy5lbGVtZW50LmZpbmQoIm9sLHVsIikuZXEoMCksdGhpcy5saXM9YSgiID4gbGk6aGFzKGFbaHJlZl0pIix0aGlzLmxpc3QpLHRoaXMuYW5jaG9ycz10aGlzLmxpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gYSgiYSIsdGhpcylbMF19KSx0aGlzLnBhbmVscz1hKFtdKSx0aGlzLmFuY2hvcnMuZWFjaChmdW5jdGlvbihiLGMpe3ZhciBnPWEoYykuYXR0cigiaHJlZiIpLGg9Zy5zcGxpdCgiIyIpWzBdLGk7aCYmKGg9PT1sb2NhdGlvbi50b1N0cmluZygpLnNwbGl0KCIjIilbMF18fChpPWEoImJhc2UiKVswXSkmJmg9PT1pLmhyZWYpJiYoZz1jLmhhc2gsYy5ocmVmPWcpO2lmKGYudGVzdChnKSlkLnBhbmVscz1kLnBhbmVscy5hZGQoZC5lbGVtZW50LmZpbmQoZC5fc2FuaXRpemVTZWxlY3RvcihnKSkpO2Vsc2UgaWYoZyYmZyE9PSIjIil7YS5kYXRhKGMsImhyZWYudGFicyIsZyksYS5kYXRhKGMsImxvYWQudGFicyIsZy5yZXBsYWNlKC8jLiokLywiIikpO3ZhciBqPWQuX3RhYklkKGMpO2MuaHJlZj0iIyIrajt2YXIgaz1kLmVsZW1lbnQuZmluZCgiIyIraik7ay5sZW5ndGh8fChrPWEoZS5wYW5lbFRlbXBsYXRlKS5hdHRyKCJpZCIsaikuYWRkQ2xhc3MoInVpLXRhYnMtcGFuZWwgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSIpLmluc2VydEFmdGVyKGQucGFuZWxzW2ItMV18fGQubGlzdCksay5kYXRhKCJkZXN0cm95LnRhYnMiLCEwKSksZC5wYW5lbHM9ZC5wYW5lbHMuYWRkKGspfWVsc2UgZS5kaXNhYmxlZC5wdXNoKGIpfSksYz8odGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS10YWJzIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIiksdGhpcy5saXN0LmFkZENsYXNzKCJ1aS10YWJzLW5hdiB1aS1oZWxwZXItcmVzZXQgdWktaGVscGVyLWNsZWFyZml4IHVpLXdpZGdldC1oZWFkZXIgdWktY29ybmVyLWFsbCIpLHRoaXMubGlzLmFkZENsYXNzKCJ1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci10b3AiKSx0aGlzLnBhbmVscy5hZGRDbGFzcygidWktdGFicy1wYW5lbCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYm90dG9tIiksZS5zZWxlY3RlZD09PWI/KGxvY2F0aW9uLmhhc2gmJnRoaXMuYW5jaG9ycy5lYWNoKGZ1bmN0aW9uKGEsYil7aWYoYi5oYXNoPT1sb2NhdGlvbi5oYXNoKXJldHVybiBlLnNlbGVjdGVkPWEsITF9KSx0eXBlb2YgZS5zZWxlY3RlZCE9Im51bWJlciImJmUuY29va2llJiYoZS5zZWxlY3RlZD1wYXJzZUludChkLl9jb29raWUoKSwxMCkpLHR5cGVvZiBlLnNlbGVjdGVkIT0ibnVtYmVyIiYmdGhpcy5saXMuZmlsdGVyKCIudWktdGFicy1zZWxlY3RlZCIpLmxlbmd0aCYmKGUuc2VsZWN0ZWQ9dGhpcy5saXMuaW5kZXgodGhpcy5saXMuZmlsdGVyKCIudWktdGFicy1zZWxlY3RlZCIpKSksZS5zZWxlY3RlZD1lLnNlbGVjdGVkfHwodGhpcy5saXMubGVuZ3RoPzA6LTEpKTplLnNlbGVjdGVkPT09bnVsbCYmKGUuc2VsZWN0ZWQ9LTEpLGUuc2VsZWN0ZWQ9ZS5zZWxlY3RlZD49MCYmdGhpcy5hbmNob3JzW2Uuc2VsZWN0ZWRdfHxlLnNlbGVjdGVkPDA/ZS5zZWxlY3RlZDowLGUuZGlzYWJsZWQ9YS51bmlxdWUoZS5kaXNhYmxlZC5jb25jYXQoYS5tYXAodGhpcy5saXMuZmlsdGVyKCIudWktc3RhdGUtZGlzYWJsZWQiKSxmdW5jdGlvbihhLGIpe3JldHVybiBkLmxpcy5pbmRleChhKX0pKSkuc29ydCgpLGEuaW5BcnJheShlLnNlbGVjdGVkLGUuZGlzYWJsZWQpIT0tMSYmZS5kaXNhYmxlZC5zcGxpY2UoYS5pbkFycmF5KGUuc2VsZWN0ZWQsZS5kaXNhYmxlZCksMSksdGhpcy5wYW5lbHMuYWRkQ2xhc3MoInVpLXRhYnMtaGlkZSIpLHRoaXMubGlzLnJlbW92ZUNsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSIpLGUuc2VsZWN0ZWQ+PTAmJnRoaXMuYW5jaG9ycy5sZW5ndGgmJihkLmVsZW1lbnQuZmluZChkLl9zYW5pdGl6ZVNlbGVjdG9yKGQuYW5jaG9yc1tlLnNlbGVjdGVkXS5oYXNoKSkucmVtb3ZlQ2xhc3MoInVpLXRhYnMtaGlkZSIpLHRoaXMubGlzLmVxKGUuc2VsZWN0ZWQpLmFkZENsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSIpLGQuZWxlbWVudC5xdWV1ZSgidGFicyIsZnVuY3Rpb24oKXtkLl90cmlnZ2VyKCJzaG93IixudWxsLGQuX3VpKGQuYW5jaG9yc1tlLnNlbGVjdGVkXSxkLmVsZW1lbnQuZmluZChkLl9zYW5pdGl6ZVNlbGVjdG9yKGQuYW5jaG9yc1tlLnNlbGVjdGVkXS5oYXNoKSlbMF0pKX0pLHRoaXMubG9hZChlLnNlbGVjdGVkKSksYSh3aW5kb3cpLmJpbmQoInVubG9hZCIsZnVuY3Rpb24oKXtkLmxpcy5hZGQoZC5hbmNob3JzKS51bmJpbmQoIi50YWJzIiksZC5saXM9ZC5hbmNob3JzPWQucGFuZWxzPW51bGx9KSk6ZS5zZWxlY3RlZD10aGlzLmxpcy5pbmRleCh0aGlzLmxpcy5maWx0ZXIoIi51aS10YWJzLXNlbGVjdGVkIikpLHRoaXMuZWxlbWVudFtlLmNvbGxhcHNpYmxlPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oInVpLXRhYnMtY29sbGFwc2libGUiKSxlLmNvb2tpZSYmdGhpcy5fY29va2llKGUuc2VsZWN0ZWQsZS5jb29raWUpO2Zvcih2YXIgZz0wLGg7aD10aGlzLmxpc1tnXTtnKyspYShoKVthLmluQXJyYXkoZyxlLmRpc2FibGVkKSE9LTEmJiFhKGgpLmhhc0NsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIik/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXSgidWktc3RhdGUtZGlzYWJsZWQiKTtlLmNhY2hlPT09ITEmJnRoaXMuYW5jaG9ycy5yZW1vdmVEYXRhKCJjYWNoZS50YWJzIiksdGhpcy5saXMuYWRkKHRoaXMuYW5jaG9ycykudW5iaW5kKCIudGFicyIpO2lmKGUuZXZlbnQhPT0ibW91c2VvdmVyIil7dmFyIGk9ZnVuY3Rpb24oYSxiKXtiLmlzKCI6bm90KC51aS1zdGF0ZS1kaXNhYmxlZCkiKSYmYi5hZGRDbGFzcygidWktc3RhdGUtIithKX0saj1mdW5jdGlvbihhLGIpe2IucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLSIrYSl9O3RoaXMubGlzLmJpbmQoIm1vdXNlb3Zlci50YWJzIixmdW5jdGlvbigpe2koImhvdmVyIixhKHRoaXMpKX0pLHRoaXMubGlzLmJpbmQoIm1vdXNlb3V0LnRhYnMiLGZ1bmN0aW9uKCl7aigiaG92ZXIiLGEodGhpcykpfSksdGhpcy5hbmNob3JzLmJpbmQoImZvY3VzLnRhYnMiLGZ1bmN0aW9uKCl7aSgiZm9jdXMiLGEodGhpcykuY2xvc2VzdCgibGkiKSl9KSx0aGlzLmFuY2hvcnMuYmluZCgiYmx1ci50YWJzIixmdW5jdGlvbigpe2ooImZvY3VzIixhKHRoaXMpLmNsb3Nlc3QoImxpIikpfSl9dmFyIGssbDtlLmZ4JiYoYS5pc0FycmF5KGUuZngpPyhrPWUuZnhbMF0sbD1lLmZ4WzFdKTprPWw9ZS5meCk7dmFyIG49bD9mdW5jdGlvbihiLGMpe2EoYikuY2xvc2VzdCgibGkiKS5hZGRDbGFzcygidWktdGFicy1zZWxlY3RlZCB1aS1zdGF0ZS1hY3RpdmUiKSxjLmhpZGUoKS5yZW1vdmVDbGFzcygidWktdGFicy1oaWRlIikuYW5pbWF0ZShsLGwuZHVyYXRpb258fCJub3JtYWwiLGZ1bmN0aW9uKCl7bShjLGwpLGQuX3RyaWdnZXIoInNob3ciLG51bGwsZC5fdWkoYixjWzBdKSl9KX06ZnVuY3Rpb24oYixjKXthKGIpLmNsb3Nlc3QoImxpIikuYWRkQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQgdWktc3RhdGUtYWN0aXZlIiksYy5yZW1vdmVDbGFzcygidWktdGFicy1oaWRlIiksZC5fdHJpZ2dlcigic2hvdyIsbnVsbCxkLl91aShiLGNbMF0pKX0sbz1rP2Z1bmN0aW9uKGEsYil7Yi5hbmltYXRlKGssay5kdXJhdGlvbnx8Im5vcm1hbCIsZnVuY3Rpb24oKXtkLmxpcy5yZW1vdmVDbGFzcygidWktdGFicy1zZWxlY3RlZCB1aS1zdGF0ZS1hY3RpdmUiKSxiLmFkZENsYXNzKCJ1aS10YWJzLWhpZGUiKSxtKGIsayksZC5lbGVtZW50LmRlcXVldWUoInRhYnMiKX0pfTpmdW5jdGlvbihhLGIsYyl7ZC5saXMucmVtb3ZlQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQgdWktc3RhdGUtYWN0aXZlIiksYi5hZGRDbGFzcygidWktdGFicy1oaWRlIiksZC5lbGVtZW50LmRlcXVldWUoInRhYnMiKX07dGhpcy5hbmNob3JzLmJpbmQoZS5ldmVudCsiLnRhYnMiLGZ1bmN0aW9uKCl7dmFyIGI9dGhpcyxjPWEoYikuY2xvc2VzdCgibGkiKSxmPWQucGFuZWxzLmZpbHRlcigiOm5vdCgudWktdGFicy1oaWRlKSIpLGc9ZC5lbGVtZW50LmZpbmQoZC5fc2FuaXRpemVTZWxlY3RvcihiLmhhc2gpKTtpZihjLmhhc0NsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIikmJiFlLmNvbGxhcHNpYmxlfHxjLmhhc0NsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpfHxjLmhhc0NsYXNzKCJ1aS1zdGF0ZS1wcm9jZXNzaW5nIil8fGQucGFuZWxzLmZpbHRlcigiOmFuaW1hdGVkIikubGVuZ3RofHxkLl90cmlnZ2VyKCJzZWxlY3QiLG51bGwsZC5fdWkodGhpcyxnWzBdKSk9PT0hMSlyZXR1cm4gdGhpcy5ibHVyKCksITE7ZS5zZWxlY3RlZD1kLmFuY2hvcnMuaW5kZXgodGhpcyksZC5hYm9ydCgpO2lmKGUuY29sbGFwc2libGUpe2lmKGMuaGFzQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQiKSlyZXR1cm4gZS5zZWxlY3RlZD0tMSxlLmNvb2tpZSYmZC5fY29va2llKGUuc2VsZWN0ZWQsZS5jb29raWUpLGQuZWxlbWVudC5xdWV1ZSgidGFicyIsZnVuY3Rpb24oKXtvKGIsZil9KS5kZXF1ZXVlKCJ0YWJzIiksdGhpcy5ibHVyKCksITE7aWYoIWYubGVuZ3RoKXJldHVybiBlLmNvb2tpZSYmZC5fY29va2llKGUuc2VsZWN0ZWQsZS5jb29raWUpLGQuZWxlbWVudC5xdWV1ZSgidGFicyIsZnVuY3Rpb24oKXtuKGIsZyl9KSxkLmxvYWQoZC5hbmNob3JzLmluZGV4KHRoaXMpKSx0aGlzLmJsdXIoKSwhMX1lLmNvb2tpZSYmZC5fY29va2llKGUuc2VsZWN0ZWQsZS5jb29raWUpO2lmKGcubGVuZ3RoKWYubGVuZ3RoJiZkLmVsZW1lbnQucXVldWUoInRhYnMiLGZ1bmN0aW9uKCl7byhiLGYpfSksZC5lbGVtZW50LnF1ZXVlKCJ0YWJzIixmdW5jdGlvbigpe24oYixnKX0pLGQubG9hZChkLmFuY2hvcnMuaW5kZXgodGhpcykpO2Vsc2UgdGhyb3cialF1ZXJ5IFVJIFRhYnM6IE1pc21hdGNoaW5nIGZyYWdtZW50IGlkZW50aWZpZXIuIjthLmJyb3dzZXIubXNpZSYmdGhpcy5ibHVyKCl9KSx0aGlzLmFuY2hvcnMuYmluZCgiY2xpY2sudGFicyIsZnVuY3Rpb24oKXtyZXR1cm4hMX0pfSxfZ2V0SW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhPT0ic3RyaW5nIiYmKGE9dGhpcy5hbmNob3JzLmluZGV4KHRoaXMuYW5jaG9ycy5maWx0ZXIoIltocmVmJD0nIithKyInXSIpKSksYX0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3B0aW9ucztyZXR1cm4gdGhpcy5hYm9ydCgpLHRoaXMuZWxlbWVudC51bmJpbmQoIi50YWJzIikucmVtb3ZlQ2xhc3MoInVpLXRhYnMgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwgdWktdGFicy1jb2xsYXBzaWJsZSIpLnJlbW92ZURhdGEoInRhYnMiKSx0aGlzLmxpc3QucmVtb3ZlQ2xhc3MoInVpLXRhYnMtbmF2IHVpLWhlbHBlci1yZXNldCB1aS1oZWxwZXItY2xlYXJmaXggdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItYWxsIiksdGhpcy5hbmNob3JzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1hLmRhdGEodGhpcywiaHJlZi50YWJzIik7YiYmKHRoaXMuaHJlZj1iKTt2YXIgYz1hKHRoaXMpLnVuYmluZCgiLnRhYnMiKTthLmVhY2goWyJocmVmIiwibG9hZCIsImNhY2hlIl0sZnVuY3Rpb24oYSxiKXtjLnJlbW92ZURhdGEoYisiLnRhYnMiKX0pfSksdGhpcy5saXMudW5iaW5kKCIudGFicyIpLmFkZCh0aGlzLnBhbmVscykuZWFjaChmdW5jdGlvbigpe2EuZGF0YSh0aGlzLCJkZXN0cm95LnRhYnMiKT9hKHRoaXMpLnJlbW92ZSgpOmEodGhpcykucmVtb3ZlQ2xhc3MoWyJ1aS1zdGF0ZS1kZWZhdWx0IiwidWktY29ybmVyLXRvcCIsInVpLXRhYnMtc2VsZWN0ZWQiLCJ1aS1zdGF0ZS1hY3RpdmUiLCJ1aS1zdGF0ZS1ob3ZlciIsInVpLXN0YXRlLWZvY3VzIiwidWktc3RhdGUtZGlzYWJsZWQiLCJ1aS10YWJzLXBhbmVsIiwidWktd2lkZ2V0LWNvbnRlbnQiLCJ1aS1jb3JuZXItYm90dG9tIiwidWktdGFicy1oaWRlIl0uam9pbigiICIpKX0pLGIuY29va2llJiZ0aGlzLl9jb29raWUobnVsbCxiLmNvb2tpZSksdGhpc30sYWRkOmZ1bmN0aW9uKGMsZCxlKXtlPT09YiYmKGU9dGhpcy5hbmNob3JzLmxlbmd0aCk7dmFyIGY9dGhpcyxnPXRoaXMub3B0aW9ucyxoPWEoZy50YWJUZW1wbGF0ZS5yZXBsYWNlKC8jXHtocmVmXH0vZyxjKS5yZXBsYWNlKC8jXHtsYWJlbFx9L2csZCkpLGk9Yy5pbmRleE9mKCIjIik/dGhpcy5fdGFiSWQoYSgiYSIsaClbMF0pOmMucmVwbGFjZSgiIyIsIiIpO2guYWRkQ2xhc3MoInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLXRvcCIpLmRhdGEoImRlc3Ryb3kudGFicyIsITApO3ZhciBqPWYuZWxlbWVudC5maW5kKCIjIitpKTtyZXR1cm4gai5sZW5ndGh8fChqPWEoZy5wYW5lbFRlbXBsYXRlKS5hdHRyKCJpZCIsaSkuZGF0YSgiZGVzdHJveS50YWJzIiwhMCkpLGouYWRkQ2xhc3MoInVpLXRhYnMtcGFuZWwgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSB1aS10YWJzLWhpZGUiKSxlPj10aGlzLmxpcy5sZW5ndGg/KGguYXBwZW5kVG8odGhpcy5saXN0KSxqLmFwcGVuZFRvKHRoaXMubGlzdFswXS5wYXJlbnROb2RlKSk6KGguaW5zZXJ0QmVmb3JlKHRoaXMubGlzW2VdKSxqLmluc2VydEJlZm9yZSh0aGlzLnBhbmVsc1tlXSkpLGcuZGlzYWJsZWQ9YS5tYXAoZy5kaXNhYmxlZCxmdW5jdGlvbihhLGIpe3JldHVybiBhPj1lPysrYTphfSksdGhpcy5fdGFiaWZ5KCksdGhpcy5hbmNob3JzLmxlbmd0aD09MSYmKGcuc2VsZWN0ZWQ9MCxoLmFkZENsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSIpLGoucmVtb3ZlQ2xhc3MoInVpLXRhYnMtaGlkZSIpLHRoaXMuZWxlbWVudC5xdWV1ZSgidGFicyIsZnVuY3Rpb24oKXtmLl90cmlnZ2VyKCJzaG93IixudWxsLGYuX3VpKGYuYW5jaG9yc1swXSxmLnBhbmVsc1swXSkpfSksdGhpcy5sb2FkKDApKSx0aGlzLl90cmlnZ2VyKCJhZGQiLG51bGwsdGhpcy5fdWkodGhpcy5hbmNob3JzW2VdLHRoaXMucGFuZWxzW2VdKSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKGIpe2I9dGhpcy5fZ2V0SW5kZXgoYik7dmFyIGM9dGhpcy5vcHRpb25zLGQ9dGhpcy5saXMuZXEoYikucmVtb3ZlKCksZT10aGlzLnBhbmVscy5lcShiKS5yZW1vdmUoKTtyZXR1cm4gZC5oYXNDbGFzcygidWktdGFicy1zZWxlY3RlZCIpJiZ0aGlzLmFuY2hvcnMubGVuZ3RoPjEmJnRoaXMuc2VsZWN0KGIrKGIrMTx0aGlzLmFuY2hvcnMubGVuZ3RoPzE6LTEpKSxjLmRpc2FibGVkPWEubWFwKGEuZ3JlcChjLmRpc2FibGVkLGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEhPWJ9KSxmdW5jdGlvbihhLGMpe3JldHVybiBhPj1iPy0tYTphfSksdGhpcy5fdGFiaWZ5KCksdGhpcy5fdHJpZ2dlcigicmVtb3ZlIixudWxsLHRoaXMuX3VpKGQuZmluZCgiYSIpWzBdLGVbMF0pKSx0aGlzfSxlbmFibGU6ZnVuY3Rpb24oYil7Yj10aGlzLl9nZXRJbmRleChiKTt2YXIgYz10aGlzLm9wdGlvbnM7aWYoYS5pbkFycmF5KGIsYy5kaXNhYmxlZCk9PS0xKXJldHVybjtyZXR1cm4gdGhpcy5saXMuZXEoYikucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIiksYy5kaXNhYmxlZD1hLmdyZXAoYy5kaXNhYmxlZCxmdW5jdGlvbihhLGMpe3JldHVybiBhIT1ifSksdGhpcy5fdHJpZ2dlcigiZW5hYmxlIixudWxsLHRoaXMuX3VpKHRoaXMuYW5jaG9yc1tiXSx0aGlzLnBhbmVsc1tiXSkpLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oYSl7YT10aGlzLl9nZXRJbmRleChhKTt2YXIgYj10aGlzLGM9dGhpcy5vcHRpb25zO3JldHVybiBhIT1jLnNlbGVjdGVkJiYodGhpcy5saXMuZXEoYSkuYWRkQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIiksYy5kaXNhYmxlZC5wdXNoKGEpLGMuZGlzYWJsZWQuc29ydCgpLHRoaXMuX3RyaWdnZXIoImRpc2FibGUiLG51bGwsdGhpcy5fdWkodGhpcy5hbmNob3JzW2FdLHRoaXMucGFuZWxzW2FdKSkpLHRoaXN9LHNlbGVjdDpmdW5jdGlvbihhKXthPXRoaXMuX2dldEluZGV4KGEpO2lmKGE9PS0xKWlmKHRoaXMub3B0aW9ucy5jb2xsYXBzaWJsZSYmdGhpcy5vcHRpb25zLnNlbGVjdGVkIT0tMSlhPXRoaXMub3B0aW9ucy5zZWxlY3RlZDtlbHNlIHJldHVybiB0aGlzO3JldHVybiB0aGlzLmFuY2hvcnMuZXEoYSkudHJpZ2dlcih0aGlzLm9wdGlvbnMuZXZlbnQrIi50YWJzIiksdGhpc30sbG9hZDpmdW5jdGlvbihiKXtiPXRoaXMuX2dldEluZGV4KGIpO3ZhciBjPXRoaXMsZD10aGlzLm9wdGlvbnMsZT10aGlzLmFuY2hvcnMuZXEoYilbMF0sZj1hLmRhdGEoZSwibG9hZC50YWJzIik7dGhpcy5hYm9ydCgpO2lmKCFmfHx0aGlzLmVsZW1lbnQucXVldWUoInRhYnMiKS5sZW5ndGghPT0wJiZhLmRhdGEoZSwiY2FjaGUudGFicyIpKXt0aGlzLmVsZW1lbnQuZGVxdWV1ZSgidGFicyIpO3JldHVybn10aGlzLmxpcy5lcShiKS5hZGRDbGFzcygidWktc3RhdGUtcHJvY2Vzc2luZyIpO2lmKGQuc3Bpbm5lcil7dmFyIGc9YSgic3BhbiIsZSk7Zy5kYXRhKCJsYWJlbC50YWJzIixnLmh0bWwoKSkuaHRtbChkLnNwaW5uZXIpfXJldHVybiB0aGlzLnhocj1hLmFqYXgoYS5leHRlbmQoe30sZC5hamF4T3B0aW9ucyx7dXJsOmYsc3VjY2VzczpmdW5jdGlvbihmLGcpe2MuZWxlbWVudC5maW5kKGMuX3Nhbml0aXplU2VsZWN0b3IoZS5oYXNoKSkuaHRtbChmKSxjLl9jbGVhbnVwKCksZC5jYWNoZSYmYS5kYXRhKGUsImNhY2hlLnRhYnMiLCEwKSxjLl90cmlnZ2VyKCJsb2FkIixudWxsLGMuX3VpKGMuYW5jaG9yc1tiXSxjLnBhbmVsc1tiXSkpO3RyeXtkLmFqYXhPcHRpb25zLnN1Y2Nlc3MoZixnKX1jYXRjaChoKXt9fSxlcnJvcjpmdW5jdGlvbihhLGYsZyl7Yy5fY2xlYW51cCgpLGMuX3RyaWdnZXIoImxvYWQiLG51bGwsYy5fdWkoYy5hbmNob3JzW2JdLGMucGFuZWxzW2JdKSk7dHJ5e2QuYWpheE9wdGlvbnMuZXJyb3IoYSxmLGIsZSl9Y2F0Y2goZyl7fX19KSksYy5lbGVtZW50LmRlcXVldWUoInRhYnMiKSx0aGlzfSxhYm9ydDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnQucXVldWUoW10pLHRoaXMucGFuZWxzLnN0b3AoITEsITApLHRoaXMuZWxlbWVudC5xdWV1ZSgidGFicyIsdGhpcy5lbGVtZW50LnF1ZXVlKCJ0YWJzIikuc3BsaWNlKC0yLDIpKSx0aGlzLnhociYmKHRoaXMueGhyLmFib3J0KCksZGVsZXRlIHRoaXMueGhyKSx0aGlzLl9jbGVhbnVwKCksdGhpc30sdXJsOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYW5jaG9ycy5lcShhKS5yZW1vdmVEYXRhKCJjYWNoZS50YWJzIikuZGF0YSgibG9hZC50YWJzIixiKSx0aGlzfSxsZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hbmNob3JzLmxlbmd0aH19KSxhLmV4dGVuZChhLnVpLnRhYnMse3ZlcnNpb246IjEuOC4yNCJ9KSxhLmV4dGVuZChhLnVpLnRhYnMucHJvdG90eXBlLHtyb3RhdGlvbjpudWxsLHJvdGF0ZTpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMsZD10aGlzLm9wdGlvbnMsZT1jLl9yb3RhdGV8fChjLl9yb3RhdGU9ZnVuY3Rpb24oYil7Y2xlYXJUaW1lb3V0KGMucm90YXRpb24pLGMucm90YXRpb249c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPWQuc2VsZWN0ZWQ7Yy5zZWxlY3QoKythPGMuYW5jaG9ycy5sZW5ndGg/YTowKX0sYSksYiYmYi5zdG9wUHJvcGFnYXRpb24oKX0pLGY9Yy5fdW5yb3RhdGV8fChjLl91bnJvdGF0ZT1iP2Z1bmN0aW9uKGEpe2UoKX06ZnVuY3Rpb24oYSl7YS5jbGllbnRYJiZjLnJvdGF0ZShudWxsKX0pO3JldHVybiBhPyh0aGlzLmVsZW1lbnQuYmluZCgidGFic3Nob3ciLGUpLHRoaXMuYW5jaG9ycy5iaW5kKGQuZXZlbnQrIi50YWJzIixmKSxlKCkpOihjbGVhclRpbWVvdXQoYy5yb3RhdGlvbiksdGhpcy5lbGVtZW50LnVuYmluZCgidGFic3Nob3ciLGUpLHRoaXMuYW5jaG9ycy51bmJpbmQoZC5ldmVudCsiLnRhYnMiLGYpLGRlbGV0ZSB0aGlzLl9yb3RhdGUsZGVsZXRlIHRoaXMuX3Vucm90YXRlKSx0aGlzfX0pfShqUXVlcnkpOwoK";
b64_sl_js['script_sl_easing_js'] = "LyoKICogalF1ZXJ5IEVhc2luZyB2MS4zIC0gaHR0cDovL2dzZ2QuY28udWsvc2FuZGJveC9qcXVlcnkvZWFzaW5nLwogKgogKiBVc2VzIHRoZSBidWlsdCBpbiBlYXNpbmcgY2FwYWJpbGl0aWVzIGFkZGVkIEluIGpRdWVyeSAxLjEKICogdG8gb2ZmZXIgbXVsdGlwbGUgZWFzaW5nIG9wdGlvbnMKICoKICogVEVSTVMgT0YgVVNFIC0galF1ZXJ5IEVhc2luZwogKiAKICogT3BlbiBzb3VyY2UgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLiAKICogCiAqIENvcHlyaWdodCDCqSAyMDA4IEdlb3JnZSBNY0dpbmxleSBTbWl0aAogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiAKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCiAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKICogCiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIAogKiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IAogKiBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAKICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKiAKICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgYXV0aG9yIG5vciB0aGUgbmFtZXMgb2YgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UgCiAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqIAogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSAKICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQogKiAgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAogKiAgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCiAqICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgCiAqIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCiAqICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCAKICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKICoKKi8KCi8vIHQ6IGN1cnJlbnQgdGltZSwgYjogYmVnSW5uSW5nIHZhbHVlLCBjOiBjaGFuZ2UgSW4gdmFsdWUsIGQ6IGR1cmF0aW9uCmpRdWVyeS5lYXNpbmdbJ2pzd2luZyddID0galF1ZXJ5LmVhc2luZ1snc3dpbmcnXTsKCmpRdWVyeS5leHRlbmQoIGpRdWVyeS5lYXNpbmcsCnsKCWRlZjogJ2Vhc2VPdXRRdWFkJywKCXN3aW5nOiBmdW5jdGlvbiAoeCwgdCwgYiwgYywgZCkgewoJCS8vYWxlcnQoalF1ZXJ5LmVhc2luZy5kZWZhdWx0KTsKCQlyZXR1cm4galF1ZXJ5LmVhc2luZ1tqUXVlcnkuZWFzaW5nLmRlZl0oeCwgdCwgYiwgYywgZCk7Cgl9LAoJZWFzZUluUXVhZDogZnVuY3Rpb24gKHgsIHQsIGIsIGMsIGQpIHsKCQlyZXR1cm4gYyoodC89ZCkqdCArIGI7Cgl9LAoJZWFzZU91dFF1YWQ6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJcmV0dXJuIC1jICoodC89ZCkqKHQtMikgKyBiOwoJfSwKCWVhc2VJbk91dFF1YWQ6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJaWYgKCh0Lz1kLzIpIDwgMSkgcmV0dXJuIGMvMip0KnQgKyBiOwoJCXJldHVybiAtYy8yICogKCgtLXQpKih0LTIpIC0gMSkgKyBiOwoJfSwKCWVhc2VJbkN1YmljOiBmdW5jdGlvbiAoeCwgdCwgYiwgYywgZCkgewoJCXJldHVybiBjKih0Lz1kKSp0KnQgKyBiOwoJfSwKCWVhc2VPdXRDdWJpYzogZnVuY3Rpb24gKHgsIHQsIGIsIGMsIGQpIHsKCQlyZXR1cm4gYyooKHQ9dC9kLTEpKnQqdCArIDEpICsgYjsKCX0sCgllYXNlSW5PdXRDdWJpYzogZnVuY3Rpb24gKHgsIHQsIGIsIGMsIGQpIHsKCQlpZiAoKHQvPWQvMikgPCAxKSByZXR1cm4gYy8yKnQqdCp0ICsgYjsKCQlyZXR1cm4gYy8yKigodC09MikqdCp0ICsgMikgKyBiOwoJfSwKCWVhc2VJblF1YXJ0OiBmdW5jdGlvbiAoeCwgdCwgYiwgYywgZCkgewoJCXJldHVybiBjKih0Lz1kKSp0KnQqdCArIGI7Cgl9LAoJZWFzZU91dFF1YXJ0OiBmdW5jdGlvbiAoeCwgdCwgYiwgYywgZCkgewoJCXJldHVybiAtYyAqICgodD10L2QtMSkqdCp0KnQgLSAxKSArIGI7Cgl9LAoJZWFzZUluT3V0UXVhcnQ6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJaWYgKCh0Lz1kLzIpIDwgMSkgcmV0dXJuIGMvMip0KnQqdCp0ICsgYjsKCQlyZXR1cm4gLWMvMiAqICgodC09MikqdCp0KnQgLSAyKSArIGI7Cgl9LAoJZWFzZUluUXVpbnQ6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJcmV0dXJuIGMqKHQvPWQpKnQqdCp0KnQgKyBiOwoJfSwKCWVhc2VPdXRRdWludDogZnVuY3Rpb24gKHgsIHQsIGIsIGMsIGQpIHsKCQlyZXR1cm4gYyooKHQ9dC9kLTEpKnQqdCp0KnQgKyAxKSArIGI7Cgl9LAoJZWFzZUluT3V0UXVpbnQ6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJaWYgKCh0Lz1kLzIpIDwgMSkgcmV0dXJuIGMvMip0KnQqdCp0KnQgKyBiOwoJCXJldHVybiBjLzIqKCh0LT0yKSp0KnQqdCp0ICsgMikgKyBiOwoJfSwKCWVhc2VJblNpbmU6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJcmV0dXJuIC1jICogTWF0aC5jb3ModC9kICogKE1hdGguUEkvMikpICsgYyArIGI7Cgl9LAoJZWFzZU91dFNpbmU6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJcmV0dXJuIGMgKiBNYXRoLnNpbih0L2QgKiAoTWF0aC5QSS8yKSkgKyBiOwoJfSwKCWVhc2VJbk91dFNpbmU6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJcmV0dXJuIC1jLzIgKiAoTWF0aC5jb3MoTWF0aC5QSSp0L2QpIC0gMSkgKyBiOwoJfSwKCWVhc2VJbkV4cG86IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJcmV0dXJuICh0PT0wKSA/IGIgOiBjICogTWF0aC5wb3coMiwgMTAgKiAodC9kIC0gMSkpICsgYjsKCX0sCgllYXNlT3V0RXhwbzogZnVuY3Rpb24gKHgsIHQsIGIsIGMsIGQpIHsKCQlyZXR1cm4gKHQ9PWQpID8gYitjIDogYyAqICgtTWF0aC5wb3coMiwgLTEwICogdC9kKSArIDEpICsgYjsKCX0sCgllYXNlSW5PdXRFeHBvOiBmdW5jdGlvbiAoeCwgdCwgYiwgYywgZCkgewoJCWlmICh0PT0wKSByZXR1cm4gYjsKCQlpZiAodD09ZCkgcmV0dXJuIGIrYzsKCQlpZiAoKHQvPWQvMikgPCAxKSByZXR1cm4gYy8yICogTWF0aC5wb3coMiwgMTAgKiAodCAtIDEpKSArIGI7CgkJcmV0dXJuIGMvMiAqICgtTWF0aC5wb3coMiwgLTEwICogLS10KSArIDIpICsgYjsKCX0sCgllYXNlSW5DaXJjOiBmdW5jdGlvbiAoeCwgdCwgYiwgYywgZCkgewoJCXJldHVybiAtYyAqIChNYXRoLnNxcnQoMSAtICh0Lz1kKSp0KSAtIDEpICsgYjsKCX0sCgllYXNlT3V0Q2lyYzogZnVuY3Rpb24gKHgsIHQsIGIsIGMsIGQpIHsKCQlyZXR1cm4gYyAqIE1hdGguc3FydCgxIC0gKHQ9dC9kLTEpKnQpICsgYjsKCX0sCgllYXNlSW5PdXRDaXJjOiBmdW5jdGlvbiAoeCwgdCwgYiwgYywgZCkgewoJCWlmICgodC89ZC8yKSA8IDEpIHJldHVybiAtYy8yICogKE1hdGguc3FydCgxIC0gdCp0KSAtIDEpICsgYjsKCQlyZXR1cm4gYy8yICogKE1hdGguc3FydCgxIC0gKHQtPTIpKnQpICsgMSkgKyBiOwoJfSwKCWVhc2VJbkVsYXN0aWM6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJdmFyIHM9MS43MDE1ODt2YXIgcD0wO3ZhciBhPWM7CgkJaWYgKHQ9PTApIHJldHVybiBiOyAgaWYgKCh0Lz1kKT09MSkgcmV0dXJuIGIrYzsgIGlmICghcCkgcD1kKi4zOwoJCWlmIChhIDwgTWF0aC5hYnMoYykpIHsgYT1jOyB2YXIgcz1wLzQ7IH0KCQllbHNlIHZhciBzID0gcC8oMipNYXRoLlBJKSAqIE1hdGguYXNpbiAoYy9hKTsKCQlyZXR1cm4gLShhKk1hdGgucG93KDIsMTAqKHQtPTEpKSAqIE1hdGguc2luKCAodCpkLXMpKigyKk1hdGguUEkpL3AgKSkgKyBiOwoJfSwKCWVhc2VPdXRFbGFzdGljOiBmdW5jdGlvbiAoeCwgdCwgYiwgYywgZCkgewoJCXZhciBzPTEuNzAxNTg7dmFyIHA9MDt2YXIgYT1jOwoJCWlmICh0PT0wKSByZXR1cm4gYjsgIGlmICgodC89ZCk9PTEpIHJldHVybiBiK2M7ICBpZiAoIXApIHA9ZCouMzsKCQlpZiAoYSA8IE1hdGguYWJzKGMpKSB7IGE9YzsgdmFyIHM9cC80OyB9CgkJZWxzZSB2YXIgcyA9IHAvKDIqTWF0aC5QSSkgKiBNYXRoLmFzaW4gKGMvYSk7CgkJcmV0dXJuIGEqTWF0aC5wb3coMiwtMTAqdCkgKiBNYXRoLnNpbiggKHQqZC1zKSooMipNYXRoLlBJKS9wICkgKyBjICsgYjsKCX0sCgllYXNlSW5PdXRFbGFzdGljOiBmdW5jdGlvbiAoeCwgdCwgYiwgYywgZCkgewoJCXZhciBzPTEuNzAxNTg7dmFyIHA9MDt2YXIgYT1jOwoJCWlmICh0PT0wKSByZXR1cm4gYjsgIGlmICgodC89ZC8yKT09MikgcmV0dXJuIGIrYzsgIGlmICghcCkgcD1kKiguMyoxLjUpOwoJCWlmIChhIDwgTWF0aC5hYnMoYykpIHsgYT1jOyB2YXIgcz1wLzQ7IH0KCQllbHNlIHZhciBzID0gcC8oMipNYXRoLlBJKSAqIE1hdGguYXNpbiAoYy9hKTsKCQlpZiAodCA8IDEpIHJldHVybiAtLjUqKGEqTWF0aC5wb3coMiwxMCoodC09MSkpICogTWF0aC5zaW4oICh0KmQtcykqKDIqTWF0aC5QSSkvcCApKSArIGI7CgkJcmV0dXJuIGEqTWF0aC5wb3coMiwtMTAqKHQtPTEpKSAqIE1hdGguc2luKCAodCpkLXMpKigyKk1hdGguUEkpL3AgKSouNSArIGMgKyBiOwoJfSwKCWVhc2VJbkJhY2s6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkLCBzKSB7CgkJaWYgKHMgPT0gdW5kZWZpbmVkKSBzID0gMS43MDE1ODsKCQlyZXR1cm4gYyoodC89ZCkqdCooKHMrMSkqdCAtIHMpICsgYjsKCX0sCgllYXNlT3V0QmFjazogZnVuY3Rpb24gKHgsIHQsIGIsIGMsIGQsIHMpIHsKCQlpZiAocyA9PSB1bmRlZmluZWQpIHMgPSAxLjcwMTU4OwoJCXJldHVybiBjKigodD10L2QtMSkqdCooKHMrMSkqdCArIHMpICsgMSkgKyBiOwoJfSwKCWVhc2VJbk91dEJhY2s6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkLCBzKSB7CgkJaWYgKHMgPT0gdW5kZWZpbmVkKSBzID0gMS43MDE1ODsgCgkJaWYgKCh0Lz1kLzIpIDwgMSkgcmV0dXJuIGMvMioodCp0KigoKHMqPSgxLjUyNSkpKzEpKnQgLSBzKSkgKyBiOwoJCXJldHVybiBjLzIqKCh0LT0yKSp0KigoKHMqPSgxLjUyNSkpKzEpKnQgKyBzKSArIDIpICsgYjsKCX0sCgllYXNlSW5Cb3VuY2U6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJcmV0dXJuIGMgLSBqUXVlcnkuZWFzaW5nLmVhc2VPdXRCb3VuY2UgKHgsIGQtdCwgMCwgYywgZCkgKyBiOwoJfSwKCWVhc2VPdXRCb3VuY2U6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJaWYgKCh0Lz1kKSA8ICgxLzIuNzUpKSB7CgkJCXJldHVybiBjKig3LjU2MjUqdCp0KSArIGI7CgkJfSBlbHNlIGlmICh0IDwgKDIvMi43NSkpIHsKCQkJcmV0dXJuIGMqKDcuNTYyNSoodC09KDEuNS8yLjc1KSkqdCArIC43NSkgKyBiOwoJCX0gZWxzZSBpZiAodCA8ICgyLjUvMi43NSkpIHsKCQkJcmV0dXJuIGMqKDcuNTYyNSoodC09KDIuMjUvMi43NSkpKnQgKyAuOTM3NSkgKyBiOwoJCX0gZWxzZSB7CgkJCXJldHVybiBjKig3LjU2MjUqKHQtPSgyLjYyNS8yLjc1KSkqdCArIC45ODQzNzUpICsgYjsKCQl9Cgl9LAoJZWFzZUluT3V0Qm91bmNlOiBmdW5jdGlvbiAoeCwgdCwgYiwgYywgZCkgewoJCWlmICh0IDwgZC8yKSByZXR1cm4galF1ZXJ5LmVhc2luZy5lYXNlSW5Cb3VuY2UgKHgsIHQqMiwgMCwgYywgZCkgKiAuNSArIGI7CgkJcmV0dXJuIGpRdWVyeS5lYXNpbmcuZWFzZU91dEJvdW5jZSAoeCwgdCoyLWQsIDAsIGMsIGQpICogLjUgKyBjKi41ICsgYjsKCX0KfSk7CgovKgogKgogKiBURVJNUyBPRiBVU0UgLSBFQVNJTkcgRVFVQVRJT05TCiAqIAogKiBPcGVuIHNvdXJjZSB1bmRlciB0aGUgQlNEIExpY2Vuc2UuIAogKiAKICogQ29weXJpZ2h0IMKpIDIwMDEgUm9iZXJ0IFBlbm5lcgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiAKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCiAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKICogCiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIAogKiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IAogKiBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAKICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKiAKICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgYXV0aG9yIG5vciB0aGUgbmFtZXMgb2YgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UgCiAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqIAogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSAKICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQogKiAgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAogKiAgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCiAqICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgCiAqIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCiAqICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCAKICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKICoKICov";
b64_sl_js['script_jquery_mousewheel_js'] = "LyogQ29weXJpZ2h0IChjKSAyMDA5IEJyYW5kb24gQWFyb24gKGh0dHA6Ly9icmFuZG9uYWFyb24ubmV0KQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwKQogKiBhbmQgR1BMIChodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLnBocCkgbGljZW5zZXMuCiAqIFRoYW5rcyB0bzogaHR0cDovL2Fkb21hcy5vcmcvamF2YXNjcmlwdC1tb3VzZS13aGVlbC8gZm9yIHNvbWUgcG9pbnRlcnMuCiAqIFRoYW5rcyB0bzogTWF0aGlhcyBCYW5rKGh0dHA6Ly93d3cubWF0aGlhcy1iYW5rLmRlKSBmb3IgYSBzY29wZSBidWcgZml4LgogKgogKiBWZXJzaW9uOiAzLjAuMgogKiAKICogUmVxdWlyZXM6IDEuMi4yKwogKi8KKGZ1bmN0aW9uKGMpe3ZhciBhPVsiRE9NTW91c2VTY3JvbGwiLCJtb3VzZXdoZWVsIl07Yy5ldmVudC5zcGVjaWFsLm1vdXNld2hlZWw9e3NldHVwOmZ1bmN0aW9uKCl7aWYodGhpcy5hZGRFdmVudExpc3RlbmVyKXtmb3IodmFyIGQ9YS5sZW5ndGg7ZDspe3RoaXMuYWRkRXZlbnRMaXN0ZW5lcihhWy0tZF0sYixmYWxzZSl9fWVsc2V7dGhpcy5vbm1vdXNld2hlZWw9Yn19LHRlYXJkb3duOmZ1bmN0aW9uKCl7aWYodGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKXtmb3IodmFyIGQ9YS5sZW5ndGg7ZDspe3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihhWy0tZF0sYixmYWxzZSl9fWVsc2V7dGhpcy5vbm1vdXNld2hlZWw9bnVsbH19fTtjLmZuLmV4dGVuZCh7bW91c2V3aGVlbDpmdW5jdGlvbihkKXtyZXR1cm4gZD90aGlzLmJpbmQoIm1vdXNld2hlZWwiLGQpOnRoaXMudHJpZ2dlcigibW91c2V3aGVlbCIpfSx1bm1vdXNld2hlZWw6ZnVuY3Rpb24oZCl7cmV0dXJuIHRoaXMudW5iaW5kKCJtb3VzZXdoZWVsIixkKX19KTtmdW5jdGlvbiBiKGYpe3ZhciBkPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLGc9MCxlPXRydWU7Zj1jLmV2ZW50LmZpeChmfHx3aW5kb3cuZXZlbnQpO2YudHlwZT0ibW91c2V3aGVlbCI7aWYoZi53aGVlbERlbHRhKXtnPWYud2hlZWxEZWx0YS8xMjB9aWYoZi5kZXRhaWwpe2c9LWYuZGV0YWlsLzN9ZC51bnNoaWZ0KGYsZyk7cmV0dXJuIGMuZXZlbnQuaGFuZGxlLmFwcGx5KHRoaXMsZCl9fSkoalF1ZXJ5KTs=";
		</script>




HTML_SL;
	return( $html_sl );
	} 
function html_tl_old() {
	$HTML_TL=<<<HTML_TL
	<h1>index_av</h1>

	<div id="message"></div>
	<div id="drop">
<!--		<input type="file" accept="video/*"/> <strong><img src="kiw.png" border=0 ></strong> -->
<!--		<input type="file" accept="video/*"/> <strong><img src="kow.png" border=0 ></strong> -->
		<input type="file" accept="video/*"/> <strong><img src="./imgs/btn/koeye.png" border=0 ></strong> 
		</div>


<script>


//base 64 encode
function encode64(input) {
	var output = "", i = 0, l = input.length,
	key = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", 
	chr1, chr2, chr3, enc1, enc2, enc3, enc4;
	while (i < l) {
		chr1 = input.charCodeAt(i++);
		chr2 = input.charCodeAt(i++);
		chr3 = input.charCodeAt(i++);
		enc1 = chr1 >> 2;
		enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
		enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
		enc4 = chr3 & 63;
		if (isNaN(chr2)) enc3 = enc4 = 64;
		else if (isNaN(chr3)) enc4 = 64;
		output = output + key.charAt(enc1) + key.charAt(enc2) + key.charAt(enc3) + key.charAt(enc4);
	}
	return output;
}



}(window));
</script>
	<section name="section_av"><h1>tl</h1></section>

	<script>
		var childNumber = 0;
		var tl_num=0;
		function addChild() {
			var parent = document.getElementById('i-want-more-timelines');
			var newChild = '';	
			newChild += '<p>timeline-' + tl_num + '</p>';
//			newChild += '<div id='my-timeline">my-timeline</div>\n';
//			newChild += '<div id='timelines-'+tl_num+'">timeliees</div>\n';
			parent.insertAdjacentHTML('beforeend', newChild);


//			parent.insertAdjacentHTML('beforeend', tl_dta[0]);
//			parent.insertAdjacentHTML('beforeend', tl_psv.join('\n'));
//			parent.insertAdjacentHTML('beforeend', new_tl.join(''));
			childNumber++;
			tl_num++;
			createStoryJS({
					type:		'timeline',
					width:		'800',
					height:		'600',
//					source:		tl_dta,
					source:		tl_data[tl_num],
					embed_id:	'my-timeline',
					debug:		true
				});



			}
		</script>

<style>
body { text-align: center; background-color: "black"; color:"white"; }
button {
//	visibility: hidden;
//  background: rgba(7, 99, 53, .1);
	background: transparent;
  border: 3px solid rgba(7, 99, 53, 1);
  border-radius: 5px;
  color: rgba(7, 99, 53, 1);
  cursor: pointer;
  line-height: 40px;
  font-size: 30px;
  outline: none;
  padding: 0 20px;
  transition: all .3s;
}
	button:hover {
//		background: rgba(7, 99, 53, 1);
		background: black;
		color: rgba(255,255,255,1);
		}
p {
  font-size: 20px;
  font-weight: bold;
}
	</style>

<body>


	<button type="button" onclick="addChild()">Append Child</button>
	<div id="i-want-more-timelines">
		<p>my-timelines_2_be</p>
		<hr color=white>	
<!--
		<div id="my-timeline"><h1>my-timeline</h1></div> 
		<div id="my-timeline-0"><h1>my-timeline-0</h1></div> 
		<div id="my-timeline-1"><h1>my-timeline-1</h1></div> 
		<div id="my-timeline-2"><h1>my-timeline-2</h1></div> 
	-->
		</div>

<button type="button" onclick="div_update()">div_result</button>
<button type="button" onclick="div_test()">div_test</button>
<button type="button" onclick="div_update_av()">div_update_av</button>
<button type="button" onclick="div_update_bb()">div_update_bb</button>
<button type="button" onclick="div_update_dd()">div_update_dd</button>
<button type="button" onclick="div_update_sl()">div_update_sl</button>
<button type="button" onclick="div_update_tl()">div_update_tl</button>
<button type="button" onclick="div_update_zm()">div_update_zm</button>

<hr color=red><hr color=white><hr color=blue>
<div id="div_tl"><h1>div id=div_tl</h1> </div>
<div id="div_test"><h1>div id=div_test</h1> </div>
<hr color=blue><hr color=white><hr color=red>


<div id="div_av"><h1>div id=div_av</h1> </div>
<div id="div_bb" ><h1>div id=div_bb</h1> </div>
<div id="div_dd"><h1>div id=div_dd</h1> </div>
<div id="div_sl"><h1>div id=div_sl</h1> </div>
<div id="div_zm"><h1>div id=div_zm</h1> </div>
<div id="Result"><h1>div id=result</h1> </div>

<script>
	var data="";
	function div_update_result() {
	data += "<h1><b>data_av</b><h1>";
	data += "<img src='./imgs/btn/p34.png'><br>";
	document.getElementById('Result').innerHTML += data;
	}

	var data_av="";
	function div_test() {
		var j = 0;

		script_avlist_load();
//		document.write( "bugs div_test avlist_len="+avlist.length );
		alert( "bugs292_div_new avlist_len=" + avlist.length );
		script_avlist_show();
		for( j=0; j < avlist.length; j++){
			data_av += "<h1><b>data_av-"+i+"</b><h1>";
			data_av += "<a href='?q="+i+"' ><img src='./imgs/btn/p34.png'></a><br>";
//			data_av += "<a href=?q="+i+"<img src='./imgs/btn/p34.png'></a><br>";
			}
		document.getElementById('div_av').innerHTML += data_av;
		document.getElementById('div_av').innerHTML = "";
		}
		
	var data_av = "";
	function div_update_av1() {
			alert( "bugs_div_update_av1 len="+avlist.length );
			script_avlist_load();
			alert( "bugs_script_avlist len="+avlist.length );
			script_avlist_show();
			document.write( "bugs_div_update_av avlist_len="+ avlist.length );
			data_av += "<h1><b>data_bb</b><h1>";
			data_av += "<img src='./imgs/btn/p12.png'><br>";
		document.getElementById('div_bb').innerHTML += data_bb;
		}
		
		
	var data_av = "";
	function div_update_av() {
			alert( "bugs_317:  div_update_av beforeload" );
			data_av += script_avlist_load();
			alert( "bugs_318:  div_update_av afterload" );
			data_av += "<h1><b>data_av jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj</b><h1>";
			data_av += "<img src='./imgs/btn/p13.png'><br>";
		document.getElementById('div_av').innerHTML += data_av;
		}

		
	var data_bb = "";
	function div_update_bb() {
			data_bb += "<h1><b>data_bb</b><h1>";
			data_bb += "<img src='./imgs/btn/p12.png'><br>";
		document.getElementById('div_bb').innerHTML += data_bb;
		}
		
	var data_dd = "";
	data_dd += "<div id='div_dd1' class='drg'>";
	function div_update_dd() {
			data_dd += "<h1><b>data_dd</b><h1>";
			data_dd += "<img src='./imgs/btn/kw.png'><br>";
			data_dd += "	</div>";
			document.getElementById('div_dd').innerHTML += data_dd;
			}
		
	var data_sl = "";
	function div_update_sl() {
			data_sl += "<h1><b>data_sl</b><h1>";
			for( j=0; j<5; j++ ) {
				data_sl += "<a href='?q="+i+"' ><img src='./imgs/btn/kb.png'></a><br>";
				}
		document.getElementById('div_sl').innerHTML += data_sl;
		}
		
	var data_tl = new Array();
	function div_update_tl() {
//			var tl_psv=tl_psv_load();
//			alert( "BUGS244 div_update_tl tl_psv0="+tl_psv[0] );


			j=0; jlen=tl_data.length;
			tl_dta = tl_data[j];
			data_tl[0] = ''
			data_tl[0] += "<h1><b>data_tl len="+jlen+"</b><h1>";
			data_tl[0] += "<img src='./imgs/btn/koeyeb.png'><br>";
			data_tl[1] = "<div><h1>bugs_248</h1>alert('bugs_248');</div>";
//			tl_dta=data_tl[0];
			tl_dta=new_tl.join('\n');


		document.getElementById('div_tl').innerHTML += tl_dta;
//		document.getElementById('div_tl').innerHTML += new_tl[1];
//		document.getElementById('div_tl').innerHTML += data_tl[0];
//		document.getElementById('div_tl').innerHTML += data_tl[1];
//		document.getElementById('div_tl').innerHTML += tl_data[0];
//		document.getElementById('div_tl').innerHTML += tl_dta;
		}
		
	function div_update_zm() {
			var data_zm = "";
			data_zm += "<h1><b>data_zm</b><h1>";
			data_zm += "<img src='./imgs/btn/koeyew.png'>";
		document.getElementById('div_zm').innerHTML += data_zm;
		}
		
		</script>


		<script type="text/javascript" src="./tl/lib/js/storyjs-embed.js"></script> 
		<script type="text/javascript" src="./tl/lib/js/jquery-min.js"></script>
	
<script id="script_tl_jquery_172_min_js" url="data:text/plain;base64,LyohIGpRdWVyeSB2MS43LjEganF1ZXJ5LmNvbSB8IGpxdWVyeS5vcmcvbGljZW5zZSAqLwooZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjeShhKXtyZXR1cm4gZi5pc1dpbmRvdyhhKT9hOmEubm9kZVR5cGU9PT05P2EuZGVmYXVsdFZpZXd8fGEucGFyZW50V2luZG93OiExfWZ1bmN0aW9uIGN2KGEpe2lmKCFja1thXSl7dmFyIGI9Yy5ib2R5LGQ9ZigiPCIrYSsiPiIpLmFwcGVuZFRvKGIpLGU9ZC5jc3MoImRpc3BsYXkiKTtkLnJlbW92ZSgpO2lmKGU9PT0ibm9uZSJ8fGU9PT0iIil7Y2x8fChjbD1jLmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGNsLmZyYW1lQm9yZGVyPWNsLndpZHRoPWNsLmhlaWdodD0wKSxiLmFwcGVuZENoaWxkKGNsKTtpZighY218fCFjbC5jcmVhdGVFbGVtZW50KWNtPShjbC5jb250ZW50V2luZG93fHxjbC5jb250ZW50RG9jdW1lbnQpLmRvY3VtZW50LGNtLndyaXRlKChjLmNvbXBhdE1vZGU9PT0iQ1NTMUNvbXBhdCI/IjwhZG9jdHlwZSBodG1sPiI6IiIpKyI8aHRtbD48Ym9keT4iKSxjbS5jbG9zZSgpO2Q9Y20uY3JlYXRlRWxlbWVudChhKSxjbS5ib2R5LmFwcGVuZENoaWxkKGQpLGU9Zi5jc3MoZCwiZGlzcGxheSIpLGIucmVtb3ZlQ2hpbGQoY2wpfWNrW2FdPWV9cmV0dXJuIGNrW2FdfWZ1bmN0aW9uIGN1KGEsYil7dmFyIGM9e307Zi5lYWNoKGNxLmNvbmNhdC5hcHBseShbXSxjcS5zbGljZSgwLGIpKSxmdW5jdGlvbigpe2NbdGhpc109YX0pO3JldHVybiBjfWZ1bmN0aW9uIGN0KCl7Y3I9Yn1mdW5jdGlvbiBjcygpe3NldFRpbWVvdXQoY3QsMCk7cmV0dXJuIGNyPWYubm93KCl9ZnVuY3Rpb24gY2ooKXt0cnl7cmV0dXJuIG5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2goYil7fX1mdW5jdGlvbiBjaSgpe3RyeXtyZXR1cm4gbmV3IGEuWE1MSHR0cFJlcXVlc3R9Y2F0Y2goYil7fX1mdW5jdGlvbiBjYyhhLGMpe2EuZGF0YUZpbHRlciYmKGM9YS5kYXRhRmlsdGVyKGMsYS5kYXRhVHlwZSkpO3ZhciBkPWEuZGF0YVR5cGVzLGU9e30sZyxoLGk9ZC5sZW5ndGgsaixrPWRbMF0sbCxtLG4sbyxwO2ZvcihnPTE7ZzxpO2crKyl7aWYoZz09PTEpZm9yKGggaW4gYS5jb252ZXJ0ZXJzKXR5cGVvZiBoPT0ic3RyaW5nIiYmKGVbaC50b0xvd2VyQ2FzZSgpXT1hLmNvbnZlcnRlcnNbaF0pO2w9ayxrPWRbZ107aWYoaz09PSIqIilrPWw7ZWxzZSBpZihsIT09IioiJiZsIT09ayl7bT1sKyIgIitrLG49ZVttXXx8ZVsiKiAiK2tdO2lmKCFuKXtwPWI7Zm9yKG8gaW4gZSl7aj1vLnNwbGl0KCIgIik7aWYoalswXT09PWx8fGpbMF09PT0iKiIpe3A9ZVtqWzFdKyIgIitrXTtpZihwKXtvPWVbb10sbz09PSEwP249cDpwPT09ITAmJihuPW8pO2JyZWFrfX19fSFuJiYhcCYmZi5lcnJvcigiTm8gY29udmVyc2lvbiBmcm9tICIrbS5yZXBsYWNlKCIgIiwiIHRvICIpKSxuIT09ITAmJihjPW4/bihjKTpwKG8oYykpKX19cmV0dXJuIGN9ZnVuY3Rpb24gY2IoYSxjLGQpe3ZhciBlPWEuY29udGVudHMsZj1hLmRhdGFUeXBlcyxnPWEucmVzcG9uc2VGaWVsZHMsaCxpLGosaztmb3IoaSBpbiBnKWkgaW4gZCYmKGNbZ1tpXV09ZFtpXSk7d2hpbGUoZlswXT09PSIqIilmLnNoaWZ0KCksaD09PWImJihoPWEubWltZVR5cGV8fGMuZ2V0UmVzcG9uc2VIZWFkZXIoImNvbnRlbnQtdHlwZSIpKTtpZihoKWZvcihpIGluIGUpaWYoZVtpXSYmZVtpXS50ZXN0KGgpKXtmLnVuc2hpZnQoaSk7YnJlYWt9aWYoZlswXWluIGQpaj1mWzBdO2Vsc2V7Zm9yKGkgaW4gZCl7aWYoIWZbMF18fGEuY29udmVydGVyc1tpKyIgIitmWzBdXSl7aj1pO2JyZWFrfWt8fChrPWkpfWo9anx8a31pZihqKXtqIT09ZlswXSYmZi51bnNoaWZ0KGopO3JldHVybiBkW2pdfX1mdW5jdGlvbiBjYShhLGIsYyxkKXtpZihmLmlzQXJyYXkoYikpZi5lYWNoKGIsZnVuY3Rpb24oYixlKXtjfHxiRS50ZXN0KGEpP2QoYSxlKTpjYShhKyJbIisodHlwZW9mIGU9PSJvYmplY3QifHxmLmlzQXJyYXkoZSk/YjoiIikrIl0iLGUsYyxkKX0pO2Vsc2UgaWYoIWMmJmIhPW51bGwmJnR5cGVvZiBiPT0ib2JqZWN0Iilmb3IodmFyIGUgaW4gYiljYShhKyJbIitlKyJdIixiW2VdLGMsZCk7ZWxzZSBkKGEsYil9ZnVuY3Rpb24gYl8oYSxjKXt2YXIgZCxlLGc9Zi5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihkIGluIGMpY1tkXSE9PWImJigoZ1tkXT9hOmV8fChlPXt9KSlbZF09Y1tkXSk7ZSYmZi5leHRlbmQoITAsYSxlKX1mdW5jdGlvbiBiJChhLGMsZCxlLGYsZyl7Zj1mfHxjLmRhdGFUeXBlc1swXSxnPWd8fHt9LGdbZl09ITA7dmFyIGg9YVtmXSxpPTAsaj1oP2gubGVuZ3RoOjAsaz1hPT09YlQsbDtmb3IoO2k8aiYmKGt8fCFsKTtpKyspbD1oW2ldKGMsZCxlKSx0eXBlb2YgbD09InN0cmluZyImJigha3x8Z1tsXT9sPWI6KGMuZGF0YVR5cGVzLnVuc2hpZnQobCksbD1iJChhLGMsZCxlLGwsZykpKTsoa3x8IWwpJiYhZ1siKiJdJiYobD1iJChhLGMsZCxlLCIqIixnKSk7cmV0dXJuIGx9ZnVuY3Rpb24gYlooYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyl7dHlwZW9mIGIhPSJzdHJpbmciJiYoYz1iLGI9IioiKTtpZihmLmlzRnVuY3Rpb24oYykpe3ZhciBkPWIudG9Mb3dlckNhc2UoKS5zcGxpdChiUCksZT0wLGc9ZC5sZW5ndGgsaCxpLGo7Zm9yKDtlPGc7ZSsrKWg9ZFtlXSxqPS9eXCsvLnRlc3QoaCksaiYmKGg9aC5zdWJzdHIoMSl8fCIqIiksaT1hW2hdPWFbaF18fFtdLGlbaj8idW5zaGlmdCI6InB1c2giXShjKX19fWZ1bmN0aW9uIGJDKGEsYixjKXt2YXIgZD1iPT09IndpZHRoIj9hLm9mZnNldFdpZHRoOmEub2Zmc2V0SGVpZ2h0LGU9Yj09PSJ3aWR0aCI/Yng6YnksZz0wLGg9ZS5sZW5ndGg7aWYoZD4wKXtpZihjIT09ImJvcmRlciIpZm9yKDtnPGg7ZysrKWN8fChkLT1wYXJzZUZsb2F0KGYuY3NzKGEsInBhZGRpbmciK2VbZ10pKXx8MCksYz09PSJtYXJnaW4iP2QrPXBhcnNlRmxvYXQoZi5jc3MoYSxjK2VbZ10pKXx8MDpkLT1wYXJzZUZsb2F0KGYuY3NzKGEsImJvcmRlciIrZVtnXSsiV2lkdGgiKSl8fDA7cmV0dXJuIGQrInB4In1kPWJ6KGEsYixiKTtpZihkPDB8fGQ9PW51bGwpZD1hLnN0eWxlW2JdfHwwO2Q9cGFyc2VGbG9hdChkKXx8MDtpZihjKWZvcig7ZzxoO2crKylkKz1wYXJzZUZsb2F0KGYuY3NzKGEsInBhZGRpbmciK2VbZ10pKXx8MCxjIT09InBhZGRpbmciJiYoZCs9cGFyc2VGbG9hdChmLmNzcyhhLCJib3JkZXIiK2VbZ10rIldpZHRoIikpfHwwKSxjPT09Im1hcmdpbiImJihkKz1wYXJzZUZsb2F0KGYuY3NzKGEsYytlW2ddKSl8fDApO3JldHVybiBkKyJweCJ9ZnVuY3Rpb24gYnAoYSxiKXtiLnNyYz9mLmFqYXgoe3VybDpiLnNyYyxhc3luYzohMSxkYXRhVHlwZToic2NyaXB0In0pOmYuZ2xvYmFsRXZhbCgoYi50ZXh0fHxiLnRleHRDb250ZW50fHxiLmlubmVySFRNTHx8IiIpLnJlcGxhY2UoYmYsIi8qJDAqLyIpKSxiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKX1mdW5jdGlvbiBibyhhKXt2YXIgYj1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2JoLmFwcGVuZENoaWxkKGIpLGIuaW5uZXJIVE1MPWEub3V0ZXJIVE1MO3JldHVybiBiLmZpcnN0Q2hpbGR9ZnVuY3Rpb24gYm4oYSl7dmFyIGI9KGEubm9kZU5hbWV8fCIiKS50b0xvd2VyQ2FzZSgpO2I9PT0iaW5wdXQiP2JtKGEpOmIhPT0ic2NyaXB0IiYmdHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiJiZmLmdyZXAoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKSxibSl9ZnVuY3Rpb24gYm0oYSl7aWYoYS50eXBlPT09ImNoZWNrYm94Inx8YS50eXBlPT09InJhZGlvIilhLmRlZmF1bHRDaGVja2VkPWEuY2hlY2tlZH1mdW5jdGlvbiBibChhKXtyZXR1cm4gdHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTp0eXBlb2YgYS5xdWVyeVNlbGVjdG9yQWxsIT0idW5kZWZpbmVkIj9hLnF1ZXJ5U2VsZWN0b3JBbGwoIioiKTpbXX1mdW5jdGlvbiBiayhhLGIpe3ZhciBjO2lmKGIubm9kZVR5cGU9PT0xKXtiLmNsZWFyQXR0cmlidXRlcyYmYi5jbGVhckF0dHJpYnV0ZXMoKSxiLm1lcmdlQXR0cmlidXRlcyYmYi5tZXJnZUF0dHJpYnV0ZXMoYSksYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7aWYoYz09PSJvYmplY3QiKWIub3V0ZXJIVE1MPWEub3V0ZXJIVE1MO2Vsc2UgaWYoYyE9PSJpbnB1dCJ8fGEudHlwZSE9PSJjaGVja2JveCImJmEudHlwZSE9PSJyYWRpbyIpe2lmKGM9PT0ib3B0aW9uIiliLnNlbGVjdGVkPWEuZGVmYXVsdFNlbGVjdGVkO2Vsc2UgaWYoYz09PSJpbnB1dCJ8fGM9PT0idGV4dGFyZWEiKWIuZGVmYXVsdFZhbHVlPWEuZGVmYXVsdFZhbHVlfWVsc2UgYS5jaGVja2VkJiYoYi5kZWZhdWx0Q2hlY2tlZD1iLmNoZWNrZWQ9YS5jaGVja2VkKSxiLnZhbHVlIT09YS52YWx1ZSYmKGIudmFsdWU9YS52YWx1ZSk7Yi5yZW1vdmVBdHRyaWJ1dGUoZi5leHBhbmRvKX19ZnVuY3Rpb24gYmooYSxiKXtpZihiLm5vZGVUeXBlPT09MSYmISFmLmhhc0RhdGEoYSkpe3ZhciBjLGQsZSxnPWYuX2RhdGEoYSksaD1mLl9kYXRhKGIsZyksaT1nLmV2ZW50cztpZihpKXtkZWxldGUgaC5oYW5kbGUsaC5ldmVudHM9e307Zm9yKGMgaW4gaSlmb3IoZD0wLGU9aVtjXS5sZW5ndGg7ZDxlO2QrKylmLmV2ZW50LmFkZChiLGMrKGlbY11bZF0ubmFtZXNwYWNlPyIuIjoiIikraVtjXVtkXS5uYW1lc3BhY2UsaVtjXVtkXSxpW2NdW2RdLmRhdGEpfWguZGF0YSYmKGguZGF0YT1mLmV4dGVuZCh7fSxoLmRhdGEpKX19ZnVuY3Rpb24gYmkoYSxiKXtyZXR1cm4gZi5ub2RlTmFtZShhLCJ0YWJsZSIpP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF18fGEuYXBwZW5kQ2hpbGQoYS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRib2R5IikpOmF9ZnVuY3Rpb24gVShhKXt2YXIgYj1WLnNwbGl0KCJ8IiksYz1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihjLmNyZWF0ZUVsZW1lbnQpd2hpbGUoYi5sZW5ndGgpYy5jcmVhdGVFbGVtZW50KGIucG9wKCkpO3JldHVybiBjfWZ1bmN0aW9uIFQoYSxiLGMpe2I9Ynx8MDtpZihmLmlzRnVuY3Rpb24oYikpcmV0dXJuIGYuZ3JlcChhLGZ1bmN0aW9uKGEsZCl7dmFyIGU9ISFiLmNhbGwoYSxkLGEpO3JldHVybiBlPT09Y30pO2lmKGIubm9kZVR5cGUpcmV0dXJuIGYuZ3JlcChhLGZ1bmN0aW9uKGEsZCl7cmV0dXJuIGE9PT1iPT09Y30pO2lmKHR5cGVvZiBiPT0ic3RyaW5nIil7dmFyIGQ9Zi5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZVR5cGU9PT0xfSk7aWYoTy50ZXN0KGIpKXJldHVybiBmLmZpbHRlcihiLGQsIWMpO2I9Zi5maWx0ZXIoYixkKX1yZXR1cm4gZi5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4gZi5pbkFycmF5KGEsYik+PTA9PT1jfSl9ZnVuY3Rpb24gUyhhKXtyZXR1cm4hYXx8IWEucGFyZW50Tm9kZXx8YS5wYXJlbnROb2RlLm5vZGVUeXBlPT09MTF9ZnVuY3Rpb24gSygpe3JldHVybiEwfWZ1bmN0aW9uIEooKXtyZXR1cm4hMX1mdW5jdGlvbiBuKGEsYixjKXt2YXIgZD1iKyJkZWZlciIsZT1iKyJxdWV1ZSIsZz1iKyJtYXJrIixoPWYuX2RhdGEoYSxkKTtoJiYoYz09PSJxdWV1ZSJ8fCFmLl9kYXRhKGEsZSkpJiYoYz09PSJtYXJrInx8IWYuX2RhdGEoYSxnKSkmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXshZi5fZGF0YShhLGUpJiYhZi5fZGF0YShhLGcpJiYoZi5yZW1vdmVEYXRhKGEsZCwhMCksaC5maXJlKCkpfSwwKX1mdW5jdGlvbiBtKGEpe2Zvcih2YXIgYiBpbiBhKXtpZihiPT09ImRhdGEiJiZmLmlzRW1wdHlPYmplY3QoYVtiXSkpY29udGludWU7aWYoYiE9PSJ0b0pTT04iKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIGwoYSxjLGQpe2lmKGQ9PT1iJiZhLm5vZGVUeXBlPT09MSl7dmFyIGU9ImRhdGEtIitjLnJlcGxhY2UoaywiLSQxIikudG9Mb3dlckNhc2UoKTtkPWEuZ2V0QXR0cmlidXRlKGUpO2lmKHR5cGVvZiBkPT0ic3RyaW5nIil7dHJ5e2Q9ZD09PSJ0cnVlIj8hMDpkPT09ImZhbHNlIj8hMTpkPT09Im51bGwiP251bGw6Zi5pc051bWVyaWMoZCk/cGFyc2VGbG9hdChkKTpqLnRlc3QoZCk/Zi5wYXJzZUpTT04oZCk6ZH1jYXRjaChnKXt9Zi5kYXRhKGEsYyxkKX1lbHNlIGQ9Yn1yZXR1cm4gZH1mdW5jdGlvbiBoKGEpe3ZhciBiPWdbYV09e30sYyxkO2E9YS5zcGxpdCgvXHMrLyk7Zm9yKGM9MCxkPWEubGVuZ3RoO2M8ZDtjKyspYlthW2NdXT0hMDtyZXR1cm4gYn12YXIgYz1hLmRvY3VtZW50LGQ9YS5uYXZpZ2F0b3IsZT1hLmxvY2F0aW9uLGY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBKKCl7aWYoIWUuaXNSZWFkeSl7dHJ5e2MuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2goYSl7c2V0VGltZW91dChKLDEpO3JldHVybn1lLnJlYWR5KCl9fXZhciBlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBlLmZuLmluaXQoYSxiLGgpfSxmPWEualF1ZXJ5LGc9YS4kLGgsaT0vXig/OlteIzxdKig8W1x3XFddKz4pW14+XSokfCMoW1x3XC1dKikkKS8saj0vXFMvLGs9L15ccysvLGw9L1xzKyQvLG09L148KFx3KylccypcLz8+KD86PFwvXDE+KT8kLyxuPS9eW1xdLDp7fVxzXSokLyxvPS9cXCg/OlsiXFxcL2JmbnJ0XXx1WzAtOWEtZkEtRl17NH0pL2cscD0vIlteIlxcXG5ccl0qInx0cnVlfGZhbHNlfG51bGx8LT9cZCsoPzpcLlxkKik/KD86W2VFXVsrXC1dP1xkKyk/L2cscT0vKD86Xnw6fCwpKD86XHMqXFspKy9nLHI9Lyh3ZWJraXQpWyBcL10oW1x3Ll0rKS8scz0vKG9wZXJhKSg/Oi4qdmVyc2lvbik/WyBcL10oW1x3Ll0rKS8sdD0vKG1zaWUpIChbXHcuXSspLyx1PS8obW96aWxsYSkoPzouKj8gcnY6KFtcdy5dKykpPy8sdj0vLShbYS16XXxbMC05XSkvaWcsdz0vXi1tcy0vLHg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYisiIikudG9VcHBlckNhc2UoKX0seT1kLnVzZXJBZ2VudCx6LEEsQixDPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsRD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LEU9QXJyYXkucHJvdG90eXBlLnB1c2gsRj1BcnJheS5wcm90b3R5cGUuc2xpY2UsRz1TdHJpbmcucHJvdG90eXBlLnRyaW0sSD1BcnJheS5wcm90b3R5cGUuaW5kZXhPZixJPXt9O2UuZm49ZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmUsaW5pdDpmdW5jdGlvbihhLGQsZil7dmFyIGcsaCxqLGs7aWYoIWEpcmV0dXJuIHRoaXM7aWYoYS5ub2RlVHlwZSl7dGhpcy5jb250ZXh0PXRoaXNbMF09YSx0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKGE9PT0iYm9keSImJiFkJiZjLmJvZHkpe3RoaXMuY29udGV4dD1jLHRoaXNbMF09Yy5ib2R5LHRoaXMuc2VsZWN0b3I9YSx0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKHR5cGVvZiBhPT0ic3RyaW5nIil7YS5jaGFyQXQoMCkhPT0iPCJ8fGEuY2hhckF0KGEubGVuZ3RoLTEpIT09Ij4ifHxhLmxlbmd0aDwzP2c9aS5leGVjKGEpOmc9W251bGwsYSxudWxsXTtpZihnJiYoZ1sxXXx8IWQpKXtpZihnWzFdKXtkPWQgaW5zdGFuY2VvZiBlP2RbMF06ZCxrPWQ/ZC5vd25lckRvY3VtZW50fHxkOmMsaj1tLmV4ZWMoYSksaj9lLmlzUGxhaW5PYmplY3QoZCk/KGE9W2MuY3JlYXRlRWxlbWVudChqWzFdKV0sZS5mbi5hdHRyLmNhbGwoYSxkLCEwKSk6YT1bay5jcmVhdGVFbGVtZW50KGpbMV0pXTooaj1lLmJ1aWxkRnJhZ21lbnQoW2dbMV1dLFtrXSksYT0oai5jYWNoZWFibGU/ZS5jbG9uZShqLmZyYWdtZW50KTpqLmZyYWdtZW50KS5jaGlsZE5vZGVzKTtyZXR1cm4gZS5tZXJnZSh0aGlzLGEpfWg9Yy5nZXRFbGVtZW50QnlJZChnWzJdKTtpZihoJiZoLnBhcmVudE5vZGUpe2lmKGguaWQhPT1nWzJdKXJldHVybiBmLmZpbmQoYSk7dGhpcy5sZW5ndGg9MSx0aGlzWzBdPWh9dGhpcy5jb250ZXh0PWMsdGhpcy5zZWxlY3Rvcj1hO3JldHVybiB0aGlzfXJldHVybiFkfHxkLmpxdWVyeT8oZHx8ZikuZmluZChhKTp0aGlzLmNvbnN0cnVjdG9yKGQpLmZpbmQoYSl9aWYoZS5pc0Z1bmN0aW9uKGEpKXJldHVybiBmLnJlYWR5KGEpO2Euc2VsZWN0b3IhPT1iJiYodGhpcy5zZWxlY3Rvcj1hLnNlbGVjdG9yLHRoaXMuY29udGV4dD1hLmNvbnRleHQpO3JldHVybiBlLm1ha2VBcnJheShhLHRoaXMpfSxzZWxlY3RvcjoiIixqcXVlcnk6IjEuNy4xIixsZW5ndGg6MCxzaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RofSx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIEYuY2FsbCh0aGlzLDApfSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/dGhpcy50b0FycmF5KCk6YTwwP3RoaXNbdGhpcy5sZW5ndGgrYV06dGhpc1thXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLmNvbnN0cnVjdG9yKCk7ZS5pc0FycmF5KGEpP0UuYXBwbHkoZCxhKTplLm1lcmdlKGQsYSksZC5wcmV2T2JqZWN0PXRoaXMsZC5jb250ZXh0PXRoaXMuY29udGV4dCxiPT09ImZpbmQiP2Quc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisodGhpcy5zZWxlY3Rvcj8iICI6IiIpK2M6YiYmKGQuc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisiLiIrYisiKCIrYysiKSIpO3JldHVybiBkfSxlYWNoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGUuZWFjaCh0aGlzLGEsYil9LHJlYWR5OmZ1bmN0aW9uKGEpe2UuYmluZFJlYWR5KCksQS5hZGQoYSk7cmV0dXJuIHRoaXN9LGVxOmZ1bmN0aW9uKGEpe2E9K2E7cmV0dXJuIGE9PT0tMT90aGlzLnNsaWNlKGEpOnRoaXMuc2xpY2UoYSxhKzEpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhGLmFwcGx5KHRoaXMsYXJndW1lbnRzKSwic2xpY2UiLEYuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSl9LG1hcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZS5tYXAodGhpcyxmdW5jdGlvbihiLGMpe3JldHVybiBhLmNhbGwoYixjLGIpfSkpfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKG51bGwpfSxwdXNoOkUsc29ydDpbXS5zb3J0LHNwbGljZTpbXS5zcGxpY2V9LGUuZm4uaW5pdC5wcm90b3R5cGU9ZS5mbixlLmV4dGVuZD1lLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBhLGMsZCxmLGcsaCxpPWFyZ3VtZW50c1swXXx8e30saj0xLGs9YXJndW1lbnRzLmxlbmd0aCxsPSExO3R5cGVvZiBpPT0iYm9vbGVhbiImJihsPWksaT1hcmd1bWVudHNbMV18fHt9LGo9MiksdHlwZW9mIGkhPSJvYmplY3QiJiYhZS5pc0Z1bmN0aW9uKGkpJiYoaT17fSksaz09PWomJihpPXRoaXMsLS1qKTtmb3IoO2o8aztqKyspaWYoKGE9YXJndW1lbnRzW2pdKSE9bnVsbClmb3IoYyBpbiBhKXtkPWlbY10sZj1hW2NdO2lmKGk9PT1mKWNvbnRpbnVlO2wmJmYmJihlLmlzUGxhaW5PYmplY3QoZil8fChnPWUuaXNBcnJheShmKSkpPyhnPyhnPSExLGg9ZCYmZS5pc0FycmF5KGQpP2Q6W10pOmg9ZCYmZS5pc1BsYWluT2JqZWN0KGQpP2Q6e30saVtjXT1lLmV4dGVuZChsLGgsZikpOmYhPT1iJiYoaVtjXT1mKX1yZXR1cm4gaX0sZS5leHRlbmQoe25vQ29uZmxpY3Q6ZnVuY3Rpb24oYil7YS4kPT09ZSYmKGEuJD1nKSxiJiZhLmpRdWVyeT09PWUmJihhLmpRdWVyeT1mKTtyZXR1cm4gZX0saXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oYSl7YT9lLnJlYWR5V2FpdCsrOmUucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihhKXtpZihhPT09ITAmJiEtLWUucmVhZHlXYWl0fHxhIT09ITAmJiFlLmlzUmVhZHkpe2lmKCFjLmJvZHkpcmV0dXJuIHNldFRpbWVvdXQoZS5yZWFkeSwxKTtlLmlzUmVhZHk9ITA7aWYoYSE9PSEwJiYtLWUucmVhZHlXYWl0PjApcmV0dXJuO0EuZmlyZVdpdGgoYyxbZV0pLGUuZm4udHJpZ2dlciYmZShjKS50cmlnZ2VyKCJyZWFkeSIpLm9mZigicmVhZHkiKX19LGJpbmRSZWFkeTpmdW5jdGlvbigpe2lmKCFBKXtBPWUuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpO2lmKGMucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpcmV0dXJuIHNldFRpbWVvdXQoZS5yZWFkeSwxKTtpZihjLmFkZEV2ZW50TGlzdGVuZXIpYy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixCLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGUucmVhZHksITEpO2Vsc2UgaWYoYy5hdHRhY2hFdmVudCl7Yy5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixCKSxhLmF0dGFjaEV2ZW50KCJvbmxvYWQiLGUucmVhZHkpO3ZhciBiPSExO3RyeXtiPWEuZnJhbWVFbGVtZW50PT1udWxsfWNhdGNoKGQpe31jLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCYmYiYmSigpfX19LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuIGUudHlwZShhKT09PSJmdW5jdGlvbiJ9LGlzQXJyYXk6QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGUudHlwZShhKT09PSJhcnJheSJ9LGlzV2luZG93OmZ1bmN0aW9uKGEpe3JldHVybiBhJiZ0eXBlb2YgYT09Im9iamVjdCImJiJzZXRJbnRlcnZhbCJpbiBhfSxpc051bWVyaWM6ZnVuY3Rpb24oYSl7cmV0dXJuIWlzTmFOKHBhcnNlRmxvYXQoYSkpJiZpc0Zpbml0ZShhKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD9TdHJpbmcoYSk6SVtDLmNhbGwoYSldfHwib2JqZWN0In0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihhKXtpZighYXx8ZS50eXBlKGEpIT09Im9iamVjdCJ8fGEubm9kZVR5cGV8fGUuaXNXaW5kb3coYSkpcmV0dXJuITE7dHJ5e2lmKGEuY29uc3RydWN0b3ImJiFELmNhbGwoYSwiY29uc3RydWN0b3IiKSYmIUQuY2FsbChhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwiaXNQcm90b3R5cGVPZiIpKXJldHVybiExfWNhdGNoKGMpe3JldHVybiExfXZhciBkO2ZvcihkIGluIGEpO3JldHVybiBkPT09Ynx8RC5jYWxsKGEsZCl9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiIGluIGEpcmV0dXJuITE7cmV0dXJuITB9LGVycm9yOmZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcihhKX0scGFyc2VKU09OOmZ1bmN0aW9uKGIpe2lmKHR5cGVvZiBiIT0ic3RyaW5nInx8IWIpcmV0dXJuIG51bGw7Yj1lLnRyaW0oYik7aWYoYS5KU09OJiZhLkpTT04ucGFyc2UpcmV0dXJuIGEuSlNPTi5wYXJzZShiKTtpZihuLnRlc3QoYi5yZXBsYWNlKG8sIkAiKS5yZXBsYWNlKHAsIl0iKS5yZXBsYWNlKHEsIiIpKSlyZXR1cm4obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiKSkoKTtlLmVycm9yKCJJbnZhbGlkIEpTT046ICIrYil9LHBhcnNlWE1MOmZ1bmN0aW9uKGMpe3ZhciBkLGY7dHJ5e2EuRE9NUGFyc2VyPyhmPW5ldyBET01QYXJzZXIsZD1mLnBhcnNlRnJvbVN0cmluZyhjLCJ0ZXh0L3htbCIpKTooZD1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpLGQuYXN5bmM9ImZhbHNlIixkLmxvYWRYTUwoYykpfWNhdGNoKGcpe2Q9Yn0oIWR8fCFkLmRvY3VtZW50RWxlbWVudHx8ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGgpJiZlLmVycm9yKCJJbnZhbGlkIFhNTDogIitjKTtyZXR1cm4gZH0sbm9vcDpmdW5jdGlvbigpe30sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZqLnRlc3QoYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UodywibXMtIikucmVwbGFjZSh2LHgpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk9PT1iLnRvVXBwZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxjLGQpe3ZhciBmLGc9MCxoPWEubGVuZ3RoLGk9aD09PWJ8fGUuaXNGdW5jdGlvbihhKTtpZihkKXtpZihpKXtmb3IoZiBpbiBhKWlmKGMuYXBwbHkoYVtmXSxkKT09PSExKWJyZWFrfWVsc2UgZm9yKDtnPGg7KWlmKGMuYXBwbHkoYVtnKytdLGQpPT09ITEpYnJlYWt9ZWxzZSBpZihpKXtmb3IoZiBpbiBhKWlmKGMuY2FsbChhW2ZdLGYsYVtmXSk9PT0hMSlicmVha31lbHNlIGZvcig7ZzxoOylpZihjLmNhbGwoYVtnXSxnLGFbZysrXSk9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpHP2Z1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOkcuY2FsbChhKX06ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/IiI6KGErIiIpLnJlcGxhY2UoaywiIikucmVwbGFjZShsLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107aWYoYSE9bnVsbCl7dmFyIGQ9ZS50eXBlKGEpO2EubGVuZ3RoPT1udWxsfHxkPT09InN0cmluZyJ8fGQ9PT0iZnVuY3Rpb24ifHxkPT09InJlZ2V4cCJ8fGUuaXNXaW5kb3coYSk/RS5jYWxsKGMsYSk6ZS5tZXJnZShjLGEpfXJldHVybiBjfSxpbkFycmF5OmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihiKXtpZihIKXJldHVybiBILmNhbGwoYixhLGMpO2Q9Yi5sZW5ndGgsYz1jP2M8MD9NYXRoLm1heCgwLGQrYyk6YzowO2Zvcig7YzxkO2MrKylpZihjIGluIGImJmJbY109PT1hKXJldHVybiBjfXJldHVybi0xfSxtZXJnZTpmdW5jdGlvbihhLGMpe3ZhciBkPWEubGVuZ3RoLGU9MDtpZih0eXBlb2YgYy5sZW5ndGg9PSJudW1iZXIiKWZvcih2YXIgZj1jLmxlbmd0aDtlPGY7ZSsrKWFbZCsrXT1jW2VdO2Vsc2Ugd2hpbGUoY1tlXSE9PWIpYVtkKytdPWNbZSsrXTthLmxlbmd0aD1kO3JldHVybiBhfSxncmVwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlO2M9ISFjO2Zvcih2YXIgZj0wLGc9YS5sZW5ndGg7ZjxnO2YrKyllPSEhYihhW2ZdLGYpLGMhPT1lJiZkLnB1c2goYVtmXSk7cmV0dXJuIGR9LG1hcDpmdW5jdGlvbihhLGMsZCl7dmFyIGYsZyxoPVtdLGk9MCxqPWEubGVuZ3RoLGs9YSBpbnN0YW5jZW9mIGV8fGohPT1iJiZ0eXBlb2Ygaj09Im51bWJlciImJihqPjAmJmFbMF0mJmFbai0xXXx8aj09PTB8fGUuaXNBcnJheShhKSk7aWYoaylmb3IoO2k8ajtpKyspZj1jKGFbaV0saSxkKSxmIT1udWxsJiYoaFtoLmxlbmd0aF09Zik7ZWxzZSBmb3IoZyBpbiBhKWY9YyhhW2ddLGcsZCksZiE9bnVsbCYmKGhbaC5sZW5ndGhdPWYpO3JldHVybiBoLmNvbmNhdC5hcHBseShbXSxoKX0sZ3VpZDoxLHByb3h5OmZ1bmN0aW9uKGEsYyl7aWYodHlwZW9mIGM9PSJzdHJpbmciKXt2YXIgZD1hW2NdO2M9YSxhPWR9aWYoIWUuaXNGdW5jdGlvbihhKSlyZXR1cm4gYjt2YXIgZj1GLmNhbGwoYXJndW1lbnRzLDIpLGc9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShjLGYuY29uY2F0KEYuY2FsbChhcmd1bWVudHMpKSl9O2cuZ3VpZD1hLmd1aWQ9YS5ndWlkfHxnLmd1aWR8fGUuZ3VpZCsrO3JldHVybiBnfSxhY2Nlc3M6ZnVuY3Rpb24oYSxjLGQsZixnLGgpe3ZhciBpPWEubGVuZ3RoO2lmKHR5cGVvZiBjPT0ib2JqZWN0Iil7Zm9yKHZhciBqIGluIGMpZS5hY2Nlc3MoYSxqLGNbal0sZixnLGQpO3JldHVybiBhfWlmKGQhPT1iKXtmPSFoJiZmJiZlLmlzRnVuY3Rpb24oZCk7Zm9yKHZhciBrPTA7azxpO2srKylnKGFba10sYyxmP2QuY2FsbChhW2tdLGssZyhhW2tdLGMpKTpkLGgpO3JldHVybiBhfXJldHVybiBpP2coYVswXSxjKTpifSxub3c6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0sdWFNYXRjaDpmdW5jdGlvbihhKXthPWEudG9Mb3dlckNhc2UoKTt2YXIgYj1yLmV4ZWMoYSl8fHMuZXhlYyhhKXx8dC5leGVjKGEpfHxhLmluZGV4T2YoImNvbXBhdGlibGUiKTwwJiZ1LmV4ZWMoYSl8fFtdO3JldHVybnticm93c2VyOmJbMV18fCIiLHZlcnNpb246YlsyXXx8IjAifX0sc3ViOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGMpe3JldHVybiBuZXcgYS5mbi5pbml0KGIsYyl9ZS5leHRlbmQoITAsYSx0aGlzKSxhLnN1cGVyY2xhc3M9dGhpcyxhLmZuPWEucHJvdG90eXBlPXRoaXMoKSxhLmZuLmNvbnN0cnVjdG9yPWEsYS5zdWI9dGhpcy5zdWIsYS5mbi5pbml0PWZ1bmN0aW9uKGQsZil7ZiYmZiBpbnN0YW5jZW9mIGUmJiEoZiBpbnN0YW5jZW9mIGEpJiYoZj1hKGYpKTtyZXR1cm4gZS5mbi5pbml0LmNhbGwodGhpcyxkLGYsYil9LGEuZm4uaW5pdC5wcm90b3R5cGU9YS5mbjt2YXIgYj1hKGMpO3JldHVybiBhfSxicm93c2VyOnt9fSksZS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7SVsiW29iamVjdCAiK2IrIl0iXT1iLnRvTG93ZXJDYXNlKCl9KSx6PWUudWFNYXRjaCh5KSx6LmJyb3dzZXImJihlLmJyb3dzZXJbei5icm93c2VyXT0hMCxlLmJyb3dzZXIudmVyc2lvbj16LnZlcnNpb24pLGUuYnJvd3Nlci53ZWJraXQmJihlLmJyb3dzZXIuc2FmYXJpPSEwKSxqLnRlc3QoIiAiKSYmKGs9L15bXHNceEEwXSsvLGw9L1tcc1x4QTBdKyQvKSxoPWUoYyksYy5hZGRFdmVudExpc3RlbmVyP0I9ZnVuY3Rpb24oKXtjLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEIsITEpLGUucmVhZHkoKX06Yy5hdHRhY2hFdmVudCYmKEI9ZnVuY3Rpb24oKXtjLnJlYWR5U3RhdGU9PT0iY29tcGxldGUiJiYoYy5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixCKSxlLnJlYWR5KCkpfSk7cmV0dXJuIGV9KCksZz17fTtmLkNhbGxiYWNrcz1mdW5jdGlvbihhKXthPWE/Z1thXXx8aChhKTp7fTt2YXIgYz1bXSxkPVtdLGUsaSxqLGssbCxtPWZ1bmN0aW9uKGIpe3ZhciBkLGUsZyxoLGk7Zm9yKGQ9MCxlPWIubGVuZ3RoO2Q8ZTtkKyspZz1iW2RdLGg9Zi50eXBlKGcpLGg9PT0iYXJyYXkiP20oZyk6aD09PSJmdW5jdGlvbiImJighYS51bmlxdWV8fCFvLmhhcyhnKSkmJmMucHVzaChnKX0sbj1mdW5jdGlvbihiLGYpe2Y9Znx8W10sZT0hYS5tZW1vcnl8fFtiLGZdLGk9ITAsbD1qfHwwLGo9MCxrPWMubGVuZ3RoO2Zvcig7YyYmbDxrO2wrKylpZihjW2xdLmFwcGx5KGIsZik9PT0hMSYmYS5zdG9wT25GYWxzZSl7ZT0hMDticmVha31pPSExLGMmJihhLm9uY2U/ZT09PSEwP28uZGlzYWJsZSgpOmM9W106ZCYmZC5sZW5ndGgmJihlPWQuc2hpZnQoKSxvLmZpcmVXaXRoKGVbMF0sZVsxXSkpKX0sbz17YWRkOmZ1bmN0aW9uKCl7aWYoYyl7dmFyIGE9Yy5sZW5ndGg7bShhcmd1bWVudHMpLGk/az1jLmxlbmd0aDplJiZlIT09ITAmJihqPWEsbihlWzBdLGVbMV0pKX1yZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7aWYoYyl7dmFyIGI9YXJndW1lbnRzLGQ9MCxlPWIubGVuZ3RoO2Zvcig7ZDxlO2QrKylmb3IodmFyIGY9MDtmPGMubGVuZ3RoO2YrKylpZihiW2RdPT09Y1tmXSl7aSYmZjw9ayYmKGstLSxmPD1sJiZsLS0pLGMuc3BsaWNlKGYtLSwxKTtpZihhLnVuaXF1ZSlicmVha319cmV0dXJuIHRoaXN9LGhhczpmdW5jdGlvbihhKXtpZihjKXt2YXIgYj0wLGQ9Yy5sZW5ndGg7Zm9yKDtiPGQ7YisrKWlmKGE9PT1jW2JdKXJldHVybiEwfXJldHVybiExfSxlbXB0eTpmdW5jdGlvbigpe2M9W107cmV0dXJuIHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtjPWQ9ZT1iO3JldHVybiB0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFjfSxsb2NrOmZ1bmN0aW9uKCl7ZD1iLCghZXx8ZT09PSEwKSYmby5kaXNhYmxlKCk7cmV0dXJuIHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiFkfSxmaXJlV2l0aDpmdW5jdGlvbihiLGMpe2QmJihpP2Eub25jZXx8ZC5wdXNoKFtiLGNdKTooIWEub25jZXx8IWUpJiZuKGIsYykpO3JldHVybiB0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7by5maXJlV2l0aCh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFlfX07cmV0dXJuIG99O3ZhciBpPVtdLnNsaWNlO2YuZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbihhKXt2YXIgYj1mLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxjPWYuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLGQ9Zi5DYWxsYmFja3MoIm1lbW9yeSIpLGU9InBlbmRpbmciLGc9e3Jlc29sdmU6YixyZWplY3Q6Yyxub3RpZnk6ZH0saD17ZG9uZTpiLmFkZCxmYWlsOmMuYWRkLHByb2dyZXNzOmQuYWRkLHN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIGV9LGlzUmVzb2x2ZWQ6Yi5maXJlZCxpc1JlamVjdGVkOmMuZmlyZWQsdGhlbjpmdW5jdGlvbihhLGIsYyl7aS5kb25lKGEpLmZhaWwoYikucHJvZ3Jlc3MoYyk7cmV0dXJuIHRoaXN9LGFsd2F5czpmdW5jdGlvbigpe2kuZG9uZS5hcHBseShpLGFyZ3VtZW50cykuZmFpbC5hcHBseShpLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXN9LHBpcGU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLkRlZmVycmVkKGZ1bmN0aW9uKGQpe2YuZWFjaCh7ZG9uZTpbYSwicmVzb2x2ZSJdLGZhaWw6W2IsInJlamVjdCJdLHByb2dyZXNzOltjLCJub3RpZnkiXX0sZnVuY3Rpb24oYSxiKXt2YXIgYz1iWzBdLGU9YlsxXSxnO2YuaXNGdW5jdGlvbihjKT9pW2FdKGZ1bmN0aW9uKCl7Zz1jLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxnJiZmLmlzRnVuY3Rpb24oZy5wcm9taXNlKT9nLnByb21pc2UoKS50aGVuKGQucmVzb2x2ZSxkLnJlamVjdCxkLm5vdGlmeSk6ZFtlKyJXaXRoIl0odGhpcz09PWk/ZDp0aGlzLFtnXSl9KTppW2FdKGRbZV0pfSl9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oYSl7aWYoYT09bnVsbClhPWg7ZWxzZSBmb3IodmFyIGIgaW4gaClhW2JdPWhbYl07cmV0dXJuIGF9fSxpPWgucHJvbWlzZSh7fSksajtmb3IoaiBpbiBnKWlbal09Z1tqXS5maXJlLGlbaisiV2l0aCJdPWdbal0uZmlyZVdpdGg7aS5kb25lKGZ1bmN0aW9uKCl7ZT0icmVzb2x2ZWQifSxjLmRpc2FibGUsZC5sb2NrKS5mYWlsKGZ1bmN0aW9uKCl7ZT0icmVqZWN0ZWQifSxiLmRpc2FibGUsZC5sb2NrKSxhJiZhLmNhbGwoaSxpKTtyZXR1cm4gaX0sd2hlbjpmdW5jdGlvbihhKXtmdW5jdGlvbiBtKGEpe3JldHVybiBmdW5jdGlvbihiKXtlW2FdPWFyZ3VtZW50cy5sZW5ndGg+MT9pLmNhbGwoYXJndW1lbnRzLDApOmIsai5ub3RpZnlXaXRoKGssZSl9fWZ1bmN0aW9uIGwoYSl7cmV0dXJuIGZ1bmN0aW9uKGMpe2JbYV09YXJndW1lbnRzLmxlbmd0aD4xP2kuY2FsbChhcmd1bWVudHMsMCk6YywtLWd8fGoucmVzb2x2ZVdpdGgoaixiKX19dmFyIGI9aS5jYWxsKGFyZ3VtZW50cywwKSxjPTAsZD1iLmxlbmd0aCxlPUFycmF5KGQpLGc9ZCxoPWQsaj1kPD0xJiZhJiZmLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hOmYuRGVmZXJyZWQoKSxrPWoucHJvbWlzZSgpO2lmKGQ+MSl7Zm9yKDtjPGQ7YysrKWJbY10mJmJbY10ucHJvbWlzZSYmZi5pc0Z1bmN0aW9uKGJbY10ucHJvbWlzZSk/YltjXS5wcm9taXNlKCkudGhlbihsKGMpLGoucmVqZWN0LG0oYykpOi0tZztnfHxqLnJlc29sdmVXaXRoKGosYil9ZWxzZSBqIT09YSYmai5yZXNvbHZlV2l0aChqLGQ/W2FdOltdKTtyZXR1cm4ga319KSxmLnN1cHBvcnQ9ZnVuY3Rpb24oKXt2YXIgYixkLGUsZyxoLGksaixrLGwsbSxuLG8scCxxPWMuY3JlYXRlRWxlbWVudCgiZGl2Iikscj1jLmRvY3VtZW50RWxlbWVudDtxLnNldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIiwidCIpLHEuaW5uZXJIVE1MPSIgICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnIHN0eWxlPSd0b3A6MXB4O2Zsb2F0OmxlZnQ7b3BhY2l0eTouNTU7Jz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiIsZD1xLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIiksZT1xLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF07aWYoIWR8fCFkLmxlbmd0aHx8IWUpcmV0dXJue307Zz1jLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGg9Zy5hcHBlbmRDaGlsZChjLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKSxpPXEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IilbMF0sYj17bGVhZGluZ1doaXRlc3BhY2U6cS5maXJzdENoaWxkLm5vZGVUeXBlPT09Myx0Ym9keTohcS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsaHRtbFNlcmlhbGl6ZTohIXEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKS5sZW5ndGgsc3R5bGU6L3RvcC8udGVzdChlLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksaHJlZk5vcm1hbGl6ZWQ6ZS5nZXRBdHRyaWJ1dGUoImhyZWYiKT09PSIvYSIsb3BhY2l0eTovXjAuNTUvLnRlc3QoZS5zdHlsZS5vcGFjaXR5KSxjc3NGbG9hdDohIWUuc3R5bGUuY3NzRmxvYXQsY2hlY2tPbjppLnZhbHVlPT09Im9uIixvcHRTZWxlY3RlZDpoLnNlbGVjdGVkLGdldFNldEF0dHJpYnV0ZTpxLmNsYXNzTmFtZSE9PSJ0IixlbmN0eXBlOiEhYy5jcmVhdGVFbGVtZW50KCJmb3JtIikuZW5jdHlwZSxodG1sNUNsb25lOmMuY3JlYXRlRWxlbWVudCgibmF2IikuY2xvbmVOb2RlKCEwKS5vdXRlckhUTUwhPT0iPDpuYXY+PC86bmF2PiIsc3VibWl0QnViYmxlczohMCxjaGFuZ2VCdWJibGVzOiEwLGZvY3VzaW5CdWJibGVzOiExLGRlbGV0ZUV4cGFuZG86ITAsbm9DbG9uZUV2ZW50OiEwLGlubGluZUJsb2NrTmVlZHNMYXlvdXQ6ITEsc2hyaW5rV3JhcEJsb2NrczohMSxyZWxpYWJsZU1hcmdpblJpZ2h0OiEwfSxpLmNoZWNrZWQ9ITAsYi5ub0Nsb25lQ2hlY2tlZD1pLmNsb25lTm9kZSghMCkuY2hlY2tlZCxnLmRpc2FibGVkPSEwLGIub3B0RGlzYWJsZWQ9IWguZGlzYWJsZWQ7dHJ5e2RlbGV0ZSBxLnRlc3R9Y2F0Y2gocyl7Yi5kZWxldGVFeHBhbmRvPSExfSFxLmFkZEV2ZW50TGlzdGVuZXImJnEuYXR0YWNoRXZlbnQmJnEuZmlyZUV2ZW50JiYocS5hdHRhY2hFdmVudCgib25jbGljayIsZnVuY3Rpb24oKXtiLm5vQ2xvbmVFdmVudD0hMX0pLHEuY2xvbmVOb2RlKCEwKS5maXJlRXZlbnQoIm9uY2xpY2siKSksaT1jLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksaS52YWx1ZT0idCIsaS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGIucmFkaW9WYWx1ZT1pLnZhbHVlPT09InQiLGkuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpLHEuYXBwZW5kQ2hpbGQoaSksaz1jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxrLmFwcGVuZENoaWxkKHEubGFzdENoaWxkKSxiLmNoZWNrQ2xvbmU9ay5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsYi5hcHBlbmRDaGVja2VkPWkuY2hlY2tlZCxrLnJlbW92ZUNoaWxkKGkpLGsuYXBwZW5kQ2hpbGQocSkscS5pbm5lckhUTUw9IiIsYS5nZXRDb21wdXRlZFN0eWxlJiYoaj1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGouc3R5bGUud2lkdGg9IjAiLGouc3R5bGUubWFyZ2luUmlnaHQ9IjAiLHEuc3R5bGUud2lkdGg9IjJweCIscS5hcHBlbmRDaGlsZChqKSxiLnJlbGlhYmxlTWFyZ2luUmlnaHQ9KHBhcnNlSW50KChhLmdldENvbXB1dGVkU3R5bGUoaixudWxsKXx8e21hcmdpblJpZ2h0OjB9KS5tYXJnaW5SaWdodCwxMCl8fDApPT09MCk7aWYocS5hdHRhY2hFdmVudClmb3IobyBpbntzdWJtaXQ6MSxjaGFuZ2U6MSxmb2N1c2luOjF9KW49Im9uIitvLHA9biBpbiBxLHB8fChxLnNldEF0dHJpYnV0ZShuLCJyZXR1cm47IikscD10eXBlb2YgcVtuXT09ImZ1bmN0aW9uIiksYltvKyJCdWJibGVzIl09cDtrLnJlbW92ZUNoaWxkKHEpLGs9Zz1oPWo9cT1pPW51bGwsZihmdW5jdGlvbigpe3ZhciBhLGQsZSxnLGgsaSxqLGssbSxuLG8scj1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07IXJ8fChqPTEsaz0icG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3dpZHRoOjFweDtoZWlnaHQ6MXB4O21hcmdpbjowOyIsbT0idmlzaWJpbGl0eTpoaWRkZW47Ym9yZGVyOjA7IixuPSJzdHlsZT0nIitrKyJib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowOyciLG89IjxkaXYgIituKyI+PGRpdj48L2Rpdj48L2Rpdj4iKyI8dGFibGUgIituKyIgY2VsbHBhZGRpbmc9JzAnIGNlbGxzcGFjaW5nPScwJz4iKyI8dHI+PHRkPjwvdGQ+PC90cj48L3RhYmxlPiIsYT1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGEuc3R5bGUuY3NzVGV4dD1tKyJ3aWR0aDowO2hlaWdodDowO3Bvc2l0aW9uOnN0YXRpYzt0b3A6MDttYXJnaW4tdG9wOiIraisicHgiLHIuaW5zZXJ0QmVmb3JlKGEsci5maXJzdENoaWxkKSxxPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksYS5hcHBlbmRDaGlsZChxKSxxLmlubmVySFRNTD0iPHRhYmxlPjx0cj48dGQgc3R5bGU9J3BhZGRpbmc6MDtib3JkZXI6MDtkaXNwbGF5Om5vbmUnPjwvdGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iLGw9cS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKSxwPWxbMF0ub2Zmc2V0SGVpZ2h0PT09MCxsWzBdLnN0eWxlLmRpc3BsYXk9IiIsbFsxXS5zdHlsZS5kaXNwbGF5PSJub25lIixiLnJlbGlhYmxlSGlkZGVuT2Zmc2V0cz1wJiZsWzBdLm9mZnNldEhlaWdodD09PTAscS5pbm5lckhUTUw9IiIscS5zdHlsZS53aWR0aD1xLnN0eWxlLnBhZGRpbmdMZWZ0PSIxcHgiLGYuYm94TW9kZWw9Yi5ib3hNb2RlbD1xLm9mZnNldFdpZHRoPT09Mix0eXBlb2YgcS5zdHlsZS56b29tIT0idW5kZWZpbmVkIiYmKHEuc3R5bGUuZGlzcGxheT0iaW5saW5lIixxLnN0eWxlLnpvb209MSxiLmlubGluZUJsb2NrTmVlZHNMYXlvdXQ9cS5vZmZzZXRXaWR0aD09PTIscS5zdHlsZS5kaXNwbGF5PSIiLHEuaW5uZXJIVE1MPSI8ZGl2IHN0eWxlPSd3aWR0aDo0cHg7Jz48L2Rpdj4iLGIuc2hyaW5rV3JhcEJsb2Nrcz1xLm9mZnNldFdpZHRoIT09MikscS5zdHlsZS5jc3NUZXh0PWsrbSxxLmlubmVySFRNTD1vLGQ9cS5maXJzdENoaWxkLGU9ZC5maXJzdENoaWxkLGg9ZC5uZXh0U2libGluZy5maXJzdENoaWxkLmZpcnN0Q2hpbGQsaT17ZG9lc05vdEFkZEJvcmRlcjplLm9mZnNldFRvcCE9PTUsZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHM6aC5vZmZzZXRUb3A9PT01fSxlLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsZS5zdHlsZS50b3A9IjIwcHgiLGkuZml4ZWRQb3NpdGlvbj1lLm9mZnNldFRvcD09PTIwfHxlLm9mZnNldFRvcD09PTE1LGUuc3R5bGUucG9zaXRpb249ZS5zdHlsZS50b3A9IiIsZC5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIixkLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaS5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGU9ZS5vZmZzZXRUb3A9PT0tNSxpLmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0PXIub2Zmc2V0VG9wIT09aixyLnJlbW92ZUNoaWxkKGEpLHE9YT1udWxsLGYuZXh0ZW5kKGIsaSkpfSk7cmV0dXJuIGJ9KCk7dmFyIGo9L14oPzpcey4qXH18XFsuKlxdKSQvLGs9LyhbQS1aXSkvZztmLmV4dGVuZCh7Y2FjaGU6e30sdXVpZDowLGV4cGFuZG86ImpRdWVyeSIrKGYuZm4uanF1ZXJ5K01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLG5vRGF0YTp7ZW1iZWQ6ITAsb2JqZWN0OiJjbHNpZDpEMjdDREI2RS1BRTZELTExY2YtOTZCOC00NDQ1NTM1NDAwMDAiLGFwcGxldDohMH0saGFzRGF0YTpmdW5jdGlvbihhKXthPWEubm9kZVR5cGU/Zi5jYWNoZVthW2YuZXhwYW5kb11dOmFbZi5leHBhbmRvXTtyZXR1cm4hIWEmJiFtKGEpfSxkYXRhOmZ1bmN0aW9uKGEsYyxkLGUpe2lmKCEhZi5hY2NlcHREYXRhKGEpKXt2YXIgZyxoLGksaj1mLmV4cGFuZG8saz10eXBlb2YgYz09InN0cmluZyIsbD1hLm5vZGVUeXBlLG09bD9mLmNhY2hlOmEsbj1sP2Fbal06YVtqXSYmaixvPWM9PT0iZXZlbnRzIjtpZigoIW58fCFtW25dfHwhbyYmIWUmJiFtW25dLmRhdGEpJiZrJiZkPT09YilyZXR1cm47bnx8KGw/YVtqXT1uPSsrZi51dWlkOm49aiksbVtuXXx8KG1bbl09e30sbHx8KG1bbl0udG9KU09OPWYubm9vcCkpO2lmKHR5cGVvZiBjPT0ib2JqZWN0Inx8dHlwZW9mIGM9PSJmdW5jdGlvbiIpZT9tW25dPWYuZXh0ZW5kKG1bbl0sYyk6bVtuXS5kYXRhPWYuZXh0ZW5kKG1bbl0uZGF0YSxjKTtnPWg9bVtuXSxlfHwoaC5kYXRhfHwoaC5kYXRhPXt9KSxoPWguZGF0YSksZCE9PWImJihoW2YuY2FtZWxDYXNlKGMpXT1kKTtpZihvJiYhaFtjXSlyZXR1cm4gZy5ldmVudHM7az8oaT1oW2NdLGk9PW51bGwmJihpPWhbZi5jYW1lbENhc2UoYyldKSk6aT1oO3JldHVybiBpfX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIsYyl7aWYoISFmLmFjY2VwdERhdGEoYSkpe3ZhciBkLGUsZyxoPWYuZXhwYW5kbyxpPWEubm9kZVR5cGUsaj1pP2YuY2FjaGU6YSxrPWk/YVtoXTpoO2lmKCFqW2tdKXJldHVybjtpZihiKXtkPWM/altrXTpqW2tdLmRhdGE7aWYoZCl7Zi5pc0FycmF5KGIpfHwoYiBpbiBkP2I9W2JdOihiPWYuY2FtZWxDYXNlKGIpLGIgaW4gZD9iPVtiXTpiPWIuc3BsaXQoIiAiKSkpO2ZvcihlPTAsZz1iLmxlbmd0aDtlPGc7ZSsrKWRlbGV0ZSBkW2JbZV1dO2lmKCEoYz9tOmYuaXNFbXB0eU9iamVjdCkoZCkpcmV0dXJufX1pZighYyl7ZGVsZXRlIGpba10uZGF0YTtpZighbShqW2tdKSlyZXR1cm59Zi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG98fCFqLnNldEludGVydmFsP2RlbGV0ZSBqW2tdOmpba109bnVsbCxpJiYoZi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG8/ZGVsZXRlIGFbaF06YS5yZW1vdmVBdHRyaWJ1dGU/YS5yZW1vdmVBdHRyaWJ1dGUoaCk6YVtoXT1udWxsKX19LF9kYXRhOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZi5kYXRhKGEsYixjLCEwKX0sYWNjZXB0RGF0YTpmdW5jdGlvbihhKXtpZihhLm5vZGVOYW1lKXt2YXIgYj1mLm5vRGF0YVthLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldO2lmKGIpcmV0dXJuIGIhPT0hMCYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzaWQiKT09PWJ9cmV0dXJuITB9fSksZi5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oYSxjKXt2YXIgZCxlLGcsaD1udWxsO2lmKHR5cGVvZiBhPT0idW5kZWZpbmVkIil7aWYodGhpcy5sZW5ndGgpe2g9Zi5kYXRhKHRoaXNbMF0pO2lmKHRoaXNbMF0ubm9kZVR5cGU9PT0xJiYhZi5fZGF0YSh0aGlzWzBdLCJwYXJzZWRBdHRycyIpKXtlPXRoaXNbMF0uYXR0cmlidXRlcztmb3IodmFyIGk9MCxqPWUubGVuZ3RoO2k8ajtpKyspZz1lW2ldLm5hbWUsZy5pbmRleE9mKCJkYXRhLSIpPT09MCYmKGc9Zi5jYW1lbENhc2UoZy5zdWJzdHJpbmcoNSkpLGwodGhpc1swXSxnLGhbZ10pKTtmLl9kYXRhKHRoaXNbMF0sInBhcnNlZEF0dHJzIiwhMCl9fXJldHVybiBofWlmKHR5cGVvZiBhPT0ib2JqZWN0IilyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5kYXRhKHRoaXMsYSl9KTtkPWEuc3BsaXQoIi4iKSxkWzFdPWRbMV0/Ii4iK2RbMV06IiI7aWYoYz09PWIpe2g9dGhpcy50cmlnZ2VySGFuZGxlcigiZ2V0RGF0YSIrZFsxXSsiISIsW2RbMF1dKSxoPT09YiYmdGhpcy5sZW5ndGgmJihoPWYuZGF0YSh0aGlzWzBdLGEpLGg9bCh0aGlzWzBdLGEsaCkpO3JldHVybiBoPT09YiYmZFsxXT90aGlzLmRhdGEoZFswXSk6aH1yZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Zih0aGlzKSxlPVtkWzBdLGNdO2IudHJpZ2dlckhhbmRsZXIoInNldERhdGEiK2RbMV0rIiEiLGUpLGYuZGF0YSh0aGlzLGEsYyksYi50cmlnZ2VySGFuZGxlcigiY2hhbmdlRGF0YSIrZFsxXSsiISIsZSl9KX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5yZW1vdmVEYXRhKHRoaXMsYSl9KX19KSxmLmV4dGVuZCh7X21hcms6ZnVuY3Rpb24oYSxiKXthJiYoYj0oYnx8ImZ4IikrIm1hcmsiLGYuX2RhdGEoYSxiLChmLl9kYXRhKGEsYil8fDApKzEpKX0sX3VubWFyazpmdW5jdGlvbihhLGIsYyl7YSE9PSEwJiYoYz1iLGI9YSxhPSExKTtpZihiKXtjPWN8fCJmeCI7dmFyIGQ9YysibWFyayIsZT1hPzA6KGYuX2RhdGEoYixkKXx8MSktMTtlP2YuX2RhdGEoYixkLGUpOihmLnJlbW92ZURhdGEoYixkLCEwKSxuKGIsYywibWFyayIpKX19LHF1ZXVlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihhKXtiPShifHwiZngiKSsicXVldWUiLGQ9Zi5fZGF0YShhLGIpLGMmJighZHx8Zi5pc0FycmF5KGMpP2Q9Zi5fZGF0YShhLGIsZi5tYWtlQXJyYXkoYykpOmQucHVzaChjKSk7cmV0dXJuIGR8fFtdfX0sZGVxdWV1ZTpmdW5jdGlvbihhLGIpe2I9Ynx8ImZ4Ijt2YXIgYz1mLnF1ZXVlKGEsYiksZD1jLnNoaWZ0KCksZT17fTtkPT09ImlucHJvZ3Jlc3MiJiYoZD1jLnNoaWZ0KCkpLGQmJihiPT09ImZ4IiYmYy51bnNoaWZ0KCJpbnByb2dyZXNzIiksZi5fZGF0YShhLGIrIi5ydW4iLGUpLGQuY2FsbChhLGZ1bmN0aW9uKCl7Zi5kZXF1ZXVlKGEsYil9LGUpKSxjLmxlbmd0aHx8KGYucmVtb3ZlRGF0YShhLGIrInF1ZXVlICIrYisiLnJ1biIsITApLG4oYSxiLCJxdWV1ZSIpKX19KSxmLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxjKXt0eXBlb2YgYSE9InN0cmluZyImJihjPWEsYT0iZngiKTtpZihjPT09YilyZXR1cm4gZi5xdWV1ZSh0aGlzWzBdLGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1mLnF1ZXVlKHRoaXMsYSxjKTthPT09ImZ4IiYmYlswXSE9PSJpbnByb2dyZXNzIiYmZi5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVxdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVsYXk6ZnVuY3Rpb24oYSxiKXthPWYuZng/Zi5meC5zcGVlZHNbYV18fGE6YSxiPWJ8fCJmeCI7cmV0dXJuIHRoaXMucXVldWUoYixmdW5jdGlvbihiLGMpe3ZhciBkPXNldFRpbWVvdXQoYixhKTtjLnN0b3A9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoZCl9fSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBtKCl7LS1ofHxkLnJlc29sdmVXaXRoKGUsW2VdKX10eXBlb2YgYSE9InN0cmluZyImJihjPWEsYT1iKSxhPWF8fCJmeCI7dmFyIGQ9Zi5EZWZlcnJlZCgpLGU9dGhpcyxnPWUubGVuZ3RoLGg9MSxpPWErImRlZmVyIixqPWErInF1ZXVlIixrPWErIm1hcmsiLGw7d2hpbGUoZy0tKWlmKGw9Zi5kYXRhKGVbZ10saSxiLCEwKXx8KGYuZGF0YShlW2ddLGosYiwhMCl8fGYuZGF0YShlW2ddLGssYiwhMCkpJiZmLmRhdGEoZVtnXSxpLGYuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCEwKSloKyssbC5hZGQobSk7bSgpO3JldHVybiBkLnByb21pc2UoKX19KTt2YXIgbz0vW1xuXHRccl0vZyxwPS9ccysvLHE9L1xyL2cscj0vXig/OmJ1dHRvbnxpbnB1dCkkL2kscz0vXig/OmJ1dHRvbnxpbnB1dHxvYmplY3R8c2VsZWN0fHRleHRhcmVhKSQvaSx0PS9eYSg/OnJlYSk/JC9pLHU9L14oPzphdXRvZm9jdXN8YXV0b3BsYXl8YXN5bmN8Y2hlY2tlZHxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZHxzZWxlY3RlZCkkL2ksdj1mLnN1cHBvcnQuZ2V0U2V0QXR0cmlidXRlLHcseCx5O2YuZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGYuYWNjZXNzKHRoaXMsYSxiLCEwLGYuYXR0cil9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YucmVtb3ZlQXR0cih0aGlzLGEpfSl9LHByb3A6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxhLGIsITAsZi5wcm9wKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihhKXthPWYucHJvcEZpeFthXXx8YTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dHJ5e3RoaXNbYV09YixkZWxldGUgdGhpc1thXX1jYXRjaChjKXt9fSl9LGFkZENsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGcsaCxpO2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2YodGhpcykuYWRkQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoYSYmdHlwZW9mIGE9PSJzdHJpbmciKXtiPWEuc3BsaXQocCk7Zm9yKGM9MCxkPXRoaXMubGVuZ3RoO2M8ZDtjKyspe2U9dGhpc1tjXTtpZihlLm5vZGVUeXBlPT09MSlpZighZS5jbGFzc05hbWUmJmIubGVuZ3RoPT09MSllLmNsYXNzTmFtZT1hO2Vsc2V7Zz0iICIrZS5jbGFzc05hbWUrIiAiO2ZvcihoPTAsaT1iLmxlbmd0aDtoPGk7aCsrKX5nLmluZGV4T2YoIiAiK2JbaF0rIiAiKXx8KGcrPWJbaF0rIiAiKTtlLmNsYXNzTmFtZT1mLnRyaW0oZyl9fX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGMsZCxlLGcsaCxpLGo7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS5yZW1vdmVDbGFzcyhhLmNhbGwodGhpcyxiLHRoaXMuY2xhc3NOYW1lKSl9KTtpZihhJiZ0eXBlb2YgYT09InN0cmluZyJ8fGE9PT1iKXtjPShhfHwiIikuc3BsaXQocCk7Zm9yKGQ9MCxlPXRoaXMubGVuZ3RoO2Q8ZTtkKyspe2c9dGhpc1tkXTtpZihnLm5vZGVUeXBlPT09MSYmZy5jbGFzc05hbWUpaWYoYSl7aD0oIiAiK2cuY2xhc3NOYW1lKyIgIikucmVwbGFjZShvLCIgIik7Zm9yKGk9MCxqPWMubGVuZ3RoO2k8ajtpKyspaD1oLnJlcGxhY2UoIiAiK2NbaV0rIiAiLCIgIik7Zy5jbGFzc05hbWU9Zi50cmltKGgpfWVsc2UgZy5jbGFzc05hbWU9IiJ9fXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbihhLGIpe3ZhciBjPXR5cGVvZiBhLGQ9dHlwZW9mIGI9PSJib29sZWFuIjtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXtmKHRoaXMpLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGMsdGhpcy5jbGFzc05hbWUsYiksYil9KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYoYz09PSJzdHJpbmciKXt2YXIgZSxnPTAsaD1mKHRoaXMpLGk9YixqPWEuc3BsaXQocCk7d2hpbGUoZT1qW2crK10paT1kP2k6IWguaGFzQ2xhc3MoZSksaFtpPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oZSl9ZWxzZSBpZihjPT09InVuZGVmaW5lZCJ8fGM9PT0iYm9vbGVhbiIpdGhpcy5jbGFzc05hbWUmJmYuX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIsdGhpcy5jbGFzc05hbWUpLHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lfHxhPT09ITE/IiI6Zi5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIifSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiPSIgIithKyIgIixjPTAsZD10aGlzLmxlbmd0aDtmb3IoO2M8ZDtjKyspaWYodGhpc1tjXS5ub2RlVHlwZT09PTEmJigiICIrdGhpc1tjXS5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKG8sIiAiKS5pbmRleE9mKGIpPi0xKXJldHVybiEwO3JldHVybiExfSx2YWw6ZnVuY3Rpb24oYSl7dmFyIGMsZCxlLGc9dGhpc1swXTt7aWYoISFhcmd1bWVudHMubGVuZ3RoKXtlPWYuaXNGdW5jdGlvbihhKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGQpe3ZhciBnPWYodGhpcyksaDtpZih0aGlzLm5vZGVUeXBlPT09MSl7ZT9oPWEuY2FsbCh0aGlzLGQsZy52YWwoKSk6aD1hLGg9PW51bGw/aD0iIjp0eXBlb2YgaD09Im51bWJlciI/aCs9IiI6Zi5pc0FycmF5KGgpJiYoaD1mLm1hcChoLGZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOmErIiJ9KSksYz1mLnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV18fGYudmFsSG9va3NbdGhpcy50eXBlXTtpZighY3x8ISgic2V0ImluIGMpfHxjLnNldCh0aGlzLGgsInZhbHVlIik9PT1iKXRoaXMudmFsdWU9aH19KX1pZihnKXtjPWYudmFsSG9va3NbZy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXXx8Zi52YWxIb29rc1tnLnR5cGVdO2lmKGMmJiJnZXQiaW4gYyYmKGQ9Yy5nZXQoZywidmFsdWUiKSkhPT1iKXJldHVybiBkO2Q9Zy52YWx1ZTtyZXR1cm4gdHlwZW9mIGQ9PSJzdHJpbmciP2QucmVwbGFjZShxLCIiKTpkPT1udWxsPyIiOmR9fX19KSxmLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEuYXR0cmlidXRlcy52YWx1ZTtyZXR1cm4hYnx8Yi5zcGVjaWZpZWQ/YS52YWx1ZTphLnRleHR9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxnPWEuc2VsZWN0ZWRJbmRleCxoPVtdLGk9YS5vcHRpb25zLGo9YS50eXBlPT09InNlbGVjdC1vbmUiO2lmKGc8MClyZXR1cm4gbnVsbDtjPWo/ZzowLGQ9aj9nKzE6aS5sZW5ndGg7Zm9yKDtjPGQ7YysrKXtlPWlbY107aWYoZS5zZWxlY3RlZCYmKGYuc3VwcG9ydC5vcHREaXNhYmxlZD8hZS5kaXNhYmxlZDplLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKT09PW51bGwpJiYoIWUucGFyZW50Tm9kZS5kaXNhYmxlZHx8IWYubm9kZU5hbWUoZS5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7Yj1mKGUpLnZhbCgpO2lmKGopcmV0dXJuIGI7aC5wdXNoKGIpfX1pZihqJiYhaC5sZW5ndGgmJmkubGVuZ3RoKXJldHVybiBmKGlbZ10pLnZhbCgpO3JldHVybiBofSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1mLm1ha2VBcnJheShiKTtmKGEpLmZpbmQoIm9wdGlvbiIpLmVhY2goZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkPWYuaW5BcnJheShmKHRoaXMpLnZhbCgpLGMpPj0wfSksYy5sZW5ndGh8fChhLnNlbGVjdGVkSW5kZXg9LTEpO3JldHVybiBjfX19LGF0dHJGbjp7dmFsOiEwLGNzczohMCxodG1sOiEwLHRleHQ6ITAsZGF0YTohMCx3aWR0aDohMCxoZWlnaHQ6ITAsb2Zmc2V0OiEwfSxhdHRyOmZ1bmN0aW9uKGEsYyxkLGUpe3ZhciBnLGgsaSxqPWEubm9kZVR5cGU7aWYoISFhJiZqIT09MyYmaiE9PTgmJmohPT0yKXtpZihlJiZjIGluIGYuYXR0ckZuKXJldHVybiBmKGEpW2NdKGQpO2lmKHR5cGVvZiBhLmdldEF0dHJpYnV0ZT09InVuZGVmaW5lZCIpcmV0dXJuIGYucHJvcChhLGMsZCk7aT1qIT09MXx8IWYuaXNYTUxEb2MoYSksaSYmKGM9Yy50b0xvd2VyQ2FzZSgpLGg9Zi5hdHRySG9va3NbY118fCh1LnRlc3QoYyk/eDp3KSk7aWYoZCE9PWIpe2lmKGQ9PT1udWxsKXtmLnJlbW92ZUF0dHIoYSxjKTtyZXR1cm59aWYoaCYmInNldCJpbiBoJiZpJiYoZz1oLnNldChhLGQsYykpIT09YilyZXR1cm4gZzthLnNldEF0dHJpYnV0ZShjLCIiK2QpO3JldHVybiBkfWlmKGgmJiJnZXQiaW4gaCYmaSYmKGc9aC5nZXQoYSxjKSkhPT1udWxsKXJldHVybiBnO2c9YS5nZXRBdHRyaWJ1dGUoYyk7cmV0dXJuIGc9PT1udWxsP2I6Z319LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZyxoPTA7aWYoYiYmYS5ub2RlVHlwZT09PTEpe2Q9Yi50b0xvd2VyQ2FzZSgpLnNwbGl0KHApLGc9ZC5sZW5ndGg7Zm9yKDtoPGc7aCsrKWU9ZFtoXSxlJiYoYz1mLnByb3BGaXhbZV18fGUsZi5hdHRyKGEsZSwiIiksYS5yZW1vdmVBdHRyaWJ1dGUodj9lOmMpLHUudGVzdChlKSYmYyBpbiBhJiYoYVtjXT0hMSkpfX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oYSxiKXtpZihyLnRlc3QoYS5ub2RlTmFtZSkmJmEucGFyZW50Tm9kZSlmLmVycm9yKCJ0eXBlIHByb3BlcnR5IGNhbid0IGJlIGNoYW5nZWQiKTtlbHNlIGlmKCFmLnN1cHBvcnQucmFkaW9WYWx1ZSYmYj09PSJyYWRpbyImJmYubm9kZU5hbWUoYSwiaW5wdXQiKSl7dmFyIGM9YS52YWx1ZTthLnNldEF0dHJpYnV0ZSgidHlwZSIsYiksYyYmKGEudmFsdWU9Yyk7cmV0dXJuIGJ9fX0sdmFsdWU6e2dldDpmdW5jdGlvbihhLGIpe2lmKHcmJmYubm9kZU5hbWUoYSwiYnV0dG9uIikpcmV0dXJuIHcuZ2V0KGEsYik7cmV0dXJuIGIgaW4gYT9hLnZhbHVlOm51bGx9LHNldDpmdW5jdGlvbihhLGIsYyl7aWYodyYmZi5ub2RlTmFtZShhLCJidXR0b24iKSlyZXR1cm4gdy5zZXQoYSxiLGMpO2EudmFsdWU9Yn19fSxwcm9wRml4Ont0YWJpbmRleDoidGFiSW5kZXgiLHJlYWRvbmx5OiJyZWFkT25seSIsImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSIsbWF4bGVuZ3RoOiJtYXhMZW5ndGgiLGNlbGxzcGFjaW5nOiJjZWxsU3BhY2luZyIsY2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixyb3dzcGFuOiJyb3dTcGFuIixjb2xzcGFuOiJjb2xTcGFuIix1c2VtYXA6InVzZU1hcCIsZnJhbWVib3JkZXI6ImZyYW1lQm9yZGVyIixjb250ZW50ZWRpdGFibGU6ImNvbnRlbnRFZGl0YWJsZSJ9LHByb3A6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlLGcsaCxpPWEubm9kZVR5cGU7aWYoISFhJiZpIT09MyYmaSE9PTgmJmkhPT0yKXtoPWkhPT0xfHwhZi5pc1hNTERvYyhhKSxoJiYoYz1mLnByb3BGaXhbY118fGMsZz1mLnByb3BIb29rc1tjXSk7cmV0dXJuIGQhPT1iP2cmJiJzZXQiaW4gZyYmKGU9Zy5zZXQoYSxkLGMpKSE9PWI/ZTphW2NdPWQ6ZyYmImdldCJpbiBnJiYoZT1nLmdldChhLGMpKSE9PW51bGw/ZTphW2NdfX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBjPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKTtyZXR1cm4gYyYmYy5zcGVjaWZpZWQ/cGFyc2VJbnQoYy52YWx1ZSwxMCk6cy50ZXN0KGEubm9kZU5hbWUpfHx0LnRlc3QoYS5ub2RlTmFtZSkmJmEuaHJlZj8wOmJ9fX19KSxmLmF0dHJIb29rcy50YWJpbmRleD1mLnByb3BIb29rcy50YWJJbmRleCx4PXtnZXQ6ZnVuY3Rpb24oYSxjKXt2YXIgZCxlPWYucHJvcChhLGMpO3JldHVybiBlPT09ITB8fHR5cGVvZiBlIT0iYm9vbGVhbiImJihkPWEuZ2V0QXR0cmlidXRlTm9kZShjKSkmJmQubm9kZVZhbHVlIT09ITE/Yy50b0xvd2VyQ2FzZSgpOmJ9LHNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7Yj09PSExP2YucmVtb3ZlQXR0cihhLGMpOihkPWYucHJvcEZpeFtjXXx8YyxkIGluIGEmJihhW2RdPSEwKSxhLnNldEF0dHJpYnV0ZShjLGMudG9Mb3dlckNhc2UoKSkpO3JldHVybiBjfX0sdnx8KHk9e25hbWU6ITAsaWQ6ITB9LHc9Zi52YWxIb29rcy5idXR0b249e2dldDpmdW5jdGlvbihhLGMpe3ZhciBkO2Q9YS5nZXRBdHRyaWJ1dGVOb2RlKGMpO3JldHVybiBkJiYoeVtjXT9kLm5vZGVWYWx1ZSE9PSIiOmQuc3BlY2lmaWVkKT9kLm5vZGVWYWx1ZTpifSxzZXQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPWEuZ2V0QXR0cmlidXRlTm9kZShkKTtlfHwoZT1jLmNyZWF0ZUF0dHJpYnV0ZShkKSxhLnNldEF0dHJpYnV0ZU5vZGUoZSkpO3JldHVybiBlLm5vZGVWYWx1ZT1iKyIifX0sZi5hdHRySG9va3MudGFiaW5kZXguc2V0PXcuc2V0LGYuZWFjaChbIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24oYSxiKXtmLmF0dHJIb29rc1tiXT1mLmV4dGVuZChmLmF0dHJIb29rc1tiXSx7c2V0OmZ1bmN0aW9uKGEsYyl7aWYoYz09PSIiKXthLnNldEF0dHJpYnV0ZShiLCJhdXRvIik7cmV0dXJuIGN9fX0pfSksZi5hdHRySG9va3MuY29udGVudGVkaXRhYmxlPXtnZXQ6dy5nZXQsc2V0OmZ1bmN0aW9uKGEsYixjKXtiPT09IiImJihiPSJmYWxzZSIpLHcuc2V0KGEsYixjKX19KSxmLnN1cHBvcnQuaHJlZk5vcm1hbGl6ZWR8fGYuZWFjaChbImhyZWYiLCJzcmMiLCJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYyl7Zi5hdHRySG9va3NbY109Zi5leHRlbmQoZi5hdHRySG9va3NbY10se2dldDpmdW5jdGlvbihhKXt2YXIgZD1hLmdldEF0dHJpYnV0ZShjLDIpO3JldHVybiBkPT09bnVsbD9iOmR9fSl9KSxmLnN1cHBvcnQuc3R5bGV8fChmLmF0dHJIb29rcy5zdHlsZT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLnN0eWxlLmNzc1RleHQudG9Mb3dlckNhc2UoKXx8Yn0sc2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dD0iIitifX0pLGYuc3VwcG9ydC5vcHRTZWxlY3RlZHx8KGYucHJvcEhvb2tzLnNlbGVjdGVkPWYuZXh0ZW5kKGYucHJvcEhvb2tzLnNlbGVjdGVkLHtnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO2ImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCk7cmV0dXJuIG51bGx9fSkpLGYuc3VwcG9ydC5lbmN0eXBlfHwoZi5wcm9wRml4LmVuY3R5cGU9ImVuY29kaW5nIiksZi5zdXBwb3J0LmNoZWNrT258fGYuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe2YudmFsSG9va3NbdGhpc109e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInZhbHVlIik9PT1udWxsPyJvbiI6YS52YWx1ZX19fSksZi5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7Zi52YWxIb29rc1t0aGlzXT1mLmV4dGVuZChmLnZhbEhvb2tzW3RoaXNdLHtzZXQ6ZnVuY3Rpb24oYSxiKXtpZihmLmlzQXJyYXkoYikpcmV0dXJuIGEuY2hlY2tlZD1mLmluQXJyYXkoZihhKS52YWwoKSxiKT49MH19KX0pO3ZhciB6PS9eKD86dGV4dGFyZWF8aW5wdXR8c2VsZWN0KSQvaSxBPS9eKFteXC5dKik/KD86XC4oLispKT8kLyxCPS9cYmhvdmVyKFwuXFMrKT9cYi8sQz0vXmtleS8sRD0vXig/Om1vdXNlfGNvbnRleHRtZW51KXxjbGljay8sRT0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sRj0vXihcdyopKD86IyhbXHdcLV0rKSk/KD86XC4oW1x3XC1dKykpPyQvLEc9ZnVuY3Rpb24oYSl7dmFyIGI9Ri5leGVjKGEpO2ImJihiWzFdPShiWzFdfHwiIikudG9Mb3dlckNhc2UoKSxiWzNdPWJbM10mJm5ldyBSZWdFeHAoIig/Ol58XFxzKSIrYlszXSsiKD86XFxzfCQpIikpO3JldHVybiBifSxIPWZ1bmN0aW9uKGEsYil7dmFyIGM9YS5hdHRyaWJ1dGVzfHx7fTtyZXR1cm4oIWJbMV18fGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWJbMV0pJiYoIWJbMl18fChjLmlkfHx7fSkudmFsdWU9PT1iWzJdKSYmKCFiWzNdfHxiWzNdLnRlc3QoKGNbImNsYXNzIl18fHt9KS52YWx1ZSkpfSxJPWZ1bmN0aW9uKGEpe3JldHVybiBmLmV2ZW50LnNwZWNpYWwuaG92ZXI/YTphLnJlcGxhY2UoQiwibW91c2VlbnRlciQxIG1vdXNlbGVhdmUkMSIpfTsKZi5ldmVudD17YWRkOmZ1bmN0aW9uKGEsYyxkLGUsZyl7dmFyIGgsaSxqLGssbCxtLG4sbyxwLHEscixzO2lmKCEoYS5ub2RlVHlwZT09PTN8fGEubm9kZVR5cGU9PT04fHwhY3x8IWR8fCEoaD1mLl9kYXRhKGEpKSkpe2QuaGFuZGxlciYmKHA9ZCxkPXAuaGFuZGxlciksZC5ndWlkfHwoZC5ndWlkPWYuZ3VpZCsrKSxqPWguZXZlbnRzLGp8fChoLmV2ZW50cz1qPXt9KSxpPWguaGFuZGxlLGl8fChoLmhhbmRsZT1pPWZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgZiE9InVuZGVmaW5lZCImJighYXx8Zi5ldmVudC50cmlnZ2VyZWQhPT1hLnR5cGUpP2YuZXZlbnQuZGlzcGF0Y2guYXBwbHkoaS5lbGVtLGFyZ3VtZW50cyk6Yn0saS5lbGVtPWEpLGM9Zi50cmltKEkoYykpLnNwbGl0KCIgIik7Zm9yKGs9MDtrPGMubGVuZ3RoO2srKyl7bD1BLmV4ZWMoY1trXSl8fFtdLG09bFsxXSxuPShsWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCkscz1mLmV2ZW50LnNwZWNpYWxbbV18fHt9LG09KGc/cy5kZWxlZ2F0ZVR5cGU6cy5iaW5kVHlwZSl8fG0scz1mLmV2ZW50LnNwZWNpYWxbbV18fHt9LG89Zi5leHRlbmQoe3R5cGU6bSxvcmlnVHlwZTpsWzFdLGRhdGE6ZSxoYW5kbGVyOmQsZ3VpZDpkLmd1aWQsc2VsZWN0b3I6ZyxxdWljazpHKGcpLG5hbWVzcGFjZTpuLmpvaW4oIi4iKX0scCkscj1qW21dO2lmKCFyKXtyPWpbbV09W10sci5kZWxlZ2F0ZUNvdW50PTA7aWYoIXMuc2V0dXB8fHMuc2V0dXAuY2FsbChhLGUsbixpKT09PSExKWEuYWRkRXZlbnRMaXN0ZW5lcj9hLmFkZEV2ZW50TGlzdGVuZXIobSxpLCExKTphLmF0dGFjaEV2ZW50JiZhLmF0dGFjaEV2ZW50KCJvbiIrbSxpKX1zLmFkZCYmKHMuYWRkLmNhbGwoYSxvKSxvLmhhbmRsZXIuZ3VpZHx8KG8uaGFuZGxlci5ndWlkPWQuZ3VpZCkpLGc/ci5zcGxpY2Uoci5kZWxlZ2F0ZUNvdW50KyssMCxvKTpyLnB1c2gobyksZi5ldmVudC5nbG9iYWxbbV09ITB9YT1udWxsfX0sZ2xvYmFsOnt9LHJlbW92ZTpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBnPWYuaGFzRGF0YShhKSYmZi5fZGF0YShhKSxoLGksaixrLGwsbSxuLG8scCxxLHIscztpZighIWcmJiEhKG89Zy5ldmVudHMpKXtiPWYudHJpbShJKGJ8fCIiKSkuc3BsaXQoIiAiKTtmb3IoaD0wO2g8Yi5sZW5ndGg7aCsrKXtpPUEuZXhlYyhiW2hdKXx8W10saj1rPWlbMV0sbD1pWzJdO2lmKCFqKXtmb3IoaiBpbiBvKWYuZXZlbnQucmVtb3ZlKGEsaitiW2hdLGMsZCwhMCk7Y29udGludWV9cD1mLmV2ZW50LnNwZWNpYWxbal18fHt9LGo9KGQ/cC5kZWxlZ2F0ZVR5cGU6cC5iaW5kVHlwZSl8fGoscj1vW2pdfHxbXSxtPXIubGVuZ3RoLGw9bD9uZXcgUmVnRXhwKCIoXnxcXC4pIitsLnNwbGl0KCIuIikuc29ydCgpLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSsiKFxcLnwkKSIpOm51bGw7Zm9yKG49MDtuPHIubGVuZ3RoO24rKylzPXJbbl0sKGV8fGs9PT1zLm9yaWdUeXBlKSYmKCFjfHxjLmd1aWQ9PT1zLmd1aWQpJiYoIWx8fGwudGVzdChzLm5hbWVzcGFjZSkpJiYoIWR8fGQ9PT1zLnNlbGVjdG9yfHxkPT09IioqIiYmcy5zZWxlY3RvcikmJihyLnNwbGljZShuLS0sMSkscy5zZWxlY3RvciYmci5kZWxlZ2F0ZUNvdW50LS0scC5yZW1vdmUmJnAucmVtb3ZlLmNhbGwoYSxzKSk7ci5sZW5ndGg9PT0wJiZtIT09ci5sZW5ndGgmJigoIXAudGVhcmRvd258fHAudGVhcmRvd24uY2FsbChhLGwpPT09ITEpJiZmLnJlbW92ZUV2ZW50KGEsaixnLmhhbmRsZSksZGVsZXRlIG9bal0pfWYuaXNFbXB0eU9iamVjdChvKSYmKHE9Zy5oYW5kbGUscSYmKHEuZWxlbT1udWxsKSxmLnJlbW92ZURhdGEoYSxbImV2ZW50cyIsImhhbmRsZSJdLCEwKSl9fSxjdXN0b21FdmVudDp7Z2V0RGF0YTohMCxzZXREYXRhOiEwLGNoYW5nZURhdGE6ITB9LHRyaWdnZXI6ZnVuY3Rpb24oYyxkLGUsZyl7aWYoIWV8fGUubm9kZVR5cGUhPT0zJiZlLm5vZGVUeXBlIT09OCl7dmFyIGg9Yy50eXBlfHxjLGk9W10saixrLGwsbSxuLG8scCxxLHIscztpZihFLnRlc3QoaCtmLmV2ZW50LnRyaWdnZXJlZCkpcmV0dXJuO2guaW5kZXhPZigiISIpPj0wJiYoaD1oLnNsaWNlKDAsLTEpLGs9ITApLGguaW5kZXhPZigiLiIpPj0wJiYoaT1oLnNwbGl0KCIuIiksaD1pLnNoaWZ0KCksaS5zb3J0KCkpO2lmKCghZXx8Zi5ldmVudC5jdXN0b21FdmVudFtoXSkmJiFmLmV2ZW50Lmdsb2JhbFtoXSlyZXR1cm47Yz10eXBlb2YgYz09Im9iamVjdCI/Y1tmLmV4cGFuZG9dP2M6bmV3IGYuRXZlbnQoaCxjKTpuZXcgZi5FdmVudChoKSxjLnR5cGU9aCxjLmlzVHJpZ2dlcj0hMCxjLmV4Y2x1c2l2ZT1rLGMubmFtZXNwYWNlPWkuam9pbigiLiIpLGMubmFtZXNwYWNlX3JlPWMubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK2kuam9pbigiXFwuKD86LipcXC4pPyIpKyIoXFwufCQpIik6bnVsbCxvPWguaW5kZXhPZigiOiIpPDA/Im9uIitoOiIiO2lmKCFlKXtqPWYuY2FjaGU7Zm9yKGwgaW4gailqW2xdLmV2ZW50cyYmaltsXS5ldmVudHNbaF0mJmYuZXZlbnQudHJpZ2dlcihjLGQsaltsXS5oYW5kbGUuZWxlbSwhMCk7cmV0dXJufWMucmVzdWx0PWIsYy50YXJnZXR8fChjLnRhcmdldD1lKSxkPWQhPW51bGw/Zi5tYWtlQXJyYXkoZCk6W10sZC51bnNoaWZ0KGMpLHA9Zi5ldmVudC5zcGVjaWFsW2hdfHx7fTtpZihwLnRyaWdnZXImJnAudHJpZ2dlci5hcHBseShlLGQpPT09ITEpcmV0dXJuO3I9W1tlLHAuYmluZFR5cGV8fGhdXTtpZighZyYmIXAubm9CdWJibGUmJiFmLmlzV2luZG93KGUpKXtzPXAuZGVsZWdhdGVUeXBlfHxoLG09RS50ZXN0KHMraCk/ZTplLnBhcmVudE5vZGUsbj1udWxsO2Zvcig7bTttPW0ucGFyZW50Tm9kZSlyLnB1c2goW20sc10pLG49bTtuJiZuPT09ZS5vd25lckRvY3VtZW50JiZyLnB1c2goW24uZGVmYXVsdFZpZXd8fG4ucGFyZW50V2luZG93fHxhLHNdKX1mb3IobD0wO2w8ci5sZW5ndGgmJiFjLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7bCsrKW09cltsXVswXSxjLnR5cGU9cltsXVsxXSxxPShmLl9kYXRhKG0sImV2ZW50cyIpfHx7fSlbYy50eXBlXSYmZi5fZGF0YShtLCJoYW5kbGUiKSxxJiZxLmFwcGx5KG0sZCkscT1vJiZtW29dLHEmJmYuYWNjZXB0RGF0YShtKSYmcS5hcHBseShtLGQpPT09ITEmJmMucHJldmVudERlZmF1bHQoKTtjLnR5cGU9aCwhZyYmIWMuaXNEZWZhdWx0UHJldmVudGVkKCkmJighcC5fZGVmYXVsdHx8cC5fZGVmYXVsdC5hcHBseShlLm93bmVyRG9jdW1lbnQsZCk9PT0hMSkmJihoIT09ImNsaWNrInx8IWYubm9kZU5hbWUoZSwiYSIpKSYmZi5hY2NlcHREYXRhKGUpJiZvJiZlW2hdJiYoaCE9PSJmb2N1cyImJmghPT0iYmx1ciJ8fGMudGFyZ2V0Lm9mZnNldFdpZHRoIT09MCkmJiFmLmlzV2luZG93KGUpJiYobj1lW29dLG4mJihlW29dPW51bGwpLGYuZXZlbnQudHJpZ2dlcmVkPWgsZVtoXSgpLGYuZXZlbnQudHJpZ2dlcmVkPWIsbiYmKGVbb109bikpO3JldHVybiBjLnJlc3VsdH19LGRpc3BhdGNoOmZ1bmN0aW9uKGMpe2M9Zi5ldmVudC5maXgoY3x8YS5ldmVudCk7dmFyIGQ9KGYuX2RhdGEodGhpcywiZXZlbnRzIil8fHt9KVtjLnR5cGVdfHxbXSxlPWQuZGVsZWdhdGVDb3VudCxnPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLGg9IWMuZXhjbHVzaXZlJiYhYy5uYW1lc3BhY2UsaT1bXSxqLGssbCxtLG4sbyxwLHEscixzLHQ7Z1swXT1jLGMuZGVsZWdhdGVUYXJnZXQ9dGhpcztpZihlJiYhYy50YXJnZXQuZGlzYWJsZWQmJighYy5idXR0b258fGMudHlwZSE9PSJjbGljayIpKXttPWYodGhpcyksbS5jb250ZXh0PXRoaXMub3duZXJEb2N1bWVudHx8dGhpcztmb3IobD1jLnRhcmdldDtsIT10aGlzO2w9bC5wYXJlbnROb2RlfHx0aGlzKXtvPXt9LHE9W10sbVswXT1sO2ZvcihqPTA7ajxlO2orKylyPWRbal0scz1yLnNlbGVjdG9yLG9bc109PT1iJiYob1tzXT1yLnF1aWNrP0gobCxyLnF1aWNrKTptLmlzKHMpKSxvW3NdJiZxLnB1c2gocik7cS5sZW5ndGgmJmkucHVzaCh7ZWxlbTpsLG1hdGNoZXM6cX0pfX1kLmxlbmd0aD5lJiZpLnB1c2goe2VsZW06dGhpcyxtYXRjaGVzOmQuc2xpY2UoZSl9KTtmb3Ioaj0wO2o8aS5sZW5ndGgmJiFjLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7aisrKXtwPWlbal0sYy5jdXJyZW50VGFyZ2V0PXAuZWxlbTtmb3Ioaz0wO2s8cC5tYXRjaGVzLmxlbmd0aCYmIWMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKTtrKyspe3I9cC5tYXRjaGVzW2tdO2lmKGh8fCFjLm5hbWVzcGFjZSYmIXIubmFtZXNwYWNlfHxjLm5hbWVzcGFjZV9yZSYmYy5uYW1lc3BhY2VfcmUudGVzdChyLm5hbWVzcGFjZSkpYy5kYXRhPXIuZGF0YSxjLmhhbmRsZU9iaj1yLG49KChmLmV2ZW50LnNwZWNpYWxbci5vcmlnVHlwZV18fHt9KS5oYW5kbGV8fHIuaGFuZGxlcikuYXBwbHkocC5lbGVtLGcpLG4hPT1iJiYoYy5yZXN1bHQ9bixuPT09ITEmJihjLnByZXZlbnREZWZhdWx0KCksYy5zdG9wUHJvcGFnYXRpb24oKSkpfX1yZXR1cm4gYy5yZXN1bHR9LHByb3BzOiJhdHRyQ2hhbmdlIGF0dHJOYW1lIHJlbGF0ZWROb2RlIHNyY0VsZW1lbnQgYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntwcm9wczoiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXthLndoaWNoPT1udWxsJiYoYS53aGljaD1iLmNoYXJDb2RlIT1udWxsP2IuY2hhckNvZGU6Yi5rZXlDb2RlKTtyZXR1cm4gYX19LG1vdXNlSG9va3M6e3Byb3BzOiJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsZCl7dmFyIGUsZixnLGg9ZC5idXR0b24saT1kLmZyb21FbGVtZW50O2EucGFnZVg9PW51bGwmJmQuY2xpZW50WCE9bnVsbCYmKGU9YS50YXJnZXQub3duZXJEb2N1bWVudHx8YyxmPWUuZG9jdW1lbnRFbGVtZW50LGc9ZS5ib2R5LGEucGFnZVg9ZC5jbGllbnRYKyhmJiZmLnNjcm9sbExlZnR8fGcmJmcuc2Nyb2xsTGVmdHx8MCktKGYmJmYuY2xpZW50TGVmdHx8ZyYmZy5jbGllbnRMZWZ0fHwwKSxhLnBhZ2VZPWQuY2xpZW50WSsoZiYmZi5zY3JvbGxUb3B8fGcmJmcuc2Nyb2xsVG9wfHwwKS0oZiYmZi5jbGllbnRUb3B8fGcmJmcuY2xpZW50VG9wfHwwKSksIWEucmVsYXRlZFRhcmdldCYmaSYmKGEucmVsYXRlZFRhcmdldD1pPT09YS50YXJnZXQ/ZC50b0VsZW1lbnQ6aSksIWEud2hpY2gmJmghPT1iJiYoYS53aGljaD1oJjE/MTpoJjI/MzpoJjQ/MjowKTtyZXR1cm4gYX19LGZpeDpmdW5jdGlvbihhKXtpZihhW2YuZXhwYW5kb10pcmV0dXJuIGE7dmFyIGQsZSxnPWEsaD1mLmV2ZW50LmZpeEhvb2tzW2EudHlwZV18fHt9LGk9aC5wcm9wcz90aGlzLnByb3BzLmNvbmNhdChoLnByb3BzKTp0aGlzLnByb3BzO2E9Zi5FdmVudChnKTtmb3IoZD1pLmxlbmd0aDtkOyllPWlbLS1kXSxhW2VdPWdbZV07YS50YXJnZXR8fChhLnRhcmdldD1nLnNyY0VsZW1lbnR8fGMpLGEudGFyZ2V0Lm5vZGVUeXBlPT09MyYmKGEudGFyZ2V0PWEudGFyZ2V0LnBhcmVudE5vZGUpLGEubWV0YUtleT09PWImJihhLm1ldGFLZXk9YS5jdHJsS2V5KTtyZXR1cm4gaC5maWx0ZXI/aC5maWx0ZXIoYSxnKTphfSxzcGVjaWFsOntyZWFkeTp7c2V0dXA6Zi5iaW5kUmVhZHl9LGxvYWQ6e25vQnViYmxlOiEwfSxmb2N1czp7ZGVsZWdhdGVUeXBlOiJmb2N1c2luIn0sYmx1cjp7ZGVsZWdhdGVUeXBlOiJmb2N1c291dCJ9LGJlZm9yZXVubG9hZDp7c2V0dXA6ZnVuY3Rpb24oYSxiLGMpe2YuaXNXaW5kb3codGhpcykmJih0aGlzLm9uYmVmb3JldW5sb2FkPWMpfSx0ZWFyZG93bjpmdW5jdGlvbihhLGIpe3RoaXMub25iZWZvcmV1bmxvYWQ9PT1iJiYodGhpcy5vbmJlZm9yZXVubG9hZD1udWxsKX19fSxzaW11bGF0ZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1mLmV4dGVuZChuZXcgZi5FdmVudCxjLHt0eXBlOmEsaXNTaW11bGF0ZWQ6ITAsb3JpZ2luYWxFdmVudDp7fX0pO2Q/Zi5ldmVudC50cmlnZ2VyKGUsbnVsbCxiKTpmLmV2ZW50LmRpc3BhdGNoLmNhbGwoYixlKSxlLmlzRGVmYXVsdFByZXZlbnRlZCgpJiZjLnByZXZlbnREZWZhdWx0KCl9fSxmLmV2ZW50LmhhbmRsZT1mLmV2ZW50LmRpc3BhdGNoLGYucmVtb3ZlRXZlbnQ9Yy5yZW1vdmVFdmVudExpc3RlbmVyP2Z1bmN0aW9uKGEsYixjKXthLnJlbW92ZUV2ZW50TGlzdGVuZXImJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsITEpfTpmdW5jdGlvbihhLGIsYyl7YS5kZXRhY2hFdmVudCYmYS5kZXRhY2hFdmVudCgib24iK2IsYyl9LGYuRXZlbnQ9ZnVuY3Rpb24oYSxiKXtpZighKHRoaXMgaW5zdGFuY2VvZiBmLkV2ZW50KSlyZXR1cm4gbmV3IGYuRXZlbnQoYSxiKTthJiZhLnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD1hLHRoaXMudHlwZT1hLnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9YS5kZWZhdWx0UHJldmVudGVkfHxhLnJldHVyblZhbHVlPT09ITF8fGEuZ2V0UHJldmVudERlZmF1bHQmJmEuZ2V0UHJldmVudERlZmF1bHQoKT9LOkopOnRoaXMudHlwZT1hLGImJmYuZXh0ZW5kKHRoaXMsYiksdGhpcy50aW1lU3RhbXA9YSYmYS50aW1lU3RhbXB8fGYubm93KCksdGhpc1tmLmV4cGFuZG9dPSEwfSxmLkV2ZW50LnByb3RvdHlwZT17cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1LO3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDshYXx8KGEucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITEpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPUs7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50OyFhfHwoYS5zdG9wUHJvcGFnYXRpb24mJmEuc3RvcFByb3BhZ2F0aW9uKCksYS5jYW5jZWxCdWJibGU9ITApfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPUssdGhpcy5zdG9wUHJvcGFnYXRpb24oKX0saXNEZWZhdWx0UHJldmVudGVkOkosaXNQcm9wYWdhdGlvblN0b3BwZWQ6Sixpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpKfSxmLmVhY2goe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSxmdW5jdGlvbihhLGIpe2YuZXZlbnQuc3BlY2lhbFthXT17ZGVsZWdhdGVUeXBlOmIsYmluZFR5cGU6YixoYW5kbGU6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcyxkPWEucmVsYXRlZFRhcmdldCxlPWEuaGFuZGxlT2JqLGc9ZS5zZWxlY3RvcixoO2lmKCFkfHxkIT09YyYmIWYuY29udGFpbnMoYyxkKSlhLnR5cGU9ZS5vcmlnVHlwZSxoPWUuaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksYS50eXBlPWI7cmV0dXJuIGh9fX0pLGYuc3VwcG9ydC5zdWJtaXRCdWJibGVzfHwoZi5ldmVudC5zcGVjaWFsLnN1Ym1pdD17c2V0dXA6ZnVuY3Rpb24oKXtpZihmLm5vZGVOYW1lKHRoaXMsImZvcm0iKSlyZXR1cm4hMTtmLmV2ZW50LmFkZCh0aGlzLCJjbGljay5fc3VibWl0IGtleXByZXNzLl9zdWJtaXQiLGZ1bmN0aW9uKGEpe3ZhciBjPWEudGFyZ2V0LGQ9Zi5ub2RlTmFtZShjLCJpbnB1dCIpfHxmLm5vZGVOYW1lKGMsImJ1dHRvbiIpP2MuZm9ybTpiO2QmJiFkLl9zdWJtaXRfYXR0YWNoZWQmJihmLmV2ZW50LmFkZChkLCJzdWJtaXQuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiYhYS5pc1RyaWdnZXImJmYuZXZlbnQuc2ltdWxhdGUoInN1Ym1pdCIsdGhpcy5wYXJlbnROb2RlLGEsITApfSksZC5fc3VibWl0X2F0dGFjaGVkPSEwKX0pfSx0ZWFyZG93bjpmdW5jdGlvbigpe2lmKGYubm9kZU5hbWUodGhpcywiZm9ybSIpKXJldHVybiExO2YuZXZlbnQucmVtb3ZlKHRoaXMsIi5fc3VibWl0Iil9fSksZi5zdXBwb3J0LmNoYW5nZUJ1YmJsZXN8fChmLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtzZXR1cDpmdW5jdGlvbigpe2lmKHoudGVzdCh0aGlzLm5vZGVOYW1lKSl7aWYodGhpcy50eXBlPT09ImNoZWNrYm94Inx8dGhpcy50eXBlPT09InJhZGlvIilmLmV2ZW50LmFkZCh0aGlzLCJwcm9wZXJ0eWNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXthLm9yaWdpbmFsRXZlbnQucHJvcGVydHlOYW1lPT09ImNoZWNrZWQiJiYodGhpcy5fanVzdF9jaGFuZ2VkPSEwKX0pLGYuZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpe3RoaXMuX2p1c3RfY2hhbmdlZCYmIWEuaXNUcmlnZ2VyJiYodGhpcy5fanVzdF9jaGFuZ2VkPSExLGYuZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcyxhLCEwKSl9KTtyZXR1cm4hMX1mLmV2ZW50LmFkZCh0aGlzLCJiZWZvcmVhY3RpdmF0ZS5fY2hhbmdlIixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDt6LnRlc3QoYi5ub2RlTmFtZSkmJiFiLl9jaGFuZ2VfYXR0YWNoZWQmJihmLmV2ZW50LmFkZChiLCJjaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiYhYS5pc1NpbXVsYXRlZCYmIWEuaXNUcmlnZ2VyJiZmLmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMucGFyZW50Tm9kZSxhLCEwKX0pLGIuX2NoYW5nZV9hdHRhY2hlZD0hMCl9KX0saGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0O2lmKHRoaXMhPT1ifHxhLmlzU2ltdWxhdGVkfHxhLmlzVHJpZ2dlcnx8Yi50eXBlIT09InJhZGlvIiYmYi50eXBlIT09ImNoZWNrYm94IilyZXR1cm4gYS5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7Zi5ldmVudC5yZW1vdmUodGhpcywiLl9jaGFuZ2UiKTtyZXR1cm4gei50ZXN0KHRoaXMubm9kZU5hbWUpfX0pLGYuc3VwcG9ydC5mb2N1c2luQnViYmxlc3x8Zi5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe3ZhciBkPTAsZT1mdW5jdGlvbihhKXtmLmV2ZW50LnNpbXVsYXRlKGIsYS50YXJnZXQsZi5ldmVudC5maXgoYSksITApfTtmLmV2ZW50LnNwZWNpYWxbYl09e3NldHVwOmZ1bmN0aW9uKCl7ZCsrPT09MCYmYy5hZGRFdmVudExpc3RlbmVyKGEsZSwhMCl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7LS1kPT09MCYmYy5yZW1vdmVFdmVudExpc3RlbmVyKGEsZSwhMCl9fX0pLGYuZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihhLGMsZCxlLGcpe3ZhciBoLGk7aWYodHlwZW9mIGE9PSJvYmplY3QiKXt0eXBlb2YgYyE9InN0cmluZyImJihkPWMsYz1iKTtmb3IoaSBpbiBhKXRoaXMub24oaSxjLGQsYVtpXSxnKTtyZXR1cm4gdGhpc31kPT1udWxsJiZlPT1udWxsPyhlPWMsZD1jPWIpOmU9PW51bGwmJih0eXBlb2YgYz09InN0cmluZyI/KGU9ZCxkPWIpOihlPWQsZD1jLGM9YikpO2lmKGU9PT0hMSllPUo7ZWxzZSBpZighZSlyZXR1cm4gdGhpcztnPT09MSYmKGg9ZSxlPWZ1bmN0aW9uKGEpe2YoKS5vZmYoYSk7cmV0dXJuIGguYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLmd1aWQ9aC5ndWlkfHwoaC5ndWlkPWYuZ3VpZCsrKSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YuZXZlbnQuYWRkKHRoaXMsYSxlLGQsYyl9KX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uLmNhbGwodGhpcyxhLGIsYyxkLDEpfSxvZmY6ZnVuY3Rpb24oYSxjLGQpe2lmKGEmJmEucHJldmVudERlZmF1bHQmJmEuaGFuZGxlT2JqKXt2YXIgZT1hLmhhbmRsZU9iajtmKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihlLm5hbWVzcGFjZT9lLnR5cGUrIi4iK2UubmFtZXNwYWNlOmUudHlwZSxlLnNlbGVjdG9yLGUuaGFuZGxlcik7cmV0dXJuIHRoaXN9aWYodHlwZW9mIGE9PSJvYmplY3QiKXtmb3IodmFyIGcgaW4gYSl0aGlzLm9mZihnLGMsYVtnXSk7cmV0dXJuIHRoaXN9aWYoYz09PSExfHx0eXBlb2YgYz09ImZ1bmN0aW9uIilkPWMsYz1iO2Q9PT0hMSYmKGQ9Sik7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YuZXZlbnQucmVtb3ZlKHRoaXMsYSxkLGMpfSl9LGJpbmQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm9uKGEsbnVsbCxiLGMpfSx1bmJpbmQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5vZmYoYSxudWxsLGIpfSxsaXZlOmZ1bmN0aW9uKGEsYixjKXtmKHRoaXMuY29udGV4dCkub24oYSx0aGlzLnNlbGVjdG9yLGIsYyk7cmV0dXJuIHRoaXN9LGRpZTpmdW5jdGlvbihhLGIpe2YodGhpcy5jb250ZXh0KS5vZmYoYSx0aGlzLnNlbGVjdG9yfHwiKioiLGIpO3JldHVybiB0aGlzfSxkZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihiLGEsYyxkKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PTE/dGhpcy5vZmYoYSwiKioiKTp0aGlzLm9mZihiLGEsYyl9LHRyaWdnZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5ldmVudC50cmlnZ2VyKGEsYix0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihhLGIpe2lmKHRoaXNbMF0pcmV0dXJuIGYuZXZlbnQudHJpZ2dlcihhLGIsdGhpc1swXSwhMCl9LHRvZ2dsZTpmdW5jdGlvbihhKXt2YXIgYj1hcmd1bWVudHMsYz1hLmd1aWR8fGYuZ3VpZCsrLGQ9MCxlPWZ1bmN0aW9uKGMpe3ZhciBlPShmLl9kYXRhKHRoaXMsImxhc3RUb2dnbGUiK2EuZ3VpZCl8fDApJWQ7Zi5fZGF0YSh0aGlzLCJsYXN0VG9nZ2xlIithLmd1aWQsZSsxKSxjLnByZXZlbnREZWZhdWx0KCk7cmV0dXJuIGJbZV0uYXBwbHkodGhpcyxhcmd1bWVudHMpfHwhMX07ZS5ndWlkPWM7d2hpbGUoZDxiLmxlbmd0aCliW2QrK10uZ3VpZD1jO3JldHVybiB0aGlzLmNsaWNrKGUpfSxob3ZlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoYSkubW91c2VsZWF2ZShifHxhKX19KSxmLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtmLmZuW2JdPWZ1bmN0aW9uKGEsYyl7Yz09bnVsbCYmKGM9YSxhPW51bGwpO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjA/dGhpcy5vbihiLG51bGwsYSxjKTp0aGlzLnRyaWdnZXIoYil9LGYuYXR0ckZuJiYoZi5hdHRyRm5bYl09ITApLEMudGVzdChiKSYmKGYuZXZlbnQuZml4SG9va3NbYl09Zi5ldmVudC5rZXlIb29rcyksRC50ZXN0KGIpJiYoZi5ldmVudC5maXhIb29rc1tiXT1mLmV2ZW50Lm1vdXNlSG9va3MpfSksZnVuY3Rpb24oKXtmdW5jdGlvbiB4KGEsYixjLGUsZixnKXtmb3IodmFyIGg9MCxpPWUubGVuZ3RoO2g8aTtoKyspe3ZhciBqPWVbaF07aWYoail7dmFyIGs9ITE7aj1qW2FdO3doaWxlKGope2lmKGpbZF09PT1jKXtrPWVbai5zaXpzZXRdO2JyZWFrfWlmKGoubm9kZVR5cGU9PT0xKXtnfHwoaltkXT1jLGouc2l6c2V0PWgpO2lmKHR5cGVvZiBiIT0ic3RyaW5nIil7aWYoaj09PWIpe2s9ITA7YnJlYWt9fWVsc2UgaWYobS5maWx0ZXIoYixbal0pLmxlbmd0aD4wKXtrPWo7YnJlYWt9fWo9althXX1lW2hdPWt9fX1mdW5jdGlvbiB3KGEsYixjLGUsZixnKXtmb3IodmFyIGg9MCxpPWUubGVuZ3RoO2g8aTtoKyspe3ZhciBqPWVbaF07aWYoail7dmFyIGs9ITE7aj1qW2FdO3doaWxlKGope2lmKGpbZF09PT1jKXtrPWVbai5zaXpzZXRdO2JyZWFrfWoubm9kZVR5cGU9PT0xJiYhZyYmKGpbZF09YyxqLnNpenNldD1oKTtpZihqLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iKXtrPWo7YnJlYWt9aj1qW2FdfWVbaF09a319fXZhciBhPS8oKD86XCgoPzpcKFteKCldK1wpfFteKCldKykrXCl8XFsoPzpcW1teXFtcXV0qXF18WyciXVteJyJdKlsnIl18W15cW1xdJyJdKykrXF18XFwufFteID4rfiwoXFtcXF0rKSt8Wz4rfl0pKFxzKixccyopPygoPzoufFxyfFxuKSopL2csZD0ic2l6Y2FjaGUiKyhNYXRoLnJhbmRvbSgpKyIiKS5yZXBsYWNlKCIuIiwiIiksZT0wLGc9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxoPSExLGk9ITAsaj0vXFwvZyxrPS9cclxuL2csbD0vXFcvO1swLDBdLnNvcnQoZnVuY3Rpb24oKXtpPSExO3JldHVybiAwfSk7dmFyIG09ZnVuY3Rpb24oYixkLGUsZil7ZT1lfHxbXSxkPWR8fGM7dmFyIGg9ZDtpZihkLm5vZGVUeXBlIT09MSYmZC5ub2RlVHlwZSE9PTkpcmV0dXJuW107aWYoIWJ8fHR5cGVvZiBiIT0ic3RyaW5nIilyZXR1cm4gZTt2YXIgaSxqLGssbCxuLHEscix0LHU9ITAsdj1tLmlzWE1MKGQpLHc9W10seD1iO2Rve2EuZXhlYygiIiksaT1hLmV4ZWMoeCk7aWYoaSl7eD1pWzNdLHcucHVzaChpWzFdKTtpZihpWzJdKXtsPWlbM107YnJlYWt9fX13aGlsZShpKTtpZih3Lmxlbmd0aD4xJiZwLmV4ZWMoYikpaWYody5sZW5ndGg9PT0yJiZvLnJlbGF0aXZlW3dbMF1dKWo9eSh3WzBdK3dbMV0sZCxmKTtlbHNle2o9by5yZWxhdGl2ZVt3WzBdXT9bZF06bSh3LnNoaWZ0KCksZCk7d2hpbGUody5sZW5ndGgpYj13LnNoaWZ0KCksby5yZWxhdGl2ZVtiXSYmKGIrPXcuc2hpZnQoKSksaj15KGIsaixmKX1lbHNleyFmJiZ3Lmxlbmd0aD4xJiZkLm5vZGVUeXBlPT09OSYmIXYmJm8ubWF0Y2guSUQudGVzdCh3WzBdKSYmIW8ubWF0Y2guSUQudGVzdCh3W3cubGVuZ3RoLTFdKSYmKG49bS5maW5kKHcuc2hpZnQoKSxkLHYpLGQ9bi5leHByP20uZmlsdGVyKG4uZXhwcixuLnNldClbMF06bi5zZXRbMF0pO2lmKGQpe249Zj97ZXhwcjp3LnBvcCgpLHNldDpzKGYpfTptLmZpbmQody5wb3AoKSx3Lmxlbmd0aD09PTEmJih3WzBdPT09In4ifHx3WzBdPT09IisiKSYmZC5wYXJlbnROb2RlP2QucGFyZW50Tm9kZTpkLHYpLGo9bi5leHByP20uZmlsdGVyKG4uZXhwcixuLnNldCk6bi5zZXQsdy5sZW5ndGg+MD9rPXMoaik6dT0hMTt3aGlsZSh3Lmxlbmd0aClxPXcucG9wKCkscj1xLG8ucmVsYXRpdmVbcV0/cj13LnBvcCgpOnE9IiIscj09bnVsbCYmKHI9ZCksby5yZWxhdGl2ZVtxXShrLHIsdil9ZWxzZSBrPXc9W119a3x8KGs9aiksa3x8bS5lcnJvcihxfHxiKTtpZihnLmNhbGwoayk9PT0iW29iamVjdCBBcnJheV0iKWlmKCF1KWUucHVzaC5hcHBseShlLGspO2Vsc2UgaWYoZCYmZC5ub2RlVHlwZT09PTEpZm9yKHQ9MDtrW3RdIT1udWxsO3QrKylrW3RdJiYoa1t0XT09PSEwfHxrW3RdLm5vZGVUeXBlPT09MSYmbS5jb250YWlucyhkLGtbdF0pKSYmZS5wdXNoKGpbdF0pO2Vsc2UgZm9yKHQ9MDtrW3RdIT1udWxsO3QrKylrW3RdJiZrW3RdLm5vZGVUeXBlPT09MSYmZS5wdXNoKGpbdF0pO2Vsc2UgcyhrLGUpO2wmJihtKGwsaCxlLGYpLG0udW5pcXVlU29ydChlKSk7cmV0dXJuIGV9O20udW5pcXVlU29ydD1mdW5jdGlvbihhKXtpZih1KXtoPWksYS5zb3J0KHUpO2lmKGgpZm9yKHZhciBiPTE7YjxhLmxlbmd0aDtiKyspYVtiXT09PWFbYi0xXSYmYS5zcGxpY2UoYi0tLDEpfXJldHVybiBhfSxtLm1hdGNoZXM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbShhLG51bGwsbnVsbCxiKX0sbS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbShiLG51bGwsbnVsbCxbYV0pLmxlbmd0aD4wfSxtLmZpbmQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsaTtpZighYSlyZXR1cm5bXTtmb3IoZT0wLGY9by5vcmRlci5sZW5ndGg7ZTxmO2UrKyl7aD1vLm9yZGVyW2VdO2lmKGc9by5sZWZ0TWF0Y2hbaF0uZXhlYyhhKSl7aT1nWzFdLGcuc3BsaWNlKDEsMSk7aWYoaS5zdWJzdHIoaS5sZW5ndGgtMSkhPT0iXFwiKXtnWzFdPShnWzFdfHwiIikucmVwbGFjZShqLCIiKSxkPW8uZmluZFtoXShnLGIsYyk7aWYoZCE9bnVsbCl7YT1hLnJlcGxhY2Uoby5tYXRjaFtoXSwiIik7YnJlYWt9fX19ZHx8KGQ9dHlwZW9mIGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiP2IuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTpbXSk7cmV0dXJue3NldDpkLGV4cHI6YX19LG0uZmlsdGVyPWZ1bmN0aW9uKGEsYyxkLGUpe3ZhciBmLGcsaCxpLGosayxsLG4scCxxPWEscj1bXSxzPWMsdD1jJiZjWzBdJiZtLmlzWE1MKGNbMF0pO3doaWxlKGEmJmMubGVuZ3RoKXtmb3IoaCBpbiBvLmZpbHRlcilpZigoZj1vLmxlZnRNYXRjaFtoXS5leGVjKGEpKSE9bnVsbCYmZlsyXSl7az1vLmZpbHRlcltoXSxsPWZbMV0sZz0hMSxmLnNwbGljZSgxLDEpO2lmKGwuc3Vic3RyKGwubGVuZ3RoLTEpPT09IlxcIiljb250aW51ZTtzPT09ciYmKHI9W10pO2lmKG8ucHJlRmlsdGVyW2hdKXtmPW8ucHJlRmlsdGVyW2hdKGYscyxkLHIsZSx0KTtpZighZilnPWk9ITA7ZWxzZSBpZihmPT09ITApY29udGludWV9aWYoZilmb3Iobj0wOyhqPXNbbl0pIT1udWxsO24rKylqJiYoaT1rKGosZixuLHMpLHA9ZV5pLGQmJmkhPW51bGw/cD9nPSEwOnNbbl09ITE6cCYmKHIucHVzaChqKSxnPSEwKSk7aWYoaSE9PWIpe2R8fChzPXIpLGE9YS5yZXBsYWNlKG8ubWF0Y2hbaF0sIiIpO2lmKCFnKXJldHVybltdO2JyZWFrfX1pZihhPT09cSlpZihnPT1udWxsKW0uZXJyb3IoYSk7ZWxzZSBicmVhaztxPWF9cmV0dXJuIHN9LG0uZXJyb3I9ZnVuY3Rpb24oYSl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2EpfTt2YXIgbj1tLmdldFRleHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkPWEubm9kZVR5cGUsZT0iIjtpZihkKXtpZihkPT09MXx8ZD09PTkpe2lmKHR5cGVvZiBhLnRleHRDb250ZW50PT0ic3RyaW5nIilyZXR1cm4gYS50ZXh0Q29udGVudDtpZih0eXBlb2YgYS5pbm5lclRleHQ9PSJzdHJpbmciKXJldHVybiBhLmlubmVyVGV4dC5yZXBsYWNlKGssIiIpO2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZyllKz1uKGEpfWVsc2UgaWYoZD09PTN8fGQ9PT00KXJldHVybiBhLm5vZGVWYWx1ZX1lbHNlIGZvcihiPTA7Yz1hW2JdO2IrKyljLm5vZGVUeXBlIT09OCYmKGUrPW4oYykpO3JldHVybiBlfSxvPW0uc2VsZWN0b3JzPXtvcmRlcjpbIklEIiwiTkFNRSIsIlRBRyJdLG1hdGNoOntJRDovIygoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKS8sQ0xBU1M6L1wuKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspLyxOQU1FOi9cW25hbWU9WyciXSooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylbJyJdKlxdLyxBVFRSOi9cW1xzKigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKVxzKig/OihcUz89KVxzKig/OihbJyJdKSguKj8pXDN8KCM/KD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKil8KXwpXHMqXF0vLFRBRzovXigoPzpbXHdcdTAwYzAtXHVGRkZGXCpcLV18XFwuKSspLyxDSElMRDovOihvbmx5fG50aHxsYXN0fGZpcnN0KS1jaGlsZCg/OlwoXHMqKGV2ZW58b2RkfCg/OlsrXC1dP1xkK3woPzpbK1wtXT9cZCopP25ccyooPzpbK1wtXVxzKlxkKyk/KSlccypcKSk/LyxQT1M6LzoobnRofGVxfGd0fGx0fGZpcnN0fGxhc3R8ZXZlbnxvZGQpKD86XCgoXGQqKVwpKT8oPz1bXlwtXXwkKS8sUFNFVURPOi86KCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspKD86XCgoWyciXT8pKCg/OlwoW15cKV0rXCl8W15cKFwpXSopKylcMlwpKT8vfSxsZWZ0TWF0Y2g6e30sYXR0ck1hcDp7ImNsYXNzIjoiY2xhc3NOYW1lIiwiZm9yIjoiaHRtbEZvciJ9LGF0dHJIYW5kbGU6e2hyZWY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJocmVmIil9LHR5cGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJ0eXBlIil9fSxyZWxhdGl2ZTp7IisiOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGI9PSJzdHJpbmciLGQ9YyYmIWwudGVzdChiKSxlPWMmJiFkO2QmJihiPWIudG9Mb3dlckNhc2UoKSk7Zm9yKHZhciBmPTAsZz1hLmxlbmd0aCxoO2Y8ZztmKyspaWYoaD1hW2ZdKXt3aGlsZSgoaD1oLnByZXZpb3VzU2libGluZykmJmgubm9kZVR5cGUhPT0xKTthW2ZdPWV8fGgmJmgubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWI/aHx8ITE6aD09PWJ9ZSYmbS5maWx0ZXIoYixhLCEwKX0sIj4iOmZ1bmN0aW9uKGEsYil7dmFyIGMsZD10eXBlb2YgYj09InN0cmluZyIsZT0wLGY9YS5sZW5ndGg7aWYoZCYmIWwudGVzdChiKSl7Yj1iLnRvTG93ZXJDYXNlKCk7Zm9yKDtlPGY7ZSsrKXtjPWFbZV07aWYoYyl7dmFyIGc9Yy5wYXJlbnROb2RlO2FbZV09Zy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yj9nOiExfX19ZWxzZXtmb3IoO2U8ZjtlKyspYz1hW2VdLGMmJihhW2VdPWQ/Yy5wYXJlbnROb2RlOmMucGFyZW50Tm9kZT09PWIpO2QmJm0uZmlsdGVyKGIsYSwhMCl9fSwiIjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZj1lKyssZz14O3R5cGVvZiBiPT0ic3RyaW5nIiYmIWwudGVzdChiKSYmKGI9Yi50b0xvd2VyQ2FzZSgpLGQ9YixnPXcpLGcoInBhcmVudE5vZGUiLGIsZixhLGQsYyl9LCJ+IjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZj1lKyssZz14O3R5cGVvZiBiPT0ic3RyaW5nIiYmIWwudGVzdChiKSYmKGI9Yi50b0xvd2VyQ2FzZSgpLGQ9YixnPXcpLGcoInByZXZpb3VzU2libGluZyIsYixmLGEsZCxjKX19LGZpbmQ6e0lEOmZ1bmN0aW9uKGEsYixjKXtpZih0eXBlb2YgYi5nZXRFbGVtZW50QnlJZCE9InVuZGVmaW5lZCImJiFjKXt2YXIgZD1iLmdldEVsZW1lbnRCeUlkKGFbMV0pO3JldHVybiBkJiZkLnBhcmVudE5vZGU/W2RdOltdfX0sTkFNRTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlOYW1lIT0idW5kZWZpbmVkIil7dmFyIGM9W10sZD1iLmdldEVsZW1lbnRzQnlOYW1lKGFbMV0pO2Zvcih2YXIgZT0wLGY9ZC5sZW5ndGg7ZTxmO2UrKylkW2VdLmdldEF0dHJpYnV0ZSgibmFtZSIpPT09YVsxXSYmYy5wdXNoKGRbZV0pO3JldHVybiBjLmxlbmd0aD09PTA/bnVsbDpjfX0sVEFHOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiKXJldHVybiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGFbMV0pfX0scHJlRmlsdGVyOntDTEFTUzpmdW5jdGlvbihhLGIsYyxkLGUsZil7YT0iICIrYVsxXS5yZXBsYWNlKGosIiIpKyIgIjtpZihmKXJldHVybiBhO2Zvcih2YXIgZz0wLGg7KGg9YltnXSkhPW51bGw7ZysrKWgmJihlXihoLmNsYXNzTmFtZSYmKCIgIitoLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoL1tcdFxuXHJdL2csIiAiKS5pbmRleE9mKGEpPj0wKT9jfHxkLnB1c2goaCk6YyYmKGJbZ109ITEpKTtyZXR1cm4hMX0sSUQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV0ucmVwbGFjZShqLCIiKX0sVEFHOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGFbMV0ucmVwbGFjZShqLCIiKS50b0xvd2VyQ2FzZSgpfSxDSElMRDpmdW5jdGlvbihhKXtpZihhWzFdPT09Im50aCIpe2FbMl18fG0uZXJyb3IoYVswXSksYVsyXT1hWzJdLnJlcGxhY2UoL15cK3xccyovZywiIik7dmFyIGI9LygtPykoXGQqKSg/Om4oWytcLV0/XGQqKSk/Ly5leGVjKGFbMl09PT0iZXZlbiImJiIybiJ8fGFbMl09PT0ib2RkIiYmIjJuKzEifHwhL1xELy50ZXN0KGFbMl0pJiYiMG4rIithWzJdfHxhWzJdKTthWzJdPWJbMV0rKGJbMl18fDEpLTAsYVszXT1iWzNdLTB9ZWxzZSBhWzJdJiZtLmVycm9yKGFbMF0pO2FbMF09ZSsrO3JldHVybiBhfSxBVFRSOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt2YXIgZz1hWzFdPWFbMV0ucmVwbGFjZShqLCIiKTshZiYmby5hdHRyTWFwW2ddJiYoYVsxXT1vLmF0dHJNYXBbZ10pLGFbNF09KGFbNF18fGFbNV18fCIiKS5yZXBsYWNlKGosIiIpLGFbMl09PT0ifj0iJiYoYVs0XT0iICIrYVs0XSsiICIpO3JldHVybiBhfSxQU0VVRE86ZnVuY3Rpb24oYixjLGQsZSxmKXtpZihiWzFdPT09Im5vdCIpaWYoKGEuZXhlYyhiWzNdKXx8IiIpLmxlbmd0aD4xfHwvXlx3Ly50ZXN0KGJbM10pKWJbM109bShiWzNdLG51bGwsbnVsbCxjKTtlbHNle3ZhciBnPW0uZmlsdGVyKGJbM10sYyxkLCEwXmYpO2R8fGUucHVzaC5hcHBseShlLGcpO3JldHVybiExfWVsc2UgaWYoby5tYXRjaC5QT1MudGVzdChiWzBdKXx8by5tYXRjaC5DSElMRC50ZXN0KGJbMF0pKXJldHVybiEwO3JldHVybiBifSxQT1M6ZnVuY3Rpb24oYSl7YS51bnNoaWZ0KCEwKTtyZXR1cm4gYX19LGZpbHRlcnM6e2VuYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMSYmYS50eXBlIT09ImhpZGRlbiJ9LGRpc2FibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITB9LGNoZWNrZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2hlY2tlZD09PSEwfSxzZWxlY3RlZDpmdW5jdGlvbihhKXthLnBhcmVudE5vZGUmJmEucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O3JldHVybiBhLnNlbGVjdGVkPT09ITB9LHBhcmVudDpmdW5jdGlvbihhKXtyZXR1cm4hIWEuZmlyc3RDaGlsZH0sZW1wdHk6ZnVuY3Rpb24oYSl7cmV0dXJuIWEuZmlyc3RDaGlsZH0saGFzOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIW0oY1szXSxhKS5sZW5ndGh9LGhlYWRlcjpmdW5jdGlvbihhKXtyZXR1cm4vaFxkL2kudGVzdChhLm5vZGVOYW1lKX0sdGV4dDpmdW5jdGlvbihhKXt2YXIgYj1hLmdldEF0dHJpYnV0ZSgidHlwZSIpLGM9YS50eXBlO3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYidGV4dCI9PT1jJiYoYj09PWN8fGI9PT1udWxsKX0scmFkaW86ZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJiJyYWRpbyI9PT1hLnR5cGV9LGNoZWNrYm94OmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYiY2hlY2tib3giPT09YS50eXBlfSxmaWxlOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYiZmlsZSI9PT1hLnR5cGV9LHBhc3N3b3JkOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYicGFzc3dvcmQiPT09YS50eXBlfSxzdWJtaXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybihiPT09ImlucHV0Inx8Yj09PSJidXR0b24iKSYmInN1Ym1pdCI9PT1hLnR5cGV9LGltYWdlOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYiaW1hZ2UiPT09YS50eXBlfSxyZXNldDpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKGI9PT0iaW5wdXQifHxiPT09ImJ1dHRvbiIpJiYicmVzZXQiPT09YS50eXBlfSxidXR0b246ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiBiPT09ImlucHV0IiYmImJ1dHRvbiI9PT1hLnR5cGV8fGI9PT0iYnV0dG9uIn0saW5wdXQ6ZnVuY3Rpb24oYSl7cmV0dXJuL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24vaS50ZXN0KGEubm9kZU5hbWUpfSxmb2N1czpmdW5jdGlvbihhKXtyZXR1cm4gYT09PWEub3duZXJEb2N1bWVudC5hY3RpdmVFbGVtZW50fX0sc2V0RmlsdGVyczp7Zmlyc3Q6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj09PTB9LGxhc3Q6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGI9PT1kLmxlbmd0aC0xfSxldmVuOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIlMj09PTB9LG9kZDpmdW5jdGlvbihhLGIpe3JldHVybiBiJTI9PT0xfSxsdDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI8Y1szXS0wfSxndDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI+Y1szXS0wfSxudGg6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjWzNdLTA9PT1ifSxlcTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGNbM10tMD09PWJ9fSxmaWx0ZXI6e1BTRVVETzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1iWzFdLGY9by5maWx0ZXJzW2VdO2lmKGYpcmV0dXJuIGYoYSxjLGIsZCk7aWYoZT09PSJjb250YWlucyIpcmV0dXJuKGEudGV4dENvbnRlbnR8fGEuaW5uZXJUZXh0fHxuKFthXSl8fCIiKS5pbmRleE9mKGJbM10pPj0wO2lmKGU9PT0ibm90Iil7dmFyIGc9YlszXTtmb3IodmFyIGg9MCxpPWcubGVuZ3RoO2g8aTtoKyspaWYoZ1toXT09PWEpcmV0dXJuITE7cmV0dXJuITB9bS5lcnJvcihlKX0sQ0hJTEQ6ZnVuY3Rpb24oYSxiKXt2YXIgYyxlLGYsZyxoLGksaixrPWJbMV0sbD1hO3N3aXRjaChrKXtjYXNlIm9ubHkiOmNhc2UiZmlyc3QiOndoaWxlKGw9bC5wcmV2aW91c1NpYmxpbmcpaWYobC5ub2RlVHlwZT09PTEpcmV0dXJuITE7aWYoaz09PSJmaXJzdCIpcmV0dXJuITA7bD1hO2Nhc2UibGFzdCI6d2hpbGUobD1sLm5leHRTaWJsaW5nKWlmKGwubm9kZVR5cGU9PT0xKXJldHVybiExO3JldHVybiEwO2Nhc2UibnRoIjpjPWJbMl0sZT1iWzNdO2lmKGM9PT0xJiZlPT09MClyZXR1cm4hMDtmPWJbMF0sZz1hLnBhcmVudE5vZGU7aWYoZyYmKGdbZF0hPT1mfHwhYS5ub2RlSW5kZXgpKXtpPTA7Zm9yKGw9Zy5maXJzdENoaWxkO2w7bD1sLm5leHRTaWJsaW5nKWwubm9kZVR5cGU9PT0xJiYobC5ub2RlSW5kZXg9KytpKTtnW2RdPWZ9aj1hLm5vZGVJbmRleC1lO3JldHVybiBjPT09MD9qPT09MDpqJWM9PT0wJiZqL2M+PTB9fSxJRDpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVUeXBlPT09MSYmYS5nZXRBdHRyaWJ1dGUoImlkIik9PT1ifSxUQUc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj09PSIqIiYmYS5ub2RlVHlwZT09PTF8fCEhYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yn0sQ0xBU1M6ZnVuY3Rpb24oYSxiKXtyZXR1cm4oIiAiKyhhLmNsYXNzTmFtZXx8YS5nZXRBdHRyaWJ1dGUoImNsYXNzIikpKyIgIikuaW5kZXhPZihiKT4tMX0sQVRUUjpmdW5jdGlvbihhLGIpe3ZhciBjPWJbMV0sZD1tLmF0dHI/bS5hdHRyKGEsYyk6by5hdHRySGFuZGxlW2NdP28uYXR0ckhhbmRsZVtjXShhKTphW2NdIT1udWxsP2FbY106YS5nZXRBdHRyaWJ1dGUoYyksZT1kKyIiLGY9YlsyXSxnPWJbNF07cmV0dXJuIGQ9PW51bGw/Zj09PSIhPSI6IWYmJm0uYXR0cj9kIT1udWxsOmY9PT0iPSI/ZT09PWc6Zj09PSIqPSI/ZS5pbmRleE9mKGcpPj0wOmY9PT0ifj0iPygiICIrZSsiICIpLmluZGV4T2YoZyk+PTA6Zz9mPT09IiE9Ij9lIT09ZzpmPT09Il49Ij9lLmluZGV4T2YoZyk9PT0wOmY9PT0iJD0iP2Uuc3Vic3RyKGUubGVuZ3RoLWcubGVuZ3RoKT09PWc6Zj09PSJ8PSI/ZT09PWd8fGUuc3Vic3RyKDAsZy5sZW5ndGgrMSk9PT1nKyItIjohMTplJiZkIT09ITF9LFBPUzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1iWzJdLGY9by5zZXRGaWx0ZXJzW2VdO2lmKGYpcmV0dXJuIGYoYSxjLGIsZCl9fX0scD1vLm1hdGNoLlBPUyxxPWZ1bmN0aW9uKGEsYil7cmV0dXJuIlxcIisoYi0wKzEpfTtmb3IodmFyIHIgaW4gby5tYXRjaClvLm1hdGNoW3JdPW5ldyBSZWdFeHAoby5tYXRjaFtyXS5zb3VyY2UrLyg/IVteXFtdKlxdKSg/IVteXChdKlwpKS8uc291cmNlKSxvLmxlZnRNYXRjaFtyXT1uZXcgUmVnRXhwKC8oXig/Oi58XHJ8XG4pKj8pLy5zb3VyY2Urby5tYXRjaFtyXS5zb3VyY2UucmVwbGFjZSgvXFwoXGQrKS9nLHEpKTt2YXIgcz1mdW5jdGlvbihhLGIpe2E9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSwwKTtpZihiKXtiLnB1c2guYXBwbHkoYixhKTtyZXR1cm4gYn1yZXR1cm4gYX07dHJ5e0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGMuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMsMClbMF0ubm9kZVR5cGV9Y2F0Y2godCl7cz1mdW5jdGlvbihhLGIpe3ZhciBjPTAsZD1ifHxbXTtpZihnLmNhbGwoYSk9PT0iW29iamVjdCBBcnJheV0iKUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGQsYSk7ZWxzZSBpZih0eXBlb2YgYS5sZW5ndGg9PSJudW1iZXIiKWZvcih2YXIgZT1hLmxlbmd0aDtjPGU7YysrKWQucHVzaChhW2NdKTtlbHNlIGZvcig7YVtjXTtjKyspZC5wdXNoKGFbY10pO3JldHVybiBkfX12YXIgdSx2O2MuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP3U9ZnVuY3Rpb24oYSxiKXtpZihhPT09Yil7aD0hMDtyZXR1cm4gMH1pZighYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbnx8IWIuY29tcGFyZURvY3VtZW50UG9zaXRpb24pcmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24/LTE6MTtyZXR1cm4gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSY0Py0xOjF9Oih1PWZ1bmN0aW9uKGEsYil7aWYoYT09PWIpe2g9ITA7cmV0dXJuIDB9aWYoYS5zb3VyY2VJbmRleCYmYi5zb3VyY2VJbmRleClyZXR1cm4gYS5zb3VyY2VJbmRleC1iLnNvdXJjZUluZGV4O3ZhciBjLGQsZT1bXSxmPVtdLGc9YS5wYXJlbnROb2RlLGk9Yi5wYXJlbnROb2RlLGo9ZztpZihnPT09aSlyZXR1cm4gdihhLGIpO2lmKCFnKXJldHVybi0xO2lmKCFpKXJldHVybiAxO3doaWxlKGopZS51bnNoaWZ0KGopLGo9ai5wYXJlbnROb2RlO2o9aTt3aGlsZShqKWYudW5zaGlmdChqKSxqPWoucGFyZW50Tm9kZTtjPWUubGVuZ3RoLGQ9Zi5sZW5ndGg7Zm9yKHZhciBrPTA7azxjJiZrPGQ7aysrKWlmKGVba10hPT1mW2tdKXJldHVybiB2KGVba10sZltrXSk7cmV0dXJuIGs9PT1jP3YoYSxmW2tdLC0xKTp2KGVba10sYiwxKX0sdj1mdW5jdGlvbihhLGIsYyl7aWYoYT09PWIpcmV0dXJuIGM7dmFyIGQ9YS5uZXh0U2libGluZzt3aGlsZShkKXtpZihkPT09YilyZXR1cm4tMTtkPWQubmV4dFNpYmxpbmd9cmV0dXJuIDF9KSxmdW5jdGlvbigpe3ZhciBhPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksZD0ic2NyaXB0IisobmV3IERhdGUpLmdldFRpbWUoKSxlPWMuZG9jdW1lbnRFbGVtZW50O2EuaW5uZXJIVE1MPSI8YSBuYW1lPSciK2QrIicvPiIsZS5pbnNlcnRCZWZvcmUoYSxlLmZpcnN0Q2hpbGQpLGMuZ2V0RWxlbWVudEJ5SWQoZCkmJihvLmZpbmQuSUQ9ZnVuY3Rpb24oYSxjLGQpe2lmKHR5cGVvZiBjLmdldEVsZW1lbnRCeUlkIT0idW5kZWZpbmVkIiYmIWQpe3ZhciBlPWMuZ2V0RWxlbWVudEJ5SWQoYVsxXSk7cmV0dXJuIGU/ZS5pZD09PWFbMV18fHR5cGVvZiBlLmdldEF0dHJpYnV0ZU5vZGUhPSJ1bmRlZmluZWQiJiZlLmdldEF0dHJpYnV0ZU5vZGUoImlkIikubm9kZVZhbHVlPT09YVsxXT9bZV06YjpbXX19LG8uZmlsdGVyLklEPWZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGEuZ2V0QXR0cmlidXRlTm9kZSE9InVuZGVmaW5lZCImJmEuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gYS5ub2RlVHlwZT09PTEmJmMmJmMubm9kZVZhbHVlPT09Yn0pLGUucmVtb3ZlQ2hpbGQoYSksZT1hPW51bGx9KCksZnVuY3Rpb24oKXt2YXIgYT1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuYXBwZW5kQ2hpbGQoYy5jcmVhdGVDb21tZW50KCIiKSksYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aD4wJiYoby5maW5kLlRBRz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYVsxXSk7aWYoYVsxXT09PSIqIil7dmFyIGQ9W107Zm9yKHZhciBlPTA7Y1tlXTtlKyspY1tlXS5ub2RlVHlwZT09PTEmJmQucHVzaChjW2VdKTtjPWR9cmV0dXJuIGN9KSxhLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsYS5maXJzdENoaWxkJiZ0eXBlb2YgYS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSE9InVuZGVmaW5lZCImJmEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSE9PSIjIiYmKG8uYXR0ckhhbmRsZS5ocmVmPWZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIsMil9KSxhPW51bGx9KCksYy5xdWVyeVNlbGVjdG9yQWxsJiZmdW5jdGlvbigpe3ZhciBhPW0sYj1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9Il9fc2l6emxlX18iO2IuaW5uZXJIVE1MPSI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7aWYoIWIucXVlcnlTZWxlY3RvckFsbHx8Yi5xdWVyeVNlbGVjdG9yQWxsKCIuVEVTVCIpLmxlbmd0aCE9PTApe209ZnVuY3Rpb24oYixlLGYsZyl7ZT1lfHxjO2lmKCFnJiYhbS5pc1hNTChlKSl7dmFyIGg9L14oXHcrJCl8XlwuKFtcd1wtXSskKXxeIyhbXHdcLV0rJCkvLmV4ZWMoYik7aWYoaCYmKGUubm9kZVR5cGU9PT0xfHxlLm5vZGVUeXBlPT09OSkpe2lmKGhbMV0pcmV0dXJuIHMoZS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKSxmKTtpZihoWzJdJiZvLmZpbmQuQ0xBU1MmJmUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gcyhlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaFsyXSksZil9aWYoZS5ub2RlVHlwZT09PTkpe2lmKGI9PT0iYm9keSImJmUuYm9keSlyZXR1cm4gcyhbZS5ib2R5XSxmKTtpZihoJiZoWzNdKXt2YXIgaT1lLmdldEVsZW1lbnRCeUlkKGhbM10pO2lmKCFpfHwhaS5wYXJlbnROb2RlKXJldHVybiBzKFtdLGYpO2lmKGkuaWQ9PT1oWzNdKXJldHVybiBzKFtpXSxmKX10cnl7cmV0dXJuIHMoZS5xdWVyeVNlbGVjdG9yQWxsKGIpLGYpfWNhdGNoKGope319ZWxzZSBpZihlLm5vZGVUeXBlPT09MSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09Im9iamVjdCIpe3ZhciBrPWUsbD1lLmdldEF0dHJpYnV0ZSgiaWQiKSxuPWx8fGQscD1lLnBhcmVudE5vZGUscT0vXlxzKlsrfl0vLnRlc3QoYik7bD9uPW4ucmVwbGFjZSgvJy9nLCJcXCQmIik6ZS5zZXRBdHRyaWJ1dGUoImlkIixuKSxxJiZwJiYoZT1lLnBhcmVudE5vZGUpO3RyeXtpZighcXx8cClyZXR1cm4gcyhlLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZD0nIituKyInXSAiK2IpLGYpfWNhdGNoKHIpe31maW5hbGx5e2x8fGsucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGEoYixlLGYsZyl9O2Zvcih2YXIgZSBpbiBhKW1bZV09YVtlXTtiPW51bGx9fSgpLGZ1bmN0aW9uKCl7dmFyIGE9Yy5kb2N1bWVudEVsZW1lbnQsYj1hLm1hdGNoZXNTZWxlY3Rvcnx8YS5tb3pNYXRjaGVzU2VsZWN0b3J8fGEud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxhLm1zTWF0Y2hlc1NlbGVjdG9yO2lmKGIpe3ZhciBkPSFiLmNhbGwoYy5jcmVhdGVFbGVtZW50KCJkaXYiKSwiZGl2IiksZT0hMTt0cnl7Yi5jYWxsKGMuZG9jdW1lbnRFbGVtZW50LCJbdGVzdCE9JyddOnNpenpsZSIpfWNhdGNoKGYpe2U9ITB9bS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxjKXtjPWMucmVwbGFjZSgvXD1ccyooW14nIlxdXSopXHMqXF0vZywiPSckMSddIik7aWYoIW0uaXNYTUwoYSkpdHJ5e2lmKGV8fCFvLm1hdGNoLlBTRVVETy50ZXN0KGMpJiYhLyE9Ly50ZXN0KGMpKXt2YXIgZj1iLmNhbGwoYSxjKTtpZihmfHwhZHx8YS5kb2N1bWVudCYmYS5kb2N1bWVudC5ub2RlVHlwZSE9PTExKXJldHVybiBmfX1jYXRjaChnKXt9cmV0dXJuIG0oYyxudWxsLG51bGwsW2FdKS5sZW5ndGg+MH19fSgpLGZ1bmN0aW9uKCl7dmFyIGE9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmlubmVySFRNTD0iPGRpdiBjbGFzcz0ndGVzdCBlJz48L2Rpdj48ZGl2IGNsYXNzPSd0ZXN0Jz48L2Rpdj4iO2lmKCEhYS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZhLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGghPT0wKXthLmxhc3RDaGlsZC5jbGFzc05hbWU9ImUiO2lmKGEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aD09PTEpcmV0dXJuO28ub3JkZXIuc3BsaWNlKDEsMCwiQ0xBU1MiKSxvLmZpbmQuQ0xBU1M9ZnVuY3Rpb24oYSxiLGMpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUhPSJ1bmRlZmluZWQiJiYhYylyZXR1cm4gYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGFbMV0pfSxhPW51bGx9fSgpLGMuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zP20uY29udGFpbnM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSE9PWImJihhLmNvbnRhaW5zP2EuY29udGFpbnMoYik6ITApfTpjLmRvY3VtZW50RWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9tLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNil9Om0uY29udGFpbnM9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbS5pc1hNTD1mdW5jdGlvbihhKXt2YXIgYj0oYT9hLm93bmVyRG9jdW1lbnR8fGE6MCkuZG9jdW1lbnRFbGVtZW50O3JldHVybiBiP2Iubm9kZU5hbWUhPT0iSFRNTCI6ITF9O3ZhciB5PWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlPVtdLGY9IiIsZz1iLm5vZGVUeXBlP1tiXTpiO3doaWxlKGQ9by5tYXRjaC5QU0VVRE8uZXhlYyhhKSlmKz1kWzBdLGE9YS5yZXBsYWNlKG8ubWF0Y2guUFNFVURPLCIiKTthPW8ucmVsYXRpdmVbYV0/YSsiKiI6YTtmb3IodmFyIGg9MCxpPWcubGVuZ3RoO2g8aTtoKyspbShhLGdbaF0sZSxjKTtyZXR1cm4gbS5maWx0ZXIoZixlKX07bS5hdHRyPWYuYXR0cixtLnNlbGVjdG9ycy5hdHRyTWFwPXt9LGYuZmluZD1tLGYuZXhwcj1tLnNlbGVjdG9ycyxmLmV4cHJbIjoiXT1mLmV4cHIuZmlsdGVycyxmLnVuaXF1ZT1tLnVuaXF1ZVNvcnQsZi50ZXh0PW0uZ2V0VGV4dCxmLmlzWE1MRG9jPW0uaXNYTUwsZi5jb250YWlucz1tLmNvbnRhaW5zfSgpO3ZhciBMPS9VbnRpbCQvLE09L14oPzpwYXJlbnRzfHByZXZVbnRpbHxwcmV2QWxsKS8sTj0vLC8sTz0vXi5bXjojXFtcLixdKiQvLFA9QXJyYXkucHJvdG90eXBlLnNsaWNlLFE9Zi5leHByLm1hdGNoLlBPUyxSPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O2YuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYyxkO2lmKHR5cGVvZiBhIT0ic3RyaW5nIilyZXR1cm4gZihhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYz0wLGQ9Yi5sZW5ndGg7YzxkO2MrKylpZihmLmNvbnRhaW5zKGJbY10sdGhpcykpcmV0dXJuITB9KTt2YXIgZT10aGlzLnB1c2hTdGFjaygiIiwiZmluZCIsYSksZyxoLGk7Zm9yKGM9MCxkPXRoaXMubGVuZ3RoO2M8ZDtjKyspe2c9ZS5sZW5ndGgsZi5maW5kKGEsdGhpc1tjXSxlKTtpZihjPjApZm9yKGg9ZztoPGUubGVuZ3RoO2grKylmb3IoaT0wO2k8ZztpKyspaWYoZVtpXT09PWVbaF0pe2Uuc3BsaWNlKGgtLSwxKTticmVha319cmV0dXJuIGV9LGhhczpmdW5jdGlvbihhKXt2YXIgYj1mKGEpO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgYT0wLGM9Yi5sZW5ndGg7YTxjO2ErKylpZihmLmNvbnRhaW5zKHRoaXMsYlthXSkpcmV0dXJuITB9KX0sbm90OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhUKHRoaXMsYSwhMSksIm5vdCIsYSl9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soVCh0aGlzLGEsITApLCJmaWx0ZXIiLGEpfSxpczpmdW5jdGlvbihhKXtyZXR1cm4hIWEmJih0eXBlb2YgYT09InN0cmluZyI/US50ZXN0KGEpP2YoYSx0aGlzLmNvbnRleHQpLmluZGV4KHRoaXNbMF0pPj0wOmYuZmlsdGVyKGEsdGhpcykubGVuZ3RoPjA6dGhpcy5maWx0ZXIoYSkubGVuZ3RoPjApfSxjbG9zZXN0OmZ1bmN0aW9uKGEsYil7dmFyIGM9W10sZCxlLGc9dGhpc1swXTtpZihmLmlzQXJyYXkoYSkpe3ZhciBoPTE7d2hpbGUoZyYmZy5vd25lckRvY3VtZW50JiZnIT09Yil7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmKGcpLmlzKGFbZF0pJiZjLnB1c2goe3NlbGVjdG9yOmFbZF0sZWxlbTpnLGxldmVsOmh9KTtnPWcucGFyZW50Tm9kZSxoKyt9cmV0dXJuIGN9dmFyIGk9US50ZXN0KGEpfHx0eXBlb2YgYSE9InN0cmluZyI/ZihhLGJ8fHRoaXMuY29udGV4dCk6MDtmb3IoZD0wLGU9dGhpcy5sZW5ndGg7ZDxlO2QrKyl7Zz10aGlzW2RdO3doaWxlKGcpe2lmKGk/aS5pbmRleChnKT4tMTpmLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGcsYSkpe2MucHVzaChnKTticmVha31nPWcucGFyZW50Tm9kZTtpZighZ3x8IWcub3duZXJEb2N1bWVudHx8Zz09PWJ8fGcubm9kZVR5cGU9PT0xMSlicmVha319Yz1jLmxlbmd0aD4xP2YudW5pcXVlKGMpOmM7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGMsImNsb3Nlc3QiLGEpfSxpbmRleDpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4gdGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMucHJldkFsbCgpLmxlbmd0aDotMTtpZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIGYuaW5BcnJheSh0aGlzWzBdLGYoYSkpO3JldHVybiBmLmluQXJyYXkoYS5qcXVlcnk/YVswXTphLHRoaXMpfSxhZGQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYT09InN0cmluZyI/ZihhLGIpOmYubWFrZUFycmF5KGEmJmEubm9kZVR5cGU/W2FdOmEpLGQ9Zi5tZXJnZSh0aGlzLmdldCgpLGMpO3JldHVybiB0aGlzLnB1c2hTdGFjayhTKGNbMF0pfHxTKGRbMF0pP2Q6Zi51bmlxdWUoZCkpfSxhbmRTZWxmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWRkKHRoaXMucHJldk9iamVjdCl9fSksZi5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiZiLm5vZGVUeXBlIT09MTE/YjpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBmLmRpcihhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZGlyKGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBmLm50aChhLDIsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIGYubnRoKGEsMiwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZGlyKGEsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZGlyKGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmRpcihhLCJuZXh0U2libGluZyIsYyl9LHByZXZVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZGlyKGEsInByZXZpb3VzU2libGluZyIsYyl9LHNpYmxpbmdzOmZ1bmN0aW9uKGEpe3JldHVybiBmLnNpYmxpbmcoYS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiBmLnNpYmxpbmcoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGYubm9kZU5hbWUoYSwiaWZyYW1lIik/YS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDpmLm1ha2VBcnJheShhLmNoaWxkTm9kZXMpfX0sZnVuY3Rpb24oYSxiKXtmLmZuW2FdPWZ1bmN0aW9uKGMsZCl7dmFyIGU9Zi5tYXAodGhpcyxiLGMpO0wudGVzdChhKXx8KGQ9YyksZCYmdHlwZW9mIGQ9PSJzdHJpbmciJiYoZT1mLmZpbHRlcihkLGUpKSxlPXRoaXMubGVuZ3RoPjEmJiFSW2FdP2YudW5pcXVlKGUpOmUsKHRoaXMubGVuZ3RoPjF8fE4udGVzdChkKSkmJk0udGVzdChhKSYmKGU9ZS5yZXZlcnNlKCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhlLGEsUC5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpKX19KSxmLmV4dGVuZCh7ZmlsdGVyOmZ1bmN0aW9uKGEsYixjKXtjJiYoYT0iOm5vdCgiK2ErIikiKTtyZXR1cm4gYi5sZW5ndGg9PT0xP2YuZmluZC5tYXRjaGVzU2VsZWN0b3IoYlswXSxhKT9bYlswXV06W106Zi5maW5kLm1hdGNoZXMoYSxiKX0sZGlyOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1bXSxnPWFbY107d2hpbGUoZyYmZy5ub2RlVHlwZSE9PTkmJihkPT09Ynx8Zy5ub2RlVHlwZSE9PTF8fCFmKGcpLmlzKGQpKSlnLm5vZGVUeXBlPT09MSYmZS5wdXNoKGcpLGc9Z1tjXTtyZXR1cm4gZX0sbnRoOmZ1bmN0aW9uKGEsYixjLGQpe2I9Ynx8MTt2YXIgZT0wO2Zvcig7YTthPWFbY10paWYoYS5ub2RlVHlwZT09PTEmJisrZT09PWIpYnJlYWs7cmV0dXJuIGF9LHNpYmxpbmc6ZnVuY3Rpb24oYSxiKXt2YXIgYz1bXTtmb3IoO2E7YT1hLm5leHRTaWJsaW5nKWEubm9kZVR5cGU9PT0xJiZhIT09YiYmYy5wdXNoKGEpO3JldHVybiBjfX0pO3ZhciBWPSJhYmJyfGFydGljbGV8YXNpZGV8YXVkaW98Y2FudmFzfGRhdGFsaXN0fGRldGFpbHN8ZmlnY2FwdGlvbnxmaWd1cmV8Zm9vdGVyfGhlYWRlcnxoZ3JvdXB8bWFya3xtZXRlcnxuYXZ8b3V0cHV0fHByb2dyZXNzfHNlY3Rpb258c3VtbWFyeXx0aW1lfHZpZGVvIixXPS8galF1ZXJ5XGQrPSIoPzpcZCt8bnVsbCkiL2csWD0vXlxzKy8sWT0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2lnLFo9LzwoW1x3Ol0rKS8sJD0vPHRib2R5L2ksXz0vPHwmIz9cdys7LyxiYT0vPCg/OnNjcmlwdHxzdHlsZSkvaSxiYj0vPCg/OnNjcmlwdHxvYmplY3R8ZW1iZWR8b3B0aW9ufHN0eWxlKS9pLGJjPW5ldyBSZWdFeHAoIjwoPzoiK1YrIikiLCJpIiksYmQ9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksYmU9L1wvKGphdmF8ZWNtYSlzY3JpcHQvaSxiZj0vXlxzKjwhKD86XFtDREFUQVxbfFwtXC0pLyxiZz17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sbGVnZW5kOlsxLCI8ZmllbGRzZXQ+IiwiPC9maWVsZHNldD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLGFyZWE6WzEsIjxtYXA+IiwiPC9tYXA+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfSxiaD1VKGMpO2JnLm9wdGdyb3VwPWJnLm9wdGlvbixiZy50Ym9keT1iZy50Zm9vdD1iZy5jb2xncm91cD1iZy5jYXB0aW9uPWJnLnRoZWFkLGJnLnRoPWJnLnRkLGYuc3VwcG9ydC5odG1sU2VyaWFsaXplfHwoYmcuX2RlZmF1bHQ9WzEsImRpdjxkaXY+IiwiPC9kaXY+Il0pLGYuZm4uZXh0ZW5kKHt0ZXh0OmZ1bmN0aW9uKGEpe2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyk7Yy50ZXh0KGEuY2FsbCh0aGlzLGIsYy50ZXh0KCkpKX0pO2lmKHR5cGVvZiBhIT0ib2JqZWN0IiYmYSE9PWIpcmV0dXJuIHRoaXMuZW1wdHkoKS5hcHBlbmQoKHRoaXNbMF0mJnRoaXNbMF0ub3duZXJEb2N1bWVudHx8YykuY3JlYXRlVGV4dE5vZGUoYSkpO3JldHVybiBmLnRleHQodGhpcyl9LHdyYXBBbGw6ZnVuY3Rpb24oYSl7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS53cmFwQWxsKGEuY2FsbCh0aGlzLGIpKX0pO2lmKHRoaXNbMF0pe3ZhciBiPWYoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKTt0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGIubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aGlsZShhLmZpcnN0Q2hpbGQmJmEuZmlyc3RDaGlsZC5ub2RlVHlwZT09PTEpYT1hLmZpcnN0Q2hpbGQ7cmV0dXJuIGF9KS5hcHBlbmQodGhpcyl9cmV0dXJuIHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Zih0aGlzKSxjPWIuY29udGVudHMoKTtjLmxlbmd0aD9jLndyYXBBbGwoYSk6Yi5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXt2YXIgYj1mLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXtmKHRoaXMpLndyYXBBbGwoYj9hLmNhbGwodGhpcyxjKTphKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7Zi5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fGYodGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITAsZnVuY3Rpb24oYSl7dGhpcy5ub2RlVHlwZT09PTEmJnRoaXMuYXBwZW5kQ2hpbGQoYSl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywhMCxmdW5jdGlvbihhKXt0aGlzLm5vZGVUeXBlPT09MSYmdGhpcy5pbnNlcnRCZWZvcmUoYSx0aGlzLmZpcnN0Q2hpbGQpfSl9LGJlZm9yZTpmdW5jdGlvbigpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGE9Zi5jbGVhbihhcmd1bWVudHMpO2EucHVzaC5hcHBseShhLHRoaXMudG9BcnJheSgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYSwiYmVmb3JlIixhcmd1bWVudHMpfX0sYWZ0ZXI6ZnVuY3Rpb24oKXtpZih0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGUpcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCExLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzLm5leHRTaWJsaW5nKX0pO2lmKGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBhPXRoaXMucHVzaFN0YWNrKHRoaXMsImFmdGVyIixhcmd1bWVudHMpO2EucHVzaC5hcHBseShhLGYuY2xlYW4oYXJndW1lbnRzKSk7cmV0dXJuIGF9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MCxkOyhkPXRoaXNbY10pIT1udWxsO2MrKylpZighYXx8Zi5maWx0ZXIoYSxbZF0pLmxlbmd0aCkhYiYmZC5ub2RlVHlwZT09PTEmJihmLmNsZWFuRGF0YShkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpLGYuY2xlYW5EYXRhKFtkXSkpLGQucGFyZW50Tm9kZSYmZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpO3JldHVybiB0aGlzfSxlbXB0eTpmdW5jdGlvbigpCntmb3IodmFyIGE9MCxiOyhiPXRoaXNbYV0pIT1udWxsO2ErKyl7Yi5ub2RlVHlwZT09PTEmJmYuY2xlYW5EYXRhKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSk7d2hpbGUoYi5maXJzdENoaWxkKWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKX1yZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oYSxiKXthPWE9PW51bGw/ITE6YSxiPWI9PW51bGw/YTpiO3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBmLmNsb25lKHRoaXMsYSxiKX0pfSxodG1sOmZ1bmN0aW9uKGEpe2lmKGE9PT1iKXJldHVybiB0aGlzWzBdJiZ0aGlzWzBdLm5vZGVUeXBlPT09MT90aGlzWzBdLmlubmVySFRNTC5yZXBsYWNlKFcsIiIpOm51bGw7aWYodHlwZW9mIGE9PSJzdHJpbmciJiYhYmEudGVzdChhKSYmKGYuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZXx8IVgudGVzdChhKSkmJiFiZ1soWi5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7YT1hLnJlcGxhY2UoWSwiPCQxPjwvJDI+Iik7dHJ5e2Zvcih2YXIgYz0wLGQ9dGhpcy5sZW5ndGg7YzxkO2MrKyl0aGlzW2NdLm5vZGVUeXBlPT09MSYmKGYuY2xlYW5EYXRhKHRoaXNbY10uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSksdGhpc1tjXS5pbm5lckhUTUw9YSl9Y2F0Y2goZSl7dGhpcy5lbXB0eSgpLmFwcGVuZChhKX19ZWxzZSBmLmlzRnVuY3Rpb24oYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyk7Yy5odG1sKGEuY2FsbCh0aGlzLGIsYy5odG1sKCkpKX0pOnRoaXMuZW1wdHkoKS5hcHBlbmQoYSk7cmV0dXJuIHRoaXN9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKGEpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSl7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7dmFyIGM9Zih0aGlzKSxkPWMuaHRtbCgpO2MucmVwbGFjZVdpdGgoYS5jYWxsKHRoaXMsYixkKSl9KTt0eXBlb2YgYSE9InN0cmluZyImJihhPWYoYSkuZGV0YWNoKCkpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5leHRTaWJsaW5nLGM9dGhpcy5wYXJlbnROb2RlO2YodGhpcykucmVtb3ZlKCksYj9mKGIpLmJlZm9yZShhKTpmKGMpLmFwcGVuZChhKX0pfXJldHVybiB0aGlzLmxlbmd0aD90aGlzLnB1c2hTdGFjayhmKGYuaXNGdW5jdGlvbihhKT9hKCk6YSksInJlcGxhY2VXaXRoIixhKTp0aGlzfSxkZXRhY2g6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucmVtb3ZlKGEsITApfSxkb21NYW5pcDpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZyxoLGksaj1hWzBdLGs9W107aWYoIWYuc3VwcG9ydC5jaGVja0Nsb25lJiZhcmd1bWVudHMubGVuZ3RoPT09MyYmdHlwZW9mIGo9PSJzdHJpbmciJiZiZC50ZXN0KGopKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmKHRoaXMpLmRvbU1hbmlwKGEsYyxkLCEwKX0pO2lmKGYuaXNGdW5jdGlvbihqKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe3ZhciBnPWYodGhpcyk7YVswXT1qLmNhbGwodGhpcyxlLGM/Zy5odG1sKCk6YiksZy5kb21NYW5pcChhLGMsZCl9KTtpZih0aGlzWzBdKXtpPWomJmoucGFyZW50Tm9kZSxmLnN1cHBvcnQucGFyZW50Tm9kZSYmaSYmaS5ub2RlVHlwZT09PTExJiZpLmNoaWxkTm9kZXMubGVuZ3RoPT09dGhpcy5sZW5ndGg/ZT17ZnJhZ21lbnQ6aX06ZT1mLmJ1aWxkRnJhZ21lbnQoYSx0aGlzLGspLGg9ZS5mcmFnbWVudCxoLmNoaWxkTm9kZXMubGVuZ3RoPT09MT9nPWg9aC5maXJzdENoaWxkOmc9aC5maXJzdENoaWxkO2lmKGcpe2M9YyYmZi5ub2RlTmFtZShnLCJ0ciIpO2Zvcih2YXIgbD0wLG09dGhpcy5sZW5ndGgsbj1tLTE7bDxtO2wrKylkLmNhbGwoYz9iaSh0aGlzW2xdLGcpOnRoaXNbbF0sZS5jYWNoZWFibGV8fG0+MSYmbDxuP2YuY2xvbmUoaCwhMCwhMCk6aCl9ay5sZW5ndGgmJmYuZWFjaChrLGJwKX1yZXR1cm4gdGhpc319KSxmLmJ1aWxkRnJhZ21lbnQ9ZnVuY3Rpb24oYSxiLGQpe3ZhciBlLGcsaCxpLGo9YVswXTtiJiZiWzBdJiYoaT1iWzBdLm93bmVyRG9jdW1lbnR8fGJbMF0pLGkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudHx8KGk9YyksYS5sZW5ndGg9PT0xJiZ0eXBlb2Ygaj09InN0cmluZyImJmoubGVuZ3RoPDUxMiYmaT09PWMmJmouY2hhckF0KDApPT09IjwiJiYhYmIudGVzdChqKSYmKGYuc3VwcG9ydC5jaGVja0Nsb25lfHwhYmQudGVzdChqKSkmJihmLnN1cHBvcnQuaHRtbDVDbG9uZXx8IWJjLnRlc3QoaikpJiYoZz0hMCxoPWYuZnJhZ21lbnRzW2pdLGgmJmghPT0xJiYoZT1oKSksZXx8KGU9aS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksZi5jbGVhbihhLGksZSxkKSksZyYmKGYuZnJhZ21lbnRzW2pdPWg/ZToxKTtyZXR1cm57ZnJhZ21lbnQ6ZSxjYWNoZWFibGU6Z319LGYuZnJhZ21lbnRzPXt9LGYuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGEsYil7Zi5mblthXT1mdW5jdGlvbihjKXt2YXIgZD1bXSxlPWYoYyksZz10aGlzLmxlbmd0aD09PTEmJnRoaXNbMF0ucGFyZW50Tm9kZTtpZihnJiZnLm5vZGVUeXBlPT09MTEmJmcuY2hpbGROb2Rlcy5sZW5ndGg9PT0xJiZlLmxlbmd0aD09PTEpe2VbYl0odGhpc1swXSk7cmV0dXJuIHRoaXN9Zm9yKHZhciBoPTAsaT1lLmxlbmd0aDtoPGk7aCsrKXt2YXIgaj0oaD4wP3RoaXMuY2xvbmUoITApOnRoaXMpLmdldCgpO2YoZVtoXSlbYl0oaiksZD1kLmNvbmNhdChqKX1yZXR1cm4gdGhpcy5wdXNoU3RhY2soZCxhLGUuc2VsZWN0b3IpfX0pLGYuZXh0ZW5kKHtjbG9uZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxnLGg9Zi5zdXBwb3J0Lmh0bWw1Q2xvbmV8fCFiYy50ZXN0KCI8IithLm5vZGVOYW1lKT9hLmNsb25lTm9kZSghMCk6Ym8oYSk7aWYoKCFmLnN1cHBvcnQubm9DbG9uZUV2ZW50fHwhZi5zdXBwb3J0Lm5vQ2xvbmVDaGVja2VkKSYmKGEubm9kZVR5cGU9PT0xfHxhLm5vZGVUeXBlPT09MTEpJiYhZi5pc1hNTERvYyhhKSl7YmsoYSxoKSxkPWJsKGEpLGU9YmwoaCk7Zm9yKGc9MDtkW2ddOysrZyllW2ddJiZiayhkW2ddLGVbZ10pfWlmKGIpe2JqKGEsaCk7aWYoYyl7ZD1ibChhKSxlPWJsKGgpO2ZvcihnPTA7ZFtnXTsrK2cpYmooZFtnXSxlW2ddKX19ZD1lPW51bGw7cmV0dXJuIGh9LGNsZWFuOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBnO2I9Ynx8Yyx0eXBlb2YgYi5jcmVhdGVFbGVtZW50PT0idW5kZWZpbmVkIiYmKGI9Yi5vd25lckRvY3VtZW50fHxiWzBdJiZiWzBdLm93bmVyRG9jdW1lbnR8fGMpO3ZhciBoPVtdLGk7Zm9yKHZhciBqPTAsazsoaz1hW2pdKSE9bnVsbDtqKyspe3R5cGVvZiBrPT0ibnVtYmVyIiYmKGsrPSIiKTtpZighayljb250aW51ZTtpZih0eXBlb2Ygaz09InN0cmluZyIpaWYoIV8udGVzdChrKSlrPWIuY3JlYXRlVGV4dE5vZGUoayk7ZWxzZXtrPWsucmVwbGFjZShZLCI8JDE+PC8kMj4iKTt2YXIgbD0oWi5leGVjKGspfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLG09YmdbbF18fGJnLl9kZWZhdWx0LG49bVswXSxvPWIuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yj09PWM/YmguYXBwZW5kQ2hpbGQobyk6VShiKS5hcHBlbmRDaGlsZChvKSxvLmlubmVySFRNTD1tWzFdK2srbVsyXTt3aGlsZShuLS0pbz1vLmxhc3RDaGlsZDtpZighZi5zdXBwb3J0LnRib2R5KXt2YXIgcD0kLnRlc3QoaykscT1sPT09InRhYmxlIiYmIXA/by5maXJzdENoaWxkJiZvLmZpcnN0Q2hpbGQuY2hpbGROb2RlczptWzFdPT09Ijx0YWJsZT4iJiYhcD9vLmNoaWxkTm9kZXM6W107Zm9yKGk9cS5sZW5ndGgtMTtpPj0wOy0taSlmLm5vZGVOYW1lKHFbaV0sInRib2R5IikmJiFxW2ldLmNoaWxkTm9kZXMubGVuZ3RoJiZxW2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocVtpXSl9IWYuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSYmWC50ZXN0KGspJiZvLmluc2VydEJlZm9yZShiLmNyZWF0ZVRleHROb2RlKFguZXhlYyhrKVswXSksby5maXJzdENoaWxkKSxrPW8uY2hpbGROb2Rlc312YXIgcjtpZighZi5zdXBwb3J0LmFwcGVuZENoZWNrZWQpaWYoa1swXSYmdHlwZW9mIChyPWsubGVuZ3RoKT09Im51bWJlciIpZm9yKGk9MDtpPHI7aSsrKWJuKGtbaV0pO2Vsc2UgYm4oayk7ay5ub2RlVHlwZT9oLnB1c2goayk6aD1mLm1lcmdlKGgsayl9aWYoZCl7Zz1mdW5jdGlvbihhKXtyZXR1cm4hYS50eXBlfHxiZS50ZXN0KGEudHlwZSl9O2ZvcihqPTA7aFtqXTtqKyspaWYoZSYmZi5ub2RlTmFtZShoW2pdLCJzY3JpcHQiKSYmKCFoW2pdLnR5cGV8fGhbal0udHlwZS50b0xvd2VyQ2FzZSgpPT09InRleHQvamF2YXNjcmlwdCIpKWUucHVzaChoW2pdLnBhcmVudE5vZGU/aFtqXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGhbal0pOmhbal0pO2Vsc2V7aWYoaFtqXS5ub2RlVHlwZT09PTEpe3ZhciBzPWYuZ3JlcChoW2pdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSxnKTtoLnNwbGljZS5hcHBseShoLFtqKzEsMF0uY29uY2F0KHMpKX1kLmFwcGVuZENoaWxkKGhbal0pfX1yZXR1cm4gaH0sY2xlYW5EYXRhOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZD1mLmNhY2hlLGU9Zi5ldmVudC5zcGVjaWFsLGc9Zi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG87Zm9yKHZhciBoPTAsaTsoaT1hW2hdKSE9bnVsbDtoKyspe2lmKGkubm9kZU5hbWUmJmYubm9EYXRhW2kubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pY29udGludWU7Yz1pW2YuZXhwYW5kb107aWYoYyl7Yj1kW2NdO2lmKGImJmIuZXZlbnRzKXtmb3IodmFyIGogaW4gYi5ldmVudHMpZVtqXT9mLmV2ZW50LnJlbW92ZShpLGopOmYucmVtb3ZlRXZlbnQoaSxqLGIuaGFuZGxlKTtiLmhhbmRsZSYmKGIuaGFuZGxlLmVsZW09bnVsbCl9Zz9kZWxldGUgaVtmLmV4cGFuZG9dOmkucmVtb3ZlQXR0cmlidXRlJiZpLnJlbW92ZUF0dHJpYnV0ZShmLmV4cGFuZG8pLGRlbGV0ZSBkW2NdfX19fSk7dmFyIGJxPS9hbHBoYVwoW14pXSpcKS9pLGJyPS9vcGFjaXR5PShbXildKikvLGJzPS8oW0EtWl18Xm1zKS9nLGJ0PS9eLT9cZCsoPzpweCk/JC9pLGJ1PS9eLT9cZC8sYnY9L14oW1wtK10pPShbXC0rLlxkZV0rKS8sYnc9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LGJ4PVsiTGVmdCIsIlJpZ2h0Il0sYnk9WyJUb3AiLCJCb3R0b20iXSxieixiQSxiQjtmLmZuLmNzcz1mdW5jdGlvbihhLGMpe2lmKGFyZ3VtZW50cy5sZW5ndGg9PT0yJiZjPT09YilyZXR1cm4gdGhpcztyZXR1cm4gZi5hY2Nlc3ModGhpcyxhLGMsITAsZnVuY3Rpb24oYSxjLGQpe3JldHVybiBkIT09Yj9mLnN0eWxlKGEsYyxkKTpmLmNzcyhhLGMpfSl9LGYuZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGEsYil7aWYoYil7dmFyIGM9YnooYSwib3BhY2l0eSIsIm9wYWNpdHkiKTtyZXR1cm4gYz09PSIiPyIxIjpjfXJldHVybiBhLnN0eWxlLm9wYWNpdHl9fX0sY3NzTnVtYmVyOntmaWxsT3BhY2l0eTohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6Zi5zdXBwb3J0LmNzc0Zsb2F0PyJjc3NGbG9hdCI6InN0eWxlRmxvYXQifSxzdHlsZTpmdW5jdGlvbihhLGMsZCxlKXtpZighIWEmJmEubm9kZVR5cGUhPT0zJiZhLm5vZGVUeXBlIT09OCYmISFhLnN0eWxlKXt2YXIgZyxoLGk9Zi5jYW1lbENhc2UoYyksaj1hLnN0eWxlLGs9Zi5jc3NIb29rc1tpXTtjPWYuY3NzUHJvcHNbaV18fGk7aWYoZD09PWIpe2lmKGsmJiJnZXQiaW4gayYmKGc9ay5nZXQoYSwhMSxlKSkhPT1iKXJldHVybiBnO3JldHVybiBqW2NdfWg9dHlwZW9mIGQsaD09PSJzdHJpbmciJiYoZz1idi5leGVjKGQpKSYmKGQ9KyhnWzFdKzEpKitnWzJdK3BhcnNlRmxvYXQoZi5jc3MoYSxjKSksaD0ibnVtYmVyIik7aWYoZD09bnVsbHx8aD09PSJudW1iZXIiJiZpc05hTihkKSlyZXR1cm47aD09PSJudW1iZXIiJiYhZi5jc3NOdW1iZXJbaV0mJihkKz0icHgiKTtpZigha3x8ISgic2V0ImluIGspfHwoZD1rLnNldChhLGQpKSE9PWIpdHJ5e2pbY109ZH1jYXRjaChsKXt9fX0sY3NzOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxnO2M9Zi5jYW1lbENhc2UoYyksZz1mLmNzc0hvb2tzW2NdLGM9Zi5jc3NQcm9wc1tjXXx8YyxjPT09ImNzc0Zsb2F0IiYmKGM9ImZsb2F0Iik7aWYoZyYmImdldCJpbiBnJiYoZT1nLmdldChhLCEwLGQpKSE9PWIpcmV0dXJuIGU7aWYoYnopcmV0dXJuIGJ6KGEsYyl9LHN3YXA6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXt9O2Zvcih2YXIgZSBpbiBiKWRbZV09YS5zdHlsZVtlXSxhLnN0eWxlW2VdPWJbZV07Yy5jYWxsKGEpO2ZvcihlIGluIGIpYS5zdHlsZVtlXT1kW2VdfX0pLGYuY3VyQ1NTPWYuY3NzLGYuZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oYSxiKXtmLmNzc0hvb2tzW2JdPXtnZXQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlO2lmKGMpe2lmKGEub2Zmc2V0V2lkdGghPT0wKXJldHVybiBiQyhhLGIsZCk7Zi5zd2FwKGEsYncsZnVuY3Rpb24oKXtlPWJDKGEsYixkKX0pO3JldHVybiBlfX0sc2V0OmZ1bmN0aW9uKGEsYil7aWYoIWJ0LnRlc3QoYikpcmV0dXJuIGI7Yj1wYXJzZUZsb2F0KGIpO2lmKGI+PTApcmV0dXJuIGIrInB4In19fSksZi5zdXBwb3J0Lm9wYWNpdHl8fChmLmNzc0hvb2tzLm9wYWNpdHk9e2dldDpmdW5jdGlvbihhLGIpe3JldHVybiBici50ZXN0KChiJiZhLmN1cnJlbnRTdHlsZT9hLmN1cnJlbnRTdHlsZS5maWx0ZXI6YS5zdHlsZS5maWx0ZXIpfHwiIik/cGFyc2VGbG9hdChSZWdFeHAuJDEpLzEwMCsiIjpiPyIxIjoiIn0sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5zdHlsZSxkPWEuY3VycmVudFN0eWxlLGU9Zi5pc051bWVyaWMoYik/ImFscGhhKG9wYWNpdHk9IitiKjEwMCsiKSI6IiIsZz1kJiZkLmZpbHRlcnx8Yy5maWx0ZXJ8fCIiO2Muem9vbT0xO2lmKGI+PTEmJmYudHJpbShnLnJlcGxhY2UoYnEsIiIpKT09PSIiKXtjLnJlbW92ZUF0dHJpYnV0ZSgiZmlsdGVyIik7aWYoZCYmIWQuZmlsdGVyKXJldHVybn1jLmZpbHRlcj1icS50ZXN0KGcpP2cucmVwbGFjZShicSxlKTpnKyIgIitlfX0pLGYoZnVuY3Rpb24oKXtmLnN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodHx8KGYuY3NzSG9va3MubWFyZ2luUmlnaHQ9e2dldDpmdW5jdGlvbihhLGIpe3ZhciBjO2Yuc3dhcChhLHtkaXNwbGF5OiJpbmxpbmUtYmxvY2sifSxmdW5jdGlvbigpe2I/Yz1ieihhLCJtYXJnaW4tcmlnaHQiLCJtYXJnaW5SaWdodCIpOmM9YS5zdHlsZS5tYXJnaW5SaWdodH0pO3JldHVybiBjfX0pfSksYy5kZWZhdWx0VmlldyYmYy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlJiYoYkE9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU7Yj1iLnJlcGxhY2UoYnMsIi0kMSIpLnRvTG93ZXJDYXNlKCksKGQ9YS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KSYmKGU9ZC5nZXRDb21wdXRlZFN0eWxlKGEsbnVsbCkpJiYoYz1lLmdldFByb3BlcnR5VmFsdWUoYiksYz09PSIiJiYhZi5jb250YWlucyhhLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGEpJiYoYz1mLnN0eWxlKGEsYikpKTtyZXR1cm4gY30pLGMuZG9jdW1lbnRFbGVtZW50LmN1cnJlbnRTdHlsZSYmKGJCPWZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9YS5jdXJyZW50U3R5bGUmJmEuY3VycmVudFN0eWxlW2JdLGc9YS5zdHlsZTtmPT09bnVsbCYmZyYmKGU9Z1tiXSkmJihmPWUpLCFidC50ZXN0KGYpJiZidS50ZXN0KGYpJiYoYz1nLmxlZnQsZD1hLnJ1bnRpbWVTdHlsZSYmYS5ydW50aW1lU3R5bGUubGVmdCxkJiYoYS5ydW50aW1lU3R5bGUubGVmdD1hLmN1cnJlbnRTdHlsZS5sZWZ0KSxnLmxlZnQ9Yj09PSJmb250U2l6ZSI/IjFlbSI6Znx8MCxmPWcucGl4ZWxMZWZ0KyJweCIsZy5sZWZ0PWMsZCYmKGEucnVudGltZVN0eWxlLmxlZnQ9ZCkpO3JldHVybiBmPT09IiI/ImF1dG8iOmZ9KSxiej1iQXx8YkIsZi5leHByJiZmLmV4cHIuZmlsdGVycyYmKGYuZXhwci5maWx0ZXJzLmhpZGRlbj1mdW5jdGlvbihhKXt2YXIgYj1hLm9mZnNldFdpZHRoLGM9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGI9PT0wJiZjPT09MHx8IWYuc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHMmJihhLnN0eWxlJiZhLnN0eWxlLmRpc3BsYXl8fGYuY3NzKGEsImRpc3BsYXkiKSk9PT0ibm9uZSJ9LGYuZXhwci5maWx0ZXJzLnZpc2libGU9ZnVuY3Rpb24oYSl7cmV0dXJuIWYuZXhwci5maWx0ZXJzLmhpZGRlbihhKX0pO3ZhciBiRD0vJTIwL2csYkU9L1xbXF0kLyxiRj0vXHI/XG4vZyxiRz0vIy4qJC8sYkg9L14oLio/KTpbIFx0XSooW15cclxuXSopXHI/JC9tZyxiST0vXig/OmNvbG9yfGRhdGV8ZGF0ZXRpbWV8ZGF0ZXRpbWUtbG9jYWx8ZW1haWx8aGlkZGVufG1vbnRofG51bWJlcnxwYXNzd29yZHxyYW5nZXxzZWFyY2h8dGVsfHRleHR8dGltZXx1cmx8d2VlaykkL2ksYko9L14oPzphYm91dHxhcHB8YXBwXC1zdG9yYWdlfC4rXC1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxiSz0vXig/OkdFVHxIRUFEKSQvLGJMPS9eXC9cLy8sYk09L1w/LyxiTj0vPHNjcmlwdFxiW148XSooPzooPyE8XC9zY3JpcHQ+KTxbXjxdKikqPFwvc2NyaXB0Pi9naSxiTz0vXig/OnNlbGVjdHx0ZXh0YXJlYSkvaSxiUD0vXHMrLyxiUT0vKFs/Jl0pXz1bXiZdKi8sYlI9L14oW1x3XCtcLlwtXSs6KSg/OlwvXC8oW15cLz8jOl0qKSg/OjooXGQrKSk/KT8vLGJTPWYuZm4ubG9hZCxiVD17fSxiVT17fSxiVixiVyxiWD1bIiovIl0rWyIqIl07dHJ5e2JWPWUuaHJlZn1jYXRjaChiWSl7YlY9Yy5jcmVhdGVFbGVtZW50KCJhIiksYlYuaHJlZj0iIixiVj1iVi5ocmVmfWJXPWJSLmV4ZWMoYlYudG9Mb3dlckNhc2UoKSl8fFtdLGYuZm4uZXh0ZW5kKHtsb2FkOmZ1bmN0aW9uKGEsYyxkKXtpZih0eXBlb2YgYSE9InN0cmluZyImJmJTKXJldHVybiBiUy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYoIXRoaXMubGVuZ3RoKXJldHVybiB0aGlzO3ZhciBlPWEuaW5kZXhPZigiICIpO2lmKGU+PTApe3ZhciBnPWEuc2xpY2UoZSxhLmxlbmd0aCk7YT1hLnNsaWNlKDAsZSl9dmFyIGg9IkdFVCI7YyYmKGYuaXNGdW5jdGlvbihjKT8oZD1jLGM9Yik6dHlwZW9mIGM9PSJvYmplY3QiJiYoYz1mLnBhcmFtKGMsZi5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpLGg9IlBPU1QiKSk7dmFyIGk9dGhpcztmLmFqYXgoe3VybDphLHR5cGU6aCxkYXRhVHlwZToiaHRtbCIsZGF0YTpjLGNvbXBsZXRlOmZ1bmN0aW9uKGEsYixjKXtjPWEucmVzcG9uc2VUZXh0LGEuaXNSZXNvbHZlZCgpJiYoYS5kb25lKGZ1bmN0aW9uKGEpe2M9YX0pLGkuaHRtbChnP2YoIjxkaXY+IikuYXBwZW5kKGMucmVwbGFjZShiTiwiIikpLmZpbmQoZyk6YykpLGQmJmkuZWFjaChkLFtjLGIsYV0pfX0pO3JldHVybiB0aGlzfSxzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gZi5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnRzP2YubWFrZUFycmF5KHRoaXMuZWxlbWVudHMpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lJiYhdGhpcy5kaXNhYmxlZCYmKHRoaXMuY2hlY2tlZHx8Yk8udGVzdCh0aGlzLm5vZGVOYW1lKXx8YkkudGVzdCh0aGlzLnR5cGUpKX0pLm1hcChmdW5jdGlvbihhLGIpe3ZhciBjPWYodGhpcykudmFsKCk7cmV0dXJuIGM9PW51bGw/bnVsbDpmLmlzQXJyYXkoYyk/Zi5tYXAoYyxmdW5jdGlvbihhLGMpe3JldHVybntuYW1lOmIubmFtZSx2YWx1ZTphLnJlcGxhY2UoYkYsIlxyXG4iKX19KTp7bmFtZTpiLm5hbWUsdmFsdWU6Yy5yZXBsYWNlKGJGLCJcclxuIil9fSkuZ2V0KCl9fSksZi5lYWNoKCJhamF4U3RhcnQgYWpheFN0b3AgYWpheENvbXBsZXRlIGFqYXhFcnJvciBhamF4U3VjY2VzcyBhamF4U2VuZCIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe2YuZm5bYl09ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMub24oYixhKX19KSxmLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oYSxjKXtmW2NdPWZ1bmN0aW9uKGEsZCxlLGcpe2YuaXNGdW5jdGlvbihkKSYmKGc9Z3x8ZSxlPWQsZD1iKTtyZXR1cm4gZi5hamF4KHt0eXBlOmMsdXJsOmEsZGF0YTpkLHN1Y2Nlc3M6ZSxkYXRhVHlwZTpnfSl9fSksZi5leHRlbmQoe2dldFNjcmlwdDpmdW5jdGlvbihhLGMpe3JldHVybiBmLmdldChhLGIsYywic2NyaXB0Iil9LGdldEpTT046ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmdldChhLGIsYywianNvbiIpfSxhamF4U2V0dXA6ZnVuY3Rpb24oYSxiKXtiP2JfKGEsZi5hamF4U2V0dGluZ3MpOihiPWEsYT1mLmFqYXhTZXR0aW5ncyksYl8oYSxiKTtyZXR1cm4gYX0sYWpheFNldHRpbmdzOnt1cmw6YlYsaXNMb2NhbDpiSi50ZXN0KGJXWzFdKSxnbG9iYWw6ITAsdHlwZToiR0VUIixjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIixwcm9jZXNzRGF0YTohMCxhc3luYzohMCxhY2NlcHRzOnt4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGh0bWw6InRleHQvaHRtbCIsdGV4dDoidGV4dC9wbGFpbiIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0IiwiKiI6Ylh9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjphLlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpmLnBhcnNlSlNPTiwidGV4dCB4bWwiOmYucGFyc2VYTUx9LGZsYXRPcHRpb25zOntjb250ZXh0OiEwLHVybDohMH19LGFqYXhQcmVmaWx0ZXI6YlooYlQpLGFqYXhUcmFuc3BvcnQ6YlooYlUpLGFqYXg6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiB3KGEsYyxsLG0pe2lmKHMhPT0yKXtzPTIscSYmY2xlYXJUaW1lb3V0KHEpLHA9YixuPW18fCIiLHYucmVhZHlTdGF0ZT1hPjA/NDowO3ZhciBvLHIsdSx3PWMseD1sP2NiKGQsdixsKTpiLHksejtpZihhPj0yMDAmJmE8MzAwfHxhPT09MzA0KXtpZihkLmlmTW9kaWZpZWQpe2lmKHk9di5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpKWYubGFzdE1vZGlmaWVkW2tdPXk7aWYoej12LmdldFJlc3BvbnNlSGVhZGVyKCJFdGFnIikpZi5ldGFnW2tdPXp9aWYoYT09PTMwNCl3PSJub3Rtb2RpZmllZCIsbz0hMDtlbHNlIHRyeXtyPWNjKGQseCksdz0ic3VjY2VzcyIsbz0hMH1jYXRjaChBKXt3PSJwYXJzZXJlcnJvciIsdT1BfX1lbHNle3U9dztpZighd3x8YSl3PSJlcnJvciIsYTwwJiYoYT0wKX12LnN0YXR1cz1hLHYuc3RhdHVzVGV4dD0iIisoY3x8dyksbz9oLnJlc29sdmVXaXRoKGUsW3Isdyx2XSk6aC5yZWplY3RXaXRoKGUsW3Ysdyx1XSksdi5zdGF0dXNDb2RlKGopLGo9Yix0JiZnLnRyaWdnZXIoImFqYXgiKyhvPyJTdWNjZXNzIjoiRXJyb3IiKSxbdixkLG8/cjp1XSksaS5maXJlV2l0aChlLFt2LHddKSx0JiYoZy50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFt2LGRdKSwtLWYuYWN0aXZlfHxmLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpfX10eXBlb2YgYT09Im9iamVjdCImJihjPWEsYT1iKSxjPWN8fHt9O3ZhciBkPWYuYWpheFNldHVwKHt9LGMpLGU9ZC5jb250ZXh0fHxkLGc9ZSE9PWQmJihlLm5vZGVUeXBlfHxlIGluc3RhbmNlb2YgZik/ZihlKTpmLmV2ZW50LGg9Zi5EZWZlcnJlZCgpLGk9Zi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iiksaj1kLnN0YXR1c0NvZGV8fHt9LGssbD17fSxtPXt9LG4sbyxwLHEscixzPTAsdCx1LHY9e3JlYWR5U3RhdGU6MCxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7aWYoIXMpe3ZhciBjPWEudG9Mb3dlckNhc2UoKTthPW1bY109bVtjXXx8YSxsW2FdPWJ9cmV0dXJuIHRoaXN9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBzPT09Mj9uOm51bGx9LGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGEpe3ZhciBjO2lmKHM9PT0yKXtpZighbyl7bz17fTt3aGlsZShjPWJILmV4ZWMobikpb1tjWzFdLnRvTG93ZXJDYXNlKCldPWNbMl19Yz1vW2EudG9Mb3dlckNhc2UoKV19cmV0dXJuIGM9PT1iP251bGw6Y30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihhKXtzfHwoZC5taW1lVHlwZT1hKTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oYSl7YT1hfHwiYWJvcnQiLHAmJnAuYWJvcnQoYSksdygwLGEpO3JldHVybiB0aGlzfX07aC5wcm9taXNlKHYpLHYuc3VjY2Vzcz12LmRvbmUsdi5lcnJvcj12LmZhaWwsdi5jb21wbGV0ZT1pLmFkZCx2LnN0YXR1c0NvZGU9ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI7aWYoczwyKWZvcihiIGluIGEpaltiXT1baltiXSxhW2JdXTtlbHNlIGI9YVt2LnN0YXR1c10sdi50aGVuKGIsYil9cmV0dXJuIHRoaXN9LGQudXJsPSgoYXx8ZC51cmwpKyIiKS5yZXBsYWNlKGJHLCIiKS5yZXBsYWNlKGJMLGJXWzFdKyIvLyIpLGQuZGF0YVR5cGVzPWYudHJpbShkLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkuc3BsaXQoYlApLGQuY3Jvc3NEb21haW49PW51bGwmJihyPWJSLmV4ZWMoZC51cmwudG9Mb3dlckNhc2UoKSksZC5jcm9zc0RvbWFpbj0hKCFyfHxyWzFdPT1iV1sxXSYmclsyXT09YldbMl0mJihyWzNdfHwoclsxXT09PSJodHRwOiI/ODA6NDQzKSk9PShiV1szXXx8KGJXWzFdPT09Imh0dHA6Ij84MDo0NDMpKSkpLGQuZGF0YSYmZC5wcm9jZXNzRGF0YSYmdHlwZW9mIGQuZGF0YSE9InN0cmluZyImJihkLmRhdGE9Zi5wYXJhbShkLmRhdGEsZC50cmFkaXRpb25hbCkpLGIkKGJULGQsYyx2KTtpZihzPT09MilyZXR1cm4hMTt0PWQuZ2xvYmFsLGQudHlwZT1kLnR5cGUudG9VcHBlckNhc2UoKSxkLmhhc0NvbnRlbnQ9IWJLLnRlc3QoZC50eXBlKSx0JiZmLmFjdGl2ZSsrPT09MCYmZi5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKTtpZighZC5oYXNDb250ZW50KXtkLmRhdGEmJihkLnVybCs9KGJNLnRlc3QoZC51cmwpPyImIjoiPyIpK2QuZGF0YSxkZWxldGUgZC5kYXRhKSxrPWQudXJsO2lmKGQuY2FjaGU9PT0hMSl7dmFyIHg9Zi5ub3coKSx5PWQudXJsLnJlcGxhY2UoYlEsIiQxXz0iK3gpO2QudXJsPXkrKHk9PT1kLnVybD8oYk0udGVzdChkLnVybCk/IiYiOiI/IikrIl89Iit4OiIiKX19KGQuZGF0YSYmZC5oYXNDb250ZW50JiZkLmNvbnRlbnRUeXBlIT09ITF8fGMuY29udGVudFR5cGUpJiZ2LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsZC5jb250ZW50VHlwZSksZC5pZk1vZGlmaWVkJiYoaz1rfHxkLnVybCxmLmxhc3RNb2RpZmllZFtrXSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsZi5sYXN0TW9kaWZpZWRba10pLGYuZXRhZ1trXSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixmLmV0YWdba10pKSx2LnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsZC5kYXRhVHlwZXNbMF0mJmQuYWNjZXB0c1tkLmRhdGFUeXBlc1swXV0/ZC5hY2NlcHRzW2QuZGF0YVR5cGVzWzBdXSsoZC5kYXRhVHlwZXNbMF0hPT0iKiI/IiwgIitiWCsiOyBxPTAuMDEiOiIiKTpkLmFjY2VwdHNbIioiXSk7Zm9yKHUgaW4gZC5oZWFkZXJzKXYuc2V0UmVxdWVzdEhlYWRlcih1LGQuaGVhZGVyc1t1XSk7aWYoZC5iZWZvcmVTZW5kJiYoZC5iZWZvcmVTZW5kLmNhbGwoZSx2LGQpPT09ITF8fHM9PT0yKSl7di5hYm9ydCgpO3JldHVybiExfWZvcih1IGlue3N1Y2Nlc3M6MSxlcnJvcjoxLGNvbXBsZXRlOjF9KXZbdV0oZFt1XSk7cD1iJChiVSxkLGMsdik7aWYoIXApdygtMSwiTm8gVHJhbnNwb3J0Iik7ZWxzZXt2LnJlYWR5U3RhdGU9MSx0JiZnLnRyaWdnZXIoImFqYXhTZW5kIixbdixkXSksZC5hc3luYyYmZC50aW1lb3V0PjAmJihxPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2LmFib3J0KCJ0aW1lb3V0Iil9LGQudGltZW91dCkpO3RyeXtzPTEscC5zZW5kKGwsdyl9Y2F0Y2goeil7aWYoczwyKXcoLTEseik7ZWxzZSB0aHJvdyB6fX1yZXR1cm4gdn0scGFyYW06ZnVuY3Rpb24oYSxjKXt2YXIgZD1bXSxlPWZ1bmN0aW9uKGEsYil7Yj1mLmlzRnVuY3Rpb24oYik/YigpOmIsZFtkLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGEpKyI9IitlbmNvZGVVUklDb21wb25lbnQoYil9O2M9PT1iJiYoYz1mLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCk7aWYoZi5pc0FycmF5KGEpfHxhLmpxdWVyeSYmIWYuaXNQbGFpbk9iamVjdChhKSlmLmVhY2goYSxmdW5jdGlvbigpe2UodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IodmFyIGcgaW4gYSljYShnLGFbZ10sYyxlKTtyZXR1cm4gZC5qb2luKCImIikucmVwbGFjZShiRCwiKyIpfX0pLGYuZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fX0pO3ZhciBjZD1mLm5vdygpLGNlPS8oXD0pXD8oJnwkKXxcP1w/L2k7Zi5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3JldHVybiBmLmV4cGFuZG8rIl8iK2NkKyt9fSksZi5hamF4UHJlZmlsdGVyKCJqc29uIGpzb25wIixmdW5jdGlvbihiLGMsZCl7dmFyIGU9Yi5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiJiZ0eXBlb2YgYi5kYXRhPT0ic3RyaW5nIjtpZihiLmRhdGFUeXBlc1swXT09PSJqc29ucCJ8fGIuanNvbnAhPT0hMSYmKGNlLnRlc3QoYi51cmwpfHxlJiZjZS50ZXN0KGIuZGF0YSkpKXt2YXIgZyxoPWIuanNvbnBDYWxsYmFjaz1mLmlzRnVuY3Rpb24oYi5qc29ucENhbGxiYWNrKT9iLmpzb25wQ2FsbGJhY2soKTpiLmpzb25wQ2FsbGJhY2ssaT1hW2hdLGo9Yi51cmwsaz1iLmRhdGEsbD0iJDEiK2grIiQyIjtiLmpzb25wIT09ITEmJihqPWoucmVwbGFjZShjZSxsKSxiLnVybD09PWomJihlJiYoaz1rLnJlcGxhY2UoY2UsbCkpLGIuZGF0YT09PWsmJihqKz0oL1w/Ly50ZXN0KGopPyImIjoiPyIpK2IuanNvbnArIj0iK2gpKSksYi51cmw9aixiLmRhdGE9ayxhW2hdPWZ1bmN0aW9uKGEpe2c9W2FdfSxkLmFsd2F5cyhmdW5jdGlvbigpe2FbaF09aSxnJiZmLmlzRnVuY3Rpb24oaSkmJmFbaF0oZ1swXSl9KSxiLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtnfHxmLmVycm9yKGgrIiB3YXMgbm90IGNhbGxlZCIpO3JldHVybiBnWzBdfSxiLmRhdGFUeXBlc1swXT0ianNvbiI7cmV0dXJuInNjcmlwdCJ9fSksZi5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9qYXZhc2NyaXB0fGVjbWFzY3JpcHQvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGEpe2YuZ2xvYmFsRXZhbChhKTtyZXR1cm4gYX19fSksZi5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGEpe2EuY2FjaGU9PT1iJiYoYS5jYWNoZT0hMSksYS5jcm9zc0RvbWFpbiYmKGEudHlwZT0iR0VUIixhLmdsb2JhbD0hMSl9KSxmLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24oYSl7aWYoYS5jcm9zc0RvbWFpbil7dmFyIGQsZT1jLmhlYWR8fGMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXXx8Yy5kb2N1bWVudEVsZW1lbnQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZixnKXtkPWMuY3JlYXRlRWxlbWVudCgic2NyaXB0IiksZC5hc3luYz0iYXN5bmMiLGEuc2NyaXB0Q2hhcnNldCYmKGQuY2hhcnNldD1hLnNjcmlwdENoYXJzZXQpLGQuc3JjPWEudXJsLGQub25sb2FkPWQub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGEsYyl7aWYoY3x8IWQucmVhZHlTdGF0ZXx8L2xvYWRlZHxjb21wbGV0ZS8udGVzdChkLnJlYWR5U3RhdGUpKWQub25sb2FkPWQub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsZSYmZC5wYXJlbnROb2RlJiZlLnJlbW92ZUNoaWxkKGQpLGQ9YixjfHxnKDIwMCwic3VjY2VzcyIpfSxlLmluc2VydEJlZm9yZShkLGUuZmlyc3RDaGlsZCl9LGFib3J0OmZ1bmN0aW9uKCl7ZCYmZC5vbmxvYWQoMCwxKX19fX0pO3ZhciBjZj1hLkFjdGl2ZVhPYmplY3Q/ZnVuY3Rpb24oKXtmb3IodmFyIGEgaW4gY2gpY2hbYV0oMCwxKX06ITEsY2c9MCxjaDtmLmFqYXhTZXR0aW5ncy54aHI9YS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNMb2NhbCYmY2koKXx8Y2ooKX06Y2ksZnVuY3Rpb24oYSl7Zi5leHRlbmQoZi5zdXBwb3J0LHthamF4OiEhYSxjb3JzOiEhYSYmIndpdGhDcmVkZW50aWFscyJpbiBhfSl9KGYuYWpheFNldHRpbmdzLnhocigpKSxmLnN1cHBvcnQuYWpheCYmZi5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGMpe2lmKCFjLmNyb3NzRG9tYWlufHxmLnN1cHBvcnQuY29ycyl7dmFyIGQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZSxnKXt2YXIgaD1jLnhocigpLGksajtjLnVzZXJuYW1lP2gub3BlbihjLnR5cGUsYy51cmwsYy5hc3luYyxjLnVzZXJuYW1lLGMucGFzc3dvcmQpOmgub3BlbihjLnR5cGUsYy51cmwsYy5hc3luYyk7aWYoYy54aHJGaWVsZHMpZm9yKGogaW4gYy54aHJGaWVsZHMpaFtqXT1jLnhockZpZWxkc1tqXTtjLm1pbWVUeXBlJiZoLm92ZXJyaWRlTWltZVR5cGUmJmgub3ZlcnJpZGVNaW1lVHlwZShjLm1pbWVUeXBlKSwhYy5jcm9zc0RvbWFpbiYmIWVbIlgtUmVxdWVzdGVkLVdpdGgiXSYmKGVbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTt0cnl7Zm9yKGogaW4gZSloLnNldFJlcXVlc3RIZWFkZXIoaixlW2pdKX1jYXRjaChrKXt9aC5zZW5kKGMuaGFzQ29udGVudCYmYy5kYXRhfHxudWxsKSxkPWZ1bmN0aW9uKGEsZSl7dmFyIGosayxsLG0sbjt0cnl7aWYoZCYmKGV8fGgucmVhZHlTdGF0ZT09PTQpKXtkPWIsaSYmKGgub25yZWFkeXN0YXRlY2hhbmdlPWYubm9vcCxjZiYmZGVsZXRlIGNoW2ldKTtpZihlKWgucmVhZHlTdGF0ZSE9PTQmJmguYWJvcnQoKTtlbHNle2o9aC5zdGF0dXMsbD1oLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLG09e30sbj1oLnJlc3BvbnNlWE1MLG4mJm4uZG9jdW1lbnRFbGVtZW50JiYobS54bWw9biksbS50ZXh0PWgucmVzcG9uc2VUZXh0O3RyeXtrPWguc3RhdHVzVGV4dH1jYXRjaChvKXtrPSIifSFqJiZjLmlzTG9jYWwmJiFjLmNyb3NzRG9tYWluP2o9bS50ZXh0PzIwMDo0MDQ6aj09PTEyMjMmJihqPTIwNCl9fX1jYXRjaChwKXtlfHxnKC0xLHApfW0mJmcoaixrLG0sbCl9LCFjLmFzeW5jfHxoLnJlYWR5U3RhdGU9PT00P2QoKTooaT0rK2NnLGNmJiYoY2h8fChjaD17fSxmKGEpLnVubG9hZChjZikpLGNoW2ldPWQpLGgub25yZWFkeXN0YXRlY2hhbmdlPWQpfSxhYm9ydDpmdW5jdGlvbigpe2QmJmQoMCwxKX19fX0pO3ZhciBjaz17fSxjbCxjbSxjbj0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sY289L14oWytcLV09KT8oW1xkKy5cLV0rKShbYS16JV0qKSQvaSxjcCxjcT1bWyJoZWlnaHQiLCJtYXJnaW5Ub3AiLCJtYXJnaW5Cb3R0b20iLCJwYWRkaW5nVG9wIiwicGFkZGluZ0JvdHRvbSJdLFsid2lkdGgiLCJtYXJnaW5MZWZ0IiwibWFyZ2luUmlnaHQiLCJwYWRkaW5nTGVmdCIsInBhZGRpbmdSaWdodCJdLFsib3BhY2l0eSJdXSxjcjtmLmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhfHxhPT09MClyZXR1cm4gdGhpcy5hbmltYXRlKGN1KCJzaG93IiwzKSxhLGIsYyk7Zm9yKHZhciBnPTAsaD10aGlzLmxlbmd0aDtnPGg7ZysrKWQ9dGhpc1tnXSxkLnN0eWxlJiYoZT1kLnN0eWxlLmRpc3BsYXksIWYuX2RhdGEoZCwib2xkZGlzcGxheSIpJiZlPT09Im5vbmUiJiYoZT1kLnN0eWxlLmRpc3BsYXk9IiIpLGU9PT0iIiYmZi5jc3MoZCwiZGlzcGxheSIpPT09Im5vbmUiJiZmLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGN2KGQubm9kZU5hbWUpKSk7Zm9yKGc9MDtnPGg7ZysrKXtkPXRoaXNbZ107aWYoZC5zdHlsZSl7ZT1kLnN0eWxlLmRpc3BsYXk7aWYoZT09PSIifHxlPT09Im5vbmUiKWQuc3R5bGUuZGlzcGxheT1mLl9kYXRhKGQsIm9sZGRpc3BsYXkiKXx8IiJ9fXJldHVybiB0aGlzfSxoaWRlOmZ1bmN0aW9uKGEsYixjKXtpZihhfHxhPT09MClyZXR1cm4gdGhpcy5hbmltYXRlKGN1KCJoaWRlIiwzKSxhLGIsYyk7dmFyIGQsZSxnPTAsaD10aGlzLmxlbmd0aDtmb3IoO2c8aDtnKyspZD10aGlzW2ddLGQuc3R5bGUmJihlPWYuY3NzKGQsImRpc3BsYXkiKSxlIT09Im5vbmUiJiYhZi5fZGF0YShkLCJvbGRkaXNwbGF5IikmJmYuX2RhdGEoZCwib2xkZGlzcGxheSIsZSkpO2ZvcihnPTA7ZzxoO2crKyl0aGlzW2ddLnN0eWxlJiYodGhpc1tnXS5zdHlsZS5kaXNwbGF5PSJub25lIik7cmV0dXJuIHRoaXN9LF90b2dnbGU6Zi5mbi50b2dnbGUsdG9nZ2xlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10eXBlb2YgYT09ImJvb2xlYW4iO2YuaXNGdW5jdGlvbihhKSYmZi5pc0Z1bmN0aW9uKGIpP3RoaXMuX3RvZ2dsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6YT09bnVsbHx8ZD90aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1kP2E6Zih0aGlzKS5pcygiOmhpZGRlbiIpO2YodGhpcylbYj8ic2hvdyI6ImhpZGUiXSgpfSk6dGhpcy5hbmltYXRlKGN1KCJ0b2dnbGUiLDMpLGEsYixjKTtyZXR1cm4gdGhpc30sZmFkZVRvOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmZpbHRlcigiOmhpZGRlbiIpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6Yn0sYSxjLGQpfSxhbmltYXRlOmZ1bmN0aW9uKGEsYixjLGQpe2Z1bmN0aW9uIGcoKXtlLnF1ZXVlPT09ITEmJmYuX21hcmsodGhpcyk7dmFyIGI9Zi5leHRlbmQoe30sZSksYz10aGlzLm5vZGVUeXBlPT09MSxkPWMmJmYodGhpcykuaXMoIjpoaWRkZW4iKSxnLGgsaSxqLGssbCxtLG4sbztiLmFuaW1hdGVkUHJvcGVydGllcz17fTtmb3IoaSBpbiBhKXtnPWYuY2FtZWxDYXNlKGkpLGkhPT1nJiYoYVtnXT1hW2ldLGRlbGV0ZSBhW2ldKSxoPWFbZ10sZi5pc0FycmF5KGgpPyhiLmFuaW1hdGVkUHJvcGVydGllc1tnXT1oWzFdLGg9YVtnXT1oWzBdKTpiLmFuaW1hdGVkUHJvcGVydGllc1tnXT1iLnNwZWNpYWxFYXNpbmcmJmIuc3BlY2lhbEVhc2luZ1tnXXx8Yi5lYXNpbmd8fCJzd2luZyI7aWYoaD09PSJoaWRlIiYmZHx8aD09PSJzaG93IiYmIWQpcmV0dXJuIGIuY29tcGxldGUuY2FsbCh0aGlzKTtjJiYoZz09PSJoZWlnaHQifHxnPT09IndpZHRoIikmJihiLm92ZXJmbG93PVt0aGlzLnN0eWxlLm92ZXJmbG93LHRoaXMuc3R5bGUub3ZlcmZsb3dYLHRoaXMuc3R5bGUub3ZlcmZsb3dZXSxmLmNzcyh0aGlzLCJkaXNwbGF5Iik9PT0iaW5saW5lIiYmZi5jc3ModGhpcywiZmxvYXQiKT09PSJub25lIiYmKCFmLnN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dHx8Y3YodGhpcy5ub2RlTmFtZSk9PT0iaW5saW5lIj90aGlzLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayI6dGhpcy5zdHlsZS56b29tPTEpKX1iLm92ZXJmbG93IT1udWxsJiYodGhpcy5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIik7Zm9yKGkgaW4gYSlqPW5ldyBmLmZ4KHRoaXMsYixpKSxoPWFbaV0sY24udGVzdChoKT8obz1mLl9kYXRhKHRoaXMsInRvZ2dsZSIraSl8fChoPT09InRvZ2dsZSI/ZD8ic2hvdyI6ImhpZGUiOjApLG8/KGYuX2RhdGEodGhpcywidG9nZ2xlIitpLG89PT0ic2hvdyI/ImhpZGUiOiJzaG93IiksaltvXSgpKTpqW2hdKCkpOihrPWNvLmV4ZWMoaCksbD1qLmN1cigpLGs/KG09cGFyc2VGbG9hdChrWzJdKSxuPWtbM118fChmLmNzc051bWJlcltpXT8iIjoicHgiKSxuIT09InB4IiYmKGYuc3R5bGUodGhpcyxpLChtfHwxKStuKSxsPShtfHwxKS9qLmN1cigpKmwsZi5zdHlsZSh0aGlzLGksbCtuKSksa1sxXSYmKG09KGtbMV09PT0iLT0iPy0xOjEpKm0rbCksai5jdXN0b20obCxtLG4pKTpqLmN1c3RvbShsLGgsIiIpKTtyZXR1cm4hMH12YXIgZT1mLnNwZWVkKGIsYyxkKTtpZihmLmlzRW1wdHlPYmplY3QoYSkpcmV0dXJuIHRoaXMuZWFjaChlLmNvbXBsZXRlLFshMV0pO2E9Zi5leHRlbmQoe30sYSk7cmV0dXJuIGUucXVldWU9PT0hMT90aGlzLmVhY2goZyk6dGhpcy5xdWV1ZShlLnF1ZXVlLGcpfSxzdG9wOmZ1bmN0aW9uKGEsYyxkKXt0eXBlb2YgYSE9InN0cmluZyImJihkPWMsYz1hLGE9YiksYyYmYSE9PSExJiZ0aGlzLnF1ZXVlKGF8fCJmeCIsW10pO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmdW5jdGlvbiBoKGEsYixjKXt2YXIgZT1iW2NdO2YucmVtb3ZlRGF0YShhLGMsITApLGUuc3RvcChkKX12YXIgYixjPSExLGU9Zi50aW1lcnMsZz1mLl9kYXRhKHRoaXMpO2R8fGYuX3VubWFyayghMCx0aGlzKTtpZihhPT1udWxsKWZvcihiIGluIGcpZ1tiXSYmZ1tiXS5zdG9wJiZiLmluZGV4T2YoIi5ydW4iKT09PWIubGVuZ3RoLTQmJmgodGhpcyxnLGIpO2Vsc2UgZ1tiPWErIi5ydW4iXSYmZ1tiXS5zdG9wJiZoKHRoaXMsZyxiKTtmb3IoYj1lLmxlbmd0aDtiLS07KWVbYl0uZWxlbT09PXRoaXMmJihhPT1udWxsfHxlW2JdLnF1ZXVlPT09YSkmJihkP2VbYl0oITApOmVbYl0uc2F2ZVN0YXRlKCksYz0hMCxlLnNwbGljZShiLDEpKTsoIWR8fCFjKSYmZi5kZXF1ZXVlKHRoaXMsYSl9KX19KSxmLmVhY2goe3NsaWRlRG93bjpjdSgic2hvdyIsMSksc2xpZGVVcDpjdSgiaGlkZSIsMSksc2xpZGVUb2dnbGU6Y3UoInRvZ2dsZSIsMSksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihhLGIpe2YuZm5bYV09ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB0aGlzLmFuaW1hdGUoYixhLGMsZCl9fSksZi5leHRlbmQoe3NwZWVkOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hJiZ0eXBlb2YgYT09Im9iamVjdCI/Zi5leHRlbmQoe30sYSk6e2NvbXBsZXRlOmN8fCFjJiZifHxmLmlzRnVuY3Rpb24oYSkmJmEsZHVyYXRpb246YSxlYXNpbmc6YyYmYnx8YiYmIWYuaXNGdW5jdGlvbihiKSYmYn07ZC5kdXJhdGlvbj1mLmZ4Lm9mZj8wOnR5cGVvZiBkLmR1cmF0aW9uPT0ibnVtYmVyIj9kLmR1cmF0aW9uOmQuZHVyYXRpb24gaW4gZi5meC5zcGVlZHM/Zi5meC5zcGVlZHNbZC5kdXJhdGlvbl06Zi5meC5zcGVlZHMuX2RlZmF1bHQ7aWYoZC5xdWV1ZT09bnVsbHx8ZC5xdWV1ZT09PSEwKWQucXVldWU9ImZ4IjtkLm9sZD1kLmNvbXBsZXRlLGQuY29tcGxldGU9ZnVuY3Rpb24oYSl7Zi5pc0Z1bmN0aW9uKGQub2xkKSYmZC5vbGQuY2FsbCh0aGlzKSxkLnF1ZXVlP2YuZGVxdWV1ZSh0aGlzLGQucXVldWUpOmEhPT0hMSYmZi5fdW5tYXJrKHRoaXMpfTtyZXR1cm4gZH0sZWFzaW5nOntsaW5lYXI6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGMrZCphfSxzd2luZzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4oLU1hdGguY29zKGEqTWF0aC5QSSkvMisuNSkqZCtjfX0sdGltZXJzOltdLGZ4OmZ1bmN0aW9uKGEsYixjKXt0aGlzLm9wdGlvbnM9Yix0aGlzLmVsZW09YSx0aGlzLnByb3A9YyxiLm9yaWc9Yi5vcmlnfHx7fX19KSxmLmZ4LnByb3RvdHlwZT17dXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLChmLmZ4LnN0ZXBbdGhpcy5wcm9wXXx8Zi5meC5zdGVwLl9kZWZhdWx0KSh0aGlzKX0sY3VyOmZ1bmN0aW9uKCl7aWYodGhpcy5lbGVtW3RoaXMucHJvcF0hPW51bGwmJighdGhpcy5lbGVtLnN0eWxlfHx0aGlzLmVsZW0uc3R5bGVbdGhpcy5wcm9wXT09bnVsbCkpcmV0dXJuIHRoaXMuZWxlbVt0aGlzLnByb3BdO3ZhciBhLGI9Zi5jc3ModGhpcy5lbGVtLHRoaXMucHJvcCk7cmV0dXJuIGlzTmFOKGE9cGFyc2VGbG9hdChiKSk/IWJ8fGI9PT0iYXV0byI/MDpiOmF9LGN1c3RvbTpmdW5jdGlvbihhLGMsZCl7ZnVuY3Rpb24gaChhKXtyZXR1cm4gZS5zdGVwKGEpfXZhciBlPXRoaXMsZz1mLmZ4O3RoaXMuc3RhcnRUaW1lPWNyfHxjcygpLHRoaXMuZW5kPWMsdGhpcy5ub3c9dGhpcy5zdGFydD1hLHRoaXMucG9zPXRoaXMuc3RhdGU9MCx0aGlzLnVuaXQ9ZHx8dGhpcy51bml0fHwoZi5jc3NOdW1iZXJbdGhpcy5wcm9wXT8iIjoicHgiKSxoLnF1ZXVlPXRoaXMub3B0aW9ucy5xdWV1ZSxoLmVsZW09dGhpcy5lbGVtLGguc2F2ZVN0YXRlPWZ1bmN0aW9uKCl7ZS5vcHRpb25zLmhpZGUmJmYuX2RhdGEoZS5lbGVtLCJmeHNob3ciK2UucHJvcCk9PT1iJiZmLl9kYXRhKGUuZWxlbSwiZnhzaG93IitlLnByb3AsZS5zdGFydCl9LGgoKSYmZi50aW1lcnMucHVzaChoKSYmIWNwJiYoY3A9c2V0SW50ZXJ2YWwoZy50aWNrLGcuaW50ZXJ2YWwpKX0sc2hvdzpmdW5jdGlvbigpe3ZhciBhPWYuX2RhdGEodGhpcy5lbGVtLCJmeHNob3ciK3RoaXMucHJvcCk7dGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXT1hfHxmLnN0eWxlKHRoaXMuZWxlbSx0aGlzLnByb3ApLHRoaXMub3B0aW9ucy5zaG93PSEwLGEhPT1iP3RoaXMuY3VzdG9tKHRoaXMuY3VyKCksYSk6dGhpcy5jdXN0b20odGhpcy5wcm9wPT09IndpZHRoInx8dGhpcy5wcm9wPT09ImhlaWdodCI/MTowLHRoaXMuY3VyKCkpLGYodGhpcy5lbGVtKS5zaG93KCl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdPWYuX2RhdGEodGhpcy5lbGVtLCJmeHNob3ciK3RoaXMucHJvcCl8fGYuc3R5bGUodGhpcy5lbGVtLHRoaXMucHJvcCksdGhpcy5vcHRpb25zLmhpZGU9ITAsdGhpcy5jdXN0b20odGhpcy5jdXIoKSwwKX0sc3RlcDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZT1jcnx8Y3MoKSxnPSEwLGg9dGhpcy5lbGVtLGk9dGhpcy5vcHRpb25zO2lmKGF8fGU+PWkuZHVyYXRpb24rdGhpcy5zdGFydFRpbWUpe3RoaXMubm93PXRoaXMuZW5kLHRoaXMucG9zPXRoaXMuc3RhdGU9MSx0aGlzLnVwZGF0ZSgpLGkuYW5pbWF0ZWRQcm9wZXJ0aWVzW3RoaXMucHJvcF09ITA7Zm9yKGIgaW4gaS5hbmltYXRlZFByb3BlcnRpZXMpaS5hbmltYXRlZFByb3BlcnRpZXNbYl0hPT0hMCYmKGc9ITEpO2lmKGcpe2kub3ZlcmZsb3chPW51bGwmJiFmLnN1cHBvcnQuc2hyaW5rV3JhcEJsb2NrcyYmZi5lYWNoKFsiIiwiWCIsIlkiXSxmdW5jdGlvbihhLGIpe2guc3R5bGVbIm92ZXJmbG93IitiXT1pLm92ZXJmbG93W2FdfSksaS5oaWRlJiZmKGgpLmhpZGUoKTtpZihpLmhpZGV8fGkuc2hvdylmb3IoYiBpbiBpLmFuaW1hdGVkUHJvcGVydGllcylmLnN0eWxlKGgsYixpLm9yaWdbYl0pLGYucmVtb3ZlRGF0YShoLCJmeHNob3ciK2IsITApLGYucmVtb3ZlRGF0YShoLCJ0b2dnbGUiK2IsITApO2Q9aS5jb21wbGV0ZSxkJiYoaS5jb21wbGV0ZT0hMSxkLmNhbGwoaCkpfXJldHVybiExfWkuZHVyYXRpb249PUluZmluaXR5P3RoaXMubm93PWU6KGM9ZS10aGlzLnN0YXJ0VGltZSx0aGlzLnN0YXRlPWMvaS5kdXJhdGlvbix0aGlzLnBvcz1mLmVhc2luZ1tpLmFuaW1hdGVkUHJvcGVydGllc1t0aGlzLnByb3BdXSh0aGlzLnN0YXRlLGMsMCwxLGkuZHVyYXRpb24pLHRoaXMubm93PXRoaXMuc3RhcnQrKHRoaXMuZW5kLXRoaXMuc3RhcnQpKnRoaXMucG9zKSx0aGlzLnVwZGF0ZSgpO3JldHVybiEwfX0sZi5leHRlbmQoZi5meCx7dGljazpmdW5jdGlvbigpe3ZhciBhLGI9Zi50aW1lcnMsYz0wO2Zvcig7YzxiLmxlbmd0aDtjKyspYT1iW2NdLCFhKCkmJmJbY109PT1hJiZiLnNwbGljZShjLS0sMSk7Yi5sZW5ndGh8fGYuZnguc3RvcCgpfSxpbnRlcnZhbDoxMyxzdG9wOmZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbChjcCksY3A9bnVsbH0sc3BlZWRzOntzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LHN0ZXA6e29wYWNpdHk6ZnVuY3Rpb24oYSl7Zi5zdHlsZShhLmVsZW0sIm9wYWNpdHkiLGEubm93KX0sX2RlZmF1bHQ6ZnVuY3Rpb24oYSl7YS5lbGVtLnN0eWxlJiZhLmVsZW0uc3R5bGVbYS5wcm9wXSE9bnVsbD9hLmVsZW0uc3R5bGVbYS5wcm9wXT1hLm5vdythLnVuaXQ6YS5lbGVtW2EucHJvcF09YS5ub3d9fX0pLGYuZWFjaChbIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24oYSxiKXtmLmZ4LnN0ZXBbYl09ZnVuY3Rpb24oYSl7Zi5zdHlsZShhLmVsZW0sYixNYXRoLm1heCgwLGEubm93KSthLnVuaXQpfX0pLGYuZXhwciYmZi5leHByLmZpbHRlcnMmJihmLmV4cHIuZmlsdGVycy5hbmltYXRlZD1mdW5jdGlvbihhKXtyZXR1cm4gZi5ncmVwKGYudGltZXJzLGZ1bmN0aW9uKGIpe3JldHVybiBhPT09Yi5lbGVtfSkubGVuZ3RofSk7dmFyIGN3PS9edCg/OmFibGV8ZHxoKSQvaSxjeD0vXig/OmJvZHl8aHRtbCkkL2k7ImdldEJvdW5kaW5nQ2xpZW50UmVjdCJpbiBjLmRvY3VtZW50RWxlbWVudD9mLmZuLm9mZnNldD1mdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdLGM7aWYoYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2Yub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTtpZighYnx8IWIub3duZXJEb2N1bWVudClyZXR1cm4gbnVsbDtpZihiPT09Yi5vd25lckRvY3VtZW50LmJvZHkpcmV0dXJuIGYub2Zmc2V0LmJvZHlPZmZzZXQoYik7dHJ5e2M9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX1jYXRjaChkKXt9dmFyIGU9Yi5vd25lckRvY3VtZW50LGc9ZS5kb2N1bWVudEVsZW1lbnQ7aWYoIWN8fCFmLmNvbnRhaW5zKGcsYikpcmV0dXJuIGM/e3RvcDpjLnRvcCxsZWZ0OmMubGVmdH06e3RvcDowLGxlZnQ6MH07dmFyIGg9ZS5ib2R5LGk9Y3koZSksaj1nLmNsaWVudFRvcHx8aC5jbGllbnRUb3B8fDAsaz1nLmNsaWVudExlZnR8fGguY2xpZW50TGVmdHx8MCxsPWkucGFnZVlPZmZzZXR8fGYuc3VwcG9ydC5ib3hNb2RlbCYmZy5zY3JvbGxUb3B8fGguc2Nyb2xsVG9wLG09aS5wYWdlWE9mZnNldHx8Zi5zdXBwb3J0LmJveE1vZGVsJiZnLnNjcm9sbExlZnR8fGguc2Nyb2xsTGVmdCxuPWMudG9wK2wtaixvPWMubGVmdCttLWs7cmV0dXJue3RvcDpuLGxlZnQ6b319OmYuZm4ub2Zmc2V0PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF07aWYoYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2Yub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTtpZighYnx8IWIub3duZXJEb2N1bWVudClyZXR1cm4gbnVsbDtpZihiPT09Yi5vd25lckRvY3VtZW50LmJvZHkpcmV0dXJuIGYub2Zmc2V0LmJvZHlPZmZzZXQoYik7dmFyIGMsZD1iLm9mZnNldFBhcmVudCxlPWIsZz1iLm93bmVyRG9jdW1lbnQsaD1nLmRvY3VtZW50RWxlbWVudCxpPWcuYm9keSxqPWcuZGVmYXVsdFZpZXcsaz1qP2ouZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmIuY3VycmVudFN0eWxlLGw9Yi5vZmZzZXRUb3AsbT1iLm9mZnNldExlZnQ7d2hpbGUoKGI9Yi5wYXJlbnROb2RlKSYmYiE9PWkmJmIhPT1oKXtpZihmLnN1cHBvcnQuZml4ZWRQb3NpdGlvbiYmay5wb3NpdGlvbj09PSJmaXhlZCIpYnJlYWs7Yz1qP2ouZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmIuY3VycmVudFN0eWxlLGwtPWIuc2Nyb2xsVG9wLG0tPWIuc2Nyb2xsTGVmdCxiPT09ZCYmKGwrPWIub2Zmc2V0VG9wLG0rPWIub2Zmc2V0TGVmdCxmLnN1cHBvcnQuZG9lc05vdEFkZEJvcmRlciYmKCFmLnN1cHBvcnQuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHN8fCFjdy50ZXN0KGIubm9kZU5hbWUpKSYmKGwrPXBhcnNlRmxvYXQoYy5ib3JkZXJUb3BXaWR0aCl8fDAsbSs9cGFyc2VGbG9hdChjLmJvcmRlckxlZnRXaWR0aCl8fDApLGU9ZCxkPWIub2Zmc2V0UGFyZW50KSxmLnN1cHBvcnQuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlJiZjLm92ZXJmbG93IT09InZpc2libGUiJiYobCs9cGFyc2VGbG9hdChjLmJvcmRlclRvcFdpZHRoKXx8MCxtKz1wYXJzZUZsb2F0KGMuYm9yZGVyTGVmdFdpZHRoKXx8MCksaz1jfWlmKGsucG9zaXRpb249PT0icmVsYXRpdmUifHxrLnBvc2l0aW9uPT09InN0YXRpYyIpbCs9aS5vZmZzZXRUb3AsbSs9aS5vZmZzZXRMZWZ0O2Yuc3VwcG9ydC5maXhlZFBvc2l0aW9uJiZrLnBvc2l0aW9uPT09ImZpeGVkIiYmKGwrPU1hdGgubWF4KGguc2Nyb2xsVG9wLGkuc2Nyb2xsVG9wKSxtKz1NYXRoLm1heChoLnNjcm9sbExlZnQsaS5zY3JvbGxMZWZ0KSk7cmV0dXJue3RvcDpsLGxlZnQ6bX19LGYub2Zmc2V0PXtib2R5T2Zmc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEub2Zmc2V0VG9wLGM9YS5vZmZzZXRMZWZ0O2Yuc3VwcG9ydC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCYmKGIrPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luVG9wIikpfHwwLGMrPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luTGVmdCIpKXx8MCk7cmV0dXJue3RvcDpiLGxlZnQ6Y319LHNldE9mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9Zi5jc3MoYSwicG9zaXRpb24iKTtkPT09InN0YXRpYyImJihhLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpO3ZhciBlPWYoYSksZz1lLm9mZnNldCgpLGg9Zi5jc3MoYSwidG9wIiksaT1mLmNzcyhhLCJsZWZ0Iiksaj0oZD09PSJhYnNvbHV0ZSJ8fGQ9PT0iZml4ZWQiKSYmZi5pbkFycmF5KCJhdXRvIixbaCxpXSk+LTEsaz17fSxsPXt9LG0sbjtqPyhsPWUucG9zaXRpb24oKSxtPWwudG9wLG49bC5sZWZ0KToobT1wYXJzZUZsb2F0KGgpfHwwLG49cGFyc2VGbG9hdChpKXx8MCksZi5pc0Z1bmN0aW9uKGIpJiYoYj1iLmNhbGwoYSxjLGcpKSxiLnRvcCE9bnVsbCYmKGsudG9wPWIudG9wLWcudG9wK20pLGIubGVmdCE9bnVsbCYmKGsubGVmdD1iLmxlZnQtZy5sZWZ0K24pLCJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLGspOmUuY3NzKGspfX0sZi5mbi5leHRlbmQoe3Bvc2l0aW9uOmZ1bmN0aW9uKCl7aWYoIXRoaXNbMF0pcmV0dXJuIG51bGw7dmFyIGE9dGhpc1swXSxiPXRoaXMub2Zmc2V0UGFyZW50KCksYz10aGlzLm9mZnNldCgpLGQ9Y3gudGVzdChiWzBdLm5vZGVOYW1lKT97dG9wOjAsbGVmdDowfTpiLm9mZnNldCgpO2MudG9wLT1wYXJzZUZsb2F0KGYuY3NzKGEsIm1hcmdpblRvcCIpKXx8MCxjLmxlZnQtPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luTGVmdCIpKXx8MCxkLnRvcCs9cGFyc2VGbG9hdChmLmNzcyhiWzBdLCJib3JkZXJUb3BXaWR0aCIpKXx8MCxkLmxlZnQrPXBhcnNlRmxvYXQoZi5jc3MoYlswXSwiYm9yZGVyTGVmdFdpZHRoIikpfHwwO3JldHVybnt0b3A6Yy50b3AtZC50b3AsbGVmdDpjLmxlZnQtZC5sZWZ0fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vZmZzZXRQYXJlbnR8fGMuYm9keTt3aGlsZShhJiYhY3gudGVzdChhLm5vZGVOYW1lKSYmZi5jc3MoYSwicG9zaXRpb24iKT09PSJzdGF0aWMiKWE9YS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGF9KX19KSxmLmVhY2goWyJMZWZ0IiwiVG9wIl0sZnVuY3Rpb24oYSxjKXt2YXIgZD0ic2Nyb2xsIitjO2YuZm5bZF09ZnVuY3Rpb24oYyl7dmFyIGUsZztpZihjPT09Yil7ZT10aGlzWzBdO2lmKCFlKXJldHVybiBudWxsO2c9Y3koZSk7cmV0dXJuIGc/InBhZ2VYT2Zmc2V0ImluIGc/Z1thPyJwYWdlWU9mZnNldCI6InBhZ2VYT2Zmc2V0Il06Zi5zdXBwb3J0LmJveE1vZGVsJiZnLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXXx8Zy5kb2N1bWVudC5ib2R5W2RdOmVbZF19cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2c9Y3kodGhpcyksZz9nLnNjcm9sbFRvKGE/ZihnKS5zY3JvbGxMZWZ0KCk6YyxhP2M6ZihnKS5zY3JvbGxUb3AoKSk6dGhpc1tkXT1jfSl9fSksZi5lYWNoKFsiSGVpZ2h0IiwiV2lkdGgiXSxmdW5jdGlvbihhLGMpe3ZhciBkPWMudG9Mb3dlckNhc2UoKTtmLmZuWyJpbm5lciIrY109ZnVuY3Rpb24oKXt2YXIgYT10aGlzWzBdO3JldHVybiBhP2Euc3R5bGU/cGFyc2VGbG9hdChmLmNzcyhhLGQsInBhZGRpbmciKSk6dGhpc1tkXSgpOm51bGx9LGYuZm5bIm91dGVyIitjXT1mdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdO3JldHVybiBiP2Iuc3R5bGU/cGFyc2VGbG9hdChmLmNzcyhiLGQsYT8ibWFyZ2luIjoiYm9yZGVyIikpOnRoaXNbZF0oKTpudWxsfSxmLmZuW2RdPWZ1bmN0aW9uKGEpe3ZhciBlPXRoaXNbMF07aWYoIWUpcmV0dXJuIGE9PW51bGw/bnVsbDp0aGlzO2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyk7Y1tkXShhLmNhbGwodGhpcyxiLGNbZF0oKSkpfSk7aWYoZi5pc1dpbmRvdyhlKSl7dmFyIGc9ZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrY10saD1lLmRvY3VtZW50LmJvZHk7cmV0dXJuIGUuZG9jdW1lbnQuY29tcGF0TW9kZT09PSJDU1MxQ29tcGF0IiYmZ3x8aCYmaFsiY2xpZW50IitjXXx8Z31pZihlLm5vZGVUeXBlPT09OSlyZXR1cm4gTWF0aC5tYXgoZS5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrY10sZS5ib2R5WyJzY3JvbGwiK2NdLGUuZG9jdW1lbnRFbGVtZW50WyJzY3JvbGwiK2NdLGUuYm9keVsib2Zmc2V0IitjXSxlLmRvY3VtZW50RWxlbWVudFsib2Zmc2V0IitjXSk7aWYoYT09PWIpe3ZhciBpPWYuY3NzKGUsZCksaj1wYXJzZUZsb2F0KGkpO3JldHVybiBmLmlzTnVtZXJpYyhqKT9qOml9cmV0dXJuIHRoaXMuY3NzKGQsdHlwZW9mIGE9PSJzdHJpbmciP2E6YSsicHgiKX19KSxhLmpRdWVyeT1hLiQ9Zix0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kJiZkZWZpbmUuYW1kLmpRdWVyeSYmZGVmaW5lKCJqcXVlcnkiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIGZ9KX0pKHdpbmRvdyk7"></script>
<script id="script_tl_jquery_story-embed_js" url="data:text/plain;base64,LyohCglTdG9yeUpTCglEZXNpZ25lZCBhbmQgYnVpbHQgYnkgWmFjaCBXaXNlIGF0IFbDqXJpdMOpQ28KCglUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljCglMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzCglmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgoqLy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICBCZWdpbiBMYXp5TG9hZC5qcwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovLypqc2xpbnQgYnJvd3NlcjogdHJ1ZSwgZXFlcWVxOiB0cnVlLCBiaXR3aXNlOiB0cnVlLCBuZXdjYXA6IHRydWUsIGltbWVkOiB0cnVlLCByZWdleHA6IGZhbHNlICovLyoKTGF6eUxvYWQgbWFrZXMgaXQgZWFzeSBhbmQgcGFpbmxlc3MgdG8gbGF6aWx5IGxvYWQgb25lIG9yIG1vcmUgZXh0ZXJuYWwKSmF2YVNjcmlwdCBvciBDU1MgZmlsZXMgb24gZGVtYW5kIGVpdGhlciBkdXJpbmcgb3IgYWZ0ZXIgdGhlIHJlbmRlcmluZyBvZiBhIHdlYgpwYWdlLgoKU3VwcG9ydGVkIGJyb3dzZXJzIGluY2x1ZGUgRmlyZWZveCAyKywgSUU2KywgU2FmYXJpIDMrIChpbmNsdWRpbmcgTW9iaWxlClNhZmFyaSksIEdvb2dsZSBDaHJvbWUsIGFuZCBPcGVyYSA5Ky4gT3RoZXIgYnJvd3NlcnMgbWF5IG9yIG1heSBub3Qgd29yayBhbmQKYXJlIG5vdCBvZmZpY2lhbGx5IHN1cHBvcnRlZC4KClZpc2l0IGh0dHBzOi8vZ2l0aHViLmNvbS9yZ3JvdmUvbGF6eWxvYWQvIGZvciBtb3JlIGluZm8uCgpDb3B5cmlnaHQgKGMpIDIwMTEgUnlhbiBHcm92ZSA8cnlhbkB3b25rby5jb20+CkFsbCByaWdodHMgcmVzZXJ2ZWQuCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCnRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICdTb2Z0d2FyZScpLCB0byBkZWFsIGluCnRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLApzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCkNPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgpJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgpDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKQG1vZHVsZSBsYXp5bG9hZApAY2xhc3MgTGF6eUxvYWQKQHN0YXRpYwpAdmVyc2lvbiAyLjAuMyAoZ2l0KQoqL2Z1bmN0aW9uIGdldEVtYmVkU2NyaXB0UGF0aChlKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iiksbj0iIixyPSIiO2Zvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSsrKXRbaV0uc3JjLm1hdGNoKGUpJiYobj10W2ldLnNyYyk7biE9IiImJihyPSIvIik7cmV0dXJuIG4uc3BsaXQoIj8iKVswXS5zcGxpdCgiLyIpLnNsaWNlKDAsLTEpLmpvaW4oIi8iKStyfWZ1bmN0aW9uIGNyZWF0ZVN0b3J5SlMoZSx0KXtmdW5jdGlvbiBnKCl7TG9hZExpYi5qcyhoLmpzLHkpfWZ1bmN0aW9uIHkoKXtsLmpzPSEwO2gubGFuZyE9ImVuIj9MYXp5TG9hZC5qcyhjLmxvY2FsZSxiKTpsLmxhbmd1YWdlPSEwO3goKX1mdW5jdGlvbiBiKCl7bC5sYW5ndWFnZT0hMDt4KCl9ZnVuY3Rpb24gdygpe2wuY3NzPSEwO3goKX1mdW5jdGlvbiBFKCl7bC5mb250LmNzcz0hMDt4KCl9ZnVuY3Rpb24gUygpe2wuZm9udC5qcz0hMDt4KCl9ZnVuY3Rpb24geCgpe2lmKGwuY2hlY2tzPjQwKXJldHVybjtsLmNoZWNrcysrO2lmKGwuanMmJmwuY3NzJiZsLmZvbnQuY3NzJiZsLmZvbnQuanMmJmwubGFuZ3VhZ2Upe2lmKCFsLmZpbmlzaGVkKXtsLmZpbmlzaGVkPSEwO04oKX19ZWxzZSBsLnRpbWVvdXQ9c2V0VGltZW91dCgib25sb2FkZWRfY2hlY2tfYWdhaW4oKTsiLDI1MCl9ZnVuY3Rpb24gVCgpe3ZhciBlPSJzdG9yeWpzLWVtYmVkIjtyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guZW1iZWRfaWQhPSIiP2k9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaC5lbWJlZF9pZCk6aT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGltZWxpbmUtZW1iZWQiKTtpLmFwcGVuZENoaWxkKHIpO3Iuc2V0QXR0cmlidXRlKCJpZCIsaC5pZCk7aWYoaC53aWR0aC50b1N0cmluZygpLm1hdGNoKCIlIikpaS5zdHlsZS53aWR0aD1oLndpZHRoLnNwbGl0KCIlIilbMF0rIiUiO2Vsc2V7aC53aWR0aD1oLndpZHRoLTI7aS5zdHlsZS53aWR0aD1oLndpZHRoKyJweCJ9aWYoaC5oZWlnaHQudG9TdHJpbmcoKS5tYXRjaCgiJSIpKXtpLnN0eWxlLmhlaWdodD1oLmhlaWdodDtlKz0iIGZ1bGwtZW1iZWQiO2kuc3R5bGUuaGVpZ2h0PWguaGVpZ2h0LnNwbGl0KCIlIilbMF0rIiUifWVsc2V7ZSs9IiBzaXplZC1lbWJlZCI7aC5oZWlnaHQ9aC5oZWlnaHQtMTY7aS5zdHlsZS5oZWlnaHQ9aC5oZWlnaHQrInB4In1pLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGUpO2kuc2V0QXR0cmlidXRlKCJjbGFzc05hbWUiLGUpO3Iuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIn1mdW5jdGlvbiBOKCl7Vk1NLmRlYnVnPWguZGVidWc7bj1uZXcgVk1NLlRpbWVsaW5lKGguaWQpO24uaW5pdChoKTtvJiZWTU0uYmluZEV2ZW50KGdsb2JhbCxvbkhlYWRsaW5lLCJIRUFETElORSIpfXZhciBuLHIsaSxzLG89ITEsdT0iMi4xNyIsYT0iMS43LjEiLGY9IiIsbD17dGltZW91dDoiIixjaGVja3M6MCxmaW5pc2hlZDohMSxqczohMSxjc3M6ITEsanF1ZXJ5OiExLGhhc19qcXVlcnk6ITEsbGFuZ3VhZ2U6ITEsZm9udDp7Y3NzOiExLGpzOiExfX0sYz17YmFzZTplbWJlZF9wYXRoLGNzczplbWJlZF9wYXRoKyJjc3MvIixqczplbWJlZF9wYXRoKyJqcy8iLGxvY2FsZTplbWJlZF9wYXRoKyJqcy9sb2NhbGUvIixqcXVlcnk6Imh0dHA6Ly9hamF4Lmdvb2dsZWFwaXMuY29tL2FqYXgvbGlicy9qcXVlcnkvMS43LjIvanF1ZXJ5Lm1pbi5qcyIsZm9udDp7Z29vZ2xlOiExLGNzczplbWJlZF9wYXRoKyJjc3MvdGhlbWVzL2ZvbnQvIixqczoiaHR0cDovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL3dlYmZvbnQvMS93ZWJmb250LmpzIn19LGg9e3ZlcnNpb246dSxkZWJ1ZzohMSx0eXBlOiJ0aW1lbGluZSIsaWQ6InN0b3J5anMiLGVtYmVkX2lkOiJ0aW1lbGluZS1lbWJlZCIsZW1iZWQ6ITAsd2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsc291cmNlOiJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldC9wdWI/a2V5PTBBZ2xfRHY2aUViRGFkRll6UmpKUFVHa3RZME5rV1hGVVdrVklaRE5HUkhjJm91dHB1dD1odG1sIixsYW5nOiJlbiIsZm9udDoiZGVmYXVsdCIsY3NzOmMuY3NzKyJ0aW1lbGluZS5jc3M/Iit1LGpzOmMuanMrInRpbWVsaW5lLW1pbi5qcz8iK3UsYXBpX2tleXM6e2dvb2dsZToiIixmbGlja3I6IiIsdHdpdHRlcjoiIn0sZ21hcF9rZXk6IiJ9LHA9W3tuYW1lOiJNZXJyaXdlYXRoZXItTmV3c0N5Y2xlIixnb29nbGU6WyJOZXdzK0N5Y2xlOjQwMCw3MDA6bGF0aW4iLCJNZXJyaXdlYXRoZXI6NDAwLDcwMCw5MDA6bGF0aW4iXX0se25hbWU6Ik5ld3NDeWNsZS1NZXJyaXdlYXRoZXIiLGdvb2dsZTpbIk5ld3MrQ3ljbGU6NDAwLDcwMDpsYXRpbiIsIk1lcnJpd2VhdGhlcjozMDAsNDAwLDcwMDpsYXRpbiJdfSx7bmFtZToiUG9pcmV0T25lLU1vbGVuZ28iLGdvb2dsZTpbIlBvaXJldCtPbmU6OmxhdGluIiwiTW9sZW5nbzo6bGF0aW4iXX0se25hbWU6IkFydm8tUFRTYW5zIixnb29nbGU6WyJBcnZvOjQwMCw3MDAsNDAwaXRhbGljOmxhdGluIiwiUFQrU2Fuczo0MDAsNzAwLDQwMGl0YWxpYzpsYXRpbiJdfSx7bmFtZToiUFRTZXJpZi1QVFNhbnMiLGdvb2dsZTpbIlBUK1NhbnM6NDAwLDcwMCw0MDBpdGFsaWM6bGF0aW4iLCJQVCtTZXJpZjo0MDAsNzAwLDQwMGl0YWxpYzpsYXRpbiJdfSx7bmFtZToiUFQiLGdvb2dsZTpbIlBUK1NhbnMrTmFycm93OjQwMCw3MDA6bGF0aW4iLCJQVCtTYW5zOjQwMCw3MDAsNDAwaXRhbGljOmxhdGluIiwiUFQrU2VyaWY6NDAwLDcwMCw0MDBpdGFsaWM6bGF0aW4iXX0se25hbWU6IkRyb2lkU2VyaWYtRHJvaWRTYW5zIixnb29nbGU6WyJEcm9pZCtTYW5zOjQwMCw3MDA6bGF0aW4iLCJEcm9pZCtTZXJpZjo0MDAsNzAwLDQwMGl0YWxpYzpsYXRpbiJdfSx7bmFtZToiTGVrdG9uLU1vbGVuZ28iLGdvb2dsZTpbIkxla3Rvbjo0MDAsNzAwLDQwMGl0YWxpYzpsYXRpbiIsIk1vbGVuZ286OmxhdGluIl19LHtuYW1lOiJOaXhpZU9uZS1MZWRnZXIiLGdvb2dsZTpbIk5peGllK09uZTo6bGF0aW4iLCJMZWRnZXI6OmxhdGluIl19LHtuYW1lOiJBYnJpbEZhdGZhY2UtQXZlcmFnZSIsZ29vZ2xlOlsiQXZlcmFnZTo6bGF0aW4iLCJBYnJpbCtGYXRmYWNlOjpsYXRpbiJdfSx7bmFtZToiUGxheWZhaXJEaXNwbGF5LU11bGkiLGdvb2dsZTpbIlBsYXlmYWlyK0Rpc3BsYXk6NDAwLDQwMGl0YWxpYzpsYXRpbiIsIk11bGk6MzAwLDQwMCwzMDBpdGFsaWMsNDAwaXRhbGljOmxhdGluIl19LHtuYW1lOiJSYW5jaG8tR3VkZWEiLGdvb2dsZTpbIlJhbmNobzo6bGF0aW4iLCJHdWRlYTo0MDAsNzAwLDQwMGl0YWxpYzpsYXRpbiJdfSx7bmFtZToiQmV2YW4tUG90YW5vU2FucyIsZ29vZ2xlOlsiQmV2YW46OmxhdGluIiwiUG9udGFubytTYW5zOjpsYXRpbiJdfSx7bmFtZToiQnJlZVNlcmlmLU9wZW5TYW5zIixnb29nbGU6WyJCcmVlK1NlcmlmOjpsYXRpbiIsIk9wZW4rU2FuczozMDBpdGFsaWMsNDAwaXRhbGljLDYwMGl0YWxpYyw3MDBpdGFsaWMsODAwaXRhbGljLDQwMCwzMDAsNjAwLDcwMCw4MDA6bGF0aW4iXX0se25hbWU6IlNhbnNpdGFPbmUtS2FtZXJvbiIsZ29vZ2xlOlsiU2Fuc2l0YStPbmU6OmxhdGluIiwiS2FtZXJvbjo0MDAsNzAwOmxhdGluIl19LHtuYW1lOiJMb3JhLUlzdG9rIixnb29nbGU6WyJMb3JhOjQwMCw3MDAsNDAwaXRhbGljLDcwMGl0YWxpYzpsYXRpbiIsIklzdG9rK1dlYjo0MDAsNzAwLDQwMGl0YWxpYyw3MDBpdGFsaWM6bGF0aW4iXX0se25hbWU6IlBhY2lmaWNvLUFyaW1vIixnb29nbGU6WyJQYWNpZmljbzo6bGF0aW4iLCJBcmltbzo0MDAsNzAwLDQwMGl0YWxpYyw3MDBpdGFsaWM6bGF0aW4iXX1dO2lmKHR5cGVvZiBlPT0ib2JqZWN0Iilmb3IocyBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHMpJiYoaFtzXT1lW3NdKTt0eXBlb2YgdCE9InVuZGVmaW5lZCImJihoLnNvdXJjZT10KTtpZih0eXBlb2YgdXJsX2NvbmZpZz09Im9iamVjdCIpe289ITA7aC5zb3VyY2UubWF0Y2goImRvY3MuZ29vZ2xlLmNvbSIpfHxoLnNvdXJjZS5tYXRjaCgianNvbiIpfHxoLnNvdXJjZS5tYXRjaCgic3RvcmlmeSIpfHwoaC5zb3VyY2U9Imh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0L3B1Yj9rZXk9IitoLnNvdXJjZSsiJm91dHB1dD1odG1sIil9aWYoaC5qcy5tYXRjaCgibG9jYWxlIikpe2gubGFuZz1oLmpzLnNwbGl0KCJsb2NhbGUvIilbMV0ucmVwbGFjZSgiLmpzIiwiIik7aC5qcz1jLmpzKyJ0aW1lbGluZS1taW4uanM/Iit1fWlmKCFoLmpzLm1hdGNoKCIvIikpe2guY3NzPWMuY3NzK2gudHlwZSsiLmNzcz8iK3U7aC5qcz1jLmpzK2gudHlwZSsiLW1pbi5qcz8iK3U7aC5pZD0ic3Rvcnlqcy0iK2gudHlwZX1oLmxhbmcubWF0Y2goIi8iKT9jLmxvY2FsZT1oLmxhbmc6Yy5sb2NhbGU9Yy5sb2NhbGUraC5sYW5nKyIuanM/Iit1O1QoKTtMb2FkTGliLmNzcyhoLmNzcyx3KTtpZihoLmZvbnQ9PSJkZWZhdWx0Iil7bC5mb250LmpzPSEwO2wuZm9udC5jc3M9ITB9ZWxzZXt2YXIgZDtpZihoLmZvbnQubWF0Y2goIi8iKSl7ZD1oLmZvbnQuc3BsaXQoIi5jc3MiKVswXS5zcGxpdCgiLyIpO2MuZm9udC5uYW1lPWRbZC5sZW5ndGgtMV07Yy5mb250LmNzcz1oLmZvbnR9ZWxzZXtjLmZvbnQubmFtZT1oLmZvbnQ7Yy5mb250LmNzcz1jLmZvbnQuY3NzK2guZm9udCsiLmNzcz8iK3V9TG9hZExpYi5jc3MoYy5mb250LmNzcyxFKTtmb3IodmFyIHY9MDt2PHAubGVuZ3RoO3YrKylpZihjLmZvbnQubmFtZT09cFt2XS5uYW1lKXtjLmZvbnQuZ29vZ2xlPSEwO1dlYkZvbnRDb25maWc9e2dvb2dsZTp7ZmFtaWxpZXM6cFt2XS5nb29nbGV9fX1jLmZvbnQuZ29vZ2xlP0xvYWRMaWIuanMoYy5mb250LmpzLFMpOmwuZm9udC5qcz0hMH10cnl7bC5oYXNfanF1ZXJ5PWpRdWVyeTtsLmhhc19qcXVlcnk9ITA7aWYobC5oYXNfanF1ZXJ5KXt2YXIgZj1wYXJzZUZsb2F0KGpRdWVyeS5mbi5qcXVlcnkpO2Y8cGFyc2VGbG9hdChhKT9sLmpxdWVyeT0hMTpsLmpxdWVyeT0hMH19Y2F0Y2gobSl7bC5qcXVlcnk9ITF9bC5qcXVlcnk/ZygpOkxvYWRMaWIuanMoYy5qcXVlcnksZyk7dGhpcy5vbmxvYWRlZF9jaGVja19hZ2Fpbj1mdW5jdGlvbigpe3goKX19TGF6eUxvYWQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdSh0LG4pe3ZhciByPWUuY3JlYXRlRWxlbWVudCh0KSxpO2ZvcihpIGluIG4pbi5oYXNPd25Qcm9wZXJ0eShpKSYmci5zZXRBdHRyaWJ1dGUoaSxuW2ldKTtyZXR1cm4gcn1mdW5jdGlvbiBhKGUpe3ZhciB0PXJbZV0sbixvO2lmKHQpe249dC5jYWxsYmFjaztvPXQudXJscztvLnNoaWZ0KCk7aT0wO2lmKCFvLmxlbmd0aCl7biYmbi5jYWxsKHQuY29udGV4dCx0Lm9iaik7cltlXT1udWxsO3NbZV0ubGVuZ3RoJiZsKGUpfX19ZnVuY3Rpb24gZigpe3ZhciBuPW5hdmlnYXRvci51c2VyQWdlbnQ7dD17YXN5bmM6ZS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKS5hc3luYz09PSEwfTsodC53ZWJraXQ9L0FwcGxlV2ViS2l0XC8vLnRlc3QobikpfHwodC5pZT0vTVNJRS8udGVzdChuKSl8fCh0Lm9wZXJhPS9PcGVyYS8udGVzdChuKSl8fCh0LmdlY2tvPS9HZWNrb1wvLy50ZXN0KG4pKXx8KHQudW5rbm93bj0hMCl9ZnVuY3Rpb24gbChpLG8sbCxwLGQpe3ZhciB2PWZ1bmN0aW9uKCl7YShpKX0sbT1pPT09ImNzcyIsZz1bXSx5LGIsdyxFLFMseDt0fHxmKCk7aWYobyl7bz10eXBlb2Ygbz09InN0cmluZyI/W29dOm8uY29uY2F0KCk7aWYobXx8dC5hc3luY3x8dC5nZWNrb3x8dC5vcGVyYSlzW2ldLnB1c2goe3VybHM6byxjYWxsYmFjazpsLG9iajpwLGNvbnRleHQ6ZH0pO2Vsc2UgZm9yKHk9MCxiPW8ubGVuZ3RoO3k8YjsrK3kpc1tpXS5wdXNoKHt1cmxzOltvW3ldXSxjYWxsYmFjazp5PT09Yi0xP2w6bnVsbCxvYmo6cCxjb250ZXh0OmR9KX1pZihyW2ldfHwhKEU9cltpXT1zW2ldLnNoaWZ0KCkpKXJldHVybjtufHwobj1lLmhlYWR8fGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXSk7Uz1FLnVybHM7Zm9yKHk9MCxiPVMubGVuZ3RoO3k8YjsrK3kpe3g9U1t5XTtpZihtKXc9dC5nZWNrbz91KCJzdHlsZSIpOnUoImxpbmsiLHtocmVmOngscmVsOiJzdHlsZXNoZWV0In0pO2Vsc2V7dz11KCJzY3JpcHQiLHtzcmM6eH0pO3cuYXN5bmM9ITF9dy5jbGFzc05hbWU9Imxhenlsb2FkIjt3LnNldEF0dHJpYnV0ZSgiY2hhcnNldCIsInV0Zi04Iik7aWYodC5pZSYmIW0pdy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtpZigvbG9hZGVkfGNvbXBsZXRlLy50ZXN0KHcucmVhZHlTdGF0ZSkpe3cub25yZWFkeXN0YXRlY2hhbmdlPW51bGw7digpfX07ZWxzZSBpZihtJiYodC5nZWNrb3x8dC53ZWJraXQpKWlmKHQud2Via2l0KXtFLnVybHNbeV09dy5ocmVmO2goKX1lbHNle3cuaW5uZXJIVE1MPSdAaW1wb3J0ICInK3grJyI7JztjKHcpfWVsc2Ugdy5vbmxvYWQ9dy5vbmVycm9yPXY7Zy5wdXNoKHcpfWZvcih5PTAsYj1nLmxlbmd0aDt5PGI7Kyt5KW4uYXBwZW5kQ2hpbGQoZ1t5XSl9ZnVuY3Rpb24gYyhlKXt2YXIgdDt0cnl7dD0hIWUuc2hlZXQuY3NzUnVsZXN9Y2F0Y2gobil7aSs9MTtpPDIwMD9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YyhlKX0sNTApOnQmJmEoImNzcyIpO3JldHVybn1hKCJjc3MiKX1mdW5jdGlvbiBoKCl7dmFyIGU9ci5jc3MsdDtpZihlKXt0PW8ubGVuZ3RoO3doaWxlKC0tdD49MClpZihvW3RdLmhyZWY9PT1lLnVybHNbMF0pe2EoImNzcyIpO2JyZWFrfWkrPTE7ZSYmKGk8MjAwP3NldFRpbWVvdXQoaCw1MCk6YSgiY3NzIikpfX12YXIgdCxuLHI9e30saT0wLHM9e2NzczpbXSxqczpbXX0sbz1lLnN0eWxlU2hlZXRzO3JldHVybntjc3M6ZnVuY3Rpb24oZSx0LG4scil7bCgiY3NzIixlLHQsbixyKX0sanM6ZnVuY3Rpb24oZSx0LG4scil7bCgianMiLGUsdCxuLHIpfX19KHRoaXMuZG9jdW1lbnQpO0xvYWRMaWI9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbihlKXt2YXIgbj0wLHI9ITE7Zm9yKG49MDtuPHQubGVuZ3RoO24rKyl0W25dPT1lJiYocj0hMCk7aWYocilyZXR1cm4hMDt0LnB1c2goZSk7cmV0dXJuITF9dmFyIHQ9W107cmV0dXJue2NzczpmdW5jdGlvbihlLHQscixpKXtuKGUpfHxMYXp5TG9hZC5jc3MoZSx0LHIsaSl9LGpzOmZ1bmN0aW9uKGUsdCxyLGkpe24oZSl8fExhenlMb2FkLmpzKGUsdCxyLGkpfX19KHRoaXMuZG9jdW1lbnQpO3ZhciBXZWJGb250Q29uZmlnO2lmKHR5cGVvZiBlbWJlZF9wYXRoPT0idW5kZWZpbmVkInx8dHlwZW9mIGVtYmVkX3BhdGg9PSJ1bmRlZmluZWQiKXZhciBlbWJlZF9wYXRoPWdldEVtYmVkU2NyaXB0UGF0aCgic3Rvcnlqcy1lbWJlZC5qcyIpLnNwbGl0KCJqcy8iKVswXTsoZnVuY3Rpb24oKXt0eXBlb2YgdXJsX2NvbmZpZz09Im9iamVjdCI/Y3JlYXRlU3RvcnlKUyh1cmxfY29uZmlnKTp0eXBlb2YgdGltZWxpbmVfY29uZmlnPT0ib2JqZWN0Ij9jcmVhdGVTdG9yeUpTKHRpbWVsaW5lX2NvbmZpZyk6dHlwZW9mIHN0b3J5anNfY29uZmlnPT0ib2JqZWN0Ij9jcmVhdGVTdG9yeUpTKHN0b3J5anNfY29uZmlnKTp0eXBlb2YgY29uZmlnPT0ib2JqZWN0IiYmY3JlYXRlU3RvcnlKUyhjb25maWcpfSkoKTs= "></script>
<script id="script_tl_data"  type="text/javascript">
	var tl_data = new Array();
// tl_data[0] = {
// var tl_dta = {
tl_dta = {
    "timeline": {
        "headline":"timejack <a href=http://ka1/index.html><img src='/imgs/btn/ko.png'> tl_main jkwii headline ",
        "type":"default",
		"text":"tl_text",
		"startDate":"2009,9,16",
        "date": [
            {
                "startDate":"2009,9,16",
		"endDate":"2013,2,15",
                "headline":"tl_headline=enddat",
                "text":"<p> <b>headline </b> <a href=gao.pdf>gao.pdf</a> ko_saic/timeline/examples/gao.pdf...</p>",
                "asset":
                {
                    "media":"",
                    "credit":"credit",
                    "caption":"caption_swf"
                }
            },



            {
                "startDate":"2012,7,4",
                "headline":"noko and shun ko0.us",
                "text":"<p>thepat ok but no ko</p>",
                "asset":
                {
                    "media":"http://duckduckgo.com",
                    "credit":"",
                    "caption":""
                }
            },
			{
                "startDate":"2012,11,01",
                "headline":"mischief engineering kickoff",
                "text":"test1.txt",
                "asset":
                {
                    "media":"",
                    "credit":"",
                    "caption":""
                }
            },
			{
                "startDate":"2011,12,12",
                "headline":"undisclosed location",
                "text":"",
                "asset":
                {
                    "media":"http://bing.com",
                    "credit":"",
                    "caption":"virtual datacenter, knowledgebase, datacall systems"
                }
            },
			{
                "startDate":"2012,12,14",
                "headline":"you can leave yesterday",
                "text":"",
                "asset":
                {
                    "media":"ko.png",
                    "credit":"ko.png",
                    "caption":"ko.png"
                }
            },

			{
                "startDate":"2012,12,15",
                "headline":"https://iperms.com/tl/htm/gao.pdf",
                "text":"text: examples/gao.pdf",
                "asset":
                {
                    "media":"media=https://ko2.us/tl/examples/gao.pdf",
                    "credit":"credit=https://ko2.us/tl/examples/gao.pdf",
                    "caption":"caption=https://ko2.us/tl/examples/gao.pdf"
                }
            },


			{
                "startDate":"2011,12,16",
                "headline":"https://ko2.us/ko_saic/ko_saic.php",
                "text":"http://ko2.us",
                "asset":
                {
                    "media":"http://ko2.us/ko_saic/ko_saic.php",
                    "credit":"credit ko_saic.php",
                    "caption":"caption ko_saic.php"
                }
            },




			{
                "startDate":"2013,2,4",
                "headline":"invoice 47 days",
                "text":"",
                "asset":
                {
                    "media":"http://iperms.com",
                    "credit":"",
                    "caption":"iperms.com caption_..."
                }
            },

			{
                "startDate":"2013,2,15",
                "headline":"headline=back to stl",
                "text":"",
                "asset":
                {
                    "media":"http://ko2.us/zm5",
                    "credit":"credit=credit",
                    "caption":"zm5 caption=caption_end"
                	} } ] } } 

tl_dta0 = {
    "timeline": {
        "headline":"timejack <a href=http://ka2/index.html><img src='/imgs/btn/koeye.png'></a> tl_headline jkwii tl_dta_zero ",
        "type":"default",
		"text":"tl_text zero",
		"startDate":"2002,9,16",
        "date": [
            {
                "startDate":"2002,9,16",
		"endDate":"2013,2,15",
                "headline":"tl_headline=enddat",
                "text":"<p> <b>headline two </b> <a href=index_zm.html><img src=/imgs/btn/koeyew.png></a> ko_saic/timeline/examples/gao.pdf...</p>",
                "asset":
                {
                    "media":"",
                    "credit":"credit",
                    "caption":"caption_swf"
                }
            },
			{
                "startDate":"2013,2,15",
                "headline":"headline=back to stl",
                "text":"",
                "asset":
                {
                    "media":"http://ko2.us/zm5",
                    "credit":"credit=credit",
                    "caption":"zm5 caption=caption_end"
                	} } ] } } 







tl_dta1 = {
    "timeline": {
        "headline":"timejack <a href=http://ka1/index_zm.html<img src=/imgs/btn/kbeyeb.png></a> tl_headline jkwii tl_dta_one ",
        "type":"default",
		"text":"tl_text one",
		"startDate":"2009,9,16",
        "date": [
            {
                "startDate":"2001,9,16",
		"endDate":"2001,2,15",
                "headline":"tl_headline=enddat one",
                "text":"<p> <b>headline one </b> <a href=index_zm.html><img src=/imgs/btn/koeyew.png></a> ko_saic/timeline/examples/gao.pdf...</p>",
                "asset":
                {
                    "media":"",
                    "credit":"credit",
                    "caption":"caption_swf"
                }
            },
			{
                "startDate":"2013,2,15",
                "headline":"headline=back to stl",
                "text":"",
                "asset":
                {
                    "media":"http://ko2.us/zm5",
                    "credit":"credit=credit",
                    "caption":"zm5 caption=caption_end"
                	} } ] } } 
tl_dta2 = {
    "timeline": {
        "headline":"timejack <a href=http://iperms.com><img src=/imgs/btn/kbeyew.png></a> tl_headline jkwii tl_dta_two ",
        "type":"default",
		"text":"tl_text two",
		"startDate":"2002,9,16",
        "date": [
            {
                "startDate":"2002,9,16",
		"endDate":"2013,2,15",
                "headline":"tl_headline=enddat",
                "text":"<p> <b>headline two </b> <a href=index_zm.html><img src=/imgs/btn/koeyew.png></a> ko_saic/timeline/examples/gao.pdf...</p>",
                "asset":
                {
                    "media":"",
                    "credit":"credit",
                    "caption":"caption_swf"
                }
            },
			{
                "startDate":"2013,2,15",
                "headline":"headline=back to stl",
                "text":"",
                "asset":
                {
                    "media":"http://ko2.us/zm5",
                    "credit":"credit=credit",
                    "caption":"zm5 caption=caption_end"
                	} } ] } } 



	tl_data[0] = tl_dta;
	tl_data[1] = tl_dta1;
	tl_data[2] = tl_dta2;
	tl_data[3] = tl_dta;
//	tl_data[3] = tl_dta1;
//	tl_data[4] = tl_dta2;
	j= tl_data.length-1;
	tl_dta = tl_data[j];
	alert( "BUGS_29500 tl_dta="+tl_dta+" len="+tl_data.length );
			</script>

		<script id="script_ream_my-timeline" >
			$(document).ready(function() {
				var j=0; var jlen=0;
				tl_data[0] = tl_dta;
				tl_data[1] = tl_dta0;
				tl_data[2] = tl_dta1;
				tl_data[3] = tl_dta2;
//				jlen = tl_data.length; 
//				tl_dta = tl_data[jlen-1];
				tl_dta = tl_data[0];
//				tl_num = 1;
				createStoryJS({
					type:		'timeline',
					width:		'800',
					height:		'600',
//					source:		tl_dta,
					source:		tl_data[tl_num],
					embed_id:	'my-timeline',
					debug:		true
				});
			});
			</script>

		<script id="script_ream_my-timeline-0" >
			var tl_num=0;
			$(document).ready(function() {
				var j=0; var jlen=0;
//				tl_data[0] = tl_dta;
				jlen = tl_data.length; 
//				tl_dta = tl_data[jlen-1];
//				tl_dta = tl_data[0];
				createStoryJS({
					type:		'timeline',
					width:		'800',
					height:		'600',
					source:		tl_data[tl_num],
					embed_id:	'my-timeline',
					debug:		true
				});
			});
			</script>



<!-- 					source:		'ko_json.json', -->


HTML_TL;
	return( $html_tl);
	} 


function html_tm() {} 
function html_yt() {
	$html_yt=<<<HTML_YT

<!-- <script src="./ytembed.js"></script> -->
<script src="data:/text/plain;base64,PCEtLQ0KDQovKiBTb3VyY2U6IGh0dHA6Ly95dm9zY2hhYXAuY29tICovDQovKiBCdWlsZCBmaXJzdCBpbiAnMDYgKi8NCi8qIDEvNC8yMDE1OiB1cGdyYWRlZCB0byBZb3VUdWJlIEFQSSB2MyAqLw0KLyogNi81LzIwMTU6IGFkZGVkIGJhY2sgdmlld3MgYW5kIGR1cmF0aW9uICAqLw0KDQpGdW5jdGlvbi5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uKG9iaiwgYXJncykgew0KICAgIHZhciBtZXRob2QgPSB0aGlzLA0KICAgICAgICB0ZW1wID0gZnVuY3Rpb24oKSB7DQogICAgICAgICAgICByZXR1cm4gbWV0aG9kLmNhbGwob2JqLCBhcmdzKTsNCiAgICAgICAgfTsNCg0KICAgIHJldHVybiB0ZW1wOw0KfQ0KDQp2YXIgeXRFbWJlZCA9IHsNCg0KICAgIHl0UXVlcnk6IDAsDQogICAgY2w6IDAsDQogICAgY2FsbGJhY2s6IHt9LA0KICAgIGNmZzoge30sDQogICAgcGxheWVyOiBmYWxzZSwNCg0KICAgIC8qKg0KICAgICAqIE1haW4gSW5pdCBNZXRob2QNCiAgICAgKi8NCiAgICBpbml0OiBmdW5jdGlvbihjZmcpIHsNCg0KICAgICAgICB0aGlzLmNmZyA9IGNmZyB8fCB7fTsNCg0KICAgICAgICAvLyB0ZW1wIGhhcmRjb2RlIG91ciBvd24ga2V5IGlmIG5vdCBwcm92aWRlZA0KICAgICAgICBpZiAoIXRoaXMuY2ZnLmtleSkgew0KICAgICAgICAgICAgICAgIHRoaXMuY2ZnLmtleSA9ICdBSXphU3lBOE9tS2N3MkRNTmtKaWN5Q0owdnF2ZjkweGdlSDUyekUnOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKCF0aGlzLmNmZy5ibG9jaykgew0KICAgICAgICAgICAgdGhpcy5tZXNzYWdlKCdQbGVhc2Ugc2V0IHRoZSBibG9jayBlbGVtZW50IGluIHRoZSBjb25maWcgZmlsZS4nKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGlmICghdGhpcy5jZmcudHlwZSkgew0KICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSgnWW91IG11c3QgcHJvdmlkZSBhIHR5cGU6IHNlYXJjaCwgdXNlciwgcGxheWxpc3QsIGZlYXR1cmVkIGluIHRoZSBpbnNlcnRWaWRlb3MgZnVuY3Rpb24uJyk7DQogICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmNmZy5xICYmICF0aGlzLmNmZy5pZCkgew0KICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSgnWW91IG11c3QgcHJvdmlkZSBhIHF1ZXJ5OiBzZWFyY2gga2V5d29yZHMsIHBsYXlsaXN0IElELCBvciB1c2VybmFtZS4nKTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuY2ZnLmtleSkgew0KICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSgnTmV3OiBZb3UgbXVzdCBwcm92aWRlIGEgR29vZ2xlIERldmVsb3BlciBBUEkga2V5OiA8c3Ryb25nPjxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3lvdXR1YmUvcmVnaXN0ZXJpbmdfYW5fYXBwbGljYXRpb24iPmdldCBrZXk8L2E+PC9zdHJvbmc+LicpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAvL3RoaXMubWVzc2FnZSgnTG9hZGluZyBZb3VUdWJlIHZpZGVvcy4gUGxlYXNlIHdhaXQuLi4nKTsNCg0KICAgICAgICAgICAgICAgIC8vY3JlYXRlIGEgamF2YXNjcmlwdCBlbGVtZW50IHRoYXQgcmV0dXJucyBvdXIgSlNPTnAgZGF0YS4NCiAgICAgICAgICAgICAgICB2YXIgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7DQogICAgICAgICAgICAgICAgc2NyaXB0LnNldEF0dHJpYnV0ZSgndHlwZScsICd0ZXh0L2phdmFzY3JpcHQnKTsNCg0KICAgICAgICAgICAgICAgIC8vYSBjb3VudGVyDQogICAgICAgICAgICAgICAgdGhpcy55dFF1ZXJ5Kys7DQoNCiAgICAgICAgICAgICAgICAvL3NldHRpbmdzDQoNCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY2ZnLnBhZ2luZykgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmNmZy5wYWdpbmcgPSB0cnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY2ZnLnJlc3VsdHMpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZmcucmVzdWx0cyA9IDEwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY2ZnLm1ldGEpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZmcubWV0YSA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmICghdGhpcy5jZmcub3JkZXIpIHsNCiAgICAgICAgICAgICAgICAgICAgLy9kZXByZWNhdGVkIGluIHYzDQogICAgICAgICAgICAgICAgICAgIHRoaXMuY2ZnLm9yZGVyYnkgPSAncmVsZXZhbmNlJzsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZmcuc29ydG9yZGVyID0gJ2Rlc2NlbmRpbmcnOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY2ZnLnRodW1ibmFpbCkgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmNmZy50aHVtYm5haWwgPSAyMDA7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmICghdGhpcy5jZmcuaGVpZ2h0KSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuY2ZnLmhlaWdodCA9IDM5MDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNmZy53aWR0aCkgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmNmZy53aWR0aCA9IDY0MDsNCiAgICAgICAgICAgICAgICB9DQoNCg0KICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5jZmcub3JkZXIpIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAibmV3X2ZpcnN0IjoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2ZnLm9yZGVyYnkgPSAnZGF0ZSc7DQogICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMuY2ZnLnNvcnRvcmRlciA9ICdhc2NlbmRpbmcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAiaGlnaGVzdF9yYXRpbmciOg0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jZmcub3JkZXJieSA9ICdyYXRpbmcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzLmNmZy5zb3J0b3JkZXIgPSAnZGVzY2VuZGluZyc7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgICAgICBjYXNlICJtb3N0X3JlbGV2YW5jZSI6DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNmZy5vcmRlcmJ5ID0gJ3JlbGV2YW5jZSc7DQogICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMuY2ZnLnNvcnRvcmRlciA9ICdkZXNjZW5kaW5nJzsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB2YXIgdXJsID0gImh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tIjsNCg0KICAgICAgICAgICAgICAgIC8vd2hhdCBkYXRhIGRvIHdlIG5lZWQ6IGEgc2VhcmNoLCBhIHVzZXIgc2VhcmNoLCBhIHBsYXlsaXN0DQogICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmNmZy50eXBlKSB7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgInNlYXJjaCI6DQogICAgICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJy95b3V0dWJlL3YzL3NlYXJjaD9xPScgKyB0aGlzLmNmZy5xICsgJyZ0eXBlPXZpZGVvJmNhbGxiYWNrPXl0RW1iZWQuY2FsbGJhY2tbJyArIHRoaXMueXRRdWVyeSArICddJm9yZGVyPScgKyB0aGlzLmNmZy5vcmRlcmJ5Ow0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAidXNlciI6DQogICAgICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJy95b3V0dWJlL3YzL2NoYW5uZWxzP2ZvclVzZXJuYW1lPScgKyB0aGlzLmNmZy5xICsgJyZjYWxsYmFjaz15dEVtYmVkLmNhbGxiYWNrWycgKyB0aGlzLnl0UXVlcnkgKyAnXSc7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgICAgICBjYXNlICJwbGF5bGlzdCI6DQogICAgICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJy95b3V0dWJlL3YzL3BsYXlsaXN0SXRlbXM/cGxheWxpc3RJZD0nICsgdGhpcy5jZmcucSArICcmY2FsbGJhY2s9eXRFbWJlZC5jYWxsYmFja1snICsgdGhpcy55dFF1ZXJ5ICsgJ10mb3JkZXI9JyArIHRoaXMuY2ZnLm9yZGVyYnk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgICAgICBjYXNlICJ2aWRlb3MiOg0KICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9ICcveW91dHViZS92My92aWRlb3M/aWQ9JyArIHRoaXMuY2ZnLnEgKyAnJmNhbGxiYWNrPXl0RW1iZWQuY2FsbGJhY2tbJyArIHRoaXMueXRRdWVyeSArICddJm9yZGVyPScgKyB0aGlzLmNmZy5vcmRlcmJ5Ow0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAiZmVhdHVyZWQiOg0KICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9ICcveW91dHViZS92My92aWRlb3M/Y2hhcnQ9bW9zdFBvcHVsYXImY2FsbGJhY2s9eXRFbWJlZC5jYWxsYmFja1snICsgdGhpcy55dFF1ZXJ5ICsgJ10nOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAiY2hhbm5lbCI6DQogICAgICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJy95b3V0dWJlL3YzL2NoYW5uZWxzP2lkPScgKyB0aGlzLmNmZy5xICsgJyZjYWxsYmFjaz15dEVtYmVkLmNhbGxiYWNrWycgKyB0aGlzLnl0UXVlcnkgKyAnXSc7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlKCdVbmtub3duIHNldHRpbmcgdHlwZS4gVXNlOiBzZWFyY2gsIHBsYXlsaXN0IG9yIHVzZXIuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jZmcudHlwZSA9PSAidXNlciJ8fHRoaXMuY2ZnLnR5cGUgPT0gImNoYW5uZWwiKSB7DQogICAgICAgICAgICAgICAgICAgIHVybCArPSAnJnBhcnQ9Y29udGVudERldGFpbHMnOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jZmcudHlwZSA9PSAic2VhcmNoIiAmJiB0aGlzLmNmZy5tZXRhKSB7DQogICAgICAgICAgICAgICAgICAgIHVybCArPSAnJnBhcnQ9aWQnOyAvL25vdGUgcGFydD1pZCBkb2VzbnQgd29yayBmb3IgcGxheWxpc3QuIGdldCBsaXN0IC92aWRlb3Mgd2l0aCBtZXRhZGF0YQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jZmcudHlwZSA9PSAic2VhcmNoIikgew0KICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJyZwYXJ0PXNuaXBwZXQnOyAvL29ubHkgdGhpbmcgaXQgcmV0dXJucw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jZmcudHlwZSA9PSAidmlkZW9zIikgew0KICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJyZwYXJ0PXNuaXBwZXQsY29udGVudERldGFpbHMsc3RhdGlzdGljcyc7IC8vYWxsIGRldGFpbHMNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJyZwYXJ0PXNuaXBwZXQsY29udGVudERldGFpbHMnOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmICh0aGlzLmNmZy50eXBlID09ICJ1c2VyInx8dGhpcy5jZmcudHlwZSA9PSAiY2hhbm5lbCIpIHsNCiAgICAgICAgICAgICAgICAgICAgdXJsICs9ICcmbWF4UmVzdWx0cz0xJzsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY2ZnLnJlc3VsdHMpIHsNCiAgICAgICAgICAgICAgICAgICAgdXJsICs9ICcmbWF4UmVzdWx0cz0nICsgdGhpcy5jZmcucmVzdWx0czsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jZmcucGFnZVRva2VuKSB7DQogICAgICAgICAgICAgICAgICAgIHVybCArPSAnJnBhZ2VUb2tlbj0nICsgdGhpcy5jZmcucGFnZVRva2VuOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIHVybCArPSAnJmtleT0nICsgdGhpcy5jZmcua2V5Ow0KICAgICAgICAgICAgICAgIHVybCArPSAnJnByZXR0eVByaW50PWZhbHNlJzsNCg0KICAgICAgICAgICAgICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoJ3NyYycsIHVybCk7DQoNCg0KICAgICAgICAgICAgICAgIGNmZy5tQyA9IHRoaXMueXRRdWVyeTsNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jZmcudHlwZSA9PSAidXNlciJ8fHRoaXMuY2ZnLnR5cGUgPT0gImNoYW5uZWwiKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tbdGhpcy55dFF1ZXJ5XSA9IGZ1bmN0aW9uKGpzb24pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vZ2V0IHRoZSBmaXJzdCByZXN1bHQgZm9yIHVzZXJuYW1lLCBhbmQgY3JlYXRlIGEgY2hhbm5lbElkIHJlcXVlc3QNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqc29uLnBhZ2VJbmZvLnRvdGFsUmVzdWx0cyA9PSAxKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBsYXlsaXN0SWQgPSBqc29uLml0ZW1zWzBdLmNvbnRlbnREZXRhaWxzLnJlbGF0ZWRQbGF5bGlzdHMudXBsb2FkczsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmcudHlwZSA9ICdwbGF5bGlzdCc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnLnEgPSBwbGF5bGlzdElkOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl0RW1iZWQuaW5pdChjZmcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dEVtYmVkLm1lc3NhZ2UoJ0NhblwndCBmaW5kIHRoaXMgdXNlciBkZWZpbmVkIGluIHEnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMuY2ZnLnR5cGUgPT0gInBsYXlsaXN0IiB8fCB0aGlzLmNmZy50eXBlID09ICJzZWFyY2giKSAmJiB0aGlzLmNmZy5tZXRhKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tbdGhpcy55dFF1ZXJ5XSA9IGZ1bmN0aW9uKGpzb24pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vZ2V0IG1ldGEgZGF0YSBvZiBwbGF5bGlzdCB2aWRlb3MNCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAvL2dyYWIgSURzIG9mIHBsYXlsaXN0LiAvcGxheWxpc3QgbmVlZHMgZXh0cmFjdCBpZCBmcm9tIHNuaXBwZXQsIGVsc2UgZGVmYXVsdCBvbiBpZA0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24uaXRlbXMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaWRzID0gJyc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBqc29uLml0ZW1zLmxlbmd0aDsgaSsrKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24uaXRlbXNbaV0uc25pcHBldCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRzICs9IGpzb24uaXRlbXNbaV0uc25pcHBldC5yZXNvdXJjZUlkLnZpZGVvSWQgKyAiLCI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoanNvbi5pdGVtc1tpXS5pZCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRzICs9IGpzb24uaXRlbXNbaV0uaWQudmlkZW9JZCArICIsIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXF1ZXN0IHZpZGVvIGRldGFpbHMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmcudHlwZSA9ICd2aWRlb3MnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZy5xID0gaWRzOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl0RW1iZWQuaW5pdChjZmcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dEVtYmVkLm1lc3NhZ2UoJ0FuIGVycm9yIG9jY3VyZWQ6PGJyPicgKyBqc29uLmVycm9yLm1lc3NhZ2UpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFja1t0aGlzLnl0UXVlcnldID0gZnVuY3Rpb24oanNvbikgew0KICAgICAgICAgICAgICAgICAgICAgICAgeXRFbWJlZC5saXN0VmlkZW9zKGpzb24sIGNmZyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQoNCg0KICAgICAgICAgICAgICAgIC8vYXR0YWNoIHNjcmlwdCB0byBwYWdlLCB0aGlzIHdpbGwgbG9hZCB0aGUgZGF0YSBpbnRvIG91ciBwYWdlIGFuZCBjYWxsIHRoZSBmdW50aW9uIHl0SW5pdFt5dFF1ZXJ5XQ0KICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0uYXBwZW5kQ2hpbGQoc2NyaXB0KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgfSwNCg0KDQogICAgLyoqDQogICAgICogQnVpbGQgdmlkZW9zIChzdGF0aWMpDQogICAgICovDQogICAgbGlzdFZpZGVvczogZnVuY3Rpb24oanNvbiwgY2ZnKSB7DQogICAgICAgIHRoaXMuY2ZnID0gY2ZnOw0KICAgICAgICBpZiAoIXRoaXMuY2ZnLnBsYXllcikgew0KICAgICAgICAgICAgdGhpcy5jZmcucGxheWVyID0gJ2VtYmVkJzsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoIXRoaXMuY2ZnLmxheW91dCkgew0KICAgICAgICAgICAgdGhpcy5jZmcubGF5b3V0ID0gJ2Z1bGwnOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuY2ZnLmJsb2NrKTsNCg0KICAgICAgICB2YXIgY2hpbGRyZW4gPSBkaXYuY2hpbGROb2RlczsNCiAgICAgICAgZm9yICh2YXIgaSA9IGNoaWxkcmVuLmxlbmd0aDsgaSA+IC0xOyBpLS0pIHsNCiAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXSAmJiAoY2hpbGRyZW5baV0uY2xhc3NOYW1lLmluZGV4T2YoImVycm9yIikgIT09IC0xIHx8IGNoaWxkcmVuW2ldLnRhZ05hbWUgPT09ICJVTCIpKSB7IC8qIGlzIGVycm9yIG1lc3NhZ2Ugb3IgcmVzdWx0IGxpc3QgKi8NCiAgICAgICAgICAgICAgICBkaXYucmVtb3ZlQ2hpbGQoY2hpbGRyZW5baV0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCg0KICAgICAgICAvL2Rpdi5pbm5lckhUTUwgPSAnJzsgLy9jbGVhciB1bA0KICAgICAgICBpZiAoanNvbi5lcnJvcikgew0KICAgICAgICAgICAgdGhpcy5tZXNzYWdlKCdBbiBlcnJvciBvY2N1cmVkOjxicj4nICsganNvbi5lcnJvci5tZXNzYWdlKTsNCiAgICAgICAgfSBlbHNlIGlmIChqc29uLml0ZW1zKSB7DQogICAgICAgICAgICB2YXIgdWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpOw0KICAgICAgICAgICAgdWwuY2xhc3NOYW1lID0gJ3l0bGlzdCc7DQoNCiAgICAgICAgICAgIHZhciBwbGF5bGlzdCA9ICIiOw0KDQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGpzb24uaXRlbXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSBqc29uLml0ZW1zW2ldOw0KDQogICAgICAgICAgICAgICAgLy9wbGF5bGlzdCBuZWVkIHRoaXMNCg0KICAgICAgICAgICAgICAgIGlmIChlbnRyeS5zbmlwcGV0ICYmIGVudHJ5LnNuaXBwZXQucmVzb3VyY2VJZCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSBlbnRyeS5zbmlwcGV0LnJlc291cmNlSWQudmlkZW9JZDsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVudHJ5LmlkLnZpZGVvSWQpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gZW50cnkuaWQudmlkZW9JZDsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSBlbnRyeS5pZDsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAoaWQpIHsNCiAgICAgICAgICAgICAgICAgICAgcGxheWxpc3QgKz0gaWQgKyAiLCI7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgdmFyIGxpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTsNCg0KICAgICAgICAgICAgICAgIC8vYSBsaW5rIHRvIG91ciBqYXZhc2NyaXB0IG92ZXJsYXkgZnVuY3Rpb24NCiAgICAgICAgICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCiAgICAgICAgICAgICAgICBhLmNsYXNzTmFtZSA9ICdjbGlwJzsNCg0KICAgICAgICAgICAgICAgIGlmICh0aGlzLmNmZy5wbGF5ZXIgPT0gJ2VtYmVkJykgew0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jZmcucGFyZW50KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAvL2Euc2V0QXR0cmlidXRlKCdocmVmJywnIycrdGhpcy5jZmcucGFyZW50KydQbGF5ZXInKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vYS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCcjJyt0aGlzLmNmZy5ibG9jaysnUGxheWVyJyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgYS5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYgKGEuYWRkRXZlbnRMaXN0ZW5lcikgew0KICAgICAgICAgICAgICAgICAgICAgICAgYS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMucGxheVZpZGVvLmJpbmQodGhpcywgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6IGlkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjZmcnOiBjZmcNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBmYWxzZSk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYS5hdHRhY2hFdmVudCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgYS5hdHRhY2hFdmVudCgnb25jbGljaycsIHRoaXMucGxheVZpZGVvLmJpbmQodGhpcywgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6IGlkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjZmcnOiBjZmcNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGEuc2V0QXR0cmlidXRlKCdocmVmJywgJ2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9JyArIGlkKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCiAgICAgICAgICAgICAgICBhLmFwcGVuZENoaWxkKHNwYW4pOw0KICAgICAgICAgICAgICAgIHZhciBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCiAgICAgICAgICAgICAgICBpbWcuc2V0QXR0cmlidXRlKCdzcmMnLCAoZW50cnkuc25pcHBldC50aHVtYm5haWxzID8gZW50cnkuc25pcHBldC50aHVtYm5haWxzLm1lZGl1bS51cmwgOiAnJykpOw0KICAgICAgICAgICAgICAgIHNwYW4uYXBwZW5kQ2hpbGQoaW1nKTsNCiAgICAgICAgICAgICAgICB2YXIgZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdlbScpOw0KICAgICAgICAgICAgICAgIHNwYW4uYXBwZW5kQ2hpbGQoZW0pOw0KDQogICAgICAgICAgICAgICAgLy91cGxvYWRlZA0KICAgICAgICAgICAgICAgIGlmICh0aGlzLmNmZy5sYXlvdXQgPT0gJ3RodW1ibmFpbHMnKSB7DQogICAgICAgICAgICAgICAgICAgIGxpLmNsYXNzTmFtZSA9ICdzbWFsbCc7DQogICAgICAgICAgICAgICAgICAgIGxpLmFwcGVuZENoaWxkKGEpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIC8vdGhpcy5jZmcubGF5b3V0ID0gZnVsbA0KICAgICAgICAgICAgICAgICAgICBsaS5pbm5lckhUTUwgPSAnPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgYm9yZGVyPSIwIj48dHI+PHRkIHZhbGlnbj0idG9wIiByb3dzcGFuPSIyIj48L3RkPjx0ZCB2YWxpZ249InRvcCI+PGgzPicgKyBlbnRyeS5zbmlwcGV0LnRpdGxlICsgJzwvaDM+PHNwYW4+JyArIHRoaXMuZm9ybWF0RGVzY3JpcHRpb24oZW50cnkuc25pcHBldC5kZXNjcmlwdGlvbikgKyAnPC9zcGFuPjwvdGQ+PHRkIHZhbGlnbj0idG9wIiBzdHlsZT0id2lkdGg6IDE1MHB4IiBjbGFzcz0ibWV0YSI+PGRpdj4nICsgKGVudHJ5LmNvbnRlbnREZXRhaWxzID8gJ0R1cmF0aW9uOiAnICsgeXRFbWJlZC5mb3JtYXREdXJhdGlvbihlbnRyeS5jb250ZW50RGV0YWlscy5kdXJhdGlvbikgKyAnPGJyPicgOiAnJykgKyAoZW50cnkuc3RhdGlzdGljcyA/ICdWaWV3czogJyArIGVudHJ5LnN0YXRpc3RpY3Mudmlld0NvdW50ICsgJzxicj4nIDogJycpICsgJ0Zyb206IDxhIGhyZWY9Imh0dHA6Ly93d3cueW91dHViZS5jb20vcHJvZmlsZT91c2VyPScgKyBlbnRyeS5zbmlwcGV0LmNoYW5uZWxUaXRsZSArICciPicgKyBlbnRyeS5zbmlwcGV0LmNoYW5uZWxUaXRsZSArICc8L2E+PC9kaXY+PC90ZD48L3RyPjwvdGFibGU+JzsNCiAgICAgICAgICAgICAgICAgICAgbGkuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5hcHBlbmRDaGlsZChhKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdWwuYXBwZW5kQ2hpbGQobGkpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvL2ZvciBmaXhlZCB0byBib3R0b20gdmlkZW9zDQogICAgICAgICAgICBpZiAodGhpcy5jZmcucG9zaXRpb24gPT0gImZpeGVkX2JvdHRvbSIpIHsNCiAgICAgICAgICAgICAgICBkaXYuc3R5bGUucG9zaXRpb24gPSAiZml4ZWQiOw0KICAgICAgICAgICAgICAgIGRpdi5zdHlsZS5ib3R0b20gPSAnMHB4JzsNCiAgICAgICAgICAgICAgICBkaXYuc3R5bGUubGVmdCA9ICcwcHgnOw0KICAgICAgICAgICAgICAgIC8vZG9jdW1lbnQgYm90dG9tIGFkZCBYIChoZWlnaHQpIHBpeGVscyBtYXJnaW4NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZCh1bCk7DQoNCiAgICAgICAgICAgIC8vcGxheWxpc3QNCiAgICAgICAgICAgIGlmICh0aGlzLmNmZy5wbGF5bGlzdCA9PSB0cnVlKSB7DQogICAgICAgICAgICAgICAgdGhpcy5jZmcucGxheWVyVmFycy5wbGF5bGlzdCA9IHBsYXlsaXN0LnN1YnN0cigwLCBwbGF5bGlzdC5sZW5ndGggLSAxKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHRoaXMuY2ZnLnBsYXllciA9PSAiZW1iZWQiICYmIHRoaXMuY2ZnLmRpc3BsYXlfZmlyc3QgPT0gdHJ1ZSkgew0KICAgICAgICAgICAgICAgIC8vc2V0IHNldHRpbmdzDQoNCiAgICAgICAgICAgICAgICB5dFBsYXllclBhcmFtcy52aWRlb0lkID0gaWQ7DQoNCg0KICAgICAgICAgICAgICAgIC8vb3RoZXIgc2V0dGluZ3MNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jZmcucGxheWVyVmFycykgew0KICAgICAgICAgICAgICAgICAgICB5dFBsYXllclBhcmFtcy5wbGF5ZXJWYXJzID0gdGhpcy5jZmcucGxheWVyVmFyczsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB0aGlzLnBsYXllciA9IHRoaXMuY3JlYXRlUGxheWVyKHRoaXMuY2ZnKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHRoaXMuY2ZnLnBhZ2luZyA9PSB0cnVlICYmIGpzb24ubmV4dFBhZ2VUb2tlbikgew0KICAgICAgICAgICAgICAgIHRoaXMuY2ZnLmRpc3BsYXlfZmlyc3QgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICB2YXIgcHVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndWwnKTsNCiAgICAgICAgICAgICAgICBwdWwuc2V0QXR0cmlidXRlKCdpZCcsICd5dFBhZ2UnKTsNCiAgICAgICAgICAgICAgICBpZiAoanNvbi5uZXh0UGFnZVRva2VuKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBsaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQogICAgICAgICAgICAgICAgICAgIGEuY2xhc3NOYW1lID0gJ3l0TmV4dCc7DQogICAgICAgICAgICAgICAgICAgIGEuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInOw0KDQogICAgICAgICAgICAgICAgICAgIGxpLmFwcGVuZENoaWxkKGEpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoYS5hZGRFdmVudExpc3RlbmVyKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBhLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgeXRFbWJlZC5sb2FkTmV4dC5iaW5kKHRoaXMsIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmc6IGNmZywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbjoganNvbi5uZXh0UGFnZVRva2VuDQogICAgICAgICAgICAgICAgICAgICAgICB9KSwgZmFsc2UpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGEuaW5uZXJIVE1MID0gJ0xvYWQgbmV4dC4uLic7DQogICAgICAgICAgICAgICAgICAgIGxpLmFwcGVuZENoaWxkKGEpOyAvL2RvIHRocm91Z2ggYmluZA0KICAgICAgICAgICAgICAgICAgICBwdWwuYXBwZW5kQ2hpbGQobGkpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmIChqc29uLnByZXZQYWdlVG9rZW4pIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGxpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTsNCg0KICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCiAgICAgICAgICAgICAgICAgICAgYS5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ3l0UHJldicpOw0KICAgICAgICAgICAgICAgICAgICBhLnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJzsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAoYS5hZGRFdmVudExpc3RlbmVyKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBhLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgeXRFbWJlZC5sb2FkUHJldmlvdXMuYmluZCh0aGlzLCB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnOiBjZmcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW46IGpzb24ucHJldlBhZ2VUb2tlbg0KICAgICAgICAgICAgICAgICAgICAgICAgfSksIGZhbHNlKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBhLmlubmVySFRNTCA9ICdMb2FkIHByZXZpb3VzLi4uJzsNCiAgICAgICAgICAgICAgICAgICAgbGkuYXBwZW5kQ2hpbGQoYSk7DQogICAgICAgICAgICAgICAgICAgIHB1bC5hcHBlbmRDaGlsZChsaSk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKHB1bCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHRoaXMubWVzc2FnZSgnTm8gWW91VHViZSB2aWRlb3MgZm91bmQgZm9yIHlvdXIgcXVlcnk6PGJyPlR5cGU6XCcnICsgdGhpcy5jZmcudHlwZSArICdcJzxicj5RdWVyeTogXCcnICsgdGhpcy5jZmcucSArICdcJycpOw0KICAgICAgICB9DQogICAgfSwNCiAgICAvKioNCiAgICAgKiBDcmVhdGUgdGhlIGlubGluZSBwbGF5ZXIgc3VwcG9ydGluZyBodG1sNSBhbmQgZmxhc2ggdGhyb3VnaCBpZnJhbWUNCiAgICAgKi8NCiAgICBjcmVhdGVQbGF5ZXI6IGZ1bmN0aW9uKGNmZykgew0KICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY2ZnLmJsb2NrKTsNCg0KICAgICAgICB2YXIgaG9sZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOw0KICAgICAgICBob2xkLmNsYXNzTmFtZSA9ICd5dFBsYXllcic7DQoNCiAgICAgICAgdmFyIGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpOw0KICAgICAgICBpZnJhbWUuc2V0QXR0cmlidXRlKCdpZCcsIGNmZy5ibG9jayArICdQbGF5ZXInKTsNCiAgICAgICAgaWZyYW1lLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBjZmcud2lkdGgpOw0KICAgICAgICBpZnJhbWUuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBjZmcuaGVpZ2h0KTsNCiAgICAgICAgaWZyYW1lLnNldEF0dHJpYnV0ZSgnZnJhbWVCb3JkZXInLCAnMCcpOw0KICAgICAgICBpZnJhbWUuc2V0QXR0cmlidXRlKCdzcmMnLCAnaHR0cDovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC8nICsgeXRQbGF5ZXJQYXJhbXMudmlkZW9JZCArICc/YXV0b3BsYXk9JyArIHl0UGxheWVyUGFyYW1zLmF1dG9wbGF5ICsgJyZtb2Rlc3RicmFuZGluZz0xJyk7IC8vY29udHJvbGJhciBzZXQNCg0KICAgICAgICBob2xkLmFwcGVuZENoaWxkKGlmcmFtZSk7DQogICAgICAgIGRpdi5pbnNlcnRCZWZvcmUoaG9sZCwgZGl2LmZpcnN0Q2hpbGQpOw0KDQogICAgICAgIHJldHVybiBpZnJhbWU7DQogICAgfSwNCiAgICAvKioNCiAgICAgKiBGb3JtYXQgcmF0aW5nIChyYXRpbmcvcmF0aW5nQ291bnQpDQogICAgICovDQogICAgZm9ybWF0UmF0aW5nOiBmdW5jdGlvbihydCwgcmMpIHsNCg0KICAgIH0sDQoNCiAgICAvKioNCiAgICAgKiBGb3JtYXQgZHVyYXRpb24gKHNlYyB0byBtaW4pIHVzaW5nIHZpZGVvcyNjb250ZW50RGV0YWlscy5kdXJhdGlvbg0KICAgICAqLw0KICAgIGZvcm1hdER1cmF0aW9uOiBmdW5jdGlvbihkcikgew0KICAgICAgICByZXR1cm4gZHIucmVwbGFjZSgvKE18SCkvZywgJzonKS5yZXBsYWNlKCJTIiwgIiIpLnN1YnN0cigyKTsNCiAgICB9LA0KDQogICAgLyoqDQogICAgICogRm9ybWF0IGRlc2NyaXB0aW9uIChkZXNjcmlwdGlvbiB0byBzbmlwcGV0KSAocmVhZCBtb3JlIGV4cGFuZCkNCiAgICAgKi8NCiAgICBmb3JtYXREZXNjcmlwdGlvbjogZnVuY3Rpb24oZHMpIHsNCiAgICAgICAgaWYgKGRzKSB7DQogICAgICAgICAgICBpZiAoZHMubGVuZ3RoID4gMjU1KSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGRzLnN1YnN0cigwLCAyNTIpICsgJy4uLic7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiBkczsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJldHVybiAiTm8gZGVzY3JpcHRpb24gYXZhaWxhYmxlLiI7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgLyoqDQogICAgICogRm9ybWF0IGRhdGUgKDIwMDktMDgtMTBUMDk6MDQ6MjAuMDAwWiB0byB0aW1lKQ0KICAgICAqLw0KICAgIGZvcm1hdERhdGU6IGZ1bmN0aW9uKGR0KSB7DQogICAgICAgIGlmIChkdCkgew0KICAgICAgICAgICAgcmV0dXJuIGR0LnN1YnN0cigwLCAxMCkNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJldHVybiAidW5rbm93biI7DQogICAgICAgIH0NCiAgICB9LA0KICAgIC8qKg0KICAgICAqIERlcHJlY2lhdGVkDQogICAgICovDQogICAgbW91c092ZXJJbWFnZTogZnVuY3Rpb24oYSwgYiwgYykgew0KDQogICAgfSwNCiAgICAvKioNCiAgICAgKiBEZXByZWNpYXRlZA0KICAgICAqLw0KICAgIG1vdXNlT3V0SW1hZ2U6IGZ1bmN0aW9uKGEsIGIpIHsNCg0KICAgIH0sDQogICAgLyoqDQogICAgICogTG9hZCBuZXh0IChwYWdlKQ0KICAgICAqLw0KICAgIGxvYWROZXh0OiBmdW5jdGlvbihkYXRhKSB7DQogICAgICAgIGRhdGEuY2ZnLnBhZ2VUb2tlbiA9IGRhdGEudG9rZW47DQogICAgICAgIHl0RW1iZWQuaW5pdChkYXRhLmNmZyk7DQogICAgfSwNCiAgICAvKioNCiAgICAgKiBMb2FkIHByZXZpb3VzIChwYWdlKQ0KICAgICAqLw0KICAgIGxvYWRQcmV2aW91czogZnVuY3Rpb24oZGF0YSkgew0KICAgICAgICBkYXRhLmNmZy5wYWdlVG9rZW4gPSBkYXRhLnRva2VuOw0KICAgICAgICB5dEVtYmVkLmluaXQoZGF0YS5jZmcpOw0KICAgIH0sDQogICAgLyoqDQogICAgICogU29ydGluZyBieSBjb21tdG5zLCB2aWV3cywgZGF0ZQ0KICAgICAqLw0KICAgIHNvcnRMaXN0OiBmdW5jdGlvbihqc29uKSB7DQoNCiAgICB9LA0KDQogICAgLyoqDQogICAgICogUGxheSB2aWRlbyAoc3RhdGljKQ0KICAgICAqLw0KICAgIHBsYXlWaWRlbzogZnVuY3Rpb24oZGF0YSkgew0KICAgICAgICBjb25zb2xlLmxvZyhkYXRhKTsNCiAgICAgICAgaWYgKGRhdGEuY2ZnLnBhcmVudCkgew0KICAgICAgICAgICAgdmFyIHBsYXllciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRhdGEuY2ZnLnBhcmVudCArICJQbGF5ZXIiKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHZhciBwbGF5ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkYXRhLmNmZy5ibG9jayArICJQbGF5ZXIiKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICghcGxheWVyKSB7DQogICAgICAgICAgICB5dFBsYXllclBhcmFtcy52aWRlb0lkID0gZGF0YS5pZDsNCiAgICAgICAgICAgIHl0UGxheWVyUGFyYW1zLmF1dG9wbGF5ID0gMTsNCg0KICAgICAgICAgICAgdGhpcy5jcmVhdGVQbGF5ZXIoZGF0YS5jZmcpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcGxheWVyLnNldEF0dHJpYnV0ZSgnc3JjJywgJ2h0dHA6Ly93d3cueW91dHViZS5jb20vZW1iZWQvJyArIGRhdGEuaWQgKyAnP2F1dG9wbGF5PTEmbW9kZXN0YnJhbmRpbmc9MSZvcmlnaW49JyArIGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArIGRvY3VtZW50LmxvY2F0aW9uLmhvc3RuYW1lKTsNCiAgICAgICAgfQ0KICAgIH0sDQogICAgLyoqDQogICAgICogVGVzdA0KICAgICAqLw0KICAgIHRlc3Q6IGZ1bmN0aW9uKGUsIGIpIHsNCiAgICAgICAgY29uc29sZS5sb2coZSk7DQogICAgICAgIGNvbnNvbGUubG9nKGIpOw0KICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmNmZy5ibG9jayk7DQogICAgfSwNCg0KICAgIC8qKg0KICAgICAqIG9uUGxheWVyUmVhZHkgdmlkZW8NCiAgICAgKi8NCiAgICBvblBsYXllclJlYWR5OiBmdW5jdGlvbihpZCkgew0KICAgICAgICAvL3NldCBmbGFnDQogICAgfSwNCg0KICAgIC8qKg0KICAgICAqIG9uUGxheWVyU3RhdGVDaGFuZ2UgdmlkZW8NCiAgICAgKi8NCiAgICBvblBsYXllclN0YXRlQ2hhbmdlOiBmdW5jdGlvbihpZCkgew0KICAgICAgICAvLw0KICAgIH0sDQoNCiAgICAvKioNCiAgICAgKiBNZXNzYWdlcyBsb2cNCiAgICAgKi8NCiAgICBtZXNzYWdlOiBmdW5jdGlvbihtc2cpIHsNCiAgICAgICAgaWYgKCF5dEVtYmVkLmNmZy5ibG9jaykgew0KICAgICAgICAgICAgLy9hdHRhY2ggbWVzc2FnZSB0byBib2R5Pw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoeXRFbWJlZC5jZmcuYmxvY2spLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPSJlcnJvciI+JyArIG1zZyArICc8L2Rpdj4nOw0KICAgICAgICB9DQogICAgfQ0KfTsNCg0KLyoqDQogKiBVc2luZyB0aGUgZW1iZWQgcGxheWVyDQogKi8NCnZhciB5dFBsYXllcjsNCnZhciB5dFBsYXllclBhcmFtcyA9IHsNCiAgICBhdXRvcGxheTogMCwNCiAgICBtb2Rlc3RicmFuZGluZzogMSwNCiAgICBldmVudHM6IHsNCiAgICAgICAgJ29uUmVhZHknOiB5dEVtYmVkLm9uUGxheWVyUmVhZHksDQogICAgICAgICdvblN0YXRlQ2hhbmdlJzogeXRFbWJlZC5vblBsYXllclN0YXRlQ2hhbmdlDQogICAgfQ0KfTsNCg0KLS0+DQo=" ></script>

<script> 
<!--
 
function updateField(){
	var nada = '';
 
//	var code = '<sc'+ nada +'ript src="http://www.yvoschaap.com/ytpage/ytembed.js" ></sc'+ nada +'ript>';
	var code = '<sc'+ nada +'ript src="data:/text/plain;base64,PCEtLQ0KDQovKiBTb3VyY2U6IGh0dHA6Ly95dm9zY2hhYXAuY29tICovDQovKiBCdWlsZCBmaXJzdCBpbiAnMDYgKi8NCi8qIDEvNC8yMDE1OiB1cGdyYWRlZCB0byBZb3VUdWJlIEFQSSB2MyAqLw0KLyogNi81LzIwMTU6IGFkZGVkIGJhY2sgdmlld3MgYW5kIGR1cmF0aW9uICAqLw0KDQpGdW5jdGlvbi5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uKG9iaiwgYXJncykgew0KICAgIHZhciBtZXRob2QgPSB0aGlzLA0KICAgICAgICB0ZW1wID0gZnVuY3Rpb24oKSB7DQogICAgICAgICAgICByZXR1cm4gbWV0aG9kLmNhbGwob2JqLCBhcmdzKTsNCiAgICAgICAgfTsNCg0KICAgIHJldHVybiB0ZW1wOw0KfQ0KDQp2YXIgeXRFbWJlZCA9IHsNCg0KICAgIHl0UXVlcnk6IDAsDQogICAgY2w6IDAsDQogICAgY2FsbGJhY2s6IHt9LA0KICAgIGNmZzoge30sDQogICAgcGxheWVyOiBmYWxzZSwNCg0KICAgIC8qKg0KICAgICAqIE1haW4gSW5pdCBNZXRob2QNCiAgICAgKi8NCiAgICBpbml0OiBmdW5jdGlvbihjZmcpIHsNCg0KICAgICAgICB0aGlzLmNmZyA9IGNmZyB8fCB7fTsNCg0KICAgICAgICAvLyB0ZW1wIGhhcmRjb2RlIG91ciBvd24ga2V5IGlmIG5vdCBwcm92aWRlZA0KICAgICAgICBpZiAoIXRoaXMuY2ZnLmtleSkgew0KICAgICAgICAgICAgICAgIHRoaXMuY2ZnLmtleSA9ICdBSXphU3lBOE9tS2N3MkRNTmtKaWN5Q0owdnF2ZjkweGdlSDUyekUnOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKCF0aGlzLmNmZy5ibG9jaykgew0KICAgICAgICAgICAgdGhpcy5tZXNzYWdlKCdQbGVhc2Ugc2V0IHRoZSBibG9jayBlbGVtZW50IGluIHRoZSBjb25maWcgZmlsZS4nKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGlmICghdGhpcy5jZmcudHlwZSkgew0KICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSgnWW91IG11c3QgcHJvdmlkZSBhIHR5cGU6IHNlYXJjaCwgdXNlciwgcGxheWxpc3QsIGZlYXR1cmVkIGluIHRoZSBpbnNlcnRWaWRlb3MgZnVuY3Rpb24uJyk7DQogICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmNmZy5xICYmICF0aGlzLmNmZy5pZCkgew0KICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSgnWW91IG11c3QgcHJvdmlkZSBhIHF1ZXJ5OiBzZWFyY2gga2V5d29yZHMsIHBsYXlsaXN0IElELCBvciB1c2VybmFtZS4nKTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuY2ZnLmtleSkgew0KICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSgnTmV3OiBZb3UgbXVzdCBwcm92aWRlIGEgR29vZ2xlIERldmVsb3BlciBBUEkga2V5OiA8c3Ryb25nPjxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3lvdXR1YmUvcmVnaXN0ZXJpbmdfYW5fYXBwbGljYXRpb24iPmdldCBrZXk8L2E+PC9zdHJvbmc+LicpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAvL3RoaXMubWVzc2FnZSgnTG9hZGluZyBZb3VUdWJlIHZpZGVvcy4gUGxlYXNlIHdhaXQuLi4nKTsNCg0KICAgICAgICAgICAgICAgIC8vY3JlYXRlIGEgamF2YXNjcmlwdCBlbGVtZW50IHRoYXQgcmV0dXJucyBvdXIgSlNPTnAgZGF0YS4NCiAgICAgICAgICAgICAgICB2YXIgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7DQogICAgICAgICAgICAgICAgc2NyaXB0LnNldEF0dHJpYnV0ZSgndHlwZScsICd0ZXh0L2phdmFzY3JpcHQnKTsNCg0KICAgICAgICAgICAgICAgIC8vYSBjb3VudGVyDQogICAgICAgICAgICAgICAgdGhpcy55dFF1ZXJ5Kys7DQoNCiAgICAgICAgICAgICAgICAvL3NldHRpbmdzDQoNCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY2ZnLnBhZ2luZykgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmNmZy5wYWdpbmcgPSB0cnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY2ZnLnJlc3VsdHMpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZmcucmVzdWx0cyA9IDEwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY2ZnLm1ldGEpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZmcubWV0YSA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmICghdGhpcy5jZmcub3JkZXIpIHsNCiAgICAgICAgICAgICAgICAgICAgLy9kZXByZWNhdGVkIGluIHYzDQogICAgICAgICAgICAgICAgICAgIHRoaXMuY2ZnLm9yZGVyYnkgPSAncmVsZXZhbmNlJzsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZmcuc29ydG9yZGVyID0gJ2Rlc2NlbmRpbmcnOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY2ZnLnRodW1ibmFpbCkgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmNmZy50aHVtYm5haWwgPSAyMDA7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmICghdGhpcy5jZmcuaGVpZ2h0KSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuY2ZnLmhlaWdodCA9IDM5MDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNmZy53aWR0aCkgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmNmZy53aWR0aCA9IDY0MDsNCiAgICAgICAgICAgICAgICB9DQoNCg0KICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5jZmcub3JkZXIpIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAibmV3X2ZpcnN0IjoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2ZnLm9yZGVyYnkgPSAnZGF0ZSc7DQogICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMuY2ZnLnNvcnRvcmRlciA9ICdhc2NlbmRpbmcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAiaGlnaGVzdF9yYXRpbmciOg0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jZmcub3JkZXJieSA9ICdyYXRpbmcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzLmNmZy5zb3J0b3JkZXIgPSAnZGVzY2VuZGluZyc7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgICAgICBjYXNlICJtb3N0X3JlbGV2YW5jZSI6DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNmZy5vcmRlcmJ5ID0gJ3JlbGV2YW5jZSc7DQogICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMuY2ZnLnNvcnRvcmRlciA9ICdkZXNjZW5kaW5nJzsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB2YXIgdXJsID0gImh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tIjsNCg0KICAgICAgICAgICAgICAgIC8vd2hhdCBkYXRhIGRvIHdlIG5lZWQ6IGEgc2VhcmNoLCBhIHVzZXIgc2VhcmNoLCBhIHBsYXlsaXN0DQogICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmNmZy50eXBlKSB7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgInNlYXJjaCI6DQogICAgICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJy95b3V0dWJlL3YzL3NlYXJjaD9xPScgKyB0aGlzLmNmZy5xICsgJyZ0eXBlPXZpZGVvJmNhbGxiYWNrPXl0RW1iZWQuY2FsbGJhY2tbJyArIHRoaXMueXRRdWVyeSArICddJm9yZGVyPScgKyB0aGlzLmNmZy5vcmRlcmJ5Ow0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAidXNlciI6DQogICAgICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJy95b3V0dWJlL3YzL2NoYW5uZWxzP2ZvclVzZXJuYW1lPScgKyB0aGlzLmNmZy5xICsgJyZjYWxsYmFjaz15dEVtYmVkLmNhbGxiYWNrWycgKyB0aGlzLnl0UXVlcnkgKyAnXSc7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgICAgICBjYXNlICJwbGF5bGlzdCI6DQogICAgICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJy95b3V0dWJlL3YzL3BsYXlsaXN0SXRlbXM/cGxheWxpc3RJZD0nICsgdGhpcy5jZmcucSArICcmY2FsbGJhY2s9eXRFbWJlZC5jYWxsYmFja1snICsgdGhpcy55dFF1ZXJ5ICsgJ10mb3JkZXI9JyArIHRoaXMuY2ZnLm9yZGVyYnk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgICAgICBjYXNlICJ2aWRlb3MiOg0KICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9ICcveW91dHViZS92My92aWRlb3M/aWQ9JyArIHRoaXMuY2ZnLnEgKyAnJmNhbGxiYWNrPXl0RW1iZWQuY2FsbGJhY2tbJyArIHRoaXMueXRRdWVyeSArICddJm9yZGVyPScgKyB0aGlzLmNmZy5vcmRlcmJ5Ow0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAiZmVhdHVyZWQiOg0KICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9ICcveW91dHViZS92My92aWRlb3M/Y2hhcnQ9bW9zdFBvcHVsYXImY2FsbGJhY2s9eXRFbWJlZC5jYWxsYmFja1snICsgdGhpcy55dFF1ZXJ5ICsgJ10nOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAiY2hhbm5lbCI6DQogICAgICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJy95b3V0dWJlL3YzL2NoYW5uZWxzP2lkPScgKyB0aGlzLmNmZy5xICsgJyZjYWxsYmFjaz15dEVtYmVkLmNhbGxiYWNrWycgKyB0aGlzLnl0UXVlcnkgKyAnXSc7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlKCdVbmtub3duIHNldHRpbmcgdHlwZS4gVXNlOiBzZWFyY2gsIHBsYXlsaXN0IG9yIHVzZXIuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jZmcudHlwZSA9PSAidXNlciJ8fHRoaXMuY2ZnLnR5cGUgPT0gImNoYW5uZWwiKSB7DQogICAgICAgICAgICAgICAgICAgIHVybCArPSAnJnBhcnQ9Y29udGVudERldGFpbHMnOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jZmcudHlwZSA9PSAic2VhcmNoIiAmJiB0aGlzLmNmZy5tZXRhKSB7DQogICAgICAgICAgICAgICAgICAgIHVybCArPSAnJnBhcnQ9aWQnOyAvL25vdGUgcGFydD1pZCBkb2VzbnQgd29yayBmb3IgcGxheWxpc3QuIGdldCBsaXN0IC92aWRlb3Mgd2l0aCBtZXRhZGF0YQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jZmcudHlwZSA9PSAic2VhcmNoIikgew0KICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJyZwYXJ0PXNuaXBwZXQnOyAvL29ubHkgdGhpbmcgaXQgcmV0dXJucw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jZmcudHlwZSA9PSAidmlkZW9zIikgew0KICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJyZwYXJ0PXNuaXBwZXQsY29udGVudERldGFpbHMsc3RhdGlzdGljcyc7IC8vYWxsIGRldGFpbHMNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJyZwYXJ0PXNuaXBwZXQsY29udGVudERldGFpbHMnOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmICh0aGlzLmNmZy50eXBlID09ICJ1c2VyInx8dGhpcy5jZmcudHlwZSA9PSAiY2hhbm5lbCIpIHsNCiAgICAgICAgICAgICAgICAgICAgdXJsICs9ICcmbWF4UmVzdWx0cz0xJzsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY2ZnLnJlc3VsdHMpIHsNCiAgICAgICAgICAgICAgICAgICAgdXJsICs9ICcmbWF4UmVzdWx0cz0nICsgdGhpcy5jZmcucmVzdWx0czsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jZmcucGFnZVRva2VuKSB7DQogICAgICAgICAgICAgICAgICAgIHVybCArPSAnJnBhZ2VUb2tlbj0nICsgdGhpcy5jZmcucGFnZVRva2VuOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIHVybCArPSAnJmtleT0nICsgdGhpcy5jZmcua2V5Ow0KICAgICAgICAgICAgICAgIHVybCArPSAnJnByZXR0eVByaW50PWZhbHNlJzsNCg0KICAgICAgICAgICAgICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoJ3NyYycsIHVybCk7DQoNCg0KICAgICAgICAgICAgICAgIGNmZy5tQyA9IHRoaXMueXRRdWVyeTsNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jZmcudHlwZSA9PSAidXNlciJ8fHRoaXMuY2ZnLnR5cGUgPT0gImNoYW5uZWwiKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tbdGhpcy55dFF1ZXJ5XSA9IGZ1bmN0aW9uKGpzb24pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vZ2V0IHRoZSBmaXJzdCByZXN1bHQgZm9yIHVzZXJuYW1lLCBhbmQgY3JlYXRlIGEgY2hhbm5lbElkIHJlcXVlc3QNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqc29uLnBhZ2VJbmZvLnRvdGFsUmVzdWx0cyA9PSAxKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBsYXlsaXN0SWQgPSBqc29uLml0ZW1zWzBdLmNvbnRlbnREZXRhaWxzLnJlbGF0ZWRQbGF5bGlzdHMudXBsb2FkczsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmcudHlwZSA9ICdwbGF5bGlzdCc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnLnEgPSBwbGF5bGlzdElkOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl0RW1iZWQuaW5pdChjZmcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dEVtYmVkLm1lc3NhZ2UoJ0NhblwndCBmaW5kIHRoaXMgdXNlciBkZWZpbmVkIGluIHEnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMuY2ZnLnR5cGUgPT0gInBsYXlsaXN0IiB8fCB0aGlzLmNmZy50eXBlID09ICJzZWFyY2giKSAmJiB0aGlzLmNmZy5tZXRhKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tbdGhpcy55dFF1ZXJ5XSA9IGZ1bmN0aW9uKGpzb24pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vZ2V0IG1ldGEgZGF0YSBvZiBwbGF5bGlzdCB2aWRlb3MNCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAvL2dyYWIgSURzIG9mIHBsYXlsaXN0LiAvcGxheWxpc3QgbmVlZHMgZXh0cmFjdCBpZCBmcm9tIHNuaXBwZXQsIGVsc2UgZGVmYXVsdCBvbiBpZA0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24uaXRlbXMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaWRzID0gJyc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBqc29uLml0ZW1zLmxlbmd0aDsgaSsrKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24uaXRlbXNbaV0uc25pcHBldCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRzICs9IGpzb24uaXRlbXNbaV0uc25pcHBldC5yZXNvdXJjZUlkLnZpZGVvSWQgKyAiLCI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoanNvbi5pdGVtc1tpXS5pZCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRzICs9IGpzb24uaXRlbXNbaV0uaWQudmlkZW9JZCArICIsIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXF1ZXN0IHZpZGVvIGRldGFpbHMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmcudHlwZSA9ICd2aWRlb3MnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZy5xID0gaWRzOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl0RW1iZWQuaW5pdChjZmcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dEVtYmVkLm1lc3NhZ2UoJ0FuIGVycm9yIG9jY3VyZWQ6PGJyPicgKyBqc29uLmVycm9yLm1lc3NhZ2UpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFja1t0aGlzLnl0UXVlcnldID0gZnVuY3Rpb24oanNvbikgew0KICAgICAgICAgICAgICAgICAgICAgICAgeXRFbWJlZC5saXN0VmlkZW9zKGpzb24sIGNmZyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQoNCg0KICAgICAgICAgICAgICAgIC8vYXR0YWNoIHNjcmlwdCB0byBwYWdlLCB0aGlzIHdpbGwgbG9hZCB0aGUgZGF0YSBpbnRvIG91ciBwYWdlIGFuZCBjYWxsIHRoZSBmdW50aW9uIHl0SW5pdFt5dFF1ZXJ5XQ0KICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0uYXBwZW5kQ2hpbGQoc2NyaXB0KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgfSwNCg0KDQogICAgLyoqDQogICAgICogQnVpbGQgdmlkZW9zIChzdGF0aWMpDQogICAgICovDQogICAgbGlzdFZpZGVvczogZnVuY3Rpb24oanNvbiwgY2ZnKSB7DQogICAgICAgIHRoaXMuY2ZnID0gY2ZnOw0KICAgICAgICBpZiAoIXRoaXMuY2ZnLnBsYXllcikgew0KICAgICAgICAgICAgdGhpcy5jZmcucGxheWVyID0gJ2VtYmVkJzsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoIXRoaXMuY2ZnLmxheW91dCkgew0KICAgICAgICAgICAgdGhpcy5jZmcubGF5b3V0ID0gJ2Z1bGwnOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuY2ZnLmJsb2NrKTsNCg0KICAgICAgICB2YXIgY2hpbGRyZW4gPSBkaXYuY2hpbGROb2RlczsNCiAgICAgICAgZm9yICh2YXIgaSA9IGNoaWxkcmVuLmxlbmd0aDsgaSA+IC0xOyBpLS0pIHsNCiAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXSAmJiAoY2hpbGRyZW5baV0uY2xhc3NOYW1lLmluZGV4T2YoImVycm9yIikgIT09IC0xIHx8IGNoaWxkcmVuW2ldLnRhZ05hbWUgPT09ICJVTCIpKSB7IC8qIGlzIGVycm9yIG1lc3NhZ2Ugb3IgcmVzdWx0IGxpc3QgKi8NCiAgICAgICAgICAgICAgICBkaXYucmVtb3ZlQ2hpbGQoY2hpbGRyZW5baV0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCg0KICAgICAgICAvL2Rpdi5pbm5lckhUTUwgPSAnJzsgLy9jbGVhciB1bA0KICAgICAgICBpZiAoanNvbi5lcnJvcikgew0KICAgICAgICAgICAgdGhpcy5tZXNzYWdlKCdBbiBlcnJvciBvY2N1cmVkOjxicj4nICsganNvbi5lcnJvci5tZXNzYWdlKTsNCiAgICAgICAgfSBlbHNlIGlmIChqc29uLml0ZW1zKSB7DQogICAgICAgICAgICB2YXIgdWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpOw0KICAgICAgICAgICAgdWwuY2xhc3NOYW1lID0gJ3l0bGlzdCc7DQoNCiAgICAgICAgICAgIHZhciBwbGF5bGlzdCA9ICIiOw0KDQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGpzb24uaXRlbXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSBqc29uLml0ZW1zW2ldOw0KDQogICAgICAgICAgICAgICAgLy9wbGF5bGlzdCBuZWVkIHRoaXMNCg0KICAgICAgICAgICAgICAgIGlmIChlbnRyeS5zbmlwcGV0ICYmIGVudHJ5LnNuaXBwZXQucmVzb3VyY2VJZCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSBlbnRyeS5zbmlwcGV0LnJlc291cmNlSWQudmlkZW9JZDsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVudHJ5LmlkLnZpZGVvSWQpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gZW50cnkuaWQudmlkZW9JZDsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSBlbnRyeS5pZDsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAoaWQpIHsNCiAgICAgICAgICAgICAgICAgICAgcGxheWxpc3QgKz0gaWQgKyAiLCI7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgdmFyIGxpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTsNCg0KICAgICAgICAgICAgICAgIC8vYSBsaW5rIHRvIG91ciBqYXZhc2NyaXB0IG92ZXJsYXkgZnVuY3Rpb24NCiAgICAgICAgICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCiAgICAgICAgICAgICAgICBhLmNsYXNzTmFtZSA9ICdjbGlwJzsNCg0KICAgICAgICAgICAgICAgIGlmICh0aGlzLmNmZy5wbGF5ZXIgPT0gJ2VtYmVkJykgew0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jZmcucGFyZW50KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAvL2Euc2V0QXR0cmlidXRlKCdocmVmJywnIycrdGhpcy5jZmcucGFyZW50KydQbGF5ZXInKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vYS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCcjJyt0aGlzLmNmZy5ibG9jaysnUGxheWVyJyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgYS5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYgKGEuYWRkRXZlbnRMaXN0ZW5lcikgew0KICAgICAgICAgICAgICAgICAgICAgICAgYS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMucGxheVZpZGVvLmJpbmQodGhpcywgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6IGlkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjZmcnOiBjZmcNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBmYWxzZSk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYS5hdHRhY2hFdmVudCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgYS5hdHRhY2hFdmVudCgnb25jbGljaycsIHRoaXMucGxheVZpZGVvLmJpbmQodGhpcywgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6IGlkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjZmcnOiBjZmcNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGEuc2V0QXR0cmlidXRlKCdocmVmJywgJ2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9JyArIGlkKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCiAgICAgICAgICAgICAgICBhLmFwcGVuZENoaWxkKHNwYW4pOw0KICAgICAgICAgICAgICAgIHZhciBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCiAgICAgICAgICAgICAgICBpbWcuc2V0QXR0cmlidXRlKCdzcmMnLCAoZW50cnkuc25pcHBldC50aHVtYm5haWxzID8gZW50cnkuc25pcHBldC50aHVtYm5haWxzLm1lZGl1bS51cmwgOiAnJykpOw0KICAgICAgICAgICAgICAgIHNwYW4uYXBwZW5kQ2hpbGQoaW1nKTsNCiAgICAgICAgICAgICAgICB2YXIgZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdlbScpOw0KICAgICAgICAgICAgICAgIHNwYW4uYXBwZW5kQ2hpbGQoZW0pOw0KDQogICAgICAgICAgICAgICAgLy91cGxvYWRlZA0KICAgICAgICAgICAgICAgIGlmICh0aGlzLmNmZy5sYXlvdXQgPT0gJ3RodW1ibmFpbHMnKSB7DQogICAgICAgICAgICAgICAgICAgIGxpLmNsYXNzTmFtZSA9ICdzbWFsbCc7DQogICAgICAgICAgICAgICAgICAgIGxpLmFwcGVuZENoaWxkKGEpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIC8vdGhpcy5jZmcubGF5b3V0ID0gZnVsbA0KICAgICAgICAgICAgICAgICAgICBsaS5pbm5lckhUTUwgPSAnPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgYm9yZGVyPSIwIj48dHI+PHRkIHZhbGlnbj0idG9wIiByb3dzcGFuPSIyIj48L3RkPjx0ZCB2YWxpZ249InRvcCI+PGgzPicgKyBlbnRyeS5zbmlwcGV0LnRpdGxlICsgJzwvaDM+PHNwYW4+JyArIHRoaXMuZm9ybWF0RGVzY3JpcHRpb24oZW50cnkuc25pcHBldC5kZXNjcmlwdGlvbikgKyAnPC9zcGFuPjwvdGQ+PHRkIHZhbGlnbj0idG9wIiBzdHlsZT0id2lkdGg6IDE1MHB4IiBjbGFzcz0ibWV0YSI+PGRpdj4nICsgKGVudHJ5LmNvbnRlbnREZXRhaWxzID8gJ0R1cmF0aW9uOiAnICsgeXRFbWJlZC5mb3JtYXREdXJhdGlvbihlbnRyeS5jb250ZW50RGV0YWlscy5kdXJhdGlvbikgKyAnPGJyPicgOiAnJykgKyAoZW50cnkuc3RhdGlzdGljcyA/ICdWaWV3czogJyArIGVudHJ5LnN0YXRpc3RpY3Mudmlld0NvdW50ICsgJzxicj4nIDogJycpICsgJ0Zyb206IDxhIGhyZWY9Imh0dHA6Ly93d3cueW91dHViZS5jb20vcHJvZmlsZT91c2VyPScgKyBlbnRyeS5zbmlwcGV0LmNoYW5uZWxUaXRsZSArICciPicgKyBlbnRyeS5zbmlwcGV0LmNoYW5uZWxUaXRsZSArICc8L2E+PC9kaXY+PC90ZD48L3RyPjwvdGFibGU+JzsNCiAgICAgICAgICAgICAgICAgICAgbGkuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5hcHBlbmRDaGlsZChhKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdWwuYXBwZW5kQ2hpbGQobGkpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvL2ZvciBmaXhlZCB0byBib3R0b20gdmlkZW9zDQogICAgICAgICAgICBpZiAodGhpcy5jZmcucG9zaXRpb24gPT0gImZpeGVkX2JvdHRvbSIpIHsNCiAgICAgICAgICAgICAgICBkaXYuc3R5bGUucG9zaXRpb24gPSAiZml4ZWQiOw0KICAgICAgICAgICAgICAgIGRpdi5zdHlsZS5ib3R0b20gPSAnMHB4JzsNCiAgICAgICAgICAgICAgICBkaXYuc3R5bGUubGVmdCA9ICcwcHgnOw0KICAgICAgICAgICAgICAgIC8vZG9jdW1lbnQgYm90dG9tIGFkZCBYIChoZWlnaHQpIHBpeGVscyBtYXJnaW4NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZCh1bCk7DQoNCiAgICAgICAgICAgIC8vcGxheWxpc3QNCiAgICAgICAgICAgIGlmICh0aGlzLmNmZy5wbGF5bGlzdCA9PSB0cnVlKSB7DQogICAgICAgICAgICAgICAgdGhpcy5jZmcucGxheWVyVmFycy5wbGF5bGlzdCA9IHBsYXlsaXN0LnN1YnN0cigwLCBwbGF5bGlzdC5sZW5ndGggLSAxKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHRoaXMuY2ZnLnBsYXllciA9PSAiZW1iZWQiICYmIHRoaXMuY2ZnLmRpc3BsYXlfZmlyc3QgPT0gdHJ1ZSkgew0KICAgICAgICAgICAgICAgIC8vc2V0IHNldHRpbmdzDQoNCiAgICAgICAgICAgICAgICB5dFBsYXllclBhcmFtcy52aWRlb0lkID0gaWQ7DQoNCg0KICAgICAgICAgICAgICAgIC8vb3RoZXIgc2V0dGluZ3MNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jZmcucGxheWVyVmFycykgew0KICAgICAgICAgICAgICAgICAgICB5dFBsYXllclBhcmFtcy5wbGF5ZXJWYXJzID0gdGhpcy5jZmcucGxheWVyVmFyczsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB0aGlzLnBsYXllciA9IHRoaXMuY3JlYXRlUGxheWVyKHRoaXMuY2ZnKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHRoaXMuY2ZnLnBhZ2luZyA9PSB0cnVlICYmIGpzb24ubmV4dFBhZ2VUb2tlbikgew0KICAgICAgICAgICAgICAgIHRoaXMuY2ZnLmRpc3BsYXlfZmlyc3QgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICB2YXIgcHVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndWwnKTsNCiAgICAgICAgICAgICAgICBwdWwuc2V0QXR0cmlidXRlKCdpZCcsICd5dFBhZ2UnKTsNCiAgICAgICAgICAgICAgICBpZiAoanNvbi5uZXh0UGFnZVRva2VuKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBsaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQogICAgICAgICAgICAgICAgICAgIGEuY2xhc3NOYW1lID0gJ3l0TmV4dCc7DQogICAgICAgICAgICAgICAgICAgIGEuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInOw0KDQogICAgICAgICAgICAgICAgICAgIGxpLmFwcGVuZENoaWxkKGEpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoYS5hZGRFdmVudExpc3RlbmVyKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBhLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgeXRFbWJlZC5sb2FkTmV4dC5iaW5kKHRoaXMsIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmc6IGNmZywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbjoganNvbi5uZXh0UGFnZVRva2VuDQogICAgICAgICAgICAgICAgICAgICAgICB9KSwgZmFsc2UpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGEuaW5uZXJIVE1MID0gJ0xvYWQgbmV4dC4uLic7DQogICAgICAgICAgICAgICAgICAgIGxpLmFwcGVuZENoaWxkKGEpOyAvL2RvIHRocm91Z2ggYmluZA0KICAgICAgICAgICAgICAgICAgICBwdWwuYXBwZW5kQ2hpbGQobGkpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmIChqc29uLnByZXZQYWdlVG9rZW4pIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGxpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTsNCg0KICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCiAgICAgICAgICAgICAgICAgICAgYS5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ3l0UHJldicpOw0KICAgICAgICAgICAgICAgICAgICBhLnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJzsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAoYS5hZGRFdmVudExpc3RlbmVyKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBhLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgeXRFbWJlZC5sb2FkUHJldmlvdXMuYmluZCh0aGlzLCB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnOiBjZmcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW46IGpzb24ucHJldlBhZ2VUb2tlbg0KICAgICAgICAgICAgICAgICAgICAgICAgfSksIGZhbHNlKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBhLmlubmVySFRNTCA9ICdMb2FkIHByZXZpb3VzLi4uJzsNCiAgICAgICAgICAgICAgICAgICAgbGkuYXBwZW5kQ2hpbGQoYSk7DQogICAgICAgICAgICAgICAgICAgIHB1bC5hcHBlbmRDaGlsZChsaSk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKHB1bCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHRoaXMubWVzc2FnZSgnTm8gWW91VHViZSB2aWRlb3MgZm91bmQgZm9yIHlvdXIgcXVlcnk6PGJyPlR5cGU6XCcnICsgdGhpcy5jZmcudHlwZSArICdcJzxicj5RdWVyeTogXCcnICsgdGhpcy5jZmcucSArICdcJycpOw0KICAgICAgICB9DQogICAgfSwNCiAgICAvKioNCiAgICAgKiBDcmVhdGUgdGhlIGlubGluZSBwbGF5ZXIgc3VwcG9ydGluZyBodG1sNSBhbmQgZmxhc2ggdGhyb3VnaCBpZnJhbWUNCiAgICAgKi8NCiAgICBjcmVhdGVQbGF5ZXI6IGZ1bmN0aW9uKGNmZykgew0KICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY2ZnLmJsb2NrKTsNCg0KICAgICAgICB2YXIgaG9sZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOw0KICAgICAgICBob2xkLmNsYXNzTmFtZSA9ICd5dFBsYXllcic7DQoNCiAgICAgICAgdmFyIGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpOw0KICAgICAgICBpZnJhbWUuc2V0QXR0cmlidXRlKCdpZCcsIGNmZy5ibG9jayArICdQbGF5ZXInKTsNCiAgICAgICAgaWZyYW1lLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBjZmcud2lkdGgpOw0KICAgICAgICBpZnJhbWUuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBjZmcuaGVpZ2h0KTsNCiAgICAgICAgaWZyYW1lLnNldEF0dHJpYnV0ZSgnZnJhbWVCb3JkZXInLCAnMCcpOw0KICAgICAgICBpZnJhbWUuc2V0QXR0cmlidXRlKCdzcmMnLCAnaHR0cDovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC8nICsgeXRQbGF5ZXJQYXJhbXMudmlkZW9JZCArICc/YXV0b3BsYXk9JyArIHl0UGxheWVyUGFyYW1zLmF1dG9wbGF5ICsgJyZtb2Rlc3RicmFuZGluZz0xJyk7IC8vY29udHJvbGJhciBzZXQNCg0KICAgICAgICBob2xkLmFwcGVuZENoaWxkKGlmcmFtZSk7DQogICAgICAgIGRpdi5pbnNlcnRCZWZvcmUoaG9sZCwgZGl2LmZpcnN0Q2hpbGQpOw0KDQogICAgICAgIHJldHVybiBpZnJhbWU7DQogICAgfSwNCiAgICAvKioNCiAgICAgKiBGb3JtYXQgcmF0aW5nIChyYXRpbmcvcmF0aW5nQ291bnQpDQogICAgICovDQogICAgZm9ybWF0UmF0aW5nOiBmdW5jdGlvbihydCwgcmMpIHsNCg0KICAgIH0sDQoNCiAgICAvKioNCiAgICAgKiBGb3JtYXQgZHVyYXRpb24gKHNlYyB0byBtaW4pIHVzaW5nIHZpZGVvcyNjb250ZW50RGV0YWlscy5kdXJhdGlvbg0KICAgICAqLw0KICAgIGZvcm1hdER1cmF0aW9uOiBmdW5jdGlvbihkcikgew0KICAgICAgICByZXR1cm4gZHIucmVwbGFjZSgvKE18SCkvZywgJzonKS5yZXBsYWNlKCJTIiwgIiIpLnN1YnN0cigyKTsNCiAgICB9LA0KDQogICAgLyoqDQogICAgICogRm9ybWF0IGRlc2NyaXB0aW9uIChkZXNjcmlwdGlvbiB0byBzbmlwcGV0KSAocmVhZCBtb3JlIGV4cGFuZCkNCiAgICAgKi8NCiAgICBmb3JtYXREZXNjcmlwdGlvbjogZnVuY3Rpb24oZHMpIHsNCiAgICAgICAgaWYgKGRzKSB7DQogICAgICAgICAgICBpZiAoZHMubGVuZ3RoID4gMjU1KSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGRzLnN1YnN0cigwLCAyNTIpICsgJy4uLic7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiBkczsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJldHVybiAiTm8gZGVzY3JpcHRpb24gYXZhaWxhYmxlLiI7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgLyoqDQogICAgICogRm9ybWF0IGRhdGUgKDIwMDktMDgtMTBUMDk6MDQ6MjAuMDAwWiB0byB0aW1lKQ0KICAgICAqLw0KICAgIGZvcm1hdERhdGU6IGZ1bmN0aW9uKGR0KSB7DQogICAgICAgIGlmIChkdCkgew0KICAgICAgICAgICAgcmV0dXJuIGR0LnN1YnN0cigwLCAxMCkNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJldHVybiAidW5rbm93biI7DQogICAgICAgIH0NCiAgICB9LA0KICAgIC8qKg0KICAgICAqIERlcHJlY2lhdGVkDQogICAgICovDQogICAgbW91c092ZXJJbWFnZTogZnVuY3Rpb24oYSwgYiwgYykgew0KDQogICAgfSwNCiAgICAvKioNCiAgICAgKiBEZXByZWNpYXRlZA0KICAgICAqLw0KICAgIG1vdXNlT3V0SW1hZ2U6IGZ1bmN0aW9uKGEsIGIpIHsNCg0KICAgIH0sDQogICAgLyoqDQogICAgICogTG9hZCBuZXh0IChwYWdlKQ0KICAgICAqLw0KICAgIGxvYWROZXh0OiBmdW5jdGlvbihkYXRhKSB7DQogICAgICAgIGRhdGEuY2ZnLnBhZ2VUb2tlbiA9IGRhdGEudG9rZW47DQogICAgICAgIHl0RW1iZWQuaW5pdChkYXRhLmNmZyk7DQogICAgfSwNCiAgICAvKioNCiAgICAgKiBMb2FkIHByZXZpb3VzIChwYWdlKQ0KICAgICAqLw0KICAgIGxvYWRQcmV2aW91czogZnVuY3Rpb24oZGF0YSkgew0KICAgICAgICBkYXRhLmNmZy5wYWdlVG9rZW4gPSBkYXRhLnRva2VuOw0KICAgICAgICB5dEVtYmVkLmluaXQoZGF0YS5jZmcpOw0KICAgIH0sDQogICAgLyoqDQogICAgICogU29ydGluZyBieSBjb21tdG5zLCB2aWV3cywgZGF0ZQ0KICAgICAqLw0KICAgIHNvcnRMaXN0OiBmdW5jdGlvbihqc29uKSB7DQoNCiAgICB9LA0KDQogICAgLyoqDQogICAgICogUGxheSB2aWRlbyAoc3RhdGljKQ0KICAgICAqLw0KICAgIHBsYXlWaWRlbzogZnVuY3Rpb24oZGF0YSkgew0KICAgICAgICBjb25zb2xlLmxvZyhkYXRhKTsNCiAgICAgICAgaWYgKGRhdGEuY2ZnLnBhcmVudCkgew0KICAgICAgICAgICAgdmFyIHBsYXllciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRhdGEuY2ZnLnBhcmVudCArICJQbGF5ZXIiKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHZhciBwbGF5ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkYXRhLmNmZy5ibG9jayArICJQbGF5ZXIiKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICghcGxheWVyKSB7DQogICAgICAgICAgICB5dFBsYXllclBhcmFtcy52aWRlb0lkID0gZGF0YS5pZDsNCiAgICAgICAgICAgIHl0UGxheWVyUGFyYW1zLmF1dG9wbGF5ID0gMTsNCg0KICAgICAgICAgICAgdGhpcy5jcmVhdGVQbGF5ZXIoZGF0YS5jZmcpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcGxheWVyLnNldEF0dHJpYnV0ZSgnc3JjJywgJ2h0dHA6Ly93d3cueW91dHViZS5jb20vZW1iZWQvJyArIGRhdGEuaWQgKyAnP2F1dG9wbGF5PTEmbW9kZXN0YnJhbmRpbmc9MSZvcmlnaW49JyArIGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArIGRvY3VtZW50LmxvY2F0aW9uLmhvc3RuYW1lKTsNCiAgICAgICAgfQ0KICAgIH0sDQogICAgLyoqDQogICAgICogVGVzdA0KICAgICAqLw0KICAgIHRlc3Q6IGZ1bmN0aW9uKGUsIGIpIHsNCiAgICAgICAgY29uc29sZS5sb2coZSk7DQogICAgICAgIGNvbnNvbGUubG9nKGIpOw0KICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmNmZy5ibG9jayk7DQogICAgfSwNCg0KICAgIC8qKg0KICAgICAqIG9uUGxheWVyUmVhZHkgdmlkZW8NCiAgICAgKi8NCiAgICBvblBsYXllclJlYWR5OiBmdW5jdGlvbihpZCkgew0KICAgICAgICAvL3NldCBmbGFnDQogICAgfSwNCg0KICAgIC8qKg0KICAgICAqIG9uUGxheWVyU3RhdGVDaGFuZ2UgdmlkZW8NCiAgICAgKi8NCiAgICBvblBsYXllclN0YXRlQ2hhbmdlOiBmdW5jdGlvbihpZCkgew0KICAgICAgICAvLw0KICAgIH0sDQoNCiAgICAvKioNCiAgICAgKiBNZXNzYWdlcyBsb2cNCiAgICAgKi8NCiAgICBtZXNzYWdlOiBmdW5jdGlvbihtc2cpIHsNCiAgICAgICAgaWYgKCF5dEVtYmVkLmNmZy5ibG9jaykgew0KICAgICAgICAgICAgLy9hdHRhY2ggbWVzc2FnZSB0byBib2R5Pw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoeXRFbWJlZC5jZmcuYmxvY2spLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPSJlcnJvciI+JyArIG1zZyArICc8L2Rpdj4nOw0KICAgICAgICB9DQogICAgfQ0KfTsNCg0KLyoqDQogKiBVc2luZyB0aGUgZW1iZWQgcGxheWVyDQogKi8NCnZhciB5dFBsYXllcjsNCnZhciB5dFBsYXllclBhcmFtcyA9IHsNCiAgICBhdXRvcGxheTogMCwNCiAgICBtb2Rlc3RicmFuZGluZzogMSwNCiAgICBldmVudHM6IHsNCiAgICAgICAgJ29uUmVhZHknOiB5dEVtYmVkLm9uUGxheWVyUmVhZHksDQogICAgICAgICdvblN0YXRlQ2hhbmdlJzogeXRFbWJlZC5vblBsYXllclN0YXRlQ2hhbmdlDQogICAgfQ0KfTsNCg0KLS0+DQo=" ></sc'+ nada +'ript>';
	code += "\n";
	//code += '<di'+ nada +'v id="ytPlayer"></div>\n';
	code += '<di'+ nada +'v id="ytThumbs"></div>';
	code += "\n";
		
	var string = '\'block\':\'ytThumbs\',';

 	string += '\'key\':\'your-youtube-developer-key\',';
	var codeQ = document.getElementById('codeQ').value;
	string += '\'q\':\''+codeQ+'\',';	
	var codeType = document.getElementById('codeType').options[document.getElementById('codeType').selectedIndex].value;
	string += '\'type\':\''+codeType+'\',';
	var codeResults = document.getElementById('codeResults').options[document.getElementById('codeResults').selectedIndex].value;
	string += '\'results\':'+codeResults+',';
	//var codeOrder = document.getElementById('codeOrder').options[document.getElementById('codeOrder').selectedIndex].value;
	//string += '\'order\':\''+codeOrder+'\',';
	var codeMeta = document.getElementById('codeMeta').options[document.getElementById('codeMeta').selectedIndex].value;
	string += '\'meta\':'+codeMeta+',';
	var codePlayer = document.getElementById('codePlayer').options[document.getElementById('codePlayer').selectedIndex].value;
	string += '\'player\':\''+codePlayer+'\',';
	var codeLayout = document.getElementById('codeLayout').options[document.getElementById('codeLayout').selectedIndex].value;
	string += '\'layout\':\''+codeLayout+'\'';
	code += "\n";
	code += '<sc'+ nada+'ript>';
	code += "\n";
	code += '	ytEmbed'+nada +'.init({'+string+'});';
	code += "\n";
	code += '</sc'+nada +'ript>';
	
	document.getElementById('codeResult').value = code;
	
	var execute = {'q': codeQ, 'type': codeType, 'results': codeResults, 'block': 'youtubeDivResults', 'meta': codeMeta, 'player': codePlayer, 'layout': codeLayout};
	ytEmbed.init(execute);
}
//-->
</script>
<style>
/* needed for the thumbs to show correctly */
.ytPlayer{
	margin: auto;
	text-align: center;
}
.ytlist {
	list-style: none outside none;
	margin: 0;
	padding: 0;
}

/* float fix */
.ytlist:after {
	content:".";
	display:block;
	height:0;
	clear:both;
	visibility:hidden
}

.ytlist li{
	display: inline;
	float: left;
	margin: 5px; /* some space */
}

.ytlist table {
	width: 100%;
}

.ytlist td{
	padding: 5px; /* some space */
	vertical-align: top;
}

.ytlist h3{
	margin: 0;
	line-height: 1.55em;
}


.ytlist a {
	padding:0px;
}
/* hd */
.clip span {
	position: relative;
	width: 288px;
	overflow: hidden;
}
.clip img{
	width: 288px;
	display: block;

}

/* thumbs */
.small .clip span {
	position: relative;
	width: 100px;
	overflow: hidden;
}
.small .clip img{
	width: 100px;
	display: block;

}

/* for paging UL */
#ytPage{
	list-style: none inside;
	margin: 0;
	padding: 0;
	height: 20px;
}

#ytPage .ytNext{
	float: right; /* aligns to the right of ul */
}

#ytPage .ytPrev{
	display: inline-block; /* blocks keeps our ul height */
}

/* generator css */
input,select,textarea{
	padding: 3px;
	font-size: 1.1em;	
}
		</style>
	</head>


<body>
<div id="blog">

<!--
<h1>Youtube Simple Embed - Youtube for any page</h1>
<p>Easily embed YouTube functionality on your site by integrating a search query, playlist or your account's videos. Integrate the video player. Page through the results. All  simple as plug and play. Interested? Read on and check out the examples below.</p>
<p>Best is to try out the generator and check out the results.</p>
<h1>Generator</h1>
<p>This generator will help you create the full code needed to get this all working. You can copy &amp; paste this into your website, optimize to your layout (css) and you're done.</p>
<p><strong>Update '15:</strong> YouTube changed the API again significantly. They force us now to use the new slower, and more difficult data API. Worst of all, you now need a YouTube API key: <a href="https://developers.google.com/youtube/registering_an_application">get your own stupid key</a>. It works for YouTube API v3, but I won't longer actively support this code.</p>
-->



<form onsubmit="updateField(); return false;">
<p>Action:
	<select id="codeType">
		<option value="search">Search</option>
		<option value="playlist">Playlist</option>
		<option value="user">User</option>
		<option value="channel">Channel</option>
		</select>

  Query:
  <input id="codeQ" type="text" value="">

  Results:
	<select id="codeResults">
		<option value="1">1</option>
		<option value="2">2</option>
		<option value="3">3</option>
		<option value="4">4</option>
		<option value="5" selected="selected">5</option>
		<option value="10">10</option>
		<option value="20">20</option>
		<option value="50">50</option>
		</select>

<!--
   Order:
   <select id="codeOrder">
     <option value="new_first">newly published</option>
     <option value="highest_rating" >highest rated</option>
     <option value="most_relevance" selected="selected">most relevant</option>
    </select>-->
   Views & duration:
   <select id="codeMeta">
     <option value="true">Display</option>
     <option value="false" >No (faster)</option>
    </select>
   <br>
   Player:
   <select id="codePlayer">
     <option value="embed">embed into site</option>
     <option value="link">link to youtube</option>
    </select>
   Results:
   <select id="codeLayout">
     <option value="thumbnails">thumbnails</option>
     <option value="full" selected="selected">full format</option>
    </select>


	<input type="submit" value="Get Code"><br>
		<textarea style="width: 100%" rows="8" id="codeResult"></textarea><br>
		</form>


<div id="youtubeDivResults"></div>
<hr>
<p>The installation is very simple, provides super fast results, and has a wide set of features. Lets continue with some examples:</p>
<h3>All YouTube videos about: "music video"</h3>
<div id="youtubeDiv"></div>
	<script>
		ytEmbed.init({'block':'youtubeDiv','type':'search','q':'music video','results': 3});
		</script>


<textarea cols="70" rows="3">&lt;div id="youtubeDiv">&lt;/div>
&lt;script>ytEmbed.init({'block':'youtubeDiv','type':'search','q':'music video','results': 3});&lt;/script></textarea>
<hr>
<h3>A YouTube playlist: Music Videos by VEVO </h3>
<div id="youtubeDivPlaylist"></div>
<script>ytEmbed.init({'block':'youtubeDivPlaylist','type':'playlist','q':'LL2pmfLm7iq6Ov1UwYrWYkZA','results': 3, 'meta':true});</script>
<textarea cols="70" rows="4">&lt;div id="youtubeDivPlaylist">&lt;/div>
&lt;script>ytEmbed.init({'block':'youtubeDivPlaylist','type':'playlist','q':'LL2pmfLm7iq6Ov1UwYrWYkZA','results': 3, 'meta':true});&lt;/script></textarea>


<hr>
<h3>YouTube User videos: yvo</h3>
<div id="youtubeDivUser"></div>
<script>
	ytEmbed.init({'block':'youtubeDivUser','type':'user','q':'yvo','results': 6,'layout':'thumbnails','player':'embed','height':250,'width':300,'display_first':true});
	</script>
<textarea cols="70" rows="4">&lt;div id="youtubeDivUser">&lt;/div>
&lt;script>ytEmbed.init({'block':'youtubeDivUser','type':'user','q':'yvo','results': 6,'layout':'thumbnails','player':'embed','height':250,'width':300,'display_first':true});&lt;/script></textarea>

<hr color=red>
<hr color=white>
<hr color=blue>

<h3>A simple inline YouTube video search</h3>
<form onsubmit="ytEmbed.init({'block':'youtubeDivSearch','type':'search','q':document.getElementById('ytSearchField').value,'results': 5,'meta':true}); return false;">
  <input  type="text" id="ytSearchField">
  <input type="submit" value="  Search  ">
</form>
<div id="youtubeDivSearch"></div>
<textarea cols="70" rows="5">&lt;form onsubmit="ytEmbed.init({'block':'youtubeDivSearch','type':'search','q':document.getElementById('ytSearchField').value,'results': 5,'meta':true}); return false;">
  &lt;input type="text" id="ytSearchField">  &lt;input type="submit" value="  Search   ">
&lt;/form>
&lt;div id="youtubeDivSearch">&lt;/div></textarea>

<hr color=blue>
<hr color=white>
<hr color=red>

<h1>Installation</h1>
<!--
<p>To install the YouTube video thumbnail results you can use the <a href="#top">generator</a> or follow the instruction below.</p>
<p>First: download this <a href="/ytpage/ytembed.js">javascript</a> file (4kb), and upload it to your server. On the page that you want the YouTube  video thumbnail results to appear include this line in your documen<em>t</em>:</p>
<p><strong>&lt;script src='/ytembed.js'&gt;&lt;/script&gt;</strong></p>
<p>Up next is finding a nice spot where you want to have the YouTube  video thumbnails. Insert there this html code that creates a block with the ID youtubeDiv (must be unique).</p>
<p><strong>&lt;div id=&quot;youtubeDiv&quot;&gt;&lt;/div&gt;</strong></p>
<p>Directly below the code provide the configuration of the YouTube  video thumbnails you want to show. An example:</p>
<p><strong>&lt;script&gt;ytEmbed.init({'block':'youtubeDiv','type':'search','q':'baby laughing','results':'4','meta':'true'});&lt;/script&gt;</strong></p>
<p>The detailed explanation is below, but this code will do a YouTube video search on the newest videos uploaded on &quot;baby laughing&quot; and have 4 thumbnails returned that link to the YouTube video player.</p>
<p>And now comes the part to configure the script to your liking. You must tell the script what kind of videos you want to display on your page, this is done by providing several settings. You can do this by hand as explained below, or with our <a href="#top">generator</a>. The  settings that are available:</p>
<ul>
  <li><strong>key</strong> - obligated YouTube developer API key.</li>
  <li><strong>block</strong> - obligated ID of the html element (&lt;div id='this_is_the_block_id'&gt;) where you want the results thumbnails to appear.</li>
  <li><strong>type</strong> - obligated setting that provides the function you want to execute:
    <ul>
      <li><em><strong>search</strong></em> - YouTube searches for a video with the string set by 'q'.</li>
      <li><em><strong>playlist</strong></em> - results of a YouTube playlist set by playlist id in 'q'.</li>
      <li><em><strong>user</strong></em> - results of a YouTube user videos set by user name in 'q'.</li>
    </ul>
  </li>
  <li><strong>q</strong> - obligated string to identify your results, see '<strong>type</strong>' above.</li>
  <li><strong>results</strong> - the number of results you want to show.</li>
  <li><strong>meta</strong> - set to true to display duration and views.</li>
	-->

<!--
  <li><strong>order</strong> - what comes first:
    <ul>
        <li><strong>new_first</strong> - newest videos published on top</li>
      <li><strong>highest_rating</strong> - highest rated videos on top</li>
      <li><strong>most_relevance</strong> - most relevant videos on top</li>
    </ul>
  </li>
-->
  <li><strong>player</strong> - decide if you want to play the video on youtube.com or embed on your page:
    <ul>
      <li><em><strong>embed</strong></em> - plays the video on your page.</li>
      <li><em><strong>link</strong></em> - plays the video on youtube.com</li>
    </ul>
  </li>
  <li><strong>display_first</strong> - display the player and queu first video results (needs <strong>player</strong> set to <strong><em>embed</em></strong>)
    <ul>
      <li><strong><em>true</em></strong></li>
    </ul>
  </li>
  <li><strong>width</strong>: embed player width</li>
  <li><strong>height</strong>: embed player height</li>
  <li><strong>layout</strong> - how do you want the results to appear:
    <ul>
      <li><em><strong>thumbnails</strong></em> - only a list of thumbnails as result.</li>
      <li><em><strong>full</strong></em> - list of results with thumbnail, description, rating and user  </li>
      </ul>
  </li>
  </ul>
<p>You use these settings by placing them in this template style 'what':'value'. Separated by a comma. This is then placed within this function ytEmbed.init({'what':'value','what2':'value2'}); surrounded by &lt;script&gt; tags, again an example below:</p>
<p><strong>&lt;script&gt;<br>
  ytEmbed.init({'block':'youtubeDiv','type':'search','q':'baby laughing'});<br>
  &lt;/script&gt;</strong></p>
<p>This piece of script is added below your &lt;div id=&quot;youtubeDiv&gt;&lt;/div&gt;.</p>

</div>
<hr color=red>
<hr color=white>
<hr color=blue>
<a href=www.yvoschaap.com target=_blank>yvoschaap.com</a>



HTML_YT;
	return( $html_yt );
	} 


function html_zm() {
	$html_zm=<<<HTML_ZM

		<script id="script_zmviewer" src="data:/text/plain;base64,KGZ1bmN0aW9uKCl7dmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30uY2FsbCgpO2EuWj17fX0pKCksWi5zaG93SW1hZ2U9ZnVuY3Rpb24oYSxiLGMpe1ouVXRpbHMuejEyOCgpLFouVXRpbHMuejEyNygpLFouVXRpbHMuejEyNigpLFouVXRpbHMuejE2MygpLFoucGFnZUNvbnRhaW5lcklEPWEsWi5pbWFnZVBhdGg9Wi5VdGlscy56MjQzKGIpLFoucGFyYW1ldGVycz1aLlV0aWxzLnoyMzMoYyksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJET01Db250ZW50TG9hZGVkIixaLmluaXRpYWxpemUpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csImxvYWQiLFouaW5pdGlhbGl6ZSl9LFouaW5pdGlhbGl6ZT1mdW5jdGlvbigpe2FyZ3VtZW50cy5jYWxsZWUuZG9uZXx8KGFyZ3VtZW50cy5jYWxsZWUuZG9uZT0hMCxaLlV0aWxzLnoxNjQoKSxaLlV0aWxzLnoyNDkoWi5wYXJhbWV0ZXJzKSxaLlZpZXdlcj1uZXcgWi56MTIyLFouVXRpbHMuaXNTdHJWYWwoWi5jb3B5cmlnaHRQYXRoKT9aLlV0aWxzLmVuZm9yY2VDb3B5cmlnaHQoKTpaLlZpZXdlci56MTQ5KCksWi5kZWJ1ZyYmWi5VdGlscy50cmFjZShaLlV0aWxzLnoxODUoIno2NyIpKSl9LFouejEyMj1mdW5jdGlvbigpe1ouVmlld2VyRGlzcGxheT1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsIlZpZXdlckRpc3BsYXkiLCJpbmxpbmUtYmxvY2siLCJyZWxhdGl2ZSIsImhpZGRlbiIsIjEwMCUiLCIxMDAlIiwiMHB4IiwiMHB4Iiwibm9uZSIsIjBweCIsInRyYW5zcGFyZW50IG5vbmUiLCIwcHgiLCIwcHgiLCJwb2ludGVyIiksWi5wYWdlQ29udGFpbmVyPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFoucGFnZUNvbnRhaW5lcklEKTt2YXIgYT1aLlV0aWxzLnoxNzYoWi5wYWdlQ29udGFpbmVyKTtaLnZpZXdlclc9cGFyc2VGbG9hdChhLndpZHRoKSxaLnZpZXdlckg9cGFyc2VGbG9hdChhLmhlaWdodCksaXNOYU4oWi52aWV3ZXJXKSYmKFoudmlld2VyVz1aLlZpZXdlckRpc3BsYXkuY2xpZW50V2lkdGgpLGlzTmFOKFoudmlld2VySCkmJihaLnZpZXdlckg9Wi5WaWV3ZXJEaXNwbGF5LmNsaWVudEhlaWdodCksWi5wYWdlQ29udGFpbmVyLmlubmVySFRNTD0iIixaLnBhZ2VDb250YWluZXIuYXBwZW5kQ2hpbGQoWi5WaWV3ZXJEaXNwbGF5KSx0aGlzLnoxNDk9ZnVuY3Rpb24oKXtaLlZpZXdwb3J0PW5ldyBaLnoxMjV9LHRoaXMuejE0OD1mdW5jdGlvbigpe1oudG9vbGJhclZpc2libGU+MCYmKFouVG9vbGJhcj1uZXcgWi56MTI0KFouVmlld3BvcnQpKSxaLm5hdmlnYXRvclZpc2libGU+MCYmKFouTmF2aWdhdG9yPW5ldyBaLnoxMjMoWi5WaWV3cG9ydCkpLFouTmF2aWdhdG9yJiZaLk5hdmlnYXRvci56Mjc3KCl9LHRoaXMuc2V0U2l6ZUFuZFBvc2l0aW9uPWZ1bmN0aW9uKGEsYixjLGQsZSl7Wi52aWV3ZXJXPWEsWi52aWV3ZXJIPWIsWi5WaWV3ZXJEaXNwbGF5LnN0eWxlLndpZHRoPWErInB4IixaLlZpZXdlckRpc3BsYXkuc3R5bGUuaGVpZ2h0PWIrInB4IixaLlZpZXdwb3J0JiZaLlZpZXdwb3J0LnoxODAoKSYmWi5WaWV3cG9ydC5zZXRTaXplQW5kUG9zaXRpb24oYSxiLGMsZCk7dmFyIGY9Wi50b29sYmFyUG9zaXRpb249PTE/Yi1aLnRvb2xiYXJIOjA7Wi5Ub29sYmFyRGlzcGxheSYmWi5Ub29sYmFyLnoxODAoKSYmKFouVG9vbGJhci5zZXRTaXplQW5kUG9zaXRpb24oYSxudWxsLG51bGwsZiksWi50b29sYmFyVmlzaWJsZT4xJiZaLlRvb2xiYXIuc2hvdyghMCkpLFouTmF2aWdhdG9yRGlzcGxheSYmWi5OYXZpZ2F0b3IuejE4MCgpJiYoWi5OYXZpZ2F0b3Iuc2V0U2l6ZUFuZFBvc2l0aW9uKG51bGwsbnVsbCxjLGQsWi5uYXZpZ2F0b3JGaXQpLFoubmF2aWdhdG9yVmlzaWJsZT4xJiZaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCEwKSksZSYmWi5WaWV3cG9ydC56Mjc0KCEwKX0sdGhpcy5zZXRJbWFnZVBhdGg9ZnVuY3Rpb24oYSl7Wi5WaWV3cG9ydC56MjkzQWxsU3RvcCghMCksWi5pbWFnZVBhdGg9Wi5VdGlscy56MjQzKGEpO3ZhciBiPW5ldyBaLnoxMDEsYz1aLlV0aWxzLnoxNDAoWi5pbWFnZVBhdGgrIi8iKyJJbWFnZVByb3BlcnRpZXMueG1sIik7Yi5sb2FkWE1MKGMpfX0sWi56MTI1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gY2QoKXt6PTEsQT0wLEI9MCxGPVtdLEc9W10sSD1bXSxJPVtdLEo9W10sSz1bXSxMPVtdLE09W10sTj1bXSxPPVtdLFA9W10sUT1bXSxSPTB9ZnVuY3Rpb24gY2UoKXtyZXR1cm4gYn1mdW5jdGlvbiBjZihhKXtiPWF9ZnVuY3Rpb24gY2coKXtoPVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2Iiwidmlld3BvcnRDb250YWluZXIiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsInZpc2libGUiLCIxcHgiLCIxcHgiLCIwcHgiLCIwcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLFouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChoKSxpPWgsaz1pLnN0eWxlLGw9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KFoudXNlQ2FudmFzPyJjYW52YXMiOiJkaXYiLCJ2aWV3cG9ydEJhY2tmaWxsRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwidmlzaWJsZSIsIjFweCIsIjFweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4IiksaC5hcHBlbmRDaGlsZChsKSxtPWwsbj1tLnN0eWxlLHA9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KFoudXNlQ2FudmFzPyJjYW52YXMiOiJkaXYiLCJ2aWV3cG9ydERpc3BsYXkiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsInZpc2libGUiLCIxcHgiLCIxcHgiLCIwcHgiLCIwcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLGguYXBwZW5kQ2hpbGQocCkscT1wLHI9cS5zdHlsZSxaLlV0aWxzLmlzU3RyVmFsKFoud2F0ZXJtYXJrUGF0aCkmJih0PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2Iiwid2F0ZXJtYXJrRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwidmlzaWJsZSIsIjFweCIsIjFweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4IiksaC5hcHBlbmRDaGlsZCh0KSx1PXQsdj11LnN0eWxlKSxaLlV0aWxzLmlzU3RyVmFsKFouaG90c3BvdFBhdGgpJiYodz1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsImhvdHNwb3RzRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwidmlzaWJsZSIsIjFweCIsIjFweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4IiksaC5hcHBlbmRDaGlsZCh3KSx4PXcseT14LnN0eWxlKSxaLnVzZUNhbnZhcz8obz1tLmdldENvbnRleHQoIjJkIikscz1xLmdldENvbnRleHQoIjJkIikpOihtLmlubmVySFRNTD0iIixxLmlubmVySFRNTD0iIiksdSYmKHUuaW5uZXJIVE1MPSIiKSx4JiYoeC5pbm5lckhUTUw9IiIpfWZ1bmN0aW9uIGNoKGEsYixjLGQpe2N8fChjPTApLGR8fChkPTApLFk9YSwkPWIsYmI9WSpYLGJjPSQqWCxiZD1iYi8yLGJlPWJjLzIsYmY9LSgoYmItWSkvMikrYyxiZz0oYmItWSkvMitjLGJoPS0oKGJjLSQpLzIpK2QsYmk9KGJjLSQpLzIrZCxpLndpZHRoPWJiLGkuaGVpZ2h0PWJjLGsud2lkdGg9YmIrInB4IixrLmhlaWdodD1iYysicHgiLGsubGVmdD1iZisicHgiLGsudG9wPWJoKyJweCIscS53aWR0aD1iYixxLmhlaWdodD1iYyx1JiYodS53aWR0aD1iYix1LmhlaWdodD1iYyx2LndpZHRoPWJiKyJweCIsdi5oZWlnaHQ9YmMrInB4IiksWi51c2VDYW52YXMmJihzLnRyYW5zbGF0ZShiZCxiZSkscy5zYXZlKCkpfWZ1bmN0aW9uIGNpKCl7dmFyIGE9Wi5pbWFnZVcsYj1aLmltYWdlSDt3aGlsZShhPmN8fGI+YylhPWEvMixiPWIvMix6Kys7YT1aLmltYWdlVyxiPVouaW1hZ2VIO2Zvcih2YXIgZD16LTE7ZD49MDtkLS0pSFtkXT1hLElbZF09YixKW2RdPU1hdGguY2VpbChIW2RdL2MpLEtbZF09TWF0aC5jZWlsKElbZF0vYyksTFtkXT1KW2RdKktbZF0sYT1hLzIsYj1iLzJ9ZnVuY3Rpb24gY2ooKXtaLmluaXRpYWxYfHwoWi5pbml0aWFsWD1aLmltYWdlVy8yKSxaLmluaXRpYWxZfHwoWi5pbml0aWFsWT1aLmltYWdlSC8yKTt2YXIgYT1jUigpO1ouZml0WiYmWi5maXRaIT1hJiYoWi5pbml0aWFsWj09Wi5maXRaJiYoWi5pbml0aWFsWj1udWxsKSxaLm1pblo9PVouZml0WiYmKFoubWluWj1udWxsKSxaLm1heFo9PVouZml0WiYmKFoubWF4Wj1udWxsKSxaLmZpdFo9bnVsbCksWi5maXRafHwoWi5maXRaPWEpLFouaW5pdGlhbFp8fChaLmluaXRpYWxaPVouZml0WiksWi5taW5afHwoWi5taW5aPVouZml0WiksWi5tYXhafHwoWi5tYXhaPVouZml0WiksWi5pbml0aWFsWjxaLm1pblomJihaLmluaXRpYWxaPVoubWluWiksWi5pbml0aWFsWj5aLm1heFomJihaLmluaXRpYWxaPVoubWF4Wil9ZnVuY3Rpb24gY2soKXtjbChXKSx6PlQmJihjbChWKSx6PlMmJmNsKFUpKSxHLnNvcnQoKSxHPVouVXRpbHMuejI0MihHKSxjcyhHLGNKLDApfWZ1bmN0aW9uIGNsKGEpe3ZhciBiPUpbYV0tMSxjPUtbYV0tMTtmb3IodmFyIGQ9MDtkPD1jO2QrKylmb3IodmFyIGU9MDtlPD1iO2UrKylHLnB1c2goYSsiLSIrZSsiLSIrZCl9ZnVuY3Rpb24gY20oYSxiKXt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKSxkPWJmLXBhcnNlRmxvYXQoay5sZWZ0KSxlPWJoLXBhcnNlRmxvYXQoay50b3ApO2subGVmdD1iZisicHgiLGsudG9wPWJoKyJweCIsWi5pbWFnZVg9Wi5pbWFnZVgrZC9aLmltYWdlWixaLmltYWdlWT1aLmltYWdlWStlL1ouaW1hZ2VaLGNyKG0sQixGLCExLCExKSxjcihxLEEsTywhMSwhMSksY1koKTt2YXIgZj1jdygpO2E+MD9mLnJpZ2h0PWYubGVmdDphPDAmJihmLmxlZnQ9Zi5yaWdodCksYj4wP2YuYm90dG9tPWYudG9wOmI8MCYmKGYudG9wPWYuYm90dG9tKTtmb3IodmFyIGc9Zi50b3A7Zzw9Zi5ib3R0b207ZysrKWZvcih2YXIgaD1mLmxlZnQ7aDw9Zi5yaWdodDtoKyspUS5wdXNoKEErIi0iK2grIi0iK2cpO3ZhciBpPVEubGVuZ3RoO2Zvcih2YXIgaj0wO2o8aTtqKyspe3ZhciBsPVFbal07aWYobCl7dmFyIG49bmV3IGNHKGwpO2NJKG4sYyxjSyl9fWk+MzAmJlEuc3BsaWNlKGktMzAsMzApfWZ1bmN0aW9uIGNuKCl7dmFyIGE9ITE7cGFyc2VGbG9hdChyLndpZHRoKSE9cS53aWR0aCYmKFoudXNlQ2FudmFzJiYoci53aWR0aD1xLndpZHRoKyJweCIsci5oZWlnaHQ9cS5oZWlnaHQrInB4IixyLmxlZnQ9IjBweCIsci50b3A9IjBweCIscy5yZXN0b3JlKCkscy5zYXZlKCkscy5zY2FsZShDLEMpKSxhPSEwKTtpZihwYXJzZUZsb2F0KGsubGVmdCkhPWJmfHxwYXJzZUZsb2F0KGsudG9wKSE9Ymgpe3ZhciBiPXBhcnNlRmxvYXQoay5sZWZ0KS1iZixjPXBhcnNlRmxvYXQoay50b3ApLWJoO2subGVmdD1iZisicHgiLGsudG9wPWJoKyJweCIsYmw9cGFyc2VGbG9hdChuLmxlZnQpK2IsYm09cGFyc2VGbG9hdChuLnRvcCkrYyxuLmxlZnQ9YmwrInB4IixuLnRvcD1ibSsicHgiO3ZhciBkPWNCKEEsQyk7Wi5pbWFnZVg9Wi5pbWFnZVgtYi9kLFouaW1hZ2VZPVouaW1hZ2VZLWMvZCxhPSEwfWEmJihjcihxLEEsTywhMCwhMSksY1koKSl9ZnVuY3Rpb24gY28oKXtDIT1EJiYoWi5pbWFnZVo9YnopLFouaW1hZ2VaPFoubWluWiYmKFouaW1hZ2VaPVoubWluWik7dmFyIGE9ZCxiPXo7d2hpbGUoYS8yPj1aLmltYWdlWiliLS0sYS89MjtiPWItMTwwPzA6Yi0xO3ZhciBjPWNDKGIsWi5pbWFnZVopO2lmKGIhPUF8fGMhPUMpWi51c2VDYW52YXMmJihzLnJlc3RvcmUoKSxzLnNhdmUoKSxzLnNjYWxlKGMsYykpLEE9YixDPWM7RD1DfWZ1bmN0aW9uIGNwKCl7Qj1BPlM/VTpBPlQ/VjpXLEU9Y0MoQixaLmltYWdlWiksdGllckJhY2tmaWxsVz1IW0JdLHRpZXJCYWNrZmlsbEg9SVtCXSxtLndpZHRoPXRpZXJCYWNrZmlsbFcsbS5oZWlnaHQ9dGllckJhY2tmaWxsSDt2YXIgYT10aWVyQmFja2ZpbGxXKkUsYj10aWVyQmFja2ZpbGxIKkUsYz1aLmltYWdlWCpaLmltYWdlWixkPVouaW1hZ2VZKlouaW1hZ2VaO2JqPWEsYms9YixibD1iZC1jLGJtPWJlLWQsWi51c2VDYW52YXMmJihuLndpZHRoPWJqKyJweCIsbi5oZWlnaHQ9YmsrInB4Iiksbi5sZWZ0PWJsKyJweCIsbi50b3A9Ym0rInB4In1mdW5jdGlvbiBjcSgpe3ZhciBhPWN3KCk7Zm9yKHZhciBiPWEudG9wLGM9YS5ib3R0b207Yjw9YztiKyspZm9yKHZhciBkPWEubGVmdCxlPWEucmlnaHQ7ZDw9ZTtkKyspTi5wdXNoKEErIi0iK2QrIi0iK2IpO1Auc29ydCgpLE4uc29ydCgpLFA9Wi5VdGlscy56MjQyKFApLE49Wi5VdGlscy56MjQyKE4pO3ZhciBmPVouVXRpbHMuaW50ZXJzZWN0KE4sUCk7Tj1aLlV0aWxzLnN1YnRyYWN0KE4sUCksUj10aWxlc0xvYWRpbmdOYW1lc0xlbmd0aD1OLmxlbmd0aCxaLlRvb2xiYXJEaXNwbGF5JiZaLlRvb2xiYXIuejE4MCgpJiZaLlRvb2xiYXIuc2hvd1Byb2dyZXNzKFIsdGlsZXNMb2FkaW5nTmFtZXNMZW5ndGgpLFA9Wi5VdGlscy5zdWJ0cmFjdChQLGYpLFA9UC5jb25jYXQoZiksdGlsZXNMb2FkaW5nTmFtZXNMZW5ndGghPTAmJihNPVtdKX1mdW5jdGlvbiBjcihhLGIsYyxkLGUpe2V8fGN0KGEpO2lmKGQpe3ZhciBmPU1hdGguZmxvb3IoYy5sZW5ndGgvMik7Zm9yKHZhciBnPWYsaD1jLmxlbmd0aDtnPGg7ZysrKXt2YXIgaT1jW2ddO2kmJmkudD09YiYmY00oYSxiLGkpO2lmKGMubGVuZ3RoLWctMSE9Zyl7dmFyIGk9Y1tjLmxlbmd0aC1nLTFdO2kmJmkudD09YiYmY00oYSxiLGkpfX19ZWxzZSBmb3IodmFyIGc9MCxoPWMubGVuZ3RoO2c8aDtnKyspe3ZhciBpPWNbZ107aSYmaS50PT1iJiZjTShhLGIsaSl9fWZ1bmN0aW9uIGNzKGEsYixjKXtpZihhLmxlbmd0aD4wKXt2YXIgZD0obmV3IERhdGUpLmdldFRpbWUoKTtpZihjKXt2YXIgZT1NYXRoLmZsb29yKGEubGVuZ3RoLzIpO2Zvcih2YXIgZj1lLGc9YS5sZW5ndGg7ZjxnO2YrKyl7dmFyIGg9YVtmXTtpZihoKXt2YXIgaT1uZXcgY0coaCk7Y0koaSxkLGIpfWlmKGEubGVuZ3RoLWYtMSE9Zil7dmFyIGg9YVthLmxlbmd0aC1mLTFdO2lmKGgpe3ZhciBpPW5ldyBjRyhoKTtjSShpLGQsYil9fX19ZWxzZSBmb3IodmFyIGY9MCxnPWEubGVuZ3RoO2Y8ZztmKyspe3ZhciBoPWFbZl07aWYoaCl7dmFyIGk9bmV3IGNHKGgpO2NJKGksZCxiKX19fX1mdW5jdGlvbiBjdChhKXtpZihhKWlmKFoudXNlQ2FudmFzJiZhLnRhZ05hbWU9PSJDQU5WQVMiKXt2YXIgYj1hLmdldENvbnRleHQoIjJkIik7Yi5zYXZlKCksYi5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLGIuY2xlYXJSZWN0KDAsMCxiLmNhbnZhcy53aWR0aCxiLmNhbnZhcy5oZWlnaHQpLGIucmVzdG9yZSgpfWVsc2UgaWYoYS5oYXNDaGlsZE5vZGVzKCkpd2hpbGUoYS5jaGlsZE5vZGVzLmxlbmd0aD49MSlhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCl9ZnVuY3Rpb24gY3UoKXtpZihaLlRvb2xiYXJEaXNwbGF5JiZaLlRvb2xiYXIuejE4MCgpKXt2YXIgYT1jQihBLEMpO1ouVG9vbGJhci56MjY2KGEpfX1mdW5jdGlvbiBjdigpe1ouTmF2aWdhdG9yJiZaLk5hdmlnYXRvci56MTgwKCkmJlouTmF2aWdhdG9yLnoyNjgoKX1mdW5jdGlvbiBjdygpe3JldHVybiBuZXcgY3ooY3goKSxBKX1mdW5jdGlvbiBjeCgpe3ZhciBhPXBhcnNlRmxvYXQoay5sZWZ0KS1iZixiPXBhcnNlRmxvYXQoay50b3ApLWJoO2lmKFoudXNlQ2FudmFzKXt2YXIgYz1wYXJzZUZsb2F0KGsud2lkdGgpL2kud2lkdGg7YS89YyxiLz1jfXZhciBkPWNCKEEsQyk7cmV0dXJuIGEhPTAmJihhLz1kKSxiIT0wJiYoYi89ZCksbmV3IGNBKFouaW1hZ2VYLWEsWi5pbWFnZVktYiwtKFkvMiksWS8yLC0oJC8yKSwkLzIsZCl9ZnVuY3Rpb24gY3koKXt2YXIgYT1wYXJzZUZsb2F0KGsubGVmdCktYmYsYj1wYXJzZUZsb2F0KGsudG9wKS1iaDtpZihaLnVzZUNhbnZhcyl7dmFyIGM9cGFyc2VGbG9hdChrLndpZHRoKS9pLndpZHRoO2EvPWMsYi89Y312YXIgZD1jQihBLEMpO3JldHVybiBhIT0wJiYoYS89ZCksYiE9MCYmKGIvPWQpLG5ldyBjQShaLmltYWdlWC1hLFouaW1hZ2VZLWIsLShiYi8yKSxiYi8yLC0oYmMvMiksYmMvMixkKX1mdW5jdGlvbiBjeihhLGIpe3ZhciBkPWNCKGIsMSksZT1NYXRoLmZsb29yKGEubGVmdCpkL2MpLGY9TWF0aC5mbG9vcihhLnJpZ2h0KmQvYyksZz1NYXRoLmZsb29yKGEudG9wKmQvYyksaD1NYXRoLmZsb29yKGEuYm90dG9tKmQvYyk7ZTwwJiYoZT0wKSxmPkpbQV0tMSYmKGY9SltBXS0xKSxnPDAmJihnPTApLGg+S1tBXS0xJiYoaD1LW0FdLTEpLHRoaXMubGVmdD1lLHRoaXMucmlnaHQ9Zix0aGlzLnRvcD1nLHRoaXMuYm90dG9tPWh9ZnVuY3Rpb24gY0EoYSxiLGMsZCxlLGYsZyl7dGhpcy5sZWZ0PWErYy9nLHRoaXMucmlnaHQ9YStkL2csdGhpcy50b3A9YitlL2csdGhpcy5ib3R0b209YitmL2d9ZnVuY3Rpb24gY0IoYSxiKXt2YXIgYz1iKihIW2FdL1ouaW1hZ2VXKTtyZXR1cm4gY31mdW5jdGlvbiBjQyhhLGIpe3ZhciBjPWIvKEhbYV0vWi5pbWFnZVcpO3JldHVybiBjfWZ1bmN0aW9uIGNEKGEsYil7dmFyIGM9YS1aLlV0aWxzLnoxNzQoWi5WaWV3ZXJEaXNwbGF5KS54LGQ9Yi1aLlV0aWxzLnoxNzQoWi5WaWV3ZXJEaXNwbGF5KS55O3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChjLGQpfWZ1bmN0aW9uIGNFKGEsYil7dmFyIGM9cGFyc2VGbG9hdChrLmxlZnQpK2JkLGQ9cGFyc2VGbG9hdChrLnRvcCkrYmUsZT1hLWMsZj1iLWQsZz1lL1ouaW1hZ2VaLGg9Zi9aLmltYWdlWixpPVouaW1hZ2VYK2csaj1aLmltYWdlWStoO3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChpLGopfWZ1bmN0aW9uIGNGKGEsYil7dmFyIGM9Wi5pbWFnZVgtYSxkPVouaW1hZ2VZLWIsZT1jKlouaW1hZ2VaLGY9ZCpaLmltYWdlWixnPXBhcnNlRmxvYXQoay5sZWZ0KStiZCxoPXBhcnNlRmxvYXQoay50b3ApK2JlLGk9Zy1lLGo9aC1mO3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChpLGopfWZ1bmN0aW9uIGNHKGEpe3RoaXMubmFtZT1hLHRoaXMudD1wYXJzZUludChhLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLSIpKSwxMCksdGhpcy5jPXBhcnNlSW50KGEuc3Vic3RyaW5nKGEuaW5kZXhPZigiLSIpKzEsYS5sYXN0SW5kZXhPZigiLSIpKSwxMCksdGhpcy5yPXBhcnNlSW50KGEuc3Vic3RyaW5nKGEubGFzdEluZGV4T2YoIi0iKSsxKSwxMCksdGhpcy54PU1hdGguZmxvb3IodGhpcy5jKmMpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMucipjKSx0aGlzLmltYWdlPW51bGwsdGhpcy5hbHBoYT0wLHRoaXMudXJsPVouVXRpbHMuejE0MChjSCh0aGlzLnQsdGhpcy5jLHRoaXMucix0aGlzLm5hbWUpKSx0aGlzLmVsbXQ9bnVsbCx0aGlzLnN0eWxlPW51bGx9ZnVuY3Rpb24gY0goYSxiLGQsZSl7dmFyIGY9ZCpKW2FdK2I7Zm9yKHZhciBnPTA7ZzxhO2crKylmKz1MW2ddO3ZhciBoPU1hdGguZmxvb3IoZi9jKSxpPVouaW1hZ2VQYXRoKyIvIisiVGlsZUdyb3VwIitoKyIvIitlKyIuanBnIjtyZXR1cm4gaX1mdW5jdGlvbiBjSShhLGIsYyl7YS5sb2FkaW5nPWNiLnoyMTJJbWFnZShhLnVybCxaLlV0aWxzLmNyZWF0ZUNhbGxiYWNrKG51bGwsYyxhLGIpKX1mdW5jdGlvbiBjSihhLGIsYyl7aWYoYSYmYiYmYyl7YS5pbWFnZT1jO3ZhciBkPWEubmFtZTtGLnB1c2goYSk7dmFyIGU9Ry5pbmRleE9mKGQpO2UhPS0xJiZHLnNwbGljZShlLDEpLGEuYWxwaGE9MSxhLnQ9PUImJmNNKG0sQixhKX19ZnVuY3Rpb24gY0soYSxiLGMpe2lmKGEmJmImJmMpe2EuaW1hZ2U9Yzt2YXIgZD1hLm5hbWU7Y00ocSxBLGEpfX1mdW5jdGlvbiBjTChhLGIsYyl7aWYoYSYmYiYmYyl7YS5pbWFnZT1jO3ZhciBkPWEubmFtZTtPLnB1c2goYSksUC5wdXNoKGQpO3ZhciBlPU4uaW5kZXhPZihkKTtlIT0tMSYmTi5zcGxpY2UoZSwxKSxNLnB1c2goYSksYkZ8fChiRj13aW5kb3cuc2V0SW50ZXJ2YWwoY1AsNTApKTt2YXIgZz1OLmxlbmd0aDtnPT0wJiYoWi51c2VDYW52YXMmJmNyKHEsQSxPLCEwLCExKSxQLmxlbmd0aD5mJiZjUSgpLFI9MCksWi5Ub29sYmFyRGlzcGxheSYmWi5Ub29sYmFyLnoxODAoKSYmWi5Ub29sYmFyLnNob3dQcm9ncmVzcyhSLGcpfX1mdW5jdGlvbiBjTShhLGIsYyl7dmFyIGQ9Yy54LGU9Yy55LGY9Y0IoYiwxKTtpZihaLnVzZUNhbnZhcylhPT1xJiYoZC09Wi5pbWFnZVgqZixlLT1aLmltYWdlWSpmKSxjTihhLGMsZCxlKTtlbHNle3ZhciBnO2E9PXE/KGQtPVouaW1hZ2VYKmYtYmQvQyxlLT1aLmltYWdlWSpmLWJlL0MsZz1DKTpnPUUsY08oYSxjLGQsZSxnKX19ZnVuY3Rpb24gY04oYSxiLGMsZCl7dmFyIGU9YS5nZXRDb250ZXh0KCIyZCIpO1ouYWxwaGFTdXBwb3J0ZWQmJmIuYWxwaGE8MT8oZS5nbG9iYWxBbHBoYT1iLmFscGhhLGUuZHJhd0ltYWdlKGIuaW1hZ2UsYyxkKSxlLmdsb2JhbEFscGhhPTEpOmUuZHJhd0ltYWdlKGIuaW1hZ2UsYyxkKX1mdW5jdGlvbiBjTyhhLGIsYyxkLGUpe2IuZWxtdHx8KGIuZWxtdD1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImltZyIpLGIuZWxtdC5vbm1vdXNlZG93bj1aLlV0aWxzLnByZXZlbnREZWZhdWx0LFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihiLmVsbXQsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxiLmVsbXQuc3JjPWIudXJsLGIuc3R5bGU9Yi5lbG10LnN0eWxlLGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixaLlV0aWxzLnJlbmRlclF1YWxpdHkoYixaLnJlbmRlclF1YWxpdHkpLFouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZCYmKGIuc3R5bGVbWi5jc3NUcmFuc2Zvcm1Qcm9wZXJ0eSsiT3JpZ2luIl09IjBweCAwcHgiKSksYi5lbG10LnBhcmVudE5vZGUhPWEmJmEuYXBwZW5kQ2hpbGQoYi5lbG10KTt2YXIgZj1iLnN0eWxlO2YuZGlzcGxheT0ibm9uZSIsWi5jc3NUcmFuc2Zvcm1zU3VwcG9ydGVkP2ZbWi5jc3NUcmFuc2Zvcm1Qcm9wZXJ0eV09WyJtYXRyaXgoIiwoYi5pbWFnZS53aWR0aC9iLmVsbXQud2lkdGgqZSkudG9GaXhlZCg4KSwiLDAsMCwiLChiLmltYWdlLmhlaWdodC9iLmVsbXQuaGVpZ2h0KmUpLnRvRml4ZWQoOCksIiwiLChjKmUpLnRvRml4ZWQoOCksWi5jc3NUcmFuc2Zvcm1Ob1VuaXRzPyIsIjoicHgsIiwoZCplKS50b0ZpeGVkKDgpLFouY3NzVHJhbnNmb3JtTm9Vbml0cz8iKSI6InB4KSJdLmpvaW4oIiIpOihmLndpZHRoPWIuaW1hZ2Uud2lkdGgqZSsicHgiLGYuaGVpZ2h0PWIuaW1hZ2UuaGVpZ2h0KmUrInB4IixmLmxlZnQ9YyplKyJweCIsZi50b3A9ZCplKyJweCIpLGYuZGlzcGxheT0iaW5saW5lLWJsb2NrIixaLlV0aWxzLnNldE9wYWNpdHkoYixiLmFscGhhKX1mdW5jdGlvbiBjUChhKXt2YXIgYj1NLmxlbmd0aCxjPTA7Zm9yKHZhciBkPTA7ZDxiO2QrKyl7dmFyIGU9TVtkXTtlLnQ9PUEmJihlLmFscGhhPDE/KGUuYWxwaGErPWJFLGUuYWxwaGE+MSYmKGUuYWxwaGE9MSksY00ocSxBLGUpKTooYysrLGM+PWImJih3aW5kb3cuY2xlYXJJbnRlcnZhbChiRiksYkY9bnVsbCkpKX19ZnVuY3Rpb24gY1EoKXt2YXIgYT1QLmxlbmd0aC1mO2Zvcih2YXIgYj0wO2I8YTtiKyspaj1QLmluZGV4T2YoT1tiXS5uYW1lKSxqIT0tMSYmUC5zcGxpY2UoaiwxKSxPLnNwbGljZShiLDEpfWZ1bmN0aW9uIGNSKCl7cmV0dXJuIFouaW1hZ2VXL1ouaW1hZ2VIPlkvJD9ZL1ouaW1hZ2VXOiQvWi5pbWFnZUh9ZnVuY3Rpb24gY1MoYSxiKXtpZihaLmNvbnN0cmFpblBhbil7dmFyIGM9bmV3IGNBKGEsYiwtKFkvMiksWS8yLC0oJC8yKSwkLzIsWi5pbWFnZVopLGQ9Yy5sZWZ0LGU9Yy5yaWdodCxmPWMudG9wLGc9Yy5ib3R0b207Wi5pbWFnZVcqWi5pbWFnZVo+WT9kPDA/YT1ZLzIvWi5pbWFnZVo6ZT5aLmltYWdlVyYmKGE9Wi5pbWFnZVctWS8yL1ouaW1hZ2VaKTphPVouaW1hZ2VXLzIsWi5pbWFnZUgqWi5pbWFnZVo+JD9mPDA/Yj0kLzIvWi5pbWFnZVo6Zz5aLmltYWdlSCYmKGI9Wi5pbWFnZUgtJC8yL1ouaW1hZ2VaKTpiPVouaW1hZ2VILzJ9cmV0dXJuIG5ldyBaLlV0aWxzLlBvaW50KGEsYil9ZnVuY3Rpb24gY1QoYSxiKXtpZihaLmNvbnN0cmFpblBhbil7dmFyIGM9Y0IoQSxDKSxkPVouaW1hZ2VYLGU9Wi5pbWFnZVksZj1uZXcgY0EoZCxlLC0oWS8yKSxZLzIsLSgkLzIpLCQvMixjKSxnPWYubGVmdCxoPWYucmlnaHQsaT1mLnRvcCxqPWYuYm90dG9tO1ouaW1hZ2VXKmM+WT9nPDA/YSs9ZypjOmg+Wi5pbWFnZVcmJihhLT0oWi5pbWFnZVctaCkqYyk6YSs9KGQtWi5pbWFnZVcvMikqYyxaLmltYWdlSCpjPiQ/aTwwP2IrPWkqYzpqPlouaW1hZ2VIJiYoYi09KFouaW1hZ2VILWopKmMpOmIrPShlLVouaW1hZ2VILzIpKmN9cmV0dXJuIG5ldyBaLlV0aWxzLlBvaW50KGEsYil9ZnVuY3Rpb24gY1UoYSxiKXtpZihaLmNvbnN0cmFpblBhbil7dmFyIGM9Wi5pbWFnZVgtKGEtYmYpL1ouaW1hZ2VaLGQ9Wi5pbWFnZVktKGItYmgpL1ouaW1hZ2VaLGU9bmV3IGNBKGMsZCwtKFkvMiksWS8yLC0oJC8yKSwkLzIsWi5pbWFnZVopLGY9ZS5sZWZ0LGc9ZS5yaWdodCxoPWUudG9wLGk9ZS5ib3R0b207Wi5pbWFnZVcqWi5pbWFnZVo+WT9mPDA/YSs9ZipaLmltYWdlWjpnPlouaW1hZ2VXJiYoYS09KFouaW1hZ2VXLWcpKlouaW1hZ2VaKTphKz0oYy1aLmltYWdlVy8yKSpaLmltYWdlWixaLmltYWdlSCpaLmltYWdlWj4kP2g8MD9iKz1oKlouaW1hZ2VaOmk+Wi5pbWFnZUgmJihiLT0oWi5pbWFnZUgtaSkqWi5pbWFnZVopOmIrPShkLVouaW1hZ2VILzIpKlouaW1hZ2VafXJldHVybiBuZXcgWi5VdGlscy5Qb2ludChhLGIpfWZ1bmN0aW9uIGNWKGEpe3JldHVybiBhPloubWF4Wj9hPVoubWF4WjphPFoubWluWiYmKGE9Wi5taW5aKSxhfWZ1bmN0aW9uIGNXKCl7Ylo9bmV3IEltYWdlLGIkPXBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6NzMiKSksYloudXJsPVoud2F0ZXJtYXJrUGF0aCxiWi5vbmxvYWQ9Y1gsYloub25lcnJvcj1jWixiWi5zcmM9Wi53YXRlcm1hcmtQYXRofWZ1bmN0aW9uIGNYKCl7aWYodSl7dmFyIGE9cGFyc2VGbG9hdChaLlV0aWxzLnoxODUoIno3NCIpKSxiPXBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6NzYiKSksYz1wYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejc1IikpLGQ9Y0IoQSxDKSxlPShaLmltYWdlVypkLXUud2lkdGgpLzIsZj0oWi5pbWFnZUgqZC11LmhlaWdodCkvMixnPShaLmltYWdlVy8yLVouaW1hZ2VYKSpkLGg9KFouaW1hZ2VILzItWi5pbWFnZVkpKmQsaT1kPGE/YTpkLGo9TWF0aC5yb3VuZChaLmltYWdlVy9iKSxrPU1hdGgucm91bmQoWi5pbWFnZUgvYyksbD1jeSgpO3dpU2NhbGVkVz1iWi53aWR0aCppLHdpU2NhbGVkSD1iWi5oZWlnaHQqaTt2YXIgbT0wLG49MDtmb3IodmFyIG89MTtvPD1qO28rKylmb3IodmFyIHA9MTtwPD1rO3ArKyl7dmFyIHE9TWF0aC5yb3VuZChaLmltYWdlVy8oaisxKSpvKSxyPU1hdGgucm91bmQoWi5pbWFnZUgvKGsrMSkqcCk7aWYocT5sLmxlZnQmJnE8bC5yaWdodCYmcj5sLnRvcCYmcjxsLmJvdHRvbSl7dmFyIHM9TWF0aC5yb3VuZChxKmQtd2lTY2FsZWRXLzItZStnKSx0PU1hdGgucm91bmQocipkLXdpU2NhbGVkSC8yLWYraCk7aWYoWi5pbWFnZVc+NGUzKXt2YXIgdj1tKzEwMCx3PW4rMTAwO2lmKHM8diYmdDx3KWNvbnRpbnVlO209cyxuPXR9dmFyIHg9YlouY2xvbmVOb2RlKCEwKTtaLlV0aWxzLnNldE9wYWNpdHkoeCxiJCkseC53aWR0aD13aVNjYWxlZFcseC5oZWlnaHQ9d2lTY2FsZWRIO3ZhciB5PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2Iiwid2lDIiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLHdpU2NhbGVkVysicHgiLHdpU2NhbGVkSCsicHgiLHMrInB4Iix0KyJweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4Iik7eS5hcHBlbmRDaGlsZCh4KSx1LmFwcGVuZENoaWxkKHkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih4LCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHgsIm1vdXNlZG93biIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCl9fX19ZnVuY3Rpb24gY1koKXt1JiYoY3QodSksY1goKSl9ZnVuY3Rpb24gY1ooKXtaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6OTciKSt0aGlzLnVybCl9ZnVuY3Rpb24gYyQoYixjLGQpe2EuejI5M0FsbFN0b3AoKSxaLmltYWdlWj1jVihkKTt2YXIgZT1jUyhiLGMpO1ouaW1hZ2VYPWUueCxaLmltYWdlWT1lLnksYS56Mjc0KCEwKX1mdW5jdGlvbiBjXygpe2lmKGJCKXtkYihidixidyxieCwhMSk7aWYoYnYhPT0wfHxidyE9PTB8fGJ4IT09MCliQj13aW5kb3cuc2V0VGltZW91dChjXyxiQSl9fWZ1bmN0aW9uIGRhKCl7Yk88Ykk/KGRiKGJKLGJLLGJMLCEwKSxiTysrLGJOPXdpbmRvdy5zZXRUaW1lb3V0KGRhLGJIKSk6KEM9Yk8qYkwrY0MoQSxaLmltYWdlWiksYS56MjkzQWxsU3RvcCgpLGEuejI3MyghMCkpfWZ1bmN0aW9uIGRiKGEsYixkLGUpe3ZhciBmLGcsaCxpPSExLGo9ITEsbD0hMTtpZihkIT0wKXt2YXIgbT1DKigxK2QpO2UmJihtPUMrZCk7dmFyIG49Y0IoQSxtKTtoPWNWKG4pO2lmKGghPVouaW1hZ2VaKXt2YXIgbz1kZShoKTtvJiYoIWUsaj0hMCxsPSEwKX19aWYoYSE9MHx8YiE9MCl7dmFyIHA9cGFyc2VGbG9hdChrLmxlZnQpK2Escz1wYXJzZUZsb2F0KGsudG9wKStiLHQ9Y1UocCxzKTtmPXQueCxnPXQueSxrLmxlZnQ9ZisicHgiLGsudG9wPWcrInB4IixpPSEwLGw9ITB9dmFyIHU9YnklMj09MDt1JiYoY1koKSxqJiZjdSgpLGwmJmN2KCkpO2lmKGkpdmFyIHY9Wi51c2VDYW52YXM/cGFyc2VGbG9hdChyLndpZHRoKS9xLndpZHRoOjEsdz1NYXRoLnJvdW5kKGMvYnUqQyp2KSx4PWJ5JXc9PTAmJmJ5IT0wfWZ1bmN0aW9uIGRjKCl7YkImJih3aW5kb3cuY2xlYXJUaW1lb3V0KGJCKSxiQj1udWxsKSxidj0wLGJ3PTAsYng9MCxieT0wfWZ1bmN0aW9uIGRkKCl7Yk4mJih3aW5kb3cuY2xlYXJUaW1lb3V0KGJOKSxiTj1udWxsKX1mdW5jdGlvbiBkZShhKXt2YXIgYj0hMSxjPWNDKEEsYSk7aWYoYyE9Qyl7Qz1jLEU9Y0MoQixhKTt2YXIgZD1jL0QsZT1iYipkLGY9YmMqZCxnPShiYi1lKS8yLGg9KGJjLWYpLzI7aWYoYzxEKXt2YXIgaT1jVChnLGgpO2subGVmdD1iZitpLngtZysicHgiLGsudG9wPWJoK2kueS1oKyJweCJ9aWYoWi51c2VDYW52YXMpci53aWR0aD1lKyJweCIsci5oZWlnaHQ9ZisicHgiLHIubGVmdD1nKyJweCIsci50b3A9aCsicHgiLGU9YmoqZCxmPWJrKmQsZz1ibCtaLmltYWdlWCooMS1kKSpaLmltYWdlWixoPWJtK1ouaW1hZ2VZKigxLWQpKlouaW1hZ2VaLG4ud2lkdGg9ZSsicHgiLG4uaGVpZ2h0PWYrInB4IixuLmxlZnQ9ZysicHgiLG4udG9wPWgrInB4IjtlbHNle2NyKHEsQSxPLCEwLCExKSx0aWVyQmFja2ZpbGxXPUhbQl0sdGllckJhY2tmaWxsSD1JW0JdLG0ud2lkdGg9dGllckJhY2tmaWxsVyxtLmhlaWdodD10aWVyQmFja2ZpbGxIO3ZhciBqPXRpZXJCYWNrZmlsbFcqRSxsPXRpZXJCYWNrZmlsbEgqRSxvPVouaW1hZ2VYKmEscD1aLmltYWdlWSphO2JsPWJkLW8sYm09YmUtcCxuLmxlZnQ9YmwrInB4IixuLnRvcD1ibSsicHgiLGNyKG0sQixGLCExLCExKX1iPSEwfXJldHVybiBifWZ1bmN0aW9uIGRmKGEpe2E/KGJYfHxkZygpLGJYLmVsbXQuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIik6YlgmJihiWC5lbG10LnN0eWxlLmRpc3BsYXk9Im5vbmUiKX1mdW5jdGlvbiBkZygpe3ZhciBhPVouVXRpbHMuejE4NSgiejIxIiksYj0zNCxjPTM0LGQ9MjAsZT1wYXJzZUZsb2F0KFoudmlld2VyVyktKGIrZCksZj1wYXJzZUZsb2F0KFoudmlld2VySCktKGMrZCksZz1aLlV0aWxzLnoxODUoInoyMCIpO2JYPW5ldyBaLlV0aWxzLkJ1dHRvbigiYnV0dG9uRlBDYW5jZWwiLGEsbnVsbCxudWxsLG51bGwsbnVsbCxiKyJweCIsYysicHgiLGUrInB4IixmKyJweCIsIm1vdXNlZG93biIsZGgsInoxMDIiLCJzb2xpZCIsIjFweCIsZywiMHB4IiwiMHB4IiksWi5WaWV3ZXJEaXNwbGF5LmFwcGVuZENoaWxkKGJYLmVsbXQpfWZ1bmN0aW9uIGRoKCl7YS50b2dnbGVGdWxsUGFnZVZpZXcoITEpfWZ1bmN0aW9uIGRpKCl7Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJrZXlkb3duIixkeiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJrZXl1cCIsZEEpLFoubW9iaWxlRGV2aWNlPyhaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwidG91Y2hzdGFydCIsZHApLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihpLCJ0b3VjaG1vdmUiLGRxKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwidG91Y2hlbmQiLGRyKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwidG91Y2hjYW5jZWwiLGRzKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwiZ2VzdHVyZXN0YXJ0IixkdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksImdlc3R1cmVjaGFuZ2UiLGR1KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwiZ2VzdHVyZWVuZCIsZHYpLGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0ub25vcmllbnRhdGlvbmNoYW5nZT1keSk6KFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihaLlZpZXdlckRpc3BsYXksIm1vdXNlb3ZlciIsZGopLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihaLlZpZXdlckRpc3BsYXksIm1vdXNlb3V0IixkbiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKFouVmlld2VyRGlzcGxheSwibW91c2Vtb3ZlIixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwibW91c2Vkb3duIixkayksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksIm1vdXNlbW92ZSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihtLCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHEsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSx1JiZaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodSwiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpLHgmJlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih4LCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCl9ZnVuY3Rpb24gZGooYSl7dmFyIGI9Wi5VdGlscy56MjI1KFouVXRpbHMudGFyZ2V0KFouVXRpbHMuZXZlbnQoYSkpKSxjPVouVXRpbHMuejIyNShaLlV0aWxzLnJlbGF0ZWRUYXJnZXQoYSkpO2lmKCFifHwhYylaLlRvb2xiYXJEaXNwbGF5JiZaLnRvb2xiYXJWaXNpYmxlPjEmJlouVG9vbGJhci5zaG93KCEwKSxaLk5hdmlnYXRvckRpc3BsYXkmJloubmF2aWdhdG9yVmlzaWJsZT4xJiZaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCEwKSxibz1udWxsfWZ1bmN0aW9uIGRrKGEpe2lmKFouVXRpbHMuaXNSaWdodE1vdXNlQnV0dG9uKGEpKXJldHVybjtibj0hMDt2YXIgYj1aLlV0aWxzLnoxODEoYSk7cmV0dXJuIGJQPW5ldyBaLlV0aWxzLlBvaW50KGIueCxiLnkpLGkubW91c2VYUHJpb3I9Yi54LGkubW91c2VZUHJpb3I9Yi55LFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2Vtb3ZlIixkbCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksIm1vdXNldXAiLGRtKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNldXAiLGRtKSwhMX1mdW5jdGlvbiBkbChiKXtpZighWi5tb3VzZVBhbilyZXR1cm47dmFyIGI9Wi5VdGlscy5ldmVudChiKSxjPVouVXRpbHMuejE4MShiKSxkPWMueC1pLm1vdXNlWFByaW9yLGU9Yy55LWkubW91c2VZUHJpb3I7aWYoIWlzTmFOKGQpJiYhaXNOYU4oZSkpe3ZhciBmPXBhcnNlRmxvYXQoay5sZWZ0KStkLGc9cGFyc2VGbG9hdChrLnRvcCkrZSxoPWNVKGYsZyk7ay5sZWZ0PWgueCsicHgiLGsudG9wPWgueSsicHgiLGkubW91c2VYUHJpb3I9Yy54LGkubW91c2VZUHJpb3I9Yy55O2lmKFouTmF2aWdhdG9yKXt2YXIgaj1hLnoxNDEoaCk7Wi5OYXZpZ2F0b3IuejI2M1JlY3RhbmdsZVBvc2l0aW9uKGopfX1yZXR1cm4hMX1mdW5jdGlvbiBkbShiKXtibj0hMSxkb2N1bWVudC5tb3VzZW1vdmU9bnVsbCxkb2N1bWVudC5tb3VzZXVwPW51bGwsWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZW1vdmUiLGRsKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoaSwibW91c2V1cCIsZG0pLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsZG0pO3ZhciBiPVouVXRpbHMuZXZlbnQoYiksYz1aLlV0aWxzLnoxODEoYiksZDtibz9kPWJvOmQ9bmV3IFouVXRpbHMuUG9pbnQoYy54LGMueSk7dmFyIGU9TWF0aC5zcXJ0KE1hdGgucG93KGJQLngtZC54LDIpK01hdGgucG93KGJQLnktZC55LDIpKTtpZihlPDQpe3ZhciBmPWEuejE3MyhiLGQsQSxDKTtaLmNsaWNrWm9vbT9hLnoyOTNUb1ZpZXcoZi54LGYueSxmLnopOlouY2xpY2tQYW4mJmEuejI5M1RvVmlldyhmLngsZi55LFouaW1hZ2VaKX1lbHNlIFoubW91c2VQYW4mJmEuejI3NCgpO2JvJiYoWi5Ub29sYmFyRGlzcGxheSYmWi50b29sYmFyVmlzaWJsZT4xJiZaLlRvb2xiYXIuc2hvdyghMSksWi5OYXZpZ2F0b3JEaXNwbGF5JiZaLm5hdmlnYXRvclZpc2libGU+MSYmWi5OYXZpZ2F0b3Iuc2V0VmlzaWJpbGl0eSghMSkpfWZ1bmN0aW9uIGRuKGEpe3ZhciBiPVouVXRpbHMuejIyNShaLlV0aWxzLnRhcmdldChhKSksYz1aLlV0aWxzLnoyMjUoWi5VdGlscy5yZWxhdGVkVGFyZ2V0KFouVXRpbHMuZXZlbnQoYSkpKTtpZighYnx8IWMpaWYoIWJuKVouVG9vbGJhckRpc3BsYXkmJloudG9vbGJhclZpc2libGU+MSYmWi5Ub29sYmFyLnNob3coITEpLFouTmF2aWdhdG9yRGlzcGxheSYmWi5uYXZpZ2F0b3JWaXNpYmxlPjEmJlouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITEpO2Vsc2V7dmFyIGQ9Wi5VdGlscy56MTgxKGEpO2JvPW5ldyBaLlV0aWxzLlBvaW50KGQueCxkLnkpfX1mdW5jdGlvbiBkcChhKXt2YXIgYj1aLlV0aWxzLnoxNzgoYSk7aWYoYiYmIWJwKXticj0hMTt2YXIgYz1iLnRhcmdldCxkPW5ldyBaLlV0aWxzLlBvaW50KGIucGFnZVgsYi5wYWdlWSk7YlA9bmV3IFouVXRpbHMuUG9pbnQoZC54LGQueSksaS5tb3VzZVhQcmlvcj1kLngsaS5tb3VzZVlQcmlvcj1kLnl9fWZ1bmN0aW9uIGRxKGIpe2IucHJldmVudERlZmF1bHQoKTtpZighWi5tb3VzZVBhbilyZXR1cm47dmFyIGM9Wi5VdGlscy56MTc4KGIpO2lmKGMmJiFicCYmIWJyKXt2YXIgZD1jLnRhcmdldCxlPW5ldyBaLlV0aWxzLlBvaW50KGMucGFnZVgsYy5wYWdlWSksZj1lLngtaS5tb3VzZVhQcmlvcixnPWUueS1pLm1vdXNlWVByaW9yO2lmKCFpc05hTihmKSYmIWlzTmFOKGcpKXt2YXIgaD1wYXJzZUZsb2F0KGsubGVmdCkrZixqPXBhcnNlRmxvYXQoay50b3ApK2csbD1jVShoLGopO2subGVmdD1sLngrInB4IixrLnRvcD1sLnkrInB4IixpLm1vdXNlWFByaW9yPWUueCxpLm1vdXNlWVByaW9yPWUueTtpZihaLk5hdmlnYXRvcil7dmFyIG09YS56MTQxKGwpO1ouTmF2aWdhdG9yLnoyNjNSZWN0YW5nbGVQb3NpdGlvbihtKX19fXJldHVybiExfWZ1bmN0aW9uIGRyKGIpe2lmKCFicCYmIWJyKXt2YXIgYz0hMSxkPVouVXRpbHMuejE3OChiKTtpZihkKXt2YXIgZT1kLnRhcmdldCxmPW5ldyBaLlV0aWxzLlBvaW50KGQucGFnZVgsZC5wYWdlWSksZz1uZXcgWi5VdGlscy5Qb2ludChmLngsZi55KSxoPU1hdGguc3FydChNYXRoLnBvdyhiUC54LWcueCwyKStNYXRoLnBvdyhiUC55LWcueSwyKSk7aWYoaDw0KXt2YXIgaT1hLnoxNzMoYixnLEEsQyk7Wi5jbGlja1pvb20/YS56MjkzVG9WaWV3KGkueCxpLnksaS56KTpaLmNsaWNrUGFuJiZhLnoyOTNUb1ZpZXcoaS54LGkueSxaLmltYWdlWil9ZWxzZSBjPSEwfWVsc2UgYz0hMDtjJiZaLm1vdXNlUGFuJiZhLnoyNzQoKX19ZnVuY3Rpb24gZHMoYil7aWYoIWJwJiYhYnIpe3ZhciBjPSExLGQ9Wi5VdGlscy56MTc4KGIpO2lmKGQpe3ZhciBlPWQudGFyZ2V0LGY9bmV3IFouVXRpbHMuUG9pbnQoZC5wYWdlWCxkLnBhZ2VZKSxnPW5ldyBaLlV0aWxzLlBvaW50KGYueCxmLnkpLGg9TWF0aC5zcXJ0KE1hdGgucG93KGJQLngtZy54LDIpK01hdGgucG93KGJQLnktZy55LDIpKTtpZihoPDQpe3ZhciBpPWEuejE3MyhiLGcsQSxDKTtaLmNsaWNrWm9vbT9hLnoyOTNUb1ZpZXcoaS54LGkueSxpLnopOlouY2xpY2tQYW4mJmEuejI5M1RvVmlldyhpLngsaS55LFouaW1hZ2VaKX1lbHNlIGM9ITB9ZWxzZSBjPSEwO2MmJloubW91c2VQYW4mJmEuejI3NCgpfX1mdW5jdGlvbiBkdChhKXt2YXIgYT1aLlV0aWxzLmV2ZW50KGEpO2R1KGEpLGJwfHwoYnA9d2luZG93LnNldEludGVydmFsKGR3LGJzKSl9ZnVuY3Rpb24gZHUoYSl7dmFyIGE9Wi5VdGlscy5ldmVudChhKTthLnByZXZlbnREZWZhdWx0KCksYnE9TWF0aC5yb3VuZChhLnNjYWxlKjEwMCkvMTAwfWZ1bmN0aW9uIGR2KGIpe2JwJiYod2luZG93LmNsZWFySW50ZXJ2YWwoYnApLGJyPSEwLGJwPW51bGwpLFoubW91c2VQYW4mJmEuejI3NCgpfWZ1bmN0aW9uIGR3KGEpe2lmKCFaLm1vdXNlUGFuKXJldHVybjt2YXIgYj1keChBLEQsYnEpLGM9Y1YoYik7YiE9Wi5pbWFnZVomJmRlKGMpfWZ1bmN0aW9uIGR4KGEsYixjKXt2YXIgZD1iKmMsZT1jQihhLGQpO3JldHVybiBlfWZ1bmN0aW9uIGR5KGIpe1ouZnVsbFBhZ2UmJihaLlRvb2xiYXJEaXNwbGF5JiZaLnRvb2xiYXJWaXNpYmxlPjEmJlouVG9vbGJhci5zaG93KCExKSxaLk5hdmlnYXRvckRpc3BsYXkmJloubmF2aWdhdG9yVmlzaWJsZT4xJiZaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCExKSxhLnRvZ2dsZUZ1bGxQYWdlVmlldyghMSksYS50b2dnbGVGdWxsUGFnZVZpZXcoITApLFouVG9vbGJhckRpc3BsYXkmJloudG9vbGJhclZpc2libGU+MSYmWi5Ub29sYmFyLnNob3coITApLFouTmF2aWdhdG9yRGlzcGxheSYmWi5uYXZpZ2F0b3JWaXNpYmxlPjEmJlouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITApKX1mdW5jdGlvbiBkeihiKXtpZighWi5rZXlzKXJldHVybjt2YXIgYj1aLlV0aWxzLmV2ZW50KGIpO3N3aXRjaChiLmtleUNvZGUpe2Nhc2UgOTA6YS56b29tKCJvdXQiKTticmVhaztjYXNlIDE3OmEuem9vbSgib3V0Iik7YnJlYWs7Y2FzZSA2NTphLnpvb20oImluIik7YnJlYWs7Y2FzZSAxNjphLnpvb20oImluIik7YnJlYWs7Y2FzZSAzNzphLnBhbigibGVmdCIpO2JyZWFrO2Nhc2UgMzg6YS5wYW4oInVwIik7YnJlYWs7Y2FzZSA0MDphLnBhbigiZG93biIpO2JyZWFrO2Nhc2UgMzk6YS5wYW4oInJpZ2h0Iik7YnJlYWs7Y2FzZSAyNzpaLmZ1bGxQYWdlP2EudG9nZ2xlRnVsbFBhZ2VWaWV3KCExKTphLnJlc2V0KCl9fWZ1bmN0aW9uIGRBKGIpe2lmKCFaLmtleXMpcmV0dXJuO3ZhciBiPVouVXRpbHMuZXZlbnQoYiksYz1iLmtleUNvZGU7Yz09OTB8fGM9PTE3fHxjPT02NXx8Yz09MTY/YS56b29tKCJzdG9wIik6Yz09Mzd8fGM9PTM5P2EucGFuKCJob3Jpem9udGFsU3RvcCIpOihjPT0zOHx8Yz09NDApJiZhLnBhbigidmVydGljYWxTdG9wIil9dmFyIGE9dGhpcyxiPSExLGM9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NjEiKSwxMCksZD1wYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejU5IikpLGU9ZC8yLGY9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NjIiKSwxMCksZz1aLnRvb2xiYXJWaXNpYmxlPT0xP1oudG9vbGJhckg6MCxoLGksayxsLG0sbixvLHAscSxyLHMsdCx1LHYsdyx4LHk7Y2coKTt2YXIgej0xLEE9MCxCPTAsQyxELEUsRj1bXSxHPVtdLEg9W10sST1bXSxKPVtdLEs9W10sTD1bXSxNPVtdLE49W10sTz1bXSxQPVtdLFE9W10sUj0wLFM9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NyIpLDEwKSxUPXBhcnNlSW50KFouVXRpbHMuejE4NSgiejYiKSwxMCksVT1wYXJzZUludChaLlV0aWxzLnoxODUoIno1IiksMTApLFY9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NCIpLDEwKSxXPXBhcnNlSW50KFouVXRpbHMuejE4NSgiejMiKSwxMCksWD1wYXJzZUludChaLlV0aWxzLnoxODUoIno0NSIpLDEwKSxZLCQsXyxiYSxiYixiYyxiZCxiZSxiZixiZyxiaCxiaSxiaixiayxibCxibTtZPVoudmlld2VyVywkPVoudmlld2VySCxfPWJhPTAsJC09ZyxaLnRvb2xiYXJQb3NpdGlvbj09MCYmKGJhKz1nKTt2YXIgYm49ITEsYm89bnVsbCxicD1udWxsLGJxPW51bGwsYnI9ITEsYnM9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6MjQiKSwxMCksYnQ9cGFyc2VGbG9hdChaLlV0aWxzLnoxODUoIno4MSIpKSpaLnpvb21TcGVlZDtaLm1vYmlsZURldmljZSYmKGJ0Lz0yKTt2YXIgYnU9TWF0aC5yb3VuZChwYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejQ3IikpKloucGFuU3BlZWQpLGJ2PTAsYnc9MCxieD0wLGJ5PTAsYno9MCxiQT1wYXJzZUludChaLlV0aWxzLnoxODUoIno3NyIpLDEwKSxiQixiQyxiRCxiRT1wYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejE5IikpKlouZmFkZUluU3BlZWQsYkYsYkc9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NzgiKSwxMCksYkg9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NzkiKSwxMCksYkk9YkcvYkgsYkosYkssYkwsYk0sYk4sYk8sYlAsYlEsYlIsYlMsYlQsYlUsYlYsYlcsYlgsYlk7aWYoWi5VdGlscy5pc1N0clZhbChaLndhdGVybWFya1BhdGgpKXZhciBiWixiJCxiXz1bXSxjYT1bXTtjaChZLCQsXyxiYSk7dmFyIGNiPW5ldyBaLnoxMDEsY2M9Wi5VdGlscy56MTQwKFouaW1hZ2VQYXRoKyIvIisiSW1hZ2VQcm9wZXJ0aWVzLnhtbCIpO2NiLmxvYWRYTUwoY2MpLHRoaXMuejIwNj1mdW5jdGlvbihhLGIpe1ouaW1hZ2VXPWEsWi5pbWFnZUg9YixjaSgpLGNqKCksRT1jQyhCLFouaW5pdGlhbFopLEM9Y0MoQSxaLmluaXRpYWxaKSxEPUMsWi51c2VDYW52YXMmJnMuc2NhbGUoQyxDKSx1JiZjVygpLGNrKCksYyQoWi5pbml0aWFsWCxaLmluaXRpYWxZLFouaW5pdGlhbFopLGRpKCksY2YoITApLFouVmlld2VyLnoxNDgoKX0sdGhpcy5yZXoyMDY9ZnVuY3Rpb24oYSxiKXtjZighMSksY2QoKSxaLmltYWdlVz1hLFouaW1hZ2VIPWIsY2koKSxjaigpLEU9Y0MoQixaLmluaXRpYWxaKSxDPWNDKEEsWi5pbml0aWFsWiksRD1DLFoudXNlQ2FudmFzJiYocy5yZXN0b3JlKCkscy5zY2FsZShDLEMpKSxjaygpLGNoKFksJCxfLGJhKSxtJiZjdChtKSxxJiZjdChxKSx1JiZjdCh1KSxjJChaLmluaXRpYWxYLFouaW5pdGlhbFksWi5pbml0aWFsWiksY2YoITApLFoubmF2aWdhdG9yVmlzaWJsZT4wJiZaLk5hdmlnYXRvci5zZXRJbWFnZVBhdGgoWi5pbWFnZVBhdGgpfSx0aGlzLnoxODA9ZnVuY3Rpb24oKXtyZXR1cm4gY2UoKX0sdGhpcy56MjAxPWZ1bmN0aW9uKCl7cmV0dXJuIGJifSx0aGlzLnoxNzk9ZnVuY3Rpb24oKXtyZXR1cm4gYmN9LHRoaXMuejE4Nj1mdW5jdGlvbigpe3JldHVybiB6fSx0aGlzLnoxOTU9ZnVuY3Rpb24oKXtyZXR1cm4gY30sdGhpcy56MTg3PWZ1bmN0aW9uKCl7cmV0dXJuIEF9LHRoaXMuejE4OT1mdW5jdGlvbigpe3JldHVybiBDfSx0aGlzLnoxODlBc1pvb209ZnVuY3Rpb24oKXt2YXIgYT1jQihBLEMpO3JldHVybiBhfSx0aGlzLnoxOTQ9ZnVuY3Rpb24oKXtyZXR1cm4gZH0sdGhpcy56MTkzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LHRoaXMuejE5Nz1mdW5jdGlvbigpe3JldHVybiBmfSx0aGlzLnoxOTI9ZnVuY3Rpb24oKXtyZXR1cm4gSC5qb2luKCIsIil9LHRoaXMuejE4OD1mdW5jdGlvbigpe3JldHVybiBJLmpvaW4oIiwgIil9LHRoaXMuejE5MT1mdW5jdGlvbigpe3JldHVybiBMLmpvaW4oIiwgIil9LHRoaXMuejE5Nj1mdW5jdGlvbigpe3ZhciBhPU4uam9pbigiLCAiKT09IiI/IkN1cnJlbnQgdmlldyBsb2FkaW5nIGNvbXBsZXRlIjpOLmpvaW4oIiwgIik7cmV0dXJuIGF9LHRoaXMuc2V0U2l6ZUFuZFBvc2l0aW9uPWZ1bmN0aW9uKGEsYixjLGQpe2NoKGEsYixjLGQpfSx0aGlzLnoyNzQ9ZnVuY3Rpb24oYSl7aWYoQyE9RHx8Wi5pbWFnZVohPWJ6fHxwYXJzZUZsb2F0KGsubGVmdCkhPWJmfHxwYXJzZUZsb2F0KGsudG9wKSE9Ymh8fGEpe2NuKCksYno9Y0IoQSxDKTt2YXIgYz0hMTtpZihDIT1EfHxaLmltYWdlWiE9Ynp8fCFifHxhKVouaW1hZ2VaPGJ6JiYhYSYmKGM9ITApLGNvKCksY3AoKSxjcihtLEIsRiwhMSwhMSk7Y3EoKSxjcihxLEEsTywhMCxjKSxjcyhOLGNMLDApLGN1KCksY3YoKX19LHRoaXMuc2V0Vmlldz1mdW5jdGlvbihhLGIsYyl7aWYoYT09dW5kZWZpbmVkfHxhPT1udWxsKWE9Wi5pbWFnZVcvMjtpZihiPT11bmRlZmluZWR8fGI9PW51bGwpYj1aLmltYWdlSC8yO2M9PXVuZGVmaW5lZHx8Yz09bnVsbD9jPVouZml0WjpjPjEmJihjPWMvMTAwKSxjJChhLGIsYyl9LHRoaXMuem9vbT1mdW5jdGlvbihiKXtzd2l0Y2goYil7Y2FzZSJvdXQiOmJ4Pj0wJiYoYngtPWJ0KTticmVhaztjYXNlImluIjpieDw9MCYmKGJ4Kz1idCk7YnJlYWs7Y2FzZSJzdG9wIjpieD0wfVouem9vbWluZz1ieD09MD8ic3RvcCI6Yng+MD8iaW4iOiJvdXQiLGJ4IT0wP2JCfHwoKGJ4PDAmJlouaW1hZ2VaPloubWluWnx8Yng+MCYmWi5pbWFnZVo8Wi5tYXhaKSYmYS56MjczKCExKSxaLnVzZUNhbnZhc3x8Y3QodSksYkI9d2luZG93LnNldFRpbWVvdXQoY18sYkEpKTooYS56MjkzQWxsU3RvcCgpLGEuejI3MyghMCkpfSx0aGlzLnBhbj1mdW5jdGlvbihiKXtzd2l0Y2goYil7Y2FzZSJsZWZ0Ijpidjw9MCYmKGJ2Kz1idSk7YnJlYWs7Y2FzZSJ1cCI6Ync8PTAmJihidys9YnUpO2JyZWFrO2Nhc2UiZG93biI6Ync+PTAmJihidy09YnUpO2JyZWFrO2Nhc2UicmlnaHQiOmJ2Pj0wJiYoYnYtPWJ1KTticmVhaztjYXNlImhvcml6b250YWxTdG9wIjpidj0wO2JyZWFrO2Nhc2UidmVydGljYWxTdG9wIjpidz0wO2JyZWFrO2Nhc2Uic3RvcCI6YnY9MCxidz0wfVoucGFubmluZ1g9YnY9PTA/InN0b3AiOmJ2PjA/ImxlZnQiOiJyaWdodCIsWi5wYW5uaW5nWT1idz09MD8ic3RvcCI6Ync+MD8idXAiOiJkb3duIixiQz1aLmltYWdlWCpjQihBLDEpLGJEPVouaW1hZ2VZKmNCKEEsMSksYnYhPTB8fGJ3IT0wP2JCfHwoYS56MjczKCEwKSxaLnVzZUNhbnZhc3x8Y3QodSksYkI9d2luZG93LnNldFRpbWVvdXQoY18sYkEpKTooYS56MjkzQWxsU3RvcCgpLGEuejI3MyghMCkpfSx0aGlzLnoyOTNUb1ZpZXc9ZnVuY3Rpb24oYixjLGQpe2EuejI5M0FsbFN0b3AoKTt2YXIgZT1jRihiLGMpLGY9YmQtZS54LGc9YmUtZS55LGg9Y0MoQSxkKSxpPWNDKEIsZCksaj1wYXJzZUZsb2F0KGsubGVmdCkrZixsPXBhcnNlRmxvYXQoay50b3ApK2csbT1oLUMsbj1pLUU7Yko9ai9iSSxiSz1sL2JJLGJMPW0vYkksYk09bi9iSSxhLnoyNzMoITEpLGJPPTAsYk49d2luZG93LnNldFRpbWVvdXQoZGEsYkgpfSx0aGlzLnoyOTNBbGxTdG9wPWZ1bmN0aW9uKGIpe2RjKCksZGQoKSxifHxhLnoyNzQoKX0sdGhpcy56MjQ1PWZ1bmN0aW9uKGEpe3ZhciBiPWRlKGEpO2ImJihjWSgpLGN2KCkpfSx0aGlzLnJlc2V0PWZ1bmN0aW9uKCl7YS56MjkzVG9WaWV3KFouaW5pdGlhbFgsWi5pbml0aWFsWSxaLmluaXRpYWxaKX0sdGhpcy50b2dnbGVGdWxsUGFnZVZpZXdFeHRlcm5hbD1mdW5jdGlvbigpe2JZPSEwLGEudG9nZ2xlRnVsbFBhZ2VWaWV3KCl9LHRoaXMudG9nZ2xlRnVsbFBhZ2VWaWV3PWZ1bmN0aW9uKGIpe2EuejI5M0FsbFN0b3AoKSxaLmZ1bGxQYWdlPWI/YjohWi5mdWxsUGFnZTt2YXIgYz1kb2N1bWVudC5ib2R5LGQ9Yy5zdHlsZSxlPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSxmPVouVmlld2VyRGlzcGxheS5zdHlsZSxnPW51bGwsaD1udWxsO2lmKFouZnVsbFBhZ2Upe2JRPWQud2lkdGgsYlI9ZC5oZWlnaHQsYlM9ZC5vdmVyZmxvdyxiVD1lLm92ZXJmbG93LGJVPWYuYmFja2dyb3VuZENvbG9yLGJWPWYucG9zaXRpb24sYlc9Zi56SW5kZXg7dmFyIGk7Wi5tb2JpbGVEZXZpY2U/KGk9Wi5VdGlscy56MjAxaW5kb3dTaXplKCksZC53aWR0aD1pLngsZC5oZWlnaHQ9aS55KTooZC53aWR0aD0iMTAwJSIsZC5oZWlnaHQ9IjEwMCUiKSxkLm92ZXJmbG93PSJoaWRkZW4iLGUub3ZlcmZsb3c9ImhpZGRlbiIsZi5iYWNrZ3JvdW5kQ29sb3I9Wi5VdGlscy56MTg1KCJ6MjIiKSxmLnBvc2l0aW9uPSJmaXhlZCIsZi56SW5kZXg9Ijk5OTk5OTk5IixpPVouVXRpbHMuejIwMWluZG93U2l6ZSgpLGc9aS54LGg9aS55fWVsc2V7ZC53aWR0aD1iUSxkLmhlaWdodD1iUixkLm92ZXJmbG93PWJTLGUub3ZlcmZsb3c9YlQsZi5iYWNrZ3JvdW5kQ29sb3I9YlUsZi5wb3NpdGlvbj0icmVsYXRpdmUiLGYuekluZGV4PWJXO3ZhciBqPVouVXRpbHMuejE3NihaLnBhZ2VDb250YWluZXIpO2c9cGFyc2VGbG9hdChqLndpZHRoKSxoPXBhcnNlRmxvYXQoai5oZWlnaHQpLGlzTmFOKGcpJiYoZz1aLlZpZXdlckRpc3BsYXkuY2xpZW50V2lkdGgpLGlzTmFOKGgpJiYoaD1aLlZpZXdlckRpc3BsYXkuY2xpZW50SGVpZ2h0KSxiWT0hMX1aLnZpZXdlclc9ZyxaLnZpZXdlckg9aCxjaChnLGgpLGRmKGJZKTtpZihaLlRvb2xiYXJEaXNwbGF5JiZaLlRvb2xiYXIuejE4MCgpKXtaLnRvb2xiYXJDdXJyZW50Vz1aLnRvb2xiYXJXPT0tMT9nOloudG9vbGJhclc7dmFyIGw9Wi50b29sYmFyUG9zaXRpb249PTE/Wi52aWV3ZXJILVoudG9vbGJhckg6MDtaLlRvb2xiYXIuc2V0U2l6ZUFuZFBvc2l0aW9uKFoudG9vbGJhckN1cnJlbnRXLG51bGwsbnVsbCxsKX1aLk5hdmlnYXRvckRpc3BsYXkmJlouTmF2aWdhdG9yLnoxODAoKSYmWi5OYXZpZ2F0b3Iuc2V0U2l6ZUFuZFBvc2l0aW9uKFoubmF2aWdhdG9yVyxaLm5hdmlnYXRvckgsWi5uYXZpZ2F0b3JMLTEsWi5uYXZpZ2F0b3JULTEpLGNqKCksWi5pbWFnZVo9Y1YoWi5pbWFnZVopO2lmKFouY29uc3RyYWluUGFuKXt2YXIgbT1wYXJzZUZsb2F0KGsubGVmdCksbj1wYXJzZUZsb2F0KGsudG9wKSxvPWNVKG0sbik7ay5sZWZ0PW8ueCsicHgiLGsudG9wPW8ueSsicHgifWEuejI3NCghMCl9LHRoaXMuejI3MT1mdW5jdGlvbigpe3ZhciBhPVouVmlld2VyRGlzcGxheS5maXJzdENoaWxkLmNoaWxkTm9kZXNbMF0uc3R5bGU7YS5kaXNwbGF5PWEuZGlzcGxheT09Im5vbmUiPyJpbmxpbmUtYmxvY2siOiJub25lIn0sdGhpcy56MjcyPWZ1bmN0aW9uKCl7dmFyIGE9Wi5WaWV3ZXJEaXNwbGF5LmZpcnN0Q2hpbGQuY2hpbGROb2Rlc1sxXS5zdHlsZTthLmRpc3BsYXk9YS5kaXNwbGF5PT0ibm9uZSI/ImlubGluZS1ibG9jayI6Im5vbmUifSx0aGlzLnoyNzM9ZnVuY3Rpb24oYSl7aWYodil7dmFyIGI9YT9hOnYuZGlzcGxheSE9ImlubGluZS1ibG9jayI7di5kaXNwbGF5PWI/ImlubGluZS1ibG9jayI6Im5vbmUifX0sdGhpcy50b2dnbGVDb25zdHJhaW5QYW49ZnVuY3Rpb24oKXtaLmNvbnN0cmFpblBhbj0hWi5jb25zdHJhaW5QYW47aWYoWi5jb25zdHJhaW5QYW4pe3ZhciBiPXBhcnNlRmxvYXQoci5sZWZ0KSxjPXBhcnNlRmxvYXQoci50b3ApLGQ9Y1UoYixjKTtrLmxlZnQ9ZC54KyJweCIsay50b3A9ZC55KyJweCIsYS56Mjc0KCl9fSx0aGlzLnoxNzM9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9cGFyc2VGbG9hdChaLlV0aWxzLnoxODUoInoxMFRJRVJTS0lQVEhSRVNIT0xEIikpLGY9Y0QoYi54LGIueSksZz1jRShmLngsZi55KSxoPWNCKGMsZCk7cmV0dXJuIGEuYWx0S2V5PyhkPjErZT9oPWNCKGMsMSk6Yz4wJiYoaD1jQihjLTEsMSkpLGgtWi5maXRaPGUmJihoPVouZml0WikpOmQ8MS1lP2g9Y0IoYywxKTpjPHotMSYmKGg9Y0IoYysxLDEpKSxuZXcgWi5VdGlscy5Qb2ludDNEKGcueCxnLnksaCl9LHRoaXMuejI2Nz1mdW5jdGlvbihhLGIpe3ZhciBjPS0oYS1aLmltYWdlWCksZD0tKGItWi5pbWFnZVkpLGU9YypaLmltYWdlWixmPWQqWi5pbWFnZVosZz1lK2JmLGg9ZitiaCxpPWNVKGcsaCk7ay5sZWZ0PWkueCsicHgiLGsudG9wPWkueSsicHgifSx0aGlzLnoxNDE9ZnVuY3Rpb24oYSl7aWYoIWEpdmFyIGE9bmV3IFouVXRpbHMuUG9pbnQocGFyc2VGbG9hdChrLmxlZnQpLHBhcnNlRmxvYXQoay50b3ApKTt2YXIgYj1hLngtYmYsYz1hLnktYmgsZD1iL1ouaW1hZ2VaLGU9Yy9aLmltYWdlWixmPVouaW1hZ2VYLWQsZz1aLmltYWdlWS1lO3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChmLGcpfX0sWi56MTI0PWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIHUoKXt3aW5kb3cuY2xlYXJJbnRlcnZhbChxKSxxPW51bGw7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInByb2dyZXNzVGV4dEJveCIpLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQ7YSYmKGEubm9kZVZhbHVlPSIiKX1mdW5jdGlvbiB2KCl7cmV0dXJuIGN9ZnVuY3Rpb24gdyhhKXtjPWF9ZnVuY3Rpb24geChhLGIsYyxkKXthfHwoYT1aLnRvb2xiYXJWaXNpYmxlPjA/Wi50b29sYmFyQ3VycmVudFc6MCksYnx8KGI9Wi50b29sYmFyVmlzaWJsZT4wP2Y6MCksY3x8KGM9MCksZHx8KGQ9Wi50b29sYmFyUG9zaXRpb249PTE/Wi52aWV3ZXJILWY6MCk7dmFyIGU9Wi5Ub29sYmFyRGlzcGxheS5zdHlsZTtlLndpZHRoPWErInB4IixlLmhlaWdodD1iKyJweCIsZS5sZWZ0PWMrInB4IixlLnRvcD1kKyJweCIseShhLGIpfWZ1bmN0aW9uIHkoYSxiKXt2YXIgYz1hLGQ9YixlPXRvb2xiYXJTa2luU2l6ZXNbMl0sZj10b29sYmFyU2tpblNpemVzWzNdLGc9dG9vbGJhclNraW5TaXplc1s0XSxoPXRvb2xiYXJTa2luU2l6ZXNbNV0saT10b29sYmFyU2tpblNpemVzWzZdLGo9dG9vbGJhclNraW5TaXplc1s3XSxrPXRvb2xiYXJTa2luU2l6ZXNbOF0sbD10b29sYmFyU2tpblNpemVzWzldLG09dG9vbGJhclNraW5TaXplc1sxMF0sbj10b29sYmFyU2tpblNpemVzWzExXSxvPXRvb2xiYXJTa2luU2l6ZXNbMTJdLHA9dG9vbGJhclNraW5TaXplc1sxM10scT10b29sYmFyU2tpblNpemVzWzE0XSx1PXRvb2xiYXJTa2luU2l6ZXNbMTVdLHY9MCx3PShkLWYpLzIrMSx4PShkLWgpLzIseT0oZC1qKS8yLHo9eSoxLjMsQT15KzQsQj15KzIsQz1aLmxvZ29WaXNpYmxlPT0xPzA6ay8yLEQ9Wi5sb2dvVmlzaWJsZT09MT8wOmsvMixFPWstKGktZyksRj1aLmZ1bGxQYWdlVmlzaWJsZT84OjcsRz0yMCxIPUYqaysyKkU7Wi5zbGlkZXJWaXNpYmxlJiYoSCs9cCkscj1zPXQ9ITE7dmFyIEk9Wi5sb2dvVmlzaWJsZT09MT9lKzI6MCxKPVoudG9vbGJhclZpc2libGUhPTAmJloudG9vbGJhclZpc2libGUhPTE/azowLEs9SStKLEw9SytHK0grRytxO0w+YyYmKHI9ITAsTC1wPmMmJihzPSEwLEwtcC1xPmMmJih0PSEwLEs9MCkscT0wKSxILT1wKTt2YXIgTT1LKyhjLXEtSy1IKS8yLE49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJhY2tncm91bmQiKTtOLnN0eWxlLndpZHRoPWMrInB4IixOLmZpcnN0Q2hpbGQuc3R5bGUud2lkdGg9Yys0MDArInB4IixOLnN0eWxlLmhlaWdodD1kKyJweCIsTi5maXJzdENoaWxkLnN0eWxlLmhlaWdodD1kKyJweCI7dmFyIE89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvbkNvbnRhaW5lciIpO08uc3R5bGUud2lkdGg9SCtHKjIrInB4IixPLnN0eWxlLmhlaWdodD1kKyJweCIsTy5zdHlsZS5sZWZ0PU0tRysicHgiO3ZhciBQPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25CYWNrZ3JvdW5kIik7Wi5VdGlscy56MjAzKFAscGFyc2VGbG9hdChPLnN0eWxlLndpZHRoKSxwYXJzZUZsb2F0KE8uc3R5bGUuaGVpZ2h0KSksUC5zdHlsZS5sZWZ0PSIwcHgiO3ZhciBRPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0b29sYmFyTG9nbyIpO2lmKFEpe3ZhciBSPVEuc3R5bGU7aWYoUilpZighdCl7Ui5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLFouVXRpbHMuejIwMyhRLGUsZiksUi5sZWZ0PXYrInB4IixSLnRvcD13KyJweCIsdis9ZSsyO3ZhciBTPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsb2dvRGl2aWRlciIpO2lmKFMpe1ouVXRpbHMuejIwMyhTLGcsaCk7dmFyIFQ9Uy5zdHlsZTtULmxlZnQ9disicHgiLFQudG9wPXgrInB4In19ZWxzZSBSLmRpc3BsYXk9Im5vbmUifWlmKFoudG9vbGJhclZpc2libGUhPTAmJloudG9vbGJhclZpc2libGUhPTEpe3ZhciBVPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25NaW5pbWl6ZSIpLFY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvbkV4cGFuZCIpO2lmKFUmJlYpe3ZhciBXPVUuc3R5bGUsWD1WLnN0eWxlO1cmJlgmJih0PyhXLmRpc3BsYXk9Im5vbmUiLFguZGlzcGxheT0ibm9uZSIpOihXLmRpc3BsYXk9ImlubGluZS1ibG9jayIsWC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLFouVXRpbHMuejEzOChVLGksaiksWi5VdGlscy56MTM4KFYsaSxqKSxXLmxlZnQ9ditDKyJweCIsVy50b3A9eisicHgiLFgubGVmdD12K0QrInB4IixYLnRvcD16KyJweCIpKX19dj1HO3ZhciBZPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25ab29tT3V0Iik7Wi5VdGlscy56MTM4KFksaSxqKTt2YXIgJD1ZLnN0eWxlOyQubGVmdD12KyJweCIsJC50b3A9eSsicHgiLHYrPWs7dmFyIF89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRyYWNrU2xpZGVyIiksYmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblNsaWRlciIpO2lmKF8mJmJhKXt2YXIgYmI9Xy5zdHlsZSxiYz1iYS5zdHlsZTtiYiYmYmMmJihyPyhiYi5kaXNwbGF5PSJub25lIixiYy5kaXNwbGF5PSJub25lIik6KGJiLmRpc3BsYXk9ImlubGluZS1ibG9jayIsYmMuZGlzcGxheT0iaW5saW5lLWJsb2NrIixaLlV0aWxzLnoyMDMoXyxuLG8pLGJiLmxlZnQ9di0yKyJweCIsYmIudG9wPUErInB4IixaLlV0aWxzLnoxMzgoYmEsbCxtKSxiYy5sZWZ0PXBhcnNlRmxvYXQoYmIubGVmdCkrInB4IixiYy50b3A9QisicHgiLHYrPXApKX12YXIgYmQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblpvb21JbiIpO1ouVXRpbHMuejEzOChiZCxpLGopO3ZhciBiZT1iZC5zdHlsZTtiZS5sZWZ0PXYrInB4IixiZS50b3A9eSsicHgiLHYrPWsrMTt2YXIgYmY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBhbkRpdmlkZXIiKTtaLlV0aWxzLnoyMDMoYmYsZyxoKTt2YXIgYmc9YmYuc3R5bGU7YmcubGVmdD12KyJweCIsYmcudG9wPXgrInB4Iix2Kz1FO3ZhciBiaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uUGFuTGVmdCIpO1ouVXRpbHMuejEzOChiaCxpLGopO3ZhciBiaT1iaC5zdHlsZTtiaS5sZWZ0PXYrInB4IixiaS50b3A9eSsicHgiLHYrPWs7dmFyIGJqPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25QYW5VcCIpO1ouVXRpbHMuejEzOChiaixpLGopO3ZhciBiaz1iai5zdHlsZTtiay5sZWZ0PXYrInB4Iixiay50b3A9eSsicHgiLHYrPWs7dmFyIGJsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25QYW5Eb3duIik7Wi5VdGlscy56MTM4KGJsLGksaik7dmFyIGJtPWJsLnN0eWxlO2JtLmxlZnQ9disicHgiLGJtLnRvcD15KyJweCIsdis9azt2YXIgYm49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblBhblJpZ2h0Iik7Wi5VdGlscy56MTM4KGJuLGksaik7dmFyIGJvPWJuLnN0eWxlO2JvLmxlZnQ9disicHgiLGJvLnRvcD15KyJweCIsdis9azt2YXIgYnA9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblJlc2V0Iik7Wi5VdGlscy56MTM4KGJwLGksaik7dmFyIGJxPWJwLnN0eWxlO2JxLmxlZnQ9disicHgiLGJxLnRvcD15KyJweCIsdis9aysxO3ZhciBicj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZnVsbFBhZ2VEaXZpZGVyIik7aWYoYnIpe1ouVXRpbHMuejIwMyhicixnLGgpO3ZhciBicz1ici5zdHlsZTticy5sZWZ0PXYrInB4Iixicy50b3A9eCsicHgiLHYrPUU7dmFyIGJ0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25GdWxsUGFnZSIpO1ouVXRpbHMuejEzOChidCxpLGopO3ZhciBidT1idC5zdHlsZTtidS5sZWZ0PXYrInB4IixidS50b3A9eSsicHgifXZhciBidj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJvZ3Jlc3NUZXh0Qm94Iik7aWYoYnYpe3ZhciBidz1idi5zdHlsZTtidyYmKHM/YncuZGlzcGxheT0ibm9uZSI6KGJ3LmRpc3BsYXk9ImlubGluZS1ibG9jayIsYncud2lkdGg9cSsicHgiLGJ3LmhlaWdodD11KyJweCIsYncubGVmdD1jLXBhcnNlRmxvYXQoTy5zdHlsZS5sZWZ0KS1wYXJzZUZsb2F0KGJ3LndpZHRoKSsicHgiLGJ3LnRvcD0oZC1wYXJzZUZsb2F0KGJ3LmhlaWdodCkpLzIrInB4IikpfX1mdW5jdGlvbiB6KGEpe1oudG9vbGJhclZpc2libGU8NCYmIVoubW9iaWxlRGV2aWNlP0EoYSk6QighYSl9ZnVuY3Rpb24gQShhKXtnJiYoYT9nLmRpc3BsYXk9ImlubGluZS1ibG9jayI6Zy5kaXNwbGF5PSJub25lIil9ZnVuY3Rpb24gQihhKXtpZihnKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uQ29udGFpbmVyIiksYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYmFja2dyb3VuZCIpLGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvbk1pbmltaXplIiksZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uRXhwYW5kIiksZj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibG9nb0RpdmlkZXIiKSxoPTA7dHx8KGg9cGFyc2VGbG9hdChlLnN0eWxlLmxlZnQpK3BhcnNlRmxvYXQoZS5zdHlsZS53aWR0aCkrNCk7dmFyIGk9Wi50b29sYmFyQ3VycmVudFc7YT8oYi5zdHlsZS5kaXNwbGF5PSJub25lIix0fHwoZiYmKGYuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZS5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSxnLndpZHRoPWgrInB4IixjLnN0eWxlLndpZHRoPWgrInB4Iik6KGIuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIix0fHwoZiYmKGYuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIiksZC5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLGUuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGcud2lkdGg9aSsicHgiLGMuc3R5bGUud2lkdGg9aSsicHgiKX19ZnVuY3Rpb24gQyhhKXtpZihaLnNsaWRlclZpc2libGUpe2h8fChoPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0cmFja1NsaWRlciIpKSxpfHwoaT1oLnN0eWxlKSxqfHwoaj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uU2xpZGVyIikpLGt8fChrPWouc3R5bGUpO2lmKGkmJmspe3ZhciBiPVoubWF4Wi1aLm1pblosYz0oYS1aLm1pblopL2I7dHJhY2tMPXBhcnNlRmxvYXQoaS5sZWZ0KSx0cmFja1I9cGFyc2VGbG9hdChpLmxlZnQpK3BhcnNlRmxvYXQoaS53aWR0aCktcGFyc2VGbG9hdChrLndpZHRoKTt2YXIgZD10cmFja1ItdHJhY2tMLGU9YypkK3RyYWNrTDtrLmxlZnQ9ZSsicHgifX19ZnVuY3Rpb24gRChiKXtofHwoaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidHJhY2tTbGlkZXIiKSksaXx8KGk9aC5zdHlsZSk7aWYoaCYmaSl7dmFyIGMsZD1aLlV0aWxzLnoxNzQoaCk7Wi5tb2JpbGVEZXZpY2U/Yz1aLlV0aWxzLnoxODEoYikueC1kLng6Yz1iLmNsaWVudFgtZC54O3ZhciBlPUgoYywwLHBhcnNlRmxvYXQoaS53aWR0aCkpO2U8Wi5taW5aKy4xJiYoZT1aLm1pblopLGU+Wi5tYXhaLS4xJiYoZT1aLm1heFopLGEuejI0NShlKSxhLnoyNzQoKX19ZnVuY3Rpb24gRShhKXtuPSEwLGp8fChqPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25TbGlkZXIiKSk7aWYoail7dmFyIGI9Wi5VdGlscy56MTgxKGEpO2oubW91c2VYUHJpb3I9Yi54LGoubW91c2VZUHJpb3I9Yi55fX1mdW5jdGlvbiBGKGIpe2h8fChoPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0cmFja1NsaWRlciIpKSxpfHwoaT1oLnN0eWxlKSxqfHwoaj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uU2xpZGVyIikpLGt8fChrPWouc3R5bGUpO2lmKGkmJmomJmspe3RyYWNrTD1wYXJzZUZsb2F0KGkubGVmdCksdHJhY2tSPXBhcnNlRmxvYXQoaS5sZWZ0KStwYXJzZUZsb2F0KGkud2lkdGgpLXBhcnNlRmxvYXQoay53aWR0aCk7dmFyIGM9cGFyc2VGbG9hdChrLmxlZnQpKyhwLngtai5tb3VzZVhQcmlvcik7Yzx0cmFja0w/Yz10cmFja0w6Yz50cmFja1I/Yz10cmFja1I6ai5tb3VzZVhQcmlvcj1wLngsay5sZWZ0PWMrInB4Ijt2YXIgZD1IKGMsdHJhY2tMLHRyYWNrUik7YS56MjQ1KGQpfX1mdW5jdGlvbiBHKCl7bj0hMSxhLnoyNzQoKX1mdW5jdGlvbiBIKGEsYixjKXt2YXIgZD1jLWIsZT0oYS1iKS9kLGY9Wi5tYXhaLVoubWluWixnPVoubWluWitmKmU7cmV0dXJuIGd9ZnVuY3Rpb24gSShhKXt2YXIgYT1aLlV0aWxzLmV2ZW50KGEpLGI9Wi5VdGlscy5yZWxhdGVkVGFyZ2V0KFouVXRpbHMuZXZlbnQoYSkpO2lmKCFuJiZiKXt2YXIgYz1iLnBhcmVudE5vZGU7SyhjKX19ZnVuY3Rpb24gSihhKXtaLm1vYmlsZURldmljZSYmYS5wcmV2ZW50RGVmYXVsdCgpO3ZhciBhPVouVXRpbHMuZXZlbnQoYSksYj1aLlV0aWxzLnRhcmdldChhKSxjPVouVXRpbHMucmVsYXRlZFRhcmdldChhKTtpZihiKXt2YXIgZD1iLnBhcmVudE5vZGU7ZCYmKHRhcmdldFBhcmVudElEPWQuaWQpfWlmKGMpe3ZhciBlPWMucGFyZW50Tm9kZTtlJiYocmVsYXRlZFRhcmdldFBhcmVudElEPWUuaWQpfWlmKCFufHxhLnR5cGU9PSJtb3VzZXVwInx8YS50eXBlPT0idG91Y2hlbmQifHxhLnR5cGU9PSJ0b3VjaGNhbmNlbCIpTigpLGImJiFaLlV0aWxzLmlzUmlnaHRNb3VzZUJ1dHRvbihhKSYmKHRhcmdldFBhcmVudElEJiZ0YXJnZXRQYXJlbnRJRCE9InRyYWNrU2xpZGVyIiYmYS50eXBlIT0ibW91c2Vtb3ZlIiYmKE8oYSksUChhKSksUShhKSl9ZnVuY3Rpb24gSyhiKXthJiZhLnoyOTNBbGxTdG9wKCksYi5pZCYmYi5pZC5pbmRleE9mKCJidXR0b24iKSE9LTE/KEwoYiksTShiKSk6Yi5pZCYmYi5pZC5pbmRleE9mKCJiYWNrZ3JvdW5kIikhPS0xJiZOKCl9ZnVuY3Rpb24gTChhKXtaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSwibW91c2Vkb3duIixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSwibW91c2V1cCIsSiksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGEsIm1vdXNlb3V0IixKKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoYSwibW91c2VvdmVyIixKKX1mdW5jdGlvbiBNKGEpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuX2ltZ1VwSUQpLGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5faW1nT3ZlcklEKSxkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuX2ltZ0Rvd25JRCk7YiYmKGIuc3R5bGUudmlzaWJpbGl0eT0idmlzaWJsZSIpLGMmJihjLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIpLGQmJihkLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIpfWZ1bmN0aW9uIE4oKXt2YXIgYT1aLlRvb2xiYXJEaXNwbGF5LmNoaWxkTm9kZXMsYj1udWxsO2Zvcih2YXIgYz0wLGQ9YS5sZW5ndGg7YzxkO2MrKyl7Yj1hW2NdO2lmKGIuaWQmJmIuaWQuaW5kZXhPZigiYnV0dG9uIikhPS0xKWlmKGIuaWQhPSJidXR0b25Db250YWluZXIiKUwoYiksTShiKTtlbHNle3ZhciBlPWIuY2hpbGROb2RlcyxmPW51bGw7Zm9yKHZhciBnPTAsaD1lLmxlbmd0aDtnPGg7ZysrKWY9ZVtnXSxmLmlkJiZmLmlkLmluZGV4T2YoImJ1dHRvbiIpIT0tMSYmKEwoZiksTShmKSl9fX1mdW5jdGlvbiBPKGEpe3ZhciBiPVouVXRpbHMudGFyZ2V0KGEpO2lmKGIpe3ZhciBjPWIucGFyZW50Tm9kZTtjJiYoWi5tb2JpbGVEZXZpY2U/KFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihjLCJ0b3VjaHN0YXJ0IixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywidG91Y2hlbmQiLEopLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihjLCJ0b3VjaGNhbmNlbCIsSikpOihaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywibW91c2VvdmVyIixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywibW91c2Vkb3duIixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywibW91c2V1cCIsSiksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGMsIm1vdXNlb3V0IixKKSkpfX1mdW5jdGlvbiBQKGEpe3ZhciBiPVouVXRpbHMudGFyZ2V0KGEpO2lmKGIpe3ZhciBjPVouVXRpbHMudGFyZ2V0KGEpLnBhcmVudE5vZGU7aWYoYylpZighYy5faW1nVXBJRClLKGMpO2Vsc2V7dmFyIGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYy5faW1nVXBJRCksZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChjLl9pbWdPdmVySUQpLGY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYy5faW1nRG93bklEKTtpZihkJiZlJiZmKXt2YXIgZz1kLnN0eWxlLGg9ZS5zdHlsZSxpPWYuc3R5bGU7Zy52aXNpYmlsaXR5PSJoaWRkZW4iLGgudmlzaWJpbGl0eT0iaGlkZGVuIixpLnZpc2liaWxpdHk9ImhpZGRlbiI7c3dpdGNoKGEudHlwZSl7Y2FzZSJtb3VzZW92ZXIiOmgudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJtb3VzZWRvd24iOmkudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJtb3VzZW1vdmUiOmkudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJtb3VzZXVwIjpoLnZpc2liaWxpdHk9InZpc2libGUiO2JyZWFrO2Nhc2UibW91c2VvdXQiOmcudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJ0b3VjaHN0YXJ0IjppLnZpc2liaWxpdHk9InZpc2libGUiO2JyZWFrO2Nhc2UidG91Y2hlbmQiOmcudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJ0b3VjaGNhbmNlbCI6Zy52aXNpYmlsaXR5PSJ2aXNpYmxlIn19fX19ZnVuY3Rpb24gUShjKXt2YXIgZD1aLlV0aWxzLnRhcmdldChjKS5wYXJlbnROb2RlO2lmKGQpe3ZhciBlPWQuaWQ7c3dpdGNoKGMudHlwZSl7Y2FzZSJtb3VzZW92ZXIiOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkLCJtb3VzZWRvd24iLEopO2JyZWFrO2Nhc2UibW91c2Vkb3duIjpaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZCwibW91c2V1cCIsSik7aWYoYSlzd2l0Y2goZSl7Y2FzZSJidXR0b25NaW5pbWl6ZSI6Yi56MjE1KCEwKSxaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCExKTticmVhaztjYXNlImJ1dHRvbkV4cGFuZCI6Yi56MjE1KCExKSxaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCEwKTticmVhaztjYXNlImJ1dHRvblpvb21PdXQiOmEuem9vbSgib3V0Iik7YnJlYWs7Y2FzZSJidXR0b25TbGlkZXIiOkUoYyksUihjKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNlbW92ZSIsUiksb3x8KG89d2luZG93LnNldEludGVydmFsKEYsbSkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsSik7YnJlYWs7Y2FzZSJ0cmFja1NsaWRlciI6RChjKTticmVhaztjYXNlImJ1dHRvblpvb21JbiI6YS56b29tKCJpbiIpO2JyZWFrO2Nhc2UiYnV0dG9uUGFuTGVmdCI6YS5wYW4oImxlZnQiKTticmVhaztjYXNlImJ1dHRvblBhblVwIjphLnBhbigidXAiKTticmVhaztjYXNlImJ1dHRvblBhbkRvd24iOmEucGFuKCJkb3duIik7YnJlYWs7Y2FzZSJidXR0b25QYW5SaWdodCI6YS5wYW4oInJpZ2h0Iik7YnJlYWs7Y2FzZSJidXR0b25SZXNldCI6YS5yZXNldCgpfWJyZWFrO2Nhc2UibW91c2V1cCI6Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsIm1vdXNlZG93biIsSiksYSYmKGU9PSJidXR0b25TbGlkZXIifHxuPyhvJiYod2luZG93LmNsZWFySW50ZXJ2YWwobyksbz1udWxsKSxHKCksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZW1vdmUiLFIpLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsSiksTigpKTplPT0iYnV0dG9uWm9vbU91dCJ8fGU9PSJidXR0b25ab29tSW4iP2Euem9vbSgic3RvcCIpOmU9PSJidXR0b25QYW5MZWZ0Inx8ZT09ImJ1dHRvblBhblJpZ2h0Ij9hLnBhbigiaG9yaXpvbnRhbFN0b3AiKTplPT0iYnV0dG9uUGFuVXAifHxlPT0iYnV0dG9uUGFuRG93biI/YS5wYW4oInZlcnRpY2FsU3RvcCIpOmU9PSJidXR0b25GdWxsUGFnZSImJmEudG9nZ2xlRnVsbFBhZ2VWaWV3KCkpO2JyZWFrO2Nhc2UibW91c2VvdXQiOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkLCJtb3VzZW92ZXIiLEopLGEmJihlPT0iYnV0dG9uWm9vbU91dCJ8fGU9PSJidXR0b25ab29tSW4iP2Euem9vbSgic3RvcCIpOmU9PSJidXR0b25QYW5MZWZ0Inx8ZT09ImJ1dHRvblBhblJpZ2h0Ij9hLnBhbigiaG9yaXpvbnRhbFN0b3AiKTooZT09ImJ1dHRvblBhblVwInx8ZT09ImJ1dHRvblBhbkRvd24iKSYmYS5wYW4oInZlcnRpY2FsU3RvcCIpKTticmVhaztjYXNlInRvdWNoc3RhcnQiOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkLCJ0b3VjaGVuZCIsSiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsInRvdWNoY2FuY2VsIixKKTtpZihhKXN3aXRjaChlKXtjYXNlImJ1dHRvbk1pbmltaXplIjpiLnoyMTUoITApLFouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITEpO2JyZWFrO2Nhc2UiYnV0dG9uRXhwYW5kIjpiLnoyMTUoITEpLFouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITApO2JyZWFrO2Nhc2UiYnV0dG9uWm9vbU91dCI6YS56b29tKCJvdXQiKTticmVhaztjYXNlImJ1dHRvblNsaWRlciI6RShjKSxTKGMpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwidG91Y2htb3ZlIixTKSxvfHwobz13aW5kb3cuc2V0SW50ZXJ2YWwoRixtKSksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsInRvdWNoZW5kIixKKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZCwidG91Y2hjYW5jZWwiLEopO2JyZWFrO2Nhc2UidHJhY2tTbGlkZXIiOkQoYyk7YnJlYWs7Y2FzZSJidXR0b25ab29tSW4iOmEuem9vbSgiaW4iKTticmVhaztjYXNlImJ1dHRvblBhbkxlZnQiOmEucGFuKCJsZWZ0Iik7YnJlYWs7Y2FzZSJidXR0b25QYW5VcCI6YS5wYW4oInVwIik7YnJlYWs7Y2FzZSJidXR0b25QYW5Eb3duIjphLnBhbigiZG93biIpO2JyZWFrO2Nhc2UiYnV0dG9uUGFuUmlnaHQiOmEucGFuKCJyaWdodCIpO2JyZWFrO2Nhc2UiYnV0dG9uUmVzZXQiOmEucmVzZXQoKX1icmVhaztjYXNlInRvdWNoZW5kIjpaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZCwidG91Y2hzdGFydCIsSiksYSYmKGU9PSJidXR0b25ab29tT3V0Inx8ZT09ImJ1dHRvblpvb21JbiI/KGEuem9vbSgic3RvcCIpLFouZGVidWcmJmU9PSJidXR0b25ab29tT3V0IiYmYy5hbHRLZXkmJlouVXRpbHMuejI1MygpKTplPT0iYnV0dG9uU2xpZGVyIj8obyYmKHdpbmRvdy5jbGVhckludGVydmFsKG8pLG89bnVsbCksRygpLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwidG91Y2htb3ZlIixTKSk6ZT09ImJ1dHRvblBhbkxlZnQifHxlPT0iYnV0dG9uUGFuUmlnaHQiP2EucGFuKCJob3Jpem9udGFsU3RvcCIpOmU9PSJidXR0b25QYW5VcCJ8fGU9PSJidXR0b25QYW5Eb3duIj9hLnBhbigidmVydGljYWxTdG9wIik6ZT09ImJ1dHRvbkZ1bGxQYWdlIiYmYS50b2dnbGVGdWxsUGFnZVZpZXcoKSk7YnJlYWs7Y2FzZSJ0b3VjaGNhbmNlbCI6Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsInRvdWNoc3RhcnQiLEopLGEmJihlPT0iYnV0dG9uWm9vbU91dCJ8fGU9PSJidXR0b25ab29tSW4iPyhhLnpvb20oInN0b3AiKSxaLmRlYnVnJiZlPT0iYnV0dG9uWm9vbU91dCImJmMuYWx0S2V5JiZaLlV0aWxzLnoyNTMoKSk6ZT09ImJ1dHRvblNsaWRlciI/KG8mJih3aW5kb3cuY2xlYXJJbnRlcnZhbChvKSxvPW51bGwpLEcoKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsInRvdWNobW92ZSIsUykpOmU9PSJidXR0b25QYW5MZWZ0Inx8ZT09ImJ1dHRvblBhblJpZ2h0Ij9hLnBhbigiaG9yaXpvbnRhbFN0b3AiKTplPT0iYnV0dG9uUGFuVXAifHxlPT0iYnV0dG9uUGFuRG93biI/YS5wYW4oInZlcnRpY2FsU3RvcCIpOmU9PSJidXR0b25GdWxsUGFnZSImJmEudG9nZ2xlRnVsbFBhZ2VWaWV3KCkpfX19ZnVuY3Rpb24gUihhKXtwPW5ldyBaLlV0aWxzLlBvaW50KGEuY2xpZW50WCxhLmNsaWVudFkpfWZ1bmN0aW9uIFMoYSl7dmFyIGI9Wi5VdGlscy56MTc4KGEpO2lmKGIpe3ZhciBjPWIudGFyZ2V0O3A9bmV3IFouVXRpbHMuUG9pbnQoYi5wYWdlWCxiLnBhZ2VZKX19dmFyIGI9dGhpcyxjPSExLGQ9bmV3IFouejEwMTtaLnNraW5QYXRoPVouVXRpbHMuejI0MyhaLnNraW5QYXRoKTt2YXIgZT1aLnNraW5QYXRoKyIvIjtkLmxvYWRYTUwoWi5za2luUGF0aCsiLyIrWi5VdGlscy56MTg1KCJ6NTUiKSk7dmFyIGYsZyxoLGksaixrLGw9W10sbT1wYXJzZUludChaLlV0aWxzLnoxODUoIno1NyIpLDEwKSxuPSExLG89bnVsbCxwPW51bGwscT1udWxsLHIscyx0O3RoaXMuejIwNT1mdW5jdGlvbihhLGIpe1ouVG9vbGJhckRpc3BsYXk9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJUb29sYmFyRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIiwiMXB4IiwiMXB4IiwiMHB4IiwiMXB4Iiwibm9uZSIsIjBweCIsInRyYW5zcGFyZW50IG5vbmUiLCIwcHgiLCIwcHgiLCJkZWZhdWx0IiksZz1aLlRvb2xiYXJEaXNwbGF5LnN0eWxlO3ZhciBjPW5ldyBaLlV0aWxzLkdyYXBoaWMoImJhY2tncm91bmQiLGUsYlswXSwiMXB4IiwiMXB4IiwiMHB4IiwiMHB4Iik7Wi5Ub29sYmFyRGlzcGxheS5hcHBlbmRDaGlsZChjLmVsbXQpLHRvb2xiYXJTa2luU2l6ZXM9YTtpZihaLmxvZ29WaXNpYmxlKXt2YXIgZDtpZighWi5VdGlscy5pc1N0clZhbChaLmxvZ29DdXN0b21QYXRoKSlkPW5ldyBaLlV0aWxzLkdyYXBoaWMoInRvb2xiYXJMb2dvIixlLGJbMV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIpO2Vsc2V7dmFyIGg9Wi5VdGlscy56MTQwKFoubG9nb0N1c3RvbVBhdGgpO2Q9bmV3IFouVXRpbHMuR3JhcGhpYygidG9vbGJhckxvZ28iLGgsbnVsbCwiMXB4IiwiMXB4IiwiMXB4IiwiMXB4Iil9Wi5Ub29sYmFyRGlzcGxheS5hcHBlbmRDaGlsZChkLmVsbXQpO2lmKFoudG9vbGJhclZpc2libGU9PTB8fFoudG9vbGJhclZpc2libGU9PTEpe3ZhciBpPW5ldyBaLlV0aWxzLkdyYXBoaWMoImxvZ29EaXZpZGVyIixlLGJbMl0sIjFweCIsIjFweCIsIjFweCIsIjFweCIpO1ouVG9vbGJhckRpc3BsYXkuYXBwZW5kQ2hpbGQoaS5lbG10KX19dmFyIGo9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJidXR0b25Db250YWluZXIiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsInZpc2libGUiLCIxcHgiLCIxcHgiLCIwcHgiLCIwcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIsImRlZmF1bHQiKTtaLlRvb2xiYXJEaXNwbGF5LmFwcGVuZENoaWxkKGopLFoubW9iaWxlRGV2aWNlP1ouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihqLCJ0b3VjaHN0YXJ0IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KTooWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGosIm1vdXNlZG93biIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGosIm1vdXNlb3ZlciIsSSkpO3ZhciBrPW5ldyBaLlV0aWxzLkdyYXBoaWMoImJ1dHRvbkJhY2tncm91bmQiLGUsYlswXSwiMXB4IiwiMXB4IiwiMHB4IiwiMHB4Iik7ai5hcHBlbmRDaGlsZChrLmVsbXQpO2lmKFoudG9vbGJhclZpc2libGUhPTAmJloudG9vbGJhclZpc2libGUhPTF8fFoubW9iaWxlRGV2aWNlKXt2YXIgbD1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvbk1pbmltaXplIixudWxsLGUsYlszXSxiWzRdLGJbNV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejEwNyIpO1ouVG9vbGJhckRpc3BsYXkuYXBwZW5kQ2hpbGQobC5lbG10KTt2YXIgbT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvbkV4cGFuZCIsbnVsbCxlLGJbNl0sYls3XSxiWzhdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMDUiKTtaLlRvb2xiYXJEaXNwbGF5LmFwcGVuZENoaWxkKG0uZWxtdCl9dmFyIG49bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25ab29tT3V0IixudWxsLGUsYls5XSxiWzEwXSxiWzExXSwiMXB4IiwiMXB4IiwiMXB4IiwiMXB4IiwibW91c2VvdmVyIixKLCJ6MTIwIik7ai5hcHBlbmRDaGlsZChuLmVsbXQpO2lmKFouc2xpZGVyVmlzaWJsZSl7dmFyIG89bmV3IFouVXRpbHMuR3JhcGhpYygidHJhY2tTbGlkZXIiLGUsYlsxMl0sIjFweCIsIjFweCIsIjBweCIsIjBweCIpO2ouYXBwZW5kQ2hpbGQoby5lbG10KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoby5lbG10LCJtb3VzZWRvd24iLEopLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihvLmVsbXQsInRvdWNoc3RhcnQiLEopO3ZhciBwPW5ldyBaLlV0aWxzLkJ1dHRvbigiYnV0dG9uU2xpZGVyIixudWxsLGUsYlsxNF0sYlsxNV0sYlsxNl0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejExNCIpO2ouYXBwZW5kQ2hpbGQocC5lbG10KX12YXIgcT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvblpvb21JbiIsbnVsbCxlLGJbMTddLGJbMThdLGJbMTldLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMTkiKTtqLmFwcGVuZENoaWxkKHEuZWxtdCk7dmFyIHI9bmV3IFouVXRpbHMuR3JhcGhpYygicGFuRGl2aWRlciIsZSxiWzIwXSwiMXB4IiwiMXB4IiwiMXB4IiwiMXB4Iik7ai5hcHBlbmRDaGlsZChyLmVsbXQpO3ZhciBzPW5ldyBaLlV0aWxzLkJ1dHRvbigiYnV0dG9uUGFuTGVmdCIsbnVsbCxlLGJbMjFdLGJbMjJdLGJbMjNdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMDkiKTtqLmFwcGVuZENoaWxkKHMuZWxtdCk7dmFyIHQ9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25QYW5VcCIsbnVsbCxlLGJbMjRdLGJbMjVdLGJbMjZdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMTEiKTtqLmFwcGVuZENoaWxkKHQuZWxtdCk7dmFyIHU9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25QYW5Eb3duIixudWxsLGUsYlsyN10sYlsyOF0sYlsyOV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejEwOCIpO2ouYXBwZW5kQ2hpbGQodS5lbG10KTt2YXIgdj1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvblBhblJpZ2h0IixudWxsLGUsYlszMF0sYlszMV0sYlszMl0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejExMCIpO2ouYXBwZW5kQ2hpbGQodi5lbG10KTt2YXIgeT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvblJlc2V0IixudWxsLGUsYlszM10sYlszNF0sYlszNV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejExMiIpO2ouYXBwZW5kQ2hpbGQoeS5lbG10KTtpZihaLmZ1bGxQYWdlVmlzaWJsZSl7dmFyIEE9bmV3IFouVXRpbHMuR3JhcGhpYygiZnVsbFBhZ2VEaXZpZGVyIixlLGJbMzZdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiKTtqLmFwcGVuZENoaWxkKEEuZWxtdCk7dmFyIEI9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25GdWxsUGFnZSIsbnVsbCxlLGJbMzddLGJbMzhdLGJbMzldLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMTgiKTtqLmFwcGVuZENoaWxkKEIuZWxtdCl9aWYoWi5wcm9ncmVzc1Zpc2libGUpe3ZhciBEPVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2IiwicHJvZ3Jlc3NUZXh0Qm94IiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLEU9dG9vbGJhclNraW5TaXplc1sxNl0rInB4IjtqLmFwcGVuZENoaWxkKEQpO3ZhciBGPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFouVXRpbHMuejE4NSgiejUyIikpO0QuYXBwZW5kQ2hpbGQoWi5VdGlscy5jcmVhdGVDZW50ZXJlZEVsZW1lbnQoRikpLFouVXRpbHMuejI1MShGLCJibGFjayIsInZlcmRhbmEiLEUsIm5vbmUiLCJub3JtYWwiLCJub3JtYWwiLCJub3JtYWwiLCJub3JtYWwiLCIxZW0iLCJsZWZ0Iiwibm9uZSIpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihELCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5kaXNhYmxlVGV4dEludGVyYWN0aW9uKEYpfVouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChaLlRvb2xiYXJEaXNwbGF5KSxaLnRvb2xiYXJXPXRvb2xiYXJTa2luU2l6ZXNbMF0sWi50b29sYmFyQ3VycmVudFc9Wi50b29sYmFyVz09LTE/Wi52aWV3ZXJXOloudG9vbGJhclcsWi50b29sYmFySD1mPXRvb2xiYXJTa2luU2l6ZXNbMV07dmFyIEc9Wi50b29sYmFyUG9zaXRpb249PTE/Wi52aWV3ZXJILWY6MDt4KFoudG9vbGJhckN1cnJlbnRXLFoudG9vbGJhckgsMCxHKTtpZihaLlZpZXdwb3J0JiZaLlZpZXdwb3J0LnoxODAoKSl7dmFyIEg9Wi5WaWV3cG9ydC56MTg5QXNab29tKCk7QyhIKX16KFoudG9vbGJhclZpc2libGU9PTF8fFoudG9vbGJhclZpc2libGU9PTJ8fFoudG9vbGJhclZpc2libGU9PTQpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihaLlRvb2xiYXJEaXNwbGF5LCJtb3VzZW92ZXIiLFouVXRpbHMuc3RvcFByb3BhZ2F0aW9uKSx3KCEwKX0sdGhpcy56MTgwPWZ1bmN0aW9uKCl7cmV0dXJuIHYoKX0sdGhpcy5zZXRTaXplQW5kUG9zaXRpb249ZnVuY3Rpb24oYSxiLGMsZCl7eChhLGIsYyxkKX0sdGhpcy5zaG93PWZ1bmN0aW9uKGEpe3ooYSl9LHRoaXMuc2V0VmlzaWJpbGl0eT1mdW5jdGlvbihhKXtBKGEpfSx0aGlzLnoyMTU9ZnVuY3Rpb24oYSl7QihhKX0sdGhpcy5zaG93UHJvZ3Jlc3M9ZnVuY3Rpb24oYSxiKXtpZihaLnByb2dyZXNzVmlzaWJsZSl7cSYmd2luZG93LmNsZWFySW50ZXJ2YWwocSk7dmFyIGMsZD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJvZ3Jlc3NUZXh0Qm94IikuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZDtkJiYoYT09MHx8Yj09MD8oZC5ub2RlVmFsdWU9ImxsbGxsbGxsbGwiLHE9d2luZG93LnNldEludGVydmFsKHUscGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NTEiKSksMTApKTooYz1NYXRoLnJvdW5kKDEwMC1iL2EqMTAwKSxkLm5vZGVWYWx1ZT0ibCIubXVsdGlwbHkoTWF0aC5yb3VuZChjLzEwKSkpKX19LHRoaXMuejI2Nj1mdW5jdGlvbihhKXtDKGEpfX0sWi56MTIzPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIHgoYSl7Wi5OYXZpZ2F0b3JEaXNwbGF5PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2IiwiTmF2aWdhdG9yRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIixlKyJweCIsZisicHgiLGcrInB4IixoKyJweCIsInNvbGlkIiwiMXB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLG89Wi5OYXZpZ2F0b3JEaXNwbGF5LHA9by5zdHlsZTt2YXIgYj1aLlV0aWxzLnoxODUoInozNiIpLGM9Wi5VdGlscy56MTg1KCJ6MzZOT0FMUEhBIiksZD1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsIm5hdmlnYXRvckJhY2tncm91bmQiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsImhpZGRlbiIsZSsicHgiLGYrInB4IiwiMHB4IiwiMHB4Iiwibm9uZSIsIjBweCIsYiwiMHB4IiwiMHB4Iik7Wi5VdGlscy5zZXRPcGFjaXR5KGQsbCxjKSxaLk5hdmlnYXRvckRpc3BsYXkuYXBwZW5kQ2hpbGQoZCkscT1kLHI9cS5zdHlsZTt2YXIgaj1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsIm5hdmlnYXRvckltYWdlQ29udGFpbmVyIiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLGUrInB4IixmKyJweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4Iik7ai5hcHBlbmRDaGlsZChuKSxaLk5hdmlnYXRvckRpc3BsYXkuYXBwZW5kQ2hpbGQoaikscz1qLHQ9cy5zdHlsZSx1PW47dmFyIGs9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJuYXZpZ2F0b3JSZWN0YW5nbGUiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsImhpZGRlbiIsZSsxKyJweCIsZisxKyJweCIsZysicHgiLGgrInB4Iiwic29saWQiLCIxcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4Iik7ay5zdHlsZS5ib3JkZXJDb2xvcj1aLlV0aWxzLnoxODUoIno0MSIpLFouTmF2aWdhdG9yRGlzcGxheS5hcHBlbmRDaGlsZChrKSx2PWssdz12LnN0eWxlLFouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChaLk5hdmlnYXRvckRpc3BsYXkpLEMoZSxmLGcsaCxpKSxIKFoubmF2aWdhdG9yVmlzaWJsZT09MXx8Wi5uYXZpZ2F0b3JWaXNpYmxlPT0yKSxGKCksWi5tb2JpbGVEZXZpY2U/KFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihvLCJ0b3VjaHN0YXJ0IixQKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywidG91Y2htb3ZlIixRKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywidG91Y2hlbmQiLFIpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihvLCJ0b3VjaGNhbmNlbCIsUykpOihaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodSwibW91c2Vkb3duIixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2Vkb3duIixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2VvdmVyIixaLlV0aWxzLnN0b3BQcm9wYWdhdGlvbiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKG8sIm1vdXNlZG93biIsTSkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihuLCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaywiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpLEIoITApLEcoKX1mdW5jdGlvbiB5KGEpe0MoZSxmLGcsaCxpKSxIKFoubmF2aWdhdG9yVmlzaWJsZT09MXx8Wi5uYXZpZ2F0b3JWaXNpYmxlPT0yKSxGKCl9ZnVuY3Rpb24geigpe2lmKEEoKSl7ZCYmKHdpbmRvdy5jbGVhckludGVydmFsKGQpLGQ9bnVsbCk7aWYoIW98fCFwfHwhcXx8IXJ8fCFzfHwhdHx8IXV8fCF2fHwhdylvPVouTmF2aWdhdG9yRGlzcGxheSxwPW8uc3R5bGUscT1aLk5hdmlnYXRvckRpc3BsYXkuY2hpbGROb2Rlc1swXSxyPXEuc3R5bGUscz1aLk5hdmlnYXRvckRpc3BsYXkuY2hpbGROb2Rlc1sxXSx0PXMuc3R5bGUsdT1aLk5hdmlnYXRvckRpc3BsYXkuY2hpbGROb2Rlc1sxXS5maXJzdENoaWxkLHY9Wi5OYXZpZ2F0b3JEaXNwbGF5LmNoaWxkTm9kZXNbMl0sdz12LnN0eWxlfX1mdW5jdGlvbiBBKCl7cmV0dXJuIGN9ZnVuY3Rpb24gQihhKXtjPWF9ZnVuY3Rpb24gQyhhLGIsYyxkLGUpe2F8fChhPVoubmF2aWdhdG9yVyksYnx8KGI9Wi5uYXZpZ2F0b3JIKSxjfHwoYz0wKSxkfHwoZD0wKSxvfHwobz1aLk5hdmlnYXRvckRpc3BsYXkpLHB8fChwPW8uc3R5bGUpLHU9by5jaGlsZE5vZGVzWzFdLmZpcnN0Q2hpbGQ7aWYobyYmcCYmdSl7aWYoZSl7dmFyIGY9MSxnPTE7ZT09MD9nPVoudmlld2VyVy9aLnZpZXdlckg6Zz11LndpZHRoL3UuaGVpZ2h0LGY+MT8oYj1hLGIvPWcpOihhPWIsYSo9Zyl9cC53aWR0aD1hKyJweCIscC5oZWlnaHQ9YisicHgiLHAubGVmdD1jLTErInB4IixwLnRvcD1kLTErInB4IixEKGEsYil9fWZ1bmN0aW9uIEQoYSxiKXtyfHwocj1aLk5hdmlnYXRvckRpc3BsYXkuZmlyc3RDaGlsZC5zdHlsZSksdHx8KHQ9Wi5OYXZpZ2F0b3JEaXNwbGF5LmNoaWxkTm9kZXNbMV0uc3R5bGUpLHV8fCh1PVouTmF2aWdhdG9yRGlzcGxheS5jaGlsZE5vZGVzWzFdLmZpcnN0Q2hpbGQpLHImJnQmJnUmJihyLndpZHRoPWErInB4IixyLmhlaWdodD1iKyJweCIsRShhLGIsdS53aWR0aCx1LmhlaWdodCksdC53aWR0aD11LndpZHRoKyJweCIsdC5oZWlnaHQ9dS5oZWlnaHQrInB4Iix0LmxlZnQ9KGEtcGFyc2VGbG9hdCh0LndpZHRoKSkvMisicHgiLHQudG9wPShiLXBhcnNlRmxvYXQodC5oZWlnaHQpKS8yKyJweCIsRygpKX1mdW5jdGlvbiBFKGEsYixjLGQpe3V8fCh1PVouTmF2aWdhdG9yRGlzcGxheS5jaGlsZE5vZGVzWzFdLmZpcnN0Q2hpbGQpO2lmKHUpe3ZhciBlPWMvZCxmPWEvYyxnPWIvZCxoPTAsaT0wO2Y8PWc/KGM9YSxkPWEvZSxpPShiLWQqKGEvYykpLzIpOmc8ZiYmKGQ9YixjPWIqZSxoPShhLWMqKGIvZCkpLzIpLHUud2lkdGg9Yyx1LmhlaWdodD1kfX1mdW5jdGlvbiBGKCl7cHx8KHA9Wi5OYXZpZ2F0b3JEaXNwbGF5LnN0eWxlKSxwJiYocC56SW5kZXg9cC56SW5kZXgrMTAwKX1mdW5jdGlvbiBHKCl7aWYoWi5WaWV3cG9ydCYmWi5WaWV3cG9ydC56MTgwKCkpe0koKTt2YXIgYT1aLlZpZXdwb3J0LnoxNDEoKTtKKGEpfX1mdW5jdGlvbiBIKGEpe3B8fChwPVouTmF2aWdhdG9yRGlzcGxheS5zdHlsZSkscCYmKGE/cC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siOnAuZGlzcGxheT0ibm9uZSIpfWZ1bmN0aW9uIEkoKXtpZih1JiZ3KXt2YXIgYT11LndpZHRoL1ouaW1hZ2VXLGI9dS5oZWlnaHQvWi5pbWFnZUgsYz1aLlZpZXdwb3J0LnoxODlBc1pvb20oKSxkPVoudmlld2VyVyphL2MsZT1aLnZpZXdlckgqYi9jO3cud2lkdGg9ZCsicHgiLHcuaGVpZ2h0PWUrInB4In19ZnVuY3Rpb24gSihhKXtpZih1JiZ3JiZ0KXt2YXIgYj11LndpZHRoL1ouaW1hZ2VXLGM9dS5oZWlnaHQvWi5pbWFnZUgsZD1hLngqYixlPWEueSpjLGY9ZC1wYXJzZUZsb2F0KHcud2lkdGgpLzIsZz1lLXBhcnNlRmxvYXQody5oZWlnaHQpLzI7dy5sZWZ0PWYrcGFyc2VGbG9hdCh0LmxlZnQpKyJweCIsdy50b3A9ZytwYXJzZUZsb2F0KHQudG9wKSsicHgifX1mdW5jdGlvbiBLKCl7aWYodyYmdCYmdSl7dmFyIGE9cGFyc2VGbG9hdCh3LmxlZnQpLXBhcnNlRmxvYXQodC5sZWZ0KSxiPXBhcnNlRmxvYXQody50b3ApLXBhcnNlRmxvYXQodC50b3ApLGM9YSsocGFyc2VGbG9hdCh3LndpZHRoKS0xKS8yLGQ9YisocGFyc2VGbG9hdCh3LmhlaWdodCktMSkvMixlPVouaW1hZ2VXL3Uud2lkdGgsZj1aLmltYWdlSC91LmhlaWdodCxnPWMqZSxoPWQqZjtaLlZpZXdwb3J0LnoyNjcoZyxoKX19ZnVuY3Rpb24gTCgpe1ouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno4OCIpKX1mdW5jdGlvbiBNKGEpe2lmKG8mJnYmJncpe3ZhciBhPVouVXRpbHMuZXZlbnQoYSk7di5tb3VzZVhQcmlvcj1hLmNsaWVudFgsdi5tb3VzZVlQcmlvcj1hLmNsaWVudFksemFwdHZEcmFnUHRTdGFydD1uZXcgWi5VdGlscy5Qb2ludChhLmNsaWVudFgsYS5jbGllbnRZKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2Vtb3ZlIixOKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2V1cCIsTyksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZXVwIixPKX19ZnVuY3Rpb24gTihhKXtpZih2JiZ3KXt2YXIgYj1wYXJzZUZsb2F0KHcubGVmdCksYz1wYXJzZUZsb2F0KHcudG9wKTtyZXR1cm4gdy5sZWZ0PWIrKGEuY2xpZW50WC12Lm1vdXNlWFByaW9yKSsicHgiLHcudG9wPWMrKGEuY2xpZW50WS12Lm1vdXNlWVByaW9yKSsicHgiLHYubW91c2VYUHJpb3I9YS5jbGllbnRYLHYubW91c2VZUHJpb3I9YS5jbGllbnRZLEsoKSwhMX19ZnVuY3Rpb24gTyhhKXtpZihvJiZ2JiZ3KXtkb2N1bWVudC5tb3VzZW1vdmU9bnVsbCxkb2N1bWVudC5tb3VzZXVwPW51bGwsWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKG8sIm1vdXNlbW92ZSIsTiksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKG8sIm1vdXNldXAiLE8pLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsTyk7dmFyIGE9Wi5VdGlscy5ldmVudChhKSxiPW5ldyBaLlV0aWxzLlBvaW50KGEuY2xpZW50WCxhLmNsaWVudFkpLGM9TWF0aC5zcXJ0KE1hdGgucG93KHphcHR2RHJhZ1B0U3RhcnQueC1iLngsMikrTWF0aC5wb3coemFwdHZEcmFnUHRTdGFydC55LWIueSwyKSk7aWYoYzw0KXt2YXIgZD1aLlV0aWxzLnoxNzQoWi5OYXZpZ2F0b3JEaXNwbGF5KTt3LmxlZnQ9YS5jbGllbnRYLWQueC1wYXJzZUZsb2F0KHcud2lkdGgpLzIrInB4Iix3LnRvcD1hLmNsaWVudFktZC55LXBhcnNlRmxvYXQody5oZWlnaHQpLzIrInB4In1LKCksWi5WaWV3cG9ydC56Mjc0KCl9fWZ1bmN0aW9uIFAoYSl7YS5wcmV2ZW50RGVmYXVsdCgpO2lmKG8mJnYmJncpe3ZhciBiPVouVXRpbHMuejE3OChhKTtpZihiKXt2YXIgYz1iLnRhcmdldCxkPW5ldyBaLlV0aWxzLlBvaW50KGIucGFnZVgsYi5wYWdlWSk7emFwdHZEcmFnUHRTdGFydD1uZXcgWi5VdGlscy5Qb2ludChkLngsZC55KSx2Lm1vdXNlWFByaW9yPWQueCx2Lm1vdXNlWVByaW9yPWQueSx6YXB0dkRyYWdQdFN0YXJ0PW5ldyBaLlV0aWxzLlBvaW50KGQueCxkLnkpfX19ZnVuY3Rpb24gUShhKXthLnByZXZlbnREZWZhdWx0KCk7aWYoIVoubW91c2VQYW4pcmV0dXJuO2lmKHYmJncpe3ZhciBiPVouVXRpbHMuejE3OChhKTtpZihiKXt2YXIgYz1iLnRhcmdldCxkPW5ldyBaLlV0aWxzLlBvaW50KGIucGFnZVgsYi5wYWdlWSksZT1wYXJzZUZsb2F0KHcubGVmdCksZj1wYXJzZUZsb2F0KHcudG9wKTtyZXR1cm4gdy5sZWZ0PWUrKGQueC12Lm1vdXNlWFByaW9yKSsicHgiLHcudG9wPWYrKGQueS12Lm1vdXNlWVByaW9yKSsicHgiLHYubW91c2VYUHJpb3I9ZC54LHYubW91c2VZUHJpb3I9ZC55LEsoKSwhMX19cmV0dXJuITF9ZnVuY3Rpb24gUihhKXtpZihvJiZ2JiZ3KXt2YXIgYj1aLlV0aWxzLnoxNzgoYSk7aWYoYil7dmFyIGM9Yi50YXJnZXQsZD1uZXcgWi5VdGlscy5Qb2ludChiLnBhZ2VYLGIucGFnZVkpLGU9bmV3IFouVXRpbHMuUG9pbnQoZC54LGQueSksZj1NYXRoLnNxcnQoTWF0aC5wb3coemFwdHZEcmFnUHRTdGFydC54LWUueCwyKStNYXRoLnBvdyh6YXB0dkRyYWdQdFN0YXJ0LnktZS55LDIpKSxnPVoubW9iaWxlRGV2aWNlPzY6MztpZihmPGcpe3ZhciBoPVouVXRpbHMuejE3NChaLk5hdmlnYXRvckRpc3BsYXkpO3cubGVmdD1kLngtaC54LXBhcnNlRmxvYXQody53aWR0aCkvMisicHgiLHcudG9wPWQueS1oLnktcGFyc2VGbG9hdCh3LmhlaWdodCkvMisicHgifX1LKCksWi5WaWV3cG9ydC56Mjc0KCl9fWZ1bmN0aW9uIFMoYSl7aWYobyYmdiYmdyl7dmFyIGI9Wi5VdGlscy56MTc4KGEpO2lmKGIpe3ZhciBjPWIudGFyZ2V0LGQ9bmV3IFouVXRpbHMuUG9pbnQoYi5wYWdlWCxiLnBhZ2VZKSxlPW5ldyBaLlV0aWxzLlBvaW50KGQueCxkLnkpLGY9TWF0aC5zcXJ0KE1hdGgucG93KHphcHR2RHJhZ1B0U3RhcnQueC1lLngsMikrTWF0aC5wb3coemFwdHZEcmFnUHRTdGFydC55LWUueSwyKSksZz1aLm1vYmlsZURldmljZT82OjM7aWYoZjxnKXt2YXIgaD1aLlV0aWxzLnoxNzQoWi5OYXZpZ2F0b3JEaXNwbGF5KTt3LmxlZnQ9ZC54LWgueC1wYXJzZUZsb2F0KHcud2lkdGgpLzIrInB4Iix3LnRvcD1kLnktaC55LXBhcnNlRmxvYXQody5oZWlnaHQpLzIrInB4In19SygpLFouVmlld3BvcnQuejI3NCgpfX12YXIgYj10aGlzLGM9ITEsZCxlPVoubmF2aWdhdG9yVyxmPVoubmF2aWdhdG9ySCxnPVoubmF2aWdhdG9yTC0xLGg9Wi5uYXZpZ2F0b3JULTEsaT1aLm5hdmlnYXRvckZpdCxqLGs9bnVsbCxsPXBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6MzUiKSksbT1aLlV0aWxzLnoxNDAoWi5pbWFnZVBhdGgrIi9UaWxlR3JvdXAwLyIrIjAtMC0wLmpwZyIpLG49bmV3IEltYWdlO24ub25sb2FkPXgsbi5vbmVycm9yPUwsbi5zcmM9bTt2YXIgbyxwLHEscixzLHQsdSx2LHc7dGhpcy5zZXRJbWFnZVBhdGg9ZnVuY3Rpb24oYSl7bT1aLlV0aWxzLnoxNDAoWi5pbWFnZVBhdGgrIi9UaWxlR3JvdXAwLyIrIjAtMC0wLmpwZyIpLHMucmVtb3ZlQ2hpbGQobiksbj1udWxsLG49bmV3IEltYWdlLHMuYXBwZW5kQ2hpbGQobiksbi5vbmxvYWQ9eSxuLm9uZXJyb3I9TCxuLnNyYz1tfSx0aGlzLnoxODA9ZnVuY3Rpb24oKXtyZXR1cm4gQSgpfSx0aGlzLnNldFNpemVBbmRQb3NpdGlvbj1mdW5jdGlvbihhLGIsYyxkLGUpe2V8fChlPWkpLEMoYSxiLGMsZCxlKX0sdGhpcy5zZXRWaXNpYmlsaXR5PWZ1bmN0aW9uKGEpe0goYSl9LHRoaXMuejI2OD1mdW5jdGlvbigpe0coKX0sdGhpcy56MjYzUmVjdGFuZ2xlRGltZW5zaW9ucz1mdW5jdGlvbigpe0koKX0sdGhpcy56MjYzUmVjdGFuZ2xlUG9zaXRpb249ZnVuY3Rpb24oYSl7SihhKX0sdGhpcy56Mjc3PWZ1bmN0aW9uKCl7QSgpP3ooKTpkPXdpbmRvdy5zZXRJbnRlcnZhbCh6LDMwMCl9fSxaLnoxMDE9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhhLGIpe3ZhciBjPW51bGwsZD10eXBlb2YgYj09ImZ1bmN0aW9uIjtpZihkKXZhciBlPWIsYj1mdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KFouVXRpbHMuY3JlYXRlQ2FsbGJhY2sobnVsbCxlLGMpLDEpfTtpZih3aW5kb3cuQWN0aXZlWE9iamVjdCl7dmFyIGY9WyJNc3htbDIuWE1MSFRUUCIsIk1zeG1sMy5YTUxIVFRQIiwiTWljcm9zb2Z0LlhNTEhUVFAiXTtmb3IodmFyIGc9MDtnPGYubGVuZ3RoO2crKyl0cnl7Yz1uZXcgQWN0aXZlWE9iamVjdChmW2ddKTticmVha31jYXRjaChoKXtjb250aW51ZX19ZWxzZSB3aW5kb3cuWE1MSHR0cFJlcXVlc3QmJihjPW5ldyBYTUxIdHRwUmVxdWVzdCk7Y3x8Wi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejk5IikpLGQmJihjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2MucmVhZHlTdGF0ZT09NCYmKGMub25yZWFkeXN0YXRlY2hhbmdlPW5ldyBGdW5jdGlvbixiKCkpfSk7dHJ5e2Mub3BlbigiR0VUIixhLGQpLGMuc2VuZChudWxsKX1jYXRjaChoKXthLmluZGV4T2YoIkltYWdlUHJvcGVydGllcy54bWwiKSE9LTE/Wi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejg3LUlNQUdFWE1MIikpOmEuaW5kZXhPZigic2tpbkZpbGVzLnhtbCIpIT0tMT9aLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6ODctVE9PTEJBUlhNTCIpKTpaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6ODciKSksYy5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxjPW51bGx9cmV0dXJuIGQ/bnVsbDpjfWZ1bmN0aW9uIGQoYSl7aWYoYSl7aWYoIWEpWi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejg5IikpO2Vsc2UgaWYoYS5zdGF0dXMhPT0yMDAmJmEuc3RhdHVzIT09MCl7dmFyIGI9YS5zdGF0dXMsYz1iPT00MDQ/Ik5vdCBGb3VuZCI6YS5zdGF0dXNUZXh0O1ouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno5MCIpK2IrIiAtICIrYyl9dmFyIGQ9bnVsbDthLnJlc3BvbnNlWE1MJiZhLnJlc3BvbnNlWE1MLmRvY3VtZW50RWxlbWVudD9kPWEucmVzcG9uc2VYTUw6YS5yZXNwb25zZVRleHQmJihkPVouVXRpbHMuejE1OChhLnJlc3BvbnNlVGV4dCkpLGUoZCl9ZWxzZSBaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6ODQiKSl9ZnVuY3Rpb24gZShhKXtpZihhJiZhLmRvY3VtZW50RWxlbWVudCl7dmFyIGI9YS5kb2N1bWVudEVsZW1lbnQudGFnTmFtZTtiPT0iQ09QWVJJR0hUIj9mKCJjb3B5cmlnaHQiLGEpOmI9PSJJTUFHRV9QUk9QRVJUSUVTIj9mKCJpbWFnZSIsYSk6Yj09IlNLSU5EQVRBIj9mKCJza2luIixhKTpaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6MTAwIikpfWVsc2UgWi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejEwMCIpKX1mdW5jdGlvbiBmKGEsYil7aWYoYT09ImNvcHlyaWdodCIpe3ZhciBjPWIuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiU1RBVEVNRU5UVEVYVCIpLGQ9Yi5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJERUNMSU5FRFRFWFQiKTtaLlV0aWxzLmlzU3RyVmFsKGMpP1ouVXRpbHMuejI1MighMCxjLGQpOlouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno4NiIpKX1lbHNlIGlmKGE9PSJpbWFnZSIpe3ZhciBlPXBhcnNlSW50KGIuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiV0lEVEgiKSwxMCksZj1wYXJzZUludChiLmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIkhFSUdIVCIpLDEwKTshaXNOYU4oZSkmJmU+MCYmIWlzTmFOKGYpJiZmPjA/Wi5WaWV3cG9ydCYmKFouVmlld3BvcnQuejE4MCgpP1ouVmlld3BvcnQucmV6MjA2KGUsZik6Wi5WaWV3cG9ydC56MjA2KGUsZikpOlouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno4NiIpKX1lbHNlIGlmKGE9PSJza2luIil7Wi5za2luTW9kZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJTRVRVUCIpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJTS0lOTU9ERSIpLm5vZGVWYWx1ZTt2YXIgZyxoO1ouc2tpbk1vZGU9PTF8fFouc2tpbk1vZGU9PTAmJiFaLm1vYmlsZURldmljZT8oZz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJTRVRVUCIpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJGT0xERVJTVEFOREFSRCIpLm5vZGVWYWx1ZSxoPSJTSVpFU1NUQU5EQVJEIik6KGc9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiU0VUVVAiKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiRk9MREVSTEFSR0UiKS5ub2RlVmFsdWUsaD0iU0laRVNMQVJHRSIpO3ZhciBpPVtdO2kucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlRPT0xCQVJXIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiVE9PTEJBUkgiKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJMT0dPVyIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIkxPR09IIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiRElWSURFUlciKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJESVZJREVSSCIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIkJVVFRPTlciKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJCVVRUT05IIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiQlVUVE9OU1BBTiIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlNMSURFUkJVVFRPTlciKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJTTElERVJCVVRUT05IIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0xJREVSVFJBQ0tXIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0xJREVSVFJBQ0tIIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0xJREVSU1BBTiIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlBST0dSRVNTVyIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlBST0dSRVNTSCIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlBST0dSRVNTRk9OVFNJWkUiKS5ub2RlVmFsdWUpKTt2YXIgaj1bXSxrPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkZJTEVTIilbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlNLSU4wIikubm9kZVZhbHVlLGw9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRklMRVMiKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0tJTjM5Iikubm9kZVZhbHVlO2lmKFouVXRpbHMuaXNTdHJWYWwoaykmJlouVXRpbHMuaXNTdHJWYWwobCkpe3ZhciBtPSExO2Zvcih2YXIgbj0wO248NDA7bisrKXt2YXIgbz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJGSUxFUyIpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJTS0lOIituKS5ub2RlVmFsdWU7Wi5VdGlscy5pc1N0clZhbChvKT9qW25dPWcrIi8iK286KGpbbl09Im51bGwiLG09ITApfW0mJlouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIkVSUk9SX1NLSU5TWE1MTUlTU0lOR05BTUVTIikpLFouVG9vbGJhciYmWi5Ub29sYmFyLnoyMDUoaSxqKX1lbHNlIFouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno5MSIpKX19ZnVuY3Rpb24gZyhhLGMsZCl7Yi0tO2lmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXRyeXthKGQpfWNhdGNoKGUpe1ouVXRpbHMuejI1NShlLm5hbWUrWi5VdGlscy56MTg1KCJ6ODMiKStjKyIgIitlLm1lc3NhZ2UpfX1mdW5jdGlvbiBoKGEsYil7ZnVuY3Rpb24gZShlKXtjLm9ubG9hZD1udWxsLGMub25hYm9ydD1udWxsLGMub25lcnJvcj1udWxsLGQmJndpbmRvdy5jbGVhclRpbWVvdXQoZCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtiKGEsZT9jOm51bGwpfSwxKX12YXIgYz1udWxsLGQ9bnVsbDt0aGlzLnN0YXJ0PWZ1bmN0aW9uKCl7Yz1uZXcgSW1hZ2U7dmFyIGI9ZnVuY3Rpb24oKXtlKCEwKX0sZj1mdW5jdGlvbigpe2UoITEpfSxnPWZ1bmN0aW9uKCl7ZSghMSl9O2Mub25sb2FkPWIsYy5vbmFib3J0PWYsYy5vbmVycm9yPWYsZD13aW5kb3cuc2V0VGltZW91dChnLHBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6NjAiKSkpLGMuc3JjPWF9fXZhciBiPTA7dGhpcy5sb2FkWE1MPWZ1bmN0aW9uKGEpe2MoYSxkKX0sdGhpcy56MjEySW1hZ2U9ZnVuY3Rpb24oYSxjKXtpZihiPj1wYXJzZUludChaLlV0aWxzLnoxODUoInoyNSIpLDEwKSlyZXR1cm4hMTt2YXIgZD1aLlV0aWxzLmNyZWF0ZUNhbGxiYWNrKG51bGwsZyxjKSxlPW5ldyBoKGEsZCk7cmV0dXJuIGIrKyxlLnN0YXJ0KCksITB9fSxaLlV0aWxzPXt6MTYzOmZ1bmN0aW9uKCl7Wi5wYWdlQ29udGFpbmVySUQ9bnVsbCxaLmltYWdlUGF0aD1udWxsLFouc2tpblBhdGg9bnVsbCxaLnNraW5Nb2RlPW51bGwsWi5wYXJhbWV0ZXJzPW51bGwsWi5icm93c2Vycz1udWxsLFouYnJvd3Nlcj1udWxsLFouYnJvd3NlclZlcnNpb249bnVsbCxaLmNhbnZhc1N1cHBvcnRlZD1udWxsLFouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZD1udWxsLFouY3NzVHJhbnNmb3JtUHJvcGVydHk9bnVsbCxaLmNzc1RyYW5zZm9ybU5vVW5pdHM9bnVsbCxaLmFscGhhU3VwcG9ydGVkPW51bGwsWi5yZW5kZXJRdWFsaXR5PW51bGwsWi5tb2JpbGVEZXZpY2U9bnVsbCxaLmluaXRpYWxYPW51bGwsWi5pbml0aWFsWT1udWxsLFouaW5pdGlhbFo9bnVsbCxaLm1pblo9bnVsbCxaLm1heFo9bnVsbCxaLnpvb21TcGVlZD1udWxsLFoucGFuU3BlZWQ9bnVsbCxaLmZhZGVJblNwZWVkPW51bGwsWi50b29sYmFyVmlzaWJsZT1udWxsLFoudG9vbGJhclc9bnVsbCxaLnRvb2xiYXJIPW51bGwsWi50b29sYmFyUG9zaXRpb249bnVsbCxaLm5hdmlnYXRvclZpc2libGU9bnVsbCxaLm5hdmlnYXRvclc9bnVsbCxaLm5hdmlnYXRvckg9bnVsbCxaLm5hdmlnYXRvckw9bnVsbCxaLm5hdmlnYXRvclQ9bnVsbCxaLm5hdmlnYXRvckZpdD1udWxsLFouY2xpY2tab29tPW51bGwsWi5jbGlja1Bhbj1udWxsLFoubW91c2VQYW49bnVsbCxaLmtleXM9bnVsbCxaLmNvbnN0cmFpblBhbj1udWxsLFoudG9vbHRpcHNWaXNpYmxlPW51bGwsWi5jb3B5cmlnaHRQYXRoPW51bGwsWi53YXRlcm1hcmtQYXRoPW51bGwsWi5zbGlkZXJWaXNpYmxlPW51bGwsWi5mdWxsUGFnZVZpc2libGU9bnVsbCxaLnByb2dyZXNzVmlzaWJsZT1udWxsLFoubG9nb1Zpc2libGU9bnVsbCxaLmxvZ29DdXN0b21QYXRoPW51bGwsWi5jYW52YXM9bnVsbCxaLmRlYnVnPW51bGwsWi5WaWV3ZXI9bnVsbCxaLlZpZXdlckRpc3BsYXk9bnVsbCxaLlZpZXdwb3J0PW51bGwsWi5Ub29sYmFyPW51bGwsWi5Ub29sYmFyRGlzcGxheT1udWxsLFouVG9vbHRpcERpc3BsYXk9bnVsbCxaLk5hdmlnYXRvcj1udWxsLFouTmF2aWdhdG9yRGlzcGxheT1udWxsLFouQ29weXJpZ2h0RGlzcGxheT1udWxsLFouaW1hZ2VXPW51bGwsWi5pbWFnZUg9bnVsbCxaLmltYWdlWD0wLFouaW1hZ2VZPTAsWi5pbWFnZVo9MCxaLmZpdFo9bnVsbCxaLnpvb21pbmc9InN0b3AiLFoucGFubmluZ1g9InN0b3AiLFoucGFubmluZ1k9InN0b3AiLFouZnVsbFBhZ2U9ITEsWi51c2VDYW52YXM9ITAsWi5UcmFjZURpc3BsYXk9bnVsbCxaLnRyYWNlcz1udWxsfSxlbmZvcmNlQ29weXJpZ2h0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy56MjM4KCJpbWFnZUNvcHlyaWdodCIpO2E/Wi5WaWV3ZXIuejE0OSgpOnRoaXMuejIxMCgpfSx6MjEwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFouejEwMTthLmxvYWRYTUwoWi5jb3B5cmlnaHRQYXRoKX0sejI1MjpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy56MTg1KCJ6MTYiKSxlPXRoaXMuejE4NSgiejE0Iik7aWYoYSl7Wi5Db3B5cmlnaHREaXNwbGF5PXRoaXMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2IiwiQ29weXJpZ2h0RGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIixaLnZpZXdlclctMisicHgiLFoudmlld2VySC0yKyJweCIsIjBweCIsIjBweCIsInNvbGlkIiwiMXB4IixkLCIwcHgiLCIwcHgiKSxaLlZpZXdlckRpc3BsYXkuYXBwZW5kQ2hpbGQoWi5Db3B5cmlnaHREaXNwbGF5KTt2YXIgZj00NDAsZz0yMDAsaD1wYXJzZUZsb2F0KFouQ29weXJpZ2h0RGlzcGxheS5zdHlsZS53aWR0aCkvMi1mLzIsaT1wYXJzZUZsb2F0KFouQ29weXJpZ2h0RGlzcGxheS5zdHlsZS5oZWlnaHQpLzItZy8yLGo9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJ0ZXh0Qm94IiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLGYrInB4IixnKyJweCIsaCsicHgiLGkrInB4Iiwibm9uZSIsIjBweCIsInRyYW5zcGFyZW50IG5vbmUiLCIwcHgiLCIwcHgiKTtqLmlkPSJ0ZXh0Qm94IixaLkNvcHlyaWdodERpc3BsYXkuYXBwZW5kQ2hpbGQoaik7dmFyIGs9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYik7ai5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZUNlbnRlcmVkRWxlbWVudChrKSksdGhpcy56MjUxKGssImJsYWNrIiwidmVyZGFuYSIsIjE2cHgiLCJub25lIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwiMWVtIiwianVzdGlmeSIsIm5vbmUiKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjKTtqLmFwcGVuZENoaWxkKGwpO3ZhciBtPTgwLG49MjAsbz0zMCxwPTIwLHE9aCtmLzItKG0qMitvKS8yLHI9aStnK3Ascz10aGlzLnoxODUoInoxMyIpLHQ9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25BZ3JlZSIscyxudWxsLG51bGwsbnVsbCxudWxsLG0rInB4IixuKyJweCIscSsicHgiLHIrInB4IiwibW91c2Vkb3duIix0aGlzLnoxNjAsInoxMDMiLCJzb2xpZCIsIjFweCIsZSwiMHB4IiwiMHB4Iik7Wi5Db3B5cmlnaHREaXNwbGF5LmFwcGVuZENoaWxkKHQuZWxtdCkscSs9bStvLHM9dGhpcy56MTg1KCJ6MTUiKTt2YXIgdT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvbkV4aXQiLHMsbnVsbCxudWxsLG51bGwsbnVsbCxtKyJweCIsbisicHgiLHErInB4IixyKyJweCIsIm1vdXNlZG93biIsdGhpcy56MTYxLCJ6MTA0Iiwic29saWQiLCIxcHgiLGUsIjBweCIsIjBweCIpO1ouQ29weXJpZ2h0RGlzcGxheS5hcHBlbmRDaGlsZCh1LmVsbXQpfWVsc2V7dmFyIGo9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRleHRCb3giKSx2PWouY2hpbGROb2Rlc1sxXS50ZXh0Q29udGVudDtqLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQudGV4dENvbnRlbnQ9djt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uQWdyZWUiKTt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodCwibW91c2Vkb3duIix0aGlzLnoxNjApLFouQ29weXJpZ2h0RGlzcGxheS5yZW1vdmVDaGlsZCh0KTt2YXIgdT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uRXhpdCIpO3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih1LCJtb3VzZWRvd24iLHRoaXMuejE2MSksWi5Db3B5cmlnaHREaXNwbGF5LnJlbW92ZUNoaWxkKHUpfX0sQnV0dG9uOmZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMpe3ZhciB0PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgic3BhbiIsYSwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLGcsaCxpLGosbixvLHAscSxyLHMpO2lmKCFaLlV0aWxzLmlzU3RyVmFsKGIpKXt2YXIgdT1aLlV0aWxzLmNyZWF0ZUdyYXBoaWNFbGVtZW50KGMrIi8iK2QpLHY9Wi5VdGlscy5jcmVhdGVHcmFwaGljRWxlbWVudChjKyIvIitlKSx3PVouVXRpbHMuY3JlYXRlR3JhcGhpY0VsZW1lbnQoYysiLyIrZik7dS5pZD10LmlkKyItaW1nVXAiLHYuaWQ9dC5pZCsiLWltZ092ZXIiLHcuaWQ9dC5pZCsiLWltZ0Rvd24iLHQuX2ltZ1VwSUQ9dS5pZCx0Ll9pbWdPdmVySUQ9di5pZCx0Ll9pbWdEb3duSUQ9dy5pZDt2YXIgeD11LnN0eWxlLHk9di5zdHlsZSx6PXcuc3R5bGU7eC5wb3NpdGlvbj15LnBvc2l0aW9uPXoucG9zaXRpb249ImFic29sdXRlIix4LndpZHRoPXkud2lkdGg9eS53aWR0aD1nLHguaGVpZ2h0PXkuaGVpZ2h0PXkuaGVpZ2h0PWgseC50b3A9eS50b3A9ei50b3A9IjBweCIseC5sZWZ0PXkubGVmdD16LmxlZnQ9IjBweCIsWi5icm93c2VyPT1aLmJyb3dzZXJzLkZJUkVGT1gmJlouYnJvd3NlclZlcnNpb248MyYmKHgudG9wPXkudG9wPXoudG9wPSIiKSx5LnZpc2liaWxpdHk9ImhpZGRlbiIsei52aXNpYmlsaXR5PSJoaWRkZW4iLHQuYXBwZW5kQ2hpbGQodSksdC5hcHBlbmRDaGlsZCh2KSx0LmFwcGVuZENoaWxkKHcpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih1LCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHYsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodywiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpfWVsc2V7dmFyIEE9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYik7dC5hcHBlbmRDaGlsZChaLlV0aWxzLmNyZWF0ZUNlbnRlcmVkRWxlbWVudChBKSksWi5VdGlscy56MjUxKEEsImJsYWNrIiwidmVyZGFuYSIsIjEzcHgiLCJub25lIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwiMWVtIiwiY2VudGVyIiwibm9uZSIpLFouVXRpbHMuZGlzYWJsZVRleHRJbnRlcmFjdGlvbihBKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodCwiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpfVoudG9vbHRpcHNWaXNpYmxlJiZaLlV0aWxzLmlzU3RyVmFsKG0pJiYodC50aXRsZT1aLlV0aWxzLnoxODUobSkpLFoubW9iaWxlRGV2aWNlP1ouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih0LCJ0b3VjaHN0YXJ0IixsKTooWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHQsIm1vdXNlZG93biIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHQsIm1vdXNlb3ZlciIsWi5VdGlscy5zdG9wUHJvcGFnYXRpb24pLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih0LCJtb3VzZW91dCIsWi5VdGlscy5zdG9wUHJvcGFnYXRpb24pLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih0LGssbCkpLHRoaXMuZWxtdD10fSx6MTM4OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLnN0eWxlO2Qud2lkdGg9YisicHgiLGQuaGVpZ2h0PWMrInB4Ijt2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLl9pbWdVcElEKSxmPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuX2ltZ092ZXJJRCksZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLl9pbWdEb3duSUQpO2lmKGUmJmYmJmcpe3ZhciBoPWUuc3R5bGUsaT1mLnN0eWxlLGo9Zy5zdHlsZTtoLndpZHRoPWIrInB4IixoLmhlaWdodD1jKyJweCIsaS53aWR0aD1iKyJweCIsaS5oZWlnaHQ9YysicHgiLGoud2lkdGg9YisicHgiLGouaGVpZ2h0PWMrInB4In19LEdyYXBoaWM6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIGg9Yz9iKyIvIitjOmIsaT1aLlV0aWxzLmNyZWF0ZUdyYXBoaWNFbGVtZW50KGgpLGo9aS5zdHlsZTtqLndpZHRoPWQsai5oZWlnaHQ9ZTt2YXIgYz1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoInNwYW4iLGEsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIixkLGUsZixnLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpO2MuYXBwZW5kQ2hpbGQoaSksdGhpcy5lbG10PWMsWi5tb2JpbGVEZXZpY2U/Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksInRvdWNoc3RhcnQiLFouVXRpbHMucHJldmVudERlZmF1bHQpOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihpLCJtb3VzZWRvd24iLFouVXRpbHMucHJldmVudERlZmF1bHQpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihpLCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCl9LHoyMDM6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuc3R5bGU7ZC53aWR0aD1iKyJweCIsZC5oZWlnaHQ9YysicHgiO3ZhciBlPWEuZmlyc3RDaGlsZCxmPWUuc3R5bGU7Zi53aWR0aD1iKyJweCIsZi5oZWlnaHQ9YysicHgifSx6MTYwOmZ1bmN0aW9uKGEpe1ouVmlld2VyRGlzcGxheS5yZW1vdmVDaGlsZChaLkNvcHlyaWdodERpc3BsYXkpLGRvY3VtZW50LmNvb2tpZT0iaW1hZ2VDb3B5cmlnaHQ9Y29uZmlybWVkIixaLlZpZXdlci56MTQ5KCl9LHoxNjE6ZnVuY3Rpb24oYSl7Wi5VdGlscy56MjUyKCExKTtyZXR1cm59LHoxMjg6ZnVuY3Rpb24oKXtTdHJpbmcucHJvdG90eXBlLm11bHRpcGx5fHwoU3RyaW5nLnByb3RvdHlwZS5tdWx0aXBseT1mdW5jdGlvbigpe3ZhciBhPUFycmF5LnByb3RvdHlwZS5qb2luLGI9e307cmV0dXJuIGZ1bmN0aW9uKGMpe3JldHVybiBiLmxlbmd0aD1jKzEsYS5jYWxsKGIsdGhpcyl9fSgpKSxBcnJheS5wcm90b3R5cGUuaW5kZXhPZnx8KEFycmF5LnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKGEsYil7Yj9iPDAmJihiPU1hdGgubWF4KDAsdGhpcy5sZW5ndGgrYikpOmI9MDtmb3IodmFyIGM9YixkPXRoaXMubGVuZ3RoO2M8ZDtjKyspaWYodGhpc1tjXT09PWEpcmV0dXJuIGM7cmV0dXJuLTF9KSxBcnJheS5wcm90b3R5cGUucHVzaHx8KEFycmF5LnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGEpe3RoaXNbdGhpcy5sZW5ndGhdPWF9KSxBcnJheS5wcm90b3R5cGUuc3BsaWNlfHwoQXJyYXkucHJvdG90eXBlLnN1YmFycj1mdW5jdGlvbihhLGIpe2lmKGE+PXRoaXMubGVuZ3RofHxiJiZiPD0wKXJldHVybltdO2E8MCYmKE1hdGguYWJzKGEpPnRoaXMubGVuZ3RoP2E9MDphPXRoaXMubGVuZ3RoK2EpO2lmKCFifHxiK2E+dGhpcy5sZW5ndGgpYj10aGlzLmxlbmd0aC1hO3ZhciBjPVtdO2Zvcih2YXIgZD1hO2Q8YStiO2QrKyljLnB1c2godGhpc1tkXSk7cmV0dXJuIGN9LEFycmF5LnByb3RvdHlwZS5zdWJhcnJheT1mdW5jdGlvbihhLGIpe2E8MCYmKGE9MCk7aWYoIWJ8fGI+dGhpcy5sZW5ndGgpYj10aGlzLmxlbmd0aDtpZihhPT1iKXJldHVybltdO3ZhciBjPVtdO2Zvcih2YXIgZD1hO2Q8YjtkKyspYy5wdXNoKHRoaXNbZF0pO3JldHVybiBjfSxBcnJheS5wcm90b3R5cGUuc3BsaWNlPWZ1bmN0aW9uKGEsYil7YjwwJiYoYj0wKTt2YXIgYz1bXTtpZihhcmd1bWVudHMubGVuZ3RoPjIpZm9yKHZhciBkPTIsZT1hcmd1bWVudHMubGVuZ3RoO2Q8ZTtkKyspYy5wdXNoKGFyZ3VtZW50c1tkXSk7dmFyIGY9dGhpcy5zdWJhcnJheSgwLGEpLGc9dGhpcy5zdWJhcnIoYSxiKSxoPXRoaXMuc3ViYXJyYXkoYStiKSxpPWYuY29uY2F0KGMsaCk7dGhpcy5sZW5ndGg9MDtmb3IodmFyIGQ9MCxlPWkubGVuZ3RoO2Q8ZTtkKyspdGhpcy5wdXNoKGlbZF0pO3JldHVybiBnfSl9LHoxMjc6ZnVuY3Rpb24oKXtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyPyh0aGlzLmRpc2FibGVUZXh0SW50ZXJhY3Rpb249ZnVuY3Rpb24oYSl7YSYmKHRuUz1hLnBhcmVudE5vZGUuc3R5bGUsdG5TJiYoYS5wYXJlbnROb2RlLnVuc2VsZWN0YWJsZT0ib24iLHRuUy51c2VyU2VsZWN0PSJub25lIix0blMuTW96VXNlclNlbGVjdD0ibm9uZSIsdG5TLndlYmtpdFVzZXJTZWxlY3Q9Im5vbmUiLHRuUy53ZWJraXRUb3VjaENhbGxvdXQ9Im5vbmUiLHRuUy53ZWJraXRUYXBIaWdobGlnaHRDb2xvcj0idHJhbnNwYXJlbnQiKSl9LHRoaXMucmVuZGVyUXVhbGl0eT1mdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPWI9PSJoaWdoIj8ib3B0aW1pemVRdWFsaXR5Ijoib3B0aW1pemVTcGVlZCI7YS5zdHlsZS5zZXRQcm9wZXJ0eSgiaW1hZ2UtcmVuZGVyaW5nIixjLG51bGwpfX0sdGhpcy5zZXRPcGFjaXR5PWZ1bmN0aW9uKGEsYixjKXtaLmFscGhhU3VwcG9ydGVkP2Euc3R5bGUub3BhY2l0eT1iOmMmJihhLnN0eWxlLmJhY2tncm91bmRDb2xvcj1jKX0pOmRvY3VtZW50LmF0dGFjaEV2ZW50JiYodGhpcy5kaXNhYmxlVGV4dEludGVyYWN0aW9uPWZ1bmN0aW9uKGEpe2EmJihhLnBhcmVudE5vZGUudW5zZWxlY3RhYmxlPSJvbiIsYS5wYXJlbnROb2RlLm9uc2VsZWN0c3RhcnQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0pfSx0aGlzLnJlbmRlclF1YWxpdHk9ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgYz1iPT0iaGlnaCI/ImJpY3ViaWMiOiJuZWFyZXN0LW5laWdoYm9yIjthLnN0eWxlLm1zSW50ZXJwb2xhdGlvbk1vZGU9Y319LHRoaXMuc2V0T3BhY2l0eT1mdW5jdGlvbihhLGIsYyl7Wi5hbHBoYVN1cHBvcnRlZD8oYS5zdHlsZS5maWx0ZXI9InByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYShPcGFjaXR5PScgKyB2YWx1ZSArICcpIixhLnN0eWxlLmZpbHRlcj0iYWxwaGEob3BhY2l0eT0iK2IrIikiKTpjJiYoYS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9Yyl9KX0sejEyNjpmdW5jdGlvbigpe2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXI/KHRoaXMuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIsYyl7Yj09Im1vdXNld2hlZWwiJiZlbG10LmFkZEV2ZW50TGlzdGVuZXIoIkRPTU1vdXNlU2Nyb2xsIixjLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoYixjLCExKX0sdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjKXtiPT0ibW91c2V3aGVlbCImJmVsbXQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NTW91c2VTY3JvbGwiLGMsITEpLGEmJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsITEpfSx0aGlzLmV2ZW50PWZ1bmN0aW9uKGEpe3JldHVybiBhfSx0aGlzLnRhcmdldD1mdW5jdGlvbihhKXtyZXR1cm4gYS50YXJnZXR9LHRoaXMucmVsYXRlZFRhcmdldD1mdW5jdGlvbihhKXtyZXR1cm4gYS5yZWxhdGVkVGFyZ2V0fSx0aGlzLmlzUmlnaHRNb3VzZUJ1dHRvbj1mdW5jdGlvbihhKXt2YXIgYj0hMTtpZihhLndoaWNoPT0yfHxhLndoaWNoPT0zKWI9ITA7cmV0dXJuIGJ9LHRoaXMucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpfSx0aGlzLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk6ZG9jdW1lbnQuYXR0YWNoRXZlbnQmJih0aGlzLmFkZEV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe2lmKHRoaXMuX2ZpbmRMaXN0ZW5lcihhLGIsYykhPS0xKXJldHVybjt2YXIgZD1mdW5jdGlvbigpe3ZhciBiPXdpbmRvdy5ldmVudDtGdW5jdGlvbi5wcm90b3R5cGUuY2FsbD9jLmNhbGwoYSxiKTooYS5fY3VycmVudExpc3RlbmVyPWMsYS5fY3VycmVudExpc3RlbmVyKGIpLGEuX2N1cnJlbnRMaXN0ZW5lcj1udWxsKX07YS5hdHRhY2hFdmVudCgib24iK2IsZCk7dmFyIGU9e3RhcmdldDphLGV2ZW50TmFtZTpiLGhhbmRsZXI6YyxoYW5kbGVyMjpkfSxmPWEuZG9jdW1lbnR8fGEsZz1mLnBhcmVudFdpbmRvdyxoPSJsIit0aGlzLl9saXN0ZW5lckNvdW50ZXIrKztnLl9hbGxMaXN0ZW5lcnN8fChnLl9hbGxMaXN0ZW5lcnM9e30pLGcuX2FsbExpc3RlbmVyc1toXT1lLGEuX2xpc3RlbmVyc3x8KGEuX2xpc3RlbmVycz1bXSksYS5fbGlzdGVuZXJzW2EuX2xpc3RlbmVycy5sZW5ndGhdPWgsZy5fdW5sb2FkTGlzdGVuZXJBZGRlZHx8KGcuX3VubG9hZExpc3RlbmVyQWRkZWQ9ITAsZy5hdHRhY2hFdmVudCgib251bmxvYWQiLHRoaXMuX3JlbW92ZUFsbExpc3RlbmVycykpfSx0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe2lmKGEpe3ZhciBkPXRoaXMuX2ZpbmRMaXN0ZW5lcihhLGIsYyk7aWYoZD09LTEpcmV0dXJuO3ZhciBlPWEuZG9jdW1lbnR8fGEsZj1lLnBhcmVudFdpbmRvdyxnPWEuX2xpc3RlbmVyc1tkXSxoPWYuX2FsbExpc3RlbmVyc1tnXTthLmRldGFjaEV2ZW50KCJvbiIrYixoLmhhbmRsZXIyKSxhLl9saXN0ZW5lcnMuc3BsaWNlKGQsMSksZGVsZXRlIGYuX2FsbExpc3RlbmVyc1tnXX19LHRoaXMuZXZlbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHdpbmRvdy5ldmVudH0sdGhpcy50YXJnZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuc3JjRWxlbWVudH0sdGhpcy5yZWxhdGVkVGFyZ2V0PWZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7cmV0dXJuIGEudHlwZT09Im1vdXNlb3ZlciI/Yj1hLmZyb21FbGVtZW50OmEudHlwZT09Im1vdXNlb3V0IiYmKGI9YS50b0VsZW1lbnQpLGJ9LHRoaXMuaXNSaWdodE1vdXNlQnV0dG9uPWZ1bmN0aW9uKGEpe3ZhciBiPSExO3JldHVybiBhLmJ1dHRvbj09MiYmKGI9ITApLGJ9LHRoaXMucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oYSl7YSYmKGEucmV0dXJuVmFsdWU9ITEpfSx0aGlzLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbihhKXthLmNhbmNlbEJ1YmJsZT0hMH0sdGhpcy5fZmluZExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLl9saXN0ZW5lcnM7aWYoIWQpcmV0dXJuLTE7dmFyIGU9YS5kb2N1bWVudHx8YSxmPWUucGFyZW50V2luZG93O2Zvcih2YXIgZz1kLmxlbmd0aC0xO2c+PTA7Zy0tKXt2YXIgaD1kW2ddLGk9Zi5fYWxsTGlzdGVuZXJzW2hdO2lmKGkuZXZlbnROYW1lPT1iJiZpLmhhbmRsZXI9PWMpcmV0dXJuIGd9cmV0dXJuLTF9LHRoaXMuX3JlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbigpe3ZhciBhPXRoaXM7Zm9yKGlkIGluIGEuX2FsbExpc3RlbmVycyl7dmFyIGI9YS5fYWxsTGlzdGVuZXJzW2lkXTtiLnRhcmdldC5kZXRhY2hFdmVudCgib24iK2IuZXZlbnROYW1lLGIuaGFuZGxlcjIpLGRlbGV0ZSBhLl9hbGxMaXN0ZW5lcnNbaWRdfX0sdGhpcy5fbGlzdGVuZXJDb3VudGVyPTApfSx6MTY0OmZ1bmN0aW9uKCl7Wi5icm93c2Vycz17VU5LTk9XTjowLElFOjEsRklSRUZPWDoyLFNBRkFSSTozLENIUk9NRTo0LE9QRVJBOjV9O3ZhciBhPVouYnJvd3NlcnMuVU5LTk9XTixiPTAsYz1uYXZpZ2F0b3IuYXBwTmFtZSxkPW5hdmlnYXRvci5hcHBWZXJzaW9uLGU9ITEsZj0hMSxnPW5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTtpZihjIT0iTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyInx8IXdpbmRvdy5hdHRhY2hFdmVudHx8IXdpbmRvdy5BY3RpdmVYT2JqZWN0KWlmKGMhPSJOZXRzY2FwZSJ8fCF3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciljPT0iT3BlcmEiJiYhIXdpbmRvdy5vcGVyYSYmISF3aW5kb3cuYXR0YWNoRXZlbnQmJihhPVouYnJvd3NlcnMuT1BFUkEsYj1wYXJzZUZsb2F0KGQpKTtlbHNle3ZhciBpPWcuaW5kZXhPZigiZmlyZWZveCIpLGo9Zy5pbmRleE9mKCJzYWZhcmkiKSxrPWcuaW5kZXhPZigiY2hyb21lIik7aWYoaT49MClhPVouYnJvd3NlcnMuRklSRUZPWCxiPXBhcnNlRmxvYXQoZy5zdWJzdHJpbmcoaSs4KSk7ZWxzZSBpZihqPj0wKXt2YXIgbD1nLnN1YnN0cmluZygwLGopLmxhc3RJbmRleE9mKCIvIik7YT1rPj0wP1ouYnJvd3NlcnMuQ0hST01FOlouYnJvd3NlcnMuU0FGQVJJLGI9cGFyc2VGbG9hdChnLnN1YnN0cmluZyhsKzEsaikpfXZhciBtPW5ldyBJbWFnZTttLnN0eWxlLmdldFByb3BlcnR5VmFsdWUmJihmPW0uc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgiaW1hZ2UtcmVuZGVyaW5nIikpfWVsc2V7dmFyIGg9Zy5pbmRleE9mKCJtc2llIik7YT1aLmJyb3dzZXJzLklFLGI9cGFyc2VGbG9hdChnLnN1YnN0cmluZyhoKzUsZy5pbmRleE9mKCI7IixoKSkpLGU9dHlwZW9mIGRvY3VtZW50LmRvY3VtZW50TW9kZSE9InVuZGVmaW5lZCJ9dmFyIG49ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHx7fSxvPW4uc3R5bGV8fHt9LHA9ITEscT1bInRyYW5zZm9ybSIsIldlYmtpdFRyYW5zZm9ybSIsIk1velRyYW5zZm9ybSJdLHIsczt3aGlsZShyPXEuc2hpZnQoKSlpZih0eXBlb2Ygb1tyXSE9InVuZGVmaW5lZCIpe3A9ITAscz0vd2Via2l0L2kudGVzdChyKTticmVha312YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0JiZkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpLHU9IShhPT1aLmJyb3dzZXJzLlNBRkFSSSYmYjw0fHxhPT1aLmJyb3dzZXJzLkNIUk9NRSYmYjwyKSx2PXQmJnUsdz0hKGE9PVouYnJvd3NlcnMuSUV8fGE9PVouYnJvd3NlcnMuQ0hST01FJiZiPDIpLHg9ZXx8Zj8iaGlnaCI6bnVsbCx5PWcuaW5kZXhPZigiYW5kcm9pZCIpPi0xfHxnLmluZGV4T2YoImlwaG9uZSIpPi0xfHxnLmluZGV4T2YoImlwYWQiKT4tMXx8Zy5pbmRleE9mKCJpcG9kIik+LTE7Wi5icm93c2VyPWEsWi5icm93c2VyVmVyc2lvbj1iLFouY2FudmFzU3VwcG9ydGVkPXYsWi51c2VDYW52YXM9Wi5jYW52YXNTdXBwb3J0ZWQsWi5jc3NUcmFuc2Zvcm1zU3VwcG9ydGVkPXAsWi5jc3NUcmFuc2Zvcm1Qcm9wZXJ0eT1yLFouY3NzVHJhbnNmb3JtTm9Vbml0cz1zLFouYWxwaGFTdXBwb3J0ZWQ9dyxaLnJlbmRlclF1YWxpdHk9eCxaLm1vYmlsZURldmljZT15fSxpc1N0clZhbDpmdW5jdGlvbihhKXtyZXR1cm4gYSE9bnVsbCYmYSE9IiJ9LHoxNzQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPTAsZD10aGlzLnoxNzYoYSkucG9zaXRpb249PSJmaXhlZCIsZT10aGlzLnoxODMoYSxkKTt3aGlsZShlKXtiKz1hLm9mZnNldExlZnQsYys9YS5vZmZzZXRUb3A7aWYoZCl7dmFyIGY9dGhpcy56MTg0KCk7Yis9Zi54LGMrPWYueX1hPWUsZD10aGlzLnoxNzYoYSkucG9zaXRpb249PSJmaXhlZCIsZT10aGlzLnoxODMoYSxkKX1yZXR1cm4gbmV3IHRoaXMuUG9pbnQoYixjKX0sejE4MzpmdW5jdGlvbihhLGIpe3JldHVybiBiJiZhIT1kb2N1bWVudC5ib2R5P2RvY3VtZW50LmJvZHk6YS5vZmZzZXRQYXJlbnR9LHoxNzU6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyB0aGlzLlBvaW50KGEuY2xpZW50V2lkdGgsYS5jbGllbnRIZWlnaHQpfSx6MTc2OmZ1bmN0aW9uKGEpe2lmKGEuY3VycmVudFN0eWxlKXJldHVybiBhLmN1cnJlbnRTdHlsZTtpZih3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSlyZXR1cm4gd2luZG93LmdldENvbXB1dGVkU3R5bGUoYSwiIik7dGhpcy56MjU1KHRoaXMuejE4NSgiejkzIikpfSx6MTc3OmZ1bmN0aW9uKGEpe3JldHVybiB6MTc0KFouVXRpbHMudGFyZ2V0KGEpKX0sejE3ODpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9YS50b3VjaGVzLGQ9YS5jaGFuZ2VkVG91Y2hlcztyZXR1cm4gYyE9PXVuZGVmaW5lZD9iPWNbMF06ZCE9PXVuZGVmaW5lZCYmKGI9ZFswXSksYn0sejE4MTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9MDtyZXR1cm4gYS50eXBlPT0iRE9NTW91c2VTY3JvbGwiJiZicm93c2VyPT1Ccm93c2VyLkZJUkVGT1gmJmJyb3dzZXJWZXJzaW9uPDM/KGI9YS5zY3JlZW5YLGM9YS5zY3JlZW5ZKTp0eXBlb2YgYS5wYWdlWD09Im51bWJlciI/KGI9YS5wYWdlWCxjPWEucGFnZVkpOnR5cGVvZiBhLmNsaWVudFg9PSJudW1iZXIiPyhiPWEuY2xpZW50WCtkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQrZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQsYz1hLmNsaWVudFkrZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ArZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCk6dGhpcy56MjU1KHRoaXMuejE4NSgiejk0IikpLG5ldyB0aGlzLlBvaW50KGIsYyl9LHoxODI6ZnVuY3Rpb24oYSl7dmFyIGI9MDtyZXR1cm4gdHlwZW9mIGEud2hlZWxEZWx0YT09Im51bWJlciI/Yj1hLndoZWVsRGVsdGE6dHlwZW9mIGEuZGV0YWlsPT0ibnVtYmVyIj9iPWEuZGV0YWlsKi0xOnRoaXMuejI1NSh0aGlzLnoxODUoIno5NSIpKSxiP2IvTWF0aC5hYnMoYik6MH0sejE4NDpmdW5jdGlvbigpe3ZhciBhPTAsYj0wLGM9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHx7fSxkPWRvY3VtZW50LmJvZHl8fHt9O2lmKHR5cGVvZiB3aW5kb3cucGFnZVhPZmZzZXQ9PSJudW1iZXIiKWE9d2luZG93LnBhZ2VYT2Zmc2V0LGI9d2luZG93LnBhZ2VZT2Zmc2V0O2Vsc2UgaWYoZC5zY3JvbGxMZWZ0fHxkLnNjcm9sbFRvcClhPWQuc2Nyb2xsTGVmdCxiPWQuc2Nyb2xsVG9wO2Vsc2UgaWYoYy5zY3JvbGxMZWZ0fHxjLnNjcm9sbFRvcClhPWMuc2Nyb2xsTGVmdCxiPWMuc2Nyb2xsVG9wO3JldHVybiBuZXcgdGhpcy5Qb2ludChhLGIpfSx6MjAxaW5kb3dTaXplOmZ1bmN0aW9uKCl7dmFyIGE9MCxiPTAsYz1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fHt9LGQ9ZG9jdW1lbnQuYm9keXx8e307cmV0dXJuIHR5cGVvZiB3aW5kb3cuaW5uZXJXaWR0aD09Im51bWJlciI/KGE9d2luZG93LmlubmVyV2lkdGgsYj13aW5kb3cuaW5uZXJIZWlnaHQpOmMuY2xpZW50V2lkdGh8fGMuY2xpZW50SGVpZ2h0PyhhPWMuY2xpZW50V2lkdGgsYj1jLmNsaWVudEhlaWdodCk6ZC5jbGllbnRXaWR0aHx8ZC5jbGllbnRIZWlnaHQ/KGE9ZC5jbGllbnRXaWR0aCxiPWQuY2xpZW50SGVpZ2h0KTp0aGlzLnoyNTUodGhpcy56MTg1KCJ6OTYiKSksbmV3IHRoaXMuUG9pbnQoYSxiKX0sejIyNTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPWE7d2hpbGUoYj09ITEpaWYoYyljLmlkP2MuaWQ9PSJWaWV3ZXJEaXNwbGF5Ij9iPSEwOmM9Yy5wYXJlbnROb2RlOmM9Yy5wYXJlbnROb2RlO2Vsc2UgYnJlYWs7cmV0dXJuIGJ9LHoyMzg6ZnVuY3Rpb24oYSl7dmFyIGI9YSsiPSIsYz1kb2N1bWVudC5jb29raWUuc3BsaXQoIjsiKTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9Y1tkXTt3aGlsZShlLmNoYXJBdCgwKT09IiAiKWU9ZS5zdWJzdHJpbmcoMSxlLmxlbmd0aCk7aWYoZS5pbmRleE9mKGIpPT0wKXJldHVybiBlLnN1YnN0cmluZyhiLmxlbmd0aCxlLmxlbmd0aCl9cmV0dXJuIG51bGx9LHoyNDM6ZnVuY3Rpb24oYSl7dmFyIGI9YS5zbGljZSgtMSxhLmxlbmd0aCk9PSIvIj9hLnNsaWNlKDAsYS5sZW5ndGgtMSk6YTtyZXR1cm4gYj1hLnNsaWNlKDAsMSk9PSIvIj9hLnNsaWNlKDEsYS5sZW5ndGgpOmEsYn0sejE0MDpmdW5jdGlvbihhKXtpZihaLmJyb3dzZXI9PVouYnJvd3NlcnMuSUUpe3ZhciBiPShuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCksYz1NYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCksZD1jK2I7YSs9Ij9zdWZmaXhUb0Jsb2NrUGF0aENhY2hpbmc9IitkfXJldHVybiBhfSx6MTcwOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybihhLz1kLzIpPDE/Yy8yKmEqYSphKmEqYStiOmMvMiooKGEtPTIpKmEqYSphKmErMikrYn0sejIzMzpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gYSYmKGI9YS5zcGxpdCgiJiIpKSxifSx6MjQ5OmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuejE4NSgiejUwIiksYz10aGlzLnoxODUoIno0OSIpLGQ9dGhpcy56MTg1KCJ6NDgiKTtaLnNraW5QYXRoPXRoaXMuejE4NSgiejU2IiksWi5za2luTW9kZT10aGlzLnoxODUoIno1NCIpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MjYiKSkpfHwoWi5pbml0aWFsWD1wYXJzZUZsb2F0KHRoaXMuejE4NSgiejI2IikpKSxpc05hTihwYXJzZUZsb2F0KHRoaXMuejE4NSgiejI3IikpKXx8KFouaW5pdGlhbFk9cGFyc2VGbG9hdCh0aGlzLnoxODUoInoyNyIpKSksaXNOYU4ocGFyc2VGbG9hdCh0aGlzLnoxODUoInoyOCIpKSl8fChaLmluaXRpYWxaPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MjgiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzMiKSkpfHwoWi5taW5aPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzMiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzIiKSkpfHwoWi5tYXhaPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzIiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6ODAiKSkpfHwoWi56b29tU3BlZWQ9cGFyc2VGbG9hdCh0aGlzLnoxODUoIno4MCIpKSksaXNOYU4ocGFyc2VGbG9hdCh0aGlzLnoxODUoIno0NiIpKSl8fChaLnBhblNwZWVkPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6NDYiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MTgiKSkpfHwoWi5mYWRlSW5TcGVlZD1wYXJzZUZsb2F0KHRoaXMuejE4NSgiejE4IikpKSxaLnRvb2xiYXJWaXNpYmxlPXBhcnNlSW50KHRoaXMuejE4NSgiejY0IiksMTApLFoudG9vbGJhclBvc2l0aW9uPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6NjMiKSksWi50b29sdGlwc1Zpc2libGU9dGhpcy56MTg1KCJ6NjUiKSE9IjAiLFoubmF2aWdhdG9yVmlzaWJsZT1wYXJzZUludCh0aGlzLnoxODUoIno0MyIpLDEwKSxaLm5hdmlnYXRvclc9cGFyc2VJbnQodGhpcy56MTg1KCJ6NDQiKSwxMCksWi5uYXZpZ2F0b3JIPXBhcnNlSW50KHRoaXMuejE4NSgiejM5IiksMTApLFoubmF2aWdhdG9yTD1wYXJzZUludCh0aGlzLnoxODUoIno0MCIpLDEwKSxaLm5hdmlnYXRvclQ9cGFyc2VJbnQodGhpcy56MTg1KCJ6NDIiKSwxMCksWi5uYXZpZ2F0b3JGaXQ9dGhpcy56MTg1KCJ6MzgiKSxaLmNsaWNrWm9vbT10aGlzLnoxODUoInoxMCIpIT0iMCIsWi5jbGlja1Bhbj10aGlzLnoxODUoIno5IikhPSIwIixaLm1vdXNlUGFuPXRoaXMuejE4NSgiejM0IikhPSIwIixaLmtleXM9dGhpcy56MTg1KCJ6MjkiKSE9IjAiLFouY29uc3RyYWluUGFuPXRoaXMuejE4NSgiejEyIikhPSIwIixaLnNsaWRlclZpc2libGU9dGhpcy56MTg1KCJ6NTgiKSE9IjAiLFouZnVsbFBhZ2VWaXNpYmxlPXRoaXMuejE4NSgiejIzIikhPSIwIixaLnByb2dyZXNzVmlzaWJsZT10aGlzLnoxODUoIno1MyIpIT0iMCIsWi5sb2dvVmlzaWJsZT10aGlzLnoxODUoInozMSIpIT0iMCIsWi5sb2dvQ3VzdG9tUGF0aD10aGlzLnoxODUoInozMCIpLFouY2FudmFzPXRoaXMuejE4NSgiejgiKSE9IjAiLFouZGVidWc9dGhpcy56MTg1KCJ6MTciKSE9IjAiO2lmKHRoaXMuaXNTdHJWYWwoYSkpZm9yKHZhciBlPTAsZj1hLmxlbmd0aDtlPGY7ZSsrKXt2YXIgZz1hW2VdLGg9Zy5pbmRleE9mKCI9Iik7aWYoaD4wKXt2YXIgaT1nLnN1YnN0cmluZygwLGgpLGo9Zy5zdWJzdHJpbmcoaCsxKTtpZih0aGlzLmlzU3RyVmFsKGopKXN3aXRjaChpKXtjYXNlInpJbml0aWFsWCI6aXNOYU4ocGFyc2VGbG9hdChqKSl8fChaLmluaXRpYWxYPXBhcnNlRmxvYXQoaikpO2JyZWFrO2Nhc2UiekluaXRpYWxZIjppc05hTihwYXJzZUZsb2F0KGopKXx8KFouaW5pdGlhbFk9cGFyc2VGbG9hdChqKSk7YnJlYWs7Y2FzZSJ6SW5pdGlhbFpvb20iOmlzTmFOKHBhcnNlRmxvYXQoaikpfHwoWi5pbml0aWFsWj1wYXJzZUZsb2F0KGopLFouaW5pdGlhbFomJihaLmluaXRpYWxaLz0xMDApKTticmVhaztjYXNlInpNaW5ab29tIjohaXNOYU4ocGFyc2VGbG9hdChqKSkmJnBhcnNlRmxvYXQoaik+LjAxJiYoWi5taW5aPXBhcnNlRmxvYXQoaiksWi5taW5aJiYoWi5taW5aLz0xMDApKTticmVhaztjYXNlInpNYXhab29tIjppc05hTihwYXJzZUZsb2F0KGopKXx8KFoubWF4Wj1wYXJzZUZsb2F0KGopLFoubWF4WiYmKFoubWF4Wi89MTAwKSk7YnJlYWs7Y2FzZSJ6TmF2aWdhdG9yVmlzaWJsZSI6Wi5uYXZpZ2F0b3JWaXNpYmxlPXBhcnNlSW50KGosMTApO2JyZWFrO2Nhc2UielRvb2xiYXJWaXNpYmxlIjpaLnRvb2xiYXJWaXNpYmxlPXBhcnNlSW50KGosMTApO2JyZWFrO2Nhc2UiekxvZ29WaXNpYmxlIjpqPT0iMCImJihaLmxvZ29WaXNpYmxlPSExKTticmVhaztjYXNlInpTbGlkZXJWaXNpYmxlIjpqPT0iMCImJihaLnNsaWRlclZpc2libGU9ITEpO2JyZWFrO2Nhc2UiekZ1bGxQYWdlVmlzaWJsZSI6aj09IjAiJiYoWi5mdWxsUGFnZVZpc2libGU9ITEpO2JyZWFrO2Nhc2UielByb2dyZXNzVmlzaWJsZSI6aj09IjAiJiYoWi5wcm9ncmVzc1Zpc2libGU9ITEpO2JyZWFrO2Nhc2UielRvb2x0aXBzVmlzaWJsZSI6aj09IjAiJiYoWi50b29sdGlwc1Zpc2libGU9ITEpO2JyZWFrO2Nhc2UielNraW5QYXRoIjpaLnNraW5QYXRoPWo7YnJlYWs7ZGVmYXVsdDppZihiPT1jKWFsZXJ0KGQrIiAiK2kpO2Vsc2Ugc3dpdGNoKGkpe2Nhc2Uielpvb21TcGVlZCI6Wi56b29tU3BlZWQ9cGFyc2VJbnQoaiwxMCk7YnJlYWs7Y2FzZSJ6UGFuU3BlZWQiOloucGFuU3BlZWQ9cGFyc2VJbnQoaiwxMCk7YnJlYWs7Y2FzZSJ6RmFkZUluU3BlZWQiOlouZmFkZUluU3BlZWQ9cGFyc2VJbnQoaiwxMCk7YnJlYWs7Y2FzZSJ6VG9vbGJhclBvc2l0aW9uIjpaLnRvb2xiYXJQb3NpdGlvbj1wYXJzZUludChqLDEwKTticmVhaztjYXNlInpOYXZpZ2F0b3JXaWR0aCI6aXNOYU4ocGFyc2VGbG9hdChqKSl8fChaLm5hdmlnYXRvclc9cGFyc2VGbG9hdChqKSk7YnJlYWs7Y2FzZSJ6TmF2aWdhdG9ySGVpZ2h0Ijppc05hTihwYXJzZUZsb2F0KGopKXx8KFoubmF2aWdhdG9ySD1wYXJzZUZsb2F0KGopKTticmVhaztjYXNlInpOYXZpZ2F0b3JMZWZ0Ijppc05hTihwYXJzZUZsb2F0KGopKXx8KFoubmF2aWdhdG9yTD1wYXJzZUZsb2F0KGopKTticmVhaztjYXNlInpOYXZpZ2F0b3JUb3AiOmlzTmFOKHBhcnNlRmxvYXQoaikpfHwoWi5uYXZpZ2F0b3JUPXBhcnNlRmxvYXQoaikpO2JyZWFrO2Nhc2Uiek5hdmlnYXRvckZpdCI6aXNOYU4ocGFyc2VGbG9hdChqKSl8fChaLm5hdmlnYXRvckZpdD1wYXJzZUludChqLDEwKSk7YnJlYWs7Y2FzZSJ6Q2xpY2tab29tIjpqPT0iMCImJihaLmNsaWNrWm9vbT0hMSk7YnJlYWs7Y2FzZSJ6Q2xpY2tQYW4iOmo9PSIwIiYmKFouY2xpY2tQYW49ITEpO2JyZWFrO2Nhc2Uiek1vdXNlUGFuIjpqPT0iMCImJihaLm1vdXNlUGFuPSExKTticmVhaztjYXNlInpLZXlzIjpqPT0iMCImJihaLmtleXM9ITEpO2JyZWFrO2Nhc2UiekNvbnN0cmFpblBhbiI6aj09IjAiJiYoWi5jb25zdHJhaW5QYW49ITEpO2JyZWFrO2Nhc2UiekNvcHlyaWdodFBhdGgiOlouY29weXJpZ2h0UGF0aD1qO2JyZWFrO2Nhc2UieldhdGVybWFya1BhdGgiOloud2F0ZXJtYXJrUGF0aD1qO2JyZWFrO2Nhc2UiekxvZ29DdXN0b21QYXRoIjpaLmxvZ29DdXN0b21QYXRoPWo7YnJlYWs7Y2FzZSJ6Q2FudmFzIjpqPT0iMCImJihaLmNhbnZhcz0hMSk7aWYoIVouY2FudmFzU3VwcG9ydGVkfHwhWi5jYW52YXMpWi51c2VDYW52YXM9ITE7YnJlYWs7Y2FzZSJ6RGVidWciOmo9PSIxIiYmKFouZGVidWc9ITApfX19fX0sejI0MjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MTtiPGEubGVuZ3RoOylhW2ItMV09PWFbYl0/YS5zcGxpY2UoYiwxKTpiKys7cmV0dXJuIGF9LGludGVyc2VjdDpmdW5jdGlvbihhLGIpe3ZhciBjPVtdO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZT1hW2RdLGY9ITE7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aCYmZT49KGVsbXQyPWJbZ10pO2crKylpZihlbG10Mj09ZSl7Zj0hMDticmVha31mJiZjLnB1c2goYVtkXSl9cmV0dXJuIGN9LHN1YnRyYWN0OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY10sZT0hMTtmb3IodmFyIGY9MDtmPGIubGVuZ3RoJiZkPj0oZWxtdDI9YltmXSk7ZisrKWlmKGVsbXQyPT1kKXtlPSEwO2JyZWFrfWUmJmEuc3BsaWNlKGMtLSwxKX1yZXR1cm4gYX0sY3JlYXRlQ2FsbGJhY2s6ZnVuY3Rpb24oYSxiKXt2YXIgYz1bXTtmb3IodmFyIGQ9MixlPWFyZ3VtZW50cy5sZW5ndGg7ZDxlO2QrKyljLnB1c2goYXJndW1lbnRzW2RdKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD1jLmNvbmNhdChbXSk7Zm9yKHZhciBlPTAsZj1hcmd1bWVudHMubGVuZ3RoO2U8ZjtlKyspZC5wdXNoKGFyZ3VtZW50c1tlXSk7cmV0dXJuIGIuYXBwbHkoYSxkKX19LHoyNTU6ZnVuY3Rpb24oYSl7YWxlcnQoYSl9LGNyZWF0ZUNvbnRhaW5lckVsZW1lbnQ6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGksaixrLGwsbSxuLG8pe3ZhciBwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYSk7dGhpcy5pc1N0clZhbChiKSYmKHAuaWQ9Yik7dmFyIHE9cC5zdHlsZTtyZXR1cm4gcS5kaXNwbGF5PXRoaXMuaXNTdHJWYWwoYyk/YzoiaW5saW5lLWJsb2NrIixxLnBvc2l0aW9uPXRoaXMuaXNTdHJWYWwoZCk/ZDoic3RhdGljIixxLm92ZXJmbG93PXRoaXMuaXNTdHJWYWwoZSk/ZToiaGlkZGVuIixhPT0iY2FudmFzIj8odGhpcy5pc1N0clZhbChmKSYmcC5zZXRBdHRyaWJ1dGUoIndpZHRoIixmKSx0aGlzLmlzU3RyVmFsKGcpJiZwLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixnKSk6KHRoaXMuaXNTdHJWYWwoZikmJihxLndpZHRoPWYpLHRoaXMuaXNTdHJWYWwoZyYmZykmJihxLmhlaWdodD1nKSksdGhpcy5pc1N0clZhbChoKSYmKHEubGVmdD1oKSx0aGlzLmlzU3RyVmFsKGkpJiYocS50b3A9aSkscS5ib3JkZXJTdHlsZT10aGlzLmlzU3RyVmFsKGopP2o6Im5vbmUiLHEuYm9yZGVyV2lkdGg9dGhpcy5pc1N0clZhbChrKT9rOiIwcHgiLHEuYmFja2dyb3VuZD10aGlzLmlzU3RyVmFsKGwpP2w6InRyYW5zcGFyZW50IG5vbmUiLHEubWFyZ2luPXRoaXMuaXNTdHJWYWwobSk/bToiMHB4IixxLnBhZGRpbmc9dGhpcy5pc1N0clZhbChuKT9uOiIwcHgiLHRoaXMuaXNTdHJWYWwobykmJihxLmN1cnNvcj1vKSxwfSxjcmVhdGVDZW50ZXJlZEVsZW1lbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiKSxjPVtdO2MucHVzaCgnPGRpdiBzdHlsZT0iZGlzcGxheTp0YWJsZTsgaGVpZ2h0OjEwMCU7IHdpZHRoOjEwMCU7JyksYy5wdXNoKCJib3JkZXI6bm9uZTsgbWFyZ2luOjBweDsgcGFkZGluZzowcHg7IiksYy5wdXNoKCcjcG9zaXRpb246cmVsYXRpdmU7IG92ZXJmbG93OmhpZGRlbjsgdGV4dC1hbGlnbjpsZWZ0OyI+JyksYy5wdXNoKCc8ZGl2IHN0eWxlPSIjcG9zaXRpb246YWJzb2x1dGU7ICN0b3A6NTAlOyB3aWR0aDoxMDAlOyAnKSxjLnB1c2goImJvcmRlcjpub25lOyBtYXJnaW46MHB4OyBwYWRkaW5nOjBweDsiKSxjLnB1c2goJ2Rpc3BsYXk6dGFibGUtY2VsbDsgdmVydGljYWwtYWxpZ246bWlkZGxlOyI+JyksYy5wdXNoKCc8ZGl2IHN0eWxlPSIjcG9zaXRpb246cmVsYXRpdmU7ICN0b3A6LTUwJTsgd2lkdGg6MTAwJTsgJyksYy5wdXNoKCJib3JkZXI6bm9uZTsgbWFyZ2luOjBweDsgcGFkZGluZzowcHg7IiksYy5wdXNoKCd0ZXh0LWFsaWduOmNlbnRlcjsiPjwvZGl2PjwvZGl2PjwvZGl2PicpLGIuaW5uZXJIVE1MPWMuam9pbigiIiksYj1iLmZpcnN0Q2hpbGQ7dmFyIGQ9YixlPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO3doaWxlKGUubGVuZ3RoPjApZD1lWzBdLGU9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7cmV0dXJuIGQuYXBwZW5kQ2hpbGQoYSksYn0sY3JlYXRlR3JhcGhpY0VsZW1lbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJpbWciKSxjPW51bGw7cmV0dXJuIFouYnJvd3Nlcj09Wi5icm93c2Vycy5JRSYmWi5icm93c2VyVmVyc2lvbjw3PyhjPXRoaXMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgic3BhbiIsbnVsbCwiaW5saW5lLWJsb2NrIiksYi5vbmxvYWQ9ZnVuY3Rpb24oKXtjLnN0eWxlLndpZHRoPWMuc3R5bGUud2lkdGh8fGIud2lkdGgrInB4IixjLnN0eWxlLmhlaWdodD1jLnN0eWxlLmhlaWdodHx8Yi5oZWlnaHQrInB4IixiLm9ubG9hZD1udWxsLGI9bnVsbH0sYy5zdHlsZS5maWx0ZXI9InByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYUltYWdlTG9hZGVyKHNyYz0nIithKyInLCBzaXppbmdNZXRob2Q9J3NjYWxlJykiKTooYz1iLGMuc3JjPWEpLGN9LHoyNTE6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGksaixrLGwpe3ZhciBtPWEucGFyZW50Tm9kZS5zdHlsZTttLmNvbG9yPWIsbS5mb250RmFtaWx5PWMsbS5mb250U2l6ZT1kLG0uZm9udFNpemVBZGp1c3Q9ZSxtLmZvbnRTdHlsZT1mLG0uZm9udFN0cmV0Y2g9ZyxtLmZvbnRWYXJpYW50PWgsbS5mb250V2VpZ2h0PWksbS5saW5lSGVpZ2h0PWosbS50ZXh0QWxpZ249ayxtLnRleHREZWNvcmF0aW9uPWx9LHoxNTg6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDtpZih3aW5kb3cuQWN0aXZlWE9iamVjdCl0cnl7Yj1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpLGIuYXN5bmM9ITEsYi5sb2FkWE1MKGEpfWNhdGNoKGMpe3RoaXMuejI1NShjLm5hbWUrdGhpcy56MTg1KCJ6ODIiKStjLm1lc3NhZ2UpfWVsc2UgaWYod2luZG93LkRPTVBhcnNlcil0cnl7dmFyIGQ9bmV3IERPTVBhcnNlcjtiPWQucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIil9Y2F0Y2goYyl7dGhpcy56MjU1KGMubmFtZSt0aGlzLnoxODUoIno4MiIpK2MubWVzc2FnZSl9ZWxzZSB0aGlzLnoyNTUodGhpcy56MTg1KCJ6OTgiKSk7cmV0dXJuIGJ9LFBvaW50OmZ1bmN0aW9uKGEsYil7dGhpcy54PXR5cGVvZiBhPT0ibnVtYmVyIj9hOjAsdGhpcy55PXR5cGVvZiBiPT0ibnVtYmVyIj9iOjB9LFBvaW50M0Q6ZnVuY3Rpb24oYSxiLGMpe3RoaXMueD10eXBlb2YgYT09Im51bWJlciI/YTowLHRoaXMueT10eXBlb2YgYj09Im51bWJlciI/YjowLHRoaXMuej10eXBlb2YgYz09Im51bWJlciI/YzowfSx6MTg1OmZ1bmN0aW9uKGEpe3ZhciBiPSIiO3N3aXRjaChhKXtjYXNlIno1MCI6Yj0iRW5hYmxlIERldmVsb3BlciBwYXJhbWV0ZXJzIjticmVhaztjYXNlIno0OSI6Yj0iQ2hhbmdpbmcgVGhpcyBWaW9sYXRlcyBMaWNlbnNlIEFncmVlbWVudCI7YnJlYWs7Y2FzZSJ6NDgiOmI9IlN1cHBvcnQgZm9yIHRoaXMgcGFyYW1ldGVyIGlzIGVuYWJsZWQgb25seSBpbiB0aGUgWm9vbWlmeSBJbWFnZSBWaWV3ZXIgaW5jbHVkZWQgaW4gdGhlIFpvb21pZnkgSFRNTDUgRGV2ZWxvcGVyIGVkaXRpb246ICI7YnJlYWs7Y2FzZSJ6MjUiOmI9IjEwMCI7YnJlYWs7Y2FzZSJ6NjAiOmI9IjMwMDAwIjticmVhaztjYXNlIno2MSI6Yj0iMjU2IjticmVhaztjYXNlIno1OSI6Yj0iMS4xNSI7YnJlYWs7Y2FzZSJ6NjIiOmI9IjMwMCI7YnJlYWs7Y2FzZSJ6NyI6Yj0iNiI7YnJlYWs7Y2FzZSJ6NiI6Yj0iMyI7YnJlYWs7Y2FzZSJ6NSI6Yj0iMyI7YnJlYWs7Y2FzZSJ6NCI6Yj0iMiI7YnJlYWs7Y2FzZSJ6MyI6Yj0iMCI7YnJlYWs7Y2FzZSJ6NDUiOmI9IjIiO2JyZWFrO2Nhc2UiejQ2IjpiPSI1IjticmVhaztjYXNlIno0NyI6Yj0iMTAiO2JyZWFrO2Nhc2UiejgwIjpiPSI1IjticmVhaztjYXNlIno4MSI6Yj0iMC4wMiI7YnJlYWs7Y2FzZSJ6NzciOmI9IjMwIjticmVhaztjYXNlIno3OCI6Yj0iMjAwIjticmVhaztjYXNlIno3OSI6Yj0iMTAiO2JyZWFrO2Nhc2UiejEwVElFUlNLSVBUSFJFU0hPTEQiOmI9IjAxLiI7YnJlYWs7Y2FzZSJ6MjQiOmI9IjEwIjticmVhaztjYXNlInoxOCI6Yj0iNSI7YnJlYWs7Y2FzZSJ6MTkiOmI9IjAuMDY3IjticmVhaztjYXNlIno2NCI6Yj0iNCI7YnJlYWs7Y2FzZSJ6NjMiOmI9IjEiO2JyZWFrO2Nhc2UiejY1IjpiPSIxIjticmVhaztjYXNlIno0MyI6Yj0iMiI7YnJlYWs7Y2FzZSJ6NDQiOmI9IjE1MCI7YnJlYWs7Y2FzZSJ6MzkiOmI9IjEwMCI7YnJlYWs7Y2FzZSJ6NDAiOmI9IjAiO2JyZWFrO2Nhc2UiejQyIjpiPSIwIjticmVhaztjYXNlInozOCI6Yj1udWxsO2JyZWFrO2Nhc2UiejM2IjpiPSIjZmZmZmZmIjticmVhaztjYXNlInozNk5PQUxQSEEiOmI9IiNmYmZhZmEiO2JyZWFrO2Nhc2UiejM1IjpiPSIwLjc1IjticmVhaztjYXNlIno0MSI6Yj0iYmx1ZSI7YnJlYWs7Y2FzZSJ6NTUiOmI9InNraW5GaWxlcy54bWwiO2JyZWFrO2Nhc2UiejU2IjpiPSJBc3NldHMvU2tpbnMvRGVmYXVsdCI7YnJlYWs7Y2FzZSJ6NTQiOmI9IjAiO2JyZWFrO2Nhc2UiejEyIjpiPSIxIjticmVhaztjYXNlIno1OCI6Yj0iMSI7YnJlYWs7Y2FzZSJ6NTciOmI9IjEwIjticmVhaztjYXNlInoyMyI6Yj0iMSI7YnJlYWs7Y2FzZSJ6MjIiOmI9IndoaXRlIjticmVhaztjYXNlInoyMSI6Yj0iWCI7YnJlYWs7Y2FzZSJ6MjAiOmI9Ilx0I0Y4RjhGOCI7YnJlYWs7Y2FzZSJ6NTMiOmI9IjEiO2JyZWFrO2Nhc2UiejUxIjpiPSI1MDAiO2JyZWFrO2Nhc2UiejUyIjpiPSIgIjticmVhaztjYXNlInozMSI6Yj0iMSI7YnJlYWs7Y2FzZSJ6MzAiOmI9bnVsbDticmVhaztjYXNlIno4IjpiPSIxIjticmVhaztjYXNlInoxNyI6Yj0iMCI7YnJlYWs7Y2FzZSJ6MTYiOmI9ImxpZ2h0Z3JheSI7YnJlYWs7Y2FzZSJ6MTQiOmI9IndoaXRlIjticmVhaztjYXNlInoxMyI6Yj0iQWdyZWUiO2JyZWFrO2Nhc2UiejE1IjpiPSJFeGl0IjticmVhaztjYXNlIno3MyI6Yj0iMC42IjticmVhaztjYXNlIno3NCI6Yj0iMC4zMyI7YnJlYWs7Y2FzZSJ6NzYiOmI9IjUxMiI7YnJlYWs7Y2FzZSJ6NzUiOmI9IjM4NCI7YnJlYWs7Y2FzZSJ6MjYiOmI9bnVsbDticmVhaztjYXNlInoyNyI6Yj1udWxsO2JyZWFrO2Nhc2UiejI4IjpiPW51bGw7YnJlYWs7Y2FzZSJ6MzMiOmI9bnVsbDticmVhaztjYXNlInozMiI6Yj0iMSI7YnJlYWs7Y2FzZSJ6MTAiOmI9IjEiO2JyZWFrO2Nhc2UiejkiOmI9IjEiO2JyZWFrO2Nhc2UiejM0IjpiPSIxIjticmVhaztjYXNlInoyOSI6Yj0iMSI7YnJlYWs7Y2FzZSJ6NjciOmI9IlRoaXMgcGFuZWwgaXMgZW5hYmxlZCB1c2luZyB0aGUgSFRNTCBwYXJhbWV0ZXIgJ3pEZWJ1Zz0xJy4gSXQgY2FuIGJlIGNhbGxlZCBhcyBmb2xsb3dzOlxuXG4gICBaLlV0aWxzLnRyYWNlKCd2YWx1ZSB0byBkaXNwbGF5Jyk7ICBcblxuVGhlIGJ1dHRvbnMgYmVsb3cgZGlzcGxheSBvciBtb2RpZnkgaW1wb3J0YW50IHN0YXRlIHZhbHVlcy4gIFdlYiBkZXNpZ25lcnMgbmV3IHRvIEphdmFTY3JpcHQgd2lsbCBhbHNvIGJlbmVmaXQgZnJvbSB0aGUgY29uc29sZSwgdHJhY2UsIHByb2ZpbGluZywgYW5kIG90aGVyIGRlYnVnZ2luZyBmZWF0dXJlcyBvZiBsZWFkaW5nIGJyb3dzZXJzLiI7YnJlYWs7Y2FzZSJ6NjgiOmI9ImxpZ2h0Z3JheSI7YnJlYWs7Y2FzZSJ6NjYiOmI9IndoaXRlIjticmVhaztjYXNlIno2OSI6Yj0iU2hvdyBHbG9iYWxzIjticmVhaztjYXNlIno3MiI6Yj0iVG9nZ2xlIERpc3BsYXkiO2JyZWFrO2Nhc2UiejcwIjpiPSJUb2dnbGUgQmFja2ZpbGwiO2JyZWFrO2Nhc2UiejcxIjpiPSJUb2dnbGUgQ29uc3RyYWluIFBhbiI7YnJlYWs7Y2FzZSJ6OTkiOmI9IkJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBYTUxIdHRwUmVxdWVzdC4iO2JyZWFrO2Nhc2Uiejg3LUlNQUdFWE1MIjpiPSJFcnJvciBsb2FkaW5nIGltYWdlOiBwbGVhc2UgbWFrZSBzdXJlIGltYWdlIHBhdGggaW4gd2ViIHBhZ2UgbWF0Y2hlcyBpbWFnZSBmb2xkZXIgbG9jYXRpb24gb24gd2Vic2VydmVyLiI7YnJlYWs7Y2FzZSJ6ODctVE9PTEJBUlhNTCI6Yj0iRXJyb3IgbG9hZGluZyB0b29sYmFyOiBwbGVhc2UgdmVyaWZ5IHNraW4gZmlsZXMgYXJlIG9uIHdlYnNlcnZlciBpbiBzYW1lIGZvbGRlciBhcyB6MTIyLmpzIGZpbGUgYW5kIGFyZSBpbiBkZWZhdWx0IGZvbGRlciBzdHJ1Y3R1cmUgJ0Fzc2V0cy9Ta2lucy9EZWZhdWx0Jywgb3IgYWRkIHpTa2luUGF0aCBwYXJhbWV0ZXIgdG8gd2VicGFnZS4iO2JyZWFrO2Nhc2Uiejg3IjpiPSJFcnJvciBtYWtpbmcgbmV0d29yayByZXF1ZXN0OiBwb3NzaWJsZSBpbnZhbGlkIHBhdGggb3IgbmV0d29yayBlcnJvci4iO2JyZWFrO2Nhc2Uiejg0IjpiPSJJbWFnZSBmYWlsZWQgdG8gbG9hZDogcG9zc2libGUgaW52YWxpZCBwYXRoLCBtaXNzaW5nIGltYWdlLCBvciBuZXR3b3JrIGVycm9yLiI7YnJlYWs7Y2FzZSJ6ODkiOmI9IkVycm9yIHJlbGF0ZWQgdG8gbmV0d29yayBzZWN1cml0eTogIjticmVhaztjYXNlIno5MCI6Yj0iRXJyb3IgcmVsYXRlZCB0byBuZXR3b3JrIHN0YXR1czogIjticmVhaztjYXNlIno4MiI6Yj0iIGNvbnZlcnRpbmcgWE1MIHRleHQgdG8gWE1MIGRvYyAoRE9NUGFyc2VyKTogIjticmVhaztjYXNlIno5OCI6Yj0iQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IFhNTCBET00uIjticmVhaztjYXNlInoxMDAiOmI9IlhNTCBpbnZhbGlkLiI7YnJlYWs7Y2FzZSJ6ODYiOmI9IkltYWdlIFhNTCBpbnZhbGlkLiI7YnJlYWs7Y2FzZSJ6ODMiOmI9IiB3aGlsZSBleGVjdXRpbmcgY2FsbGJhY2s6ICI7YnJlYWs7Y2FzZSJ6ODUiOmI9IkltYWdlIHRpbWVkIG91dDogIjticmVhaztjYXNlIno4OCI6Yj0iTmF2aWdhdG9yIGltYWdlIGZhaWxlZCB0byBsb2FkOiBwb3NzaWJsZSBpbnZhbGlkIHBhdGgsIG1pc3NpbmcgaW1hZ2UsIG9yIG5ldHdvcmsgZXJyb3IuIjticmVhaztjYXNlIno5MSI6Yj0iU2tpbiBYTUwgaW52YWxpZC4iO2JyZWFrO2Nhc2UiejkyIjpiPSJUaGUgc2tpbiBYTUwgZmlsZSBoYXMgb25lIG9yIG1vcmUgZmF1bHR5IG5hbWUgbGluZXMuIjticmVhaztjYXNlIno5NyI6Yj0iV2F0ZXJtYXJrIGltYWdlIGZhaWxlZCB0byBsb2FkOiAiO2JyZWFrO2Nhc2UiejkzIjpiPSJVbmtub3duIGVsZW1lbnQgc3R5bGUgLSBubyBrbm93biBtZXRob2QgdG8gaWRlbnRpZnkuIjticmVhaztjYXNlIno5NCI6Yj0iVW5rbm93biBtb3VzZSBwb3NpdGlvbiAtIG5vIGtub3duIG1ldGhvZCB0byBjYWxjdWxhdGUuIjticmVhaztjYXNlIno5NSI6Yj0iVW5rbm93biBtb3VzZSBzY3JvbGwgLSBubyBrbm93biBtZXRob2QgdG8gY2FsY3VsYXRlLiI7YnJlYWs7Y2FzZSJ6OTYiOmI9IlVua25vd24gd2luZG93IHNpemUgLSBubyBrbm93biBtZXRob2QgdG8gY2FsY3VsYXRlLiI7YnJlYWs7Y2FzZSJ6MTA2IjpiPSJMYXVuY2ggWm9vbWlmeSBXZWJzaXRlIjticmVhaztjYXNlInoxMDciOmI9Ik1pbmltaXplIFRvb2xiYXIiO2JyZWFrO2Nhc2UiejEwNSI6Yj0iRXhwYW5kIFRvb2xiYXIiO2JyZWFrO2Nhc2UiejEyMCI6Yj0iWm9vbSBPdXQiO2JyZWFrO2Nhc2UiejExNCI6Yj0iWm9vbSBJbiBBbmQgT3V0IjticmVhaztjYXNlInoxMTkiOmI9Ilpvb20gSW4iO2JyZWFrO2Nhc2UiejEwOSI6Yj0iUGFuIExlZnQiO2JyZWFrO2Nhc2UiejExMSI6Yj0iUGFuIFVwIjticmVhaztjYXNlInoxMDgiOmI9IlBhbiBEb3duIjticmVhaztjYXNlInoxMTAiOmI9IlBhbiBSaWdodCI7YnJlYWs7Y2FzZSJ6MTEyIjpiPSJSZXNldCBJbml0aWFsIFZpZXciO2JyZWFrO2Nhc2UiejExOCI6Yj0iVG9nZ2xlIEZ1bGwgUGFnZSBWaWV3IjticmVhaztjYXNlInoxMDIiOmI9IkNhbmNlbCBGdWxsIFBhZ2UgVmlldyI7YnJlYWs7Y2FzZSJ6MTAzIjpiPSJBZ3JlZSB0byBjb3B5cmlnaHQgYW5kIHZpZXcgaW1hZ2VzIjticmVhaztjYXNlInoxMDQiOmI9IkV4aXQgYW5kIGRvIG5vdCB2aWV3IGltYWdlcyI7YnJlYWs7Y2FzZSJ6MTEzIjpiPSJUb2dnbGUgRnVsbCBQYWdlIFZpZXciO2JyZWFrO2Nhc2UiejExNyI6Yj0iVG9nZ2xlIFZpZXdwb3J0IERpc3BsYXkiO2JyZWFrO2Nhc2UiejExNSI6Yj0iVG9nZ2xlIFZpZXdwb3J0IEJhY2tmaWxsIjticmVhaztjYXNlInoxMTYiOmI9IlRvZ2dsZSBDb25zdHJhaW4gUGFuIjticmVhaztkZWZhdWx0OmI9IlVuZXhwZWN0ZWQgcmVzb3VyY2UgcmVxdWVzdCJ9cmV0dXJuIGJ9LHoyNTM6ZnVuY3Rpb24oKXt2YXIgYT0iIjthKz0iXG4iLGErPSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk9PTUlGWSBJTUFHRSBWSUVXRVIgLSBDVVJSRU5UIFZBTFVFU1xuIixhKz0iXG4iLGErPSJJTUFHRSAmIFNLSU46ICAgICIsYSs9IlouaW1hZ2VQYXRoPSIrWi5pbWFnZVBhdGgrIiwgICAiLGErPSJaLnNraW5QYXRoPSIrWi5za2luUGF0aCsiLCAgICIsYSs9Ilouc2tpbk1vZGU9IitaLnNraW5Nb2RlKyIsICAgIixhKz0iWi5pbWFnZVc9IitaLmltYWdlVysiLCAgICIsYSs9IlouaW1hZ2VIPSIrWi5pbWFnZUgrIiwgICAiLGErPSJ0aWVyQ291bnQ9IitaLlZpZXdwb3J0LnoxODYoKSsiLCAgICIsYSs9IlRJTEVfU0laRT0iK1ouVmlld3BvcnQuejE5NSgpKyJcbiIsYSs9IlxuIixhKz0iUEFHRSAmIEJST1dTRVI6ICAgICIsYSs9IloucGFnZUNvbnRhaW5lcj0iK1oucGFnZUNvbnRhaW5lcisiLCAgICIsYSs9IlouYnJvd3Nlcj0iK1ouYnJvd3NlcisiLCAgICIsYSs9IlouYnJvd3NlclZlcnNpb249IitaLmJyb3dzZXJWZXJzaW9uKyIsICAgIixhKz0iWi5jYW52YXNTdXBwb3J0ZWQ9IitaLmNhbnZhc1N1cHBvcnRlZCsiLCAgICIsYSs9IlouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZD0iK1ouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZCsiLCAgICIsYSs9IlouY3NzVHJhbnNmb3JtUHJvcGVydHk9IitaLmNzc1RyYW5zZm9ybVByb3BlcnR5KyIsICAgIixhKz0iWi5jc3NUcmFuc2Zvcm1Ob1VuaXRzPSIrWi5jc3NUcmFuc2Zvcm1Ob1VuaXRzKyIsICAgIixhKz0iWi5hbHBoYVN1cHBvcnRlZD0iK1ouYWxwaGFTdXBwb3J0ZWQrIiwgICAiLGErPSJaLnJlbmRlclF1YWxpdHk9IitaLnJlbmRlclF1YWxpdHkrIiwgICAiLGErPSJaLm1vYmlsZURldmljZT0iK1oubW9iaWxlRGV2aWNlKyJcbiIsYSs9IlxuIixhKz0iVklFV0VSIE9QVElPTlMgJiBERUZBVUxUUzogICAgIixhKz0iWi5pbml0aWFsWD0iK1ouaW5pdGlhbFgrIiwgICAiLGErPSJaLmluaXRpYWxZPSIrWi5pbml0aWFsWSsiLCAgICIsYSs9IlouaW5pdGlhbFo9IitaLmluaXRpYWxaKyIsICAgIixhKz0iWi5taW5aPSIrWi5taW5aKyIsICAgIixhKz0iWi5tYXhaPSIrWi5tYXhaKyIsICAgIixhKz0iWi5maXRaPSIrWi5maXRaKyIsICAgIixhKz0iWi56b29tU3BlZWQ9IitaLnpvb21TcGVlZCsiLCAgICIsYSs9IloucGFuU3BlZWQ9IitaLnBhblNwZWVkKyIsICAgIixhKz0iWi5mYWRlSW5TcGVlZD0iK1ouZmFkZUluU3BlZWQrIiwgICAiLGErPSJaLnRvb2xiYXJWaXNpYmxlPSIrWi50b29sYmFyVmlzaWJsZSsiLCAgICIsYSs9IloudG9vbGJhclc9IitaLnRvb2xiYXJXKyIsICAgIixhKz0iWi50b29sYmFyQ3VycmVudFc9IitaLnRvb2xiYXJDdXJyZW50VysiLCAgICIsYSs9IloudG9vbGJhckg9IitaLnRvb2xiYXJIKyIsICAgIixhKz0iWi50b29sYmFyUG9zaXRpb249IitaLnRvb2xiYXJQb3NpdGlvbisiLCAgICIsYSs9IloudG9vbHRpcHNWaXNpYmxlPSIrWi50b29sdGlwc1Zpc2libGUrIiwgICAiLGErPSJaLm5hdmlnYXRvclZpc2libGU9IitaLm5hdmlnYXRvclZpc2libGUrIiwgICAiLGErPSJaLm5hdmlnYXRvclc9IitaLm5hdmlnYXRvclcrIiwgICAiLGErPSJaLm5hdmlnYXRvckg9IitaLm5hdmlnYXRvckgrIiwgICAiLGErPSJaLm5hdmlnYXRvckw9IitaLm5hdmlnYXRvckwrIiwgICAiLGErPSJaLm5hdmlnYXRvclQ9IitaLm5hdmlnYXRvclQrIiwgICAiLGErPSJaLm5hdmlnYXRvckZpdD0iK1oubmF2aWdhdG9yRml0KyIsICAgIixhKz0iWi5jbGlja1pvb209IitaLmNsaWNrWm9vbSsiLCAgICIsYSs9IlouY2xpY2tQYW49IitaLmNsaWNrUGFuKyIsICAgIixhKz0iWi5tb3VzZVBhbj0iK1oubW91c2VQYW4rIiwgICAiLGErPSJaLmtleXM9IitaLmtleXMrIiwgICAiLGErPSJaLmNvbnN0cmFpblBhbj0iK1ouY29uc3RyYWluUGFuKyIsICAgIixhKz0iV2F0ZXJtYXJrIGFscGhhID0gIitaLlV0aWxzLnoxODUoIno3MyIpKyIsICAgIixhKz0iWi53YXRlcm1hcmtQYXRoPSIrWi53YXRlcm1hcmtQYXRoKyIsICAgIixhKz0iWi5jb3B5cmlnaHRQYXRoPSIrWi5jb3B5cmlnaHRQYXRoKyIsICAgIixhKz0iWi5zbGlkZXJWaXNpYmxlPSIrWi5zbGlkZXJWaXNpYmxlKyIsICAgIixhKz0iWi5mdWxsUGFnZVZpc2libGU9IitaLmZ1bGxQYWdlVmlzaWJsZSsiLCAgICIsYSs9IloucHJvZ3Jlc3NWaXNpYmxlPSIrWi5wcm9ncmVzc1Zpc2libGUrIiwgICAiLGErPSJaLmxvZ29WaXNpYmxlPSIrWi5sb2dvVmlzaWJsZSsiLCAgICIsYSs9IloubG9nb0N1c3RvbVBhdGg9IitaLmxvZ29DdXN0b21QYXRoKyIsICAgIixhKz0iWi5jYW52YXM9IitaLmNhbnZhcysiXG4iLGErPSJcbiIsYSs9IklOVEVSTkFMIFZBTFVFUzogICAgIixhKz0iXG4iLGErPSJkaXNwbGF5Vz0iK1ouVmlld3BvcnQuejIwMSgpKyIsICAgIixhKz0iZGlzcGxheUg9IitaLlZpZXdwb3J0LnoxNzkoKSsiLCAgICIsYSs9InRpZXJDdXJyZW50PSIrWi5WaWV3cG9ydC56MTg3KCkrIiwgICAiLGErPSJ0aWVyU2NhbGU9IitaLlZpZXdwb3J0LnoxODkoKSsiLCAgICIsYSs9IlRJRVJTX01BWF9TQ0FMRV9VUD0iK1ouVmlld3BvcnQuejE5NCgpKyIsICAgIixhKz0iVElFUlNfTUFYX1NDQUxFX0RPV049IitaLlZpZXdwb3J0LnoxOTMoKSsiLCAgICIsYSs9IlRJTEVTX01BWF9DQUNIRT0iK1ouVmlld3BvcnQuejE5NygpKyIsICAgIixhKz0iWi51c2VDYW52YXM9IitaLnVzZUNhbnZhcysiXG4iLGErPSJcbiIsYSs9IklOVEVSTkFMIExJU1RTOiAgICAiLGErPSJ0aWVyV3M9IitaLlZpZXdwb3J0LnoxOTIoKSsiLCAgICIsYSs9InRpZXJIcz0iK1ouVmlld3BvcnQuejE4OCgpKyIsICAgIixhKz0idGllclRpbGVDb3VudHM9IitaLlZpZXdwb3J0LnoxOTEoKSsiLCAgICIsYSs9InRpbGVzTG9hZGluZ05hbWVzPSIrWi5WaWV3cG9ydC56MTk2KCkrIlxuIixhKz0iXG4iLGFsZXJ0KGEpfSx6MjU2OmZ1bmN0aW9uKCl7Wi5UcmFjZURpc3BsYXk/Wi5UcmFjZURpc3BsYXkuZGlzcGxheT09ImlubGluZS1ibG9jayI/Wi5UcmFjZURpc3BsYXkuZGlzcGxheT0ibm9uZSI6Wi5UcmFjZURpc3BsYXkuZGlzcGxheT0iaW5saW5lLWJsb2NrIjpaLlV0aWxzLmNvbmZpZ3VyZVRyYWNlRGlzcGxheSgpfSxjb25maWd1cmVUcmFjZURpc3BsYXk6ZnVuY3Rpb24oKXt2YXIgYT1aLnZpZXdlclcvMyxiPVoudmlld2VySC8zKzQ1LGM9MTAsZD1wYXJzZUZsb2F0KFoudmlld2VySCkvMyxlPXRoaXMuejE4NSgiejY4Iik7Wi5UcmFjZURpc3BsYXk9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJUcmFjZURpc3BsYXkiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsImhpZGRlbiIsYSsicHgiLGIrInB4IixjKyJweCIsZCsicHgiLCJzb2xpZCIsIjFweCIsZSwiMHB4IiwiMTBweCIpLFouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChaLlRyYWNlRGlzcGxheSksWi50cmFjZXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiVEVYVEFSRUEiKTt2YXIgZj1aLnRyYWNlcy5zdHlsZTtmLndpZHRoPWEtMTUrInB4IixmLmhlaWdodD1iLTYwKyJweCIsZi5mb250RmFtaWx5PSJ2ZXJkYW5hIixmLmZvbnRTaXplPSIxMHB4IixmLmJvcmRlcj0ic29saWQiLGYuYm9yZGVyV2lkdGg9IjFweCIsZi5wYWRkaW5nPSI1cHgiLGYucmVzaXplPSJub25lIixaLnRyYWNlcy52YWx1ZT0iVHJhY2UgVmFsdWVzXG4iLFouVHJhY2VEaXNwbGF5LmFwcGVuZENoaWxkKFoudHJhY2VzKTt2YXIgZz01OCxoPTQyLGk9MjAsaj1iLWgvMi0xMCxrPTEwLGw9dGhpcy56MTg1KCJ6NjYiKSxtPXRoaXMuejE4NSgiejY5Iiksbj1uZXcgdGhpcy5CdXR0b24oImJ1dHRvblNob3dHbG9iYWxzIixtLG51bGwsbnVsbCxudWxsLG51bGwsZysicHgiLGgrInB4IixpKyJweCIsaisicHgiLCJtb3VzZWRvd24iLHRoaXMuejI1MywiejExMyIsInNvbGlkIiwiMXB4IixsLCIwcHgiLCIwcHgiKTtaLlRyYWNlRGlzcGxheS5hcHBlbmRDaGlsZChuLmVsbXQpLGkrPWcrazt2YXIgbT10aGlzLnoxODUoIno3MiIpLG89bmV3IHRoaXMuQnV0dG9uKCJidXR0b25Ub2dnbGVEaXNwbGF5IixtLG51bGwsbnVsbCxudWxsLG51bGwsZysicHgiLGgrInB4IixpKyJweCIsaisicHgiLCJtb3VzZWRvd24iLFouVmlld3BvcnQuejI3MiwiejExNyIsInNvbGlkIiwiMXB4IixsLCIwcHgiLCIwcHgiKTtaLlRyYWNlRGlzcGxheS5hcHBlbmRDaGlsZChvLmVsbXQpLGkrPWcrazt2YXIgbT10aGlzLnoxODUoIno3MCIpLHA9bmV3IHRoaXMuQnV0dG9uKCJidXR0b25Ub2dnbGVCYWNrZmlsbCIsbSxudWxsLG51bGwsbnVsbCxudWxsLGcrInB4IixoKyJweCIsaSsicHgiLGorInB4IiwibW91c2Vkb3duIixaLlZpZXdwb3J0LnoyNzEsInoxMTUiLCJzb2xpZCIsIjFweCIsbCwiMHB4IiwiMHB4Iik7Wi5UcmFjZURpc3BsYXkuYXBwZW5kQ2hpbGQocC5lbG10KSxpKz1nK2ssZys9MTI7dmFyIG09dGhpcy56MTg1KCJ6NzEiKSxxPW5ldyB0aGlzLkJ1dHRvbigiYnV0dG9uVG9nZ2xlQ29uc3RyYWluUGFuIixtLG51bGwsbnVsbCxudWxsLG51bGwsZysicHgiLGgrInB4IixpKyJweCIsaisicHgiLCJtb3VzZWRvd24iLFouVmlld3BvcnQudG9nZ2xlQ29uc3RyYWluUGFuLCJ6MTE2Iiwic29saWQiLCIxcHgiLGwsIjBweCIsIjBweCIpO1ouVHJhY2VEaXNwbGF5LmFwcGVuZENoaWxkKHEuZWxtdCl9LHRyYWNlOmZ1bmN0aW9uKGEpe1ouVHJhY2VEaXNwbGF5fHxaLlV0aWxzLmNvbmZpZ3VyZVRyYWNlRGlzcGxheSgpLFoudHJhY2VzJiYoWi50cmFjZXMudmFsdWUrPSJcbiIrYSsiXG4iKX19"></script>

        <style type="text/css"> #myContainer { width: 900px; height: 550px } </style>
        <script id="script_zm_mycontainer"  type="text/javascript"> 
		var zmid = "";
		var zmid_default = "./zm/komap";
		var zmid_default = "./zm/hrc2011";
		var zmid_default = "./zm/zm_nasa/Curiosity-Murray-Buttes";
		var zmid=url.search.replace('?zmid=','' );	
		if( zmid == "" ) { zmid = zmid_default; }
		Z.showImage("myContainer", zmid  ); 

//		var zmid= "./zm/zm_nasa/Curiosity-Murray-Buttes";
//		Z.showImage("myContainer", "./zm/Curiosity-Murray-Buttes"  ); 

//		document.write( "BUGS_90: url.search="+url.search );
//		document.write( "BUGS_92: zmid="+zmid );

// err		Z.showImage("myContainer", '"'+zmid +'"' ); 
//		alert( zmid );
//		zmid = zmid_default;
//		zmid = getParameterByName('zmid');
//		if( zmid == "" ) { zmid = zmid_default; }
//		alert( "getParameterByName(zmid)="+zmid );
//		Z.showImage("myContainer", zmid  ); 
//		Z.showImage("myContainer", + zmid  ); 
//		Z.showImage("myContainer", "./zm/hrc2011"); 
//		Z.showImage("myContainer", "./zm/komap"); 
//		Z.showImage("myContainer2", "./zm/nasa"); 
//		Z.showImage("myContainer", "./zm/Curiosity-Murray-Buttes"); 
//		Z.showImage("myContainer", "./zm/hrc2011"); 
		</script>


	<script id="script_url" >
//		function getParameterByName(name, url) {
//			if (!url) url = window.location.href;
//			name = name.replace(/[\[\]]/g, "\\$&");
//			var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
//			results = regex.exec(url);
//			if (!results) return null;
//			if (!results[2]) return '';
//			return decodeURIComponent(results[2].replace(/\+/g, " "));
//			}
//
// query string: ?foo=lorem&bar=&baz
// http://ko0.us/index_zm.html?zm=./zm/komap
//		var foo = getParameterByName('foo'); // "lorem"
//		var bar = getParameterByName('bar'); // "" (present with empty value)
//		var baz = getParameterByName('baz'); // "" (present with no value)
//		var qux = getParameterByName('qux'); // null (absent)
//		var zmid = "./zm/komap";
//		var zmid = getParameterByName('zmid');
//		zmid = params.get('zmid');
//			let params = new URL('https://ko0.us/index_zm?zmid=./zm/komap&bar=2').searchParams;
//			zmid = params.get('zmid'); // "1"
//		var foo= params.get('bar'); // "2" 
//		var bar= params.get('bar'); // "2" 
//		alert( "params.get(zmid)="+zmid+"  foo="+foo+"  bar="+bar );
//		var first = getUrlVars()["zmid"];
//		var second = getUrlVars()["foo"];
//		var third = getUrlVars()["bar"];
//		alert(first);
//		alert(second);
//		alert(third);

		</script>



	</head>
<body>
	<a href=index_zm.html target=_blank>
		<img name="index_zm_png" height=50 src="./imgs/btn/koeye.png">
		</a>
	<div id="div_zm"> 
		<script name="script_zmid_title">
			document.write( "<h1>"+url.search.replace('?zmid=','') + "</h1>" );
			</script>
		<div align="center"><br>
			<table width="100" border="0" align="center" cellpadding="1" cellspacing="0" bgcolor="#000000" >
				<tr>
					<td>
						<table width="100%" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#ffffff">
						<tr>
							<td>
								<div id="myContainer"></div>
<!--								<div id="./zm/komap"></div> -->
								</td>
							</tr>
							</table>
						</td>
					</tr>
				</table>
			</div>
		</div>

		<script id="b64_zm_js" >
			var b64_zm_js = new Array();
			b64_zm_js[0] = "data:/text/plain;base64,KGZ1bmN0aW9uKCl7dmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30uY2FsbCgpO2EuWj17fX0pKCksWi5zaG93SW1hZ2U9ZnVuY3Rpb24oYSxiLGMpe1ouVXRpbHMuejEyOCgpLFouVXRpbHMuejEyNygpLFouVXRpbHMuejEyNigpLFouVXRpbHMuejE2MygpLFoucGFnZUNvbnRhaW5lcklEPWEsWi5pbWFnZVBhdGg9Wi5VdGlscy56MjQzKGIpLFoucGFyYW1ldGVycz1aLlV0aWxzLnoyMzMoYyksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJET01Db250ZW50TG9hZGVkIixaLmluaXRpYWxpemUpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csImxvYWQiLFouaW5pdGlhbGl6ZSl9LFouaW5pdGlhbGl6ZT1mdW5jdGlvbigpe2FyZ3VtZW50cy5jYWxsZWUuZG9uZXx8KGFyZ3VtZW50cy5jYWxsZWUuZG9uZT0hMCxaLlV0aWxzLnoxNjQoKSxaLlV0aWxzLnoyNDkoWi5wYXJhbWV0ZXJzKSxaLlZpZXdlcj1uZXcgWi56MTIyLFouVXRpbHMuaXNTdHJWYWwoWi5jb3B5cmlnaHRQYXRoKT9aLlV0aWxzLmVuZm9yY2VDb3B5cmlnaHQoKTpaLlZpZXdlci56MTQ5KCksWi5kZWJ1ZyYmWi5VdGlscy50cmFjZShaLlV0aWxzLnoxODUoIno2NyIpKSl9LFouejEyMj1mdW5jdGlvbigpe1ouVmlld2VyRGlzcGxheT1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsIlZpZXdlckRpc3BsYXkiLCJpbmxpbmUtYmxvY2siLCJyZWxhdGl2ZSIsImhpZGRlbiIsIjEwMCUiLCIxMDAlIiwiMHB4IiwiMHB4Iiwibm9uZSIsIjBweCIsInRyYW5zcGFyZW50IG5vbmUiLCIwcHgiLCIwcHgiLCJwb2ludGVyIiksWi5wYWdlQ29udGFpbmVyPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFoucGFnZUNvbnRhaW5lcklEKTt2YXIgYT1aLlV0aWxzLnoxNzYoWi5wYWdlQ29udGFpbmVyKTtaLnZpZXdlclc9cGFyc2VGbG9hdChhLndpZHRoKSxaLnZpZXdlckg9cGFyc2VGbG9hdChhLmhlaWdodCksaXNOYU4oWi52aWV3ZXJXKSYmKFoudmlld2VyVz1aLlZpZXdlckRpc3BsYXkuY2xpZW50V2lkdGgpLGlzTmFOKFoudmlld2VySCkmJihaLnZpZXdlckg9Wi5WaWV3ZXJEaXNwbGF5LmNsaWVudEhlaWdodCksWi5wYWdlQ29udGFpbmVyLmlubmVySFRNTD0iIixaLnBhZ2VDb250YWluZXIuYXBwZW5kQ2hpbGQoWi5WaWV3ZXJEaXNwbGF5KSx0aGlzLnoxNDk9ZnVuY3Rpb24oKXtaLlZpZXdwb3J0PW5ldyBaLnoxMjV9LHRoaXMuejE0OD1mdW5jdGlvbigpe1oudG9vbGJhclZpc2libGU+MCYmKFouVG9vbGJhcj1uZXcgWi56MTI0KFouVmlld3BvcnQpKSxaLm5hdmlnYXRvclZpc2libGU+MCYmKFouTmF2aWdhdG9yPW5ldyBaLnoxMjMoWi5WaWV3cG9ydCkpLFouTmF2aWdhdG9yJiZaLk5hdmlnYXRvci56Mjc3KCl9LHRoaXMuc2V0U2l6ZUFuZFBvc2l0aW9uPWZ1bmN0aW9uKGEsYixjLGQsZSl7Wi52aWV3ZXJXPWEsWi52aWV3ZXJIPWIsWi5WaWV3ZXJEaXNwbGF5LnN0eWxlLndpZHRoPWErInB4IixaLlZpZXdlckRpc3BsYXkuc3R5bGUuaGVpZ2h0PWIrInB4IixaLlZpZXdwb3J0JiZaLlZpZXdwb3J0LnoxODAoKSYmWi5WaWV3cG9ydC5zZXRTaXplQW5kUG9zaXRpb24oYSxiLGMsZCk7dmFyIGY9Wi50b29sYmFyUG9zaXRpb249PTE/Yi1aLnRvb2xiYXJIOjA7Wi5Ub29sYmFyRGlzcGxheSYmWi5Ub29sYmFyLnoxODAoKSYmKFouVG9vbGJhci5zZXRTaXplQW5kUG9zaXRpb24oYSxudWxsLG51bGwsZiksWi50b29sYmFyVmlzaWJsZT4xJiZaLlRvb2xiYXIuc2hvdyghMCkpLFouTmF2aWdhdG9yRGlzcGxheSYmWi5OYXZpZ2F0b3IuejE4MCgpJiYoWi5OYXZpZ2F0b3Iuc2V0U2l6ZUFuZFBvc2l0aW9uKG51bGwsbnVsbCxjLGQsWi5uYXZpZ2F0b3JGaXQpLFoubmF2aWdhdG9yVmlzaWJsZT4xJiZaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCEwKSksZSYmWi5WaWV3cG9ydC56Mjc0KCEwKX0sdGhpcy5zZXRJbWFnZVBhdGg9ZnVuY3Rpb24oYSl7Wi5WaWV3cG9ydC56MjkzQWxsU3RvcCghMCksWi5pbWFnZVBhdGg9Wi5VdGlscy56MjQzKGEpO3ZhciBiPW5ldyBaLnoxMDEsYz1aLlV0aWxzLnoxNDAoWi5pbWFnZVBhdGgrIi8iKyJJbWFnZVByb3BlcnRpZXMueG1sIik7Yi5sb2FkWE1MKGMpfX0sWi56MTI1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gY2QoKXt6PTEsQT0wLEI9MCxGPVtdLEc9W10sSD1bXSxJPVtdLEo9W10sSz1bXSxMPVtdLE09W10sTj1bXSxPPVtdLFA9W10sUT1bXSxSPTB9ZnVuY3Rpb24gY2UoKXtyZXR1cm4gYn1mdW5jdGlvbiBjZihhKXtiPWF9ZnVuY3Rpb24gY2coKXtoPVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2Iiwidmlld3BvcnRDb250YWluZXIiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsInZpc2libGUiLCIxcHgiLCIxcHgiLCIwcHgiLCIwcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLFouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChoKSxpPWgsaz1pLnN0eWxlLGw9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KFoudXNlQ2FudmFzPyJjYW52YXMiOiJkaXYiLCJ2aWV3cG9ydEJhY2tmaWxsRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwidmlzaWJsZSIsIjFweCIsIjFweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4IiksaC5hcHBlbmRDaGlsZChsKSxtPWwsbj1tLnN0eWxlLHA9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KFoudXNlQ2FudmFzPyJjYW52YXMiOiJkaXYiLCJ2aWV3cG9ydERpc3BsYXkiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsInZpc2libGUiLCIxcHgiLCIxcHgiLCIwcHgiLCIwcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLGguYXBwZW5kQ2hpbGQocCkscT1wLHI9cS5zdHlsZSxaLlV0aWxzLmlzU3RyVmFsKFoud2F0ZXJtYXJrUGF0aCkmJih0PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2Iiwid2F0ZXJtYXJrRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwidmlzaWJsZSIsIjFweCIsIjFweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4IiksaC5hcHBlbmRDaGlsZCh0KSx1PXQsdj11LnN0eWxlKSxaLlV0aWxzLmlzU3RyVmFsKFouaG90c3BvdFBhdGgpJiYodz1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsImhvdHNwb3RzRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwidmlzaWJsZSIsIjFweCIsIjFweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4IiksaC5hcHBlbmRDaGlsZCh3KSx4PXcseT14LnN0eWxlKSxaLnVzZUNhbnZhcz8obz1tLmdldENvbnRleHQoIjJkIikscz1xLmdldENvbnRleHQoIjJkIikpOihtLmlubmVySFRNTD0iIixxLmlubmVySFRNTD0iIiksdSYmKHUuaW5uZXJIVE1MPSIiKSx4JiYoeC5pbm5lckhUTUw9IiIpfWZ1bmN0aW9uIGNoKGEsYixjLGQpe2N8fChjPTApLGR8fChkPTApLFk9YSwkPWIsYmI9WSpYLGJjPSQqWCxiZD1iYi8yLGJlPWJjLzIsYmY9LSgoYmItWSkvMikrYyxiZz0oYmItWSkvMitjLGJoPS0oKGJjLSQpLzIpK2QsYmk9KGJjLSQpLzIrZCxpLndpZHRoPWJiLGkuaGVpZ2h0PWJjLGsud2lkdGg9YmIrInB4IixrLmhlaWdodD1iYysicHgiLGsubGVmdD1iZisicHgiLGsudG9wPWJoKyJweCIscS53aWR0aD1iYixxLmhlaWdodD1iYyx1JiYodS53aWR0aD1iYix1LmhlaWdodD1iYyx2LndpZHRoPWJiKyJweCIsdi5oZWlnaHQ9YmMrInB4IiksWi51c2VDYW52YXMmJihzLnRyYW5zbGF0ZShiZCxiZSkscy5zYXZlKCkpfWZ1bmN0aW9uIGNpKCl7dmFyIGE9Wi5pbWFnZVcsYj1aLmltYWdlSDt3aGlsZShhPmN8fGI+YylhPWEvMixiPWIvMix6Kys7YT1aLmltYWdlVyxiPVouaW1hZ2VIO2Zvcih2YXIgZD16LTE7ZD49MDtkLS0pSFtkXT1hLElbZF09YixKW2RdPU1hdGguY2VpbChIW2RdL2MpLEtbZF09TWF0aC5jZWlsKElbZF0vYyksTFtkXT1KW2RdKktbZF0sYT1hLzIsYj1iLzJ9ZnVuY3Rpb24gY2ooKXtaLmluaXRpYWxYfHwoWi5pbml0aWFsWD1aLmltYWdlVy8yKSxaLmluaXRpYWxZfHwoWi5pbml0aWFsWT1aLmltYWdlSC8yKTt2YXIgYT1jUigpO1ouZml0WiYmWi5maXRaIT1hJiYoWi5pbml0aWFsWj09Wi5maXRaJiYoWi5pbml0aWFsWj1udWxsKSxaLm1pblo9PVouZml0WiYmKFoubWluWj1udWxsKSxaLm1heFo9PVouZml0WiYmKFoubWF4Wj1udWxsKSxaLmZpdFo9bnVsbCksWi5maXRafHwoWi5maXRaPWEpLFouaW5pdGlhbFp8fChaLmluaXRpYWxaPVouZml0WiksWi5taW5afHwoWi5taW5aPVouZml0WiksWi5tYXhafHwoWi5tYXhaPVouZml0WiksWi5pbml0aWFsWjxaLm1pblomJihaLmluaXRpYWxaPVoubWluWiksWi5pbml0aWFsWj5aLm1heFomJihaLmluaXRpYWxaPVoubWF4Wil9ZnVuY3Rpb24gY2soKXtjbChXKSx6PlQmJihjbChWKSx6PlMmJmNsKFUpKSxHLnNvcnQoKSxHPVouVXRpbHMuejI0MihHKSxjcyhHLGNKLDApfWZ1bmN0aW9uIGNsKGEpe3ZhciBiPUpbYV0tMSxjPUtbYV0tMTtmb3IodmFyIGQ9MDtkPD1jO2QrKylmb3IodmFyIGU9MDtlPD1iO2UrKylHLnB1c2goYSsiLSIrZSsiLSIrZCl9ZnVuY3Rpb24gY20oYSxiKXt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKSxkPWJmLXBhcnNlRmxvYXQoay5sZWZ0KSxlPWJoLXBhcnNlRmxvYXQoay50b3ApO2subGVmdD1iZisicHgiLGsudG9wPWJoKyJweCIsWi5pbWFnZVg9Wi5pbWFnZVgrZC9aLmltYWdlWixaLmltYWdlWT1aLmltYWdlWStlL1ouaW1hZ2VaLGNyKG0sQixGLCExLCExKSxjcihxLEEsTywhMSwhMSksY1koKTt2YXIgZj1jdygpO2E+MD9mLnJpZ2h0PWYubGVmdDphPDAmJihmLmxlZnQ9Zi5yaWdodCksYj4wP2YuYm90dG9tPWYudG9wOmI8MCYmKGYudG9wPWYuYm90dG9tKTtmb3IodmFyIGc9Zi50b3A7Zzw9Zi5ib3R0b207ZysrKWZvcih2YXIgaD1mLmxlZnQ7aDw9Zi5yaWdodDtoKyspUS5wdXNoKEErIi0iK2grIi0iK2cpO3ZhciBpPVEubGVuZ3RoO2Zvcih2YXIgaj0wO2o8aTtqKyspe3ZhciBsPVFbal07aWYobCl7dmFyIG49bmV3IGNHKGwpO2NJKG4sYyxjSyl9fWk+MzAmJlEuc3BsaWNlKGktMzAsMzApfWZ1bmN0aW9uIGNuKCl7dmFyIGE9ITE7cGFyc2VGbG9hdChyLndpZHRoKSE9cS53aWR0aCYmKFoudXNlQ2FudmFzJiYoci53aWR0aD1xLndpZHRoKyJweCIsci5oZWlnaHQ9cS5oZWlnaHQrInB4IixyLmxlZnQ9IjBweCIsci50b3A9IjBweCIscy5yZXN0b3JlKCkscy5zYXZlKCkscy5zY2FsZShDLEMpKSxhPSEwKTtpZihwYXJzZUZsb2F0KGsubGVmdCkhPWJmfHxwYXJzZUZsb2F0KGsudG9wKSE9Ymgpe3ZhciBiPXBhcnNlRmxvYXQoay5sZWZ0KS1iZixjPXBhcnNlRmxvYXQoay50b3ApLWJoO2subGVmdD1iZisicHgiLGsudG9wPWJoKyJweCIsYmw9cGFyc2VGbG9hdChuLmxlZnQpK2IsYm09cGFyc2VGbG9hdChuLnRvcCkrYyxuLmxlZnQ9YmwrInB4IixuLnRvcD1ibSsicHgiO3ZhciBkPWNCKEEsQyk7Wi5pbWFnZVg9Wi5pbWFnZVgtYi9kLFouaW1hZ2VZPVouaW1hZ2VZLWMvZCxhPSEwfWEmJihjcihxLEEsTywhMCwhMSksY1koKSl9ZnVuY3Rpb24gY28oKXtDIT1EJiYoWi5pbWFnZVo9YnopLFouaW1hZ2VaPFoubWluWiYmKFouaW1hZ2VaPVoubWluWik7dmFyIGE9ZCxiPXo7d2hpbGUoYS8yPj1aLmltYWdlWiliLS0sYS89MjtiPWItMTwwPzA6Yi0xO3ZhciBjPWNDKGIsWi5pbWFnZVopO2lmKGIhPUF8fGMhPUMpWi51c2VDYW52YXMmJihzLnJlc3RvcmUoKSxzLnNhdmUoKSxzLnNjYWxlKGMsYykpLEE9YixDPWM7RD1DfWZ1bmN0aW9uIGNwKCl7Qj1BPlM/VTpBPlQ/VjpXLEU9Y0MoQixaLmltYWdlWiksdGllckJhY2tmaWxsVz1IW0JdLHRpZXJCYWNrZmlsbEg9SVtCXSxtLndpZHRoPXRpZXJCYWNrZmlsbFcsbS5oZWlnaHQ9dGllckJhY2tmaWxsSDt2YXIgYT10aWVyQmFja2ZpbGxXKkUsYj10aWVyQmFja2ZpbGxIKkUsYz1aLmltYWdlWCpaLmltYWdlWixkPVouaW1hZ2VZKlouaW1hZ2VaO2JqPWEsYms9YixibD1iZC1jLGJtPWJlLWQsWi51c2VDYW52YXMmJihuLndpZHRoPWJqKyJweCIsbi5oZWlnaHQ9YmsrInB4Iiksbi5sZWZ0PWJsKyJweCIsbi50b3A9Ym0rInB4In1mdW5jdGlvbiBjcSgpe3ZhciBhPWN3KCk7Zm9yKHZhciBiPWEudG9wLGM9YS5ib3R0b207Yjw9YztiKyspZm9yKHZhciBkPWEubGVmdCxlPWEucmlnaHQ7ZDw9ZTtkKyspTi5wdXNoKEErIi0iK2QrIi0iK2IpO1Auc29ydCgpLE4uc29ydCgpLFA9Wi5VdGlscy56MjQyKFApLE49Wi5VdGlscy56MjQyKE4pO3ZhciBmPVouVXRpbHMuaW50ZXJzZWN0KE4sUCk7Tj1aLlV0aWxzLnN1YnRyYWN0KE4sUCksUj10aWxlc0xvYWRpbmdOYW1lc0xlbmd0aD1OLmxlbmd0aCxaLlRvb2xiYXJEaXNwbGF5JiZaLlRvb2xiYXIuejE4MCgpJiZaLlRvb2xiYXIuc2hvd1Byb2dyZXNzKFIsdGlsZXNMb2FkaW5nTmFtZXNMZW5ndGgpLFA9Wi5VdGlscy5zdWJ0cmFjdChQLGYpLFA9UC5jb25jYXQoZiksdGlsZXNMb2FkaW5nTmFtZXNMZW5ndGghPTAmJihNPVtdKX1mdW5jdGlvbiBjcihhLGIsYyxkLGUpe2V8fGN0KGEpO2lmKGQpe3ZhciBmPU1hdGguZmxvb3IoYy5sZW5ndGgvMik7Zm9yKHZhciBnPWYsaD1jLmxlbmd0aDtnPGg7ZysrKXt2YXIgaT1jW2ddO2kmJmkudD09YiYmY00oYSxiLGkpO2lmKGMubGVuZ3RoLWctMSE9Zyl7dmFyIGk9Y1tjLmxlbmd0aC1nLTFdO2kmJmkudD09YiYmY00oYSxiLGkpfX19ZWxzZSBmb3IodmFyIGc9MCxoPWMubGVuZ3RoO2c8aDtnKyspe3ZhciBpPWNbZ107aSYmaS50PT1iJiZjTShhLGIsaSl9fWZ1bmN0aW9uIGNzKGEsYixjKXtpZihhLmxlbmd0aD4wKXt2YXIgZD0obmV3IERhdGUpLmdldFRpbWUoKTtpZihjKXt2YXIgZT1NYXRoLmZsb29yKGEubGVuZ3RoLzIpO2Zvcih2YXIgZj1lLGc9YS5sZW5ndGg7ZjxnO2YrKyl7dmFyIGg9YVtmXTtpZihoKXt2YXIgaT1uZXcgY0coaCk7Y0koaSxkLGIpfWlmKGEubGVuZ3RoLWYtMSE9Zil7dmFyIGg9YVthLmxlbmd0aC1mLTFdO2lmKGgpe3ZhciBpPW5ldyBjRyhoKTtjSShpLGQsYil9fX19ZWxzZSBmb3IodmFyIGY9MCxnPWEubGVuZ3RoO2Y8ZztmKyspe3ZhciBoPWFbZl07aWYoaCl7dmFyIGk9bmV3IGNHKGgpO2NJKGksZCxiKX19fX1mdW5jdGlvbiBjdChhKXtpZihhKWlmKFoudXNlQ2FudmFzJiZhLnRhZ05hbWU9PSJDQU5WQVMiKXt2YXIgYj1hLmdldENvbnRleHQoIjJkIik7Yi5zYXZlKCksYi5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLGIuY2xlYXJSZWN0KDAsMCxiLmNhbnZhcy53aWR0aCxiLmNhbnZhcy5oZWlnaHQpLGIucmVzdG9yZSgpfWVsc2UgaWYoYS5oYXNDaGlsZE5vZGVzKCkpd2hpbGUoYS5jaGlsZE5vZGVzLmxlbmd0aD49MSlhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCl9ZnVuY3Rpb24gY3UoKXtpZihaLlRvb2xiYXJEaXNwbGF5JiZaLlRvb2xiYXIuejE4MCgpKXt2YXIgYT1jQihBLEMpO1ouVG9vbGJhci56MjY2KGEpfX1mdW5jdGlvbiBjdigpe1ouTmF2aWdhdG9yJiZaLk5hdmlnYXRvci56MTgwKCkmJlouTmF2aWdhdG9yLnoyNjgoKX1mdW5jdGlvbiBjdygpe3JldHVybiBuZXcgY3ooY3goKSxBKX1mdW5jdGlvbiBjeCgpe3ZhciBhPXBhcnNlRmxvYXQoay5sZWZ0KS1iZixiPXBhcnNlRmxvYXQoay50b3ApLWJoO2lmKFoudXNlQ2FudmFzKXt2YXIgYz1wYXJzZUZsb2F0KGsud2lkdGgpL2kud2lkdGg7YS89YyxiLz1jfXZhciBkPWNCKEEsQyk7cmV0dXJuIGEhPTAmJihhLz1kKSxiIT0wJiYoYi89ZCksbmV3IGNBKFouaW1hZ2VYLWEsWi5pbWFnZVktYiwtKFkvMiksWS8yLC0oJC8yKSwkLzIsZCl9ZnVuY3Rpb24gY3koKXt2YXIgYT1wYXJzZUZsb2F0KGsubGVmdCktYmYsYj1wYXJzZUZsb2F0KGsudG9wKS1iaDtpZihaLnVzZUNhbnZhcyl7dmFyIGM9cGFyc2VGbG9hdChrLndpZHRoKS9pLndpZHRoO2EvPWMsYi89Y312YXIgZD1jQihBLEMpO3JldHVybiBhIT0wJiYoYS89ZCksYiE9MCYmKGIvPWQpLG5ldyBjQShaLmltYWdlWC1hLFouaW1hZ2VZLWIsLShiYi8yKSxiYi8yLC0oYmMvMiksYmMvMixkKX1mdW5jdGlvbiBjeihhLGIpe3ZhciBkPWNCKGIsMSksZT1NYXRoLmZsb29yKGEubGVmdCpkL2MpLGY9TWF0aC5mbG9vcihhLnJpZ2h0KmQvYyksZz1NYXRoLmZsb29yKGEudG9wKmQvYyksaD1NYXRoLmZsb29yKGEuYm90dG9tKmQvYyk7ZTwwJiYoZT0wKSxmPkpbQV0tMSYmKGY9SltBXS0xKSxnPDAmJihnPTApLGg+S1tBXS0xJiYoaD1LW0FdLTEpLHRoaXMubGVmdD1lLHRoaXMucmlnaHQ9Zix0aGlzLnRvcD1nLHRoaXMuYm90dG9tPWh9ZnVuY3Rpb24gY0EoYSxiLGMsZCxlLGYsZyl7dGhpcy5sZWZ0PWErYy9nLHRoaXMucmlnaHQ9YStkL2csdGhpcy50b3A9YitlL2csdGhpcy5ib3R0b209YitmL2d9ZnVuY3Rpb24gY0IoYSxiKXt2YXIgYz1iKihIW2FdL1ouaW1hZ2VXKTtyZXR1cm4gY31mdW5jdGlvbiBjQyhhLGIpe3ZhciBjPWIvKEhbYV0vWi5pbWFnZVcpO3JldHVybiBjfWZ1bmN0aW9uIGNEKGEsYil7dmFyIGM9YS1aLlV0aWxzLnoxNzQoWi5WaWV3ZXJEaXNwbGF5KS54LGQ9Yi1aLlV0aWxzLnoxNzQoWi5WaWV3ZXJEaXNwbGF5KS55O3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChjLGQpfWZ1bmN0aW9uIGNFKGEsYil7dmFyIGM9cGFyc2VGbG9hdChrLmxlZnQpK2JkLGQ9cGFyc2VGbG9hdChrLnRvcCkrYmUsZT1hLWMsZj1iLWQsZz1lL1ouaW1hZ2VaLGg9Zi9aLmltYWdlWixpPVouaW1hZ2VYK2csaj1aLmltYWdlWStoO3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChpLGopfWZ1bmN0aW9uIGNGKGEsYil7dmFyIGM9Wi5pbWFnZVgtYSxkPVouaW1hZ2VZLWIsZT1jKlouaW1hZ2VaLGY9ZCpaLmltYWdlWixnPXBhcnNlRmxvYXQoay5sZWZ0KStiZCxoPXBhcnNlRmxvYXQoay50b3ApK2JlLGk9Zy1lLGo9aC1mO3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChpLGopfWZ1bmN0aW9uIGNHKGEpe3RoaXMubmFtZT1hLHRoaXMudD1wYXJzZUludChhLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLSIpKSwxMCksdGhpcy5jPXBhcnNlSW50KGEuc3Vic3RyaW5nKGEuaW5kZXhPZigiLSIpKzEsYS5sYXN0SW5kZXhPZigiLSIpKSwxMCksdGhpcy5yPXBhcnNlSW50KGEuc3Vic3RyaW5nKGEubGFzdEluZGV4T2YoIi0iKSsxKSwxMCksdGhpcy54PU1hdGguZmxvb3IodGhpcy5jKmMpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMucipjKSx0aGlzLmltYWdlPW51bGwsdGhpcy5hbHBoYT0wLHRoaXMudXJsPVouVXRpbHMuejE0MChjSCh0aGlzLnQsdGhpcy5jLHRoaXMucix0aGlzLm5hbWUpKSx0aGlzLmVsbXQ9bnVsbCx0aGlzLnN0eWxlPW51bGx9ZnVuY3Rpb24gY0goYSxiLGQsZSl7dmFyIGY9ZCpKW2FdK2I7Zm9yKHZhciBnPTA7ZzxhO2crKylmKz1MW2ddO3ZhciBoPU1hdGguZmxvb3IoZi9jKSxpPVouaW1hZ2VQYXRoKyIvIisiVGlsZUdyb3VwIitoKyIvIitlKyIuanBnIjtyZXR1cm4gaX1mdW5jdGlvbiBjSShhLGIsYyl7YS5sb2FkaW5nPWNiLnoyMTJJbWFnZShhLnVybCxaLlV0aWxzLmNyZWF0ZUNhbGxiYWNrKG51bGwsYyxhLGIpKX1mdW5jdGlvbiBjSihhLGIsYyl7aWYoYSYmYiYmYyl7YS5pbWFnZT1jO3ZhciBkPWEubmFtZTtGLnB1c2goYSk7dmFyIGU9Ry5pbmRleE9mKGQpO2UhPS0xJiZHLnNwbGljZShlLDEpLGEuYWxwaGE9MSxhLnQ9PUImJmNNKG0sQixhKX19ZnVuY3Rpb24gY0soYSxiLGMpe2lmKGEmJmImJmMpe2EuaW1hZ2U9Yzt2YXIgZD1hLm5hbWU7Y00ocSxBLGEpfX1mdW5jdGlvbiBjTChhLGIsYyl7aWYoYSYmYiYmYyl7YS5pbWFnZT1jO3ZhciBkPWEubmFtZTtPLnB1c2goYSksUC5wdXNoKGQpO3ZhciBlPU4uaW5kZXhPZihkKTtlIT0tMSYmTi5zcGxpY2UoZSwxKSxNLnB1c2goYSksYkZ8fChiRj13aW5kb3cuc2V0SW50ZXJ2YWwoY1AsNTApKTt2YXIgZz1OLmxlbmd0aDtnPT0wJiYoWi51c2VDYW52YXMmJmNyKHEsQSxPLCEwLCExKSxQLmxlbmd0aD5mJiZjUSgpLFI9MCksWi5Ub29sYmFyRGlzcGxheSYmWi5Ub29sYmFyLnoxODAoKSYmWi5Ub29sYmFyLnNob3dQcm9ncmVzcyhSLGcpfX1mdW5jdGlvbiBjTShhLGIsYyl7dmFyIGQ9Yy54LGU9Yy55LGY9Y0IoYiwxKTtpZihaLnVzZUNhbnZhcylhPT1xJiYoZC09Wi5pbWFnZVgqZixlLT1aLmltYWdlWSpmKSxjTihhLGMsZCxlKTtlbHNle3ZhciBnO2E9PXE/KGQtPVouaW1hZ2VYKmYtYmQvQyxlLT1aLmltYWdlWSpmLWJlL0MsZz1DKTpnPUUsY08oYSxjLGQsZSxnKX19ZnVuY3Rpb24gY04oYSxiLGMsZCl7dmFyIGU9YS5nZXRDb250ZXh0KCIyZCIpO1ouYWxwaGFTdXBwb3J0ZWQmJmIuYWxwaGE8MT8oZS5nbG9iYWxBbHBoYT1iLmFscGhhLGUuZHJhd0ltYWdlKGIuaW1hZ2UsYyxkKSxlLmdsb2JhbEFscGhhPTEpOmUuZHJhd0ltYWdlKGIuaW1hZ2UsYyxkKX1mdW5jdGlvbiBjTyhhLGIsYyxkLGUpe2IuZWxtdHx8KGIuZWxtdD1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImltZyIpLGIuZWxtdC5vbm1vdXNlZG93bj1aLlV0aWxzLnByZXZlbnREZWZhdWx0LFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihiLmVsbXQsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxiLmVsbXQuc3JjPWIudXJsLGIuc3R5bGU9Yi5lbG10LnN0eWxlLGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixaLlV0aWxzLnJlbmRlclF1YWxpdHkoYixaLnJlbmRlclF1YWxpdHkpLFouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZCYmKGIuc3R5bGVbWi5jc3NUcmFuc2Zvcm1Qcm9wZXJ0eSsiT3JpZ2luIl09IjBweCAwcHgiKSksYi5lbG10LnBhcmVudE5vZGUhPWEmJmEuYXBwZW5kQ2hpbGQoYi5lbG10KTt2YXIgZj1iLnN0eWxlO2YuZGlzcGxheT0ibm9uZSIsWi5jc3NUcmFuc2Zvcm1zU3VwcG9ydGVkP2ZbWi5jc3NUcmFuc2Zvcm1Qcm9wZXJ0eV09WyJtYXRyaXgoIiwoYi5pbWFnZS53aWR0aC9iLmVsbXQud2lkdGgqZSkudG9GaXhlZCg4KSwiLDAsMCwiLChiLmltYWdlLmhlaWdodC9iLmVsbXQuaGVpZ2h0KmUpLnRvRml4ZWQoOCksIiwiLChjKmUpLnRvRml4ZWQoOCksWi5jc3NUcmFuc2Zvcm1Ob1VuaXRzPyIsIjoicHgsIiwoZCplKS50b0ZpeGVkKDgpLFouY3NzVHJhbnNmb3JtTm9Vbml0cz8iKSI6InB4KSJdLmpvaW4oIiIpOihmLndpZHRoPWIuaW1hZ2Uud2lkdGgqZSsicHgiLGYuaGVpZ2h0PWIuaW1hZ2UuaGVpZ2h0KmUrInB4IixmLmxlZnQ9YyplKyJweCIsZi50b3A9ZCplKyJweCIpLGYuZGlzcGxheT0iaW5saW5lLWJsb2NrIixaLlV0aWxzLnNldE9wYWNpdHkoYixiLmFscGhhKX1mdW5jdGlvbiBjUChhKXt2YXIgYj1NLmxlbmd0aCxjPTA7Zm9yKHZhciBkPTA7ZDxiO2QrKyl7dmFyIGU9TVtkXTtlLnQ9PUEmJihlLmFscGhhPDE/KGUuYWxwaGErPWJFLGUuYWxwaGE+MSYmKGUuYWxwaGE9MSksY00ocSxBLGUpKTooYysrLGM+PWImJih3aW5kb3cuY2xlYXJJbnRlcnZhbChiRiksYkY9bnVsbCkpKX19ZnVuY3Rpb24gY1EoKXt2YXIgYT1QLmxlbmd0aC1mO2Zvcih2YXIgYj0wO2I8YTtiKyspaj1QLmluZGV4T2YoT1tiXS5uYW1lKSxqIT0tMSYmUC5zcGxpY2UoaiwxKSxPLnNwbGljZShiLDEpfWZ1bmN0aW9uIGNSKCl7cmV0dXJuIFouaW1hZ2VXL1ouaW1hZ2VIPlkvJD9ZL1ouaW1hZ2VXOiQvWi5pbWFnZUh9ZnVuY3Rpb24gY1MoYSxiKXtpZihaLmNvbnN0cmFpblBhbil7dmFyIGM9bmV3IGNBKGEsYiwtKFkvMiksWS8yLC0oJC8yKSwkLzIsWi5pbWFnZVopLGQ9Yy5sZWZ0LGU9Yy5yaWdodCxmPWMudG9wLGc9Yy5ib3R0b207Wi5pbWFnZVcqWi5pbWFnZVo+WT9kPDA/YT1ZLzIvWi5pbWFnZVo6ZT5aLmltYWdlVyYmKGE9Wi5pbWFnZVctWS8yL1ouaW1hZ2VaKTphPVouaW1hZ2VXLzIsWi5pbWFnZUgqWi5pbWFnZVo+JD9mPDA/Yj0kLzIvWi5pbWFnZVo6Zz5aLmltYWdlSCYmKGI9Wi5pbWFnZUgtJC8yL1ouaW1hZ2VaKTpiPVouaW1hZ2VILzJ9cmV0dXJuIG5ldyBaLlV0aWxzLlBvaW50KGEsYil9ZnVuY3Rpb24gY1QoYSxiKXtpZihaLmNvbnN0cmFpblBhbil7dmFyIGM9Y0IoQSxDKSxkPVouaW1hZ2VYLGU9Wi5pbWFnZVksZj1uZXcgY0EoZCxlLC0oWS8yKSxZLzIsLSgkLzIpLCQvMixjKSxnPWYubGVmdCxoPWYucmlnaHQsaT1mLnRvcCxqPWYuYm90dG9tO1ouaW1hZ2VXKmM+WT9nPDA/YSs9ZypjOmg+Wi5pbWFnZVcmJihhLT0oWi5pbWFnZVctaCkqYyk6YSs9KGQtWi5pbWFnZVcvMikqYyxaLmltYWdlSCpjPiQ/aTwwP2IrPWkqYzpqPlouaW1hZ2VIJiYoYi09KFouaW1hZ2VILWopKmMpOmIrPShlLVouaW1hZ2VILzIpKmN9cmV0dXJuIG5ldyBaLlV0aWxzLlBvaW50KGEsYil9ZnVuY3Rpb24gY1UoYSxiKXtpZihaLmNvbnN0cmFpblBhbil7dmFyIGM9Wi5pbWFnZVgtKGEtYmYpL1ouaW1hZ2VaLGQ9Wi5pbWFnZVktKGItYmgpL1ouaW1hZ2VaLGU9bmV3IGNBKGMsZCwtKFkvMiksWS8yLC0oJC8yKSwkLzIsWi5pbWFnZVopLGY9ZS5sZWZ0LGc9ZS5yaWdodCxoPWUudG9wLGk9ZS5ib3R0b207Wi5pbWFnZVcqWi5pbWFnZVo+WT9mPDA/YSs9ZipaLmltYWdlWjpnPlouaW1hZ2VXJiYoYS09KFouaW1hZ2VXLWcpKlouaW1hZ2VaKTphKz0oYy1aLmltYWdlVy8yKSpaLmltYWdlWixaLmltYWdlSCpaLmltYWdlWj4kP2g8MD9iKz1oKlouaW1hZ2VaOmk+Wi5pbWFnZUgmJihiLT0oWi5pbWFnZUgtaSkqWi5pbWFnZVopOmIrPShkLVouaW1hZ2VILzIpKlouaW1hZ2VafXJldHVybiBuZXcgWi5VdGlscy5Qb2ludChhLGIpfWZ1bmN0aW9uIGNWKGEpe3JldHVybiBhPloubWF4Wj9hPVoubWF4WjphPFoubWluWiYmKGE9Wi5taW5aKSxhfWZ1bmN0aW9uIGNXKCl7Ylo9bmV3IEltYWdlLGIkPXBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6NzMiKSksYloudXJsPVoud2F0ZXJtYXJrUGF0aCxiWi5vbmxvYWQ9Y1gsYloub25lcnJvcj1jWixiWi5zcmM9Wi53YXRlcm1hcmtQYXRofWZ1bmN0aW9uIGNYKCl7aWYodSl7dmFyIGE9cGFyc2VGbG9hdChaLlV0aWxzLnoxODUoIno3NCIpKSxiPXBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6NzYiKSksYz1wYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejc1IikpLGQ9Y0IoQSxDKSxlPShaLmltYWdlVypkLXUud2lkdGgpLzIsZj0oWi5pbWFnZUgqZC11LmhlaWdodCkvMixnPShaLmltYWdlVy8yLVouaW1hZ2VYKSpkLGg9KFouaW1hZ2VILzItWi5pbWFnZVkpKmQsaT1kPGE/YTpkLGo9TWF0aC5yb3VuZChaLmltYWdlVy9iKSxrPU1hdGgucm91bmQoWi5pbWFnZUgvYyksbD1jeSgpO3dpU2NhbGVkVz1iWi53aWR0aCppLHdpU2NhbGVkSD1iWi5oZWlnaHQqaTt2YXIgbT0wLG49MDtmb3IodmFyIG89MTtvPD1qO28rKylmb3IodmFyIHA9MTtwPD1rO3ArKyl7dmFyIHE9TWF0aC5yb3VuZChaLmltYWdlVy8oaisxKSpvKSxyPU1hdGgucm91bmQoWi5pbWFnZUgvKGsrMSkqcCk7aWYocT5sLmxlZnQmJnE8bC5yaWdodCYmcj5sLnRvcCYmcjxsLmJvdHRvbSl7dmFyIHM9TWF0aC5yb3VuZChxKmQtd2lTY2FsZWRXLzItZStnKSx0PU1hdGgucm91bmQocipkLXdpU2NhbGVkSC8yLWYraCk7aWYoWi5pbWFnZVc+NGUzKXt2YXIgdj1tKzEwMCx3PW4rMTAwO2lmKHM8diYmdDx3KWNvbnRpbnVlO209cyxuPXR9dmFyIHg9YlouY2xvbmVOb2RlKCEwKTtaLlV0aWxzLnNldE9wYWNpdHkoeCxiJCkseC53aWR0aD13aVNjYWxlZFcseC5oZWlnaHQ9d2lTY2FsZWRIO3ZhciB5PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2Iiwid2lDIiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLHdpU2NhbGVkVysicHgiLHdpU2NhbGVkSCsicHgiLHMrInB4Iix0KyJweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4Iik7eS5hcHBlbmRDaGlsZCh4KSx1LmFwcGVuZENoaWxkKHkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih4LCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHgsIm1vdXNlZG93biIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCl9fX19ZnVuY3Rpb24gY1koKXt1JiYoY3QodSksY1goKSl9ZnVuY3Rpb24gY1ooKXtaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6OTciKSt0aGlzLnVybCl9ZnVuY3Rpb24gYyQoYixjLGQpe2EuejI5M0FsbFN0b3AoKSxaLmltYWdlWj1jVihkKTt2YXIgZT1jUyhiLGMpO1ouaW1hZ2VYPWUueCxaLmltYWdlWT1lLnksYS56Mjc0KCEwKX1mdW5jdGlvbiBjXygpe2lmKGJCKXtkYihidixidyxieCwhMSk7aWYoYnYhPT0wfHxidyE9PTB8fGJ4IT09MCliQj13aW5kb3cuc2V0VGltZW91dChjXyxiQSl9fWZ1bmN0aW9uIGRhKCl7Yk88Ykk/KGRiKGJKLGJLLGJMLCEwKSxiTysrLGJOPXdpbmRvdy5zZXRUaW1lb3V0KGRhLGJIKSk6KEM9Yk8qYkwrY0MoQSxaLmltYWdlWiksYS56MjkzQWxsU3RvcCgpLGEuejI3MyghMCkpfWZ1bmN0aW9uIGRiKGEsYixkLGUpe3ZhciBmLGcsaCxpPSExLGo9ITEsbD0hMTtpZihkIT0wKXt2YXIgbT1DKigxK2QpO2UmJihtPUMrZCk7dmFyIG49Y0IoQSxtKTtoPWNWKG4pO2lmKGghPVouaW1hZ2VaKXt2YXIgbz1kZShoKTtvJiYoIWUsaj0hMCxsPSEwKX19aWYoYSE9MHx8YiE9MCl7dmFyIHA9cGFyc2VGbG9hdChrLmxlZnQpK2Escz1wYXJzZUZsb2F0KGsudG9wKStiLHQ9Y1UocCxzKTtmPXQueCxnPXQueSxrLmxlZnQ9ZisicHgiLGsudG9wPWcrInB4IixpPSEwLGw9ITB9dmFyIHU9YnklMj09MDt1JiYoY1koKSxqJiZjdSgpLGwmJmN2KCkpO2lmKGkpdmFyIHY9Wi51c2VDYW52YXM/cGFyc2VGbG9hdChyLndpZHRoKS9xLndpZHRoOjEsdz1NYXRoLnJvdW5kKGMvYnUqQyp2KSx4PWJ5JXc9PTAmJmJ5IT0wfWZ1bmN0aW9uIGRjKCl7YkImJih3aW5kb3cuY2xlYXJUaW1lb3V0KGJCKSxiQj1udWxsKSxidj0wLGJ3PTAsYng9MCxieT0wfWZ1bmN0aW9uIGRkKCl7Yk4mJih3aW5kb3cuY2xlYXJUaW1lb3V0KGJOKSxiTj1udWxsKX1mdW5jdGlvbiBkZShhKXt2YXIgYj0hMSxjPWNDKEEsYSk7aWYoYyE9Qyl7Qz1jLEU9Y0MoQixhKTt2YXIgZD1jL0QsZT1iYipkLGY9YmMqZCxnPShiYi1lKS8yLGg9KGJjLWYpLzI7aWYoYzxEKXt2YXIgaT1jVChnLGgpO2subGVmdD1iZitpLngtZysicHgiLGsudG9wPWJoK2kueS1oKyJweCJ9aWYoWi51c2VDYW52YXMpci53aWR0aD1lKyJweCIsci5oZWlnaHQ9ZisicHgiLHIubGVmdD1nKyJweCIsci50b3A9aCsicHgiLGU9YmoqZCxmPWJrKmQsZz1ibCtaLmltYWdlWCooMS1kKSpaLmltYWdlWixoPWJtK1ouaW1hZ2VZKigxLWQpKlouaW1hZ2VaLG4ud2lkdGg9ZSsicHgiLG4uaGVpZ2h0PWYrInB4IixuLmxlZnQ9ZysicHgiLG4udG9wPWgrInB4IjtlbHNle2NyKHEsQSxPLCEwLCExKSx0aWVyQmFja2ZpbGxXPUhbQl0sdGllckJhY2tmaWxsSD1JW0JdLG0ud2lkdGg9dGllckJhY2tmaWxsVyxtLmhlaWdodD10aWVyQmFja2ZpbGxIO3ZhciBqPXRpZXJCYWNrZmlsbFcqRSxsPXRpZXJCYWNrZmlsbEgqRSxvPVouaW1hZ2VYKmEscD1aLmltYWdlWSphO2JsPWJkLW8sYm09YmUtcCxuLmxlZnQ9YmwrInB4IixuLnRvcD1ibSsicHgiLGNyKG0sQixGLCExLCExKX1iPSEwfXJldHVybiBifWZ1bmN0aW9uIGRmKGEpe2E/KGJYfHxkZygpLGJYLmVsbXQuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIik6YlgmJihiWC5lbG10LnN0eWxlLmRpc3BsYXk9Im5vbmUiKX1mdW5jdGlvbiBkZygpe3ZhciBhPVouVXRpbHMuejE4NSgiejIxIiksYj0zNCxjPTM0LGQ9MjAsZT1wYXJzZUZsb2F0KFoudmlld2VyVyktKGIrZCksZj1wYXJzZUZsb2F0KFoudmlld2VySCktKGMrZCksZz1aLlV0aWxzLnoxODUoInoyMCIpO2JYPW5ldyBaLlV0aWxzLkJ1dHRvbigiYnV0dG9uRlBDYW5jZWwiLGEsbnVsbCxudWxsLG51bGwsbnVsbCxiKyJweCIsYysicHgiLGUrInB4IixmKyJweCIsIm1vdXNlZG93biIsZGgsInoxMDIiLCJzb2xpZCIsIjFweCIsZywiMHB4IiwiMHB4IiksWi5WaWV3ZXJEaXNwbGF5LmFwcGVuZENoaWxkKGJYLmVsbXQpfWZ1bmN0aW9uIGRoKCl7YS50b2dnbGVGdWxsUGFnZVZpZXcoITEpfWZ1bmN0aW9uIGRpKCl7Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJrZXlkb3duIixkeiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJrZXl1cCIsZEEpLFoubW9iaWxlRGV2aWNlPyhaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwidG91Y2hzdGFydCIsZHApLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihpLCJ0b3VjaG1vdmUiLGRxKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwidG91Y2hlbmQiLGRyKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwidG91Y2hjYW5jZWwiLGRzKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwiZ2VzdHVyZXN0YXJ0IixkdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksImdlc3R1cmVjaGFuZ2UiLGR1KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwiZ2VzdHVyZWVuZCIsZHYpLGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0ub25vcmllbnRhdGlvbmNoYW5nZT1keSk6KFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihaLlZpZXdlckRpc3BsYXksIm1vdXNlb3ZlciIsZGopLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihaLlZpZXdlckRpc3BsYXksIm1vdXNlb3V0IixkbiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKFouVmlld2VyRGlzcGxheSwibW91c2Vtb3ZlIixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwibW91c2Vkb3duIixkayksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksIm1vdXNlbW92ZSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihtLCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHEsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSx1JiZaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodSwiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpLHgmJlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih4LCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCl9ZnVuY3Rpb24gZGooYSl7dmFyIGI9Wi5VdGlscy56MjI1KFouVXRpbHMudGFyZ2V0KFouVXRpbHMuZXZlbnQoYSkpKSxjPVouVXRpbHMuejIyNShaLlV0aWxzLnJlbGF0ZWRUYXJnZXQoYSkpO2lmKCFifHwhYylaLlRvb2xiYXJEaXNwbGF5JiZaLnRvb2xiYXJWaXNpYmxlPjEmJlouVG9vbGJhci5zaG93KCEwKSxaLk5hdmlnYXRvckRpc3BsYXkmJloubmF2aWdhdG9yVmlzaWJsZT4xJiZaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCEwKSxibz1udWxsfWZ1bmN0aW9uIGRrKGEpe2lmKFouVXRpbHMuaXNSaWdodE1vdXNlQnV0dG9uKGEpKXJldHVybjtibj0hMDt2YXIgYj1aLlV0aWxzLnoxODEoYSk7cmV0dXJuIGJQPW5ldyBaLlV0aWxzLlBvaW50KGIueCxiLnkpLGkubW91c2VYUHJpb3I9Yi54LGkubW91c2VZUHJpb3I9Yi55LFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2Vtb3ZlIixkbCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksIm1vdXNldXAiLGRtKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNldXAiLGRtKSwhMX1mdW5jdGlvbiBkbChiKXtpZighWi5tb3VzZVBhbilyZXR1cm47dmFyIGI9Wi5VdGlscy5ldmVudChiKSxjPVouVXRpbHMuejE4MShiKSxkPWMueC1pLm1vdXNlWFByaW9yLGU9Yy55LWkubW91c2VZUHJpb3I7aWYoIWlzTmFOKGQpJiYhaXNOYU4oZSkpe3ZhciBmPXBhcnNlRmxvYXQoay5sZWZ0KStkLGc9cGFyc2VGbG9hdChrLnRvcCkrZSxoPWNVKGYsZyk7ay5sZWZ0PWgueCsicHgiLGsudG9wPWgueSsicHgiLGkubW91c2VYUHJpb3I9Yy54LGkubW91c2VZUHJpb3I9Yy55O2lmKFouTmF2aWdhdG9yKXt2YXIgaj1hLnoxNDEoaCk7Wi5OYXZpZ2F0b3IuejI2M1JlY3RhbmdsZVBvc2l0aW9uKGopfX1yZXR1cm4hMX1mdW5jdGlvbiBkbShiKXtibj0hMSxkb2N1bWVudC5tb3VzZW1vdmU9bnVsbCxkb2N1bWVudC5tb3VzZXVwPW51bGwsWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZW1vdmUiLGRsKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoaSwibW91c2V1cCIsZG0pLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsZG0pO3ZhciBiPVouVXRpbHMuZXZlbnQoYiksYz1aLlV0aWxzLnoxODEoYiksZDtibz9kPWJvOmQ9bmV3IFouVXRpbHMuUG9pbnQoYy54LGMueSk7dmFyIGU9TWF0aC5zcXJ0KE1hdGgucG93KGJQLngtZC54LDIpK01hdGgucG93KGJQLnktZC55LDIpKTtpZihlPDQpe3ZhciBmPWEuejE3MyhiLGQsQSxDKTtaLmNsaWNrWm9vbT9hLnoyOTNUb1ZpZXcoZi54LGYueSxmLnopOlouY2xpY2tQYW4mJmEuejI5M1RvVmlldyhmLngsZi55LFouaW1hZ2VaKX1lbHNlIFoubW91c2VQYW4mJmEuejI3NCgpO2JvJiYoWi5Ub29sYmFyRGlzcGxheSYmWi50b29sYmFyVmlzaWJsZT4xJiZaLlRvb2xiYXIuc2hvdyghMSksWi5OYXZpZ2F0b3JEaXNwbGF5JiZaLm5hdmlnYXRvclZpc2libGU+MSYmWi5OYXZpZ2F0b3Iuc2V0VmlzaWJpbGl0eSghMSkpfWZ1bmN0aW9uIGRuKGEpe3ZhciBiPVouVXRpbHMuejIyNShaLlV0aWxzLnRhcmdldChhKSksYz1aLlV0aWxzLnoyMjUoWi5VdGlscy5yZWxhdGVkVGFyZ2V0KFouVXRpbHMuZXZlbnQoYSkpKTtpZighYnx8IWMpaWYoIWJuKVouVG9vbGJhckRpc3BsYXkmJloudG9vbGJhclZpc2libGU+MSYmWi5Ub29sYmFyLnNob3coITEpLFouTmF2aWdhdG9yRGlzcGxheSYmWi5uYXZpZ2F0b3JWaXNpYmxlPjEmJlouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITEpO2Vsc2V7dmFyIGQ9Wi5VdGlscy56MTgxKGEpO2JvPW5ldyBaLlV0aWxzLlBvaW50KGQueCxkLnkpfX1mdW5jdGlvbiBkcChhKXt2YXIgYj1aLlV0aWxzLnoxNzgoYSk7aWYoYiYmIWJwKXticj0hMTt2YXIgYz1iLnRhcmdldCxkPW5ldyBaLlV0aWxzLlBvaW50KGIucGFnZVgsYi5wYWdlWSk7YlA9bmV3IFouVXRpbHMuUG9pbnQoZC54LGQueSksaS5tb3VzZVhQcmlvcj1kLngsaS5tb3VzZVlQcmlvcj1kLnl9fWZ1bmN0aW9uIGRxKGIpe2IucHJldmVudERlZmF1bHQoKTtpZighWi5tb3VzZVBhbilyZXR1cm47dmFyIGM9Wi5VdGlscy56MTc4KGIpO2lmKGMmJiFicCYmIWJyKXt2YXIgZD1jLnRhcmdldCxlPW5ldyBaLlV0aWxzLlBvaW50KGMucGFnZVgsYy5wYWdlWSksZj1lLngtaS5tb3VzZVhQcmlvcixnPWUueS1pLm1vdXNlWVByaW9yO2lmKCFpc05hTihmKSYmIWlzTmFOKGcpKXt2YXIgaD1wYXJzZUZsb2F0KGsubGVmdCkrZixqPXBhcnNlRmxvYXQoay50b3ApK2csbD1jVShoLGopO2subGVmdD1sLngrInB4IixrLnRvcD1sLnkrInB4IixpLm1vdXNlWFByaW9yPWUueCxpLm1vdXNlWVByaW9yPWUueTtpZihaLk5hdmlnYXRvcil7dmFyIG09YS56MTQxKGwpO1ouTmF2aWdhdG9yLnoyNjNSZWN0YW5nbGVQb3NpdGlvbihtKX19fXJldHVybiExfWZ1bmN0aW9uIGRyKGIpe2lmKCFicCYmIWJyKXt2YXIgYz0hMSxkPVouVXRpbHMuejE3OChiKTtpZihkKXt2YXIgZT1kLnRhcmdldCxmPW5ldyBaLlV0aWxzLlBvaW50KGQucGFnZVgsZC5wYWdlWSksZz1uZXcgWi5VdGlscy5Qb2ludChmLngsZi55KSxoPU1hdGguc3FydChNYXRoLnBvdyhiUC54LWcueCwyKStNYXRoLnBvdyhiUC55LWcueSwyKSk7aWYoaDw0KXt2YXIgaT1hLnoxNzMoYixnLEEsQyk7Wi5jbGlja1pvb20/YS56MjkzVG9WaWV3KGkueCxpLnksaS56KTpaLmNsaWNrUGFuJiZhLnoyOTNUb1ZpZXcoaS54LGkueSxaLmltYWdlWil9ZWxzZSBjPSEwfWVsc2UgYz0hMDtjJiZaLm1vdXNlUGFuJiZhLnoyNzQoKX19ZnVuY3Rpb24gZHMoYil7aWYoIWJwJiYhYnIpe3ZhciBjPSExLGQ9Wi5VdGlscy56MTc4KGIpO2lmKGQpe3ZhciBlPWQudGFyZ2V0LGY9bmV3IFouVXRpbHMuUG9pbnQoZC5wYWdlWCxkLnBhZ2VZKSxnPW5ldyBaLlV0aWxzLlBvaW50KGYueCxmLnkpLGg9TWF0aC5zcXJ0KE1hdGgucG93KGJQLngtZy54LDIpK01hdGgucG93KGJQLnktZy55LDIpKTtpZihoPDQpe3ZhciBpPWEuejE3MyhiLGcsQSxDKTtaLmNsaWNrWm9vbT9hLnoyOTNUb1ZpZXcoaS54LGkueSxpLnopOlouY2xpY2tQYW4mJmEuejI5M1RvVmlldyhpLngsaS55LFouaW1hZ2VaKX1lbHNlIGM9ITB9ZWxzZSBjPSEwO2MmJloubW91c2VQYW4mJmEuejI3NCgpfX1mdW5jdGlvbiBkdChhKXt2YXIgYT1aLlV0aWxzLmV2ZW50KGEpO2R1KGEpLGJwfHwoYnA9d2luZG93LnNldEludGVydmFsKGR3LGJzKSl9ZnVuY3Rpb24gZHUoYSl7dmFyIGE9Wi5VdGlscy5ldmVudChhKTthLnByZXZlbnREZWZhdWx0KCksYnE9TWF0aC5yb3VuZChhLnNjYWxlKjEwMCkvMTAwfWZ1bmN0aW9uIGR2KGIpe2JwJiYod2luZG93LmNsZWFySW50ZXJ2YWwoYnApLGJyPSEwLGJwPW51bGwpLFoubW91c2VQYW4mJmEuejI3NCgpfWZ1bmN0aW9uIGR3KGEpe2lmKCFaLm1vdXNlUGFuKXJldHVybjt2YXIgYj1keChBLEQsYnEpLGM9Y1YoYik7YiE9Wi5pbWFnZVomJmRlKGMpfWZ1bmN0aW9uIGR4KGEsYixjKXt2YXIgZD1iKmMsZT1jQihhLGQpO3JldHVybiBlfWZ1bmN0aW9uIGR5KGIpe1ouZnVsbFBhZ2UmJihaLlRvb2xiYXJEaXNwbGF5JiZaLnRvb2xiYXJWaXNpYmxlPjEmJlouVG9vbGJhci5zaG93KCExKSxaLk5hdmlnYXRvckRpc3BsYXkmJloubmF2aWdhdG9yVmlzaWJsZT4xJiZaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCExKSxhLnRvZ2dsZUZ1bGxQYWdlVmlldyghMSksYS50b2dnbGVGdWxsUGFnZVZpZXcoITApLFouVG9vbGJhckRpc3BsYXkmJloudG9vbGJhclZpc2libGU+MSYmWi5Ub29sYmFyLnNob3coITApLFouTmF2aWdhdG9yRGlzcGxheSYmWi5uYXZpZ2F0b3JWaXNpYmxlPjEmJlouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITApKX1mdW5jdGlvbiBkeihiKXtpZighWi5rZXlzKXJldHVybjt2YXIgYj1aLlV0aWxzLmV2ZW50KGIpO3N3aXRjaChiLmtleUNvZGUpe2Nhc2UgOTA6YS56b29tKCJvdXQiKTticmVhaztjYXNlIDE3OmEuem9vbSgib3V0Iik7YnJlYWs7Y2FzZSA2NTphLnpvb20oImluIik7YnJlYWs7Y2FzZSAxNjphLnpvb20oImluIik7YnJlYWs7Y2FzZSAzNzphLnBhbigibGVmdCIpO2JyZWFrO2Nhc2UgMzg6YS5wYW4oInVwIik7YnJlYWs7Y2FzZSA0MDphLnBhbigiZG93biIpO2JyZWFrO2Nhc2UgMzk6YS5wYW4oInJpZ2h0Iik7YnJlYWs7Y2FzZSAyNzpaLmZ1bGxQYWdlP2EudG9nZ2xlRnVsbFBhZ2VWaWV3KCExKTphLnJlc2V0KCl9fWZ1bmN0aW9uIGRBKGIpe2lmKCFaLmtleXMpcmV0dXJuO3ZhciBiPVouVXRpbHMuZXZlbnQoYiksYz1iLmtleUNvZGU7Yz09OTB8fGM9PTE3fHxjPT02NXx8Yz09MTY/YS56b29tKCJzdG9wIik6Yz09Mzd8fGM9PTM5P2EucGFuKCJob3Jpem9udGFsU3RvcCIpOihjPT0zOHx8Yz09NDApJiZhLnBhbigidmVydGljYWxTdG9wIil9dmFyIGE9dGhpcyxiPSExLGM9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NjEiKSwxMCksZD1wYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejU5IikpLGU9ZC8yLGY9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NjIiKSwxMCksZz1aLnRvb2xiYXJWaXNpYmxlPT0xP1oudG9vbGJhckg6MCxoLGksayxsLG0sbixvLHAscSxyLHMsdCx1LHYsdyx4LHk7Y2coKTt2YXIgej0xLEE9MCxCPTAsQyxELEUsRj1bXSxHPVtdLEg9W10sST1bXSxKPVtdLEs9W10sTD1bXSxNPVtdLE49W10sTz1bXSxQPVtdLFE9W10sUj0wLFM9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NyIpLDEwKSxUPXBhcnNlSW50KFouVXRpbHMuejE4NSgiejYiKSwxMCksVT1wYXJzZUludChaLlV0aWxzLnoxODUoIno1IiksMTApLFY9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NCIpLDEwKSxXPXBhcnNlSW50KFouVXRpbHMuejE4NSgiejMiKSwxMCksWD1wYXJzZUludChaLlV0aWxzLnoxODUoIno0NSIpLDEwKSxZLCQsXyxiYSxiYixiYyxiZCxiZSxiZixiZyxiaCxiaSxiaixiayxibCxibTtZPVoudmlld2VyVywkPVoudmlld2VySCxfPWJhPTAsJC09ZyxaLnRvb2xiYXJQb3NpdGlvbj09MCYmKGJhKz1nKTt2YXIgYm49ITEsYm89bnVsbCxicD1udWxsLGJxPW51bGwsYnI9ITEsYnM9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6MjQiKSwxMCksYnQ9cGFyc2VGbG9hdChaLlV0aWxzLnoxODUoIno4MSIpKSpaLnpvb21TcGVlZDtaLm1vYmlsZURldmljZSYmKGJ0Lz0yKTt2YXIgYnU9TWF0aC5yb3VuZChwYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejQ3IikpKloucGFuU3BlZWQpLGJ2PTAsYnc9MCxieD0wLGJ5PTAsYno9MCxiQT1wYXJzZUludChaLlV0aWxzLnoxODUoIno3NyIpLDEwKSxiQixiQyxiRCxiRT1wYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejE5IikpKlouZmFkZUluU3BlZWQsYkYsYkc9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NzgiKSwxMCksYkg9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NzkiKSwxMCksYkk9YkcvYkgsYkosYkssYkwsYk0sYk4sYk8sYlAsYlEsYlIsYlMsYlQsYlUsYlYsYlcsYlgsYlk7aWYoWi5VdGlscy5pc1N0clZhbChaLndhdGVybWFya1BhdGgpKXZhciBiWixiJCxiXz1bXSxjYT1bXTtjaChZLCQsXyxiYSk7dmFyIGNiPW5ldyBaLnoxMDEsY2M9Wi5VdGlscy56MTQwKFouaW1hZ2VQYXRoKyIvIisiSW1hZ2VQcm9wZXJ0aWVzLnhtbCIpO2NiLmxvYWRYTUwoY2MpLHRoaXMuejIwNj1mdW5jdGlvbihhLGIpe1ouaW1hZ2VXPWEsWi5pbWFnZUg9YixjaSgpLGNqKCksRT1jQyhCLFouaW5pdGlhbFopLEM9Y0MoQSxaLmluaXRpYWxaKSxEPUMsWi51c2VDYW52YXMmJnMuc2NhbGUoQyxDKSx1JiZjVygpLGNrKCksYyQoWi5pbml0aWFsWCxaLmluaXRpYWxZLFouaW5pdGlhbFopLGRpKCksY2YoITApLFouVmlld2VyLnoxNDgoKX0sdGhpcy5yZXoyMDY9ZnVuY3Rpb24oYSxiKXtjZighMSksY2QoKSxaLmltYWdlVz1hLFouaW1hZ2VIPWIsY2koKSxjaigpLEU9Y0MoQixaLmluaXRpYWxaKSxDPWNDKEEsWi5pbml0aWFsWiksRD1DLFoudXNlQ2FudmFzJiYocy5yZXN0b3JlKCkscy5zY2FsZShDLEMpKSxjaygpLGNoKFksJCxfLGJhKSxtJiZjdChtKSxxJiZjdChxKSx1JiZjdCh1KSxjJChaLmluaXRpYWxYLFouaW5pdGlhbFksWi5pbml0aWFsWiksY2YoITApLFoubmF2aWdhdG9yVmlzaWJsZT4wJiZaLk5hdmlnYXRvci5zZXRJbWFnZVBhdGgoWi5pbWFnZVBhdGgpfSx0aGlzLnoxODA9ZnVuY3Rpb24oKXtyZXR1cm4gY2UoKX0sdGhpcy56MjAxPWZ1bmN0aW9uKCl7cmV0dXJuIGJifSx0aGlzLnoxNzk9ZnVuY3Rpb24oKXtyZXR1cm4gYmN9LHRoaXMuejE4Nj1mdW5jdGlvbigpe3JldHVybiB6fSx0aGlzLnoxOTU9ZnVuY3Rpb24oKXtyZXR1cm4gY30sdGhpcy56MTg3PWZ1bmN0aW9uKCl7cmV0dXJuIEF9LHRoaXMuejE4OT1mdW5jdGlvbigpe3JldHVybiBDfSx0aGlzLnoxODlBc1pvb209ZnVuY3Rpb24oKXt2YXIgYT1jQihBLEMpO3JldHVybiBhfSx0aGlzLnoxOTQ9ZnVuY3Rpb24oKXtyZXR1cm4gZH0sdGhpcy56MTkzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LHRoaXMuejE5Nz1mdW5jdGlvbigpe3JldHVybiBmfSx0aGlzLnoxOTI9ZnVuY3Rpb24oKXtyZXR1cm4gSC5qb2luKCIsIil9LHRoaXMuejE4OD1mdW5jdGlvbigpe3JldHVybiBJLmpvaW4oIiwgIil9LHRoaXMuejE5MT1mdW5jdGlvbigpe3JldHVybiBMLmpvaW4oIiwgIil9LHRoaXMuejE5Nj1mdW5jdGlvbigpe3ZhciBhPU4uam9pbigiLCAiKT09IiI/IkN1cnJlbnQgdmlldyBsb2FkaW5nIGNvbXBsZXRlIjpOLmpvaW4oIiwgIik7cmV0dXJuIGF9LHRoaXMuc2V0U2l6ZUFuZFBvc2l0aW9uPWZ1bmN0aW9uKGEsYixjLGQpe2NoKGEsYixjLGQpfSx0aGlzLnoyNzQ9ZnVuY3Rpb24oYSl7aWYoQyE9RHx8Wi5pbWFnZVohPWJ6fHxwYXJzZUZsb2F0KGsubGVmdCkhPWJmfHxwYXJzZUZsb2F0KGsudG9wKSE9Ymh8fGEpe2NuKCksYno9Y0IoQSxDKTt2YXIgYz0hMTtpZihDIT1EfHxaLmltYWdlWiE9Ynp8fCFifHxhKVouaW1hZ2VaPGJ6JiYhYSYmKGM9ITApLGNvKCksY3AoKSxjcihtLEIsRiwhMSwhMSk7Y3EoKSxjcihxLEEsTywhMCxjKSxjcyhOLGNMLDApLGN1KCksY3YoKX19LHRoaXMuc2V0Vmlldz1mdW5jdGlvbihhLGIsYyl7aWYoYT09dW5kZWZpbmVkfHxhPT1udWxsKWE9Wi5pbWFnZVcvMjtpZihiPT11bmRlZmluZWR8fGI9PW51bGwpYj1aLmltYWdlSC8yO2M9PXVuZGVmaW5lZHx8Yz09bnVsbD9jPVouZml0WjpjPjEmJihjPWMvMTAwKSxjJChhLGIsYyl9LHRoaXMuem9vbT1mdW5jdGlvbihiKXtzd2l0Y2goYil7Y2FzZSJvdXQiOmJ4Pj0wJiYoYngtPWJ0KTticmVhaztjYXNlImluIjpieDw9MCYmKGJ4Kz1idCk7YnJlYWs7Y2FzZSJzdG9wIjpieD0wfVouem9vbWluZz1ieD09MD8ic3RvcCI6Yng+MD8iaW4iOiJvdXQiLGJ4IT0wP2JCfHwoKGJ4PDAmJlouaW1hZ2VaPloubWluWnx8Yng+MCYmWi5pbWFnZVo8Wi5tYXhaKSYmYS56MjczKCExKSxaLnVzZUNhbnZhc3x8Y3QodSksYkI9d2luZG93LnNldFRpbWVvdXQoY18sYkEpKTooYS56MjkzQWxsU3RvcCgpLGEuejI3MyghMCkpfSx0aGlzLnBhbj1mdW5jdGlvbihiKXtzd2l0Y2goYil7Y2FzZSJsZWZ0Ijpidjw9MCYmKGJ2Kz1idSk7YnJlYWs7Y2FzZSJ1cCI6Ync8PTAmJihidys9YnUpO2JyZWFrO2Nhc2UiZG93biI6Ync+PTAmJihidy09YnUpO2JyZWFrO2Nhc2UicmlnaHQiOmJ2Pj0wJiYoYnYtPWJ1KTticmVhaztjYXNlImhvcml6b250YWxTdG9wIjpidj0wO2JyZWFrO2Nhc2UidmVydGljYWxTdG9wIjpidz0wO2JyZWFrO2Nhc2Uic3RvcCI6YnY9MCxidz0wfVoucGFubmluZ1g9YnY9PTA/InN0b3AiOmJ2PjA/ImxlZnQiOiJyaWdodCIsWi5wYW5uaW5nWT1idz09MD8ic3RvcCI6Ync+MD8idXAiOiJkb3duIixiQz1aLmltYWdlWCpjQihBLDEpLGJEPVouaW1hZ2VZKmNCKEEsMSksYnYhPTB8fGJ3IT0wP2JCfHwoYS56MjczKCEwKSxaLnVzZUNhbnZhc3x8Y3QodSksYkI9d2luZG93LnNldFRpbWVvdXQoY18sYkEpKTooYS56MjkzQWxsU3RvcCgpLGEuejI3MyghMCkpfSx0aGlzLnoyOTNUb1ZpZXc9ZnVuY3Rpb24oYixjLGQpe2EuejI5M0FsbFN0b3AoKTt2YXIgZT1jRihiLGMpLGY9YmQtZS54LGc9YmUtZS55LGg9Y0MoQSxkKSxpPWNDKEIsZCksaj1wYXJzZUZsb2F0KGsubGVmdCkrZixsPXBhcnNlRmxvYXQoay50b3ApK2csbT1oLUMsbj1pLUU7Yko9ai9iSSxiSz1sL2JJLGJMPW0vYkksYk09bi9iSSxhLnoyNzMoITEpLGJPPTAsYk49d2luZG93LnNldFRpbWVvdXQoZGEsYkgpfSx0aGlzLnoyOTNBbGxTdG9wPWZ1bmN0aW9uKGIpe2RjKCksZGQoKSxifHxhLnoyNzQoKX0sdGhpcy56MjQ1PWZ1bmN0aW9uKGEpe3ZhciBiPWRlKGEpO2ImJihjWSgpLGN2KCkpfSx0aGlzLnJlc2V0PWZ1bmN0aW9uKCl7YS56MjkzVG9WaWV3KFouaW5pdGlhbFgsWi5pbml0aWFsWSxaLmluaXRpYWxaKX0sdGhpcy50b2dnbGVGdWxsUGFnZVZpZXdFeHRlcm5hbD1mdW5jdGlvbigpe2JZPSEwLGEudG9nZ2xlRnVsbFBhZ2VWaWV3KCl9LHRoaXMudG9nZ2xlRnVsbFBhZ2VWaWV3PWZ1bmN0aW9uKGIpe2EuejI5M0FsbFN0b3AoKSxaLmZ1bGxQYWdlPWI/YjohWi5mdWxsUGFnZTt2YXIgYz1kb2N1bWVudC5ib2R5LGQ9Yy5zdHlsZSxlPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSxmPVouVmlld2VyRGlzcGxheS5zdHlsZSxnPW51bGwsaD1udWxsO2lmKFouZnVsbFBhZ2Upe2JRPWQud2lkdGgsYlI9ZC5oZWlnaHQsYlM9ZC5vdmVyZmxvdyxiVD1lLm92ZXJmbG93LGJVPWYuYmFja2dyb3VuZENvbG9yLGJWPWYucG9zaXRpb24sYlc9Zi56SW5kZXg7dmFyIGk7Wi5tb2JpbGVEZXZpY2U/KGk9Wi5VdGlscy56MjAxaW5kb3dTaXplKCksZC53aWR0aD1pLngsZC5oZWlnaHQ9aS55KTooZC53aWR0aD0iMTAwJSIsZC5oZWlnaHQ9IjEwMCUiKSxkLm92ZXJmbG93PSJoaWRkZW4iLGUub3ZlcmZsb3c9ImhpZGRlbiIsZi5iYWNrZ3JvdW5kQ29sb3I9Wi5VdGlscy56MTg1KCJ6MjIiKSxmLnBvc2l0aW9uPSJmaXhlZCIsZi56SW5kZXg9Ijk5OTk5OTk5IixpPVouVXRpbHMuejIwMWluZG93U2l6ZSgpLGc9aS54LGg9aS55fWVsc2V7ZC53aWR0aD1iUSxkLmhlaWdodD1iUixkLm92ZXJmbG93PWJTLGUub3ZlcmZsb3c9YlQsZi5iYWNrZ3JvdW5kQ29sb3I9YlUsZi5wb3NpdGlvbj0icmVsYXRpdmUiLGYuekluZGV4PWJXO3ZhciBqPVouVXRpbHMuejE3NihaLnBhZ2VDb250YWluZXIpO2c9cGFyc2VGbG9hdChqLndpZHRoKSxoPXBhcnNlRmxvYXQoai5oZWlnaHQpLGlzTmFOKGcpJiYoZz1aLlZpZXdlckRpc3BsYXkuY2xpZW50V2lkdGgpLGlzTmFOKGgpJiYoaD1aLlZpZXdlckRpc3BsYXkuY2xpZW50SGVpZ2h0KSxiWT0hMX1aLnZpZXdlclc9ZyxaLnZpZXdlckg9aCxjaChnLGgpLGRmKGJZKTtpZihaLlRvb2xiYXJEaXNwbGF5JiZaLlRvb2xiYXIuejE4MCgpKXtaLnRvb2xiYXJDdXJyZW50Vz1aLnRvb2xiYXJXPT0tMT9nOloudG9vbGJhclc7dmFyIGw9Wi50b29sYmFyUG9zaXRpb249PTE/Wi52aWV3ZXJILVoudG9vbGJhckg6MDtaLlRvb2xiYXIuc2V0U2l6ZUFuZFBvc2l0aW9uKFoudG9vbGJhckN1cnJlbnRXLG51bGwsbnVsbCxsKX1aLk5hdmlnYXRvckRpc3BsYXkmJlouTmF2aWdhdG9yLnoxODAoKSYmWi5OYXZpZ2F0b3Iuc2V0U2l6ZUFuZFBvc2l0aW9uKFoubmF2aWdhdG9yVyxaLm5hdmlnYXRvckgsWi5uYXZpZ2F0b3JMLTEsWi5uYXZpZ2F0b3JULTEpLGNqKCksWi5pbWFnZVo9Y1YoWi5pbWFnZVopO2lmKFouY29uc3RyYWluUGFuKXt2YXIgbT1wYXJzZUZsb2F0KGsubGVmdCksbj1wYXJzZUZsb2F0KGsudG9wKSxvPWNVKG0sbik7ay5sZWZ0PW8ueCsicHgiLGsudG9wPW8ueSsicHgifWEuejI3NCghMCl9LHRoaXMuejI3MT1mdW5jdGlvbigpe3ZhciBhPVouVmlld2VyRGlzcGxheS5maXJzdENoaWxkLmNoaWxkTm9kZXNbMF0uc3R5bGU7YS5kaXNwbGF5PWEuZGlzcGxheT09Im5vbmUiPyJpbmxpbmUtYmxvY2siOiJub25lIn0sdGhpcy56MjcyPWZ1bmN0aW9uKCl7dmFyIGE9Wi5WaWV3ZXJEaXNwbGF5LmZpcnN0Q2hpbGQuY2hpbGROb2Rlc1sxXS5zdHlsZTthLmRpc3BsYXk9YS5kaXNwbGF5PT0ibm9uZSI/ImlubGluZS1ibG9jayI6Im5vbmUifSx0aGlzLnoyNzM9ZnVuY3Rpb24oYSl7aWYodil7dmFyIGI9YT9hOnYuZGlzcGxheSE9ImlubGluZS1ibG9jayI7di5kaXNwbGF5PWI/ImlubGluZS1ibG9jayI6Im5vbmUifX0sdGhpcy50b2dnbGVDb25zdHJhaW5QYW49ZnVuY3Rpb24oKXtaLmNvbnN0cmFpblBhbj0hWi5jb25zdHJhaW5QYW47aWYoWi5jb25zdHJhaW5QYW4pe3ZhciBiPXBhcnNlRmxvYXQoci5sZWZ0KSxjPXBhcnNlRmxvYXQoci50b3ApLGQ9Y1UoYixjKTtrLmxlZnQ9ZC54KyJweCIsay50b3A9ZC55KyJweCIsYS56Mjc0KCl9fSx0aGlzLnoxNzM9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9cGFyc2VGbG9hdChaLlV0aWxzLnoxODUoInoxMFRJRVJTS0lQVEhSRVNIT0xEIikpLGY9Y0QoYi54LGIueSksZz1jRShmLngsZi55KSxoPWNCKGMsZCk7cmV0dXJuIGEuYWx0S2V5PyhkPjErZT9oPWNCKGMsMSk6Yz4wJiYoaD1jQihjLTEsMSkpLGgtWi5maXRaPGUmJihoPVouZml0WikpOmQ8MS1lP2g9Y0IoYywxKTpjPHotMSYmKGg9Y0IoYysxLDEpKSxuZXcgWi5VdGlscy5Qb2ludDNEKGcueCxnLnksaCl9LHRoaXMuejI2Nz1mdW5jdGlvbihhLGIpe3ZhciBjPS0oYS1aLmltYWdlWCksZD0tKGItWi5pbWFnZVkpLGU9YypaLmltYWdlWixmPWQqWi5pbWFnZVosZz1lK2JmLGg9ZitiaCxpPWNVKGcsaCk7ay5sZWZ0PWkueCsicHgiLGsudG9wPWkueSsicHgifSx0aGlzLnoxNDE9ZnVuY3Rpb24oYSl7aWYoIWEpdmFyIGE9bmV3IFouVXRpbHMuUG9pbnQocGFyc2VGbG9hdChrLmxlZnQpLHBhcnNlRmxvYXQoay50b3ApKTt2YXIgYj1hLngtYmYsYz1hLnktYmgsZD1iL1ouaW1hZ2VaLGU9Yy9aLmltYWdlWixmPVouaW1hZ2VYLWQsZz1aLmltYWdlWS1lO3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChmLGcpfX0sWi56MTI0PWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIHUoKXt3aW5kb3cuY2xlYXJJbnRlcnZhbChxKSxxPW51bGw7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInByb2dyZXNzVGV4dEJveCIpLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQ7YSYmKGEubm9kZVZhbHVlPSIiKX1mdW5jdGlvbiB2KCl7cmV0dXJuIGN9ZnVuY3Rpb24gdyhhKXtjPWF9ZnVuY3Rpb24geChhLGIsYyxkKXthfHwoYT1aLnRvb2xiYXJWaXNpYmxlPjA/Wi50b29sYmFyQ3VycmVudFc6MCksYnx8KGI9Wi50b29sYmFyVmlzaWJsZT4wP2Y6MCksY3x8KGM9MCksZHx8KGQ9Wi50b29sYmFyUG9zaXRpb249PTE/Wi52aWV3ZXJILWY6MCk7dmFyIGU9Wi5Ub29sYmFyRGlzcGxheS5zdHlsZTtlLndpZHRoPWErInB4IixlLmhlaWdodD1iKyJweCIsZS5sZWZ0PWMrInB4IixlLnRvcD1kKyJweCIseShhLGIpfWZ1bmN0aW9uIHkoYSxiKXt2YXIgYz1hLGQ9YixlPXRvb2xiYXJTa2luU2l6ZXNbMl0sZj10b29sYmFyU2tpblNpemVzWzNdLGc9dG9vbGJhclNraW5TaXplc1s0XSxoPXRvb2xiYXJTa2luU2l6ZXNbNV0saT10b29sYmFyU2tpblNpemVzWzZdLGo9dG9vbGJhclNraW5TaXplc1s3XSxrPXRvb2xiYXJTa2luU2l6ZXNbOF0sbD10b29sYmFyU2tpblNpemVzWzldLG09dG9vbGJhclNraW5TaXplc1sxMF0sbj10b29sYmFyU2tpblNpemVzWzExXSxvPXRvb2xiYXJTa2luU2l6ZXNbMTJdLHA9dG9vbGJhclNraW5TaXplc1sxM10scT10b29sYmFyU2tpblNpemVzWzE0XSx1PXRvb2xiYXJTa2luU2l6ZXNbMTVdLHY9MCx3PShkLWYpLzIrMSx4PShkLWgpLzIseT0oZC1qKS8yLHo9eSoxLjMsQT15KzQsQj15KzIsQz1aLmxvZ29WaXNpYmxlPT0xPzA6ay8yLEQ9Wi5sb2dvVmlzaWJsZT09MT8wOmsvMixFPWstKGktZyksRj1aLmZ1bGxQYWdlVmlzaWJsZT84OjcsRz0yMCxIPUYqaysyKkU7Wi5zbGlkZXJWaXNpYmxlJiYoSCs9cCkscj1zPXQ9ITE7dmFyIEk9Wi5sb2dvVmlzaWJsZT09MT9lKzI6MCxKPVoudG9vbGJhclZpc2libGUhPTAmJloudG9vbGJhclZpc2libGUhPTE/azowLEs9SStKLEw9SytHK0grRytxO0w+YyYmKHI9ITAsTC1wPmMmJihzPSEwLEwtcC1xPmMmJih0PSEwLEs9MCkscT0wKSxILT1wKTt2YXIgTT1LKyhjLXEtSy1IKS8yLE49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJhY2tncm91bmQiKTtOLnN0eWxlLndpZHRoPWMrInB4IixOLmZpcnN0Q2hpbGQuc3R5bGUud2lkdGg9Yys0MDArInB4IixOLnN0eWxlLmhlaWdodD1kKyJweCIsTi5maXJzdENoaWxkLnN0eWxlLmhlaWdodD1kKyJweCI7dmFyIE89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvbkNvbnRhaW5lciIpO08uc3R5bGUud2lkdGg9SCtHKjIrInB4IixPLnN0eWxlLmhlaWdodD1kKyJweCIsTy5zdHlsZS5sZWZ0PU0tRysicHgiO3ZhciBQPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25CYWNrZ3JvdW5kIik7Wi5VdGlscy56MjAzKFAscGFyc2VGbG9hdChPLnN0eWxlLndpZHRoKSxwYXJzZUZsb2F0KE8uc3R5bGUuaGVpZ2h0KSksUC5zdHlsZS5sZWZ0PSIwcHgiO3ZhciBRPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0b29sYmFyTG9nbyIpO2lmKFEpe3ZhciBSPVEuc3R5bGU7aWYoUilpZighdCl7Ui5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLFouVXRpbHMuejIwMyhRLGUsZiksUi5sZWZ0PXYrInB4IixSLnRvcD13KyJweCIsdis9ZSsyO3ZhciBTPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsb2dvRGl2aWRlciIpO2lmKFMpe1ouVXRpbHMuejIwMyhTLGcsaCk7dmFyIFQ9Uy5zdHlsZTtULmxlZnQ9disicHgiLFQudG9wPXgrInB4In19ZWxzZSBSLmRpc3BsYXk9Im5vbmUifWlmKFoudG9vbGJhclZpc2libGUhPTAmJloudG9vbGJhclZpc2libGUhPTEpe3ZhciBVPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25NaW5pbWl6ZSIpLFY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvbkV4cGFuZCIpO2lmKFUmJlYpe3ZhciBXPVUuc3R5bGUsWD1WLnN0eWxlO1cmJlgmJih0PyhXLmRpc3BsYXk9Im5vbmUiLFguZGlzcGxheT0ibm9uZSIpOihXLmRpc3BsYXk9ImlubGluZS1ibG9jayIsWC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLFouVXRpbHMuejEzOChVLGksaiksWi5VdGlscy56MTM4KFYsaSxqKSxXLmxlZnQ9ditDKyJweCIsVy50b3A9eisicHgiLFgubGVmdD12K0QrInB4IixYLnRvcD16KyJweCIpKX19dj1HO3ZhciBZPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25ab29tT3V0Iik7Wi5VdGlscy56MTM4KFksaSxqKTt2YXIgJD1ZLnN0eWxlOyQubGVmdD12KyJweCIsJC50b3A9eSsicHgiLHYrPWs7dmFyIF89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRyYWNrU2xpZGVyIiksYmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblNsaWRlciIpO2lmKF8mJmJhKXt2YXIgYmI9Xy5zdHlsZSxiYz1iYS5zdHlsZTtiYiYmYmMmJihyPyhiYi5kaXNwbGF5PSJub25lIixiYy5kaXNwbGF5PSJub25lIik6KGJiLmRpc3BsYXk9ImlubGluZS1ibG9jayIsYmMuZGlzcGxheT0iaW5saW5lLWJsb2NrIixaLlV0aWxzLnoyMDMoXyxuLG8pLGJiLmxlZnQ9di0yKyJweCIsYmIudG9wPUErInB4IixaLlV0aWxzLnoxMzgoYmEsbCxtKSxiYy5sZWZ0PXBhcnNlRmxvYXQoYmIubGVmdCkrInB4IixiYy50b3A9QisicHgiLHYrPXApKX12YXIgYmQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblpvb21JbiIpO1ouVXRpbHMuejEzOChiZCxpLGopO3ZhciBiZT1iZC5zdHlsZTtiZS5sZWZ0PXYrInB4IixiZS50b3A9eSsicHgiLHYrPWsrMTt2YXIgYmY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBhbkRpdmlkZXIiKTtaLlV0aWxzLnoyMDMoYmYsZyxoKTt2YXIgYmc9YmYuc3R5bGU7YmcubGVmdD12KyJweCIsYmcudG9wPXgrInB4Iix2Kz1FO3ZhciBiaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uUGFuTGVmdCIpO1ouVXRpbHMuejEzOChiaCxpLGopO3ZhciBiaT1iaC5zdHlsZTtiaS5sZWZ0PXYrInB4IixiaS50b3A9eSsicHgiLHYrPWs7dmFyIGJqPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25QYW5VcCIpO1ouVXRpbHMuejEzOChiaixpLGopO3ZhciBiaz1iai5zdHlsZTtiay5sZWZ0PXYrInB4Iixiay50b3A9eSsicHgiLHYrPWs7dmFyIGJsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25QYW5Eb3duIik7Wi5VdGlscy56MTM4KGJsLGksaik7dmFyIGJtPWJsLnN0eWxlO2JtLmxlZnQ9disicHgiLGJtLnRvcD15KyJweCIsdis9azt2YXIgYm49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblBhblJpZ2h0Iik7Wi5VdGlscy56MTM4KGJuLGksaik7dmFyIGJvPWJuLnN0eWxlO2JvLmxlZnQ9disicHgiLGJvLnRvcD15KyJweCIsdis9azt2YXIgYnA9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblJlc2V0Iik7Wi5VdGlscy56MTM4KGJwLGksaik7dmFyIGJxPWJwLnN0eWxlO2JxLmxlZnQ9disicHgiLGJxLnRvcD15KyJweCIsdis9aysxO3ZhciBicj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZnVsbFBhZ2VEaXZpZGVyIik7aWYoYnIpe1ouVXRpbHMuejIwMyhicixnLGgpO3ZhciBicz1ici5zdHlsZTticy5sZWZ0PXYrInB4Iixicy50b3A9eCsicHgiLHYrPUU7dmFyIGJ0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25GdWxsUGFnZSIpO1ouVXRpbHMuejEzOChidCxpLGopO3ZhciBidT1idC5zdHlsZTtidS5sZWZ0PXYrInB4IixidS50b3A9eSsicHgifXZhciBidj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJvZ3Jlc3NUZXh0Qm94Iik7aWYoYnYpe3ZhciBidz1idi5zdHlsZTtidyYmKHM/YncuZGlzcGxheT0ibm9uZSI6KGJ3LmRpc3BsYXk9ImlubGluZS1ibG9jayIsYncud2lkdGg9cSsicHgiLGJ3LmhlaWdodD11KyJweCIsYncubGVmdD1jLXBhcnNlRmxvYXQoTy5zdHlsZS5sZWZ0KS1wYXJzZUZsb2F0KGJ3LndpZHRoKSsicHgiLGJ3LnRvcD0oZC1wYXJzZUZsb2F0KGJ3LmhlaWdodCkpLzIrInB4IikpfX1mdW5jdGlvbiB6KGEpe1oudG9vbGJhclZpc2libGU8NCYmIVoubW9iaWxlRGV2aWNlP0EoYSk6QighYSl9ZnVuY3Rpb24gQShhKXtnJiYoYT9nLmRpc3BsYXk9ImlubGluZS1ibG9jayI6Zy5kaXNwbGF5PSJub25lIil9ZnVuY3Rpb24gQihhKXtpZihnKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uQ29udGFpbmVyIiksYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYmFja2dyb3VuZCIpLGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvbk1pbmltaXplIiksZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uRXhwYW5kIiksZj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibG9nb0RpdmlkZXIiKSxoPTA7dHx8KGg9cGFyc2VGbG9hdChlLnN0eWxlLmxlZnQpK3BhcnNlRmxvYXQoZS5zdHlsZS53aWR0aCkrNCk7dmFyIGk9Wi50b29sYmFyQ3VycmVudFc7YT8oYi5zdHlsZS5kaXNwbGF5PSJub25lIix0fHwoZiYmKGYuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZS5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSxnLndpZHRoPWgrInB4IixjLnN0eWxlLndpZHRoPWgrInB4Iik6KGIuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIix0fHwoZiYmKGYuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIiksZC5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLGUuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGcud2lkdGg9aSsicHgiLGMuc3R5bGUud2lkdGg9aSsicHgiKX19ZnVuY3Rpb24gQyhhKXtpZihaLnNsaWRlclZpc2libGUpe2h8fChoPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0cmFja1NsaWRlciIpKSxpfHwoaT1oLnN0eWxlKSxqfHwoaj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uU2xpZGVyIikpLGt8fChrPWouc3R5bGUpO2lmKGkmJmspe3ZhciBiPVoubWF4Wi1aLm1pblosYz0oYS1aLm1pblopL2I7dHJhY2tMPXBhcnNlRmxvYXQoaS5sZWZ0KSx0cmFja1I9cGFyc2VGbG9hdChpLmxlZnQpK3BhcnNlRmxvYXQoaS53aWR0aCktcGFyc2VGbG9hdChrLndpZHRoKTt2YXIgZD10cmFja1ItdHJhY2tMLGU9YypkK3RyYWNrTDtrLmxlZnQ9ZSsicHgifX19ZnVuY3Rpb24gRChiKXtofHwoaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidHJhY2tTbGlkZXIiKSksaXx8KGk9aC5zdHlsZSk7aWYoaCYmaSl7dmFyIGMsZD1aLlV0aWxzLnoxNzQoaCk7Wi5tb2JpbGVEZXZpY2U/Yz1aLlV0aWxzLnoxODEoYikueC1kLng6Yz1iLmNsaWVudFgtZC54O3ZhciBlPUgoYywwLHBhcnNlRmxvYXQoaS53aWR0aCkpO2U8Wi5taW5aKy4xJiYoZT1aLm1pblopLGU+Wi5tYXhaLS4xJiYoZT1aLm1heFopLGEuejI0NShlKSxhLnoyNzQoKX19ZnVuY3Rpb24gRShhKXtuPSEwLGp8fChqPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25TbGlkZXIiKSk7aWYoail7dmFyIGI9Wi5VdGlscy56MTgxKGEpO2oubW91c2VYUHJpb3I9Yi54LGoubW91c2VZUHJpb3I9Yi55fX1mdW5jdGlvbiBGKGIpe2h8fChoPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0cmFja1NsaWRlciIpKSxpfHwoaT1oLnN0eWxlKSxqfHwoaj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uU2xpZGVyIikpLGt8fChrPWouc3R5bGUpO2lmKGkmJmomJmspe3RyYWNrTD1wYXJzZUZsb2F0KGkubGVmdCksdHJhY2tSPXBhcnNlRmxvYXQoaS5sZWZ0KStwYXJzZUZsb2F0KGkud2lkdGgpLXBhcnNlRmxvYXQoay53aWR0aCk7dmFyIGM9cGFyc2VGbG9hdChrLmxlZnQpKyhwLngtai5tb3VzZVhQcmlvcik7Yzx0cmFja0w/Yz10cmFja0w6Yz50cmFja1I/Yz10cmFja1I6ai5tb3VzZVhQcmlvcj1wLngsay5sZWZ0PWMrInB4Ijt2YXIgZD1IKGMsdHJhY2tMLHRyYWNrUik7YS56MjQ1KGQpfX1mdW5jdGlvbiBHKCl7bj0hMSxhLnoyNzQoKX1mdW5jdGlvbiBIKGEsYixjKXt2YXIgZD1jLWIsZT0oYS1iKS9kLGY9Wi5tYXhaLVoubWluWixnPVoubWluWitmKmU7cmV0dXJuIGd9ZnVuY3Rpb24gSShhKXt2YXIgYT1aLlV0aWxzLmV2ZW50KGEpLGI9Wi5VdGlscy5yZWxhdGVkVGFyZ2V0KFouVXRpbHMuZXZlbnQoYSkpO2lmKCFuJiZiKXt2YXIgYz1iLnBhcmVudE5vZGU7SyhjKX19ZnVuY3Rpb24gSihhKXtaLm1vYmlsZURldmljZSYmYS5wcmV2ZW50RGVmYXVsdCgpO3ZhciBhPVouVXRpbHMuZXZlbnQoYSksYj1aLlV0aWxzLnRhcmdldChhKSxjPVouVXRpbHMucmVsYXRlZFRhcmdldChhKTtpZihiKXt2YXIgZD1iLnBhcmVudE5vZGU7ZCYmKHRhcmdldFBhcmVudElEPWQuaWQpfWlmKGMpe3ZhciBlPWMucGFyZW50Tm9kZTtlJiYocmVsYXRlZFRhcmdldFBhcmVudElEPWUuaWQpfWlmKCFufHxhLnR5cGU9PSJtb3VzZXVwInx8YS50eXBlPT0idG91Y2hlbmQifHxhLnR5cGU9PSJ0b3VjaGNhbmNlbCIpTigpLGImJiFaLlV0aWxzLmlzUmlnaHRNb3VzZUJ1dHRvbihhKSYmKHRhcmdldFBhcmVudElEJiZ0YXJnZXRQYXJlbnRJRCE9InRyYWNrU2xpZGVyIiYmYS50eXBlIT0ibW91c2Vtb3ZlIiYmKE8oYSksUChhKSksUShhKSl9ZnVuY3Rpb24gSyhiKXthJiZhLnoyOTNBbGxTdG9wKCksYi5pZCYmYi5pZC5pbmRleE9mKCJidXR0b24iKSE9LTE/KEwoYiksTShiKSk6Yi5pZCYmYi5pZC5pbmRleE9mKCJiYWNrZ3JvdW5kIikhPS0xJiZOKCl9ZnVuY3Rpb24gTChhKXtaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSwibW91c2Vkb3duIixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSwibW91c2V1cCIsSiksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGEsIm1vdXNlb3V0IixKKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoYSwibW91c2VvdmVyIixKKX1mdW5jdGlvbiBNKGEpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuX2ltZ1VwSUQpLGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5faW1nT3ZlcklEKSxkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuX2ltZ0Rvd25JRCk7YiYmKGIuc3R5bGUudmlzaWJpbGl0eT0idmlzaWJsZSIpLGMmJihjLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIpLGQmJihkLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIpfWZ1bmN0aW9uIE4oKXt2YXIgYT1aLlRvb2xiYXJEaXNwbGF5LmNoaWxkTm9kZXMsYj1udWxsO2Zvcih2YXIgYz0wLGQ9YS5sZW5ndGg7YzxkO2MrKyl7Yj1hW2NdO2lmKGIuaWQmJmIuaWQuaW5kZXhPZigiYnV0dG9uIikhPS0xKWlmKGIuaWQhPSJidXR0b25Db250YWluZXIiKUwoYiksTShiKTtlbHNle3ZhciBlPWIuY2hpbGROb2RlcyxmPW51bGw7Zm9yKHZhciBnPTAsaD1lLmxlbmd0aDtnPGg7ZysrKWY9ZVtnXSxmLmlkJiZmLmlkLmluZGV4T2YoImJ1dHRvbiIpIT0tMSYmKEwoZiksTShmKSl9fX1mdW5jdGlvbiBPKGEpe3ZhciBiPVouVXRpbHMudGFyZ2V0KGEpO2lmKGIpe3ZhciBjPWIucGFyZW50Tm9kZTtjJiYoWi5tb2JpbGVEZXZpY2U/KFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihjLCJ0b3VjaHN0YXJ0IixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywidG91Y2hlbmQiLEopLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihjLCJ0b3VjaGNhbmNlbCIsSikpOihaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywibW91c2VvdmVyIixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywibW91c2Vkb3duIixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywibW91c2V1cCIsSiksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGMsIm1vdXNlb3V0IixKKSkpfX1mdW5jdGlvbiBQKGEpe3ZhciBiPVouVXRpbHMudGFyZ2V0KGEpO2lmKGIpe3ZhciBjPVouVXRpbHMudGFyZ2V0KGEpLnBhcmVudE5vZGU7aWYoYylpZighYy5faW1nVXBJRClLKGMpO2Vsc2V7dmFyIGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYy5faW1nVXBJRCksZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChjLl9pbWdPdmVySUQpLGY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYy5faW1nRG93bklEKTtpZihkJiZlJiZmKXt2YXIgZz1kLnN0eWxlLGg9ZS5zdHlsZSxpPWYuc3R5bGU7Zy52aXNpYmlsaXR5PSJoaWRkZW4iLGgudmlzaWJpbGl0eT0iaGlkZGVuIixpLnZpc2liaWxpdHk9ImhpZGRlbiI7c3dpdGNoKGEudHlwZSl7Y2FzZSJtb3VzZW92ZXIiOmgudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJtb3VzZWRvd24iOmkudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJtb3VzZW1vdmUiOmkudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJtb3VzZXVwIjpoLnZpc2liaWxpdHk9InZpc2libGUiO2JyZWFrO2Nhc2UibW91c2VvdXQiOmcudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJ0b3VjaHN0YXJ0IjppLnZpc2liaWxpdHk9InZpc2libGUiO2JyZWFrO2Nhc2UidG91Y2hlbmQiOmcudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJ0b3VjaGNhbmNlbCI6Zy52aXNpYmlsaXR5PSJ2aXNpYmxlIn19fX19ZnVuY3Rpb24gUShjKXt2YXIgZD1aLlV0aWxzLnRhcmdldChjKS5wYXJlbnROb2RlO2lmKGQpe3ZhciBlPWQuaWQ7c3dpdGNoKGMudHlwZSl7Y2FzZSJtb3VzZW92ZXIiOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkLCJtb3VzZWRvd24iLEopO2JyZWFrO2Nhc2UibW91c2Vkb3duIjpaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZCwibW91c2V1cCIsSik7aWYoYSlzd2l0Y2goZSl7Y2FzZSJidXR0b25NaW5pbWl6ZSI6Yi56MjE1KCEwKSxaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCExKTticmVhaztjYXNlImJ1dHRvbkV4cGFuZCI6Yi56MjE1KCExKSxaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCEwKTticmVhaztjYXNlImJ1dHRvblpvb21PdXQiOmEuem9vbSgib3V0Iik7YnJlYWs7Y2FzZSJidXR0b25TbGlkZXIiOkUoYyksUihjKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNlbW92ZSIsUiksb3x8KG89d2luZG93LnNldEludGVydmFsKEYsbSkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsSik7YnJlYWs7Y2FzZSJ0cmFja1NsaWRlciI6RChjKTticmVhaztjYXNlImJ1dHRvblpvb21JbiI6YS56b29tKCJpbiIpO2JyZWFrO2Nhc2UiYnV0dG9uUGFuTGVmdCI6YS5wYW4oImxlZnQiKTticmVhaztjYXNlImJ1dHRvblBhblVwIjphLnBhbigidXAiKTticmVhaztjYXNlImJ1dHRvblBhbkRvd24iOmEucGFuKCJkb3duIik7YnJlYWs7Y2FzZSJidXR0b25QYW5SaWdodCI6YS5wYW4oInJpZ2h0Iik7YnJlYWs7Y2FzZSJidXR0b25SZXNldCI6YS5yZXNldCgpfWJyZWFrO2Nhc2UibW91c2V1cCI6Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsIm1vdXNlZG93biIsSiksYSYmKGU9PSJidXR0b25TbGlkZXIifHxuPyhvJiYod2luZG93LmNsZWFySW50ZXJ2YWwobyksbz1udWxsKSxHKCksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZW1vdmUiLFIpLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsSiksTigpKTplPT0iYnV0dG9uWm9vbU91dCJ8fGU9PSJidXR0b25ab29tSW4iP2Euem9vbSgic3RvcCIpOmU9PSJidXR0b25QYW5MZWZ0Inx8ZT09ImJ1dHRvblBhblJpZ2h0Ij9hLnBhbigiaG9yaXpvbnRhbFN0b3AiKTplPT0iYnV0dG9uUGFuVXAifHxlPT0iYnV0dG9uUGFuRG93biI/YS5wYW4oInZlcnRpY2FsU3RvcCIpOmU9PSJidXR0b25GdWxsUGFnZSImJmEudG9nZ2xlRnVsbFBhZ2VWaWV3KCkpO2JyZWFrO2Nhc2UibW91c2VvdXQiOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkLCJtb3VzZW92ZXIiLEopLGEmJihlPT0iYnV0dG9uWm9vbU91dCJ8fGU9PSJidXR0b25ab29tSW4iP2Euem9vbSgic3RvcCIpOmU9PSJidXR0b25QYW5MZWZ0Inx8ZT09ImJ1dHRvblBhblJpZ2h0Ij9hLnBhbigiaG9yaXpvbnRhbFN0b3AiKTooZT09ImJ1dHRvblBhblVwInx8ZT09ImJ1dHRvblBhbkRvd24iKSYmYS5wYW4oInZlcnRpY2FsU3RvcCIpKTticmVhaztjYXNlInRvdWNoc3RhcnQiOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkLCJ0b3VjaGVuZCIsSiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsInRvdWNoY2FuY2VsIixKKTtpZihhKXN3aXRjaChlKXtjYXNlImJ1dHRvbk1pbmltaXplIjpiLnoyMTUoITApLFouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITEpO2JyZWFrO2Nhc2UiYnV0dG9uRXhwYW5kIjpiLnoyMTUoITEpLFouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITApO2JyZWFrO2Nhc2UiYnV0dG9uWm9vbU91dCI6YS56b29tKCJvdXQiKTticmVhaztjYXNlImJ1dHRvblNsaWRlciI6RShjKSxTKGMpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwidG91Y2htb3ZlIixTKSxvfHwobz13aW5kb3cuc2V0SW50ZXJ2YWwoRixtKSksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsInRvdWNoZW5kIixKKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZCwidG91Y2hjYW5jZWwiLEopO2JyZWFrO2Nhc2UidHJhY2tTbGlkZXIiOkQoYyk7YnJlYWs7Y2FzZSJidXR0b25ab29tSW4iOmEuem9vbSgiaW4iKTticmVhaztjYXNlImJ1dHRvblBhbkxlZnQiOmEucGFuKCJsZWZ0Iik7YnJlYWs7Y2FzZSJidXR0b25QYW5VcCI6YS5wYW4oInVwIik7YnJlYWs7Y2FzZSJidXR0b25QYW5Eb3duIjphLnBhbigiZG93biIpO2JyZWFrO2Nhc2UiYnV0dG9uUGFuUmlnaHQiOmEucGFuKCJyaWdodCIpO2JyZWFrO2Nhc2UiYnV0dG9uUmVzZXQiOmEucmVzZXQoKX1icmVhaztjYXNlInRvdWNoZW5kIjpaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZCwidG91Y2hzdGFydCIsSiksYSYmKGU9PSJidXR0b25ab29tT3V0Inx8ZT09ImJ1dHRvblpvb21JbiI/KGEuem9vbSgic3RvcCIpLFouZGVidWcmJmU9PSJidXR0b25ab29tT3V0IiYmYy5hbHRLZXkmJlouVXRpbHMuejI1MygpKTplPT0iYnV0dG9uU2xpZGVyIj8obyYmKHdpbmRvdy5jbGVhckludGVydmFsKG8pLG89bnVsbCksRygpLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwidG91Y2htb3ZlIixTKSk6ZT09ImJ1dHRvblBhbkxlZnQifHxlPT0iYnV0dG9uUGFuUmlnaHQiP2EucGFuKCJob3Jpem9udGFsU3RvcCIpOmU9PSJidXR0b25QYW5VcCJ8fGU9PSJidXR0b25QYW5Eb3duIj9hLnBhbigidmVydGljYWxTdG9wIik6ZT09ImJ1dHRvbkZ1bGxQYWdlIiYmYS50b2dnbGVGdWxsUGFnZVZpZXcoKSk7YnJlYWs7Y2FzZSJ0b3VjaGNhbmNlbCI6Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsInRvdWNoc3RhcnQiLEopLGEmJihlPT0iYnV0dG9uWm9vbU91dCJ8fGU9PSJidXR0b25ab29tSW4iPyhhLnpvb20oInN0b3AiKSxaLmRlYnVnJiZlPT0iYnV0dG9uWm9vbU91dCImJmMuYWx0S2V5JiZaLlV0aWxzLnoyNTMoKSk6ZT09ImJ1dHRvblNsaWRlciI/KG8mJih3aW5kb3cuY2xlYXJJbnRlcnZhbChvKSxvPW51bGwpLEcoKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsInRvdWNobW92ZSIsUykpOmU9PSJidXR0b25QYW5MZWZ0Inx8ZT09ImJ1dHRvblBhblJpZ2h0Ij9hLnBhbigiaG9yaXpvbnRhbFN0b3AiKTplPT0iYnV0dG9uUGFuVXAifHxlPT0iYnV0dG9uUGFuRG93biI/YS5wYW4oInZlcnRpY2FsU3RvcCIpOmU9PSJidXR0b25GdWxsUGFnZSImJmEudG9nZ2xlRnVsbFBhZ2VWaWV3KCkpfX19ZnVuY3Rpb24gUihhKXtwPW5ldyBaLlV0aWxzLlBvaW50KGEuY2xpZW50WCxhLmNsaWVudFkpfWZ1bmN0aW9uIFMoYSl7dmFyIGI9Wi5VdGlscy56MTc4KGEpO2lmKGIpe3ZhciBjPWIudGFyZ2V0O3A9bmV3IFouVXRpbHMuUG9pbnQoYi5wYWdlWCxiLnBhZ2VZKX19dmFyIGI9dGhpcyxjPSExLGQ9bmV3IFouejEwMTtaLnNraW5QYXRoPVouVXRpbHMuejI0MyhaLnNraW5QYXRoKTt2YXIgZT1aLnNraW5QYXRoKyIvIjtkLmxvYWRYTUwoWi5za2luUGF0aCsiLyIrWi5VdGlscy56MTg1KCJ6NTUiKSk7dmFyIGYsZyxoLGksaixrLGw9W10sbT1wYXJzZUludChaLlV0aWxzLnoxODUoIno1NyIpLDEwKSxuPSExLG89bnVsbCxwPW51bGwscT1udWxsLHIscyx0O3RoaXMuejIwNT1mdW5jdGlvbihhLGIpe1ouVG9vbGJhckRpc3BsYXk9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJUb29sYmFyRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIiwiMXB4IiwiMXB4IiwiMHB4IiwiMXB4Iiwibm9uZSIsIjBweCIsInRyYW5zcGFyZW50IG5vbmUiLCIwcHgiLCIwcHgiLCJkZWZhdWx0IiksZz1aLlRvb2xiYXJEaXNwbGF5LnN0eWxlO3ZhciBjPW5ldyBaLlV0aWxzLkdyYXBoaWMoImJhY2tncm91bmQiLGUsYlswXSwiMXB4IiwiMXB4IiwiMHB4IiwiMHB4Iik7Wi5Ub29sYmFyRGlzcGxheS5hcHBlbmRDaGlsZChjLmVsbXQpLHRvb2xiYXJTa2luU2l6ZXM9YTtpZihaLmxvZ29WaXNpYmxlKXt2YXIgZDtpZighWi5VdGlscy5pc1N0clZhbChaLmxvZ29DdXN0b21QYXRoKSlkPW5ldyBaLlV0aWxzLkdyYXBoaWMoInRvb2xiYXJMb2dvIixlLGJbMV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIpO2Vsc2V7dmFyIGg9Wi5VdGlscy56MTQwKFoubG9nb0N1c3RvbVBhdGgpO2Q9bmV3IFouVXRpbHMuR3JhcGhpYygidG9vbGJhckxvZ28iLGgsbnVsbCwiMXB4IiwiMXB4IiwiMXB4IiwiMXB4Iil9Wi5Ub29sYmFyRGlzcGxheS5hcHBlbmRDaGlsZChkLmVsbXQpO2lmKFoudG9vbGJhclZpc2libGU9PTB8fFoudG9vbGJhclZpc2libGU9PTEpe3ZhciBpPW5ldyBaLlV0aWxzLkdyYXBoaWMoImxvZ29EaXZpZGVyIixlLGJbMl0sIjFweCIsIjFweCIsIjFweCIsIjFweCIpO1ouVG9vbGJhckRpc3BsYXkuYXBwZW5kQ2hpbGQoaS5lbG10KX19dmFyIGo9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJidXR0b25Db250YWluZXIiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsInZpc2libGUiLCIxcHgiLCIxcHgiLCIwcHgiLCIwcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIsImRlZmF1bHQiKTtaLlRvb2xiYXJEaXNwbGF5LmFwcGVuZENoaWxkKGopLFoubW9iaWxlRGV2aWNlP1ouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihqLCJ0b3VjaHN0YXJ0IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KTooWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGosIm1vdXNlZG93biIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGosIm1vdXNlb3ZlciIsSSkpO3ZhciBrPW5ldyBaLlV0aWxzLkdyYXBoaWMoImJ1dHRvbkJhY2tncm91bmQiLGUsYlswXSwiMXB4IiwiMXB4IiwiMHB4IiwiMHB4Iik7ai5hcHBlbmRDaGlsZChrLmVsbXQpO2lmKFoudG9vbGJhclZpc2libGUhPTAmJloudG9vbGJhclZpc2libGUhPTF8fFoubW9iaWxlRGV2aWNlKXt2YXIgbD1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvbk1pbmltaXplIixudWxsLGUsYlszXSxiWzRdLGJbNV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejEwNyIpO1ouVG9vbGJhckRpc3BsYXkuYXBwZW5kQ2hpbGQobC5lbG10KTt2YXIgbT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvbkV4cGFuZCIsbnVsbCxlLGJbNl0sYls3XSxiWzhdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMDUiKTtaLlRvb2xiYXJEaXNwbGF5LmFwcGVuZENoaWxkKG0uZWxtdCl9dmFyIG49bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25ab29tT3V0IixudWxsLGUsYls5XSxiWzEwXSxiWzExXSwiMXB4IiwiMXB4IiwiMXB4IiwiMXB4IiwibW91c2VvdmVyIixKLCJ6MTIwIik7ai5hcHBlbmRDaGlsZChuLmVsbXQpO2lmKFouc2xpZGVyVmlzaWJsZSl7dmFyIG89bmV3IFouVXRpbHMuR3JhcGhpYygidHJhY2tTbGlkZXIiLGUsYlsxMl0sIjFweCIsIjFweCIsIjBweCIsIjBweCIpO2ouYXBwZW5kQ2hpbGQoby5lbG10KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoby5lbG10LCJtb3VzZWRvd24iLEopLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihvLmVsbXQsInRvdWNoc3RhcnQiLEopO3ZhciBwPW5ldyBaLlV0aWxzLkJ1dHRvbigiYnV0dG9uU2xpZGVyIixudWxsLGUsYlsxNF0sYlsxNV0sYlsxNl0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejExNCIpO2ouYXBwZW5kQ2hpbGQocC5lbG10KX12YXIgcT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvblpvb21JbiIsbnVsbCxlLGJbMTddLGJbMThdLGJbMTldLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMTkiKTtqLmFwcGVuZENoaWxkKHEuZWxtdCk7dmFyIHI9bmV3IFouVXRpbHMuR3JhcGhpYygicGFuRGl2aWRlciIsZSxiWzIwXSwiMXB4IiwiMXB4IiwiMXB4IiwiMXB4Iik7ai5hcHBlbmRDaGlsZChyLmVsbXQpO3ZhciBzPW5ldyBaLlV0aWxzLkJ1dHRvbigiYnV0dG9uUGFuTGVmdCIsbnVsbCxlLGJbMjFdLGJbMjJdLGJbMjNdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMDkiKTtqLmFwcGVuZENoaWxkKHMuZWxtdCk7dmFyIHQ9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25QYW5VcCIsbnVsbCxlLGJbMjRdLGJbMjVdLGJbMjZdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMTEiKTtqLmFwcGVuZENoaWxkKHQuZWxtdCk7dmFyIHU9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25QYW5Eb3duIixudWxsLGUsYlsyN10sYlsyOF0sYlsyOV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejEwOCIpO2ouYXBwZW5kQ2hpbGQodS5lbG10KTt2YXIgdj1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvblBhblJpZ2h0IixudWxsLGUsYlszMF0sYlszMV0sYlszMl0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejExMCIpO2ouYXBwZW5kQ2hpbGQodi5lbG10KTt2YXIgeT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvblJlc2V0IixudWxsLGUsYlszM10sYlszNF0sYlszNV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejExMiIpO2ouYXBwZW5kQ2hpbGQoeS5lbG10KTtpZihaLmZ1bGxQYWdlVmlzaWJsZSl7dmFyIEE9bmV3IFouVXRpbHMuR3JhcGhpYygiZnVsbFBhZ2VEaXZpZGVyIixlLGJbMzZdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiKTtqLmFwcGVuZENoaWxkKEEuZWxtdCk7dmFyIEI9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25GdWxsUGFnZSIsbnVsbCxlLGJbMzddLGJbMzhdLGJbMzldLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMTgiKTtqLmFwcGVuZENoaWxkKEIuZWxtdCl9aWYoWi5wcm9ncmVzc1Zpc2libGUpe3ZhciBEPVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2IiwicHJvZ3Jlc3NUZXh0Qm94IiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLEU9dG9vbGJhclNraW5TaXplc1sxNl0rInB4IjtqLmFwcGVuZENoaWxkKEQpO3ZhciBGPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFouVXRpbHMuejE4NSgiejUyIikpO0QuYXBwZW5kQ2hpbGQoWi5VdGlscy5jcmVhdGVDZW50ZXJlZEVsZW1lbnQoRikpLFouVXRpbHMuejI1MShGLCJibGFjayIsInZlcmRhbmEiLEUsIm5vbmUiLCJub3JtYWwiLCJub3JtYWwiLCJub3JtYWwiLCJub3JtYWwiLCIxZW0iLCJsZWZ0Iiwibm9uZSIpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihELCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5kaXNhYmxlVGV4dEludGVyYWN0aW9uKEYpfVouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChaLlRvb2xiYXJEaXNwbGF5KSxaLnRvb2xiYXJXPXRvb2xiYXJTa2luU2l6ZXNbMF0sWi50b29sYmFyQ3VycmVudFc9Wi50b29sYmFyVz09LTE/Wi52aWV3ZXJXOloudG9vbGJhclcsWi50b29sYmFySD1mPXRvb2xiYXJTa2luU2l6ZXNbMV07dmFyIEc9Wi50b29sYmFyUG9zaXRpb249PTE/Wi52aWV3ZXJILWY6MDt4KFoudG9vbGJhckN1cnJlbnRXLFoudG9vbGJhckgsMCxHKTtpZihaLlZpZXdwb3J0JiZaLlZpZXdwb3J0LnoxODAoKSl7dmFyIEg9Wi5WaWV3cG9ydC56MTg5QXNab29tKCk7QyhIKX16KFoudG9vbGJhclZpc2libGU9PTF8fFoudG9vbGJhclZpc2libGU9PTJ8fFoudG9vbGJhclZpc2libGU9PTQpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihaLlRvb2xiYXJEaXNwbGF5LCJtb3VzZW92ZXIiLFouVXRpbHMuc3RvcFByb3BhZ2F0aW9uKSx3KCEwKX0sdGhpcy56MTgwPWZ1bmN0aW9uKCl7cmV0dXJuIHYoKX0sdGhpcy5zZXRTaXplQW5kUG9zaXRpb249ZnVuY3Rpb24oYSxiLGMsZCl7eChhLGIsYyxkKX0sdGhpcy5zaG93PWZ1bmN0aW9uKGEpe3ooYSl9LHRoaXMuc2V0VmlzaWJpbGl0eT1mdW5jdGlvbihhKXtBKGEpfSx0aGlzLnoyMTU9ZnVuY3Rpb24oYSl7QihhKX0sdGhpcy5zaG93UHJvZ3Jlc3M9ZnVuY3Rpb24oYSxiKXtpZihaLnByb2dyZXNzVmlzaWJsZSl7cSYmd2luZG93LmNsZWFySW50ZXJ2YWwocSk7dmFyIGMsZD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJvZ3Jlc3NUZXh0Qm94IikuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZDtkJiYoYT09MHx8Yj09MD8oZC5ub2RlVmFsdWU9ImxsbGxsbGxsbGwiLHE9d2luZG93LnNldEludGVydmFsKHUscGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NTEiKSksMTApKTooYz1NYXRoLnJvdW5kKDEwMC1iL2EqMTAwKSxkLm5vZGVWYWx1ZT0ibCIubXVsdGlwbHkoTWF0aC5yb3VuZChjLzEwKSkpKX19LHRoaXMuejI2Nj1mdW5jdGlvbihhKXtDKGEpfX0sWi56MTIzPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIHgoYSl7Wi5OYXZpZ2F0b3JEaXNwbGF5PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2IiwiTmF2aWdhdG9yRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIixlKyJweCIsZisicHgiLGcrInB4IixoKyJweCIsInNvbGlkIiwiMXB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLG89Wi5OYXZpZ2F0b3JEaXNwbGF5LHA9by5zdHlsZTt2YXIgYj1aLlV0aWxzLnoxODUoInozNiIpLGM9Wi5VdGlscy56MTg1KCJ6MzZOT0FMUEhBIiksZD1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsIm5hdmlnYXRvckJhY2tncm91bmQiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsImhpZGRlbiIsZSsicHgiLGYrInB4IiwiMHB4IiwiMHB4Iiwibm9uZSIsIjBweCIsYiwiMHB4IiwiMHB4Iik7Wi5VdGlscy5zZXRPcGFjaXR5KGQsbCxjKSxaLk5hdmlnYXRvckRpc3BsYXkuYXBwZW5kQ2hpbGQoZCkscT1kLHI9cS5zdHlsZTt2YXIgaj1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsIm5hdmlnYXRvckltYWdlQ29udGFpbmVyIiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLGUrInB4IixmKyJweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4Iik7ai5hcHBlbmRDaGlsZChuKSxaLk5hdmlnYXRvckRpc3BsYXkuYXBwZW5kQ2hpbGQoaikscz1qLHQ9cy5zdHlsZSx1PW47dmFyIGs9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJuYXZpZ2F0b3JSZWN0YW5nbGUiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsImhpZGRlbiIsZSsxKyJweCIsZisxKyJweCIsZysicHgiLGgrInB4Iiwic29saWQiLCIxcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4Iik7ay5zdHlsZS5ib3JkZXJDb2xvcj1aLlV0aWxzLnoxODUoIno0MSIpLFouTmF2aWdhdG9yRGlzcGxheS5hcHBlbmRDaGlsZChrKSx2PWssdz12LnN0eWxlLFouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChaLk5hdmlnYXRvckRpc3BsYXkpLEMoZSxmLGcsaCxpKSxIKFoubmF2aWdhdG9yVmlzaWJsZT09MXx8Wi5uYXZpZ2F0b3JWaXNpYmxlPT0yKSxGKCksWi5tb2JpbGVEZXZpY2U/KFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihvLCJ0b3VjaHN0YXJ0IixQKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywidG91Y2htb3ZlIixRKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywidG91Y2hlbmQiLFIpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihvLCJ0b3VjaGNhbmNlbCIsUykpOihaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodSwibW91c2Vkb3duIixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2Vkb3duIixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2VvdmVyIixaLlV0aWxzLnN0b3BQcm9wYWdhdGlvbiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKG8sIm1vdXNlZG93biIsTSkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihuLCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaywiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpLEIoITApLEcoKX1mdW5jdGlvbiB5KGEpe0MoZSxmLGcsaCxpKSxIKFoubmF2aWdhdG9yVmlzaWJsZT09MXx8Wi5uYXZpZ2F0b3JWaXNpYmxlPT0yKSxGKCl9ZnVuY3Rpb24geigpe2lmKEEoKSl7ZCYmKHdpbmRvdy5jbGVhckludGVydmFsKGQpLGQ9bnVsbCk7aWYoIW98fCFwfHwhcXx8IXJ8fCFzfHwhdHx8IXV8fCF2fHwhdylvPVouTmF2aWdhdG9yRGlzcGxheSxwPW8uc3R5bGUscT1aLk5hdmlnYXRvckRpc3BsYXkuY2hpbGROb2Rlc1swXSxyPXEuc3R5bGUscz1aLk5hdmlnYXRvckRpc3BsYXkuY2hpbGROb2Rlc1sxXSx0PXMuc3R5bGUsdT1aLk5hdmlnYXRvckRpc3BsYXkuY2hpbGROb2Rlc1sxXS5maXJzdENoaWxkLHY9Wi5OYXZpZ2F0b3JEaXNwbGF5LmNoaWxkTm9kZXNbMl0sdz12LnN0eWxlfX1mdW5jdGlvbiBBKCl7cmV0dXJuIGN9ZnVuY3Rpb24gQihhKXtjPWF9ZnVuY3Rpb24gQyhhLGIsYyxkLGUpe2F8fChhPVoubmF2aWdhdG9yVyksYnx8KGI9Wi5uYXZpZ2F0b3JIKSxjfHwoYz0wKSxkfHwoZD0wKSxvfHwobz1aLk5hdmlnYXRvckRpc3BsYXkpLHB8fChwPW8uc3R5bGUpLHU9by5jaGlsZE5vZGVzWzFdLmZpcnN0Q2hpbGQ7aWYobyYmcCYmdSl7aWYoZSl7dmFyIGY9MSxnPTE7ZT09MD9nPVoudmlld2VyVy9aLnZpZXdlckg6Zz11LndpZHRoL3UuaGVpZ2h0LGY+MT8oYj1hLGIvPWcpOihhPWIsYSo9Zyl9cC53aWR0aD1hKyJweCIscC5oZWlnaHQ9YisicHgiLHAubGVmdD1jLTErInB4IixwLnRvcD1kLTErInB4IixEKGEsYil9fWZ1bmN0aW9uIEQoYSxiKXtyfHwocj1aLk5hdmlnYXRvckRpc3BsYXkuZmlyc3RDaGlsZC5zdHlsZSksdHx8KHQ9Wi5OYXZpZ2F0b3JEaXNwbGF5LmNoaWxkTm9kZXNbMV0uc3R5bGUpLHV8fCh1PVouTmF2aWdhdG9yRGlzcGxheS5jaGlsZE5vZGVzWzFdLmZpcnN0Q2hpbGQpLHImJnQmJnUmJihyLndpZHRoPWErInB4IixyLmhlaWdodD1iKyJweCIsRShhLGIsdS53aWR0aCx1LmhlaWdodCksdC53aWR0aD11LndpZHRoKyJweCIsdC5oZWlnaHQ9dS5oZWlnaHQrInB4Iix0LmxlZnQ9KGEtcGFyc2VGbG9hdCh0LndpZHRoKSkvMisicHgiLHQudG9wPShiLXBhcnNlRmxvYXQodC5oZWlnaHQpKS8yKyJweCIsRygpKX1mdW5jdGlvbiBFKGEsYixjLGQpe3V8fCh1PVouTmF2aWdhdG9yRGlzcGxheS5jaGlsZE5vZGVzWzFdLmZpcnN0Q2hpbGQpO2lmKHUpe3ZhciBlPWMvZCxmPWEvYyxnPWIvZCxoPTAsaT0wO2Y8PWc/KGM9YSxkPWEvZSxpPShiLWQqKGEvYykpLzIpOmc8ZiYmKGQ9YixjPWIqZSxoPShhLWMqKGIvZCkpLzIpLHUud2lkdGg9Yyx1LmhlaWdodD1kfX1mdW5jdGlvbiBGKCl7cHx8KHA9Wi5OYXZpZ2F0b3JEaXNwbGF5LnN0eWxlKSxwJiYocC56SW5kZXg9cC56SW5kZXgrMTAwKX1mdW5jdGlvbiBHKCl7aWYoWi5WaWV3cG9ydCYmWi5WaWV3cG9ydC56MTgwKCkpe0koKTt2YXIgYT1aLlZpZXdwb3J0LnoxNDEoKTtKKGEpfX1mdW5jdGlvbiBIKGEpe3B8fChwPVouTmF2aWdhdG9yRGlzcGxheS5zdHlsZSkscCYmKGE/cC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siOnAuZGlzcGxheT0ibm9uZSIpfWZ1bmN0aW9uIEkoKXtpZih1JiZ3KXt2YXIgYT11LndpZHRoL1ouaW1hZ2VXLGI9dS5oZWlnaHQvWi5pbWFnZUgsYz1aLlZpZXdwb3J0LnoxODlBc1pvb20oKSxkPVoudmlld2VyVyphL2MsZT1aLnZpZXdlckgqYi9jO3cud2lkdGg9ZCsicHgiLHcuaGVpZ2h0PWUrInB4In19ZnVuY3Rpb24gSihhKXtpZih1JiZ3JiZ0KXt2YXIgYj11LndpZHRoL1ouaW1hZ2VXLGM9dS5oZWlnaHQvWi5pbWFnZUgsZD1hLngqYixlPWEueSpjLGY9ZC1wYXJzZUZsb2F0KHcud2lkdGgpLzIsZz1lLXBhcnNlRmxvYXQody5oZWlnaHQpLzI7dy5sZWZ0PWYrcGFyc2VGbG9hdCh0LmxlZnQpKyJweCIsdy50b3A9ZytwYXJzZUZsb2F0KHQudG9wKSsicHgifX1mdW5jdGlvbiBLKCl7aWYodyYmdCYmdSl7dmFyIGE9cGFyc2VGbG9hdCh3LmxlZnQpLXBhcnNlRmxvYXQodC5sZWZ0KSxiPXBhcnNlRmxvYXQody50b3ApLXBhcnNlRmxvYXQodC50b3ApLGM9YSsocGFyc2VGbG9hdCh3LndpZHRoKS0xKS8yLGQ9YisocGFyc2VGbG9hdCh3LmhlaWdodCktMSkvMixlPVouaW1hZ2VXL3Uud2lkdGgsZj1aLmltYWdlSC91LmhlaWdodCxnPWMqZSxoPWQqZjtaLlZpZXdwb3J0LnoyNjcoZyxoKX19ZnVuY3Rpb24gTCgpe1ouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno4OCIpKX1mdW5jdGlvbiBNKGEpe2lmKG8mJnYmJncpe3ZhciBhPVouVXRpbHMuZXZlbnQoYSk7di5tb3VzZVhQcmlvcj1hLmNsaWVudFgsdi5tb3VzZVlQcmlvcj1hLmNsaWVudFksemFwdHZEcmFnUHRTdGFydD1uZXcgWi5VdGlscy5Qb2ludChhLmNsaWVudFgsYS5jbGllbnRZKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2Vtb3ZlIixOKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2V1cCIsTyksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZXVwIixPKX19ZnVuY3Rpb24gTihhKXtpZih2JiZ3KXt2YXIgYj1wYXJzZUZsb2F0KHcubGVmdCksYz1wYXJzZUZsb2F0KHcudG9wKTtyZXR1cm4gdy5sZWZ0PWIrKGEuY2xpZW50WC12Lm1vdXNlWFByaW9yKSsicHgiLHcudG9wPWMrKGEuY2xpZW50WS12Lm1vdXNlWVByaW9yKSsicHgiLHYubW91c2VYUHJpb3I9YS5jbGllbnRYLHYubW91c2VZUHJpb3I9YS5jbGllbnRZLEsoKSwhMX19ZnVuY3Rpb24gTyhhKXtpZihvJiZ2JiZ3KXtkb2N1bWVudC5tb3VzZW1vdmU9bnVsbCxkb2N1bWVudC5tb3VzZXVwPW51bGwsWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKG8sIm1vdXNlbW92ZSIsTiksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKG8sIm1vdXNldXAiLE8pLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsTyk7dmFyIGE9Wi5VdGlscy5ldmVudChhKSxiPW5ldyBaLlV0aWxzLlBvaW50KGEuY2xpZW50WCxhLmNsaWVudFkpLGM9TWF0aC5zcXJ0KE1hdGgucG93KHphcHR2RHJhZ1B0U3RhcnQueC1iLngsMikrTWF0aC5wb3coemFwdHZEcmFnUHRTdGFydC55LWIueSwyKSk7aWYoYzw0KXt2YXIgZD1aLlV0aWxzLnoxNzQoWi5OYXZpZ2F0b3JEaXNwbGF5KTt3LmxlZnQ9YS5jbGllbnRYLWQueC1wYXJzZUZsb2F0KHcud2lkdGgpLzIrInB4Iix3LnRvcD1hLmNsaWVudFktZC55LXBhcnNlRmxvYXQody5oZWlnaHQpLzIrInB4In1LKCksWi5WaWV3cG9ydC56Mjc0KCl9fWZ1bmN0aW9uIFAoYSl7YS5wcmV2ZW50RGVmYXVsdCgpO2lmKG8mJnYmJncpe3ZhciBiPVouVXRpbHMuejE3OChhKTtpZihiKXt2YXIgYz1iLnRhcmdldCxkPW5ldyBaLlV0aWxzLlBvaW50KGIucGFnZVgsYi5wYWdlWSk7emFwdHZEcmFnUHRTdGFydD1uZXcgWi5VdGlscy5Qb2ludChkLngsZC55KSx2Lm1vdXNlWFByaW9yPWQueCx2Lm1vdXNlWVByaW9yPWQueSx6YXB0dkRyYWdQdFN0YXJ0PW5ldyBaLlV0aWxzLlBvaW50KGQueCxkLnkpfX19ZnVuY3Rpb24gUShhKXthLnByZXZlbnREZWZhdWx0KCk7aWYoIVoubW91c2VQYW4pcmV0dXJuO2lmKHYmJncpe3ZhciBiPVouVXRpbHMuejE3OChhKTtpZihiKXt2YXIgYz1iLnRhcmdldCxkPW5ldyBaLlV0aWxzLlBvaW50KGIucGFnZVgsYi5wYWdlWSksZT1wYXJzZUZsb2F0KHcubGVmdCksZj1wYXJzZUZsb2F0KHcudG9wKTtyZXR1cm4gdy5sZWZ0PWUrKGQueC12Lm1vdXNlWFByaW9yKSsicHgiLHcudG9wPWYrKGQueS12Lm1vdXNlWVByaW9yKSsicHgiLHYubW91c2VYUHJpb3I9ZC54LHYubW91c2VZUHJpb3I9ZC55LEsoKSwhMX19cmV0dXJuITF9ZnVuY3Rpb24gUihhKXtpZihvJiZ2JiZ3KXt2YXIgYj1aLlV0aWxzLnoxNzgoYSk7aWYoYil7dmFyIGM9Yi50YXJnZXQsZD1uZXcgWi5VdGlscy5Qb2ludChiLnBhZ2VYLGIucGFnZVkpLGU9bmV3IFouVXRpbHMuUG9pbnQoZC54LGQueSksZj1NYXRoLnNxcnQoTWF0aC5wb3coemFwdHZEcmFnUHRTdGFydC54LWUueCwyKStNYXRoLnBvdyh6YXB0dkRyYWdQdFN0YXJ0LnktZS55LDIpKSxnPVoubW9iaWxlRGV2aWNlPzY6MztpZihmPGcpe3ZhciBoPVouVXRpbHMuejE3NChaLk5hdmlnYXRvckRpc3BsYXkpO3cubGVmdD1kLngtaC54LXBhcnNlRmxvYXQody53aWR0aCkvMisicHgiLHcudG9wPWQueS1oLnktcGFyc2VGbG9hdCh3LmhlaWdodCkvMisicHgifX1LKCksWi5WaWV3cG9ydC56Mjc0KCl9fWZ1bmN0aW9uIFMoYSl7aWYobyYmdiYmdyl7dmFyIGI9Wi5VdGlscy56MTc4KGEpO2lmKGIpe3ZhciBjPWIudGFyZ2V0LGQ9bmV3IFouVXRpbHMuUG9pbnQoYi5wYWdlWCxiLnBhZ2VZKSxlPW5ldyBaLlV0aWxzLlBvaW50KGQueCxkLnkpLGY9TWF0aC5zcXJ0KE1hdGgucG93KHphcHR2RHJhZ1B0U3RhcnQueC1lLngsMikrTWF0aC5wb3coemFwdHZEcmFnUHRTdGFydC55LWUueSwyKSksZz1aLm1vYmlsZURldmljZT82OjM7aWYoZjxnKXt2YXIgaD1aLlV0aWxzLnoxNzQoWi5OYXZpZ2F0b3JEaXNwbGF5KTt3LmxlZnQ9ZC54LWgueC1wYXJzZUZsb2F0KHcud2lkdGgpLzIrInB4Iix3LnRvcD1kLnktaC55LXBhcnNlRmxvYXQody5oZWlnaHQpLzIrInB4In19SygpLFouVmlld3BvcnQuejI3NCgpfX12YXIgYj10aGlzLGM9ITEsZCxlPVoubmF2aWdhdG9yVyxmPVoubmF2aWdhdG9ySCxnPVoubmF2aWdhdG9yTC0xLGg9Wi5uYXZpZ2F0b3JULTEsaT1aLm5hdmlnYXRvckZpdCxqLGs9bnVsbCxsPXBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6MzUiKSksbT1aLlV0aWxzLnoxNDAoWi5pbWFnZVBhdGgrIi9UaWxlR3JvdXAwLyIrIjAtMC0wLmpwZyIpLG49bmV3IEltYWdlO24ub25sb2FkPXgsbi5vbmVycm9yPUwsbi5zcmM9bTt2YXIgbyxwLHEscixzLHQsdSx2LHc7dGhpcy5zZXRJbWFnZVBhdGg9ZnVuY3Rpb24oYSl7bT1aLlV0aWxzLnoxNDAoWi5pbWFnZVBhdGgrIi9UaWxlR3JvdXAwLyIrIjAtMC0wLmpwZyIpLHMucmVtb3ZlQ2hpbGQobiksbj1udWxsLG49bmV3IEltYWdlLHMuYXBwZW5kQ2hpbGQobiksbi5vbmxvYWQ9eSxuLm9uZXJyb3I9TCxuLnNyYz1tfSx0aGlzLnoxODA9ZnVuY3Rpb24oKXtyZXR1cm4gQSgpfSx0aGlzLnNldFNpemVBbmRQb3NpdGlvbj1mdW5jdGlvbihhLGIsYyxkLGUpe2V8fChlPWkpLEMoYSxiLGMsZCxlKX0sdGhpcy5zZXRWaXNpYmlsaXR5PWZ1bmN0aW9uKGEpe0goYSl9LHRoaXMuejI2OD1mdW5jdGlvbigpe0coKX0sdGhpcy56MjYzUmVjdGFuZ2xlRGltZW5zaW9ucz1mdW5jdGlvbigpe0koKX0sdGhpcy56MjYzUmVjdGFuZ2xlUG9zaXRpb249ZnVuY3Rpb24oYSl7SihhKX0sdGhpcy56Mjc3PWZ1bmN0aW9uKCl7QSgpP3ooKTpkPXdpbmRvdy5zZXRJbnRlcnZhbCh6LDMwMCl9fSxaLnoxMDE9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhhLGIpe3ZhciBjPW51bGwsZD10eXBlb2YgYj09ImZ1bmN0aW9uIjtpZihkKXZhciBlPWIsYj1mdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KFouVXRpbHMuY3JlYXRlQ2FsbGJhY2sobnVsbCxlLGMpLDEpfTtpZih3aW5kb3cuQWN0aXZlWE9iamVjdCl7dmFyIGY9WyJNc3htbDIuWE1MSFRUUCIsIk1zeG1sMy5YTUxIVFRQIiwiTWljcm9zb2Z0LlhNTEhUVFAiXTtmb3IodmFyIGc9MDtnPGYubGVuZ3RoO2crKyl0cnl7Yz1uZXcgQWN0aXZlWE9iamVjdChmW2ddKTticmVha31jYXRjaChoKXtjb250aW51ZX19ZWxzZSB3aW5kb3cuWE1MSHR0cFJlcXVlc3QmJihjPW5ldyBYTUxIdHRwUmVxdWVzdCk7Y3x8Wi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejk5IikpLGQmJihjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2MucmVhZHlTdGF0ZT09NCYmKGMub25yZWFkeXN0YXRlY2hhbmdlPW5ldyBGdW5jdGlvbixiKCkpfSk7dHJ5e2Mub3BlbigiR0VUIixhLGQpLGMuc2VuZChudWxsKX1jYXRjaChoKXthLmluZGV4T2YoIkltYWdlUHJvcGVydGllcy54bWwiKSE9LTE/Wi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejg3LUlNQUdFWE1MIikpOmEuaW5kZXhPZigic2tpbkZpbGVzLnhtbCIpIT0tMT9aLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6ODctVE9PTEJBUlhNTCIpKTpaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6ODciKSksYy5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxjPW51bGx9cmV0dXJuIGQ/bnVsbDpjfWZ1bmN0aW9uIGQoYSl7aWYoYSl7aWYoIWEpWi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejg5IikpO2Vsc2UgaWYoYS5zdGF0dXMhPT0yMDAmJmEuc3RhdHVzIT09MCl7dmFyIGI9YS5zdGF0dXMsYz1iPT00MDQ/Ik5vdCBGb3VuZCI6YS5zdGF0dXNUZXh0O1ouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno5MCIpK2IrIiAtICIrYyl9dmFyIGQ9bnVsbDthLnJlc3BvbnNlWE1MJiZhLnJlc3BvbnNlWE1MLmRvY3VtZW50RWxlbWVudD9kPWEucmVzcG9uc2VYTUw6YS5yZXNwb25zZVRleHQmJihkPVouVXRpbHMuejE1OChhLnJlc3BvbnNlVGV4dCkpLGUoZCl9ZWxzZSBaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6ODQiKSl9ZnVuY3Rpb24gZShhKXtpZihhJiZhLmRvY3VtZW50RWxlbWVudCl7dmFyIGI9YS5kb2N1bWVudEVsZW1lbnQudGFnTmFtZTtiPT0iQ09QWVJJR0hUIj9mKCJjb3B5cmlnaHQiLGEpOmI9PSJJTUFHRV9QUk9QRVJUSUVTIj9mKCJpbWFnZSIsYSk6Yj09IlNLSU5EQVRBIj9mKCJza2luIixhKTpaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6MTAwIikpfWVsc2UgWi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejEwMCIpKX1mdW5jdGlvbiBmKGEsYil7aWYoYT09ImNvcHlyaWdodCIpe3ZhciBjPWIuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiU1RBVEVNRU5UVEVYVCIpLGQ9Yi5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJERUNMSU5FRFRFWFQiKTtaLlV0aWxzLmlzU3RyVmFsKGMpP1ouVXRpbHMuejI1MighMCxjLGQpOlouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno4NiIpKX1lbHNlIGlmKGE9PSJpbWFnZSIpe3ZhciBlPXBhcnNlSW50KGIuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiV0lEVEgiKSwxMCksZj1wYXJzZUludChiLmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIkhFSUdIVCIpLDEwKTshaXNOYU4oZSkmJmU+MCYmIWlzTmFOKGYpJiZmPjA/Wi5WaWV3cG9ydCYmKFouVmlld3BvcnQuejE4MCgpP1ouVmlld3BvcnQucmV6MjA2KGUsZik6Wi5WaWV3cG9ydC56MjA2KGUsZikpOlouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno4NiIpKX1lbHNlIGlmKGE9PSJza2luIil7Wi5za2luTW9kZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJTRVRVUCIpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJTS0lOTU9ERSIpLm5vZGVWYWx1ZTt2YXIgZyxoO1ouc2tpbk1vZGU9PTF8fFouc2tpbk1vZGU9PTAmJiFaLm1vYmlsZURldmljZT8oZz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJTRVRVUCIpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJGT0xERVJTVEFOREFSRCIpLm5vZGVWYWx1ZSxoPSJTSVpFU1NUQU5EQVJEIik6KGc9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiU0VUVVAiKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiRk9MREVSTEFSR0UiKS5ub2RlVmFsdWUsaD0iU0laRVNMQVJHRSIpO3ZhciBpPVtdO2kucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlRPT0xCQVJXIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiVE9PTEJBUkgiKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJMT0dPVyIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIkxPR09IIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiRElWSURFUlciKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJESVZJREVSSCIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIkJVVFRPTlciKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJCVVRUT05IIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiQlVUVE9OU1BBTiIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlNMSURFUkJVVFRPTlciKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJTTElERVJCVVRUT05IIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0xJREVSVFJBQ0tXIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0xJREVSVFJBQ0tIIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0xJREVSU1BBTiIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlBST0dSRVNTVyIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlBST0dSRVNTSCIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlBST0dSRVNTRk9OVFNJWkUiKS5ub2RlVmFsdWUpKTt2YXIgaj1bXSxrPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkZJTEVTIilbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlNLSU4wIikubm9kZVZhbHVlLGw9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRklMRVMiKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0tJTjM5Iikubm9kZVZhbHVlO2lmKFouVXRpbHMuaXNTdHJWYWwoaykmJlouVXRpbHMuaXNTdHJWYWwobCkpe3ZhciBtPSExO2Zvcih2YXIgbj0wO248NDA7bisrKXt2YXIgbz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJGSUxFUyIpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJTS0lOIituKS5ub2RlVmFsdWU7Wi5VdGlscy5pc1N0clZhbChvKT9qW25dPWcrIi8iK286KGpbbl09Im51bGwiLG09ITApfW0mJlouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIkVSUk9SX1NLSU5TWE1MTUlTU0lOR05BTUVTIikpLFouVG9vbGJhciYmWi5Ub29sYmFyLnoyMDUoaSxqKX1lbHNlIFouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno5MSIpKX19ZnVuY3Rpb24gZyhhLGMsZCl7Yi0tO2lmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXRyeXthKGQpfWNhdGNoKGUpe1ouVXRpbHMuejI1NShlLm5hbWUrWi5VdGlscy56MTg1KCJ6ODMiKStjKyIgIitlLm1lc3NhZ2UpfX1mdW5jdGlvbiBoKGEsYil7ZnVuY3Rpb24gZShlKXtjLm9ubG9hZD1udWxsLGMub25hYm9ydD1udWxsLGMub25lcnJvcj1udWxsLGQmJndpbmRvdy5jbGVhclRpbWVvdXQoZCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtiKGEsZT9jOm51bGwpfSwxKX12YXIgYz1udWxsLGQ9bnVsbDt0aGlzLnN0YXJ0PWZ1bmN0aW9uKCl7Yz1uZXcgSW1hZ2U7dmFyIGI9ZnVuY3Rpb24oKXtlKCEwKX0sZj1mdW5jdGlvbigpe2UoITEpfSxnPWZ1bmN0aW9uKCl7ZSghMSl9O2Mub25sb2FkPWIsYy5vbmFib3J0PWYsYy5vbmVycm9yPWYsZD13aW5kb3cuc2V0VGltZW91dChnLHBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6NjAiKSkpLGMuc3JjPWF9fXZhciBiPTA7dGhpcy5sb2FkWE1MPWZ1bmN0aW9uKGEpe2MoYSxkKX0sdGhpcy56MjEySW1hZ2U9ZnVuY3Rpb24oYSxjKXtpZihiPj1wYXJzZUludChaLlV0aWxzLnoxODUoInoyNSIpLDEwKSlyZXR1cm4hMTt2YXIgZD1aLlV0aWxzLmNyZWF0ZUNhbGxiYWNrKG51bGwsZyxjKSxlPW5ldyBoKGEsZCk7cmV0dXJuIGIrKyxlLnN0YXJ0KCksITB9fSxaLlV0aWxzPXt6MTYzOmZ1bmN0aW9uKCl7Wi5wYWdlQ29udGFpbmVySUQ9bnVsbCxaLmltYWdlUGF0aD1udWxsLFouc2tpblBhdGg9bnVsbCxaLnNraW5Nb2RlPW51bGwsWi5wYXJhbWV0ZXJzPW51bGwsWi5icm93c2Vycz1udWxsLFouYnJvd3Nlcj1udWxsLFouYnJvd3NlclZlcnNpb249bnVsbCxaLmNhbnZhc1N1cHBvcnRlZD1udWxsLFouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZD1udWxsLFouY3NzVHJhbnNmb3JtUHJvcGVydHk9bnVsbCxaLmNzc1RyYW5zZm9ybU5vVW5pdHM9bnVsbCxaLmFscGhhU3VwcG9ydGVkPW51bGwsWi5yZW5kZXJRdWFsaXR5PW51bGwsWi5tb2JpbGVEZXZpY2U9bnVsbCxaLmluaXRpYWxYPW51bGwsWi5pbml0aWFsWT1udWxsLFouaW5pdGlhbFo9bnVsbCxaLm1pblo9bnVsbCxaLm1heFo9bnVsbCxaLnpvb21TcGVlZD1udWxsLFoucGFuU3BlZWQ9bnVsbCxaLmZhZGVJblNwZWVkPW51bGwsWi50b29sYmFyVmlzaWJsZT1udWxsLFoudG9vbGJhclc9bnVsbCxaLnRvb2xiYXJIPW51bGwsWi50b29sYmFyUG9zaXRpb249bnVsbCxaLm5hdmlnYXRvclZpc2libGU9bnVsbCxaLm5hdmlnYXRvclc9bnVsbCxaLm5hdmlnYXRvckg9bnVsbCxaLm5hdmlnYXRvckw9bnVsbCxaLm5hdmlnYXRvclQ9bnVsbCxaLm5hdmlnYXRvckZpdD1udWxsLFouY2xpY2tab29tPW51bGwsWi5jbGlja1Bhbj1udWxsLFoubW91c2VQYW49bnVsbCxaLmtleXM9bnVsbCxaLmNvbnN0cmFpblBhbj1udWxsLFoudG9vbHRpcHNWaXNpYmxlPW51bGwsWi5jb3B5cmlnaHRQYXRoPW51bGwsWi53YXRlcm1hcmtQYXRoPW51bGwsWi5zbGlkZXJWaXNpYmxlPW51bGwsWi5mdWxsUGFnZVZpc2libGU9bnVsbCxaLnByb2dyZXNzVmlzaWJsZT1udWxsLFoubG9nb1Zpc2libGU9bnVsbCxaLmxvZ29DdXN0b21QYXRoPW51bGwsWi5jYW52YXM9bnVsbCxaLmRlYnVnPW51bGwsWi5WaWV3ZXI9bnVsbCxaLlZpZXdlckRpc3BsYXk9bnVsbCxaLlZpZXdwb3J0PW51bGwsWi5Ub29sYmFyPW51bGwsWi5Ub29sYmFyRGlzcGxheT1udWxsLFouVG9vbHRpcERpc3BsYXk9bnVsbCxaLk5hdmlnYXRvcj1udWxsLFouTmF2aWdhdG9yRGlzcGxheT1udWxsLFouQ29weXJpZ2h0RGlzcGxheT1udWxsLFouaW1hZ2VXPW51bGwsWi5pbWFnZUg9bnVsbCxaLmltYWdlWD0wLFouaW1hZ2VZPTAsWi5pbWFnZVo9MCxaLmZpdFo9bnVsbCxaLnpvb21pbmc9InN0b3AiLFoucGFubmluZ1g9InN0b3AiLFoucGFubmluZ1k9InN0b3AiLFouZnVsbFBhZ2U9ITEsWi51c2VDYW52YXM9ITAsWi5UcmFjZURpc3BsYXk9bnVsbCxaLnRyYWNlcz1udWxsfSxlbmZvcmNlQ29weXJpZ2h0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy56MjM4KCJpbWFnZUNvcHlyaWdodCIpO2E/Wi5WaWV3ZXIuejE0OSgpOnRoaXMuejIxMCgpfSx6MjEwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFouejEwMTthLmxvYWRYTUwoWi5jb3B5cmlnaHRQYXRoKX0sejI1MjpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy56MTg1KCJ6MTYiKSxlPXRoaXMuejE4NSgiejE0Iik7aWYoYSl7Wi5Db3B5cmlnaHREaXNwbGF5PXRoaXMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2IiwiQ29weXJpZ2h0RGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIixaLnZpZXdlclctMisicHgiLFoudmlld2VySC0yKyJweCIsIjBweCIsIjBweCIsInNvbGlkIiwiMXB4IixkLCIwcHgiLCIwcHgiKSxaLlZpZXdlckRpc3BsYXkuYXBwZW5kQ2hpbGQoWi5Db3B5cmlnaHREaXNwbGF5KTt2YXIgZj00NDAsZz0yMDAsaD1wYXJzZUZsb2F0KFouQ29weXJpZ2h0RGlzcGxheS5zdHlsZS53aWR0aCkvMi1mLzIsaT1wYXJzZUZsb2F0KFouQ29weXJpZ2h0RGlzcGxheS5zdHlsZS5oZWlnaHQpLzItZy8yLGo9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJ0ZXh0Qm94IiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLGYrInB4IixnKyJweCIsaCsicHgiLGkrInB4Iiwibm9uZSIsIjBweCIsInRyYW5zcGFyZW50IG5vbmUiLCIwcHgiLCIwcHgiKTtqLmlkPSJ0ZXh0Qm94IixaLkNvcHlyaWdodERpc3BsYXkuYXBwZW5kQ2hpbGQoaik7dmFyIGs9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYik7ai5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZUNlbnRlcmVkRWxlbWVudChrKSksdGhpcy56MjUxKGssImJsYWNrIiwidmVyZGFuYSIsIjE2cHgiLCJub25lIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwiMWVtIiwianVzdGlmeSIsIm5vbmUiKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjKTtqLmFwcGVuZENoaWxkKGwpO3ZhciBtPTgwLG49MjAsbz0zMCxwPTIwLHE9aCtmLzItKG0qMitvKS8yLHI9aStnK3Ascz10aGlzLnoxODUoInoxMyIpLHQ9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25BZ3JlZSIscyxudWxsLG51bGwsbnVsbCxudWxsLG0rInB4IixuKyJweCIscSsicHgiLHIrInB4IiwibW91c2Vkb3duIix0aGlzLnoxNjAsInoxMDMiLCJzb2xpZCIsIjFweCIsZSwiMHB4IiwiMHB4Iik7Wi5Db3B5cmlnaHREaXNwbGF5LmFwcGVuZENoaWxkKHQuZWxtdCkscSs9bStvLHM9dGhpcy56MTg1KCJ6MTUiKTt2YXIgdT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvbkV4aXQiLHMsbnVsbCxudWxsLG51bGwsbnVsbCxtKyJweCIsbisicHgiLHErInB4IixyKyJweCIsIm1vdXNlZG93biIsdGhpcy56MTYxLCJ6MTA0Iiwic29saWQiLCIxcHgiLGUsIjBweCIsIjBweCIpO1ouQ29weXJpZ2h0RGlzcGxheS5hcHBlbmRDaGlsZCh1LmVsbXQpfWVsc2V7dmFyIGo9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRleHRCb3giKSx2PWouY2hpbGROb2Rlc1sxXS50ZXh0Q29udGVudDtqLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQudGV4dENvbnRlbnQ9djt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uQWdyZWUiKTt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodCwibW91c2Vkb3duIix0aGlzLnoxNjApLFouQ29weXJpZ2h0RGlzcGxheS5yZW1vdmVDaGlsZCh0KTt2YXIgdT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uRXhpdCIpO3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih1LCJtb3VzZWRvd24iLHRoaXMuejE2MSksWi5Db3B5cmlnaHREaXNwbGF5LnJlbW92ZUNoaWxkKHUpfX0sQnV0dG9uOmZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMpe3ZhciB0PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgic3BhbiIsYSwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLGcsaCxpLGosbixvLHAscSxyLHMpO2lmKCFaLlV0aWxzLmlzU3RyVmFsKGIpKXt2YXIgdT1aLlV0aWxzLmNyZWF0ZUdyYXBoaWNFbGVtZW50KGMrIi8iK2QpLHY9Wi5VdGlscy5jcmVhdGVHcmFwaGljRWxlbWVudChjKyIvIitlKSx3PVouVXRpbHMuY3JlYXRlR3JhcGhpY0VsZW1lbnQoYysiLyIrZik7dS5pZD10LmlkKyItaW1nVXAiLHYuaWQ9dC5pZCsiLWltZ092ZXIiLHcuaWQ9dC5pZCsiLWltZ0Rvd24iLHQuX2ltZ1VwSUQ9dS5pZCx0Ll9pbWdPdmVySUQ9di5pZCx0Ll9pbWdEb3duSUQ9dy5pZDt2YXIgeD11LnN0eWxlLHk9di5zdHlsZSx6PXcuc3R5bGU7eC5wb3NpdGlvbj15LnBvc2l0aW9uPXoucG9zaXRpb249ImFic29sdXRlIix4LndpZHRoPXkud2lkdGg9eS53aWR0aD1nLHguaGVpZ2h0PXkuaGVpZ2h0PXkuaGVpZ2h0PWgseC50b3A9eS50b3A9ei50b3A9IjBweCIseC5sZWZ0PXkubGVmdD16LmxlZnQ9IjBweCIsWi5icm93c2VyPT1aLmJyb3dzZXJzLkZJUkVGT1gmJlouYnJvd3NlclZlcnNpb248MyYmKHgudG9wPXkudG9wPXoudG9wPSIiKSx5LnZpc2liaWxpdHk9ImhpZGRlbiIsei52aXNpYmlsaXR5PSJoaWRkZW4iLHQuYXBwZW5kQ2hpbGQodSksdC5hcHBlbmRDaGlsZCh2KSx0LmFwcGVuZENoaWxkKHcpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih1LCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHYsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodywiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpfWVsc2V7dmFyIEE9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYik7dC5hcHBlbmRDaGlsZChaLlV0aWxzLmNyZWF0ZUNlbnRlcmVkRWxlbWVudChBKSksWi5VdGlscy56MjUxKEEsImJsYWNrIiwidmVyZGFuYSIsIjEzcHgiLCJub25lIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwiMWVtIiwiY2VudGVyIiwibm9uZSIpLFouVXRpbHMuZGlzYWJsZVRleHRJbnRlcmFjdGlvbihBKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodCwiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpfVoudG9vbHRpcHNWaXNpYmxlJiZaLlV0aWxzLmlzU3RyVmFsKG0pJiYodC50aXRsZT1aLlV0aWxzLnoxODUobSkpLFoubW9iaWxlRGV2aWNlP1ouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih0LCJ0b3VjaHN0YXJ0IixsKTooWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHQsIm1vdXNlZG93biIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHQsIm1vdXNlb3ZlciIsWi5VdGlscy5zdG9wUHJvcGFnYXRpb24pLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih0LCJtb3VzZW91dCIsWi5VdGlscy5zdG9wUHJvcGFnYXRpb24pLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih0LGssbCkpLHRoaXMuZWxtdD10fSx6MTM4OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLnN0eWxlO2Qud2lkdGg9YisicHgiLGQuaGVpZ2h0PWMrInB4Ijt2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLl9pbWdVcElEKSxmPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuX2ltZ092ZXJJRCksZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLl9pbWdEb3duSUQpO2lmKGUmJmYmJmcpe3ZhciBoPWUuc3R5bGUsaT1mLnN0eWxlLGo9Zy5zdHlsZTtoLndpZHRoPWIrInB4IixoLmhlaWdodD1jKyJweCIsaS53aWR0aD1iKyJweCIsaS5oZWlnaHQ9YysicHgiLGoud2lkdGg9YisicHgiLGouaGVpZ2h0PWMrInB4In19LEdyYXBoaWM6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIGg9Yz9iKyIvIitjOmIsaT1aLlV0aWxzLmNyZWF0ZUdyYXBoaWNFbGVtZW50KGgpLGo9aS5zdHlsZTtqLndpZHRoPWQsai5oZWlnaHQ9ZTt2YXIgYz1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoInNwYW4iLGEsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIixkLGUsZixnLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpO2MuYXBwZW5kQ2hpbGQoaSksdGhpcy5lbG10PWMsWi5tb2JpbGVEZXZpY2U/Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksInRvdWNoc3RhcnQiLFouVXRpbHMucHJldmVudERlZmF1bHQpOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihpLCJtb3VzZWRvd24iLFouVXRpbHMucHJldmVudERlZmF1bHQpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihpLCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCl9LHoyMDM6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuc3R5bGU7ZC53aWR0aD1iKyJweCIsZC5oZWlnaHQ9YysicHgiO3ZhciBlPWEuZmlyc3RDaGlsZCxmPWUuc3R5bGU7Zi53aWR0aD1iKyJweCIsZi5oZWlnaHQ9YysicHgifSx6MTYwOmZ1bmN0aW9uKGEpe1ouVmlld2VyRGlzcGxheS5yZW1vdmVDaGlsZChaLkNvcHlyaWdodERpc3BsYXkpLGRvY3VtZW50LmNvb2tpZT0iaW1hZ2VDb3B5cmlnaHQ9Y29uZmlybWVkIixaLlZpZXdlci56MTQ5KCl9LHoxNjE6ZnVuY3Rpb24oYSl7Wi5VdGlscy56MjUyKCExKTtyZXR1cm59LHoxMjg6ZnVuY3Rpb24oKXtTdHJpbmcucHJvdG90eXBlLm11bHRpcGx5fHwoU3RyaW5nLnByb3RvdHlwZS5tdWx0aXBseT1mdW5jdGlvbigpe3ZhciBhPUFycmF5LnByb3RvdHlwZS5qb2luLGI9e307cmV0dXJuIGZ1bmN0aW9uKGMpe3JldHVybiBiLmxlbmd0aD1jKzEsYS5jYWxsKGIsdGhpcyl9fSgpKSxBcnJheS5wcm90b3R5cGUuaW5kZXhPZnx8KEFycmF5LnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKGEsYil7Yj9iPDAmJihiPU1hdGgubWF4KDAsdGhpcy5sZW5ndGgrYikpOmI9MDtmb3IodmFyIGM9YixkPXRoaXMubGVuZ3RoO2M8ZDtjKyspaWYodGhpc1tjXT09PWEpcmV0dXJuIGM7cmV0dXJuLTF9KSxBcnJheS5wcm90b3R5cGUucHVzaHx8KEFycmF5LnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGEpe3RoaXNbdGhpcy5sZW5ndGhdPWF9KSxBcnJheS5wcm90b3R5cGUuc3BsaWNlfHwoQXJyYXkucHJvdG90eXBlLnN1YmFycj1mdW5jdGlvbihhLGIpe2lmKGE+PXRoaXMubGVuZ3RofHxiJiZiPD0wKXJldHVybltdO2E8MCYmKE1hdGguYWJzKGEpPnRoaXMubGVuZ3RoP2E9MDphPXRoaXMubGVuZ3RoK2EpO2lmKCFifHxiK2E+dGhpcy5sZW5ndGgpYj10aGlzLmxlbmd0aC1hO3ZhciBjPVtdO2Zvcih2YXIgZD1hO2Q8YStiO2QrKyljLnB1c2godGhpc1tkXSk7cmV0dXJuIGN9LEFycmF5LnByb3RvdHlwZS5zdWJhcnJheT1mdW5jdGlvbihhLGIpe2E8MCYmKGE9MCk7aWYoIWJ8fGI+dGhpcy5sZW5ndGgpYj10aGlzLmxlbmd0aDtpZihhPT1iKXJldHVybltdO3ZhciBjPVtdO2Zvcih2YXIgZD1hO2Q8YjtkKyspYy5wdXNoKHRoaXNbZF0pO3JldHVybiBjfSxBcnJheS5wcm90b3R5cGUuc3BsaWNlPWZ1bmN0aW9uKGEsYil7YjwwJiYoYj0wKTt2YXIgYz1bXTtpZihhcmd1bWVudHMubGVuZ3RoPjIpZm9yKHZhciBkPTIsZT1hcmd1bWVudHMubGVuZ3RoO2Q8ZTtkKyspYy5wdXNoKGFyZ3VtZW50c1tkXSk7dmFyIGY9dGhpcy5zdWJhcnJheSgwLGEpLGc9dGhpcy5zdWJhcnIoYSxiKSxoPXRoaXMuc3ViYXJyYXkoYStiKSxpPWYuY29uY2F0KGMsaCk7dGhpcy5sZW5ndGg9MDtmb3IodmFyIGQ9MCxlPWkubGVuZ3RoO2Q8ZTtkKyspdGhpcy5wdXNoKGlbZF0pO3JldHVybiBnfSl9LHoxMjc6ZnVuY3Rpb24oKXtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyPyh0aGlzLmRpc2FibGVUZXh0SW50ZXJhY3Rpb249ZnVuY3Rpb24oYSl7YSYmKHRuUz1hLnBhcmVudE5vZGUuc3R5bGUsdG5TJiYoYS5wYXJlbnROb2RlLnVuc2VsZWN0YWJsZT0ib24iLHRuUy51c2VyU2VsZWN0PSJub25lIix0blMuTW96VXNlclNlbGVjdD0ibm9uZSIsdG5TLndlYmtpdFVzZXJTZWxlY3Q9Im5vbmUiLHRuUy53ZWJraXRUb3VjaENhbGxvdXQ9Im5vbmUiLHRuUy53ZWJraXRUYXBIaWdobGlnaHRDb2xvcj0idHJhbnNwYXJlbnQiKSl9LHRoaXMucmVuZGVyUXVhbGl0eT1mdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPWI9PSJoaWdoIj8ib3B0aW1pemVRdWFsaXR5Ijoib3B0aW1pemVTcGVlZCI7YS5zdHlsZS5zZXRQcm9wZXJ0eSgiaW1hZ2UtcmVuZGVyaW5nIixjLG51bGwpfX0sdGhpcy5zZXRPcGFjaXR5PWZ1bmN0aW9uKGEsYixjKXtaLmFscGhhU3VwcG9ydGVkP2Euc3R5bGUub3BhY2l0eT1iOmMmJihhLnN0eWxlLmJhY2tncm91bmRDb2xvcj1jKX0pOmRvY3VtZW50LmF0dGFjaEV2ZW50JiYodGhpcy5kaXNhYmxlVGV4dEludGVyYWN0aW9uPWZ1bmN0aW9uKGEpe2EmJihhLnBhcmVudE5vZGUudW5zZWxlY3RhYmxlPSJvbiIsYS5wYXJlbnROb2RlLm9uc2VsZWN0c3RhcnQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0pfSx0aGlzLnJlbmRlclF1YWxpdHk9ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgYz1iPT0iaGlnaCI/ImJpY3ViaWMiOiJuZWFyZXN0LW5laWdoYm9yIjthLnN0eWxlLm1zSW50ZXJwb2xhdGlvbk1vZGU9Y319LHRoaXMuc2V0T3BhY2l0eT1mdW5jdGlvbihhLGIsYyl7Wi5hbHBoYVN1cHBvcnRlZD8oYS5zdHlsZS5maWx0ZXI9InByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYShPcGFjaXR5PScgKyB2YWx1ZSArICcpIixhLnN0eWxlLmZpbHRlcj0iYWxwaGEob3BhY2l0eT0iK2IrIikiKTpjJiYoYS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9Yyl9KX0sejEyNjpmdW5jdGlvbigpe2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXI/KHRoaXMuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIsYyl7Yj09Im1vdXNld2hlZWwiJiZlbG10LmFkZEV2ZW50TGlzdGVuZXIoIkRPTU1vdXNlU2Nyb2xsIixjLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoYixjLCExKX0sdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjKXtiPT0ibW91c2V3aGVlbCImJmVsbXQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NTW91c2VTY3JvbGwiLGMsITEpLGEmJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsITEpfSx0aGlzLmV2ZW50PWZ1bmN0aW9uKGEpe3JldHVybiBhfSx0aGlzLnRhcmdldD1mdW5jdGlvbihhKXtyZXR1cm4gYS50YXJnZXR9LHRoaXMucmVsYXRlZFRhcmdldD1mdW5jdGlvbihhKXtyZXR1cm4gYS5yZWxhdGVkVGFyZ2V0fSx0aGlzLmlzUmlnaHRNb3VzZUJ1dHRvbj1mdW5jdGlvbihhKXt2YXIgYj0hMTtpZihhLndoaWNoPT0yfHxhLndoaWNoPT0zKWI9ITA7cmV0dXJuIGJ9LHRoaXMucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpfSx0aGlzLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk6ZG9jdW1lbnQuYXR0YWNoRXZlbnQmJih0aGlzLmFkZEV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe2lmKHRoaXMuX2ZpbmRMaXN0ZW5lcihhLGIsYykhPS0xKXJldHVybjt2YXIgZD1mdW5jdGlvbigpe3ZhciBiPXdpbmRvdy5ldmVudDtGdW5jdGlvbi5wcm90b3R5cGUuY2FsbD9jLmNhbGwoYSxiKTooYS5fY3VycmVudExpc3RlbmVyPWMsYS5fY3VycmVudExpc3RlbmVyKGIpLGEuX2N1cnJlbnRMaXN0ZW5lcj1udWxsKX07YS5hdHRhY2hFdmVudCgib24iK2IsZCk7dmFyIGU9e3RhcmdldDphLGV2ZW50TmFtZTpiLGhhbmRsZXI6YyxoYW5kbGVyMjpkfSxmPWEuZG9jdW1lbnR8fGEsZz1mLnBhcmVudFdpbmRvdyxoPSJsIit0aGlzLl9saXN0ZW5lckNvdW50ZXIrKztnLl9hbGxMaXN0ZW5lcnN8fChnLl9hbGxMaXN0ZW5lcnM9e30pLGcuX2FsbExpc3RlbmVyc1toXT1lLGEuX2xpc3RlbmVyc3x8KGEuX2xpc3RlbmVycz1bXSksYS5fbGlzdGVuZXJzW2EuX2xpc3RlbmVycy5sZW5ndGhdPWgsZy5fdW5sb2FkTGlzdGVuZXJBZGRlZHx8KGcuX3VubG9hZExpc3RlbmVyQWRkZWQ9ITAsZy5hdHRhY2hFdmVudCgib251bmxvYWQiLHRoaXMuX3JlbW92ZUFsbExpc3RlbmVycykpfSx0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe2lmKGEpe3ZhciBkPXRoaXMuX2ZpbmRMaXN0ZW5lcihhLGIsYyk7aWYoZD09LTEpcmV0dXJuO3ZhciBlPWEuZG9jdW1lbnR8fGEsZj1lLnBhcmVudFdpbmRvdyxnPWEuX2xpc3RlbmVyc1tkXSxoPWYuX2FsbExpc3RlbmVyc1tnXTthLmRldGFjaEV2ZW50KCJvbiIrYixoLmhhbmRsZXIyKSxhLl9saXN0ZW5lcnMuc3BsaWNlKGQsMSksZGVsZXRlIGYuX2FsbExpc3RlbmVyc1tnXX19LHRoaXMuZXZlbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHdpbmRvdy5ldmVudH0sdGhpcy50YXJnZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuc3JjRWxlbWVudH0sdGhpcy5yZWxhdGVkVGFyZ2V0PWZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7cmV0dXJuIGEudHlwZT09Im1vdXNlb3ZlciI/Yj1hLmZyb21FbGVtZW50OmEudHlwZT09Im1vdXNlb3V0IiYmKGI9YS50b0VsZW1lbnQpLGJ9LHRoaXMuaXNSaWdodE1vdXNlQnV0dG9uPWZ1bmN0aW9uKGEpe3ZhciBiPSExO3JldHVybiBhLmJ1dHRvbj09MiYmKGI9ITApLGJ9LHRoaXMucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oYSl7YSYmKGEucmV0dXJuVmFsdWU9ITEpfSx0aGlzLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbihhKXthLmNhbmNlbEJ1YmJsZT0hMH0sdGhpcy5fZmluZExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLl9saXN0ZW5lcnM7aWYoIWQpcmV0dXJuLTE7dmFyIGU9YS5kb2N1bWVudHx8YSxmPWUucGFyZW50V2luZG93O2Zvcih2YXIgZz1kLmxlbmd0aC0xO2c+PTA7Zy0tKXt2YXIgaD1kW2ddLGk9Zi5fYWxsTGlzdGVuZXJzW2hdO2lmKGkuZXZlbnROYW1lPT1iJiZpLmhhbmRsZXI9PWMpcmV0dXJuIGd9cmV0dXJuLTF9LHRoaXMuX3JlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbigpe3ZhciBhPXRoaXM7Zm9yKGlkIGluIGEuX2FsbExpc3RlbmVycyl7dmFyIGI9YS5fYWxsTGlzdGVuZXJzW2lkXTtiLnRhcmdldC5kZXRhY2hFdmVudCgib24iK2IuZXZlbnROYW1lLGIuaGFuZGxlcjIpLGRlbGV0ZSBhLl9hbGxMaXN0ZW5lcnNbaWRdfX0sdGhpcy5fbGlzdGVuZXJDb3VudGVyPTApfSx6MTY0OmZ1bmN0aW9uKCl7Wi5icm93c2Vycz17VU5LTk9XTjowLElFOjEsRklSRUZPWDoyLFNBRkFSSTozLENIUk9NRTo0LE9QRVJBOjV9O3ZhciBhPVouYnJvd3NlcnMuVU5LTk9XTixiPTAsYz1uYXZpZ2F0b3IuYXBwTmFtZSxkPW5hdmlnYXRvci5hcHBWZXJzaW9uLGU9ITEsZj0hMSxnPW5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTtpZihjIT0iTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyInx8IXdpbmRvdy5hdHRhY2hFdmVudHx8IXdpbmRvdy5BY3RpdmVYT2JqZWN0KWlmKGMhPSJOZXRzY2FwZSJ8fCF3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciljPT0iT3BlcmEiJiYhIXdpbmRvdy5vcGVyYSYmISF3aW5kb3cuYXR0YWNoRXZlbnQmJihhPVouYnJvd3NlcnMuT1BFUkEsYj1wYXJzZUZsb2F0KGQpKTtlbHNle3ZhciBpPWcuaW5kZXhPZigiZmlyZWZveCIpLGo9Zy5pbmRleE9mKCJzYWZhcmkiKSxrPWcuaW5kZXhPZigiY2hyb21lIik7aWYoaT49MClhPVouYnJvd3NlcnMuRklSRUZPWCxiPXBhcnNlRmxvYXQoZy5zdWJzdHJpbmcoaSs4KSk7ZWxzZSBpZihqPj0wKXt2YXIgbD1nLnN1YnN0cmluZygwLGopLmxhc3RJbmRleE9mKCIvIik7YT1rPj0wP1ouYnJvd3NlcnMuQ0hST01FOlouYnJvd3NlcnMuU0FGQVJJLGI9cGFyc2VGbG9hdChnLnN1YnN0cmluZyhsKzEsaikpfXZhciBtPW5ldyBJbWFnZTttLnN0eWxlLmdldFByb3BlcnR5VmFsdWUmJihmPW0uc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgiaW1hZ2UtcmVuZGVyaW5nIikpfWVsc2V7dmFyIGg9Zy5pbmRleE9mKCJtc2llIik7YT1aLmJyb3dzZXJzLklFLGI9cGFyc2VGbG9hdChnLnN1YnN0cmluZyhoKzUsZy5pbmRleE9mKCI7IixoKSkpLGU9dHlwZW9mIGRvY3VtZW50LmRvY3VtZW50TW9kZSE9InVuZGVmaW5lZCJ9dmFyIG49ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHx7fSxvPW4uc3R5bGV8fHt9LHA9ITEscT1bInRyYW5zZm9ybSIsIldlYmtpdFRyYW5zZm9ybSIsIk1velRyYW5zZm9ybSJdLHIsczt3aGlsZShyPXEuc2hpZnQoKSlpZih0eXBlb2Ygb1tyXSE9InVuZGVmaW5lZCIpe3A9ITAscz0vd2Via2l0L2kudGVzdChyKTticmVha312YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0JiZkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpLHU9IShhPT1aLmJyb3dzZXJzLlNBRkFSSSYmYjw0fHxhPT1aLmJyb3dzZXJzLkNIUk9NRSYmYjwyKSx2PXQmJnUsdz0hKGE9PVouYnJvd3NlcnMuSUV8fGE9PVouYnJvd3NlcnMuQ0hST01FJiZiPDIpLHg9ZXx8Zj8iaGlnaCI6bnVsbCx5PWcuaW5kZXhPZigiYW5kcm9pZCIpPi0xfHxnLmluZGV4T2YoImlwaG9uZSIpPi0xfHxnLmluZGV4T2YoImlwYWQiKT4tMXx8Zy5pbmRleE9mKCJpcG9kIik+LTE7Wi5icm93c2VyPWEsWi5icm93c2VyVmVyc2lvbj1iLFouY2FudmFzU3VwcG9ydGVkPXYsWi51c2VDYW52YXM9Wi5jYW52YXNTdXBwb3J0ZWQsWi5jc3NUcmFuc2Zvcm1zU3VwcG9ydGVkPXAsWi5jc3NUcmFuc2Zvcm1Qcm9wZXJ0eT1yLFouY3NzVHJhbnNmb3JtTm9Vbml0cz1zLFouYWxwaGFTdXBwb3J0ZWQ9dyxaLnJlbmRlclF1YWxpdHk9eCxaLm1vYmlsZURldmljZT15fSxpc1N0clZhbDpmdW5jdGlvbihhKXtyZXR1cm4gYSE9bnVsbCYmYSE9IiJ9LHoxNzQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPTAsZD10aGlzLnoxNzYoYSkucG9zaXRpb249PSJmaXhlZCIsZT10aGlzLnoxODMoYSxkKTt3aGlsZShlKXtiKz1hLm9mZnNldExlZnQsYys9YS5vZmZzZXRUb3A7aWYoZCl7dmFyIGY9dGhpcy56MTg0KCk7Yis9Zi54LGMrPWYueX1hPWUsZD10aGlzLnoxNzYoYSkucG9zaXRpb249PSJmaXhlZCIsZT10aGlzLnoxODMoYSxkKX1yZXR1cm4gbmV3IHRoaXMuUG9pbnQoYixjKX0sejE4MzpmdW5jdGlvbihhLGIpe3JldHVybiBiJiZhIT1kb2N1bWVudC5ib2R5P2RvY3VtZW50LmJvZHk6YS5vZmZzZXRQYXJlbnR9LHoxNzU6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyB0aGlzLlBvaW50KGEuY2xpZW50V2lkdGgsYS5jbGllbnRIZWlnaHQpfSx6MTc2OmZ1bmN0aW9uKGEpe2lmKGEuY3VycmVudFN0eWxlKXJldHVybiBhLmN1cnJlbnRTdHlsZTtpZih3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSlyZXR1cm4gd2luZG93LmdldENvbXB1dGVkU3R5bGUoYSwiIik7dGhpcy56MjU1KHRoaXMuejE4NSgiejkzIikpfSx6MTc3OmZ1bmN0aW9uKGEpe3JldHVybiB6MTc0KFouVXRpbHMudGFyZ2V0KGEpKX0sejE3ODpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9YS50b3VjaGVzLGQ9YS5jaGFuZ2VkVG91Y2hlcztyZXR1cm4gYyE9PXVuZGVmaW5lZD9iPWNbMF06ZCE9PXVuZGVmaW5lZCYmKGI9ZFswXSksYn0sejE4MTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9MDtyZXR1cm4gYS50eXBlPT0iRE9NTW91c2VTY3JvbGwiJiZicm93c2VyPT1Ccm93c2VyLkZJUkVGT1gmJmJyb3dzZXJWZXJzaW9uPDM/KGI9YS5zY3JlZW5YLGM9YS5zY3JlZW5ZKTp0eXBlb2YgYS5wYWdlWD09Im51bWJlciI/KGI9YS5wYWdlWCxjPWEucGFnZVkpOnR5cGVvZiBhLmNsaWVudFg9PSJudW1iZXIiPyhiPWEuY2xpZW50WCtkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQrZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQsYz1hLmNsaWVudFkrZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ArZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCk6dGhpcy56MjU1KHRoaXMuejE4NSgiejk0IikpLG5ldyB0aGlzLlBvaW50KGIsYyl9LHoxODI6ZnVuY3Rpb24oYSl7dmFyIGI9MDtyZXR1cm4gdHlwZW9mIGEud2hlZWxEZWx0YT09Im51bWJlciI/Yj1hLndoZWVsRGVsdGE6dHlwZW9mIGEuZGV0YWlsPT0ibnVtYmVyIj9iPWEuZGV0YWlsKi0xOnRoaXMuejI1NSh0aGlzLnoxODUoIno5NSIpKSxiP2IvTWF0aC5hYnMoYik6MH0sejE4NDpmdW5jdGlvbigpe3ZhciBhPTAsYj0wLGM9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHx7fSxkPWRvY3VtZW50LmJvZHl8fHt9O2lmKHR5cGVvZiB3aW5kb3cucGFnZVhPZmZzZXQ9PSJudW1iZXIiKWE9d2luZG93LnBhZ2VYT2Zmc2V0LGI9d2luZG93LnBhZ2VZT2Zmc2V0O2Vsc2UgaWYoZC5zY3JvbGxMZWZ0fHxkLnNjcm9sbFRvcClhPWQuc2Nyb2xsTGVmdCxiPWQuc2Nyb2xsVG9wO2Vsc2UgaWYoYy5zY3JvbGxMZWZ0fHxjLnNjcm9sbFRvcClhPWMuc2Nyb2xsTGVmdCxiPWMuc2Nyb2xsVG9wO3JldHVybiBuZXcgdGhpcy5Qb2ludChhLGIpfSx6MjAxaW5kb3dTaXplOmZ1bmN0aW9uKCl7dmFyIGE9MCxiPTAsYz1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fHt9LGQ9ZG9jdW1lbnQuYm9keXx8e307cmV0dXJuIHR5cGVvZiB3aW5kb3cuaW5uZXJXaWR0aD09Im51bWJlciI/KGE9d2luZG93LmlubmVyV2lkdGgsYj13aW5kb3cuaW5uZXJIZWlnaHQpOmMuY2xpZW50V2lkdGh8fGMuY2xpZW50SGVpZ2h0PyhhPWMuY2xpZW50V2lkdGgsYj1jLmNsaWVudEhlaWdodCk6ZC5jbGllbnRXaWR0aHx8ZC5jbGllbnRIZWlnaHQ/KGE9ZC5jbGllbnRXaWR0aCxiPWQuY2xpZW50SGVpZ2h0KTp0aGlzLnoyNTUodGhpcy56MTg1KCJ6OTYiKSksbmV3IHRoaXMuUG9pbnQoYSxiKX0sejIyNTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPWE7d2hpbGUoYj09ITEpaWYoYyljLmlkP2MuaWQ9PSJWaWV3ZXJEaXNwbGF5Ij9iPSEwOmM9Yy5wYXJlbnROb2RlOmM9Yy5wYXJlbnROb2RlO2Vsc2UgYnJlYWs7cmV0dXJuIGJ9LHoyMzg6ZnVuY3Rpb24oYSl7dmFyIGI9YSsiPSIsYz1kb2N1bWVudC5jb29raWUuc3BsaXQoIjsiKTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9Y1tkXTt3aGlsZShlLmNoYXJBdCgwKT09IiAiKWU9ZS5zdWJzdHJpbmcoMSxlLmxlbmd0aCk7aWYoZS5pbmRleE9mKGIpPT0wKXJldHVybiBlLnN1YnN0cmluZyhiLmxlbmd0aCxlLmxlbmd0aCl9cmV0dXJuIG51bGx9LHoyNDM6ZnVuY3Rpb24oYSl7dmFyIGI9YS5zbGljZSgtMSxhLmxlbmd0aCk9PSIvIj9hLnNsaWNlKDAsYS5sZW5ndGgtMSk6YTtyZXR1cm4gYj1hLnNsaWNlKDAsMSk9PSIvIj9hLnNsaWNlKDEsYS5sZW5ndGgpOmEsYn0sejE0MDpmdW5jdGlvbihhKXtpZihaLmJyb3dzZXI9PVouYnJvd3NlcnMuSUUpe3ZhciBiPShuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCksYz1NYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCksZD1jK2I7YSs9Ij9zdWZmaXhUb0Jsb2NrUGF0aENhY2hpbmc9IitkfXJldHVybiBhfSx6MTcwOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybihhLz1kLzIpPDE/Yy8yKmEqYSphKmEqYStiOmMvMiooKGEtPTIpKmEqYSphKmErMikrYn0sejIzMzpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gYSYmKGI9YS5zcGxpdCgiJiIpKSxifSx6MjQ5OmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuejE4NSgiejUwIiksYz10aGlzLnoxODUoIno0OSIpLGQ9dGhpcy56MTg1KCJ6NDgiKTtaLnNraW5QYXRoPXRoaXMuejE4NSgiejU2IiksWi5za2luTW9kZT10aGlzLnoxODUoIno1NCIpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MjYiKSkpfHwoWi5pbml0aWFsWD1wYXJzZUZsb2F0KHRoaXMuejE4NSgiejI2IikpKSxpc05hTihwYXJzZUZsb2F0KHRoaXMuejE4NSgiejI3IikpKXx8KFouaW5pdGlhbFk9cGFyc2VGbG9hdCh0aGlzLnoxODUoInoyNyIpKSksaXNOYU4ocGFyc2VGbG9hdCh0aGlzLnoxODUoInoyOCIpKSl8fChaLmluaXRpYWxaPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MjgiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzMiKSkpfHwoWi5taW5aPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzMiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzIiKSkpfHwoWi5tYXhaPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzIiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6ODAiKSkpfHwoWi56b29tU3BlZWQ9cGFyc2VGbG9hdCh0aGlzLnoxODUoIno4MCIpKSksaXNOYU4ocGFyc2VGbG9hdCh0aGlzLnoxODUoIno0NiIpKSl8fChaLnBhblNwZWVkPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6NDYiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MTgiKSkpfHwoWi5mYWRlSW5TcGVlZD1wYXJzZUZsb2F0KHRoaXMuejE4NSgiejE4IikpKSxaLnRvb2xiYXJWaXNpYmxlPXBhcnNlSW50KHRoaXMuejE4NSgiejY0IiksMTApLFoudG9vbGJhclBvc2l0aW9uPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6NjMiKSksWi50b29sdGlwc1Zpc2libGU9dGhpcy56MTg1KCJ6NjUiKSE9IjAiLFoubmF2aWdhdG9yVmlzaWJsZT1wYXJzZUludCh0aGlzLnoxODUoIno0MyIpLDEwKSxaLm5hdmlnYXRvclc9cGFyc2VJbnQodGhpcy56MTg1KCJ6NDQiKSwxMCksWi5uYXZpZ2F0b3JIPXBhcnNlSW50KHRoaXMuejE4NSgiejM5IiksMTApLFoubmF2aWdhdG9yTD1wYXJzZUludCh0aGlzLnoxODUoIno0MCIpLDEwKSxaLm5hdmlnYXRvclQ9cGFyc2VJbnQodGhpcy56MTg1KCJ6NDIiKSwxMCksWi5uYXZpZ2F0b3JGaXQ9dGhpcy56MTg1KCJ6MzgiKSxaLmNsaWNrWm9vbT10aGlzLnoxODUoInoxMCIpIT0iMCIsWi5jbGlja1Bhbj10aGlzLnoxODUoIno5IikhPSIwIixaLm1vdXNlUGFuPXRoaXMuejE4NSgiejM0IikhPSIwIixaLmtleXM9dGhpcy56MTg1KCJ6MjkiKSE9IjAiLFouY29uc3RyYWluUGFuPXRoaXMuejE4NSgiejEyIikhPSIwIixaLnNsaWRlclZpc2libGU9dGhpcy56MTg1KCJ6NTgiKSE9IjAiLFouZnVsbFBhZ2VWaXNpYmxlPXRoaXMuejE4NSgiejIzIikhPSIwIixaLnByb2dyZXNzVmlzaWJsZT10aGlzLnoxODUoIno1MyIpIT0iMCIsWi5sb2dvVmlzaWJsZT10aGlzLnoxODUoInozMSIpIT0iMCIsWi5sb2dvQ3VzdG9tUGF0aD10aGlzLnoxODUoInozMCIpLFouY2FudmFzPXRoaXMuejE4NSgiejgiKSE9IjAiLFouZGVidWc9dGhpcy56MTg1KCJ6MTciKSE9IjAiO2lmKHRoaXMuaXNTdHJWYWwoYSkpZm9yKHZhciBlPTAsZj1hLmxlbmd0aDtlPGY7ZSsrKXt2YXIgZz1hW2VdLGg9Zy5pbmRleE9mKCI9Iik7aWYoaD4wKXt2YXIgaT1nLnN1YnN0cmluZygwLGgpLGo9Zy5zdWJzdHJpbmcoaCsxKTtpZih0aGlzLmlzU3RyVmFsKGopKXN3aXRjaChpKXtjYXNlInpJbml0aWFsWCI6aXNOYU4ocGFyc2VGbG9hdChqKSl8fChaLmluaXRpYWxYPXBhcnNlRmxvYXQoaikpO2JyZWFrO2Nhc2UiekluaXRpYWxZIjppc05hTihwYXJzZUZsb2F0KGopKXx8KFouaW5pdGlhbFk9cGFyc2VGbG9hdChqKSk7YnJlYWs7Y2FzZSJ6SW5pdGlhbFpvb20iOmlzTmFOKHBhcnNlRmxvYXQoaikpfHwoWi5pbml0aWFsWj1wYXJzZUZsb2F0KGopLFouaW5pdGlhbFomJihaLmluaXRpYWxaLz0xMDApKTticmVhaztjYXNlInpNaW5ab29tIjohaXNOYU4ocGFyc2VGbG9hdChqKSkmJnBhcnNlRmxvYXQoaik+LjAxJiYoWi5taW5aPXBhcnNlRmxvYXQoaiksWi5taW5aJiYoWi5taW5aLz0xMDApKTticmVhaztjYXNlInpNYXhab29tIjppc05hTihwYXJzZUZsb2F0KGopKXx8KFoubWF4Wj1wYXJzZUZsb2F0KGopLFoubWF4WiYmKFoubWF4Wi89MTAwKSk7YnJlYWs7Y2FzZSJ6TmF2aWdhdG9yVmlzaWJsZSI6Wi5uYXZpZ2F0b3JWaXNpYmxlPXBhcnNlSW50KGosMTApO2JyZWFrO2Nhc2UielRvb2xiYXJWaXNpYmxlIjpaLnRvb2xiYXJWaXNpYmxlPXBhcnNlSW50KGosMTApO2JyZWFrO2Nhc2UiekxvZ29WaXNpYmxlIjpqPT0iMCImJihaLmxvZ29WaXNpYmxlPSExKTticmVhaztjYXNlInpTbGlkZXJWaXNpYmxlIjpqPT0iMCImJihaLnNsaWRlclZpc2libGU9ITEpO2JyZWFrO2Nhc2UiekZ1bGxQYWdlVmlzaWJsZSI6aj09IjAiJiYoWi5mdWxsUGFnZVZpc2libGU9ITEpO2JyZWFrO2Nhc2UielByb2dyZXNzVmlzaWJsZSI6aj09IjAiJiYoWi5wcm9ncmVzc1Zpc2libGU9ITEpO2JyZWFrO2Nhc2UielRvb2x0aXBzVmlzaWJsZSI6aj09IjAiJiYoWi50b29sdGlwc1Zpc2libGU9ITEpO2JyZWFrO2Nhc2UielNraW5QYXRoIjpaLnNraW5QYXRoPWo7YnJlYWs7ZGVmYXVsdDppZihiPT1jKWFsZXJ0KGQrIiAiK2kpO2Vsc2Ugc3dpdGNoKGkpe2Nhc2Uielpvb21TcGVlZCI6Wi56b29tU3BlZWQ9cGFyc2VJbnQoaiwxMCk7YnJlYWs7Y2FzZSJ6UGFuU3BlZWQiOloucGFuU3BlZWQ9cGFyc2VJbnQoaiwxMCk7YnJlYWs7Y2FzZSJ6RmFkZUluU3BlZWQiOlouZmFkZUluU3BlZWQ9cGFyc2VJbnQoaiwxMCk7YnJlYWs7Y2FzZSJ6VG9vbGJhclBvc2l0aW9uIjpaLnRvb2xiYXJQb3NpdGlvbj1wYXJzZUludChqLDEwKTticmVhaztjYXNlInpOYXZpZ2F0b3JXaWR0aCI6aXNOYU4ocGFyc2VGbG9hdChqKSl8fChaLm5hdmlnYXRvclc9cGFyc2VGbG9hdChqKSk7YnJlYWs7Y2FzZSJ6TmF2aWdhdG9ySGVpZ2h0Ijppc05hTihwYXJzZUZsb2F0KGopKXx8KFoubmF2aWdhdG9ySD1wYXJzZUZsb2F0KGopKTticmVhaztjYXNlInpOYXZpZ2F0b3JMZWZ0Ijppc05hTihwYXJzZUZsb2F0KGopKXx8KFoubmF2aWdhdG9yTD1wYXJzZUZsb2F0KGopKTticmVhaztjYXNlInpOYXZpZ2F0b3JUb3AiOmlzTmFOKHBhcnNlRmxvYXQoaikpfHwoWi5uYXZpZ2F0b3JUPXBhcnNlRmxvYXQoaikpO2JyZWFrO2Nhc2Uiek5hdmlnYXRvckZpdCI6aXNOYU4ocGFyc2VGbG9hdChqKSl8fChaLm5hdmlnYXRvckZpdD1wYXJzZUludChqLDEwKSk7YnJlYWs7Y2FzZSJ6Q2xpY2tab29tIjpqPT0iMCImJihaLmNsaWNrWm9vbT0hMSk7YnJlYWs7Y2FzZSJ6Q2xpY2tQYW4iOmo9PSIwIiYmKFouY2xpY2tQYW49ITEpO2JyZWFrO2Nhc2Uiek1vdXNlUGFuIjpqPT0iMCImJihaLm1vdXNlUGFuPSExKTticmVhaztjYXNlInpLZXlzIjpqPT0iMCImJihaLmtleXM9ITEpO2JyZWFrO2Nhc2UiekNvbnN0cmFpblBhbiI6aj09IjAiJiYoWi5jb25zdHJhaW5QYW49ITEpO2JyZWFrO2Nhc2UiekNvcHlyaWdodFBhdGgiOlouY29weXJpZ2h0UGF0aD1qO2JyZWFrO2Nhc2UieldhdGVybWFya1BhdGgiOloud2F0ZXJtYXJrUGF0aD1qO2JyZWFrO2Nhc2UiekxvZ29DdXN0b21QYXRoIjpaLmxvZ29DdXN0b21QYXRoPWo7YnJlYWs7Y2FzZSJ6Q2FudmFzIjpqPT0iMCImJihaLmNhbnZhcz0hMSk7aWYoIVouY2FudmFzU3VwcG9ydGVkfHwhWi5jYW52YXMpWi51c2VDYW52YXM9ITE7YnJlYWs7Y2FzZSJ6RGVidWciOmo9PSIxIiYmKFouZGVidWc9ITApfX19fX0sejI0MjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MTtiPGEubGVuZ3RoOylhW2ItMV09PWFbYl0/YS5zcGxpY2UoYiwxKTpiKys7cmV0dXJuIGF9LGludGVyc2VjdDpmdW5jdGlvbihhLGIpe3ZhciBjPVtdO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZT1hW2RdLGY9ITE7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aCYmZT49KGVsbXQyPWJbZ10pO2crKylpZihlbG10Mj09ZSl7Zj0hMDticmVha31mJiZjLnB1c2goYVtkXSl9cmV0dXJuIGN9LHN1YnRyYWN0OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY10sZT0hMTtmb3IodmFyIGY9MDtmPGIubGVuZ3RoJiZkPj0oZWxtdDI9YltmXSk7ZisrKWlmKGVsbXQyPT1kKXtlPSEwO2JyZWFrfWUmJmEuc3BsaWNlKGMtLSwxKX1yZXR1cm4gYX0sY3JlYXRlQ2FsbGJhY2s6ZnVuY3Rpb24oYSxiKXt2YXIgYz1bXTtmb3IodmFyIGQ9MixlPWFyZ3VtZW50cy5sZW5ndGg7ZDxlO2QrKyljLnB1c2goYXJndW1lbnRzW2RdKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD1jLmNvbmNhdChbXSk7Zm9yKHZhciBlPTAsZj1hcmd1bWVudHMubGVuZ3RoO2U8ZjtlKyspZC5wdXNoKGFyZ3VtZW50c1tlXSk7cmV0dXJuIGIuYXBwbHkoYSxkKX19LHoyNTU6ZnVuY3Rpb24oYSl7YWxlcnQoYSl9LGNyZWF0ZUNvbnRhaW5lckVsZW1lbnQ6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGksaixrLGwsbSxuLG8pe3ZhciBwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYSk7dGhpcy5pc1N0clZhbChiKSYmKHAuaWQ9Yik7dmFyIHE9cC5zdHlsZTtyZXR1cm4gcS5kaXNwbGF5PXRoaXMuaXNTdHJWYWwoYyk/YzoiaW5saW5lLWJsb2NrIixxLnBvc2l0aW9uPXRoaXMuaXNTdHJWYWwoZCk/ZDoic3RhdGljIixxLm92ZXJmbG93PXRoaXMuaXNTdHJWYWwoZSk/ZToiaGlkZGVuIixhPT0iY2FudmFzIj8odGhpcy5pc1N0clZhbChmKSYmcC5zZXRBdHRyaWJ1dGUoIndpZHRoIixmKSx0aGlzLmlzU3RyVmFsKGcpJiZwLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixnKSk6KHRoaXMuaXNTdHJWYWwoZikmJihxLndpZHRoPWYpLHRoaXMuaXNTdHJWYWwoZyYmZykmJihxLmhlaWdodD1nKSksdGhpcy5pc1N0clZhbChoKSYmKHEubGVmdD1oKSx0aGlzLmlzU3RyVmFsKGkpJiYocS50b3A9aSkscS5ib3JkZXJTdHlsZT10aGlzLmlzU3RyVmFsKGopP2o6Im5vbmUiLHEuYm9yZGVyV2lkdGg9dGhpcy5pc1N0clZhbChrKT9rOiIwcHgiLHEuYmFja2dyb3VuZD10aGlzLmlzU3RyVmFsKGwpP2w6InRyYW5zcGFyZW50IG5vbmUiLHEubWFyZ2luPXRoaXMuaXNTdHJWYWwobSk/bToiMHB4IixxLnBhZGRpbmc9dGhpcy5pc1N0clZhbChuKT9uOiIwcHgiLHRoaXMuaXNTdHJWYWwobykmJihxLmN1cnNvcj1vKSxwfSxjcmVhdGVDZW50ZXJlZEVsZW1lbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiKSxjPVtdO2MucHVzaCgnPGRpdiBzdHlsZT0iZGlzcGxheTp0YWJsZTsgaGVpZ2h0OjEwMCU7IHdpZHRoOjEwMCU7JyksYy5wdXNoKCJib3JkZXI6bm9uZTsgbWFyZ2luOjBweDsgcGFkZGluZzowcHg7IiksYy5wdXNoKCcjcG9zaXRpb246cmVsYXRpdmU7IG92ZXJmbG93OmhpZGRlbjsgdGV4dC1hbGlnbjpsZWZ0OyI+JyksYy5wdXNoKCc8ZGl2IHN0eWxlPSIjcG9zaXRpb246YWJzb2x1dGU7ICN0b3A6NTAlOyB3aWR0aDoxMDAlOyAnKSxjLnB1c2goImJvcmRlcjpub25lOyBtYXJnaW46MHB4OyBwYWRkaW5nOjBweDsiKSxjLnB1c2goJ2Rpc3BsYXk6dGFibGUtY2VsbDsgdmVydGljYWwtYWxpZ246bWlkZGxlOyI+JyksYy5wdXNoKCc8ZGl2IHN0eWxlPSIjcG9zaXRpb246cmVsYXRpdmU7ICN0b3A6LTUwJTsgd2lkdGg6MTAwJTsgJyksYy5wdXNoKCJib3JkZXI6bm9uZTsgbWFyZ2luOjBweDsgcGFkZGluZzowcHg7IiksYy5wdXNoKCd0ZXh0LWFsaWduOmNlbnRlcjsiPjwvZGl2PjwvZGl2PjwvZGl2PicpLGIuaW5uZXJIVE1MPWMuam9pbigiIiksYj1iLmZpcnN0Q2hpbGQ7dmFyIGQ9YixlPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO3doaWxlKGUubGVuZ3RoPjApZD1lWzBdLGU9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7cmV0dXJuIGQuYXBwZW5kQ2hpbGQoYSksYn0sY3JlYXRlR3JhcGhpY0VsZW1lbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJpbWciKSxjPW51bGw7cmV0dXJuIFouYnJvd3Nlcj09Wi5icm93c2Vycy5JRSYmWi5icm93c2VyVmVyc2lvbjw3PyhjPXRoaXMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgic3BhbiIsbnVsbCwiaW5saW5lLWJsb2NrIiksYi5vbmxvYWQ9ZnVuY3Rpb24oKXtjLnN0eWxlLndpZHRoPWMuc3R5bGUud2lkdGh8fGIud2lkdGgrInB4IixjLnN0eWxlLmhlaWdodD1jLnN0eWxlLmhlaWdodHx8Yi5oZWlnaHQrInB4IixiLm9ubG9hZD1udWxsLGI9bnVsbH0sYy5zdHlsZS5maWx0ZXI9InByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYUltYWdlTG9hZGVyKHNyYz0nIithKyInLCBzaXppbmdNZXRob2Q9J3NjYWxlJykiKTooYz1iLGMuc3JjPWEpLGN9LHoyNTE6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGksaixrLGwpe3ZhciBtPWEucGFyZW50Tm9kZS5zdHlsZTttLmNvbG9yPWIsbS5mb250RmFtaWx5PWMsbS5mb250U2l6ZT1kLG0uZm9udFNpemVBZGp1c3Q9ZSxtLmZvbnRTdHlsZT1mLG0uZm9udFN0cmV0Y2g9ZyxtLmZvbnRWYXJpYW50PWgsbS5mb250V2VpZ2h0PWksbS5saW5lSGVpZ2h0PWosbS50ZXh0QWxpZ249ayxtLnRleHREZWNvcmF0aW9uPWx9LHoxNTg6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDtpZih3aW5kb3cuQWN0aXZlWE9iamVjdCl0cnl7Yj1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpLGIuYXN5bmM9ITEsYi5sb2FkWE1MKGEpfWNhdGNoKGMpe3RoaXMuejI1NShjLm5hbWUrdGhpcy56MTg1KCJ6ODIiKStjLm1lc3NhZ2UpfWVsc2UgaWYod2luZG93LkRPTVBhcnNlcil0cnl7dmFyIGQ9bmV3IERPTVBhcnNlcjtiPWQucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIil9Y2F0Y2goYyl7dGhpcy56MjU1KGMubmFtZSt0aGlzLnoxODUoIno4MiIpK2MubWVzc2FnZSl9ZWxzZSB0aGlzLnoyNTUodGhpcy56MTg1KCJ6OTgiKSk7cmV0dXJuIGJ9LFBvaW50OmZ1bmN0aW9uKGEsYil7dGhpcy54PXR5cGVvZiBhPT0ibnVtYmVyIj9hOjAsdGhpcy55PXR5cGVvZiBiPT0ibnVtYmVyIj9iOjB9LFBvaW50M0Q6ZnVuY3Rpb24oYSxiLGMpe3RoaXMueD10eXBlb2YgYT09Im51bWJlciI/YTowLHRoaXMueT10eXBlb2YgYj09Im51bWJlciI/YjowLHRoaXMuej10eXBlb2YgYz09Im51bWJlciI/YzowfSx6MTg1OmZ1bmN0aW9uKGEpe3ZhciBiPSIiO3N3aXRjaChhKXtjYXNlIno1MCI6Yj0iRW5hYmxlIERldmVsb3BlciBwYXJhbWV0ZXJzIjticmVhaztjYXNlIno0OSI6Yj0iQ2hhbmdpbmcgVGhpcyBWaW9sYXRlcyBMaWNlbnNlIEFncmVlbWVudCI7YnJlYWs7Y2FzZSJ6NDgiOmI9IlN1cHBvcnQgZm9yIHRoaXMgcGFyYW1ldGVyIGlzIGVuYWJsZWQgb25seSBpbiB0aGUgWm9vbWlmeSBJbWFnZSBWaWV3ZXIgaW5jbHVkZWQgaW4gdGhlIFpvb21pZnkgSFRNTDUgRGV2ZWxvcGVyIGVkaXRpb246ICI7YnJlYWs7Y2FzZSJ6MjUiOmI9IjEwMCI7YnJlYWs7Y2FzZSJ6NjAiOmI9IjMwMDAwIjticmVhaztjYXNlIno2MSI6Yj0iMjU2IjticmVhaztjYXNlIno1OSI6Yj0iMS4xNSI7YnJlYWs7Y2FzZSJ6NjIiOmI9IjMwMCI7YnJlYWs7Y2FzZSJ6NyI6Yj0iNiI7YnJlYWs7Y2FzZSJ6NiI6Yj0iMyI7YnJlYWs7Y2FzZSJ6NSI6Yj0iMyI7YnJlYWs7Y2FzZSJ6NCI6Yj0iMiI7YnJlYWs7Y2FzZSJ6MyI6Yj0iMCI7YnJlYWs7Y2FzZSJ6NDUiOmI9IjIiO2JyZWFrO2Nhc2UiejQ2IjpiPSI1IjticmVhaztjYXNlIno0NyI6Yj0iMTAiO2JyZWFrO2Nhc2UiejgwIjpiPSI1IjticmVhaztjYXNlIno4MSI6Yj0iMC4wMiI7YnJlYWs7Y2FzZSJ6NzciOmI9IjMwIjticmVhaztjYXNlIno3OCI6Yj0iMjAwIjticmVhaztjYXNlIno3OSI6Yj0iMTAiO2JyZWFrO2Nhc2UiejEwVElFUlNLSVBUSFJFU0hPTEQiOmI9IjAxLiI7YnJlYWs7Y2FzZSJ6MjQiOmI9IjEwIjticmVhaztjYXNlInoxOCI6Yj0iNSI7YnJlYWs7Y2FzZSJ6MTkiOmI9IjAuMDY3IjticmVhaztjYXNlIno2NCI6Yj0iNCI7YnJlYWs7Y2FzZSJ6NjMiOmI9IjEiO2JyZWFrO2Nhc2UiejY1IjpiPSIxIjticmVhaztjYXNlIno0MyI6Yj0iMiI7YnJlYWs7Y2FzZSJ6NDQiOmI9IjE1MCI7YnJlYWs7Y2FzZSJ6MzkiOmI9IjEwMCI7YnJlYWs7Y2FzZSJ6NDAiOmI9IjAiO2JyZWFrO2Nhc2UiejQyIjpiPSIwIjticmVhaztjYXNlInozOCI6Yj1udWxsO2JyZWFrO2Nhc2UiejM2IjpiPSIjZmZmZmZmIjticmVhaztjYXNlInozNk5PQUxQSEEiOmI9IiNmYmZhZmEiO2JyZWFrO2Nhc2UiejM1IjpiPSIwLjc1IjticmVhaztjYXNlIno0MSI6Yj0iYmx1ZSI7YnJlYWs7Y2FzZSJ6NTUiOmI9InNraW5GaWxlcy54bWwiO2JyZWFrO2Nhc2UiejU2IjpiPSJBc3NldHMvU2tpbnMvRGVmYXVsdCI7YnJlYWs7Y2FzZSJ6NTQiOmI9IjAiO2JyZWFrO2Nhc2UiejEyIjpiPSIxIjticmVhaztjYXNlIno1OCI6Yj0iMSI7YnJlYWs7Y2FzZSJ6NTciOmI9IjEwIjticmVhaztjYXNlInoyMyI6Yj0iMSI7YnJlYWs7Y2FzZSJ6MjIiOmI9IndoaXRlIjticmVhaztjYXNlInoyMSI6Yj0iWCI7YnJlYWs7Y2FzZSJ6MjAiOmI9Ilx0I0Y4RjhGOCI7YnJlYWs7Y2FzZSJ6NTMiOmI9IjEiO2JyZWFrO2Nhc2UiejUxIjpiPSI1MDAiO2JyZWFrO2Nhc2UiejUyIjpiPSIgIjticmVhaztjYXNlInozMSI6Yj0iMSI7YnJlYWs7Y2FzZSJ6MzAiOmI9bnVsbDticmVhaztjYXNlIno4IjpiPSIxIjticmVhaztjYXNlInoxNyI6Yj0iMCI7YnJlYWs7Y2FzZSJ6MTYiOmI9ImxpZ2h0Z3JheSI7YnJlYWs7Y2FzZSJ6MTQiOmI9IndoaXRlIjticmVhaztjYXNlInoxMyI6Yj0iQWdyZWUiO2JyZWFrO2Nhc2UiejE1IjpiPSJFeGl0IjticmVhaztjYXNlIno3MyI6Yj0iMC42IjticmVhaztjYXNlIno3NCI6Yj0iMC4zMyI7YnJlYWs7Y2FzZSJ6NzYiOmI9IjUxMiI7YnJlYWs7Y2FzZSJ6NzUiOmI9IjM4NCI7YnJlYWs7Y2FzZSJ6MjYiOmI9bnVsbDticmVhaztjYXNlInoyNyI6Yj1udWxsO2JyZWFrO2Nhc2UiejI4IjpiPW51bGw7YnJlYWs7Y2FzZSJ6MzMiOmI9bnVsbDticmVhaztjYXNlInozMiI6Yj0iMSI7YnJlYWs7Y2FzZSJ6MTAiOmI9IjEiO2JyZWFrO2Nhc2UiejkiOmI9IjEiO2JyZWFrO2Nhc2UiejM0IjpiPSIxIjticmVhaztjYXNlInoyOSI6Yj0iMSI7YnJlYWs7Y2FzZSJ6NjciOmI9IlRoaXMgcGFuZWwgaXMgZW5hYmxlZCB1c2luZyB0aGUgSFRNTCBwYXJhbWV0ZXIgJ3pEZWJ1Zz0xJy4gSXQgY2FuIGJlIGNhbGxlZCBhcyBmb2xsb3dzOlxuXG4gICBaLlV0aWxzLnRyYWNlKCd2YWx1ZSB0byBkaXNwbGF5Jyk7ICBcblxuVGhlIGJ1dHRvbnMgYmVsb3cgZGlzcGxheSBvciBtb2RpZnkgaW1wb3J0YW50IHN0YXRlIHZhbHVlcy4gIFdlYiBkZXNpZ25lcnMgbmV3IHRvIEphdmFTY3JpcHQgd2lsbCBhbHNvIGJlbmVmaXQgZnJvbSB0aGUgY29uc29sZSwgdHJhY2UsIHByb2ZpbGluZywgYW5kIG90aGVyIGRlYnVnZ2luZyBmZWF0dXJlcyBvZiBsZWFkaW5nIGJyb3dzZXJzLiI7YnJlYWs7Y2FzZSJ6NjgiOmI9ImxpZ2h0Z3JheSI7YnJlYWs7Y2FzZSJ6NjYiOmI9IndoaXRlIjticmVhaztjYXNlIno2OSI6Yj0iU2hvdyBHbG9iYWxzIjticmVhaztjYXNlIno3MiI6Yj0iVG9nZ2xlIERpc3BsYXkiO2JyZWFrO2Nhc2UiejcwIjpiPSJUb2dnbGUgQmFja2ZpbGwiO2JyZWFrO2Nhc2UiejcxIjpiPSJUb2dnbGUgQ29uc3RyYWluIFBhbiI7YnJlYWs7Y2FzZSJ6OTkiOmI9IkJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBYTUxIdHRwUmVxdWVzdC4iO2JyZWFrO2Nhc2Uiejg3LUlNQUdFWE1MIjpiPSJFcnJvciBsb2FkaW5nIGltYWdlOiBwbGVhc2UgbWFrZSBzdXJlIGltYWdlIHBhdGggaW4gd2ViIHBhZ2UgbWF0Y2hlcyBpbWFnZSBmb2xkZXIgbG9jYXRpb24gb24gd2Vic2VydmVyLiI7YnJlYWs7Y2FzZSJ6ODctVE9PTEJBUlhNTCI6Yj0iRXJyb3IgbG9hZGluZyB0b29sYmFyOiBwbGVhc2UgdmVyaWZ5IHNraW4gZmlsZXMgYXJlIG9uIHdlYnNlcnZlciBpbiBzYW1lIGZvbGRlciBhcyB6MTIyLmpzIGZpbGUgYW5kIGFyZSBpbiBkZWZhdWx0IGZvbGRlciBzdHJ1Y3R1cmUgJ0Fzc2V0cy9Ta2lucy9EZWZhdWx0Jywgb3IgYWRkIHpTa2luUGF0aCBwYXJhbWV0ZXIgdG8gd2VicGFnZS4iO2JyZWFrO2Nhc2Uiejg3IjpiPSJFcnJvciBtYWtpbmcgbmV0d29yayByZXF1ZXN0OiBwb3NzaWJsZSBpbnZhbGlkIHBhdGggb3IgbmV0d29yayBlcnJvci4iO2JyZWFrO2Nhc2Uiejg0IjpiPSJJbWFnZSBmYWlsZWQgdG8gbG9hZDogcG9zc2libGUgaW52YWxpZCBwYXRoLCBtaXNzaW5nIGltYWdlLCBvciBuZXR3b3JrIGVycm9yLiI7YnJlYWs7Y2FzZSJ6ODkiOmI9IkVycm9yIHJlbGF0ZWQgdG8gbmV0d29yayBzZWN1cml0eTogIjticmVhaztjYXNlIno5MCI6Yj0iRXJyb3IgcmVsYXRlZCB0byBuZXR3b3JrIHN0YXR1czogIjticmVhaztjYXNlIno4MiI6Yj0iIGNvbnZlcnRpbmcgWE1MIHRleHQgdG8gWE1MIGRvYyAoRE9NUGFyc2VyKTogIjticmVhaztjYXNlIno5OCI6Yj0iQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IFhNTCBET00uIjticmVhaztjYXNlInoxMDAiOmI9IlhNTCBpbnZhbGlkLiI7YnJlYWs7Y2FzZSJ6ODYiOmI9IkltYWdlIFhNTCBpbnZhbGlkLiI7YnJlYWs7Y2FzZSJ6ODMiOmI9IiB3aGlsZSBleGVjdXRpbmcgY2FsbGJhY2s6ICI7YnJlYWs7Y2FzZSJ6ODUiOmI9IkltYWdlIHRpbWVkIG91dDogIjticmVhaztjYXNlIno4OCI6Yj0iTmF2aWdhdG9yIGltYWdlIGZhaWxlZCB0byBsb2FkOiBwb3NzaWJsZSBpbnZhbGlkIHBhdGgsIG1pc3NpbmcgaW1hZ2UsIG9yIG5ldHdvcmsgZXJyb3IuIjticmVhaztjYXNlIno5MSI6Yj0iU2tpbiBYTUwgaW52YWxpZC4iO2JyZWFrO2Nhc2UiejkyIjpiPSJUaGUgc2tpbiBYTUwgZmlsZSBoYXMgb25lIG9yIG1vcmUgZmF1bHR5IG5hbWUgbGluZXMuIjticmVhaztjYXNlIno5NyI6Yj0iV2F0ZXJtYXJrIGltYWdlIGZhaWxlZCB0byBsb2FkOiAiO2JyZWFrO2Nhc2UiejkzIjpiPSJVbmtub3duIGVsZW1lbnQgc3R5bGUgLSBubyBrbm93biBtZXRob2QgdG8gaWRlbnRpZnkuIjticmVhaztjYXNlIno5NCI6Yj0iVW5rbm93biBtb3VzZSBwb3NpdGlvbiAtIG5vIGtub3duIG1ldGhvZCB0byBjYWxjdWxhdGUuIjticmVhaztjYXNlIno5NSI6Yj0iVW5rbm93biBtb3VzZSBzY3JvbGwgLSBubyBrbm93biBtZXRob2QgdG8gY2FsY3VsYXRlLiI7YnJlYWs7Y2FzZSJ6OTYiOmI9IlVua25vd24gd2luZG93IHNpemUgLSBubyBrbm93biBtZXRob2QgdG8gY2FsY3VsYXRlLiI7YnJlYWs7Y2FzZSJ6MTA2IjpiPSJMYXVuY2ggWm9vbWlmeSBXZWJzaXRlIjticmVhaztjYXNlInoxMDciOmI9Ik1pbmltaXplIFRvb2xiYXIiO2JyZWFrO2Nhc2UiejEwNSI6Yj0iRXhwYW5kIFRvb2xiYXIiO2JyZWFrO2Nhc2UiejEyMCI6Yj0iWm9vbSBPdXQiO2JyZWFrO2Nhc2UiejExNCI6Yj0iWm9vbSBJbiBBbmQgT3V0IjticmVhaztjYXNlInoxMTkiOmI9Ilpvb20gSW4iO2JyZWFrO2Nhc2UiejEwOSI6Yj0iUGFuIExlZnQiO2JyZWFrO2Nhc2UiejExMSI6Yj0iUGFuIFVwIjticmVhaztjYXNlInoxMDgiOmI9IlBhbiBEb3duIjticmVhaztjYXNlInoxMTAiOmI9IlBhbiBSaWdodCI7YnJlYWs7Y2FzZSJ6MTEyIjpiPSJSZXNldCBJbml0aWFsIFZpZXciO2JyZWFrO2Nhc2UiejExOCI6Yj0iVG9nZ2xlIEZ1bGwgUGFnZSBWaWV3IjticmVhaztjYXNlInoxMDIiOmI9IkNhbmNlbCBGdWxsIFBhZ2UgVmlldyI7YnJlYWs7Y2FzZSJ6MTAzIjpiPSJBZ3JlZSB0byBjb3B5cmlnaHQgYW5kIHZpZXcgaW1hZ2VzIjticmVhaztjYXNlInoxMDQiOmI9IkV4aXQgYW5kIGRvIG5vdCB2aWV3IGltYWdlcyI7YnJlYWs7Y2FzZSJ6MTEzIjpiPSJUb2dnbGUgRnVsbCBQYWdlIFZpZXciO2JyZWFrO2Nhc2UiejExNyI6Yj0iVG9nZ2xlIFZpZXdwb3J0IERpc3BsYXkiO2JyZWFrO2Nhc2UiejExNSI6Yj0iVG9nZ2xlIFZpZXdwb3J0IEJhY2tmaWxsIjticmVhaztjYXNlInoxMTYiOmI9IlRvZ2dsZSBDb25zdHJhaW4gUGFuIjticmVhaztkZWZhdWx0OmI9IlVuZXhwZWN0ZWQgcmVzb3VyY2UgcmVxdWVzdCJ9cmV0dXJuIGJ9LHoyNTM6ZnVuY3Rpb24oKXt2YXIgYT0iIjthKz0iXG4iLGErPSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk9PTUlGWSBJTUFHRSBWSUVXRVIgLSBDVVJSRU5UIFZBTFVFU1xuIixhKz0iXG4iLGErPSJJTUFHRSAmIFNLSU46ICAgICIsYSs9IlouaW1hZ2VQYXRoPSIrWi5pbWFnZVBhdGgrIiwgICAiLGErPSJaLnNraW5QYXRoPSIrWi5za2luUGF0aCsiLCAgICIsYSs9Ilouc2tpbk1vZGU9IitaLnNraW5Nb2RlKyIsICAgIixhKz0iWi5pbWFnZVc9IitaLmltYWdlVysiLCAgICIsYSs9IlouaW1hZ2VIPSIrWi5pbWFnZUgrIiwgICAiLGErPSJ0aWVyQ291bnQ9IitaLlZpZXdwb3J0LnoxODYoKSsiLCAgICIsYSs9IlRJTEVfU0laRT0iK1ouVmlld3BvcnQuejE5NSgpKyJcbiIsYSs9IlxuIixhKz0iUEFHRSAmIEJST1dTRVI6ICAgICIsYSs9IloucGFnZUNvbnRhaW5lcj0iK1oucGFnZUNvbnRhaW5lcisiLCAgICIsYSs9IlouYnJvd3Nlcj0iK1ouYnJvd3NlcisiLCAgICIsYSs9IlouYnJvd3NlclZlcnNpb249IitaLmJyb3dzZXJWZXJzaW9uKyIsICAgIixhKz0iWi5jYW52YXNTdXBwb3J0ZWQ9IitaLmNhbnZhc1N1cHBvcnRlZCsiLCAgICIsYSs9IlouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZD0iK1ouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZCsiLCAgICIsYSs9IlouY3NzVHJhbnNmb3JtUHJvcGVydHk9IitaLmNzc1RyYW5zZm9ybVByb3BlcnR5KyIsICAgIixhKz0iWi5jc3NUcmFuc2Zvcm1Ob1VuaXRzPSIrWi5jc3NUcmFuc2Zvcm1Ob1VuaXRzKyIsICAgIixhKz0iWi5hbHBoYVN1cHBvcnRlZD0iK1ouYWxwaGFTdXBwb3J0ZWQrIiwgICAiLGErPSJaLnJlbmRlclF1YWxpdHk9IitaLnJlbmRlclF1YWxpdHkrIiwgICAiLGErPSJaLm1vYmlsZURldmljZT0iK1oubW9iaWxlRGV2aWNlKyJcbiIsYSs9IlxuIixhKz0iVklFV0VSIE9QVElPTlMgJiBERUZBVUxUUzogICAgIixhKz0iWi5pbml0aWFsWD0iK1ouaW5pdGlhbFgrIiwgICAiLGErPSJaLmluaXRpYWxZPSIrWi5pbml0aWFsWSsiLCAgICIsYSs9IlouaW5pdGlhbFo9IitaLmluaXRpYWxaKyIsICAgIixhKz0iWi5taW5aPSIrWi5taW5aKyIsICAgIixhKz0iWi5tYXhaPSIrWi5tYXhaKyIsICAgIixhKz0iWi5maXRaPSIrWi5maXRaKyIsICAgIixhKz0iWi56b29tU3BlZWQ9IitaLnpvb21TcGVlZCsiLCAgICIsYSs9IloucGFuU3BlZWQ9IitaLnBhblNwZWVkKyIsICAgIixhKz0iWi5mYWRlSW5TcGVlZD0iK1ouZmFkZUluU3BlZWQrIiwgICAiLGErPSJaLnRvb2xiYXJWaXNpYmxlPSIrWi50b29sYmFyVmlzaWJsZSsiLCAgICIsYSs9IloudG9vbGJhclc9IitaLnRvb2xiYXJXKyIsICAgIixhKz0iWi50b29sYmFyQ3VycmVudFc9IitaLnRvb2xiYXJDdXJyZW50VysiLCAgICIsYSs9IloudG9vbGJhckg9IitaLnRvb2xiYXJIKyIsICAgIixhKz0iWi50b29sYmFyUG9zaXRpb249IitaLnRvb2xiYXJQb3NpdGlvbisiLCAgICIsYSs9IloudG9vbHRpcHNWaXNpYmxlPSIrWi50b29sdGlwc1Zpc2libGUrIiwgICAiLGErPSJaLm5hdmlnYXRvclZpc2libGU9IitaLm5hdmlnYXRvclZpc2libGUrIiwgICAiLGErPSJaLm5hdmlnYXRvclc9IitaLm5hdmlnYXRvclcrIiwgICAiLGErPSJaLm5hdmlnYXRvckg9IitaLm5hdmlnYXRvckgrIiwgICAiLGErPSJaLm5hdmlnYXRvckw9IitaLm5hdmlnYXRvckwrIiwgICAiLGErPSJaLm5hdmlnYXRvclQ9IitaLm5hdmlnYXRvclQrIiwgICAiLGErPSJaLm5hdmlnYXRvckZpdD0iK1oubmF2aWdhdG9yRml0KyIsICAgIixhKz0iWi5jbGlja1pvb209IitaLmNsaWNrWm9vbSsiLCAgICIsYSs9IlouY2xpY2tQYW49IitaLmNsaWNrUGFuKyIsICAgIixhKz0iWi5tb3VzZVBhbj0iK1oubW91c2VQYW4rIiwgICAiLGErPSJaLmtleXM9IitaLmtleXMrIiwgICAiLGErPSJaLmNvbnN0cmFpblBhbj0iK1ouY29uc3RyYWluUGFuKyIsICAgIixhKz0iV2F0ZXJtYXJrIGFscGhhID0gIitaLlV0aWxzLnoxODUoIno3MyIpKyIsICAgIixhKz0iWi53YXRlcm1hcmtQYXRoPSIrWi53YXRlcm1hcmtQYXRoKyIsICAgIixhKz0iWi5jb3B5cmlnaHRQYXRoPSIrWi5jb3B5cmlnaHRQYXRoKyIsICAgIixhKz0iWi5zbGlkZXJWaXNpYmxlPSIrWi5zbGlkZXJWaXNpYmxlKyIsICAgIixhKz0iWi5mdWxsUGFnZVZpc2libGU9IitaLmZ1bGxQYWdlVmlzaWJsZSsiLCAgICIsYSs9IloucHJvZ3Jlc3NWaXNpYmxlPSIrWi5wcm9ncmVzc1Zpc2libGUrIiwgICAiLGErPSJaLmxvZ29WaXNpYmxlPSIrWi5sb2dvVmlzaWJsZSsiLCAgICIsYSs9IloubG9nb0N1c3RvbVBhdGg9IitaLmxvZ29DdXN0b21QYXRoKyIsICAgIixhKz0iWi5jYW52YXM9IitaLmNhbnZhcysiXG4iLGErPSJcbiIsYSs9IklOVEVSTkFMIFZBTFVFUzogICAgIixhKz0iXG4iLGErPSJkaXNwbGF5Vz0iK1ouVmlld3BvcnQuejIwMSgpKyIsICAgIixhKz0iZGlzcGxheUg9IitaLlZpZXdwb3J0LnoxNzkoKSsiLCAgICIsYSs9InRpZXJDdXJyZW50PSIrWi5WaWV3cG9ydC56MTg3KCkrIiwgICAiLGErPSJ0aWVyU2NhbGU9IitaLlZpZXdwb3J0LnoxODkoKSsiLCAgICIsYSs9IlRJRVJTX01BWF9TQ0FMRV9VUD0iK1ouVmlld3BvcnQuejE5NCgpKyIsICAgIixhKz0iVElFUlNfTUFYX1NDQUxFX0RPV049IitaLlZpZXdwb3J0LnoxOTMoKSsiLCAgICIsYSs9IlRJTEVTX01BWF9DQUNIRT0iK1ouVmlld3BvcnQuejE5NygpKyIsICAgIixhKz0iWi51c2VDYW52YXM9IitaLnVzZUNhbnZhcysiXG4iLGErPSJcbiIsYSs9IklOVEVSTkFMIExJU1RTOiAgICAiLGErPSJ0aWVyV3M9IitaLlZpZXdwb3J0LnoxOTIoKSsiLCAgICIsYSs9InRpZXJIcz0iK1ouVmlld3BvcnQuejE4OCgpKyIsICAgIixhKz0idGllclRpbGVDb3VudHM9IitaLlZpZXdwb3J0LnoxOTEoKSsiLCAgICIsYSs9InRpbGVzTG9hZGluZ05hbWVzPSIrWi5WaWV3cG9ydC56MTk2KCkrIlxuIixhKz0iXG4iLGFsZXJ0KGEpfSx6MjU2OmZ1bmN0aW9uKCl7Wi5UcmFjZURpc3BsYXk/Wi5UcmFjZURpc3BsYXkuZGlzcGxheT09ImlubGluZS1ibG9jayI/Wi5UcmFjZURpc3BsYXkuZGlzcGxheT0ibm9uZSI6Wi5UcmFjZURpc3BsYXkuZGlzcGxheT0iaW5saW5lLWJsb2NrIjpaLlV0aWxzLmNvbmZpZ3VyZVRyYWNlRGlzcGxheSgpfSxjb25maWd1cmVUcmFjZURpc3BsYXk6ZnVuY3Rpb24oKXt2YXIgYT1aLnZpZXdlclcvMyxiPVoudmlld2VySC8zKzQ1LGM9MTAsZD1wYXJzZUZsb2F0KFoudmlld2VySCkvMyxlPXRoaXMuejE4NSgiejY4Iik7Wi5UcmFjZURpc3BsYXk9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJUcmFjZURpc3BsYXkiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsImhpZGRlbiIsYSsicHgiLGIrInB4IixjKyJweCIsZCsicHgiLCJzb2xpZCIsIjFweCIsZSwiMHB4IiwiMTBweCIpLFouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChaLlRyYWNlRGlzcGxheSksWi50cmFjZXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiVEVYVEFSRUEiKTt2YXIgZj1aLnRyYWNlcy5zdHlsZTtmLndpZHRoPWEtMTUrInB4IixmLmhlaWdodD1iLTYwKyJweCIsZi5mb250RmFtaWx5PSJ2ZXJkYW5hIixmLmZvbnRTaXplPSIxMHB4IixmLmJvcmRlcj0ic29saWQiLGYuYm9yZGVyV2lkdGg9IjFweCIsZi5wYWRkaW5nPSI1cHgiLGYucmVzaXplPSJub25lIixaLnRyYWNlcy52YWx1ZT0iVHJhY2UgVmFsdWVzXG4iLFouVHJhY2VEaXNwbGF5LmFwcGVuZENoaWxkKFoudHJhY2VzKTt2YXIgZz01OCxoPTQyLGk9MjAsaj1iLWgvMi0xMCxrPTEwLGw9dGhpcy56MTg1KCJ6NjYiKSxtPXRoaXMuejE4NSgiejY5Iiksbj1uZXcgdGhpcy5CdXR0b24oImJ1dHRvblNob3dHbG9iYWxzIixtLG51bGwsbnVsbCxudWxsLG51bGwsZysicHgiLGgrInB4IixpKyJweCIsaisicHgiLCJtb3VzZWRvd24iLHRoaXMuejI1MywiejExMyIsInNvbGlkIiwiMXB4IixsLCIwcHgiLCIwcHgiKTtaLlRyYWNlRGlzcGxheS5hcHBlbmRDaGlsZChuLmVsbXQpLGkrPWcrazt2YXIgbT10aGlzLnoxODUoIno3MiIpLG89bmV3IHRoaXMuQnV0dG9uKCJidXR0b25Ub2dnbGVEaXNwbGF5IixtLG51bGwsbnVsbCxudWxsLG51bGwsZysicHgiLGgrInB4IixpKyJweCIsaisicHgiLCJtb3VzZWRvd24iLFouVmlld3BvcnQuejI3MiwiejExNyIsInNvbGlkIiwiMXB4IixsLCIwcHgiLCIwcHgiKTtaLlRyYWNlRGlzcGxheS5hcHBlbmRDaGlsZChvLmVsbXQpLGkrPWcrazt2YXIgbT10aGlzLnoxODUoIno3MCIpLHA9bmV3IHRoaXMuQnV0dG9uKCJidXR0b25Ub2dnbGVCYWNrZmlsbCIsbSxudWxsLG51bGwsbnVsbCxudWxsLGcrInB4IixoKyJweCIsaSsicHgiLGorInB4IiwibW91c2Vkb3duIixaLlZpZXdwb3J0LnoyNzEsInoxMTUiLCJzb2xpZCIsIjFweCIsbCwiMHB4IiwiMHB4Iik7Wi5UcmFjZURpc3BsYXkuYXBwZW5kQ2hpbGQocC5lbG10KSxpKz1nK2ssZys9MTI7dmFyIG09dGhpcy56MTg1KCJ6NzEiKSxxPW5ldyB0aGlzLkJ1dHRvbigiYnV0dG9uVG9nZ2xlQ29uc3RyYWluUGFuIixtLG51bGwsbnVsbCxudWxsLG51bGwsZysicHgiLGgrInB4IixpKyJweCIsaisicHgiLCJtb3VzZWRvd24iLFouVmlld3BvcnQudG9nZ2xlQ29uc3RyYWluUGFuLCJ6MTE2Iiwic29saWQiLCIxcHgiLGwsIjBweCIsIjBweCIpO1ouVHJhY2VEaXNwbGF5LmFwcGVuZENoaWxkKHEuZWxtdCl9LHRyYWNlOmZ1bmN0aW9uKGEpe1ouVHJhY2VEaXNwbGF5fHxaLlV0aWxzLmNvbmZpZ3VyZVRyYWNlRGlzcGxheSgpLFoudHJhY2VzJiYoWi50cmFjZXMudmFsdWUrPSJcbiIrYSsiXG4iKX19";
			";
		</script>




	<script id="script_addChild" >
		var childNumber_zm = 3;
		var zmx = new Array(); 
		var z = 0;
		zmx[z++] = "./zm/nasa/";
		zmx[z++] = "./zm/appolo/";
		zmx[z++] = "./zm/appolo17_4800/";
		zmx[z++] = "./zm/zm5_planets/";
		zmx[z++] = "./zm/zm_nasa/";
		zmx[z++] = "./ko_jtf/jft_parcels/";
//		alert( "addChild zmx len="+zmx.length );
		var childNumber = 3;
		function addChild() {
			alert( "addChild() zmx len="+zmx.length );
			var parent = document.getElementById('div_addchild');
			var newChild = '<p>Child ' + childNumber + '</p>';
			newChild += "<h1>addChild one</h1>";
			newChild += "<h1>addChild two</h1>";
			parent.insertAdjacentHTML('beforeend', newChild);
			childNumber++;
			}
		</script>

	<script id="script_addChild_zm" >
		var childNumber_zm = 3;
		var zmx = new Array(); 
		var z = 0;
		alert( "addChild_zm zmx len="+zmx.length );
//		zmx[z++] = "./zm/nasa/";
//		zmx[z++] = "./zm/appolo/";
//		zmx[z++] = "./zm/appolo17_4800/";
//		zmx[z++] = "./zm/zm5_planets/";
//		zmx[z++] = "./zm/zm_nasa/";
//		zmx[z++] = "./ko_jtf/jft_parcels/";
		
		
		function addChild_zm() {
//			alert( "BUGS_176: addChild_zm" );
			
			var parent = document.getElementById('div_zmlist');
			var newChild_zm = '<p>zm ' + childNumber_zm + '</p>';
			newChild_zm += "<h1>addChild_zm one</h1>";

			for( z = 0: z < zmx.length; z++ ) {
				newChild_zm += "<a href='" + zmx[z] + "/index.html' target=_blank>"
				newChild_zm += "<img src='"+ zmx[z] + "/index.png' alt='./zm/index.png' border=0></a>";
				}
			parent.insertAdjacentHTML('beforeend', newChild_zm);
			childNumber++;
			}
		</script>

	<script id="script_zmlist" >
		var childNumber_zm = 3;
		function script_zmlist() {
			script_zmlist_load();
//			alert( "bugs177 script_zmlist_load OK" );
			script_zmlist_show();
//			var parent = document.getElementById('div_zmlist');
//			var newChild_zm = '<p>zm ' + childNumber_zm + '</p>';
//			newChild_zm += "<hr color=white><h1>zmlist one</h1><hr color=white>";
//			parent.insertAdjacentHTML('beforeend', newChild_zm);
//			childNumber++;
			}
		</script>


	<style name="style_zm">
		body { text-align: center; background-color: "slategrey"; color:"white"; }
		button {
//		visibility: hidden;
//		background: rgba(7, 99, 53, .1);
		background: transparent;
		border: 3px solid rgba(7, 99, 53, 1);
		border-radius: 5px;
		color: rgba(7, 99, 53, 1);
		cursor: pointer;
		line-height: 40px;
		font-size: 30px;
		outline: none;
		padding: 0 20px;
		transition: all .3s;
		}
	button:hover {
//		background: rgba(7, 99, 53, 1);
		background: darkgreyslate;
		background: yellow;
		color: rgba(255,255,255,1);
		}
	p {font-size: 20px; font-weight: bold;
	</style>

<body>


	<button type="button" onclick="script_zmlist()">script_zmlist</button>
	<button type="button" onclick="addChild_zm()">addChild_zm</button>
	<button type="button" onclick="addChild()">addChild</button>
	<hr>

	<script > function imgWindow() {window.open("image") } </script>
		<img src="./imgs/btn/koeye.png" height="50" size="150" alt="koeye" onclick="script_zmlist()"> 
		<img src="./imgs/btn/koeyeb.png" height="50" size="150" alt="koeyeb" onclick="addChild_zm()"> 
		<img src="./imgs/btn/koeyew.png" height="50" size="150" alt="koeyew" onclick="addChild()"> 

	<div id="div_addchild">
		<p>Child 1</p>
		<p>Child 2</p>	
		</div>

	<div id="div_zmlist">
		<h1>div_zmlist</h1>
		<p>Child_zm 1</p>
		<p>Child_zm 2</p>	
		</div>

	<div id="div_addchild_zm" >
		<h1>div_addchild_zm</h1>
		addchild_zm <br>
		</div>


		<script id="script_zmlist" >
			var zmlist = new Array();

//			function script_zmlist_hover() {body { background-color: blue; }}

			function script_zmlist_load() {
			var z=0;
			zmlist[z++] = "./zm/zm_nasa/mars_zigzag_panels2400/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/nasa/1-scientistsfl/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/nasa/Echus-Chasma-On-Mars/TileGroup0/0-0-0.jpg";
//			alert( "zmlist"+z+" zmlist("+z+")="+zmlist[z] );
			zmlist[z++] = "./zm/zm_nasa/nasa/mars_zigzag_panels/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/zm/Curiosity-Murray-Buttes/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/venus_400/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/zm5_planets/1-scientistsfl/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/zm5_planets/1-scientistsfl/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/hrc2009stl/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/hrc2011/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/komap/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/070214_val_marineris_02/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/071010-msl-site1-02/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/071127-venus-surface-02/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/080409-phobos-02/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/081016-crater-mound-02/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/081103-mars-ripples-02/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/081204-rock-layers-02/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/090331-mars-starburst-02/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/090813-mars-crater-02.jpg/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/100113-mars-illusion-02/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/20070507_185501_1010108/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/365430main_nacl000000fd_middle_540x540/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/367307main_cracked_hahn_lg/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/369230main_apollolandinglocator_full/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/388038main_milichius_full/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/393992main_ejecta_20091014_full/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/400202main_lroc_apollo11_20091109_full/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/403330main_cabeus_lg/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/414923main_wrinkle-ridge-full/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/416286main_new-images-1-full/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/417415main_tychocloseup-20100115-full/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/417417main_tychofull-20100115-full/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/417869main_arist_bands321-full/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/417873main_M111918050R_thumb-full/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/419421main_AS16-M-0891-full/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/419425main_M106088433R-full/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/421320main_hadley_rille/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/421615main_plato_2_lg/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/421619main_plato_crater_lg/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/422349main_byrgius-a-20100203-full/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/422590-mars-taber-ansigt-/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/424828main_LunarOrbiterIII_3085_med/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/433446main_20100311_crisium_lg/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/445016main_anax3600_500/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/445021main_anax_wac_500/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/449172main_WAC_crop_context/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/449174main_M104376385_thumb/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/450800main_tsiol_2_lg/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/450994main_full_moon_lg/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/453514main_meteor_crater2_lg/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/453516main_meteor_crater_az_lg/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/455939main_holeinone_far_lg/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/463365main_M128202846LE/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/503670main_120210a/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/521685main_022111a/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/521691main_022111b/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/524173main_022511a/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/524220main_030211b/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/528087main_031110a/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/529214main_031611a/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/529221main_031611c/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/531407main_031811b/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/533097main_033111b/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/534165main_040511a/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/536801main_041311aa/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/539777main_042111b/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/541041main_042711a/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/555516main_053111a/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/558017main_060211a/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/561423main_060811b/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/576849main_062811b/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/576883main_062911b/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/58-pluto-3-large/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/ap11_landinJSC2007e045375/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/ap12_landsitea_JSC2011e118358/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/ap15_9aa_JSC2007e045378/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/ap15_lmnortha_JSC2007e045379/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/ap15_s2a_JSC2011e118359/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/ap16_lmviewa_JSC2007e045380/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/ap16_lmwesat_JSC2007e045380/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/ap16_s10a_JSC2007e045380/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/ap16_s11a_JSC2007e045380/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/ap16_s13_JSC2007e045380/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/ap16_s13a_JSC2007e045380/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/ap16_s1a_JSC2007e045380/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/ap16_s1ba_JSC2007e045380/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/ap16_slandsitea_JSC2007e045380/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/ap17_alsepa_JSC2004e52772/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/ap17_eva1a_JSC2007e045384/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/ap17_evaalsepa_JSC2007e045385/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s1easta_JSC2004e52773/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s1westa_JSC2004e52776/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s2a_JSC2004e52777/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s2eva2a_JSC2004e52774/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s3a_JSC2004e52778/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s3a_JSC2007e045386/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s4a_JSC2007e045388/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s5_JSC2004e20304/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s5a_JSC2004e20304/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s6a_JSC2007e045387/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s6southa_JSC2004e52779/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/ap17_s7a_JSC2004e52775/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/apll-5_JSC2008e040725/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/AS14-68-9450HR/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/apollo/lunar-recon-orbiter-apollo-12-surveyor-3-sites-1/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/appollo17_4800/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/Curiosity-Murray-Buttes/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./zm/zm_nasa/zm5_planets/2MASS-Redshift-Survey/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./us/realtor/ky/zoom/map_doevalley/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf01/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf02/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf03/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf04/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf05/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf06/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf07/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf08/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf09/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf10/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf11/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf12/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf14/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf15/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf16/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf17510/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf17570/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf21/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf22/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf23/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf24/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf26/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf27/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf28/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf29/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf29 copy/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf30/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf31/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf32/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf34/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf35/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf36/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf38/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf40/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf41/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf42/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf43/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf44/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf_n/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtf_ne/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfdc/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfdc_012/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfdc_e/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfdc_greater/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfdc_inc/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfdc_n/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfdc_s/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfdc_w/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfinc/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jtfinc_proper/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jttf37/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/jyf44/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/souixp/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "./ko_jtf/zm/jtf_parcels/souixp_boat/TileGroup0/0-0-0.jpg";
//			z--;
//			alert( "BUGS_load zmlist("+z+")="+zmlist[z] + " len="+zmlist.length );
//			document.write( "zmlist_lost zmlist_length="+zmlist.length+" z="+z );
				return(zmlist);
				}

		function script_zmlist_show() {
			var z = 0; var zmout=""; var len=zmlist.length;
			var zmid = ""; var zmurl = "";
//			alert( "bugs178 script_zmlist_show IN" );
			for( z=0; z< zmlist.length; z++ ) {
				zmid = zmlist[z].replace('/TileGroup0/0-0-0.jpg','' );
//				zmout += "<h1><b>zmlist_"+z+"</b><h1>";
				zmout += "<a href='./index_zm.html?zmid="+zmid+"' target=_blank>";
				zmout += "	<img name='img_" + zmid + "' src='"+zmlist[z]+"' border=0 height=100 >\n";
				zmout += "	</a>";
				zmout += "<a href='"+zmid+".html'  target=_blank>";
				zmout += "	<img name='img_" + zmid + "' height=25 src='"+zmlist[z]+"' border=0 height=100 >\n";
				zmout += "	</a>";
//				alert( "bugs430 zmid=" + zmid );
				}
//			document.write( "bugs435 zmout=" + zmout );

//			alert( "BUGS432_show zmlist("+len+")="+zmlist[z] + " len="+zmlist.length );
// 			document.getElementById('div_zmlist').innerHTML += zmout;
			var parent = document.getElementById('div_zmlist');
			parent.insertAdjacentHTML('beforeend', zmout);
			}
//		function script_zmlist() {
//			script_zmlist_load();
//			alert( "bugs_437: script_zmlist len="+zmlist.length );
//			script_zmlist_show();
//			}
		function script_zm_view( search ) {
			document.write( "script_zm_view search="+search );
			}
		</script>

HTML_ZM;
	return($html_zm);
	}

function html_ko_links() {
#	$html_ko_links=<<<HTML_KO_LINKS
	$html_ko_links_hdr  = '';
	$html_ko_links_hdr .= '<script id="script_load_liks" >';
	$html_ko_links_hdr .= '	var svc_links = new Array();';
	$html_ko_links_hdr .= '	var ko_links = new Array();';
	$html_ko_links_hdr .= '	var us_links = new Array();';
	$html_ko_links_hdr .= '	var u_links = new Array();';
	$html_ko_links_hdr .= '	var now_links = new Array();';
	$html_ko_links_hdr .= '	var srv_links = new Array();';

	$html_ko_links_ftr = '	</script>';

	$html_ko_links = array();
	$html_ko_linkz = array();
	$html_svc_links =array();
	$html_ko_list = array();

	printf( "$progid $dttm MSG:_300:  FOUND dbfile=[$dbfile][$remote_addr][$php_self]<br>\n" );
	if( file_exists( $dbfile )) {
	        $dbfile= $GLOBALS['dbfile'];
	        $pdo = newpdo($GLOBALS['dbfile']);
	        $tblname=$GLOBALS['tblname'];
		$tblname="links";
//	        $sql = "select * from $tblname where led_dttm == 'current'";
	        $sql = "select * from $tblname";
		$pdo = newpdo($dbfile);
//		$result = $stmg->fetch(PDO::FETCH_ASSOC);
		$j=0;
		foreach( $pdo->query($sql) as $row ) {
			$j++;
			$idx=$row['idx'];
			$status=$row['status'];
			$dttm=$row['dttm'];
			$grp=$row['grp'];
			$cat=$row['cat'];
			$code=$row['code'];
			$url=$row['url'];
			$img=$row['img'];
			$tn=$row['tn'];
			$img1=$row['img1'];
			$img2=$row['img2'];
			$title=$row['title'];
			$desc=$row['desc'];

# 	$html_js_kolist[$j] = 'ko_links['.$j.'] = "'.$idx.'|'.$status.'|'.$dttm.'|'.$grp.'|'.$cat.'|'.$.$code.'|'.$url.'|'.$img.'|'.$tn.'|'.$img1.'|'.$img2.'|'.$title.'|'.$desc	

			$html_js_ko_links[$j]  = '<a href="'.$url.'" targer=_blank class=popover>';
			$html_js_ko_links[$j] .= '	<img src="'.$img.'" border=0>';
			$html_js_ko_links[$j] .= '	<span><img src="'.$img.'" border=0></span>';
			$html_js_ko_links[$j] .= '	</a>';


			$html_ko_linkz[$j]  = '<a href="'.$url.'" targer=_blank class=popover>';
			$html_ko_linkz[$j] .= '	<img src="'.$tn.'" border=0>';
			$html_ko_linkz[$j] .= '	<span><img src="'.$img.'" border=0></span>';
			$html_ko_linkz[$j] .= '	</a>';
			}
		}

$html_js_load_svc_links = '';
$html_js_load_svc_links .= '		function load_svc_links() {';
$html_js_load_svc_links .= '			var j=0;';
$html_js_load_svc_links .= '			svc_links[j++]="./ka1_av.html|./imgs/links/ka1_av.png|ka1_av|./imgs/btn/kob.png";';
$html_js_load_svc_links .= html_js_links($dbfile,"svc");
$html_js_load_svc_links .= '			return( svc_links );';
$html_js_load_svc_links .= '			}';

$html_js_load_view_links = '';
$html_js_load_view_links .= '		function load_view_links() {';
$html_js_load_view_links .= '			var j=0;';
$html_js_load_view_links .= '			view_links[j++]="./ka1_av.html|./imgs/links/ka1_av.png|ka1_av|./imgs/btn/kob.png";';
$html_js_load_view_links .= html_js_links($dbfile,"view");
$html_js_load_view_links .= '			return( view_links );';
$html_js_load_view_links .= '			}';



$html_js_load_srv_links = "";
$html_js_load_srv_links .= '		function load_srv_links() {';
$html_js_load_srv_links .= '			srv_links[0]="ko0.us/ka1.html|./imgs/btn/koeyeb.png|ko0us|./imgs/btn/kob.png";';
$html_js_load_srv_links .= '			srv_links[1]="ko1.us/ka1.html|./imgs/btn/koeye.png|ko1us|./imgs/btn/kop1234.png";';
$html_js_load_srv_links .= '			srv_links[2]="ko2.us/ka1.html|./imgs/btn/koeyew.png|ko2us|./imgs/btn/kow.png";';

$html_js_load_srv_links .= html_js_links($dbfile, "srv" );
$html_js_load_srv_links .= '			return( srv_links );';
$html_js_load_srv_links .= '			}';


$html_js_load_ko_links = '';
$html_js_load_ko_links .= '		function load_ko_links() {';
$html_js_load_ko_links .= '			var j=0;'.
$html_js_load_ko_links .= '			ko_links[j++]="./jkwii/blackboard.html|./imgs/links/blackboard.png|blackboard|./imgs/btn/koeye.png";';
$html_js_load_ko_links .= '			ko_links[j++]="./jkwii/js/threejs/examples/ka1.html|./imgs/links/ka1_js3d.png|ka1_js3d|./imgs/btn/koeye.png";';
$html_js_load_ko_links .= '			ko_links[j++]="./ko/svc/js/stemkoskijs/Three.js/ka1.html|./imgs/links/ka1_js3d-stemkoski.png|ka1_js3d-stemkoski|./imgs/btn/koeye.png";';
$html_js_load_ko_links .= '			ko_links[j++]="./jkwii/js/gojs/ka1.html|./imgs/links/ka1_jsgo.png|ka1_jsgo|./imgs/btn/koeye.png";';
$html_js_load_ko_links .= '			ko_links[j++]="./ka1_jsdk.html|./imgs/links/ka1_jsdk.png|ka1_jsdk|./imgs/btn/koeye.png";';

$html_js_load_srv_links .= html_js_links($dbfile, "ko" );
$html_js_load_ko_links .= '			return( ko_links );';
$html_js_load_ko_links .= '			}';


$html_js_load_us_links = '';
$html_js_load_us_links .= '		function load_us_links() {';
$html_js_load_us_links .= '			var j=0;';
$html_js_load_us_links .= '			us_links[j++]="http://lawdonovan.com|./imgs/us/lawdonovan.png|law_donovan|./imgs/btn/koeye.png|law";';
$html_js_load_us_links .= html_js_links($dbfile, "us" );
$html_js_load_us_links .= '			return( us_links );';
$html_js_load_us_links .= '			}';

$html_js_load_u_links  = '';
$html_js_load_u_links .= '		function load_u_links() {';
$html_js_load_u_links .= '			var j=0;';
$html_js_load_u_links .= '			u_links[j++]="http://lawdonovan.com|./imgs/us/lawdonovan.png|law_donovan|./imgs/btn/koeye.png|law";';
$html_js_load_u_links .= html_js_links($dbfile, "u" );
$html_js_load_u_links .= '			return( u_links );';
$html_js_load_u_links .= '			}';

$html_js_load_now_links  = '';
$html_js_load_now_links .= '		function load_now_links() {';
$html_js_load_now_links .= '			var j=0;';
$html_js_load_now_links .= '			now_links[j++]="http://ka1_party.html|./imgs/us/lawdonovan.png|law_donovan|./imgs/btn/koeye.png|law";';
$html_js_load_now_links .= html_js_links($dbfile, "now" );
$html_js_load_now_links .= '			return( now_links );';
$html_js_load_now_links .= '			}';


$html_js_show_svc_links  =  <<< HTML_JS_SHOW_SVC_LINKS
$html_js_show_svc_links .= '		function show_svc_links(mode) {';
$html_js_show_svc_links .= '			svc_links = show_svc_links();';
$html_js_show_svc_links .= '			htmout_svc_links = "";';
$html_js_show_svc_links .= '			htmout_svc_linkz = "";';
# $html_js_show_svc_links .= '			for (i = 0; i < svc_links.length; i++) {';
# $html_js_show_svc_links .= '				my_btnimg = "./imgs/btn/kib.png";';
# $html_js_show_svc_links .= '				my_href = svc_links[i].split("|")[0];';
# $html_js_show_svc_links .= '				my_popimg = svc_links[i].split("|")[1];';
# $html_js_show_svc_links .= '				my_alt = svc_links[i].split("|")[2];';
# $html_js_show_svc_links .= '';
# $html_js_show_svc_links .= '				htmout_svc_linkz += \'<a class="drag" href="\' + my_href + \'" target=_blank>"\';';
# $html_js_show_svc_links .= '				htmout_svc_linkz += \'<img id="drg" src="\' + my_popimg + \'" alt="\' + my_alt + \'" height=100></a>\';';
# $html_js_show_svc_links .= '';
# $html_js_show_svc_links .= '				htmout_svc_links += \'<a class="thumbnail" href="' + my_href + \'" target=_blank>"\';';
# $html_js_show_svc_links .= '				htmout_svc_links += \'<img class="drag" id="drg" src="\' + my_btnimg + \'" alt="\' + my_alt + \'" width=25px height=14px border=0>\';';
# $html_js_show_svc_links .= '				htmout_svc_links += \'<span><img src="\' + my_popimg + \'" alt="\' + my_alt + \'"></span></a>\';';
# $html_js_show_svc_links .= '				}';
# $html_js_show_svc_links .= '			if( mode === 'pop' ) {';
# $html_js_show_svc_links .= '				htmout_svc_links += "<br><br>\n";';
# $html_js_show_svc_links .= '				var div_svc_links = document.getElementById('div_svc_links');';
# $html_js_show_svc_links .= '				div_svc_links.insertAdjacentHTML('beforeend', htmout_svc_links);';
# $html_js_show_svc_links .= '				return( htmout_svc_links );';
# $html_js_show_svc_links .= '				}';
# $html_js_show_svc_links .= '';
# $html_js_show_svc_links .= '			htmout_svc_linkz += "<br><br>\n";';
# $html_js_show_svc_links .= '			var div_svc_linkz = document.getElementById('div_svc_linkz');';
# $html_js_show_svc_links .= '			div_svc_linkz.insertAdjacentHTML('beforeend', htmout_svc_linkz);';
# $html_js_show_svc_links .= '			return( htmout_svc_linkz );';
# $html_js_show_svc_links .= '			}';
HTML_JS_SHOW_SVC_LINKS;

$html_js_show_ko_links = <<< HTML_JS_SHOW_KO_LINKS
$html_js_show_ko_links .= '		function show_ko_links(mode) {';
$html_js_show_ko_links .= '			ko_links = load_ko_links();';
$html_js_show_ko_links .= '			htmout_ko_links = "";';
$html_js_show_ko_links .= '			htmout_ko_linkz = "";';
$html_js_show_ko_links .= '			for (i = 0; i < ko_links.length; i++) {';
$html_js_show_ko_links .= '				my_btnimg = "./imgs/btn/koeye.png";';
$html_js_show_ko_links .= '				my_href = ko_links[i].split("|")[0];';
$html_js_show_ko_links .= '				my_popimg = ko_links[i].split("|")[1];';
$html_js_show_ko_links .= '				my_alt = ko_links[i].split("|")[2];';
$html_js_show_ko_links .= '';';
$html_js_show_ko_links .= '				htmout_ko_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';';
$html_js_show_ko_links .= '				htmout_ko_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';';
$html_js_show_ko_links .= '';
$html_js_show_ko_links .= '				htmout_ko_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';';
$html_js_show_ko_links .= '				htmout_ko_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';';
$html_js_show_ko_links .= '				htmout_ko_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';';
$html_js_show_ko_links .= '				}';
$html_js_show_ko_links .= '';
$html_js_show_ko_links .= '			if( mode === 'pop' ) {';
$html_js_show_ko_links .= '				htmout_ko_links += "<br><br>";';
$html_js_show_ko_links .= '				var div_ko_links = document.getElementById('div_ko_links');';
$html_js_show_ko_links .= '				div_ko_links.insertAdjacentHTML('beforeend', htmout_ko_links);';
$html_js_show_ko_links .= '				return( htmout_ko_links );';
$html_js_show_ko_links .= '				}';
$html_js_show_ko_links .= '';
$html_js_show_ko_links .= '			htmout_ko_linkz += "<br><br>";';
$html_js_show_ko_links .= '			var div_ko_linkz = document.getElementById('div_ko_linkz');';
$html_js_show_ko_links .= '			div_ko_linkz.insertAdjacentHTML('beforeend', htmout_ko_linkz);';
$html_js_show_ko_links .= '			return( htmout_ko_linkz );';
$html_js_show_ko_links .= '			}';
HTML_JS_SHOW_KO_LINKS;

$html_js_show_us_links = <<< HTML_JS_SHOW_US_LINKS
$html_js_show_us_links .= '		function show_us_links(mode) {';
$html_js_show_us_links .= '			us_links = load_us_links();';
$html_js_show_us_links .= '			htmout_us_links = "";';
$html_js_show_us_links .= '			htmout_us_linkz = "";';
$html_js_show_us_links .= '			for (i = 0; i < us_links.length; i++) {';
$html_js_show_us_links .= '				my_btnimg = "./imgs/btn/koeye.png";';
$html_js_show_us_links .= '				my_href = us_links[i].split("|")[0];';
$html_js_show_us_links .= '				my_popimg = us_links[i].split("|")[1];';
$html_js_show_us_links .= '				my_alt = us_links[i].split("|")[2];';
$html_js_show_us_links .= '';
$html_js_show_us_links .= '				htmout_us_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';';
$html_js_show_us_links .= '				htmout_us_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';';
$html_js_show_us_links .= '';
$html_js_show_us_links .= '				htmout_us_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';';
$html_js_show_us_links .= '				htmout_us_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';';
$html_js_show_us_links .= '				htmout_us_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';';
$html_js_show_us_links .= '				}';
$html_js_show_us_links .= '';
$html_js_show_us_links .= '			if( mode === 'pop' ) {';
$html_js_show_us_links .= '				htmout_us_links += "<br><br>";';
$html_js_show_us_links .= '				var div_us_links = document.getElementById('div_us_links');';
$html_js_show_us_links .= '				div_us_links.insertAdjacentHTML('beforeend', htmout_us_links);';
$html_js_show_us_links .= '				return( htmout_us_links );';
$html_js_show_us_links .= '				}';
$html_js_show_us_links .= '';
$html_js_show_us_links .= '			htmout_us_linkz += "<br><br>";';
$html_js_show_us_links .= '			var div_us_linkz = document.getElementById('div_us_linkz');';
$html_js_show_us_links .= '			div_us_linkz.insertAdjacentHTML('beforeend', htmout_us_linkz);';
$html_js_show_us_links .= '			return( htmout_us_linkz );';
$html_js_show_us_links .= '			}';
HTML_JS_SHOW_US_LINKS;



$html_js_show_u_links =  <<< HTML_JS_SHOW_U_LINKS

function show_u_links(mode) {';
u_links = load_u_links()';
htmout_u_links = ""';
htmout_u_linkz = ""';
for (i = 0; i < u_links.length; i++) {';
my_btnimg = "./imgs/btn/koeye.png";';
my_href = u_links[i].split("|")[0];';
my_popimg = u_links[i].split("|")[1];';
my_alt = u_links[i].split("|")[2];';
htmout_u_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
htmout_u_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
htmout_u_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
htmout_u_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
htmout_u_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';

if( mode === 'pop' ) {';
htmout_u_links += "<br><br>";';
var div_u_links = document.getElementById('div_u_links');';
div_u_links.insertAdjacentHTML('beforeend', htmout_u_links);';
return( htmout_u_links );';

htmout_u_linkz += "<br><br>";';
var div_u_linkz = document.getElementById('div_u_linkz');';
div_u_linkz.insertAdjacentHTML('beforeend', htmout_u_linkz);';
return( htmout_u_linkz );';


function show_now_links(mode) {';
now_links = load_now_links();';
htmout_now_links = "";';
htmout_now_linkz = "";';
for (i = 0; i < now_links.length; i++) {';
my_btnimg = "./imgs/btn/koeye.png";';
my_href = now_links[i].split("|")[0];';
my_popimg = now_links[i].split("|")[1];';
my_alt = now_links[i].split("|")[2];';
htmout_now_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';';
htmout_now_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';';
htmout_now_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';';
htmout_now_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';';
htmout_now_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';';

if( mode === 'pop' ) {';
htmout_now_links += "<br><br>";';
var div_now_links = document.getElementById('div_now_links');';
div_now_links.insertAdjacentHTML('beforeend', htmout_now_links);';
return( htmout_now_links );';

htmout_now_linkz += "<br><br>";';
var div_now_linkz = document.getElementById('div_now_linkz');';
div_now_linkz.insertAdjacentHTML('beforeend', htmout_now_linkz);';
return( htmout_now_linkz );';

function show_srv_links(mode) {';
srv_links = load_srv_links();';
htmout_srv_links = "";';
htmout_srv_linkz = "";';
for (i = 0; i < srv_links.length; i++) {';
my_btnimg = "./imgs/btn/kiw.png";';
my_href = srv_links[i].split("|")[0];';
my_popimg = srv_links[i].split("|")[1];';
my_alt = srv_links[i].split("|")[2];';
htmout_srv_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';';
htmout_srv_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';';
htmout_srv_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';';
htmout_srv_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';';
htmout_srv_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';';

if( mode === 'pop' ) {';
htmout_srv_links += "<br><br>\n"';
var div_srv_links = document.getElementById('div_srv_links');';
div_srv_links.insertAdjacentHTML('beforeend', htmout_srv_links);';
return( htmout_srv_links );';

htmout_srv_linkz += "<br><br>\n"';
var div_srv_linkz = document.getElementById('div_srv_linkz');';
div_srv_linkz.insertAdjacentHTML('beforeend', htmout_srv_linkz);';
return( htmout_srv_linkz );';

document.write( htmout_svc_links );';
html_js_show_u_links .= '			document.write( htmout_ko_links );';
document.write( htmout_srv_links );';
var div_ko_links = document.getElementById("div_ko_links");';
var div_ko_links_orig = div_ko_links.innerHTML;';
alert( "BUGS_500 div_ko_links_orig="+div_ko_links_orig );';
div_ko_links.innerHTML = "";';
div_ko_links.appendChild( htmout_ko_links);';

pqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpq';
HTML_JS_SHOW_U_LINKS;





	$html_links .= $html_js_load_svc_links;
	$html_links .= $html_js_load_view_links;
	$html_links .= $html_js_load_ko_links;
	$html_links .= $html_js_load_us_links;
	$html_links .= $html_js_load_now_links;
	$html_links .= $html_js_load_u_links;

	$html_links .= $html_js_show_svc_links;
	$html_links .= $html_js_show_view_links;
	$html_links .= $html_js_show_ko_links;
	$html_links .= $html_js_show_us_links;
	$html_links .= $html_js_show_now_links;
	$html_links .= $html_js_show_u_links;


	$html_ko_links .= $html_ko_srv_links;
	$html_ko_links .= $html_ko_linkz;
	return($html_ko_links);
	}


function html_js_load_lists($ko_view) {

	$html_js_load_avlist = '';
	$html_js_load_avglist = '';
	$html_js_load_ddlist = '';
	$html_js_load_pnlist = '';
	$html_js_load_sllist = '';
	$html_js_load_tllist = '';
	$html_js_load_zmlist = '';

	if( $ko_view == "av" ) {
		$html_js_load_avlist .= '		function load_avlist() {';
		$html_js_load_avlist .= '			var j=0;';
		$html_js_load_avlist .= '			avlist[j++]="http://ka1_party.html|./imgs/us/lawdonovan.png|law_donovan|./imgs/btn/koeye.png|law";';
		$html_js_load_avlist .= '			avlist[j++]="http://ka1_jtfdc.com/|./imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|./imgs/btn/koeye.png|law";';
		$html_js_load_avlist .= '			avlist[j++]="http://ka1_jtfdcr.com/|./imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|./imgs/btn/koeye.png|law";
		$html_js_load_avlist .= js_load_list( $dbfile, $ko_view );';
		$html_js_load_avlist .= '			return( avlist );';
		$html_js_load_avlist .= '			}';
		return( $html_js_load_avlist );
		}


	if( $ko_view == "avg" ) {
		$html_js_load_avglist .= '		function load_avglist() {';
		$html_js_load_avglist .= '			var j=0;';
		$html_js_load_avglist .= '			avglist[j++]="http://ka1_party.html|./imgs/us/lawdonovan.png|law_donovan|./imgs/btn/koeye.png|law";';
		$html_js_load_avglist .= '			avglist[j++]="http://ka1_jtfdc.com/|./imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|./imgs/btn/koeye.png|law";';
		$html_js_load_avglist .= '			avglist[j++]="http://ka1_jtfdcr.com/|./imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|./imgs/btn/koeye.png|law";
		$html_js_load_avglist .= js_load_list( $dbfile, $ko_view );';
		$html_js_load_avglist .= '			return( avglist );';
		$html_js_load_avglist .= '			}';
		return( $html_js_load_avglist );
		}


	if( $ko_view == "dd" ) {
		$html_js_load_ddlist .= '		function load_ddlist() {';
		$html_js_load_ddlist .= '			var j=0;';
		$html_js_load_ddlist .= '			ddlist[j++]="http://ka1_party.html|./imgs/us/lawdonovan.png|law_donovan|./imgs/btn/koeye.png|law";';
		$html_js_load_ddlist .= '			ddlist[j++]="http://ka1_jtfdc.com/|./imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|./imgs/btn/koeye.png|law";';
		$html_js_load_ddlist .= '			ddlist[j++]="http://ka1_jtfdcr.com/|./imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|./imgs/btn/koeye.png|law";
		$html_js_load_ddlist .= js_load_list( $dbfile, $ko_view );';
		$html_js_load_ddlist .= '			return( ddlist );';
		$html_js_load_ddlist .= '			}';
		return( $html_js_load_ddlist );
		}


	if( $ko_view == "pn" ) {
		$html_js_load_pnlist .= '		function load_pnlist() {';
		$html_js_load_pnlist .= '			var j=0;';
		$html_js_load_pnlist .= '			pnlist[j++]="http://ka1_party.html|./imgs/us/lawdonovan.png|law_donovan|./imgs/btn/koeye.png|law";';
		$html_js_load_pnlist .= '			pnlist[j++]="http://ka1_jtfdc.com/|./imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|./imgs/btn/koeye.png|law";';
		$html_js_load_pnlist .= '			pnlist[j++]="http://ka1_jtfdcr.com/|./imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|./imgs/btn/koeye.png|law";
		$html_js_load_pnlist .= js_load_list( $dbfile, $ko_view );';
		$html_js_load_pnlist .= '			return( pnlist );';
		$html_js_load_pnlist .= '			}';
		return( $html_js_load_pnlist );
		}


	if( $ko_view == "sl" ) {
		$html_js_load_sllist .= '		function load_sllist() {';
		$html_js_load_sllist .= '			var j=0;';
		$html_js_load_sllist .= '			sllist[j++]="http://ka1_party.html|./imgs/us/lawdonovan.png|law_donovan|./imgs/btn/koeye.png|law";';
		$html_js_load_sllist .= '			sllist[j++]="http://ka1_jtfdc.com/|./imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|./imgs/btn/koeye.png|law";';
		$html_js_load_sllist .= '			sllist[j++]="http://ka1_jtfdcr.com/|./imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|./imgs/btn/koeye.png|law";
		$html_js_load_sllist .= js_load_list( $dbfile, $ko_view );';
		$html_js_load_sllist .= '			return( sllist );';
		$html_js_load_sllist .= '			}';
		return( $html_js_load_sllist );
		}


	if( $ko_view == "tl" ) {
		$html_js_load_tllist .= '		function load_tllist() {';
		$html_js_load_tllist .= '			var j=0;';
		$html_js_load_tllist .= '			tllist[j++]="http://ka1_party.html|./imgs/us/lawdonovan.png|law_donovan|./imgs/btn/koeye.png|law";';
		$html_js_load_tllist .= '			tllist[j++]="http://ka1_jtfdc.com/|./imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|./imgs/btn/koeye.png|law";';
		$html_js_load_tllist .= '			tllist[j++]="http://ka1_jtfdcr.com/|./imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|./imgs/btn/koeye.png|law";
		$html_js_load_tllist .= js_load_list( $dbfile, $ko_view );';
		$html_js_load_tllist .= '			return( tllist );';
		$html_js_load_tllist .= '			}';
		return( $html_js_load_tllist );
		}

	if( $ko_view == "zm" ) {
		$html_js_load_zmlist .= '		function load_zmlist() {';
		$html_js_load_zmlist .= '			var j=0;';
		$html_js_load_zmlist .= '			zmlist[j++]="http://ka1_party.html|./imgs/us/lawdonovan.png|law_donovan|./imgs/btn/koeye.png|law";';
		$html_js_load_zmlist .= '			zmlist[j++]="http://ka1_jtfdc.com/|./imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|./imgs/btn/koeye.png|law";';
		$html_js_load_zmlist .= '			zmlist[j++]="http://ka1_jtfdcr.com/|./imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|./imgs/btn/koeye.png|law";
		$html_js_load_zmlist .= js_load_list( $dbfile, $ko_view );';
		$html_js_load_zmlist .= '			return( zmlist );';
		$html_js_load_zmlist .= '			}';
		return( $html_js_load_zmlist );
		}
	}




function js_load_list($dbfile, $ko_view) {
	$dbfile="ka1.db3";
	$js_load_list="";
	$dbtable=$ko_view;
	$sql_sel_list="select * from $dbtable";

	if( file_exists( $dbfile )) {
		$pdo = newpdo($dbtable);
//		$result = $stmg->fetch(PDO::FETCH_ASSOC);
		foreach( $pdo->query($sql_sel_list) as $row ) {
			$js_load_list .= $row[0];
			$code=$row['code'];
			$js_load_lost .= $code;
#			$output .= "<td>$rpt_ip - $remote_addr</td>\n";

#			if( preg_match( "/$remote_addr/", $koye_ip, $matches)) {
#				$GLOBALS['allowflag']=$koye_ip;
#				}	
			}
		$pdo = null;
		}
#
	return( $js_load_list );
	}

function bd3_test() {
//	$pdo = newpdo( bd3(0) );
	$dbfile="ka1.db3";
//	$dbfile=base64_decode(bd3(0));
//	$dbfile=bd3(0);
	$sql="select * from tl";
	$pdo = newpdo($dbfile);
//	$pdo = new PDO("memory:$dbfile" );
	$j=0;
	foreach( $pdo->query($sql) as $row ) {
		$j++;
		$args = explode( '|', $row[$j] );
		var_dump( $row );
		print( "BUGS_26200 j="+$j+" a0="+$args[0]+" a1="+$args[1] );
		}
	$pdo = null;
	}


function bd3($ko_num) {
	$bd3 = array();
	$bd3[0] = "bd3_0";
	return($bd3[$ko_num]);
	}


function main_ka1() {
	$ko_host="ka1";
	$GLOBALS['host'] = $ko_host;
	$GLOBALS['progid']="ka1";
	$GLOBALS['dbfile']="ka1.db3";
	$GLOBALS['dbtable']="tl";
	$GLOBALS['log_dbfile'] = "ka1_log.db3";
	$GLOBALS['log_dbtable'] = "log";
	$GLOBALS['cfg_dbfile'] = $GLOBALS['dbfile'];
	$GLOBALS['cfg_dbtable'] = "cfg";
	$GLOBALS['font-style'] = 'yokkmokk';
	$GLOBALS['background-color'] = "ivory";
	$GLOBALS['color'] = "darkslategrey";
	$GLOBALS['background-color'] = "darkslategrey";
	$GLOBALS['color'] = "ivory";
	$php_self=$_SERVER['PHP_SELF'];
	$user_agent=$_SERVER['HTTP_USER_AGENT'];
#	$referer=$_SERVER['HTTP_REFERER'];
	$remote_addr=$_SERVER['REMOTE_ADDR'];
	$query_string=$_SERVER['QUERY_STRING'];

	$timezone_identifier="America/Denver";
	date_default_timezone_set( $timezone_identifier );
	$dttm=date('Y,m,d_H:i:s');

	$progid=$GLOBALS['progid'];
	$dbfile=$GLOBALS['dbfile'];
	$dbtable=$GLOBALS['dbtable'];
	$log_dbfile=$GLOBALS['log_dbfile'];
	$log_dbtable=$GLOBALS['log_dbtable'];
	$cfg_dbfile=$GLOBALS['cfg_dbfile'];
	$cfg_dbtable=$GLOBALS['cfg_dbtable'];

	$ko_view="";
	$ko_code="";
	$ko_fmt="";
	$ko_num="";
	$ko_file="";

	if( isset( $_GET['v'] )) { $ko_view=$_GET['v']; }
	if( isset( $_GET['view'] )) { $ko_view=$_GET['view']; }
	if( isset( $_GET['k'] )) { $ko_code=$_GET['k']; }
	if( isset( $_GET['ko'] )) { $ko_code=$_GET['ko']; }
	if( isset( $_GET['kode'] )) { $ko_code=$_GET['kode']; }
	if( isset( $_GET['c'] )) { $ko_code=$_GET['c']; }
	if( isset( $_GET['co'] )) { $ko_code=$_GET['co']; }
	if( isset( $_GET['code'] )) { $ko_code=$_GET['code']; }

	if( isset( $_GET['f'] )) { $ko_fmt=$_GET['f']; }
	if( isset( $_GET['fmt'] )) { $ko_fmt=$_GET['fmt']; }

	if( isset( $_GET['i'] )) { $ko_num=$_GET['i']; }
	if( isset( $_GET['j'] )) { $ko_num=$_GET['j']; }
	if( isset( $_GET['n'] )) { $ko_num=$_GET['n']; }
	if( isset( $_GET['num'] )) { $ko_num=$_GET['num']; }
	if( isset( $_GET['idx'] )) { $ko_num=$_GET['idx']; }

	
	$arqs=array();
	if( isset( $_GET['q'] )) { 
		$arqs=explode(",", $_GET['q']); 
		if( isset( $arqs[0] )) { $ko_view=$arqs[0]; }
		if( isset( $arqs[1] )) { $ko_code=$arqs[1]; }
		if( isset( $arqs[2] )) { $ko_fmt=$arqs[2]; }
		if( isset( $arqs[3] )) { $ko_num=$arqs[3]; }
		}
	$args=array();
	if( isset( $_GET['a'] )) { 
		$args=explode(",", $_GET['a']); 
		if( isset( $args[0] )) { $ko_view=$args[0]; }
		if( isset( $args[1] )) { $ko_code=$args[1]; }
		if( isset( $args[2] )) { $ko_fmt=$args[2]; }
		if( isset( $args[3] )) { $ko_num=$args[3]; }
		}

	if( file_exists( $ko_num )) {$ko_file=$ko_num; $ko_num="";}
	$logtext="$progid $dttm $php_self jjjjjjjj test_tl logtext kkkkkkkkk";
	$cfgtext="cfgtext,a,b,c,0,1,2;cfgtext1,a1,b1,c1,789";



	print( "main_ka1 MSG_26501 ko_view=$ko_view <br> " );
	print( "main_ka1 MSG_26502 ko_code=$ko_code <br> " );
	print( "main_ka1 MSG_26503 ko_fmt=$ko_fmt <br> " );
	print( "main_ka1 MSG_26504 ko_num=$ko_num <br> " );


	if( $ko_view != "" ) {
		$ifile="index_".$ko_view.".html";
		if( file_exists( $ifile )) {
			$ko_io = ko_io( $ifile );
			print( $ko_io );
			}
		else {
			$ko_io = ko_io( "index.html" );
			}
		}


	$htmout = ko_io( "kog.html" );
	print($htmout);
	exit();



	$html_ka1=html_ka1($ko_host, $dbfile, $ko_code,$ko_fmt);
	read_htmlfile($htmlfile); 
	print( $html_ka1 );

	exit;
	$ko_io_match = ko_io_match($ifile, $ofile, $match_beg, $match_end, $idata );
	print( $ko_io_match );

	sql_drop_table( $log_dbfile, "log" );
	sql_cr_log( $log_dbfile, $log_dbtable, $logtext );

	sql_drop_table( $cfg_dbfile, "cfg" );
	sql_cr_cfg( $cfg_dbfile, $cfg_dbtable, $cfgtext );


	$ifile="index_tl.html";
	$ofile="index_tl_new.html";
	$match_beg=""; $match_end=""; $idata=""; $ilines=""; $iline="";
	if( $ko_view == "go" ) { $tl_testdata=tl_testdata(); exit; }
#	if( file_exists( $ko_num )) { $ko_file=$ko_num; $ko_num=""; }


	exit;

#	$html_index=html_index($kode,$fmt);
	exit;

#	tl_testdata($dbfile, $dbtable);

	}

function read_htmlfile($htmlfile) {
	$htmout="";
	$file = $htmlfile;
	$f = fopen($file, "r");
	while ( $line = fgets($f, 1000) ) {
		$htmout .= $line;
		}
	return($htmout);
	}



function main_tl() {
	$GLOBALS['progid']="test_tl";
	$GLOBALS['dbfile']="ka1.db3";
	$GLOBALS['dbtable']="tl";
	$GLOBALS['log_dbfile'] = "ka1_log.db3";
	$GLOBALS['log_dbtable'] = "log";
	$GLOBALS['cfg_dbfile'] = $GLOBALS['dbfile'];
	$GLOBALS['cfg_dbtable'] = "cfg";
	$php_self=$_SERVER['PHP_SELF'];
	$user_agent=$_SERVER['HTTP_USER_AGENT'];
#	$referer=$_SERVER['HTTP_REFERER'];
	$remote_addr=$_SERVER['REMOTE_ADDR'];
	$query_string=$_SERVER['QUERY_STRING'];

	$timezone_identifier="America/Denver";
	date_default_timezone_set( $timezone_identifier );
	$dttm=date('Y,m,d_H:i:s');

	$progid=$GLOBALS['progid'];
	$dbfile=$GLOBALS['dbfile'];
	$dbtable=$GLOBALS['dbtable'];
	$log_dbfile=$GLOBALS['log_dbfile'];
	$log_dbtable=$GLOBALS['log_dbtable'];
	$cfg_dbfile=$GLOBALS['cfg_dbfile'];
	$cfg_dbtable=$GLOBALS['cfg_dbtable'];

	$ko_view="";
	$ko_code="";
	$ko_fmt="";
	$ko_num="";
	$ko_file="";

	if( isset( $_GET['v'] )) { $ko_view=$_GET['v']; }
	if( isset( $_GET['view'] )) { $ko_view=$_GET['view']; }
	if( isset( $_GET['k'] )) { $ko_code=$_GET['k']; }
	if( isset( $_GET['ko'] )) { $ko_code=$_GET['ko']; }
	if( isset( $_GET['kode'] )) { $ko_code=$_GET['kode']; }
	if( isset( $_GET['c'] )) { $ko_code=$_GET['c']; }
	if( isset( $_GET['co'] )) { $ko_code=$_GET['co']; }
	if( isset( $_GET['code'] )) { $ko_code=$_GET['code']; }

	if( isset( $_GET['f'] )) { $ko_fmt=$_GET['f']; }
	if( isset( $_GET['fmt'] )) { $ko_fmt=$_GET['fmt']; }

	if( isset( $_GET['i'] )) { $ko_num=$_GET['i']; }
	if( isset( $_GET['j'] )) { $ko_num=$_GET['j']; }
	if( isset( $_GET['n'] )) { $ko_num=$_GET['n']; }
	if( isset( $_GET['num'] )) { $ko_num=$_GET['num']; }
	if( isset( $_GET['idx'] )) { $ko_num=$_GET['idx']; }

	
	$arqs=array();
	if( isset( $_GET['q'] )) { 
		$arqs=explode(",", $_GET['q']); 
		$ko_view=$arqs[0];
		$ko_code=$arqs[1];
		$ko_fmt=$arqs[2];
		$ko_num=$arqs[3];
		}
	$args=array();
	if( isset( $_GET['a'] )) { 
		$args=explode(",", $_GET['a']); 
		$ko_view=$args[0];
		$ko_code=$args[1];
		$ko_fmt=$args[2];
		$ko_num=$args[3];
		}
	if( file_exists( $ko_num )) {$ko_file=$ko_num; $ko_num="";}

#	tl_testdata($dbfile, $dbtable);
	$logtext="$progid $dttm $php_self jjjjjjjj test_tl logtext kkkkkkkkk";
	$cfgtext="cfgtext,a,b,c,0,1,2;cfgtext1,a1,b1,c1,789";


	sql_drop_table( $log_dbfile, "log" );
	sql_cr_log( $log_dbfile, $log_dbtable, $logtext );

	sql_drop_table( $cfg_dbfile, "cfg" );
	sql_cr_cfg( $cfg_dbfile, $cfg_dbtable, $cfgtext );


	$ifile="index_tl.html";
	$ofile="index_tl_new.html";
	$match_beg=""; $match_end=""; $idata=""; $ilines=""; $iline="";

	$ko_view="";
	$ko_code="";
	$ko_fmt="";
	$ko_num="";
	$ko_file="";



	if( isset( $_GET['v'] )) { $ko_view=$_GET['v']; }
	if( isset( $_GET['view'] )) { $ko_view=$_GET['view']; }
	if( isset( $_GET['c'] )) { $ko_code=$_GET['c']; }
	if( isset( $_GET['co'] )) { $ko_code=$_GET['co']; }
	if( isset( $_GET['code'] )) { $ko_code=$_GET['code']; }
	if( isset( $_GET['k'] )) { $ko_code=$_GET['k']; }
	if( isset( $_GET['ko'] )) { $ko_code=$_GET['ko']; }
	if( isset( $_GET['kode'] )) { $ko_code=$_GET['kode']; }

	if( isset( $_GET['n'] )) { $ko_num=$_GET['n']; }
	if( isset( $_GET['i'] )) { $ko_num=$_GET['i']; }
	if( isset( $_GET['j'] )) { $ko_num=$_GET['j']; }
	if( isset( $_GET['num'] )) { $ko_num=$_GET['num']; }
	if( isset( $_GET['idx'] )) { $ko_num=$_GET['idx']; }
	if( isset( $_GET['file'] )) { $ko_file=$_GET['file']; }

	if( isset( $_GET['q'] )) {
		$arqs=explode(",",$_GET['q']);	
		$ko_view=$arqs[0];
		$ko_code=$arqs[1];
		$ko_fmt=$argq[2];
		$ko_num=$arqs[3];
		$ko_file=$arqs[3];
		}

	if( isset( $_GET['a'] )) {
		$args=explode(",",$_GET['a']);	
		$ko_view=$args[0];
		$ko_code=$args[1];
		$ko_fmt=$args[2];
		$ko_num=$args[3];
		$ko_file=$args[3];
		}

	if( $ko_view == "go" ) { 
		$tl_testdata=tl_testdata(); exit; 
		}




#	if( file_exists( $ko_num )) { $ko_file=$ko_num; $ko_num=""; }

	print( "main_ka1 BUGS_26315 ko_view=$ko_view <br> " );
	print( "main_ka1 BUGS_26315 ko_code=$ko_code <br> " );
	print( "main_ka1 BUGS_26315 ko_fmt=$ko_fmt <br> " );
	print( "main_ka1 BUGS_26315 ko_num=$ko_num <br> " );
	$ifile="index_".$ko_view.".html";
	if( file_exists( $ifile )) {
		$ko_io = ko_io( $ifile );
		print( $ko_io );
		}
	else {
		$ko_io = ko_io( "index.html" );
		}

	exit;
	$ko_io_match = ko_io_match($ifile, $ofile, $match_beg, $match_end, $idata );
	print( $ko_io_match );
	exit;

#	$html_index=html_index($kode,$fmt);


	$ifile="index_tl.html";
	$ofile="index_tl_new.html";
	$match_beg="";
	$match_end="";
	$idata="";
	print( $html_index );
	exit;

	$tls = array();
	$tlsa = array();
	$kode="tl_index"; $fmt="json";

	$tls['tl_ko'] = json_tl_ko($kode,"tl_ko");
	$tls['tl_konet'] = json_tl_konet($kode,"tl_konet");
	$tls['tl_index'] = json_tl_index( $kode, $fmt );
	$tls['tl_ko1'] = json_tl_ko1($kode,"tl_ko1");
	print( $tls['tl_ko1'] );
#	print( $tls['tl_ko1'] );



	$tlsa['tl_ko'] = json_decode( $tls['tl_ko'] );
	$tlsa['tl_konet'] = json_decode( $tls['tl_konet'] );


#	$tls['$kode'] = ko_tl_data("$kode","$fmt");l
#	$tls['tldata_tl_konet'] = ko_tl_data("tl_konet","json");
#	$tlsa['tldata_tl_konet'] = json_decode( $tls['tldata_tl_konet'] );

#	print( "<h1>tls tldata_tl_konet</h1>" );
#	print( $tls['tldata_tl_konet'] );
#	print( "<h1>tlsa tldata_tl_konet</h1>" );
#	var_dump( $tlsa['tldata_tl_konet'] );

#	print( "<h1>tls index json_tl_index</h1>" );
	print( $tls['index'] );
	exit;

#	$kode="tl_index"; $fmt="json";
#	$tls['tl_index'] = json_tl_index( $kode, $fmt );
#	print( "<h1>tls tl_index json_tl_index</h1>" );
#	print( $tls['tldata_tl_konet'] );

#	print( "<h1>tls_json_tl_konet</h1>" );
#	print( $tls['json_tl_konet'] );


	$tlsa['tl_ko'] = json_decode( $tls['tl_ko'] );
	$tlsa['tl_konet'] = json_decode( $tls['tl_konet'] );

#	print( "<h1>tlsa_tl_ko</h1>" );
#	var_dump( $tlsa['tl_ko'] );
#	print( "<h1>tlsa_tl_konet</h1>" );
#	var_dump( $tlsa['tl_konet'] );
	exit;

	print( "test_tl.php kode=$kode fmt=$fmt tlsa_tl_ko=".$tlsa['tl_ko']."<br>" );	
	print( "test_tl.php kode=$kode fmt=$fmt tlsa_tl_konet=".$tlsa['tl_konet']."<br>" );	
	print( "test_tl.php kode=$kode fmt=$fmt tlsa_tl_konet=".$tlsa[$kode]."<br>" );	


#	$json_tl_ko=json_tl_ko($kode,$fmt);
#	print( $json_tl_ko);
	exit;


	if( $kode == "tl_ko" ) {
		$json_tl_ko=json_tl_ko($kode,$fmt);
		print( $json_tl_ko);
		exit;
		}
	if( $kode == "tl_konet" ) {
		$json_tl_konet=json_tl_konet($kode,$fmt);
		print( $json_tl_konet );
		exit;
		}

	$html_tl=html_tl();
	print( $html_tl );
	exit;


	$ko_tl_data=ko_tl_data($kode,$fmt);
	print( "$ko_tl_data" );
	}

function ko_io($ifile) {
	$fpi = fopen( $ifile, 'r' );
	$olines="";
	while( $bigline = fread($fpi, 1024)) { 
		$ilines = explode("\n", $bigline );
			for( $j=0; $j < count($ilines); $j++ ) {
				$iline=$ilines[$j];
				$olines.=$iline;
#				print($iline);
				}
			}
		fclose( $fpi );
	return( $olines );
	}


function ko_tl_data($kode,$fmt) {
#	$dbfile=$GLOBALS['dbfile'];
	$dbfile="ka1.db3";
	$ko_tl_data="";
	$j=0;

	$dttm=date('Y,m,d_H:i:s');
	$tl_begdt=date('Y,m,d');
#	print( "ko_tl_data $dttm BUGS_16820: kode=$kode fmt=$fmt<br>" );

	$sql_sel_tls="select tlid from tl group by tlid";
        $pdo = newpdo($dbfile);
	$result = $pdo->query($sql_sel_tls);
#	print( "ko_tl_data ROWS_50 dbfile=$dbfile j=$j sql_sel_tls=$sql_sel_tls <br>" );
	$idx=0;
	$findflag="";
	$html_tl_links="";
	while( $row = $result->fetch(\PDO::FETCH_ASSOC )) {
#		$idx=$row['idx'];
		$j=$j+1;
		$tlid=$row['tlid'];

		$html_tl_links .= '<a href="/test_tl.php?q=tl&k='.$tlid.'&json&a=tl,'.$tlid.',json" target=_blank>';
		$html_tl_links .= '	<img src="/imgs/btn/koeye.png" height=20 border=0>';
		$html_tl_links .= '- '.$tlid.' -</a><br>';

		print( "ko_tl_data ROWS_100 j=$j kode=$kode tlid=$tlid" );
#		print( "ko_tl_data SQL sql_sel_tls=$sql_sel_tls <br>" );
		if( $kode == $row['tlid'] ) {
			$findflag=$row['tlid'];
#			print( "ko_tl_data FOUND_101 j=$j kode=$kode tlid=$tlid sql_sel_tls=$sql_sel_tls <br>" );
			break;
			}
		$keys = array_keys($row);
		}
	if( $findflag=="" ) {
		print( "BUGS_110 NOTFOUND kode=$kode<br>" );
		print( "<h1>html_tl_links</h1>" );
		print( $html_tl_links );
		return( $html_tl_links );
		}
	
	$ko_tl_data="";
	$ko_tl_data .= '{';
	$ko_tl_data .= '"timeline": {';
	$ko_tl_data .= '	"headline":"main timeline headline:  ka10/tl/tl.json $dttm ",';
	$ko_tl_data .= '	"type":"default",';
	$ko_tl_data .= '	"text":"header_text header_text header_text",';
	$ko_tl_data .= '	"startDate":"'.$tl_begdt.'",';
	$ko_tl_data .= '	"date": [';

	$tl_array_hdr  ="";
	$tl_array_hdr .= '{';
	$tl_array_hdr .= '"timeline": {';
	$tl_array_hdr .= '	"headline":"main timeline headline:  ka10/tl/tl.json $dttm ",';
	$tl_array_hdr .= '	"type":"default",';
	$tl_array_hdr .= '	"text":"header_text header_text header_text",';
	$tl_array_hdr .= '	"startDate":"'.$tl_begdt.'",';
	$tl_array_hdr .= '	"date": [';

	$tl_array_ftr  ="]}}";

	if( $kode != "" ) {
		$sql_sel_tls="select * from tl where tlid like '$kode%'";
		}
	else {
		$sql_sel_tls="select * from tl";
		}

#	print( "BUGS_50 sql_sel_tls=$sql_sel_tls dbfile=$dbfile<br>" );
	$j=0;

#	$sql_sel_tls="select * from tl ";

	$dbfile="ka1.db3";
        $pdo = newpdo($dbfile);
	$result = $pdo->query($sql_sel_tls);
#	print( "ko_tl_data ROWS_70 dbfile=$dbfile j=$j sql_sel_tls=$sql_sel_tls <br>" );
	$idx=0;
	while( $row = $result->fetch(\PDO::FETCH_ASSOC )) {
#		$idx=$row['idx'];
		$j=$j+1;
		$tlid=$row['tlid'];
#		print( "ko_tl_data ROWS_60 j=$j tlid=$tlid sql_sel_tls=$sql_sel_tls<br>" );
#		$keys = array_keys($row);
#		print( "KEYS_80 j=$j " );
#		print_r( $keys );
		$tl_psvs[$j] = "";


		$id=$row['id'];
		$status=$row['status'];
		$dttm=$row['dttm'];
		$code=$row['code'];
		$grp=$row['grp'];
		$idx=$row['idx'];
		$tlid=$row['tlid'];
		$title=$row['title'];

		$begdt=$row['begdt'];
		$enddt=$row['enddt'];
		$head=$row['head'];
		$text=$row['text'];
		$text="text text text";
		$media=$row['media'];
		$caption=$row['caption'];
		$tn=$row['tn'];
		$credit=$row['credit'];

		$e_begdt=$row['e_begdt'];
		$e_enddt=$row['e_enddt'];
		$e_head=$row['e_head'];
		$e_tag=$row['e_tag'];

		$c_begdt=$row['c_begdt'];
		$c_enddt=$row['c_enddt'];
		$c_head=$row['c_head'];
		$c_val=$row['c_val'];
		$desc=$row['desc'];
		$b64=$row['b64'];

		$ko_tl_psv	="";
		$ko_tl_psv .= "$id|$status|$dttm|$code|$grp|$idx|$tlid|$title$j|";
		$ko_tl_psv .= "$begdt|$enddt|$head$j|$media$j|$tn$j|$credit$j|$caption$j|";
		$ko_tl_psv .= "$e_begdt|$e_enddt|$e_head$j|$e_tag$j|";
		$ko_tl_psv .= "$c_begdt|$c_enddt|$c_head$j|$c_val$j|";
		$ko_tl_psv .= "$desc$j|$b64";


		$tag=$e_tag;
		$ko_tl_data .= '		{';
		$ko_tl_data .= '		"startDate":"'.$begdt.'",';
		$ko_tl_data .= '		"endDate":"'.$enddt.'",';
		$ko_tl_data .= '		"headline":"'.$head.'_'.$j.'",';
		$ko_tl_data .= '		"text":"'.$text.'_'.$j.'",';
		$ko_tl_data .= '		"tag":"'.$tag.'_'.$j.'",';
		$ko_tl_data .= '		"asset": {';
		$ko_tl_data .= '			"media":"'.$media.'",';
		$ko_tl_data .= '			"thumbnail":"'.$tn.'",';
		$ko_tl_data .= '			"credit":"'.$credit.'_'.$j.'",';
		$ko_tl_data .= '			"caption":"'.$caption.'_'.$j.'"';
		$ko_tl_data .= '			} ';
		$ko_tl_data .= '		} ';

		$ko_tl_data .= '		],';
		$ko_tl_data .= '	"era": [';
		$ko_tl_data .= '		{';
		$ko_tl_data .= '		"startDate":"'.$e_begdt.'",';
		$ko_tl_data .= '		"endDate":"'.$e_enddt.'",';
		$ko_tl_data .= '		"headline":"'.$e_head.'",';
		$ko_tl_data .= '		"tag":"'.$e_tag.'"';
		$ko_tl_data .= '		}';
		$ko_tl_data .= '		],';
		$ko_tl_data .= '	"chart": [';
		$ko_tl_data .= '		{';
		$ko_tl_data .= '		"startDate":"'.$c_begdt.'",';
		$ko_tl_data .= '		"endDate":"'.$c_enddt.'",';
		$ko_tl_data .= '		"headline":"'.$c_head.'",';
		$ko_tl_data .= '		"value":"'.$c_val.'"';
		$ko_tl_data .= '		},';

		$tag=$e_tag;


		$tl_array = array();
		$tl_array_asset = array();
		$tl_array_era = array();
		$tl_array_chart = array();

		$tl_array = array(
			"startDate" 	=> $begdt,
			"endDate"	=> $enddt,
			"headline"	=> $head,
			"text"		=> $text,
			"tag"		=> $tag,
			"asset" 	=> array(
				"media"		=> $media,
				"thumbnail"	=> $tn,
				"credit"	=> $credit,
				"caption"	=> $caption,
				"media"		=> $media
				),
			"era"		=> array(
				"startDate" 	=> $e_begdt,
				"endDate"	=> $e_enddt,
				"headline"	=> $e_head,
				"tag"		=> $e_tag
				),
			"char"		=> array(
				"startDate" 	=> $c_begdt,
				"endDate"	=> $c_enddt,
				"headline"	=> $c_head,
				"value"		=> $c_val
				)
			);	

#		print( "ko_tl_data MSG_2790 $j ko_tl_data=$ko_tl_data <br>" );
		}

	$tl_array_ftr = "";
#	$tl_array_ftr .= '		}';
	$tl_array_ftr .= '		]';
	$tl_array_ftr .= '	}';
	$tl_array_ftr .= '}';

#	$ko_tl_data .= '		}';
	$ko_tl_data .= '		]';
	$ko_tl_data .= '	}';
	$ko_tl_data .= '}';

#	$tl_array=array();
#	print_r( $tl_array );

	$tl_array_json="";
#	$tl_array_json .= $tl_array_hdr;
#	print( "BUGS_201 tl_array_json=$tl_array_json<br>" );

	$tl_array_json .= json_encode($tl_array);
#	print( "BUGS_202 tl_array_json=$tl_array_json<br>" );

#	$tl_array_json .= $tl_array_ftr;
#	print( "BUGS_203 tl_array_json=$tl_array_json<br>" );

#	print( "BUGS_231 tl_array_ftr=".$tl_array_ftr."<br>" );
	print( $tl_array_hdr );
	print( $tl_array_json );
	print( $tl_array_ftr );
#	print( "<br>BUGS_235 tl_array_ftr=".$tl_array_ftr."<br>" );
	return( $tl_array_json );

	if( $fmt == "b64" ) { return( base64_encode( $ko_tl_data ));}
	if( $fmt == "jsn" ) { return( json_encode( $tl_array ));}
	if( $fmt == "psv" ) { return( $ko_tl_psv ); }
	if( $fmt == "csv" ) { return( str_replace( "|", ",", $ko_tl_psv )); }
	if( $fmt == "htm" ) { 
		$ko_tl_html = $html_tl($ko_tl_data );
		return( $ko_tl_html ); 
		}
	return($ko_tl_data);

#	print( "ko_tl_data MSG_2800 JSON ko_tl_data=$ko_tl_data <br>" );
#	print( "ko_tl_data MSG_2800 PSV  tl_psv=$tl_psv <br>" );
	}

function newpdo_tl( $dbfile ) {
        $php_self=$_SERVER['PHP_SELF'];
        $http_host=$_SERVER['HTTP_HOST'];
        $request_uri=$_SERVER['REQUEST_URI'];
	$GLOBALS['install'] = true;
	if( ! file_exists( $dbfile )) {
		print( "$php_self newpdo ERR_3979:  NOT_EXISTS dbfile=[$dbfile]<br>\n" );
		if( $GLOBALS['install'] != true ) {
			print( "$php_self newpdo ERR:  NOT_INSTALL dbfile=[$dbfile]<br>\n" );
			return;
			}
		else {
			print( "$php_self newpdo MSG:  CREATE dbfile=[$dbfile]<br>\n" );
			}
		}

	try {
		$pdo = null;
		$pdo = new PDO("sqlite:$dbfile" );
		$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//		$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
//		$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
		
		if( $pdo == null ) {
			print( "$php_self newpdo ERR:   dbfile=[$dbfile]<br>\n" );
			return $pdo;
			}
		return $pdo;
		}


	catch(PDOException $e ) {
		$errmsg = $e->getMessage();
		print( "$php_self newpdo ERR:  pdo=[$pdo] dbfile=[$dbfile] errmsg=[$errmsg]<br>\n" );
		$pdo = null;
		return $pdo;
		}
	}



function html_tl() {
	$html_tl=<<<HTML_tl
HTML_tl;
	$html_tl = "";
	$html_tl .= html_hdr($progid, $dttm );
	$html_tl .= html_cs_ko();
	$html_tl .= html_cs_tl();

	$html_tl .= html_js_ko();
	$html_tl .= html_js_tl();
	$html_tl .= html_data_ko();
	$html_tl .= html_view_ko();
	$html_tl .= html_data_tl();
	$html_tl .= html_view_tl();

	$html_tl .= html_ftr();
	return($html_tl);
	}


function html_hdr( $progid, $dttm ) {
#	$html_hdr=<<<HTML_HDR
# HTML_HDR;

	$html_hdr = "";
	$html_hdr .= "<html>";
	$html_hdr .= "<head><title>$progid $dttm pqpqpqpqpqpqpq</title>";
	return($html_hdr);
	}

function html_body() {
	$html_body=<<<HTML_BODY
	</head>
<body>
	<hr color=red><hr color=white><hr color=blue>
	<a href=./test_tl.php class="popover">
		<img src=/imgs/btn/koeye.png border=0>
		<span><img src=/imgs/btn/koeyeb.png border=0></span>
		</a>
	<hr color=black><hr color=white>

HTML_BODY;
	return($html_body);
	}

function html_ftr() {
	$html_ftr=<<<HTML_FTR
	</body>
	</html>
HTML_FTR;
	return($html_ftr);
	}



function html_cs_ko() {
	$html_cs_ko=<<<HTML_CS_ko

	<style id="style_ko_yokkmokk_beg>
			body { 
//			background: url("data:font/ttf;base64,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AEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgCjAFcAWABZAJYAWgChAFsAXABdAF4AXwBgAGEAYgBjAGQAZQBmAGcAaABpAGoAawBsAG0AbgBvAHAAcQByAHMAdAB1AHYAdwB4AHkAegB7AHwAfQB+AH8AgACBAIIAgwCEAIUAhgCHAIgAiQCKAIsAjACNAI4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJoAmwANAJwAnQCeAJ8AoAChAAAAAAAQAAAAqAkIBQABAQMCAwQFAwMEAgQCBQQCAwMDAwQDAgQCAgMEAwIGAwgFBAQEBAIEBAMGBQQEBQQCAwMEBgUEAwICAgQDBgQEAgQFAgQEAgYEAwQEBAICAwMGBQQDAwMFAgICBgYGBgYGCAgEBAQCAgIFBAQEBAQEAwMDAwMEBAQEBAQHBgQEBAICAgQDAwMDAwMDAwMDCAYCAgICAgIBAgIEAgICBgUBBQUAAAoJBQABAQMCBAUGAwMFAgQCBQUCBAMDBAUDAgQCAgMEAwMHAwkGBAQFBAIEBAMHBgUEBgQCBAQEBwUEAwICAwUDBwUEAgUGAgQEAgYFAwUFBQICAwMGBQQDAwMGAwIDBwcHBwcHCQkEBAQCAgIGBQUFBQUFBAQEBAMFBQUFBQUIBwQEBAICAgUDAwMDAwQDAwMDCAcDAwICAgIBAgIEAgICBwUBBQUAAAsKBgACAgQCBAUGAwMFAgQCBgUDBAQEBAUEAwUDAgMEAwMIAwoGBQUFBQIEBQMHBgUEBgUDBAQECAYFAwIDAwUDCAUFAwUGAgQEAgcFBAUFBQMDAwMHBgUDBAQGAwIDCAgICAgICQoFBQUCAgIGBQUFBQUFBAQEBAMFBQUFBQUJCAUFBQICAgUEBAQEBAQDAwMDCQgDAwICAwIBAgIEAgICBwYBBgYAAAwLBgACAgQDBAYHBAQGAgUDBgYDBQQEBAUEAwUDAwQFBAMIAwsHBQUFBQIFBQQIBwYFBwUDBQUFCAYFAwMDAwYDCQYFAwUHAgUFAggGBAYGBgMDBAQHBgUDBAQHAwMDCAgICAgICgsFBQUCAgIHBgYGBgYGBQUFBQMGBgYGBgYJCQUFBQICAgYEBAQEBAQEBAQECggDAwMDAwIBAwMFAwMDCAYBBgYAAA0MBwACAgQDBQYHBAQGAwUDBwYDBQQFBQYEAwYDAwQFBAMJBAwIBgYGBQMFBgQJBwYFCAUDBQUFCQcFBAMDAwYECQYGAwYIAwUFAggGBQYGBgMDBAQIBwYEBAQHAwMDCQkJCQkJCwwGBgYDAwMHBgYGBgYGBQUFBQQGBgYGBgYKCQYGBgMDAwYFBQUFBQUEBAQECwkDAwMDAwIBAwMFAwMDCQcCBwcAAA4NBwACAgUDBQcIBAQHAwUDBwcDBQUFBQYFAwYDAwQFBAQKBAwIBgYGBgMGBgQJCAcGCAYDBQUGCggGBAMDBAcECgcGAwYIAwYGAwkHBQcHBwMDBAQJBwYEBQUIBAMECgoKCgoKDA0GBgYDAwMIBwcHBwcHBQUFBQQHBwcHBwcLCgYGBgMDAwcFBQUFBQUEBAQEDAoEBAMDAwMBAwMGAwMDCQcCBwcAAA8OCAACAgUDBgcIBQUHAwYDCAcDBgUFBQcFBAcEAwUGBQQLBA0JBwcHBgMGBwUKCAcGCQYEBgYGCggGBAMEBAcECwcHBAcJAwYGAwkHBQcHBwQDBQUJCAYEBQUJBAMECwsLCwsLDQ4HBwcDAwMIBwcHBwcHBgYGBgQHBwcHBwcMCwcHBwMDAwcFBQUFBQUFBQUFDQoEBAMDBAMCAwMGAwMDCggCCAgAABAPCAACAgUEBggJBQUIAwYECAgEBgUGBgcFBAcEBAUGBQQLBQ4JBwcHBwMGBwULCQgGCQcEBgYGCwkHBAQEBAgFCwgHBAcJAwcGAwoHBggIBwQEBQUKCAcEBQUJBAMECwsLCwsLDg8HBwcDAwMJCAgICAgIBgYGBgUICAgICAgNCwcHBwMDAwcGBgYGBgYFBQUFDgsEBAQEBAMCAwMGBAQECwgCCAgAABEQCQACAgYEBggJBQUIAwcECQgEBwYGBggGBAcEBAUHBQUMBQ8KBwcIBwMHCAULCggHCgcEBgYHDAkHBQQEBAgFDAgHBAgKAwcHAwsIBggICAQEBQUKCQcFBgYKBAQFDAwMDAwMDxAHCAcDAwMKCAgICAgIBgYGBgUICAgICAgNDAcHBwMDAwgGBgYGBgYFBQUFDgwFBQQEBAMCBAQHBAQECwkCCQkAABIQCQADAwYEBwkKBgYJBAcECQkEBwYGBggGBAgEBAYHBgUNBRAKCAgICAQHCAUMCgkHCwcEBwcHDQoIBQQEBQkFDQkIBAgKBAcHAwsIBgkJCAQEBQYLCQgFBgYKBQQFDQ0NDQ0NDxAICAgEBAQKCQkJCQkJBwcHBwUJCQkJCQkODQgICAQEBAgGBgYGBgYFBQUFDwwFBQQEBAMCBAQHBAQEDAkCCQkAABMRCgADAwYEBwkLBgYJBAcECgkEBwYHBwkGBAgFBAYHBgUNBhELCAgJCAQICAYNCwkICwgEBwcIDQoIBQQFBQkFDQkIBAkLBAgIBAwJBwkJCQQEBgYMCggFBgYLBQQFDQ0NDQ0NEBEICAgEBAQLCQkJCQkJBwcHBwUJCQkJCQkPDQgICAQEBAkHBwcHBwcGBgYGEA0FBQQEBQQCBAQIBAQEDQoCCgoAABQSCgADAwcEBwoLBgYKBAgECgoFCAcHBwkHBQkFBAYIBgUOBhIMCQkJCAQICQYNCwoIDAgFCAgIDgsIBgUFBQoGDgoJBQkMBAgIBA0JBwoKCQUFBgYMCgkGBwcLBQQFDg4ODg4OERIJCQkEBAQLCgoKCgoKCAgICAYKCgoKCgoQDgkJCQQEBAkHBwcHBwcGBgYGEQ4FBQUFBQQCBAQIBQUEDgoCCgoAABUTCwADAwcFCAoMBgYKBAgFCwoFCAcHBwoHBQkFBQYIBgYPBhMMCQkJCQQJCQYODAoIDAkFCAgIDwsJBgUFBQoGDwoJBQoMBAkIBA0KBwoKCgUFBgcNCwkGBwcMBQQGDw8PDw8PEhMJCQkEBAQMCgoKCgoKCAgICAYKCgoKCgoRDwkJCQQEBAoHBwcHBwcGBgYGEg4GBgUFBQQCBAQIBQUFDgsDCwsAABYUCwADAwcFCAsMBwcLBAkFCwoFCAcICAoHBQoFBQcJBwYPBhQNCgoKCQQJCgcPDAoJDQkFCAgJDwwJBgUFBgsGEAsKBQoNBAkJBA4KCAsLCgUFBwcOCwkGBwcNBgUGDw8PDw8PExQKCgoEBAQMCgoKCgoLCAgICAYLCwsLCwsREAoKCgQEBAoICAgICAgHBwcHEw8GBgUFBQQCBQUJBQUFDwsDCwsAABcVDAADAwcFCQsNBwcLBQkFDAsFCQcICAsIBQoGBQcJBwYQBxQNCgoKCgUJCgcPDQsJDQoFCQkJEAwKBgUGBgsHEAsKBQoNBQkJBA4LCAsLCwUFBwcODAoGBwgNBgUGEBAQEBAQFBUKCgoFBQUNCwsLCwsLCQkJCQcLCwsLCwsSEAoKCgUFBQsICAgICAgHBwcHFBAGBgUFBgQCBQUJBQUFEAwDDAwAABgWDAADAwgFCQwNBwcMBQkFDAsGCQgICAsIBgoGBQcJBwYRBxUOCgoLCgUKCwcQDgsKDgoGCQkKEQ0KBwUGBgsHEQwKBgsOBQoKBA8LCAwMCwYGBwgPDAoHCAgOBgUGERERERERFRYKCwoFBQUOCwsLCwsMCQkJCQcLCwsLCwsTEQoKCgUFBQsICAgICAgHBwcHFBEGBgUFBgQCBQUKBQUFEAwDDAwAAAABAV0BkAAFAAICvAKKAAAAjwK8AooAAAHFADIBAwAAAAAEAAAAAAAAAAAAAAMAAAAAAAAAAAAAAABNQUNSAEAAICIZAyH/OQAAAyEAxwAAAAEAAAAAAAAAAQAAgAAAAACLAT8AAGAAAbQCdVlva2ttb2trICAgICAgICD/////N////llPS1IwMAAAAAAAAAABAAAAAQAAmJpL9V8PPPUAAAPoAAAAALfnFZIAAAAAt+cVkv+2/zkDawMhAAAAAwACAAEAAAAAAAEAAAMh/zkAAAOQ/7b/uANrAAEAAAAAAAAAAAAAAAAAAACkAAEAAACkAJgADQAAAAAAAgAIAEAACgAAAF0AvgABAAE=");
			background-color: darkslategrey;
			color: white;
			font-size:62.5%; 
//			font-family: yokkmokkOT;
			font-size: 38pt;
			}

		</style id="sytle_ko_yokkmokk_end>


	<style id="style_ko_input_beg">
		.fileContainer {
		    overflow: hidden;
		    position: relative;
			}
		
		.fileContainer [type=file] {
		    cursor: inherit;
		    display: block;
		    font-size: 999px;
		    filter: alpha(opacity=0);
		    min-height: 100%;
		    min-width: 100%;
		    opacity: 0;
		    position: absolute;
		    right: 0;
		    text-align: right;`
		    top: 0;
			}
		</style id="style_ko_input_end">

<!--
	<style id="style_ko_input2_beg">
		input[type=text] {
			background-color: #BFBDBD;
			border:solid 1px #BFBDBD;
			color: #979797;
			height: 28px;
			padding-left:10px;
			width: 191px;
			box-shadow: 2px 2px 0 #828181 inset;
			}
		input[type=button] {
			background-color: #1E1E1E;
			color: #979797;
			height: 24px;
			width: 103px;
			color: #bbbbbb;
			text-transform:uppercase;
			box-shadow:-1px 2px #6E6B6A inset;
			}
		input[type=button], input[type=text]
			{border-radius: 5px; font-family: Sansation;}
			{border-radius: 5px; font-family: yokkmokkOT;}
		</style id="style_ko_input2_end">
	-->





	<style id="style_ko_popover_beg" >
		.popover  {
			position: relative;
			float: left;
			padding: 5px;
			/*z-ka1: 0;*/
			}
		.popover:hover {
			background-color: slategrey;
//			background-color: #e9e9e2;
			/*z-ka1: 50;*/
			color: white;
//			color: #335500;
			text-decoration: none;
			}
/*CSS for enlarged image*/
		.popover span { 
			position: absolute; 
//			background-color: #e5e5e5;
			background-color: slategrey;
			padding: 5px;
			/*left: -1000px;*/
			border: 1px solid #666;
			visibility: hidden;
			color: black;
			text-decoration: none;
			}
/*CSS for enlarged image*/
		.popover span img { 
			border-width: 0px; 
			/*padding: 2px;*/
			}
		
/*CSS for enlarged image on hover*/
		.popover:hover span { 
			visibility: visible; 
//			width: 200px;
			top: 0px; /* use IF IE6 style to correct IE6 positions of larger image relative to thumb */
			left: 0px;/*position where enlarged image should offset horizontally */
			}
		</style id="style_ko_popover_end" >


	<style id="style_ko_pop" >
		.pop  {
			position: relative;
			float: left;
			padding: 5px;
			/*z-ka1: 0;*/
			}
		.pop:hover {
			background-color: #e9e9e2;
			/*z-ka1: 50;*/
			color: #335500;
			text-decoration: none;
			}
/*CSS for enlarged image*/
		.pop span { 
			position: absolute; 
			background-color: #e5e5e5;
			padding: 5px;
			/*left: -1000px;*/
			border: 1px solid #666;
			visibility: hidden;
			color: black;
			text-decoration: none;
			}
/*CSS for enlarged image*/
		.pop span img { 
			border-width: 0px; 
			/*padding: 2px;*/
			}
		
/*CSS for enlarged image on hover*/
		.pop:hover span { 
			visibility: visible; 
			width: 200px;
			top: 5px; /* use IF IE6 style to correct IE6 positions of larger image relative to thumb */
			left: 300px;/*position where enlarged image should offset horizontally */
			}
		
		/*POPN - thumbnail2 has border and border on hover*/
		.popn {
			position: relative;
			float: left;
			padding: 5px;
			/*z-ka1: 0;*/
			}
		.popn:hover { 
			background-color: #e9e9e2;
			/*z-ka1: 50;*/
			color: #335500;
			text-decoration: none;
			}
		.popn span { /*CSS for enlarged image*/
			position: absolute;
			background-color: #e5e5e5;
			padding: 5px;
			/*left: -1000px;*/
			border: 1px solid #666;
			visibility: hidden;
			color: black;
			text-decoration: none;
			}
		
/*CSS for enlarged image*/
		.popn span img { border-width: 0px;}
/*CSS for enlarged image on hover*/
		.popn:hover span { 
			visibility: visible; width: 208px;
			top: 5px; /* use IF IE6 style to correct IE6 positions of larger image relative to thumb */
			left: 300px;/*position where enlarged image should offset horizontally */
			}
		a.popn img { text-decoration:none; z-ka1: 50; }
		
/*if same attribute for all 4 states, then declare here in a.popn*/ 
		a.popn img:link { border: 2px solid #e9e9e2; background: transparent; }
		a.popn img:visited { border: 2px solid #e9e9e2; background : transparent; }
		a.popn img:hover { border: 2px solid #f00; background : transparent; }
		a.popn img:active { border: 2px solid #e9e9e2; background : transparent; }
		a.popn img { border: 2px solid #e9e9e2; }
		</style id="style_ko_popn_end">

	<style id="style_ko_buttons_beg" >
                body { text-align: center; background-color: "slategrey"; color:"white"; }
                button {
//			visibility: hidden;
//			background: rgba(7, 99, 53, .1);
			background: transparent;
//	                border: 3px solid rgba(7, 99, 53, 1);
	                border: 3px solid slategrey;
			border-radius: 5px;
//			color: rgba(7, 99, 53, 1);
			color: slategrey;
			cursor: pointer;
			line-height: 40px;
			font-size: 20px;
			outline: none;
			padding: 0 20px;
			transition: all .3s;
                	}
	        button:hover {
//	              background: rgba(7, 99, 53, 1);
  	              background: darkgreyslate;
//  	              background: yellow;
//  	              background: white;
//  	              color: rgba(255,255,255,1);
  	              color: white;
  	              }
		p {font-size: 20px; font-weight: bold;
		</style id="style_ko_buttons_end" >

	<style id="style_ko_input2_beg" >
                body { text-align: center; background-color: "slategrey"; color:"white"; }
                input {
//			visibility: hidden;
//			background: rgba(7, 99, 53, .1);
			background: transparent;
//	                border: 3px solid rgba(7, 99, 53, 1);
	                border: 3px solid slategrey;
			border-radius: 5px;
//			color: rgba(7, 99, 53, 1);
			color: slategrey;
			cursor: pointer;
			line-height: 40px;
			font-size: 10px;
			outline: none;
			padding: 0 20px;
			transition: all .3s;
                	}
	        button:hover {
//	              background: rgba(7, 99, 53, 1);
  	              background: darkgreyslate;
//  	              background: yellow;
//  	              background: white;
//  	              color: rgba(255,255,255,1);
  	              color: white;
  	              }
		p {font-size: 10px; font-weight: bold;
		</style id="style_ko_input2_end" >





	<style id="style_ko_drop_beg" type="text/css">
		#drop {
			 width:200px;
			 height:150px;
			 margin:3px auto;
			 background:#eddaa8;
			 font-size:16px;
			}
		#drop #sw { text-decoration:underline; cursor:pointer; }
		#drag {
			 width:450px;
			 height:180px;
			 margin:12px auto;
			 border:1px solid silver;
			 font-size:16px;
			}
		#drag .drg { margin:10px 12px; }
		#drag div.drg {
			 width:150px;
			 height:50px;
			 background:#07da08;
			 border:2px solid blue;
			}
		</style id="style_ko_drop_end">


HTML_CS_ko;
	return( $html_cs_ko );
	}

function html_js_ko1() {
	$html_js_ko=<<<HTML_JS_ko

	<script id="script_ko_drop_beg" type="text/javascript">

		$(document).ready(function() {
// sets the draggable
// sets the cursor apperance
			$('#drag .drg').draggable({
				cursor: 'move',          
				revert: 'valid'
				});
// sets droppable
// after the draggable is droped, hides it with a hide() effect
			$('#drop').droppable({
				drop: function(event, ui) {
					ui.draggable.hide(1000);
					}
				});

// after the draggable is droped, hides it with a hide() effect
			$('#drop1').droppable({
				drop: function(event, ui) {
					ui.draggable.hide(1000);
					}
				});

// after the draggable is droped, hides it with a hide() effect
			$('#drop2').droppable({
				drop: function(event, ui) {
					ui.draggable.hide(1000);
					}
				});

// when the "#sw" element (inside the "#drop") is clicked
// show the items with class "drg", contained in "#drag"
//			$('#drag .drg').slideDown(1000);
			$('#drop #sw').click(function(){
				var url = "https://ka10//ka1.php?q=drop"
				$(location).attr('href',url);
				});
		</script id="script_ko_drop_end" >
HTML_JS_ko;
	return( $html_js_ko );
	}

function html_body_ko() {
	$html_body_ko=<<<HTML_BODY_ko
<!--	<div id="div_links" >	-->
	<div id="div_ko_show_links_beg" >
		<hr color=red>
		<div id="div_svc_links" > </div>
		<hr color=red>
	
		<hr color=white>
		<div id="div_ko_links" > </div>
		<hr color=white>

		<hr color=white>
		<div id="div_us_links" > </div>
		<hr color=white>

		<hr color=white>
		<div id="div_u_links" > </div>
		<hr color=white>

		<hr color=white>
		<div id="div_now_links" > </div>
		<hr color=white>

		<hr color=blue>
		<div id="div_srv_links" > </div>
		<hr color=blue>
		</div id="div_ko_show_links_end" >

<!--	<div id="div_ko_show_linkz_beg" >	-->
	<div id="div_linkz" >
		<hr color=red>
		<div id="div_svc_linkz" > </div>
		<hr color=red>

		<hr color=black>
		<div id="div_ko_linkz" > </div>
		<hr color=black>

		<hr color=black>
		<div id="div_us_linkz" > </div>
		<hr color=black>

		<hr color=black>
		<div id="div_u_linkz" > </div>
		<hr color=black>

		<hr color=black>
		<div id="div_now_linkz" > </div>
		<hr color=black>

		<hr color=blue>
		<div id="div_srv_linkz" > </div>
		<hr color=blue>
		<div id="div_ko_show_linkz_end" >

	<div id="div_ko_cfaa_beg" class=ko>
HTML_BODY_ko;
	return($html_body_ko);
	}


function html_body_ko_buttons() {
	$html_buttons=<<<HTML_BUTTONS

	<div id="div_ko_buttons_beg" >
		<hr color=red><hr color=black><hr color=white>
	        <button type="button" onclick="show_all_links('pop')">show_all_links</button>
		<hr color=red><hr color=white><hr color=blue>
	        <button type="button" onclick="show_svc_links('pop')">show_svc_links</button>
	        <button type="button" onclick="show_ko_links('pop')">show_ko_links</button>
	        <button type="button" onclick="show_us_links('pop')">show_us_links</button>
	        <button type="button" onclick="show_u_links('pop')">show_u_links</button>
	        <button type="button" onclick="show_now_links('pop')">show_now_links</button>
	        <button type="button" onclick="show_srv_links('pop')">show_srv_links</button>
		<hr color=blue><hr color=white><hr color=black>

		<a href=# class="popover" onclick="show_svc_links();">
		        <img src="./imgs/btn/kib.png" height="100" width="200" alt="koeyew" >
		        <span><img src="./imgs/btn/kiw.png" height="100" width="200" alt="koeyew" ></span>
			</a>

		<a href=# class="popover" onclick="show_ko_links();">
	        	<img src="./imgs/btn/ko.png" height="100" size="200" alt="koeyeb" > 
	        	<span><img src="./imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
			</a>

		<a href=# class="popover" onclick="show_us_links();">
	        	<img src="./imgs/btn/ko.png" height="100" size="200" alt="koeyeb" > 
	        	<span><img src="./imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
			</a>

		<a href=# class="popover" onclick="show_u_links();">
	        	<img src="./imgs/btn/ko.png" height="100" size="200" alt="koeyeb" > 
	        	<span><img src="./imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
			</a>

		<a href=# class="popover" onclick="show_now_links();">
	        	<img src="./imgs/btn/ko.png" height="100" size="200" alt="koeyeb" > 
	        	<span><img src="./imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
			</a>

		<a href=# class="popover" onclick="show_srv_links();">
		        <img src="./imgs/btn/kiw.png" height="100" width="200" alt="koeyew" >
		        <span><img src="./imgs/btn/kib.png" height="100" width="200" alt="koeyew" ></span>
			</a>

		<hr color=blue><hr color=white><hr color=red>
	
		<div id="div_neave_im_beg" >
			<iframe frameborder='0' height='250'  marginheight='0' marginwidth='0' scrolling='no' 
				src='/index_neave_im.html'
				style='margin-bottom: 20px; box-shadow: 0 2px 2px rgba(0,0,0,0.3)' width='100%'>
				</iframe>
			<a class="popover" href="/index_neave_im.html"  target=_blank>
				<img height=50 width=1600 src="/imgs/links/index_neave_im.png" alt="index_neave_im"  border=0>
				<span><img height=50 width=1600 src="/imgs/links/index_neave_im_pop.png" border=0></span>
				</a>
			
			</div id="div_neave_im_end" >

		<div id="div_neave_wobble_beg" >
			
			<a class="popover" href="/index_neave_wobble.html" target=_blank>
				<img height=50 width=1600 src="/imgs/links/index_neave_wobble.png" alt="index_neave_wobble"  border=0>
				<span><img  height=50 width=1600 src="/imgs/links/index_neave_wobble_pop.png" border=0></span>
				</a>
			<iframe frameborder='0' height='150' marginheight='0' marginwidth='0' scrolling='no' 
				src='/index_neave_wobble.html' 
				style='margin-bottom: 20px; box-shadow: 0 2px 2px rgba(0,0,0,0.3)' width='100%'>
				</iframe>
			</div id="div_neave_wobble_end" >
		</div id="div_ko_buttons_end" >
HTML_BUTTONS;
	return($html_buttons);
	}

function html_files() {
	$html_files=<<<HTML_FILES

	<div id="div_files_beg" >
		<output id="zonelist"></output>
		<div id="dropzone">
			dropzone
			<div id="div_canvas" style="position:relative; width:400px; height:200px background:white">
				<canvas id="canvas_dropzone" style="z-ka1: 1;
					position:absolute;
					left:0px;
					top:0px;
					" height="100px" width="200" background-color="white" color="white">
					WARN_1387 unauthorized access has been logged
					</canvas>
			</div>

		<script name="script_fileselect">
			function handleFileSelect(evt) {
				evt.stopPropagation();
				evt.preventDefault();

				var files = evt.dataTransfer.files; // FileList object.

// files is a FileList of File objects. List some properties.
    var output = [];
    for (var i = 0, f; f = files[i]; i++) {
      output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
                  f.size, ' bytes, last modified: ',
                  f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
                  '</li>');
    }
    document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
  }

  function handleDragOver(evt) {
    evt.stopPropagation();
    evt.preventDefault();
    evt.dataTransfer.dropEffect = 'copy'; // Explicitly show this is a copy.
  }

  // Setup the dnd listeners.
  var dropZone = document.getElementById('dropzone');
  dropZone.addEventListener('dragover', handleDragOver, false);
  dropZone.addEventListener('drop', handleFileSelect, false);
</script>

<hr><hr><hr>
<style>
  .thumb {
    height: 75px;
    border: 1px solid #000;
    margin: 10px 5px 0 0;
  }
</style>


	<label class="fileContainer">
		files
		<input id="files" name="files[]" multiple="" type="file">
		</label>


<output id="zonelist"></output>

<script>
  function handleFileSelect(evt) {
    var files = evt.target.files; // FileList object

    // files is a FileList of File objects. List some properties.
    var output = [];
    for (var i = 0, f; f = files[i]; i++) {
      output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
                  f.size, ' bytes, last modified: ',
                  f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
                  '</li>');
    }
    document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
  }

	  document.getElementById('files').addEventListener('change', handleFileSelect, false);
	</script>

	<div id="div_files2" hidden >
		<label class="fileContainer">
			files2
			<input id="files" name="files[]" multiple="" type="file">
			</label>
		<output id="zonelist"></output>
		</div>

<script>
  function handleFileSelect(evt) {
    var files = evt.target.files; // FileList object

    // Loop through the FileList and render image files as thumbnails.
    for (var i = 0, f; f = files[i]; i++) {

// Only process image files.
	if (!f.type.match('image.*')) { continue; }

      var reader = new FileReader();

      // Closure to capture the file information.
      reader.onload = (function(theFile) {
        return function(e) {
          // Render thumbnail.
          var span = document.createElement('span');
          span.innerHTML = ['<img class="thumb" src="', e.target.result,
                            '" title="', escape(theFile.name), '"/>'].join('');
          document.getElementById('zonelist').insertBefore(span, null);
        };
      })(f);

      // Read in the image file as a data URL.
      reader.readAsDataURL(f);
    }
  }

  document.getElementById('files').addEventListener('change', handleFileSelect, false);
</script>

<hr color=black><hr color=black><hr color=black>

<style>
  #byte_content {
    margin: 5px 0;
    max-height: 100px;
    overflow-y: auto;
    overflow-x: hidden;
  }
  #byte_range { margin-top: 5px; }
</style>
<script id="script_previewfile">
			function previewfile(file) {
				if (tests.filereader === true && acceptedTypes[file.type] === true) {
					var reader = new FileReader();
					reader.onload = function (event) {
						var image = new Image();
						image.src = event.target.result;
						image.width = 250; // a fake resize
						holder.appendChild(image);
						};

					reader.readAsDataURL(file);
					}  
				else {
					holder.innerHTML += 
						'<p>done:  koupload' 
							+ file.name 
							+ ' ' 
							+ (file.size ? (file.size/1024|0) + 'K' : ''); 
						console.log(file);
					}
				}

			function readfiles(files) {
				debugger;
				var formData = tests.formdata ? new FormData() : null;
				for (var i = 0; i < files.length; i++) {
					if (tests.formdata) formData.append('file', files[i]);
					previewfile(files[i]);
					}

// now post a new XHR request
				if (tests.formdata) {
					var xhr = new XMLHttpRequest();
					xhr.open('POST', 'http://ka6/ko/bin/php/ko.php?ko=ajax,upload,filenames,phpi,ok');
//					xhr.open('POST', 'ka6/ko/bin/php/ka1.php?q=upload,filenames');
					xhr.onload = function() {
						progress.value = progress.innerHTML = 100;
						};

				if (tests.progress) {
					xhr.upload.onprogress = function (event) {
						if (event.lengthComputable) {
							var complete = (event.loaded / event.total * 100 | 0);
							progress.value = progress.innerHTML = complete;
							}
						}
					}

				xhr.send(formData);
				}
			}

			if (tests.dnd) { 
				holder.ondragover = function () { this.className = 'hover'; return false; };
				holder.ondragend = function () { this.className = ''; return false; };
				holder.ondrop = function (e) {
					this.className = '';
					e.preventDefault();
					readfiles(e.dataTransfer.files);
					}
				} 
			else {
				fileupload.className = 'hidden';
				fileupload.querySelector('input').onchange = function () {
				readfiles(this.files);
				};
			}
		</script>

	<script id="script_myfilework>

		funtion myfilework( j, file ) {

			alert( j+" file="+file );
			}

		</script>





		<script id="script_upload_input">>
			var upload = document.getElementsByTagName('input')[0],
			holder2 = document.getElementById('holder2'),
			state = document.getElementById('status');

			if (typeof window.FileReader === 'undefined') {
				state.className = 'fail';
				} 
			else {
				state.className = 'success';
				state.innerHTML = 'File API & FileReader available';
				}
 
			upload.onchange = function (e) {
				e.preventDefault();

				var file = upload.files[0],
				reader = new FileReader();
				reader.onload = function (event) {
					var img = new Image();
					img.src = event.target.result;
// note: no onload required since we've got the dataurl...I think! :)
					if (img.width > 560) { // holder width
						img.width = 560;
						}
					holder2.innerHTML = '';
					holder.appendChild(img);
					};
				reader.readAsDataURL(file);

				return false;
				};

//			var formData = new FormData();
//			formData.append("part_num", "123ABC"); 
//			formData.append("part_price", 7.95);
//				formData.append("part_image", somefile)
//
//			var xhr = new XMLHttpRequest();
//			xhr.open("POST", "http://ka6/ko/bin/php/ko.php?ko=ajax,upload/");  
//			xhr.send(formData);
			</script>

	<canvas color="darkslatgrey" height="100" width="400"></canvas>
	<script>
		var canvas = document.getElementsByTagName('canvas')[0],
    ctx = null,
    grad = null,
    body = document.getElementsByTagName('body')[0],
    color = 255;
    color = lightblue;
    
if (canvas.getContext('2d')) {
  ctx = canvas.getContext('2d');
  ctx.clearRect(0, 0, 600, 600);
  ctx.save();

// Create radial gradient
//  grad = ctx.createRadialGradient(0,0,0,0,0,600); 
//  grad.addColorStop(0, '#000');
//  grad.addColorStop(1, 'rgb(' + color + ', ' + color + ', ' + color + ')');

  // assign gradients to fill
//  ctx.fillStyle = grad;
	ctx.fillstyle = "lightblue";

  // draw 600x600 fill
  ctx.fillRect(0,0,600,600);
  ctx.save();
  
  body.onmousemove = function (event) {
    var width = window.innerWidth, 
        height = window.innerHeight, 
        x = event.clientX, 
        y = event.clientY,
        rx = 600 * x / width,
        ry = 600 * y / height;
        
    var xc = ~~(256 * x / width);
    var yc = ~~(256 * y / height);

    grad = ctx.createRadialGradient(rx, ry, 0, rx, ry, 600); 
    grad.addColorStop(0, '#000');
    grad.addColorStop(1, ['rgb(', xc, ', ', (255 - xc), ', ', yc, ')'].join(''));
    // ctx.restore();
//    ctx.fillStyle = grad;
	ctx.fillstyle="lightblue";
    ctx.fillRect(0,0,600,600);
    // ctx.save();
  };
}
	</script>

	<div id="div_csv">
	<style type="text/css">
		body {
			font-family: Arial;
			font-size: 10pt;
			}
		table {
			border: 1px solid #ccc;
			}
		table th {
			background-color: #F7F7F7;
			color: #333;
			font-weight: bold;
			}
		table th, table td {
			padding: 5px;
			border-color: #ccc;
			}
		</style>
	
	<script type="text/javascript">
		function Upload() {
			var fileUpload = document.getElementById("fileUpload");
			var regex = /^([a-zA-Z0-9\s_\\.\-:])+(.csv|.txt|.psv|.py|.htm|.html|.php)$/;
			if (regex.test(fileUpload.value.toLowerCase())) {
				if (typeof (FileReader) != "undefined") {
					var reader = new FileReader();
					reader.onload = function (e) {
						var table = document.createElement("table");
						var rows = e.target.result.split("\n");
						for (var i = 0; i < rows.length; i++) {
							var row = table.insertRow(-1);
					
//							var cells = rows[i].split("|");
							var cells = rows[i].split(",");
							for (var j = 0; j < cells.length; j++) {
								var cell = row.insertCell(-1);
								cell.innerHTML = cells[j];
								}
							}
						var csv2tbl = document.getElementById("csv2tbl");
						csv2tbl.innerHTML = "";
						csv2tbl.appendChild(table);
						}
					reader.readAsText(fileUpload.files[0]);
					} 
				else {
					alert("csv2tbl warn:  unauthorized access noted");
					}
				} 
			else {
				alert("csv2tbl fail:  unsuppoted format");
				}
			}
			</script>
				<label class="fileContainer">
					files_csv_psv_ssv_tsv
					<input id="fileUpload" type="file">
					</label>

				&nbsp &nbsp &nbsp
				<label class="fileContainer">
					parse_csv_psv_ssv_tsv
					<input id="upload" value="Upload" onclick="Upload()" type="button">
					</label>
				</div>
			<div id="csv2tbl"> </div>
<!--        		<button type="button" id="fileUpload" type="file" >select</button> -->
<!--        		<button type="button" id="upload" value="Upload" onclick="Upload()">upload</button> -->
			</div>
		<div id="div_files_end" >
HTML_FILES;
	return($html_files);
	}

function html_upload() {
	$html_upload=<<<HTML_UPLOAD

		<div id="wrapper" hidden>
			<div id="upload-widget">
				<h1>
					<i class="fa fa-cloud-upload"></i> File Uploader
				</h1>
 
				<form id="file-upload-form">
					<div class="file-input-wrap">
						fups
						<input type="file" name="file" id="file" multiple>
					</div><!-- .file-input-wrap -->
				</form><!-- #file-upload-form -->
			</div><!-- #upload-widget -->
 
			<div id="upload-result">
			</div><!-- #upload-result -->
		</div><!-- #wrapper -->
 
		<div id="preloader">
				<img height=50 src="./imgs/btn/kob.png" alt="preloader_up" />
				</a>
			</div>
		
		<!-- SCRIPTS -->
<!--		<script type="text/javascript" src="js/libraries/jquery-2.1.1.min.js"></script> -->
<!--		<script type="text/javascript" src="./jquery-3.3.1.js" > -->
		<script type="text/javascript" src="data:/text/plain;base64,LyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjMuMy4xCiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS8KICoKICogSW5jbHVkZXMgU2l6emxlLmpzCiAqIGh0dHBzOi8vc2l6emxlanMuY29tLwogKgogKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKiBodHRwczovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBEYXRlOiAyMDE4LTAxLTIwVDE3OjI0WgogKi8KKCBmdW5jdGlvbiggZ2xvYmFsLCBmYWN0b3J5ICkgewoKCSJ1c2Ugc3RyaWN0IjsKCglpZiAoIHR5cGVvZiBtb2R1bGUgPT09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gIm9iamVjdCIgKSB7CgoJCS8vIEZvciBDb21tb25KUyBhbmQgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgd2hlcmUgYSBwcm9wZXIgYHdpbmRvd2AKCQkvLyBpcyBwcmVzZW50LCBleGVjdXRlIHRoZSBmYWN0b3J5IGFuZCBnZXQgalF1ZXJ5LgoJCS8vIEZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3QgaGF2ZSBhIGB3aW5kb3dgIHdpdGggYSBgZG9jdW1lbnRgCgkJLy8gKHN1Y2ggYXMgTm9kZS5qcyksIGV4cG9zZSBhIGZhY3RvcnkgYXMgbW9kdWxlLmV4cG9ydHMuCgkJLy8gVGhpcyBhY2NlbnR1YXRlcyB0aGUgbmVlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIGEgcmVhbCBgd2luZG93YC4KCQkvLyBlLmcuIHZhciBqUXVlcnkgPSByZXF1aXJlKCJqcXVlcnkiKSh3aW5kb3cpOwoJCS8vIFNlZSB0aWNrZXQgIzE0NTQ5IGZvciBtb3JlIGluZm8uCgkJbW9kdWxlLmV4cG9ydHMgPSBnbG9iYWwuZG9jdW1lbnQgPwoJCQlmYWN0b3J5KCBnbG9iYWwsIHRydWUgKSA6CgkJCWZ1bmN0aW9uKCB3ICkgewoJCQkJaWYgKCAhdy5kb2N1bWVudCApIHsKCQkJCQl0aHJvdyBuZXcgRXJyb3IoICJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50IiApOwoJCQkJfQoJCQkJcmV0dXJuIGZhY3RvcnkoIHcgKTsKCQkJfTsKCX0gZWxzZSB7CgkJZmFjdG9yeSggZ2xvYmFsICk7Cgl9CgovLyBQYXNzIHRoaXMgaWYgd2luZG93IGlzIG5vdCBkZWZpbmVkIHlldAp9ICkoIHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiID8gd2luZG93IDogdGhpcywgZnVuY3Rpb24oIHdpbmRvdywgbm9HbG9iYWwgKSB7CgovLyBFZGdlIDw9IDEyIC0gMTMrLCBGaXJlZm94IDw9MTggLSA0NSssIElFIDEwIC0gMTEsIFNhZmFyaSA1LjEgLSA5KywgaU9TIDYgLSA5LjEKLy8gdGhyb3cgZXhjZXB0aW9ucyB3aGVuIG5vbi1zdHJpY3QgY29kZSAoZS5nLiwgQVNQLk5FVCA0LjUpIGFjY2Vzc2VzIHN0cmljdCBtb2RlCi8vIGFyZ3VtZW50cy5jYWxsZWUuY2FsbGVyICh0cmFjLTEzMzM1KS4gQnV0IGFzIG9mIGpRdWVyeSAzLjAgKDIwMTYpLCBzdHJpY3QgbW9kZSBzaG91bGQgYmUgY29tbW9uCi8vIGVub3VnaCB0aGF0IGFsbCBzdWNoIGF0dGVtcHRzIGFyZSBndWFyZGVkIGluIGEgdHJ5IGJsb2NrLgoidXNlIHN0cmljdCI7Cgp2YXIgYXJyID0gW107Cgp2YXIgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQ7Cgp2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7Cgp2YXIgc2xpY2UgPSBhcnIuc2xpY2U7Cgp2YXIgY29uY2F0ID0gYXJyLmNvbmNhdDsKCnZhciBwdXNoID0gYXJyLnB1c2g7Cgp2YXIgaW5kZXhPZiA9IGFyci5pbmRleE9mOwoKdmFyIGNsYXNzMnR5cGUgPSB7fTsKCnZhciB0b1N0cmluZyA9IGNsYXNzMnR5cGUudG9TdHJpbmc7Cgp2YXIgaGFzT3duID0gY2xhc3MydHlwZS5oYXNPd25Qcm9wZXJ0eTsKCnZhciBmblRvU3RyaW5nID0gaGFzT3duLnRvU3RyaW5nOwoKdmFyIE9iamVjdEZ1bmN0aW9uU3RyaW5nID0gZm5Ub1N0cmluZy5jYWxsKCBPYmplY3QgKTsKCnZhciBzdXBwb3J0ID0ge307Cgp2YXIgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24oIG9iaiApIHsKCiAgICAgIC8vIFN1cHBvcnQ6IENocm9tZSA8PTU3LCBGaXJlZm94IDw9NTIKICAgICAgLy8gSW4gc29tZSBicm93c2VycywgdHlwZW9mIHJldHVybnMgImZ1bmN0aW9uIiBmb3IgSFRNTCA8b2JqZWN0PiBlbGVtZW50cwogICAgICAvLyAoaS5lLiwgYHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAib2JqZWN0IiApID09PSAiZnVuY3Rpb24iYCkuCiAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gY2xhc3NpZnkgKmFueSogRE9NIG5vZGUgYXMgYSBmdW5jdGlvbi4KICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIG9iai5ub2RlVHlwZSAhPT0gIm51bWJlciI7CiAgfTsKCgp2YXIgaXNXaW5kb3cgPSBmdW5jdGlvbiBpc1dpbmRvdyggb2JqICkgewoJCXJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT09IG9iai53aW5kb3c7Cgl9OwoKCgoKCXZhciBwcmVzZXJ2ZWRTY3JpcHRBdHRyaWJ1dGVzID0gewoJCXR5cGU6IHRydWUsCgkJc3JjOiB0cnVlLAoJCW5vTW9kdWxlOiB0cnVlCgl9OwoKCWZ1bmN0aW9uIERPTUV2YWwoIGNvZGUsIGRvYywgbm9kZSApIHsKCQlkb2MgPSBkb2MgfHwgZG9jdW1lbnQ7CgoJCXZhciBpLAoJCQlzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudCggInNjcmlwdCIgKTsKCgkJc2NyaXB0LnRleHQgPSBjb2RlOwoJCWlmICggbm9kZSApIHsKCQkJZm9yICggaSBpbiBwcmVzZXJ2ZWRTY3JpcHRBdHRyaWJ1dGVzICkgewoJCQkJaWYgKCBub2RlWyBpIF0gKSB7CgkJCQkJc2NyaXB0WyBpIF0gPSBub2RlWyBpIF07CgkJCQl9CgkJCX0KCQl9CgkJZG9jLmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdCApLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOwoJfQoKCmZ1bmN0aW9uIHRvVHlwZSggb2JqICkgewoJaWYgKCBvYmogPT0gbnVsbCApIHsKCQlyZXR1cm4gb2JqICsgIiI7Cgl9CgoJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTIuMyBvbmx5IChmdW5jdGlvbmlzaCBSZWdFeHApCglyZXR1cm4gdHlwZW9mIG9iaiA9PT0gIm9iamVjdCIgfHwgdHlwZW9mIG9iaiA9PT0gImZ1bmN0aW9uIiA/CgkJY2xhc3MydHlwZVsgdG9TdHJpbmcuY2FsbCggb2JqICkgXSB8fCAib2JqZWN0IiA6CgkJdHlwZW9mIG9iajsKfQovKiBnbG9iYWwgU3ltYm9sICovCi8vIERlZmluaW5nIHRoaXMgZ2xvYmFsIGluIC5lc2xpbnRyYy5qc29uIHdvdWxkIGNyZWF0ZSBhIGRhbmdlciBvZiB1c2luZyB0aGUgZ2xvYmFsCi8vIHVuZ3VhcmRlZCBpbiBhbm90aGVyIHBsYWNlLCBpdCBzZWVtcyBzYWZlciB0byBkZWZpbmUgZ2xvYmFsIG9ubHkgZm9yIHRoaXMgbW9kdWxlCgoKCnZhcgoJdmVyc2lvbiA9ICIzLjMuMSIsCgoJLy8gRGVmaW5lIGEgbG9jYWwgY29weSBvZiBqUXVlcnkKCWpRdWVyeSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHsKCgkJLy8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25zdHJ1Y3RvciAnZW5oYW5jZWQnCgkJLy8gTmVlZCBpbml0IGlmIGpRdWVyeSBpcyBjYWxsZWQgKGp1c3QgYWxsb3cgZXJyb3IgdG8gYmUgdGhyb3duIGlmIG5vdCBpbmNsdWRlZCkKCQlyZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KCBzZWxlY3RvciwgY29udGV4dCApOwoJfSwKCgkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHkKCS8vIE1ha2Ugc3VyZSB3ZSB0cmltIEJPTSBhbmQgTkJTUAoJcnRyaW0gPSAvXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2c7CgpqUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0gewoKCS8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWQKCWpxdWVyeTogdmVyc2lvbiwKCgljb25zdHJ1Y3RvcjogalF1ZXJ5LAoKCS8vIFRoZSBkZWZhdWx0IGxlbmd0aCBvZiBhIGpRdWVyeSBvYmplY3QgaXMgMAoJbGVuZ3RoOiAwLAoKCXRvQXJyYXk6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzbGljZS5jYWxsKCB0aGlzICk7Cgl9LAoKCS8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1IKCS8vIEdldCB0aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFuIGFycmF5CglnZXQ6IGZ1bmN0aW9uKCBudW0gKSB7CgoJCS8vIFJldHVybiBhbGwgdGhlIGVsZW1lbnRzIGluIGEgY2xlYW4gYXJyYXkKCQlpZiAoIG51bSA9PSBudWxsICkgewoJCQlyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApOwoJCX0KCgkJLy8gUmV0dXJuIGp1c3QgdGhlIG9uZSBlbGVtZW50IGZyb20gdGhlIHNldAoJCXJldHVybiBudW0gPCAwID8gdGhpc1sgbnVtICsgdGhpcy5sZW5ndGggXSA6IHRoaXNbIG51bSBdOwoJfSwKCgkvLyBUYWtlIGFuIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrCgkvLyAocmV0dXJuaW5nIHRoZSBuZXcgbWF0Y2hlZCBlbGVtZW50IHNldCkKCXB1c2hTdGFjazogZnVuY3Rpb24oIGVsZW1zICkgewoKCQkvLyBCdWlsZCBhIG5ldyBqUXVlcnkgbWF0Y2hlZCBlbGVtZW50IHNldAoJCXZhciByZXQgPSBqUXVlcnkubWVyZ2UoIHRoaXMuY29uc3RydWN0b3IoKSwgZWxlbXMgKTsKCgkJLy8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSkKCQlyZXQucHJldk9iamVjdCA9IHRoaXM7CgoJCS8vIFJldHVybiB0aGUgbmV3bHktZm9ybWVkIGVsZW1lbnQgc2V0CgkJcmV0dXJuIHJldDsKCX0sCgoJLy8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC4KCWVhY2g6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHsKCQlyZXR1cm4galF1ZXJ5LmVhY2goIHRoaXMsIGNhbGxiYWNrICk7Cgl9LAoKCW1hcDogZnVuY3Rpb24oIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm1hcCggdGhpcywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7CgkJCXJldHVybiBjYWxsYmFjay5jYWxsKCBlbGVtLCBpLCBlbGVtICk7CgkJfSApICk7Cgl9LAoKCXNsaWNlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHNsaWNlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSApOwoJfSwKCglmaXJzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIDAgKTsKCX0sCgoJbGFzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIC0xICk7Cgl9LAoKCWVxOiBmdW5jdGlvbiggaSApIHsKCQl2YXIgbGVuID0gdGhpcy5sZW5ndGgsCgkJCWogPSAraSArICggaSA8IDAgPyBsZW4gOiAwICk7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqID49IDAgJiYgaiA8IGxlbiA/IFsgdGhpc1sgaiBdIF0gOiBbXSApOwoJfSwKCgllbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3RvcigpOwoJfSwKCgkvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCgkvLyBCZWhhdmVzIGxpa2UgYW4gQXJyYXkncyBtZXRob2QsIG5vdCBsaWtlIGEgalF1ZXJ5IG1ldGhvZC4KCXB1c2g6IHB1c2gsCglzb3J0OiBhcnIuc29ydCwKCXNwbGljZTogYXJyLnNwbGljZQp9OwoKalF1ZXJ5LmV4dGVuZCA9IGpRdWVyeS5mbi5leHRlbmQgPSBmdW5jdGlvbigpIHsKCXZhciBvcHRpb25zLCBuYW1lLCBzcmMsIGNvcHksIGNvcHlJc0FycmF5LCBjbG9uZSwKCQl0YXJnZXQgPSBhcmd1bWVudHNbIDAgXSB8fCB7fSwKCQlpID0gMSwKCQlsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLAoJCWRlZXAgPSBmYWxzZTsKCgkvLyBIYW5kbGUgYSBkZWVwIGNvcHkgc2l0dWF0aW9uCglpZiAoIHR5cGVvZiB0YXJnZXQgPT09ICJib29sZWFuIiApIHsKCQlkZWVwID0gdGFyZ2V0OwoKCQkvLyBTa2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0CgkJdGFyZ2V0ID0gYXJndW1lbnRzWyBpIF0gfHwge307CgkJaSsrOwoJfQoKCS8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KQoJaWYgKCB0eXBlb2YgdGFyZ2V0ICE9PSAib2JqZWN0IiAmJiAhaXNGdW5jdGlvbiggdGFyZ2V0ICkgKSB7CgkJdGFyZ2V0ID0ge307Cgl9CgoJLy8gRXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkCglpZiAoIGkgPT09IGxlbmd0aCApIHsKCQl0YXJnZXQgPSB0aGlzOwoJCWktLTsKCX0KCglmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCgkJLy8gT25seSBkZWFsIHdpdGggbm9uLW51bGwvdW5kZWZpbmVkIHZhbHVlcwoJCWlmICggKCBvcHRpb25zID0gYXJndW1lbnRzWyBpIF0gKSAhPSBudWxsICkgewoKCQkJLy8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdAoJCQlmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7CgkJCQlzcmMgPSB0YXJnZXRbIG5hbWUgXTsKCQkJCWNvcHkgPSBvcHRpb25zWyBuYW1lIF07CgoJCQkJLy8gUHJldmVudCBuZXZlci1lbmRpbmcgbG9vcAoJCQkJaWYgKCB0YXJnZXQgPT09IGNvcHkgKSB7CgkJCQkJY29udGludWU7CgkJCQl9CgoJCQkJLy8gUmVjdXJzZSBpZiB3ZSdyZSBtZXJnaW5nIHBsYWluIG9iamVjdHMgb3IgYXJyYXlzCgkJCQlpZiAoIGRlZXAgJiYgY29weSAmJiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb3B5ICkgfHwKCQkJCQkoIGNvcHlJc0FycmF5ID0gQXJyYXkuaXNBcnJheSggY29weSApICkgKSApIHsKCgkJCQkJaWYgKCBjb3B5SXNBcnJheSApIHsKCQkJCQkJY29weUlzQXJyYXkgPSBmYWxzZTsKCQkJCQkJY2xvbmUgPSBzcmMgJiYgQXJyYXkuaXNBcnJheSggc3JjICkgPyBzcmMgOiBbXTsKCgkJCQkJfSBlbHNlIHsKCQkJCQkJY2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIHNyYyApID8gc3JjIDoge307CgkJCQkJfQoKCQkJCQkvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW0KCQkJCQl0YXJnZXRbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGRlZXAsIGNsb25lLCBjb3B5ICk7CgoJCQkJLy8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlcwoJCQkJfSBlbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXRhcmdldFsgbmFtZSBdID0gY29weTsKCQkJCX0KCQkJfQoJCX0KCX0KCgkvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdAoJcmV0dXJuIHRhcmdldDsKfTsKCmpRdWVyeS5leHRlbmQoIHsKCgkvLyBVbmlxdWUgZm9yIGVhY2ggY29weSBvZiBqUXVlcnkgb24gdGhlIHBhZ2UKCWV4cGFuZG86ICJqUXVlcnkiICsgKCB2ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIC9cRC9nLCAiIiApLAoKCS8vIEFzc3VtZSBqUXVlcnkgaXMgcmVhZHkgd2l0aG91dCB0aGUgcmVhZHkgbW9kdWxlCglpc1JlYWR5OiB0cnVlLAoKCWVycm9yOiBmdW5jdGlvbiggbXNnICkgewoJCXRocm93IG5ldyBFcnJvciggbXNnICk7Cgl9LAoKCW5vb3A6IGZ1bmN0aW9uKCkge30sCgoJaXNQbGFpbk9iamVjdDogZnVuY3Rpb24oIG9iaiApIHsKCQl2YXIgcHJvdG8sIEN0b3I7CgoJCS8vIERldGVjdCBvYnZpb3VzIG5lZ2F0aXZlcwoJCS8vIFVzZSB0b1N0cmluZyBpbnN0ZWFkIG9mIGpRdWVyeS50eXBlIHRvIGNhdGNoIGhvc3Qgb2JqZWN0cwoJCWlmICggIW9iaiB8fCB0b1N0cmluZy5jYWxsKCBvYmogKSAhPT0gIltvYmplY3QgT2JqZWN0XSIgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCXByb3RvID0gZ2V0UHJvdG8oIG9iaiApOwoKCQkvLyBPYmplY3RzIHdpdGggbm8gcHJvdG90eXBlIChlLmcuLCBgT2JqZWN0LmNyZWF0ZSggbnVsbCApYCkgYXJlIHBsYWluCgkJaWYgKCAhcHJvdG8gKSB7CgkJCXJldHVybiB0cnVlOwoJCX0KCgkJLy8gT2JqZWN0cyB3aXRoIHByb3RvdHlwZSBhcmUgcGxhaW4gaWZmIHRoZXkgd2VyZSBjb25zdHJ1Y3RlZCBieSBhIGdsb2JhbCBPYmplY3QgZnVuY3Rpb24KCQlDdG9yID0gaGFzT3duLmNhbGwoIHByb3RvLCAiY29uc3RydWN0b3IiICkgJiYgcHJvdG8uY29uc3RydWN0b3I7CgkJcmV0dXJuIHR5cGVvZiBDdG9yID09PSAiZnVuY3Rpb24iICYmIGZuVG9TdHJpbmcuY2FsbCggQ3RvciApID09PSBPYmplY3RGdW5jdGlvblN0cmluZzsKCX0sCgoJaXNFbXB0eU9iamVjdDogZnVuY3Rpb24oIG9iaiApIHsKCgkJLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi8KCQkvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VzbGludC9lc2xpbnQvaXNzdWVzLzYxMjUKCQl2YXIgbmFtZTsKCgkJZm9yICggbmFtZSBpbiBvYmogKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJcmV0dXJuIHRydWU7Cgl9LAoKCS8vIEV2YWx1YXRlcyBhIHNjcmlwdCBpbiBhIGdsb2JhbCBjb250ZXh0CglnbG9iYWxFdmFsOiBmdW5jdGlvbiggY29kZSApIHsKCQlET01FdmFsKCBjb2RlICk7Cgl9LAoKCWVhY2g6IGZ1bmN0aW9uKCBvYmosIGNhbGxiYWNrICkgewoJCXZhciBsZW5ndGgsIGkgPSAwOwoKCQlpZiAoIGlzQXJyYXlMaWtlKCBvYmogKSApIHsKCQkJbGVuZ3RoID0gb2JqLmxlbmd0aDsKCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQlpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApID09PSBmYWxzZSApIHsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCWZvciAoIGkgaW4gb2JqICkgewoJCQkJaWYgKCBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKSA9PT0gZmFsc2UgKSB7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBvYmo7Cgl9LAoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seQoJdHJpbTogZnVuY3Rpb24oIHRleHQgKSB7CgkJcmV0dXJuIHRleHQgPT0gbnVsbCA/CgkJCSIiIDoKCQkJKCB0ZXh0ICsgIiIgKS5yZXBsYWNlKCBydHJpbSwgIiIgKTsKCX0sCgoJLy8gcmVzdWx0cyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seQoJbWFrZUFycmF5OiBmdW5jdGlvbiggYXJyLCByZXN1bHRzICkgewoJCXZhciByZXQgPSByZXN1bHRzIHx8IFtdOwoKCQlpZiAoIGFyciAhPSBudWxsICkgewoJCQlpZiAoIGlzQXJyYXlMaWtlKCBPYmplY3QoIGFyciApICkgKSB7CgkJCQlqUXVlcnkubWVyZ2UoIHJldCwKCQkJCQl0eXBlb2YgYXJyID09PSAic3RyaW5nIiA/CgkJCQkJWyBhcnIgXSA6IGFycgoJCQkJKTsKCQkJfSBlbHNlIHsKCQkJCXB1c2guY2FsbCggcmV0LCBhcnIgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX0sCgoJaW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFyciwgaSApIHsKCQlyZXR1cm4gYXJyID09IG51bGwgPyAtMSA6IGluZGV4T2YuY2FsbCggYXJyLCBlbGVtLCBpICk7Cgl9LAoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seQoJLy8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdAoJbWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkgewoJCXZhciBsZW4gPSArc2Vjb25kLmxlbmd0aCwKCQkJaiA9IDAsCgkJCWkgPSBmaXJzdC5sZW5ndGg7CgoJCWZvciAoIDsgaiA8IGxlbjsgaisrICkgewoJCQlmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTsKCQl9CgoJCWZpcnN0Lmxlbmd0aCA9IGk7CgoJCXJldHVybiBmaXJzdDsKCX0sCgoJZ3JlcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgaW52ZXJ0ICkgewoJCXZhciBjYWxsYmFja0ludmVyc2UsCgkJCW1hdGNoZXMgPSBbXSwKCQkJaSA9IDAsCgkJCWxlbmd0aCA9IGVsZW1zLmxlbmd0aCwKCQkJY2FsbGJhY2tFeHBlY3QgPSAhaW52ZXJ0OwoKCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zCgkJLy8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb24KCQlmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkJY2FsbGJhY2tJbnZlcnNlID0gIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7CgkJCWlmICggY2FsbGJhY2tJbnZlcnNlICE9PSBjYWxsYmFja0V4cGVjdCApIHsKCQkJCW1hdGNoZXMucHVzaCggZWxlbXNbIGkgXSApOwoJCQl9CgkJfQoKCQlyZXR1cm4gbWF0Y2hlczsKCX0sCgoJLy8gYXJnIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CgltYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGFyZyApIHsKCQl2YXIgbGVuZ3RoLCB2YWx1ZSwKCQkJaSA9IDAsCgkJCXJldCA9IFtdOwoKCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIgbmV3IHZhbHVlcwoJCWlmICggaXNBcnJheUxpa2UoIGVsZW1zICkgKSB7CgkJCWxlbmd0aCA9IGVsZW1zLmxlbmd0aDsKCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQl2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTsKCgkJCQlpZiAoIHZhbHVlICE9IG51bGwgKSB7CgkJCQkJcmV0LnB1c2goIHZhbHVlICk7CgkJCQl9CgkJCX0KCgkJLy8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9iamVjdCwKCQl9IGVsc2UgewoJCQlmb3IgKCBpIGluIGVsZW1zICkgewoJCQkJdmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7CgoJCQkJaWYgKCB2YWx1ZSAhPSBudWxsICkgewoJCQkJCXJldC5wdXNoKCB2YWx1ZSApOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzCgkJcmV0dXJuIGNvbmNhdC5hcHBseSggW10sIHJldCApOwoJfSwKCgkvLyBBIGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHMKCWd1aWQ6IDEsCgoJLy8galF1ZXJ5LnN1cHBvcnQgaXMgbm90IHVzZWQgaW4gQ29yZSBidXQgb3RoZXIgcHJvamVjdHMgYXR0YWNoIHRoZWlyCgkvLyBwcm9wZXJ0aWVzIHRvIGl0IHNvIGl0IG5lZWRzIHRvIGV4aXN0LgoJc3VwcG9ydDogc3VwcG9ydAp9ICk7CgppZiAoIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgKSB7CglqUXVlcnkuZm5bIFN5bWJvbC5pdGVyYXRvciBdID0gYXJyWyBTeW1ib2wuaXRlcmF0b3IgXTsKfQoKLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUgbWFwCmpRdWVyeS5lYWNoKCAiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCAiICIgKSwKZnVuY3Rpb24oIGksIG5hbWUgKSB7CgljbGFzczJ0eXBlWyAiW29iamVjdCAiICsgbmFtZSArICJdIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpOwp9ICk7CgpmdW5jdGlvbiBpc0FycmF5TGlrZSggb2JqICkgewoKCS8vIFN1cHBvcnQ6IHJlYWwgaU9TIDguMiBvbmx5IChub3QgcmVwcm9kdWNpYmxlIGluIHNpbXVsYXRvcikKCS8vIGBpbmAgY2hlY2sgdXNlZCB0byBwcmV2ZW50IEpJVCBlcnJvciAoZ2gtMjE0NSkKCS8vIGhhc093biBpc24ndCB1c2VkIGhlcmUgZHVlIHRvIGZhbHNlIG5lZ2F0aXZlcwoJLy8gcmVnYXJkaW5nIE5vZGVsaXN0IGxlbmd0aCBpbiBJRQoJdmFyIGxlbmd0aCA9ICEhb2JqICYmICJsZW5ndGgiIGluIG9iaiAmJiBvYmoubGVuZ3RoLAoJCXR5cGUgPSB0b1R5cGUoIG9iaiApOwoKCWlmICggaXNGdW5jdGlvbiggb2JqICkgfHwgaXNXaW5kb3coIG9iaiApICkgewoJCXJldHVybiBmYWxzZTsKCX0KCglyZXR1cm4gdHlwZSA9PT0gImFycmF5IiB8fCBsZW5ndGggPT09IDAgfHwKCQl0eXBlb2YgbGVuZ3RoID09PSAibnVtYmVyIiAmJiBsZW5ndGggPiAwICYmICggbGVuZ3RoIC0gMSApIGluIG9iajsKfQp2YXIgU2l6emxlID0KLyohCiAqIFNpenpsZSBDU1MgU2VsZWN0b3IgRW5naW5lIHYyLjMuMwogKiBodHRwczovL3NpenpsZWpzLmNvbS8KICoKICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogRGF0ZTogMjAxNi0wOC0wOAogKi8KKGZ1bmN0aW9uKCB3aW5kb3cgKSB7Cgp2YXIgaSwKCXN1cHBvcnQsCglFeHByLAoJZ2V0VGV4dCwKCWlzWE1MLAoJdG9rZW5pemUsCgljb21waWxlLAoJc2VsZWN0LAoJb3V0ZXJtb3N0Q29udGV4dCwKCXNvcnRJbnB1dCwKCWhhc0R1cGxpY2F0ZSwKCgkvLyBMb2NhbCBkb2N1bWVudCB2YXJzCglzZXREb2N1bWVudCwKCWRvY3VtZW50LAoJZG9jRWxlbSwKCWRvY3VtZW50SXNIVE1MLAoJcmJ1Z2d5UVNBLAoJcmJ1Z2d5TWF0Y2hlcywKCW1hdGNoZXMsCgljb250YWlucywKCgkvLyBJbnN0YW5jZS1zcGVjaWZpYyBkYXRhCglleHBhbmRvID0gInNpenpsZSIgKyAxICogbmV3IERhdGUoKSwKCXByZWZlcnJlZERvYyA9IHdpbmRvdy5kb2N1bWVudCwKCWRpcnJ1bnMgPSAwLAoJZG9uZSA9IDAsCgljbGFzc0NhY2hlID0gY3JlYXRlQ2FjaGUoKSwKCXRva2VuQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLAoJY29tcGlsZXJDYWNoZSA9IGNyZWF0ZUNhY2hlKCksCglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKCQlpZiAoIGEgPT09IGIgKSB7CgkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7CgkJfQoJCXJldHVybiAwOwoJfSwKCgkvLyBJbnN0YW5jZSBtZXRob2RzCgloYXNPd24gPSAoe30pLmhhc093blByb3BlcnR5LAoJYXJyID0gW10sCglwb3AgPSBhcnIucG9wLAoJcHVzaF9uYXRpdmUgPSBhcnIucHVzaCwKCXB1c2ggPSBhcnIucHVzaCwKCXNsaWNlID0gYXJyLnNsaWNlLAoJLy8gVXNlIGEgc3RyaXBwZWQtZG93biBpbmRleE9mIGFzIGl0J3MgZmFzdGVyIHRoYW4gbmF0aXZlCgkvLyBodHRwczovL2pzcGVyZi5jb20vdGhvci1pbmRleG9mLXZzLWZvci81CglpbmRleE9mID0gZnVuY3Rpb24oIGxpc3QsIGVsZW0gKSB7CgkJdmFyIGkgPSAwLAoJCQlsZW4gPSBsaXN0Lmxlbmd0aDsKCQlmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKCQkJaWYgKCBsaXN0W2ldID09PSBlbGVtICkgewoJCQkJcmV0dXJuIGk7CgkJCX0KCQl9CgkJcmV0dXJuIC0xOwoJfSwKCglib29sZWFucyA9ICJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsCgoJLy8gUmVndWxhciBleHByZXNzaW9ucwoKCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc2VsZWN0b3JzLyN3aGl0ZXNwYWNlCgl3aGl0ZXNwYWNlID0gIltcXHgyMFxcdFxcclxcblxcZl0iLAoKCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCN2YWx1ZS1kZWYtaWRlbnRpZmllcgoJaWRlbnRpZmllciA9ICIoPzpcXFxcLnxbXFx3LV18W15cMC1cXHhhMF0pKyIsCgoJLy8gQXR0cmlidXRlIHNlbGVjdG9yczogaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNhdHRyaWJ1dGUtc2VsZWN0b3JzCglhdHRyaWJ1dGVzID0gIlxcWyIgKyB3aGl0ZXNwYWNlICsgIiooIiArIGlkZW50aWZpZXIgKyAiKSg/OiIgKyB3aGl0ZXNwYWNlICsKCQkvLyBPcGVyYXRvciAoY2FwdHVyZSAyKQoJCSIqKFsqXiR8IX5dPz0pIiArIHdoaXRlc3BhY2UgKwoJCS8vICJBdHRyaWJ1dGUgdmFsdWVzIG11c3QgYmUgQ1NTIGlkZW50aWZpZXJzIFtjYXB0dXJlIDVdIG9yIHN0cmluZ3MgW2NhcHR1cmUgMyBvciBjYXB0dXJlIDRdIgoJCSIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIgKyBpZGVudGlmaWVyICsgIikpfCkiICsgd2hpdGVzcGFjZSArCgkJIipcXF0iLAoKCXBzZXVkb3MgPSAiOigiICsgaWRlbnRpZmllciArICIpKD86XFwoKCIgKwoJCS8vIFRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBuZWVkaW5nIHRva2VuaXplIGluIHRoZSBwcmVGaWx0ZXIsIHByZWZlciBhcmd1bWVudHM6CgkJLy8gMS4gcXVvdGVkIChjYXB0dXJlIDM7IGNhcHR1cmUgNCBvciBjYXB0dXJlIDUpCgkJIignKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcIil8IiArCgkJLy8gMi4gc2ltcGxlIChjYXB0dXJlIDYpCgkJIigoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIgKyBhdHRyaWJ1dGVzICsgIikqKXwiICsKCQkvLyAzLiBhbnl0aGluZyBlbHNlIChjYXB0dXJlIDIpCgkJIi4qIiArCgkJIilcXCl8KSIsCgoJLy8gTGVhZGluZyBhbmQgbm9uLWVzY2FwZWQgdHJhaWxpbmcgd2hpdGVzcGFjZSwgY2FwdHVyaW5nIHNvbWUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBwcmVjZWRpbmcgdGhlIGxhdHRlcgoJcndoaXRlc3BhY2UgPSBuZXcgUmVnRXhwKCB3aGl0ZXNwYWNlICsgIisiLCAiZyIgKSwKCXJ0cmltID0gbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiICsgd2hpdGVzcGFjZSArICIrJCIsICJnIiApLAoKCXJjb21tYSA9IG5ldyBSZWdFeHAoICJeIiArIHdoaXRlc3BhY2UgKyAiKiwiICsgd2hpdGVzcGFjZSArICIqIiApLAoJcmNvbWJpbmF0b3JzID0gbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIqKFs+K35dfCIgKyB3aGl0ZXNwYWNlICsgIikiICsgd2hpdGVzcGFjZSArICIqIiApLAoKCXJhdHRyaWJ1dGVRdW90ZXMgPSBuZXcgUmVnRXhwKCAiPSIgKyB3aGl0ZXNwYWNlICsgIiooW15cXF0nXCJdKj8pIiArIHdoaXRlc3BhY2UgKyAiKlxcXSIsICJnIiApLAoKCXJwc2V1ZG8gPSBuZXcgUmVnRXhwKCBwc2V1ZG9zICksCglyaWRlbnRpZmllciA9IG5ldyBSZWdFeHAoICJeIiArIGlkZW50aWZpZXIgKyAiJCIgKSwKCgltYXRjaEV4cHIgPSB7CgkJIklEIjogbmV3IFJlZ0V4cCggIl4jKCIgKyBpZGVudGlmaWVyICsgIikiICksCgkJIkNMQVNTIjogbmV3IFJlZ0V4cCggIl5cXC4oIiArIGlkZW50aWZpZXIgKyAiKSIgKSwKCQkiVEFHIjogbmV3IFJlZ0V4cCggIl4oIiArIGlkZW50aWZpZXIgKyAifFsqXSkiICksCgkJIkFUVFIiOiBuZXcgUmVnRXhwKCAiXiIgKyBhdHRyaWJ1dGVzICksCgkJIlBTRVVETyI6IG5ldyBSZWdFeHAoICJeIiArIHBzZXVkb3MgKSwKCQkiQ0hJTEQiOiBuZXcgUmVnRXhwKCAiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIiArIHdoaXRlc3BhY2UgKwoJCQkiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIgKyB3aGl0ZXNwYWNlICsgIiooPzooWystXXwpIiArIHdoaXRlc3BhY2UgKwoJCQkiKihcXGQrKXwpKSIgKyB3aGl0ZXNwYWNlICsgIipcXCl8KSIsICJpIiApLAoJCSJib29sIjogbmV3IFJlZ0V4cCggIl4oPzoiICsgYm9vbGVhbnMgKyAiKSQiLCAiaSIgKSwKCQkvLyBGb3IgdXNlIGluIGxpYnJhcmllcyBpbXBsZW1lbnRpbmcgLmlzKCkKCQkvLyBXZSB1c2UgdGhpcyBmb3IgUE9TIG1hdGNoaW5nIGluIGBzZWxlY3RgCgkJIm5lZWRzQ29udGV4dCI6IG5ldyBSZWdFeHAoICJeIiArIHdoaXRlc3BhY2UgKyAiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIiArCgkJCXdoaXRlc3BhY2UgKyAiKigoPzotXFxkKT9cXGQqKSIgKyB3aGl0ZXNwYWNlICsgIipcXCl8KSg/PVteLV18JCkiLCAiaSIgKQoJfSwKCglyaW5wdXRzID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSwKCXJoZWFkZXIgPSAvXmhcZCQvaSwKCglybmF0aXZlID0gL15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLAoKCS8vIEVhc2lseS1wYXJzZWFibGUvcmV0cmlldmFibGUgSUQgb3IgVEFHIG9yIENMQVNTIHNlbGVjdG9ycwoJcnF1aWNrRXhwciA9IC9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sCgoJcnNpYmxpbmcgPSAvWyt+XS8sCgoJLy8gQ1NTIGVzY2FwZXMKCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCNlc2NhcGVkLWNoYXJhY3RlcnMKCXJ1bmVzY2FwZSA9IG5ldyBSZWdFeHAoICJcXFxcKFtcXGRhLWZdezEsNn0iICsgd2hpdGVzcGFjZSArICI/fCgiICsgd2hpdGVzcGFjZSArICIpfC4pIiwgImlnIiApLAoJZnVuZXNjYXBlID0gZnVuY3Rpb24oIF8sIGVzY2FwZWQsIGVzY2FwZWRXaGl0ZXNwYWNlICkgewoJCXZhciBoaWdoID0gIjB4IiArIGVzY2FwZWQgLSAweDEwMDAwOwoJCS8vIE5hTiBtZWFucyBub24tY29kZXBvaW50CgkJLy8gU3VwcG9ydDogRmlyZWZveDwyNAoJCS8vIFdvcmthcm91bmQgZXJyb25lb3VzIG51bWVyaWMgaW50ZXJwcmV0YXRpb24gb2YgKyIweCIKCQlyZXR1cm4gaGlnaCAhPT0gaGlnaCB8fCBlc2NhcGVkV2hpdGVzcGFjZSA/CgkJCWVzY2FwZWQgOgoJCQloaWdoIDwgMCA/CgkJCQkvLyBCTVAgY29kZXBvaW50CgkJCQlTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoICsgMHgxMDAwMCApIDoKCQkJCS8vIFN1cHBsZW1lbnRhbCBQbGFuZSBjb2RlcG9pbnQgKHN1cnJvZ2F0ZSBwYWlyKQoJCQkJU3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCA+PiAxMCB8IDB4RDgwMCwgaGlnaCAmIDB4M0ZGIHwgMHhEQzAwICk7Cgl9LAoKCS8vIENTUyBzdHJpbmcvaWRlbnRpZmllciBzZXJpYWxpemF0aW9uCgkvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3Nzb20vI2NvbW1vbi1zZXJpYWxpemluZy1pZGlvbXMKCXJjc3Nlc2NhcGUgPSAvKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZywKCWZjc3Nlc2NhcGUgPSBmdW5jdGlvbiggY2gsIGFzQ29kZVBvaW50ICkgewoJCWlmICggYXNDb2RlUG9pbnQgKSB7CgoJCQkvLyBVKzAwMDAgTlVMTCBiZWNvbWVzIFUrRkZGRCBSRVBMQUNFTUVOVCBDSEFSQUNURVIKCQkJaWYgKCBjaCA9PT0gIlwwIiApIHsKCQkJCXJldHVybiAiXHVGRkZEIjsKCQkJfQoKCQkJLy8gQ29udHJvbCBjaGFyYWN0ZXJzIGFuZCAoZGVwZW5kZW50IHVwb24gcG9zaXRpb24pIG51bWJlcnMgZ2V0IGVzY2FwZWQgYXMgY29kZSBwb2ludHMKCQkJcmV0dXJuIGNoLnNsaWNlKCAwLCAtMSApICsgIlxcIiArIGNoLmNoYXJDb2RlQXQoIGNoLmxlbmd0aCAtIDEgKS50b1N0cmluZyggMTYgKSArICIgIjsKCQl9CgoJCS8vIE90aGVyIHBvdGVudGlhbGx5LXNwZWNpYWwgQVNDSUkgY2hhcmFjdGVycyBnZXQgYmFja3NsYXNoLWVzY2FwZWQKCQlyZXR1cm4gIlxcIiArIGNoOwoJfSwKCgkvLyBVc2VkIGZvciBpZnJhbWVzCgkvLyBTZWUgc2V0RG9jdW1lbnQoKQoJLy8gUmVtb3ZpbmcgdGhlIGZ1bmN0aW9uIHdyYXBwZXIgY2F1c2VzIGEgIlBlcm1pc3Npb24gRGVuaWVkIgoJLy8gZXJyb3IgaW4gSUUKCXVubG9hZEhhbmRsZXIgPSBmdW5jdGlvbigpIHsKCQlzZXREb2N1bWVudCgpOwoJfSwKCglkaXNhYmxlZEFuY2VzdG9yID0gYWRkQ29tYmluYXRvcigKCQlmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWUgJiYgKCJmb3JtIiBpbiBlbGVtIHx8ICJsYWJlbCIgaW4gZWxlbSk7CgkJfSwKCQl7IGRpcjogInBhcmVudE5vZGUiLCBuZXh0OiAibGVnZW5kIiB9CgkpOwoKLy8gT3B0aW1pemUgZm9yIHB1c2guYXBwbHkoIF8sIE5vZGVMaXN0ICkKdHJ5IHsKCXB1c2guYXBwbHkoCgkJKGFyciA9IHNsaWNlLmNhbGwoIHByZWZlcnJlZERvYy5jaGlsZE5vZGVzICkpLAoJCXByZWZlcnJlZERvYy5jaGlsZE5vZGVzCgkpOwoJLy8gU3VwcG9ydDogQW5kcm9pZDw0LjAKCS8vIERldGVjdCBzaWxlbnRseSBmYWlsaW5nIHB1c2guYXBwbHkKCWFyclsgcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMubGVuZ3RoIF0ubm9kZVR5cGU7Cn0gY2F0Y2ggKCBlICkgewoJcHVzaCA9IHsgYXBwbHk6IGFyci5sZW5ndGggPwoKCQkvLyBMZXZlcmFnZSBzbGljZSBpZiBwb3NzaWJsZQoJCWZ1bmN0aW9uKCB0YXJnZXQsIGVscyApIHsKCQkJcHVzaF9uYXRpdmUuYXBwbHkoIHRhcmdldCwgc2xpY2UuY2FsbChlbHMpICk7CgkJfSA6CgoJCS8vIFN1cHBvcnQ6IElFPDkKCQkvLyBPdGhlcndpc2UgYXBwZW5kIGRpcmVjdGx5CgkJZnVuY3Rpb24oIHRhcmdldCwgZWxzICkgewoJCQl2YXIgaiA9IHRhcmdldC5sZW5ndGgsCgkJCQlpID0gMDsKCQkJLy8gQ2FuJ3QgdHJ1c3QgTm9kZUxpc3QubGVuZ3RoCgkJCXdoaWxlICggKHRhcmdldFtqKytdID0gZWxzW2krK10pICkge30KCQkJdGFyZ2V0Lmxlbmd0aCA9IGogLSAxOwoJCX0KCX07Cn0KCmZ1bmN0aW9uIFNpenpsZSggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7Cgl2YXIgbSwgaSwgZWxlbSwgbmlkLCBtYXRjaCwgZ3JvdXBzLCBuZXdTZWxlY3RvciwKCQluZXdDb250ZXh0ID0gY29udGV4dCAmJiBjb250ZXh0Lm93bmVyRG9jdW1lbnQsCgoJCS8vIG5vZGVUeXBlIGRlZmF1bHRzIHRvIDksIHNpbmNlIGNvbnRleHQgZGVmYXVsdHMgdG8gZG9jdW1lbnQKCQlub2RlVHlwZSA9IGNvbnRleHQgPyBjb250ZXh0Lm5vZGVUeXBlIDogOTsKCglyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTsKCgkvLyBSZXR1cm4gZWFybHkgZnJvbSBjYWxscyB3aXRoIGludmFsaWQgc2VsZWN0b3Igb3IgY29udGV4dAoJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciIHx8ICFzZWxlY3RvciB8fAoJCW5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICYmIG5vZGVUeXBlICE9PSAxMSApIHsKCgkJcmV0dXJuIHJlc3VsdHM7Cgl9CgoJLy8gVHJ5IHRvIHNob3J0Y3V0IGZpbmQgb3BlcmF0aW9ucyAoYXMgb3Bwb3NlZCB0byBmaWx0ZXJzKSBpbiBIVE1MIGRvY3VtZW50cwoJaWYgKCAhc2VlZCApIHsKCgkJaWYgKCAoIGNvbnRleHQgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6IHByZWZlcnJlZERvYyApICE9PSBkb2N1bWVudCApIHsKCQkJc2V0RG9jdW1lbnQoIGNvbnRleHQgKTsKCQl9CgkJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CgoJCWlmICggZG9jdW1lbnRJc0hUTUwgKSB7CgoJCQkvLyBJZiB0aGUgc2VsZWN0b3IgaXMgc3VmZmljaWVudGx5IHNpbXBsZSwgdHJ5IHVzaW5nIGEgImdldCpCeSoiIERPTSBtZXRob2QKCQkJLy8gKGV4Y2VwdGluZyBEb2N1bWVudEZyYWdtZW50IGNvbnRleHQsIHdoZXJlIHRoZSBtZXRob2RzIGRvbid0IGV4aXN0KQoJCQlpZiAoIG5vZGVUeXBlICE9PSAxMSAmJiAobWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICkpICkgewoKCQkJCS8vIElEIHNlbGVjdG9yCgkJCQlpZiAoIChtID0gbWF0Y2hbMV0pICkgewoKCQkJCQkvLyBEb2N1bWVudCBjb250ZXh0CgkJCQkJaWYgKCBub2RlVHlwZSA9PT0gOSApIHsKCQkJCQkJaWYgKCAoZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSkgKSB7CgoJCQkJCQkJLy8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXQKCQkJCQkJCS8vIFRPRE86IGlkZW50aWZ5IHZlcnNpb25zCgkJCQkJCQkvLyBnZXRFbGVtZW50QnlJZCBjYW4gbWF0Y2ggZWxlbWVudHMgYnkgbmFtZSBpbnN0ZWFkIG9mIElECgkJCQkJCQlpZiAoIGVsZW0uaWQgPT09IG0gKSB7CgkJCQkJCQkJcmVzdWx0cy5wdXNoKCBlbGVtICk7CgkJCQkJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCQkJCQl9CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlyZXR1cm4gcmVzdWx0czsKCQkJCQkJfQoKCQkJCQkvLyBFbGVtZW50IGNvbnRleHQKCQkJCQl9IGVsc2UgewoKCQkJCQkJLy8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXQKCQkJCQkJLy8gVE9ETzogaWRlbnRpZnkgdmVyc2lvbnMKCQkJCQkJLy8gZ2V0RWxlbWVudEJ5SWQgY2FuIG1hdGNoIGVsZW1lbnRzIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRAoJCQkJCQlpZiAoIG5ld0NvbnRleHQgJiYgKGVsZW0gPSBuZXdDb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICkpICYmCgkJCQkJCQljb250YWlucyggY29udGV4dCwgZWxlbSApICYmCgkJCQkJCQllbGVtLmlkID09PSBtICkgewoKCQkJCQkJCXJlc3VsdHMucHVzaCggZWxlbSApOwoJCQkJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCQkJCX0KCQkJCQl9CgoJCQkJLy8gVHlwZSBzZWxlY3RvcgoJCQkJfSBlbHNlIGlmICggbWF0Y2hbMl0gKSB7CgkJCQkJcHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggc2VsZWN0b3IgKSApOwoJCQkJCXJldHVybiByZXN1bHRzOwoKCQkJCS8vIENsYXNzIHNlbGVjdG9yCgkJCQl9IGVsc2UgaWYgKCAobSA9IG1hdGNoWzNdKSAmJiBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiYKCQkJCQljb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKSB7CgoJCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggbSApICk7CgkJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCQl9CgkJCX0KCgkJCS8vIFRha2UgYWR2YW50YWdlIG9mIHF1ZXJ5U2VsZWN0b3JBbGwKCQkJaWYgKCBzdXBwb3J0LnFzYSAmJgoJCQkJIWNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgIiAiIF0gJiYKCQkJCSghcmJ1Z2d5UVNBIHx8ICFyYnVnZ3lRU0EudGVzdCggc2VsZWN0b3IgKSkgKSB7CgoJCQkJaWYgKCBub2RlVHlwZSAhPT0gMSApIHsKCQkJCQluZXdDb250ZXh0ID0gY29udGV4dDsKCQkJCQluZXdTZWxlY3RvciA9IHNlbGVjdG9yOwoKCQkJCS8vIHFTQSBsb29rcyBvdXRzaWRlIEVsZW1lbnQgY29udGV4dCwgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudAoJCQkJLy8gVGhhbmtzIHRvIEFuZHJldyBEdXBvbnQgZm9yIHRoaXMgd29ya2Fyb3VuZCB0ZWNobmlxdWUKCQkJCS8vIFN1cHBvcnQ6IElFIDw9OAoJCQkJLy8gRXhjbHVkZSBvYmplY3QgZWxlbWVudHMKCQkJCX0gZWxzZSBpZiAoIGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gIm9iamVjdCIgKSB7CgoJCQkJCS8vIENhcHR1cmUgdGhlIGNvbnRleHQgSUQsIHNldHRpbmcgaXQgZmlyc3QgaWYgbmVjZXNzYXJ5CgkJCQkJaWYgKCAobmlkID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoICJpZCIgKSkgKSB7CgkJCQkJCW5pZCA9IG5pZC5yZXBsYWNlKCByY3NzZXNjYXBlLCBmY3NzZXNjYXBlICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJY29udGV4dC5zZXRBdHRyaWJ1dGUoICJpZCIsIChuaWQgPSBleHBhbmRvKSApOwoJCQkJCX0KCgkJCQkJLy8gUHJlZml4IGV2ZXJ5IHNlbGVjdG9yIGluIHRoZSBsaXN0CgkJCQkJZ3JvdXBzID0gdG9rZW5pemUoIHNlbGVjdG9yICk7CgkJCQkJaSA9IGdyb3Vwcy5sZW5ndGg7CgkJCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQkJCWdyb3Vwc1tpXSA9ICIjIiArIG5pZCArICIgIiArIHRvU2VsZWN0b3IoIGdyb3Vwc1tpXSApOwoJCQkJCX0KCQkJCQluZXdTZWxlY3RvciA9IGdyb3Vwcy5qb2luKCAiLCIgKTsKCgkJCQkJLy8gRXhwYW5kIGNvbnRleHQgZm9yIHNpYmxpbmcgc2VsZWN0b3JzCgkJCQkJbmV3Q29udGV4dCA9IHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8CgkJCQkJCWNvbnRleHQ7CgkJCQl9CgoJCQkJaWYgKCBuZXdTZWxlY3RvciApIHsKCQkJCQl0cnkgewoJCQkJCQlwdXNoLmFwcGx5KCByZXN1bHRzLAoJCQkJCQkJbmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCBuZXdTZWxlY3RvciApCgkJCQkJCSk7CgkJCQkJCXJldHVybiByZXN1bHRzOwoJCQkJCX0gY2F0Y2ggKCBxc2FFcnJvciApIHsKCQkJCQl9IGZpbmFsbHkgewoJCQkJCQlpZiAoIG5pZCA9PT0gZXhwYW5kbyApIHsKCQkJCQkJCWNvbnRleHQucmVtb3ZlQXR0cmlidXRlKCAiaWQiICk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQl9Cgl9CgoJLy8gQWxsIG90aGVycwoJcmV0dXJuIHNlbGVjdCggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sICIkMSIgKSwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApOwp9CgovKioKICogQ3JlYXRlIGtleS12YWx1ZSBjYWNoZXMgb2YgbGltaXRlZCBzaXplCiAqIEByZXR1cm5zIHtmdW5jdGlvbihzdHJpbmcsIG9iamVjdCl9IFJldHVybnMgdGhlIE9iamVjdCBkYXRhIGFmdGVyIHN0b3JpbmcgaXQgb24gaXRzZWxmIHdpdGgKICoJcHJvcGVydHkgbmFtZSB0aGUgKHNwYWNlLXN1ZmZpeGVkKSBzdHJpbmcgYW5kIChpZiB0aGUgY2FjaGUgaXMgbGFyZ2VyIHRoYW4gRXhwci5jYWNoZUxlbmd0aCkKICoJZGVsZXRpbmcgdGhlIG9sZGVzdCBlbnRyeQogKi8KZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKSB7Cgl2YXIga2V5cyA9IFtdOwoKCWZ1bmN0aW9uIGNhY2hlKCBrZXksIHZhbHVlICkgewoJCS8vIFVzZSAoa2V5ICsgIiAiKSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUgcHJvdG90eXBlIHByb3BlcnRpZXMgKHNlZSBJc3N1ZSAjMTU3KQoJCWlmICgga2V5cy5wdXNoKCBrZXkgKyAiICIgKSA+IEV4cHIuY2FjaGVMZW5ndGggKSB7CgkJCS8vIE9ubHkga2VlcCB0aGUgbW9zdCByZWNlbnQgZW50cmllcwoJCQlkZWxldGUgY2FjaGVbIGtleXMuc2hpZnQoKSBdOwoJCX0KCQlyZXR1cm4gKGNhY2hlWyBrZXkgKyAiICIgXSA9IHZhbHVlKTsKCX0KCXJldHVybiBjYWNoZTsKfQoKLyoqCiAqIE1hcmsgYSBmdW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlCiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBtYXJrCiAqLwpmdW5jdGlvbiBtYXJrRnVuY3Rpb24oIGZuICkgewoJZm5bIGV4cGFuZG8gXSA9IHRydWU7CglyZXR1cm4gZm47Cn0KCi8qKgogKiBTdXBwb3J0IHRlc3RpbmcgdXNpbmcgYW4gZWxlbWVudAogKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQgZWxlbWVudCBhbmQgcmV0dXJucyBhIGJvb2xlYW4gcmVzdWx0CiAqLwpmdW5jdGlvbiBhc3NlcnQoIGZuICkgewoJdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKTsKCgl0cnkgewoJCXJldHVybiAhIWZuKCBlbCApOwoJfSBjYXRjaCAoZSkgewoJCXJldHVybiBmYWxzZTsKCX0gZmluYWxseSB7CgkJLy8gUmVtb3ZlIGZyb20gaXRzIHBhcmVudCBieSBkZWZhdWx0CgkJaWYgKCBlbC5wYXJlbnROb2RlICkgewoJCQllbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbCApOwoJCX0KCQkvLyByZWxlYXNlIG1lbW9yeSBpbiBJRQoJCWVsID0gbnVsbDsKCX0KfQoKLyoqCiAqIEFkZHMgdGhlIHNhbWUgaGFuZGxlciBmb3IgYWxsIG9mIHRoZSBzcGVjaWZpZWQgYXR0cnMKICogQHBhcmFtIHtTdHJpbmd9IGF0dHJzIFBpcGUtc2VwYXJhdGVkIGxpc3Qgb2YgYXR0cmlidXRlcwogKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyIFRoZSBtZXRob2QgdGhhdCB3aWxsIGJlIGFwcGxpZWQKICovCmZ1bmN0aW9uIGFkZEhhbmRsZSggYXR0cnMsIGhhbmRsZXIgKSB7Cgl2YXIgYXJyID0gYXR0cnMuc3BsaXQoInwiKSwKCQlpID0gYXJyLmxlbmd0aDsKCgl3aGlsZSAoIGktLSApIHsKCQlFeHByLmF0dHJIYW5kbGVbIGFycltpXSBdID0gaGFuZGxlcjsKCX0KfQoKLyoqCiAqIENoZWNrcyBkb2N1bWVudCBvcmRlciBvZiB0d28gc2libGluZ3MKICogQHBhcmFtIHtFbGVtZW50fSBhCiAqIEBwYXJhbSB7RWxlbWVudH0gYgogKiBAcmV0dXJucyB7TnVtYmVyfSBSZXR1cm5zIGxlc3MgdGhhbiAwIGlmIGEgcHJlY2VkZXMgYiwgZ3JlYXRlciB0aGFuIDAgaWYgYSBmb2xsb3dzIGIKICovCmZ1bmN0aW9uIHNpYmxpbmdDaGVjayggYSwgYiApIHsKCXZhciBjdXIgPSBiICYmIGEsCgkJZGlmZiA9IGN1ciAmJiBhLm5vZGVUeXBlID09PSAxICYmIGIubm9kZVR5cGUgPT09IDEgJiYKCQkJYS5zb3VyY2VJbmRleCAtIGIuc291cmNlSW5kZXg7CgoJLy8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzCglpZiAoIGRpZmYgKSB7CgkJcmV0dXJuIGRpZmY7Cgl9CgoJLy8gQ2hlY2sgaWYgYiBmb2xsb3dzIGEKCWlmICggY3VyICkgewoJCXdoaWxlICggKGN1ciA9IGN1ci5uZXh0U2libGluZykgKSB7CgkJCWlmICggY3VyID09PSBiICkgewoJCQkJcmV0dXJuIC0xOwoJCQl9CgkJfQoJfQoKCXJldHVybiBhID8gMSA6IC0xOwp9CgovKioKICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBpbnB1dCB0eXBlcwogKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogKi8KZnVuY3Rpb24gY3JlYXRlSW5wdXRQc2V1ZG8oIHR5cGUgKSB7CglyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJcmV0dXJuIG5hbWUgPT09ICJpbnB1dCIgJiYgZWxlbS50eXBlID09PSB0eXBlOwoJfTsKfQoKLyoqCiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgYnV0dG9ucwogKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogKi8KZnVuY3Rpb24gY3JlYXRlQnV0dG9uUHNldWRvKCB0eXBlICkgewoJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCXZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwoJCXJldHVybiAobmFtZSA9PT0gImlucHV0IiB8fCBuYW1lID09PSAiYnV0dG9uIikgJiYgZWxlbS50eXBlID09PSB0eXBlOwoJfTsKfQoKLyoqCiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgOmVuYWJsZWQvOmRpc2FibGVkCiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGlzYWJsZWQgdHJ1ZSBmb3IgOmRpc2FibGVkOyBmYWxzZSBmb3IgOmVuYWJsZWQKICovCmZ1bmN0aW9uIGNyZWF0ZURpc2FibGVkUHNldWRvKCBkaXNhYmxlZCApIHsKCgkvLyBLbm93biA6ZGlzYWJsZWQgZmFsc2UgcG9zaXRpdmVzOiBmaWVsZHNldFtkaXNhYmxlZF0gPiBsZWdlbmQ6bnRoLW9mLXR5cGUobisyKSA6Y2FuLWRpc2FibGUKCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKCgkJLy8gT25seSBjZXJ0YWluIGVsZW1lbnRzIGNhbiBtYXRjaCA6ZW5hYmxlZCBvciA6ZGlzYWJsZWQKCQkvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zY3JpcHRpbmcuaHRtbCNzZWxlY3Rvci1lbmFibGVkCgkJLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2NyaXB0aW5nLmh0bWwjc2VsZWN0b3ItZGlzYWJsZWQKCQlpZiAoICJmb3JtIiBpbiBlbGVtICkgewoKCQkJLy8gQ2hlY2sgZm9yIGluaGVyaXRlZCBkaXNhYmxlZG5lc3Mgb24gcmVsZXZhbnQgbm9uLWRpc2FibGVkIGVsZW1lbnRzOgoJCQkvLyAqIGxpc3RlZCBmb3JtLWFzc29jaWF0ZWQgZWxlbWVudHMgaW4gYSBkaXNhYmxlZCBmaWVsZHNldAoJCQkvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY2F0ZWdvcnktbGlzdGVkCgkJCS8vICAgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNjb25jZXB0LWZlLWRpc2FibGVkCgkJCS8vICogb3B0aW9uIGVsZW1lbnRzIGluIGEgZGlzYWJsZWQgb3B0Z3JvdXAKCQkJLy8gICBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI2NvbmNlcHQtb3B0aW9uLWRpc2FibGVkCgkJCS8vIEFsbCBzdWNoIGVsZW1lbnRzIGhhdmUgYSAiZm9ybSIgcHJvcGVydHkuCgkJCWlmICggZWxlbS5wYXJlbnROb2RlICYmIGVsZW0uZGlzYWJsZWQgPT09IGZhbHNlICkgewoKCQkJCS8vIE9wdGlvbiBlbGVtZW50cyBkZWZlciB0byBhIHBhcmVudCBvcHRncm91cCBpZiBwcmVzZW50CgkJCQlpZiAoICJsYWJlbCIgaW4gZWxlbSApIHsKCQkJCQlpZiAoICJsYWJlbCIgaW4gZWxlbS5wYXJlbnROb2RlICkgewoJCQkJCQlyZXR1cm4gZWxlbS5wYXJlbnROb2RlLmRpc2FibGVkID09PSBkaXNhYmxlZDsKCQkJCQl9IGVsc2UgewoJCQkJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIFN1cHBvcnQ6IElFIDYgLSAxMQoJCQkJLy8gVXNlIHRoZSBpc0Rpc2FibGVkIHNob3J0Y3V0IHByb3BlcnR5IHRvIGNoZWNrIGZvciBkaXNhYmxlZCBmaWVsZHNldCBhbmNlc3RvcnMKCQkJCXJldHVybiBlbGVtLmlzRGlzYWJsZWQgPT09IGRpc2FibGVkIHx8CgoJCQkJCS8vIFdoZXJlIHRoZXJlIGlzIG5vIGlzRGlzYWJsZWQsIGNoZWNrIG1hbnVhbGx5CgkJCQkJLyoganNoaW50IC1XMDE4ICovCgkJCQkJZWxlbS5pc0Rpc2FibGVkICE9PSAhZGlzYWJsZWQgJiYKCQkJCQkJZGlzYWJsZWRBbmNlc3RvciggZWxlbSApID09PSBkaXNhYmxlZDsKCQkJfQoKCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IGRpc2FibGVkOwoKCQkvLyBUcnkgdG8gd2lubm93IG91dCBlbGVtZW50cyB0aGF0IGNhbid0IGJlIGRpc2FibGVkIGJlZm9yZSB0cnVzdGluZyB0aGUgZGlzYWJsZWQgcHJvcGVydHkuCgkJLy8gU29tZSB2aWN0aW1zIGdldCBjYXVnaHQgaW4gb3VyIG5ldCAobGFiZWwsIGxlZ2VuZCwgbWVudSwgdHJhY2spLCBidXQgaXQgc2hvdWxkbid0CgkJLy8gZXZlbiBleGlzdCBvbiB0aGVtLCBsZXQgYWxvbmUgaGF2ZSBhIGJvb2xlYW4gdmFsdWUuCgkJfSBlbHNlIGlmICggImxhYmVsIiBpbiBlbGVtICkgewoJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7CgkJfQoKCQkvLyBSZW1haW5pbmcgZWxlbWVudHMgYXJlIG5laXRoZXIgOmVuYWJsZWQgbm9yIDpkaXNhYmxlZAoJCXJldHVybiBmYWxzZTsKCX07Cn0KCi8qKgogKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIHBvc2l0aW9uYWxzCiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuCiAqLwpmdW5jdGlvbiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmbiApIHsKCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIGFyZ3VtZW50ICkgewoJCWFyZ3VtZW50ID0gK2FyZ3VtZW50OwoJCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7CgkJCXZhciBqLAoJCQkJbWF0Y2hJbmRleGVzID0gZm4oIFtdLCBzZWVkLmxlbmd0aCwgYXJndW1lbnQgKSwKCQkJCWkgPSBtYXRjaEluZGV4ZXMubGVuZ3RoOwoKCQkJLy8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzCgkJCXdoaWxlICggaS0tICkgewoJCQkJaWYgKCBzZWVkWyAoaiA9IG1hdGNoSW5kZXhlc1tpXSkgXSApIHsKCQkJCQlzZWVkW2pdID0gIShtYXRjaGVzW2pdID0gc2VlZFtqXSk7CgkJCQl9CgkJCX0KCQl9KTsKCX0pOwp9CgovKioKICogQ2hlY2tzIGEgbm9kZSBmb3IgdmFsaWRpdHkgYXMgYSBTaXp6bGUgY29udGV4dAogKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0PX0gY29udGV4dAogKiBAcmV0dXJucyB7RWxlbWVudHxPYmplY3R8Qm9vbGVhbn0gVGhlIGlucHV0IG5vZGUgaWYgYWNjZXB0YWJsZSwgb3RoZXJ3aXNlIGEgZmFsc3kgdmFsdWUKICovCmZ1bmN0aW9uIHRlc3RDb250ZXh0KCBjb250ZXh0ICkgewoJcmV0dXJuIGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICYmIGNvbnRleHQ7Cn0KCi8vIEV4cG9zZSBzdXBwb3J0IHZhcnMgZm9yIGNvbnZlbmllbmNlCnN1cHBvcnQgPSBTaXp6bGUuc3VwcG9ydCA9IHt9OwoKLyoqCiAqIERldGVjdHMgWE1MIG5vZGVzCiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IGVsZW0gQW4gZWxlbWVudCBvciBhIGRvY3VtZW50CiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmZiBlbGVtIGlzIGEgbm9uLUhUTUwgWE1MIG5vZGUKICovCmlzWE1MID0gU2l6emxlLmlzWE1MID0gZnVuY3Rpb24oIGVsZW0gKSB7CgkvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0CgkvLyAoc3VjaCBhcyBsb2FkaW5nIGlmcmFtZXMgaW4gSUUgLSAjNDgzMykKCXZhciBkb2N1bWVudEVsZW1lbnQgPSBlbGVtICYmIChlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSkuZG9jdW1lbnRFbGVtZW50OwoJcmV0dXJuIGRvY3VtZW50RWxlbWVudCA/IGRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIDogZmFsc2U7Cn07CgovKioKICogU2V0cyBkb2N1bWVudC1yZWxhdGVkIHZhcmlhYmxlcyBvbmNlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRvY3VtZW50CiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IFtkb2NdIEFuIGVsZW1lbnQgb3IgZG9jdW1lbnQgb2JqZWN0IHRvIHVzZSB0byBzZXQgdGhlIGRvY3VtZW50CiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGN1cnJlbnQgZG9jdW1lbnQKICovCnNldERvY3VtZW50ID0gU2l6emxlLnNldERvY3VtZW50ID0gZnVuY3Rpb24oIG5vZGUgKSB7Cgl2YXIgaGFzQ29tcGFyZSwgc3ViV2luZG93LAoJCWRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYzsKCgkvLyBSZXR1cm4gZWFybHkgaWYgZG9jIGlzIGludmFsaWQgb3IgYWxyZWFkeSBzZWxlY3RlZAoJaWYgKCBkb2MgPT09IGRvY3VtZW50IHx8IGRvYy5ub2RlVHlwZSAhPT0gOSB8fCAhZG9jLmRvY3VtZW50RWxlbWVudCApIHsKCQlyZXR1cm4gZG9jdW1lbnQ7Cgl9CgoJLy8gVXBkYXRlIGdsb2JhbCB2YXJpYWJsZXMKCWRvY3VtZW50ID0gZG9jOwoJZG9jRWxlbSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCWRvY3VtZW50SXNIVE1MID0gIWlzWE1MKCBkb2N1bWVudCApOwoKCS8vIFN1cHBvcnQ6IElFIDktMTEsIEVkZ2UKCS8vIEFjY2Vzc2luZyBpZnJhbWUgZG9jdW1lbnRzIGFmdGVyIHVubG9hZCB0aHJvd3MgInBlcm1pc3Npb24gZGVuaWVkIiBlcnJvcnMgKGpRdWVyeSAjMTM5MzYpCglpZiAoIHByZWZlcnJlZERvYyAhPT0gZG9jdW1lbnQgJiYKCQkoc3ViV2luZG93ID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcpICYmIHN1YldpbmRvdy50b3AgIT09IHN1YldpbmRvdyApIHsKCgkJLy8gU3VwcG9ydDogSUUgMTEsIEVkZ2UKCQlpZiAoIHN1YldpbmRvdy5hZGRFdmVudExpc3RlbmVyICkgewoJCQlzdWJXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggInVubG9hZCIsIHVubG9hZEhhbmRsZXIsIGZhbHNlICk7CgoJCS8vIFN1cHBvcnQ6IElFIDkgLSAxMCBvbmx5CgkJfSBlbHNlIGlmICggc3ViV2luZG93LmF0dGFjaEV2ZW50ICkgewoJCQlzdWJXaW5kb3cuYXR0YWNoRXZlbnQoICJvbnVubG9hZCIsIHVubG9hZEhhbmRsZXIgKTsKCQl9Cgl9CgoJLyogQXR0cmlidXRlcwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8vIFN1cHBvcnQ6IElFPDgKCS8vIFZlcmlmeSB0aGF0IGdldEF0dHJpYnV0ZSByZWFsbHkgcmV0dXJucyBhdHRyaWJ1dGVzIGFuZCBub3QgcHJvcGVydGllcwoJLy8gKGV4Y2VwdGluZyBJRTggYm9vbGVhbnMpCglzdXBwb3J0LmF0dHJpYnV0ZXMgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJCWVsLmNsYXNzTmFtZSA9ICJpIjsKCQlyZXR1cm4gIWVsLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIik7Cgl9KTsKCgkvKiBnZXRFbGVtZW50KHMpQnkqCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLy8gQ2hlY2sgaWYgZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSByZXR1cm5zIG9ubHkgZWxlbWVudHMKCXN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJCWVsLmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVDb21tZW50KCIiKSApOwoJCXJldHVybiAhZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGg7Cgl9KTsKCgkvLyBTdXBwb3J0OiBJRTw5CglzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBybmF0aXZlLnRlc3QoIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKTsKCgkvLyBTdXBwb3J0OiBJRTwxMAoJLy8gQ2hlY2sgaWYgZ2V0RWxlbWVudEJ5SWQgcmV0dXJucyBlbGVtZW50cyBieSBuYW1lCgkvLyBUaGUgYnJva2VuIGdldEVsZW1lbnRCeUlkIG1ldGhvZHMgZG9uJ3QgcGljayB1cCBwcm9ncmFtbWF0aWNhbGx5LXNldCBuYW1lcywKCS8vIHNvIHVzZSBhIHJvdW5kYWJvdXQgZ2V0RWxlbWVudHNCeU5hbWUgdGVzdAoJc3VwcG9ydC5nZXRCeUlkID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHsKCQlkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmlkID0gZXhwYW5kbzsKCQlyZXR1cm4gIWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lIHx8ICFkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSggZXhwYW5kbyApLmxlbmd0aDsKCX0pOwoKCS8vIElEIGZpbHRlciBhbmQgZmluZAoJaWYgKCBzdXBwb3J0LmdldEJ5SWQgKSB7CgkJRXhwci5maWx0ZXJbIklEIl0gPSBmdW5jdGlvbiggaWQgKSB7CgkJCXZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOwoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoImlkIikgPT09IGF0dHJJZDsKCQkJfTsKCQl9OwoJCUV4cHIuZmluZFsiSUQiXSA9IGZ1bmN0aW9uKCBpZCwgY29udGV4dCApIHsKCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7CgkJCQl2YXIgZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIGlkICk7CgkJCQlyZXR1cm4gZWxlbSA/IFsgZWxlbSBdIDogW107CgkJCX0KCQl9OwoJfSBlbHNlIHsKCQlFeHByLmZpbHRlclsiSUQiXSA9ICBmdW5jdGlvbiggaWQgKSB7CgkJCXZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOwoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09ICJ1bmRlZmluZWQiICYmCgkJCQkJZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpOwoJCQkJcmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gYXR0cklkOwoJCQl9OwoJCX07CgoJCS8vIFN1cHBvcnQ6IElFIDYgLSA3IG9ubHkKCQkvLyBnZXRFbGVtZW50QnlJZCBpcyBub3QgcmVsaWFibGUgYXMgYSBmaW5kIHNob3J0Y3V0CgkJRXhwci5maW5kWyJJRCJdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkgewoJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudElzSFRNTCApIHsKCQkJCXZhciBub2RlLCBpLCBlbGVtcywKCQkJCQllbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTsKCgkJCQlpZiAoIGVsZW0gKSB7CgoJCQkJCS8vIFZlcmlmeSB0aGUgaWQgYXR0cmlidXRlCgkJCQkJbm9kZSA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTsKCQkJCQlpZiAoIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gaWQgKSB7CgkJCQkJCXJldHVybiBbIGVsZW0gXTsKCQkJCQl9CgoJCQkJCS8vIEZhbGwgYmFjayBvbiBnZXRFbGVtZW50c0J5TmFtZQoJCQkJCWVsZW1zID0gY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZSggaWQgKTsKCQkJCQlpID0gMDsKCQkJCQl3aGlsZSAoIChlbGVtID0gZWxlbXNbaSsrXSkgKSB7CgkJCQkJCW5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7CgkJCQkJCWlmICggbm9kZSAmJiBub2RlLnZhbHVlID09PSBpZCApIHsKCQkJCQkJCXJldHVybiBbIGVsZW0gXTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gW107CgkJCX0KCQl9OwoJfQoKCS8vIFRhZwoJRXhwci5maW5kWyJUQUciXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPwoJCWZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7CgkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICkgewoJCQkJcmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApOwoKCQkJLy8gRG9jdW1lbnRGcmFnbWVudCBub2RlcyBkb24ndCBoYXZlIGdFQlROCgkJCX0gZWxzZSBpZiAoIHN1cHBvcnQucXNhICkgewoJCQkJcmV0dXJuIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnICk7CgkJCX0KCQl9IDoKCgkJZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHsKCQkJdmFyIGVsZW0sCgkJCQl0bXAgPSBbXSwKCQkJCWkgPSAwLAoJCQkJLy8gQnkgaGFwcHkgY29pbmNpZGVuY2UsIGEgKGJyb2tlbikgZ0VCVE4gYXBwZWFycyBvbiBEb2N1bWVudEZyYWdtZW50IG5vZGVzIHRvbwoJCQkJcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApOwoKCQkJLy8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50cwoJCQlpZiAoIHRhZyA9PT0gIioiICkgewoJCQkJd2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7CgkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQl0bXAucHVzaCggZWxlbSApOwoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gdG1wOwoJCQl9CgkJCXJldHVybiByZXN1bHRzOwoJCX07CgoJLy8gQ2xhc3MKCUV4cHIuZmluZFsiQ0xBU1MiXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJiBmdW5jdGlvbiggY2xhc3NOYW1lLCBjb250ZXh0ICkgewoJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7CgkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIGNsYXNzTmFtZSApOwoJCX0KCX07CgoJLyogUVNBL21hdGNoZXNTZWxlY3RvcgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8vIFFTQSBhbmQgbWF0Y2hlc1NlbGVjdG9yIHN1cHBvcnQKCgkvLyBtYXRjaGVzU2VsZWN0b3IoOmFjdGl2ZSkgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKElFOS9PcGVyYSAxMS41KQoJcmJ1Z2d5TWF0Y2hlcyA9IFtdOwoKCS8vIHFTYSg6Zm9jdXMpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChDaHJvbWUgMjEpCgkvLyBXZSBhbGxvdyB0aGlzIGJlY2F1c2Ugb2YgYSBidWcgaW4gSUU4LzkgdGhhdCB0aHJvd3MgYW4gZXJyb3IKCS8vIHdoZW5ldmVyIGBkb2N1bWVudC5hY3RpdmVFbGVtZW50YCBpcyBhY2Nlc3NlZCBvbiBhbiBpZnJhbWUKCS8vIFNvLCB3ZSBhbGxvdyA6Zm9jdXMgdG8gcGFzcyB0aHJvdWdoIFFTQSBhbGwgdGhlIHRpbWUgdG8gYXZvaWQgdGhlIElFIGVycm9yCgkvLyBTZWUgaHR0cHM6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEzMzc4CglyYnVnZ3lRU0EgPSBbXTsKCglpZiAoIChzdXBwb3J0LnFzYSA9IHJuYXRpdmUudGVzdCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCApKSApIHsKCQkvLyBCdWlsZCBRU0EgcmVnZXgKCQkvLyBSZWdleCBzdHJhdGVneSBhZG9wdGVkIGZyb20gRGllZ28gUGVyaW5pCgkJYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHsKCQkJLy8gU2VsZWN0IGlzIHNldCB0byBlbXB0eSBzdHJpbmcgb24gcHVycG9zZQoJCQkvLyBUaGlzIGlzIHRvIHRlc3QgSUUncyB0cmVhdG1lbnQgb2Ygbm90IGV4cGxpY2l0bHkKCQkJLy8gc2V0dGluZyBhIGJvb2xlYW4gY29udGVudCBhdHRyaWJ1dGUsCgkJCS8vIHNpbmNlIGl0cyBwcmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoCgkJCS8vIGh0dHBzOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMjM1OQoJCQlkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmlubmVySFRNTCA9ICI8YSBpZD0nIiArIGV4cGFuZG8gKyAiJz48L2E+IiArCgkJCQkiPHNlbGVjdCBpZD0nIiArIGV4cGFuZG8gKyAiLVxyXFwnIG1zYWxsb3djYXB0dXJlPScnPiIgKwoJCQkJIjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+IjsKCgkJCS8vIFN1cHBvcnQ6IElFOCwgT3BlcmEgMTEtMTIuMTYKCQkJLy8gTm90aGluZyBzaG91bGQgYmUgc2VsZWN0ZWQgd2hlbiBlbXB0eSBzdHJpbmdzIGZvbGxvdyBePSBvciAkPSBvciAqPQoJCQkvLyBUaGUgdGVzdCBhdHRyaWJ1dGUgbXVzdCBiZSB1bmtub3duIGluIE9wZXJhIGJ1dCAic2FmZSIgZm9yIFdpblJUCgkJCS8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvaGg0NjUzODguYXNweCNhdHRyaWJ1dGVfc2VjdGlvbgoJCQlpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIlttc2FsbG93Y2FwdHVyZV49JyddIikubGVuZ3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICJbKl4kXT0iICsgd2hpdGVzcGFjZSArICIqKD86Jyd8XCJcIikiICk7CgkJCX0KCgkJCS8vIFN1cHBvcnQ6IElFOAoJCQkvLyBCb29sZWFuIGF0dHJpYnV0ZXMgYW5kICJ2YWx1ZSIgYXJlIG5vdCB0cmVhdGVkIGNvcnJlY3RseQoJCQlpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCJbc2VsZWN0ZWRdIikubGVuZ3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICJcXFsiICsgd2hpdGVzcGFjZSArICIqKD86dmFsdWV8IiArIGJvb2xlYW5zICsgIikiICk7CgkJCX0KCgkJCS8vIFN1cHBvcnQ6IENocm9tZTwyOSwgQW5kcm9pZDw0LjQsIFNhZmFyaTw3LjArLCBpT1M8Ny4wKywgUGhhbnRvbUpTPDEuOS44KwoJCQlpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCAiW2lkfj0iICsgZXhwYW5kbyArICItXSIgKS5sZW5ndGggKSB7CgkJCQlyYnVnZ3lRU0EucHVzaCgifj0iKTsKCQkJfQoKCQkJLy8gV2Via2l0L09wZXJhIC0gOmNoZWNrZWQgc2hvdWxkIHJldHVybiBzZWxlY3RlZCBvcHRpb24gZWxlbWVudHMKCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWQKCQkJLy8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHMKCQkJaWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGggKSB7CgkJCQlyYnVnZ3lRU0EucHVzaCgiOmNoZWNrZWQiKTsKCQkJfQoKCQkJLy8gU3VwcG9ydDogU2FmYXJpIDgrLCBpT1MgOCsKCQkJLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNjg1MQoJCQkvLyBJbi1wYWdlIGBzZWxlY3RvciNpZCBzaWJsaW5nLWNvbWJpbmF0b3Igc2VsZWN0b3JgIGZhaWxzCgkJCWlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoICJhIyIgKyBleHBhbmRvICsgIisqIiApLmxlbmd0aCApIHsKCQkJCXJidWdneVFTQS5wdXNoKCIuIy4rWyt+XSIpOwoJCQl9CgkJfSk7CgoJCWFzc2VydChmdW5jdGlvbiggZWwgKSB7CgkJCWVsLmlubmVySFRNTCA9ICI8YSBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPiIgKwoJCQkJIjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD4iOwoKCQkJLy8gU3VwcG9ydDogV2luZG93cyA4IE5hdGl2ZSBBcHBzCgkJCS8vIFRoZSB0eXBlIGFuZCBuYW1lIGF0dHJpYnV0ZXMgYXJlIHJlc3RyaWN0ZWQgZHVyaW5nIC5pbm5lckhUTUwgYXNzaWdubWVudAoJCQl2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwoJCQlpbnB1dC5zZXRBdHRyaWJ1dGUoICJ0eXBlIiwgImhpZGRlbiIgKTsKCQkJZWwuYXBwZW5kQ2hpbGQoIGlucHV0ICkuc2V0QXR0cmlidXRlKCAibmFtZSIsICJEIiApOwoKCQkJLy8gU3VwcG9ydDogSUU4CgkJCS8vIEVuZm9yY2UgY2FzZS1zZW5zaXRpdml0eSBvZiBuYW1lIGF0dHJpYnV0ZQoJCQlpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPWRdIikubGVuZ3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICJuYW1lIiArIHdoaXRlc3BhY2UgKyAiKlsqXiR8IX5dPz0iICk7CgkJCX0KCgkJCS8vIEZGIDMuNSAtIDplbmFibGVkLzpkaXNhYmxlZCBhbmQgaGlkZGVuIGVsZW1lbnRzIChoaWRkZW4gZWxlbWVudHMgYXJlIHN0aWxsIGVuYWJsZWQpCgkJCS8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzCgkJCWlmICggZWwucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGggIT09IDIgKSB7CgkJCQlyYnVnZ3lRU0EucHVzaCggIjplbmFibGVkIiwgIjpkaXNhYmxlZCIgKTsKCQkJfQoKCQkJLy8gU3VwcG9ydDogSUU5LTExKwoJCQkvLyBJRSdzIDpkaXNhYmxlZCBzZWxlY3RvciBkb2VzIG5vdCBwaWNrIHVwIHRoZSBjaGlsZHJlbiBvZiBkaXNhYmxlZCBmaWVsZHNldHMKCQkJZG9jRWxlbS5hcHBlbmRDaGlsZCggZWwgKS5kaXNhYmxlZCA9IHRydWU7CgkJCWlmICggZWwucXVlcnlTZWxlY3RvckFsbCgiOmRpc2FibGVkIikubGVuZ3RoICE9PSAyICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICI6ZW5hYmxlZCIsICI6ZGlzYWJsZWQiICk7CgkJCX0KCgkJCS8vIE9wZXJhIDEwLTExIGRvZXMgbm90IHRocm93IG9uIHBvc3QtY29tbWEgaW52YWxpZCBwc2V1ZG9zCgkJCWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKTsKCQkJcmJ1Z2d5UVNBLnB1c2goIiwuKjoiKTsKCQl9KTsKCX0KCglpZiAoIChzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciA9IHJuYXRpdmUudGVzdCggKG1hdGNoZXMgPSBkb2NFbGVtLm1hdGNoZXMgfHwKCQlkb2NFbGVtLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fAoJCWRvY0VsZW0ubW96TWF0Y2hlc1NlbGVjdG9yIHx8CgkJZG9jRWxlbS5vTWF0Y2hlc1NlbGVjdG9yIHx8CgkJZG9jRWxlbS5tc01hdGNoZXNTZWxlY3RvcikgKSkgKSB7CgoJCWFzc2VydChmdW5jdGlvbiggZWwgKSB7CgkJCS8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRvIG1hdGNoZXNTZWxlY3RvcgoJCQkvLyBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlIChJRSA5KQoJCQlzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoID0gbWF0Y2hlcy5jYWxsKCBlbCwgIioiICk7CgoJCQkvLyBUaGlzIHNob3VsZCBmYWlsIHdpdGggYW4gZXhjZXB0aW9uCgkJCS8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWQKCQkJbWF0Y2hlcy5jYWxsKCBlbCwgIltzIT0nJ106eCIgKTsKCQkJcmJ1Z2d5TWF0Y2hlcy5wdXNoKCAiIT0iLCBwc2V1ZG9zICk7CgkJfSk7Cgl9CgoJcmJ1Z2d5UVNBID0gcmJ1Z2d5UVNBLmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lRU0Euam9pbigifCIpICk7CglyYnVnZ3lNYXRjaGVzID0gcmJ1Z2d5TWF0Y2hlcy5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5TWF0Y2hlcy5qb2luKCJ8IikgKTsKCgkvKiBDb250YWlucwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJaGFzQ29tcGFyZSA9IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApOwoKCS8vIEVsZW1lbnQgY29udGFpbnMgYW5vdGhlcgoJLy8gUHVycG9zZWZ1bGx5IHNlbGYtZXhjbHVzaXZlCgkvLyBBcyBpbiwgYW4gZWxlbWVudCBkb2VzIG5vdCBjb250YWluIGl0c2VsZgoJY29udGFpbnMgPSBoYXNDb21wYXJlIHx8IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb250YWlucyApID8KCQlmdW5jdGlvbiggYSwgYiApIHsKCQkJdmFyIGFkb3duID0gYS5ub2RlVHlwZSA9PT0gOSA/IGEuZG9jdW1lbnRFbGVtZW50IDogYSwKCQkJCWJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlOwoJCQlyZXR1cm4gYSA9PT0gYnVwIHx8ICEhKCBidXAgJiYgYnVwLm5vZGVUeXBlID09PSAxICYmICgKCQkJCWFkb3duLmNvbnRhaW5zID8KCQkJCQlhZG93bi5jb250YWlucyggYnVwICkgOgoJCQkJCWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYnVwICkgJiAxNgoJCQkpKTsKCQl9IDoKCQlmdW5jdGlvbiggYSwgYiApIHsKCQkJaWYgKCBiICkgewoJCQkJd2hpbGUgKCAoYiA9IGIucGFyZW50Tm9kZSkgKSB7CgkJCQkJaWYgKCBiID09PSBhICkgewoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJcmV0dXJuIGZhbHNlOwoJCX07CgoJLyogU29ydGluZwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8vIERvY3VtZW50IG9yZGVyIHNvcnRpbmcKCXNvcnRPcmRlciA9IGhhc0NvbXBhcmUgPwoJZnVuY3Rpb24oIGEsIGIgKSB7CgoJCS8vIEZsYWcgZm9yIGR1cGxpY2F0ZSByZW1vdmFsCgkJaWYgKCBhID09PSBiICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCQlyZXR1cm4gMDsKCQl9CgoJCS8vIFNvcnQgb24gbWV0aG9kIGV4aXN0ZW5jZSBpZiBvbmx5IG9uZSBpbnB1dCBoYXMgY29tcGFyZURvY3VtZW50UG9zaXRpb24KCQl2YXIgY29tcGFyZSA9ICFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIC0gIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247CgkJaWYgKCBjb21wYXJlICkgewoJCQlyZXR1cm4gY29tcGFyZTsKCQl9CgoJCS8vIENhbGN1bGF0ZSBwb3NpdGlvbiBpZiBib3RoIGlucHV0cyBiZWxvbmcgdG8gdGhlIHNhbWUgZG9jdW1lbnQKCQljb21wYXJlID0gKCBhLm93bmVyRG9jdW1lbnQgfHwgYSApID09PSAoIGIub3duZXJEb2N1bWVudCB8fCBiICkgPwoJCQlhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBiICkgOgoKCQkJLy8gT3RoZXJ3aXNlIHdlIGtub3cgdGhleSBhcmUgZGlzY29ubmVjdGVkCgkJCTE7CgoJCS8vIERpc2Nvbm5lY3RlZCBub2RlcwoJCWlmICggY29tcGFyZSAmIDEgfHwKCQkJKCFzdXBwb3J0LnNvcnREZXRhY2hlZCAmJiBiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBhICkgPT09IGNvbXBhcmUpICkgewoKCQkJLy8gQ2hvb3NlIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgcmVsYXRlZCB0byBvdXIgcHJlZmVycmVkIGRvY3VtZW50CgkJCWlmICggYSA9PT0gZG9jdW1lbnQgfHwgYS5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBhKSApIHsKCQkJCXJldHVybiAtMTsKCQkJfQoJCQlpZiAoIGIgPT09IGRvY3VtZW50IHx8IGIub3duZXJEb2N1bWVudCA9PT0gcHJlZmVycmVkRG9jICYmIGNvbnRhaW5zKHByZWZlcnJlZERvYywgYikgKSB7CgkJCQlyZXR1cm4gMTsKCQkJfQoKCQkJLy8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXIKCQkJcmV0dXJuIHNvcnRJbnB1dCA/CgkJCQkoIGluZGV4T2YoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZiggc29ydElucHV0LCBiICkgKSA6CgkJCQkwOwoJCX0KCgkJcmV0dXJuIGNvbXBhcmUgJiA0ID8gLTEgOiAxOwoJfSA6CglmdW5jdGlvbiggYSwgYiApIHsKCQkvLyBFeGl0IGVhcmx5IGlmIHRoZSBub2RlcyBhcmUgaWRlbnRpY2FsCgkJaWYgKCBhID09PSBiICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCQlyZXR1cm4gMDsKCQl9CgoJCXZhciBjdXIsCgkJCWkgPSAwLAoJCQlhdXAgPSBhLnBhcmVudE5vZGUsCgkJCWJ1cCA9IGIucGFyZW50Tm9kZSwKCQkJYXAgPSBbIGEgXSwKCQkJYnAgPSBbIGIgXTsKCgkJLy8gUGFyZW50bGVzcyBub2RlcyBhcmUgZWl0aGVyIGRvY3VtZW50cyBvciBkaXNjb25uZWN0ZWQKCQlpZiAoICFhdXAgfHwgIWJ1cCApIHsKCQkJcmV0dXJuIGEgPT09IGRvY3VtZW50ID8gLTEgOgoJCQkJYiA9PT0gZG9jdW1lbnQgPyAxIDoKCQkJCWF1cCA/IC0xIDoKCQkJCWJ1cCA/IDEgOgoJCQkJc29ydElucHV0ID8KCQkJCSggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRleE9mKCBzb3J0SW5wdXQsIGIgKSApIDoKCQkJCTA7CgoJCS8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MsIHdlIGNhbiBkbyBhIHF1aWNrIGNoZWNrCgkJfSBlbHNlIGlmICggYXVwID09PSBidXAgKSB7CgkJCXJldHVybiBzaWJsaW5nQ2hlY2soIGEsIGIgKTsKCQl9CgoJCS8vIE90aGVyd2lzZSB3ZSBuZWVkIGZ1bGwgbGlzdHMgb2YgdGhlaXIgYW5jZXN0b3JzIGZvciBjb21wYXJpc29uCgkJY3VyID0gYTsKCQl3aGlsZSAoIChjdXIgPSBjdXIucGFyZW50Tm9kZSkgKSB7CgkJCWFwLnVuc2hpZnQoIGN1ciApOwoJCX0KCQljdXIgPSBiOwoJCXdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHsKCQkJYnAudW5zaGlmdCggY3VyICk7CgkJfQoKCQkvLyBXYWxrIGRvd24gdGhlIHRyZWUgbG9va2luZyBmb3IgYSBkaXNjcmVwYW5jeQoJCXdoaWxlICggYXBbaV0gPT09IGJwW2ldICkgewoJCQlpKys7CgkJfQoKCQlyZXR1cm4gaSA/CgkJCS8vIERvIGEgc2libGluZyBjaGVjayBpZiB0aGUgbm9kZXMgaGF2ZSBhIGNvbW1vbiBhbmNlc3RvcgoJCQlzaWJsaW5nQ2hlY2soIGFwW2ldLCBicFtpXSApIDoKCgkJCS8vIE90aGVyd2lzZSBub2RlcyBpbiBvdXIgZG9jdW1lbnQgc29ydCBmaXJzdAoJCQlhcFtpXSA9PT0gcHJlZmVycmVkRG9jID8gLTEgOgoJCQlicFtpXSA9PT0gcHJlZmVycmVkRG9jID8gMSA6CgkJCTA7Cgl9OwoKCXJldHVybiBkb2N1bWVudDsKfTsKClNpenpsZS5tYXRjaGVzID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1lbnRzICkgewoJcmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgZWxlbWVudHMgKTsKfTsKClNpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggZWxlbSwgZXhwciApIHsKCS8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZAoJaWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT09IGRvY3VtZW50ICkgewoJCXNldERvY3VtZW50KCBlbGVtICk7Cgl9CgoJLy8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkCglleHByID0gZXhwci5yZXBsYWNlKCByYXR0cmlidXRlUXVvdGVzLCAiPSckMSddIiApOwoKCWlmICggc3VwcG9ydC5tYXRjaGVzU2VsZWN0b3IgJiYgZG9jdW1lbnRJc0hUTUwgJiYKCQkhY29tcGlsZXJDYWNoZVsgZXhwciArICIgIiBdICYmCgkJKCAhcmJ1Z2d5TWF0Y2hlcyB8fCAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KCBleHByICkgKSAmJgoJCSggIXJidWdneVFTQSAgICAgfHwgIXJidWdneVFTQS50ZXN0KCBleHByICkgKSApIHsKCgkJdHJ5IHsKCQkJdmFyIHJldCA9IG1hdGNoZXMuY2FsbCggZWxlbSwgZXhwciApOwoKCQkJLy8gSUUgOSdzIG1hdGNoZXNTZWxlY3RvciByZXR1cm5zIGZhbHNlIG9uIGRpc2Nvbm5lY3RlZCBub2RlcwoJCQlpZiAoIHJldCB8fCBzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoIHx8CgkJCQkJLy8gQXMgd2VsbCwgZGlzY29ubmVjdGVkIG5vZGVzIGFyZSBzYWlkIHRvIGJlIGluIGEgZG9jdW1lbnQKCQkJCQkvLyBmcmFnbWVudCBpbiBJRSA5CgkJCQkJZWxlbS5kb2N1bWVudCAmJiBlbGVtLmRvY3VtZW50Lm5vZGVUeXBlICE9PSAxMSApIHsKCQkJCXJldHVybiByZXQ7CgkJCX0KCQl9IGNhdGNoIChlKSB7fQoJfQoKCXJldHVybiBTaXp6bGUoIGV4cHIsIGRvY3VtZW50LCBudWxsLCBbIGVsZW0gXSApLmxlbmd0aCA+IDA7Cn07CgpTaXp6bGUuY29udGFpbnMgPSBmdW5jdGlvbiggY29udGV4dCwgZWxlbSApIHsKCS8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZAoJaWYgKCAoIGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0ICkgIT09IGRvY3VtZW50ICkgewoJCXNldERvY3VtZW50KCBjb250ZXh0ICk7Cgl9CglyZXR1cm4gY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKTsKfTsKClNpenpsZS5hdHRyID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CgkvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWQKCWlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9PSBkb2N1bWVudCApIHsKCQlzZXREb2N1bWVudCggZWxlbSApOwoJfQoKCXZhciBmbiA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZS50b0xvd2VyQ2FzZSgpIF0sCgkJLy8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKGpRdWVyeSAjMTM4MDcpCgkJdmFsID0gZm4gJiYgaGFzT3duLmNhbGwoIEV4cHIuYXR0ckhhbmRsZSwgbmFtZS50b0xvd2VyQ2FzZSgpICkgPwoJCQlmbiggZWxlbSwgbmFtZSwgIWRvY3VtZW50SXNIVE1MICkgOgoJCQl1bmRlZmluZWQ7CgoJcmV0dXJuIHZhbCAhPT0gdW5kZWZpbmVkID8KCQl2YWwgOgoJCXN1cHBvcnQuYXR0cmlidXRlcyB8fCAhZG9jdW1lbnRJc0hUTUwgPwoJCQllbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApIDoKCQkJKHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZShuYW1lKSkgJiYgdmFsLnNwZWNpZmllZCA/CgkJCQl2YWwudmFsdWUgOgoJCQkJbnVsbDsKfTsKClNpenpsZS5lc2NhcGUgPSBmdW5jdGlvbiggc2VsICkgewoJcmV0dXJuIChzZWwgKyAiIikucmVwbGFjZSggcmNzc2VzY2FwZSwgZmNzc2VzY2FwZSApOwp9OwoKU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1zZyApIHsKCXRocm93IG5ldyBFcnJvciggIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIgKyBtc2cgKTsKfTsKCi8qKgogKiBEb2N1bWVudCBzb3J0aW5nIGFuZCByZW1vdmluZyBkdXBsaWNhdGVzCiAqIEBwYXJhbSB7QXJyYXlMaWtlfSByZXN1bHRzCiAqLwpTaXp6bGUudW5pcXVlU29ydCA9IGZ1bmN0aW9uKCByZXN1bHRzICkgewoJdmFyIGVsZW0sCgkJZHVwbGljYXRlcyA9IFtdLAoJCWogPSAwLAoJCWkgPSAwOwoKCS8vIFVubGVzcyB3ZSAqa25vdyogd2UgY2FuIGRldGVjdCBkdXBsaWNhdGVzLCBhc3N1bWUgdGhlaXIgcHJlc2VuY2UKCWhhc0R1cGxpY2F0ZSA9ICFzdXBwb3J0LmRldGVjdER1cGxpY2F0ZXM7Cglzb3J0SW5wdXQgPSAhc3VwcG9ydC5zb3J0U3RhYmxlICYmIHJlc3VsdHMuc2xpY2UoIDAgKTsKCXJlc3VsdHMuc29ydCggc29ydE9yZGVyICk7CgoJaWYgKCBoYXNEdXBsaWNhdGUgKSB7CgkJd2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7CgkJCWlmICggZWxlbSA9PT0gcmVzdWx0c1sgaSBdICkgewoJCQkJaiA9IGR1cGxpY2F0ZXMucHVzaCggaSApOwoJCQl9CgkJfQoJCXdoaWxlICggai0tICkgewoJCQlyZXN1bHRzLnNwbGljZSggZHVwbGljYXRlc1sgaiBdLCAxICk7CgkJfQoJfQoKCS8vIENsZWFyIGlucHV0IGFmdGVyIHNvcnRpbmcgdG8gcmVsZWFzZSBvYmplY3RzCgkvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9zaXp6bGUvcHVsbC8yMjUKCXNvcnRJbnB1dCA9IG51bGw7CgoJcmV0dXJuIHJlc3VsdHM7Cn07CgovKioKICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgcmV0cmlldmluZyB0aGUgdGV4dCB2YWx1ZSBvZiBhbiBhcnJheSBvZiBET00gbm9kZXMKICogQHBhcmFtIHtBcnJheXxFbGVtZW50fSBlbGVtCiAqLwpnZXRUZXh0ID0gU2l6emxlLmdldFRleHQgPSBmdW5jdGlvbiggZWxlbSApIHsKCXZhciBub2RlLAoJCXJldCA9ICIiLAoJCWkgPSAwLAoJCW5vZGVUeXBlID0gZWxlbS5ub2RlVHlwZTsKCglpZiAoICFub2RlVHlwZSApIHsKCQkvLyBJZiBubyBub2RlVHlwZSwgdGhpcyBpcyBleHBlY3RlZCB0byBiZSBhbiBhcnJheQoJCXdoaWxlICggKG5vZGUgPSBlbGVtW2krK10pICkgewoJCQkvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBub2RlcwoJCQlyZXQgKz0gZ2V0VGV4dCggbm9kZSApOwoJCX0KCX0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBlID09PSAxMSApIHsKCQkvLyBVc2UgdGV4dENvbnRlbnQgZm9yIGVsZW1lbnRzCgkJLy8gaW5uZXJUZXh0IHVzYWdlIHJlbW92ZWQgZm9yIGNvbnNpc3RlbmN5IG9mIG5ldyBsaW5lcyAoalF1ZXJ5ICMxMTE1MykKCQlpZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50ID09PSAic3RyaW5nIiApIHsKCQkJcmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7CgkJfSBlbHNlIHsKCQkJLy8gVHJhdmVyc2UgaXRzIGNoaWxkcmVuCgkJCWZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkgewoJCQkJcmV0ICs9IGdldFRleHQoIGVsZW0gKTsKCQkJfQoJCX0KCX0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAzIHx8IG5vZGVUeXBlID09PSA0ICkgewoJCXJldHVybiBlbGVtLm5vZGVWYWx1ZTsKCX0KCS8vIERvIG5vdCBpbmNsdWRlIGNvbW1lbnQgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBub2RlcwoKCXJldHVybiByZXQ7Cn07CgpFeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHsKCgkvLyBDYW4gYmUgYWRqdXN0ZWQgYnkgdGhlIHVzZXIKCWNhY2hlTGVuZ3RoOiA1MCwKCgljcmVhdGVQc2V1ZG86IG1hcmtGdW5jdGlvbiwKCgltYXRjaDogbWF0Y2hFeHByLAoKCWF0dHJIYW5kbGU6IHt9LAoKCWZpbmQ6IHt9LAoKCXJlbGF0aXZlOiB7CgkJIj4iOiB7IGRpcjogInBhcmVudE5vZGUiLCBmaXJzdDogdHJ1ZSB9LAoJCSIgIjogeyBkaXI6ICJwYXJlbnROb2RlIiB9LAoJCSIrIjogeyBkaXI6ICJwcmV2aW91c1NpYmxpbmciLCBmaXJzdDogdHJ1ZSB9LAoJCSJ+IjogeyBkaXI6ICJwcmV2aW91c1NpYmxpbmciIH0KCX0sCgoJcHJlRmlsdGVyOiB7CgkJIkFUVFIiOiBmdW5jdGlvbiggbWF0Y2ggKSB7CgkJCW1hdGNoWzFdID0gbWF0Y2hbMV0ucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTsKCgkJCS8vIE1vdmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkCgkJCW1hdGNoWzNdID0gKCBtYXRjaFszXSB8fCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCAiIiApLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7CgoJCQlpZiAoIG1hdGNoWzJdID09PSAifj0iICkgewoJCQkJbWF0Y2hbM10gPSAiICIgKyBtYXRjaFszXSArICIgIjsKCQkJfQoKCQkJcmV0dXJuIG1hdGNoLnNsaWNlKCAwLCA0ICk7CgkJfSwKCgkJIkNISUxEIjogZnVuY3Rpb24oIG1hdGNoICkgewoJCQkvKiBtYXRjaGVzIGZyb20gbWF0Y2hFeHByWyJDSElMRCJdCgkJCQkxIHR5cGUgKG9ubHl8bnRofC4uLikKCQkJCTIgd2hhdCAoY2hpbGR8b2YtdHlwZSkKCQkJCTMgYXJndW1lbnQgKGV2ZW58b2RkfFxkKnxcZCpuKFsrLV1cZCspP3wuLi4pCgkJCQk0IHhuLWNvbXBvbmVudCBvZiB4bit5IGFyZ3VtZW50IChbKy1dP1xkKm58KQoJCQkJNSBzaWduIG9mIHhuLWNvbXBvbmVudAoJCQkJNiB4IG9mIHhuLWNvbXBvbmVudAoJCQkJNyBzaWduIG9mIHktY29tcG9uZW50CgkJCQk4IHkgb2YgeS1jb21wb25lbnQKCQkJKi8KCQkJbWF0Y2hbMV0gPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpOwoKCQkJaWYgKCBtYXRjaFsxXS5zbGljZSggMCwgMyApID09PSAibnRoIiApIHsKCQkJCS8vIG50aC0qIHJlcXVpcmVzIGFyZ3VtZW50CgkJCQlpZiAoICFtYXRjaFszXSApIHsKCQkJCQlTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7CgkJCQl9CgoJCQkJLy8gbnVtZXJpYyB4IGFuZCB5IHBhcmFtZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxECgkJCQkvLyByZW1lbWJlciB0aGF0IGZhbHNlL3RydWUgY2FzdCByZXNwZWN0aXZlbHkgdG8gMC8xCgkJCQltYXRjaFs0XSA9ICsoIG1hdGNoWzRdID8gbWF0Y2hbNV0gKyAobWF0Y2hbNl0gfHwgMSkgOiAyICogKCBtYXRjaFszXSA9PT0gImV2ZW4iIHx8IG1hdGNoWzNdID09PSAib2RkIiApICk7CgkJCQltYXRjaFs1XSA9ICsoICggbWF0Y2hbN10gKyBtYXRjaFs4XSApIHx8IG1hdGNoWzNdID09PSAib2RkIiApOwoKCQkJLy8gb3RoZXIgdHlwZXMgcHJvaGliaXQgYXJndW1lbnRzCgkJCX0gZWxzZSBpZiAoIG1hdGNoWzNdICkgewoJCQkJU2l6emxlLmVycm9yKCBtYXRjaFswXSApOwoJCQl9CgoJCQlyZXR1cm4gbWF0Y2g7CgkJfSwKCgkJIlBTRVVETyI6IGZ1bmN0aW9uKCBtYXRjaCApIHsKCQkJdmFyIGV4Y2VzcywKCQkJCXVucXVvdGVkID0gIW1hdGNoWzZdICYmIG1hdGNoWzJdOwoKCQkJaWYgKCBtYXRjaEV4cHJbIkNISUxEIl0udGVzdCggbWF0Y2hbMF0gKSApIHsKCQkJCXJldHVybiBudWxsOwoJCQl9CgoJCQkvLyBBY2NlcHQgcXVvdGVkIGFyZ3VtZW50cyBhcy1pcwoJCQlpZiAoIG1hdGNoWzNdICkgewoJCQkJbWF0Y2hbMl0gPSBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCAiIjsKCgkJCS8vIFN0cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZyb20gdW5xdW90ZWQgYXJndW1lbnRzCgkJCX0gZWxzZSBpZiAoIHVucXVvdGVkICYmIHJwc2V1ZG8udGVzdCggdW5xdW90ZWQgKSAmJgoJCQkJLy8gR2V0IGV4Y2VzcyBmcm9tIHRva2VuaXplIChyZWN1cnNpdmVseSkKCQkJCShleGNlc3MgPSB0b2tlbml6ZSggdW5xdW90ZWQsIHRydWUgKSkgJiYKCQkJCS8vIGFkdmFuY2UgdG8gdGhlIG5leHQgY2xvc2luZyBwYXJlbnRoZXNpcwoJCQkJKGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoICIpIiwgdW5xdW90ZWQubGVuZ3RoIC0gZXhjZXNzICkgLSB1bnF1b3RlZC5sZW5ndGgpICkgewoKCQkJCS8vIGV4Y2VzcyBpcyBhIG5lZ2F0aXZlIGluZGV4CgkJCQltYXRjaFswXSA9IG1hdGNoWzBdLnNsaWNlKCAwLCBleGNlc3MgKTsKCQkJCW1hdGNoWzJdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApOwoJCQl9CgoJCQkvLyBSZXR1cm4gb25seSBjYXB0dXJlcyBuZWVkZWQgYnkgdGhlIHBzZXVkbyBmaWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVudCkKCQkJcmV0dXJuIG1hdGNoLnNsaWNlKCAwLCAzICk7CgkJfQoJfSwKCglmaWx0ZXI6IHsKCgkJIlRBRyI6IGZ1bmN0aW9uKCBub2RlTmFtZVNlbGVjdG9yICkgewoJCQl2YXIgbm9kZU5hbWUgPSBub2RlTmFtZVNlbGVjdG9yLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTsKCQkJcmV0dXJuIG5vZGVOYW1lU2VsZWN0b3IgPT09ICIqIiA/CgkJCQlmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0gOgoJCQkJZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQkJcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBub2RlTmFtZTsKCQkJCX07CgkJfSwKCgkJIkNMQVNTIjogZnVuY3Rpb24oIGNsYXNzTmFtZSApIHsKCQkJdmFyIHBhdHRlcm4gPSBjbGFzc0NhY2hlWyBjbGFzc05hbWUgKyAiICIgXTsKCgkJCXJldHVybiBwYXR0ZXJuIHx8CgkJCQkocGF0dGVybiA9IG5ldyBSZWdFeHAoICIoXnwiICsgd2hpdGVzcGFjZSArICIpIiArIGNsYXNzTmFtZSArICIoIiArIHdoaXRlc3BhY2UgKyAifCQpIiApKSAmJgoJCQkJY2xhc3NDYWNoZSggY2xhc3NOYW1lLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJCQlyZXR1cm4gcGF0dGVybi50ZXN0KCB0eXBlb2YgZWxlbS5jbGFzc05hbWUgPT09ICJzdHJpbmciICYmIGVsZW0uY2xhc3NOYW1lIHx8IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSAhPT0gInVuZGVmaW5lZCIgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgIiIgKTsKCQkJCX0pOwoJCX0sCgoJCSJBVFRSIjogZnVuY3Rpb24oIG5hbWUsIG9wZXJhdG9yLCBjaGVjayApIHsKCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJdmFyIHJlc3VsdCA9IFNpenpsZS5hdHRyKCBlbGVtLCBuYW1lICk7CgoJCQkJaWYgKCByZXN1bHQgPT0gbnVsbCApIHsKCQkJCQlyZXR1cm4gb3BlcmF0b3IgPT09ICIhPSI7CgkJCQl9CgkJCQlpZiAoICFvcGVyYXRvciApIHsKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCX0KCgkJCQlyZXN1bHQgKz0gIiI7CgoJCQkJcmV0dXJuIG9wZXJhdG9yID09PSAiPSIgPyByZXN1bHQgPT09IGNoZWNrIDoKCQkJCQlvcGVyYXRvciA9PT0gIiE9IiA/IHJlc3VsdCAhPT0gY2hlY2sgOgoJCQkJCW9wZXJhdG9yID09PSAiXj0iID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPT09IDAgOgoJCQkJCW9wZXJhdG9yID09PSAiKj0iID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPiAtMSA6CgkJCQkJb3BlcmF0b3IgPT09ICIkPSIgPyBjaGVjayAmJiByZXN1bHQuc2xpY2UoIC1jaGVjay5sZW5ndGggKSA9PT0gY2hlY2sgOgoJCQkJCW9wZXJhdG9yID09PSAifj0iID8gKCAiICIgKyByZXN1bHQucmVwbGFjZSggcndoaXRlc3BhY2UsICIgIiApICsgIiAiICkuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDoKCQkJCQlvcGVyYXRvciA9PT0gInw9IiA/IHJlc3VsdCA9PT0gY2hlY2sgfHwgcmVzdWx0LnNsaWNlKCAwLCBjaGVjay5sZW5ndGggKyAxICkgPT09IGNoZWNrICsgIi0iIDoKCQkJCQlmYWxzZTsKCQkJfTsKCQl9LAoKCQkiQ0hJTEQiOiBmdW5jdGlvbiggdHlwZSwgd2hhdCwgYXJndW1lbnQsIGZpcnN0LCBsYXN0ICkgewoJCQl2YXIgc2ltcGxlID0gdHlwZS5zbGljZSggMCwgMyApICE9PSAibnRoIiwKCQkJCWZvcndhcmQgPSB0eXBlLnNsaWNlKCAtNCApICE9PSAibGFzdCIsCgkJCQlvZlR5cGUgPSB3aGF0ID09PSAib2YtdHlwZSI7CgoJCQlyZXR1cm4gZmlyc3QgPT09IDEgJiYgbGFzdCA9PT0gMCA/CgoJCQkJLy8gU2hvcnRjdXQgZm9yIDpudGgtKihuKQoJCQkJZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQkJcmV0dXJuICEhZWxlbS5wYXJlbnROb2RlOwoJCQkJfSA6CgoJCQkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJCQl2YXIgY2FjaGUsIHVuaXF1ZUNhY2hlLCBvdXRlckNhY2hlLCBub2RlLCBub2RlSW5kZXgsIHN0YXJ0LAoJCQkJCQlkaXIgPSBzaW1wbGUgIT09IGZvcndhcmQgPyAibmV4dFNpYmxpbmciIDogInByZXZpb3VzU2libGluZyIsCgkJCQkJCXBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZSwKCQkJCQkJbmFtZSA9IG9mVHlwZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksCgkJCQkJCXVzZUNhY2hlID0gIXhtbCAmJiAhb2ZUeXBlLAoJCQkJCQlkaWZmID0gZmFsc2U7CgoJCQkJCWlmICggcGFyZW50ICkgewoKCQkJCQkJLy8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxvZi10eXBlKQoJCQkJCQlpZiAoIHNpbXBsZSApIHsKCQkJCQkJCXdoaWxlICggZGlyICkgewoJCQkJCQkJCW5vZGUgPSBlbGVtOwoJCQkJCQkJCXdoaWxlICggKG5vZGUgPSBub2RlWyBkaXIgXSkgKSB7CgkJCQkJCQkJCWlmICggb2ZUeXBlID8KCQkJCQkJCQkJCW5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6CgkJCQkJCQkJCQlub2RlLm5vZGVUeXBlID09PSAxICkgewoKCQkJCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCQkvLyBSZXZlcnNlIGRpcmVjdGlvbiBmb3IgOm9ubHktKiAoaWYgd2UgaGF2ZW4ndCB5ZXQgZG9uZSBzbykKCQkJCQkJCQlzdGFydCA9IGRpciA9IHR5cGUgPT09ICJvbmx5IiAmJiAhc3RhcnQgJiYgIm5leHRTaWJsaW5nIjsKCQkJCQkJCX0KCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQl9CgoJCQkJCQlzdGFydCA9IFsgZm9yd2FyZCA/IHBhcmVudC5maXJzdENoaWxkIDogcGFyZW50Lmxhc3RDaGlsZCBdOwoKCQkJCQkJLy8gbm9uLXhtbCA6bnRoLWNoaWxkKC4uLikgc3RvcmVzIGNhY2hlIGRhdGEgb24gYHBhcmVudGAKCQkJCQkJaWYgKCBmb3J3YXJkICYmIHVzZUNhY2hlICkgewoKCQkJCQkJCS8vIFNlZWsgYGVsZW1gIGZyb20gYSBwcmV2aW91c2x5LWNhY2hlZCBpbmRleAoKCQkJCQkJCS8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXkKCQkJCQkJCW5vZGUgPSBwYXJlbnQ7CgkJCQkJCQlvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7CgoJCQkJCQkJLy8gU3VwcG9ydDogSUUgPDkgb25seQoJCQkJCQkJLy8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpCgkJCQkJCQl1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fAoJCQkJCQkJCShvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gPSB7fSk7CgoJCQkJCQkJY2FjaGUgPSB1bmlxdWVDYWNoZVsgdHlwZSBdIHx8IFtdOwoJCQkJCQkJbm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdOwoJCQkJCQkJZGlmZiA9IG5vZGVJbmRleCAmJiBjYWNoZVsgMiBdOwoJCQkJCQkJbm9kZSA9IG5vZGVJbmRleCAmJiBwYXJlbnQuY2hpbGROb2Rlc1sgbm9kZUluZGV4IF07CgoJCQkJCQkJd2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9kZVsgZGlyIF0gfHwKCgkJCQkJCQkJLy8gRmFsbGJhY2sgdG8gc2Vla2luZyBgZWxlbWAgZnJvbSB0aGUgc3RhcnQKCQkJCQkJCQkoZGlmZiA9IG5vZGVJbmRleCA9IDApIHx8IHN0YXJ0LnBvcCgpKSApIHsKCgkJCQkJCQkJLy8gV2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBgcGFyZW50YCBhbmQgYnJlYWsKCQkJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7CgkJCQkJCQkJCXVuaXF1ZUNhY2hlWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIG5vZGVJbmRleCwgZGlmZiBdOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgkJCQkJCQl9CgoJCQkJCQl9IGVsc2UgewoJCQkJCQkJLy8gVXNlIHByZXZpb3VzbHktY2FjaGVkIGVsZW1lbnQgaW5kZXggaWYgYXZhaWxhYmxlCgkJCQkJCQlpZiAoIHVzZUNhY2hlICkgewoJCQkJCQkJCS8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXkKCQkJCQkJCQlub2RlID0gZWxlbTsKCQkJCQkJCQlvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7CgoJCQkJCQkJCS8vIFN1cHBvcnQ6IElFIDw5IG9ubHkKCQkJCQkJCQkvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSkKCQkJCQkJCQl1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fAoJCQkJCQkJCQkob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pOwoKCQkJCQkJCQljYWNoZSA9IHVuaXF1ZUNhY2hlWyB0eXBlIF0gfHwgW107CgkJCQkJCQkJbm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdOwoJCQkJCQkJCWRpZmYgPSBub2RlSW5kZXg7CgkJCQkJCQl9CgoJCQkJCQkJLy8geG1sIDpudGgtY2hpbGQoLi4uKQoJCQkJCQkJLy8gb3IgOm50aC1sYXN0LWNoaWxkKC4uLikgb3IgOm50aCgtbGFzdCk/LW9mLXR5cGUoLi4uKQoJCQkJCQkJaWYgKCBkaWZmID09PSBmYWxzZSApIHsKCQkJCQkJCQkvLyBVc2UgdGhlIHNhbWUgbG9vcCBhcyBhYm92ZSB0byBzZWVrIGBlbGVtYCBmcm9tIHRoZSBzdGFydAoJCQkJCQkJCXdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8CgkJCQkJCQkJCShkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkgewoKCQkJCQkJCQkJaWYgKCAoIG9mVHlwZSA/CgkJCQkJCQkJCQlub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOgoJCQkJCQkJCQkJbm9kZS5ub2RlVHlwZSA9PT0gMSApICYmCgkJCQkJCQkJCQkrK2RpZmYgKSB7CgoJCQkJCQkJCQkJLy8gQ2FjaGUgdGhlIGluZGV4IG9mIGVhY2ggZW5jb3VudGVyZWQgZWxlbWVudAoJCQkJCQkJCQkJaWYgKCB1c2VDYWNoZSApIHsKCQkJCQkJCQkJCQlvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7CgoJCQkJCQkJCQkJCS8vIFN1cHBvcnQ6IElFIDw5IG9ubHkKCQkJCQkJCQkJCQkvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSkKCQkJCQkJCQkJCQl1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fAoJCQkJCQkJCQkJCQkob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pOwoKCQkJCQkJCQkJCQl1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBkaWZmIF07CgkJCQkJCQkJCQl9CgoJCQkJCQkJCQkJaWYgKCBub2RlID09PSBlbGVtICkgewoJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQkvLyBJbmNvcnBvcmF0ZSB0aGUgb2Zmc2V0LCB0aGVuIGNoZWNrIGFnYWluc3QgY3ljbGUgc2l6ZQoJCQkJCQlkaWZmIC09IGxhc3Q7CgkJCQkJCXJldHVybiBkaWZmID09PSBmaXJzdCB8fCAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApOwoJCQkJCX0KCQkJCX07CgkJfSwKCgkJIlBTRVVETyI6IGZ1bmN0aW9uKCBwc2V1ZG8sIGFyZ3VtZW50ICkgewoJCQkvLyBwc2V1ZG8tY2xhc3MgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUKCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNwc2V1ZG8tY2xhc3NlcwoJCQkvLyBQcmlvcml0aXplIGJ5IGNhc2Ugc2Vuc2l0aXZpdHkgaW4gY2FzZSBjdXN0b20gcHNldWRvcyBhcmUgYWRkZWQgd2l0aCB1cHBlcmNhc2UgbGV0dGVycwoJCQkvLyBSZW1lbWJlciB0aGF0IHNldEZpbHRlcnMgaW5oZXJpdHMgZnJvbSBwc2V1ZG9zCgkJCXZhciBhcmdzLAoJCQkJZm4gPSBFeHByLnBzZXVkb3NbIHBzZXVkbyBdIHx8IEV4cHIuc2V0RmlsdGVyc1sgcHNldWRvLnRvTG93ZXJDYXNlKCkgXSB8fAoJCQkJCVNpenpsZS5lcnJvciggInVuc3VwcG9ydGVkIHBzZXVkbzogIiArIHBzZXVkbyApOwoKCQkJLy8gVGhlIHVzZXIgbWF5IHVzZSBjcmVhdGVQc2V1ZG8gdG8gaW5kaWNhdGUgdGhhdAoJCQkvLyBhcmd1bWVudHMgYXJlIG5lZWRlZCB0byBjcmVhdGUgdGhlIGZpbHRlciBmdW5jdGlvbgoJCQkvLyBqdXN0IGFzIFNpenpsZSBkb2VzCgkJCWlmICggZm5bIGV4cGFuZG8gXSApIHsKCQkJCXJldHVybiBmbiggYXJndW1lbnQgKTsKCQkJfQoKCQkJLy8gQnV0IG1haW50YWluIHN1cHBvcnQgZm9yIG9sZCBzaWduYXR1cmVzCgkJCWlmICggZm4ubGVuZ3RoID4gMSApIHsKCQkJCWFyZ3MgPSBbIHBzZXVkbywgcHNldWRvLCAiIiwgYXJndW1lbnQgXTsKCQkJCXJldHVybiBFeHByLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoIHBzZXVkby50b0xvd2VyQ2FzZSgpICkgPwoJCQkJCW1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHsKCQkJCQkJdmFyIGlkeCwKCQkJCQkJCW1hdGNoZWQgPSBmbiggc2VlZCwgYXJndW1lbnQgKSwKCQkJCQkJCWkgPSBtYXRjaGVkLmxlbmd0aDsKCQkJCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQkJCQlpZHggPSBpbmRleE9mKCBzZWVkLCBtYXRjaGVkW2ldICk7CgkJCQkJCQlzZWVkWyBpZHggXSA9ICEoIG1hdGNoZXNbIGlkeCBdID0gbWF0Y2hlZFtpXSApOwoJCQkJCQl9CgkJCQkJfSkgOgoJCQkJCWZ1bmN0aW9uKCBlbGVtICkgewoJCQkJCQlyZXR1cm4gZm4oIGVsZW0sIDAsIGFyZ3MgKTsKCQkJCQl9OwoJCQl9CgoJCQlyZXR1cm4gZm47CgkJfQoJfSwKCglwc2V1ZG9zOiB7CgkJLy8gUG90ZW50aWFsbHkgY29tcGxleCBwc2V1ZG9zCgkJIm5vdCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJCS8vIFRyaW0gdGhlIHNlbGVjdG9yIHBhc3NlZCB0byBjb21waWxlCgkJCS8vIHRvIGF2b2lkIHRyZWF0aW5nIGxlYWRpbmcgYW5kIHRyYWlsaW5nCgkJCS8vIHNwYWNlcyBhcyBjb21iaW5hdG9ycwoJCQl2YXIgaW5wdXQgPSBbXSwKCQkJCXJlc3VsdHMgPSBbXSwKCQkJCW1hdGNoZXIgPSBjb21waWxlKCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgIiQxIiApICk7CgoJCQlyZXR1cm4gbWF0Y2hlclsgZXhwYW5kbyBdID8KCQkJCW1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcywgY29udGV4dCwgeG1sICkgewoJCQkJCXZhciBlbGVtLAoJCQkJCQl1bm1hdGNoZWQgPSBtYXRjaGVyKCBzZWVkLCBudWxsLCB4bWwsIFtdICksCgkJCQkJCWkgPSBzZWVkLmxlbmd0aDsKCgkJCQkJLy8gTWF0Y2ggZWxlbWVudHMgdW5tYXRjaGVkIGJ5IGBtYXRjaGVyYAoJCQkJCXdoaWxlICggaS0tICkgewoJCQkJCQlpZiAoIChlbGVtID0gdW5tYXRjaGVkW2ldKSApIHsKCQkJCQkJCXNlZWRbaV0gPSAhKG1hdGNoZXNbaV0gPSBlbGVtKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0pIDoKCQkJCWZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CgkJCQkJaW5wdXRbMF0gPSBlbGVtOwoJCQkJCW1hdGNoZXIoIGlucHV0LCBudWxsLCB4bWwsIHJlc3VsdHMgKTsKCQkJCQkvLyBEb24ndCBrZWVwIHRoZSBlbGVtZW50IChpc3N1ZSAjMjk5KQoJCQkJCWlucHV0WzBdID0gbnVsbDsKCQkJCQlyZXR1cm4gIXJlc3VsdHMucG9wKCk7CgkJCQl9OwoJCX0pLAoKCQkiaGFzIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJcmV0dXJuIFNpenpsZSggc2VsZWN0b3IsIGVsZW0gKS5sZW5ndGggPiAwOwoJCQl9OwoJCX0pLAoKCQkiY29udGFpbnMiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHRleHQgKSB7CgkJCXRleHQgPSB0ZXh0LnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7CgkJCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXJldHVybiAoIGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lclRleHQgfHwgZ2V0VGV4dCggZWxlbSApICkuaW5kZXhPZiggdGV4dCApID4gLTE7CgkJCX07CgkJfSksCgoJCS8vICJXaGV0aGVyIGFuIGVsZW1lbnQgaXMgcmVwcmVzZW50ZWQgYnkgYSA6bGFuZygpIHNlbGVjdG9yCgkJLy8gaXMgYmFzZWQgc29sZWx5IG9uIHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWUKCQkvLyBiZWluZyBlcXVhbCB0byB0aGUgaWRlbnRpZmllciBDLAoJCS8vIG9yIGJlZ2lubmluZyB3aXRoIHRoZSBpZGVudGlmaWVyIEMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgIi0iLgoJCS8vIFRoZSBtYXRjaGluZyBvZiBDIGFnYWluc3QgdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZSBpcyBwZXJmb3JtZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LgoJCS8vIFRoZSBpZGVudGlmaWVyIEMgZG9lcyBub3QgaGF2ZSB0byBiZSBhIHZhbGlkIGxhbmd1YWdlIG5hbWUuIgoJCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jbGFuZy1wc2V1ZG8KCQkibGFuZyI6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIGxhbmcgKSB7CgkJCS8vIGxhbmcgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIGlkZW50aWZpZXIKCQkJaWYgKCAhcmlkZW50aWZpZXIudGVzdChsYW5nIHx8ICIiKSApIHsKCQkJCVNpenpsZS5lcnJvciggInVuc3VwcG9ydGVkIGxhbmc6ICIgKyBsYW5nICk7CgkJCX0KCQkJbGFuZyA9IGxhbmcucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpOwoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl2YXIgZWxlbUxhbmc7CgkJCQlkbyB7CgkJCQkJaWYgKCAoZWxlbUxhbmcgPSBkb2N1bWVudElzSFRNTCA/CgkJCQkJCWVsZW0ubGFuZyA6CgkJCQkJCWVsZW0uZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCJsYW5nIikpICkgewoKCQkJCQkJZWxlbUxhbmcgPSBlbGVtTGFuZy50b0xvd2VyQ2FzZSgpOwoJCQkJCQlyZXR1cm4gZWxlbUxhbmcgPT09IGxhbmcgfHwgZWxlbUxhbmcuaW5kZXhPZiggbGFuZyArICItIiApID09PSAwOwoJCQkJCX0KCQkJCX0gd2hpbGUgKCAoZWxlbSA9IGVsZW0ucGFyZW50Tm9kZSkgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9OwoJCX0pLAoKCQkvLyBNaXNjZWxsYW5lb3VzCgkJInRhcmdldCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQl2YXIgaGFzaCA9IHdpbmRvdy5sb2NhdGlvbiAmJiB3aW5kb3cubG9jYXRpb24uaGFzaDsKCQkJcmV0dXJuIGhhc2ggJiYgaGFzaC5zbGljZSggMSApID09PSBlbGVtLmlkOwoJCX0sCgoJCSJyb290IjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtID09PSBkb2NFbGVtOwoJCX0sCgoJCSJmb2N1cyI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiAoIWRvY3VtZW50Lmhhc0ZvY3VzIHx8IGRvY3VtZW50Lmhhc0ZvY3VzKCkpICYmICEhKGVsZW0udHlwZSB8fCBlbGVtLmhyZWYgfHwgfmVsZW0udGFiSW5kZXgpOwoJCX0sCgoJCS8vIEJvb2xlYW4gcHJvcGVydGllcwoJCSJlbmFibGVkIjogY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIGZhbHNlICksCgkJImRpc2FibGVkIjogY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIHRydWUgKSwKCgkJImNoZWNrZWQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJLy8gSW4gQ1NTMywgOmNoZWNrZWQgc2hvdWxkIHJldHVybiBib3RoIGNoZWNrZWQgYW5kIHNlbGVjdGVkIGVsZW1lbnRzCgkJCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaGVja2VkCgkJCXZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCQkJcmV0dXJuIChub2RlTmFtZSA9PT0gImlucHV0IiAmJiAhIWVsZW0uY2hlY2tlZCkgfHwgKG5vZGVOYW1lID09PSAib3B0aW9uIiAmJiAhIWVsZW0uc2VsZWN0ZWQpOwoJCX0sCgoJCSJzZWxlY3RlZCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQkvLyBBY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eSBtYWtlcyBzZWxlY3RlZC1ieS1kZWZhdWx0CgkJCS8vIG9wdGlvbnMgaW4gU2FmYXJpIHdvcmsgcHJvcGVybHkKCQkJaWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7CgkJCQllbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKCQkJfQoKCQkJcmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7CgkJfSwKCgkJLy8gQ29udGVudHMKCQkiZW1wdHkiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNlbXB0eS1wc2V1ZG8KCQkJLy8gOmVtcHR5IGlzIG5lZ2F0ZWQgYnkgZWxlbWVudCAoMSkgb3IgY29udGVudCBub2RlcyAodGV4dDogMzsgY2RhdGE6IDQ7IGVudGl0eSByZWY6IDUpLAoJCQkvLyAgIGJ1dCBub3QgYnkgb3RoZXJzIChjb21tZW50OiA4OyBwcm9jZXNzaW5nIGluc3RydWN0aW9uOiA3OyBldGMuKQoJCQkvLyBub2RlVHlwZSA8IDYgd29ya3MgYmVjYXVzZSBhdHRyaWJ1dGVzICgyKSBkbyBub3QgYXBwZWFyIGFzIGNoaWxkcmVuCgkJCWZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkgewoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlIDwgNiApIHsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIHRydWU7CgkJfSwKCgkJInBhcmVudCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gIUV4cHIucHNldWRvc1siZW1wdHkiXSggZWxlbSApOwoJCX0sCgoJCS8vIEVsZW1lbnQvaW5wdXQgdHlwZXMKCQkiaGVhZGVyIjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiByaGVhZGVyLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTsKCQl9LAoKCQkiaW5wdXQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIHJpbnB1dHMudGVzdCggZWxlbS5ub2RlTmFtZSApOwoJCX0sCgoJCSJidXR0b24iOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJCXJldHVybiBuYW1lID09PSAiaW5wdXQiICYmIGVsZW0udHlwZSA9PT0gImJ1dHRvbiIgfHwgbmFtZSA9PT0gImJ1dHRvbiI7CgkJfSwKCgkJInRleHQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJdmFyIGF0dHI7CgkJCXJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJpbnB1dCIgJiYKCQkJCWVsZW0udHlwZSA9PT0gInRleHQiICYmCgoJCQkJLy8gU3VwcG9ydDogSUU8OAoJCQkJLy8gTmV3IEhUTUw1IGF0dHJpYnV0ZSB2YWx1ZXMgKGUuZy4sICJzZWFyY2giKSBhcHBlYXIgd2l0aCBlbGVtLnR5cGUgPT09ICJ0ZXh0IgoJCQkJKCAoYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKCJ0eXBlIikpID09IG51bGwgfHwgYXR0ci50b0xvd2VyQ2FzZSgpID09PSAidGV4dCIgKTsKCQl9LAoKCQkvLyBQb3NpdGlvbi1pbi1jb2xsZWN0aW9uCgkJImZpcnN0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbigpIHsKCQkJcmV0dXJuIFsgMCBdOwoJCX0pLAoKCQkibGFzdCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkgewoJCQlyZXR1cm4gWyBsZW5ndGggLSAxIF07CgkJfSksCgoJCSJlcSI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHsKCQkJcmV0dXJuIFsgYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudCBdOwoJCX0pLAoKCQkiZXZlbiI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkgewoJCQl2YXIgaSA9IDA7CgkJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkgewoJCQkJbWF0Y2hJbmRleGVzLnB1c2goIGkgKTsKCQkJfQoJCQlyZXR1cm4gbWF0Y2hJbmRleGVzOwoJCX0pLAoKCQkib2RkIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7CgkJCXZhciBpID0gMTsKCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7CgkJCQltYXRjaEluZGV4ZXMucHVzaCggaSApOwoJCQl9CgkJCXJldHVybiBtYXRjaEluZGV4ZXM7CgkJfSksCgoJCSJsdCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHsKCQkJdmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50OwoJCQlmb3IgKCA7IC0taSA+PSAwOyApIHsKCQkJCW1hdGNoSW5kZXhlcy5wdXNoKCBpICk7CgkJCX0KCQkJcmV0dXJuIG1hdGNoSW5kZXhlczsKCQl9KSwKCgkJImd0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkgewoJCQl2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7CgkJCWZvciAoIDsgKytpIDwgbGVuZ3RoOyApIHsKCQkJCW1hdGNoSW5kZXhlcy5wdXNoKCBpICk7CgkJCX0KCQkJcmV0dXJuIG1hdGNoSW5kZXhlczsKCQl9KQoJfQp9OwoKRXhwci5wc2V1ZG9zWyJudGgiXSA9IEV4cHIucHNldWRvc1siZXEiXTsKCi8vIEFkZCBidXR0b24vaW5wdXQgdHlwZSBwc2V1ZG9zCmZvciAoIGkgaW4geyByYWRpbzogdHJ1ZSwgY2hlY2tib3g6IHRydWUsIGZpbGU6IHRydWUsIHBhc3N3b3JkOiB0cnVlLCBpbWFnZTogdHJ1ZSB9ICkgewoJRXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVJbnB1dFBzZXVkbyggaSApOwp9CmZvciAoIGkgaW4geyBzdWJtaXQ6IHRydWUsIHJlc2V0OiB0cnVlIH0gKSB7CglFeHByLnBzZXVkb3NbIGkgXSA9IGNyZWF0ZUJ1dHRvblBzZXVkbyggaSApOwp9CgovLyBFYXN5IEFQSSBmb3IgY3JlYXRpbmcgbmV3IHNldEZpbHRlcnMKZnVuY3Rpb24gc2V0RmlsdGVycygpIHt9CnNldEZpbHRlcnMucHJvdG90eXBlID0gRXhwci5maWx0ZXJzID0gRXhwci5wc2V1ZG9zOwpFeHByLnNldEZpbHRlcnMgPSBuZXcgc2V0RmlsdGVycygpOwoKdG9rZW5pemUgPSBTaXp6bGUudG9rZW5pemUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIHBhcnNlT25seSApIHsKCXZhciBtYXRjaGVkLCBtYXRjaCwgdG9rZW5zLCB0eXBlLAoJCXNvRmFyLCBncm91cHMsIHByZUZpbHRlcnMsCgkJY2FjaGVkID0gdG9rZW5DYWNoZVsgc2VsZWN0b3IgKyAiICIgXTsKCglpZiAoIGNhY2hlZCApIHsKCQlyZXR1cm4gcGFyc2VPbmx5ID8gMCA6IGNhY2hlZC5zbGljZSggMCApOwoJfQoKCXNvRmFyID0gc2VsZWN0b3I7Cglncm91cHMgPSBbXTsKCXByZUZpbHRlcnMgPSBFeHByLnByZUZpbHRlcjsKCgl3aGlsZSAoIHNvRmFyICkgewoKCQkvLyBDb21tYSBhbmQgZmlyc3QgcnVuCgkJaWYgKCAhbWF0Y2hlZCB8fCAobWF0Y2ggPSByY29tbWEuZXhlYyggc29GYXIgKSkgKSB7CgkJCWlmICggbWF0Y2ggKSB7CgkJCQkvLyBEb24ndCBjb25zdW1lIHRyYWlsaW5nIGNvbW1hcyBhcyB2YWxpZAoJCQkJc29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hbMF0ubGVuZ3RoICkgfHwgc29GYXI7CgkJCX0KCQkJZ3JvdXBzLnB1c2goICh0b2tlbnMgPSBbXSkgKTsKCQl9CgoJCW1hdGNoZWQgPSBmYWxzZTsKCgkJLy8gQ29tYmluYXRvcnMKCQlpZiAoIChtYXRjaCA9IHJjb21iaW5hdG9ycy5leGVjKCBzb0ZhciApKSApIHsKCQkJbWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7CgkJCXRva2Vucy5wdXNoKHsKCQkJCXZhbHVlOiBtYXRjaGVkLAoJCQkJLy8gQ2FzdCBkZXNjZW5kYW50IGNvbWJpbmF0b3JzIHRvIHNwYWNlCgkJCQl0eXBlOiBtYXRjaFswXS5yZXBsYWNlKCBydHJpbSwgIiAiICkKCQkJfSk7CgkJCXNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7CgkJfQoKCQkvLyBGaWx0ZXJzCgkJZm9yICggdHlwZSBpbiBFeHByLmZpbHRlciApIHsKCQkJaWYgKCAobWF0Y2ggPSBtYXRjaEV4cHJbIHR5cGUgXS5leGVjKCBzb0ZhciApKSAmJiAoIXByZUZpbHRlcnNbIHR5cGUgXSB8fAoJCQkJKG1hdGNoID0gcHJlRmlsdGVyc1sgdHlwZSBdKCBtYXRjaCApKSkgKSB7CgkJCQltYXRjaGVkID0gbWF0Y2guc2hpZnQoKTsKCQkJCXRva2Vucy5wdXNoKHsKCQkJCQl2YWx1ZTogbWF0Y2hlZCwKCQkJCQl0eXBlOiB0eXBlLAoJCQkJCW1hdGNoZXM6IG1hdGNoCgkJCQl9KTsKCQkJCXNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7CgkJCX0KCQl9CgoJCWlmICggIW1hdGNoZWQgKSB7CgkJCWJyZWFrOwoJCX0KCX0KCgkvLyBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW52YWxpZCBleGNlc3MKCS8vIGlmIHdlJ3JlIGp1c3QgcGFyc2luZwoJLy8gT3RoZXJ3aXNlLCB0aHJvdyBhbiBlcnJvciBvciByZXR1cm4gdG9rZW5zCglyZXR1cm4gcGFyc2VPbmx5ID8KCQlzb0Zhci5sZW5ndGggOgoJCXNvRmFyID8KCQkJU2l6emxlLmVycm9yKCBzZWxlY3RvciApIDoKCQkJLy8gQ2FjaGUgdGhlIHRva2VucwoJCQl0b2tlbkNhY2hlKCBzZWxlY3RvciwgZ3JvdXBzICkuc2xpY2UoIDAgKTsKfTsKCmZ1bmN0aW9uIHRvU2VsZWN0b3IoIHRva2VucyApIHsKCXZhciBpID0gMCwKCQlsZW4gPSB0b2tlbnMubGVuZ3RoLAoJCXNlbGVjdG9yID0gIiI7Cglmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKCQlzZWxlY3RvciArPSB0b2tlbnNbaV0udmFsdWU7Cgl9CglyZXR1cm4gc2VsZWN0b3I7Cn0KCmZ1bmN0aW9uIGFkZENvbWJpbmF0b3IoIG1hdGNoZXIsIGNvbWJpbmF0b3IsIGJhc2UgKSB7Cgl2YXIgZGlyID0gY29tYmluYXRvci5kaXIsCgkJc2tpcCA9IGNvbWJpbmF0b3IubmV4dCwKCQlrZXkgPSBza2lwIHx8IGRpciwKCQljaGVja05vbkVsZW1lbnRzID0gYmFzZSAmJiBrZXkgPT09ICJwYXJlbnROb2RlIiwKCQlkb25lTmFtZSA9IGRvbmUrKzsKCglyZXR1cm4gY29tYmluYXRvci5maXJzdCA/CgkJLy8gQ2hlY2sgYWdhaW5zdCBjbG9zZXN0IGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50CgkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJd2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHsKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkgewoJCQkJCXJldHVybiBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfSA6CgoJCS8vIENoZWNrIGFnYWluc3QgYWxsIGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50cwoJCWZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CgkJCXZhciBvbGRDYWNoZSwgdW5pcXVlQ2FjaGUsIG91dGVyQ2FjaGUsCgkJCQluZXdDYWNoZSA9IFsgZGlycnVucywgZG9uZU5hbWUgXTsKCgkJCS8vIFdlIGNhbid0IHNldCBhcmJpdHJhcnkgZGF0YSBvbiBYTUwgbm9kZXMsIHNvIHRoZXkgZG9uJ3QgYmVuZWZpdCBmcm9tIGNvbWJpbmF0b3IgY2FjaGluZwoJCQlpZiAoIHhtbCApIHsKCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7CgkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7CgkJCQkJCWlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7CgkJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsKCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7CgkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7CgkJCQkJCW91dGVyQ2FjaGUgPSBlbGVtWyBleHBhbmRvIF0gfHwgKGVsZW1bIGV4cGFuZG8gXSA9IHt9KTsKCgkJCQkJCS8vIFN1cHBvcnQ6IElFIDw5IG9ubHkKCQkJCQkJLy8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpCgkJCQkJCXVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgZWxlbS51bmlxdWVJRCBdIHx8IChvdXRlckNhY2hlWyBlbGVtLnVuaXF1ZUlEIF0gPSB7fSk7CgoJCQkJCQlpZiAoIHNraXAgJiYgc2tpcCA9PT0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICkgewoJCQkJCQkJZWxlbSA9IGVsZW1bIGRpciBdIHx8IGVsZW07CgkJCQkJCX0gZWxzZSBpZiAoIChvbGRDYWNoZSA9IHVuaXF1ZUNhY2hlWyBrZXkgXSkgJiYKCQkJCQkJCW9sZENhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgb2xkQ2FjaGVbIDEgXSA9PT0gZG9uZU5hbWUgKSB7CgoJCQkJCQkJLy8gQXNzaWduIHRvIG5ld0NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHMKCQkJCQkJCXJldHVybiAobmV3Q2FjaGVbIDIgXSA9IG9sZENhY2hlWyAyIF0pOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJLy8gUmV1c2UgbmV3Y2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50cwoJCQkJCQkJdW5pcXVlQ2FjaGVbIGtleSBdID0gbmV3Q2FjaGU7CgoJCQkJCQkJLy8gQSBtYXRjaCBtZWFucyB3ZSdyZSBkb25lOyBhIGZhaWwgbWVhbnMgd2UgaGF2ZSB0byBrZWVwIGNoZWNraW5nCgkJCQkJCQlpZiAoIChuZXdDYWNoZVsgMiBdID0gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkpICkgewoJCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9Owp9CgpmdW5jdGlvbiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSB7CglyZXR1cm4gbWF0Y2hlcnMubGVuZ3RoID4gMSA/CgkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJdmFyIGkgPSBtYXRjaGVycy5sZW5ndGg7CgkJCXdoaWxlICggaS0tICkgewoJCQkJaWYgKCAhbWF0Y2hlcnNbaV0oIGVsZW0sIGNvbnRleHQsIHhtbCApICkgewoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gdHJ1ZTsKCQl9IDoKCQltYXRjaGVyc1swXTsKfQoKZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IsIGNvbnRleHRzLCByZXN1bHRzICkgewoJdmFyIGkgPSAwLAoJCWxlbiA9IGNvbnRleHRzLmxlbmd0aDsKCWZvciAoIDsgaSA8IGxlbjsgaSsrICkgewoJCVNpenpsZSggc2VsZWN0b3IsIGNvbnRleHRzW2ldLCByZXN1bHRzICk7Cgl9CglyZXR1cm4gcmVzdWx0czsKfQoKZnVuY3Rpb24gY29uZGVuc2UoIHVubWF0Y2hlZCwgbWFwLCBmaWx0ZXIsIGNvbnRleHQsIHhtbCApIHsKCXZhciBlbGVtLAoJCW5ld1VubWF0Y2hlZCA9IFtdLAoJCWkgPSAwLAoJCWxlbiA9IHVubWF0Y2hlZC5sZW5ndGgsCgkJbWFwcGVkID0gbWFwICE9IG51bGw7CgoJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CgkJaWYgKCAoZWxlbSA9IHVubWF0Y2hlZFtpXSkgKSB7CgkJCWlmICggIWZpbHRlciB8fCBmaWx0ZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkgewoJCQkJbmV3VW5tYXRjaGVkLnB1c2goIGVsZW0gKTsKCQkJCWlmICggbWFwcGVkICkgewoJCQkJCW1hcC5wdXNoKCBpICk7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIG5ld1VubWF0Y2hlZDsKfQoKZnVuY3Rpb24gc2V0TWF0Y2hlciggcHJlRmlsdGVyLCBzZWxlY3RvciwgbWF0Y2hlciwgcG9zdEZpbHRlciwgcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICkgewoJaWYgKCBwb3N0RmlsdGVyICYmICFwb3N0RmlsdGVyWyBleHBhbmRvIF0gKSB7CgkJcG9zdEZpbHRlciA9IHNldE1hdGNoZXIoIHBvc3RGaWx0ZXIgKTsKCX0KCWlmICggcG9zdEZpbmRlciAmJiAhcG9zdEZpbmRlclsgZXhwYW5kbyBdICkgewoJCXBvc3RGaW5kZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKTsKCX0KCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNvbnRleHQsIHhtbCApIHsKCQl2YXIgdGVtcCwgaSwgZWxlbSwKCQkJcHJlTWFwID0gW10sCgkJCXBvc3RNYXAgPSBbXSwKCQkJcHJlZXhpc3RpbmcgPSByZXN1bHRzLmxlbmd0aCwKCgkJCS8vIEdldCBpbml0aWFsIGVsZW1lbnRzIGZyb20gc2VlZCBvciBjb250ZXh0CgkJCWVsZW1zID0gc2VlZCB8fCBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciB8fCAiKiIsIGNvbnRleHQubm9kZVR5cGUgPyBbIGNvbnRleHQgXSA6IGNvbnRleHQsIFtdICksCgoJCQkvLyBQcmVmaWx0ZXIgdG8gZ2V0IG1hdGNoZXIgaW5wdXQsIHByZXNlcnZpbmcgYSBtYXAgZm9yIHNlZWQtcmVzdWx0cyBzeW5jaHJvbml6YXRpb24KCQkJbWF0Y2hlckluID0gcHJlRmlsdGVyICYmICggc2VlZCB8fCAhc2VsZWN0b3IgKSA/CgkJCQljb25kZW5zZSggZWxlbXMsIHByZU1hcCwgcHJlRmlsdGVyLCBjb250ZXh0LCB4bWwgKSA6CgkJCQllbGVtcywKCgkJCW1hdGNoZXJPdXQgPSBtYXRjaGVyID8KCQkJCS8vIElmIHdlIGhhdmUgYSBwb3N0RmluZGVyLCBvciBmaWx0ZXJlZCBzZWVkLCBvciBub24tc2VlZCBwb3N0RmlsdGVyIG9yIHByZWV4aXN0aW5nIHJlc3VsdHMsCgkJCQlwb3N0RmluZGVyIHx8ICggc2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8IHBvc3RGaWx0ZXIgKSA/CgoJCQkJCS8vIC4uLmludGVybWVkaWF0ZSBwcm9jZXNzaW5nIGlzIG5lY2Vzc2FyeQoJCQkJCVtdIDoKCgkJCQkJLy8gLi4ub3RoZXJ3aXNlIHVzZSByZXN1bHRzIGRpcmVjdGx5CgkJCQkJcmVzdWx0cyA6CgkJCQltYXRjaGVySW47CgoJCS8vIEZpbmQgcHJpbWFyeSBtYXRjaGVzCgkJaWYgKCBtYXRjaGVyICkgewoJCQltYXRjaGVyKCBtYXRjaGVySW4sIG1hdGNoZXJPdXQsIGNvbnRleHQsIHhtbCApOwoJCX0KCgkJLy8gQXBwbHkgcG9zdEZpbHRlcgoJCWlmICggcG9zdEZpbHRlciApIHsKCQkJdGVtcCA9IGNvbmRlbnNlKCBtYXRjaGVyT3V0LCBwb3N0TWFwICk7CgkJCXBvc3RGaWx0ZXIoIHRlbXAsIFtdLCBjb250ZXh0LCB4bWwgKTsKCgkJCS8vIFVuLW1hdGNoIGZhaWxpbmcgZWxlbWVudHMgYnkgbW92aW5nIHRoZW0gYmFjayB0byBtYXRjaGVySW4KCQkJaSA9IHRlbXAubGVuZ3RoOwoJCQl3aGlsZSAoIGktLSApIHsKCQkJCWlmICggKGVsZW0gPSB0ZW1wW2ldKSApIHsKCQkJCQltYXRjaGVyT3V0WyBwb3N0TWFwW2ldIF0gPSAhKG1hdGNoZXJJblsgcG9zdE1hcFtpXSBdID0gZWxlbSk7CgkJCQl9CgkJCX0KCQl9CgoJCWlmICggc2VlZCApIHsKCQkJaWYgKCBwb3N0RmluZGVyIHx8IHByZUZpbHRlciApIHsKCQkJCWlmICggcG9zdEZpbmRlciApIHsKCQkJCQkvLyBHZXQgdGhlIGZpbmFsIG1hdGNoZXJPdXQgYnkgY29uZGVuc2luZyB0aGlzIGludGVybWVkaWF0ZSBpbnRvIHBvc3RGaW5kZXIgY29udGV4dHMKCQkJCQl0ZW1wID0gW107CgkJCQkJaSA9IG1hdGNoZXJPdXQubGVuZ3RoOwoJCQkJCXdoaWxlICggaS0tICkgewoJCQkJCQlpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgKSB7CgkJCQkJCQkvLyBSZXN0b3JlIG1hdGNoZXJJbiBzaW5jZSBlbGVtIGlzIG5vdCB5ZXQgYSBmaW5hbCBtYXRjaAoJCQkJCQkJdGVtcC5wdXNoKCAobWF0Y2hlckluW2ldID0gZWxlbSkgKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQlwb3N0RmluZGVyKCBudWxsLCAobWF0Y2hlck91dCA9IFtdKSwgdGVtcCwgeG1sICk7CgkJCQl9CgoJCQkJLy8gTW92ZSBtYXRjaGVkIGVsZW1lbnRzIGZyb20gc2VlZCB0byByZXN1bHRzIHRvIGtlZXAgdGhlbSBzeW5jaHJvbml6ZWQKCQkJCWkgPSBtYXRjaGVyT3V0Lmxlbmd0aDsKCQkJCXdoaWxlICggaS0tICkgewoJCQkJCWlmICggKGVsZW0gPSBtYXRjaGVyT3V0W2ldKSAmJgoJCQkJCQkodGVtcCA9IHBvc3RGaW5kZXIgPyBpbmRleE9mKCBzZWVkLCBlbGVtICkgOiBwcmVNYXBbaV0pID4gLTEgKSB7CgoJCQkJCQlzZWVkW3RlbXBdID0gIShyZXN1bHRzW3RlbXBdID0gZWxlbSk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCS8vIEFkZCBlbGVtZW50cyB0byByZXN1bHRzLCB0aHJvdWdoIHBvc3RGaW5kZXIgaWYgZGVmaW5lZAoJCX0gZWxzZSB7CgkJCW1hdGNoZXJPdXQgPSBjb25kZW5zZSgKCQkJCW1hdGNoZXJPdXQgPT09IHJlc3VsdHMgPwoJCQkJCW1hdGNoZXJPdXQuc3BsaWNlKCBwcmVleGlzdGluZywgbWF0Y2hlck91dC5sZW5ndGggKSA6CgkJCQkJbWF0Y2hlck91dAoJCQkpOwoJCQlpZiAoIHBvc3RGaW5kZXIgKSB7CgkJCQlwb3N0RmluZGVyKCBudWxsLCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4bWwgKTsKCQkJfSBlbHNlIHsKCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTsKCQkJfQoJCX0KCX0pOwp9CgpmdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkgewoJdmFyIGNoZWNrQ29udGV4dCwgbWF0Y2hlciwgaiwKCQlsZW4gPSB0b2tlbnMubGVuZ3RoLAoJCWxlYWRpbmdSZWxhdGl2ZSA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1swXS50eXBlIF0sCgkJaW1wbGljaXRSZWxhdGl2ZSA9IGxlYWRpbmdSZWxhdGl2ZSB8fCBFeHByLnJlbGF0aXZlWyIgIl0sCgkJaSA9IGxlYWRpbmdSZWxhdGl2ZSA/IDEgOiAwLAoKCQkvLyBUaGUgZm91bmRhdGlvbmFsIG1hdGNoZXIgZW5zdXJlcyB0aGF0IGVsZW1lbnRzIGFyZSByZWFjaGFibGUgZnJvbSB0b3AtbGV2ZWwgY29udGV4dChzKQoJCW1hdGNoQ29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbSA9PT0gY2hlY2tDb250ZXh0OwoJCX0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSwKCQltYXRjaEFueUNvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGluZGV4T2YoIGNoZWNrQ29udGV4dCwgZWxlbSApID4gLTE7CgkJfSwgaW1wbGljaXRSZWxhdGl2ZSwgdHJ1ZSApLAoJCW1hdGNoZXJzID0gWyBmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgewoJCQl2YXIgcmV0ID0gKCAhbGVhZGluZ1JlbGF0aXZlICYmICggeG1sIHx8IGNvbnRleHQgIT09IG91dGVybW9zdENvbnRleHQgKSApIHx8ICgKCQkJCShjaGVja0NvbnRleHQgPSBjb250ZXh0KS5ub2RlVHlwZSA/CgkJCQkJbWF0Y2hDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSA6CgkJCQkJbWF0Y2hBbnlDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSApOwoJCQkvLyBBdm9pZCBoYW5naW5nIG9udG8gZWxlbWVudCAoaXNzdWUgIzI5OSkKCQkJY2hlY2tDb250ZXh0ID0gbnVsbDsKCQkJcmV0dXJuIHJldDsKCQl9IF07CgoJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CgkJaWYgKCAobWF0Y2hlciA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1tpXS50eXBlIF0pICkgewoJCQltYXRjaGVycyA9IFsgYWRkQ29tYmluYXRvcihlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwgbWF0Y2hlcikgXTsKCQl9IGVsc2UgewoJCQltYXRjaGVyID0gRXhwci5maWx0ZXJbIHRva2Vuc1tpXS50eXBlIF0uYXBwbHkoIG51bGwsIHRva2Vuc1tpXS5tYXRjaGVzICk7CgoJCQkvLyBSZXR1cm4gc3BlY2lhbCB1cG9uIHNlZWluZyBhIHBvc2l0aW9uYWwgbWF0Y2hlcgoJCQlpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHsKCQkJCS8vIEZpbmQgdGhlIG5leHQgcmVsYXRpdmUgb3BlcmF0b3IgKGlmIGFueSkgZm9yIHByb3BlciBoYW5kbGluZwoJCQkJaiA9ICsraTsKCQkJCWZvciAoIDsgaiA8IGxlbjsgaisrICkgewoJCQkJCWlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2pdLnR5cGUgXSApIHsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQkJcmV0dXJuIHNldE1hdGNoZXIoCgkJCQkJaSA+IDEgJiYgZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksCgkJCQkJaSA+IDEgJiYgdG9TZWxlY3RvcigKCQkJCQkJLy8gSWYgdGhlIHByZWNlZGluZyB0b2tlbiB3YXMgYSBkZXNjZW5kYW50IGNvbWJpbmF0b3IsIGluc2VydCBhbiBpbXBsaWNpdCBhbnktZWxlbWVudCBgKmAKCQkJCQkJdG9rZW5zLnNsaWNlKCAwLCBpIC0gMSApLmNvbmNhdCh7IHZhbHVlOiB0b2tlbnNbIGkgLSAyIF0udHlwZSA9PT0gIiAiID8gIioiIDogIiIgfSkKCQkJCQkpLnJlcGxhY2UoIHJ0cmltLCAiJDEiICksCgkJCQkJbWF0Y2hlciwKCQkJCQlpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSwKCQkJCQlqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAodG9rZW5zID0gdG9rZW5zLnNsaWNlKCBqICkpICksCgkJCQkJaiA8IGxlbiAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKQoJCQkJKTsKCQkJfQoJCQltYXRjaGVycy5wdXNoKCBtYXRjaGVyICk7CgkJfQoJfQoKCXJldHVybiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTsKfQoKZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgewoJdmFyIGJ5U2V0ID0gc2V0TWF0Y2hlcnMubGVuZ3RoID4gMCwKCQlieUVsZW1lbnQgPSBlbGVtZW50TWF0Y2hlcnMubGVuZ3RoID4gMCwKCQlzdXBlck1hdGNoZXIgPSBmdW5jdGlvbiggc2VlZCwgY29udGV4dCwgeG1sLCByZXN1bHRzLCBvdXRlcm1vc3QgKSB7CgkJCXZhciBlbGVtLCBqLCBtYXRjaGVyLAoJCQkJbWF0Y2hlZENvdW50ID0gMCwKCQkJCWkgPSAiMCIsCgkJCQl1bm1hdGNoZWQgPSBzZWVkICYmIFtdLAoJCQkJc2V0TWF0Y2hlZCA9IFtdLAoJCQkJY29udGV4dEJhY2t1cCA9IG91dGVybW9zdENvbnRleHQsCgkJCQkvLyBXZSBtdXN0IGFsd2F5cyBoYXZlIGVpdGhlciBzZWVkIGVsZW1lbnRzIG9yIG91dGVybW9zdCBjb250ZXh0CgkJCQllbGVtcyA9IHNlZWQgfHwgYnlFbGVtZW50ICYmIEV4cHIuZmluZFsiVEFHIl0oICIqIiwgb3V0ZXJtb3N0ICksCgkJCQkvLyBVc2UgaW50ZWdlciBkaXJydW5zIGlmZiB0aGlzIGlzIHRoZSBvdXRlcm1vc3QgbWF0Y2hlcgoJCQkJZGlycnVuc1VuaXF1ZSA9IChkaXJydW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSksCgkJCQlsZW4gPSBlbGVtcy5sZW5ndGg7CgoJCQlpZiAoIG91dGVybW9zdCApIHsKCQkJCW91dGVybW9zdENvbnRleHQgPSBjb250ZXh0ID09PSBkb2N1bWVudCB8fCBjb250ZXh0IHx8IG91dGVybW9zdDsKCQkJfQoKCQkJLy8gQWRkIGVsZW1lbnRzIHBhc3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHMKCQkJLy8gU3VwcG9ydDogSUU8OSwgU2FmYXJpCgkJCS8vIFRvbGVyYXRlIE5vZGVMaXN0IHByb3BlcnRpZXMgKElFOiAibGVuZ3RoIjsgU2FmYXJpOiA8bnVtYmVyPikgbWF0Y2hpbmcgZWxlbWVudHMgYnkgaWQKCQkJZm9yICggOyBpICE9PSBsZW4gJiYgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBieUVsZW1lbnQgJiYgZWxlbSApIHsKCQkJCQlqID0gMDsKCQkJCQlpZiAoICFjb250ZXh0ICYmIGVsZW0ub3duZXJEb2N1bWVudCAhPT0gZG9jdW1lbnQgKSB7CgkJCQkJCXNldERvY3VtZW50KCBlbGVtICk7CgkJCQkJCXhtbCA9ICFkb2N1bWVudElzSFRNTDsKCQkJCQl9CgkJCQkJd2hpbGUgKCAobWF0Y2hlciA9IGVsZW1lbnRNYXRjaGVyc1tqKytdKSApIHsKCQkJCQkJaWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0IHx8IGRvY3VtZW50LCB4bWwpICkgewoJCQkJCQkJcmVzdWx0cy5wdXNoKCBlbGVtICk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCQkJCQlpZiAoIG91dGVybW9zdCApIHsKCQkJCQkJZGlycnVucyA9IGRpcnJ1bnNVbmlxdWU7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Igc2V0IGZpbHRlcnMKCQkJCWlmICggYnlTZXQgKSB7CgkJCQkJLy8gVGhleSB3aWxsIGhhdmUgZ29uZSB0aHJvdWdoIGFsbCBwb3NzaWJsZSBtYXRjaGVycwoJCQkJCWlmICggKGVsZW0gPSAhbWF0Y2hlciAmJiBlbGVtKSApIHsKCQkJCQkJbWF0Y2hlZENvdW50LS07CgkJCQkJfQoKCQkJCQkvLyBMZW5ndGhlbiB0aGUgYXJyYXkgZm9yIGV2ZXJ5IGVsZW1lbnQsIG1hdGNoZWQgb3Igbm90CgkJCQkJaWYgKCBzZWVkICkgewoJCQkJCQl1bm1hdGNoZWQucHVzaCggZWxlbSApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gYGlgIGlzIG5vdyB0aGUgY291bnQgb2YgZWxlbWVudHMgdmlzaXRlZCBhYm92ZSwgYW5kIGFkZGluZyBpdCB0byBgbWF0Y2hlZENvdW50YAoJCQkvLyBtYWtlcyB0aGUgbGF0dGVyIG5vbm5lZ2F0aXZlLgoJCQltYXRjaGVkQ291bnQgKz0gaTsKCgkJCS8vIEFwcGx5IHNldCBmaWx0ZXJzIHRvIHVubWF0Y2hlZCBlbGVtZW50cwoJCQkvLyBOT1RFOiBUaGlzIGNhbiBiZSBza2lwcGVkIGlmIHRoZXJlIGFyZSBubyB1bm1hdGNoZWQgZWxlbWVudHMgKGkuZS4sIGBtYXRjaGVkQ291bnRgCgkJCS8vIGVxdWFscyBgaWApLCB1bmxlc3Mgd2UgZGlkbid0IHZpc2l0IF9hbnlfIGVsZW1lbnRzIGluIHRoZSBhYm92ZSBsb29wIGJlY2F1c2Ugd2UgaGF2ZQoJCQkvLyBubyBlbGVtZW50IG1hdGNoZXJzIGFuZCBubyBzZWVkLgoJCQkvLyBJbmNyZW1lbnRpbmcgYW4gaW5pdGlhbGx5LXN0cmluZyAiMCIgYGlgIGFsbG93cyBgaWAgdG8gcmVtYWluIGEgc3RyaW5nIG9ubHkgaW4gdGhhdAoJCQkvLyBjYXNlLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhICIwMCIgYG1hdGNoZWRDb3VudGAgdGhhdCBkaWZmZXJzIGZyb20gYGlgIGJ1dCBpcyBhbHNvCgkJCS8vIG51bWVyaWNhbGx5IHplcm8uCgkJCWlmICggYnlTZXQgJiYgaSAhPT0gbWF0Y2hlZENvdW50ICkgewoJCQkJaiA9IDA7CgkJCQl3aGlsZSAoIChtYXRjaGVyID0gc2V0TWF0Y2hlcnNbaisrXSkgKSB7CgkJCQkJbWF0Y2hlciggdW5tYXRjaGVkLCBzZXRNYXRjaGVkLCBjb250ZXh0LCB4bWwgKTsKCQkJCX0KCgkJCQlpZiAoIHNlZWQgKSB7CgkJCQkJLy8gUmVpbnRlZ3JhdGUgZWxlbWVudCBtYXRjaGVzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3Igc29ydGluZwoJCQkJCWlmICggbWF0Y2hlZENvdW50ID4gMCApIHsKCQkJCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQkJCQlpZiAoICEodW5tYXRjaGVkW2ldIHx8IHNldE1hdGNoZWRbaV0pICkgewoJCQkJCQkJCXNldE1hdGNoZWRbaV0gPSBwb3AuY2FsbCggcmVzdWx0cyApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoKCQkJCQkvLyBEaXNjYXJkIGluZGV4IHBsYWNlaG9sZGVyIHZhbHVlcyB0byBnZXQgb25seSBhY3R1YWwgbWF0Y2hlcwoJCQkJCXNldE1hdGNoZWQgPSBjb25kZW5zZSggc2V0TWF0Y2hlZCApOwoJCQkJfQoKCQkJCS8vIEFkZCBtYXRjaGVzIHRvIHJlc3VsdHMKCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIHNldE1hdGNoZWQgKTsKCgkJCQkvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmcKCQkJCWlmICggb3V0ZXJtb3N0ICYmICFzZWVkICYmIHNldE1hdGNoZWQubGVuZ3RoID4gMCAmJgoJCQkJCSggbWF0Y2hlZENvdW50ICsgc2V0TWF0Y2hlcnMubGVuZ3RoICkgPiAxICkgewoKCQkJCQlTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApOwoJCQkJfQoJCQl9CgoJCQkvLyBPdmVycmlkZSBtYW5pcHVsYXRpb24gb2YgZ2xvYmFscyBieSBuZXN0ZWQgbWF0Y2hlcnMKCQkJaWYgKCBvdXRlcm1vc3QgKSB7CgkJCQlkaXJydW5zID0gZGlycnVuc1VuaXF1ZTsKCQkJCW91dGVybW9zdENvbnRleHQgPSBjb250ZXh0QmFja3VwOwoJCQl9CgoJCQlyZXR1cm4gdW5tYXRjaGVkOwoJCX07CgoJcmV0dXJuIGJ5U2V0ID8KCQltYXJrRnVuY3Rpb24oIHN1cGVyTWF0Y2hlciApIDoKCQlzdXBlck1hdGNoZXI7Cn0KCmNvbXBpbGUgPSBTaXp6bGUuY29tcGlsZSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgbWF0Y2ggLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7Cgl2YXIgaSwKCQlzZXRNYXRjaGVycyA9IFtdLAoJCWVsZW1lbnRNYXRjaGVycyA9IFtdLAoJCWNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgIiAiIF07CgoJaWYgKCAhY2FjaGVkICkgewoJCS8vIEdlbmVyYXRlIGEgZnVuY3Rpb24gb2YgcmVjdXJzaXZlIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoZWNrIGVhY2ggZWxlbWVudAoJCWlmICggIW1hdGNoICkgewoJCQltYXRjaCA9IHRva2VuaXplKCBzZWxlY3RvciApOwoJCX0KCQlpID0gbWF0Y2gubGVuZ3RoOwoJCXdoaWxlICggaS0tICkgewoJCQljYWNoZWQgPSBtYXRjaGVyRnJvbVRva2VucyggbWF0Y2hbaV0gKTsKCQkJaWYgKCBjYWNoZWRbIGV4cGFuZG8gXSApIHsKCQkJCXNldE1hdGNoZXJzLnB1c2goIGNhY2hlZCApOwoJCQl9IGVsc2UgewoJCQkJZWxlbWVudE1hdGNoZXJzLnB1c2goIGNhY2hlZCApOwoJCQl9CgkJfQoKCQkvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb24KCQljYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3RvciwgbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgKTsKCgkJLy8gU2F2ZSBzZWxlY3RvciBhbmQgdG9rZW5pemF0aW9uCgkJY2FjaGVkLnNlbGVjdG9yID0gc2VsZWN0b3I7Cgl9CglyZXR1cm4gY2FjaGVkOwp9OwoKLyoqCiAqIEEgbG93LWxldmVsIHNlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IHdvcmtzIHdpdGggU2l6emxlJ3MgY29tcGlsZWQKICogIHNlbGVjdG9yIGZ1bmN0aW9ucwogKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gc2VsZWN0b3IgQSBzZWxlY3RvciBvciBhIHByZS1jb21waWxlZAogKiAgc2VsZWN0b3IgZnVuY3Rpb24gYnVpbHQgd2l0aCBTaXp6bGUuY29tcGlsZQogKiBAcGFyYW0ge0VsZW1lbnR9IGNvbnRleHQKICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdHNdCiAqIEBwYXJhbSB7QXJyYXl9IFtzZWVkXSBBIHNldCBvZiBlbGVtZW50cyB0byBtYXRjaCBhZ2FpbnN0CiAqLwpzZWxlY3QgPSBTaXp6bGUuc2VsZWN0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICkgewoJdmFyIGksIHRva2VucywgdG9rZW4sIHR5cGUsIGZpbmQsCgkJY29tcGlsZWQgPSB0eXBlb2Ygc2VsZWN0b3IgPT09ICJmdW5jdGlvbiIgJiYgc2VsZWN0b3IsCgkJbWF0Y2ggPSAhc2VlZCAmJiB0b2tlbml6ZSggKHNlbGVjdG9yID0gY29tcGlsZWQuc2VsZWN0b3IgfHwgc2VsZWN0b3IpICk7CgoJcmVzdWx0cyA9IHJlc3VsdHMgfHwgW107CgoJLy8gVHJ5IHRvIG1pbmltaXplIG9wZXJhdGlvbnMgaWYgdGhlcmUgaXMgb25seSBvbmUgc2VsZWN0b3IgaW4gdGhlIGxpc3QgYW5kIG5vIHNlZWQKCS8vICh0aGUgbGF0dGVyIG9mIHdoaWNoIGd1YXJhbnRlZXMgdXMgY29udGV4dCkKCWlmICggbWF0Y2gubGVuZ3RoID09PSAxICkgewoKCQkvLyBSZWR1Y2UgY29udGV4dCBpZiB0aGUgbGVhZGluZyBjb21wb3VuZCBzZWxlY3RvciBpcyBhbiBJRAoJCXRva2VucyA9IG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAgKTsKCQlpZiAoIHRva2Vucy5sZW5ndGggPiAyICYmICh0b2tlbiA9IHRva2Vuc1swXSkudHlwZSA9PT0gIklEIiAmJgoJCQkJY29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiBkb2N1bWVudElzSFRNTCAmJiBFeHByLnJlbGF0aXZlWyB0b2tlbnNbMV0udHlwZSBdICkgewoKCQkJY29udGV4dCA9ICggRXhwci5maW5kWyJJRCJdKCB0b2tlbi5tYXRjaGVzWzBdLnJlcGxhY2UocnVuZXNjYXBlLCBmdW5lc2NhcGUpLCBjb250ZXh0ICkgfHwgW10gKVswXTsKCQkJaWYgKCAhY29udGV4dCApIHsKCQkJCXJldHVybiByZXN1bHRzOwoKCQkJLy8gUHJlY29tcGlsZWQgbWF0Y2hlcnMgd2lsbCBzdGlsbCB2ZXJpZnkgYW5jZXN0cnksIHNvIHN0ZXAgdXAgYSBsZXZlbAoJCQl9IGVsc2UgaWYgKCBjb21waWxlZCApIHsKCQkJCWNvbnRleHQgPSBjb250ZXh0LnBhcmVudE5vZGU7CgkJCX0KCgkJCXNlbGVjdG9yID0gc2VsZWN0b3Iuc2xpY2UoIHRva2Vucy5zaGlmdCgpLnZhbHVlLmxlbmd0aCApOwoJCX0KCgkJLy8gRmV0Y2ggYSBzZWVkIHNldCBmb3IgcmlnaHQtdG8tbGVmdCBtYXRjaGluZwoJCWkgPSBtYXRjaEV4cHJbIm5lZWRzQ29udGV4dCJdLnRlc3QoIHNlbGVjdG9yICkgPyAwIDogdG9rZW5zLmxlbmd0aDsKCQl3aGlsZSAoIGktLSApIHsKCQkJdG9rZW4gPSB0b2tlbnNbaV07CgoJCQkvLyBBYm9ydCBpZiB3ZSBoaXQgYSBjb21iaW5hdG9yCgkJCWlmICggRXhwci5yZWxhdGl2ZVsgKHR5cGUgPSB0b2tlbi50eXBlKSBdICkgewoJCQkJYnJlYWs7CgkJCX0KCQkJaWYgKCAoZmluZCA9IEV4cHIuZmluZFsgdHlwZSBdKSApIHsKCQkJCS8vIFNlYXJjaCwgZXhwYW5kaW5nIGNvbnRleHQgZm9yIGxlYWRpbmcgc2libGluZyBjb21iaW5hdG9ycwoJCQkJaWYgKCAoc2VlZCA9IGZpbmQoCgkJCQkJdG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLAoJCQkJCXJzaWJsaW5nLnRlc3QoIHRva2Vuc1swXS50eXBlICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8IGNvbnRleHQKCQkJCSkpICkgewoKCQkJCQkvLyBJZiBzZWVkIGlzIGVtcHR5IG9yIG5vIHRva2VucyByZW1haW4sIHdlIGNhbiByZXR1cm4gZWFybHkKCQkJCQl0b2tlbnMuc3BsaWNlKCBpLCAxICk7CgkJCQkJc2VsZWN0b3IgPSBzZWVkLmxlbmd0aCAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKTsKCQkJCQlpZiAoICFzZWxlY3RvciApIHsKCQkJCQkJcHVzaC5hcHBseSggcmVzdWx0cywgc2VlZCApOwoJCQkJCQlyZXR1cm4gcmVzdWx0czsKCQkJCQl9CgoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJfQoJfQoKCS8vIENvbXBpbGUgYW5kIGV4ZWN1dGUgYSBmaWx0ZXJpbmcgZnVuY3Rpb24gaWYgb25lIGlzIG5vdCBwcm92aWRlZAoJLy8gUHJvdmlkZSBgbWF0Y2hgIHRvIGF2b2lkIHJldG9rZW5pemF0aW9uIGlmIHdlIG1vZGlmaWVkIHRoZSBzZWxlY3RvciBhYm92ZQoJKCBjb21waWxlZCB8fCBjb21waWxlKCBzZWxlY3RvciwgbWF0Y2ggKSApKAoJCXNlZWQsCgkJY29udGV4dCwKCQkhZG9jdW1lbnRJc0hUTUwsCgkJcmVzdWx0cywKCQkhY29udGV4dCB8fCByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0CgkpOwoJcmV0dXJuIHJlc3VsdHM7Cn07CgovLyBPbmUtdGltZSBhc3NpZ25tZW50cwoKLy8gU29ydCBzdGFiaWxpdHkKc3VwcG9ydC5zb3J0U3RhYmxlID0gZXhwYW5kby5zcGxpdCgiIikuc29ydCggc29ydE9yZGVyICkuam9pbigiIikgPT09IGV4cGFuZG87CgovLyBTdXBwb3J0OiBDaHJvbWUgMTQtMzUrCi8vIEFsd2F5cyBhc3N1bWUgZHVwbGljYXRlcyBpZiB0aGV5IGFyZW4ndCBwYXNzZWQgdG8gdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24Kc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzID0gISFoYXNEdXBsaWNhdGU7CgovLyBJbml0aWFsaXplIGFnYWluc3QgdGhlIGRlZmF1bHQgZG9jdW1lbnQKc2V0RG9jdW1lbnQoKTsKCi8vIFN1cHBvcnQ6IFdlYmtpdDw1MzcuMzIgLSBTYWZhcmkgNi4wLjMvQ2hyb21lIDI1IChmaXhlZCBpbiBDaHJvbWUgMjcpCi8vIERldGFjaGVkIG5vZGVzIGNvbmZvdW5kaW5nbHkgZm9sbG93ICplYWNoIG90aGVyKgpzdXBwb3J0LnNvcnREZXRhY2hlZCA9IGFzc2VydChmdW5jdGlvbiggZWwgKSB7CgkvLyBTaG91bGQgcmV0dXJuIDEsIGJ1dCByZXR1cm5zIDQgKGZvbGxvd2luZykKCXJldHVybiBlbC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKSApICYgMTsKfSk7CgovLyBTdXBwb3J0OiBJRTw4Ci8vIFByZXZlbnQgYXR0cmlidXRlL3Byb3BlcnR5ICJpbnRlcnBvbGF0aW9uIgovLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNTM2NDI5JTI4VlMuODUlMjkuYXNweAppZiAoICFhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJZWwuaW5uZXJIVE1MID0gIjxhIGhyZWY9JyMnPjwvYT4iOwoJcmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikgPT09ICIjIiA7Cn0pICkgewoJYWRkSGFuZGxlKCAidHlwZXxocmVmfGhlaWdodHx3aWR0aCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHsKCQlpZiAoICFpc1hNTCApIHsKCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJ0eXBlIiA/IDEgOiAyICk7CgkJfQoJfSk7Cn0KCi8vIFN1cHBvcnQ6IElFPDkKLy8gVXNlIGRlZmF1bHRWYWx1ZSBpbiBwbGFjZSBvZiBnZXRBdHRyaWJ1dGUoInZhbHVlIikKaWYgKCAhc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJZWwuaW5uZXJIVE1MID0gIjxpbnB1dC8+IjsKCWVsLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCAidmFsdWUiLCAiIiApOwoJcmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCAidmFsdWUiICkgPT09ICIiOwp9KSApIHsKCWFkZEhhbmRsZSggInZhbHVlIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkgewoJCWlmICggIWlzWE1MICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gImlucHV0IiApIHsKCQkJcmV0dXJuIGVsZW0uZGVmYXVsdFZhbHVlOwoJCX0KCX0pOwp9CgovLyBTdXBwb3J0OiBJRTw5Ci8vIFVzZSBnZXRBdHRyaWJ1dGVOb2RlIHRvIGZldGNoIGJvb2xlYW5zIHdoZW4gZ2V0QXR0cmlidXRlIGxpZXMKaWYgKCAhYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHsKCXJldHVybiBlbC5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikgPT0gbnVsbDsKfSkgKSB7CglhZGRIYW5kbGUoIGJvb2xlYW5zLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7CgkJdmFyIHZhbDsKCQlpZiAoICFpc1hNTCApIHsKCQkJcmV0dXJuIGVsZW1bIG5hbWUgXSA9PT0gdHJ1ZSA/IG5hbWUudG9Mb3dlckNhc2UoKSA6CgkJCQkJKHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApKSAmJiB2YWwuc3BlY2lmaWVkID8KCQkJCQl2YWwudmFsdWUgOgoJCQkJbnVsbDsKCQl9Cgl9KTsKfQoKcmV0dXJuIFNpenpsZTsKCn0pKCB3aW5kb3cgKTsKCgoKalF1ZXJ5LmZpbmQgPSBTaXp6bGU7CmpRdWVyeS5leHByID0gU2l6emxlLnNlbGVjdG9yczsKCi8vIERlcHJlY2F0ZWQKalF1ZXJ5LmV4cHJbICI6IiBdID0galF1ZXJ5LmV4cHIucHNldWRvczsKalF1ZXJ5LnVuaXF1ZVNvcnQgPSBqUXVlcnkudW5pcXVlID0gU2l6emxlLnVuaXF1ZVNvcnQ7CmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7CmpRdWVyeS5pc1hNTERvYyA9IFNpenpsZS5pc1hNTDsKalF1ZXJ5LmNvbnRhaW5zID0gU2l6emxlLmNvbnRhaW5zOwpqUXVlcnkuZXNjYXBlU2VsZWN0b3IgPSBTaXp6bGUuZXNjYXBlOwoKCgoKdmFyIGRpciA9IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkgewoJdmFyIG1hdGNoZWQgPSBbXSwKCQl0cnVuY2F0ZSA9IHVudGlsICE9PSB1bmRlZmluZWQ7CgoJd2hpbGUgKCAoIGVsZW0gPSBlbGVtWyBkaXIgXSApICYmIGVsZW0ubm9kZVR5cGUgIT09IDkgKSB7CgkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQlpZiAoIHRydW5jYXRlICYmIGpRdWVyeSggZWxlbSApLmlzKCB1bnRpbCApICkgewoJCQkJYnJlYWs7CgkJCX0KCQkJbWF0Y2hlZC5wdXNoKCBlbGVtICk7CgkJfQoJfQoJcmV0dXJuIG1hdGNoZWQ7Cn07CgoKdmFyIHNpYmxpbmdzID0gZnVuY3Rpb24oIG4sIGVsZW0gKSB7Cgl2YXIgbWF0Y2hlZCA9IFtdOwoKCWZvciAoIDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcgKSB7CgkJaWYgKCBuLm5vZGVUeXBlID09PSAxICYmIG4gIT09IGVsZW0gKSB7CgkJCW1hdGNoZWQucHVzaCggbiApOwoJCX0KCX0KCglyZXR1cm4gbWF0Y2hlZDsKfTsKCgp2YXIgcm5lZWRzQ29udGV4dCA9IGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dDsKCgoKZnVuY3Rpb24gbm9kZU5hbWUoIGVsZW0sIG5hbWUgKSB7CgogIHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpOwoKfTsKdmFyIHJzaW5nbGVUYWcgPSAoIC9ePChbYS16XVteXC9cMD46XHgyMFx0XHJcblxmXSopW1x4MjBcdFxyXG5cZl0qXC8/Pig/OjxcL1wxPnwpJC9pICk7CgoKCi8vIEltcGxlbWVudCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGZpbHRlciBhbmQgbm90CmZ1bmN0aW9uIHdpbm5vdyggZWxlbWVudHMsIHF1YWxpZmllciwgbm90ICkgewoJaWYgKCBpc0Z1bmN0aW9uKCBxdWFsaWZpZXIgKSApIHsKCQlyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKCQkJcmV0dXJuICEhcXVhbGlmaWVyLmNhbGwoIGVsZW0sIGksIGVsZW0gKSAhPT0gbm90OwoJCX0gKTsKCX0KCgkvLyBTaW5nbGUgZWxlbWVudAoJaWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7CgkJcmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiAoIGVsZW0gPT09IHF1YWxpZmllciApICE9PSBub3Q7CgkJfSApOwoJfQoKCS8vIEFycmF5bGlrZSBvZiBlbGVtZW50cyAoalF1ZXJ5LCBhcmd1bWVudHMsIEFycmF5KQoJaWYgKCB0eXBlb2YgcXVhbGlmaWVyICE9PSAic3RyaW5nIiApIHsKCQlyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuICggaW5kZXhPZi5jYWxsKCBxdWFsaWZpZXIsIGVsZW0gKSA+IC0xICkgIT09IG5vdDsKCQl9ICk7Cgl9CgoJLy8gRmlsdGVyZWQgZGlyZWN0bHkgZm9yIGJvdGggc2ltcGxlIGFuZCBjb21wbGV4IHNlbGVjdG9ycwoJcmV0dXJuIGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZWxlbWVudHMsIG5vdCApOwp9CgpqUXVlcnkuZmlsdGVyID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7Cgl2YXIgZWxlbSA9IGVsZW1zWyAwIF07CgoJaWYgKCBub3QgKSB7CgkJZXhwciA9ICI6bm90KCIgKyBleHByICsgIikiOwoJfQoKCWlmICggZWxlbXMubGVuZ3RoID09PSAxICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgkJcmV0dXJuIGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZWxlbSwgZXhwciApID8gWyBlbGVtIF0gOiBbXTsKCX0KCglyZXR1cm4galF1ZXJ5LmZpbmQubWF0Y2hlcyggZXhwciwgalF1ZXJ5LmdyZXAoIGVsZW1zLCBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMTsKCX0gKSApOwp9OwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJZmluZDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciBpLCByZXQsCgkJCWxlbiA9IHRoaXMubGVuZ3RoLAoJCQlzZWxmID0gdGhpczsKCgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewoJCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeSggc2VsZWN0b3IgKS5maWx0ZXIoIGZ1bmN0aW9uKCkgewoJCQkJZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKCQkJCQlpZiAoIGpRdWVyeS5jb250YWlucyggc2VsZlsgaSBdLCB0aGlzICkgKSB7CgkJCQkJCXJldHVybiB0cnVlOwoJCQkJCX0KCQkJCX0KCQkJfSApICk7CgkJfQoKCQlyZXQgPSB0aGlzLnB1c2hTdGFjayggW10gKTsKCgkJZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKCQkJalF1ZXJ5LmZpbmQoIHNlbGVjdG9yLCBzZWxmWyBpIF0sIHJldCApOwoJCX0KCgkJcmV0dXJuIGxlbiA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggcmV0ICkgOiByZXQ7Cgl9LAoJZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCBmYWxzZSApICk7Cgl9LAoJbm90OiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCB0cnVlICkgKTsKCX0sCglpczogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiAhIXdpbm5vdygKCQkJdGhpcywKCgkJCS8vIElmIHRoaXMgaXMgYSBwb3NpdGlvbmFsL3JlbGF0aXZlIHNlbGVjdG9yLCBjaGVjayBtZW1iZXJzaGlwIGluIHRoZSByZXR1cm5lZCBzZXQKCQkJLy8gc28gJCgicDpmaXJzdCIpLmlzKCJwOmxhc3QiKSB3b24ndCByZXR1cm4gdHJ1ZSBmb3IgYSBkb2Mgd2l0aCB0d28gInAiLgoJCQl0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICYmIHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSA/CgkJCQlqUXVlcnkoIHNlbGVjdG9yICkgOgoJCQkJc2VsZWN0b3IgfHwgW10sCgkJCWZhbHNlCgkJKS5sZW5ndGg7Cgl9Cn0gKTsKCgovLyBJbml0aWFsaXplIGEgalF1ZXJ5IG9iamVjdAoKCi8vIEEgY2VudHJhbCByZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRvY3VtZW50KQp2YXIgcm9vdGpRdWVyeSwKCgkvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5ncwoJLy8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKCM5NTIxKQoJLy8gU3RyaWN0IEhUTUwgcmVjb2duaXRpb24gKCMxMTI5MDogbXVzdCBzdGFydCB3aXRoIDwpCgkvLyBTaG9ydGN1dCBzaW1wbGUgI2lkIGNhc2UgZm9yIHNwZWVkCglycXVpY2tFeHByID0gL14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0rKSkkLywKCglpbml0ID0galF1ZXJ5LmZuLmluaXQgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3QgKSB7CgkJdmFyIG1hdGNoLCBlbGVtOwoKCQkvLyBIQU5ETEU6ICQoIiIpLCAkKG51bGwpLCAkKHVuZGVmaW5lZCksICQoZmFsc2UpCgkJaWYgKCAhc2VsZWN0b3IgKSB7CgkJCXJldHVybiB0aGlzOwoJCX0KCgkJLy8gTWV0aG9kIGluaXQoKSBhY2NlcHRzIGFuIGFsdGVybmF0ZSByb290alF1ZXJ5CgkJLy8gc28gbWlncmF0ZSBjYW4gc3VwcG9ydCBqUXVlcnkuc3ViIChnaC0yMTAxKQoJCXJvb3QgPSByb290IHx8IHJvb3RqUXVlcnk7CgoJCS8vIEhhbmRsZSBIVE1MIHN0cmluZ3MKCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCWlmICggc2VsZWN0b3JbIDAgXSA9PT0gIjwiICYmCgkJCQlzZWxlY3Rvclsgc2VsZWN0b3IubGVuZ3RoIC0gMSBdID09PSAiPiIgJiYKCQkJCXNlbGVjdG9yLmxlbmd0aCA+PSAzICkgewoKCQkJCS8vIEFzc3VtZSB0aGF0IHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNraXAgdGhlIHJlZ2V4IGNoZWNrCgkJCQltYXRjaCA9IFsgbnVsbCwgc2VsZWN0b3IsIG51bGwgXTsKCgkJCX0gZWxzZSB7CgkJCQltYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTsKCQkJfQoKCQkJLy8gTWF0Y2ggaHRtbCBvciBtYWtlIHN1cmUgbm8gY29udGV4dCBpcyBzcGVjaWZpZWQgZm9yICNpZAoJCQlpZiAoIG1hdGNoICYmICggbWF0Y2hbIDEgXSB8fCAhY29udGV4dCApICkgewoKCQkJCS8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KQoJCQkJaWYgKCBtYXRjaFsgMSBdICkgewoJCQkJCWNvbnRleHQgPSBjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5ID8gY29udGV4dFsgMCBdIDogY29udGV4dDsKCgkJCQkJLy8gT3B0aW9uIHRvIHJ1biBzY3JpcHRzIGlzIHRydWUgZm9yIGJhY2stY29tcGF0CgkJCQkJLy8gSW50ZW50aW9uYWxseSBsZXQgdGhlIGVycm9yIGJlIHRocm93biBpZiBwYXJzZUhUTUwgaXMgbm90IHByZXNlbnQKCQkJCQlqUXVlcnkubWVyZ2UoIHRoaXMsIGpRdWVyeS5wYXJzZUhUTUwoCgkJCQkJCW1hdGNoWyAxIF0sCgkJCQkJCWNvbnRleHQgJiYgY29udGV4dC5ub2RlVHlwZSA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogZG9jdW1lbnQsCgkJCQkJCXRydWUKCQkJCQkpICk7CgoJCQkJCS8vIEhBTkRMRTogJChodG1sLCBwcm9wcykKCQkJCQlpZiAoIHJzaW5nbGVUYWcudGVzdCggbWF0Y2hbIDEgXSApICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb250ZXh0ICkgKSB7CgkJCQkJCWZvciAoIG1hdGNoIGluIGNvbnRleHQgKSB7CgoJCQkJCQkJLy8gUHJvcGVydGllcyBvZiBjb250ZXh0IGFyZSBjYWxsZWQgYXMgbWV0aG9kcyBpZiBwb3NzaWJsZQoJCQkJCQkJaWYgKCBpc0Z1bmN0aW9uKCB0aGlzWyBtYXRjaCBdICkgKSB7CgkJCQkJCQkJdGhpc1sgbWF0Y2ggXSggY29udGV4dFsgbWF0Y2ggXSApOwoKCQkJCQkJCS8vIC4uLmFuZCBvdGhlcndpc2Ugc2V0IGFzIGF0dHJpYnV0ZXMKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJdGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoKCQkJCQlyZXR1cm4gdGhpczsKCgkJCQkvLyBIQU5ETEU6ICQoI2lkKQoJCQkJfSBlbHNlIHsKCQkJCQllbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWyAyIF0gKTsKCgkJCQkJaWYgKCBlbGVtICkgewoKCQkJCQkJLy8gSW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3QKCQkJCQkJdGhpc1sgMCBdID0gZWxlbTsKCQkJCQkJdGhpcy5sZW5ndGggPSAxOwoJCQkJCX0KCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0KCgkJCS8vIEhBTkRMRTogJChleHByLCAkKC4uLikpCgkJCX0gZWxzZSBpZiAoICFjb250ZXh0IHx8IGNvbnRleHQuanF1ZXJ5ICkgewoJCQkJcmV0dXJuICggY29udGV4dCB8fCByb290ICkuZmluZCggc2VsZWN0b3IgKTsKCgkJCS8vIEhBTkRMRTogJChleHByLCBjb250ZXh0KQoJCQkvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcikKCQkJfSBlbHNlIHsKCQkJCXJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTsKCQkJfQoKCQkvLyBIQU5ETEU6ICQoRE9NRWxlbWVudCkKCQl9IGVsc2UgaWYgKCBzZWxlY3Rvci5ub2RlVHlwZSApIHsKCQkJdGhpc1sgMCBdID0gc2VsZWN0b3I7CgkJCXRoaXMubGVuZ3RoID0gMTsKCQkJcmV0dXJuIHRoaXM7CgoJCS8vIEhBTkRMRTogJChmdW5jdGlvbikKCQkvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHkKCQl9IGVsc2UgaWYgKCBpc0Z1bmN0aW9uKCBzZWxlY3RvciApICkgewoJCQlyZXR1cm4gcm9vdC5yZWFkeSAhPT0gdW5kZWZpbmVkID8KCQkJCXJvb3QucmVhZHkoIHNlbGVjdG9yICkgOgoKCQkJCS8vIEV4ZWN1dGUgaW1tZWRpYXRlbHkgaWYgcmVhZHkgaXMgbm90IHByZXNlbnQKCQkJCXNlbGVjdG9yKCBqUXVlcnkgKTsKCQl9CgoJCXJldHVybiBqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciwgdGhpcyApOwoJfTsKCi8vIEdpdmUgdGhlIGluaXQgZnVuY3Rpb24gdGhlIGpRdWVyeSBwcm90b3R5cGUgZm9yIGxhdGVyIGluc3RhbnRpYXRpb24KaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47CgovLyBJbml0aWFsaXplIGNlbnRyYWwgcmVmZXJlbmNlCnJvb3RqUXVlcnkgPSBqUXVlcnkoIGRvY3VtZW50ICk7CgoKdmFyIHJwYXJlbnRzcHJldiA9IC9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLAoKCS8vIE1ldGhvZHMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgdW5pcXVlIHNldCB3aGVuIHN0YXJ0aW5nIGZyb20gYSB1bmlxdWUgc2V0CglndWFyYW50ZWVkVW5pcXVlID0gewoJCWNoaWxkcmVuOiB0cnVlLAoJCWNvbnRlbnRzOiB0cnVlLAoJCW5leHQ6IHRydWUsCgkJcHJldjogdHJ1ZQoJfTsKCmpRdWVyeS5mbi5leHRlbmQoIHsKCWhhczogZnVuY3Rpb24oIHRhcmdldCApIHsKCQl2YXIgdGFyZ2V0cyA9IGpRdWVyeSggdGFyZ2V0LCB0aGlzICksCgkJCWwgPSB0YXJnZXRzLmxlbmd0aDsKCgkJcmV0dXJuIHRoaXMuZmlsdGVyKCBmdW5jdGlvbigpIHsKCQkJdmFyIGkgPSAwOwoJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJCQlpZiAoIGpRdWVyeS5jb250YWlucyggdGhpcywgdGFyZ2V0c1sgaSBdICkgKSB7CgkJCQkJcmV0dXJuIHRydWU7CgkJCQl9CgkJCX0KCQl9ICk7Cgl9LAoKCWNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvcnMsIGNvbnRleHQgKSB7CgkJdmFyIGN1ciwKCQkJaSA9IDAsCgkJCWwgPSB0aGlzLmxlbmd0aCwKCQkJbWF0Y2hlZCA9IFtdLAoJCQl0YXJnZXRzID0gdHlwZW9mIHNlbGVjdG9ycyAhPT0gInN0cmluZyIgJiYgalF1ZXJ5KCBzZWxlY3RvcnMgKTsKCgkJLy8gUG9zaXRpb25hbCBzZWxlY3RvcnMgbmV2ZXIgbWF0Y2gsIHNpbmNlIHRoZXJlJ3Mgbm8gX3NlbGVjdGlvbl8gY29udGV4dAoJCWlmICggIXJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3JzICkgKSB7CgkJCWZvciAoIDsgaSA8IGw7IGkrKyApIHsKCQkJCWZvciAoIGN1ciA9IHRoaXNbIGkgXTsgY3VyICYmIGN1ciAhPT0gY29udGV4dDsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7CgoJCQkJCS8vIEFsd2F5cyBza2lwIGRvY3VtZW50IGZyYWdtZW50cwoJCQkJCWlmICggY3VyLm5vZGVUeXBlIDwgMTEgJiYgKCB0YXJnZXRzID8KCQkJCQkJdGFyZ2V0cy5pbmRleCggY3VyICkgPiAtMSA6CgoJCQkJCQkvLyBEb24ndCBwYXNzIG5vbi1lbGVtZW50cyB0byBTaXp6bGUKCQkJCQkJY3VyLm5vZGVUeXBlID09PSAxICYmCgkJCQkJCQlqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGN1ciwgc2VsZWN0b3JzICkgKSApIHsKCgkJCQkJCW1hdGNoZWQucHVzaCggY3VyICk7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkLmxlbmd0aCA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApIDogbWF0Y2hlZCApOwoJfSwKCgkvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluIHRoZSBzZXQKCWluZGV4OiBmdW5jdGlvbiggZWxlbSApIHsKCgkJLy8gTm8gYXJndW1lbnQsIHJldHVybiBpbmRleCBpbiBwYXJlbnQKCQlpZiAoICFlbGVtICkgewoJCQlyZXR1cm4gKCB0aGlzWyAwIF0gJiYgdGhpc1sgMCBdLnBhcmVudE5vZGUgKSA/IHRoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoIDogLTE7CgkJfQoKCQkvLyBJbmRleCBpbiBzZWxlY3RvcgoJCWlmICggdHlwZW9mIGVsZW0gPT09ICJzdHJpbmciICkgewoJCQlyZXR1cm4gaW5kZXhPZi5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdGhpc1sgMCBdICk7CgkJfQoKCQkvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQKCQlyZXR1cm4gaW5kZXhPZi5jYWxsKCB0aGlzLAoKCQkJLy8gSWYgaXQgcmVjZWl2ZXMgYSBqUXVlcnkgb2JqZWN0LCB0aGUgZmlyc3QgZWxlbWVudCBpcyB1c2VkCgkJCWVsZW0uanF1ZXJ5ID8gZWxlbVsgMCBdIDogZWxlbQoJCSk7Cgl9LAoKCWFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjaygKCQkJalF1ZXJ5LnVuaXF1ZVNvcnQoCgkJCQlqUXVlcnkubWVyZ2UoIHRoaXMuZ2V0KCksIGpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgKSApCgkJCSkKCQkpOwoJfSwKCglhZGRCYWNrOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMuYWRkKCBzZWxlY3RvciA9PSBudWxsID8KCQkJdGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZpbHRlciggc2VsZWN0b3IgKQoJCSk7Cgl9Cn0gKTsKCmZ1bmN0aW9uIHNpYmxpbmcoIGN1ciwgZGlyICkgewoJd2hpbGUgKCAoIGN1ciA9IGN1clsgZGlyIF0gKSAmJiBjdXIubm9kZVR5cGUgIT09IDEgKSB7fQoJcmV0dXJuIGN1cjsKfQoKalF1ZXJ5LmVhY2goIHsKCXBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQlyZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMTEgPyBwYXJlbnQgOiBudWxsOwoJfSwKCXBhcmVudHM6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJwYXJlbnROb2RlIiApOwoJfSwKCXBhcmVudHNVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJwYXJlbnROb2RlIiwgdW50aWwgKTsKCX0sCgluZXh0OiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gc2libGluZyggZWxlbSwgIm5leHRTaWJsaW5nIiApOwoJfSwKCXByZXY6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBzaWJsaW5nKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiApOwoJfSwKCW5leHRBbGw6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJuZXh0U2libGluZyIgKTsKCX0sCglwcmV2QWxsOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZGlyKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiApOwoJfSwKCW5leHRVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJuZXh0U2libGluZyIsIHVudGlsICk7Cgl9LAoJcHJldlVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7CgkJcmV0dXJuIGRpciggZWxlbSwgInByZXZpb3VzU2libGluZyIsIHVudGlsICk7Cgl9LAoJc2libGluZ3M6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBzaWJsaW5ncyggKCBlbGVtLnBhcmVudE5vZGUgfHwge30gKS5maXJzdENoaWxkLCBlbGVtICk7Cgl9LAoJY2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBzaWJsaW5ncyggZWxlbS5maXJzdENoaWxkICk7Cgl9LAoJY29udGVudHM6IGZ1bmN0aW9uKCBlbGVtICkgewogICAgICAgIGlmICggbm9kZU5hbWUoIGVsZW0sICJpZnJhbWUiICkgKSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtLmNvbnRlbnREb2N1bWVudDsKICAgICAgICB9CgogICAgICAgIC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5LCBpT1MgNyBvbmx5LCBBbmRyb2lkIEJyb3dzZXIgPD00LjMgb25seQogICAgICAgIC8vIFRyZWF0IHRoZSB0ZW1wbGF0ZSBlbGVtZW50IGFzIGEgcmVndWxhciBvbmUgaW4gYnJvd3NlcnMgdGhhdAogICAgICAgIC8vIGRvbid0IHN1cHBvcnQgaXQuCiAgICAgICAgaWYgKCBub2RlTmFtZSggZWxlbSwgInRlbXBsYXRlIiApICkgewogICAgICAgICAgICBlbGVtID0gZWxlbS5jb250ZW50IHx8IGVsZW07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgZWxlbS5jaGlsZE5vZGVzICk7Cgl9Cn0sIGZ1bmN0aW9uKCBuYW1lLCBmbiApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHVudGlsLCBzZWxlY3RvciApIHsKCQl2YXIgbWF0Y2hlZCA9IGpRdWVyeS5tYXAoIHRoaXMsIGZuLCB1bnRpbCApOwoKCQlpZiAoIG5hbWUuc2xpY2UoIC01ICkgIT09ICJVbnRpbCIgKSB7CgkJCXNlbGVjdG9yID0gdW50aWw7CgkJfQoKCQlpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCW1hdGNoZWQgPSBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgbWF0Y2hlZCApOwoJCX0KCgkJaWYgKCB0aGlzLmxlbmd0aCA+IDEgKSB7CgoJCQkvLyBSZW1vdmUgZHVwbGljYXRlcwoJCQlpZiAoICFndWFyYW50ZWVkVW5pcXVlWyBuYW1lIF0gKSB7CgkJCQlqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApOwoJCQl9CgoJCQkvLyBSZXZlcnNlIG9yZGVyIGZvciBwYXJlbnRzKiBhbmQgcHJldi1kZXJpdmF0aXZlcwoJCQlpZiAoIHJwYXJlbnRzcHJldi50ZXN0KCBuYW1lICkgKSB7CgkJCQltYXRjaGVkLnJldmVyc2UoKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkICk7Cgl9Owp9ICk7CnZhciBybm90aHRtbHdoaXRlID0gKCAvW15ceDIwXHRcclxuXGZdKy9nICk7CgoKCi8vIENvbnZlcnQgU3RyaW5nLWZvcm1hdHRlZCBvcHRpb25zIGludG8gT2JqZWN0LWZvcm1hdHRlZCBvbmVzCmZ1bmN0aW9uIGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSB7Cgl2YXIgb2JqZWN0ID0ge307CglqUXVlcnkuZWFjaCggb3B0aW9ucy5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdLCBmdW5jdGlvbiggXywgZmxhZyApIHsKCQlvYmplY3RbIGZsYWcgXSA9IHRydWU7Cgl9ICk7CglyZXR1cm4gb2JqZWN0Owp9CgovKgogKiBDcmVhdGUgYSBjYWxsYmFjayBsaXN0IHVzaW5nIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKICoKICoJb3B0aW9uczogYW4gb3B0aW9uYWwgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgb3B0aW9ucyB0aGF0IHdpbGwgY2hhbmdlIGhvdwogKgkJCXRoZSBjYWxsYmFjayBsaXN0IGJlaGF2ZXMgb3IgYSBtb3JlIHRyYWRpdGlvbmFsIG9wdGlvbiBvYmplY3QKICoKICogQnkgZGVmYXVsdCBhIGNhbGxiYWNrIGxpc3Qgd2lsbCBhY3QgbGlrZSBhbiBldmVudCBjYWxsYmFjayBsaXN0IGFuZCBjYW4gYmUKICogImZpcmVkIiBtdWx0aXBsZSB0aW1lcy4KICoKICogUG9zc2libGUgb3B0aW9uczoKICoKICoJb25jZToJCQl3aWxsIGVuc3VyZSB0aGUgY2FsbGJhY2sgbGlzdCBjYW4gb25seSBiZSBmaXJlZCBvbmNlIChsaWtlIGEgRGVmZXJyZWQpCiAqCiAqCW1lbW9yeToJCQl3aWxsIGtlZXAgdHJhY2sgb2YgcHJldmlvdXMgdmFsdWVzIGFuZCB3aWxsIGNhbGwgYW55IGNhbGxiYWNrIGFkZGVkCiAqCQkJCQlhZnRlciB0aGUgbGlzdCBoYXMgYmVlbiBmaXJlZCByaWdodCBhd2F5IHdpdGggdGhlIGxhdGVzdCAibWVtb3JpemVkIgogKgkJCQkJdmFsdWVzIChsaWtlIGEgRGVmZXJyZWQpCiAqCiAqCXVuaXF1ZToJCQl3aWxsIGVuc3VyZSBhIGNhbGxiYWNrIGNhbiBvbmx5IGJlIGFkZGVkIG9uY2UgKG5vIGR1cGxpY2F0ZSBpbiB0aGUgbGlzdCkKICoKICoJc3RvcE9uRmFsc2U6CWludGVycnVwdCBjYWxsaW5ncyB3aGVuIGEgY2FsbGJhY2sgcmV0dXJucyBmYWxzZQogKgogKi8KalF1ZXJ5LkNhbGxiYWNrcyA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewoKCS8vIENvbnZlcnQgb3B0aW9ucyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2JqZWN0LWZvcm1hdHRlZCBpZiBuZWVkZWQKCS8vICh3ZSBjaGVjayBpbiBjYWNoZSBmaXJzdCkKCW9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gInN0cmluZyIgPwoJCWNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSA6CgkJalF1ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMgKTsKCgl2YXIgLy8gRmxhZyB0byBrbm93IGlmIGxpc3QgaXMgY3VycmVudGx5IGZpcmluZwoJCWZpcmluZywKCgkJLy8gTGFzdCBmaXJlIHZhbHVlIGZvciBub24tZm9yZ2V0dGFibGUgbGlzdHMKCQltZW1vcnksCgoJCS8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IHdhcyBhbHJlYWR5IGZpcmVkCgkJZmlyZWQsCgoJCS8vIEZsYWcgdG8gcHJldmVudCBmaXJpbmcKCQlsb2NrZWQsCgoJCS8vIEFjdHVhbCBjYWxsYmFjayBsaXN0CgkJbGlzdCA9IFtdLAoKCQkvLyBRdWV1ZSBvZiBleGVjdXRpb24gZGF0YSBmb3IgcmVwZWF0YWJsZSBsaXN0cwoJCXF1ZXVlID0gW10sCgoJCS8vIEluZGV4IG9mIGN1cnJlbnRseSBmaXJpbmcgY2FsbGJhY2sgKG1vZGlmaWVkIGJ5IGFkZC9yZW1vdmUgYXMgbmVlZGVkKQoJCWZpcmluZ0luZGV4ID0gLTEsCgoJCS8vIEZpcmUgY2FsbGJhY2tzCgkJZmlyZSA9IGZ1bmN0aW9uKCkgewoKCQkJLy8gRW5mb3JjZSBzaW5nbGUtZmlyaW5nCgkJCWxvY2tlZCA9IGxvY2tlZCB8fCBvcHRpb25zLm9uY2U7CgoJCQkvLyBFeGVjdXRlIGNhbGxiYWNrcyBmb3IgYWxsIHBlbmRpbmcgZXhlY3V0aW9ucywKCQkJLy8gcmVzcGVjdGluZyBmaXJpbmdJbmRleCBvdmVycmlkZXMgYW5kIHJ1bnRpbWUgY2hhbmdlcwoJCQlmaXJlZCA9IGZpcmluZyA9IHRydWU7CgkJCWZvciAoIDsgcXVldWUubGVuZ3RoOyBmaXJpbmdJbmRleCA9IC0xICkgewoJCQkJbWVtb3J5ID0gcXVldWUuc2hpZnQoKTsKCQkJCXdoaWxlICggKytmaXJpbmdJbmRleCA8IGxpc3QubGVuZ3RoICkgewoKCQkJCQkvLyBSdW4gY2FsbGJhY2sgYW5kIGNoZWNrIGZvciBlYXJseSB0ZXJtaW5hdGlvbgoJCQkJCWlmICggbGlzdFsgZmlyaW5nSW5kZXggXS5hcHBseSggbWVtb3J5WyAwIF0sIG1lbW9yeVsgMSBdICkgPT09IGZhbHNlICYmCgkJCQkJCW9wdGlvbnMuc3RvcE9uRmFsc2UgKSB7CgoJCQkJCQkvLyBKdW1wIHRvIGVuZCBhbmQgZm9yZ2V0IHRoZSBkYXRhIHNvIC5hZGQgZG9lc24ndCByZS1maXJlCgkJCQkJCWZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGg7CgkJCQkJCW1lbW9yeSA9IGZhbHNlOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gRm9yZ2V0IHRoZSBkYXRhIGlmIHdlJ3JlIGRvbmUgd2l0aCBpdAoJCQlpZiAoICFvcHRpb25zLm1lbW9yeSApIHsKCQkJCW1lbW9yeSA9IGZhbHNlOwoJCQl9CgoJCQlmaXJpbmcgPSBmYWxzZTsKCgkJCS8vIENsZWFuIHVwIGlmIHdlJ3JlIGRvbmUgZmlyaW5nIGZvciBnb29kCgkJCWlmICggbG9ja2VkICkgewoKCQkJCS8vIEtlZXAgYW4gZW1wdHkgbGlzdCBpZiB3ZSBoYXZlIGRhdGEgZm9yIGZ1dHVyZSBhZGQgY2FsbHMKCQkJCWlmICggbWVtb3J5ICkgewoJCQkJCWxpc3QgPSBbXTsKCgkJCQkvLyBPdGhlcndpc2UsIHRoaXMgb2JqZWN0IGlzIHNwZW50CgkJCQl9IGVsc2UgewoJCQkJCWxpc3QgPSAiIjsKCQkJCX0KCQkJfQoJCX0sCgoJCS8vIEFjdHVhbCBDYWxsYmFja3Mgb2JqZWN0CgkJc2VsZiA9IHsKCgkJCS8vIEFkZCBhIGNhbGxiYWNrIG9yIGEgY29sbGVjdGlvbiBvZiBjYWxsYmFja3MgdG8gdGhlIGxpc3QKCQkJYWRkOiBmdW5jdGlvbigpIHsKCQkJCWlmICggbGlzdCApIHsKCgkJCQkJLy8gSWYgd2UgaGF2ZSBtZW1vcnkgZnJvbSBhIHBhc3QgcnVuLCB3ZSBzaG91bGQgZmlyZSBhZnRlciBhZGRpbmcKCQkJCQlpZiAoIG1lbW9yeSAmJiAhZmlyaW5nICkgewoJCQkJCQlmaXJpbmdJbmRleCA9IGxpc3QubGVuZ3RoIC0gMTsKCQkJCQkJcXVldWUucHVzaCggbWVtb3J5ICk7CgkJCQkJfQoKCQkJCQkoIGZ1bmN0aW9uIGFkZCggYXJncyApIHsKCQkJCQkJalF1ZXJ5LmVhY2goIGFyZ3MsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7CgkJCQkJCQlpZiAoIGlzRnVuY3Rpb24oIGFyZyApICkgewoJCQkJCQkJCWlmICggIW9wdGlvbnMudW5pcXVlIHx8ICFzZWxmLmhhcyggYXJnICkgKSB7CgkJCQkJCQkJCWxpc3QucHVzaCggYXJnICk7CgkJCQkJCQkJfQoJCQkJCQkJfSBlbHNlIGlmICggYXJnICYmIGFyZy5sZW5ndGggJiYgdG9UeXBlKCBhcmcgKSAhPT0gInN0cmluZyIgKSB7CgoJCQkJCQkJCS8vIEluc3BlY3QgcmVjdXJzaXZlbHkKCQkJCQkJCQlhZGQoIGFyZyApOwoJCQkJCQkJfQoJCQkJCQl9ICk7CgkJCQkJfSApKCBhcmd1bWVudHMgKTsKCgkJCQkJaWYgKCBtZW1vcnkgJiYgIWZpcmluZyApIHsKCQkJCQkJZmlyZSgpOwoJCQkJCX0KCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9LAoKCQkJLy8gUmVtb3ZlIGEgY2FsbGJhY2sgZnJvbSB0aGUgbGlzdAoJCQlyZW1vdmU6IGZ1bmN0aW9uKCkgewoJCQkJalF1ZXJ5LmVhY2goIGFyZ3VtZW50cywgZnVuY3Rpb24oIF8sIGFyZyApIHsKCQkJCQl2YXIgaW5kZXg7CgkJCQkJd2hpbGUgKCAoIGluZGV4ID0galF1ZXJ5LmluQXJyYXkoIGFyZywgbGlzdCwgaW5kZXggKSApID4gLTEgKSB7CgkJCQkJCWxpc3Quc3BsaWNlKCBpbmRleCwgMSApOwoKCQkJCQkJLy8gSGFuZGxlIGZpcmluZyBpbmRleGVzCgkJCQkJCWlmICggaW5kZXggPD0gZmlyaW5nSW5kZXggKSB7CgkJCQkJCQlmaXJpbmdJbmRleC0tOwoJCQkJCQl9CgkJCQkJfQoJCQkJfSApOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX0sCgoJCQkvLyBDaGVjayBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0LgoJCQkvLyBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgcmV0dXJuIHdoZXRoZXIgb3Igbm90IGxpc3QgaGFzIGNhbGxiYWNrcyBhdHRhY2hlZC4KCQkJaGFzOiBmdW5jdGlvbiggZm4gKSB7CgkJCQlyZXR1cm4gZm4gPwoJCQkJCWpRdWVyeS5pbkFycmF5KCBmbiwgbGlzdCApID4gLTEgOgoJCQkJCWxpc3QubGVuZ3RoID4gMDsKCQkJfSwKCgkJCS8vIFJlbW92ZSBhbGwgY2FsbGJhY2tzIGZyb20gdGhlIGxpc3QKCQkJZW1wdHk6IGZ1bmN0aW9uKCkgewoJCQkJaWYgKCBsaXN0ICkgewoJCQkJCWxpc3QgPSBbXTsKCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9LAoKCQkJLy8gRGlzYWJsZSAuZmlyZSBhbmQgLmFkZAoJCQkvLyBBYm9ydCBhbnkgY3VycmVudC9wZW5kaW5nIGV4ZWN1dGlvbnMKCQkJLy8gQ2xlYXIgYWxsIGNhbGxiYWNrcyBhbmQgdmFsdWVzCgkJCWRpc2FibGU6IGZ1bmN0aW9uKCkgewoJCQkJbG9ja2VkID0gcXVldWUgPSBbXTsKCQkJCWxpc3QgPSBtZW1vcnkgPSAiIjsKCQkJCXJldHVybiB0aGlzOwoJCQl9LAoJCQlkaXNhYmxlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gIWxpc3Q7CgkJCX0sCgoJCQkvLyBEaXNhYmxlIC5maXJlCgkJCS8vIEFsc28gZGlzYWJsZSAuYWRkIHVubGVzcyB3ZSBoYXZlIG1lbW9yeSAoc2luY2UgaXQgd291bGQgaGF2ZSBubyBlZmZlY3QpCgkJCS8vIEFib3J0IGFueSBwZW5kaW5nIGV4ZWN1dGlvbnMKCQkJbG9jazogZnVuY3Rpb24oKSB7CgkJCQlsb2NrZWQgPSBxdWV1ZSA9IFtdOwoJCQkJaWYgKCAhbWVtb3J5ICYmICFmaXJpbmcgKSB7CgkJCQkJbGlzdCA9IG1lbW9yeSA9ICIiOwoJCQkJfQoJCQkJcmV0dXJuIHRoaXM7CgkJCX0sCgkJCWxvY2tlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gISFsb2NrZWQ7CgkJCX0sCgoJCQkvLyBDYWxsIGFsbCBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgYXJndW1lbnRzCgkJCWZpcmVXaXRoOiBmdW5jdGlvbiggY29udGV4dCwgYXJncyApIHsKCQkJCWlmICggIWxvY2tlZCApIHsKCQkJCQlhcmdzID0gYXJncyB8fCBbXTsKCQkJCQlhcmdzID0gWyBjb250ZXh0LCBhcmdzLnNsaWNlID8gYXJncy5zbGljZSgpIDogYXJncyBdOwoJCQkJCXF1ZXVlLnB1c2goIGFyZ3MgKTsKCQkJCQlpZiAoICFmaXJpbmcgKSB7CgkJCQkJCWZpcmUoKTsKCQkJCQl9CgkJCQl9CgkJCQlyZXR1cm4gdGhpczsKCQkJfSwKCgkJCS8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzCgkJCWZpcmU6IGZ1bmN0aW9uKCkgewoJCQkJc2VsZi5maXJlV2l0aCggdGhpcywgYXJndW1lbnRzICk7CgkJCQlyZXR1cm4gdGhpczsKCQkJfSwKCgkJCS8vIFRvIGtub3cgaWYgdGhlIGNhbGxiYWNrcyBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZQoJCQlmaXJlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gISFmaXJlZDsKCQkJfQoJCX07CgoJcmV0dXJuIHNlbGY7Cn07CgoKZnVuY3Rpb24gSWRlbnRpdHkoIHYgKSB7CglyZXR1cm4gdjsKfQpmdW5jdGlvbiBUaHJvd2VyKCBleCApIHsKCXRocm93IGV4Owp9CgpmdW5jdGlvbiBhZG9wdFZhbHVlKCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0LCBub1ZhbHVlICkgewoJdmFyIG1ldGhvZDsKCgl0cnkgewoKCQkvLyBDaGVjayBmb3IgcHJvbWlzZSBhc3BlY3QgZmlyc3QgdG8gcHJpdmlsZWdlIHN5bmNocm9ub3VzIGJlaGF2aW9yCgkJaWYgKCB2YWx1ZSAmJiBpc0Z1bmN0aW9uKCAoIG1ldGhvZCA9IHZhbHVlLnByb21pc2UgKSApICkgewoJCQltZXRob2QuY2FsbCggdmFsdWUgKS5kb25lKCByZXNvbHZlICkuZmFpbCggcmVqZWN0ICk7CgoJCS8vIE90aGVyIHRoZW5hYmxlcwoJCX0gZWxzZSBpZiAoIHZhbHVlICYmIGlzRnVuY3Rpb24oICggbWV0aG9kID0gdmFsdWUudGhlbiApICkgKSB7CgkJCW1ldGhvZC5jYWxsKCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0ICk7CgoJCS8vIE90aGVyIG5vbi10aGVuYWJsZXMKCQl9IGVsc2UgewoKCQkJLy8gQ29udHJvbCBgcmVzb2x2ZWAgYXJndW1lbnRzIGJ5IGxldHRpbmcgQXJyYXkjc2xpY2UgY2FzdCBib29sZWFuIGBub1ZhbHVlYCB0byBpbnRlZ2VyOgoJCQkvLyAqIGZhbHNlOiBbIHZhbHVlIF0uc2xpY2UoIDAgKSA9PiByZXNvbHZlKCB2YWx1ZSApCgkJCS8vICogdHJ1ZTogWyB2YWx1ZSBdLnNsaWNlKCAxICkgPT4gcmVzb2x2ZSgpCgkJCXJlc29sdmUuYXBwbHkoIHVuZGVmaW5lZCwgWyB2YWx1ZSBdLnNsaWNlKCBub1ZhbHVlICkgKTsKCQl9CgoJLy8gRm9yIFByb21pc2VzL0ErLCBjb252ZXJ0IGV4Y2VwdGlvbnMgaW50byByZWplY3Rpb25zCgkvLyBTaW5jZSBqUXVlcnkud2hlbiBkb2Vzbid0IHVud3JhcCB0aGVuYWJsZXMsIHdlIGNhbiBza2lwIHRoZSBleHRyYSBjaGVja3MgYXBwZWFyaW5nIGluCgkvLyBEZWZlcnJlZCN0aGVuIHRvIGNvbmRpdGlvbmFsbHkgc3VwcHJlc3MgcmVqZWN0aW9uLgoJfSBjYXRjaCAoIHZhbHVlICkgewoKCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCBvbmx5CgkJLy8gU3RyaWN0IG1vZGUgZnVuY3Rpb25zIGludm9rZWQgd2l0aG91dCAuY2FsbC8uYXBwbHkgZ2V0IGdsb2JhbC1vYmplY3QgY29udGV4dAoJCXJlamVjdC5hcHBseSggdW5kZWZpbmVkLCBbIHZhbHVlIF0gKTsKCX0KfQoKalF1ZXJ5LmV4dGVuZCggewoKCURlZmVycmVkOiBmdW5jdGlvbiggZnVuYyApIHsKCQl2YXIgdHVwbGVzID0gWwoKCQkJCS8vIGFjdGlvbiwgYWRkIGxpc3RlbmVyLCBjYWxsYmFja3MsCgkJCQkvLyAuLi4gLnRoZW4gaGFuZGxlcnMsIGFyZ3VtZW50IGluZGV4LCBbZmluYWwgc3RhdGVdCgkJCQlbICJub3RpZnkiLCAicHJvZ3Jlc3MiLCBqUXVlcnkuQ2FsbGJhY2tzKCAibWVtb3J5IiApLAoJCQkJCWpRdWVyeS5DYWxsYmFja3MoICJtZW1vcnkiICksIDIgXSwKCQkJCVsgInJlc29sdmUiLCAiZG9uZSIsIGpRdWVyeS5DYWxsYmFja3MoICJvbmNlIG1lbW9yeSIgKSwKCQkJCQlqUXVlcnkuQ2FsbGJhY2tzKCAib25jZSBtZW1vcnkiICksIDAsICJyZXNvbHZlZCIgXSwKCQkJCVsgInJlamVjdCIsICJmYWlsIiwgalF1ZXJ5LkNhbGxiYWNrcyggIm9uY2UgbWVtb3J5IiApLAoJCQkJCWpRdWVyeS5DYWxsYmFja3MoICJvbmNlIG1lbW9yeSIgKSwgMSwgInJlamVjdGVkIiBdCgkJCV0sCgkJCXN0YXRlID0gInBlbmRpbmciLAoJCQlwcm9taXNlID0gewoJCQkJc3RhdGU6IGZ1bmN0aW9uKCkgewoJCQkJCXJldHVybiBzdGF0ZTsKCQkJCX0sCgkJCQlhbHdheXM6IGZ1bmN0aW9uKCkgewoJCQkJCWRlZmVycmVkLmRvbmUoIGFyZ3VtZW50cyApLmZhaWwoIGFyZ3VtZW50cyApOwoJCQkJCXJldHVybiB0aGlzOwoJCQkJfSwKCQkJCSJjYXRjaCI6IGZ1bmN0aW9uKCBmbiApIHsKCQkJCQlyZXR1cm4gcHJvbWlzZS50aGVuKCBudWxsLCBmbiApOwoJCQkJfSwKCgkJCQkvLyBLZWVwIHBpcGUgZm9yIGJhY2stY29tcGF0CgkJCQlwaXBlOiBmdW5jdGlvbiggLyogZm5Eb25lLCBmbkZhaWwsIGZuUHJvZ3Jlc3MgKi8gKSB7CgkJCQkJdmFyIGZucyA9IGFyZ3VtZW50czsKCgkJCQkJcmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkgewoJCQkJCQlqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7CgoJCQkJCQkJLy8gTWFwIHR1cGxlcyAocHJvZ3Jlc3MsIGRvbmUsIGZhaWwpIHRvIGFyZ3VtZW50cyAoZG9uZSwgZmFpbCwgcHJvZ3Jlc3MpCgkJCQkJCQl2YXIgZm4gPSBpc0Z1bmN0aW9uKCBmbnNbIHR1cGxlWyA0IF0gXSApICYmIGZuc1sgdHVwbGVbIDQgXSBdOwoKCQkJCQkJCS8vIGRlZmVycmVkLnByb2dyZXNzKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLm5vdGlmeSB9KQoJCQkJCQkJLy8gZGVmZXJyZWQuZG9uZShmdW5jdGlvbigpIHsgYmluZCB0byBuZXdEZWZlciBvciBuZXdEZWZlci5yZXNvbHZlIH0pCgkJCQkJCQkvLyBkZWZlcnJlZC5mYWlsKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLnJlamVjdCB9KQoJCQkJCQkJZGVmZXJyZWRbIHR1cGxlWyAxIF0gXSggZnVuY3Rpb24oKSB7CgkJCQkJCQkJdmFyIHJldHVybmVkID0gZm4gJiYgZm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCQkJCQkJCWlmICggcmV0dXJuZWQgJiYgaXNGdW5jdGlvbiggcmV0dXJuZWQucHJvbWlzZSApICkgewoJCQkJCQkJCQlyZXR1cm5lZC5wcm9taXNlKCkKCQkJCQkJCQkJCS5wcm9ncmVzcyggbmV3RGVmZXIubm90aWZ5ICkKCQkJCQkJCQkJCS5kb25lKCBuZXdEZWZlci5yZXNvbHZlICkKCQkJCQkJCQkJCS5mYWlsKCBuZXdEZWZlci5yZWplY3QgKTsKCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQluZXdEZWZlclsgdHVwbGVbIDAgXSArICJXaXRoIiBdKAoJCQkJCQkJCQkJdGhpcywKCQkJCQkJCQkJCWZuID8gWyByZXR1cm5lZCBdIDogYXJndW1lbnRzCgkJCQkJCQkJCSk7CgkJCQkJCQkJfQoJCQkJCQkJfSApOwoJCQkJCQl9ICk7CgkJCQkJCWZucyA9IG51bGw7CgkJCQkJfSApLnByb21pc2UoKTsKCQkJCX0sCgkJCQl0aGVuOiBmdW5jdGlvbiggb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIG9uUHJvZ3Jlc3MgKSB7CgkJCQkJdmFyIG1heERlcHRoID0gMDsKCQkJCQlmdW5jdGlvbiByZXNvbHZlKCBkZXB0aCwgZGVmZXJyZWQsIGhhbmRsZXIsIHNwZWNpYWwgKSB7CgkJCQkJCXJldHVybiBmdW5jdGlvbigpIHsKCQkJCQkJCXZhciB0aGF0ID0gdGhpcywKCQkJCQkJCQlhcmdzID0gYXJndW1lbnRzLAoJCQkJCQkJCW1pZ2h0VGhyb3cgPSBmdW5jdGlvbigpIHsKCQkJCQkJCQkJdmFyIHJldHVybmVkLCB0aGVuOwoKCQkJCQkJCQkJLy8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuMy4zLjMKCQkJCQkJCQkJLy8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTkKCQkJCQkJCQkJLy8gSWdub3JlIGRvdWJsZS1yZXNvbHV0aW9uIGF0dGVtcHRzCgkJCQkJCQkJCWlmICggZGVwdGggPCBtYXhEZXB0aCApIHsKCQkJCQkJCQkJCXJldHVybjsKCQkJCQkJCQkJfQoKCQkJCQkJCQkJcmV0dXJuZWQgPSBoYW5kbGVyLmFwcGx5KCB0aGF0LCBhcmdzICk7CgoJCQkJCQkJCQkvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4xCgkJCQkJCQkJCS8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTQ4CgkJCQkJCQkJCWlmICggcmV0dXJuZWQgPT09IGRlZmVycmVkLnByb21pc2UoKSApIHsKCQkJCQkJCQkJCXRocm93IG5ldyBUeXBlRXJyb3IoICJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb24iICk7CgkJCQkJCQkJCX0KCgkJCQkJCQkJCS8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb25zIDIuMy4zLjEsIDMuNQoJCQkJCQkJCQkvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01NAoJCQkJCQkJCQkvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC03NQoJCQkJCQkJCQkvLyBSZXRyaWV2ZSBgdGhlbmAgb25seSBvbmNlCgkJCQkJCQkJCXRoZW4gPSByZXR1cm5lZCAmJgoKCQkJCQkJCQkJCS8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjQKCQkJCQkJCQkJCS8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTY0CgkJCQkJCQkJCQkvLyBPbmx5IGNoZWNrIG9iamVjdHMgYW5kIGZ1bmN0aW9ucyBmb3IgdGhlbmFiaWxpdHkKCQkJCQkJCQkJCSggdHlwZW9mIHJldHVybmVkID09PSAib2JqZWN0IiB8fAoJCQkJCQkJCQkJCXR5cGVvZiByZXR1cm5lZCA9PT0gImZ1bmN0aW9uIiApICYmCgkJCQkJCQkJCQlyZXR1cm5lZC50aGVuOwoKCQkJCQkJCQkJLy8gSGFuZGxlIGEgcmV0dXJuZWQgdGhlbmFibGUKCQkJCQkJCQkJaWYgKCBpc0Z1bmN0aW9uKCB0aGVuICkgKSB7CgoJCQkJCQkJCQkJLy8gU3BlY2lhbCBwcm9jZXNzb3JzIChub3RpZnkpIGp1c3Qgd2FpdCBmb3IgcmVzb2x1dGlvbgoJCQkJCQkJCQkJaWYgKCBzcGVjaWFsICkgewoJCQkJCQkJCQkJCXRoZW4uY2FsbCgKCQkJCQkJCQkJCQkJcmV0dXJuZWQsCgkJCQkJCQkJCQkJCXJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksIHNwZWNpYWwgKSwKCQkJCQkJCQkJCQkJcmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsICkKCQkJCQkJCQkJCQkpOwoKCQkJCQkJCQkJCS8vIE5vcm1hbCBwcm9jZXNzb3JzIChyZXNvbHZlKSBhbHNvIGhvb2sgaW50byBwcm9ncmVzcwoJCQkJCQkJCQkJfSBlbHNlIHsKCgkJCQkJCQkJCQkJLy8gLi4uYW5kIGRpc3JlZ2FyZCBvbGRlciByZXNvbHV0aW9uIHZhbHVlcwoJCQkJCQkJCQkJCW1heERlcHRoKys7CgoJCQkJCQkJCQkJCXRoZW4uY2FsbCgKCQkJCQkJCQkJCQkJcmV0dXJuZWQsCgkJCQkJCQkJCQkJCXJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksIHNwZWNpYWwgKSwKCQkJCQkJCQkJCQkJcmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsICksCgkJCQkJCQkJCQkJCXJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksCgkJCQkJCQkJCQkJCQlkZWZlcnJlZC5ub3RpZnlXaXRoICkKCQkJCQkJCQkJCQkpOwoJCQkJCQkJCQkJfQoKCQkJCQkJCQkJLy8gSGFuZGxlIGFsbCBvdGhlciByZXR1cm5lZCB2YWx1ZXMKCQkJCQkJCQkJfSBlbHNlIHsKCgkJCQkJCQkJCQkvLyBPbmx5IHN1YnN0aXR1dGUgaGFuZGxlcnMgcGFzcyBvbiBjb250ZXh0CgkJCQkJCQkJCQkvLyBhbmQgbXVsdGlwbGUgdmFsdWVzIChub24tc3BlYyBiZWhhdmlvcikKCQkJCQkJCQkJCWlmICggaGFuZGxlciAhPT0gSWRlbnRpdHkgKSB7CgkJCQkJCQkJCQkJdGhhdCA9IHVuZGVmaW5lZDsKCQkJCQkJCQkJCQlhcmdzID0gWyByZXR1cm5lZCBdOwoJCQkJCQkJCQkJfQoKCQkJCQkJCQkJCS8vIFByb2Nlc3MgdGhlIHZhbHVlKHMpCgkJCQkJCQkJCQkvLyBEZWZhdWx0IHByb2Nlc3MgaXMgcmVzb2x2ZQoJCQkJCQkJCQkJKCBzcGVjaWFsIHx8IGRlZmVycmVkLnJlc29sdmVXaXRoICkoIHRoYXQsIGFyZ3MgKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0sCgoJCQkJCQkJCS8vIE9ubHkgbm9ybWFsIHByb2Nlc3NvcnMgKHJlc29sdmUpIGNhdGNoIGFuZCByZWplY3QgZXhjZXB0aW9ucwoJCQkJCQkJCXByb2Nlc3MgPSBzcGVjaWFsID8KCQkJCQkJCQkJbWlnaHRUaHJvdyA6CgkJCQkJCQkJCWZ1bmN0aW9uKCkgewoJCQkJCQkJCQkJdHJ5IHsKCQkJCQkJCQkJCQltaWdodFRocm93KCk7CgkJCQkJCQkJCQl9IGNhdGNoICggZSApIHsKCgkJCQkJCQkJCQkJaWYgKCBqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayApIHsKCQkJCQkJCQkJCQkJalF1ZXJ5LkRlZmVycmVkLmV4Y2VwdGlvbkhvb2soIGUsCgkJCQkJCQkJCQkJCQlwcm9jZXNzLnN0YWNrVHJhY2UgKTsKCQkJCQkJCQkJCQl9CgoJCQkJCQkJCQkJCS8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjMuMy40LjEKCQkJCQkJCQkJCQkvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC02MQoJCQkJCQkJCQkJCS8vIElnbm9yZSBwb3N0LXJlc29sdXRpb24gZXhjZXB0aW9ucwoJCQkJCQkJCQkJCWlmICggZGVwdGggKyAxID49IG1heERlcHRoICkgewoKCQkJCQkJCQkJCQkJLy8gT25seSBzdWJzdGl0dXRlIGhhbmRsZXJzIHBhc3Mgb24gY29udGV4dAoJCQkJCQkJCQkJCQkvLyBhbmQgbXVsdGlwbGUgdmFsdWVzIChub24tc3BlYyBiZWhhdmlvcikKCQkJCQkJCQkJCQkJaWYgKCBoYW5kbGVyICE9PSBUaHJvd2VyICkgewoJCQkJCQkJCQkJCQkJdGhhdCA9IHVuZGVmaW5lZDsKCQkJCQkJCQkJCQkJCWFyZ3MgPSBbIGUgXTsKCQkJCQkJCQkJCQkJfQoKCQkJCQkJCQkJCQkJZGVmZXJyZWQucmVqZWN0V2l0aCggdGhhdCwgYXJncyApOwoJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCX0KCQkJCQkJCQkJfTsKCgkJCQkJCQkvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuMQoJCQkJCQkJLy8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTcKCQkJCQkJCS8vIFJlLXJlc29sdmUgcHJvbWlzZXMgaW1tZWRpYXRlbHkgdG8gZG9kZ2UgZmFsc2UgcmVqZWN0aW9uIGZyb20KCQkJCQkJCS8vIHN1YnNlcXVlbnQgZXJyb3JzCgkJCQkJCQlpZiAoIGRlcHRoICkgewoJCQkJCQkJCXByb2Nlc3MoKTsKCQkJCQkJCX0gZWxzZSB7CgoJCQkJCQkJCS8vIENhbGwgYW4gb3B0aW9uYWwgaG9vayB0byByZWNvcmQgdGhlIHN0YWNrLCBpbiBjYXNlIG9mIGV4Y2VwdGlvbgoJCQkJCQkJCS8vIHNpbmNlIGl0J3Mgb3RoZXJ3aXNlIGxvc3Qgd2hlbiBleGVjdXRpb24gZ29lcyBhc3luYwoJCQkJCQkJCWlmICggalF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vayApIHsKCQkJCQkJCQkJcHJvY2Vzcy5zdGFja1RyYWNlID0galF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vaygpOwoJCQkJCQkJCX0KCQkJCQkJCQl3aW5kb3cuc2V0VGltZW91dCggcHJvY2VzcyApOwoJCQkJCQkJfQoJCQkJCQl9OwoJCQkJCX0KCgkJCQkJcmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkgewoKCQkJCQkJLy8gcHJvZ3Jlc3NfaGFuZGxlcnMuYWRkKCAuLi4gKQoJCQkJCQl0dXBsZXNbIDAgXVsgMyBdLmFkZCgKCQkJCQkJCXJlc29sdmUoCgkJCQkJCQkJMCwKCQkJCQkJCQluZXdEZWZlciwKCQkJCQkJCQlpc0Z1bmN0aW9uKCBvblByb2dyZXNzICkgPwoJCQkJCQkJCQlvblByb2dyZXNzIDoKCQkJCQkJCQkJSWRlbnRpdHksCgkJCQkJCQkJbmV3RGVmZXIubm90aWZ5V2l0aAoJCQkJCQkJKQoJCQkJCQkpOwoKCQkJCQkJLy8gZnVsZmlsbGVkX2hhbmRsZXJzLmFkZCggLi4uICkKCQkJCQkJdHVwbGVzWyAxIF1bIDMgXS5hZGQoCgkJCQkJCQlyZXNvbHZlKAoJCQkJCQkJCTAsCgkJCQkJCQkJbmV3RGVmZXIsCgkJCQkJCQkJaXNGdW5jdGlvbiggb25GdWxmaWxsZWQgKSA/CgkJCQkJCQkJCW9uRnVsZmlsbGVkIDoKCQkJCQkJCQkJSWRlbnRpdHkKCQkJCQkJCSkKCQkJCQkJKTsKCgkJCQkJCS8vIHJlamVjdGVkX2hhbmRsZXJzLmFkZCggLi4uICkKCQkJCQkJdHVwbGVzWyAyIF1bIDMgXS5hZGQoCgkJCQkJCQlyZXNvbHZlKAoJCQkJCQkJCTAsCgkJCQkJCQkJbmV3RGVmZXIsCgkJCQkJCQkJaXNGdW5jdGlvbiggb25SZWplY3RlZCApID8KCQkJCQkJCQkJb25SZWplY3RlZCA6CgkJCQkJCQkJCVRocm93ZXIKCQkJCQkJCSkKCQkJCQkJKTsKCQkJCQl9ICkucHJvbWlzZSgpOwoJCQkJfSwKCgkJCQkvLyBHZXQgYSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkCgkJCQkvLyBJZiBvYmogaXMgcHJvdmlkZWQsIHRoZSBwcm9taXNlIGFzcGVjdCBpcyBhZGRlZCB0byB0aGUgb2JqZWN0CgkJCQlwcm9taXNlOiBmdW5jdGlvbiggb2JqICkgewoJCQkJCXJldHVybiBvYmogIT0gbnVsbCA/IGpRdWVyeS5leHRlbmQoIG9iaiwgcHJvbWlzZSApIDogcHJvbWlzZTsKCQkJCX0KCQkJfSwKCQkJZGVmZXJyZWQgPSB7fTsKCgkJLy8gQWRkIGxpc3Qtc3BlY2lmaWMgbWV0aG9kcwoJCWpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBsZSApIHsKCQkJdmFyIGxpc3QgPSB0dXBsZVsgMiBdLAoJCQkJc3RhdGVTdHJpbmcgPSB0dXBsZVsgNSBdOwoKCQkJLy8gcHJvbWlzZS5wcm9ncmVzcyA9IGxpc3QuYWRkCgkJCS8vIHByb21pc2UuZG9uZSA9IGxpc3QuYWRkCgkJCS8vIHByb21pc2UuZmFpbCA9IGxpc3QuYWRkCgkJCXByb21pc2VbIHR1cGxlWyAxIF0gXSA9IGxpc3QuYWRkOwoKCQkJLy8gSGFuZGxlIHN0YXRlCgkJCWlmICggc3RhdGVTdHJpbmcgKSB7CgkJCQlsaXN0LmFkZCgKCQkJCQlmdW5jdGlvbigpIHsKCgkJCQkJCS8vIHN0YXRlID0gInJlc29sdmVkIiAoaS5lLiwgZnVsZmlsbGVkKQoJCQkJCQkvLyBzdGF0ZSA9ICJyZWplY3RlZCIKCQkJCQkJc3RhdGUgPSBzdGF0ZVN0cmluZzsKCQkJCQl9LAoKCQkJCQkvLyByZWplY3RlZF9jYWxsYmFja3MuZGlzYWJsZQoJCQkJCS8vIGZ1bGZpbGxlZF9jYWxsYmFja3MuZGlzYWJsZQoJCQkJCXR1cGxlc1sgMyAtIGkgXVsgMiBdLmRpc2FibGUsCgoJCQkJCS8vIHJlamVjdGVkX2hhbmRsZXJzLmRpc2FibGUKCQkJCQkvLyBmdWxmaWxsZWRfaGFuZGxlcnMuZGlzYWJsZQoJCQkJCXR1cGxlc1sgMyAtIGkgXVsgMyBdLmRpc2FibGUsCgoJCQkJCS8vIHByb2dyZXNzX2NhbGxiYWNrcy5sb2NrCgkJCQkJdHVwbGVzWyAwIF1bIDIgXS5sb2NrLAoKCQkJCQkvLyBwcm9ncmVzc19oYW5kbGVycy5sb2NrCgkJCQkJdHVwbGVzWyAwIF1bIDMgXS5sb2NrCgkJCQkpOwoJCQl9CgoJCQkvLyBwcm9ncmVzc19oYW5kbGVycy5maXJlCgkJCS8vIGZ1bGZpbGxlZF9oYW5kbGVycy5maXJlCgkJCS8vIHJlamVjdGVkX2hhbmRsZXJzLmZpcmUKCQkJbGlzdC5hZGQoIHR1cGxlWyAzIF0uZmlyZSApOwoKCQkJLy8gZGVmZXJyZWQubm90aWZ5ID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLm5vdGlmeVdpdGgoLi4uKSB9CgkJCS8vIGRlZmVycmVkLnJlc29sdmUgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVzb2x2ZVdpdGgoLi4uKSB9CgkJCS8vIGRlZmVycmVkLnJlamVjdCA9IGZ1bmN0aW9uKCkgeyBkZWZlcnJlZC5yZWplY3RXaXRoKC4uLikgfQoJCQlkZWZlcnJlZFsgdHVwbGVbIDAgXSBdID0gZnVuY3Rpb24oKSB7CgkJCQlkZWZlcnJlZFsgdHVwbGVbIDAgXSArICJXaXRoIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IHVuZGVmaW5lZCA6IHRoaXMsIGFyZ3VtZW50cyApOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX07CgoJCQkvLyBkZWZlcnJlZC5ub3RpZnlXaXRoID0gbGlzdC5maXJlV2l0aAoJCQkvLyBkZWZlcnJlZC5yZXNvbHZlV2l0aCA9IGxpc3QuZmlyZVdpdGgKCQkJLy8gZGVmZXJyZWQucmVqZWN0V2l0aCA9IGxpc3QuZmlyZVdpdGgKCQkJZGVmZXJyZWRbIHR1cGxlWyAwIF0gKyAiV2l0aCIgXSA9IGxpc3QuZmlyZVdpdGg7CgkJfSApOwoKCQkvLyBNYWtlIHRoZSBkZWZlcnJlZCBhIHByb21pc2UKCQlwcm9taXNlLnByb21pc2UoIGRlZmVycmVkICk7CgoJCS8vIENhbGwgZ2l2ZW4gZnVuYyBpZiBhbnkKCQlpZiAoIGZ1bmMgKSB7CgkJCWZ1bmMuY2FsbCggZGVmZXJyZWQsIGRlZmVycmVkICk7CgkJfQoKCQkvLyBBbGwgZG9uZSEKCQlyZXR1cm4gZGVmZXJyZWQ7Cgl9LAoKCS8vIERlZmVycmVkIGhlbHBlcgoJd2hlbjogZnVuY3Rpb24oIHNpbmdsZVZhbHVlICkgewoJCXZhcgoKCQkJLy8gY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3JkaW5hdGVzCgkJCXJlbWFpbmluZyA9IGFyZ3VtZW50cy5sZW5ndGgsCgoJCQkvLyBjb3VudCBvZiB1bnByb2Nlc3NlZCBhcmd1bWVudHMKCQkJaSA9IHJlbWFpbmluZywKCgkJCS8vIHN1Ym9yZGluYXRlIGZ1bGZpbGxtZW50IGRhdGEKCQkJcmVzb2x2ZUNvbnRleHRzID0gQXJyYXkoIGkgKSwKCQkJcmVzb2x2ZVZhbHVlcyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApLAoKCQkJLy8gdGhlIG1hc3RlciBEZWZlcnJlZAoJCQltYXN0ZXIgPSBqUXVlcnkuRGVmZXJyZWQoKSwKCgkJCS8vIHN1Ym9yZGluYXRlIGNhbGxiYWNrIGZhY3RvcnkKCQkJdXBkYXRlRnVuYyA9IGZ1bmN0aW9uKCBpICkgewoJCQkJcmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJCQlyZXNvbHZlQ29udGV4dHNbIGkgXSA9IHRoaXM7CgkJCQkJcmVzb2x2ZVZhbHVlc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlOwoJCQkJCWlmICggISggLS1yZW1haW5pbmcgKSApIHsKCQkJCQkJbWFzdGVyLnJlc29sdmVXaXRoKCByZXNvbHZlQ29udGV4dHMsIHJlc29sdmVWYWx1ZXMgKTsKCQkJCQl9CgkJCQl9OwoJCQl9OwoKCQkvLyBTaW5nbGUtIGFuZCBlbXB0eSBhcmd1bWVudHMgYXJlIGFkb3B0ZWQgbGlrZSBQcm9taXNlLnJlc29sdmUKCQlpZiAoIHJlbWFpbmluZyA8PSAxICkgewoJCQlhZG9wdFZhbHVlKCBzaW5nbGVWYWx1ZSwgbWFzdGVyLmRvbmUoIHVwZGF0ZUZ1bmMoIGkgKSApLnJlc29sdmUsIG1hc3Rlci5yZWplY3QsCgkJCQkhcmVtYWluaW5nICk7CgoJCQkvLyBVc2UgLnRoZW4oKSB0byB1bndyYXAgc2Vjb25kYXJ5IHRoZW5hYmxlcyAoY2YuIGdoLTMwMDApCgkJCWlmICggbWFzdGVyLnN0YXRlKCkgPT09ICJwZW5kaW5nIiB8fAoJCQkJaXNGdW5jdGlvbiggcmVzb2x2ZVZhbHVlc1sgaSBdICYmIHJlc29sdmVWYWx1ZXNbIGkgXS50aGVuICkgKSB7CgoJCQkJcmV0dXJuIG1hc3Rlci50aGVuKCk7CgkJCX0KCQl9CgoJCS8vIE11bHRpcGxlIGFyZ3VtZW50cyBhcmUgYWdncmVnYXRlZCBsaWtlIFByb21pc2UuYWxsIGFycmF5IGVsZW1lbnRzCgkJd2hpbGUgKCBpLS0gKSB7CgkJCWFkb3B0VmFsdWUoIHJlc29sdmVWYWx1ZXNbIGkgXSwgdXBkYXRlRnVuYyggaSApLCBtYXN0ZXIucmVqZWN0ICk7CgkJfQoKCQlyZXR1cm4gbWFzdGVyLnByb21pc2UoKTsKCX0KfSApOwoKCi8vIFRoZXNlIHVzdWFsbHkgaW5kaWNhdGUgYSBwcm9ncmFtbWVyIG1pc3Rha2UgZHVyaW5nIGRldmVsb3BtZW50LAovLyB3YXJuIGFib3V0IHRoZW0gQVNBUCByYXRoZXIgdGhhbiBzd2FsbG93aW5nIHRoZW0gYnkgZGVmYXVsdC4KdmFyIHJlcnJvck5hbWVzID0gL14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87CgpqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayA9IGZ1bmN0aW9uKCBlcnJvciwgc3RhY2sgKSB7CgoJLy8gU3VwcG9ydDogSUUgOCAtIDkgb25seQoJLy8gQ29uc29sZSBleGlzdHMgd2hlbiBkZXYgdG9vbHMgYXJlIG9wZW4sIHdoaWNoIGNhbiBoYXBwZW4gYXQgYW55IHRpbWUKCWlmICggd2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUud2FybiAmJiBlcnJvciAmJiByZXJyb3JOYW1lcy50ZXN0KCBlcnJvci5uYW1lICkgKSB7CgkJd2luZG93LmNvbnNvbGUud2FybiggImpRdWVyeS5EZWZlcnJlZCBleGNlcHRpb246ICIgKyBlcnJvci5tZXNzYWdlLCBlcnJvci5zdGFjaywgc3RhY2sgKTsKCX0KfTsKCgoKCmpRdWVyeS5yZWFkeUV4Y2VwdGlvbiA9IGZ1bmN0aW9uKCBlcnJvciApIHsKCXdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsKCQl0aHJvdyBlcnJvcjsKCX0gKTsKfTsKCgoKCi8vIFRoZSBkZWZlcnJlZCB1c2VkIG9uIERPTSByZWFkeQp2YXIgcmVhZHlMaXN0ID0galF1ZXJ5LkRlZmVycmVkKCk7CgpqUXVlcnkuZm4ucmVhZHkgPSBmdW5jdGlvbiggZm4gKSB7CgoJcmVhZHlMaXN0CgkJLnRoZW4oIGZuICkKCgkJLy8gV3JhcCBqUXVlcnkucmVhZHlFeGNlcHRpb24gaW4gYSBmdW5jdGlvbiBzbyB0aGF0IHRoZSBsb29rdXAKCQkvLyBoYXBwZW5zIGF0IHRoZSB0aW1lIG9mIGVycm9yIGhhbmRsaW5nIGluc3RlYWQgb2YgY2FsbGJhY2sKCQkvLyByZWdpc3RyYXRpb24uCgkJLmNhdGNoKCBmdW5jdGlvbiggZXJyb3IgKSB7CgkJCWpRdWVyeS5yZWFkeUV4Y2VwdGlvbiggZXJyb3IgKTsKCQl9ICk7CgoJcmV0dXJuIHRoaXM7Cn07CgpqUXVlcnkuZXh0ZW5kKCB7CgoJLy8gSXMgdGhlIERPTSByZWFkeSB0byBiZSB1c2VkPyBTZXQgdG8gdHJ1ZSBvbmNlIGl0IG9jY3Vycy4KCWlzUmVhZHk6IGZhbHNlLAoKCS8vIEEgY291bnRlciB0byB0cmFjayBob3cgbWFueSBpdGVtcyB0byB3YWl0IGZvciBiZWZvcmUKCS8vIHRoZSByZWFkeSBldmVudCBmaXJlcy4gU2VlICM2NzgxCglyZWFkeVdhaXQ6IDEsCgoJLy8gSGFuZGxlIHdoZW4gdGhlIERPTSBpcyByZWFkeQoJcmVhZHk6IGZ1bmN0aW9uKCB3YWl0ICkgewoKCQkvLyBBYm9ydCBpZiB0aGVyZSBhcmUgcGVuZGluZyBob2xkcyBvciB3ZSdyZSBhbHJlYWR5IHJlYWR5CgkJaWYgKCB3YWl0ID09PSB0cnVlID8gLS1qUXVlcnkucmVhZHlXYWl0IDogalF1ZXJ5LmlzUmVhZHkgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeQoJCWpRdWVyeS5pc1JlYWR5ID0gdHJ1ZTsKCgkJLy8gSWYgYSBub3JtYWwgRE9NIFJlYWR5IGV2ZW50IGZpcmVkLCBkZWNyZW1lbnQsIGFuZCB3YWl0IGlmIG5lZWQgYmUKCQlpZiAoIHdhaXQgIT09IHRydWUgJiYgLS1qUXVlcnkucmVhZHlXYWl0ID4gMCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZQoJCXJlYWR5TGlzdC5yZXNvbHZlV2l0aCggZG9jdW1lbnQsIFsgalF1ZXJ5IF0gKTsKCX0KfSApOwoKalF1ZXJ5LnJlYWR5LnRoZW4gPSByZWFkeUxpc3QudGhlbjsKCi8vIFRoZSByZWFkeSBldmVudCBoYW5kbGVyIGFuZCBzZWxmIGNsZWFudXAgbWV0aG9kCmZ1bmN0aW9uIGNvbXBsZXRlZCgpIHsKCWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgY29tcGxldGVkICk7Cgl3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggImxvYWQiLCBjb21wbGV0ZWQgKTsKCWpRdWVyeS5yZWFkeSgpOwp9CgovLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZAovLyBhZnRlciB0aGUgYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC4KLy8gU3VwcG9ydDogSUUgPD05IC0gMTAgb25seQovLyBPbGRlciBJRSBzb21ldGltZXMgc2lnbmFscyAiaW50ZXJhY3RpdmUiIHRvbyBzb29uCmlmICggZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiB8fAoJKCBkb2N1bWVudC5yZWFkeVN0YXRlICE9PSAibG9hZGluZyIgJiYgIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCApICkgewoKCS8vIEhhbmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeQoJd2luZG93LnNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApOwoKfSBlbHNlIHsKCgkvLyBVc2UgdGhlIGhhbmR5IGV2ZW50IGNhbGxiYWNrCglkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIGNvbXBsZXRlZCApOwoKCS8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrCgl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggImxvYWQiLCBjb21wbGV0ZWQgKTsKfQoKCgoKLy8gTXVsdGlmdW5jdGlvbmFsIG1ldGhvZCB0byBnZXQgYW5kIHNldCB2YWx1ZXMgb2YgYSBjb2xsZWN0aW9uCi8vIFRoZSB2YWx1ZS9zIGNhbiBvcHRpb25hbGx5IGJlIGV4ZWN1dGVkIGlmIGl0J3MgYSBmdW5jdGlvbgp2YXIgYWNjZXNzID0gZnVuY3Rpb24oIGVsZW1zLCBmbiwga2V5LCB2YWx1ZSwgY2hhaW5hYmxlLCBlbXB0eUdldCwgcmF3ICkgewoJdmFyIGkgPSAwLAoJCWxlbiA9IGVsZW1zLmxlbmd0aCwKCQlidWxrID0ga2V5ID09IG51bGw7CgoJLy8gU2V0cyBtYW55IHZhbHVlcwoJaWYgKCB0b1R5cGUoIGtleSApID09PSAib2JqZWN0IiApIHsKCQljaGFpbmFibGUgPSB0cnVlOwoJCWZvciAoIGkgaW4ga2V5ICkgewoJCQlhY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5WyBpIF0sIHRydWUsIGVtcHR5R2V0LCByYXcgKTsKCQl9CgoJLy8gU2V0cyBvbmUgdmFsdWUKCX0gZWxzZSBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJY2hhaW5hYmxlID0gdHJ1ZTsKCgkJaWYgKCAhaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKCQkJcmF3ID0gdHJ1ZTsKCQl9CgoJCWlmICggYnVsayApIHsKCgkJCS8vIEJ1bGsgb3BlcmF0aW9ucyBydW4gYWdhaW5zdCB0aGUgZW50aXJlIHNldAoJCQlpZiAoIHJhdyApIHsKCQkJCWZuLmNhbGwoIGVsZW1zLCB2YWx1ZSApOwoJCQkJZm4gPSBudWxsOwoKCQkJLy8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVlcwoJCQl9IGVsc2UgewoJCQkJYnVsayA9IGZuOwoJCQkJZm4gPSBmdW5jdGlvbiggZWxlbSwga2V5LCB2YWx1ZSApIHsKCQkJCQlyZXR1cm4gYnVsay5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdmFsdWUgKTsKCQkJCX07CgkJCX0KCQl9CgoJCWlmICggZm4gKSB7CgkJCWZvciAoIDsgaSA8IGxlbjsgaSsrICkgewoJCQkJZm4oCgkJCQkJZWxlbXNbIGkgXSwga2V5LCByYXcgPwoJCQkJCXZhbHVlIDoKCQkJCQl2YWx1ZS5jYWxsKCBlbGVtc1sgaSBdLCBpLCBmbiggZWxlbXNbIGkgXSwga2V5ICkgKQoJCQkJKTsKCQkJfQoJCX0KCX0KCglpZiAoIGNoYWluYWJsZSApIHsKCQlyZXR1cm4gZWxlbXM7Cgl9CgoJLy8gR2V0cwoJaWYgKCBidWxrICkgewoJCXJldHVybiBmbi5jYWxsKCBlbGVtcyApOwoJfQoKCXJldHVybiBsZW4gPyBmbiggZWxlbXNbIDAgXSwga2V5ICkgOiBlbXB0eUdldDsKfTsKCgovLyBNYXRjaGVzIGRhc2hlZCBzdHJpbmcgZm9yIGNhbWVsaXppbmcKdmFyIHJtc1ByZWZpeCA9IC9eLW1zLS8sCglyZGFzaEFscGhhID0gLy0oW2Etel0pL2c7CgovLyBVc2VkIGJ5IGNhbWVsQ2FzZSBhcyBjYWxsYmFjayB0byByZXBsYWNlKCkKZnVuY3Rpb24gZmNhbWVsQ2FzZSggYWxsLCBsZXR0ZXIgKSB7CglyZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7Cn0KCi8vIENvbnZlcnQgZGFzaGVkIHRvIGNhbWVsQ2FzZTsgdXNlZCBieSB0aGUgY3NzIGFuZCBkYXRhIG1vZHVsZXMKLy8gU3VwcG9ydDogSUUgPD05IC0gMTEsIEVkZ2UgMTIgLSAxNQovLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVuZG9yIHByZWZpeCAoIzk1NzIpCmZ1bmN0aW9uIGNhbWVsQ2FzZSggc3RyaW5nICkgewoJcmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVmaXgsICJtcy0iICkucmVwbGFjZSggcmRhc2hBbHBoYSwgZmNhbWVsQ2FzZSApOwp9CnZhciBhY2NlcHREYXRhID0gZnVuY3Rpb24oIG93bmVyICkgewoKCS8vIEFjY2VwdHMgb25seToKCS8vICAtIE5vZGUKCS8vICAgIC0gTm9kZS5FTEVNRU5UX05PREUKCS8vICAgIC0gTm9kZS5ET0NVTUVOVF9OT0RFCgkvLyAgLSBPYmplY3QKCS8vICAgIC0gQW55CglyZXR1cm4gb3duZXIubm9kZVR5cGUgPT09IDEgfHwgb3duZXIubm9kZVR5cGUgPT09IDkgfHwgISggK293bmVyLm5vZGVUeXBlICk7Cn07CgoKCgpmdW5jdGlvbiBEYXRhKCkgewoJdGhpcy5leHBhbmRvID0galF1ZXJ5LmV4cGFuZG8gKyBEYXRhLnVpZCsrOwp9CgpEYXRhLnVpZCA9IDE7CgpEYXRhLnByb3RvdHlwZSA9IHsKCgljYWNoZTogZnVuY3Rpb24oIG93bmVyICkgewoKCQkvLyBDaGVjayBpZiB0aGUgb3duZXIgb2JqZWN0IGFscmVhZHkgaGFzIGEgY2FjaGUKCQl2YXIgdmFsdWUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07CgoJCS8vIElmIG5vdCwgY3JlYXRlIG9uZQoJCWlmICggIXZhbHVlICkgewoJCQl2YWx1ZSA9IHt9OwoKCQkJLy8gV2UgY2FuIGFjY2VwdCBkYXRhIGZvciBub24tZWxlbWVudCBub2RlcyBpbiBtb2Rlcm4gYnJvd3NlcnMsCgkJCS8vIGJ1dCB3ZSBzaG91bGQgbm90LCBzZWUgIzgzMzUuCgkJCS8vIEFsd2F5cyByZXR1cm4gYW4gZW1wdHkgb2JqZWN0LgoJCQlpZiAoIGFjY2VwdERhdGEoIG93bmVyICkgKSB7CgoJCQkJLy8gSWYgaXQgaXMgYSBub2RlIHVubGlrZWx5IHRvIGJlIHN0cmluZ2lmeS1lZCBvciBsb29wZWQgb3ZlcgoJCQkJLy8gdXNlIHBsYWluIGFzc2lnbm1lbnQKCQkJCWlmICggb3duZXIubm9kZVR5cGUgKSB7CgkJCQkJb3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdmFsdWU7CgoJCQkJLy8gT3RoZXJ3aXNlIHNlY3VyZSBpdCBpbiBhIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5CgkJCQkvLyBjb25maWd1cmFibGUgbXVzdCBiZSB0cnVlIHRvIGFsbG93IHRoZSBwcm9wZXJ0eSB0byBiZQoJCQkJLy8gZGVsZXRlZCB3aGVuIGRhdGEgaXMgcmVtb3ZlZAoJCQkJfSBlbHNlIHsKCQkJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoIG93bmVyLCB0aGlzLmV4cGFuZG8sIHsKCQkJCQkJdmFsdWU6IHZhbHVlLAoJCQkJCQljb25maWd1cmFibGU6IHRydWUKCQkJCQl9ICk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiB2YWx1ZTsKCX0sCglzZXQ6IGZ1bmN0aW9uKCBvd25lciwgZGF0YSwgdmFsdWUgKSB7CgkJdmFyIHByb3AsCgkJCWNhY2hlID0gdGhpcy5jYWNoZSggb3duZXIgKTsKCgkJLy8gSGFuZGxlOiBbIG93bmVyLCBrZXksIHZhbHVlIF0gYXJncwoJCS8vIEFsd2F5cyB1c2UgY2FtZWxDYXNlIGtleSAoZ2gtMjI1NykKCQlpZiAoIHR5cGVvZiBkYXRhID09PSAic3RyaW5nIiApIHsKCQkJY2FjaGVbIGNhbWVsQ2FzZSggZGF0YSApIF0gPSB2YWx1ZTsKCgkJLy8gSGFuZGxlOiBbIG93bmVyLCB7IHByb3BlcnRpZXMgfSBdIGFyZ3MKCQl9IGVsc2UgewoKCQkJLy8gQ29weSB0aGUgcHJvcGVydGllcyBvbmUtYnktb25lIHRvIHRoZSBjYWNoZSBvYmplY3QKCQkJZm9yICggcHJvcCBpbiBkYXRhICkgewoJCQkJY2FjaGVbIGNhbWVsQ2FzZSggcHJvcCApIF0gPSBkYXRhWyBwcm9wIF07CgkJCX0KCQl9CgkJcmV0dXJuIGNhY2hlOwoJfSwKCWdldDogZnVuY3Rpb24oIG93bmVyLCBrZXkgKSB7CgkJcmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkID8KCQkJdGhpcy5jYWNoZSggb3duZXIgKSA6CgoJCQkvLyBBbHdheXMgdXNlIGNhbWVsQ2FzZSBrZXkgKGdoLTIyNTcpCgkJCW93bmVyWyB0aGlzLmV4cGFuZG8gXSAmJiBvd25lclsgdGhpcy5leHBhbmRvIF1bIGNhbWVsQ2FzZSgga2V5ICkgXTsKCX0sCglhY2Nlc3M6IGZ1bmN0aW9uKCBvd25lciwga2V5LCB2YWx1ZSApIHsKCgkJLy8gSW4gY2FzZXMgd2hlcmUgZWl0aGVyOgoJCS8vCgkJLy8gICAxLiBObyBrZXkgd2FzIHNwZWNpZmllZAoJCS8vICAgMi4gQSBzdHJpbmcga2V5IHdhcyBzcGVjaWZpZWQsIGJ1dCBubyB2YWx1ZSBwcm92aWRlZAoJCS8vCgkJLy8gVGFrZSB0aGUgInJlYWQiIHBhdGggYW5kIGFsbG93IHRoZSBnZXQgbWV0aG9kIHRvIGRldGVybWluZQoJCS8vIHdoaWNoIHZhbHVlIHRvIHJldHVybiwgcmVzcGVjdGl2ZWx5IGVpdGhlcjoKCQkvLwoJCS8vICAgMS4gVGhlIGVudGlyZSBjYWNoZSBvYmplY3QKCQkvLyAgIDIuIFRoZSBkYXRhIHN0b3JlZCBhdCB0aGUga2V5CgkJLy8KCQlpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8CgkJCQkoICgga2V5ICYmIHR5cGVvZiBrZXkgPT09ICJzdHJpbmciICkgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCApICkgewoKCQkJcmV0dXJuIHRoaXMuZ2V0KCBvd25lciwga2V5ICk7CgkJfQoKCQkvLyBXaGVuIHRoZSBrZXkgaXMgbm90IGEgc3RyaW5nLCBvciBib3RoIGEga2V5IGFuZCB2YWx1ZQoJCS8vIGFyZSBzcGVjaWZpZWQsIHNldCBvciBleHRlbmQgKGV4aXN0aW5nIG9iamVjdHMpIHdpdGggZWl0aGVyOgoJCS8vCgkJLy8gICAxLiBBbiBvYmplY3Qgb2YgcHJvcGVydGllcwoJCS8vICAgMi4gQSBrZXkgYW5kIHZhbHVlCgkJLy8KCQl0aGlzLnNldCggb3duZXIsIGtleSwgdmFsdWUgKTsKCgkJLy8gU2luY2UgdGhlICJzZXQiIHBhdGggY2FuIGhhdmUgdHdvIHBvc3NpYmxlIGVudHJ5IHBvaW50cwoJCS8vIHJldHVybiB0aGUgZXhwZWN0ZWQgZGF0YSBiYXNlZCBvbiB3aGljaCBwYXRoIHdhcyB0YWtlblsqXQoJCXJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBrZXk7Cgl9LAoJcmVtb3ZlOiBmdW5jdGlvbiggb3duZXIsIGtleSApIHsKCQl2YXIgaSwKCQkJY2FjaGUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07CgoJCWlmICggY2FjaGUgPT09IHVuZGVmaW5lZCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCBrZXkgIT09IHVuZGVmaW5lZCApIHsKCgkJCS8vIFN1cHBvcnQgYXJyYXkgb3Igc3BhY2Ugc2VwYXJhdGVkIHN0cmluZyBvZiBrZXlzCgkJCWlmICggQXJyYXkuaXNBcnJheSgga2V5ICkgKSB7CgoJCQkJLy8gSWYga2V5IGlzIGFuIGFycmF5IG9mIGtleXMuLi4KCQkJCS8vIFdlIGFsd2F5cyBzZXQgY2FtZWxDYXNlIGtleXMsIHNvIHJlbW92ZSB0aGF0LgoJCQkJa2V5ID0ga2V5Lm1hcCggY2FtZWxDYXNlICk7CgkJCX0gZWxzZSB7CgkJCQlrZXkgPSBjYW1lbENhc2UoIGtleSApOwoKCQkJCS8vIElmIGEga2V5IHdpdGggdGhlIHNwYWNlcyBleGlzdHMsIHVzZSBpdC4KCQkJCS8vIE90aGVyd2lzZSwgY3JlYXRlIGFuIGFycmF5IGJ5IG1hdGNoaW5nIG5vbi13aGl0ZXNwYWNlCgkJCQlrZXkgPSBrZXkgaW4gY2FjaGUgPwoJCQkJCVsga2V5IF0gOgoJCQkJCSgga2V5Lm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW10gKTsKCQkJfQoKCQkJaSA9IGtleS5sZW5ndGg7CgoJCQl3aGlsZSAoIGktLSApIHsKCQkJCWRlbGV0ZSBjYWNoZVsga2V5WyBpIF0gXTsKCQkJfQoJCX0KCgkJLy8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIHRoZXJlJ3Mgbm8gbW9yZSBkYXRhCgkJaWYgKCBrZXkgPT09IHVuZGVmaW5lZCB8fCBqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKSApIHsKCgkJCS8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUKCQkJLy8gV2Via2l0ICYgQmxpbmsgcGVyZm9ybWFuY2Ugc3VmZmVycyB3aGVuIGRlbGV0aW5nIHByb3BlcnRpZXMKCQkJLy8gZnJvbSBET00gbm9kZXMsIHNvIHNldCB0byB1bmRlZmluZWQgaW5zdGVhZAoJCQkvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0zNzg2MDcgKGJ1ZyByZXN0cmljdGVkKQoJCQlpZiAoIG93bmVyLm5vZGVUeXBlICkgewoJCQkJb3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdW5kZWZpbmVkOwoJCQl9IGVsc2UgewoJCQkJZGVsZXRlIG93bmVyWyB0aGlzLmV4cGFuZG8gXTsKCQkJfQoJCX0KCX0sCgloYXNEYXRhOiBmdW5jdGlvbiggb3duZXIgKSB7CgkJdmFyIGNhY2hlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdOwoJCXJldHVybiBjYWNoZSAhPT0gdW5kZWZpbmVkICYmICFqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKTsKCX0KfTsKdmFyIGRhdGFQcml2ID0gbmV3IERhdGEoKTsKCnZhciBkYXRhVXNlciA9IG5ldyBEYXRhKCk7CgoKCi8vCUltcGxlbWVudGF0aW9uIFN1bW1hcnkKLy8KLy8JMS4gRW5mb3JjZSBBUEkgc3VyZmFjZSBhbmQgc2VtYW50aWMgY29tcGF0aWJpbGl0eSB3aXRoIDEuOS54IGJyYW5jaAovLwkyLiBJbXByb3ZlIHRoZSBtb2R1bGUncyBtYWludGFpbmFiaWxpdHkgYnkgcmVkdWNpbmcgdGhlIHN0b3JhZ2UKLy8JCXBhdGhzIHRvIGEgc2luZ2xlIG1lY2hhbmlzbS4KLy8JMy4gVXNlIHRoZSBzYW1lIHNpbmdsZSBtZWNoYW5pc20gdG8gc3VwcG9ydCAicHJpdmF0ZSIgYW5kICJ1c2VyIiBkYXRhLgovLwk0LiBfTmV2ZXJfIGV4cG9zZSAicHJpdmF0ZSIgZGF0YSB0byB1c2VyIGNvZGUgKFRPRE86IERyb3AgX2RhdGEsIF9yZW1vdmVEYXRhKQovLwk1LiBBdm9pZCBleHBvc2luZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9uIHVzZXIgb2JqZWN0cyAoZWcuIGV4cGFuZG8gcHJvcGVydGllcykKLy8JNi4gUHJvdmlkZSBhIGNsZWFyIHBhdGggZm9yIGltcGxlbWVudGF0aW9uIHVwZ3JhZGUgdG8gV2Vha01hcCBpbiAyMDE0Cgp2YXIgcmJyYWNlID0gL14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLywKCXJtdWx0aURhc2ggPSAvW0EtWl0vZzsKCmZ1bmN0aW9uIGdldERhdGEoIGRhdGEgKSB7CglpZiAoIGRhdGEgPT09ICJ0cnVlIiApIHsKCQlyZXR1cm4gdHJ1ZTsKCX0KCglpZiAoIGRhdGEgPT09ICJmYWxzZSIgKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCWlmICggZGF0YSA9PT0gIm51bGwiICkgewoJCXJldHVybiBudWxsOwoJfQoKCS8vIE9ubHkgY29udmVydCB0byBhIG51bWJlciBpZiBpdCBkb2Vzbid0IGNoYW5nZSB0aGUgc3RyaW5nCglpZiAoIGRhdGEgPT09ICtkYXRhICsgIiIgKSB7CgkJcmV0dXJuICtkYXRhOwoJfQoKCWlmICggcmJyYWNlLnRlc3QoIGRhdGEgKSApIHsKCQlyZXR1cm4gSlNPTi5wYXJzZSggZGF0YSApOwoJfQoKCXJldHVybiBkYXRhOwp9CgpmdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkgewoJdmFyIG5hbWU7CgoJLy8gSWYgbm90aGluZyB3YXMgZm91bmQgaW50ZXJuYWxseSwgdHJ5IHRvIGZldGNoIGFueQoJLy8gZGF0YSBmcm9tIHRoZSBIVE1MNSBkYXRhLSogYXR0cmlidXRlCglpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCW5hbWUgPSAiZGF0YS0iICsga2V5LnJlcGxhY2UoIHJtdWx0aURhc2gsICItJCYiICkudG9Mb3dlckNhc2UoKTsKCQlkYXRhID0gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTsKCgkJaWYgKCB0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIgKSB7CgkJCXRyeSB7CgkJCQlkYXRhID0gZ2V0RGF0YSggZGF0YSApOwoJCQl9IGNhdGNoICggZSApIHt9CgoJCQkvLyBNYWtlIHN1cmUgd2Ugc2V0IHRoZSBkYXRhIHNvIGl0IGlzbid0IGNoYW5nZWQgbGF0ZXIKCQkJZGF0YVVzZXIuc2V0KCBlbGVtLCBrZXksIGRhdGEgKTsKCQl9IGVsc2UgewoJCQlkYXRhID0gdW5kZWZpbmVkOwoJCX0KCX0KCXJldHVybiBkYXRhOwp9CgpqUXVlcnkuZXh0ZW5kKCB7CgloYXNEYXRhOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZGF0YVVzZXIuaGFzRGF0YSggZWxlbSApIHx8IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKTsKCX0sCgoJZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7CgkJcmV0dXJuIGRhdGFVc2VyLmFjY2VzcyggZWxlbSwgbmFtZSwgZGF0YSApOwoJfSwKCglyZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKCQlkYXRhVXNlci5yZW1vdmUoIGVsZW0sIG5hbWUgKTsKCX0sCgoJLy8gVE9ETzogTm93IHRoYXQgYWxsIGNhbGxzIHRvIF9kYXRhIGFuZCBfcmVtb3ZlRGF0YSBoYXZlIGJlZW4gcmVwbGFjZWQKCS8vIHdpdGggZGlyZWN0IGNhbGxzIHRvIGRhdGFQcml2IG1ldGhvZHMsIHRoZXNlIGNhbiBiZSBkZXByZWNhdGVkLgoJX2RhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkgewoJCXJldHVybiBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIG5hbWUsIGRhdGEgKTsKCX0sCgoJX3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCWRhdGFQcml2LnJlbW92ZSggZWxlbSwgbmFtZSApOwoJfQp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CglkYXRhOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl2YXIgaSwgbmFtZSwgZGF0YSwKCQkJZWxlbSA9IHRoaXNbIDAgXSwKCQkJYXR0cnMgPSBlbGVtICYmIGVsZW0uYXR0cmlidXRlczsKCgkJLy8gR2V0cyBhbGwgdmFsdWVzCgkJaWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHsKCQkJaWYgKCB0aGlzLmxlbmd0aCApIHsKCQkJCWRhdGEgPSBkYXRhVXNlci5nZXQoIGVsZW0gKTsKCgkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgIWRhdGFQcml2LmdldCggZWxlbSwgImhhc0RhdGFBdHRycyIgKSApIHsKCQkJCQlpID0gYXR0cnMubGVuZ3RoOwoJCQkJCXdoaWxlICggaS0tICkgewoKCQkJCQkJLy8gU3VwcG9ydDogSUUgMTEgb25seQoJCQkJCQkvLyBUaGUgYXR0cnMgZWxlbWVudHMgY2FuIGJlIG51bGwgKCMxNDg5NCkKCQkJCQkJaWYgKCBhdHRyc1sgaSBdICkgewoJCQkJCQkJbmFtZSA9IGF0dHJzWyBpIF0ubmFtZTsKCQkJCQkJCWlmICggbmFtZS5pbmRleE9mKCAiZGF0YS0iICkgPT09IDAgKSB7CgkJCQkJCQkJbmFtZSA9IGNhbWVsQ2FzZSggbmFtZS5zbGljZSggNSApICk7CgkJCQkJCQkJZGF0YUF0dHIoIGVsZW0sIG5hbWUsIGRhdGFbIG5hbWUgXSApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJCWRhdGFQcml2LnNldCggZWxlbSwgImhhc0RhdGFBdHRycyIsIHRydWUgKTsKCQkJCX0KCQkJfQoKCQkJcmV0dXJuIGRhdGE7CgkJfQoKCQkvLyBTZXRzIG11bHRpcGxlIHZhbHVlcwoJCWlmICggdHlwZW9mIGtleSA9PT0gIm9iamVjdCIgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQkJZGF0YVVzZXIuc2V0KCB0aGlzLCBrZXkgKTsKCQkJfSApOwoJCX0KCgkJcmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkgewoJCQl2YXIgZGF0YTsKCgkJCS8vIFRoZSBjYWxsaW5nIGpRdWVyeSBvYmplY3QgKGVsZW1lbnQgbWF0Y2hlcykgaXMgbm90IGVtcHR5CgkJCS8vIChhbmQgdGhlcmVmb3JlIGhhcyBhbiBlbGVtZW50IGFwcGVhcnMgYXQgdGhpc1sgMCBdKSBhbmQgdGhlCgkJCS8vIGB2YWx1ZWAgcGFyYW1ldGVyIHdhcyBub3QgdW5kZWZpbmVkLiBBbiBlbXB0eSBqUXVlcnkgb2JqZWN0CgkJCS8vIHdpbGwgcmVzdWx0IGluIGB1bmRlZmluZWRgIGZvciBlbGVtID0gdGhpc1sgMCBdIHdoaWNoIHdpbGwKCQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFuIGF0dGVtcHQgdG8gcmVhZCBhIGRhdGEgY2FjaGUgaXMgbWFkZS4KCQkJaWYgKCBlbGVtICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSB7CgoJCQkJLy8gQXR0ZW1wdCB0byBnZXQgZGF0YSBmcm9tIHRoZSBjYWNoZQoJCQkJLy8gVGhlIGtleSB3aWxsIGFsd2F5cyBiZSBjYW1lbENhc2VkIGluIERhdGEKCQkJCWRhdGEgPSBkYXRhVXNlci5nZXQoIGVsZW0sIGtleSApOwoJCQkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuIGRhdGE7CgkJCQl9CgoJCQkJLy8gQXR0ZW1wdCB0byAiZGlzY292ZXIiIHRoZSBkYXRhIGluCgkJCQkvLyBIVE1MNSBjdXN0b20gZGF0YS0qIGF0dHJzCgkJCQlkYXRhID0gZGF0YUF0dHIoIGVsZW0sIGtleSApOwoJCQkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuIGRhdGE7CgkJCQl9CgoJCQkJLy8gV2UgdHJpZWQgcmVhbGx5IGhhcmQsIGJ1dCB0aGUgZGF0YSBkb2Vzbid0IGV4aXN0LgoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBTZXQgdGhlIGRhdGEuLi4KCQkJdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCgkJCQkvLyBXZSBhbHdheXMgc3RvcmUgdGhlIGNhbWVsQ2FzZWQga2V5CgkJCQlkYXRhVXNlci5zZXQoIHRoaXMsIGtleSwgdmFsdWUgKTsKCQkJfSApOwoJCX0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSwgbnVsbCwgdHJ1ZSApOwoJfSwKCglyZW1vdmVEYXRhOiBmdW5jdGlvbigga2V5ICkgewoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQlkYXRhVXNlci5yZW1vdmUoIHRoaXMsIGtleSApOwoJCX0gKTsKCX0KfSApOwoKCmpRdWVyeS5leHRlbmQoIHsKCXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSwgZGF0YSApIHsKCQl2YXIgcXVldWU7CgoJCWlmICggZWxlbSApIHsKCQkJdHlwZSA9ICggdHlwZSB8fCAiZngiICkgKyAicXVldWUiOwoJCQlxdWV1ZSA9IGRhdGFQcml2LmdldCggZWxlbSwgdHlwZSApOwoKCQkJLy8gU3BlZWQgdXAgZGVxdWV1ZSBieSBnZXR0aW5nIG91dCBxdWlja2x5IGlmIHRoaXMgaXMganVzdCBhIGxvb2t1cAoJCQlpZiAoIGRhdGEgKSB7CgkJCQlpZiAoICFxdWV1ZSB8fCBBcnJheS5pc0FycmF5KCBkYXRhICkgKSB7CgkJCQkJcXVldWUgPSBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEgKSApOwoJCQkJfSBlbHNlIHsKCQkJCQlxdWV1ZS5wdXNoKCBkYXRhICk7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIHF1ZXVlIHx8IFtdOwoJCX0KCX0sCgoJZGVxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7CgkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCgkJdmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCBlbGVtLCB0eXBlICksCgkJCXN0YXJ0TGVuZ3RoID0gcXVldWUubGVuZ3RoLAoJCQlmbiA9IHF1ZXVlLnNoaWZ0KCksCgkJCWhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCB0eXBlICksCgkJCW5leHQgPSBmdW5jdGlvbigpIHsKCQkJCWpRdWVyeS5kZXF1ZXVlKCBlbGVtLCB0eXBlICk7CgkJCX07CgoJCS8vIElmIHRoZSBmeCBxdWV1ZSBpcyBkZXF1ZXVlZCwgYWx3YXlzIHJlbW92ZSB0aGUgcHJvZ3Jlc3Mgc2VudGluZWwKCQlpZiAoIGZuID09PSAiaW5wcm9ncmVzcyIgKSB7CgkJCWZuID0gcXVldWUuc2hpZnQoKTsKCQkJc3RhcnRMZW5ndGgtLTsKCQl9CgoJCWlmICggZm4gKSB7CgoJCQkvLyBBZGQgYSBwcm9ncmVzcyBzZW50aW5lbCB0byBwcmV2ZW50IHRoZSBmeCBxdWV1ZSBmcm9tIGJlaW5nCgkJCS8vIGF1dG9tYXRpY2FsbHkgZGVxdWV1ZWQKCQkJaWYgKCB0eXBlID09PSAiZngiICkgewoJCQkJcXVldWUudW5zaGlmdCggImlucHJvZ3Jlc3MiICk7CgkJCX0KCgkJCS8vIENsZWFyIHVwIHRoZSBsYXN0IHF1ZXVlIHN0b3AgZnVuY3Rpb24KCQkJZGVsZXRlIGhvb2tzLnN0b3A7CgkJCWZuLmNhbGwoIGVsZW0sIG5leHQsIGhvb2tzICk7CgkJfQoKCQlpZiAoICFzdGFydExlbmd0aCAmJiBob29rcyApIHsKCQkJaG9va3MuZW1wdHkuZmlyZSgpOwoJCX0KCX0sCgoJLy8gTm90IHB1YmxpYyAtIGdlbmVyYXRlIGEgcXVldWVIb29rcyBvYmplY3QsIG9yIHJldHVybiB0aGUgY3VycmVudCBvbmUKCV9xdWV1ZUhvb2tzOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHsKCQl2YXIga2V5ID0gdHlwZSArICJxdWV1ZUhvb2tzIjsKCQlyZXR1cm4gZGF0YVByaXYuZ2V0KCBlbGVtLCBrZXkgKSB8fCBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIGtleSwgewoJCQllbXB0eTogalF1ZXJ5LkNhbGxiYWNrcyggIm9uY2UgbWVtb3J5IiApLmFkZCggZnVuY3Rpb24oKSB7CgkJCQlkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFsgdHlwZSArICJxdWV1ZSIsIGtleSBdICk7CgkJCX0gKQoJCX0gKTsKCX0KfSApOwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJcXVldWU6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewoJCXZhciBzZXR0ZXIgPSAyOwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJZGF0YSA9IHR5cGU7CgkJCXR5cGUgPSAiZngiOwoJCQlzZXR0ZXItLTsKCQl9CgoJCWlmICggYXJndW1lbnRzLmxlbmd0aCA8IHNldHRlciApIHsKCQkJcmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1sgMCBdLCB0eXBlICk7CgkJfQoKCQlyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkID8KCQkJdGhpcyA6CgkJCXRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCQl2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIGRhdGEgKTsKCgkJCQkvLyBFbnN1cmUgYSBob29rcyBmb3IgdGhpcyBxdWV1ZQoJCQkJalF1ZXJ5Ll9xdWV1ZUhvb2tzKCB0aGlzLCB0eXBlICk7CgoJCQkJaWYgKCB0eXBlID09PSAiZngiICYmIHF1ZXVlWyAwIF0gIT09ICJpbnByb2dyZXNzIiApIHsKCQkJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOwoJCQkJfQoJCQl9ICk7Cgl9LAoJZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7CgkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7CgkJfSApOwoJfSwKCWNsZWFyUXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgewoJCXJldHVybiB0aGlzLnF1ZXVlKCB0eXBlIHx8ICJmeCIsIFtdICk7Cgl9LAoKCS8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBxdWV1ZXMgb2YgYSBjZXJ0YWluIHR5cGUKCS8vIGFyZSBlbXB0aWVkIChmeCBpcyB0aGUgdHlwZSBieSBkZWZhdWx0KQoJcHJvbWlzZTogZnVuY3Rpb24oIHR5cGUsIG9iaiApIHsKCQl2YXIgdG1wLAoJCQljb3VudCA9IDEsCgkJCWRlZmVyID0galF1ZXJ5LkRlZmVycmVkKCksCgkJCWVsZW1lbnRzID0gdGhpcywKCQkJaSA9IHRoaXMubGVuZ3RoLAoJCQlyZXNvbHZlID0gZnVuY3Rpb24oKSB7CgkJCQlpZiAoICEoIC0tY291bnQgKSApIHsKCQkJCQlkZWZlci5yZXNvbHZlV2l0aCggZWxlbWVudHMsIFsgZWxlbWVudHMgXSApOwoJCQkJfQoJCQl9OwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJb2JqID0gdHlwZTsKCQkJdHlwZSA9IHVuZGVmaW5lZDsKCQl9CgkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCgkJd2hpbGUgKCBpLS0gKSB7CgkJCXRtcCA9IGRhdGFQcml2LmdldCggZWxlbWVudHNbIGkgXSwgdHlwZSArICJxdWV1ZUhvb2tzIiApOwoJCQlpZiAoIHRtcCAmJiB0bXAuZW1wdHkgKSB7CgkJCQljb3VudCsrOwoJCQkJdG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApOwoJCQl9CgkJfQoJCXJlc29sdmUoKTsKCQlyZXR1cm4gZGVmZXIucHJvbWlzZSggb2JqICk7Cgl9Cn0gKTsKdmFyIHBudW0gPSAoIC9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8gKS5zb3VyY2U7Cgp2YXIgcmNzc051bSA9IG5ldyBSZWdFeHAoICJeKD86KFsrLV0pPXwpKCIgKyBwbnVtICsgIikoW2EteiVdKikkIiwgImkiICk7CgoKdmFyIGNzc0V4cGFuZCA9IFsgIlRvcCIsICJSaWdodCIsICJCb3R0b20iLCAiTGVmdCIgXTsKCnZhciBpc0hpZGRlbldpdGhpblRyZWUgPSBmdW5jdGlvbiggZWxlbSwgZWwgKSB7CgoJCS8vIGlzSGlkZGVuV2l0aGluVHJlZSBtaWdodCBiZSBjYWxsZWQgZnJvbSBqUXVlcnkjZmlsdGVyIGZ1bmN0aW9uOwoJCS8vIGluIHRoYXQgY2FzZSwgZWxlbWVudCB3aWxsIGJlIHNlY29uZCBhcmd1bWVudAoJCWVsZW0gPSBlbCB8fCBlbGVtOwoKCQkvLyBJbmxpbmUgc3R5bGUgdHJ1bXBzIGFsbAoJCXJldHVybiBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICJub25lIiB8fAoJCQllbGVtLnN0eWxlLmRpc3BsYXkgPT09ICIiICYmCgoJCQkvLyBPdGhlcndpc2UsIGNoZWNrIGNvbXB1dGVkIHN0eWxlCgkJCS8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00MyAtIDQ1CgkJCS8vIERpc2Nvbm5lY3RlZCBlbGVtZW50cyBjYW4gaGF2ZSBjb21wdXRlZCBkaXNwbGF5OiBub25lLCBzbyBmaXJzdCBjb25maXJtIHRoYXQgZWxlbSBpcwoJCQkvLyBpbiB0aGUgZG9jdW1lbnQuCgkJCWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgJiYKCgkJCWpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApID09PSAibm9uZSI7Cgl9OwoKdmFyIHN3YXAgPSBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2ssIGFyZ3MgKSB7Cgl2YXIgcmV0LCBuYW1lLAoJCW9sZCA9IHt9OwoKCS8vIFJlbWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcgb25lcwoJZm9yICggbmFtZSBpbiBvcHRpb25zICkgewoJCW9sZFsgbmFtZSBdID0gZWxlbS5zdHlsZVsgbmFtZSBdOwoJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9wdGlvbnNbIG5hbWUgXTsKCX0KCglyZXQgPSBjYWxsYmFjay5hcHBseSggZWxlbSwgYXJncyB8fCBbXSApOwoKCS8vIFJldmVydCB0aGUgb2xkIHZhbHVlcwoJZm9yICggbmFtZSBpbiBvcHRpb25zICkgewoJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdOwoJfQoKCXJldHVybiByZXQ7Cn07CgoKCgpmdW5jdGlvbiBhZGp1c3RDU1MoIGVsZW0sIHByb3AsIHZhbHVlUGFydHMsIHR3ZWVuICkgewoJdmFyIGFkanVzdGVkLCBzY2FsZSwKCQltYXhJdGVyYXRpb25zID0gMjAsCgkJY3VycmVudFZhbHVlID0gdHdlZW4gPwoJCQlmdW5jdGlvbigpIHsKCQkJCXJldHVybiB0d2Vlbi5jdXIoKTsKCQkJfSA6CgkJCWZ1bmN0aW9uKCkgewoJCQkJcmV0dXJuIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AsICIiICk7CgkJCX0sCgkJaW5pdGlhbCA9IGN1cnJlbnRWYWx1ZSgpLAoJCXVuaXQgPSB2YWx1ZVBhcnRzICYmIHZhbHVlUGFydHNbIDMgXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/ICIiIDogInB4IiApLAoKCQkvLyBTdGFydGluZyB2YWx1ZSBjb21wdXRhdGlvbiBpcyByZXF1aXJlZCBmb3IgcG90ZW50aWFsIHVuaXQgbWlzbWF0Y2hlcwoJCWluaXRpYWxJblVuaXQgPSAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSB8fCB1bml0ICE9PSAicHgiICYmICtpbml0aWFsICkgJiYKCQkJcmNzc051bS5leGVjKCBqUXVlcnkuY3NzKCBlbGVtLCBwcm9wICkgKTsKCglpZiAoIGluaXRpYWxJblVuaXQgJiYgaW5pdGlhbEluVW5pdFsgMyBdICE9PSB1bml0ICkgewoKCQkvLyBTdXBwb3J0OiBGaXJlZm94IDw9NTQKCQkvLyBIYWx2ZSB0aGUgaXRlcmF0aW9uIHRhcmdldCB2YWx1ZSB0byBwcmV2ZW50IGludGVyZmVyZW5jZSBmcm9tIENTUyB1cHBlciBib3VuZHMgKGdoLTIxNDQpCgkJaW5pdGlhbCA9IGluaXRpYWwgLyAyOwoKCQkvLyBUcnVzdCB1bml0cyByZXBvcnRlZCBieSBqUXVlcnkuY3NzCgkJdW5pdCA9IHVuaXQgfHwgaW5pdGlhbEluVW5pdFsgMyBdOwoKCQkvLyBJdGVyYXRpdmVseSBhcHByb3hpbWF0ZSBmcm9tIGEgbm9uemVybyBzdGFydGluZyBwb2ludAoJCWluaXRpYWxJblVuaXQgPSAraW5pdGlhbCB8fCAxOwoKCQl3aGlsZSAoIG1heEl0ZXJhdGlvbnMtLSApIHsKCgkJCS8vIEV2YWx1YXRlIGFuZCB1cGRhdGUgb3VyIGJlc3QgZ3Vlc3MgKGRvdWJsaW5nIGd1ZXNzZXMgdGhhdCB6ZXJvIG91dCkuCgkJCS8vIEZpbmlzaCBpZiB0aGUgc2NhbGUgZXF1YWxzIG9yIGNyb3NzZXMgMSAobWFraW5nIHRoZSBvbGQqbmV3IHByb2R1Y3Qgbm9uLXBvc2l0aXZlKS4KCQkJalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBpbml0aWFsSW5Vbml0ICsgdW5pdCApOwoJCQlpZiAoICggMSAtIHNjYWxlICkgKiAoIDEgLSAoIHNjYWxlID0gY3VycmVudFZhbHVlKCkgLyBpbml0aWFsIHx8IDAuNSApICkgPD0gMCApIHsKCQkJCW1heEl0ZXJhdGlvbnMgPSAwOwoJCQl9CgkJCWluaXRpYWxJblVuaXQgPSBpbml0aWFsSW5Vbml0IC8gc2NhbGU7CgoJCX0KCgkJaW5pdGlhbEluVW5pdCA9IGluaXRpYWxJblVuaXQgKiAyOwoJCWpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgaW5pdGlhbEluVW5pdCArIHVuaXQgKTsKCgkJLy8gTWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGUgdHdlZW4gcHJvcGVydGllcyBsYXRlciBvbgoJCXZhbHVlUGFydHMgPSB2YWx1ZVBhcnRzIHx8IFtdOwoJfQoKCWlmICggdmFsdWVQYXJ0cyApIHsKCQlpbml0aWFsSW5Vbml0ID0gK2luaXRpYWxJblVuaXQgfHwgK2luaXRpYWwgfHwgMDsKCgkJLy8gQXBwbHkgcmVsYXRpdmUgb2Zmc2V0ICgrPS8tPSkgaWYgc3BlY2lmaWVkCgkJYWRqdXN0ZWQgPSB2YWx1ZVBhcnRzWyAxIF0gPwoJCQlpbml0aWFsSW5Vbml0ICsgKCB2YWx1ZVBhcnRzWyAxIF0gKyAxICkgKiB2YWx1ZVBhcnRzWyAyIF0gOgoJCQkrdmFsdWVQYXJ0c1sgMiBdOwoJCWlmICggdHdlZW4gKSB7CgkJCXR3ZWVuLnVuaXQgPSB1bml0OwoJCQl0d2Vlbi5zdGFydCA9IGluaXRpYWxJblVuaXQ7CgkJCXR3ZWVuLmVuZCA9IGFkanVzdGVkOwoJCX0KCX0KCXJldHVybiBhZGp1c3RlZDsKfQoKCnZhciBkZWZhdWx0RGlzcGxheU1hcCA9IHt9OwoKZnVuY3Rpb24gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKSB7Cgl2YXIgdGVtcCwKCQlkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQsCgkJbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLAoJCWRpc3BsYXkgPSBkZWZhdWx0RGlzcGxheU1hcFsgbm9kZU5hbWUgXTsKCglpZiAoIGRpc3BsYXkgKSB7CgkJcmV0dXJuIGRpc3BsYXk7Cgl9CgoJdGVtcCA9IGRvYy5ib2R5LmFwcGVuZENoaWxkKCBkb2MuY3JlYXRlRWxlbWVudCggbm9kZU5hbWUgKSApOwoJZGlzcGxheSA9IGpRdWVyeS5jc3MoIHRlbXAsICJkaXNwbGF5IiApOwoKCXRlbXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggdGVtcCApOwoKCWlmICggZGlzcGxheSA9PT0gIm5vbmUiICkgewoJCWRpc3BsYXkgPSAiYmxvY2siOwoJfQoJZGVmYXVsdERpc3BsYXlNYXBbIG5vZGVOYW1lIF0gPSBkaXNwbGF5OwoKCXJldHVybiBkaXNwbGF5Owp9CgpmdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cgKSB7Cgl2YXIgZGlzcGxheSwgZWxlbSwKCQl2YWx1ZXMgPSBbXSwKCQlpbmRleCA9IDAsCgkJbGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoOwoKCS8vIERldGVybWluZSBuZXcgZGlzcGxheSB2YWx1ZSBmb3IgZWxlbWVudHMgdGhhdCBuZWVkIHRvIGNoYW5nZQoJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQllbGVtID0gZWxlbWVudHNbIGluZGV4IF07CgkJaWYgKCAhZWxlbS5zdHlsZSApIHsKCQkJY29udGludWU7CgkJfQoKCQlkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5OwoJCWlmICggc2hvdyApIHsKCgkJCS8vIFNpbmNlIHdlIGZvcmNlIHZpc2liaWxpdHkgdXBvbiBjYXNjYWRlLWhpZGRlbiBlbGVtZW50cywgYW4gaW1tZWRpYXRlIChhbmQgc2xvdykKCQkJLy8gY2hlY2sgaXMgcmVxdWlyZWQgaW4gdGhpcyBmaXJzdCBsb29wIHVubGVzcyB3ZSBoYXZlIGEgbm9uZW1wdHkgZGlzcGxheSB2YWx1ZSAoZWl0aGVyCgkJCS8vIGlubGluZSBvciBhYm91dC10by1iZS1yZXN0b3JlZCkKCQkJaWYgKCBkaXNwbGF5ID09PSAibm9uZSIgKSB7CgkJCQl2YWx1ZXNbIGluZGV4IF0gPSBkYXRhUHJpdi5nZXQoIGVsZW0sICJkaXNwbGF5IiApIHx8IG51bGw7CgkJCQlpZiAoICF2YWx1ZXNbIGluZGV4IF0gKSB7CgkJCQkJZWxlbS5zdHlsZS5kaXNwbGF5ID0gIiI7CgkJCQl9CgkJCX0KCQkJaWYgKCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICIiICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApICkgewoJCQkJdmFsdWVzWyBpbmRleCBdID0gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKTsKCQkJfQoJCX0gZWxzZSB7CgkJCWlmICggZGlzcGxheSAhPT0gIm5vbmUiICkgewoJCQkJdmFsdWVzWyBpbmRleCBdID0gIm5vbmUiOwoKCQkJCS8vIFJlbWVtYmVyIHdoYXQgd2UncmUgb3ZlcndyaXRpbmcKCQkJCWRhdGFQcml2LnNldCggZWxlbSwgImRpc3BsYXkiLCBkaXNwbGF5ICk7CgkJCX0KCQl9Cgl9CgoJLy8gU2V0IHRoZSBkaXNwbGF5IG9mIHRoZSBlbGVtZW50cyBpbiBhIHNlY29uZCBsb29wIHRvIGF2b2lkIGNvbnN0YW50IHJlZmxvdwoJZm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQlpZiAoIHZhbHVlc1sgaW5kZXggXSAhPSBudWxsICkgewoJCQllbGVtZW50c1sgaW5kZXggXS5zdHlsZS5kaXNwbGF5ID0gdmFsdWVzWyBpbmRleCBdOwoJCX0KCX0KCglyZXR1cm4gZWxlbWVudHM7Cn0KCmpRdWVyeS5mbi5leHRlbmQoIHsKCXNob3c6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzaG93SGlkZSggdGhpcywgdHJ1ZSApOwoJfSwKCWhpZGU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzaG93SGlkZSggdGhpcyApOwoJfSwKCXRvZ2dsZTogZnVuY3Rpb24oIHN0YXRlICkgewoJCWlmICggdHlwZW9mIHN0YXRlID09PSAiYm9vbGVhbiIgKSB7CgkJCXJldHVybiBzdGF0ZSA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7CgkJfQoKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCQkJaWYgKCBpc0hpZGRlbldpdGhpblRyZWUoIHRoaXMgKSApIHsKCQkJCWpRdWVyeSggdGhpcyApLnNob3coKTsKCQkJfSBlbHNlIHsKCQkJCWpRdWVyeSggdGhpcyApLmhpZGUoKTsKCQkJfQoJCX0gKTsKCX0KfSApOwp2YXIgcmNoZWNrYWJsZVR5cGUgPSAoIC9eKD86Y2hlY2tib3h8cmFkaW8pJC9pICk7Cgp2YXIgcnRhZ05hbWUgPSAoIC88KFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0rKS9pICk7Cgp2YXIgcnNjcmlwdFR5cGUgPSAoIC9eJHxebW9kdWxlJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSApOwoKCgovLyBXZSBoYXZlIHRvIGNsb3NlIHRoZXNlIHRhZ3MgdG8gc3VwcG9ydCBYSFRNTCAoIzEzMjAwKQp2YXIgd3JhcE1hcCA9IHsKCgkvLyBTdXBwb3J0OiBJRSA8PTkgb25seQoJb3B0aW9uOiBbIDEsICI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwgIjwvc2VsZWN0PiIgXSwKCgkvLyBYSFRNTCBwYXJzZXJzIGRvIG5vdCBtYWdpY2FsbHkgaW5zZXJ0IGVsZW1lbnRzIGluIHRoZQoJLy8gc2FtZSB3YXkgdGhhdCB0YWcgc291cCBwYXJzZXJzIGRvLiBTbyB3ZSBjYW5ub3Qgc2hvcnRlbgoJLy8gdGhpcyBieSBvbWl0dGluZyA8dGJvZHk+IG9yIG90aGVyIHJlcXVpcmVkIGVsZW1lbnRzLgoJdGhlYWQ6IFsgMSwgIjx0YWJsZT4iLCAiPC90YWJsZT4iIF0sCgljb2w6IFsgMiwgIjx0YWJsZT48Y29sZ3JvdXA+IiwgIjwvY29sZ3JvdXA+PC90YWJsZT4iIF0sCgl0cjogWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSwKCXRkOiBbIDMsICI8dGFibGU+PHRib2R5Pjx0cj4iLCAiPC90cj48L3Rib2R5PjwvdGFibGU+IiBdLAoKCV9kZWZhdWx0OiBbIDAsICIiLCAiIiBdCn07CgovLyBTdXBwb3J0OiBJRSA8PTkgb25seQp3cmFwTWFwLm9wdGdyb3VwID0gd3JhcE1hcC5vcHRpb247Cgp3cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkOwp3cmFwTWFwLnRoID0gd3JhcE1hcC50ZDsKCgpmdW5jdGlvbiBnZXRBbGwoIGNvbnRleHQsIHRhZyApIHsKCgkvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5CgkvLyBVc2UgdHlwZW9mIHRvIGF2b2lkIHplcm8tYXJndW1lbnQgbWV0aG9kIGludm9jYXRpb24gb24gaG9zdCBvYmplY3RzICgjMTUxNTEpCgl2YXIgcmV0OwoKCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICkgewoJCXJldCA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyB8fCAiKiIgKTsKCgl9IGVsc2UgaWYgKCB0eXBlb2YgY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsICE9PSAidW5kZWZpbmVkIiApIHsKCQlyZXQgPSBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRhZyB8fCAiKiIgKTsKCgl9IGVsc2UgewoJCXJldCA9IFtdOwoJfQoKCWlmICggdGFnID09PSB1bmRlZmluZWQgfHwgdGFnICYmIG5vZGVOYW1lKCBjb250ZXh0LCB0YWcgKSApIHsKCQlyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbIGNvbnRleHQgXSwgcmV0ICk7Cgl9CgoJcmV0dXJuIHJldDsKfQoKCi8vIE1hcmsgc2NyaXB0cyBhcyBoYXZpbmcgYWxyZWFkeSBiZWVuIGV2YWx1YXRlZApmdW5jdGlvbiBzZXRHbG9iYWxFdmFsKCBlbGVtcywgcmVmRWxlbWVudHMgKSB7Cgl2YXIgaSA9IDAsCgkJbCA9IGVsZW1zLmxlbmd0aDsKCglmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJZGF0YVByaXYuc2V0KAoJCQllbGVtc1sgaSBdLAoJCQkiZ2xvYmFsRXZhbCIsCgkJCSFyZWZFbGVtZW50cyB8fCBkYXRhUHJpdi5nZXQoIHJlZkVsZW1lbnRzWyBpIF0sICJnbG9iYWxFdmFsIiApCgkJKTsKCX0KfQoKCnZhciByaHRtbCA9IC88fCYjP1x3KzsvOwoKZnVuY3Rpb24gYnVpbGRGcmFnbWVudCggZWxlbXMsIGNvbnRleHQsIHNjcmlwdHMsIHNlbGVjdGlvbiwgaWdub3JlZCApIHsKCXZhciBlbGVtLCB0bXAsIHRhZywgd3JhcCwgY29udGFpbnMsIGosCgkJZnJhZ21lbnQgPSBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwKCQlub2RlcyA9IFtdLAoJCWkgPSAwLAoJCWwgPSBlbGVtcy5sZW5ndGg7CgoJZm9yICggOyBpIDwgbDsgaSsrICkgewoJCWVsZW0gPSBlbGVtc1sgaSBdOwoKCQlpZiAoIGVsZW0gfHwgZWxlbSA9PT0gMCApIHsKCgkJCS8vIEFkZCBub2RlcyBkaXJlY3RseQoJCQlpZiAoIHRvVHlwZSggZWxlbSApID09PSAib2JqZWN0IiApIHsKCgkJCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHkKCQkJCS8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJCWpRdWVyeS5tZXJnZSggbm9kZXMsIGVsZW0ubm9kZVR5cGUgPyBbIGVsZW0gXSA6IGVsZW0gKTsKCgkJCS8vIENvbnZlcnQgbm9uLWh0bWwgaW50byBhIHRleHQgbm9kZQoJCQl9IGVsc2UgaWYgKCAhcmh0bWwudGVzdCggZWxlbSApICkgewoJCQkJbm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApICk7CgoJCQkvLyBDb252ZXJ0IGh0bWwgaW50byBET00gbm9kZXMKCQkJfSBlbHNlIHsKCQkJCXRtcCA9IHRtcCB8fCBmcmFnbWVudC5hcHBlbmRDaGlsZCggY29udGV4dC5jcmVhdGVFbGVtZW50KCAiZGl2IiApICk7CgoJCQkJLy8gRGVzZXJpYWxpemUgYSBzdGFuZGFyZCByZXByZXNlbnRhdGlvbgoJCQkJdGFnID0gKCBydGFnTmFtZS5leGVjKCBlbGVtICkgfHwgWyAiIiwgIiIgXSApWyAxIF0udG9Mb3dlckNhc2UoKTsKCQkJCXdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZhdWx0OwoJCQkJdG1wLmlubmVySFRNTCA9IHdyYXBbIDEgXSArIGpRdWVyeS5odG1sUHJlZmlsdGVyKCBlbGVtICkgKyB3cmFwWyAyIF07CgoJCQkJLy8gRGVzY2VuZCB0aHJvdWdoIHdyYXBwZXJzIHRvIHRoZSByaWdodCBjb250ZW50CgkJCQlqID0gd3JhcFsgMCBdOwoJCQkJd2hpbGUgKCBqLS0gKSB7CgkJCQkJdG1wID0gdG1wLmxhc3RDaGlsZDsKCQkJCX0KCgkJCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHkKCQkJCS8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJCWpRdWVyeS5tZXJnZSggbm9kZXMsIHRtcC5jaGlsZE5vZGVzICk7CgoJCQkJLy8gUmVtZW1iZXIgdGhlIHRvcC1sZXZlbCBjb250YWluZXIKCQkJCXRtcCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7CgoJCQkJLy8gRW5zdXJlIHRoZSBjcmVhdGVkIG5vZGVzIGFyZSBvcnBoYW5lZCAoIzEyMzkyKQoJCQkJdG1wLnRleHRDb250ZW50ID0gIiI7CgkJCX0KCQl9Cgl9CgoJLy8gUmVtb3ZlIHdyYXBwZXIgZnJvbSBmcmFnbWVudAoJZnJhZ21lbnQudGV4dENvbnRlbnQgPSAiIjsKCglpID0gMDsKCXdoaWxlICggKCBlbGVtID0gbm9kZXNbIGkrKyBdICkgKSB7CgoJCS8vIFNraXAgZWxlbWVudHMgYWxyZWFkeSBpbiB0aGUgY29udGV4dCBjb2xsZWN0aW9uICh0cmFjLTQwODcpCgkJaWYgKCBzZWxlY3Rpb24gJiYgalF1ZXJ5LmluQXJyYXkoIGVsZW0sIHNlbGVjdGlvbiApID4gLTEgKSB7CgkJCWlmICggaWdub3JlZCApIHsKCQkJCWlnbm9yZWQucHVzaCggZWxlbSApOwoJCQl9CgkJCWNvbnRpbnVlOwoJCX0KCgkJY29udGFpbnMgPSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApOwoKCQkvLyBBcHBlbmQgdG8gZnJhZ21lbnQKCQl0bXAgPSBnZXRBbGwoIGZyYWdtZW50LmFwcGVuZENoaWxkKCBlbGVtICksICJzY3JpcHQiICk7CgoJCS8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3RvcnkKCQlpZiAoIGNvbnRhaW5zICkgewoJCQlzZXRHbG9iYWxFdmFsKCB0bXAgKTsKCQl9CgoJCS8vIENhcHR1cmUgZXhlY3V0YWJsZXMKCQlpZiAoIHNjcmlwdHMgKSB7CgkJCWogPSAwOwoJCQl3aGlsZSAoICggZWxlbSA9IHRtcFsgaisrIF0gKSApIHsKCQkJCWlmICggcnNjcmlwdFR5cGUudGVzdCggZWxlbS50eXBlIHx8ICIiICkgKSB7CgkJCQkJc2NyaXB0cy5wdXNoKCBlbGVtICk7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIGZyYWdtZW50Owp9CgoKKCBmdW5jdGlvbigpIHsKCXZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwKCQlkaXYgPSBmcmFnbWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSApLAoJCWlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlucHV0IiApOwoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIC0gNC4zIG9ubHkKCS8vIENoZWNrIHN0YXRlIGxvc3QgaWYgdGhlIG5hbWUgaXMgc2V0ICgjMTEyMTcpCgkvLyBTdXBwb3J0OiBXaW5kb3dzIFdlYiBBcHBzIChXV0EpCgkvLyBgbmFtZWAgYW5kIGB0eXBlYCBtdXN0IHVzZSAuc2V0QXR0cmlidXRlIGZvciBXV0EgKCMxNDkwMSkKCWlucHV0LnNldEF0dHJpYnV0ZSggInR5cGUiLCAicmFkaW8iICk7CglpbnB1dC5zZXRBdHRyaWJ1dGUoICJjaGVja2VkIiwgImNoZWNrZWQiICk7CglpbnB1dC5zZXRBdHRyaWJ1dGUoICJuYW1lIiwgInQiICk7CgoJZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApOwoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjEgb25seQoJLy8gT2xkZXIgV2ViS2l0IGRvZXNuJ3QgY2xvbmUgY2hlY2tlZCBzdGF0ZSBjb3JyZWN0bHkgaW4gZnJhZ21lbnRzCglzdXBwb3J0LmNoZWNrQ2xvbmUgPSBkaXYuY2xvbmVOb2RlKCB0cnVlICkuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmNoZWNrZWQ7CgoJLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5CgkvLyBNYWtlIHN1cmUgdGV4dGFyZWEgKGFuZCBjaGVja2JveCkgZGVmYXVsdFZhbHVlIGlzIHByb3Blcmx5IGNsb25lZAoJZGl2LmlubmVySFRNTCA9ICI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IjsKCXN1cHBvcnQubm9DbG9uZUNoZWNrZWQgPSAhIWRpdi5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlOwp9ICkoKTsKdmFyIGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCgoKdmFyCglya2V5RXZlbnQgPSAvXmtleS8sCglybW91c2VFdmVudCA9IC9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLywKCXJ0eXBlbmFtZXNwYWNlID0gL14oW14uXSopKD86XC4oLispfCkvOwoKZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHsKCXJldHVybiB0cnVlOwp9CgpmdW5jdGlvbiByZXR1cm5GYWxzZSgpIHsKCXJldHVybiBmYWxzZTsKfQoKLy8gU3VwcG9ydDogSUUgPD05IG9ubHkKLy8gU2VlICMxMzM5MyBmb3IgbW9yZSBpbmZvCmZ1bmN0aW9uIHNhZmVBY3RpdmVFbGVtZW50KCkgewoJdHJ5IHsKCQlyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDsKCX0gY2F0Y2ggKCBlcnIgKSB7IH0KfQoKZnVuY3Rpb24gb24oIGVsZW0sIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIG9uZSApIHsKCXZhciBvcmlnRm4sIHR5cGU7CgoJLy8gVHlwZXMgY2FuIGJlIGEgbWFwIG9mIHR5cGVzL2hhbmRsZXJzCglpZiAoIHR5cGVvZiB0eXBlcyA9PT0gIm9iamVjdCIgKSB7CgoJCS8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3RvciwgZGF0YSApCgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewoKCQkJLy8gKCB0eXBlcy1PYmplY3QsIGRhdGEgKQoJCQlkYXRhID0gZGF0YSB8fCBzZWxlY3RvcjsKCQkJc2VsZWN0b3IgPSB1bmRlZmluZWQ7CgkJfQoJCWZvciAoIHR5cGUgaW4gdHlwZXMgKSB7CgkJCW9uKCBlbGVtLCB0eXBlLCBzZWxlY3RvciwgZGF0YSwgdHlwZXNbIHR5cGUgXSwgb25lICk7CgkJfQoJCXJldHVybiBlbGVtOwoJfQoKCWlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7CgoJCS8vICggdHlwZXMsIGZuICkKCQlmbiA9IHNlbGVjdG9yOwoJCWRhdGEgPSBzZWxlY3RvciA9IHVuZGVmaW5lZDsKCX0gZWxzZSBpZiAoIGZuID09IG51bGwgKSB7CgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgewoKCQkJLy8gKCB0eXBlcywgc2VsZWN0b3IsIGZuICkKCQkJZm4gPSBkYXRhOwoJCQlkYXRhID0gdW5kZWZpbmVkOwoJCX0gZWxzZSB7CgoJCQkvLyAoIHR5cGVzLCBkYXRhLCBmbiApCgkJCWZuID0gZGF0YTsKCQkJZGF0YSA9IHNlbGVjdG9yOwoJCQlzZWxlY3RvciA9IHVuZGVmaW5lZDsKCQl9Cgl9CglpZiAoIGZuID09PSBmYWxzZSApIHsKCQlmbiA9IHJldHVybkZhbHNlOwoJfSBlbHNlIGlmICggIWZuICkgewoJCXJldHVybiBlbGVtOwoJfQoKCWlmICggb25lID09PSAxICkgewoJCW9yaWdGbiA9IGZuOwoJCWZuID0gZnVuY3Rpb24oIGV2ZW50ICkgewoKCQkJLy8gQ2FuIHVzZSBhbiBlbXB0eSBzZXQsIHNpbmNlIGV2ZW50IGNvbnRhaW5zIHRoZSBpbmZvCgkJCWpRdWVyeSgpLm9mZiggZXZlbnQgKTsKCQkJcmV0dXJuIG9yaWdGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfTsKCgkJLy8gVXNlIHNhbWUgZ3VpZCBzbyBjYWxsZXIgY2FuIHJlbW92ZSB1c2luZyBvcmlnRm4KCQlmbi5ndWlkID0gb3JpZ0ZuLmd1aWQgfHwgKCBvcmlnRm4uZ3VpZCA9IGpRdWVyeS5ndWlkKysgKTsKCX0KCXJldHVybiBlbGVtLmVhY2goIGZ1bmN0aW9uKCkgewoJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGVzLCBmbiwgZGF0YSwgc2VsZWN0b3IgKTsKCX0gKTsKfQoKLyoKICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgZXZlbnRzIC0tIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLgogKiBQcm9wcyB0byBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkgZm9yIG1hbnkgb2YgdGhlIGlkZWFzLgogKi8KalF1ZXJ5LmV2ZW50ID0gewoKCWdsb2JhbDoge30sCgoJYWRkOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEsIHNlbGVjdG9yICkgewoKCQl2YXIgaGFuZGxlT2JqSW4sIGV2ZW50SGFuZGxlLCB0bXAsCgkJCWV2ZW50cywgdCwgaGFuZGxlT2JqLAoJCQlzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsCgkJCWVsZW1EYXRhID0gZGF0YVByaXYuZ2V0KCBlbGVtICk7CgoJCS8vIERvbid0IGF0dGFjaCBldmVudHMgdG8gbm9EYXRhIG9yIHRleHQvY29tbWVudCBub2RlcyAoYnV0IGFsbG93IHBsYWluIG9iamVjdHMpCgkJaWYgKCAhZWxlbURhdGEgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIENhbGxlciBjYW4gcGFzcyBpbiBhbiBvYmplY3Qgb2YgY3VzdG9tIGRhdGEgaW4gbGlldSBvZiB0aGUgaGFuZGxlcgoJCWlmICggaGFuZGxlci5oYW5kbGVyICkgewoJCQloYW5kbGVPYmpJbiA9IGhhbmRsZXI7CgkJCWhhbmRsZXIgPSBoYW5kbGVPYmpJbi5oYW5kbGVyOwoJCQlzZWxlY3RvciA9IGhhbmRsZU9iakluLnNlbGVjdG9yOwoJCX0KCgkJLy8gRW5zdXJlIHRoYXQgaW52YWxpZCBzZWxlY3RvcnMgdGhyb3cgZXhjZXB0aW9ucyBhdCBhdHRhY2ggdGltZQoJCS8vIEV2YWx1YXRlIGFnYWluc3QgZG9jdW1lbnRFbGVtZW50IGluIGNhc2UgZWxlbSBpcyBhIG5vbi1lbGVtZW50IG5vZGUgKGUuZy4sIGRvY3VtZW50KQoJCWlmICggc2VsZWN0b3IgKSB7CgkJCWpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZG9jdW1lbnRFbGVtZW50LCBzZWxlY3RvciApOwoJCX0KCgkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGhhbmRsZXIgaGFzIGEgdW5pcXVlIElELCB1c2VkIHRvIGZpbmQvcmVtb3ZlIGl0IGxhdGVyCgkJaWYgKCAhaGFuZGxlci5ndWlkICkgewoJCQloYW5kbGVyLmd1aWQgPSBqUXVlcnkuZ3VpZCsrOwoJCX0KCgkJLy8gSW5pdCB0aGUgZWxlbWVudCdzIGV2ZW50IHN0cnVjdHVyZSBhbmQgbWFpbiBoYW5kbGVyLCBpZiB0aGlzIGlzIHRoZSBmaXJzdAoJCWlmICggISggZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzICkgKSB7CgkJCWV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyA9IHt9OwoJCX0KCQlpZiAoICEoIGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlICkgKSB7CgkJCWV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7CgoJCQkJLy8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmQKCQkJCS8vIHdoZW4gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWQKCQkJCXJldHVybiB0eXBlb2YgalF1ZXJ5ICE9PSAidW5kZWZpbmVkIiAmJiBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUgPwoJCQkJCWpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmluZWQ7CgkJCX07CgkJfQoKCQkvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNwYWNlCgkJdHlwZXMgPSAoIHR5cGVzIHx8ICIiICkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbICIiIF07CgkJdCA9IHR5cGVzLmxlbmd0aDsKCQl3aGlsZSAoIHQtLSApIHsKCQkJdG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbIHQgXSApIHx8IFtdOwoJCQl0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTsKCQkJbmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgIiIgKS5zcGxpdCggIi4iICkuc29ydCgpOwoKCQkJLy8gVGhlcmUgKm11c3QqIGJlIGEgdHlwZSwgbm8gYXR0YWNoaW5nIG5hbWVzcGFjZS1vbmx5IGhhbmRsZXJzCgkJCWlmICggIXR5cGUgKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJLy8gSWYgZXZlbnQgY2hhbmdlcyBpdHMgdHlwZSwgdXNlIHRoZSBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgY2hhbmdlZCB0eXBlCgkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9OwoKCQkJLy8gSWYgc2VsZWN0b3IgZGVmaW5lZCwgZGV0ZXJtaW5lIHNwZWNpYWwgZXZlbnQgYXBpIHR5cGUsIG90aGVyd2lzZSBnaXZlbiB0eXBlCgkJCXR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTsKCgkJCS8vIFVwZGF0ZSBzcGVjaWFsIGJhc2VkIG9uIG5ld2x5IHJlc2V0IHR5cGUKCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307CgoJCQkvLyBoYW5kbGVPYmogaXMgcGFzc2VkIHRvIGFsbCBldmVudCBoYW5kbGVycwoJCQloYW5kbGVPYmogPSBqUXVlcnkuZXh0ZW5kKCB7CgkJCQl0eXBlOiB0eXBlLAoJCQkJb3JpZ1R5cGU6IG9yaWdUeXBlLAoJCQkJZGF0YTogZGF0YSwKCQkJCWhhbmRsZXI6IGhhbmRsZXIsCgkJCQlndWlkOiBoYW5kbGVyLmd1aWQsCgkJCQlzZWxlY3Rvcjogc2VsZWN0b3IsCgkJCQluZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLAoJCQkJbmFtZXNwYWNlOiBuYW1lc3BhY2VzLmpvaW4oICIuIiApCgkJCX0sIGhhbmRsZU9iakluICk7CgoJCQkvLyBJbml0IHRoZSBldmVudCBoYW5kbGVyIHF1ZXVlIGlmIHdlJ3JlIHRoZSBmaXJzdAoJCQlpZiAoICEoIGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gKSApIHsKCQkJCWhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gPSBbXTsKCQkJCWhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwOwoKCQkJCS8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZQoJCQkJaWYgKCAhc3BlY2lhbC5zZXR1cCB8fAoJCQkJCXNwZWNpYWwuc2V0dXAuY2FsbCggZWxlbSwgZGF0YSwgbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSA9PT0gZmFsc2UgKSB7CgoJCQkJCWlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkgewoJCQkJCQllbGVtLmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIGV2ZW50SGFuZGxlICk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQlpZiAoIHNwZWNpYWwuYWRkICkgewoJCQkJc3BlY2lhbC5hZGQuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7CgoJCQkJaWYgKCAhaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCApIHsKCQkJCQloYW5kbGVPYmouaGFuZGxlci5ndWlkID0gaGFuZGxlci5ndWlkOwoJCQkJfQoJCQl9CgoJCQkvLyBBZGQgdG8gdGhlIGVsZW1lbnQncyBoYW5kbGVyIGxpc3QsIGRlbGVnYXRlcyBpbiBmcm9udAoJCQlpZiAoIHNlbGVjdG9yICkgewoJCQkJaGFuZGxlcnMuc3BsaWNlKCBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50KyssIDAsIGhhbmRsZU9iaiApOwoJCQl9IGVsc2UgewoJCQkJaGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7CgkJCX0KCgkJCS8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgZXZlciBiZWVuIHVzZWQsIGZvciBldmVudCBvcHRpbWl6YXRpb24KCQkJalF1ZXJ5LmV2ZW50Lmdsb2JhbFsgdHlwZSBdID0gdHJ1ZTsKCQl9CgoJfSwKCgkvLyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnQKCXJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBzZWxlY3RvciwgbWFwcGVkVHlwZXMgKSB7CgoJCXZhciBqLCBvcmlnQ291bnQsIHRtcCwKCQkJZXZlbnRzLCB0LCBoYW5kbGVPYmosCgkJCXNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLCBuYW1lc3BhY2VzLCBvcmlnVHlwZSwKCQkJZWxlbURhdGEgPSBkYXRhUHJpdi5oYXNEYXRhKCBlbGVtICkgJiYgZGF0YVByaXYuZ2V0KCBlbGVtICk7CgoJCWlmICggIWVsZW1EYXRhIHx8ICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBPbmNlIGZvciBlYWNoIHR5cGUubmFtZXNwYWNlIGluIHR5cGVzOyB0eXBlIG1heSBiZSBvbWl0dGVkCgkJdHlwZXMgPSAoIHR5cGVzIHx8ICIiICkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbICIiIF07CgkJdCA9IHR5cGVzLmxlbmd0aDsKCQl3aGlsZSAoIHQtLSApIHsKCQkJdG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbIHQgXSApIHx8IFtdOwoJCQl0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTsKCQkJbmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgIiIgKS5zcGxpdCggIi4iICkuc29ydCgpOwoKCQkJLy8gVW5iaW5kIGFsbCBldmVudHMgKG9uIHRoaXMgbmFtZXNwYWNlLCBpZiBwcm92aWRlZCkgZm9yIHRoZSBlbGVtZW50CgkJCWlmICggIXR5cGUgKSB7CgkJCQlmb3IgKCB0eXBlIGluIGV2ZW50cyApIHsKCQkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICsgdHlwZXNbIHQgXSwgaGFuZGxlciwgc2VsZWN0b3IsIHRydWUgKTsKCQkJCX0KCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKCQkJdHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlOwoJCQloYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8IFtdOwoJCQl0bXAgPSB0bXBbIDIgXSAmJgoJCQkJbmV3IFJlZ0V4cCggIihefFxcLikiICsgbmFtZXNwYWNlcy5qb2luKCAiXFwuKD86LipcXC58KSIgKSArICIoXFwufCQpIiApOwoKCQkJLy8gUmVtb3ZlIG1hdGNoaW5nIGV2ZW50cwoJCQlvcmlnQ291bnQgPSBqID0gaGFuZGxlcnMubGVuZ3RoOwoJCQl3aGlsZSAoIGotLSApIHsKCQkJCWhhbmRsZU9iaiA9IGhhbmRsZXJzWyBqIF07CgoJCQkJaWYgKCAoIG1hcHBlZFR5cGVzIHx8IG9yaWdUeXBlID09PSBoYW5kbGVPYmoub3JpZ1R5cGUgKSAmJgoJCQkJCSggIWhhbmRsZXIgfHwgaGFuZGxlci5ndWlkID09PSBoYW5kbGVPYmouZ3VpZCApICYmCgkJCQkJKCAhdG1wIHx8IHRtcC50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSAmJgoJCQkJCSggIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSBoYW5kbGVPYmouc2VsZWN0b3IgfHwKCQkJCQkJc2VsZWN0b3IgPT09ICIqKiIgJiYgaGFuZGxlT2JqLnNlbGVjdG9yICkgKSB7CgkJCQkJaGFuZGxlcnMuc3BsaWNlKCBqLCAxICk7CgoJCQkJCWlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkgewoJCQkJCQloYW5kbGVycy5kZWxlZ2F0ZUNvdW50LS07CgkJCQkJfQoJCQkJCWlmICggc3BlY2lhbC5yZW1vdmUgKSB7CgkJCQkJCXNwZWNpYWwucmVtb3ZlLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gUmVtb3ZlIGdlbmVyaWMgZXZlbnQgaGFuZGxlciBpZiB3ZSByZW1vdmVkIHNvbWV0aGluZyBhbmQgbm8gbW9yZSBoYW5kbGVycyBleGlzdAoJCQkvLyAoYXZvaWRzIHBvdGVudGlhbCBmb3IgZW5kbGVzcyByZWN1cnNpb24gZHVyaW5nIHJlbW92YWwgb2Ygc3BlY2lhbCBldmVudCBoYW5kbGVycykKCQkJaWYgKCBvcmlnQ291bnQgJiYgIWhhbmRsZXJzLmxlbmd0aCApIHsKCQkJCWlmICggIXNwZWNpYWwudGVhcmRvd24gfHwKCQkJCQlzcGVjaWFsLnRlYXJkb3duLmNhbGwoIGVsZW0sIG5hbWVzcGFjZXMsIGVsZW1EYXRhLmhhbmRsZSApID09PSBmYWxzZSApIHsKCgkJCQkJalF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBlbGVtRGF0YS5oYW5kbGUgKTsKCQkJCX0KCgkJCQlkZWxldGUgZXZlbnRzWyB0eXBlIF07CgkJCX0KCQl9CgoJCS8vIFJlbW92ZSBkYXRhIGFuZCB0aGUgZXhwYW5kbyBpZiBpdCdzIG5vIGxvbmdlciB1c2VkCgkJaWYgKCBqUXVlcnkuaXNFbXB0eU9iamVjdCggZXZlbnRzICkgKSB7CgkJCWRhdGFQcml2LnJlbW92ZSggZWxlbSwgImhhbmRsZSBldmVudHMiICk7CgkJfQoJfSwKCglkaXNwYXRjaDogZnVuY3Rpb24oIG5hdGl2ZUV2ZW50ICkgewoKCQkvLyBNYWtlIGEgd3JpdGFibGUgalF1ZXJ5LkV2ZW50IGZyb20gdGhlIG5hdGl2ZSBldmVudCBvYmplY3QKCQl2YXIgZXZlbnQgPSBqUXVlcnkuZXZlbnQuZml4KCBuYXRpdmVFdmVudCApOwoKCQl2YXIgaSwgaiwgcmV0LCBtYXRjaGVkLCBoYW5kbGVPYmosIGhhbmRsZXJRdWV1ZSwKCQkJYXJncyA9IG5ldyBBcnJheSggYXJndW1lbnRzLmxlbmd0aCApLAoJCQloYW5kbGVycyA9ICggZGF0YVByaXYuZ2V0KCB0aGlzLCAiZXZlbnRzIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSB8fCBbXSwKCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyBldmVudC50eXBlIF0gfHwge307CgoJCS8vIFVzZSB0aGUgZml4LWVkIGpRdWVyeS5FdmVudCByYXRoZXIgdGhhbiB0aGUgKHJlYWQtb25seSkgbmF0aXZlIGV2ZW50CgkJYXJnc1sgMCBdID0gZXZlbnQ7CgoJCWZvciAoIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrICkgewoJCQlhcmdzWyBpIF0gPSBhcmd1bWVudHNbIGkgXTsKCQl9CgoJCWV2ZW50LmRlbGVnYXRlVGFyZ2V0ID0gdGhpczsKCgkJLy8gQ2FsbCB0aGUgcHJlRGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVzaXJlZAoJCWlmICggc3BlY2lhbC5wcmVEaXNwYXRjaCAmJiBzcGVjaWFsLnByZURpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICkgPT09IGZhbHNlICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBEZXRlcm1pbmUgaGFuZGxlcnMKCQloYW5kbGVyUXVldWUgPSBqUXVlcnkuZXZlbnQuaGFuZGxlcnMuY2FsbCggdGhpcywgZXZlbnQsIGhhbmRsZXJzICk7CgoJCS8vIFJ1biBkZWxlZ2F0ZXMgZmlyc3Q7IHRoZXkgbWF5IHdhbnQgdG8gc3RvcCBwcm9wYWdhdGlvbiBiZW5lYXRoIHVzCgkJaSA9IDA7CgkJd2hpbGUgKCAoIG1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CgkJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSBtYXRjaGVkLmVsZW07CgoJCQlqID0gMDsKCQkJd2hpbGUgKCAoIGhhbmRsZU9iaiA9IG1hdGNoZWQuaGFuZGxlcnNbIGorKyBdICkgJiYKCQkJCSFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkgewoKCQkJCS8vIFRyaWdnZXJlZCBldmVudCBtdXN0IGVpdGhlciAxKSBoYXZlIG5vIG5hbWVzcGFjZSwgb3IgMikgaGF2ZSBuYW1lc3BhY2UocykKCQkJCS8vIGEgc3Vic2V0IG9yIGVxdWFsIHRvIHRob3NlIGluIHRoZSBib3VuZCBldmVudCAoYm90aCBjYW4gaGF2ZSBubyBuYW1lc3BhY2UpLgoJCQkJaWYgKCAhZXZlbnQucm5hbWVzcGFjZSB8fCBldmVudC5ybmFtZXNwYWNlLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApIHsKCgkJCQkJZXZlbnQuaGFuZGxlT2JqID0gaGFuZGxlT2JqOwoJCQkJCWV2ZW50LmRhdGEgPSBoYW5kbGVPYmouZGF0YTsKCgkJCQkJcmV0ID0gKCAoIGpRdWVyeS5ldmVudC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSApLmhhbmRsZSB8fAoJCQkJCQloYW5kbGVPYmouaGFuZGxlciApLmFwcGx5KCBtYXRjaGVkLmVsZW0sIGFyZ3MgKTsKCgkJCQkJaWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHsKCQkJCQkJaWYgKCAoIGV2ZW50LnJlc3VsdCA9IHJldCApID09PSBmYWxzZSApIHsKCQkJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJLy8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZQoJCWlmICggc3BlY2lhbC5wb3N0RGlzcGF0Y2ggKSB7CgkJCXNwZWNpYWwucG9zdERpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICk7CgkJfQoKCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJfSwKCgloYW5kbGVyczogZnVuY3Rpb24oIGV2ZW50LCBoYW5kbGVycyApIHsKCQl2YXIgaSwgaGFuZGxlT2JqLCBzZWwsIG1hdGNoZWRIYW5kbGVycywgbWF0Y2hlZFNlbGVjdG9ycywKCQkJaGFuZGxlclF1ZXVlID0gW10sCgkJCWRlbGVnYXRlQ291bnQgPSBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LAoJCQljdXIgPSBldmVudC50YXJnZXQ7CgoJCS8vIEZpbmQgZGVsZWdhdGUgaGFuZGxlcnMKCQlpZiAoIGRlbGVnYXRlQ291bnQgJiYKCgkJCS8vIFN1cHBvcnQ6IElFIDw9OQoJCQkvLyBCbGFjay1ob2xlIFNWRyA8dXNlPiBpbnN0YW5jZSB0cmVlcyAodHJhYy0xMzE4MCkKCQkJY3VyLm5vZGVUeXBlICYmCgoJCQkvLyBTdXBwb3J0OiBGaXJlZm94IDw9NDIKCQkJLy8gU3VwcHJlc3Mgc3BlYy12aW9sYXRpbmcgY2xpY2tzIGluZGljYXRpbmcgYSBub24tcHJpbWFyeSBwb2ludGVyIGJ1dHRvbiAodHJhYy0zODYxKQoJCQkvLyBodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudC10eXBlLWNsaWNrCgkJCS8vIFN1cHBvcnQ6IElFIDExIG9ubHkKCQkJLy8gLi4uYnV0IG5vdCBhcnJvdyBrZXkgImNsaWNrcyIgb2YgcmFkaW8gaW5wdXRzLCB3aGljaCBjYW4gaGF2ZSBgYnV0dG9uYCAtMSAoZ2gtMjM0MykKCQkJISggZXZlbnQudHlwZSA9PT0gImNsaWNrIiAmJiBldmVudC5idXR0b24gPj0gMSApICkgewoKCQkJZm9yICggOyBjdXIgIT09IHRoaXM7IGN1ciA9IGN1ci5wYXJlbnROb2RlIHx8IHRoaXMgKSB7CgoJCQkJLy8gRG9uJ3QgY2hlY2sgbm9uLWVsZW1lbnRzICgjMTMyMDgpCgkJCQkvLyBEb24ndCBwcm9jZXNzIGNsaWNrcyBvbiBkaXNhYmxlZCBlbGVtZW50cyAoIzY5MTEsICM4MTY1LCAjMTEzODIsICMxMTc2NCkKCQkJCWlmICggY3VyLm5vZGVUeXBlID09PSAxICYmICEoIGV2ZW50LnR5cGUgPT09ICJjbGljayIgJiYgY3VyLmRpc2FibGVkID09PSB0cnVlICkgKSB7CgkJCQkJbWF0Y2hlZEhhbmRsZXJzID0gW107CgkJCQkJbWF0Y2hlZFNlbGVjdG9ycyA9IHt9OwoJCQkJCWZvciAoIGkgPSAwOyBpIDwgZGVsZWdhdGVDb3VudDsgaSsrICkgewoJCQkJCQloYW5kbGVPYmogPSBoYW5kbGVyc1sgaSBdOwoKCQkJCQkJLy8gRG9uJ3QgY29uZmxpY3Qgd2l0aCBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKCMxMzIwMykKCQkJCQkJc2VsID0gaGFuZGxlT2JqLnNlbGVjdG9yICsgIiAiOwoKCQkJCQkJaWYgKCBtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSA9PT0gdW5kZWZpbmVkICkgewoJCQkJCQkJbWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gPSBoYW5kbGVPYmoubmVlZHNDb250ZXh0ID8KCQkJCQkJCQlqUXVlcnkoIHNlbCwgdGhpcyApLmluZGV4KCBjdXIgKSA+IC0xIDoKCQkJCQkJCQlqUXVlcnkuZmluZCggc2VsLCB0aGlzLCBudWxsLCBbIGN1ciBdICkubGVuZ3RoOwoJCQkJCQl9CgkJCQkJCWlmICggbWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gKSB7CgkJCQkJCQltYXRjaGVkSGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7CgkJCQkJCX0KCQkJCQl9CgkJCQkJaWYgKCBtYXRjaGVkSGFuZGxlcnMubGVuZ3RoICkgewoJCQkJCQloYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBtYXRjaGVkSGFuZGxlcnMgfSApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJLy8gQWRkIHRoZSByZW1haW5pbmcgKGRpcmVjdGx5LWJvdW5kKSBoYW5kbGVycwoJCWN1ciA9IHRoaXM7CgkJaWYgKCBkZWxlZ2F0ZUNvdW50IDwgaGFuZGxlcnMubGVuZ3RoICkgewoJCQloYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBoYW5kbGVycy5zbGljZSggZGVsZWdhdGVDb3VudCApIH0gKTsKCQl9CgoJCXJldHVybiBoYW5kbGVyUXVldWU7Cgl9LAoKCWFkZFByb3A6IGZ1bmN0aW9uKCBuYW1lLCBob29rICkgewoJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSggalF1ZXJ5LkV2ZW50LnByb3RvdHlwZSwgbmFtZSwgewoJCQllbnVtZXJhYmxlOiB0cnVlLAoJCQljb25maWd1cmFibGU6IHRydWUsCgoJCQlnZXQ6IGlzRnVuY3Rpb24oIGhvb2sgKSA/CgkJCQlmdW5jdGlvbigpIHsKCQkJCQlpZiAoIHRoaXMub3JpZ2luYWxFdmVudCApIHsKCQkJCQkJCXJldHVybiBob29rKCB0aGlzLm9yaWdpbmFsRXZlbnQgKTsKCQkJCQl9CgkJCQl9IDoKCQkJCWZ1bmN0aW9uKCkgewoJCQkJCWlmICggdGhpcy5vcmlnaW5hbEV2ZW50ICkgewoJCQkJCQkJcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFsgbmFtZSBdOwoJCQkJCX0KCQkJCX0sCgoJCQlzZXQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgbmFtZSwgewoJCQkJCWVudW1lcmFibGU6IHRydWUsCgkJCQkJY29uZmlndXJhYmxlOiB0cnVlLAoJCQkJCXdyaXRhYmxlOiB0cnVlLAoJCQkJCXZhbHVlOiB2YWx1ZQoJCQkJfSApOwoJCQl9CgkJfSApOwoJfSwKCglmaXg6IGZ1bmN0aW9uKCBvcmlnaW5hbEV2ZW50ICkgewoJCXJldHVybiBvcmlnaW5hbEV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID8KCQkJb3JpZ2luYWxFdmVudCA6CgkJCW5ldyBqUXVlcnkuRXZlbnQoIG9yaWdpbmFsRXZlbnQgKTsKCX0sCgoJc3BlY2lhbDogewoJCWxvYWQ6IHsKCgkJCS8vIFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZyb20gYnViYmxpbmcgdG8gd2luZG93LmxvYWQKCQkJbm9CdWJibGU6IHRydWUKCQl9LAoJCWZvY3VzOiB7CgoJCQkvLyBGaXJlIG5hdGl2ZSBldmVudCBpZiBwb3NzaWJsZSBzbyBibHVyL2ZvY3VzIHNlcXVlbmNlIGlzIGNvcnJlY3QKCQkJdHJpZ2dlcjogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIHRoaXMgIT09IHNhZmVBY3RpdmVFbGVtZW50KCkgJiYgdGhpcy5mb2N1cyApIHsKCQkJCQl0aGlzLmZvY3VzKCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9LAoJCQlkZWxlZ2F0ZVR5cGU6ICJmb2N1c2luIgoJCX0sCgkJYmx1cjogewoJCQl0cmlnZ2VyOiBmdW5jdGlvbigpIHsKCQkJCWlmICggdGhpcyA9PT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmJsdXIgKSB7CgkJCQkJdGhpcy5ibHVyKCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9LAoJCQlkZWxlZ2F0ZVR5cGU6ICJmb2N1c291dCIKCQl9LAoJCWNsaWNrOiB7CgoJCQkvLyBGb3IgY2hlY2tib3gsIGZpcmUgbmF0aXZlIGV2ZW50IHNvIGNoZWNrZWQgc3RhdGUgd2lsbCBiZSByaWdodAoJCQl0cmlnZ2VyOiBmdW5jdGlvbigpIHsKCQkJCWlmICggdGhpcy50eXBlID09PSAiY2hlY2tib3giICYmIHRoaXMuY2xpY2sgJiYgbm9kZU5hbWUoIHRoaXMsICJpbnB1dCIgKSApIHsKCQkJCQl0aGlzLmNsaWNrKCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9LAoKCQkJLy8gRm9yIGNyb3NzLWJyb3dzZXIgY29uc2lzdGVuY3ksIGRvbid0IGZpcmUgbmF0aXZlIC5jbGljaygpIG9uIGxpbmtzCgkJCV9kZWZhdWx0OiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQlyZXR1cm4gbm9kZU5hbWUoIGV2ZW50LnRhcmdldCwgImEiICk7CgkJCX0KCQl9LAoKCQliZWZvcmV1bmxvYWQ6IHsKCQkJcG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7CgoJCQkJLy8gU3VwcG9ydDogRmlyZWZveCAyMCsKCQkJCS8vIEZpcmVmb3ggZG9lc24ndCBhbGVydCBpZiB0aGUgcmV0dXJuVmFsdWUgZmllbGQgaXMgbm90IHNldC4KCQkJCWlmICggZXZlbnQucmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgZXZlbnQub3JpZ2luYWxFdmVudCApIHsKCQkJCQlldmVudC5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlID0gZXZlbnQucmVzdWx0OwoJCQkJfQoJCQl9CgkJfQoJfQp9OwoKalF1ZXJ5LnJlbW92ZUV2ZW50ID0gZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHsKCgkvLyBUaGlzICJpZiIgaXMgbmVlZGVkIGZvciBwbGFpbiBvYmplY3RzCglpZiAoIGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciApIHsKCQllbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIGhhbmRsZSApOwoJfQp9OwoKalF1ZXJ5LkV2ZW50ID0gZnVuY3Rpb24oIHNyYywgcHJvcHMgKSB7CgoJLy8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkCglpZiAoICEoIHRoaXMgaW5zdGFuY2VvZiBqUXVlcnkuRXZlbnQgKSApIHsKCQlyZXR1cm4gbmV3IGpRdWVyeS5FdmVudCggc3JjLCBwcm9wcyApOwoJfQoKCS8vIEV2ZW50IG9iamVjdAoJaWYgKCBzcmMgJiYgc3JjLnR5cGUgKSB7CgkJdGhpcy5vcmlnaW5hbEV2ZW50ID0gc3JjOwoJCXRoaXMudHlwZSA9IHNyYy50eXBlOwoKCQkvLyBFdmVudHMgYnViYmxpbmcgdXAgdGhlIGRvY3VtZW50IG1heSBoYXZlIGJlZW4gbWFya2VkIGFzIHByZXZlbnRlZAoJCS8vIGJ5IGEgaGFuZGxlciBsb3dlciBkb3duIHRoZSB0cmVlOyByZWZsZWN0IHRoZSBjb3JyZWN0IHZhbHVlLgoJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gc3JjLmRlZmF1bHRQcmV2ZW50ZWQgfHwKCQkJCXNyYy5kZWZhdWx0UHJldmVudGVkID09PSB1bmRlZmluZWQgJiYKCgkJCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9Mi4zIG9ubHkKCQkJCXNyYy5yZXR1cm5WYWx1ZSA9PT0gZmFsc2UgPwoJCQlyZXR1cm5UcnVlIDoKCQkJcmV0dXJuRmFsc2U7CgoJCS8vIENyZWF0ZSB0YXJnZXQgcHJvcGVydGllcwoJCS8vIFN1cHBvcnQ6IFNhZmFyaSA8PTYgLSA3IG9ubHkKCQkvLyBUYXJnZXQgc2hvdWxkIG5vdCBiZSBhIHRleHQgbm9kZSAoIzUwNCwgIzEzMTQzKQoJCXRoaXMudGFyZ2V0ID0gKCBzcmMudGFyZ2V0ICYmIHNyYy50YXJnZXQubm9kZVR5cGUgPT09IDMgKSA/CgkJCXNyYy50YXJnZXQucGFyZW50Tm9kZSA6CgkJCXNyYy50YXJnZXQ7CgoJCXRoaXMuY3VycmVudFRhcmdldCA9IHNyYy5jdXJyZW50VGFyZ2V0OwoJCXRoaXMucmVsYXRlZFRhcmdldCA9IHNyYy5yZWxhdGVkVGFyZ2V0OwoKCS8vIEV2ZW50IHR5cGUKCX0gZWxzZSB7CgkJdGhpcy50eXBlID0gc3JjOwoJfQoKCS8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0CglpZiAoIHByb3BzICkgewoJCWpRdWVyeS5leHRlbmQoIHRoaXMsIHByb3BzICk7Cgl9CgoJLy8gQ3JlYXRlIGEgdGltZXN0YW1wIGlmIGluY29taW5nIGV2ZW50IGRvZXNuJ3QgaGF2ZSBvbmUKCXRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1lU3RhbXAgfHwgRGF0ZS5ub3coKTsKCgkvLyBNYXJrIGl0IGFzIGZpeGVkCgl0aGlzWyBqUXVlcnkuZXhwYW5kbyBdID0gdHJ1ZTsKfTsKCi8vIGpRdWVyeS5FdmVudCBpcyBiYXNlZCBvbiBET00zIEV2ZW50cyBhcyBzcGVjaWZpZWQgYnkgdGhlIEVDTUFTY3JpcHQgTGFuZ3VhZ2UgQmluZGluZwovLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAwMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAwMzAzMzEvZWNtYS1zY3JpcHQtYmluZGluZy5odG1sCmpRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7Cgljb25zdHJ1Y3RvcjogalF1ZXJ5LkV2ZW50LAoJaXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSwKCWlzUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSwKCWlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSwKCWlzU2ltdWxhdGVkOiBmYWxzZSwKCglwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7CgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgoJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTsKCgkJaWYgKCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICkgewoJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJfQoJfSwKCXN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgoJCXRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwoKCQlpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7CgkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CgkJfQoJfSwKCXN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgoJCXRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwoKCQlpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7CgkJCWUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CgkJfQoKCQl0aGlzLnN0b3BQcm9wYWdhdGlvbigpOwoJfQp9OwoKLy8gSW5jbHVkZXMgYWxsIGNvbW1vbiBldmVudCBwcm9wcyBpbmNsdWRpbmcgS2V5RXZlbnQgYW5kIE1vdXNlRXZlbnQgc3BlY2lmaWMgcHJvcHMKalF1ZXJ5LmVhY2goIHsKCWFsdEtleTogdHJ1ZSwKCWJ1YmJsZXM6IHRydWUsCgljYW5jZWxhYmxlOiB0cnVlLAoJY2hhbmdlZFRvdWNoZXM6IHRydWUsCgljdHJsS2V5OiB0cnVlLAoJZGV0YWlsOiB0cnVlLAoJZXZlbnRQaGFzZTogdHJ1ZSwKCW1ldGFLZXk6IHRydWUsCglwYWdlWDogdHJ1ZSwKCXBhZ2VZOiB0cnVlLAoJc2hpZnRLZXk6IHRydWUsCgl2aWV3OiB0cnVlLAoJImNoYXIiOiB0cnVlLAoJY2hhckNvZGU6IHRydWUsCglrZXk6IHRydWUsCglrZXlDb2RlOiB0cnVlLAoJYnV0dG9uOiB0cnVlLAoJYnV0dG9uczogdHJ1ZSwKCWNsaWVudFg6IHRydWUsCgljbGllbnRZOiB0cnVlLAoJb2Zmc2V0WDogdHJ1ZSwKCW9mZnNldFk6IHRydWUsCglwb2ludGVySWQ6IHRydWUsCglwb2ludGVyVHlwZTogdHJ1ZSwKCXNjcmVlblg6IHRydWUsCglzY3JlZW5ZOiB0cnVlLAoJdGFyZ2V0VG91Y2hlczogdHJ1ZSwKCXRvRWxlbWVudDogdHJ1ZSwKCXRvdWNoZXM6IHRydWUsCgoJd2hpY2g6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgYnV0dG9uID0gZXZlbnQuYnV0dG9uOwoKCQkvLyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHMKCQlpZiAoIGV2ZW50LndoaWNoID09IG51bGwgJiYgcmtleUV2ZW50LnRlc3QoIGV2ZW50LnR5cGUgKSApIHsKCQkJcmV0dXJuIGV2ZW50LmNoYXJDb2RlICE9IG51bGwgPyBldmVudC5jaGFyQ29kZSA6IGV2ZW50LmtleUNvZGU7CgkJfQoKCQkvLyBBZGQgd2hpY2ggZm9yIGNsaWNrOiAxID09PSBsZWZ0OyAyID09PSBtaWRkbGU7IDMgPT09IHJpZ2h0CgkJaWYgKCAhZXZlbnQud2hpY2ggJiYgYnV0dG9uICE9PSB1bmRlZmluZWQgJiYgcm1vdXNlRXZlbnQudGVzdCggZXZlbnQudHlwZSApICkgewoJCQlpZiAoIGJ1dHRvbiAmIDEgKSB7CgkJCQlyZXR1cm4gMTsKCQkJfQoKCQkJaWYgKCBidXR0b24gJiAyICkgewoJCQkJcmV0dXJuIDM7CgkJCX0KCgkJCWlmICggYnV0dG9uICYgNCApIHsKCQkJCXJldHVybiAyOwoJCQl9CgoJCQlyZXR1cm4gMDsKCQl9CgoJCXJldHVybiBldmVudC53aGljaDsKCX0KfSwgalF1ZXJ5LmV2ZW50LmFkZFByb3AgKTsKCi8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZlIGV2ZW50cyB1c2luZyBtb3VzZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrcwovLyBzbyB0aGF0IGV2ZW50IGRlbGVnYXRpb24gd29ya3MgaW4galF1ZXJ5LgovLyBEbyB0aGUgc2FtZSBmb3IgcG9pbnRlcmVudGVyL3BvaW50ZXJsZWF2ZSBhbmQgcG9pbnRlcm92ZXIvcG9pbnRlcm91dAovLwovLyBTdXBwb3J0OiBTYWZhcmkgNyBvbmx5Ci8vIFNhZmFyaSBzZW5kcyBtb3VzZWVudGVyIHRvbyBvZnRlbjsgc2VlOgovLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NzAyNTgKLy8gZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYnVnIChpdCBleGlzdGVkIGluIG9sZGVyIENocm9tZSB2ZXJzaW9ucyBhcyB3ZWxsKS4KalF1ZXJ5LmVhY2goIHsKCW1vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLAoJbW91c2VsZWF2ZTogIm1vdXNlb3V0IiwKCXBvaW50ZXJlbnRlcjogInBvaW50ZXJvdmVyIiwKCXBvaW50ZXJsZWF2ZTogInBvaW50ZXJvdXQiCn0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7CglqUXVlcnkuZXZlbnQuc3BlY2lhbFsgb3JpZyBdID0gewoJCWRlbGVnYXRlVHlwZTogZml4LAoJCWJpbmRUeXBlOiBmaXgsCgoJCWhhbmRsZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQl2YXIgcmV0LAoJCQkJdGFyZ2V0ID0gdGhpcywKCQkJCXJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0LAoJCQkJaGFuZGxlT2JqID0gZXZlbnQuaGFuZGxlT2JqOwoKCQkJLy8gRm9yIG1vdXNlZW50ZXIvbGVhdmUgY2FsbCB0aGUgaGFuZGxlciBpZiByZWxhdGVkIGlzIG91dHNpZGUgdGhlIHRhcmdldC4KCQkJLy8gTkI6IE5vIHJlbGF0ZWRUYXJnZXQgaWYgdGhlIG1vdXNlIGxlZnQvZW50ZXJlZCB0aGUgYnJvd3NlciB3aW5kb3cKCQkJaWYgKCAhcmVsYXRlZCB8fCAoIHJlbGF0ZWQgIT09IHRhcmdldCAmJiAhalF1ZXJ5LmNvbnRhaW5zKCB0YXJnZXQsIHJlbGF0ZWQgKSApICkgewoJCQkJZXZlbnQudHlwZSA9IGhhbmRsZU9iai5vcmlnVHlwZTsKCQkJCXJldCA9IGhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJCWV2ZW50LnR5cGUgPSBmaXg7CgkJCX0KCQkJcmV0dXJuIHJldDsKCQl9Cgl9Owp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CgoJb246IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICkgewoJCXJldHVybiBvbiggdGhpcywgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApOwoJfSwKCW9uZTogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7CgkJcmV0dXJuIG9uKCB0aGlzLCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuLCAxICk7Cgl9LAoJb2ZmOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBmbiApIHsKCQl2YXIgaGFuZGxlT2JqLCB0eXBlOwoJCWlmICggdHlwZXMgJiYgdHlwZXMucHJldmVudERlZmF1bHQgJiYgdHlwZXMuaGFuZGxlT2JqICkgewoKCQkJLy8gKCBldmVudCApICBkaXNwYXRjaGVkIGpRdWVyeS5FdmVudAoJCQloYW5kbGVPYmogPSB0eXBlcy5oYW5kbGVPYmo7CgkJCWpRdWVyeSggdHlwZXMuZGVsZWdhdGVUYXJnZXQgKS5vZmYoCgkJCQloYW5kbGVPYmoubmFtZXNwYWNlID8KCQkJCQloYW5kbGVPYmoub3JpZ1R5cGUgKyAiLiIgKyBoYW5kbGVPYmoubmFtZXNwYWNlIDoKCQkJCQloYW5kbGVPYmoub3JpZ1R5cGUsCgkJCQloYW5kbGVPYmouc2VsZWN0b3IsCgkJCQloYW5kbGVPYmouaGFuZGxlcgoJCQkpOwoJCQlyZXR1cm4gdGhpczsKCQl9CgkJaWYgKCB0eXBlb2YgdHlwZXMgPT09ICJvYmplY3QiICkgewoKCQkJLy8gKCB0eXBlcy1vYmplY3QgWywgc2VsZWN0b3JdICkKCQkJZm9yICggdHlwZSBpbiB0eXBlcyApIHsKCQkJCXRoaXMub2ZmKCB0eXBlLCBzZWxlY3RvciwgdHlwZXNbIHR5cGUgXSApOwoJCQl9CgkJCXJldHVybiB0aGlzOwoJCX0KCQlpZiAoIHNlbGVjdG9yID09PSBmYWxzZSB8fCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJmdW5jdGlvbiIgKSB7CgoJCQkvLyAoIHR5cGVzIFssIGZuXSApCgkJCWZuID0gc2VsZWN0b3I7CgkJCXNlbGVjdG9yID0gdW5kZWZpbmVkOwoJCX0KCQlpZiAoIGZuID09PSBmYWxzZSApIHsKCQkJZm4gPSByZXR1cm5GYWxzZTsKCQl9CgkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIHR5cGVzLCBmbiwgc2VsZWN0b3IgKTsKCQl9ICk7Cgl9Cn0gKTsKCgp2YXIKCgkvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovCgoJLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2lzc3Vlcy8zMjI5CglyeGh0bWxUYWcgPSAvPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKilbXj5dKilcLz4vZ2ksCgoJLyogZXNsaW50LWVuYWJsZSAqLwoKCS8vIFN1cHBvcnQ6IElFIDw9MTAgLSAxMSwgRWRnZSAxMiAtIDEzIG9ubHkKCS8vIEluIElFL0VkZ2UgdXNpbmcgcmVnZXggZ3JvdXBzIGhlcmUgY2F1c2VzIHNldmVyZSBzbG93ZG93bnMuCgkvLyBTZWUgaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2svZGV0YWlscy8xNzM2NTEyLwoJcm5vSW5uZXJodG1sID0gLzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksCgoJLy8gY2hlY2tlZD0iY2hlY2tlZCIgb3IgY2hlY2tlZAoJcmNoZWNrZWQgPSAvY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSwKCXJjbGVhblNjcmlwdCA9IC9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZzsKCi8vIFByZWZlciBhIHRib2R5IG92ZXIgaXRzIHBhcmVudCB0YWJsZSBmb3IgY29udGFpbmluZyBuZXcgcm93cwpmdW5jdGlvbiBtYW5pcHVsYXRpb25UYXJnZXQoIGVsZW0sIGNvbnRlbnQgKSB7CglpZiAoIG5vZGVOYW1lKCBlbGVtLCAidGFibGUiICkgJiYKCQlub2RlTmFtZSggY29udGVudC5ub2RlVHlwZSAhPT0gMTEgPyBjb250ZW50IDogY29udGVudC5maXJzdENoaWxkLCAidHIiICkgKSB7CgoJCXJldHVybiBqUXVlcnkoIGVsZW0gKS5jaGlsZHJlbiggInRib2R5IiApWyAwIF0gfHwgZWxlbTsKCX0KCglyZXR1cm4gZWxlbTsKfQoKLy8gUmVwbGFjZS9yZXN0b3JlIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiBzY3JpcHQgZWxlbWVudHMgZm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvbgpmdW5jdGlvbiBkaXNhYmxlU2NyaXB0KCBlbGVtICkgewoJZWxlbS50eXBlID0gKCBlbGVtLmdldEF0dHJpYnV0ZSggInR5cGUiICkgIT09IG51bGwgKSArICIvIiArIGVsZW0udHlwZTsKCXJldHVybiBlbGVtOwp9CmZ1bmN0aW9uIHJlc3RvcmVTY3JpcHQoIGVsZW0gKSB7CglpZiAoICggZWxlbS50eXBlIHx8ICIiICkuc2xpY2UoIDAsIDUgKSA9PT0gInRydWUvIiApIHsKCQllbGVtLnR5cGUgPSBlbGVtLnR5cGUuc2xpY2UoIDUgKTsKCX0gZWxzZSB7CgkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoICJ0eXBlIiApOwoJfQoKCXJldHVybiBlbGVtOwp9CgpmdW5jdGlvbiBjbG9uZUNvcHlFdmVudCggc3JjLCBkZXN0ICkgewoJdmFyIGksIGwsIHR5cGUsIHBkYXRhT2xkLCBwZGF0YUN1ciwgdWRhdGFPbGQsIHVkYXRhQ3VyLCBldmVudHM7CgoJaWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxICkgewoJCXJldHVybjsKCX0KCgkvLyAxLiBDb3B5IHByaXZhdGUgZGF0YTogZXZlbnRzLCBoYW5kbGVycywgZXRjLgoJaWYgKCBkYXRhUHJpdi5oYXNEYXRhKCBzcmMgKSApIHsKCQlwZGF0YU9sZCA9IGRhdGFQcml2LmFjY2Vzcyggc3JjICk7CgkJcGRhdGFDdXIgPSBkYXRhUHJpdi5zZXQoIGRlc3QsIHBkYXRhT2xkICk7CgkJZXZlbnRzID0gcGRhdGFPbGQuZXZlbnRzOwoKCQlpZiAoIGV2ZW50cyApIHsKCQkJZGVsZXRlIHBkYXRhQ3VyLmhhbmRsZTsKCQkJcGRhdGFDdXIuZXZlbnRzID0ge307CgoJCQlmb3IgKCB0eXBlIGluIGV2ZW50cyApIHsKCQkJCWZvciAoIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUsIGV2ZW50c1sgdHlwZSBdWyBpIF0gKTsKCQkJCX0KCQkJfQoJCX0KCX0KCgkvLyAyLiBDb3B5IHVzZXIgZGF0YQoJaWYgKCBkYXRhVXNlci5oYXNEYXRhKCBzcmMgKSApIHsKCQl1ZGF0YU9sZCA9IGRhdGFVc2VyLmFjY2Vzcyggc3JjICk7CgkJdWRhdGFDdXIgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgdWRhdGFPbGQgKTsKCgkJZGF0YVVzZXIuc2V0KCBkZXN0LCB1ZGF0YUN1ciApOwoJfQp9CgovLyBGaXggSUUgYnVncywgc2VlIHN1cHBvcnQgdGVzdHMKZnVuY3Rpb24gZml4SW5wdXQoIHNyYywgZGVzdCApIHsKCXZhciBub2RlTmFtZSA9IGRlc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCgkvLyBGYWlscyB0byBwZXJzaXN0IHRoZSBjaGVja2VkIHN0YXRlIG9mIGEgY2xvbmVkIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvbi4KCWlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgJiYgcmNoZWNrYWJsZVR5cGUudGVzdCggc3JjLnR5cGUgKSApIHsKCQlkZXN0LmNoZWNrZWQgPSBzcmMuY2hlY2tlZDsKCgkvLyBGYWlscyB0byByZXR1cm4gdGhlIHNlbGVjdGVkIG9wdGlvbiB0byB0aGUgZGVmYXVsdCBzZWxlY3RlZCBzdGF0ZSB3aGVuIGNsb25pbmcgb3B0aW9ucwoJfSBlbHNlIGlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgfHwgbm9kZU5hbWUgPT09ICJ0ZXh0YXJlYSIgKSB7CgkJZGVzdC5kZWZhdWx0VmFsdWUgPSBzcmMuZGVmYXVsdFZhbHVlOwoJfQp9CgpmdW5jdGlvbiBkb21NYW5pcCggY29sbGVjdGlvbiwgYXJncywgY2FsbGJhY2ssIGlnbm9yZWQgKSB7CgoJLy8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5cwoJYXJncyA9IGNvbmNhdC5hcHBseSggW10sIGFyZ3MgKTsKCgl2YXIgZnJhZ21lbnQsIGZpcnN0LCBzY3JpcHRzLCBoYXNTY3JpcHRzLCBub2RlLCBkb2MsCgkJaSA9IDAsCgkJbCA9IGNvbGxlY3Rpb24ubGVuZ3RoLAoJCWlOb0Nsb25lID0gbCAtIDEsCgkJdmFsdWUgPSBhcmdzWyAwIF0sCgkJdmFsdWVJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiggdmFsdWUgKTsKCgkvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXQKCWlmICggdmFsdWVJc0Z1bmN0aW9uIHx8CgkJCSggbCA+IDEgJiYgdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiAmJgoJCQkJIXN1cHBvcnQuY2hlY2tDbG9uZSAmJiByY2hlY2tlZC50ZXN0KCB2YWx1ZSApICkgKSB7CgkJcmV0dXJuIGNvbGxlY3Rpb24uZWFjaCggZnVuY3Rpb24oIGluZGV4ICkgewoJCQl2YXIgc2VsZiA9IGNvbGxlY3Rpb24uZXEoIGluZGV4ICk7CgkJCWlmICggdmFsdWVJc0Z1bmN0aW9uICkgewoJCQkJYXJnc1sgMCBdID0gdmFsdWUuY2FsbCggdGhpcywgaW5kZXgsIHNlbGYuaHRtbCgpICk7CgkJCX0KCQkJZG9tTWFuaXAoIHNlbGYsIGFyZ3MsIGNhbGxiYWNrLCBpZ25vcmVkICk7CgkJfSApOwoJfQoKCWlmICggbCApIHsKCQlmcmFnbWVudCA9IGJ1aWxkRnJhZ21lbnQoIGFyZ3MsIGNvbGxlY3Rpb25bIDAgXS5vd25lckRvY3VtZW50LCBmYWxzZSwgY29sbGVjdGlvbiwgaWdub3JlZCApOwoJCWZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsKCgkJaWYgKCBmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSApIHsKCQkJZnJhZ21lbnQgPSBmaXJzdDsKCQl9CgoJCS8vIFJlcXVpcmUgZWl0aGVyIG5ldyBjb250ZW50IG9yIGFuIGludGVyZXN0IGluIGlnbm9yZWQgZWxlbWVudHMgdG8gaW52b2tlIHRoZSBjYWxsYmFjawoJCWlmICggZmlyc3QgfHwgaWdub3JlZCApIHsKCQkJc2NyaXB0cyA9IGpRdWVyeS5tYXAoIGdldEFsbCggZnJhZ21lbnQsICJzY3JpcHQiICksIGRpc2FibGVTY3JpcHQgKTsKCQkJaGFzU2NyaXB0cyA9IHNjcmlwdHMubGVuZ3RoOwoKCQkJLy8gVXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbQoJCQkvLyBpbnN0ZWFkIG9mIHRoZSBmaXJzdCBiZWNhdXNlIGl0IGNhbiBlbmQgdXAKCQkJLy8gYmVpbmcgZW1wdGllZCBpbmNvcnJlY3RseSBpbiBjZXJ0YWluIHNpdHVhdGlvbnMgKCM4MDcwKS4KCQkJZm9yICggOyBpIDwgbDsgaSsrICkgewoJCQkJbm9kZSA9IGZyYWdtZW50OwoKCQkJCWlmICggaSAhPT0gaU5vQ2xvbmUgKSB7CgkJCQkJbm9kZSA9IGpRdWVyeS5jbG9uZSggbm9kZSwgdHJ1ZSwgdHJ1ZSApOwoKCQkJCQkvLyBLZWVwIHJlZmVyZW5jZXMgdG8gY2xvbmVkIHNjcmlwdHMgZm9yIGxhdGVyIHJlc3RvcmF0aW9uCgkJCQkJaWYgKCBoYXNTY3JpcHRzICkgewoKCQkJCQkJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5CgkJCQkJCS8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJCQkJalF1ZXJ5Lm1lcmdlKCBzY3JpcHRzLCBnZXRBbGwoIG5vZGUsICJzY3JpcHQiICkgKTsKCQkJCQl9CgkJCQl9CgoJCQkJY2FsbGJhY2suY2FsbCggY29sbGVjdGlvblsgaSBdLCBub2RlLCBpICk7CgkJCX0KCgkJCWlmICggaGFzU2NyaXB0cyApIHsKCQkJCWRvYyA9IHNjcmlwdHNbIHNjcmlwdHMubGVuZ3RoIC0gMSBdLm93bmVyRG9jdW1lbnQ7CgoJCQkJLy8gUmVlbmFibGUgc2NyaXB0cwoJCQkJalF1ZXJ5Lm1hcCggc2NyaXB0cywgcmVzdG9yZVNjcmlwdCApOwoKCQkJCS8vIEV2YWx1YXRlIGV4ZWN1dGFibGUgc2NyaXB0cyBvbiBmaXJzdCBkb2N1bWVudCBpbnNlcnRpb24KCQkJCWZvciAoIGkgPSAwOyBpIDwgaGFzU2NyaXB0czsgaSsrICkgewoJCQkJCW5vZGUgPSBzY3JpcHRzWyBpIF07CgkJCQkJaWYgKCByc2NyaXB0VHlwZS50ZXN0KCBub2RlLnR5cGUgfHwgIiIgKSAmJgoJCQkJCQkhZGF0YVByaXYuYWNjZXNzKCBub2RlLCAiZ2xvYmFsRXZhbCIgKSAmJgoJCQkJCQlqUXVlcnkuY29udGFpbnMoIGRvYywgbm9kZSApICkgewoKCQkJCQkJaWYgKCBub2RlLnNyYyAmJiAoIG5vZGUudHlwZSB8fCAiIiApLnRvTG93ZXJDYXNlKCkgICE9PSAibW9kdWxlIiApIHsKCgkJCQkJCQkvLyBPcHRpb25hbCBBSkFYIGRlcGVuZGVuY3ksIGJ1dCB3b24ndCBydW4gc2NyaXB0cyBpZiBub3QgcHJlc2VudAoJCQkJCQkJaWYgKCBqUXVlcnkuX2V2YWxVcmwgKSB7CgkJCQkJCQkJalF1ZXJ5Ll9ldmFsVXJsKCBub2RlLnNyYyApOwoJCQkJCQkJfQoJCQkJCQl9IGVsc2UgewoJCQkJCQkJRE9NRXZhbCggbm9kZS50ZXh0Q29udGVudC5yZXBsYWNlKCByY2xlYW5TY3JpcHQsICIiICksIGRvYywgbm9kZSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfQoKCXJldHVybiBjb2xsZWN0aW9uOwp9CgpmdW5jdGlvbiByZW1vdmUoIGVsZW0sIHNlbGVjdG9yLCBrZWVwRGF0YSApIHsKCXZhciBub2RlLAoJCW5vZGVzID0gc2VsZWN0b3IgPyBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgZWxlbSApIDogZWxlbSwKCQlpID0gMDsKCglmb3IgKCA7ICggbm9kZSA9IG5vZGVzWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7CgkJaWYgKCAha2VlcERhdGEgJiYgbm9kZS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBub2RlICkgKTsKCQl9CgoJCWlmICggbm9kZS5wYXJlbnROb2RlICkgewoJCQlpZiAoIGtlZXBEYXRhICYmIGpRdWVyeS5jb250YWlucyggbm9kZS5vd25lckRvY3VtZW50LCBub2RlICkgKSB7CgkJCQlzZXRHbG9iYWxFdmFsKCBnZXRBbGwoIG5vZGUsICJzY3JpcHQiICkgKTsKCQkJfQoJCQlub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIG5vZGUgKTsKCQl9Cgl9CgoJcmV0dXJuIGVsZW07Cn0KCmpRdWVyeS5leHRlbmQoIHsKCWh0bWxQcmVmaWx0ZXI6IGZ1bmN0aW9uKCBodG1sICkgewoJCXJldHVybiBodG1sLnJlcGxhY2UoIHJ4aHRtbFRhZywgIjwkMT48LyQyPiIgKTsKCX0sCgoJY2xvbmU6IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQl2YXIgaSwgbCwgc3JjRWxlbWVudHMsIGRlc3RFbGVtZW50cywKCQkJY2xvbmUgPSBlbGVtLmNsb25lTm9kZSggdHJ1ZSApLAoJCQlpblBhZ2UgPSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApOwoKCQkvLyBGaXggSUUgY2xvbmluZyBpc3N1ZXMKCQlpZiAoICFzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkICYmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBlID09PSAxMSApICYmCgkJCQkhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7CgoJCQkvLyBXZSBlc2NoZXcgU2l6emxlIGhlcmUgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnM6IGh0dHBzOi8vanNwZXJmLmNvbS9nZXRhbGwtdnMtc2l6emxlLzIKCQkJZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSApOwoJCQlzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApOwoKCQkJZm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQlmaXhJbnB1dCggc3JjRWxlbWVudHNbIGkgXSwgZGVzdEVsZW1lbnRzWyBpIF0gKTsKCQkJfQoJCX0KCgkJLy8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZQoJCWlmICggZGF0YUFuZEV2ZW50cyApIHsKCQkJaWYgKCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQkJCXNyY0VsZW1lbnRzID0gc3JjRWxlbWVudHMgfHwgZ2V0QWxsKCBlbGVtICk7CgkJCQlkZXN0RWxlbWVudHMgPSBkZXN0RWxlbWVudHMgfHwgZ2V0QWxsKCBjbG9uZSApOwoKCQkJCWZvciAoIGkgPSAwLCBsID0gc3JjRWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWNsb25lQ29weUV2ZW50KCBzcmNFbGVtZW50c1sgaSBdLCBkZXN0RWxlbWVudHNbIGkgXSApOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJY2xvbmVDb3B5RXZlbnQoIGVsZW0sIGNsb25lICk7CgkJCX0KCQl9CgoJCS8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3RvcnkKCQlkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCAic2NyaXB0IiApOwoJCWlmICggZGVzdEVsZW1lbnRzLmxlbmd0aCA+IDAgKSB7CgkJCXNldEdsb2JhbEV2YWwoIGRlc3RFbGVtZW50cywgIWluUGFnZSAmJiBnZXRBbGwoIGVsZW0sICJzY3JpcHQiICkgKTsKCQl9CgoJCS8vIFJldHVybiB0aGUgY2xvbmVkIHNldAoJCXJldHVybiBjbG9uZTsKCX0sCgoJY2xlYW5EYXRhOiBmdW5jdGlvbiggZWxlbXMgKSB7CgkJdmFyIGRhdGEsIGVsZW0sIHR5cGUsCgkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbCwKCQkJaSA9IDA7CgoJCWZvciAoIDsgKCBlbGVtID0gZWxlbXNbIGkgXSApICE9PSB1bmRlZmluZWQ7IGkrKyApIHsKCQkJaWYgKCBhY2NlcHREYXRhKCBlbGVtICkgKSB7CgkJCQlpZiAoICggZGF0YSA9IGVsZW1bIGRhdGFQcml2LmV4cGFuZG8gXSApICkgewoJCQkJCWlmICggZGF0YS5ldmVudHMgKSB7CgkJCQkJCWZvciAoIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7CgkJCQkJCQlpZiAoIHNwZWNpYWxbIHR5cGUgXSApIHsKCQkJCQkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICk7CgoJCQkJCQkJLy8gVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGF2b2lkIGpRdWVyeS5ldmVudC5yZW1vdmUncyBvdmVyaGVhZAoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQlqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGRhdGEuaGFuZGxlICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUrCgkJCQkJLy8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlCgkJCQkJZWxlbVsgZGF0YVByaXYuZXhwYW5kbyBdID0gdW5kZWZpbmVkOwoJCQkJfQoJCQkJaWYgKCBlbGVtWyBkYXRhVXNlci5leHBhbmRvIF0gKSB7CgoJCQkJCS8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUrCgkJCQkJLy8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlCgkJCQkJZWxlbVsgZGF0YVVzZXIuZXhwYW5kbyBdID0gdW5kZWZpbmVkOwoJCQkJfQoJCQl9CgkJfQoJfQp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CglkZXRhY2g6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlyZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciwgdHJ1ZSApOwoJfSwKCglyZW1vdmU6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlyZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciApOwoJfSwKCgl0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJcmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkgewoJCQlyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/CgkJCQlqUXVlcnkudGV4dCggdGhpcyApIDoKCQkJCXRoaXMuZW1wdHkoKS5lYWNoKCBmdW5jdGlvbigpIHsKCQkJCQlpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCQkJdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlOwoJCQkJCX0KCQkJCX0gKTsKCQl9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApOwoJfSwKCglhcHBlbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJaWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7CgkJCQl2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7CgkJCQl0YXJnZXQuYXBwZW5kQ2hpbGQoIGVsZW0gKTsKCQkJfQoJCX0gKTsKCX0sCgoJcHJlcGVuZDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCXZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTsKCQkJCXRhcmdldC5pbnNlcnRCZWZvcmUoIGVsZW0sIHRhcmdldC5maXJzdENoaWxkICk7CgkJCX0KCQl9ICk7Cgl9LAoKCWJlZm9yZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlpZiAoIHRoaXMucGFyZW50Tm9kZSApIHsKCQkJCXRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMgKTsKCQkJfQoJCX0gKTsKCX0sCgoJYWZ0ZXI6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJaWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7CgkJCQl0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7CgkJCX0KCQl9ICk7Cgl9LAoKCWVtcHR5OiBmdW5jdGlvbigpIHsKCQl2YXIgZWxlbSwKCQkJaSA9IDA7CgoJCWZvciAoIDsgKCBlbGVtID0gdGhpc1sgaSBdICkgIT0gbnVsbDsgaSsrICkgewoJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgoJCQkJLy8gUHJldmVudCBtZW1vcnkgbGVha3MKCQkJCWpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApOwoKCQkJCS8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG5vZGVzCgkJCQllbGVtLnRleHRDb250ZW50ID0gIiI7CgkJCX0KCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgljbG9uZTogZnVuY3Rpb24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkgewoJCWRhdGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRzID09IG51bGwgPyBmYWxzZSA6IGRhdGFBbmRFdmVudHM7CgkJZGVlcERhdGFBbmRFdmVudHMgPSBkZWVwRGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZGF0YUFuZEV2ZW50cyA6IGRlZXBEYXRhQW5kRXZlbnRzOwoKCQlyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4galF1ZXJ5LmNsb25lKCB0aGlzLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApOwoJCX0gKTsKCX0sCgoJaHRtbDogZnVuY3Rpb24oIHZhbHVlICkgewoJCXJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJdmFyIGVsZW0gPSB0aGlzWyAwIF0gfHwge30sCgkJCQlpID0gMCwKCQkJCWwgPSB0aGlzLmxlbmd0aDsKCgkJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJcmV0dXJuIGVsZW0uaW5uZXJIVE1MOwoJCQl9CgoJCQkvLyBTZWUgaWYgd2UgY2FuIHRha2UgYSBzaG9ydGN1dCBhbmQganVzdCB1c2UgaW5uZXJIVE1MCgkJCWlmICggdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiAmJiAhcm5vSW5uZXJodG1sLnRlc3QoIHZhbHVlICkgJiYKCQkJCSF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyAiIiwgIiIgXSApWyAxIF0udG9Mb3dlckNhc2UoKSBdICkgewoKCQkJCXZhbHVlID0galF1ZXJ5Lmh0bWxQcmVmaWx0ZXIoIHZhbHVlICk7CgoJCQkJdHJ5IHsKCQkJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJCQkJCWVsZW0gPSB0aGlzWyBpIF0gfHwge307CgoJCQkJCQkvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3MKCQkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtLCBmYWxzZSApICk7CgkJCQkJCQllbGVtLmlubmVySFRNTCA9IHZhbHVlOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQllbGVtID0gMDsKCgkJCQkvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2QKCQkJCX0gY2F0Y2ggKCBlICkge30KCQkJfQoKCQkJaWYgKCBlbGVtICkgewoJCQkJdGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTsKCQkJfQoJCX0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7Cgl9LAoKCXJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHsKCQl2YXIgaWdub3JlZCA9IFtdOwoKCQkvLyBNYWtlIHRoZSBjaGFuZ2VzLCByZXBsYWNpbmcgZWFjaCBub24taWdub3JlZCBjb250ZXh0IGVsZW1lbnQgd2l0aCB0aGUgbmV3IGNvbnRlbnQKCQlyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CgoJCQlpZiAoIGpRdWVyeS5pbkFycmF5KCB0aGlzLCBpZ25vcmVkICkgPCAwICkgewoJCQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCB0aGlzICkgKTsKCQkJCWlmICggcGFyZW50ICkgewoJCQkJCXBhcmVudC5yZXBsYWNlQ2hpbGQoIGVsZW0sIHRoaXMgKTsKCQkJCX0KCQkJfQoKCQkvLyBGb3JjZSBjYWxsYmFjayBpbnZvY2F0aW9uCgkJfSwgaWdub3JlZCApOwoJfQp9ICk7CgpqUXVlcnkuZWFjaCggewoJYXBwZW5kVG86ICJhcHBlbmQiLAoJcHJlcGVuZFRvOiAicHJlcGVuZCIsCglpbnNlcnRCZWZvcmU6ICJiZWZvcmUiLAoJaW5zZXJ0QWZ0ZXI6ICJhZnRlciIsCglyZXBsYWNlQWxsOiAicmVwbGFjZVdpdGgiCn0sIGZ1bmN0aW9uKCBuYW1lLCBvcmlnaW5hbCApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciBlbGVtcywKCQkJcmV0ID0gW10sCgkJCWluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKSwKCQkJbGFzdCA9IGluc2VydC5sZW5ndGggLSAxLAoJCQlpID0gMDsKCgkJZm9yICggOyBpIDw9IGxhc3Q7IGkrKyApIHsKCQkJZWxlbXMgPSBpID09PSBsYXN0ID8gdGhpcyA6IHRoaXMuY2xvbmUoIHRydWUgKTsKCQkJalF1ZXJ5KCBpbnNlcnRbIGkgXSApWyBvcmlnaW5hbCBdKCBlbGVtcyApOwoKCQkJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5CgkJCS8vIC5nZXQoKSBiZWNhdXNlIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJcHVzaC5hcHBseSggcmV0LCBlbGVtcy5nZXQoKSApOwoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQgKTsKCX07Cn0gKTsKdmFyIHJudW1ub25weCA9IG5ldyBSZWdFeHAoICJeKCIgKyBwbnVtICsgIikoPyFweClbYS16JV0rJCIsICJpIiApOwoKdmFyIGdldFN0eWxlcyA9IGZ1bmN0aW9uKCBlbGVtICkgewoKCQkvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHksIEZpcmVmb3ggPD0zMCAoIzE1MDk4LCAjMTQxNTApCgkJLy8gSUUgdGhyb3dzIG9uIGVsZW1lbnRzIGNyZWF0ZWQgaW4gcG9wdXBzCgkJLy8gRkYgbWVhbndoaWxlIHRocm93cyBvbiBmcmFtZSBlbGVtZW50cyB0aHJvdWdoICJkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlIgoJCXZhciB2aWV3ID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3OwoKCQlpZiAoICF2aWV3IHx8ICF2aWV3Lm9wZW5lciApIHsKCQkJdmlldyA9IHdpbmRvdzsKCQl9CgoJCXJldHVybiB2aWV3LmdldENvbXB1dGVkU3R5bGUoIGVsZW0gKTsKCX07Cgp2YXIgcmJveFN0eWxlID0gbmV3IFJlZ0V4cCggY3NzRXhwYW5kLmpvaW4oICJ8IiApLCAiaSIgKTsKCgoKKCBmdW5jdGlvbigpIHsKCgkvLyBFeGVjdXRpbmcgYm90aCBwaXhlbFBvc2l0aW9uICYgYm94U2l6aW5nUmVsaWFibGUgdGVzdHMgcmVxdWlyZSBvbmx5IG9uZSBsYXlvdXQKCS8vIHNvIHRoZXkncmUgZXhlY3V0ZWQgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHRoZSBzZWNvbmQgY29tcHV0YXRpb24uCglmdW5jdGlvbiBjb21wdXRlU3R5bGVUZXN0cygpIHsKCgkJLy8gVGhpcyBpcyBhIHNpbmdsZXRvbiwgd2UgbmVlZCB0byBleGVjdXRlIGl0IG9ubHkgb25jZQoJCWlmICggIWRpdiApIHsKCQkJcmV0dXJuOwoJCX0KCgkJY29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSAicG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4OyIgKwoJCQkibWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowIjsKCQlkaXYuc3R5bGUuY3NzVGV4dCA9CgkJCSJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7IiArCgkJCSJtYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4OyIgKwoJCQkid2lkdGg6NjAlO3RvcDoxJSI7CgkJZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKCBjb250YWluZXIgKS5hcHBlbmRDaGlsZCggZGl2ICk7CgoJCXZhciBkaXZTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBkaXYgKTsKCQlwaXhlbFBvc2l0aW9uVmFsID0gZGl2U3R5bGUudG9wICE9PSAiMSUiOwoKCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBGaXJlZm94IDw9MyAtIDQ0CgkJcmVsaWFibGVNYXJnaW5MZWZ0VmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS5tYXJnaW5MZWZ0ICkgPT09IDEyOwoKCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBTYWZhcmkgPD05LjEgLSAxMC4xLCBpT1MgPD03LjAgLSA5LjMKCQkvLyBTb21lIHN0eWxlcyBjb21lIGJhY2sgd2l0aCBwZXJjZW50YWdlIHZhbHVlcywgZXZlbiB0aG91Z2ggdGhleSBzaG91bGRuJ3QKCQlkaXYuc3R5bGUucmlnaHQgPSAiNjAlIjsKCQlwaXhlbEJveFN0eWxlc1ZhbCA9IHJvdW5kUGl4ZWxNZWFzdXJlcyggZGl2U3R5bGUucmlnaHQgKSA9PT0gMzY7CgoJCS8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5CgkJLy8gRGV0ZWN0IG1pc3JlcG9ydGluZyBvZiBjb250ZW50IGRpbWVuc2lvbnMgZm9yIGJveC1zaXppbmc6Ym9yZGVyLWJveCBlbGVtZW50cwoJCWJveFNpemluZ1JlbGlhYmxlVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS53aWR0aCApID09PSAzNjsKCgkJLy8gU3VwcG9ydDogSUUgOSBvbmx5CgkJLy8gRGV0ZWN0IG92ZXJmbG93OnNjcm9sbCBzY3Jld2luZXNzIChnaC0zNjk5KQoJCWRpdi5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CgkJc2Nyb2xsYm94U2l6ZVZhbCA9IGRpdi5vZmZzZXRXaWR0aCA9PT0gMzYgfHwgImFic29sdXRlIjsKCgkJZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTsKCgkJLy8gTnVsbGlmeSB0aGUgZGl2IHNvIGl0IHdvdWxkbid0IGJlIHN0b3JlZCBpbiB0aGUgbWVtb3J5IGFuZAoJCS8vIGl0IHdpbGwgYWxzbyBiZSBhIHNpZ24gdGhhdCBjaGVja3MgYWxyZWFkeSBwZXJmb3JtZWQKCQlkaXYgPSBudWxsOwoJfQoKCWZ1bmN0aW9uIHJvdW5kUGl4ZWxNZWFzdXJlcyggbWVhc3VyZSApIHsKCQlyZXR1cm4gTWF0aC5yb3VuZCggcGFyc2VGbG9hdCggbWVhc3VyZSApICk7Cgl9CgoJdmFyIHBpeGVsUG9zaXRpb25WYWwsIGJveFNpemluZ1JlbGlhYmxlVmFsLCBzY3JvbGxib3hTaXplVmFsLCBwaXhlbEJveFN0eWxlc1ZhbCwKCQlyZWxpYWJsZU1hcmdpbkxlZnRWYWwsCgkJY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSwKCQlkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiZGl2IiApOwoKCS8vIEZpbmlzaCBlYXJseSBpbiBsaW1pdGVkIChub24tYnJvd3NlcikgZW52aXJvbm1lbnRzCglpZiAoICFkaXYuc3R5bGUgKSB7CgkJcmV0dXJuOwoJfQoKCS8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHkKCS8vIFN0eWxlIG9mIGNsb25lZCBlbGVtZW50IGFmZmVjdHMgc291cmNlIGVsZW1lbnQgY2xvbmVkICgjODkwOCkKCWRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9ICJjb250ZW50LWJveCI7CglkaXYuY2xvbmVOb2RlKCB0cnVlICkuc3R5bGUuYmFja2dyb3VuZENsaXAgPSAiIjsKCXN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlID0gZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID09PSAiY29udGVudC1ib3giOwoKCWpRdWVyeS5leHRlbmQoIHN1cHBvcnQsIHsKCQlib3hTaXppbmdSZWxpYWJsZTogZnVuY3Rpb24oKSB7CgkJCWNvbXB1dGVTdHlsZVRlc3RzKCk7CgkJCXJldHVybiBib3hTaXppbmdSZWxpYWJsZVZhbDsKCQl9LAoJCXBpeGVsQm94U3R5bGVzOiBmdW5jdGlvbigpIHsKCQkJY29tcHV0ZVN0eWxlVGVzdHMoKTsKCQkJcmV0dXJuIHBpeGVsQm94U3R5bGVzVmFsOwoJCX0sCgkJcGl4ZWxQb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJCWNvbXB1dGVTdHlsZVRlc3RzKCk7CgkJCXJldHVybiBwaXhlbFBvc2l0aW9uVmFsOwoJCX0sCgkJcmVsaWFibGVNYXJnaW5MZWZ0OiBmdW5jdGlvbigpIHsKCQkJY29tcHV0ZVN0eWxlVGVzdHMoKTsKCQkJcmV0dXJuIHJlbGlhYmxlTWFyZ2luTGVmdFZhbDsKCQl9LAoJCXNjcm9sbGJveFNpemU6IGZ1bmN0aW9uKCkgewoJCQljb21wdXRlU3R5bGVUZXN0cygpOwoJCQlyZXR1cm4gc2Nyb2xsYm94U2l6ZVZhbDsKCQl9Cgl9ICk7Cn0gKSgpOwoKCmZ1bmN0aW9uIGN1ckNTUyggZWxlbSwgbmFtZSwgY29tcHV0ZWQgKSB7Cgl2YXIgd2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCwgcmV0LAoKCQkvLyBTdXBwb3J0OiBGaXJlZm94IDUxKwoJCS8vIFJldHJpZXZpbmcgc3R5bGUgYmVmb3JlIGNvbXB1dGVkIHNvbWVob3cKCQkvLyBmaXhlcyBhbiBpc3N1ZSB3aXRoIGdldHRpbmcgd3JvbmcgdmFsdWVzCgkJLy8gb24gZGV0YWNoZWQgZWxlbWVudHMKCQlzdHlsZSA9IGVsZW0uc3R5bGU7CgoJY29tcHV0ZWQgPSBjb21wdXRlZCB8fCBnZXRTdHlsZXMoIGVsZW0gKTsKCgkvLyBnZXRQcm9wZXJ0eVZhbHVlIGlzIG5lZWRlZCBmb3I6CgkvLyAgIC5jc3MoJ2ZpbHRlcicpIChJRSA5IG9ubHksICMxMjUzNykKCS8vICAgLmNzcygnLS1jdXN0b21Qcm9wZXJ0eSkgKCMzMTQ0KQoJaWYgKCBjb21wdXRlZCApIHsKCQlyZXQgPSBjb21wdXRlZC5nZXRQcm9wZXJ0eVZhbHVlKCBuYW1lICkgfHwgY29tcHV0ZWRbIG5hbWUgXTsKCgkJaWYgKCByZXQgPT09ICIiICYmICFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApICkgewoJCQlyZXQgPSBqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUgKTsKCQl9CgoJCS8vIEEgdHJpYnV0ZSB0byB0aGUgImF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHMiCgkJLy8gQW5kcm9pZCBCcm93c2VyIHJldHVybnMgcGVyY2VudGFnZSBmb3Igc29tZSB2YWx1ZXMsCgkJLy8gYnV0IHdpZHRoIHNlZW1zIHRvIGJlIHJlbGlhYmx5IHBpeGVscy4KCQkvLyBUaGlzIGlzIGFnYWluc3QgdGhlIENTU09NIGRyYWZ0IHNwZWM6CgkJLy8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzc29tLyNyZXNvbHZlZC12YWx1ZXMKCQlpZiAoICFzdXBwb3J0LnBpeGVsQm94U3R5bGVzKCkgJiYgcm51bW5vbnB4LnRlc3QoIHJldCApICYmIHJib3hTdHlsZS50ZXN0KCBuYW1lICkgKSB7CgoJCQkvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzCgkJCXdpZHRoID0gc3R5bGUud2lkdGg7CgkJCW1pbldpZHRoID0gc3R5bGUubWluV2lkdGg7CgkJCW1heFdpZHRoID0gc3R5bGUubWF4V2lkdGg7CgoJCQkvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0CgkJCXN0eWxlLm1pbldpZHRoID0gc3R5bGUubWF4V2lkdGggPSBzdHlsZS53aWR0aCA9IHJldDsKCQkJcmV0ID0gY29tcHV0ZWQud2lkdGg7CgoJCQkvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzCgkJCXN0eWxlLndpZHRoID0gd2lkdGg7CgkJCXN0eWxlLm1pbldpZHRoID0gbWluV2lkdGg7CgkJCXN0eWxlLm1heFdpZHRoID0gbWF4V2lkdGg7CgkJfQoJfQoKCXJldHVybiByZXQgIT09IHVuZGVmaW5lZCA/CgoJCS8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHkKCQkvLyBJRSByZXR1cm5zIHpJbmRleCB2YWx1ZSBhcyBhbiBpbnRlZ2VyLgoJCXJldCArICIiIDoKCQlyZXQ7Cn0KCgpmdW5jdGlvbiBhZGRHZXRIb29rSWYoIGNvbmRpdGlvbkZuLCBob29rRm4gKSB7CgoJLy8gRGVmaW5lIHRoZSBob29rLCB3ZSdsbCBjaGVjayBvbiB0aGUgZmlyc3QgcnVuIGlmIGl0J3MgcmVhbGx5IG5lZWRlZC4KCXJldHVybiB7CgkJZ2V0OiBmdW5jdGlvbigpIHsKCQkJaWYgKCBjb25kaXRpb25GbigpICkgewoKCQkJCS8vIEhvb2sgbm90IG5lZWRlZCAob3IgaXQncyBub3QgcG9zc2libGUgdG8gdXNlIGl0IGR1ZQoJCQkJLy8gdG8gbWlzc2luZyBkZXBlbmRlbmN5KSwgcmVtb3ZlIGl0LgoJCQkJZGVsZXRlIHRoaXMuZ2V0OwoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBIb29rIG5lZWRlZDsgcmVkZWZpbmUgaXQgc28gdGhhdCB0aGUgc3VwcG9ydCB0ZXN0IGlzIG5vdCBleGVjdXRlZCBhZ2Fpbi4KCQkJcmV0dXJuICggdGhpcy5nZXQgPSBob29rRm4gKS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfQoJfTsKfQoKCnZhcgoKCS8vIFN3YXBwYWJsZSBpZiBkaXNwbGF5IGlzIG5vbmUgb3Igc3RhcnRzIHdpdGggdGFibGUKCS8vIGV4Y2VwdCAidGFibGUiLCAidGFibGUtY2VsbCIsIG9yICJ0YWJsZS1jYXB0aW9uIgoJLy8gU2VlIGhlcmUgZm9yIGRpc3BsYXkgdmFsdWVzOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0NTUy9kaXNwbGF5CglyZGlzcGxheXN3YXAgPSAvXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sCglyY3VzdG9tUHJvcCA9IC9eLS0vLAoJY3NzU2hvdyA9IHsgcG9zaXRpb246ICJhYnNvbHV0ZSIsIHZpc2liaWxpdHk6ICJoaWRkZW4iLCBkaXNwbGF5OiAiYmxvY2siIH0sCgljc3NOb3JtYWxUcmFuc2Zvcm0gPSB7CgkJbGV0dGVyU3BhY2luZzogIjAiLAoJCWZvbnRXZWlnaHQ6ICI0MDAiCgl9LAoKCWNzc1ByZWZpeGVzID0gWyAiV2Via2l0IiwgIk1veiIsICJtcyIgXSwKCWVtcHR5U3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiZGl2IiApLnN0eWxlOwoKLy8gUmV0dXJuIGEgY3NzIHByb3BlcnR5IG1hcHBlZCB0byBhIHBvdGVudGlhbGx5IHZlbmRvciBwcmVmaXhlZCBwcm9wZXJ0eQpmdW5jdGlvbiB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHsKCgkvLyBTaG9ydGN1dCBmb3IgbmFtZXMgdGhhdCBhcmUgbm90IHZlbmRvciBwcmVmaXhlZAoJaWYgKCBuYW1lIGluIGVtcHR5U3R5bGUgKSB7CgkJcmV0dXJuIG5hbWU7Cgl9CgoJLy8gQ2hlY2sgZm9yIHZlbmRvciBwcmVmaXhlZCBuYW1lcwoJdmFyIGNhcE5hbWUgPSBuYW1lWyAwIF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoIDEgKSwKCQlpID0gY3NzUHJlZml4ZXMubGVuZ3RoOwoKCXdoaWxlICggaS0tICkgewoJCW5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsgY2FwTmFtZTsKCQlpZiAoIG5hbWUgaW4gZW1wdHlTdHlsZSApIHsKCQkJcmV0dXJuIG5hbWU7CgkJfQoJfQp9CgovLyBSZXR1cm4gYSBwcm9wZXJ0eSBtYXBwZWQgYWxvbmcgd2hhdCBqUXVlcnkuY3NzUHJvcHMgc3VnZ2VzdHMgb3IgdG8KLy8gYSB2ZW5kb3IgcHJlZml4ZWQgcHJvcGVydHkuCmZ1bmN0aW9uIGZpbmFsUHJvcE5hbWUoIG5hbWUgKSB7Cgl2YXIgcmV0ID0galF1ZXJ5LmNzc1Byb3BzWyBuYW1lIF07CglpZiAoICFyZXQgKSB7CgkJcmV0ID0galF1ZXJ5LmNzc1Byb3BzWyBuYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHx8IG5hbWU7Cgl9CglyZXR1cm4gcmV0Owp9CgpmdW5jdGlvbiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICkgewoKCS8vIEFueSByZWxhdGl2ZSAoKy8tKSB2YWx1ZXMgaGF2ZSBhbHJlYWR5IGJlZW4KCS8vIG5vcm1hbGl6ZWQgYXQgdGhpcyBwb2ludAoJdmFyIG1hdGNoZXMgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICk7CglyZXR1cm4gbWF0Y2hlcyA/CgoJCS8vIEd1YXJkIGFnYWluc3QgdW5kZWZpbmVkICJzdWJ0cmFjdCIsIGUuZy4sIHdoZW4gdXNlZCBhcyBpbiBjc3NIb29rcwoJCU1hdGgubWF4KCAwLCBtYXRjaGVzWyAyIF0gLSAoIHN1YnRyYWN0IHx8IDAgKSApICsgKCBtYXRjaGVzWyAzIF0gfHwgInB4IiApIDoKCQl2YWx1ZTsKfQoKZnVuY3Rpb24gYm94TW9kZWxBZGp1c3RtZW50KCBlbGVtLCBkaW1lbnNpb24sIGJveCwgaXNCb3JkZXJCb3gsIHN0eWxlcywgY29tcHV0ZWRWYWwgKSB7Cgl2YXIgaSA9IGRpbWVuc2lvbiA9PT0gIndpZHRoIiA/IDEgOiAwLAoJCWV4dHJhID0gMCwKCQlkZWx0YSA9IDA7CgoJLy8gQWRqdXN0bWVudCBtYXkgbm90IGJlIG5lY2Vzc2FyeQoJaWYgKCBib3ggPT09ICggaXNCb3JkZXJCb3ggPyAiYm9yZGVyIiA6ICJjb250ZW50IiApICkgewoJCXJldHVybiAwOwoJfQoKCWZvciAoIDsgaSA8IDQ7IGkgKz0gMiApIHsKCgkJLy8gQm90aCBib3ggbW9kZWxzIGV4Y2x1ZGUgbWFyZ2luCgkJaWYgKCBib3ggPT09ICJtYXJnaW4iICkgewoJCQlkZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCBib3ggKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7CgkJfQoKCQkvLyBJZiB3ZSBnZXQgaGVyZSB3aXRoIGEgY29udGVudC1ib3gsIHdlJ3JlIHNlZWtpbmcgInBhZGRpbmciIG9yICJib3JkZXIiIG9yICJtYXJnaW4iCgkJaWYgKCAhaXNCb3JkZXJCb3ggKSB7CgoJCQkvLyBBZGQgcGFkZGluZwoJCQlkZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCAicGFkZGluZyIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7CgoJCQkvLyBGb3IgImJvcmRlciIgb3IgIm1hcmdpbiIsIGFkZCBib3JkZXIKCQkJaWYgKCBib3ggIT09ICJwYWRkaW5nIiApIHsKCQkJCWRlbHRhICs9IGpRdWVyeS5jc3MoIGVsZW0sICJib3JkZXIiICsgY3NzRXhwYW5kWyBpIF0gKyAiV2lkdGgiLCB0cnVlLCBzdHlsZXMgKTsKCgkJCS8vIEJ1dCBzdGlsbCBrZWVwIHRyYWNrIG9mIGl0IG90aGVyd2lzZQoJCQl9IGVsc2UgewoJCQkJZXh0cmEgKz0galF1ZXJ5LmNzcyggZWxlbSwgImJvcmRlciIgKyBjc3NFeHBhbmRbIGkgXSArICJXaWR0aCIsIHRydWUsIHN0eWxlcyApOwoJCQl9CgoJCS8vIElmIHdlIGdldCBoZXJlIHdpdGggYSBib3JkZXItYm94IChjb250ZW50ICsgcGFkZGluZyArIGJvcmRlciksIHdlJ3JlIHNlZWtpbmcgImNvbnRlbnQiIG9yCgkJLy8gInBhZGRpbmciIG9yICJtYXJnaW4iCgkJfSBlbHNlIHsKCgkJCS8vIEZvciAiY29udGVudCIsIHN1YnRyYWN0IHBhZGRpbmcKCQkJaWYgKCBib3ggPT09ICJjb250ZW50IiApIHsKCQkJCWRlbHRhIC09IGpRdWVyeS5jc3MoIGVsZW0sICJwYWRkaW5nIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTsKCQkJfQoKCQkJLy8gRm9yICJjb250ZW50IiBvciAicGFkZGluZyIsIHN1YnRyYWN0IGJvcmRlcgoJCQlpZiAoIGJveCAhPT0gIm1hcmdpbiIgKSB7CgkJCQlkZWx0YSAtPSBqUXVlcnkuY3NzKCBlbGVtLCAiYm9yZGVyIiArIGNzc0V4cGFuZFsgaSBdICsgIldpZHRoIiwgdHJ1ZSwgc3R5bGVzICk7CgkJCX0KCQl9Cgl9CgoJLy8gQWNjb3VudCBmb3IgcG9zaXRpdmUgY29udGVudC1ib3ggc2Nyb2xsIGd1dHRlciB3aGVuIHJlcXVlc3RlZCBieSBwcm92aWRpbmcgY29tcHV0ZWRWYWwKCWlmICggIWlzQm9yZGVyQm94ICYmIGNvbXB1dGVkVmFsID49IDAgKSB7CgoJCS8vIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBpcyBhIHJvdW5kZWQgc3VtIG9mIGNvbnRlbnQsIHBhZGRpbmcsIHNjcm9sbCBndXR0ZXIsIGFuZCBib3JkZXIKCQkvLyBBc3N1bWluZyBpbnRlZ2VyIHNjcm9sbCBndXR0ZXIsIHN1YnRyYWN0IHRoZSByZXN0IGFuZCByb3VuZCBkb3duCgkJZGVsdGEgKz0gTWF0aC5tYXgoIDAsIE1hdGguY2VpbCgKCQkJZWxlbVsgIm9mZnNldCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtCgkJCWNvbXB1dGVkVmFsIC0KCQkJZGVsdGEgLQoJCQlleHRyYSAtCgkJCTAuNQoJCSkgKTsKCX0KCglyZXR1cm4gZGVsdGE7Cn0KCmZ1bmN0aW9uIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIGRpbWVuc2lvbiwgZXh0cmEgKSB7CgoJLy8gU3RhcnQgd2l0aCBjb21wdXRlZCBzdHlsZQoJdmFyIHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApLAoJCXZhbCA9IGN1ckNTUyggZWxlbSwgZGltZW5zaW9uLCBzdHlsZXMgKSwKCQlpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sICJib3hTaXppbmciLCBmYWxzZSwgc3R5bGVzICkgPT09ICJib3JkZXItYm94IiwKCQl2YWx1ZUlzQm9yZGVyQm94ID0gaXNCb3JkZXJCb3g7CgoJLy8gU3VwcG9ydDogRmlyZWZveCA8PTU0CgkvLyBSZXR1cm4gYSBjb25mb3VuZGluZyBub24tcGl4ZWwgdmFsdWUgb3IgZmVpZ24gaWdub3JhbmNlLCBhcyBhcHByb3ByaWF0ZS4KCWlmICggcm51bW5vbnB4LnRlc3QoIHZhbCApICkgewoJCWlmICggIWV4dHJhICkgewoJCQlyZXR1cm4gdmFsOwoJCX0KCQl2YWwgPSAiYXV0byI7Cgl9CgoJLy8gQ2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2VyIHdoaWNoIHJldHVybnMgdW5yZWxpYWJsZSB2YWx1ZXMKCS8vIGZvciBnZXRDb21wdXRlZFN0eWxlIHNpbGVudGx5IGZhbGxzIGJhY2sgdG8gdGhlIHJlbGlhYmxlIGVsZW0uc3R5bGUKCXZhbHVlSXNCb3JkZXJCb3ggPSB2YWx1ZUlzQm9yZGVyQm94ICYmCgkJKCBzdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlKCkgfHwgdmFsID09PSBlbGVtLnN0eWxlWyBkaW1lbnNpb24gXSApOwoKCS8vIEZhbGwgYmFjayB0byBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgd2hlbiB2YWx1ZSBpcyAiYXV0byIKCS8vIFRoaXMgaGFwcGVucyBmb3IgaW5saW5lIGVsZW1lbnRzIHdpdGggbm8gZXhwbGljaXQgc2V0dGluZyAoZ2gtMzU3MSkKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjEgLSA0LjMgb25seQoJLy8gQWxzbyB1c2Ugb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGZvciBtaXNyZXBvcnRlZCBpbmxpbmUgZGltZW5zaW9ucyAoZ2gtMzYwMikKCWlmICggdmFsID09PSAiYXV0byIgfHwKCQkhcGFyc2VGbG9hdCggdmFsICkgJiYgalF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiLCBmYWxzZSwgc3R5bGVzICkgPT09ICJpbmxpbmUiICkgewoKCQl2YWwgPSBlbGVtWyAib2Zmc2V0IiArIGRpbWVuc2lvblsgMCBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoIDEgKSBdOwoKCQkvLyBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgcHJvdmlkZSBib3JkZXItYm94IHZhbHVlcwoJCXZhbHVlSXNCb3JkZXJCb3ggPSB0cnVlOwoJfQoKCS8vIE5vcm1hbGl6ZSAiIiBhbmQgYXV0bwoJdmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDsKCgkvLyBBZGp1c3QgZm9yIHRoZSBlbGVtZW50J3MgYm94IG1vZGVsCglyZXR1cm4gKCB2YWwgKwoJCWJveE1vZGVsQWRqdXN0bWVudCgKCQkJZWxlbSwKCQkJZGltZW5zaW9uLAoJCQlleHRyYSB8fCAoIGlzQm9yZGVyQm94ID8gImJvcmRlciIgOiAiY29udGVudCIgKSwKCQkJdmFsdWVJc0JvcmRlckJveCwKCQkJc3R5bGVzLAoKCQkJLy8gUHJvdmlkZSB0aGUgY3VycmVudCBjb21wdXRlZCBzaXplIHRvIHJlcXVlc3Qgc2Nyb2xsIGd1dHRlciBjYWxjdWxhdGlvbiAoZ2gtMzU4OSkKCQkJdmFsCgkJKQoJKSArICJweCI7Cn0KCmpRdWVyeS5leHRlbmQoIHsKCgkvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQKCS8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBzdHlsZSBwcm9wZXJ0eQoJY3NzSG9va3M6IHsKCQlvcGFjaXR5OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQkJaWYgKCBjb21wdXRlZCApIHsKCgkJCQkJLy8gV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHkKCQkJCQl2YXIgcmV0ID0gY3VyQ1NTKCBlbGVtLCAib3BhY2l0eSIgKTsKCQkJCQlyZXR1cm4gcmV0ID09PSAiIiA/ICIxIiA6IHJldDsKCQkJCX0KCQkJfQoJCX0KCX0sCgoJLy8gRG9uJ3QgYXV0b21hdGljYWxseSBhZGQgInB4IiB0byB0aGVzZSBwb3NzaWJseS11bml0bGVzcyBwcm9wZXJ0aWVzCgljc3NOdW1iZXI6IHsKCQkiYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQiOiB0cnVlLAoJCSJjb2x1bW5Db3VudCI6IHRydWUsCgkJImZpbGxPcGFjaXR5IjogdHJ1ZSwKCQkiZmxleEdyb3ciOiB0cnVlLAoJCSJmbGV4U2hyaW5rIjogdHJ1ZSwKCQkiZm9udFdlaWdodCI6IHRydWUsCgkJImxpbmVIZWlnaHQiOiB0cnVlLAoJCSJvcGFjaXR5IjogdHJ1ZSwKCQkib3JkZXIiOiB0cnVlLAoJCSJvcnBoYW5zIjogdHJ1ZSwKCQkid2lkb3dzIjogdHJ1ZSwKCQkiekluZGV4IjogdHJ1ZSwKCQkiem9vbSI6IHRydWUKCX0sCgoJLy8gQWRkIGluIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9yZQoJLy8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZQoJY3NzUHJvcHM6IHt9LAoKCS8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBvbiBhIERPTSBOb2RlCglzdHlsZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBleHRyYSApIHsKCgkJLy8gRG9uJ3Qgc2V0IHN0eWxlcyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCgkJaWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggfHwgIWVsZW0uc3R5bGUgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZQoJCXZhciByZXQsIHR5cGUsIGhvb2tzLAoJCQlvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLAoJCQlpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICksCgkJCXN0eWxlID0gZWxlbS5zdHlsZTsKCgkJLy8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lLiBXZSBkb24ndAoJCS8vIHdhbnQgdG8gcXVlcnkgdGhlIHZhbHVlIGlmIGl0IGlzIGEgQ1NTIGN1c3RvbSBwcm9wZXJ0eQoJCS8vIHNpbmNlIHRoZXkgYXJlIHVzZXItZGVmaW5lZC4KCQlpZiAoICFpc0N1c3RvbVByb3AgKSB7CgkJCW5hbWUgPSBmaW5hbFByb3BOYW1lKCBvcmlnTmFtZSApOwoJCX0KCgkJLy8gR2V0cyBob29rIGZvciB0aGUgcHJlZml4ZWQgdmVyc2lvbiwgdGhlbiB1bnByZWZpeGVkIHZlcnNpb24KCQlob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTsKCgkJLy8gQ2hlY2sgaWYgd2UncmUgc2V0dGluZyBhIHZhbHVlCgkJaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgewoJCQl0eXBlID0gdHlwZW9mIHZhbHVlOwoKCQkJLy8gQ29udmVydCAiKz0iIG9yICItPSIgdG8gcmVsYXRpdmUgbnVtYmVycyAoIzczNDUpCgkJCWlmICggdHlwZSA9PT0gInN0cmluZyIgJiYgKCByZXQgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICkgKSAmJiByZXRbIDEgXSApIHsKCQkJCXZhbHVlID0gYWRqdXN0Q1NTKCBlbGVtLCBuYW1lLCByZXQgKTsKCgkJCQkvLyBGaXhlcyBidWcgIzkyMzcKCQkJCXR5cGUgPSAibnVtYmVyIjsKCQkJfQoKCQkJLy8gTWFrZSBzdXJlIHRoYXQgbnVsbCBhbmQgTmFOIHZhbHVlcyBhcmVuJ3Qgc2V0ICgjNzExNikKCQkJaWYgKCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlICE9PSB2YWx1ZSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJLy8gSWYgYSBudW1iZXIgd2FzIHBhc3NlZCBpbiwgYWRkIHRoZSB1bml0IChleGNlcHQgZm9yIGNlcnRhaW4gQ1NTIHByb3BlcnRpZXMpCgkJCWlmICggdHlwZSA9PT0gIm51bWJlciIgKSB7CgkJCQl2YWx1ZSArPSByZXQgJiYgcmV0WyAzIF0gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBvcmlnTmFtZSBdID8gIiIgOiAicHgiICk7CgkJCX0KCgkJCS8vIGJhY2tncm91bmQtKiBwcm9wcyBhZmZlY3Qgb3JpZ2luYWwgY2xvbmUncyB2YWx1ZXMKCQkJaWYgKCAhc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09ICIiICYmIG5hbWUuaW5kZXhPZiggImJhY2tncm91bmQiICkgPT09IDAgKSB7CgkJCQlzdHlsZVsgbmFtZSBdID0gImluaGVyaXQiOwoJCQl9CgoJCQkvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkLCB1c2UgdGhhdCB2YWx1ZSwgb3RoZXJ3aXNlIGp1c3Qgc2V0IHRoZSBzcGVjaWZpZWQgdmFsdWUKCQkJaWYgKCAhaG9va3MgfHwgISggInNldCIgaW4gaG9va3MgKSB8fAoJCQkJKCB2YWx1ZSA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCWlmICggaXNDdXN0b21Qcm9wICkgewoJCQkJCXN0eWxlLnNldFByb3BlcnR5KCBuYW1lLCB2YWx1ZSApOwoJCQkJfSBlbHNlIHsKCQkJCQlzdHlsZVsgbmFtZSBdID0gdmFsdWU7CgkJCQl9CgkJCX0KCgkJfSBlbHNlIHsKCgkJCS8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBub24tY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZQoJCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmCgkJCQkoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgZmFsc2UsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCXJldHVybiByZXQ7CgkJCX0KCgkJCS8vIE90aGVyd2lzZSBqdXN0IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgc3R5bGUgb2JqZWN0CgkJCXJldHVybiBzdHlsZVsgbmFtZSBdOwoJCX0KCX0sCgoJY3NzOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZXh0cmEsIHN0eWxlcyApIHsKCQl2YXIgdmFsLCBudW0sIGhvb2tzLAoJCQlvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLAoJCQlpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICk7CgoJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZS4gV2UgZG9uJ3QKCQkvLyB3YW50IHRvIG1vZGlmeSB0aGUgdmFsdWUgaWYgaXQgaXMgYSBDU1MgY3VzdG9tIHByb3BlcnR5CgkJLy8gc2luY2UgdGhleSBhcmUgdXNlci1kZWZpbmVkLgoJCWlmICggIWlzQ3VzdG9tUHJvcCApIHsKCQkJbmFtZSA9IGZpbmFsUHJvcE5hbWUoIG9yaWdOYW1lICk7CgkJfQoKCQkvLyBUcnkgcHJlZml4ZWQgbmFtZSBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCBuYW1lCgkJaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07CgoJCS8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlCgkJaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyApIHsKCQkJdmFsID0gaG9va3MuZ2V0KCBlbGVtLCB0cnVlLCBleHRyYSApOwoJCX0KCgkJLy8gT3RoZXJ3aXNlLCBpZiBhIHdheSB0byBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGV4aXN0cywgdXNlIHRoYXQKCQlpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkgewoJCQl2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0eWxlcyApOwoJCX0KCgkJLy8gQ29udmVydCAibm9ybWFsIiB0byBjb21wdXRlZCB2YWx1ZQoJCWlmICggdmFsID09PSAibm9ybWFsIiAmJiBuYW1lIGluIGNzc05vcm1hbFRyYW5zZm9ybSApIHsKCQkJdmFsID0gY3NzTm9ybWFsVHJhbnNmb3JtWyBuYW1lIF07CgkJfQoKCQkvLyBNYWtlIG51bWVyaWMgaWYgZm9yY2VkIG9yIGEgcXVhbGlmaWVyIHdhcyBwcm92aWRlZCBhbmQgdmFsIGxvb2tzIG51bWVyaWMKCQlpZiAoIGV4dHJhID09PSAiIiB8fCBleHRyYSApIHsKCQkJbnVtID0gcGFyc2VGbG9hdCggdmFsICk7CgkJCXJldHVybiBleHRyYSA9PT0gdHJ1ZSB8fCBpc0Zpbml0ZSggbnVtICkgPyBudW0gfHwgMCA6IHZhbDsKCQl9CgoJCXJldHVybiB2YWw7Cgl9Cn0gKTsKCmpRdWVyeS5lYWNoKCBbICJoZWlnaHQiLCAid2lkdGgiIF0sIGZ1bmN0aW9uKCBpLCBkaW1lbnNpb24gKSB7CglqUXVlcnkuY3NzSG9va3NbIGRpbWVuc2lvbiBdID0gewoJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHsKCQkJaWYgKCBjb21wdXRlZCApIHsKCgkJCQkvLyBDZXJ0YWluIGVsZW1lbnRzIGNhbiBoYXZlIGRpbWVuc2lvbiBpbmZvIGlmIHdlIGludmlzaWJseSBzaG93IHRoZW0KCQkJCS8vIGJ1dCBpdCBtdXN0IGhhdmUgYSBjdXJyZW50IGRpc3BsYXkgc3R5bGUgdGhhdCB3b3VsZCBiZW5lZml0CgkJCQlyZXR1cm4gcmRpc3BsYXlzd2FwLnRlc3QoIGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApICkgJiYKCgkJCQkJLy8gU3VwcG9ydDogU2FmYXJpIDgrCgkJCQkJLy8gVGFibGUgY29sdW1ucyBpbiBTYWZhcmkgaGF2ZSBub24temVybyBvZmZzZXRXaWR0aCAmIHplcm8KCQkJCQkvLyBnZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCB1bmxlc3MgZGlzcGxheSBpcyBjaGFuZ2VkLgoJCQkJCS8vIFN1cHBvcnQ6IElFIDw9MTEgb25seQoJCQkJCS8vIFJ1bm5pbmcgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IG9uIGEgZGlzY29ubmVjdGVkIG5vZGUKCQkJCQkvLyBpbiBJRSB0aHJvd3MgYW4gZXJyb3IuCgkJCQkJKCAhZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCB8fCAhZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCApID8KCQkJCQkJc3dhcCggZWxlbSwgY3NzU2hvdywgZnVuY3Rpb24oKSB7CgkJCQkJCQlyZXR1cm4gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgZGltZW5zaW9uLCBleHRyYSApOwoJCQkJCQl9ICkgOgoJCQkJCQlnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBkaW1lbnNpb24sIGV4dHJhICk7CgkJCX0KCQl9LAoKCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgZXh0cmEgKSB7CgkJCXZhciBtYXRjaGVzLAoJCQkJc3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksCgkJCQlpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sICJib3hTaXppbmciLCBmYWxzZSwgc3R5bGVzICkgPT09ICJib3JkZXItYm94IiwKCQkJCXN1YnRyYWN0ID0gZXh0cmEgJiYgYm94TW9kZWxBZGp1c3RtZW50KAoJCQkJCWVsZW0sCgkJCQkJZGltZW5zaW9uLAoJCQkJCWV4dHJhLAoJCQkJCWlzQm9yZGVyQm94LAoJCQkJCXN0eWxlcwoJCQkJKTsKCgkJCS8vIEFjY291bnQgZm9yIHVucmVsaWFibGUgYm9yZGVyLWJveCBkaW1lbnNpb25zIGJ5IGNvbXBhcmluZyBvZmZzZXQqIHRvIGNvbXB1dGVkIGFuZAoJCQkvLyBmYWtpbmcgYSBjb250ZW50LWJveCB0byBnZXQgYm9yZGVyIGFuZCBwYWRkaW5nIChnaC0zNjk5KQoJCQlpZiAoIGlzQm9yZGVyQm94ICYmIHN1cHBvcnQuc2Nyb2xsYm94U2l6ZSgpID09PSBzdHlsZXMucG9zaXRpb24gKSB7CgkJCQlzdWJ0cmFjdCAtPSBNYXRoLmNlaWwoCgkJCQkJZWxlbVsgIm9mZnNldCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtCgkJCQkJcGFyc2VGbG9hdCggc3R5bGVzWyBkaW1lbnNpb24gXSApIC0KCQkJCQlib3hNb2RlbEFkanVzdG1lbnQoIGVsZW0sIGRpbWVuc2lvbiwgImJvcmRlciIsIGZhbHNlLCBzdHlsZXMgKSAtCgkJCQkJMC41CgkJCQkpOwoJCQl9CgoJCQkvLyBDb252ZXJ0IHRvIHBpeGVscyBpZiB2YWx1ZSBhZGp1c3RtZW50IGlzIG5lZWRlZAoJCQlpZiAoIHN1YnRyYWN0ICYmICggbWF0Y2hlcyA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKSApICYmCgkJCQkoIG1hdGNoZXNbIDMgXSB8fCAicHgiICkgIT09ICJweCIgKSB7CgoJCQkJZWxlbS5zdHlsZVsgZGltZW5zaW9uIF0gPSB2YWx1ZTsKCQkJCXZhbHVlID0galF1ZXJ5LmNzcyggZWxlbSwgZGltZW5zaW9uICk7CgkJCX0KCgkJCXJldHVybiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICk7CgkJfQoJfTsKfSApOwoKalF1ZXJ5LmNzc0hvb2tzLm1hcmdpbkxlZnQgPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucmVsaWFibGVNYXJnaW5MZWZ0LAoJZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCWlmICggY29tcHV0ZWQgKSB7CgkJCXJldHVybiAoIHBhcnNlRmxvYXQoIGN1ckNTUyggZWxlbSwgIm1hcmdpbkxlZnQiICkgKSB8fAoJCQkJZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0KCQkJCQlzd2FwKCBlbGVtLCB7IG1hcmdpbkxlZnQ6IDAgfSwgZnVuY3Rpb24oKSB7CgkJCQkJCXJldHVybiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7CgkJCQkJfSApCgkJCQkpICsgInB4IjsKCQl9Cgl9Cik7CgovLyBUaGVzZSBob29rcyBhcmUgdXNlZCBieSBhbmltYXRlIHRvIGV4cGFuZCBwcm9wZXJ0aWVzCmpRdWVyeS5lYWNoKCB7CgltYXJnaW46ICIiLAoJcGFkZGluZzogIiIsCglib3JkZXI6ICJXaWR0aCIKfSwgZnVuY3Rpb24oIHByZWZpeCwgc3VmZml4ICkgewoJalF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXSA9IHsKCQlleHBhbmQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJdmFyIGkgPSAwLAoJCQkJZXhwYW5kZWQgPSB7fSwKCgkJCQkvLyBBc3N1bWVzIGEgc2luZ2xlIG51bWJlciBpZiBub3QgYSBzdHJpbmcKCQkJCXBhcnRzID0gdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiA/IHZhbHVlLnNwbGl0KCAiICIgKSA6IFsgdmFsdWUgXTsKCgkJCWZvciAoIDsgaSA8IDQ7IGkrKyApIHsKCQkJCWV4cGFuZGVkWyBwcmVmaXggKyBjc3NFeHBhbmRbIGkgXSArIHN1ZmZpeCBdID0KCQkJCQlwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBdIHx8IHBhcnRzWyAwIF07CgkJCX0KCgkJCXJldHVybiBleHBhbmRlZDsKCQl9Cgl9OwoKCWlmICggcHJlZml4ICE9PSAibWFyZ2luIiApIHsKCQlqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdLnNldCA9IHNldFBvc2l0aXZlTnVtYmVyOwoJfQp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7Cgljc3M6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKCQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7CgkJCXZhciBzdHlsZXMsIGxlbiwKCQkJCW1hcCA9IHt9LAoJCQkJaSA9IDA7CgoJCQlpZiAoIEFycmF5LmlzQXJyYXkoIG5hbWUgKSApIHsKCQkJCXN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApOwoJCQkJbGVuID0gbmFtZS5sZW5ndGg7CgoJCQkJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CgkJCQkJbWFwWyBuYW1lWyBpIF0gXSA9IGpRdWVyeS5jc3MoIGVsZW0sIG5hbWVbIGkgXSwgZmFsc2UsIHN0eWxlcyApOwoJCQkJfQoKCQkJCXJldHVybiBtYXA7CgkJCX0KCgkJCXJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8KCQkJCWpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6CgkJCQlqUXVlcnkuY3NzKCBlbGVtLCBuYW1lICk7CgkJfSwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7Cgl9Cn0gKTsKCgpmdW5jdGlvbiBUd2VlbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKSB7CglyZXR1cm4gbmV3IFR3ZWVuLnByb3RvdHlwZS5pbml0KCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApOwp9CmpRdWVyeS5Ud2VlbiA9IFR3ZWVuOwoKVHdlZW4ucHJvdG90eXBlID0gewoJY29uc3RydWN0b3I6IFR3ZWVuLAoJaW5pdDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nLCB1bml0ICkgewoJCXRoaXMuZWxlbSA9IGVsZW07CgkJdGhpcy5wcm9wID0gcHJvcDsKCQl0aGlzLmVhc2luZyA9IGVhc2luZyB8fCBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0OwoJCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkJdGhpcy5zdGFydCA9IHRoaXMubm93ID0gdGhpcy5jdXIoKTsKCQl0aGlzLmVuZCA9IGVuZDsKCQl0aGlzLnVuaXQgPSB1bml0IHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gIiIgOiAicHgiICk7Cgl9LAoJY3VyOiBmdW5jdGlvbigpIHsKCQl2YXIgaG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdOwoKCQlyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID8KCQkJaG9va3MuZ2V0KCB0aGlzICkgOgoJCQlUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KCB0aGlzICk7Cgl9LAoJcnVuOiBmdW5jdGlvbiggcGVyY2VudCApIHsKCQl2YXIgZWFzZWQsCgkJCWhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTsKCgkJaWYgKCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKSB7CgkJCXRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKAoJCQkJcGVyY2VudCwgdGhpcy5vcHRpb25zLmR1cmF0aW9uICogcGVyY2VudCwgMCwgMSwgdGhpcy5vcHRpb25zLmR1cmF0aW9uCgkJCSk7CgkJfSBlbHNlIHsKCQkJdGhpcy5wb3MgPSBlYXNlZCA9IHBlcmNlbnQ7CgkJfQoJCXRoaXMubm93ID0gKCB0aGlzLmVuZCAtIHRoaXMuc3RhcnQgKSAqIGVhc2VkICsgdGhpcy5zdGFydDsKCgkJaWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApIHsKCQkJdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApOwoJCX0KCgkJaWYgKCBob29rcyAmJiBob29rcy5zZXQgKSB7CgkJCWhvb2tzLnNldCggdGhpcyApOwoJCX0gZWxzZSB7CgkJCVR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTsKCQl9CgkJcmV0dXJuIHRoaXM7Cgl9Cn07CgpUd2Vlbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGUgPSBUd2Vlbi5wcm90b3R5cGU7CgpUd2Vlbi5wcm9wSG9va3MgPSB7CglfZGVmYXVsdDogewoJCWdldDogZnVuY3Rpb24oIHR3ZWVuICkgewoJCQl2YXIgcmVzdWx0OwoKCQkJLy8gVXNlIGEgcHJvcGVydHkgb24gdGhlIGVsZW1lbnQgZGlyZWN0bHkgd2hlbiBpdCBpcyBub3QgYSBET00gZWxlbWVudCwKCQkJLy8gb3Igd2hlbiB0aGVyZSBpcyBubyBtYXRjaGluZyBzdHlsZSBwcm9wZXJ0eSB0aGF0IGV4aXN0cy4KCQkJaWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlICE9PSAxIHx8CgkJCQl0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gIT0gbnVsbCAmJiB0d2Vlbi5lbGVtLnN0eWxlWyB0d2Vlbi5wcm9wIF0gPT0gbnVsbCApIHsKCQkJCXJldHVybiB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF07CgkJCX0KCgkJCS8vIFBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nIGFzIGEgM3JkIHBhcmFtZXRlciB0byAuY3NzIHdpbGwgYXV0b21hdGljYWxseQoJCQkvLyBhdHRlbXB0IGEgcGFyc2VGbG9hdCBhbmQgZmFsbGJhY2sgdG8gYSBzdHJpbmcgaWYgdGhlIHBhcnNlIGZhaWxzLgoJCQkvLyBTaW1wbGUgdmFsdWVzIHN1Y2ggYXMgIjEwcHgiIGFyZSBwYXJzZWQgdG8gRmxvYXQ7CgkJCS8vIGNvbXBsZXggdmFsdWVzIHN1Y2ggYXMgInJvdGF0ZSgxcmFkKSIgYXJlIHJldHVybmVkIGFzLWlzLgoJCQlyZXN1bHQgPSBqUXVlcnkuY3NzKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCAiIiApOwoKCQkJLy8gRW1wdHkgc3RyaW5ncywgbnVsbCwgdW5kZWZpbmVkIGFuZCAiYXV0byIgYXJlIGNvbnZlcnRlZCB0byAwLgoJCQlyZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09ICJhdXRvIiA/IDAgOiByZXN1bHQ7CgkJfSwKCQlzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHsKCgkJCS8vIFVzZSBzdGVwIGhvb2sgZm9yIGJhY2sgY29tcGF0LgoJCQkvLyBVc2UgY3NzSG9vayBpZiBpdHMgdGhlcmUuCgkJCS8vIFVzZSAuc3R5bGUgaWYgYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUuCgkJCWlmICggalF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSApIHsKCQkJCWpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0oIHR3ZWVuICk7CgkJCX0gZWxzZSBpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgPT09IDEgJiYKCQkJCSggdHdlZW4uZWxlbS5zdHlsZVsgalF1ZXJ5LmNzc1Byb3BzWyB0d2Vlbi5wcm9wIF0gXSAhPSBudWxsIHx8CgkJCQkJalF1ZXJ5LmNzc0hvb2tzWyB0d2Vlbi5wcm9wIF0gKSApIHsKCQkJCWpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgdHdlZW4ubm93ICsgdHdlZW4udW5pdCApOwoJCQl9IGVsc2UgewoJCQkJdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93OwoJCQl9CgkJfQoJfQp9OwoKLy8gU3VwcG9ydDogSUUgPD05IG9ubHkKLy8gUGFuaWMgYmFzZWQgYXBwcm9hY2ggdG8gc2V0dGluZyB0aGluZ3Mgb24gZGlzY29ubmVjdGVkIG5vZGVzClR3ZWVuLnByb3BIb29rcy5zY3JvbGxUb3AgPSBUd2Vlbi5wcm9wSG9va3Muc2Nyb2xsTGVmdCA9IHsKCXNldDogZnVuY3Rpb24oIHR3ZWVuICkgewoJCWlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7CgkJCXR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdzsKCQl9Cgl9Cn07CgpqUXVlcnkuZWFzaW5nID0gewoJbGluZWFyOiBmdW5jdGlvbiggcCApIHsKCQlyZXR1cm4gcDsKCX0sCglzd2luZzogZnVuY3Rpb24oIHAgKSB7CgkJcmV0dXJuIDAuNSAtIE1hdGguY29zKCBwICogTWF0aC5QSSApIC8gMjsKCX0sCglfZGVmYXVsdDogInN3aW5nIgp9OwoKalF1ZXJ5LmZ4ID0gVHdlZW4ucHJvdG90eXBlLmluaXQ7CgovLyBCYWNrIGNvbXBhdCA8MS44IGV4dGVuc2lvbiBwb2ludApqUXVlcnkuZnguc3RlcCA9IHt9OwoKCgoKdmFyCglmeE5vdywgaW5Qcm9ncmVzcywKCXJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLAoJcnJ1biA9IC9xdWV1ZUhvb2tzJC87CgpmdW5jdGlvbiBzY2hlZHVsZSgpIHsKCWlmICggaW5Qcm9ncmVzcyApIHsKCQlpZiAoIGRvY3VtZW50LmhpZGRlbiA9PT0gZmFsc2UgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSApIHsKCQkJd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSggc2NoZWR1bGUgKTsKCQl9IGVsc2UgewoJCQl3aW5kb3cuc2V0VGltZW91dCggc2NoZWR1bGUsIGpRdWVyeS5meC5pbnRlcnZhbCApOwoJCX0KCgkJalF1ZXJ5LmZ4LnRpY2soKTsKCX0KfQoKLy8gQW5pbWF0aW9ucyBjcmVhdGVkIHN5bmNocm9ub3VzbHkgd2lsbCBydW4gc3luY2hyb25vdXNseQpmdW5jdGlvbiBjcmVhdGVGeE5vdygpIHsKCXdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsKCQlmeE5vdyA9IHVuZGVmaW5lZDsKCX0gKTsKCXJldHVybiAoIGZ4Tm93ID0gRGF0ZS5ub3coKSApOwp9CgovLyBHZW5lcmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlvbgpmdW5jdGlvbiBnZW5GeCggdHlwZSwgaW5jbHVkZVdpZHRoICkgewoJdmFyIHdoaWNoLAoJCWkgPSAwLAoJCWF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfTsKCgkvLyBJZiB3ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4cGFuZCB2YWx1ZXMsCgkvLyBvdGhlcndpc2Ugc3RlcCB2YWx1ZSBpcyAyIHRvIHNraXAgb3ZlciBMZWZ0IGFuZCBSaWdodAoJaW5jbHVkZVdpZHRoID0gaW5jbHVkZVdpZHRoID8gMSA6IDA7Cglmb3IgKCA7IGkgPCA0OyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7CgkJd2hpY2ggPSBjc3NFeHBhbmRbIGkgXTsKCQlhdHRyc1sgIm1hcmdpbiIgKyB3aGljaCBdID0gYXR0cnNbICJwYWRkaW5nIiArIHdoaWNoIF0gPSB0eXBlOwoJfQoKCWlmICggaW5jbHVkZVdpZHRoICkgewoJCWF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7Cgl9CgoJcmV0dXJuIGF0dHJzOwp9CgpmdW5jdGlvbiBjcmVhdGVUd2VlbiggdmFsdWUsIHByb3AsIGFuaW1hdGlvbiApIHsKCXZhciB0d2VlbiwKCQljb2xsZWN0aW9uID0gKCBBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSB8fCBbXSApLmNvbmNhdCggQW5pbWF0aW9uLnR3ZWVuZXJzWyAiKiIgXSApLAoJCWluZGV4ID0gMCwKCQlsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDsKCWZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7CgkJaWYgKCAoIHR3ZWVuID0gY29sbGVjdGlvblsgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIHByb3AsIHZhbHVlICkgKSApIHsKCgkJCS8vIFdlJ3JlIGRvbmUgd2l0aCB0aGlzIHByb3BlcnR5CgkJCXJldHVybiB0d2VlbjsKCQl9Cgl9Cn0KCmZ1bmN0aW9uIGRlZmF1bHRQcmVmaWx0ZXIoIGVsZW0sIHByb3BzLCBvcHRzICkgewoJdmFyIHByb3AsIHZhbHVlLCB0b2dnbGUsIGhvb2tzLCBvbGRmaXJlLCBwcm9wVHdlZW4sIHJlc3RvcmVEaXNwbGF5LCBkaXNwbGF5LAoJCWlzQm94ID0gIndpZHRoIiBpbiBwcm9wcyB8fCAiaGVpZ2h0IiBpbiBwcm9wcywKCQlhbmltID0gdGhpcywKCQlvcmlnID0ge30sCgkJc3R5bGUgPSBlbGVtLnN0eWxlLAoJCWhpZGRlbiA9IGVsZW0ubm9kZVR5cGUgJiYgaXNIaWRkZW5XaXRoaW5UcmVlKCBlbGVtICksCgkJZGF0YVNob3cgPSBkYXRhUHJpdi5nZXQoIGVsZW0sICJmeHNob3ciICk7CgoJLy8gUXVldWUtc2tpcHBpbmcgYW5pbWF0aW9ucyBoaWphY2sgdGhlIGZ4IGhvb2tzCglpZiAoICFvcHRzLnF1ZXVlICkgewoJCWhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCAiZngiICk7CgkJaWYgKCBob29rcy51bnF1ZXVlZCA9PSBudWxsICkgewoJCQlob29rcy51bnF1ZXVlZCA9IDA7CgkJCW9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlOwoJCQlob29rcy5lbXB0eS5maXJlID0gZnVuY3Rpb24oKSB7CgkJCQlpZiAoICFob29rcy51bnF1ZXVlZCApIHsKCQkJCQlvbGRmaXJlKCk7CgkJCQl9CgkJCX07CgkJfQoJCWhvb2tzLnVucXVldWVkKys7CgoJCWFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHsKCgkJCS8vIEVuc3VyZSB0aGUgY29tcGxldGUgaGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgY29tcGxldGVzCgkJCWFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHsKCQkJCWhvb2tzLnVucXVldWVkLS07CgkJCQlpZiAoICFqUXVlcnkucXVldWUoIGVsZW0sICJmeCIgKS5sZW5ndGggKSB7CgkJCQkJaG9va3MuZW1wdHkuZmlyZSgpOwoJCQkJfQoJCQl9ICk7CgkJfSApOwoJfQoKCS8vIERldGVjdCBzaG93L2hpZGUgYW5pbWF0aW9ucwoJZm9yICggcHJvcCBpbiBwcm9wcyApIHsKCQl2YWx1ZSA9IHByb3BzWyBwcm9wIF07CgkJaWYgKCByZnh0eXBlcy50ZXN0KCB2YWx1ZSApICkgewoJCQlkZWxldGUgcHJvcHNbIHByb3AgXTsKCQkJdG9nZ2xlID0gdG9nZ2xlIHx8IHZhbHVlID09PSAidG9nZ2xlIjsKCQkJaWYgKCB2YWx1ZSA9PT0gKCBoaWRkZW4gPyAiaGlkZSIgOiAic2hvdyIgKSApIHsKCgkJCQkvLyBQcmV0ZW5kIHRvIGJlIGhpZGRlbiBpZiB0aGlzIGlzIGEgInNob3ciIGFuZAoJCQkJLy8gdGhlcmUgaXMgc3RpbGwgZGF0YSBmcm9tIGEgc3RvcHBlZCBzaG93L2hpZGUKCQkJCWlmICggdmFsdWUgPT09ICJzaG93IiAmJiBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJaGlkZGVuID0gdHJ1ZTsKCgkJCQkvLyBJZ25vcmUgYWxsIG90aGVyIG5vLW9wIHNob3cvaGlkZSBkYXRhCgkJCQl9IGVsc2UgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQl9CgkJCW9yaWdbIHByb3AgXSA9IGRhdGFTaG93ICYmIGRhdGFTaG93WyBwcm9wIF0gfHwgalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wICk7CgkJfQoJfQoKCS8vIEJhaWwgb3V0IGlmIHRoaXMgaXMgYSBuby1vcCBsaWtlIC5oaWRlKCkuaGlkZSgpCglwcm9wVHdlZW4gPSAhalF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3BzICk7CglpZiAoICFwcm9wVHdlZW4gJiYgalF1ZXJ5LmlzRW1wdHlPYmplY3QoIG9yaWcgKSApIHsKCQlyZXR1cm47Cgl9CgoJLy8gUmVzdHJpY3QgIm92ZXJmbG93IiBhbmQgImRpc3BsYXkiIHN0eWxlcyBkdXJpbmcgYm94IGFuaW1hdGlvbnMKCWlmICggaXNCb3ggJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCgkJLy8gU3VwcG9ydDogSUUgPD05IC0gMTEsIEVkZ2UgMTIgLSAxNQoJCS8vIFJlY29yZCBhbGwgMyBvdmVyZmxvdyBhdHRyaWJ1dGVzIGJlY2F1c2UgSUUgZG9lcyBub3QgaW5mZXIgdGhlIHNob3J0aGFuZAoJCS8vIGZyb20gaWRlbnRpY2FsbHktdmFsdWVkIG92ZXJmbG93WCBhbmQgb3ZlcmZsb3dZIGFuZCBFZGdlIGp1c3QgbWlycm9ycwoJCS8vIHRoZSBvdmVyZmxvd1ggdmFsdWUgdGhlcmUuCgkJb3B0cy5vdmVyZmxvdyA9IFsgc3R5bGUub3ZlcmZsb3csIHN0eWxlLm92ZXJmbG93WCwgc3R5bGUub3ZlcmZsb3dZIF07CgoJCS8vIElkZW50aWZ5IGEgZGlzcGxheSB0eXBlLCBwcmVmZXJyaW5nIG9sZCBzaG93L2hpZGUgZGF0YSBvdmVyIHRoZSBDU1MgY2FzY2FkZQoJCXJlc3RvcmVEaXNwbGF5ID0gZGF0YVNob3cgJiYgZGF0YVNob3cuZGlzcGxheTsKCQlpZiAoIHJlc3RvcmVEaXNwbGF5ID09IG51bGwgKSB7CgkJCXJlc3RvcmVEaXNwbGF5ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCAiZGlzcGxheSIgKTsKCQl9CgkJZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApOwoJCWlmICggZGlzcGxheSA9PT0gIm5vbmUiICkgewoJCQlpZiAoIHJlc3RvcmVEaXNwbGF5ICkgewoJCQkJZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5OwoJCQl9IGVsc2UgewoKCQkJCS8vIEdldCBub25lbXB0eSB2YWx1ZShzKSBieSB0ZW1wb3JhcmlseSBmb3JjaW5nIHZpc2liaWxpdHkKCQkJCXNob3dIaWRlKCBbIGVsZW0gXSwgdHJ1ZSApOwoJCQkJcmVzdG9yZURpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXkgfHwgcmVzdG9yZURpc3BsYXk7CgkJCQlkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICk7CgkJCQlzaG93SGlkZSggWyBlbGVtIF0gKTsKCQkJfQoJCX0KCgkJLy8gQW5pbWF0ZSBpbmxpbmUgZWxlbWVudHMgYXMgaW5saW5lLWJsb2NrCgkJaWYgKCBkaXNwbGF5ID09PSAiaW5saW5lIiB8fCBkaXNwbGF5ID09PSAiaW5saW5lLWJsb2NrIiAmJiByZXN0b3JlRGlzcGxheSAhPSBudWxsICkgewoJCQlpZiAoIGpRdWVyeS5jc3MoIGVsZW0sICJmbG9hdCIgKSA9PT0gIm5vbmUiICkgewoKCQkJCS8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIGRpc3BsYXkgdmFsdWUgYXQgdGhlIGVuZCBvZiBwdXJlIHNob3cvaGlkZSBhbmltYXRpb25zCgkJCQlpZiAoICFwcm9wVHdlZW4gKSB7CgkJCQkJYW5pbS5kb25lKCBmdW5jdGlvbigpIHsKCQkJCQkJc3R5bGUuZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5OwoJCQkJCX0gKTsKCQkJCQlpZiAoIHJlc3RvcmVEaXNwbGF5ID09IG51bGwgKSB7CgkJCQkJCWRpc3BsYXkgPSBzdHlsZS5kaXNwbGF5OwoJCQkJCQlyZXN0b3JlRGlzcGxheSA9IGRpc3BsYXkgPT09ICJub25lIiA/ICIiIDogZGlzcGxheTsKCQkJCQl9CgkJCQl9CgkJCQlzdHlsZS5kaXNwbGF5ID0gImlubGluZS1ibG9jayI7CgkJCX0KCQl9Cgl9CgoJaWYgKCBvcHRzLm92ZXJmbG93ICkgewoJCXN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CgkJYW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkgewoJCQlzdHlsZS5vdmVyZmxvdyA9IG9wdHMub3ZlcmZsb3dbIDAgXTsKCQkJc3R5bGUub3ZlcmZsb3dYID0gb3B0cy5vdmVyZmxvd1sgMSBdOwoJCQlzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07CgkJfSApOwoJfQoKCS8vIEltcGxlbWVudCBzaG93L2hpZGUgYW5pbWF0aW9ucwoJcHJvcFR3ZWVuID0gZmFsc2U7Cglmb3IgKCBwcm9wIGluIG9yaWcgKSB7CgoJCS8vIEdlbmVyYWwgc2hvdy9oaWRlIHNldHVwIGZvciB0aGlzIGVsZW1lbnQgYW5pbWF0aW9uCgkJaWYgKCAhcHJvcFR3ZWVuICkgewoJCQlpZiAoIGRhdGFTaG93ICkgewoJCQkJaWYgKCAiaGlkZGVuIiBpbiBkYXRhU2hvdyApIHsKCQkJCQloaWRkZW4gPSBkYXRhU2hvdy5oaWRkZW47CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlkYXRhU2hvdyA9IGRhdGFQcml2LmFjY2VzcyggZWxlbSwgImZ4c2hvdyIsIHsgZGlzcGxheTogcmVzdG9yZURpc3BsYXkgfSApOwoJCQl9CgoJCQkvLyBTdG9yZSBoaWRkZW4vdmlzaWJsZSBmb3IgdG9nZ2xlIHNvIGAuc3RvcCgpLnRvZ2dsZSgpYCAicmV2ZXJzZXMiCgkJCWlmICggdG9nZ2xlICkgewoJCQkJZGF0YVNob3cuaGlkZGVuID0gIWhpZGRlbjsKCQkJfQoKCQkJLy8gU2hvdyBlbGVtZW50cyBiZWZvcmUgYW5pbWF0aW5nIHRoZW0KCQkJaWYgKCBoaWRkZW4gKSB7CgkJCQlzaG93SGlkZSggWyBlbGVtIF0sIHRydWUgKTsKCQkJfQoKCQkJLyogZXNsaW50LWRpc2FibGUgbm8tbG9vcC1mdW5jICovCgoJCQlhbmltLmRvbmUoIGZ1bmN0aW9uKCkgewoKCQkJLyogZXNsaW50LWVuYWJsZSBuby1sb29wLWZ1bmMgKi8KCgkJCQkvLyBUaGUgZmluYWwgc3RlcCBvZiBhICJoaWRlIiBhbmltYXRpb24gaXMgYWN0dWFsbHkgaGlkaW5nIHRoZSBlbGVtZW50CgkJCQlpZiAoICFoaWRkZW4gKSB7CgkJCQkJc2hvd0hpZGUoIFsgZWxlbSBdICk7CgkJCQl9CgkJCQlkYXRhUHJpdi5yZW1vdmUoIGVsZW0sICJmeHNob3ciICk7CgkJCQlmb3IgKCBwcm9wIGluIG9yaWcgKSB7CgkJCQkJalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBvcmlnWyBwcm9wIF0gKTsKCQkJCX0KCQkJfSApOwoJCX0KCgkJLy8gUGVyLXByb3BlcnR5IHNldHVwCgkJcHJvcFR3ZWVuID0gY3JlYXRlVHdlZW4oIGhpZGRlbiA/IGRhdGFTaG93WyBwcm9wIF0gOiAwLCBwcm9wLCBhbmltICk7CgkJaWYgKCAhKCBwcm9wIGluIGRhdGFTaG93ICkgKSB7CgkJCWRhdGFTaG93WyBwcm9wIF0gPSBwcm9wVHdlZW4uc3RhcnQ7CgkJCWlmICggaGlkZGVuICkgewoJCQkJcHJvcFR3ZWVuLmVuZCA9IHByb3BUd2Vlbi5zdGFydDsKCQkJCXByb3BUd2Vlbi5zdGFydCA9IDA7CgkJCX0KCQl9Cgl9Cn0KCmZ1bmN0aW9uIHByb3BGaWx0ZXIoIHByb3BzLCBzcGVjaWFsRWFzaW5nICkgewoJdmFyIGluZGV4LCBuYW1lLCBlYXNpbmcsIHZhbHVlLCBob29rczsKCgkvLyBjYW1lbENhc2UsIHNwZWNpYWxFYXNpbmcgYW5kIGV4cGFuZCBjc3NIb29rIHBhc3MKCWZvciAoIGluZGV4IGluIHByb3BzICkgewoJCW5hbWUgPSBjYW1lbENhc2UoIGluZGV4ICk7CgkJZWFzaW5nID0gc3BlY2lhbEVhc2luZ1sgbmFtZSBdOwoJCXZhbHVlID0gcHJvcHNbIGluZGV4IF07CgkJaWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkgewoJCQllYXNpbmcgPSB2YWx1ZVsgMSBdOwoJCQl2YWx1ZSA9IHByb3BzWyBpbmRleCBdID0gdmFsdWVbIDAgXTsKCQl9CgoJCWlmICggaW5kZXggIT09IG5hbWUgKSB7CgkJCXByb3BzWyBuYW1lIF0gPSB2YWx1ZTsKCQkJZGVsZXRlIHByb3BzWyBpbmRleCBdOwoJCX0KCgkJaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXTsKCQlpZiAoIGhvb2tzICYmICJleHBhbmQiIGluIGhvb2tzICkgewoJCQl2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTsKCQkJZGVsZXRlIHByb3BzWyBuYW1lIF07CgoJCQkvLyBOb3QgcXVpdGUgJC5leHRlbmQsIHRoaXMgd29uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGtleXMuCgkJCS8vIFJldXNpbmcgJ2luZGV4JyBiZWNhdXNlIHdlIGhhdmUgdGhlIGNvcnJlY3QgIm5hbWUiCgkJCWZvciAoIGluZGV4IGluIHZhbHVlICkgewoJCQkJaWYgKCAhKCBpbmRleCBpbiBwcm9wcyApICkgewoJCQkJCXByb3BzWyBpbmRleCBdID0gdmFsdWVbIGluZGV4IF07CgkJCQkJc3BlY2lhbEVhc2luZ1sgaW5kZXggXSA9IGVhc2luZzsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCXNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZzsKCQl9Cgl9Cn0KCmZ1bmN0aW9uIEFuaW1hdGlvbiggZWxlbSwgcHJvcGVydGllcywgb3B0aW9ucyApIHsKCXZhciByZXN1bHQsCgkJc3RvcHBlZCwKCQlpbmRleCA9IDAsCgkJbGVuZ3RoID0gQW5pbWF0aW9uLnByZWZpbHRlcnMubGVuZ3RoLAoJCWRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCkuYWx3YXlzKCBmdW5jdGlvbigpIHsKCgkJCS8vIERvbid0IG1hdGNoIGVsZW0gaW4gdGhlIDphbmltYXRlZCBzZWxlY3RvcgoJCQlkZWxldGUgdGljay5lbGVtOwoJCX0gKSwKCQl0aWNrID0gZnVuY3Rpb24oKSB7CgkJCWlmICggc3RvcHBlZCApIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQl2YXIgY3VycmVudFRpbWUgPSBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLAoJCQkJcmVtYWluaW5nID0gTWF0aC5tYXgoIDAsIGFuaW1hdGlvbi5zdGFydFRpbWUgKyBhbmltYXRpb24uZHVyYXRpb24gLSBjdXJyZW50VGltZSApLAoKCQkJCS8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zIG9ubHkKCQkJCS8vIEFyY2hhaWMgY3Jhc2ggYnVnIHdvbid0IGFsbG93IHVzIHRvIHVzZSBgMSAtICggMC41IHx8IDAgKWAgKCMxMjQ5NykKCQkJCXRlbXAgPSByZW1haW5pbmcgLyBhbmltYXRpb24uZHVyYXRpb24gfHwgMCwKCQkJCXBlcmNlbnQgPSAxIC0gdGVtcCwKCQkJCWluZGV4ID0gMCwKCQkJCWxlbmd0aCA9IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoOwoKCQkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQkJCWFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCBwZXJjZW50ICk7CgkJCX0KCgkJCWRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBwZXJjZW50LCByZW1haW5pbmcgXSApOwoKCQkJLy8gSWYgdGhlcmUncyBtb3JlIHRvIGRvLCB5aWVsZAoJCQlpZiAoIHBlcmNlbnQgPCAxICYmIGxlbmd0aCApIHsKCQkJCXJldHVybiByZW1haW5pbmc7CgkJCX0KCgkJCS8vIElmIHRoaXMgd2FzIGFuIGVtcHR5IGFuaW1hdGlvbiwgc3ludGhlc2l6ZSBhIGZpbmFsIHByb2dyZXNzIG5vdGlmaWNhdGlvbgoJCQlpZiAoICFsZW5ndGggKSB7CgkJCQlkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgMSwgMCBdICk7CgkJCX0KCgkJCS8vIFJlc29sdmUgdGhlIGFuaW1hdGlvbiBhbmQgcmVwb3J0IGl0cyBjb25jbHVzaW9uCgkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiBdICk7CgkJCXJldHVybiBmYWxzZTsKCQl9LAoJCWFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2UoIHsKCQkJZWxlbTogZWxlbSwKCQkJcHJvcHM6IGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wZXJ0aWVzICksCgkJCW9wdHM6IGpRdWVyeS5leHRlbmQoIHRydWUsIHsKCQkJCXNwZWNpYWxFYXNpbmc6IHt9LAoJCQkJZWFzaW5nOiBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0CgkJCX0sIG9wdGlvbnMgKSwKCQkJb3JpZ2luYWxQcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLAoJCQlvcmlnaW5hbE9wdGlvbnM6IG9wdGlvbnMsCgkJCXN0YXJ0VGltZTogZnhOb3cgfHwgY3JlYXRlRnhOb3coKSwKCQkJZHVyYXRpb246IG9wdGlvbnMuZHVyYXRpb24sCgkJCXR3ZWVuczogW10sCgkJCWNyZWF0ZVR3ZWVuOiBmdW5jdGlvbiggcHJvcCwgZW5kICkgewoJCQkJdmFyIHR3ZWVuID0galF1ZXJ5LlR3ZWVuKCBlbGVtLCBhbmltYXRpb24ub3B0cywgcHJvcCwgZW5kLAoJCQkJCQlhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nWyBwcm9wIF0gfHwgYW5pbWF0aW9uLm9wdHMuZWFzaW5nICk7CgkJCQlhbmltYXRpb24udHdlZW5zLnB1c2goIHR3ZWVuICk7CgkJCQlyZXR1cm4gdHdlZW47CgkJCX0sCgkJCXN0b3A6IGZ1bmN0aW9uKCBnb3RvRW5kICkgewoJCQkJdmFyIGluZGV4ID0gMCwKCgkJCQkJLy8gSWYgd2UgYXJlIGdvaW5nIHRvIHRoZSBlbmQsIHdlIHdhbnQgdG8gcnVuIGFsbCB0aGUgdHdlZW5zCgkJCQkJLy8gb3RoZXJ3aXNlIHdlIHNraXAgdGhpcyBwYXJ0CgkJCQkJbGVuZ3RoID0gZ290b0VuZCA/IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoIDogMDsKCQkJCWlmICggc3RvcHBlZCApIHsKCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0KCQkJCXN0b3BwZWQgPSB0cnVlOwoJCQkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQkJCQlhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggMSApOwoJCQkJfQoKCQkJCS8vIFJlc29sdmUgd2hlbiB3ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWU7IG90aGVyd2lzZSwgcmVqZWN0CgkJCQlpZiAoIGdvdG9FbmQgKSB7CgkJCQkJZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApOwoJCQkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7CgkJCQl9IGVsc2UgewoJCQkJCWRlZmVycmVkLnJlamVjdFdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTsKCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9CgkJfSApLAoJCXByb3BzID0gYW5pbWF0aW9uLnByb3BzOwoKCXByb3BGaWx0ZXIoIHByb3BzLCBhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nICk7CgoJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQlyZXN1bHQgPSBBbmltYXRpb24ucHJlZmlsdGVyc1sgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIGVsZW0sIHByb3BzLCBhbmltYXRpb24ub3B0cyApOwoJCWlmICggcmVzdWx0ICkgewoJCQlpZiAoIGlzRnVuY3Rpb24oIHJlc3VsdC5zdG9wICkgKSB7CgkJCQlqUXVlcnkuX3F1ZXVlSG9va3MoIGFuaW1hdGlvbi5lbGVtLCBhbmltYXRpb24ub3B0cy5xdWV1ZSApLnN0b3AgPQoJCQkJCXJlc3VsdC5zdG9wLmJpbmQoIHJlc3VsdCApOwoJCQl9CgkJCXJldHVybiByZXN1bHQ7CgkJfQoJfQoKCWpRdWVyeS5tYXAoIHByb3BzLCBjcmVhdGVUd2VlbiwgYW5pbWF0aW9uICk7CgoJaWYgKCBpc0Z1bmN0aW9uKCBhbmltYXRpb24ub3B0cy5zdGFydCApICkgewoJCWFuaW1hdGlvbi5vcHRzLnN0YXJ0LmNhbGwoIGVsZW0sIGFuaW1hdGlvbiApOwoJfQoKCS8vIEF0dGFjaCBjYWxsYmFja3MgZnJvbSBvcHRpb25zCglhbmltYXRpb24KCQkucHJvZ3Jlc3MoIGFuaW1hdGlvbi5vcHRzLnByb2dyZXNzICkKCQkuZG9uZSggYW5pbWF0aW9uLm9wdHMuZG9uZSwgYW5pbWF0aW9uLm9wdHMuY29tcGxldGUgKQoJCS5mYWlsKCBhbmltYXRpb24ub3B0cy5mYWlsICkKCQkuYWx3YXlzKCBhbmltYXRpb24ub3B0cy5hbHdheXMgKTsKCglqUXVlcnkuZngudGltZXIoCgkJalF1ZXJ5LmV4dGVuZCggdGljaywgewoJCQllbGVtOiBlbGVtLAoJCQlhbmltOiBhbmltYXRpb24sCgkJCXF1ZXVlOiBhbmltYXRpb24ub3B0cy5xdWV1ZQoJCX0gKQoJKTsKCglyZXR1cm4gYW5pbWF0aW9uOwp9CgpqUXVlcnkuQW5pbWF0aW9uID0galF1ZXJ5LmV4dGVuZCggQW5pbWF0aW9uLCB7CgoJdHdlZW5lcnM6IHsKCQkiKiI6IFsgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkgewoJCQl2YXIgdHdlZW4gPSB0aGlzLmNyZWF0ZVR3ZWVuKCBwcm9wLCB2YWx1ZSApOwoJCQlhZGp1c3RDU1MoIHR3ZWVuLmVsZW0sIHByb3AsIHJjc3NOdW0uZXhlYyggdmFsdWUgKSwgdHdlZW4gKTsKCQkJcmV0dXJuIHR3ZWVuOwoJCX0gXQoJfSwKCgl0d2VlbmVyOiBmdW5jdGlvbiggcHJvcHMsIGNhbGxiYWNrICkgewoJCWlmICggaXNGdW5jdGlvbiggcHJvcHMgKSApIHsKCQkJY2FsbGJhY2sgPSBwcm9wczsKCQkJcHJvcHMgPSBbICIqIiBdOwoJCX0gZWxzZSB7CgkJCXByb3BzID0gcHJvcHMubWF0Y2goIHJub3RodG1sd2hpdGUgKTsKCQl9CgoJCXZhciBwcm9wLAoJCQlpbmRleCA9IDAsCgkJCWxlbmd0aCA9IHByb3BzLmxlbmd0aDsKCgkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQkJcHJvcCA9IHByb3BzWyBpbmRleCBdOwoJCQlBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSA9IEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdIHx8IFtdOwoJCQlBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXS51bnNoaWZ0KCBjYWxsYmFjayApOwoJCX0KCX0sCgoJcHJlZmlsdGVyczogWyBkZWZhdWx0UHJlZmlsdGVyIF0sCgoJcHJlZmlsdGVyOiBmdW5jdGlvbiggY2FsbGJhY2ssIHByZXBlbmQgKSB7CgkJaWYgKCBwcmVwZW5kICkgewoJCQlBbmltYXRpb24ucHJlZmlsdGVycy51bnNoaWZ0KCBjYWxsYmFjayApOwoJCX0gZWxzZSB7CgkJCUFuaW1hdGlvbi5wcmVmaWx0ZXJzLnB1c2goIGNhbGxiYWNrICk7CgkJfQoJfQp9ICk7CgpqUXVlcnkuc3BlZWQgPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgZm4gKSB7Cgl2YXIgb3B0ID0gc3BlZWQgJiYgdHlwZW9mIHNwZWVkID09PSAib2JqZWN0IiA/IGpRdWVyeS5leHRlbmQoIHt9LCBzcGVlZCApIDogewoJCWNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8CgkJCWlzRnVuY3Rpb24oIHNwZWVkICkgJiYgc3BlZWQsCgkJZHVyYXRpb246IHNwZWVkLAoJCWVhc2luZzogZm4gJiYgZWFzaW5nIHx8IGVhc2luZyAmJiAhaXNGdW5jdGlvbiggZWFzaW5nICkgJiYgZWFzaW5nCgl9OwoKCS8vIEdvIHRvIHRoZSBlbmQgc3RhdGUgaWYgZnggYXJlIG9mZgoJaWYgKCBqUXVlcnkuZngub2ZmICkgewoJCW9wdC5kdXJhdGlvbiA9IDA7CgoJfSBlbHNlIHsKCQlpZiAoIHR5cGVvZiBvcHQuZHVyYXRpb24gIT09ICJudW1iZXIiICkgewoJCQlpZiAoIG9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRzICkgewoJCQkJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4LnNwZWVkc1sgb3B0LmR1cmF0aW9uIF07CgoJCQl9IGVsc2UgewoJCQkJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDsKCQkJfQoJCX0KCX0KCgkvLyBOb3JtYWxpemUgb3B0LnF1ZXVlIC0gdHJ1ZS91bmRlZmluZWQvbnVsbCAtPiAiZngiCglpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9wdC5xdWV1ZSA9PT0gdHJ1ZSApIHsKCQlvcHQucXVldWUgPSAiZngiOwoJfQoKCS8vIFF1ZXVlaW5nCglvcHQub2xkID0gb3B0LmNvbXBsZXRlOwoKCW9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkgewoJCWlmICggaXNGdW5jdGlvbiggb3B0Lm9sZCApICkgewoJCQlvcHQub2xkLmNhbGwoIHRoaXMgKTsKCQl9CgoJCWlmICggb3B0LnF1ZXVlICkgewoJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgb3B0LnF1ZXVlICk7CgkJfQoJfTsKCglyZXR1cm4gb3B0Owp9OwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJZmFkZVRvOiBmdW5jdGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkgewoKCQkvLyBTaG93IGFueSBoaWRkZW4gZWxlbWVudHMgYWZ0ZXIgc2V0dGluZyBvcGFjaXR5IHRvIDAKCQlyZXR1cm4gdGhpcy5maWx0ZXIoIGlzSGlkZGVuV2l0aGluVHJlZSApLmNzcyggIm9wYWNpdHkiLCAwICkuc2hvdygpCgoJCQkvLyBBbmltYXRlIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQKCQkJLmVuZCgpLmFuaW1hdGUoIHsgb3BhY2l0eTogdG8gfSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTsKCX0sCglhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7CgkJdmFyIGVtcHR5ID0galF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3AgKSwKCQkJb3B0YWxsID0galF1ZXJ5LnNwZWVkKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApLAoJCQlkb0FuaW1hdGlvbiA9IGZ1bmN0aW9uKCkgewoKCQkJCS8vIE9wZXJhdGUgb24gYSBjb3B5IG9mIHByb3Agc28gcGVyLXByb3BlcnR5IGVhc2luZyB3b24ndCBiZSBsb3N0CgkJCQl2YXIgYW5pbSA9IEFuaW1hdGlvbiggdGhpcywgalF1ZXJ5LmV4dGVuZCgge30sIHByb3AgKSwgb3B0YWxsICk7CgoJCQkJLy8gRW1wdHkgYW5pbWF0aW9ucywgb3IgZmluaXNoaW5nIHJlc29sdmVzIGltbWVkaWF0ZWx5CgkJCQlpZiAoIGVtcHR5IHx8IGRhdGFQcml2LmdldCggdGhpcywgImZpbmlzaCIgKSApIHsKCQkJCQlhbmltLnN0b3AoIHRydWUgKTsKCQkJCX0KCQkJfTsKCQkJZG9BbmltYXRpb24uZmluaXNoID0gZG9BbmltYXRpb247CgoJCXJldHVybiBlbXB0eSB8fCBvcHRhbGwucXVldWUgPT09IGZhbHNlID8KCQkJdGhpcy5lYWNoKCBkb0FuaW1hdGlvbiApIDoKCQkJdGhpcy5xdWV1ZSggb3B0YWxsLnF1ZXVlLCBkb0FuaW1hdGlvbiApOwoJfSwKCXN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5kICkgewoJCXZhciBzdG9wUXVldWUgPSBmdW5jdGlvbiggaG9va3MgKSB7CgkJCXZhciBzdG9wID0gaG9va3Muc3RvcDsKCQkJZGVsZXRlIGhvb2tzLnN0b3A7CgkJCXN0b3AoIGdvdG9FbmQgKTsKCQl9OwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJZ290b0VuZCA9IGNsZWFyUXVldWU7CgkJCWNsZWFyUXVldWUgPSB0eXBlOwoJCQl0eXBlID0gdW5kZWZpbmVkOwoJCX0KCQlpZiAoIGNsZWFyUXVldWUgJiYgdHlwZSAhPT0gZmFsc2UgKSB7CgkJCXRoaXMucXVldWUoIHR5cGUgfHwgImZ4IiwgW10gKTsKCQl9CgoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQl2YXIgZGVxdWV1ZSA9IHRydWUsCgkJCQlpbmRleCA9IHR5cGUgIT0gbnVsbCAmJiB0eXBlICsgInF1ZXVlSG9va3MiLAoJCQkJdGltZXJzID0galF1ZXJ5LnRpbWVycywKCQkJCWRhdGEgPSBkYXRhUHJpdi5nZXQoIHRoaXMgKTsKCgkJCWlmICggaW5kZXggKSB7CgkJCQlpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICkgewoJCQkJCXN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJZm9yICggaW5kZXggaW4gZGF0YSApIHsKCQkJCQlpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICYmIHJydW4udGVzdCggaW5kZXggKSApIHsKCQkJCQkJc3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQlmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkgewoJCQkJaWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJgoJCQkJCSggdHlwZSA9PSBudWxsIHx8IHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApICkgewoKCQkJCQl0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCBnb3RvRW5kICk7CgkJCQkJZGVxdWV1ZSA9IGZhbHNlOwoJCQkJCXRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7CgkJCQl9CgkJCX0KCgkJCS8vIFN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQuCgkJCS8vIFRpbWVycyBjdXJyZW50bHkgd2lsbCBjYWxsIHRoZWlyIGNvbXBsZXRlIGNhbGxiYWNrcywgd2hpY2gKCQkJLy8gd2lsbCBkZXF1ZXVlIGJ1dCBvbmx5IGlmIHRoZXkgd2VyZSBnb3RvRW5kLgoJCQlpZiAoIGRlcXVldWUgfHwgIWdvdG9FbmQgKSB7CgkJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOwoJCQl9CgkJfSApOwoJfSwKCWZpbmlzaDogZnVuY3Rpb24oIHR5cGUgKSB7CgkJaWYgKCB0eXBlICE9PSBmYWxzZSApIHsKCQkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCQl9CgkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCXZhciBpbmRleCwKCQkJCWRhdGEgPSBkYXRhUHJpdi5nZXQoIHRoaXMgKSwKCQkJCXF1ZXVlID0gZGF0YVsgdHlwZSArICJxdWV1ZSIgXSwKCQkJCWhvb2tzID0gZGF0YVsgdHlwZSArICJxdWV1ZUhvb2tzIiBdLAoJCQkJdGltZXJzID0galF1ZXJ5LnRpbWVycywKCQkJCWxlbmd0aCA9IHF1ZXVlID8gcXVldWUubGVuZ3RoIDogMDsKCgkJCS8vIEVuYWJsZSBmaW5pc2hpbmcgZmxhZyBvbiBwcml2YXRlIGRhdGEKCQkJZGF0YS5maW5pc2ggPSB0cnVlOwoKCQkJLy8gRW1wdHkgdGhlIHF1ZXVlIGZpcnN0CgkJCWpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgW10gKTsKCgkJCWlmICggaG9va3MgJiYgaG9va3Muc3RvcCApIHsKCQkJCWhvb2tzLnN0b3AuY2FsbCggdGhpcywgdHJ1ZSApOwoJCQl9CgoJCQkvLyBMb29rIGZvciBhbnkgYWN0aXZlIGFuaW1hdGlvbnMsIGFuZCBmaW5pc2ggdGhlbQoJCQlmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkgewoJCQkJaWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJiB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSB7CgkJCQkJdGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggdHJ1ZSApOwoJCQkJCXRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7CgkJCQl9CgkJCX0KCgkJCS8vIExvb2sgZm9yIGFueSBhbmltYXRpb25zIGluIHRoZSBvbGQgcXVldWUgYW5kIGZpbmlzaCB0aGVtCgkJCWZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7CgkJCQlpZiAoIHF1ZXVlWyBpbmRleCBdICYmIHF1ZXVlWyBpbmRleCBdLmZpbmlzaCApIHsKCQkJCQlxdWV1ZVsgaW5kZXggXS5maW5pc2guY2FsbCggdGhpcyApOwoJCQkJfQoJCQl9CgoJCQkvLyBUdXJuIG9mZiBmaW5pc2hpbmcgZmxhZwoJCQlkZWxldGUgZGF0YS5maW5pc2g7CgkJfSApOwoJfQp9ICk7CgpqUXVlcnkuZWFjaCggWyAidG9nZ2xlIiwgInNob3ciLCAiaGlkZSIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7Cgl2YXIgY3NzRm4gPSBqUXVlcnkuZm5bIG5hbWUgXTsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiBzcGVlZCA9PSBudWxsIHx8IHR5cGVvZiBzcGVlZCA9PT0gImJvb2xlYW4iID8KCQkJY3NzRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIDoKCQkJdGhpcy5hbmltYXRlKCBnZW5GeCggbmFtZSwgdHJ1ZSApLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwoJfTsKfSApOwoKLy8gR2VuZXJhdGUgc2hvcnRjdXRzIGZvciBjdXN0b20gYW5pbWF0aW9ucwpqUXVlcnkuZWFjaCggewoJc2xpZGVEb3duOiBnZW5GeCggInNob3ciICksCglzbGlkZVVwOiBnZW5GeCggImhpZGUiICksCglzbGlkZVRvZ2dsZTogZ2VuRngoICJ0b2dnbGUiICksCglmYWRlSW46IHsgb3BhY2l0eTogInNob3ciIH0sCglmYWRlT3V0OiB7IG9wYWNpdHk6ICJoaWRlIiB9LAoJZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiAidG9nZ2xlIiB9Cn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLmFuaW1hdGUoIHByb3BzLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwoJfTsKfSApOwoKalF1ZXJ5LnRpbWVycyA9IFtdOwpqUXVlcnkuZngudGljayA9IGZ1bmN0aW9uKCkgewoJdmFyIHRpbWVyLAoJCWkgPSAwLAoJCXRpbWVycyA9IGpRdWVyeS50aW1lcnM7CgoJZnhOb3cgPSBEYXRlLm5vdygpOwoKCWZvciAoIDsgaSA8IHRpbWVycy5sZW5ndGg7IGkrKyApIHsKCQl0aW1lciA9IHRpbWVyc1sgaSBdOwoKCQkvLyBSdW4gdGhlIHRpbWVyIGFuZCBzYWZlbHkgcmVtb3ZlIGl0IHdoZW4gZG9uZSAoYWxsb3dpbmcgZm9yIGV4dGVybmFsIHJlbW92YWwpCgkJaWYgKCAhdGltZXIoKSAmJiB0aW1lcnNbIGkgXSA9PT0gdGltZXIgKSB7CgkJCXRpbWVycy5zcGxpY2UoIGktLSwgMSApOwoJCX0KCX0KCglpZiAoICF0aW1lcnMubGVuZ3RoICkgewoJCWpRdWVyeS5meC5zdG9wKCk7Cgl9CglmeE5vdyA9IHVuZGVmaW5lZDsKfTsKCmpRdWVyeS5meC50aW1lciA9IGZ1bmN0aW9uKCB0aW1lciApIHsKCWpRdWVyeS50aW1lcnMucHVzaCggdGltZXIgKTsKCWpRdWVyeS5meC5zdGFydCgpOwp9OwoKalF1ZXJ5LmZ4LmludGVydmFsID0gMTM7CmpRdWVyeS5meC5zdGFydCA9IGZ1bmN0aW9uKCkgewoJaWYgKCBpblByb2dyZXNzICkgewoJCXJldHVybjsKCX0KCglpblByb2dyZXNzID0gdHJ1ZTsKCXNjaGVkdWxlKCk7Cn07CgpqUXVlcnkuZnguc3RvcCA9IGZ1bmN0aW9uKCkgewoJaW5Qcm9ncmVzcyA9IG51bGw7Cn07CgpqUXVlcnkuZnguc3BlZWRzID0gewoJc2xvdzogNjAwLAoJZmFzdDogMjAwLAoKCS8vIERlZmF1bHQgc3BlZWQKCV9kZWZhdWx0OiA0MDAKfTsKCgovLyBCYXNlZCBvZmYgb2YgdGhlIHBsdWdpbiBieSBDbGludCBIZWxmZXJzLCB3aXRoIHBlcm1pc3Npb24uCi8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDEwMDMyNDAxNDc0Ny9odHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvCmpRdWVyeS5mbi5kZWxheSA9IGZ1bmN0aW9uKCB0aW1lLCB0eXBlICkgewoJdGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1lIDogdGltZTsKCXR5cGUgPSB0eXBlIHx8ICJmeCI7CgoJcmV0dXJuIHRoaXMucXVldWUoIHR5cGUsIGZ1bmN0aW9uKCBuZXh0LCBob29rcyApIHsKCQl2YXIgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCBuZXh0LCB0aW1lICk7CgkJaG9va3Muc3RvcCA9IGZ1bmN0aW9uKCkgewoJCQl3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7CgkJfTsKCX0gKTsKfTsKCgooIGZ1bmN0aW9uKCkgewoJdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlucHV0IiApLAoJCXNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzZWxlY3QiICksCgkJb3B0ID0gc2VsZWN0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAib3B0aW9uIiApICk7CgoJaW5wdXQudHlwZSA9ICJjaGVja2JveCI7CgoJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMyBvbmx5CgkvLyBEZWZhdWx0IHZhbHVlIGZvciBhIGNoZWNrYm94IHNob3VsZCBiZSAib24iCglzdXBwb3J0LmNoZWNrT24gPSBpbnB1dC52YWx1ZSAhPT0gIiI7CgoJLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5CgkvLyBNdXN0IGFjY2VzcyBzZWxlY3RlZEluZGV4IHRvIG1ha2UgZGVmYXVsdCBvcHRpb25zIHNlbGVjdAoJc3VwcG9ydC5vcHRTZWxlY3RlZCA9IG9wdC5zZWxlY3RlZDsKCgkvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHkKCS8vIEFuIGlucHV0IGxvc2VzIGl0cyB2YWx1ZSBhZnRlciBiZWNvbWluZyBhIHJhZGlvCglpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJpbnB1dCIgKTsKCWlucHV0LnZhbHVlID0gInQiOwoJaW5wdXQudHlwZSA9ICJyYWRpbyI7CglzdXBwb3J0LnJhZGlvVmFsdWUgPSBpbnB1dC52YWx1ZSA9PT0gInQiOwp9ICkoKTsKCgp2YXIgYm9vbEhvb2ssCglhdHRySGFuZGxlID0galF1ZXJ5LmV4cHIuYXR0ckhhbmRsZTsKCmpRdWVyeS5mbi5leHRlbmQoIHsKCWF0dHI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKCQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkuYXR0ciwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7Cgl9LAoKCXJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkgewoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkucmVtb3ZlQXR0ciggdGhpcywgbmFtZSApOwoJCX0gKTsKCX0KfSApOwoKalF1ZXJ5LmV4dGVuZCggewoJYXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgewoJCXZhciByZXQsIGhvb2tzLAoJCQluVHlwZSA9IGVsZW0ubm9kZVR5cGU7CgoJCS8vIERvbid0IGdldC9zZXQgYXR0cmlidXRlcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXMKCQlpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBGYWxsYmFjayB0byBwcm9wIHdoZW4gYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZAoJCWlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSAidW5kZWZpbmVkIiApIHsKCQkJcmV0dXJuIGpRdWVyeS5wcm9wKCBlbGVtLCBuYW1lLCB2YWx1ZSApOwoJCX0KCgkJLy8gQXR0cmlidXRlIGhvb2tzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBsb3dlcmNhc2UgdmVyc2lvbgoJCS8vIEdyYWIgbmVjZXNzYXJ5IGhvb2sgaWYgb25lIGlzIGRlZmluZWQKCQlpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHsKCQkJaG9va3MgPSBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSB8fAoJCQkJKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnRlc3QoIG5hbWUgKSA/IGJvb2xIb29rIDogdW5kZWZpbmVkICk7CgkJfQoKCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCWlmICggdmFsdWUgPT09IG51bGwgKSB7CgkJCQlqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOwoJCQkJcmV0dXJuOwoJCQl9CgoJCQlpZiAoIGhvb2tzICYmICJzZXQiIGluIGhvb2tzICYmCgkJCQkoIHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSApICE9PSB1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gcmV0OwoJCQl9CgoJCQllbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgdmFsdWUgKyAiIiApOwoJCQlyZXR1cm4gdmFsdWU7CgkJfQoKCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHsKCQkJcmV0dXJuIHJldDsKCQl9CgoJCXJldCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIG5hbWUgKTsKCgkJLy8gTm9uLWV4aXN0ZW50IGF0dHJpYnV0ZXMgcmV0dXJuIG51bGwsIHdlIG5vcm1hbGl6ZSB0byB1bmRlZmluZWQKCQlyZXR1cm4gcmV0ID09IG51bGwgPyB1bmRlZmluZWQgOiByZXQ7Cgl9LAoKCWF0dHJIb29rczogewoJCXR5cGU6IHsKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCQlpZiAoICFzdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09ICJyYWRpbyIgJiYKCQkJCQlub2RlTmFtZSggZWxlbSwgImlucHV0IiApICkgewoJCQkJCXZhciB2YWwgPSBlbGVtLnZhbHVlOwoJCQkJCWVsZW0uc2V0QXR0cmlidXRlKCAidHlwZSIsIHZhbHVlICk7CgkJCQkJaWYgKCB2YWwgKSB7CgkJCQkJCWVsZW0udmFsdWUgPSB2YWw7CgkJCQkJfQoJCQkJCXJldHVybiB2YWx1ZTsKCQkJCX0KCQkJfQoJCX0KCX0sCgoJcmVtb3ZlQXR0cjogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgewoJCXZhciBuYW1lLAoJCQlpID0gMCwKCgkJCS8vIEF0dHJpYnV0ZSBuYW1lcyBjYW4gY29udGFpbiBub24tSFRNTCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMKCQkJLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjYXR0cmlidXRlcy0yCgkJCWF0dHJOYW1lcyA9IHZhbHVlICYmIHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICk7CgoJCWlmICggYXR0ck5hbWVzICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgkJCXdoaWxlICggKCBuYW1lID0gYXR0ck5hbWVzWyBpKysgXSApICkgewoJCQkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIG5hbWUgKTsKCQkJfQoJCX0KCX0KfSApOwoKLy8gSG9va3MgZm9yIGJvb2xlYW4gYXR0cmlidXRlcwpib29sSG9vayA9IHsKCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkgewoJCWlmICggdmFsdWUgPT09IGZhbHNlICkgewoKCQkJLy8gUmVtb3ZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aGVuIHNldCB0byBmYWxzZQoJCQlqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOwoJCX0gZWxzZSB7CgkJCWVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lICk7CgkJfQoJCXJldHVybiBuYW1lOwoJfQp9OwoKalF1ZXJ5LmVhY2goIGpRdWVyeS5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKCAvXHcrL2cgKSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7Cgl2YXIgZ2V0dGVyID0gYXR0ckhhbmRsZVsgbmFtZSBdIHx8IGpRdWVyeS5maW5kLmF0dHI7CgoJYXR0ckhhbmRsZVsgbmFtZSBdID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkgewoJCXZhciByZXQsIGhhbmRsZSwKCQkJbG93ZXJjYXNlTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKCgkJaWYgKCAhaXNYTUwgKSB7CgoJCQkvLyBBdm9pZCBhbiBpbmZpbml0ZSBsb29wIGJ5IHRlbXBvcmFyaWx5IHJlbW92aW5nIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGUgZ2V0dGVyCgkJCWhhbmRsZSA9IGF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXTsKCQkJYXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdID0gcmV0OwoJCQlyZXQgPSBnZXR0ZXIoIGVsZW0sIG5hbWUsIGlzWE1MICkgIT0gbnVsbCA/CgkJCQlsb3dlcmNhc2VOYW1lIDoKCQkJCW51bGw7CgkJCWF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXSA9IGhhbmRsZTsKCQl9CgkJcmV0dXJuIHJldDsKCX07Cn0gKTsKCgoKCnZhciByZm9jdXNhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSwKCXJjbGlja2FibGUgPSAvXig/OmF8YXJlYSkkL2k7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7Cglwcm9wOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJcmV0dXJuIGFjY2VzcyggdGhpcywgalF1ZXJ5LnByb3AsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApOwoJfSwKCglyZW1vdmVQcm9wOiBmdW5jdGlvbiggbmFtZSApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCQkJZGVsZXRlIHRoaXNbIGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZSBdOwoJCX0gKTsKCX0KfSApOwoKalF1ZXJ5LmV4dGVuZCggewoJcHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgewoJCXZhciByZXQsIGhvb2tzLAoJCQluVHlwZSA9IGVsZW0ubm9kZVR5cGU7CgoJCS8vIERvbid0IGdldC9zZXQgcHJvcGVydGllcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXMKCQlpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHsKCgkJCS8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3MKCQkJbmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTsKCQkJaG9va3MgPSBqUXVlcnkucHJvcEhvb2tzWyBuYW1lIF07CgkJfQoKCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCWlmICggaG9va3MgJiYgInNldCIgaW4gaG9va3MgJiYKCQkJCSggcmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApICkgIT09IHVuZGVmaW5lZCApIHsKCQkJCXJldHVybiByZXQ7CgkJCX0KCgkJCXJldHVybiAoIGVsZW1bIG5hbWUgXSA9IHZhbHVlICk7CgkJfQoKCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHsKCQkJcmV0dXJuIHJldDsKCQl9CgoJCXJldHVybiBlbGVtWyBuYW1lIF07Cgl9LAoKCXByb3BIb29rczogewoJCXRhYkluZGV4OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgoJCQkJLy8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seQoJCQkJLy8gZWxlbS50YWJJbmRleCBkb2Vzbid0IGFsd2F5cyByZXR1cm4gdGhlCgkJCQkvLyBjb3JyZWN0IHZhbHVlIHdoZW4gaXQgaGFzbid0IGJlZW4gZXhwbGljaXRseSBzZXQKCQkJCS8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE0MTExNjIzMzM0Ny9odHRwOi8vZmx1aWRwcm9qZWN0Lm9yZy9ibG9nLzIwMDgvMDEvMDkvZ2V0dGluZy1zZXR0aW5nLWFuZC1yZW1vdmluZy10YWJpbmRleC12YWx1ZXMtd2l0aC1qYXZhc2NyaXB0LwoJCQkJLy8gVXNlIHByb3BlciBhdHRyaWJ1dGUgcmV0cmlldmFsKCMxMjA3MikKCQkJCXZhciB0YWJpbmRleCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sICJ0YWJpbmRleCIgKTsKCgkJCQlpZiAoIHRhYmluZGV4ICkgewoJCQkJCXJldHVybiBwYXJzZUludCggdGFiaW5kZXgsIDEwICk7CgkJCQl9CgoJCQkJaWYgKAoJCQkJCXJmb2N1c2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8CgkJCQkJcmNsaWNrYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgJiYKCQkJCQllbGVtLmhyZWYKCQkJCSkgewoJCQkJCXJldHVybiAwOwoJCQkJfQoKCQkJCXJldHVybiAtMTsKCQkJfQoJCX0KCX0sCgoJcHJvcEZpeDogewoJCSJmb3IiOiAiaHRtbEZvciIsCgkJImNsYXNzIjogImNsYXNzTmFtZSIKCX0KfSApOwoKLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5Ci8vIEFjY2Vzc2luZyB0aGUgc2VsZWN0ZWRJbmRleCBwcm9wZXJ0eQovLyBmb3JjZXMgdGhlIGJyb3dzZXIgdG8gcmVzcGVjdCBzZXR0aW5nIHNlbGVjdGVkCi8vIG9uIHRoZSBvcHRpb24KLy8gVGhlIGdldHRlciBlbnN1cmVzIGEgZGVmYXVsdCBvcHRpb24gaXMgc2VsZWN0ZWQKLy8gd2hlbiBpbiBhbiBvcHRncm91cAovLyBlc2xpbnQgcnVsZSAibm8tdW51c2VkLWV4cHJlc3Npb25zIiBpcyBkaXNhYmxlZCBmb3IgdGhpcyBjb2RlCi8vIHNpbmNlIGl0IGNvbnNpZGVycyBzdWNoIGFjY2Vzc2lvbnMgbm9vcAppZiAoICFzdXBwb3J0Lm9wdFNlbGVjdGVkICkgewoJalF1ZXJ5LnByb3BIb29rcy5zZWxlY3RlZCA9IHsKCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoKCQkJLyogZXNsaW50IG5vLXVudXNlZC1leHByZXNzaW9uczogIm9mZiIgKi8KCgkJCXZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CgkJCWlmICggcGFyZW50ICYmIHBhcmVudC5wYXJlbnROb2RlICkgewoJCQkJcGFyZW50LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKCQkJfQoJCQlyZXR1cm4gbnVsbDsKCQl9LAoJCXNldDogZnVuY3Rpb24oIGVsZW0gKSB7CgoJCQkvKiBlc2xpbnQgbm8tdW51c2VkLWV4cHJlc3Npb25zOiAib2ZmIiAqLwoKCQkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQkJaWYgKCBwYXJlbnQgKSB7CgkJCQlwYXJlbnQuc2VsZWN0ZWRJbmRleDsKCgkJCQlpZiAoIHBhcmVudC5wYXJlbnROb2RlICkgewoJCQkJCXBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7CgkJCQl9CgkJCX0KCQl9Cgl9Owp9CgpqUXVlcnkuZWFjaCggWwoJInRhYkluZGV4IiwKCSJyZWFkT25seSIsCgkibWF4TGVuZ3RoIiwKCSJjZWxsU3BhY2luZyIsCgkiY2VsbFBhZGRpbmciLAoJInJvd1NwYW4iLAoJImNvbFNwYW4iLAoJInVzZU1hcCIsCgkiZnJhbWVCb3JkZXIiLAoJImNvbnRlbnRFZGl0YWJsZSIKXSwgZnVuY3Rpb24oKSB7CglqUXVlcnkucHJvcEZpeFsgdGhpcy50b0xvd2VyQ2FzZSgpIF0gPSB0aGlzOwp9ICk7CgoKCgoJLy8gU3RyaXAgYW5kIGNvbGxhcHNlIHdoaXRlc3BhY2UgYWNjb3JkaW5nIHRvIEhUTUwgc3BlYwoJLy8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS1hc2NpaS13aGl0ZXNwYWNlCglmdW5jdGlvbiBzdHJpcEFuZENvbGxhcHNlKCB2YWx1ZSApIHsKCQl2YXIgdG9rZW5zID0gdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXTsKCQlyZXR1cm4gdG9rZW5zLmpvaW4oICIgIiApOwoJfQoKCmZ1bmN0aW9uIGdldENsYXNzKCBlbGVtICkgewoJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlICYmIGVsZW0uZ2V0QXR0cmlidXRlKCAiY2xhc3MiICkgfHwgIiI7Cn0KCmZ1bmN0aW9uIGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApIHsKCWlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHsKCQlyZXR1cm4gdmFsdWU7Cgl9CglpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgKSB7CgkJcmV0dXJuIHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107Cgl9CglyZXR1cm4gW107Cn0KCmpRdWVyeS5mbi5leHRlbmQoIHsKCWFkZENsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJdmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLAoJCQlpID0gMDsKCgkJaWYgKCBpc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHsKCQkJCWpRdWVyeSggdGhpcyApLmFkZENsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTsKCQkJfSApOwoJCX0KCgkJY2xhc3NlcyA9IGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApOwoKCQlpZiAoIGNsYXNzZXMubGVuZ3RoICkgewoJCQl3aGlsZSAoICggZWxlbSA9IHRoaXNbIGkrKyBdICkgKSB7CgkJCQljdXJWYWx1ZSA9IGdldENsYXNzKCBlbGVtICk7CgkJCQljdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggIiAiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArICIgIiApOwoKCQkJCWlmICggY3VyICkgewoJCQkJCWogPSAwOwoJCQkJCXdoaWxlICggKCBjbGF6eiA9IGNsYXNzZXNbIGorKyBdICkgKSB7CgkJCQkJCWlmICggY3VyLmluZGV4T2YoICIgIiArIGNsYXp6ICsgIiAiICkgPCAwICkgewoJCQkJCQkJY3VyICs9IGNsYXp6ICsgIiAiOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQkvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLgoJCQkJCWZpbmFsVmFsdWUgPSBzdHJpcEFuZENvbGxhcHNlKCBjdXIgKTsKCQkJCQlpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkgewoJCQkJCQllbGVtLnNldEF0dHJpYnV0ZSggImNsYXNzIiwgZmluYWxWYWx1ZSApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCXJlbW92ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJdmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLAoJCQlpID0gMDsKCgkJaWYgKCBpc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHsKCQkJCWpRdWVyeSggdGhpcyApLnJlbW92ZUNsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTsKCQkJfSApOwoJCX0KCgkJaWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHsKCQkJcmV0dXJuIHRoaXMuYXR0ciggImNsYXNzIiwgIiIgKTsKCQl9CgoJCWNsYXNzZXMgPSBjbGFzc2VzVG9BcnJheSggdmFsdWUgKTsKCgkJaWYgKCBjbGFzc2VzLmxlbmd0aCApIHsKCQkJd2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkgewoJCQkJY3VyVmFsdWUgPSBnZXRDbGFzcyggZWxlbSApOwoKCQkJCS8vIFRoaXMgZXhwcmVzc2lvbiBpcyBoZXJlIGZvciBiZXR0ZXIgY29tcHJlc3NpYmlsaXR5IChzZWUgYWRkQ2xhc3MpCgkJCQljdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggIiAiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArICIgIiApOwoKCQkJCWlmICggY3VyICkgewoJCQkJCWogPSAwOwoJCQkJCXdoaWxlICggKCBjbGF6eiA9IGNsYXNzZXNbIGorKyBdICkgKSB7CgoJCQkJCQkvLyBSZW1vdmUgKmFsbCogaW5zdGFuY2VzCgkJCQkJCXdoaWxlICggY3VyLmluZGV4T2YoICIgIiArIGNsYXp6ICsgIiAiICkgPiAtMSApIHsKCQkJCQkJCWN1ciA9IGN1ci5yZXBsYWNlKCAiICIgKyBjbGF6eiArICIgIiwgIiAiICk7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIE9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5lZWRlZCByZW5kZXJpbmcuCgkJCQkJZmluYWxWYWx1ZSA9IHN0cmlwQW5kQ29sbGFwc2UoIGN1ciApOwoJCQkJCWlmICggY3VyVmFsdWUgIT09IGZpbmFsVmFsdWUgKSB7CgkJCQkJCWVsZW0uc2V0QXR0cmlidXRlKCAiY2xhc3MiLCBmaW5hbFZhbHVlICk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSwgc3RhdGVWYWwgKSB7CgkJdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWUsCgkJCWlzVmFsaWRWYWx1ZSA9IHR5cGUgPT09ICJzdHJpbmciIHx8IEFycmF5LmlzQXJyYXkoIHZhbHVlICk7CgoJCWlmICggdHlwZW9mIHN0YXRlVmFsID09PSAiYm9vbGVhbiIgJiYgaXNWYWxpZFZhbHVlICkgewoJCQlyZXR1cm4gc3RhdGVWYWwgPyB0aGlzLmFkZENsYXNzKCB2YWx1ZSApIDogdGhpcy5yZW1vdmVDbGFzcyggdmFsdWUgKTsKCQl9CgoJCWlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7CgkJCQlqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcygKCQkJCQl2YWx1ZS5jYWxsKCB0aGlzLCBpLCBnZXRDbGFzcyggdGhpcyApLCBzdGF0ZVZhbCApLAoJCQkJCXN0YXRlVmFsCgkJCQkpOwoJCQl9ICk7CgkJfQoKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCQkJdmFyIGNsYXNzTmFtZSwgaSwgc2VsZiwgY2xhc3NOYW1lczsKCgkJCWlmICggaXNWYWxpZFZhbHVlICkgewoKCQkJCS8vIFRvZ2dsZSBpbmRpdmlkdWFsIGNsYXNzIG5hbWVzCgkJCQlpID0gMDsKCQkJCXNlbGYgPSBqUXVlcnkoIHRoaXMgKTsKCQkJCWNsYXNzTmFtZXMgPSBjbGFzc2VzVG9BcnJheSggdmFsdWUgKTsKCgkJCQl3aGlsZSAoICggY2xhc3NOYW1lID0gY2xhc3NOYW1lc1sgaSsrIF0gKSApIHsKCgkJCQkJLy8gQ2hlY2sgZWFjaCBjbGFzc05hbWUgZ2l2ZW4sIHNwYWNlIHNlcGFyYXRlZCBsaXN0CgkJCQkJaWYgKCBzZWxmLmhhc0NsYXNzKCBjbGFzc05hbWUgKSApIHsKCQkJCQkJc2VsZi5yZW1vdmVDbGFzcyggY2xhc3NOYW1lICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJc2VsZi5hZGRDbGFzcyggY2xhc3NOYW1lICk7CgkJCQkJfQoJCQkJfQoKCQkJLy8gVG9nZ2xlIHdob2xlIGNsYXNzIG5hbWUKCQkJfSBlbHNlIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlID09PSAiYm9vbGVhbiIgKSB7CgkJCQljbGFzc05hbWUgPSBnZXRDbGFzcyggdGhpcyApOwoJCQkJaWYgKCBjbGFzc05hbWUgKSB7CgoJCQkJCS8vIFN0b3JlIGNsYXNzTmFtZSBpZiBzZXQKCQkJCQlkYXRhUHJpdi5zZXQoIHRoaXMsICJfX2NsYXNzTmFtZV9fIiwgY2xhc3NOYW1lICk7CgkJCQl9CgoJCQkJLy8gSWYgdGhlIGVsZW1lbnQgaGFzIGEgY2xhc3MgbmFtZSBvciBpZiB3ZSdyZSBwYXNzZWQgYGZhbHNlYCwKCQkJCS8vIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBjbGFzc25hbWUgKGlmIHRoZXJlIHdhcyBvbmUsIHRoZSBhYm92ZSBzYXZlZCBpdCkuCgkJCQkvLyBPdGhlcndpc2UgYnJpbmcgYmFjayB3aGF0ZXZlciB3YXMgcHJldmlvdXNseSBzYXZlZCAoaWYgYW55dGhpbmcpLAoJCQkJLy8gZmFsbGluZyBiYWNrIHRvIHRoZSBlbXB0eSBzdHJpbmcgaWYgbm90aGluZyB3YXMgc3RvcmVkLgoJCQkJaWYgKCB0aGlzLnNldEF0dHJpYnV0ZSApIHsKCQkJCQl0aGlzLnNldEF0dHJpYnV0ZSggImNsYXNzIiwKCQkJCQkJY2xhc3NOYW1lIHx8IHZhbHVlID09PSBmYWxzZSA/CgkJCQkJCSIiIDoKCQkJCQkJZGF0YVByaXYuZ2V0KCB0aGlzLCAiX19jbGFzc05hbWVfXyIgKSB8fCAiIgoJCQkJCSk7CgkJCQl9CgkJCX0KCQl9ICk7Cgl9LAoKCWhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJdmFyIGNsYXNzTmFtZSwgZWxlbSwKCQkJaSA9IDA7CgoJCWNsYXNzTmFtZSA9ICIgIiArIHNlbGVjdG9yICsgIiAiOwoJCXdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHsKCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmCgkJCQkoICIgIiArIHN0cmlwQW5kQ29sbGFwc2UoIGdldENsYXNzKCBlbGVtICkgKSArICIgIiApLmluZGV4T2YoIGNsYXNzTmFtZSApID4gLTEgKSB7CgkJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9CgoJCXJldHVybiBmYWxzZTsKCX0KfSApOwoKCgoKdmFyIHJyZXR1cm4gPSAvXHIvZzsKCmpRdWVyeS5mbi5leHRlbmQoIHsKCXZhbDogZnVuY3Rpb24oIHZhbHVlICkgewoJCXZhciBob29rcywgcmV0LCB2YWx1ZUlzRnVuY3Rpb24sCgkJCWVsZW0gPSB0aGlzWyAwIF07CgoJCWlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCWlmICggZWxlbSApIHsKCQkJCWhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyBlbGVtLnR5cGUgXSB8fAoJCQkJCWpRdWVyeS52YWxIb29rc1sgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07CgoJCQkJaWYgKCBob29rcyAmJgoJCQkJCSJnZXQiIGluIGhvb2tzICYmCgkJCQkJKCByZXQgPSBob29rcy5nZXQoIGVsZW0sICJ2YWx1ZSIgKSApICE9PSB1bmRlZmluZWQKCQkJCSkgewoJCQkJCXJldHVybiByZXQ7CgkJCQl9CgoJCQkJcmV0ID0gZWxlbS52YWx1ZTsKCgkJCQkvLyBIYW5kbGUgbW9zdCBjb21tb24gc3RyaW5nIGNhc2VzCgkJCQlpZiAoIHR5cGVvZiByZXQgPT09ICJzdHJpbmciICkgewoJCQkJCXJldHVybiByZXQucmVwbGFjZSggcnJldHVybiwgIiIgKTsKCQkJCX0KCgkJCQkvLyBIYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXIKCQkJCXJldHVybiByZXQgPT0gbnVsbCA/ICIiIDogcmV0OwoJCQl9CgoJCQlyZXR1cm47CgkJfQoKCQl2YWx1ZUlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCB2YWx1ZSApOwoKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHsKCQkJdmFyIHZhbDsKCgkJCWlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJaWYgKCB2YWx1ZUlzRnVuY3Rpb24gKSB7CgkJCQl2YWwgPSB2YWx1ZS5jYWxsKCB0aGlzLCBpLCBqUXVlcnkoIHRoaXMgKS52YWwoKSApOwoJCQl9IGVsc2UgewoJCQkJdmFsID0gdmFsdWU7CgkJCX0KCgkJCS8vIFRyZWF0IG51bGwvdW5kZWZpbmVkIGFzICIiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nCgkJCWlmICggdmFsID09IG51bGwgKSB7CgkJCQl2YWwgPSAiIjsKCgkJCX0gZWxzZSBpZiAoIHR5cGVvZiB2YWwgPT09ICJudW1iZXIiICkgewoJCQkJdmFsICs9ICIiOwoKCQkJfSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggdmFsICkgKSB7CgkJCQl2YWwgPSBqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJCQlyZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUgKyAiIjsKCQkJCX0gKTsKCQkJfQoKCQkJaG9va3MgPSBqUXVlcnkudmFsSG9va3NbIHRoaXMudHlwZSBdIHx8IGpRdWVyeS52YWxIb29rc1sgdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07CgoJCQkvLyBJZiBzZXQgcmV0dXJucyB1bmRlZmluZWQsIGZhbGwgYmFjayB0byBub3JtYWwgc2V0dGluZwoJCQlpZiAoICFob29rcyB8fCAhKCAic2V0IiBpbiBob29rcyApIHx8IGhvb2tzLnNldCggdGhpcywgdmFsLCAidmFsdWUiICkgPT09IHVuZGVmaW5lZCApIHsKCQkJCXRoaXMudmFsdWUgPSB2YWw7CgkJCX0KCQl9ICk7Cgl9Cn0gKTsKCmpRdWVyeS5leHRlbmQoIHsKCXZhbEhvb2tzOiB7CgkJb3B0aW9uOiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgoJCQkJdmFyIHZhbCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sICJ2YWx1ZSIgKTsKCQkJCXJldHVybiB2YWwgIT0gbnVsbCA/CgkJCQkJdmFsIDoKCgkJCQkJLy8gU3VwcG9ydDogSUUgPD0xMCAtIDExIG9ubHkKCQkJCQkvLyBvcHRpb24udGV4dCB0aHJvd3MgZXhjZXB0aW9ucyAoIzE0Njg2LCAjMTQ4NTgpCgkJCQkJLy8gU3RyaXAgYW5kIGNvbGxhcHNlIHdoaXRlc3BhY2UKCQkJCQkvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNzdHJpcC1hbmQtY29sbGFwc2Utd2hpdGVzcGFjZQoJCQkJCXN0cmlwQW5kQ29sbGFwc2UoIGpRdWVyeS50ZXh0KCBlbGVtICkgKTsKCQkJfQoJCX0sCgkJc2VsZWN0OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl2YXIgdmFsdWUsIG9wdGlvbiwgaSwKCQkJCQlvcHRpb25zID0gZWxlbS5vcHRpb25zLAoJCQkJCWluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LAoJCQkJCW9uZSA9IGVsZW0udHlwZSA9PT0gInNlbGVjdC1vbmUiLAoJCQkJCXZhbHVlcyA9IG9uZSA/IG51bGwgOiBbXSwKCQkJCQltYXggPSBvbmUgPyBpbmRleCArIDEgOiBvcHRpb25zLmxlbmd0aDsKCgkJCQlpZiAoIGluZGV4IDwgMCApIHsKCQkJCQlpID0gbWF4OwoKCQkJCX0gZWxzZSB7CgkJCQkJaSA9IG9uZSA/IGluZGV4IDogMDsKCQkJCX0KCgkJCQkvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zCgkJCQlmb3IgKCA7IGkgPCBtYXg7IGkrKyApIHsKCQkJCQlvcHRpb24gPSBvcHRpb25zWyBpIF07CgoJCQkJCS8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5CgkJCQkJLy8gSUU4LTkgZG9lc24ndCB1cGRhdGUgc2VsZWN0ZWQgYWZ0ZXIgZm9ybSByZXNldCAoIzI1NTEpCgkJCQkJaWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCApICYmCgoJCQkJCQkJLy8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cAoJCQkJCQkJIW9wdGlvbi5kaXNhYmxlZCAmJgoJCQkJCQkJKCAhb3B0aW9uLnBhcmVudE5vZGUuZGlzYWJsZWQgfHwKCQkJCQkJCQkhbm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCAib3B0Z3JvdXAiICkgKSApIHsKCgkJCQkJCS8vIEdldCB0aGUgc3BlY2lmaWMgdmFsdWUgZm9yIHRoZSBvcHRpb24KCQkJCQkJdmFsdWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpOwoKCQkJCQkJLy8gV2UgZG9uJ3QgbmVlZCBhbiBhcnJheSBmb3Igb25lIHNlbGVjdHMKCQkJCQkJaWYgKCBvbmUgKSB7CgkJCQkJCQlyZXR1cm4gdmFsdWU7CgkJCQkJCX0KCgkJCQkJCS8vIE11bHRpLVNlbGVjdHMgcmV0dXJuIGFuIGFycmF5CgkJCQkJCXZhbHVlcy5wdXNoKCB2YWx1ZSApOwoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gdmFsdWVzOwoJCQl9LAoKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCQl2YXIgb3B0aW9uU2V0LCBvcHRpb24sCgkJCQkJb3B0aW9ucyA9IGVsZW0ub3B0aW9ucywKCQkJCQl2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApLAoJCQkJCWkgPSBvcHRpb25zLmxlbmd0aDsKCgkJCQl3aGlsZSAoIGktLSApIHsKCQkJCQlvcHRpb24gPSBvcHRpb25zWyBpIF07CgoJCQkJCS8qIGVzbGludC1kaXNhYmxlIG5vLWNvbmQtYXNzaWduICovCgoJCQkJCWlmICggb3B0aW9uLnNlbGVjdGVkID0KCQkJCQkJalF1ZXJ5LmluQXJyYXkoIGpRdWVyeS52YWxIb29rcy5vcHRpb24uZ2V0KCBvcHRpb24gKSwgdmFsdWVzICkgPiAtMQoJCQkJCSkgewoJCQkJCQlvcHRpb25TZXQgPSB0cnVlOwoJCQkJCX0KCgkJCQkJLyogZXNsaW50LWVuYWJsZSBuby1jb25kLWFzc2lnbiAqLwoJCQkJfQoKCQkJCS8vIEZvcmNlIGJyb3dzZXJzIHRvIGJlaGF2ZSBjb25zaXN0ZW50bHkgd2hlbiBub24tbWF0Y2hpbmcgdmFsdWUgaXMgc2V0CgkJCQlpZiAoICFvcHRpb25TZXQgKSB7CgkJCQkJZWxlbS5zZWxlY3RlZEluZGV4ID0gLTE7CgkJCQl9CgkJCQlyZXR1cm4gdmFsdWVzOwoJCQl9CgkJfQoJfQp9ICk7CgovLyBSYWRpb3MgYW5kIGNoZWNrYm94ZXMgZ2V0dGVyL3NldHRlcgpqUXVlcnkuZWFjaCggWyAicmFkaW8iLCAiY2hlY2tib3giIF0sIGZ1bmN0aW9uKCkgewoJalF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7CgkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCWlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHsKCQkJCXJldHVybiAoIGVsZW0uY2hlY2tlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkoIGVsZW0gKS52YWwoKSwgdmFsdWUgKSA+IC0xICk7CgkJCX0KCQl9Cgl9OwoJaWYgKCAhc3VwcG9ydC5jaGVja09uICkgewoJCWpRdWVyeS52YWxIb29rc1sgdGhpcyBdLmdldCA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoICJ2YWx1ZSIgKSA9PT0gbnVsbCA/ICJvbiIgOiBlbGVtLnZhbHVlOwoJCX07Cgl9Cn0gKTsKCgoKCi8vIFJldHVybiBqUXVlcnkgZm9yIGF0dHJpYnV0ZXMtb25seSBpbmNsdXNpb24KCgpzdXBwb3J0LmZvY3VzaW4gPSAib25mb2N1c2luIiBpbiB3aW5kb3c7CgoKdmFyIHJmb2N1c01vcnBoID0gL14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLAoJc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgPSBmdW5jdGlvbiggZSApIHsKCQllLnN0b3BQcm9wYWdhdGlvbigpOwoJfTsKCmpRdWVyeS5leHRlbmQoIGpRdWVyeS5ldmVudCwgewoKCXRyaWdnZXI6IGZ1bmN0aW9uKCBldmVudCwgZGF0YSwgZWxlbSwgb25seUhhbmRsZXJzICkgewoKCQl2YXIgaSwgY3VyLCB0bXAsIGJ1YmJsZVR5cGUsIG9udHlwZSwgaGFuZGxlLCBzcGVjaWFsLCBsYXN0RWxlbWVudCwKCQkJZXZlbnRQYXRoID0gWyBlbGVtIHx8IGRvY3VtZW50IF0sCgkJCXR5cGUgPSBoYXNPd24uY2FsbCggZXZlbnQsICJ0eXBlIiApID8gZXZlbnQudHlwZSA6IGV2ZW50LAoJCQluYW1lc3BhY2VzID0gaGFzT3duLmNhbGwoIGV2ZW50LCAibmFtZXNwYWNlIiApID8gZXZlbnQubmFtZXNwYWNlLnNwbGl0KCAiLiIgKSA6IFtdOwoKCQljdXIgPSBsYXN0RWxlbWVudCA9IHRtcCA9IGVsZW0gPSBlbGVtIHx8IGRvY3VtZW50OwoKCQkvLyBEb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcwoJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4ICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBmb2N1cy9ibHVyIG1vcnBocyB0byBmb2N1c2luL291dDsgZW5zdXJlIHdlJ3JlIG5vdCBmaXJpbmcgdGhlbSByaWdodCBub3cKCQlpZiAoIHJmb2N1c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICkgKSB7CgkJCXJldHVybjsKCQl9CgoJCWlmICggdHlwZS5pbmRleE9mKCAiLiIgKSA+IC0xICkgewoKCQkJLy8gTmFtZXNwYWNlZCB0cmlnZ2VyOyBjcmVhdGUgYSByZWdleHAgdG8gbWF0Y2ggZXZlbnQgdHlwZSBpbiBoYW5kbGUoKQoJCQluYW1lc3BhY2VzID0gdHlwZS5zcGxpdCggIi4iICk7CgkJCXR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CgkJCW5hbWVzcGFjZXMuc29ydCgpOwoJCX0KCQlvbnR5cGUgPSB0eXBlLmluZGV4T2YoICI6IiApIDwgMCAmJiAib24iICsgdHlwZTsKCgkJLy8gQ2FsbGVyIGNhbiBwYXNzIGluIGEgalF1ZXJ5LkV2ZW50IG9iamVjdCwgT2JqZWN0LCBvciBqdXN0IGFuIGV2ZW50IHR5cGUgc3RyaW5nCgkJZXZlbnQgPSBldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSA/CgkJCWV2ZW50IDoKCQkJbmV3IGpRdWVyeS5FdmVudCggdHlwZSwgdHlwZW9mIGV2ZW50ID09PSAib2JqZWN0IiAmJiBldmVudCApOwoKCQkvLyBUcmlnZ2VyIGJpdG1hc2s6ICYgMSBmb3IgbmF0aXZlIGhhbmRsZXJzOyAmIDIgZm9yIGpRdWVyeSAoYWx3YXlzIHRydWUpCgkJZXZlbnQuaXNUcmlnZ2VyID0gb25seUhhbmRsZXJzID8gMiA6IDM7CgkJZXZlbnQubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5qb2luKCAiLiIgKTsKCQlldmVudC5ybmFtZXNwYWNlID0gZXZlbnQubmFtZXNwYWNlID8KCQkJbmV3IFJlZ0V4cCggIihefFxcLikiICsgbmFtZXNwYWNlcy5qb2luKCAiXFwuKD86LipcXC58KSIgKSArICIoXFwufCQpIiApIDoKCQkJbnVsbDsKCgkJLy8gQ2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkCgkJZXZlbnQucmVzdWx0ID0gdW5kZWZpbmVkOwoJCWlmICggIWV2ZW50LnRhcmdldCApIHsKCQkJZXZlbnQudGFyZ2V0ID0gZWxlbTsKCQl9CgoJCS8vIENsb25lIGFueSBpbmNvbWluZyBkYXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcgdGhlIGhhbmRsZXIgYXJnIGxpc3QKCQlkYXRhID0gZGF0YSA9PSBudWxsID8KCQkJWyBldmVudCBdIDoKCQkJalF1ZXJ5Lm1ha2VBcnJheSggZGF0YSwgWyBldmVudCBdICk7CgoJCS8vIEFsbG93IHNwZWNpYWwgZXZlbnRzIHRvIGRyYXcgb3V0c2lkZSB0aGUgbGluZXMKCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKCQlpZiAoICFvbmx5SGFuZGxlcnMgJiYgc3BlY2lhbC50cmlnZ2VyICYmIHNwZWNpYWwudHJpZ2dlci5hcHBseSggZWxlbSwgZGF0YSApID09PSBmYWxzZSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gRGV0ZXJtaW5lIGV2ZW50IHByb3BhZ2F0aW9uIHBhdGggaW4gYWR2YW5jZSwgcGVyIFczQyBldmVudHMgc3BlYyAoIzk5NTEpCgkJLy8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdzsgd2F0Y2ggZm9yIGEgZ2xvYmFsIG93bmVyRG9jdW1lbnQgdmFyICgjOTcyNCkKCQlpZiAoICFvbmx5SGFuZGxlcnMgJiYgIXNwZWNpYWwubm9CdWJibGUgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7CgoJCQlidWJibGVUeXBlID0gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgfHwgdHlwZTsKCQkJaWYgKCAhcmZvY3VzTW9ycGgudGVzdCggYnViYmxlVHlwZSArIHR5cGUgKSApIHsKCQkJCWN1ciA9IGN1ci5wYXJlbnROb2RlOwoJCQl9CgkJCWZvciAoIDsgY3VyOyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHsKCQkJCWV2ZW50UGF0aC5wdXNoKCBjdXIgKTsKCQkJCXRtcCA9IGN1cjsKCQkJfQoKCQkJLy8gT25seSBhZGQgd2luZG93IGlmIHdlIGdvdCB0byBkb2N1bWVudCAoZS5nLiwgbm90IHBsYWluIG9iaiBvciBkZXRhY2hlZCBET00pCgkJCWlmICggdG1wID09PSAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCApICkgewoJCQkJZXZlbnRQYXRoLnB1c2goIHRtcC5kZWZhdWx0VmlldyB8fCB0bXAucGFyZW50V2luZG93IHx8IHdpbmRvdyApOwoJCQl9CgkJfQoKCQkvLyBGaXJlIGhhbmRsZXJzIG9uIHRoZSBldmVudCBwYXRoCgkJaSA9IDA7CgkJd2hpbGUgKCAoIGN1ciA9IGV2ZW50UGF0aFsgaSsrIF0gKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKCQkJbGFzdEVsZW1lbnQgPSBjdXI7CgkJCWV2ZW50LnR5cGUgPSBpID4gMSA/CgkJCQlidWJibGVUeXBlIDoKCQkJCXNwZWNpYWwuYmluZFR5cGUgfHwgdHlwZTsKCgkJCS8vIGpRdWVyeSBoYW5kbGVyCgkJCWhhbmRsZSA9ICggZGF0YVByaXYuZ2V0KCBjdXIsICJldmVudHMiICkgfHwge30gKVsgZXZlbnQudHlwZSBdICYmCgkJCQlkYXRhUHJpdi5nZXQoIGN1ciwgImhhbmRsZSIgKTsKCQkJaWYgKCBoYW5kbGUgKSB7CgkJCQloYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApOwoJCQl9CgoJCQkvLyBOYXRpdmUgaGFuZGxlcgoJCQloYW5kbGUgPSBvbnR5cGUgJiYgY3VyWyBvbnR5cGUgXTsKCQkJaWYgKCBoYW5kbGUgJiYgaGFuZGxlLmFwcGx5ICYmIGFjY2VwdERhdGEoIGN1ciApICkgewoJCQkJZXZlbnQucmVzdWx0ID0gaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTsKCQkJCWlmICggZXZlbnQucmVzdWx0ID09PSBmYWxzZSApIHsKCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJfQoJCQl9CgkJfQoJCWV2ZW50LnR5cGUgPSB0eXBlOwoKCQkvLyBJZiBub2JvZHkgcHJldmVudGVkIHRoZSBkZWZhdWx0IGFjdGlvbiwgZG8gaXQgbm93CgkJaWYgKCAhb25seUhhbmRsZXJzICYmICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHsKCgkJCWlmICggKCAhc3BlY2lhbC5fZGVmYXVsdCB8fAoJCQkJc3BlY2lhbC5fZGVmYXVsdC5hcHBseSggZXZlbnRQYXRoLnBvcCgpLCBkYXRhICkgPT09IGZhbHNlICkgJiYKCQkJCWFjY2VwdERhdGEoIGVsZW0gKSApIHsKCgkJCQkvLyBDYWxsIGEgbmF0aXZlIERPTSBtZXRob2Qgb24gdGhlIHRhcmdldCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGV2ZW50LgoJCQkJLy8gRG9uJ3QgZG8gZGVmYXVsdCBhY3Rpb25zIG9uIHdpbmRvdywgdGhhdCdzIHdoZXJlIGdsb2JhbCB2YXJpYWJsZXMgYmUgKCM2MTcwKQoJCQkJaWYgKCBvbnR5cGUgJiYgaXNGdW5jdGlvbiggZWxlbVsgdHlwZSBdICkgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7CgoJCQkJCS8vIERvbid0IHJlLXRyaWdnZXIgYW4gb25GT08gZXZlbnQgd2hlbiB3ZSBjYWxsIGl0cyBGT08oKSBtZXRob2QKCQkJCQl0bXAgPSBlbGVtWyBvbnR5cGUgXTsKCgkJCQkJaWYgKCB0bXAgKSB7CgkJCQkJCWVsZW1bIG9udHlwZSBdID0gbnVsbDsKCQkJCQl9CgoJCQkJCS8vIFByZXZlbnQgcmUtdHJpZ2dlcmluZyBvZiB0aGUgc2FtZSBldmVudCwgc2luY2Ugd2UgYWxyZWFkeSBidWJibGVkIGl0IGFib3ZlCgkJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHR5cGU7CgoJCQkJCWlmICggZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKCQkJCQkJbGFzdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgKTsKCQkJCQl9CgoJCQkJCWVsZW1bIHR5cGUgXSgpOwoKCQkJCQlpZiAoIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CgkJCQkJCWxhc3RFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrICk7CgkJCQkJfQoKCQkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdW5kZWZpbmVkOwoKCQkJCQlpZiAoIHRtcCApIHsKCQkJCQkJZWxlbVsgb250eXBlIF0gPSB0bXA7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJfSwKCgkvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmUKCS8vIFVzZWQgb25seSBmb3IgYGZvY3VzKGluIHwgb3V0KWAgZXZlbnRzCglzaW11bGF0ZTogZnVuY3Rpb24oIHR5cGUsIGVsZW0sIGV2ZW50ICkgewoJCXZhciBlID0galF1ZXJ5LmV4dGVuZCgKCQkJbmV3IGpRdWVyeS5FdmVudCgpLAoJCQlldmVudCwKCQkJewoJCQkJdHlwZTogdHlwZSwKCQkJCWlzU2ltdWxhdGVkOiB0cnVlCgkJCX0KCQkpOwoKCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggZSwgbnVsbCwgZWxlbSApOwoJfQoKfSApOwoKalF1ZXJ5LmZuLmV4dGVuZCggewoKCXRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApOwoJCX0gKTsKCX0sCgl0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7CgkJdmFyIGVsZW0gPSB0aGlzWyAwIF07CgkJaWYgKCBlbGVtICkgewoJCQlyZXR1cm4galF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUsIGRhdGEsIGVsZW0sIHRydWUgKTsKCQl9Cgl9Cn0gKTsKCgovLyBTdXBwb3J0OiBGaXJlZm94IDw9NDQKLy8gRmlyZWZveCBkb2Vzbid0IGhhdmUgZm9jdXMoaW4gfCBvdXQpIGV2ZW50cwovLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY4Nzc4NwovLwovLyBTdXBwb3J0OiBDaHJvbWUgPD00OCAtIDQ5LCBTYWZhcmkgPD05LjAgLSA5LjEKLy8gZm9jdXMoaW4gfCBvdXQpIGV2ZW50cyBmaXJlIGFmdGVyIGZvY3VzICYgYmx1ciBldmVudHMsCi8vIHdoaWNoIGlzIHNwZWMgdmlvbGF0aW9uIC0gaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudHMtZm9jdXNldmVudC1ldmVudC1vcmRlcgovLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ0OTg1NwppZiAoICFzdXBwb3J0LmZvY3VzaW4gKSB7CglqUXVlcnkuZWFjaCggeyBmb2N1czogImZvY3VzaW4iLCBibHVyOiAiZm9jdXNvdXQiIH0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7CgoJCS8vIEF0dGFjaCBhIHNpbmdsZSBjYXB0dXJpbmcgaGFuZGxlciBvbiB0aGUgZG9jdW1lbnQgd2hpbGUgc29tZW9uZSB3YW50cyBmb2N1c2luL2ZvY3Vzb3V0CgkJdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCWpRdWVyeS5ldmVudC5zaW11bGF0ZSggZml4LCBldmVudC50YXJnZXQsIGpRdWVyeS5ldmVudC5maXgoIGV2ZW50ICkgKTsKCQl9OwoKCQlqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7CgkJCXNldHVwOiBmdW5jdGlvbigpIHsKCQkJCXZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcywKCQkJCQlhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKTsKCgkJCQlpZiAoICFhdHRhY2hlcyApIHsKCQkJCQlkb2MuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApOwoJCQkJfQoJCQkJZGF0YVByaXYuYWNjZXNzKCBkb2MsIGZpeCwgKCBhdHRhY2hlcyB8fCAwICkgKyAxICk7CgkJCX0sCgkJCXRlYXJkb3duOiBmdW5jdGlvbigpIHsKCQkJCXZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcywKCQkJCQlhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKSAtIDE7CgoJCQkJaWYgKCAhYXR0YWNoZXMgKSB7CgkJCQkJZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTsKCQkJCQlkYXRhUHJpdi5yZW1vdmUoIGRvYywgZml4ICk7CgoJCQkJfSBlbHNlIHsKCQkJCQlkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4LCBhdHRhY2hlcyApOwoJCQkJfQoJCQl9CgkJfTsKCX0gKTsKfQp2YXIgbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb247Cgp2YXIgbm9uY2UgPSBEYXRlLm5vdygpOwoKdmFyIHJxdWVyeSA9ICggL1w/LyApOwoKCgovLyBDcm9zcy1icm93c2VyIHhtbCBwYXJzaW5nCmpRdWVyeS5wYXJzZVhNTCA9IGZ1bmN0aW9uKCBkYXRhICkgewoJdmFyIHhtbDsKCWlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09ICJzdHJpbmciICkgewoJCXJldHVybiBudWxsOwoJfQoKCS8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5CgkvLyBJRSB0aHJvd3Mgb24gcGFyc2VGcm9tU3RyaW5nIHdpdGggaW52YWxpZCBpbnB1dC4KCXRyeSB7CgkJeG1sID0gKCBuZXcgd2luZG93LkRPTVBhcnNlcigpICkucGFyc2VGcm9tU3RyaW5nKCBkYXRhLCAidGV4dC94bWwiICk7Cgl9IGNhdGNoICggZSApIHsKCQl4bWwgPSB1bmRlZmluZWQ7Cgl9CgoJaWYgKCAheG1sIHx8IHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSggInBhcnNlcmVycm9yIiApLmxlbmd0aCApIHsKCQlqUXVlcnkuZXJyb3IoICJJbnZhbGlkIFhNTDogIiArIGRhdGEgKTsKCX0KCXJldHVybiB4bWw7Cn07CgoKdmFyCglyYnJhY2tldCA9IC9cW1xdJC8sCglyQ1JMRiA9IC9ccj9cbi9nLAoJcnN1Ym1pdHRlclR5cGVzID0gL14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLAoJcnN1Ym1pdHRhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pOwoKZnVuY3Rpb24gYnVpbGRQYXJhbXMoIHByZWZpeCwgb2JqLCB0cmFkaXRpb25hbCwgYWRkICkgewoJdmFyIG5hbWU7CgoJaWYgKCBBcnJheS5pc0FycmF5KCBvYmogKSApIHsKCgkJLy8gU2VyaWFsaXplIGFycmF5IGl0ZW0uCgkJalF1ZXJ5LmVhY2goIG9iaiwgZnVuY3Rpb24oIGksIHYgKSB7CgkJCWlmICggdHJhZGl0aW9uYWwgfHwgcmJyYWNrZXQudGVzdCggcHJlZml4ICkgKSB7CgoJCQkJLy8gVHJlYXQgZWFjaCBhcnJheSBpdGVtIGFzIGEgc2NhbGFyLgoJCQkJYWRkKCBwcmVmaXgsIHYgKTsKCgkJCX0gZWxzZSB7CgoJCQkJLy8gSXRlbSBpcyBub24tc2NhbGFyIChhcnJheSBvciBvYmplY3QpLCBlbmNvZGUgaXRzIG51bWVyaWMgaW5kZXguCgkJCQlidWlsZFBhcmFtcygKCQkJCQlwcmVmaXggKyAiWyIgKyAoIHR5cGVvZiB2ID09PSAib2JqZWN0IiAmJiB2ICE9IG51bGwgPyBpIDogIiIgKSArICJdIiwKCQkJCQl2LAoJCQkJCXRyYWRpdGlvbmFsLAoJCQkJCWFkZAoJCQkJKTsKCQkJfQoJCX0gKTsKCgl9IGVsc2UgaWYgKCAhdHJhZGl0aW9uYWwgJiYgdG9UeXBlKCBvYmogKSA9PT0gIm9iamVjdCIgKSB7CgoJCS8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS4KCQlmb3IgKCBuYW1lIGluIG9iaiApIHsKCQkJYnVpbGRQYXJhbXMoIHByZWZpeCArICJbIiArIG5hbWUgKyAiXSIsIG9ialsgbmFtZSBdLCB0cmFkaXRpb25hbCwgYWRkICk7CgkJfQoKCX0gZWxzZSB7CgoJCS8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS4KCQlhZGQoIHByZWZpeCwgb2JqICk7Cgl9Cn0KCi8vIFNlcmlhbGl6ZSBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzIG9yIGEgc2V0IG9mCi8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZwpqUXVlcnkucGFyYW0gPSBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7Cgl2YXIgcHJlZml4LAoJCXMgPSBbXSwKCQlhZGQgPSBmdW5jdGlvbigga2V5LCB2YWx1ZU9yRnVuY3Rpb24gKSB7CgoJCQkvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHVzZSBpdHMgcmV0dXJuIHZhbHVlCgkJCXZhciB2YWx1ZSA9IGlzRnVuY3Rpb24oIHZhbHVlT3JGdW5jdGlvbiApID8KCQkJCXZhbHVlT3JGdW5jdGlvbigpIDoKCQkJCXZhbHVlT3JGdW5jdGlvbjsKCgkJCXNbIHMubGVuZ3RoIF0gPSBlbmNvZGVVUklDb21wb25lbnQoIGtleSApICsgIj0iICsKCQkJCWVuY29kZVVSSUNvbXBvbmVudCggdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUgKTsKCQl9OwoKCS8vIElmIGFuIGFycmF5IHdhcyBwYXNzZWQgaW4sIGFzc3VtZSB0aGF0IGl0IGlzIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMuCglpZiAoIEFycmF5LmlzQXJyYXkoIGEgKSB8fCAoIGEuanF1ZXJ5ICYmICFqUXVlcnkuaXNQbGFpbk9iamVjdCggYSApICkgKSB7CgoJCS8vIFNlcmlhbGl6ZSB0aGUgZm9ybSBlbGVtZW50cwoJCWpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpIHsKCQkJYWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTsKCQl9ICk7CgoJfSBlbHNlIHsKCgkJLy8gSWYgdHJhZGl0aW9uYWwsIGVuY29kZSB0aGUgIm9sZCIgd2F5ICh0aGUgd2F5IDEuMy4yIG9yIG9sZGVyCgkJLy8gZGlkIGl0KSwgb3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuCgkJZm9yICggcHJlZml4IGluIGEgKSB7CgkJCWJ1aWxkUGFyYW1zKCBwcmVmaXgsIGFbIHByZWZpeCBdLCB0cmFkaXRpb25hbCwgYWRkICk7CgkJfQoJfQoKCS8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb24KCXJldHVybiBzLmpvaW4oICImIiApOwp9OwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJc2VyaWFsaXplOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4galF1ZXJ5LnBhcmFtKCB0aGlzLnNlcmlhbGl6ZUFycmF5KCkgKTsKCX0sCglzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHsKCgkJCS8vIENhbiBhZGQgcHJvcEhvb2sgZm9yICJlbGVtZW50cyIgdG8gZmlsdGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRzCgkJCXZhciBlbGVtZW50cyA9IGpRdWVyeS5wcm9wKCB0aGlzLCAiZWxlbWVudHMiICk7CgkJCXJldHVybiBlbGVtZW50cyA/IGpRdWVyeS5tYWtlQXJyYXkoIGVsZW1lbnRzICkgOiB0aGlzOwoJCX0gKQoJCS5maWx0ZXIoIGZ1bmN0aW9uKCkgewoJCQl2YXIgdHlwZSA9IHRoaXMudHlwZTsKCgkJCS8vIFVzZSAuaXMoICI6ZGlzYWJsZWQiICkgc28gdGhhdCBmaWVsZHNldFtkaXNhYmxlZF0gd29ya3MKCQkJcmV0dXJuIHRoaXMubmFtZSAmJiAhalF1ZXJ5KCB0aGlzICkuaXMoICI6ZGlzYWJsZWQiICkgJiYKCQkJCXJzdWJtaXR0YWJsZS50ZXN0KCB0aGlzLm5vZGVOYW1lICkgJiYgIXJzdWJtaXR0ZXJUeXBlcy50ZXN0KCB0eXBlICkgJiYKCQkJCSggdGhpcy5jaGVja2VkIHx8ICFyY2hlY2thYmxlVHlwZS50ZXN0KCB0eXBlICkgKTsKCQl9ICkKCQkubWFwKCBmdW5jdGlvbiggaSwgZWxlbSApIHsKCQkJdmFyIHZhbCA9IGpRdWVyeSggdGhpcyApLnZhbCgpOwoKCQkJaWYgKCB2YWwgPT0gbnVsbCApIHsKCQkJCXJldHVybiBudWxsOwoJCQl9CgoJCQlpZiAoIEFycmF5LmlzQXJyYXkoIHZhbCApICkgewoJCQkJcmV0dXJuIGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbCApIHsKCQkJCQlyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsICJcclxuIiApIH07CgkJCQl9ICk7CgkJCX0KCgkJCXJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgIlxyXG4iICkgfTsKCQl9ICkuZ2V0KCk7Cgl9Cn0gKTsKCgp2YXIKCXIyMCA9IC8lMjAvZywKCXJoYXNoID0gLyMuKiQvLAoJcmFudGlDYWNoZSA9IC8oWz8mXSlfPVteJl0qLywKCXJoZWFkZXJzID0gL14oLio/KTpbIFx0XSooW15cclxuXSopJC9tZywKCgkvLyAjNzY1MywgIzgxMjUsICM4MTUyOiBsb2NhbCBwcm90b2NvbCBkZXRlY3Rpb24KCXJsb2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sCglybm9Db250ZW50ID0gL14oPzpHRVR8SEVBRCkkLywKCXJwcm90b2NvbCA9IC9eXC9cLy8sCgoJLyogUHJlZmlsdGVycwoJICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSkKCSAqIDIpIFRoZXNlIGFyZSBjYWxsZWQ6CgkgKiAgICAtIEJFRk9SRSBhc2tpbmcgZm9yIGEgdHJhbnNwb3J0CgkgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpCgkgKiAzKSBrZXkgaXMgdGhlIGRhdGFUeXBlCgkgKiA0KSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAoJICogNSkgZXhlY3V0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gY29udGludWUgZG93biB0byAiKiIgaWYgbmVlZGVkCgkgKi8KCXByZWZpbHRlcnMgPSB7fSwKCgkvKiBUcmFuc3BvcnRzIGJpbmRpbmdzCgkgKiAxKSBrZXkgaXMgdGhlIGRhdGFUeXBlCgkgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAoJICogMykgc2VsZWN0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gZ28gdG8gIioiIGlmIG5lZWRlZAoJICovCgl0cmFuc3BvcnRzID0ge30sCgoJLy8gQXZvaWQgY29tbWVudC1wcm9sb2cgY2hhciBzZXF1ZW5jZSAoIzEwMDk4KTsgbXVzdCBhcHBlYXNlIGxpbnQgYW5kIGV2YWRlIGNvbXByZXNzaW9uCglhbGxUeXBlcyA9ICIqLyIuY29uY2F0KCAiKiIgKSwKCgkvLyBBbmNob3IgdGFnIGZvciBwYXJzaW5nIHRoZSBkb2N1bWVudCBvcmlnaW4KCW9yaWdpbkFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJhIiApOwoJb3JpZ2luQW5jaG9yLmhyZWYgPSBsb2NhdGlvbi5ocmVmOwoKLy8gQmFzZSAiY29uc3RydWN0b3IiIGZvciBqUXVlcnkuYWpheFByZWZpbHRlciBhbmQgalF1ZXJ5LmFqYXhUcmFuc3BvcnQKZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7CgoJLy8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byAiKiIKCXJldHVybiBmdW5jdGlvbiggZGF0YVR5cGVFeHByZXNzaW9uLCBmdW5jICkgewoKCQlpZiAoIHR5cGVvZiBkYXRhVHlwZUV4cHJlc3Npb24gIT09ICJzdHJpbmciICkgewoJCQlmdW5jID0gZGF0YVR5cGVFeHByZXNzaW9uOwoJCQlkYXRhVHlwZUV4cHJlc3Npb24gPSAiKiI7CgkJfQoKCQl2YXIgZGF0YVR5cGUsCgkJCWkgPSAwLAoJCQlkYXRhVHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Npb24udG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdOwoKCQlpZiAoIGlzRnVuY3Rpb24oIGZ1bmMgKSApIHsKCgkJCS8vIEZvciBlYWNoIGRhdGFUeXBlIGluIHRoZSBkYXRhVHlwZUV4cHJlc3Npb24KCQkJd2hpbGUgKCAoIGRhdGFUeXBlID0gZGF0YVR5cGVzWyBpKysgXSApICkgewoKCQkJCS8vIFByZXBlbmQgaWYgcmVxdWVzdGVkCgkJCQlpZiAoIGRhdGFUeXBlWyAwIF0gPT09ICIrIiApIHsKCQkJCQlkYXRhVHlwZSA9IGRhdGFUeXBlLnNsaWNlKCAxICkgfHwgIioiOwoJCQkJCSggc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdICkudW5zaGlmdCggZnVuYyApOwoKCQkJCS8vIE90aGVyd2lzZSBhcHBlbmQKCQkJCX0gZWxzZSB7CgkJCQkJKCBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10gKS5wdXNoKCBmdW5jICk7CgkJCQl9CgkJCX0KCQl9Cgl9Owp9CgovLyBCYXNlIGluc3BlY3Rpb24gZnVuY3Rpb24gZm9yIHByZWZpbHRlcnMgYW5kIHRyYW5zcG9ydHMKZnVuY3Rpb24gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiApIHsKCgl2YXIgaW5zcGVjdGVkID0ge30sCgkJc2Vla2luZ1RyYW5zcG9ydCA9ICggc3RydWN0dXJlID09PSB0cmFuc3BvcnRzICk7CgoJZnVuY3Rpb24gaW5zcGVjdCggZGF0YVR5cGUgKSB7CgkJdmFyIHNlbGVjdGVkOwoJCWluc3BlY3RlZFsgZGF0YVR5cGUgXSA9IHRydWU7CgkJalF1ZXJ5LmVhY2goIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSwgZnVuY3Rpb24oIF8sIHByZWZpbHRlck9yRmFjdG9yeSApIHsKCQkJdmFyIGRhdGFUeXBlT3JUcmFuc3BvcnQgPSBwcmVmaWx0ZXJPckZhY3RvcnkoIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTsKCQkJaWYgKCB0eXBlb2YgZGF0YVR5cGVPclRyYW5zcG9ydCA9PT0gInN0cmluZyIgJiYKCQkJCSFzZWVraW5nVHJhbnNwb3J0ICYmICFpbnNwZWN0ZWRbIGRhdGFUeXBlT3JUcmFuc3BvcnQgXSApIHsKCgkJCQlvcHRpb25zLmRhdGFUeXBlcy51bnNoaWZ0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCQlpbnNwZWN0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0gZWxzZSBpZiAoIHNlZWtpbmdUcmFuc3BvcnQgKSB7CgkJCQlyZXR1cm4gISggc2VsZWN0ZWQgPSBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCX0KCQl9ICk7CgkJcmV0dXJuIHNlbGVjdGVkOwoJfQoKCXJldHVybiBpbnNwZWN0KCBvcHRpb25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgIioiIF0gJiYgaW5zcGVjdCggIioiICk7Cn0KCi8vIEEgc3BlY2lhbCBleHRlbmQgZm9yIGFqYXggb3B0aW9ucwovLyB0aGF0IHRha2VzICJmbGF0IiBvcHRpb25zIChub3QgdG8gYmUgZGVlcCBleHRlbmRlZCkKLy8gRml4ZXMgIzk4ODcKZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7Cgl2YXIga2V5LCBkZWVwLAoJCWZsYXRPcHRpb25zID0galF1ZXJ5LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9ucyB8fCB7fTsKCglmb3IgKCBrZXkgaW4gc3JjICkgewoJCWlmICggc3JjWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkgewoJCQkoIGZsYXRPcHRpb25zWyBrZXkgXSA/IHRhcmdldCA6ICggZGVlcCB8fCAoIGRlZXAgPSB7fSApICkgKVsga2V5IF0gPSBzcmNbIGtleSBdOwoJCX0KCX0KCWlmICggZGVlcCApIHsKCQlqUXVlcnkuZXh0ZW5kKCB0cnVlLCB0YXJnZXQsIGRlZXAgKTsKCX0KCglyZXR1cm4gdGFyZ2V0Owp9CgovKiBIYW5kbGVzIHJlc3BvbnNlcyB0byBhbiBhamF4IHJlcXVlc3Q6CiAqIC0gZmluZHMgdGhlIHJpZ2h0IGRhdGFUeXBlIChtZWRpYXRlcyBiZXR3ZWVuIGNvbnRlbnQtdHlwZSBhbmQgZXhwZWN0ZWQgZGF0YVR5cGUpCiAqIC0gcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZQogKi8KZnVuY3Rpb24gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApIHsKCgl2YXIgY3QsIHR5cGUsIGZpbmFsRGF0YVR5cGUsIGZpcnN0RGF0YVR5cGUsCgkJY29udGVudHMgPSBzLmNvbnRlbnRzLAoJCWRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzOwoKCS8vIFJlbW92ZSBhdXRvIGRhdGFUeXBlIGFuZCBnZXQgY29udGVudC10eXBlIGluIHRoZSBwcm9jZXNzCgl3aGlsZSAoIGRhdGFUeXBlc1sgMCBdID09PSAiKiIgKSB7CgkJZGF0YVR5cGVzLnNoaWZ0KCk7CgkJaWYgKCBjdCA9PT0gdW5kZWZpbmVkICkgewoJCQljdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoICJDb250ZW50LVR5cGUiICk7CgkJfQoJfQoKCS8vIENoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIGtub3duIGNvbnRlbnQtdHlwZQoJaWYgKCBjdCApIHsKCQlmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkgewoJCQlpZiAoIGNvbnRlbnRzWyB0eXBlIF0gJiYgY29udGVudHNbIHR5cGUgXS50ZXN0KCBjdCApICkgewoJCQkJZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoKCS8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlwZQoJaWYgKCBkYXRhVHlwZXNbIDAgXSBpbiByZXNwb25zZXMgKSB7CgkJZmluYWxEYXRhVHlwZSA9IGRhdGFUeXBlc1sgMCBdOwoJfSBlbHNlIHsKCgkJLy8gVHJ5IGNvbnZlcnRpYmxlIGRhdGFUeXBlcwoJCWZvciAoIHR5cGUgaW4gcmVzcG9uc2VzICkgewoJCQlpZiAoICFkYXRhVHlwZXNbIDAgXSB8fCBzLmNvbnZlcnRlcnNbIHR5cGUgKyAiICIgKyBkYXRhVHlwZXNbIDAgXSBdICkgewoJCQkJZmluYWxEYXRhVHlwZSA9IHR5cGU7CgkJCQlicmVhazsKCQkJfQoJCQlpZiAoICFmaXJzdERhdGFUeXBlICkgewoJCQkJZmlyc3REYXRhVHlwZSA9IHR5cGU7CgkJCX0KCQl9CgoJCS8vIE9yIGp1c3QgdXNlIGZpcnN0IG9uZQoJCWZpbmFsRGF0YVR5cGUgPSBmaW5hbERhdGFUeXBlIHx8IGZpcnN0RGF0YVR5cGU7Cgl9CgoJLy8gSWYgd2UgZm91bmQgYSBkYXRhVHlwZQoJLy8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWQKCS8vIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UKCWlmICggZmluYWxEYXRhVHlwZSApIHsKCQlpZiAoIGZpbmFsRGF0YVR5cGUgIT09IGRhdGFUeXBlc1sgMCBdICkgewoJCQlkYXRhVHlwZXMudW5zaGlmdCggZmluYWxEYXRhVHlwZSApOwoJCX0KCQlyZXR1cm4gcmVzcG9uc2VzWyBmaW5hbERhdGFUeXBlIF07Cgl9Cn0KCi8qIENoYWluIGNvbnZlcnNpb25zIGdpdmVuIHRoZSByZXF1ZXN0IGFuZCB0aGUgb3JpZ2luYWwgcmVzcG9uc2UKICogQWxzbyBzZXRzIHRoZSByZXNwb25zZVhYWCBmaWVsZHMgb24gdGhlIGpxWEhSIGluc3RhbmNlCiAqLwpmdW5jdGlvbiBhamF4Q29udmVydCggcywgcmVzcG9uc2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKSB7Cgl2YXIgY29udjIsIGN1cnJlbnQsIGNvbnYsIHRtcCwgcHJldiwKCQljb252ZXJ0ZXJzID0ge30sCgoJCS8vIFdvcmsgd2l0aCBhIGNvcHkgb2YgZGF0YVR5cGVzIGluIGNhc2Ugd2UgbmVlZCB0byBtb2RpZnkgaXQgZm9yIGNvbnZlcnNpb24KCQlkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcy5zbGljZSgpOwoKCS8vIENyZWF0ZSBjb252ZXJ0ZXJzIG1hcCB3aXRoIGxvd2VyY2FzZWQga2V5cwoJaWYgKCBkYXRhVHlwZXNbIDEgXSApIHsKCQlmb3IgKCBjb252IGluIHMuY29udmVydGVycyApIHsKCQkJY29udmVydGVyc1sgY29udi50b0xvd2VyQ2FzZSgpIF0gPSBzLmNvbnZlcnRlcnNbIGNvbnYgXTsKCQl9Cgl9CgoJY3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpOwoKCS8vIENvbnZlcnQgdG8gZWFjaCBzZXF1ZW50aWFsIGRhdGFUeXBlCgl3aGlsZSAoIGN1cnJlbnQgKSB7CgoJCWlmICggcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdICkgewoJCQlqcVhIUlsgcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdIF0gPSByZXNwb25zZTsKCQl9CgoJCS8vIEFwcGx5IHRoZSBkYXRhRmlsdGVyIGlmIHByb3ZpZGVkCgkJaWYgKCAhcHJldiAmJiBpc1N1Y2Nlc3MgJiYgcy5kYXRhRmlsdGVyICkgewoJCQlyZXNwb25zZSA9IHMuZGF0YUZpbHRlciggcmVzcG9uc2UsIHMuZGF0YVR5cGUgKTsKCQl9CgoJCXByZXYgPSBjdXJyZW50OwoJCWN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTsKCgkJaWYgKCBjdXJyZW50ICkgewoKCQkJLy8gVGhlcmUncyBvbmx5IHdvcmsgdG8gZG8gaWYgY3VycmVudCBkYXRhVHlwZSBpcyBub24tYXV0bwoJCQlpZiAoIGN1cnJlbnQgPT09ICIqIiApIHsKCgkJCQljdXJyZW50ID0gcHJldjsKCgkJCS8vIENvbnZlcnQgcmVzcG9uc2UgaWYgcHJldiBkYXRhVHlwZSBpcyBub24tYXV0byBhbmQgZGlmZmVycyBmcm9tIGN1cnJlbnQKCQkJfSBlbHNlIGlmICggcHJldiAhPT0gIioiICYmIHByZXYgIT09IGN1cnJlbnQgKSB7CgoJCQkJLy8gU2VlayBhIGRpcmVjdCBjb252ZXJ0ZXIKCQkJCWNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgIiAiICsgY3VycmVudCBdIHx8IGNvbnZlcnRlcnNbICIqICIgKyBjdXJyZW50IF07CgoJCQkJLy8gSWYgbm9uZSBmb3VuZCwgc2VlayBhIHBhaXIKCQkJCWlmICggIWNvbnYgKSB7CgkJCQkJZm9yICggY29udjIgaW4gY29udmVydGVycyApIHsKCgkJCQkJCS8vIElmIGNvbnYyIG91dHB1dHMgY3VycmVudAoJCQkJCQl0bXAgPSBjb252Mi5zcGxpdCggIiAiICk7CgkJCQkJCWlmICggdG1wWyAxIF0gPT09IGN1cnJlbnQgKSB7CgoJCQkJCQkJLy8gSWYgcHJldiBjYW4gYmUgY29udmVydGVkIHRvIGFjY2VwdGVkIGlucHV0CgkJCQkJCQljb252ID0gY29udmVydGVyc1sgcHJldiArICIgIiArIHRtcFsgMCBdIF0gfHwKCQkJCQkJCQljb252ZXJ0ZXJzWyAiKiAiICsgdG1wWyAwIF0gXTsKCQkJCQkJCWlmICggY29udiApIHsKCgkJCQkJCQkJLy8gQ29uZGVuc2UgZXF1aXZhbGVuY2UgY29udmVydGVycwoJCQkJCQkJCWlmICggY29udiA9PT0gdHJ1ZSApIHsKCQkJCQkJCQkJY29udiA9IGNvbnZlcnRlcnNbIGNvbnYyIF07CgoJCQkJCQkJCS8vIE90aGVyd2lzZSwgaW5zZXJ0IHRoZSBpbnRlcm1lZGlhdGUgZGF0YVR5cGUKCQkJCQkJCQl9IGVsc2UgaWYgKCBjb252ZXJ0ZXJzWyBjb252MiBdICE9PSB0cnVlICkgewoJCQkJCQkJCQljdXJyZW50ID0gdG1wWyAwIF07CgkJCQkJCQkJCWRhdGFUeXBlcy51bnNoaWZ0KCB0bXBbIDEgXSApOwoJCQkJCQkJCX0KCQkJCQkJCQlicmVhazsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQkvLyBBcHBseSBjb252ZXJ0ZXIgKGlmIG5vdCBhbiBlcXVpdmFsZW5jZSkKCQkJCWlmICggY29udiAhPT0gdHJ1ZSApIHsKCgkJCQkJLy8gVW5sZXNzIGVycm9ycyBhcmUgYWxsb3dlZCB0byBidWJibGUsIGNhdGNoIGFuZCByZXR1cm4gdGhlbQoJCQkJCWlmICggY29udiAmJiBzLnRocm93cyApIHsKCQkJCQkJcmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXRyeSB7CgkJCQkJCQlyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7CgkJCQkJCX0gY2F0Y2ggKCBlICkgewoJCQkJCQkJcmV0dXJuIHsKCQkJCQkJCQlzdGF0ZTogInBhcnNlcmVycm9yIiwKCQkJCQkJCQllcnJvcjogY29udiA/IGUgOiAiTm8gY29udmVyc2lvbiBmcm9tICIgKyBwcmV2ICsgIiB0byAiICsgY3VycmVudAoJCQkJCQkJfTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0KCglyZXR1cm4geyBzdGF0ZTogInN1Y2Nlc3MiLCBkYXRhOiByZXNwb25zZSB9Owp9CgpqUXVlcnkuZXh0ZW5kKCB7CgoJLy8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBxdWVyaWVzCglhY3RpdmU6IDAsCgoJLy8gTGFzdC1Nb2RpZmllZCBoZWFkZXIgY2FjaGUgZm9yIG5leHQgcmVxdWVzdAoJbGFzdE1vZGlmaWVkOiB7fSwKCWV0YWc6IHt9LAoKCWFqYXhTZXR0aW5nczogewoJCXVybDogbG9jYXRpb24uaHJlZiwKCQl0eXBlOiAiR0VUIiwKCQlpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBsb2NhdGlvbi5wcm90b2NvbCApLAoJCWdsb2JhbDogdHJ1ZSwKCQlwcm9jZXNzRGF0YTogdHJ1ZSwKCQlhc3luYzogdHJ1ZSwKCQljb250ZW50VHlwZTogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsCgoJCS8qCgkJdGltZW91dDogMCwKCQlkYXRhOiBudWxsLAoJCWRhdGFUeXBlOiBudWxsLAoJCXVzZXJuYW1lOiBudWxsLAoJCXBhc3N3b3JkOiBudWxsLAoJCWNhY2hlOiBudWxsLAoJCXRocm93czogZmFsc2UsCgkJdHJhZGl0aW9uYWw6IGZhbHNlLAoJCWhlYWRlcnM6IHt9LAoJCSovCgoJCWFjY2VwdHM6IHsKCQkJIioiOiBhbGxUeXBlcywKCQkJdGV4dDogInRleHQvcGxhaW4iLAoJCQlodG1sOiAidGV4dC9odG1sIiwKCQkJeG1sOiAiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsCgkJCWpzb246ICJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiCgkJfSwKCgkJY29udGVudHM6IHsKCQkJeG1sOiAvXGJ4bWxcYi8sCgkJCWh0bWw6IC9cYmh0bWwvLAoJCQlqc29uOiAvXGJqc29uXGIvCgkJfSwKCgkJcmVzcG9uc2VGaWVsZHM6IHsKCQkJeG1sOiAicmVzcG9uc2VYTUwiLAoJCQl0ZXh0OiAicmVzcG9uc2VUZXh0IiwKCQkJanNvbjogInJlc3BvbnNlSlNPTiIKCQl9LAoKCQkvLyBEYXRhIGNvbnZlcnRlcnMKCQkvLyBLZXlzIHNlcGFyYXRlIHNvdXJjZSAob3IgY2F0Y2hhbGwgIioiKSBhbmQgZGVzdGluYXRpb24gdHlwZXMgd2l0aCBhIHNpbmdsZSBzcGFjZQoJCWNvbnZlcnRlcnM6IHsKCgkJCS8vIENvbnZlcnQgYW55dGhpbmcgdG8gdGV4dAoJCQkiKiB0ZXh0IjogU3RyaW5nLAoKCQkJLy8gVGV4dCB0byBodG1sICh0cnVlID0gbm8gdHJhbnNmb3JtYXRpb24pCgkJCSJ0ZXh0IGh0bWwiOiB0cnVlLAoKCQkJLy8gRXZhbHVhdGUgdGV4dCBhcyBhIGpzb24gZXhwcmVzc2lvbgoJCQkidGV4dCBqc29uIjogSlNPTi5wYXJzZSwKCgkJCS8vIFBhcnNlIHRleHQgYXMgeG1sCgkJCSJ0ZXh0IHhtbCI6IGpRdWVyeS5wYXJzZVhNTAoJCX0sCgoJCS8vIEZvciBvcHRpb25zIHRoYXQgc2hvdWxkbid0IGJlIGRlZXAgZXh0ZW5kZWQ6CgkJLy8geW91IGNhbiBhZGQgeW91ciBvd24gY3VzdG9tIG9wdGlvbnMgaGVyZSBpZgoJCS8vIGFuZCB3aGVuIHlvdSBjcmVhdGUgb25lIHRoYXQgc2hvdWxkbid0IGJlCgkJLy8gZGVlcCBleHRlbmRlZCAoc2VlIGFqYXhFeHRlbmQpCgkJZmxhdE9wdGlvbnM6IHsKCQkJdXJsOiB0cnVlLAoJCQljb250ZXh0OiB0cnVlCgkJfQoJfSwKCgkvLyBDcmVhdGVzIGEgZnVsbCBmbGVkZ2VkIHNldHRpbmdzIG9iamVjdCBpbnRvIHRhcmdldAoJLy8gd2l0aCBib3RoIGFqYXhTZXR0aW5ncyBhbmQgc2V0dGluZ3MgZmllbGRzLgoJLy8gSWYgdGFyZ2V0IGlzIG9taXR0ZWQsIHdyaXRlcyBpbnRvIGFqYXhTZXR0aW5ncy4KCWFqYXhTZXR1cDogZnVuY3Rpb24oIHRhcmdldCwgc2V0dGluZ3MgKSB7CgkJcmV0dXJuIHNldHRpbmdzID8KCgkJCS8vIEJ1aWxkaW5nIGEgc2V0dGluZ3Mgb2JqZWN0CgkJCWFqYXhFeHRlbmQoIGFqYXhFeHRlbmQoIHRhcmdldCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApLCBzZXR0aW5ncyApIDoKCgkJCS8vIEV4dGVuZGluZyBhamF4U2V0dGluZ3MKCQkJYWpheEV4dGVuZCggalF1ZXJ5LmFqYXhTZXR0aW5ncywgdGFyZ2V0ICk7Cgl9LAoKCWFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLAoJYWpheFRyYW5zcG9ydDogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzICksCgoJLy8gTWFpbiBtZXRob2QKCWFqYXg6IGZ1bmN0aW9uKCB1cmwsIG9wdGlvbnMgKSB7CgoJCS8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRlIHByZS0xLjUgc2lnbmF0dXJlCgkJaWYgKCB0eXBlb2YgdXJsID09PSAib2JqZWN0IiApIHsKCQkJb3B0aW9ucyA9IHVybDsKCQkJdXJsID0gdW5kZWZpbmVkOwoJCX0KCgkJLy8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBvYmplY3QKCQlvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCgkJdmFyIHRyYW5zcG9ydCwKCgkJCS8vIFVSTCB3aXRob3V0IGFudGktY2FjaGUgcGFyYW0KCQkJY2FjaGVVUkwsCgoJCQkvLyBSZXNwb25zZSBoZWFkZXJzCgkJCXJlc3BvbnNlSGVhZGVyc1N0cmluZywKCQkJcmVzcG9uc2VIZWFkZXJzLAoKCQkJLy8gdGltZW91dCBoYW5kbGUKCQkJdGltZW91dFRpbWVyLAoKCQkJLy8gVXJsIGNsZWFudXAgdmFyCgkJCXVybEFuY2hvciwKCgkJCS8vIFJlcXVlc3Qgc3RhdGUgKGJlY29tZXMgZmFsc2UgdXBvbiBzZW5kIGFuZCB0cnVlIHVwb24gY29tcGxldGlvbikKCQkJY29tcGxldGVkLAoKCQkJLy8gVG8ga25vdyBpZiBnbG9iYWwgZXZlbnRzIGFyZSB0byBiZSBkaXNwYXRjaGVkCgkJCWZpcmVHbG9iYWxzLAoKCQkJLy8gTG9vcCB2YXJpYWJsZQoJCQlpLAoKCQkJLy8gdW5jYWNoZWQgcGFydCBvZiB0aGUgdXJsCgkJCXVuY2FjaGVkLAoKCQkJLy8gQ3JlYXRlIHRoZSBmaW5hbCBvcHRpb25zIG9iamVjdAoJCQlzID0galF1ZXJ5LmFqYXhTZXR1cCgge30sIG9wdGlvbnMgKSwKCgkJCS8vIENhbGxiYWNrcyBjb250ZXh0CgkJCWNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLAoKCQkJLy8gQ29udGV4dCBmb3IgZ2xvYmFsIGV2ZW50cyBpcyBjYWxsYmFja0NvbnRleHQgaWYgaXQgaXMgYSBET00gbm9kZSBvciBqUXVlcnkgY29sbGVjdGlvbgoJCQlnbG9iYWxFdmVudENvbnRleHQgPSBzLmNvbnRleHQgJiYKCQkJCSggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNrQ29udGV4dC5qcXVlcnkgKSA/CgkJCQkJalF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6CgkJCQkJalF1ZXJ5LmV2ZW50LAoKCQkJLy8gRGVmZXJyZWRzCgkJCWRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCksCgkJCWNvbXBsZXRlRGVmZXJyZWQgPSBqUXVlcnkuQ2FsbGJhY2tzKCAib25jZSBtZW1vcnkiICksCgoJCQkvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcwoJCQlzdGF0dXNDb2RlID0gcy5zdGF0dXNDb2RlIHx8IHt9LAoKCQkJLy8gSGVhZGVycyAodGhleSBhcmUgc2VudCBhbGwgYXQgb25jZSkKCQkJcmVxdWVzdEhlYWRlcnMgPSB7fSwKCQkJcmVxdWVzdEhlYWRlcnNOYW1lcyA9IHt9LAoKCQkJLy8gRGVmYXVsdCBhYm9ydCBtZXNzYWdlCgkJCXN0ckFib3J0ID0gImNhbmNlbGVkIiwKCgkJCS8vIEZha2UgeGhyCgkJCWpxWEhSID0gewoJCQkJcmVhZHlTdGF0ZTogMCwKCgkJCQkvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkCgkJCQlnZXRSZXNwb25zZUhlYWRlcjogZnVuY3Rpb24oIGtleSApIHsKCQkJCQl2YXIgbWF0Y2g7CgkJCQkJaWYgKCBjb21wbGV0ZWQgKSB7CgkJCQkJCWlmICggIXJlc3BvbnNlSGVhZGVycyApIHsKCQkJCQkJCXJlc3BvbnNlSGVhZGVycyA9IHt9OwoJCQkJCQkJd2hpbGUgKCAoIG1hdGNoID0gcmhlYWRlcnMuZXhlYyggcmVzcG9uc2VIZWFkZXJzU3RyaW5nICkgKSApIHsKCQkJCQkJCQlyZXNwb25zZUhlYWRlcnNbIG1hdGNoWyAxIF0udG9Mb3dlckNhc2UoKSBdID0gbWF0Y2hbIDIgXTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQltYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sga2V5LnRvTG93ZXJDYXNlKCkgXTsKCQkJCQl9CgkJCQkJcmV0dXJuIG1hdGNoID09IG51bGwgPyBudWxsIDogbWF0Y2g7CgkJCQl9LAoKCQkJCS8vIFJhdyBzdHJpbmcKCQkJCWdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7CgkJCQkJcmV0dXJuIGNvbXBsZXRlZCA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7CgkJCQl9LAoKCQkJCS8vIENhY2hlcyB0aGUgaGVhZGVyCgkJCQlzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJCQkJaWYgKCBjb21wbGV0ZWQgPT0gbnVsbCApIHsKCQkJCQkJbmFtZSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIG5hbWUudG9Mb3dlckNhc2UoKSBdID0KCQkJCQkJCXJlcXVlc3RIZWFkZXJzTmFtZXNbIG5hbWUudG9Mb3dlckNhc2UoKSBdIHx8IG5hbWU7CgkJCQkJCXJlcXVlc3RIZWFkZXJzWyBuYW1lIF0gPSB2YWx1ZTsKCQkJCQl9CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIE92ZXJyaWRlcyByZXNwb25zZSBjb250ZW50LXR5cGUgaGVhZGVyCgkJCQlvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHsKCQkJCQlpZiAoIGNvbXBsZXRlZCA9PSBudWxsICkgewoJCQkJCQlzLm1pbWVUeXBlID0gdHlwZTsKCQkJCQl9CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzCgkJCQlzdGF0dXNDb2RlOiBmdW5jdGlvbiggbWFwICkgewoJCQkJCXZhciBjb2RlOwoJCQkJCWlmICggbWFwICkgewoJCQkJCQlpZiAoIGNvbXBsZXRlZCApIHsKCgkJCQkJCQkvLyBFeGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3MKCQkJCQkJCWpxWEhSLmFsd2F5cyggbWFwWyBqcVhIUi5zdGF0dXMgXSApOwoJCQkJCQl9IGVsc2UgewoKCQkJCQkJCS8vIExhenktYWRkIHRoZSBuZXcgY2FsbGJhY2tzIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIG9sZCBvbmVzCgkJCQkJCQlmb3IgKCBjb2RlIGluIG1hcCApIHsKCQkJCQkJCQlzdGF0dXNDb2RlWyBjb2RlIF0gPSBbIHN0YXR1c0NvZGVbIGNvZGUgXSwgbWFwWyBjb2RlIF0gXTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0sCgoJCQkJLy8gQ2FuY2VsIHRoZSByZXF1ZXN0CgkJCQlhYm9ydDogZnVuY3Rpb24oIHN0YXR1c1RleHQgKSB7CgkJCQkJdmFyIGZpbmFsVGV4dCA9IHN0YXR1c1RleHQgfHwgc3RyQWJvcnQ7CgkJCQkJaWYgKCB0cmFuc3BvcnQgKSB7CgkJCQkJCXRyYW5zcG9ydC5hYm9ydCggZmluYWxUZXh0ICk7CgkJCQkJfQoJCQkJCWRvbmUoIDAsIGZpbmFsVGV4dCApOwoJCQkJCXJldHVybiB0aGlzOwoJCQkJfQoJCQl9OwoKCQkvLyBBdHRhY2ggZGVmZXJyZWRzCgkJZGVmZXJyZWQucHJvbWlzZSgganFYSFIgKTsKCgkJLy8gQWRkIHByb3RvY29sIGlmIG5vdCBwcm92aWRlZCAocHJlZmlsdGVycyBtaWdodCBleHBlY3QgaXQpCgkJLy8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0ICgjMTAwOTM6IGNvbnNpc3RlbmN5IHdpdGggb2xkIHNpZ25hdHVyZSkKCQkvLyBXZSBhbHNvIHVzZSB0aGUgdXJsIHBhcmFtZXRlciBpZiBhdmFpbGFibGUKCQlzLnVybCA9ICggKCB1cmwgfHwgcy51cmwgfHwgbG9jYXRpb24uaHJlZiApICsgIiIgKQoJCQkucmVwbGFjZSggcnByb3RvY29sLCBsb2NhdGlvbi5wcm90b2NvbCArICIvLyIgKTsKCgkJLy8gQWxpYXMgbWV0aG9kIG9wdGlvbiB0byB0eXBlIGFzIHBlciB0aWNrZXQgIzEyMDA0CgkJcy50eXBlID0gb3B0aW9ucy5tZXRob2QgfHwgb3B0aW9ucy50eXBlIHx8IHMubWV0aG9kIHx8IHMudHlwZTsKCgkJLy8gRXh0cmFjdCBkYXRhVHlwZXMgbGlzdAoJCXMuZGF0YVR5cGVzID0gKCBzLmRhdGFUeXBlIHx8ICIqIiApLnRvTG93ZXJDYXNlKCkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbICIiIF07CgoJCS8vIEEgY3Jvc3MtZG9tYWluIHJlcXVlc3QgaXMgaW4gb3JkZXIgd2hlbiB0aGUgb3JpZ2luIGRvZXNuJ3QgbWF0Y2ggdGhlIGN1cnJlbnQgb3JpZ2luLgoJCWlmICggcy5jcm9zc0RvbWFpbiA9PSBudWxsICkgewoJCQl1cmxBbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiYSIgKTsKCgkJCS8vIFN1cHBvcnQ6IElFIDw9OCAtIDExLCBFZGdlIDEyIC0gMTUKCQkJLy8gSUUgdGhyb3dzIGV4Y2VwdGlvbiBvbiBhY2Nlc3NpbmcgdGhlIGhyZWYgcHJvcGVydHkgaWYgdXJsIGlzIG1hbGZvcm1lZCwKCQkJLy8gZS5nLiBodHRwOi8vZXhhbXBsZS5jb206ODB4LwoJCQl0cnkgewoJCQkJdXJsQW5jaG9yLmhyZWYgPSBzLnVybDsKCgkJCQkvLyBTdXBwb3J0OiBJRSA8PTggLSAxMSBvbmx5CgkJCQkvLyBBbmNob3IncyBob3N0IHByb3BlcnR5IGlzbid0IGNvcnJlY3RseSBzZXQgd2hlbiBzLnVybCBpcyByZWxhdGl2ZQoJCQkJdXJsQW5jaG9yLmhyZWYgPSB1cmxBbmNob3IuaHJlZjsKCQkJCXMuY3Jvc3NEb21haW4gPSBvcmlnaW5BbmNob3IucHJvdG9jb2wgKyAiLy8iICsgb3JpZ2luQW5jaG9yLmhvc3QgIT09CgkJCQkJdXJsQW5jaG9yLnByb3RvY29sICsgIi8vIiArIHVybEFuY2hvci5ob3N0OwoJCQl9IGNhdGNoICggZSApIHsKCgkJCQkvLyBJZiB0aGVyZSBpcyBhbiBlcnJvciBwYXJzaW5nIHRoZSBVUkwsIGFzc3VtZSBpdCBpcyBjcm9zc0RvbWFpbiwKCQkJCS8vIGl0IGNhbiBiZSByZWplY3RlZCBieSB0aGUgdHJhbnNwb3J0IGlmIGl0IGlzIGludmFsaWQKCQkJCXMuY3Jvc3NEb21haW4gPSB0cnVlOwoJCQl9CgkJfQoKCQkvLyBDb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmcKCQlpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmIHR5cGVvZiBzLmRhdGEgIT09ICJzdHJpbmciICkgewoJCQlzLmRhdGEgPSBqUXVlcnkucGFyYW0oIHMuZGF0YSwgcy50cmFkaXRpb25hbCApOwoJCX0KCgkJLy8gQXBwbHkgcHJlZmlsdGVycwoJCWluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzLCBzLCBvcHRpb25zLCBqcVhIUiApOwoKCQkvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVkIGluc2lkZSBhIHByZWZpbHRlciwgc3RvcCB0aGVyZQoJCWlmICggY29tcGxldGVkICkgewoJCQlyZXR1cm4ganFYSFI7CgkJfQoKCQkvLyBXZSBjYW4gZmlyZSBnbG9iYWwgZXZlbnRzIGFzIG9mIG5vdyBpZiBhc2tlZCB0bwoJCS8vIERvbid0IGZpcmUgZXZlbnRzIGlmIGpRdWVyeS5ldmVudCBpcyB1bmRlZmluZWQgaW4gYW4gQU1ELXVzYWdlIHNjZW5hcmlvICgjMTUxMTgpCgkJZmlyZUdsb2JhbHMgPSBqUXVlcnkuZXZlbnQgJiYgcy5nbG9iYWw7CgoJCS8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHMKCQlpZiAoIGZpcmVHbG9iYWxzICYmIGpRdWVyeS5hY3RpdmUrKyA9PT0gMCApIHsKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RhcnQiICk7CgkJfQoKCQkvLyBVcHBlcmNhc2UgdGhlIHR5cGUKCQlzLnR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTsKCgkJLy8gRGV0ZXJtaW5lIGlmIHJlcXVlc3QgaGFzIGNvbnRlbnQKCQlzLmhhc0NvbnRlbnQgPSAhcm5vQ29udGVudC50ZXN0KCBzLnR5cGUgKTsKCgkJLy8gU2F2ZSB0aGUgVVJMIGluIGNhc2Ugd2UncmUgdG95aW5nIHdpdGggdGhlIElmLU1vZGlmaWVkLVNpbmNlCgkJLy8gYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyIGxhdGVyIG9uCgkJLy8gUmVtb3ZlIGhhc2ggdG8gc2ltcGxpZnkgdXJsIG1hbmlwdWxhdGlvbgoJCWNhY2hlVVJMID0gcy51cmwucmVwbGFjZSggcmhhc2gsICIiICk7CgoJCS8vIE1vcmUgb3B0aW9ucyBoYW5kbGluZyBmb3IgcmVxdWVzdHMgd2l0aCBubyBjb250ZW50CgkJaWYgKCAhcy5oYXNDb250ZW50ICkgewoKCQkJLy8gUmVtZW1iZXIgdGhlIGhhc2ggc28gd2UgY2FuIHB1dCBpdCBiYWNrCgkJCXVuY2FjaGVkID0gcy51cmwuc2xpY2UoIGNhY2hlVVJMLmxlbmd0aCApOwoKCQkJLy8gSWYgZGF0YSBpcyBhdmFpbGFibGUgYW5kIHNob3VsZCBiZSBwcm9jZXNzZWQsIGFwcGVuZCBkYXRhIHRvIHVybAoJCQlpZiAoIHMuZGF0YSAmJiAoIHMucHJvY2Vzc0RhdGEgfHwgdHlwZW9mIHMuZGF0YSA9PT0gInN0cmluZyIgKSApIHsKCQkJCWNhY2hlVVJMICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyAiJiIgOiAiPyIgKSArIHMuZGF0YTsKCgkJCQkvLyAjOTY4MjogcmVtb3ZlIGRhdGEgc28gdGhhdCBpdCdzIG5vdCB1c2VkIGluIGFuIGV2ZW50dWFsIHJldHJ5CgkJCQlkZWxldGUgcy5kYXRhOwoJCQl9CgoJCQkvLyBBZGQgb3IgdXBkYXRlIGFudGktY2FjaGUgcGFyYW0gaWYgbmVlZGVkCgkJCWlmICggcy5jYWNoZSA9PT0gZmFsc2UgKSB7CgkJCQljYWNoZVVSTCA9IGNhY2hlVVJMLnJlcGxhY2UoIHJhbnRpQ2FjaGUsICIkMSIgKTsKCQkJCXVuY2FjaGVkID0gKCBycXVlcnkudGVzdCggY2FjaGVVUkwgKSA/ICImIiA6ICI/IiApICsgIl89IiArICggbm9uY2UrKyApICsgdW5jYWNoZWQ7CgkJCX0KCgkJCS8vIFB1dCBoYXNoIGFuZCBhbnRpLWNhY2hlIG9uIHRoZSBVUkwgdGhhdCB3aWxsIGJlIHJlcXVlc3RlZCAoZ2gtMTczMikKCQkJcy51cmwgPSBjYWNoZVVSTCArIHVuY2FjaGVkOwoKCQkvLyBDaGFuZ2UgJyUyMCcgdG8gJysnIGlmIHRoaXMgaXMgZW5jb2RlZCBmb3JtIGJvZHkgY29udGVudCAoZ2gtMjY1OCkKCQl9IGVsc2UgaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJgoJCQkoIHMuY29udGVudFR5cGUgfHwgIiIgKS5pbmRleE9mKCAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiApID09PSAwICkgewoJCQlzLmRhdGEgPSBzLmRhdGEucmVwbGFjZSggcjIwLCAiKyIgKTsKCQl9CgoJCS8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuCgkJaWYgKCBzLmlmTW9kaWZpZWQgKSB7CgkJCWlmICggalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApIHsKCQkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJZi1Nb2RpZmllZC1TaW5jZSIsIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKTsKCQkJfQoJCQlpZiAoIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICkgewoJCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRlciggIklmLU5vbmUtTWF0Y2giLCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApOwoJCQl9CgkJfQoKCQkvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnQKCQlpZiAoIHMuZGF0YSAmJiBzLmhhc0NvbnRlbnQgJiYgcy5jb250ZW50VHlwZSAhPT0gZmFsc2UgfHwgb3B0aW9ucy5jb250ZW50VHlwZSApIHsKCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRlciggIkNvbnRlbnQtVHlwZSIsIHMuY29udGVudFR5cGUgKTsKCQl9CgoJCS8vIFNldCB0aGUgQWNjZXB0cyBoZWFkZXIgZm9yIHRoZSBzZXJ2ZXIsIGRlcGVuZGluZyBvbiB0aGUgZGF0YVR5cGUKCQlqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKAoJCQkiQWNjZXB0IiwKCQkJcy5kYXRhVHlwZXNbIDAgXSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSA/CgkJCQlzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSArCgkJCQkJKCBzLmRhdGFUeXBlc1sgMCBdICE9PSAiKiIgPyAiLCAiICsgYWxsVHlwZXMgKyAiOyBxPTAuMDEiIDogIiIgKSA6CgkJCQlzLmFjY2VwdHNbICIqIiBdCgkJKTsKCgkJLy8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9uCgkJZm9yICggaSBpbiBzLmhlYWRlcnMgKSB7CgkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIGksIHMuaGVhZGVyc1sgaSBdICk7CgkJfQoKCQkvLyBBbGxvdyBjdXN0b20gaGVhZGVycy9taW1ldHlwZXMgYW5kIGVhcmx5IGFib3J0CgkJaWYgKCBzLmJlZm9yZVNlbmQgJiYKCQkJKCBzLmJlZm9yZVNlbmQuY2FsbCggY2FsbGJhY2tDb250ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBjb21wbGV0ZWQgKSApIHsKCgkJCS8vIEFib3J0IGlmIG5vdCBkb25lIGFscmVhZHkgYW5kIHJldHVybgoJCQlyZXR1cm4ganFYSFIuYWJvcnQoKTsKCQl9CgoJCS8vIEFib3J0aW5nIGlzIG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvbgoJCXN0ckFib3J0ID0gImFib3J0IjsKCgkJLy8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzCgkJY29tcGxldGVEZWZlcnJlZC5hZGQoIHMuY29tcGxldGUgKTsKCQlqcVhIUi5kb25lKCBzLnN1Y2Nlc3MgKTsKCQlqcVhIUi5mYWlsKCBzLmVycm9yICk7CgoJCS8vIEdldCB0cmFuc3BvcnQKCQl0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTsKCgkJLy8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0CgkJaWYgKCAhdHJhbnNwb3J0ICkgewoJCQlkb25lKCAtMSwgIk5vIFRyYW5zcG9ydCIgKTsKCQl9IGVsc2UgewoJCQlqcVhIUi5yZWFkeVN0YXRlID0gMTsKCgkJCS8vIFNlbmQgZ2xvYmFsIGV2ZW50CgkJCWlmICggZmlyZUdsb2JhbHMgKSB7CgkJCQlnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggImFqYXhTZW5kIiwgWyBqcVhIUiwgcyBdICk7CgkJCX0KCgkJCS8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGFqYXhTZW5kLCBzdG9wIHRoZXJlCgkJCWlmICggY29tcGxldGVkICkgewoJCQkJcmV0dXJuIGpxWEhSOwoJCQl9CgoJCQkvLyBUaW1lb3V0CgkJCWlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkgewoJCQkJdGltZW91dFRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgewoJCQkJCWpxWEhSLmFib3J0KCAidGltZW91dCIgKTsKCQkJCX0sIHMudGltZW91dCApOwoJCQl9CgoJCQl0cnkgewoJCQkJY29tcGxldGVkID0gZmFsc2U7CgkJCQl0cmFuc3BvcnQuc2VuZCggcmVxdWVzdEhlYWRlcnMsIGRvbmUgKTsKCQkJfSBjYXRjaCAoIGUgKSB7CgoJCQkJLy8gUmV0aHJvdyBwb3N0LWNvbXBsZXRpb24gZXhjZXB0aW9ucwoJCQkJaWYgKCBjb21wbGV0ZWQgKSB7CgkJCQkJdGhyb3cgZTsKCQkJCX0KCgkJCQkvLyBQcm9wYWdhdGUgb3RoZXJzIGFzIHJlc3VsdHMKCQkJCWRvbmUoIC0xLCBlICk7CgkJCX0KCQl9CgoJCS8vIENhbGxiYWNrIGZvciB3aGVuIGV2ZXJ5dGhpbmcgaXMgZG9uZQoJCWZ1bmN0aW9uIGRvbmUoIHN0YXR1cywgbmF0aXZlU3RhdHVzVGV4dCwgcmVzcG9uc2VzLCBoZWFkZXJzICkgewoJCQl2YXIgaXNTdWNjZXNzLCBzdWNjZXNzLCBlcnJvciwgcmVzcG9uc2UsIG1vZGlmaWVkLAoJCQkJc3RhdHVzVGV4dCA9IG5hdGl2ZVN0YXR1c1RleHQ7CgoJCQkvLyBJZ25vcmUgcmVwZWF0IGludm9jYXRpb25zCgkJCWlmICggY29tcGxldGVkICkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQljb21wbGV0ZWQgPSB0cnVlOwoKCQkJLy8gQ2xlYXIgdGltZW91dCBpZiBpdCBleGlzdHMKCQkJaWYgKCB0aW1lb3V0VGltZXIgKSB7CgkJCQl3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0VGltZXIgKTsKCQkJfQoKCQkJLy8gRGVyZWZlcmVuY2UgdHJhbnNwb3J0IGZvciBlYXJseSBnYXJiYWdlIGNvbGxlY3Rpb24KCQkJLy8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZCkKCQkJdHJhbnNwb3J0ID0gdW5kZWZpbmVkOwoKCQkJLy8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVycwoJCQlyZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJzIHx8ICIiOwoKCQkJLy8gU2V0IHJlYWR5U3RhdGUKCQkJanFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDsKCgkJCS8vIERldGVybWluZSBpZiBzdWNjZXNzZnVsCgkJCWlzU3VjY2VzcyA9IHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1cyA9PT0gMzA0OwoKCQkJLy8gR2V0IHJlc3BvbnNlIGRhdGEKCQkJaWYgKCByZXNwb25zZXMgKSB7CgkJCQlyZXNwb25zZSA9IGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKTsKCQkJfQoKCQkJLy8gQ29udmVydCBubyBtYXR0ZXIgd2hhdCAodGhhdCB3YXkgcmVzcG9uc2VYWFggZmllbGRzIGFyZSBhbHdheXMgc2V0KQoJCQlyZXNwb25zZSA9IGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApOwoKCQkJLy8gSWYgc3VjY2Vzc2Z1bCwgaGFuZGxlIHR5cGUgY2hhaW5pbmcKCQkJaWYgKCBpc1N1Y2Nlc3MgKSB7CgoJCQkJLy8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS4KCQkJCWlmICggcy5pZk1vZGlmaWVkICkgewoJCQkJCW1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoICJMYXN0LU1vZGlmaWVkIiApOwoJCQkJCWlmICggbW9kaWZpZWQgKSB7CgkJCQkJCWpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDsKCQkJCQl9CgkJCQkJbW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggImV0YWciICk7CgkJCQkJaWYgKCBtb2RpZmllZCApIHsKCQkJCQkJalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDsKCQkJCQl9CgkJCQl9CgoJCQkJLy8gaWYgbm8gY29udGVudAoJCQkJaWYgKCBzdGF0dXMgPT09IDIwNCB8fCBzLnR5cGUgPT09ICJIRUFEIiApIHsKCQkJCQlzdGF0dXNUZXh0ID0gIm5vY29udGVudCI7CgoJCQkJLy8gaWYgbm90IG1vZGlmaWVkCgkJCQl9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDMwNCApIHsKCQkJCQlzdGF0dXNUZXh0ID0gIm5vdG1vZGlmaWVkIjsKCgkJCQkvLyBJZiB3ZSBoYXZlIGRhdGEsIGxldCdzIGNvbnZlcnQgaXQKCQkJCX0gZWxzZSB7CgkJCQkJc3RhdHVzVGV4dCA9IHJlc3BvbnNlLnN0YXRlOwoJCQkJCXN1Y2Nlc3MgPSByZXNwb25zZS5kYXRhOwoJCQkJCWVycm9yID0gcmVzcG9uc2UuZXJyb3I7CgkJCQkJaXNTdWNjZXNzID0gIWVycm9yOwoJCQkJfQoJCQl9IGVsc2UgewoKCQkJCS8vIEV4dHJhY3QgZXJyb3IgZnJvbSBzdGF0dXNUZXh0IGFuZCBub3JtYWxpemUgZm9yIG5vbi1hYm9ydHMKCQkJCWVycm9yID0gc3RhdHVzVGV4dDsKCQkJCWlmICggc3RhdHVzIHx8ICFzdGF0dXNUZXh0ICkgewoJCQkJCXN0YXR1c1RleHQgPSAiZXJyb3IiOwoJCQkJCWlmICggc3RhdHVzIDwgMCApIHsKCQkJCQkJc3RhdHVzID0gMDsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCS8vIFNldCBkYXRhIGZvciB0aGUgZmFrZSB4aHIgb2JqZWN0CgkJCWpxWEhSLnN0YXR1cyA9IHN0YXR1czsKCQkJanFYSFIuc3RhdHVzVGV4dCA9ICggbmF0aXZlU3RhdHVzVGV4dCB8fCBzdGF0dXNUZXh0ICkgKyAiIjsKCgkJCS8vIFN1Y2Nlc3MvRXJyb3IKCQkJaWYgKCBpc1N1Y2Nlc3MgKSB7CgkJCQlkZWZlcnJlZC5yZXNvbHZlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIHN1Y2Nlc3MsIHN0YXR1c1RleHQsIGpxWEhSIF0gKTsKCQkJfSBlbHNlIHsKCQkJCWRlZmVycmVkLnJlamVjdFdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCwgZXJyb3IgXSApOwoJCQl9CgoJCQkvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcwoJCQlqcVhIUi5zdGF0dXNDb2RlKCBzdGF0dXNDb2RlICk7CgkJCXN0YXR1c0NvZGUgPSB1bmRlZmluZWQ7CgoJCQlpZiAoIGZpcmVHbG9iYWxzICkgewoJCQkJZ2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIGlzU3VjY2VzcyA/ICJhamF4U3VjY2VzcyIgOiAiYWpheEVycm9yIiwKCQkJCQlbIGpxWEhSLCBzLCBpc1N1Y2Nlc3MgPyBzdWNjZXNzIDogZXJyb3IgXSApOwoJCQl9CgoJCQkvLyBDb21wbGV0ZQoJCQljb21wbGV0ZURlZmVycmVkLmZpcmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQgXSApOwoKCQkJaWYgKCBmaXJlR2xvYmFscyApIHsKCQkJCWdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCAiYWpheENvbXBsZXRlIiwgWyBqcVhIUiwgcyBdICk7CgoJCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCgkJCQlpZiAoICEoIC0talF1ZXJ5LmFjdGl2ZSApICkgewoJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0b3AiICk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBqcVhIUjsKCX0sCgoJZ2V0SlNPTjogZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2sgKSB7CgkJcmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgZGF0YSwgY2FsbGJhY2ssICJqc29uIiApOwoJfSwKCglnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkgewoJCXJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIHVuZGVmaW5lZCwgY2FsbGJhY2ssICJzY3JpcHQiICk7Cgl9Cn0gKTsKCmpRdWVyeS5lYWNoKCBbICJnZXQiLCAicG9zdCIgXSwgZnVuY3Rpb24oIGksIG1ldGhvZCApIHsKCWpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKCgkJLy8gU2hpZnQgYXJndW1lbnRzIGlmIGRhdGEgYXJndW1lbnQgd2FzIG9taXR0ZWQKCQlpZiAoIGlzRnVuY3Rpb24oIGRhdGEgKSApIHsKCQkJdHlwZSA9IHR5cGUgfHwgY2FsbGJhY2s7CgkJCWNhbGxiYWNrID0gZGF0YTsKCQkJZGF0YSA9IHVuZGVmaW5lZDsKCQl9CgoJCS8vIFRoZSB1cmwgY2FuIGJlIGFuIG9wdGlvbnMgb2JqZWN0ICh3aGljaCB0aGVuIG11c3QgaGF2ZSAudXJsKQoJCXJldHVybiBqUXVlcnkuYWpheCggalF1ZXJ5LmV4dGVuZCggewoJCQl1cmw6IHVybCwKCQkJdHlwZTogbWV0aG9kLAoJCQlkYXRhVHlwZTogdHlwZSwKCQkJZGF0YTogZGF0YSwKCQkJc3VjY2VzczogY2FsbGJhY2sKCQl9LCBqUXVlcnkuaXNQbGFpbk9iamVjdCggdXJsICkgJiYgdXJsICkgKTsKCX07Cn0gKTsKCgpqUXVlcnkuX2V2YWxVcmwgPSBmdW5jdGlvbiggdXJsICkgewoJcmV0dXJuIGpRdWVyeS5hamF4KCB7CgkJdXJsOiB1cmwsCgoJCS8vIE1ha2UgdGhpcyBleHBsaWNpdCwgc2luY2UgdXNlciBjYW4gb3ZlcnJpZGUgdGhpcyB0aHJvdWdoIGFqYXhTZXR1cCAoIzExMjY0KQoJCXR5cGU6ICJHRVQiLAoJCWRhdGFUeXBlOiAic2NyaXB0IiwKCQljYWNoZTogdHJ1ZSwKCQlhc3luYzogZmFsc2UsCgkJZ2xvYmFsOiBmYWxzZSwKCQkidGhyb3dzIjogdHJ1ZQoJfSApOwp9OwoKCmpRdWVyeS5mbi5leHRlbmQoIHsKCXdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkgewoJCXZhciB3cmFwOwoKCQlpZiAoIHRoaXNbIDAgXSApIHsKCQkJaWYgKCBpc0Z1bmN0aW9uKCBodG1sICkgKSB7CgkJCQlodG1sID0gaHRtbC5jYWxsKCB0aGlzWyAwIF0gKTsKCQkJfQoKCQkJLy8gVGhlIGVsZW1lbnRzIHRvIHdyYXAgdGhlIHRhcmdldCBhcm91bmQKCQkJd3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1sgMCBdLm93bmVyRG9jdW1lbnQgKS5lcSggMCApLmNsb25lKCB0cnVlICk7CgoJCQlpZiAoIHRoaXNbIDAgXS5wYXJlbnROb2RlICkgewoJCQkJd3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbIDAgXSApOwoJCQl9CgoJCQl3cmFwLm1hcCggZnVuY3Rpb24oKSB7CgkJCQl2YXIgZWxlbSA9IHRoaXM7CgoJCQkJd2hpbGUgKCBlbGVtLmZpcnN0RWxlbWVudENoaWxkICkgewoJCQkJCWVsZW0gPSBlbGVtLmZpcnN0RWxlbWVudENoaWxkOwoJCQkJfQoKCQkJCXJldHVybiBlbGVtOwoJCQl9ICkuYXBwZW5kKCB0aGlzICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJd3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHsKCQlpZiAoIGlzRnVuY3Rpb24oIGh0bWwgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7CgkJCQlqUXVlcnkoIHRoaXMgKS53cmFwSW5uZXIoIGh0bWwuY2FsbCggdGhpcywgaSApICk7CgkJCX0gKTsKCQl9CgoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApLAoJCQkJY29udGVudHMgPSBzZWxmLmNvbnRlbnRzKCk7CgoJCQlpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHsKCQkJCWNvbnRlbnRzLndyYXBBbGwoIGh0bWwgKTsKCgkJCX0gZWxzZSB7CgkJCQlzZWxmLmFwcGVuZCggaHRtbCApOwoJCQl9CgkJfSApOwoJfSwKCgl3cmFwOiBmdW5jdGlvbiggaHRtbCApIHsKCQl2YXIgaHRtbElzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCBodG1sICk7CgoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkgewoJCQlqUXVlcnkoIHRoaXMgKS53cmFwQWxsKCBodG1sSXNGdW5jdGlvbiA/IGh0bWwuY2FsbCggdGhpcywgaSApIDogaHRtbCApOwoJCX0gKTsKCX0sCgoJdW53cmFwOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJdGhpcy5wYXJlbnQoIHNlbGVjdG9yICkubm90KCAiYm9keSIgKS5lYWNoKCBmdW5jdGlvbigpIHsKCQkJalF1ZXJ5KCB0aGlzICkucmVwbGFjZVdpdGgoIHRoaXMuY2hpbGROb2RlcyApOwoJCX0gKTsKCQlyZXR1cm4gdGhpczsKCX0KfSApOwoKCmpRdWVyeS5leHByLnBzZXVkb3MuaGlkZGVuID0gZnVuY3Rpb24oIGVsZW0gKSB7CglyZXR1cm4gIWpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSggZWxlbSApOwp9OwpqUXVlcnkuZXhwci5wc2V1ZG9zLnZpc2libGUgPSBmdW5jdGlvbiggZWxlbSApIHsKCXJldHVybiAhISggZWxlbS5vZmZzZXRXaWR0aCB8fCBlbGVtLm9mZnNldEhlaWdodCB8fCBlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoICk7Cn07CgoKCgpqUXVlcnkuYWpheFNldHRpbmdzLnhociA9IGZ1bmN0aW9uKCkgewoJdHJ5IHsKCQlyZXR1cm4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpOwoJfSBjYXRjaCAoIGUgKSB7fQp9OwoKdmFyIHhoclN1Y2Nlc3NTdGF0dXMgPSB7CgoJCS8vIEZpbGUgcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgY29kZSAwLCBhc3N1bWUgMjAwCgkJMDogMjAwLAoKCQkvLyBTdXBwb3J0OiBJRSA8PTkgb25seQoJCS8vICMxNDUwOiBzb21ldGltZXMgSUUgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNAoJCTEyMjM6IDIwNAoJfSwKCXhoclN1cHBvcnRlZCA9IGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCk7CgpzdXBwb3J0LmNvcnMgPSAhIXhoclN1cHBvcnRlZCAmJiAoICJ3aXRoQ3JlZGVudGlhbHMiIGluIHhoclN1cHBvcnRlZCApOwpzdXBwb3J0LmFqYXggPSB4aHJTdXBwb3J0ZWQgPSAhIXhoclN1cHBvcnRlZDsKCmpRdWVyeS5hamF4VHJhbnNwb3J0KCBmdW5jdGlvbiggb3B0aW9ucyApIHsKCXZhciBjYWxsYmFjaywgZXJyb3JDYWxsYmFjazsKCgkvLyBDcm9zcyBkb21haW4gb25seSBhbGxvd2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0CglpZiAoIHN1cHBvcnQuY29ycyB8fCB4aHJTdXBwb3J0ZWQgJiYgIW9wdGlvbnMuY3Jvc3NEb21haW4gKSB7CgkJcmV0dXJuIHsKCQkJc2VuZDogZnVuY3Rpb24oIGhlYWRlcnMsIGNvbXBsZXRlICkgewoJCQkJdmFyIGksCgkJCQkJeGhyID0gb3B0aW9ucy54aHIoKTsKCgkJCQl4aHIub3BlbigKCQkJCQlvcHRpb25zLnR5cGUsCgkJCQkJb3B0aW9ucy51cmwsCgkJCQkJb3B0aW9ucy5hc3luYywKCQkJCQlvcHRpb25zLnVzZXJuYW1lLAoJCQkJCW9wdGlvbnMucGFzc3dvcmQKCQkJCSk7CgoJCQkJLy8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZAoJCQkJaWYgKCBvcHRpb25zLnhockZpZWxkcyApIHsKCQkJCQlmb3IgKCBpIGluIG9wdGlvbnMueGhyRmllbGRzICkgewoJCQkJCQl4aHJbIGkgXSA9IG9wdGlvbnMueGhyRmllbGRzWyBpIF07CgkJCQkJfQoJCQkJfQoKCQkJCS8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWQKCQkJCWlmICggb3B0aW9ucy5taW1lVHlwZSAmJiB4aHIub3ZlcnJpZGVNaW1lVHlwZSApIHsKCQkJCQl4aHIub3ZlcnJpZGVNaW1lVHlwZSggb3B0aW9ucy5taW1lVHlwZSApOwoJCQkJfQoKCQkJCS8vIFgtUmVxdWVzdGVkLVdpdGggaGVhZGVyCgkJCQkvLyBGb3IgY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzZWVpbmcgYXMgY29uZGl0aW9ucyBmb3IgYSBwcmVmbGlnaHQgYXJlCgkJCQkvLyBha2luIHRvIGEgamlnc2F3IHB1enpsZSwgd2Ugc2ltcGx5IG5ldmVyIHNldCBpdCB0byBiZSBzdXJlLgoJCQkJLy8gKGl0IGNhbiBhbHdheXMgYmUgc2V0IG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgb3IgZXZlbiB1c2luZyBhamF4U2V0dXApCgkJCQkvLyBGb3Igc2FtZS1kb21haW4gcmVxdWVzdHMsIHdvbid0IGNoYW5nZSBoZWFkZXIgaWYgYWxyZWFkeSBwcm92aWRlZC4KCQkJCWlmICggIW9wdGlvbnMuY3Jvc3NEb21haW4gJiYgIWhlYWRlcnNbICJYLVJlcXVlc3RlZC1XaXRoIiBdICkgewoJCQkJCWhlYWRlcnNbICJYLVJlcXVlc3RlZC1XaXRoIiBdID0gIlhNTEh0dHBSZXF1ZXN0IjsKCQkJCX0KCgkJCQkvLyBTZXQgaGVhZGVycwoJCQkJZm9yICggaSBpbiBoZWFkZXJzICkgewoJCQkJCXhoci5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFkZXJzWyBpIF0gKTsKCQkJCX0KCgkJCQkvLyBDYWxsYmFjawoJCQkJY2FsbGJhY2sgPSBmdW5jdGlvbiggdHlwZSApIHsKCQkJCQlyZXR1cm4gZnVuY3Rpb24oKSB7CgkJCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJCQljYWxsYmFjayA9IGVycm9yQ2FsbGJhY2sgPSB4aHIub25sb2FkID0KCQkJCQkJCQl4aHIub25lcnJvciA9IHhoci5vbmFib3J0ID0geGhyLm9udGltZW91dCA9CgkJCQkJCQkJCXhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsOwoKCQkJCQkJCWlmICggdHlwZSA9PT0gImFib3J0IiApIHsKCQkJCQkJCQl4aHIuYWJvcnQoKTsKCQkJCQkJCX0gZWxzZSBpZiAoIHR5cGUgPT09ICJlcnJvciIgKSB7CgoJCQkJCQkJCS8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5CgkJCQkJCQkJLy8gT24gYSBtYW51YWwgbmF0aXZlIGFib3J0LCBJRTkgdGhyb3dzCgkJCQkJCQkJLy8gZXJyb3JzIG9uIGFueSBwcm9wZXJ0eSBhY2Nlc3MgdGhhdCBpcyBub3QgcmVhZHlTdGF0ZQoJCQkJCQkJCWlmICggdHlwZW9mIHhoci5zdGF0dXMgIT09ICJudW1iZXIiICkgewoJCQkJCQkJCQljb21wbGV0ZSggMCwgImVycm9yIiApOwoJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCWNvbXBsZXRlKAoKCQkJCQkJCQkJCS8vIEZpbGU6IHByb3RvY29sIGFsd2F5cyB5aWVsZHMgc3RhdHVzIDA7IHNlZSAjODYwNSwgIzE0MjA3CgkJCQkJCQkJCQl4aHIuc3RhdHVzLAoJCQkJCQkJCQkJeGhyLnN0YXR1c1RleHQKCQkJCQkJCQkJKTsKCQkJCQkJCQl9CgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCWNvbXBsZXRlKAoJCQkJCQkJCQl4aHJTdWNjZXNzU3RhdHVzWyB4aHIuc3RhdHVzIF0gfHwgeGhyLnN0YXR1cywKCQkJCQkJCQkJeGhyLnN0YXR1c1RleHQsCgoJCQkJCQkJCQkvLyBTdXBwb3J0OiBJRSA8PTkgb25seQoJCQkJCQkJCQkvLyBJRTkgaGFzIG5vIFhIUjIgYnV0IHRocm93cyBvbiBiaW5hcnkgKHRyYWMtMTE0MjYpCgkJCQkJCQkJCS8vIEZvciBYSFIyIG5vbi10ZXh0LCBsZXQgdGhlIGNhbGxlciBoYW5kbGUgaXQgKGdoLTI0OTgpCgkJCQkJCQkJCSggeGhyLnJlc3BvbnNlVHlwZSB8fCAidGV4dCIgKSAhPT0gInRleHQiICB8fAoJCQkJCQkJCQl0eXBlb2YgeGhyLnJlc3BvbnNlVGV4dCAhPT0gInN0cmluZyIgPwoJCQkJCQkJCQkJeyBiaW5hcnk6IHhoci5yZXNwb25zZSB9IDoKCQkJCQkJCQkJCXsgdGV4dDogeGhyLnJlc3BvbnNlVGV4dCB9LAoJCQkJCQkJCQl4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkKCQkJCQkJCQkpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfTsKCQkJCX07CgoJCQkJLy8gTGlzdGVuIHRvIGV2ZW50cwoJCQkJeGhyLm9ubG9hZCA9IGNhbGxiYWNrKCk7CgkJCQllcnJvckNhbGxiYWNrID0geGhyLm9uZXJyb3IgPSB4aHIub250aW1lb3V0ID0gY2FsbGJhY2soICJlcnJvciIgKTsKCgkJCQkvLyBTdXBwb3J0OiBJRSA5IG9ubHkKCQkJCS8vIFVzZSBvbnJlYWR5c3RhdGVjaGFuZ2UgdG8gcmVwbGFjZSBvbmFib3J0CgkJCQkvLyB0byBoYW5kbGUgdW5jYXVnaHQgYWJvcnRzCgkJCQlpZiAoIHhoci5vbmFib3J0ICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJeGhyLm9uYWJvcnQgPSBlcnJvckNhbGxiYWNrOwoJCQkJfSBlbHNlIHsKCQkJCQl4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7CgoJCQkJCQkvLyBDaGVjayByZWFkeVN0YXRlIGJlZm9yZSB0aW1lb3V0IGFzIGl0IGNoYW5nZXMKCQkJCQkJaWYgKCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApIHsKCgkJCQkJCQkvLyBBbGxvdyBvbmVycm9yIHRvIGJlIGNhbGxlZCBmaXJzdCwKCQkJCQkJCS8vIGJ1dCB0aGF0IHdpbGwgbm90IGhhbmRsZSBhIG5hdGl2ZSBhYm9ydAoJCQkJCQkJLy8gQWxzbywgc2F2ZSBlcnJvckNhbGxiYWNrIHRvIGEgdmFyaWFibGUKCQkJCQkJCS8vIGFzIHhoci5vbmVycm9yIGNhbm5vdCBiZSBhY2Nlc3NlZAoJCQkJCQkJd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgewoJCQkJCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJCQkJCWVycm9yQ2FsbGJhY2soKTsKCQkJCQkJCQl9CgkJCQkJCQl9ICk7CgkJCQkJCX0KCQkJCQl9OwoJCQkJfQoKCQkJCS8vIENyZWF0ZSB0aGUgYWJvcnQgY2FsbGJhY2sKCQkJCWNhbGxiYWNrID0gY2FsbGJhY2soICJhYm9ydCIgKTsKCgkJCQl0cnkgewoKCQkJCQkvLyBEbyBzZW5kIHRoZSByZXF1ZXN0ICh0aGlzIG1heSByYWlzZSBhbiBleGNlcHRpb24pCgkJCQkJeGhyLnNlbmQoIG9wdGlvbnMuaGFzQ29udGVudCAmJiBvcHRpb25zLmRhdGEgfHwgbnVsbCApOwoJCQkJfSBjYXRjaCAoIGUgKSB7CgoJCQkJCS8vICMxNDY4MzogT25seSByZXRocm93IGlmIHRoaXMgaGFzbid0IGJlZW4gbm90aWZpZWQgYXMgYW4gZXJyb3IgeWV0CgkJCQkJaWYgKCBjYWxsYmFjayApIHsKCQkJCQkJdGhyb3cgZTsKCQkJCQl9CgkJCQl9CgkJCX0sCgoJCQlhYm9ydDogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIGNhbGxiYWNrICkgewoJCQkJCWNhbGxiYWNrKCk7CgkJCQl9CgkJCX0KCQl9OwoJfQp9ICk7CgoKCgovLyBQcmV2ZW50IGF1dG8tZXhlY3V0aW9uIG9mIHNjcmlwdHMgd2hlbiBubyBleHBsaWNpdCBkYXRhVHlwZSB3YXMgcHJvdmlkZWQgKFNlZSBnaC0yNDMyKQpqUXVlcnkuYWpheFByZWZpbHRlciggZnVuY3Rpb24oIHMgKSB7CglpZiAoIHMuY3Jvc3NEb21haW4gKSB7CgkJcy5jb250ZW50cy5zY3JpcHQgPSBmYWxzZTsKCX0KfSApOwoKLy8gSW5zdGFsbCBzY3JpcHQgZGF0YVR5cGUKalF1ZXJ5LmFqYXhTZXR1cCggewoJYWNjZXB0czogewoJCXNjcmlwdDogInRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgIiArCgkJCSJhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiCgl9LAoJY29udGVudHM6IHsKCQlzY3JpcHQ6IC9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi8KCX0sCgljb252ZXJ0ZXJzOiB7CgkJInRleHQgc2NyaXB0IjogZnVuY3Rpb24oIHRleHQgKSB7CgkJCWpRdWVyeS5nbG9iYWxFdmFsKCB0ZXh0ICk7CgkJCXJldHVybiB0ZXh0OwoJCX0KCX0KfSApOwoKLy8gSGFuZGxlIGNhY2hlJ3Mgc3BlY2lhbCBjYXNlIGFuZCBjcm9zc0RvbWFpbgpqUXVlcnkuYWpheFByZWZpbHRlciggInNjcmlwdCIsIGZ1bmN0aW9uKCBzICkgewoJaWYgKCBzLmNhY2hlID09PSB1bmRlZmluZWQgKSB7CgkJcy5jYWNoZSA9IGZhbHNlOwoJfQoJaWYgKCBzLmNyb3NzRG9tYWluICkgewoJCXMudHlwZSA9ICJHRVQiOwoJfQp9ICk7CgovLyBCaW5kIHNjcmlwdCB0YWcgaGFjayB0cmFuc3BvcnQKalF1ZXJ5LmFqYXhUcmFuc3BvcnQoICJzY3JpcHQiLCBmdW5jdGlvbiggcyApIHsKCgkvLyBUaGlzIHRyYW5zcG9ydCBvbmx5IGRlYWxzIHdpdGggY3Jvc3MgZG9tYWluIHJlcXVlc3RzCglpZiAoIHMuY3Jvc3NEb21haW4gKSB7CgkJdmFyIHNjcmlwdCwgY2FsbGJhY2s7CgkJcmV0dXJuIHsKCQkJc2VuZDogZnVuY3Rpb24oIF8sIGNvbXBsZXRlICkgewoJCQkJc2NyaXB0ID0galF1ZXJ5KCAiPHNjcmlwdD4iICkucHJvcCggewoJCQkJCWNoYXJzZXQ6IHMuc2NyaXB0Q2hhcnNldCwKCQkJCQlzcmM6IHMudXJsCgkJCQl9ICkub24oCgkJCQkJImxvYWQgZXJyb3IiLAoJCQkJCWNhbGxiYWNrID0gZnVuY3Rpb24oIGV2dCApIHsKCQkJCQkJc2NyaXB0LnJlbW92ZSgpOwoJCQkJCQljYWxsYmFjayA9IG51bGw7CgkJCQkJCWlmICggZXZ0ICkgewoJCQkJCQkJY29tcGxldGUoIGV2dC50eXBlID09PSAiZXJyb3IiID8gNDA0IDogMjAwLCBldnQudHlwZSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJKTsKCgkJCQkvLyBVc2UgbmF0aXZlIERPTSBtYW5pcHVsYXRpb24gdG8gYXZvaWQgb3VyIGRvbU1hbmlwIEFKQVggdHJpY2tlcnkKCQkJCWRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdFsgMCBdICk7CgkJCX0sCgkJCWFib3J0OiBmdW5jdGlvbigpIHsKCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJY2FsbGJhY2soKTsKCQkJCX0KCQkJfQoJCX07Cgl9Cn0gKTsKCgoKCnZhciBvbGRDYWxsYmFja3MgPSBbXSwKCXJqc29ucCA9IC8oPSlcPyg/PSZ8JCl8XD9cPy87CgovLyBEZWZhdWx0IGpzb25wIHNldHRpbmdzCmpRdWVyeS5hamF4U2V0dXAoIHsKCWpzb25wOiAiY2FsbGJhY2siLAoJanNvbnBDYWxsYmFjazogZnVuY3Rpb24oKSB7CgkJdmFyIGNhbGxiYWNrID0gb2xkQ2FsbGJhY2tzLnBvcCgpIHx8ICggalF1ZXJ5LmV4cGFuZG8gKyAiXyIgKyAoIG5vbmNlKysgKSApOwoJCXRoaXNbIGNhbGxiYWNrIF0gPSB0cnVlOwoJCXJldHVybiBjYWxsYmFjazsKCX0KfSApOwoKLy8gRGV0ZWN0LCBub3JtYWxpemUgb3B0aW9ucyBhbmQgaW5zdGFsbCBjYWxsYmFja3MgZm9yIGpzb25wIHJlcXVlc3RzCmpRdWVyeS5hamF4UHJlZmlsdGVyKCAianNvbiBqc29ucCIsIGZ1bmN0aW9uKCBzLCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHsKCgl2YXIgY2FsbGJhY2tOYW1lLCBvdmVyd3JpdHRlbiwgcmVzcG9uc2VDb250YWluZXIsCgkJanNvblByb3AgPSBzLmpzb25wICE9PSBmYWxzZSAmJiAoIHJqc29ucC50ZXN0KCBzLnVybCApID8KCQkJInVybCIgOgoJCQl0eXBlb2Ygcy5kYXRhID09PSAic3RyaW5nIiAmJgoJCQkJKCBzLmNvbnRlbnRUeXBlIHx8ICIiICkKCQkJCQkuaW5kZXhPZiggImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIgKSA9PT0gMCAmJgoJCQkJcmpzb25wLnRlc3QoIHMuZGF0YSApICYmICJkYXRhIgoJCSk7CgoJLy8gSGFuZGxlIGlmZiB0aGUgZXhwZWN0ZWQgZGF0YSB0eXBlIGlzICJqc29ucCIgb3Igd2UgaGF2ZSBhIHBhcmFtZXRlciB0byBzZXQKCWlmICgganNvblByb3AgfHwgcy5kYXRhVHlwZXNbIDAgXSA9PT0gImpzb25wIiApIHsKCgkJLy8gR2V0IGNhbGxiYWNrIG5hbWUsIHJlbWVtYmVyaW5nIHByZWV4aXN0aW5nIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBpdAoJCWNhbGxiYWNrTmFtZSA9IHMuanNvbnBDYWxsYmFjayA9IGlzRnVuY3Rpb24oIHMuanNvbnBDYWxsYmFjayApID8KCQkJcy5qc29ucENhbGxiYWNrKCkgOgoJCQlzLmpzb25wQ2FsbGJhY2s7CgoJCS8vIEluc2VydCBjYWxsYmFjayBpbnRvIHVybCBvciBmb3JtIGRhdGEKCQlpZiAoIGpzb25Qcm9wICkgewoJCQlzWyBqc29uUHJvcCBdID0gc1sganNvblByb3AgXS5yZXBsYWNlKCByanNvbnAsICIkMSIgKyBjYWxsYmFja05hbWUgKTsKCQl9IGVsc2UgaWYgKCBzLmpzb25wICE9PSBmYWxzZSApIHsKCQkJcy51cmwgKz0gKCBycXVlcnkudGVzdCggcy51cmwgKSA/ICImIiA6ICI/IiApICsgcy5qc29ucCArICI9IiArIGNhbGxiYWNrTmFtZTsKCQl9CgoJCS8vIFVzZSBkYXRhIGNvbnZlcnRlciB0byByZXRyaWV2ZSBqc29uIGFmdGVyIHNjcmlwdCBleGVjdXRpb24KCQlzLmNvbnZlcnRlcnNbICJzY3JpcHQganNvbiIgXSA9IGZ1bmN0aW9uKCkgewoJCQlpZiAoICFyZXNwb25zZUNvbnRhaW5lciApIHsKCQkJCWpRdWVyeS5lcnJvciggY2FsbGJhY2tOYW1lICsgIiB3YXMgbm90IGNhbGxlZCIgKTsKCQkJfQoJCQlyZXR1cm4gcmVzcG9uc2VDb250YWluZXJbIDAgXTsKCQl9OwoKCQkvLyBGb3JjZSBqc29uIGRhdGFUeXBlCgkJcy5kYXRhVHlwZXNbIDAgXSA9ICJqc29uIjsKCgkJLy8gSW5zdGFsbCBjYWxsYmFjawoJCW92ZXJ3cml0dGVuID0gd2luZG93WyBjYWxsYmFja05hbWUgXTsKCQl3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gZnVuY3Rpb24oKSB7CgkJCXJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRzOwoJCX07CgoJCS8vIENsZWFuLXVwIGZ1bmN0aW9uIChmaXJlcyBhZnRlciBjb252ZXJ0ZXJzKQoJCWpxWEhSLmFsd2F5cyggZnVuY3Rpb24oKSB7CgoJCQkvLyBJZiBwcmV2aW91cyB2YWx1ZSBkaWRuJ3QgZXhpc3QgLSByZW1vdmUgaXQKCQkJaWYgKCBvdmVyd3JpdHRlbiA9PT0gdW5kZWZpbmVkICkgewoJCQkJalF1ZXJ5KCB3aW5kb3cgKS5yZW1vdmVQcm9wKCBjYWxsYmFja05hbWUgKTsKCgkJCS8vIE90aGVyd2lzZSByZXN0b3JlIHByZWV4aXN0aW5nIHZhbHVlCgkJCX0gZWxzZSB7CgkJCQl3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gb3ZlcndyaXR0ZW47CgkJCX0KCgkJCS8vIFNhdmUgYmFjayBhcyBmcmVlCgkJCWlmICggc1sgY2FsbGJhY2tOYW1lIF0gKSB7CgoJCQkJLy8gTWFrZSBzdXJlIHRoYXQgcmUtdXNpbmcgdGhlIG9wdGlvbnMgZG9lc24ndCBzY3JldyB0aGluZ3MgYXJvdW5kCgkJCQlzLmpzb25wQ2FsbGJhY2sgPSBvcmlnaW5hbFNldHRpbmdzLmpzb25wQ2FsbGJhY2s7CgoJCQkJLy8gU2F2ZSB0aGUgY2FsbGJhY2sgbmFtZSBmb3IgZnV0dXJlIHVzZQoJCQkJb2xkQ2FsbGJhY2tzLnB1c2goIGNhbGxiYWNrTmFtZSApOwoJCQl9CgoJCQkvLyBDYWxsIGlmIGl0IHdhcyBhIGZ1bmN0aW9uIGFuZCB3ZSBoYXZlIGEgcmVzcG9uc2UKCQkJaWYgKCByZXNwb25zZUNvbnRhaW5lciAmJiBpc0Z1bmN0aW9uKCBvdmVyd3JpdHRlbiApICkgewoJCQkJb3ZlcndyaXR0ZW4oIHJlc3BvbnNlQ29udGFpbmVyWyAwIF0gKTsKCQkJfQoKCQkJcmVzcG9uc2VDb250YWluZXIgPSBvdmVyd3JpdHRlbiA9IHVuZGVmaW5lZDsKCQl9ICk7CgoJCS8vIERlbGVnYXRlIHRvIHNjcmlwdAoJCXJldHVybiAic2NyaXB0IjsKCX0KfSApOwoKCgoKLy8gU3VwcG9ydDogU2FmYXJpIDggb25seQovLyBJbiBTYWZhcmkgOCBkb2N1bWVudHMgY3JlYXRlZCB2aWEgZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50Ci8vIGNvbGxhcHNlIHNpYmxpbmcgZm9ybXM6IHRoZSBzZWNvbmQgb25lIGJlY29tZXMgYSBjaGlsZCBvZiB0aGUgZmlyc3Qgb25lLgovLyBCZWNhdXNlIG9mIHRoYXQsIHRoaXMgc2VjdXJpdHkgbWVhc3VyZSBoYXMgdG8gYmUgZGlzYWJsZWQgaW4gU2FmYXJpIDguCi8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzczMzcKc3VwcG9ydC5jcmVhdGVIVE1MRG9jdW1lbnQgPSAoIGZ1bmN0aW9uKCkgewoJdmFyIGJvZHkgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoICIiICkuYm9keTsKCWJvZHkuaW5uZXJIVE1MID0gIjxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+IjsKCXJldHVybiBib2R5LmNoaWxkTm9kZXMubGVuZ3RoID09PSAyOwp9ICkoKTsKCgovLyBBcmd1bWVudCAiZGF0YSIgc2hvdWxkIGJlIHN0cmluZyBvZiBodG1sCi8vIGNvbnRleHQgKG9wdGlvbmFsKTogSWYgc3BlY2lmaWVkLCB0aGUgZnJhZ21lbnQgd2lsbCBiZSBjcmVhdGVkIGluIHRoaXMgY29udGV4dCwKLy8gZGVmYXVsdHMgdG8gZG9jdW1lbnQKLy8ga2VlcFNjcmlwdHMgKG9wdGlvbmFsKTogSWYgdHJ1ZSwgd2lsbCBpbmNsdWRlIHNjcmlwdHMgcGFzc2VkIGluIHRoZSBodG1sIHN0cmluZwpqUXVlcnkucGFyc2VIVE1MID0gZnVuY3Rpb24oIGRhdGEsIGNvbnRleHQsIGtlZXBTY3JpcHRzICkgewoJaWYgKCB0eXBlb2YgZGF0YSAhPT0gInN0cmluZyIgKSB7CgkJcmV0dXJuIFtdOwoJfQoJaWYgKCB0eXBlb2YgY29udGV4dCA9PT0gImJvb2xlYW4iICkgewoJCWtlZXBTY3JpcHRzID0gY29udGV4dDsKCQljb250ZXh0ID0gZmFsc2U7Cgl9CgoJdmFyIGJhc2UsIHBhcnNlZCwgc2NyaXB0czsKCglpZiAoICFjb250ZXh0ICkgewoKCQkvLyBTdG9wIHNjcmlwdHMgb3IgaW5saW5lIGV2ZW50IGhhbmRsZXJzIGZyb20gYmVpbmcgZXhlY3V0ZWQgaW1tZWRpYXRlbHkKCQkvLyBieSB1c2luZyBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbgoJCWlmICggc3VwcG9ydC5jcmVhdGVIVE1MRG9jdW1lbnQgKSB7CgkJCWNvbnRleHQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoICIiICk7CgoJCQkvLyBTZXQgdGhlIGJhc2UgaHJlZiBmb3IgdGhlIGNyZWF0ZWQgZG9jdW1lbnQKCQkJLy8gc28gYW55IHBhcnNlZCBlbGVtZW50cyB3aXRoIFVSTHMKCQkJLy8gYXJlIGJhc2VkIG9uIHRoZSBkb2N1bWVudCdzIFVSTCAoZ2gtMjk2NSkKCQkJYmFzZSA9IGNvbnRleHQuY3JlYXRlRWxlbWVudCggImJhc2UiICk7CgkJCWJhc2UuaHJlZiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7CgkJCWNvbnRleHQuaGVhZC5hcHBlbmRDaGlsZCggYmFzZSApOwoJCX0gZWxzZSB7CgkJCWNvbnRleHQgPSBkb2N1bWVudDsKCQl9Cgl9CgoJcGFyc2VkID0gcnNpbmdsZVRhZy5leGVjKCBkYXRhICk7CglzY3JpcHRzID0gIWtlZXBTY3JpcHRzICYmIFtdOwoKCS8vIFNpbmdsZSB0YWcKCWlmICggcGFyc2VkICkgewoJCXJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggcGFyc2VkWyAxIF0gKSBdOwoJfQoKCXBhcnNlZCA9IGJ1aWxkRnJhZ21lbnQoIFsgZGF0YSBdLCBjb250ZXh0LCBzY3JpcHRzICk7CgoJaWYgKCBzY3JpcHRzICYmIHNjcmlwdHMubGVuZ3RoICkgewoJCWpRdWVyeSggc2NyaXB0cyApLnJlbW92ZSgpOwoJfQoKCXJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBwYXJzZWQuY2hpbGROb2RlcyApOwp9OwoKCi8qKgogKiBMb2FkIGEgdXJsIGludG8gYSBwYWdlCiAqLwpqUXVlcnkuZm4ubG9hZCA9IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7Cgl2YXIgc2VsZWN0b3IsIHR5cGUsIHJlc3BvbnNlLAoJCXNlbGYgPSB0aGlzLAoJCW9mZiA9IHVybC5pbmRleE9mKCAiICIgKTsKCglpZiAoIG9mZiA+IC0xICkgewoJCXNlbGVjdG9yID0gc3RyaXBBbmRDb2xsYXBzZSggdXJsLnNsaWNlKCBvZmYgKSApOwoJCXVybCA9IHVybC5zbGljZSggMCwgb2ZmICk7Cgl9CgoJLy8gSWYgaXQncyBhIGZ1bmN0aW9uCglpZiAoIGlzRnVuY3Rpb24oIHBhcmFtcyApICkgewoKCQkvLyBXZSBhc3N1bWUgdGhhdCBpdCdzIHRoZSBjYWxsYmFjawoJCWNhbGxiYWNrID0gcGFyYW1zOwoJCXBhcmFtcyA9IHVuZGVmaW5lZDsKCgkvLyBPdGhlcndpc2UsIGJ1aWxkIGEgcGFyYW0gc3RyaW5nCgl9IGVsc2UgaWYgKCBwYXJhbXMgJiYgdHlwZW9mIHBhcmFtcyA9PT0gIm9iamVjdCIgKSB7CgkJdHlwZSA9ICJQT1NUIjsKCX0KCgkvLyBJZiB3ZSBoYXZlIGVsZW1lbnRzIHRvIG1vZGlmeSwgbWFrZSB0aGUgcmVxdWVzdAoJaWYgKCBzZWxmLmxlbmd0aCA+IDAgKSB7CgkJalF1ZXJ5LmFqYXgoIHsKCQkJdXJsOiB1cmwsCgoJCQkvLyBJZiAidHlwZSIgdmFyaWFibGUgaXMgdW5kZWZpbmVkLCB0aGVuICJHRVQiIG1ldGhvZCB3aWxsIGJlIHVzZWQuCgkJCS8vIE1ha2UgdmFsdWUgb2YgdGhpcyBmaWVsZCBleHBsaWNpdCBzaW5jZQoJCQkvLyB1c2VyIGNhbiBvdmVycmlkZSBpdCB0aHJvdWdoIGFqYXhTZXR1cCBtZXRob2QKCQkJdHlwZTogdHlwZSB8fCAiR0VUIiwKCQkJZGF0YVR5cGU6ICJodG1sIiwKCQkJZGF0YTogcGFyYW1zCgkJfSApLmRvbmUoIGZ1bmN0aW9uKCByZXNwb25zZVRleHQgKSB7CgoJCQkvLyBTYXZlIHJlc3BvbnNlIGZvciB1c2UgaW4gY29tcGxldGUgY2FsbGJhY2sKCQkJcmVzcG9uc2UgPSBhcmd1bWVudHM7CgoJCQlzZWxmLmh0bWwoIHNlbGVjdG9yID8KCgkJCQkvLyBJZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQsIGxvY2F0ZSB0aGUgcmlnaHQgZWxlbWVudHMgaW4gYSBkdW1teSBkaXYKCQkJCS8vIEV4Y2x1ZGUgc2NyaXB0cyB0byBhdm9pZCBJRSAnUGVybWlzc2lvbiBEZW5pZWQnIGVycm9ycwoJCQkJalF1ZXJ5KCAiPGRpdj4iICkuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNlbGVjdG9yICkgOgoKCQkJCS8vIE90aGVyd2lzZSB1c2UgdGhlIGZ1bGwgcmVzdWx0CgkJCQlyZXNwb25zZVRleHQgKTsKCgkJLy8gSWYgdGhlIHJlcXVlc3Qgc3VjY2VlZHMsIHRoaXMgZnVuY3Rpb24gZ2V0cyAiZGF0YSIsICJzdGF0dXMiLCAianFYSFIiCgkJLy8gYnV0IHRoZXkgYXJlIGlnbm9yZWQgYmVjYXVzZSByZXNwb25zZSB3YXMgc2V0IGFib3ZlLgoJCS8vIElmIGl0IGZhaWxzLCB0aGlzIGZ1bmN0aW9uIGdldHMgImpxWEhSIiwgInN0YXR1cyIsICJlcnJvciIKCQl9ICkuYWx3YXlzKCBjYWxsYmFjayAmJiBmdW5jdGlvbigganFYSFIsIHN0YXR1cyApIHsKCQkJc2VsZi5lYWNoKCBmdW5jdGlvbigpIHsKCQkJCWNhbGxiYWNrLmFwcGx5KCB0aGlzLCByZXNwb25zZSB8fCBbIGpxWEhSLnJlc3BvbnNlVGV4dCwgc3RhdHVzLCBqcVhIUiBdICk7CgkJCX0gKTsKCQl9ICk7Cgl9CgoJcmV0dXJuIHRoaXM7Cn07CgoKCgovLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFYIGV2ZW50cwpqUXVlcnkuZWFjaCggWwoJImFqYXhTdGFydCIsCgkiYWpheFN0b3AiLAoJImFqYXhDb21wbGV0ZSIsCgkiYWpheEVycm9yIiwKCSJhamF4U3VjY2VzcyIsCgkiYWpheFNlbmQiCl0sIGZ1bmN0aW9uKCBpLCB0eXBlICkgewoJalF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggZm4gKSB7CgkJcmV0dXJuIHRoaXMub24oIHR5cGUsIGZuICk7Cgl9Owp9ICk7CgoKCgpqUXVlcnkuZXhwci5wc2V1ZG9zLmFuaW1hdGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7CglyZXR1cm4galF1ZXJ5LmdyZXAoIGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKCBmbiApIHsKCQlyZXR1cm4gZWxlbSA9PT0gZm4uZWxlbTsKCX0gKS5sZW5ndGg7Cn07CgoKCgpqUXVlcnkub2Zmc2V0ID0gewoJc2V0T2Zmc2V0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgaSApIHsKCQl2YXIgY3VyUG9zaXRpb24sIGN1ckxlZnQsIGN1ckNTU1RvcCwgY3VyVG9wLCBjdXJPZmZzZXQsIGN1ckNTU0xlZnQsIGNhbGN1bGF0ZVBvc2l0aW9uLAoJCQlwb3NpdGlvbiA9IGpRdWVyeS5jc3MoIGVsZW0sICJwb3NpdGlvbiIgKSwKCQkJY3VyRWxlbSA9IGpRdWVyeSggZWxlbSApLAoJCQlwcm9wcyA9IHt9OwoKCQkvLyBTZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtCgkJaWYgKCBwb3NpdGlvbiA9PT0gInN0YXRpYyIgKSB7CgkJCWVsZW0uc3R5bGUucG9zaXRpb24gPSAicmVsYXRpdmUiOwoJCX0KCgkJY3VyT2Zmc2V0ID0gY3VyRWxlbS5vZmZzZXQoKTsKCQljdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVtLCAidG9wIiApOwoJCWN1ckNTU0xlZnQgPSBqUXVlcnkuY3NzKCBlbGVtLCAibGVmdCIgKTsKCQljYWxjdWxhdGVQb3NpdGlvbiA9ICggcG9zaXRpb24gPT09ICJhYnNvbHV0ZSIgfHwgcG9zaXRpb24gPT09ICJmaXhlZCIgKSAmJgoJCQkoIGN1ckNTU1RvcCArIGN1ckNTU0xlZnQgKS5pbmRleE9mKCAiYXV0byIgKSA+IC0xOwoKCQkvLyBOZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlcgoJCS8vIHRvcCBvciBsZWZ0IGlzIGF1dG8gYW5kIHBvc2l0aW9uIGlzIGVpdGhlciBhYnNvbHV0ZSBvciBmaXhlZAoJCWlmICggY2FsY3VsYXRlUG9zaXRpb24gKSB7CgkJCWN1clBvc2l0aW9uID0gY3VyRWxlbS5wb3NpdGlvbigpOwoJCQljdXJUb3AgPSBjdXJQb3NpdGlvbi50b3A7CgkJCWN1ckxlZnQgPSBjdXJQb3NpdGlvbi5sZWZ0OwoKCQl9IGVsc2UgewoJCQljdXJUb3AgPSBwYXJzZUZsb2F0KCBjdXJDU1NUb3AgKSB8fCAwOwoJCQljdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7CgkJfQoKCQlpZiAoIGlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHsKCgkJCS8vIFVzZSBqUXVlcnkuZXh0ZW5kIGhlcmUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIG9mIGNvb3JkaW5hdGVzIGFyZ3VtZW50IChnaC0xODQ4KQoJCQlvcHRpb25zID0gb3B0aW9ucy5jYWxsKCBlbGVtLCBpLCBqUXVlcnkuZXh0ZW5kKCB7fSwgY3VyT2Zmc2V0ICkgKTsKCQl9CgoJCWlmICggb3B0aW9ucy50b3AgIT0gbnVsbCApIHsKCQkJcHJvcHMudG9wID0gKCBvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDsKCQl9CgkJaWYgKCBvcHRpb25zLmxlZnQgIT0gbnVsbCApIHsKCQkJcHJvcHMubGVmdCA9ICggb3B0aW9ucy5sZWZ0IC0gY3VyT2Zmc2V0LmxlZnQgKSArIGN1ckxlZnQ7CgkJfQoKCQlpZiAoICJ1c2luZyIgaW4gb3B0aW9ucyApIHsKCQkJb3B0aW9ucy51c2luZy5jYWxsKCBlbGVtLCBwcm9wcyApOwoKCQl9IGVsc2UgewoJCQljdXJFbGVtLmNzcyggcHJvcHMgKTsKCQl9Cgl9Cn07CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CgoJLy8gb2Zmc2V0KCkgcmVsYXRlcyBhbiBlbGVtZW50J3MgYm9yZGVyIGJveCB0byB0aGUgZG9jdW1lbnQgb3JpZ2luCglvZmZzZXQ6IGZ1bmN0aW9uKCBvcHRpb25zICkgewoKCQkvLyBQcmVzZXJ2ZSBjaGFpbmluZyBmb3Igc2V0dGVyCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoICkgewoJCQlyZXR1cm4gb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8KCQkJCXRoaXMgOgoJCQkJdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHsKCQkJCQlqUXVlcnkub2Zmc2V0LnNldE9mZnNldCggdGhpcywgb3B0aW9ucywgaSApOwoJCQkJfSApOwoJCX0KCgkJdmFyIHJlY3QsIHdpbiwKCQkJZWxlbSA9IHRoaXNbIDAgXTsKCgkJaWYgKCAhZWxlbSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gUmV0dXJuIHplcm9zIGZvciBkaXNjb25uZWN0ZWQgYW5kIGhpZGRlbiAoZGlzcGxheTogbm9uZSkgZWxlbWVudHMgKGdoLTIzMTApCgkJLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5CgkJLy8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYQoJCS8vIGRpc2Nvbm5lY3RlZCBub2RlIGluIElFIHRocm93cyBhbiBlcnJvcgoJCWlmICggIWVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggKSB7CgkJCXJldHVybiB7IHRvcDogMCwgbGVmdDogMCB9OwoJCX0KCgkJLy8gR2V0IGRvY3VtZW50LXJlbGF0aXZlIHBvc2l0aW9uIGJ5IGFkZGluZyB2aWV3cG9ydCBzY3JvbGwgdG8gdmlld3BvcnQtcmVsYXRpdmUgZ0JDUgoJCXJlY3QgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwoJCXdpbiA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldzsKCQlyZXR1cm4gewoJCQl0b3A6IHJlY3QudG9wICsgd2luLnBhZ2VZT2Zmc2V0LAoJCQlsZWZ0OiByZWN0LmxlZnQgKyB3aW4ucGFnZVhPZmZzZXQKCQl9OwoJfSwKCgkvLyBwb3NpdGlvbigpIHJlbGF0ZXMgYW4gZWxlbWVudCdzIG1hcmdpbiBib3ggdG8gaXRzIG9mZnNldCBwYXJlbnQncyBwYWRkaW5nIGJveAoJLy8gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgYmVoYXZpb3Igb2YgQ1NTIGFic29sdXRlIHBvc2l0aW9uaW5nCglwb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJaWYgKCAhdGhpc1sgMCBdICkgewoJCQlyZXR1cm47CgkJfQoKCQl2YXIgb2Zmc2V0UGFyZW50LCBvZmZzZXQsIGRvYywKCQkJZWxlbSA9IHRoaXNbIDAgXSwKCQkJcGFyZW50T2Zmc2V0ID0geyB0b3A6IDAsIGxlZnQ6IDAgfTsKCgkJLy8gcG9zaXRpb246Zml4ZWQgZWxlbWVudHMgYXJlIG9mZnNldCBmcm9tIHRoZSB2aWV3cG9ydCwgd2hpY2ggaXRzZWxmIGFsd2F5cyBoYXMgemVybyBvZmZzZXQKCQlpZiAoIGpRdWVyeS5jc3MoIGVsZW0sICJwb3NpdGlvbiIgKSA9PT0gImZpeGVkIiApIHsKCgkJCS8vIEFzc3VtZSBwb3NpdGlvbjpmaXhlZCBpbXBsaWVzIGF2YWlsYWJpbGl0eSBvZiBnZXRCb3VuZGluZ0NsaWVudFJlY3QKCQkJb2Zmc2V0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKCgkJfSBlbHNlIHsKCQkJb2Zmc2V0ID0gdGhpcy5vZmZzZXQoKTsKCgkJCS8vIEFjY291bnQgZm9yIHRoZSAqcmVhbCogb2Zmc2V0IHBhcmVudCwgd2hpY2ggY2FuIGJlIHRoZSBkb2N1bWVudCBvciBpdHMgcm9vdCBlbGVtZW50CgkJCS8vIHdoZW4gYSBzdGF0aWNhbGx5IHBvc2l0aW9uZWQgZWxlbWVudCBpcyBpZGVudGlmaWVkCgkJCWRvYyA9IGVsZW0ub3duZXJEb2N1bWVudDsKCQkJb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQgfHwgZG9jLmRvY3VtZW50RWxlbWVudDsKCQkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYKCQkJCSggb2Zmc2V0UGFyZW50ID09PSBkb2MuYm9keSB8fCBvZmZzZXRQYXJlbnQgPT09IGRvYy5kb2N1bWVudEVsZW1lbnQgKSAmJgoJCQkJalF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCAicG9zaXRpb24iICkgPT09ICJzdGF0aWMiICkgewoKCQkJCW9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5wYXJlbnROb2RlOwoJCQl9CgkJCWlmICggb2Zmc2V0UGFyZW50ICYmIG9mZnNldFBhcmVudCAhPT0gZWxlbSAmJiBvZmZzZXRQYXJlbnQubm9kZVR5cGUgPT09IDEgKSB7CgoJCQkJLy8gSW5jb3Jwb3JhdGUgYm9yZGVycyBpbnRvIGl0cyBvZmZzZXQsIHNpbmNlIHRoZXkgYXJlIG91dHNpZGUgaXRzIGNvbnRlbnQgb3JpZ2luCgkJCQlwYXJlbnRPZmZzZXQgPSBqUXVlcnkoIG9mZnNldFBhcmVudCApLm9mZnNldCgpOwoJCQkJcGFyZW50T2Zmc2V0LnRvcCArPSBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsICJib3JkZXJUb3BXaWR0aCIsIHRydWUgKTsKCQkJCXBhcmVudE9mZnNldC5sZWZ0ICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgImJvcmRlckxlZnRXaWR0aCIsIHRydWUgKTsKCQkJfQoJCX0KCgkJLy8gU3VidHJhY3QgcGFyZW50IG9mZnNldHMgYW5kIGVsZW1lbnQgbWFyZ2lucwoJCXJldHVybiB7CgkJCXRvcDogb2Zmc2V0LnRvcCAtIHBhcmVudE9mZnNldC50b3AgLSBqUXVlcnkuY3NzKCBlbGVtLCAibWFyZ2luVG9wIiwgdHJ1ZSApLAoJCQlsZWZ0OiBvZmZzZXQubGVmdCAtIHBhcmVudE9mZnNldC5sZWZ0IC0galF1ZXJ5LmNzcyggZWxlbSwgIm1hcmdpbkxlZnQiLCB0cnVlICkKCQl9OwoJfSwKCgkvLyBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBkb2N1bWVudEVsZW1lbnQgaW4gdGhlIGZvbGxvd2luZyBjYXNlczoKCS8vIDEpIEZvciB0aGUgZWxlbWVudCBpbnNpZGUgdGhlIGlmcmFtZSB3aXRob3V0IG9mZnNldFBhcmVudCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4KCS8vICAgIGRvY3VtZW50RWxlbWVudCBvZiB0aGUgcGFyZW50IHdpbmRvdwoJLy8gMikgRm9yIHRoZSBoaWRkZW4gb3IgZGV0YWNoZWQgZWxlbWVudAoJLy8gMykgRm9yIGJvZHkgb3IgaHRtbCBlbGVtZW50LCBpLmUuIGluIGNhc2Ugb2YgdGhlIGh0bWwgbm9kZSAtIGl0IHdpbGwgcmV0dXJuIGl0c2VsZgoJLy8KCS8vIGJ1dCB0aG9zZSBleGNlcHRpb25zIHdlcmUgbmV2ZXIgcHJlc2VudGVkIGFzIGEgcmVhbCBsaWZlIHVzZS1jYXNlcwoJLy8gYW5kIG1pZ2h0IGJlIGNvbnNpZGVyZWQgYXMgbW9yZSBwcmVmZXJhYmxlIHJlc3VsdHMuCgkvLwoJLy8gVGhpcyBsb2dpYywgaG93ZXZlciwgaXMgbm90IGd1YXJhbnRlZWQgYW5kIGNhbiBjaGFuZ2UgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUKCW9mZnNldFBhcmVudDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHsKCQkJdmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50OwoKCQkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYgalF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCAicG9zaXRpb24iICkgPT09ICJzdGF0aWMiICkgewoJCQkJb2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50Lm9mZnNldFBhcmVudDsKCQkJfQoKCQkJcmV0dXJuIG9mZnNldFBhcmVudCB8fCBkb2N1bWVudEVsZW1lbnQ7CgkJfSApOwoJfQp9ICk7CgovLyBDcmVhdGUgc2Nyb2xsTGVmdCBhbmQgc2Nyb2xsVG9wIG1ldGhvZHMKalF1ZXJ5LmVhY2goIHsgc2Nyb2xsTGVmdDogInBhZ2VYT2Zmc2V0Iiwgc2Nyb2xsVG9wOiAicGFnZVlPZmZzZXQiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7Cgl2YXIgdG9wID0gInBhZ2VZT2Zmc2V0IiA9PT0gcHJvcDsKCglqUXVlcnkuZm5bIG1ldGhvZCBdID0gZnVuY3Rpb24oIHZhbCApIHsKCQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbWV0aG9kLCB2YWwgKSB7CgoJCQkvLyBDb2FsZXNjZSBkb2N1bWVudHMgYW5kIHdpbmRvd3MKCQkJdmFyIHdpbjsKCQkJaWYgKCBpc1dpbmRvdyggZWxlbSApICkgewoJCQkJd2luID0gZWxlbTsKCQkJfSBlbHNlIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCXdpbiA9IGVsZW0uZGVmYXVsdFZpZXc7CgkJCX0KCgkJCWlmICggdmFsID09PSB1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gd2luID8gd2luWyBwcm9wIF0gOiBlbGVtWyBtZXRob2QgXTsKCQkJfQoKCQkJaWYgKCB3aW4gKSB7CgkJCQl3aW4uc2Nyb2xsVG8oCgkJCQkJIXRvcCA/IHZhbCA6IHdpbi5wYWdlWE9mZnNldCwKCQkJCQl0b3AgPyB2YWwgOiB3aW4ucGFnZVlPZmZzZXQKCQkJCSk7CgoJCQl9IGVsc2UgewoJCQkJZWxlbVsgbWV0aG9kIF0gPSB2YWw7CgkJCX0KCQl9LCBtZXRob2QsIHZhbCwgYXJndW1lbnRzLmxlbmd0aCApOwoJfTsKfSApOwoKLy8gU3VwcG9ydDogU2FmYXJpIDw9NyAtIDkuMSwgQ2hyb21lIDw9MzcgLSA0OQovLyBBZGQgdGhlIHRvcC9sZWZ0IGNzc0hvb2tzIHVzaW5nIGpRdWVyeS5mbi5wb3NpdGlvbgovLyBXZWJraXQgYnVnOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkwODQKLy8gQmxpbmsgYnVnOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD01ODkzNDcKLy8gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHBlcmNlbnQgd2hlbiBzcGVjaWZpZWQgZm9yIHRvcC9sZWZ0L2JvdHRvbS9yaWdodDsKLy8gcmF0aGVyIHRoYW4gbWFrZSB0aGUgY3NzIG1vZHVsZSBkZXBlbmQgb24gdGhlIG9mZnNldCBtb2R1bGUsIGp1c3QgY2hlY2sgZm9yIGl0IGhlcmUKalF1ZXJ5LmVhY2goIFsgInRvcCIsICJsZWZ0IiBdLCBmdW5jdGlvbiggaSwgcHJvcCApIHsKCWpRdWVyeS5jc3NIb29rc1sgcHJvcCBdID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnBpeGVsUG9zaXRpb24sCgkJZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQlpZiAoIGNvbXB1dGVkICkgewoJCQkJY29tcHV0ZWQgPSBjdXJDU1MoIGVsZW0sIHByb3AgKTsKCgkJCQkvLyBJZiBjdXJDU1MgcmV0dXJucyBwZXJjZW50YWdlLCBmYWxsYmFjayB0byBvZmZzZXQKCQkJCXJldHVybiBybnVtbm9ucHgudGVzdCggY29tcHV0ZWQgKSA/CgkJCQkJalF1ZXJ5KCBlbGVtICkucG9zaXRpb24oKVsgcHJvcCBdICsgInB4IiA6CgkJCQkJY29tcHV0ZWQ7CgkJCX0KCQl9CgkpOwp9ICk7CgoKLy8gQ3JlYXRlIGlubmVySGVpZ2h0LCBpbm5lcldpZHRoLCBoZWlnaHQsIHdpZHRoLCBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aCBtZXRob2RzCmpRdWVyeS5lYWNoKCB7IEhlaWdodDogImhlaWdodCIsIFdpZHRoOiAid2lkdGgiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkgewoJalF1ZXJ5LmVhY2goIHsgcGFkZGluZzogImlubmVyIiArIG5hbWUsIGNvbnRlbnQ6IHR5cGUsICIiOiAib3V0ZXIiICsgbmFtZSB9LAoJCWZ1bmN0aW9uKCBkZWZhdWx0RXh0cmEsIGZ1bmNOYW1lICkgewoKCQkvLyBNYXJnaW4gaXMgb25seSBmb3Igb3V0ZXJIZWlnaHQsIG91dGVyV2lkdGgKCQlqUXVlcnkuZm5bIGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHsKCQkJdmFyIGNoYWluYWJsZSA9IGFyZ3VtZW50cy5sZW5ndGggJiYgKCBkZWZhdWx0RXh0cmEgfHwgdHlwZW9mIG1hcmdpbiAhPT0gImJvb2xlYW4iICksCgkJCQlleHRyYSA9IGRlZmF1bHRFeHRyYSB8fCAoIG1hcmdpbiA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gdHJ1ZSA/ICJtYXJnaW4iIDogImJvcmRlciIgKTsKCgkJCXJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCB2YWx1ZSApIHsKCQkJCXZhciBkb2M7CgoJCQkJaWYgKCBpc1dpbmRvdyggZWxlbSApICkgewoKCQkJCQkvLyAkKCB3aW5kb3cgKS5vdXRlcldpZHRoL0hlaWdodCByZXR1cm4gdy9oIGluY2x1ZGluZyBzY3JvbGxiYXJzIChnaC0xNzI5KQoJCQkJCXJldHVybiBmdW5jTmFtZS5pbmRleE9mKCAib3V0ZXIiICkgPT09IDAgPwoJCQkJCQllbGVtWyAiaW5uZXIiICsgbmFtZSBdIDoKCQkJCQkJZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbICJjbGllbnQiICsgbmFtZSBdOwoJCQkJfQoKCQkJCS8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHQKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCQlkb2MgPSBlbGVtLmRvY3VtZW50RWxlbWVudDsKCgkJCQkJLy8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdIG9yIGNsaWVudFtXaWR0aC9IZWlnaHRdLAoJCQkJCS8vIHdoaWNoZXZlciBpcyBncmVhdGVzdAoJCQkJCXJldHVybiBNYXRoLm1heCgKCQkJCQkJZWxlbS5ib2R5WyAic2Nyb2xsIiArIG5hbWUgXSwgZG9jWyAic2Nyb2xsIiArIG5hbWUgXSwKCQkJCQkJZWxlbS5ib2R5WyAib2Zmc2V0IiArIG5hbWUgXSwgZG9jWyAib2Zmc2V0IiArIG5hbWUgXSwKCQkJCQkJZG9jWyAiY2xpZW50IiArIG5hbWUgXQoJCQkJCSk7CgkJCQl9CgoJCQkJcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPwoKCQkJCQkvLyBHZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50LCByZXF1ZXN0aW5nIGJ1dCBub3QgZm9yY2luZyBwYXJzZUZsb2F0CgkJCQkJalF1ZXJ5LmNzcyggZWxlbSwgdHlwZSwgZXh0cmEgKSA6CgoJCQkJCS8vIFNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQKCQkJCQlqUXVlcnkuc3R5bGUoIGVsZW0sIHR5cGUsIHZhbHVlLCBleHRyYSApOwoJCQl9LCB0eXBlLCBjaGFpbmFibGUgPyBtYXJnaW4gOiB1bmRlZmluZWQsIGNoYWluYWJsZSApOwoJCX07Cgl9ICk7Cn0gKTsKCgpqUXVlcnkuZWFjaCggKCAiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgIiArCgkibW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgIiArCgkiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudSIgKS5zcGxpdCggIiAiICksCglmdW5jdGlvbiggaSwgbmFtZSApIHsKCgkvLyBIYW5kbGUgZXZlbnQgYmluZGluZwoJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggZGF0YSwgZm4gKSB7CgkJcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAwID8KCQkJdGhpcy5vbiggbmFtZSwgbnVsbCwgZGF0YSwgZm4gKSA6CgkJCXRoaXMudHJpZ2dlciggbmFtZSApOwoJfTsKfSApOwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJaG92ZXI6IGZ1bmN0aW9uKCBmbk92ZXIsIGZuT3V0ICkgewoJCXJldHVybiB0aGlzLm1vdXNlZW50ZXIoIGZuT3ZlciApLm1vdXNlbGVhdmUoIGZuT3V0IHx8IGZuT3ZlciApOwoJfQp9ICk7CgoKCgpqUXVlcnkuZm4uZXh0ZW5kKCB7CgoJYmluZDogZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHsKCQlyZXR1cm4gdGhpcy5vbiggdHlwZXMsIG51bGwsIGRhdGEsIGZuICk7Cgl9LAoJdW5iaW5kOiBmdW5jdGlvbiggdHlwZXMsIGZuICkgewoJCXJldHVybiB0aGlzLm9mZiggdHlwZXMsIG51bGwsIGZuICk7Cgl9LAoKCWRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHsKCQlyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApOwoJfSwKCXVuZGVsZWdhdGU6IGZ1bmN0aW9uKCBzZWxlY3RvciwgdHlwZXMsIGZuICkgewoKCQkvLyAoIG5hbWVzcGFjZSApIG9yICggc2VsZWN0b3IsIHR5cGVzIFssIGZuXSApCgkJcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPwoJCQl0aGlzLm9mZiggc2VsZWN0b3IsICIqKiIgKSA6CgkJCXRoaXMub2ZmKCB0eXBlcywgc2VsZWN0b3IgfHwgIioqIiwgZm4gKTsKCX0KfSApOwoKLy8gQmluZCBhIGZ1bmN0aW9uIHRvIGEgY29udGV4dCwgb3B0aW9uYWxseSBwYXJ0aWFsbHkgYXBwbHlpbmcgYW55Ci8vIGFyZ3VtZW50cy4KLy8galF1ZXJ5LnByb3h5IGlzIGRlcHJlY2F0ZWQgdG8gcHJvbW90ZSBzdGFuZGFyZHMgKHNwZWNpZmljYWxseSBGdW5jdGlvbiNiaW5kKQovLyBIb3dldmVyLCBpdCBpcyBub3Qgc2xhdGVkIGZvciByZW1vdmFsIGFueSB0aW1lIHNvb24KalF1ZXJ5LnByb3h5ID0gZnVuY3Rpb24oIGZuLCBjb250ZXh0ICkgewoJdmFyIHRtcCwgYXJncywgcHJveHk7CgoJaWYgKCB0eXBlb2YgY29udGV4dCA9PT0gInN0cmluZyIgKSB7CgkJdG1wID0gZm5bIGNvbnRleHQgXTsKCQljb250ZXh0ID0gZm47CgkJZm4gPSB0bXA7Cgl9CgoJLy8gUXVpY2sgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRhcmdldCBpcyBjYWxsYWJsZSwgaW4gdGhlIHNwZWMKCS8vIHRoaXMgdGhyb3dzIGEgVHlwZUVycm9yLCBidXQgd2Ugd2lsbCBqdXN0IHJldHVybiB1bmRlZmluZWQuCglpZiAoICFpc0Z1bmN0aW9uKCBmbiApICkgewoJCXJldHVybiB1bmRlZmluZWQ7Cgl9CgoJLy8gU2ltdWxhdGVkIGJpbmQKCWFyZ3MgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMsIDIgKTsKCXByb3h5ID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGZuLmFwcGx5KCBjb250ZXh0IHx8IHRoaXMsIGFyZ3MuY29uY2F0KCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7Cgl9OwoKCS8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZAoJcHJveHkuZ3VpZCA9IGZuLmd1aWQgPSBmbi5ndWlkIHx8IGpRdWVyeS5ndWlkKys7CgoJcmV0dXJuIHByb3h5Owp9OwoKalF1ZXJ5LmhvbGRSZWFkeSA9IGZ1bmN0aW9uKCBob2xkICkgewoJaWYgKCBob2xkICkgewoJCWpRdWVyeS5yZWFkeVdhaXQrKzsKCX0gZWxzZSB7CgkJalF1ZXJ5LnJlYWR5KCB0cnVlICk7Cgl9Cn07CmpRdWVyeS5pc0FycmF5ID0gQXJyYXkuaXNBcnJheTsKalF1ZXJ5LnBhcnNlSlNPTiA9IEpTT04ucGFyc2U7CmpRdWVyeS5ub2RlTmFtZSA9IG5vZGVOYW1lOwpqUXVlcnkuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247CmpRdWVyeS5pc1dpbmRvdyA9IGlzV2luZG93OwpqUXVlcnkuY2FtZWxDYXNlID0gY2FtZWxDYXNlOwpqUXVlcnkudHlwZSA9IHRvVHlwZTsKCmpRdWVyeS5ub3cgPSBEYXRlLm5vdzsKCmpRdWVyeS5pc051bWVyaWMgPSBmdW5jdGlvbiggb2JqICkgewoKCS8vIEFzIG9mIGpRdWVyeSAzLjAsIGlzTnVtZXJpYyBpcyBsaW1pdGVkIHRvCgkvLyBzdHJpbmdzIGFuZCBudW1iZXJzIChwcmltaXRpdmVzIG9yIG9iamVjdHMpCgkvLyB0aGF0IGNhbiBiZSBjb2VyY2VkIHRvIGZpbml0ZSBudW1iZXJzIChnaC0yNjYyKQoJdmFyIHR5cGUgPSBqUXVlcnkudHlwZSggb2JqICk7CglyZXR1cm4gKCB0eXBlID09PSAibnVtYmVyIiB8fCB0eXBlID09PSAic3RyaW5nIiApICYmCgoJCS8vIHBhcnNlRmxvYXQgTmFOcyBudW1lcmljLWNhc3QgZmFsc2UgcG9zaXRpdmVzICgiIikKCQkvLyAuLi5idXQgbWlzaW50ZXJwcmV0cyBsZWFkaW5nLW51bWJlciBzdHJpbmdzLCBwYXJ0aWN1bGFybHkgaGV4IGxpdGVyYWxzICgiMHguLi4iKQoJCS8vIHN1YnRyYWN0aW9uIGZvcmNlcyBpbmZpbml0aWVzIHRvIE5hTgoJCSFpc05hTiggb2JqIC0gcGFyc2VGbG9hdCggb2JqICkgKTsKfTsKCgoKCi8vIFJlZ2lzdGVyIGFzIGEgbmFtZWQgQU1EIG1vZHVsZSwgc2luY2UgalF1ZXJ5IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0aCBvdGhlcgovLyBmaWxlcyB0aGF0IG1heSB1c2UgZGVmaW5lLCBidXQgbm90IHZpYSBhIHByb3BlciBjb25jYXRlbmF0aW9uIHNjcmlwdCB0aGF0Ci8vIHVuZGVyc3RhbmRzIGFub255bW91cyBBTUQgbW9kdWxlcy4gQSBuYW1lZCBBTUQgaXMgc2FmZXN0IGFuZCBtb3N0IHJvYnVzdAovLyB3YXkgdG8gcmVnaXN0ZXIuIExvd2VyY2FzZSBqcXVlcnkgaXMgdXNlZCBiZWNhdXNlIEFNRCBtb2R1bGUgbmFtZXMgYXJlCi8vIGRlcml2ZWQgZnJvbSBmaWxlIG5hbWVzLCBhbmQgalF1ZXJ5IGlzIG5vcm1hbGx5IGRlbGl2ZXJlZCBpbiBhIGxvd2VyY2FzZQovLyBmaWxlIG5hbWUuIERvIHRoaXMgYWZ0ZXIgY3JlYXRpbmcgdGhlIGdsb2JhbCBzbyB0aGF0IGlmIGFuIEFNRCBtb2R1bGUgd2FudHMKLy8gdG8gY2FsbCBub0NvbmZsaWN0IHRvIGhpZGUgdGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSwgaXQgd2lsbCB3b3JrLgoKLy8gTm90ZSB0aGF0IGZvciBtYXhpbXVtIHBvcnRhYmlsaXR5LCBsaWJyYXJpZXMgdGhhdCBhcmUgbm90IGpRdWVyeSBzaG91bGQKLy8gZGVjbGFyZSB0aGVtc2VsdmVzIGFzIGFub255bW91cyBtb2R1bGVzLCBhbmQgYXZvaWQgc2V0dGluZyBhIGdsb2JhbCBpZiBhbgovLyBBTUQgbG9hZGVyIGlzIHByZXNlbnQuIGpRdWVyeSBpcyBhIHNwZWNpYWwgY2FzZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQovLyBodHRwczovL2dpdGh1Yi5jb20vanJidXJrZS9yZXF1aXJlanMvd2lraS9VcGRhdGluZy1leGlzdGluZy1saWJyYXJpZXMjd2lraS1hbm9uCgppZiAoIHR5cGVvZiBkZWZpbmUgPT09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCApIHsKCWRlZmluZSggImpxdWVyeSIsIFtdLCBmdW5jdGlvbigpIHsKCQlyZXR1cm4galF1ZXJ5OwoJfSApOwp9CgoKCgp2YXIKCgkvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGUKCV9qUXVlcnkgPSB3aW5kb3cualF1ZXJ5LAoKCS8vIE1hcCBvdmVyIHRoZSAkIGluIGNhc2Ugb2Ygb3ZlcndyaXRlCglfJCA9IHdpbmRvdy4kOwoKalF1ZXJ5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiggZGVlcCApIHsKCWlmICggd2luZG93LiQgPT09IGpRdWVyeSApIHsKCQl3aW5kb3cuJCA9IF8kOwoJfQoKCWlmICggZGVlcCAmJiB3aW5kb3cualF1ZXJ5ID09PSBqUXVlcnkgKSB7CgkJd2luZG93LmpRdWVyeSA9IF9qUXVlcnk7Cgl9CgoJcmV0dXJuIGpRdWVyeTsKfTsKCi8vIEV4cG9zZSBqUXVlcnkgYW5kICQgaWRlbnRpZmllcnMsIGV2ZW4gaW4gQU1ECi8vICgjNzEwMiNjb21tZW50OjEwLCBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9wdWxsLzU1NykKLy8gYW5kIENvbW1vbkpTIGZvciBicm93c2VyIGVtdWxhdG9ycyAoIzEzNTY2KQppZiAoICFub0dsb2JhbCApIHsKCXdpbmRvdy5qUXVlcnkgPSB3aW5kb3cuJCA9IGpRdWVyeTsKfQoKCgoKcmV0dXJuIGpRdWVyeTsKfSApOwo=" >

			</script>
<!--		<script type="text/javascript" src="js/custom.js"></script> -->


// grab the file input and bind a change event onto it
// new html5 formdata object.
// for each entry, add to formdata to later access via \$_FILES["file" + i]
//send formdata to server-side
		<script type="text/javascript">
			$(function() {
				$('#file').bind("change", function() {
					var formData = new FormData();
					for (var i = 0, len = document.getElementById('file').files.length; i < len; i++) {
						formData.append("file" + i, document.getElementById('file').files[i]);
						}
 
					$.ajax({
						url: "ka1.php?q=kups", // our php file
// bugs						url: "10.0.0.112:/ka1.php?q=up", // our php file
						type: 'post',
						data: formData,
						dataType: 'html', // we return html from our php file
						async: true,
						processData: false,  // tell jQuery not to process the data
						contentType: false,   // tell jQuery not to set contentType
						success : function(data) {
							$('#upload-result').append('<div class="alert alert-success"><p>File(s) uploaded successfully!</p><br />');
							$('#upload-result .alert').append(data);
							},
						error : function(request) {
							console.log(request.responseText);
							}
						});
					});
				});
			</script>

	<hr color=white>
	<hr color=black>
	<div id='editableDiv' contenteditable='true'>paste</div>
	<hr color=black>
	<hr color=white>
	<hr color=black>
	<div id='div' contenteditable='true'>ffpaste</div>
	<hr color=black>
	<hr color=white>

	<script id="script_clipboard" >
		function handlePaste (e) {
			var clipboardData, pastedData;

// Stop data actually being pasted into div
			e.stopPropagation();
			e.preventDefault();

// Get pasted data via clipboard API
			clipboardData = e.clipboardData || window.clipboardData;
			pastedData = clipboardData.getData('Text');

// Do whatever with pasteddata
			alert(pastedData);
			}

		document.getElementById('editableDiv').addEventListener('paste', handlePaste);
		</script>


	<script id="script_clipboard_ff" >
		function handlepaste_ff (e) {
			var types, pastedData, savedContent;

// Browsers that support the 'text/html' type in the Clipboard API (Chrome, Firefox 22+)
			if (e && e.clipboardData && e.clipboardData.types && e.clipboardData.getData) {

// Check for 'text/html' in types list. See abligh's answer below for deatils on
// why the DOMStringList bit is needed. We cannot fall back to 'text/plain' as
// Safari/Edge don't advertise HTML data even if it is available
				types = e.clipboardData.types;
				if (((types instanceof DOMStringList) && types.contains("text/html")) || (types.ka1Of && types.ka1Of('text/html') !== -1)) {

// Extract data and pass it to callback
					pastedData = e.clipboardData.getData('text/html');
//					processPaste(editableDiv, pastedData);
					processPaste_ff(editableDiv, pastedData);

// Stop the data from actually being pasted
					e.stopPropagation();
					e.preventDefault();
					return false;
					}
				}

// Everything else: Move existing element contents to a DocumentFragment for safekeeping
			savedContent = document.createDocumentFragment();
			while(editableDiv.childNodes.length > 0) {
				savedContent.appendChild(editableDiv.childNodes[0]);
				}

// Then wait for browser to paste content into it and cleanup
			waitForPastedData(editableDiv, savedContent);
			return true;
			}

		function waitForPastedData (elem, savedContent) {

// If data has been processes by browser, process it
			if (elem.childNodes && elem.childNodes.length > 0) {

// Retrieve pasted content via innerHTML
// (Alternatively loop through elem.childNodes or elem.getElementsByTagName here)
				var pastedData = elem.innerHTML;

// Restore saved content
				elem.innerHTML = "";
				elem.appendChild(savedContent);

// Call callback
				processPaste_ff(elem, pastedData);
				}

// Else wait 20ms and try again
			else {
				setTimeout(function () {
					waitForPastedData(elem, savedContent)
					}, 20);
				}
			}

		function processPaste_ff (elem, pastedData) {
// Do whatever with gathered data;
			alert(pastedData);
			elem.focus();
			}

// Modern browsers. Note: 3rd argument is required for Firefox <= 6
		if (editableDiv.addEventListener) {
			editableDiv.addEventListener('paste', handlepaste, false);
			}
// IE <= 8
		else {
			editableDiv.attachEvent('onpaste', handlepaste);
			}

		$(document).on('paste','[contenteditable]',function(e) {
			e.preventDefault();
			var text = (e.originalEvent || e).clipboardData.getData('text/plain');
			window.document.execCommand('insertText', false, text);
			});
		</script>

	<script id="script_clipboard_jskit" >
		function getSelectionText(){
			var selectedText = ""
			if (window.getSelection){ // all modern browsers and IE9+
				selectedText = window.getSelection().toString()
				}
			return selectedText
			}


		document.addEventListener('mouseup', function(){
			var thetext = getSelectionText()
			if (thetext.length > 0){ // check there's some text selected
				console.log(thetext) // logs whatever textual content the user has selected on the page
				}
			}, false)

		function copySelectionText(){
			var copysuccess // var to check whether execCommand successfully executed
			try{
				copysuccess = document.execCommand("copy") // run command to copy selected text to clipboard
    				} 
			catch(e){
				copysuccess = false
				}
			return copysuccess
			}

		</script>
HTML_UPLOAD;
	return($html_upload);
	}

function html_dd() {
	$html_dd=<<<HTML_DD
	<div name="div_dd_beg" id="div_dd_beg" hidden>
		<div id="drop">
			<span id="sw"><h1>drop jtfinc</h2></span>
			<a href=./ko_jtf/zm/jtf_parcels/jtfdc_theater.html target=_blank>
				<img height=200 width=300
				src="./ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.png" border=0 >
				</a>
			</div>

		<div id="drag"> jtfdc:<br />
			<img src="./imgs/jtf/jtf_takes/jtf29_eagle_north.png" alt="jtf29_eagle_north" width="50" class="drg"/>
	
			<div class="drg"><h1>konet llc </h1>
				<pre>timejask jkwii</pre>
				<img class="drg" src="./imgs/btn/ko.png" alt="ko.png" width="50" >
				<img class="drg" src="./imgs/btn/ok.png" alt="ok.png" width="50" >
				<pre>timesak skwii</pre>
				</div>
	
			<div class="drg"><h1>jtf29 </h1>
				<a href=./ko_jtf/zm/jtf_parcels/jtf29.html target=_blank>
					<img height=200 width=100 src="./ko_jtf/zm/jtf_parcels/jtf29/TileGroup0/0-0-0.png" border=0 >
					</a>
				</div>
	
	
			<div class="drg"><h1>dogheads</h1>
				<div id="div_jtf_vid5">
					<video controls="controls_jtf5" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="ka14_mp4.png">
					<source src="./kb/v/doghead_video.mp4" type="video/mp4;codecs=&quot;avc1.42E01E, mp4a.40.2&quot;">
					</video>
					</div>
				</div>
	
			<div class="drg"><h1>jtfdc night court lights action 3720</h1>
				<div id="div_vid">
					<video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="ka1_mp4.png">
						<source src="ka11_avril.mp4" type="video/mp4;codecs=&quot;avc1.42E01E, mp4a.40.2&quot;">
						<source src="ka1_avril.webm" type="video/webm;codecs=&quot;vp8, vorbis&quot;">
						</video>
					</div>
				</div>
			</div>
		</div id="div_dd_end">
HTML_DD;
	return( $html_dd);
	}






function html_style_tl() {
	$html_style_tl=<<<HTML_STYLE_tl


HTML_STYLE_tl;
	return($html_style_tl);
	}

function html_js_tl() {
	$html_js_tl=<<<HTML_JS_tl
		<script type="text/javascript" src="./tl/lib/js/storyjs-embed.js"></script> 
		<script type="text/javascript" src="./tl/lib/js/jquery-min.js"></script>
		<script id="script_tl_jquery_172_min_js" url="data:text/plain;base64,LyohIGpRdWVyeSB2MS43LjEganF1ZXJ5LmNvbSB8IGpxdWVyeS5vcmcvbGljZW5zZSAqLwooZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjeShhKXtyZXR1cm4gZi5pc1dpbmRvdyhhKT9hOmEubm9kZVR5cGU9PT05P2EuZGVmYXVsdFZpZXd8fGEucGFyZW50V2luZG93OiExfWZ1bmN0aW9uIGN2KGEpe2lmKCFja1thXSl7dmFyIGI9Yy5ib2R5LGQ9ZigiPCIrYSsiPiIpLmFwcGVuZFRvKGIpLGU9ZC5jc3MoImRpc3BsYXkiKTtkLnJlbW92ZSgpO2lmKGU9PT0ibm9uZSJ8fGU9PT0iIil7Y2x8fChjbD1jLmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGNsLmZyYW1lQm9yZGVyPWNsLndpZHRoPWNsLmhlaWdodD0wKSxiLmFwcGVuZENoaWxkKGNsKTtpZighY218fCFjbC5jcmVhdGVFbGVtZW50KWNtPShjbC5jb250ZW50V2luZG93fHxjbC5jb250ZW50RG9jdW1lbnQpLmRvY3VtZW50LGNtLndyaXRlKChjLmNvbXBhdE1vZGU9PT0iQ1NTMUNvbXBhdCI/IjwhZG9jdHlwZSBodG1sPiI6IiIpKyI8aHRtbD48Ym9keT4iKSxjbS5jbG9zZSgpO2Q9Y20uY3JlYXRlRWxlbWVudChhKSxjbS5ib2R5LmFwcGVuZENoaWxkKGQpLGU9Zi5jc3MoZCwiZGlzcGxheSIpLGIucmVtb3ZlQ2hpbGQoY2wpfWNrW2FdPWV9cmV0dXJuIGNrW2FdfWZ1bmN0aW9uIGN1KGEsYil7dmFyIGM9e307Zi5lYWNoKGNxLmNvbmNhdC5hcHBseShbXSxjcS5zbGljZSgwLGIpKSxmdW5jdGlvbigpe2NbdGhpc109YX0pO3JldHVybiBjfWZ1bmN0aW9uIGN0KCl7Y3I9Yn1mdW5jdGlvbiBjcygpe3NldFRpbWVvdXQoY3QsMCk7cmV0dXJuIGNyPWYubm93KCl9ZnVuY3Rpb24gY2ooKXt0cnl7cmV0dXJuIG5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2goYil7fX1mdW5jdGlvbiBjaSgpe3RyeXtyZXR1cm4gbmV3IGEuWE1MSHR0cFJlcXVlc3R9Y2F0Y2goYil7fX1mdW5jdGlvbiBjYyhhLGMpe2EuZGF0YUZpbHRlciYmKGM9YS5kYXRhRmlsdGVyKGMsYS5kYXRhVHlwZSkpO3ZhciBkPWEuZGF0YVR5cGVzLGU9e30sZyxoLGk9ZC5sZW5ndGgsaixrPWRbMF0sbCxtLG4sbyxwO2ZvcihnPTE7ZzxpO2crKyl7aWYoZz09PTEpZm9yKGggaW4gYS5jb252ZXJ0ZXJzKXR5cGVvZiBoPT0ic3RyaW5nIiYmKGVbaC50b0xvd2VyQ2FzZSgpXT1hLmNvbnZlcnRlcnNbaF0pO2w9ayxrPWRbZ107aWYoaz09PSIqIilrPWw7ZWxzZSBpZihsIT09IioiJiZsIT09ayl7bT1sKyIgIitrLG49ZVttXXx8ZVsiKiAiK2tdO2lmKCFuKXtwPWI7Zm9yKG8gaW4gZSl7aj1vLnNwbGl0KCIgIik7aWYoalswXT09PWx8fGpbMF09PT0iKiIpe3A9ZVtqWzFdKyIgIitrXTtpZihwKXtvPWVbb10sbz09PSEwP249cDpwPT09ITAmJihuPW8pO2JyZWFrfX19fSFuJiYhcCYmZi5lcnJvcigiTm8gY29udmVyc2lvbiBmcm9tICIrbS5yZXBsYWNlKCIgIiwiIHRvICIpKSxuIT09ITAmJihjPW4/bihjKTpwKG8oYykpKX19cmV0dXJuIGN9ZnVuY3Rpb24gY2IoYSxjLGQpe3ZhciBlPWEuY29udGVudHMsZj1hLmRhdGFUeXBlcyxnPWEucmVzcG9uc2VGaWVsZHMsaCxpLGosaztmb3IoaSBpbiBnKWkgaW4gZCYmKGNbZ1tpXV09ZFtpXSk7d2hpbGUoZlswXT09PSIqIilmLnNoaWZ0KCksaD09PWImJihoPWEubWltZVR5cGV8fGMuZ2V0UmVzcG9uc2VIZWFkZXIoImNvbnRlbnQtdHlwZSIpKTtpZihoKWZvcihpIGluIGUpaWYoZVtpXSYmZVtpXS50ZXN0KGgpKXtmLnVuc2hpZnQoaSk7YnJlYWt9aWYoZlswXWluIGQpaj1mWzBdO2Vsc2V7Zm9yKGkgaW4gZCl7aWYoIWZbMF18fGEuY29udmVydGVyc1tpKyIgIitmWzBdXSl7aj1pO2JyZWFrfWt8fChrPWkpfWo9anx8a31pZihqKXtqIT09ZlswXSYmZi51bnNoaWZ0KGopO3JldHVybiBkW2pdfX1mdW5jdGlvbiBjYShhLGIsYyxkKXtpZihmLmlzQXJyYXkoYikpZi5lYWNoKGIsZnVuY3Rpb24oYixlKXtjfHxiRS50ZXN0KGEpP2QoYSxlKTpjYShhKyJbIisodHlwZW9mIGU9PSJvYmplY3QifHxmLmlzQXJyYXkoZSk/YjoiIikrIl0iLGUsYyxkKX0pO2Vsc2UgaWYoIWMmJmIhPW51bGwmJnR5cGVvZiBiPT0ib2JqZWN0Iilmb3IodmFyIGUgaW4gYiljYShhKyJbIitlKyJdIixiW2VdLGMsZCk7ZWxzZSBkKGEsYil9ZnVuY3Rpb24gYl8oYSxjKXt2YXIgZCxlLGc9Zi5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihkIGluIGMpY1tkXSE9PWImJigoZ1tkXT9hOmV8fChlPXt9KSlbZF09Y1tkXSk7ZSYmZi5leHRlbmQoITAsYSxlKX1mdW5jdGlvbiBiJChhLGMsZCxlLGYsZyl7Zj1mfHxjLmRhdGFUeXBlc1swXSxnPWd8fHt9LGdbZl09ITA7dmFyIGg9YVtmXSxpPTAsaj1oP2gubGVuZ3RoOjAsaz1hPT09YlQsbDtmb3IoO2k8aiYmKGt8fCFsKTtpKyspbD1oW2ldKGMsZCxlKSx0eXBlb2YgbD09InN0cmluZyImJigha3x8Z1tsXT9sPWI6KGMuZGF0YVR5cGVzLnVuc2hpZnQobCksbD1iJChhLGMsZCxlLGwsZykpKTsoa3x8IWwpJiYhZ1siKiJdJiYobD1iJChhLGMsZCxlLCIqIixnKSk7cmV0dXJuIGx9ZnVuY3Rpb24gYlooYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyl7dHlwZW9mIGIhPSJzdHJpbmciJiYoYz1iLGI9IioiKTtpZihmLmlzRnVuY3Rpb24oYykpe3ZhciBkPWIudG9Mb3dlckNhc2UoKS5zcGxpdChiUCksZT0wLGc9ZC5sZW5ndGgsaCxpLGo7Zm9yKDtlPGc7ZSsrKWg9ZFtlXSxqPS9eXCsvLnRlc3QoaCksaiYmKGg9aC5zdWJzdHIoMSl8fCIqIiksaT1hW2hdPWFbaF18fFtdLGlbaj8idW5zaGlmdCI6InB1c2giXShjKX19fWZ1bmN0aW9uIGJDKGEsYixjKXt2YXIgZD1iPT09IndpZHRoIj9hLm9mZnNldFdpZHRoOmEub2Zmc2V0SGVpZ2h0LGU9Yj09PSJ3aWR0aCI/Yng6YnksZz0wLGg9ZS5sZW5ndGg7aWYoZD4wKXtpZihjIT09ImJvcmRlciIpZm9yKDtnPGg7ZysrKWN8fChkLT1wYXJzZUZsb2F0KGYuY3NzKGEsInBhZGRpbmciK2VbZ10pKXx8MCksYz09PSJtYXJnaW4iP2QrPXBhcnNlRmxvYXQoZi5jc3MoYSxjK2VbZ10pKXx8MDpkLT1wYXJzZUZsb2F0KGYuY3NzKGEsImJvcmRlciIrZVtnXSsiV2lkdGgiKSl8fDA7cmV0dXJuIGQrInB4In1kPWJ6KGEsYixiKTtpZihkPDB8fGQ9PW51bGwpZD1hLnN0eWxlW2JdfHwwO2Q9cGFyc2VGbG9hdChkKXx8MDtpZihjKWZvcig7ZzxoO2crKylkKz1wYXJzZUZsb2F0KGYuY3NzKGEsInBhZGRpbmciK2VbZ10pKXx8MCxjIT09InBhZGRpbmciJiYoZCs9cGFyc2VGbG9hdChmLmNzcyhhLCJib3JkZXIiK2VbZ10rIldpZHRoIikpfHwwKSxjPT09Im1hcmdpbiImJihkKz1wYXJzZUZsb2F0KGYuY3NzKGEsYytlW2ddKSl8fDApO3JldHVybiBkKyJweCJ9ZnVuY3Rpb24gYnAoYSxiKXtiLnNyYz9mLmFqYXgoe3VybDpiLnNyYyxhc3luYzohMSxkYXRhVHlwZToic2NyaXB0In0pOmYuZ2xvYmFsRXZhbCgoYi50ZXh0fHxiLnRleHRDb250ZW50fHxiLmlubmVySFRNTHx8IiIpLnJlcGxhY2UoYmYsIi8qJDAqLyIpKSxiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKX1mdW5jdGlvbiBibyhhKXt2YXIgYj1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2JoLmFwcGVuZENoaWxkKGIpLGIuaW5uZXJIVE1MPWEub3V0ZXJIVE1MO3JldHVybiBiLmZpcnN0Q2hpbGR9ZnVuY3Rpb24gYm4oYSl7dmFyIGI9KGEubm9kZU5hbWV8fCIiKS50b0xvd2VyQ2FzZSgpO2I9PT0iaW5wdXQiP2JtKGEpOmIhPT0ic2NyaXB0IiYmdHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiJiZmLmdyZXAoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKSxibSl9ZnVuY3Rpb24gYm0oYSl7aWYoYS50eXBlPT09ImNoZWNrYm94Inx8YS50eXBlPT09InJhZGlvIilhLmRlZmF1bHRDaGVja2VkPWEuY2hlY2tlZH1mdW5jdGlvbiBibChhKXtyZXR1cm4gdHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTp0eXBlb2YgYS5xdWVyeVNlbGVjdG9yQWxsIT0idW5kZWZpbmVkIj9hLnF1ZXJ5U2VsZWN0b3JBbGwoIioiKTpbXX1mdW5jdGlvbiBiayhhLGIpe3ZhciBjO2lmKGIubm9kZVR5cGU9PT0xKXtiLmNsZWFyQXR0cmlidXRlcyYmYi5jbGVhckF0dHJpYnV0ZXMoKSxiLm1lcmdlQXR0cmlidXRlcyYmYi5tZXJnZUF0dHJpYnV0ZXMoYSksYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7aWYoYz09PSJvYmplY3QiKWIub3V0ZXJIVE1MPWEub3V0ZXJIVE1MO2Vsc2UgaWYoYyE9PSJpbnB1dCJ8fGEudHlwZSE9PSJjaGVja2JveCImJmEudHlwZSE9PSJyYWRpbyIpe2lmKGM9PT0ib3B0aW9uIiliLnNlbGVjdGVkPWEuZGVmYXVsdFNlbGVjdGVkO2Vsc2UgaWYoYz09PSJpbnB1dCJ8fGM9PT0idGV4dGFyZWEiKWIuZGVmYXVsdFZhbHVlPWEuZGVmYXVsdFZhbHVlfWVsc2UgYS5jaGVja2VkJiYoYi5kZWZhdWx0Q2hlY2tlZD1iLmNoZWNrZWQ9YS5jaGVja2VkKSxiLnZhbHVlIT09YS52YWx1ZSYmKGIudmFsdWU9YS52YWx1ZSk7Yi5yZW1vdmVBdHRyaWJ1dGUoZi5leHBhbmRvKX19ZnVuY3Rpb24gYmooYSxiKXtpZihiLm5vZGVUeXBlPT09MSYmISFmLmhhc0RhdGEoYSkpe3ZhciBjLGQsZSxnPWYuX2RhdGEoYSksaD1mLl9kYXRhKGIsZyksaT1nLmV2ZW50cztpZihpKXtkZWxldGUgaC5oYW5kbGUsaC5ldmVudHM9e307Zm9yKGMgaW4gaSlmb3IoZD0wLGU9aVtjXS5sZW5ndGg7ZDxlO2QrKylmLmV2ZW50LmFkZChiLGMrKGlbY11bZF0ubmFtZXNwYWNlPyIuIjoiIikraVtjXVtkXS5uYW1lc3BhY2UsaVtjXVtkXSxpW2NdW2RdLmRhdGEpfWguZGF0YSYmKGguZGF0YT1mLmV4dGVuZCh7fSxoLmRhdGEpKX19ZnVuY3Rpb24gYmkoYSxiKXtyZXR1cm4gZi5ub2RlTmFtZShhLCJ0YWJsZSIpP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF18fGEuYXBwZW5kQ2hpbGQoYS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRib2R5IikpOmF9ZnVuY3Rpb24gVShhKXt2YXIgYj1WLnNwbGl0KCJ8IiksYz1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihjLmNyZWF0ZUVsZW1lbnQpd2hpbGUoYi5sZW5ndGgpYy5jcmVhdGVFbGVtZW50KGIucG9wKCkpO3JldHVybiBjfWZ1bmN0aW9uIFQoYSxiLGMpe2I9Ynx8MDtpZihmLmlzRnVuY3Rpb24oYikpcmV0dXJuIGYuZ3JlcChhLGZ1bmN0aW9uKGEsZCl7dmFyIGU9ISFiLmNhbGwoYSxkLGEpO3JldHVybiBlPT09Y30pO2lmKGIubm9kZVR5cGUpcmV0dXJuIGYuZ3JlcChhLGZ1bmN0aW9uKGEsZCl7cmV0dXJuIGE9PT1iPT09Y30pO2lmKHR5cGVvZiBiPT0ic3RyaW5nIil7dmFyIGQ9Zi5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZVR5cGU9PT0xfSk7aWYoTy50ZXN0KGIpKXJldHVybiBmLmZpbHRlcihiLGQsIWMpO2I9Zi5maWx0ZXIoYixkKX1yZXR1cm4gZi5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4gZi5pbkFycmF5KGEsYik+PTA9PT1jfSl9ZnVuY3Rpb24gUyhhKXtyZXR1cm4hYXx8IWEucGFyZW50Tm9kZXx8YS5wYXJlbnROb2RlLm5vZGVUeXBlPT09MTF9ZnVuY3Rpb24gSygpe3JldHVybiEwfWZ1bmN0aW9uIEooKXtyZXR1cm4hMX1mdW5jdGlvbiBuKGEsYixjKXt2YXIgZD1iKyJkZWZlciIsZT1iKyJxdWV1ZSIsZz1iKyJtYXJrIixoPWYuX2RhdGEoYSxkKTtoJiYoYz09PSJxdWV1ZSJ8fCFmLl9kYXRhKGEsZSkpJiYoYz09PSJtYXJrInx8IWYuX2RhdGEoYSxnKSkmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXshZi5fZGF0YShhLGUpJiYhZi5fZGF0YShhLGcpJiYoZi5yZW1vdmVEYXRhKGEsZCwhMCksaC5maXJlKCkpfSwwKX1mdW5jdGlvbiBtKGEpe2Zvcih2YXIgYiBpbiBhKXtpZihiPT09ImRhdGEiJiZmLmlzRW1wdHlPYmplY3QoYVtiXSkpY29udGludWU7aWYoYiE9PSJ0b0pTT04iKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIGwoYSxjLGQpe2lmKGQ9PT1iJiZhLm5vZGVUeXBlPT09MSl7dmFyIGU9ImRhdGEtIitjLnJlcGxhY2UoaywiLSQxIikudG9Mb3dlckNhc2UoKTtkPWEuZ2V0QXR0cmlidXRlKGUpO2lmKHR5cGVvZiBkPT0ic3RyaW5nIil7dHJ5e2Q9ZD09PSJ0cnVlIj8hMDpkPT09ImZhbHNlIj8hMTpkPT09Im51bGwiP251bGw6Zi5pc051bWVyaWMoZCk/cGFyc2VGbG9hdChkKTpqLnRlc3QoZCk/Zi5wYXJzZUpTT04oZCk6ZH1jYXRjaChnKXt9Zi5kYXRhKGEsYyxkKX1lbHNlIGQ9Yn1yZXR1cm4gZH1mdW5jdGlvbiBoKGEpe3ZhciBiPWdbYV09e30sYyxkO2E9YS5zcGxpdCgvXHMrLyk7Zm9yKGM9MCxkPWEubGVuZ3RoO2M8ZDtjKyspYlthW2NdXT0hMDtyZXR1cm4gYn12YXIgYz1hLmRvY3VtZW50LGQ9YS5uYXZpZ2F0b3IsZT1hLmxvY2F0aW9uLGY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBKKCl7aWYoIWUuaXNSZWFkeSl7dHJ5e2MuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2goYSl7c2V0VGltZW91dChKLDEpO3JldHVybn1lLnJlYWR5KCl9fXZhciBlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBlLmZuLmluaXQoYSxiLGgpfSxmPWEualF1ZXJ5LGc9YS4kLGgsaT0vXig/OlteIzxdKig8W1x3XFddKz4pW14+XSokfCMoW1x3XC1dKikkKS8saj0vXFMvLGs9L15ccysvLGw9L1xzKyQvLG09L148KFx3KylccypcLz8+KD86PFwvXDE+KT8kLyxuPS9eW1xdLDp7fVxzXSokLyxvPS9cXCg/OlsiXFxcL2JmbnJ0XXx1WzAtOWEtZkEtRl17NH0pL2cscD0vIlteIlxcXG5ccl0qInx0cnVlfGZhbHNlfG51bGx8LT9cZCsoPzpcLlxkKik/KD86W2VFXVsrXC1dP1xkKyk/L2cscT0vKD86Xnw6fCwpKD86XHMqXFspKy9nLHI9Lyh3ZWJraXQpWyBcL10oW1x3Ll0rKS8scz0vKG9wZXJhKSg/Oi4qdmVyc2lvbik/WyBcL10oW1x3Ll0rKS8sdD0vKG1zaWUpIChbXHcuXSspLyx1PS8obW96aWxsYSkoPzouKj8gcnY6KFtcdy5dKykpPy8sdj0vLShbYS16XXxbMC05XSkvaWcsdz0vXi1tcy0vLHg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYisiIikudG9VcHBlckNhc2UoKX0seT1kLnVzZXJBZ2VudCx6LEEsQixDPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsRD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LEU9QXJyYXkucHJvdG90eXBlLnB1c2gsRj1BcnJheS5wcm90b3R5cGUuc2xpY2UsRz1TdHJpbmcucHJvdG90eXBlLnRyaW0sSD1BcnJheS5wcm90b3R5cGUuaW5kZXhPZixJPXt9O2UuZm49ZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmUsaW5pdDpmdW5jdGlvbihhLGQsZil7dmFyIGcsaCxqLGs7aWYoIWEpcmV0dXJuIHRoaXM7aWYoYS5ub2RlVHlwZSl7dGhpcy5jb250ZXh0PXRoaXNbMF09YSx0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKGE9PT0iYm9keSImJiFkJiZjLmJvZHkpe3RoaXMuY29udGV4dD1jLHRoaXNbMF09Yy5ib2R5LHRoaXMuc2VsZWN0b3I9YSx0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKHR5cGVvZiBhPT0ic3RyaW5nIil7YS5jaGFyQXQoMCkhPT0iPCJ8fGEuY2hhckF0KGEubGVuZ3RoLTEpIT09Ij4ifHxhLmxlbmd0aDwzP2c9aS5leGVjKGEpOmc9W251bGwsYSxudWxsXTtpZihnJiYoZ1sxXXx8IWQpKXtpZihnWzFdKXtkPWQgaW5zdGFuY2VvZiBlP2RbMF06ZCxrPWQ/ZC5vd25lckRvY3VtZW50fHxkOmMsaj1tLmV4ZWMoYSksaj9lLmlzUGxhaW5PYmplY3QoZCk/KGE9W2MuY3JlYXRlRWxlbWVudChqWzFdKV0sZS5mbi5hdHRyLmNhbGwoYSxkLCEwKSk6YT1bay5jcmVhdGVFbGVtZW50KGpbMV0pXTooaj1lLmJ1aWxkRnJhZ21lbnQoW2dbMV1dLFtrXSksYT0oai5jYWNoZWFibGU/ZS5jbG9uZShqLmZyYWdtZW50KTpqLmZyYWdtZW50KS5jaGlsZE5vZGVzKTtyZXR1cm4gZS5tZXJnZSh0aGlzLGEpfWg9Yy5nZXRFbGVtZW50QnlJZChnWzJdKTtpZihoJiZoLnBhcmVudE5vZGUpe2lmKGguaWQhPT1nWzJdKXJldHVybiBmLmZpbmQoYSk7dGhpcy5sZW5ndGg9MSx0aGlzWzBdPWh9dGhpcy5jb250ZXh0PWMsdGhpcy5zZWxlY3Rvcj1hO3JldHVybiB0aGlzfXJldHVybiFkfHxkLmpxdWVyeT8oZHx8ZikuZmluZChhKTp0aGlzLmNvbnN0cnVjdG9yKGQpLmZpbmQoYSl9aWYoZS5pc0Z1bmN0aW9uKGEpKXJldHVybiBmLnJlYWR5KGEpO2Euc2VsZWN0b3IhPT1iJiYodGhpcy5zZWxlY3Rvcj1hLnNlbGVjdG9yLHRoaXMuY29udGV4dD1hLmNvbnRleHQpO3JldHVybiBlLm1ha2VBcnJheShhLHRoaXMpfSxzZWxlY3RvcjoiIixqcXVlcnk6IjEuNy4xIixsZW5ndGg6MCxzaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RofSx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIEYuY2FsbCh0aGlzLDApfSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/dGhpcy50b0FycmF5KCk6YTwwP3RoaXNbdGhpcy5sZW5ndGgrYV06dGhpc1thXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLmNvbnN0cnVjdG9yKCk7ZS5pc0FycmF5KGEpP0UuYXBwbHkoZCxhKTplLm1lcmdlKGQsYSksZC5wcmV2T2JqZWN0PXRoaXMsZC5jb250ZXh0PXRoaXMuY29udGV4dCxiPT09ImZpbmQiP2Quc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisodGhpcy5zZWxlY3Rvcj8iICI6IiIpK2M6YiYmKGQuc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisiLiIrYisiKCIrYysiKSIpO3JldHVybiBkfSxlYWNoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGUuZWFjaCh0aGlzLGEsYil9LHJlYWR5OmZ1bmN0aW9uKGEpe2UuYmluZFJlYWR5KCksQS5hZGQoYSk7cmV0dXJuIHRoaXN9LGVxOmZ1bmN0aW9uKGEpe2E9K2E7cmV0dXJuIGE9PT0tMT90aGlzLnNsaWNlKGEpOnRoaXMuc2xpY2UoYSxhKzEpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhGLmFwcGx5KHRoaXMsYXJndW1lbnRzKSwic2xpY2UiLEYuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSl9LG1hcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZS5tYXAodGhpcyxmdW5jdGlvbihiLGMpe3JldHVybiBhLmNhbGwoYixjLGIpfSkpfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKG51bGwpfSxwdXNoOkUsc29ydDpbXS5zb3J0LHNwbGljZTpbXS5zcGxpY2V9LGUuZm4uaW5pdC5wcm90b3R5cGU9ZS5mbixlLmV4dGVuZD1lLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBhLGMsZCxmLGcsaCxpPWFyZ3VtZW50c1swXXx8e30saj0xLGs9YXJndW1lbnRzLmxlbmd0aCxsPSExO3R5cGVvZiBpPT0iYm9vbGVhbiImJihsPWksaT1hcmd1bWVudHNbMV18fHt9LGo9MiksdHlwZW9mIGkhPSJvYmplY3QiJiYhZS5pc0Z1bmN0aW9uKGkpJiYoaT17fSksaz09PWomJihpPXRoaXMsLS1qKTtmb3IoO2o8aztqKyspaWYoKGE9YXJndW1lbnRzW2pdKSE9bnVsbClmb3IoYyBpbiBhKXtkPWlbY10sZj1hW2NdO2lmKGk9PT1mKWNvbnRpbnVlO2wmJmYmJihlLmlzUGxhaW5PYmplY3QoZil8fChnPWUuaXNBcnJheShmKSkpPyhnPyhnPSExLGg9ZCYmZS5pc0FycmF5KGQpP2Q6W10pOmg9ZCYmZS5pc1BsYWluT2JqZWN0KGQpP2Q6e30saVtjXT1lLmV4dGVuZChsLGgsZikpOmYhPT1iJiYoaVtjXT1mKX1yZXR1cm4gaX0sZS5leHRlbmQoe25vQ29uZmxpY3Q6ZnVuY3Rpb24oYil7YS4kPT09ZSYmKGEuJD1nKSxiJiZhLmpRdWVyeT09PWUmJihhLmpRdWVyeT1mKTtyZXR1cm4gZX0saXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oYSl7YT9lLnJlYWR5V2FpdCsrOmUucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihhKXtpZihhPT09ITAmJiEtLWUucmVhZHlXYWl0fHxhIT09ITAmJiFlLmlzUmVhZHkpe2lmKCFjLmJvZHkpcmV0dXJuIHNldFRpbWVvdXQoZS5yZWFkeSwxKTtlLmlzUmVhZHk9ITA7aWYoYSE9PSEwJiYtLWUucmVhZHlXYWl0PjApcmV0dXJuO0EuZmlyZVdpdGgoYyxbZV0pLGUuZm4udHJpZ2dlciYmZShjKS50cmlnZ2VyKCJyZWFkeSIpLm9mZigicmVhZHkiKX19LGJpbmRSZWFkeTpmdW5jdGlvbigpe2lmKCFBKXtBPWUuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpO2lmKGMucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpcmV0dXJuIHNldFRpbWVvdXQoZS5yZWFkeSwxKTtpZihjLmFkZEV2ZW50TGlzdGVuZXIpYy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixCLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGUucmVhZHksITEpO2Vsc2UgaWYoYy5hdHRhY2hFdmVudCl7Yy5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixCKSxhLmF0dGFjaEV2ZW50KCJvbmxvYWQiLGUucmVhZHkpO3ZhciBiPSExO3RyeXtiPWEuZnJhbWVFbGVtZW50PT1udWxsfWNhdGNoKGQpe31jLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCYmYiYmSigpfX19LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuIGUudHlwZShhKT09PSJmdW5jdGlvbiJ9LGlzQXJyYXk6QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGUudHlwZShhKT09PSJhcnJheSJ9LGlzV2luZG93OmZ1bmN0aW9uKGEpe3JldHVybiBhJiZ0eXBlb2YgYT09Im9iamVjdCImJiJzZXRJbnRlcnZhbCJpbiBhfSxpc051bWVyaWM6ZnVuY3Rpb24oYSl7cmV0dXJuIWlzTmFOKHBhcnNlRmxvYXQoYSkpJiZpc0Zpbml0ZShhKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD9TdHJpbmcoYSk6SVtDLmNhbGwoYSldfHwib2JqZWN0In0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihhKXtpZighYXx8ZS50eXBlKGEpIT09Im9iamVjdCJ8fGEubm9kZVR5cGV8fGUuaXNXaW5kb3coYSkpcmV0dXJuITE7dHJ5e2lmKGEuY29uc3RydWN0b3ImJiFELmNhbGwoYSwiY29uc3RydWN0b3IiKSYmIUQuY2FsbChhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwiaXNQcm90b3R5cGVPZiIpKXJldHVybiExfWNhdGNoKGMpe3JldHVybiExfXZhciBkO2ZvcihkIGluIGEpO3JldHVybiBkPT09Ynx8RC5jYWxsKGEsZCl9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiIGluIGEpcmV0dXJuITE7cmV0dXJuITB9LGVycm9yOmZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcihhKX0scGFyc2VKU09OOmZ1bmN0aW9uKGIpe2lmKHR5cGVvZiBiIT0ic3RyaW5nInx8IWIpcmV0dXJuIG51bGw7Yj1lLnRyaW0oYik7aWYoYS5KU09OJiZhLkpTT04ucGFyc2UpcmV0dXJuIGEuSlNPTi5wYXJzZShiKTtpZihuLnRlc3QoYi5yZXBsYWNlKG8sIkAiKS5yZXBsYWNlKHAsIl0iKS5yZXBsYWNlKHEsIiIpKSlyZXR1cm4obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiKSkoKTtlLmVycm9yKCJJbnZhbGlkIEpTT046ICIrYil9LHBhcnNlWE1MOmZ1bmN0aW9uKGMpe3ZhciBkLGY7dHJ5e2EuRE9NUGFyc2VyPyhmPW5ldyBET01QYXJzZXIsZD1mLnBhcnNlRnJvbVN0cmluZyhjLCJ0ZXh0L3htbCIpKTooZD1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpLGQuYXN5bmM9ImZhbHNlIixkLmxvYWRYTUwoYykpfWNhdGNoKGcpe2Q9Yn0oIWR8fCFkLmRvY3VtZW50RWxlbWVudHx8ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGgpJiZlLmVycm9yKCJJbnZhbGlkIFhNTDogIitjKTtyZXR1cm4gZH0sbm9vcDpmdW5jdGlvbigpe30sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZqLnRlc3QoYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UodywibXMtIikucmVwbGFjZSh2LHgpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk9PT1iLnRvVXBwZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxjLGQpe3ZhciBmLGc9MCxoPWEubGVuZ3RoLGk9aD09PWJ8fGUuaXNGdW5jdGlvbihhKTtpZihkKXtpZihpKXtmb3IoZiBpbiBhKWlmKGMuYXBwbHkoYVtmXSxkKT09PSExKWJyZWFrfWVsc2UgZm9yKDtnPGg7KWlmKGMuYXBwbHkoYVtnKytdLGQpPT09ITEpYnJlYWt9ZWxzZSBpZihpKXtmb3IoZiBpbiBhKWlmKGMuY2FsbChhW2ZdLGYsYVtmXSk9PT0hMSlicmVha31lbHNlIGZvcig7ZzxoOylpZihjLmNhbGwoYVtnXSxnLGFbZysrXSk9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpHP2Z1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOkcuY2FsbChhKX06ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/IiI6KGErIiIpLnJlcGxhY2UoaywiIikucmVwbGFjZShsLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107aWYoYSE9bnVsbCl7dmFyIGQ9ZS50eXBlKGEpO2EubGVuZ3RoPT1udWxsfHxkPT09InN0cmluZyJ8fGQ9PT0iZnVuY3Rpb24ifHxkPT09InJlZ2V4cCJ8fGUuaXNXaW5kb3coYSk/RS5jYWxsKGMsYSk6ZS5tZXJnZShjLGEpfXJldHVybiBjfSxpbkFycmF5OmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihiKXtpZihIKXJldHVybiBILmNhbGwoYixhLGMpO2Q9Yi5sZW5ndGgsYz1jP2M8MD9NYXRoLm1heCgwLGQrYyk6YzowO2Zvcig7YzxkO2MrKylpZihjIGluIGImJmJbY109PT1hKXJldHVybiBjfXJldHVybi0xfSxtZXJnZTpmdW5jdGlvbihhLGMpe3ZhciBkPWEubGVuZ3RoLGU9MDtpZih0eXBlb2YgYy5sZW5ndGg9PSJudW1iZXIiKWZvcih2YXIgZj1jLmxlbmd0aDtlPGY7ZSsrKWFbZCsrXT1jW2VdO2Vsc2Ugd2hpbGUoY1tlXSE9PWIpYVtkKytdPWNbZSsrXTthLmxlbmd0aD1kO3JldHVybiBhfSxncmVwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlO2M9ISFjO2Zvcih2YXIgZj0wLGc9YS5sZW5ndGg7ZjxnO2YrKyllPSEhYihhW2ZdLGYpLGMhPT1lJiZkLnB1c2goYVtmXSk7cmV0dXJuIGR9LG1hcDpmdW5jdGlvbihhLGMsZCl7dmFyIGYsZyxoPVtdLGk9MCxqPWEubGVuZ3RoLGs9YSBpbnN0YW5jZW9mIGV8fGohPT1iJiZ0eXBlb2Ygaj09Im51bWJlciImJihqPjAmJmFbMF0mJmFbai0xXXx8aj09PTB8fGUuaXNBcnJheShhKSk7aWYoaylmb3IoO2k8ajtpKyspZj1jKGFbaV0saSxkKSxmIT1udWxsJiYoaFtoLmxlbmd0aF09Zik7ZWxzZSBmb3IoZyBpbiBhKWY9YyhhW2ddLGcsZCksZiE9bnVsbCYmKGhbaC5sZW5ndGhdPWYpO3JldHVybiBoLmNvbmNhdC5hcHBseShbXSxoKX0sZ3VpZDoxLHByb3h5OmZ1bmN0aW9uKGEsYyl7aWYodHlwZW9mIGM9PSJzdHJpbmciKXt2YXIgZD1hW2NdO2M9YSxhPWR9aWYoIWUuaXNGdW5jdGlvbihhKSlyZXR1cm4gYjt2YXIgZj1GLmNhbGwoYXJndW1lbnRzLDIpLGc9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShjLGYuY29uY2F0KEYuY2FsbChhcmd1bWVudHMpKSl9O2cuZ3VpZD1hLmd1aWQ9YS5ndWlkfHxnLmd1aWR8fGUuZ3VpZCsrO3JldHVybiBnfSxhY2Nlc3M6ZnVuY3Rpb24oYSxjLGQsZixnLGgpe3ZhciBpPWEubGVuZ3RoO2lmKHR5cGVvZiBjPT0ib2JqZWN0Iil7Zm9yKHZhciBqIGluIGMpZS5hY2Nlc3MoYSxqLGNbal0sZixnLGQpO3JldHVybiBhfWlmKGQhPT1iKXtmPSFoJiZmJiZlLmlzRnVuY3Rpb24oZCk7Zm9yKHZhciBrPTA7azxpO2srKylnKGFba10sYyxmP2QuY2FsbChhW2tdLGssZyhhW2tdLGMpKTpkLGgpO3JldHVybiBhfXJldHVybiBpP2coYVswXSxjKTpifSxub3c6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0sdWFNYXRjaDpmdW5jdGlvbihhKXthPWEudG9Mb3dlckNhc2UoKTt2YXIgYj1yLmV4ZWMoYSl8fHMuZXhlYyhhKXx8dC5leGVjKGEpfHxhLmluZGV4T2YoImNvbXBhdGlibGUiKTwwJiZ1LmV4ZWMoYSl8fFtdO3JldHVybnticm93c2VyOmJbMV18fCIiLHZlcnNpb246YlsyXXx8IjAifX0sc3ViOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGMpe3JldHVybiBuZXcgYS5mbi5pbml0KGIsYyl9ZS5leHRlbmQoITAsYSx0aGlzKSxhLnN1cGVyY2xhc3M9dGhpcyxhLmZuPWEucHJvdG90eXBlPXRoaXMoKSxhLmZuLmNvbnN0cnVjdG9yPWEsYS5zdWI9dGhpcy5zdWIsYS5mbi5pbml0PWZ1bmN0aW9uKGQsZil7ZiYmZiBpbnN0YW5jZW9mIGUmJiEoZiBpbnN0YW5jZW9mIGEpJiYoZj1hKGYpKTtyZXR1cm4gZS5mbi5pbml0LmNhbGwodGhpcyxkLGYsYil9LGEuZm4uaW5pdC5wcm90b3R5cGU9YS5mbjt2YXIgYj1hKGMpO3JldHVybiBhfSxicm93c2VyOnt9fSksZS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7SVsiW29iamVjdCAiK2IrIl0iXT1iLnRvTG93ZXJDYXNlKCl9KSx6PWUudWFNYXRjaCh5KSx6LmJyb3dzZXImJihlLmJyb3dzZXJbei5icm93c2VyXT0hMCxlLmJyb3dzZXIudmVyc2lvbj16LnZlcnNpb24pLGUuYnJvd3Nlci53ZWJraXQmJihlLmJyb3dzZXIuc2FmYXJpPSEwKSxqLnRlc3QoIiAiKSYmKGs9L15bXHNceEEwXSsvLGw9L1tcc1x4QTBdKyQvKSxoPWUoYyksYy5hZGRFdmVudExpc3RlbmVyP0I9ZnVuY3Rpb24oKXtjLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEIsITEpLGUucmVhZHkoKX06Yy5hdHRhY2hFdmVudCYmKEI9ZnVuY3Rpb24oKXtjLnJlYWR5U3RhdGU9PT0iY29tcGxldGUiJiYoYy5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixCKSxlLnJlYWR5KCkpfSk7cmV0dXJuIGV9KCksZz17fTtmLkNhbGxiYWNrcz1mdW5jdGlvbihhKXthPWE/Z1thXXx8aChhKTp7fTt2YXIgYz1bXSxkPVtdLGUsaSxqLGssbCxtPWZ1bmN0aW9uKGIpe3ZhciBkLGUsZyxoLGk7Zm9yKGQ9MCxlPWIubGVuZ3RoO2Q8ZTtkKyspZz1iW2RdLGg9Zi50eXBlKGcpLGg9PT0iYXJyYXkiP20oZyk6aD09PSJmdW5jdGlvbiImJighYS51bmlxdWV8fCFvLmhhcyhnKSkmJmMucHVzaChnKX0sbj1mdW5jdGlvbihiLGYpe2Y9Znx8W10sZT0hYS5tZW1vcnl8fFtiLGZdLGk9ITAsbD1qfHwwLGo9MCxrPWMubGVuZ3RoO2Zvcig7YyYmbDxrO2wrKylpZihjW2xdLmFwcGx5KGIsZik9PT0hMSYmYS5zdG9wT25GYWxzZSl7ZT0hMDticmVha31pPSExLGMmJihhLm9uY2U/ZT09PSEwP28uZGlzYWJsZSgpOmM9W106ZCYmZC5sZW5ndGgmJihlPWQuc2hpZnQoKSxvLmZpcmVXaXRoKGVbMF0sZVsxXSkpKX0sbz17YWRkOmZ1bmN0aW9uKCl7aWYoYyl7dmFyIGE9Yy5sZW5ndGg7bShhcmd1bWVudHMpLGk/az1jLmxlbmd0aDplJiZlIT09ITAmJihqPWEsbihlWzBdLGVbMV0pKX1yZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7aWYoYyl7dmFyIGI9YXJndW1lbnRzLGQ9MCxlPWIubGVuZ3RoO2Zvcig7ZDxlO2QrKylmb3IodmFyIGY9MDtmPGMubGVuZ3RoO2YrKylpZihiW2RdPT09Y1tmXSl7aSYmZjw9ayYmKGstLSxmPD1sJiZsLS0pLGMuc3BsaWNlKGYtLSwxKTtpZihhLnVuaXF1ZSlicmVha319cmV0dXJuIHRoaXN9LGhhczpmdW5jdGlvbihhKXtpZihjKXt2YXIgYj0wLGQ9Yy5sZW5ndGg7Zm9yKDtiPGQ7YisrKWlmKGE9PT1jW2JdKXJldHVybiEwfXJldHVybiExfSxlbXB0eTpmdW5jdGlvbigpe2M9W107cmV0dXJuIHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtjPWQ9ZT1iO3JldHVybiB0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFjfSxsb2NrOmZ1bmN0aW9uKCl7ZD1iLCghZXx8ZT09PSEwKSYmby5kaXNhYmxlKCk7cmV0dXJuIHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiFkfSxmaXJlV2l0aDpmdW5jdGlvbihiLGMpe2QmJihpP2Eub25jZXx8ZC5wdXNoKFtiLGNdKTooIWEub25jZXx8IWUpJiZuKGIsYykpO3JldHVybiB0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7by5maXJlV2l0aCh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFlfX07cmV0dXJuIG99O3ZhciBpPVtdLnNsaWNlO2YuZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbihhKXt2YXIgYj1mLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxjPWYuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLGQ9Zi5DYWxsYmFja3MoIm1lbW9yeSIpLGU9InBlbmRpbmciLGc9e3Jlc29sdmU6YixyZWplY3Q6Yyxub3RpZnk6ZH0saD17ZG9uZTpiLmFkZCxmYWlsOmMuYWRkLHByb2dyZXNzOmQuYWRkLHN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIGV9LGlzUmVzb2x2ZWQ6Yi5maXJlZCxpc1JlamVjdGVkOmMuZmlyZWQsdGhlbjpmdW5jdGlvbihhLGIsYyl7aS5kb25lKGEpLmZhaWwoYikucHJvZ3Jlc3MoYyk7cmV0dXJuIHRoaXN9LGFsd2F5czpmdW5jdGlvbigpe2kuZG9uZS5hcHBseShpLGFyZ3VtZW50cykuZmFpbC5hcHBseShpLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXN9LHBpcGU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLkRlZmVycmVkKGZ1bmN0aW9uKGQpe2YuZWFjaCh7ZG9uZTpbYSwicmVzb2x2ZSJdLGZhaWw6W2IsInJlamVjdCJdLHByb2dyZXNzOltjLCJub3RpZnkiXX0sZnVuY3Rpb24oYSxiKXt2YXIgYz1iWzBdLGU9YlsxXSxnO2YuaXNGdW5jdGlvbihjKT9pW2FdKGZ1bmN0aW9uKCl7Zz1jLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxnJiZmLmlzRnVuY3Rpb24oZy5wcm9taXNlKT9nLnByb21pc2UoKS50aGVuKGQucmVzb2x2ZSxkLnJlamVjdCxkLm5vdGlmeSk6ZFtlKyJXaXRoIl0odGhpcz09PWk/ZDp0aGlzLFtnXSl9KTppW2FdKGRbZV0pfSl9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oYSl7aWYoYT09bnVsbClhPWg7ZWxzZSBmb3IodmFyIGIgaW4gaClhW2JdPWhbYl07cmV0dXJuIGF9fSxpPWgucHJvbWlzZSh7fSksajtmb3IoaiBpbiBnKWlbal09Z1tqXS5maXJlLGlbaisiV2l0aCJdPWdbal0uZmlyZVdpdGg7aS5kb25lKGZ1bmN0aW9uKCl7ZT0icmVzb2x2ZWQifSxjLmRpc2FibGUsZC5sb2NrKS5mYWlsKGZ1bmN0aW9uKCl7ZT0icmVqZWN0ZWQifSxiLmRpc2FibGUsZC5sb2NrKSxhJiZhLmNhbGwoaSxpKTtyZXR1cm4gaX0sd2hlbjpmdW5jdGlvbihhKXtmdW5jdGlvbiBtKGEpe3JldHVybiBmdW5jdGlvbihiKXtlW2FdPWFyZ3VtZW50cy5sZW5ndGg+MT9pLmNhbGwoYXJndW1lbnRzLDApOmIsai5ub3RpZnlXaXRoKGssZSl9fWZ1bmN0aW9uIGwoYSl7cmV0dXJuIGZ1bmN0aW9uKGMpe2JbYV09YXJndW1lbnRzLmxlbmd0aD4xP2kuY2FsbChhcmd1bWVudHMsMCk6YywtLWd8fGoucmVzb2x2ZVdpdGgoaixiKX19dmFyIGI9aS5jYWxsKGFyZ3VtZW50cywwKSxjPTAsZD1iLmxlbmd0aCxlPUFycmF5KGQpLGc9ZCxoPWQsaj1kPD0xJiZhJiZmLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hOmYuRGVmZXJyZWQoKSxrPWoucHJvbWlzZSgpO2lmKGQ+MSl7Zm9yKDtjPGQ7YysrKWJbY10mJmJbY10ucHJvbWlzZSYmZi5pc0Z1bmN0aW9uKGJbY10ucHJvbWlzZSk/YltjXS5wcm9taXNlKCkudGhlbihsKGMpLGoucmVqZWN0LG0oYykpOi0tZztnfHxqLnJlc29sdmVXaXRoKGosYil9ZWxzZSBqIT09YSYmai5yZXNvbHZlV2l0aChqLGQ/W2FdOltdKTtyZXR1cm4ga319KSxmLnN1cHBvcnQ9ZnVuY3Rpb24oKXt2YXIgYixkLGUsZyxoLGksaixrLGwsbSxuLG8scCxxPWMuY3JlYXRlRWxlbWVudCgiZGl2Iikscj1jLmRvY3VtZW50RWxlbWVudDtxLnNldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIiwidCIpLHEuaW5uZXJIVE1MPSIgICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnIHN0eWxlPSd0b3A6MXB4O2Zsb2F0OmxlZnQ7b3BhY2l0eTouNTU7Jz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiIsZD1xLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIiksZT1xLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF07aWYoIWR8fCFkLmxlbmd0aHx8IWUpcmV0dXJue307Zz1jLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGg9Zy5hcHBlbmRDaGlsZChjLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKSxpPXEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IilbMF0sYj17bGVhZGluZ1doaXRlc3BhY2U6cS5maXJzdENoaWxkLm5vZGVUeXBlPT09Myx0Ym9keTohcS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsaHRtbFNlcmlhbGl6ZTohIXEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKS5sZW5ndGgsc3R5bGU6L3RvcC8udGVzdChlLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksaHJlZk5vcm1hbGl6ZWQ6ZS5nZXRBdHRyaWJ1dGUoImhyZWYiKT09PSIvYSIsb3BhY2l0eTovXjAuNTUvLnRlc3QoZS5zdHlsZS5vcGFjaXR5KSxjc3NGbG9hdDohIWUuc3R5bGUuY3NzRmxvYXQsY2hlY2tPbjppLnZhbHVlPT09Im9uIixvcHRTZWxlY3RlZDpoLnNlbGVjdGVkLGdldFNldEF0dHJpYnV0ZTpxLmNsYXNzTmFtZSE9PSJ0IixlbmN0eXBlOiEhYy5jcmVhdGVFbGVtZW50KCJmb3JtIikuZW5jdHlwZSxodG1sNUNsb25lOmMuY3JlYXRlRWxlbWVudCgibmF2IikuY2xvbmVOb2RlKCEwKS5vdXRlckhUTUwhPT0iPDpuYXY+PC86bmF2PiIsc3VibWl0QnViYmxlczohMCxjaGFuZ2VCdWJibGVzOiEwLGZvY3VzaW5CdWJibGVzOiExLGRlbGV0ZUV4cGFuZG86ITAsbm9DbG9uZUV2ZW50OiEwLGlubGluZUJsb2NrTmVlZHNMYXlvdXQ6ITEsc2hyaW5rV3JhcEJsb2NrczohMSxyZWxpYWJsZU1hcmdpblJpZ2h0OiEwfSxpLmNoZWNrZWQ9ITAsYi5ub0Nsb25lQ2hlY2tlZD1pLmNsb25lTm9kZSghMCkuY2hlY2tlZCxnLmRpc2FibGVkPSEwLGIub3B0RGlzYWJsZWQ9IWguZGlzYWJsZWQ7dHJ5e2RlbGV0ZSBxLnRlc3R9Y2F0Y2gocyl7Yi5kZWxldGVFeHBhbmRvPSExfSFxLmFkZEV2ZW50TGlzdGVuZXImJnEuYXR0YWNoRXZlbnQmJnEuZmlyZUV2ZW50JiYocS5hdHRhY2hFdmVudCgib25jbGljayIsZnVuY3Rpb24oKXtiLm5vQ2xvbmVFdmVudD0hMX0pLHEuY2xvbmVOb2RlKCEwKS5maXJlRXZlbnQoIm9uY2xpY2siKSksaT1jLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksaS52YWx1ZT0idCIsaS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGIucmFkaW9WYWx1ZT1pLnZhbHVlPT09InQiLGkuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpLHEuYXBwZW5kQ2hpbGQoaSksaz1jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxrLmFwcGVuZENoaWxkKHEubGFzdENoaWxkKSxiLmNoZWNrQ2xvbmU9ay5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsYi5hcHBlbmRDaGVja2VkPWkuY2hlY2tlZCxrLnJlbW92ZUNoaWxkKGkpLGsuYXBwZW5kQ2hpbGQocSkscS5pbm5lckhUTUw9IiIsYS5nZXRDb21wdXRlZFN0eWxlJiYoaj1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGouc3R5bGUud2lkdGg9IjAiLGouc3R5bGUubWFyZ2luUmlnaHQ9IjAiLHEuc3R5bGUud2lkdGg9IjJweCIscS5hcHBlbmRDaGlsZChqKSxiLnJlbGlhYmxlTWFyZ2luUmlnaHQ9KHBhcnNlSW50KChhLmdldENvbXB1dGVkU3R5bGUoaixudWxsKXx8e21hcmdpblJpZ2h0OjB9KS5tYXJnaW5SaWdodCwxMCl8fDApPT09MCk7aWYocS5hdHRhY2hFdmVudClmb3IobyBpbntzdWJtaXQ6MSxjaGFuZ2U6MSxmb2N1c2luOjF9KW49Im9uIitvLHA9biBpbiBxLHB8fChxLnNldEF0dHJpYnV0ZShuLCJyZXR1cm47IikscD10eXBlb2YgcVtuXT09ImZ1bmN0aW9uIiksYltvKyJCdWJibGVzIl09cDtrLnJlbW92ZUNoaWxkKHEpLGs9Zz1oPWo9cT1pPW51bGwsZihmdW5jdGlvbigpe3ZhciBhLGQsZSxnLGgsaSxqLGssbSxuLG8scj1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07IXJ8fChqPTEsaz0icG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3dpZHRoOjFweDtoZWlnaHQ6MXB4O21hcmdpbjowOyIsbT0idmlzaWJpbGl0eTpoaWRkZW47Ym9yZGVyOjA7IixuPSJzdHlsZT0nIitrKyJib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowOyciLG89IjxkaXYgIituKyI+PGRpdj48L2Rpdj48L2Rpdj4iKyI8dGFibGUgIituKyIgY2VsbHBhZGRpbmc9JzAnIGNlbGxzcGFjaW5nPScwJz4iKyI8dHI+PHRkPjwvdGQ+PC90cj48L3RhYmxlPiIsYT1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGEuc3R5bGUuY3NzVGV4dD1tKyJ3aWR0aDowO2hlaWdodDowO3Bvc2l0aW9uOnN0YXRpYzt0b3A6MDttYXJnaW4tdG9wOiIraisicHgiLHIuaW5zZXJ0QmVmb3JlKGEsci5maXJzdENoaWxkKSxxPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksYS5hcHBlbmRDaGlsZChxKSxxLmlubmVySFRNTD0iPHRhYmxlPjx0cj48dGQgc3R5bGU9J3BhZGRpbmc6MDtib3JkZXI6MDtkaXNwbGF5Om5vbmUnPjwvdGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iLGw9cS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKSxwPWxbMF0ub2Zmc2V0SGVpZ2h0PT09MCxsWzBdLnN0eWxlLmRpc3BsYXk9IiIsbFsxXS5zdHlsZS5kaXNwbGF5PSJub25lIixiLnJlbGlhYmxlSGlkZGVuT2Zmc2V0cz1wJiZsWzBdLm9mZnNldEhlaWdodD09PTAscS5pbm5lckhUTUw9IiIscS5zdHlsZS53aWR0aD1xLnN0eWxlLnBhZGRpbmdMZWZ0PSIxcHgiLGYuYm94TW9kZWw9Yi5ib3hNb2RlbD1xLm9mZnNldFdpZHRoPT09Mix0eXBlb2YgcS5zdHlsZS56b29tIT0idW5kZWZpbmVkIiYmKHEuc3R5bGUuZGlzcGxheT0iaW5saW5lIixxLnN0eWxlLnpvb209MSxiLmlubGluZUJsb2NrTmVlZHNMYXlvdXQ9cS5vZmZzZXRXaWR0aD09PTIscS5zdHlsZS5kaXNwbGF5PSIiLHEuaW5uZXJIVE1MPSI8ZGl2IHN0eWxlPSd3aWR0aDo0cHg7Jz48L2Rpdj4iLGIuc2hyaW5rV3JhcEJsb2Nrcz1xLm9mZnNldFdpZHRoIT09MikscS5zdHlsZS5jc3NUZXh0PWsrbSxxLmlubmVySFRNTD1vLGQ9cS5maXJzdENoaWxkLGU9ZC5maXJzdENoaWxkLGg9ZC5uZXh0U2libGluZy5maXJzdENoaWxkLmZpcnN0Q2hpbGQsaT17ZG9lc05vdEFkZEJvcmRlcjplLm9mZnNldFRvcCE9PTUsZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHM6aC5vZmZzZXRUb3A9PT01fSxlLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsZS5zdHlsZS50b3A9IjIwcHgiLGkuZml4ZWRQb3NpdGlvbj1lLm9mZnNldFRvcD09PTIwfHxlLm9mZnNldFRvcD09PTE1LGUuc3R5bGUucG9zaXRpb249ZS5zdHlsZS50b3A9IiIsZC5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIixkLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaS5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGU9ZS5vZmZzZXRUb3A9PT0tNSxpLmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0PXIub2Zmc2V0VG9wIT09aixyLnJlbW92ZUNoaWxkKGEpLHE9YT1udWxsLGYuZXh0ZW5kKGIsaSkpfSk7cmV0dXJuIGJ9KCk7dmFyIGo9L14oPzpcey4qXH18XFsuKlxdKSQvLGs9LyhbQS1aXSkvZztmLmV4dGVuZCh7Y2FjaGU6e30sdXVpZDowLGV4cGFuZG86ImpRdWVyeSIrKGYuZm4uanF1ZXJ5K01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLG5vRGF0YTp7ZW1iZWQ6ITAsb2JqZWN0OiJjbHNpZDpEMjdDREI2RS1BRTZELTExY2YtOTZCOC00NDQ1NTM1NDAwMDAiLGFwcGxldDohMH0saGFzRGF0YTpmdW5jdGlvbihhKXthPWEubm9kZVR5cGU/Zi5jYWNoZVthW2YuZXhwYW5kb11dOmFbZi5leHBhbmRvXTtyZXR1cm4hIWEmJiFtKGEpfSxkYXRhOmZ1bmN0aW9uKGEsYyxkLGUpe2lmKCEhZi5hY2NlcHREYXRhKGEpKXt2YXIgZyxoLGksaj1mLmV4cGFuZG8saz10eXBlb2YgYz09InN0cmluZyIsbD1hLm5vZGVUeXBlLG09bD9mLmNhY2hlOmEsbj1sP2Fbal06YVtqXSYmaixvPWM9PT0iZXZlbnRzIjtpZigoIW58fCFtW25dfHwhbyYmIWUmJiFtW25dLmRhdGEpJiZrJiZkPT09YilyZXR1cm47bnx8KGw/YVtqXT1uPSsrZi51dWlkOm49aiksbVtuXXx8KG1bbl09e30sbHx8KG1bbl0udG9KU09OPWYubm9vcCkpO2lmKHR5cGVvZiBjPT0ib2JqZWN0Inx8dHlwZW9mIGM9PSJmdW5jdGlvbiIpZT9tW25dPWYuZXh0ZW5kKG1bbl0sYyk6bVtuXS5kYXRhPWYuZXh0ZW5kKG1bbl0uZGF0YSxjKTtnPWg9bVtuXSxlfHwoaC5kYXRhfHwoaC5kYXRhPXt9KSxoPWguZGF0YSksZCE9PWImJihoW2YuY2FtZWxDYXNlKGMpXT1kKTtpZihvJiYhaFtjXSlyZXR1cm4gZy5ldmVudHM7az8oaT1oW2NdLGk9PW51bGwmJihpPWhbZi5jYW1lbENhc2UoYyldKSk6aT1oO3JldHVybiBpfX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIsYyl7aWYoISFmLmFjY2VwdERhdGEoYSkpe3ZhciBkLGUsZyxoPWYuZXhwYW5kbyxpPWEubm9kZVR5cGUsaj1pP2YuY2FjaGU6YSxrPWk/YVtoXTpoO2lmKCFqW2tdKXJldHVybjtpZihiKXtkPWM/altrXTpqW2tdLmRhdGE7aWYoZCl7Zi5pc0FycmF5KGIpfHwoYiBpbiBkP2I9W2JdOihiPWYuY2FtZWxDYXNlKGIpLGIgaW4gZD9iPVtiXTpiPWIuc3BsaXQoIiAiKSkpO2ZvcihlPTAsZz1iLmxlbmd0aDtlPGc7ZSsrKWRlbGV0ZSBkW2JbZV1dO2lmKCEoYz9tOmYuaXNFbXB0eU9iamVjdCkoZCkpcmV0dXJufX1pZighYyl7ZGVsZXRlIGpba10uZGF0YTtpZighbShqW2tdKSlyZXR1cm59Zi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG98fCFqLnNldEludGVydmFsP2RlbGV0ZSBqW2tdOmpba109bnVsbCxpJiYoZi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG8/ZGVsZXRlIGFbaF06YS5yZW1vdmVBdHRyaWJ1dGU/YS5yZW1vdmVBdHRyaWJ1dGUoaCk6YVtoXT1udWxsKX19LF9kYXRhOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZi5kYXRhKGEsYixjLCEwKX0sYWNjZXB0RGF0YTpmdW5jdGlvbihhKXtpZihhLm5vZGVOYW1lKXt2YXIgYj1mLm5vRGF0YVthLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldO2lmKGIpcmV0dXJuIGIhPT0hMCYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzaWQiKT09PWJ9cmV0dXJuITB9fSksZi5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oYSxjKXt2YXIgZCxlLGcsaD1udWxsO2lmKHR5cGVvZiBhPT0idW5kZWZpbmVkIil7aWYodGhpcy5sZW5ndGgpe2g9Zi5kYXRhKHRoaXNbMF0pO2lmKHRoaXNbMF0ubm9kZVR5cGU9PT0xJiYhZi5fZGF0YSh0aGlzWzBdLCJwYXJzZWRBdHRycyIpKXtlPXRoaXNbMF0uYXR0cmlidXRlcztmb3IodmFyIGk9MCxqPWUubGVuZ3RoO2k8ajtpKyspZz1lW2ldLm5hbWUsZy5pbmRleE9mKCJkYXRhLSIpPT09MCYmKGc9Zi5jYW1lbENhc2UoZy5zdWJzdHJpbmcoNSkpLGwodGhpc1swXSxnLGhbZ10pKTtmLl9kYXRhKHRoaXNbMF0sInBhcnNlZEF0dHJzIiwhMCl9fXJldHVybiBofWlmKHR5cGVvZiBhPT0ib2JqZWN0IilyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5kYXRhKHRoaXMsYSl9KTtkPWEuc3BsaXQoIi4iKSxkWzFdPWRbMV0/Ii4iK2RbMV06IiI7aWYoYz09PWIpe2g9dGhpcy50cmlnZ2VySGFuZGxlcigiZ2V0RGF0YSIrZFsxXSsiISIsW2RbMF1dKSxoPT09YiYmdGhpcy5sZW5ndGgmJihoPWYuZGF0YSh0aGlzWzBdLGEpLGg9bCh0aGlzWzBdLGEsaCkpO3JldHVybiBoPT09YiYmZFsxXT90aGlzLmRhdGEoZFswXSk6aH1yZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Zih0aGlzKSxlPVtkWzBdLGNdO2IudHJpZ2dlckhhbmRsZXIoInNldERhdGEiK2RbMV0rIiEiLGUpLGYuZGF0YSh0aGlzLGEsYyksYi50cmlnZ2VySGFuZGxlcigiY2hhbmdlRGF0YSIrZFsxXSsiISIsZSl9KX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5yZW1vdmVEYXRhKHRoaXMsYSl9KX19KSxmLmV4dGVuZCh7X21hcms6ZnVuY3Rpb24oYSxiKXthJiYoYj0oYnx8ImZ4IikrIm1hcmsiLGYuX2RhdGEoYSxiLChmLl9kYXRhKGEsYil8fDApKzEpKX0sX3VubWFyazpmdW5jdGlvbihhLGIsYyl7YSE9PSEwJiYoYz1iLGI9YSxhPSExKTtpZihiKXtjPWN8fCJmeCI7dmFyIGQ9YysibWFyayIsZT1hPzA6KGYuX2RhdGEoYixkKXx8MSktMTtlP2YuX2RhdGEoYixkLGUpOihmLnJlbW92ZURhdGEoYixkLCEwKSxuKGIsYywibWFyayIpKX19LHF1ZXVlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihhKXtiPShifHwiZngiKSsicXVldWUiLGQ9Zi5fZGF0YShhLGIpLGMmJighZHx8Zi5pc0FycmF5KGMpP2Q9Zi5fZGF0YShhLGIsZi5tYWtlQXJyYXkoYykpOmQucHVzaChjKSk7cmV0dXJuIGR8fFtdfX0sZGVxdWV1ZTpmdW5jdGlvbihhLGIpe2I9Ynx8ImZ4Ijt2YXIgYz1mLnF1ZXVlKGEsYiksZD1jLnNoaWZ0KCksZT17fTtkPT09ImlucHJvZ3Jlc3MiJiYoZD1jLnNoaWZ0KCkpLGQmJihiPT09ImZ4IiYmYy51bnNoaWZ0KCJpbnByb2dyZXNzIiksZi5fZGF0YShhLGIrIi5ydW4iLGUpLGQuY2FsbChhLGZ1bmN0aW9uKCl7Zi5kZXF1ZXVlKGEsYil9LGUpKSxjLmxlbmd0aHx8KGYucmVtb3ZlRGF0YShhLGIrInF1ZXVlICIrYisiLnJ1biIsITApLG4oYSxiLCJxdWV1ZSIpKX19KSxmLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxjKXt0eXBlb2YgYSE9InN0cmluZyImJihjPWEsYT0iZngiKTtpZihjPT09YilyZXR1cm4gZi5xdWV1ZSh0aGlzWzBdLGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1mLnF1ZXVlKHRoaXMsYSxjKTthPT09ImZ4IiYmYlswXSE9PSJpbnByb2dyZXNzIiYmZi5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVxdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVsYXk6ZnVuY3Rpb24oYSxiKXthPWYuZng/Zi5meC5zcGVlZHNbYV18fGE6YSxiPWJ8fCJmeCI7cmV0dXJuIHRoaXMucXVldWUoYixmdW5jdGlvbihiLGMpe3ZhciBkPXNldFRpbWVvdXQoYixhKTtjLnN0b3A9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoZCl9fSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBtKCl7LS1ofHxkLnJlc29sdmVXaXRoKGUsW2VdKX10eXBlb2YgYSE9InN0cmluZyImJihjPWEsYT1iKSxhPWF8fCJmeCI7dmFyIGQ9Zi5EZWZlcnJlZCgpLGU9dGhpcyxnPWUubGVuZ3RoLGg9MSxpPWErImRlZmVyIixqPWErInF1ZXVlIixrPWErIm1hcmsiLGw7d2hpbGUoZy0tKWlmKGw9Zi5kYXRhKGVbZ10saSxiLCEwKXx8KGYuZGF0YShlW2ddLGosYiwhMCl8fGYuZGF0YShlW2ddLGssYiwhMCkpJiZmLmRhdGEoZVtnXSxpLGYuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCEwKSloKyssbC5hZGQobSk7bSgpO3JldHVybiBkLnByb21pc2UoKX19KTt2YXIgbz0vW1xuXHRccl0vZyxwPS9ccysvLHE9L1xyL2cscj0vXig/OmJ1dHRvbnxpbnB1dCkkL2kscz0vXig/OmJ1dHRvbnxpbnB1dHxvYmplY3R8c2VsZWN0fHRleHRhcmVhKSQvaSx0PS9eYSg/OnJlYSk/JC9pLHU9L14oPzphdXRvZm9jdXN8YXV0b3BsYXl8YXN5bmN8Y2hlY2tlZHxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZHxzZWxlY3RlZCkkL2ksdj1mLnN1cHBvcnQuZ2V0U2V0QXR0cmlidXRlLHcseCx5O2YuZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGYuYWNjZXNzKHRoaXMsYSxiLCEwLGYuYXR0cil9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YucmVtb3ZlQXR0cih0aGlzLGEpfSl9LHByb3A6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxhLGIsITAsZi5wcm9wKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihhKXthPWYucHJvcEZpeFthXXx8YTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dHJ5e3RoaXNbYV09YixkZWxldGUgdGhpc1thXX1jYXRjaChjKXt9fSl9LGFkZENsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGcsaCxpO2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2YodGhpcykuYWRkQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoYSYmdHlwZW9mIGE9PSJzdHJpbmciKXtiPWEuc3BsaXQocCk7Zm9yKGM9MCxkPXRoaXMubGVuZ3RoO2M8ZDtjKyspe2U9dGhpc1tjXTtpZihlLm5vZGVUeXBlPT09MSlpZighZS5jbGFzc05hbWUmJmIubGVuZ3RoPT09MSllLmNsYXNzTmFtZT1hO2Vsc2V7Zz0iICIrZS5jbGFzc05hbWUrIiAiO2ZvcihoPTAsaT1iLmxlbmd0aDtoPGk7aCsrKX5nLmluZGV4T2YoIiAiK2JbaF0rIiAiKXx8KGcrPWJbaF0rIiAiKTtlLmNsYXNzTmFtZT1mLnRyaW0oZyl9fX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGMsZCxlLGcsaCxpLGo7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS5yZW1vdmVDbGFzcyhhLmNhbGwodGhpcyxiLHRoaXMuY2xhc3NOYW1lKSl9KTtpZihhJiZ0eXBlb2YgYT09InN0cmluZyJ8fGE9PT1iKXtjPShhfHwiIikuc3BsaXQocCk7Zm9yKGQ9MCxlPXRoaXMubGVuZ3RoO2Q8ZTtkKyspe2c9dGhpc1tkXTtpZihnLm5vZGVUeXBlPT09MSYmZy5jbGFzc05hbWUpaWYoYSl7aD0oIiAiK2cuY2xhc3NOYW1lKyIgIikucmVwbGFjZShvLCIgIik7Zm9yKGk9MCxqPWMubGVuZ3RoO2k8ajtpKyspaD1oLnJlcGxhY2UoIiAiK2NbaV0rIiAiLCIgIik7Zy5jbGFzc05hbWU9Zi50cmltKGgpfWVsc2UgZy5jbGFzc05hbWU9IiJ9fXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbihhLGIpe3ZhciBjPXR5cGVvZiBhLGQ9dHlwZW9mIGI9PSJib29sZWFuIjtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXtmKHRoaXMpLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGMsdGhpcy5jbGFzc05hbWUsYiksYil9KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYoYz09PSJzdHJpbmciKXt2YXIgZSxnPTAsaD1mKHRoaXMpLGk9YixqPWEuc3BsaXQocCk7d2hpbGUoZT1qW2crK10paT1kP2k6IWguaGFzQ2xhc3MoZSksaFtpPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oZSl9ZWxzZSBpZihjPT09InVuZGVmaW5lZCJ8fGM9PT0iYm9vbGVhbiIpdGhpcy5jbGFzc05hbWUmJmYuX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIsdGhpcy5jbGFzc05hbWUpLHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lfHxhPT09ITE/IiI6Zi5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIifSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiPSIgIithKyIgIixjPTAsZD10aGlzLmxlbmd0aDtmb3IoO2M8ZDtjKyspaWYodGhpc1tjXS5ub2RlVHlwZT09PTEmJigiICIrdGhpc1tjXS5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKG8sIiAiKS5pbmRleE9mKGIpPi0xKXJldHVybiEwO3JldHVybiExfSx2YWw6ZnVuY3Rpb24oYSl7dmFyIGMsZCxlLGc9dGhpc1swXTt7aWYoISFhcmd1bWVudHMubGVuZ3RoKXtlPWYuaXNGdW5jdGlvbihhKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGQpe3ZhciBnPWYodGhpcyksaDtpZih0aGlzLm5vZGVUeXBlPT09MSl7ZT9oPWEuY2FsbCh0aGlzLGQsZy52YWwoKSk6aD1hLGg9PW51bGw/aD0iIjp0eXBlb2YgaD09Im51bWJlciI/aCs9IiI6Zi5pc0FycmF5KGgpJiYoaD1mLm1hcChoLGZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOmErIiJ9KSksYz1mLnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV18fGYudmFsSG9va3NbdGhpcy50eXBlXTtpZighY3x8ISgic2V0ImluIGMpfHxjLnNldCh0aGlzLGgsInZhbHVlIik9PT1iKXRoaXMudmFsdWU9aH19KX1pZihnKXtjPWYudmFsSG9va3NbZy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXXx8Zi52YWxIb29rc1tnLnR5cGVdO2lmKGMmJiJnZXQiaW4gYyYmKGQ9Yy5nZXQoZywidmFsdWUiKSkhPT1iKXJldHVybiBkO2Q9Zy52YWx1ZTtyZXR1cm4gdHlwZW9mIGQ9PSJzdHJpbmciP2QucmVwbGFjZShxLCIiKTpkPT1udWxsPyIiOmR9fX19KSxmLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEuYXR0cmlidXRlcy52YWx1ZTtyZXR1cm4hYnx8Yi5zcGVjaWZpZWQ/YS52YWx1ZTphLnRleHR9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxnPWEuc2VsZWN0ZWRJbmRleCxoPVtdLGk9YS5vcHRpb25zLGo9YS50eXBlPT09InNlbGVjdC1vbmUiO2lmKGc8MClyZXR1cm4gbnVsbDtjPWo/ZzowLGQ9aj9nKzE6aS5sZW5ndGg7Zm9yKDtjPGQ7YysrKXtlPWlbY107aWYoZS5zZWxlY3RlZCYmKGYuc3VwcG9ydC5vcHREaXNhYmxlZD8hZS5kaXNhYmxlZDplLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKT09PW51bGwpJiYoIWUucGFyZW50Tm9kZS5kaXNhYmxlZHx8IWYubm9kZU5hbWUoZS5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7Yj1mKGUpLnZhbCgpO2lmKGopcmV0dXJuIGI7aC5wdXNoKGIpfX1pZihqJiYhaC5sZW5ndGgmJmkubGVuZ3RoKXJldHVybiBmKGlbZ10pLnZhbCgpO3JldHVybiBofSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1mLm1ha2VBcnJheShiKTtmKGEpLmZpbmQoIm9wdGlvbiIpLmVhY2goZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkPWYuaW5BcnJheShmKHRoaXMpLnZhbCgpLGMpPj0wfSksYy5sZW5ndGh8fChhLnNlbGVjdGVkSW5kZXg9LTEpO3JldHVybiBjfX19LGF0dHJGbjp7dmFsOiEwLGNzczohMCxodG1sOiEwLHRleHQ6ITAsZGF0YTohMCx3aWR0aDohMCxoZWlnaHQ6ITAsb2Zmc2V0OiEwfSxhdHRyOmZ1bmN0aW9uKGEsYyxkLGUpe3ZhciBnLGgsaSxqPWEubm9kZVR5cGU7aWYoISFhJiZqIT09MyYmaiE9PTgmJmohPT0yKXtpZihlJiZjIGluIGYuYXR0ckZuKXJldHVybiBmKGEpW2NdKGQpO2lmKHR5cGVvZiBhLmdldEF0dHJpYnV0ZT09InVuZGVmaW5lZCIpcmV0dXJuIGYucHJvcChhLGMsZCk7aT1qIT09MXx8IWYuaXNYTUxEb2MoYSksaSYmKGM9Yy50b0xvd2VyQ2FzZSgpLGg9Zi5hdHRySG9va3NbY118fCh1LnRlc3QoYyk/eDp3KSk7aWYoZCE9PWIpe2lmKGQ9PT1udWxsKXtmLnJlbW92ZUF0dHIoYSxjKTtyZXR1cm59aWYoaCYmInNldCJpbiBoJiZpJiYoZz1oLnNldChhLGQsYykpIT09YilyZXR1cm4gZzthLnNldEF0dHJpYnV0ZShjLCIiK2QpO3JldHVybiBkfWlmKGgmJiJnZXQiaW4gaCYmaSYmKGc9aC5nZXQoYSxjKSkhPT1udWxsKXJldHVybiBnO2c9YS5nZXRBdHRyaWJ1dGUoYyk7cmV0dXJuIGc9PT1udWxsP2I6Z319LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZyxoPTA7aWYoYiYmYS5ub2RlVHlwZT09PTEpe2Q9Yi50b0xvd2VyQ2FzZSgpLnNwbGl0KHApLGc9ZC5sZW5ndGg7Zm9yKDtoPGc7aCsrKWU9ZFtoXSxlJiYoYz1mLnByb3BGaXhbZV18fGUsZi5hdHRyKGEsZSwiIiksYS5yZW1vdmVBdHRyaWJ1dGUodj9lOmMpLHUudGVzdChlKSYmYyBpbiBhJiYoYVtjXT0hMSkpfX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oYSxiKXtpZihyLnRlc3QoYS5ub2RlTmFtZSkmJmEucGFyZW50Tm9kZSlmLmVycm9yKCJ0eXBlIHByb3BlcnR5IGNhbid0IGJlIGNoYW5nZWQiKTtlbHNlIGlmKCFmLnN1cHBvcnQucmFkaW9WYWx1ZSYmYj09PSJyYWRpbyImJmYubm9kZU5hbWUoYSwiaW5wdXQiKSl7dmFyIGM9YS52YWx1ZTthLnNldEF0dHJpYnV0ZSgidHlwZSIsYiksYyYmKGEudmFsdWU9Yyk7cmV0dXJuIGJ9fX0sdmFsdWU6e2dldDpmdW5jdGlvbihhLGIpe2lmKHcmJmYubm9kZU5hbWUoYSwiYnV0dG9uIikpcmV0dXJuIHcuZ2V0KGEsYik7cmV0dXJuIGIgaW4gYT9hLnZhbHVlOm51bGx9LHNldDpmdW5jdGlvbihhLGIsYyl7aWYodyYmZi5ub2RlTmFtZShhLCJidXR0b24iKSlyZXR1cm4gdy5zZXQoYSxiLGMpO2EudmFsdWU9Yn19fSxwcm9wRml4Ont0YWJpbmRleDoidGFiSW5kZXgiLHJlYWRvbmx5OiJyZWFkT25seSIsImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSIsbWF4bGVuZ3RoOiJtYXhMZW5ndGgiLGNlbGxzcGFjaW5nOiJjZWxsU3BhY2luZyIsY2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixyb3dzcGFuOiJyb3dTcGFuIixjb2xzcGFuOiJjb2xTcGFuIix1c2VtYXA6InVzZU1hcCIsZnJhbWVib3JkZXI6ImZyYW1lQm9yZGVyIixjb250ZW50ZWRpdGFibGU6ImNvbnRlbnRFZGl0YWJsZSJ9LHByb3A6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlLGcsaCxpPWEubm9kZVR5cGU7aWYoISFhJiZpIT09MyYmaSE9PTgmJmkhPT0yKXtoPWkhPT0xfHwhZi5pc1hNTERvYyhhKSxoJiYoYz1mLnByb3BGaXhbY118fGMsZz1mLnByb3BIb29rc1tjXSk7cmV0dXJuIGQhPT1iP2cmJiJzZXQiaW4gZyYmKGU9Zy5zZXQoYSxkLGMpKSE9PWI/ZTphW2NdPWQ6ZyYmImdldCJpbiBnJiYoZT1nLmdldChhLGMpKSE9PW51bGw/ZTphW2NdfX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBjPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKTtyZXR1cm4gYyYmYy5zcGVjaWZpZWQ/cGFyc2VJbnQoYy52YWx1ZSwxMCk6cy50ZXN0KGEubm9kZU5hbWUpfHx0LnRlc3QoYS5ub2RlTmFtZSkmJmEuaHJlZj8wOmJ9fX19KSxmLmF0dHJIb29rcy50YWJpbmRleD1mLnByb3BIb29rcy50YWJJbmRleCx4PXtnZXQ6ZnVuY3Rpb24oYSxjKXt2YXIgZCxlPWYucHJvcChhLGMpO3JldHVybiBlPT09ITB8fHR5cGVvZiBlIT0iYm9vbGVhbiImJihkPWEuZ2V0QXR0cmlidXRlTm9kZShjKSkmJmQubm9kZVZhbHVlIT09ITE/Yy50b0xvd2VyQ2FzZSgpOmJ9LHNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7Yj09PSExP2YucmVtb3ZlQXR0cihhLGMpOihkPWYucHJvcEZpeFtjXXx8YyxkIGluIGEmJihhW2RdPSEwKSxhLnNldEF0dHJpYnV0ZShjLGMudG9Mb3dlckNhc2UoKSkpO3JldHVybiBjfX0sdnx8KHk9e25hbWU6ITAsaWQ6ITB9LHc9Zi52YWxIb29rcy5idXR0b249e2dldDpmdW5jdGlvbihhLGMpe3ZhciBkO2Q9YS5nZXRBdHRyaWJ1dGVOb2RlKGMpO3JldHVybiBkJiYoeVtjXT9kLm5vZGVWYWx1ZSE9PSIiOmQuc3BlY2lmaWVkKT9kLm5vZGVWYWx1ZTpifSxzZXQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPWEuZ2V0QXR0cmlidXRlTm9kZShkKTtlfHwoZT1jLmNyZWF0ZUF0dHJpYnV0ZShkKSxhLnNldEF0dHJpYnV0ZU5vZGUoZSkpO3JldHVybiBlLm5vZGVWYWx1ZT1iKyIifX0sZi5hdHRySG9va3MudGFiaW5kZXguc2V0PXcuc2V0LGYuZWFjaChbIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24oYSxiKXtmLmF0dHJIb29rc1tiXT1mLmV4dGVuZChmLmF0dHJIb29rc1tiXSx7c2V0OmZ1bmN0aW9uKGEsYyl7aWYoYz09PSIiKXthLnNldEF0dHJpYnV0ZShiLCJhdXRvIik7cmV0dXJuIGN9fX0pfSksZi5hdHRySG9va3MuY29udGVudGVkaXRhYmxlPXtnZXQ6dy5nZXQsc2V0OmZ1bmN0aW9uKGEsYixjKXtiPT09IiImJihiPSJmYWxzZSIpLHcuc2V0KGEsYixjKX19KSxmLnN1cHBvcnQuaHJlZk5vcm1hbGl6ZWR8fGYuZWFjaChbImhyZWYiLCJzcmMiLCJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYyl7Zi5hdHRySG9va3NbY109Zi5leHRlbmQoZi5hdHRySG9va3NbY10se2dldDpmdW5jdGlvbihhKXt2YXIgZD1hLmdldEF0dHJpYnV0ZShjLDIpO3JldHVybiBkPT09bnVsbD9iOmR9fSl9KSxmLnN1cHBvcnQuc3R5bGV8fChmLmF0dHJIb29rcy5zdHlsZT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLnN0eWxlLmNzc1RleHQudG9Mb3dlckNhc2UoKXx8Yn0sc2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dD0iIitifX0pLGYuc3VwcG9ydC5vcHRTZWxlY3RlZHx8KGYucHJvcEhvb2tzLnNlbGVjdGVkPWYuZXh0ZW5kKGYucHJvcEhvb2tzLnNlbGVjdGVkLHtnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO2ImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCk7cmV0dXJuIG51bGx9fSkpLGYuc3VwcG9ydC5lbmN0eXBlfHwoZi5wcm9wRml4LmVuY3R5cGU9ImVuY29kaW5nIiksZi5zdXBwb3J0LmNoZWNrT258fGYuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe2YudmFsSG9va3NbdGhpc109e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInZhbHVlIik9PT1udWxsPyJvbiI6YS52YWx1ZX19fSksZi5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7Zi52YWxIb29rc1t0aGlzXT1mLmV4dGVuZChmLnZhbEhvb2tzW3RoaXNdLHtzZXQ6ZnVuY3Rpb24oYSxiKXtpZihmLmlzQXJyYXkoYikpcmV0dXJuIGEuY2hlY2tlZD1mLmluQXJyYXkoZihhKS52YWwoKSxiKT49MH19KX0pO3ZhciB6PS9eKD86dGV4dGFyZWF8aW5wdXR8c2VsZWN0KSQvaSxBPS9eKFteXC5dKik/KD86XC4oLispKT8kLyxCPS9cYmhvdmVyKFwuXFMrKT9cYi8sQz0vXmtleS8sRD0vXig/Om1vdXNlfGNvbnRleHRtZW51KXxjbGljay8sRT0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sRj0vXihcdyopKD86IyhbXHdcLV0rKSk/KD86XC4oW1x3XC1dKykpPyQvLEc9ZnVuY3Rpb24oYSl7dmFyIGI9Ri5leGVjKGEpO2ImJihiWzFdPShiWzFdfHwiIikudG9Mb3dlckNhc2UoKSxiWzNdPWJbM10mJm5ldyBSZWdFeHAoIig/Ol58XFxzKSIrYlszXSsiKD86XFxzfCQpIikpO3JldHVybiBifSxIPWZ1bmN0aW9uKGEsYil7dmFyIGM9YS5hdHRyaWJ1dGVzfHx7fTtyZXR1cm4oIWJbMV18fGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWJbMV0pJiYoIWJbMl18fChjLmlkfHx7fSkudmFsdWU9PT1iWzJdKSYmKCFiWzNdfHxiWzNdLnRlc3QoKGNbImNsYXNzIl18fHt9KS52YWx1ZSkpfSxJPWZ1bmN0aW9uKGEpe3JldHVybiBmLmV2ZW50LnNwZWNpYWwuaG92ZXI/YTphLnJlcGxhY2UoQiwibW91c2VlbnRlciQxIG1vdXNlbGVhdmUkMSIpfTsKZi5ldmVudD17YWRkOmZ1bmN0aW9uKGEsYyxkLGUsZyl7dmFyIGgsaSxqLGssbCxtLG4sbyxwLHEscixzO2lmKCEoYS5ub2RlVHlwZT09PTN8fGEubm9kZVR5cGU9PT04fHwhY3x8IWR8fCEoaD1mLl9kYXRhKGEpKSkpe2QuaGFuZGxlciYmKHA9ZCxkPXAuaGFuZGxlciksZC5ndWlkfHwoZC5ndWlkPWYuZ3VpZCsrKSxqPWguZXZlbnRzLGp8fChoLmV2ZW50cz1qPXt9KSxpPWguaGFuZGxlLGl8fChoLmhhbmRsZT1pPWZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgZiE9InVuZGVmaW5lZCImJighYXx8Zi5ldmVudC50cmlnZ2VyZWQhPT1hLnR5cGUpP2YuZXZlbnQuZGlzcGF0Y2guYXBwbHkoaS5lbGVtLGFyZ3VtZW50cyk6Yn0saS5lbGVtPWEpLGM9Zi50cmltKEkoYykpLnNwbGl0KCIgIik7Zm9yKGs9MDtrPGMubGVuZ3RoO2srKyl7bD1BLmV4ZWMoY1trXSl8fFtdLG09bFsxXSxuPShsWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCkscz1mLmV2ZW50LnNwZWNpYWxbbV18fHt9LG09KGc/cy5kZWxlZ2F0ZVR5cGU6cy5iaW5kVHlwZSl8fG0scz1mLmV2ZW50LnNwZWNpYWxbbV18fHt9LG89Zi5leHRlbmQoe3R5cGU6bSxvcmlnVHlwZTpsWzFdLGRhdGE6ZSxoYW5kbGVyOmQsZ3VpZDpkLmd1aWQsc2VsZWN0b3I6ZyxxdWljazpHKGcpLG5hbWVzcGFjZTpuLmpvaW4oIi4iKX0scCkscj1qW21dO2lmKCFyKXtyPWpbbV09W10sci5kZWxlZ2F0ZUNvdW50PTA7aWYoIXMuc2V0dXB8fHMuc2V0dXAuY2FsbChhLGUsbixpKT09PSExKWEuYWRkRXZlbnRMaXN0ZW5lcj9hLmFkZEV2ZW50TGlzdGVuZXIobSxpLCExKTphLmF0dGFjaEV2ZW50JiZhLmF0dGFjaEV2ZW50KCJvbiIrbSxpKX1zLmFkZCYmKHMuYWRkLmNhbGwoYSxvKSxvLmhhbmRsZXIuZ3VpZHx8KG8uaGFuZGxlci5ndWlkPWQuZ3VpZCkpLGc/ci5zcGxpY2Uoci5kZWxlZ2F0ZUNvdW50KyssMCxvKTpyLnB1c2gobyksZi5ldmVudC5nbG9iYWxbbV09ITB9YT1udWxsfX0sZ2xvYmFsOnt9LHJlbW92ZTpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBnPWYuaGFzRGF0YShhKSYmZi5fZGF0YShhKSxoLGksaixrLGwsbSxuLG8scCxxLHIscztpZighIWcmJiEhKG89Zy5ldmVudHMpKXtiPWYudHJpbShJKGJ8fCIiKSkuc3BsaXQoIiAiKTtmb3IoaD0wO2g8Yi5sZW5ndGg7aCsrKXtpPUEuZXhlYyhiW2hdKXx8W10saj1rPWlbMV0sbD1pWzJdO2lmKCFqKXtmb3IoaiBpbiBvKWYuZXZlbnQucmVtb3ZlKGEsaitiW2hdLGMsZCwhMCk7Y29udGludWV9cD1mLmV2ZW50LnNwZWNpYWxbal18fHt9LGo9KGQ/cC5kZWxlZ2F0ZVR5cGU6cC5iaW5kVHlwZSl8fGoscj1vW2pdfHxbXSxtPXIubGVuZ3RoLGw9bD9uZXcgUmVnRXhwKCIoXnxcXC4pIitsLnNwbGl0KCIuIikuc29ydCgpLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSsiKFxcLnwkKSIpOm51bGw7Zm9yKG49MDtuPHIubGVuZ3RoO24rKylzPXJbbl0sKGV8fGs9PT1zLm9yaWdUeXBlKSYmKCFjfHxjLmd1aWQ9PT1zLmd1aWQpJiYoIWx8fGwudGVzdChzLm5hbWVzcGFjZSkpJiYoIWR8fGQ9PT1zLnNlbGVjdG9yfHxkPT09IioqIiYmcy5zZWxlY3RvcikmJihyLnNwbGljZShuLS0sMSkscy5zZWxlY3RvciYmci5kZWxlZ2F0ZUNvdW50LS0scC5yZW1vdmUmJnAucmVtb3ZlLmNhbGwoYSxzKSk7ci5sZW5ndGg9PT0wJiZtIT09ci5sZW5ndGgmJigoIXAudGVhcmRvd258fHAudGVhcmRvd24uY2FsbChhLGwpPT09ITEpJiZmLnJlbW92ZUV2ZW50KGEsaixnLmhhbmRsZSksZGVsZXRlIG9bal0pfWYuaXNFbXB0eU9iamVjdChvKSYmKHE9Zy5oYW5kbGUscSYmKHEuZWxlbT1udWxsKSxmLnJlbW92ZURhdGEoYSxbImV2ZW50cyIsImhhbmRsZSJdLCEwKSl9fSxjdXN0b21FdmVudDp7Z2V0RGF0YTohMCxzZXREYXRhOiEwLGNoYW5nZURhdGE6ITB9LHRyaWdnZXI6ZnVuY3Rpb24oYyxkLGUsZyl7aWYoIWV8fGUubm9kZVR5cGUhPT0zJiZlLm5vZGVUeXBlIT09OCl7dmFyIGg9Yy50eXBlfHxjLGk9W10saixrLGwsbSxuLG8scCxxLHIscztpZihFLnRlc3QoaCtmLmV2ZW50LnRyaWdnZXJlZCkpcmV0dXJuO2guaW5kZXhPZigiISIpPj0wJiYoaD1oLnNsaWNlKDAsLTEpLGs9ITApLGguaW5kZXhPZigiLiIpPj0wJiYoaT1oLnNwbGl0KCIuIiksaD1pLnNoaWZ0KCksaS5zb3J0KCkpO2lmKCghZXx8Zi5ldmVudC5jdXN0b21FdmVudFtoXSkmJiFmLmV2ZW50Lmdsb2JhbFtoXSlyZXR1cm47Yz10eXBlb2YgYz09Im9iamVjdCI/Y1tmLmV4cGFuZG9dP2M6bmV3IGYuRXZlbnQoaCxjKTpuZXcgZi5FdmVudChoKSxjLnR5cGU9aCxjLmlzVHJpZ2dlcj0hMCxjLmV4Y2x1c2l2ZT1rLGMubmFtZXNwYWNlPWkuam9pbigiLiIpLGMubmFtZXNwYWNlX3JlPWMubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK2kuam9pbigiXFwuKD86LipcXC4pPyIpKyIoXFwufCQpIik6bnVsbCxvPWguaW5kZXhPZigiOiIpPDA/Im9uIitoOiIiO2lmKCFlKXtqPWYuY2FjaGU7Zm9yKGwgaW4gailqW2xdLmV2ZW50cyYmaltsXS5ldmVudHNbaF0mJmYuZXZlbnQudHJpZ2dlcihjLGQsaltsXS5oYW5kbGUuZWxlbSwhMCk7cmV0dXJufWMucmVzdWx0PWIsYy50YXJnZXR8fChjLnRhcmdldD1lKSxkPWQhPW51bGw/Zi5tYWtlQXJyYXkoZCk6W10sZC51bnNoaWZ0KGMpLHA9Zi5ldmVudC5zcGVjaWFsW2hdfHx7fTtpZihwLnRyaWdnZXImJnAudHJpZ2dlci5hcHBseShlLGQpPT09ITEpcmV0dXJuO3I9W1tlLHAuYmluZFR5cGV8fGhdXTtpZighZyYmIXAubm9CdWJibGUmJiFmLmlzV2luZG93KGUpKXtzPXAuZGVsZWdhdGVUeXBlfHxoLG09RS50ZXN0KHMraCk/ZTplLnBhcmVudE5vZGUsbj1udWxsO2Zvcig7bTttPW0ucGFyZW50Tm9kZSlyLnB1c2goW20sc10pLG49bTtuJiZuPT09ZS5vd25lckRvY3VtZW50JiZyLnB1c2goW24uZGVmYXVsdFZpZXd8fG4ucGFyZW50V2luZG93fHxhLHNdKX1mb3IobD0wO2w8ci5sZW5ndGgmJiFjLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7bCsrKW09cltsXVswXSxjLnR5cGU9cltsXVsxXSxxPShmLl9kYXRhKG0sImV2ZW50cyIpfHx7fSlbYy50eXBlXSYmZi5fZGF0YShtLCJoYW5kbGUiKSxxJiZxLmFwcGx5KG0sZCkscT1vJiZtW29dLHEmJmYuYWNjZXB0RGF0YShtKSYmcS5hcHBseShtLGQpPT09ITEmJmMucHJldmVudERlZmF1bHQoKTtjLnR5cGU9aCwhZyYmIWMuaXNEZWZhdWx0UHJldmVudGVkKCkmJighcC5fZGVmYXVsdHx8cC5fZGVmYXVsdC5hcHBseShlLm93bmVyRG9jdW1lbnQsZCk9PT0hMSkmJihoIT09ImNsaWNrInx8IWYubm9kZU5hbWUoZSwiYSIpKSYmZi5hY2NlcHREYXRhKGUpJiZvJiZlW2hdJiYoaCE9PSJmb2N1cyImJmghPT0iYmx1ciJ8fGMudGFyZ2V0Lm9mZnNldFdpZHRoIT09MCkmJiFmLmlzV2luZG93KGUpJiYobj1lW29dLG4mJihlW29dPW51bGwpLGYuZXZlbnQudHJpZ2dlcmVkPWgsZVtoXSgpLGYuZXZlbnQudHJpZ2dlcmVkPWIsbiYmKGVbb109bikpO3JldHVybiBjLnJlc3VsdH19LGRpc3BhdGNoOmZ1bmN0aW9uKGMpe2M9Zi5ldmVudC5maXgoY3x8YS5ldmVudCk7dmFyIGQ9KGYuX2RhdGEodGhpcywiZXZlbnRzIil8fHt9KVtjLnR5cGVdfHxbXSxlPWQuZGVsZWdhdGVDb3VudCxnPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLGg9IWMuZXhjbHVzaXZlJiYhYy5uYW1lc3BhY2UsaT1bXSxqLGssbCxtLG4sbyxwLHEscixzLHQ7Z1swXT1jLGMuZGVsZWdhdGVUYXJnZXQ9dGhpcztpZihlJiYhYy50YXJnZXQuZGlzYWJsZWQmJighYy5idXR0b258fGMudHlwZSE9PSJjbGljayIpKXttPWYodGhpcyksbS5jb250ZXh0PXRoaXMub3duZXJEb2N1bWVudHx8dGhpcztmb3IobD1jLnRhcmdldDtsIT10aGlzO2w9bC5wYXJlbnROb2RlfHx0aGlzKXtvPXt9LHE9W10sbVswXT1sO2ZvcihqPTA7ajxlO2orKylyPWRbal0scz1yLnNlbGVjdG9yLG9bc109PT1iJiYob1tzXT1yLnF1aWNrP0gobCxyLnF1aWNrKTptLmlzKHMpKSxvW3NdJiZxLnB1c2gocik7cS5sZW5ndGgmJmkucHVzaCh7ZWxlbTpsLG1hdGNoZXM6cX0pfX1kLmxlbmd0aD5lJiZpLnB1c2goe2VsZW06dGhpcyxtYXRjaGVzOmQuc2xpY2UoZSl9KTtmb3Ioaj0wO2o8aS5sZW5ndGgmJiFjLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7aisrKXtwPWlbal0sYy5jdXJyZW50VGFyZ2V0PXAuZWxlbTtmb3Ioaz0wO2s8cC5tYXRjaGVzLmxlbmd0aCYmIWMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKTtrKyspe3I9cC5tYXRjaGVzW2tdO2lmKGh8fCFjLm5hbWVzcGFjZSYmIXIubmFtZXNwYWNlfHxjLm5hbWVzcGFjZV9yZSYmYy5uYW1lc3BhY2VfcmUudGVzdChyLm5hbWVzcGFjZSkpYy5kYXRhPXIuZGF0YSxjLmhhbmRsZU9iaj1yLG49KChmLmV2ZW50LnNwZWNpYWxbci5vcmlnVHlwZV18fHt9KS5oYW5kbGV8fHIuaGFuZGxlcikuYXBwbHkocC5lbGVtLGcpLG4hPT1iJiYoYy5yZXN1bHQ9bixuPT09ITEmJihjLnByZXZlbnREZWZhdWx0KCksYy5zdG9wUHJvcGFnYXRpb24oKSkpfX1yZXR1cm4gYy5yZXN1bHR9LHByb3BzOiJhdHRyQ2hhbmdlIGF0dHJOYW1lIHJlbGF0ZWROb2RlIHNyY0VsZW1lbnQgYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntwcm9wczoiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXthLndoaWNoPT1udWxsJiYoYS53aGljaD1iLmNoYXJDb2RlIT1udWxsP2IuY2hhckNvZGU6Yi5rZXlDb2RlKTtyZXR1cm4gYX19LG1vdXNlSG9va3M6e3Byb3BzOiJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsZCl7dmFyIGUsZixnLGg9ZC5idXR0b24saT1kLmZyb21FbGVtZW50O2EucGFnZVg9PW51bGwmJmQuY2xpZW50WCE9bnVsbCYmKGU9YS50YXJnZXQub3duZXJEb2N1bWVudHx8YyxmPWUuZG9jdW1lbnRFbGVtZW50LGc9ZS5ib2R5LGEucGFnZVg9ZC5jbGllbnRYKyhmJiZmLnNjcm9sbExlZnR8fGcmJmcuc2Nyb2xsTGVmdHx8MCktKGYmJmYuY2xpZW50TGVmdHx8ZyYmZy5jbGllbnRMZWZ0fHwwKSxhLnBhZ2VZPWQuY2xpZW50WSsoZiYmZi5zY3JvbGxUb3B8fGcmJmcuc2Nyb2xsVG9wfHwwKS0oZiYmZi5jbGllbnRUb3B8fGcmJmcuY2xpZW50VG9wfHwwKSksIWEucmVsYXRlZFRhcmdldCYmaSYmKGEucmVsYXRlZFRhcmdldD1pPT09YS50YXJnZXQ/ZC50b0VsZW1lbnQ6aSksIWEud2hpY2gmJmghPT1iJiYoYS53aGljaD1oJjE/MTpoJjI/MzpoJjQ/MjowKTtyZXR1cm4gYX19LGZpeDpmdW5jdGlvbihhKXtpZihhW2YuZXhwYW5kb10pcmV0dXJuIGE7dmFyIGQsZSxnPWEsaD1mLmV2ZW50LmZpeEhvb2tzW2EudHlwZV18fHt9LGk9aC5wcm9wcz90aGlzLnByb3BzLmNvbmNhdChoLnByb3BzKTp0aGlzLnByb3BzO2E9Zi5FdmVudChnKTtmb3IoZD1pLmxlbmd0aDtkOyllPWlbLS1kXSxhW2VdPWdbZV07YS50YXJnZXR8fChhLnRhcmdldD1nLnNyY0VsZW1lbnR8fGMpLGEudGFyZ2V0Lm5vZGVUeXBlPT09MyYmKGEudGFyZ2V0PWEudGFyZ2V0LnBhcmVudE5vZGUpLGEubWV0YUtleT09PWImJihhLm1ldGFLZXk9YS5jdHJsS2V5KTtyZXR1cm4gaC5maWx0ZXI/aC5maWx0ZXIoYSxnKTphfSxzcGVjaWFsOntyZWFkeTp7c2V0dXA6Zi5iaW5kUmVhZHl9LGxvYWQ6e25vQnViYmxlOiEwfSxmb2N1czp7ZGVsZWdhdGVUeXBlOiJmb2N1c2luIn0sYmx1cjp7ZGVsZWdhdGVUeXBlOiJmb2N1c291dCJ9LGJlZm9yZXVubG9hZDp7c2V0dXA6ZnVuY3Rpb24oYSxiLGMpe2YuaXNXaW5kb3codGhpcykmJih0aGlzLm9uYmVmb3JldW5sb2FkPWMpfSx0ZWFyZG93bjpmdW5jdGlvbihhLGIpe3RoaXMub25iZWZvcmV1bmxvYWQ9PT1iJiYodGhpcy5vbmJlZm9yZXVubG9hZD1udWxsKX19fSxzaW11bGF0ZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1mLmV4dGVuZChuZXcgZi5FdmVudCxjLHt0eXBlOmEsaXNTaW11bGF0ZWQ6ITAsb3JpZ2luYWxFdmVudDp7fX0pO2Q/Zi5ldmVudC50cmlnZ2VyKGUsbnVsbCxiKTpmLmV2ZW50LmRpc3BhdGNoLmNhbGwoYixlKSxlLmlzRGVmYXVsdFByZXZlbnRlZCgpJiZjLnByZXZlbnREZWZhdWx0KCl9fSxmLmV2ZW50LmhhbmRsZT1mLmV2ZW50LmRpc3BhdGNoLGYucmVtb3ZlRXZlbnQ9Yy5yZW1vdmVFdmVudExpc3RlbmVyP2Z1bmN0aW9uKGEsYixjKXthLnJlbW92ZUV2ZW50TGlzdGVuZXImJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsITEpfTpmdW5jdGlvbihhLGIsYyl7YS5kZXRhY2hFdmVudCYmYS5kZXRhY2hFdmVudCgib24iK2IsYyl9LGYuRXZlbnQ9ZnVuY3Rpb24oYSxiKXtpZighKHRoaXMgaW5zdGFuY2VvZiBmLkV2ZW50KSlyZXR1cm4gbmV3IGYuRXZlbnQoYSxiKTthJiZhLnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD1hLHRoaXMudHlwZT1hLnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9YS5kZWZhdWx0UHJldmVudGVkfHxhLnJldHVyblZhbHVlPT09ITF8fGEuZ2V0UHJldmVudERlZmF1bHQmJmEuZ2V0UHJldmVudERlZmF1bHQoKT9LOkopOnRoaXMudHlwZT1hLGImJmYuZXh0ZW5kKHRoaXMsYiksdGhpcy50aW1lU3RhbXA9YSYmYS50aW1lU3RhbXB8fGYubm93KCksdGhpc1tmLmV4cGFuZG9dPSEwfSxmLkV2ZW50LnByb3RvdHlwZT17cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1LO3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDshYXx8KGEucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITEpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPUs7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50OyFhfHwoYS5zdG9wUHJvcGFnYXRpb24mJmEuc3RvcFByb3BhZ2F0aW9uKCksYS5jYW5jZWxCdWJibGU9ITApfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPUssdGhpcy5zdG9wUHJvcGFnYXRpb24oKX0saXNEZWZhdWx0UHJldmVudGVkOkosaXNQcm9wYWdhdGlvblN0b3BwZWQ6Sixpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpKfSxmLmVhY2goe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSxmdW5jdGlvbihhLGIpe2YuZXZlbnQuc3BlY2lhbFthXT17ZGVsZWdhdGVUeXBlOmIsYmluZFR5cGU6YixoYW5kbGU6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcyxkPWEucmVsYXRlZFRhcmdldCxlPWEuaGFuZGxlT2JqLGc9ZS5zZWxlY3RvcixoO2lmKCFkfHxkIT09YyYmIWYuY29udGFpbnMoYyxkKSlhLnR5cGU9ZS5vcmlnVHlwZSxoPWUuaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksYS50eXBlPWI7cmV0dXJuIGh9fX0pLGYuc3VwcG9ydC5zdWJtaXRCdWJibGVzfHwoZi5ldmVudC5zcGVjaWFsLnN1Ym1pdD17c2V0dXA6ZnVuY3Rpb24oKXtpZihmLm5vZGVOYW1lKHRoaXMsImZvcm0iKSlyZXR1cm4hMTtmLmV2ZW50LmFkZCh0aGlzLCJjbGljay5fc3VibWl0IGtleXByZXNzLl9zdWJtaXQiLGZ1bmN0aW9uKGEpe3ZhciBjPWEudGFyZ2V0LGQ9Zi5ub2RlTmFtZShjLCJpbnB1dCIpfHxmLm5vZGVOYW1lKGMsImJ1dHRvbiIpP2MuZm9ybTpiO2QmJiFkLl9zdWJtaXRfYXR0YWNoZWQmJihmLmV2ZW50LmFkZChkLCJzdWJtaXQuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiYhYS5pc1RyaWdnZXImJmYuZXZlbnQuc2ltdWxhdGUoInN1Ym1pdCIsdGhpcy5wYXJlbnROb2RlLGEsITApfSksZC5fc3VibWl0X2F0dGFjaGVkPSEwKX0pfSx0ZWFyZG93bjpmdW5jdGlvbigpe2lmKGYubm9kZU5hbWUodGhpcywiZm9ybSIpKXJldHVybiExO2YuZXZlbnQucmVtb3ZlKHRoaXMsIi5fc3VibWl0Iil9fSksZi5zdXBwb3J0LmNoYW5nZUJ1YmJsZXN8fChmLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtzZXR1cDpmdW5jdGlvbigpe2lmKHoudGVzdCh0aGlzLm5vZGVOYW1lKSl7aWYodGhpcy50eXBlPT09ImNoZWNrYm94Inx8dGhpcy50eXBlPT09InJhZGlvIilmLmV2ZW50LmFkZCh0aGlzLCJwcm9wZXJ0eWNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXthLm9yaWdpbmFsRXZlbnQucHJvcGVydHlOYW1lPT09ImNoZWNrZWQiJiYodGhpcy5fanVzdF9jaGFuZ2VkPSEwKX0pLGYuZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpe3RoaXMuX2p1c3RfY2hhbmdlZCYmIWEuaXNUcmlnZ2VyJiYodGhpcy5fanVzdF9jaGFuZ2VkPSExLGYuZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcyxhLCEwKSl9KTtyZXR1cm4hMX1mLmV2ZW50LmFkZCh0aGlzLCJiZWZvcmVhY3RpdmF0ZS5fY2hhbmdlIixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDt6LnRlc3QoYi5ub2RlTmFtZSkmJiFiLl9jaGFuZ2VfYXR0YWNoZWQmJihmLmV2ZW50LmFkZChiLCJjaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiYhYS5pc1NpbXVsYXRlZCYmIWEuaXNUcmlnZ2VyJiZmLmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMucGFyZW50Tm9kZSxhLCEwKX0pLGIuX2NoYW5nZV9hdHRhY2hlZD0hMCl9KX0saGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0O2lmKHRoaXMhPT1ifHxhLmlzU2ltdWxhdGVkfHxhLmlzVHJpZ2dlcnx8Yi50eXBlIT09InJhZGlvIiYmYi50eXBlIT09ImNoZWNrYm94IilyZXR1cm4gYS5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7Zi5ldmVudC5yZW1vdmUodGhpcywiLl9jaGFuZ2UiKTtyZXR1cm4gei50ZXN0KHRoaXMubm9kZU5hbWUpfX0pLGYuc3VwcG9ydC5mb2N1c2luQnViYmxlc3x8Zi5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe3ZhciBkPTAsZT1mdW5jdGlvbihhKXtmLmV2ZW50LnNpbXVsYXRlKGIsYS50YXJnZXQsZi5ldmVudC5maXgoYSksITApfTtmLmV2ZW50LnNwZWNpYWxbYl09e3NldHVwOmZ1bmN0aW9uKCl7ZCsrPT09MCYmYy5hZGRFdmVudExpc3RlbmVyKGEsZSwhMCl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7LS1kPT09MCYmYy5yZW1vdmVFdmVudExpc3RlbmVyKGEsZSwhMCl9fX0pLGYuZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihhLGMsZCxlLGcpe3ZhciBoLGk7aWYodHlwZW9mIGE9PSJvYmplY3QiKXt0eXBlb2YgYyE9InN0cmluZyImJihkPWMsYz1iKTtmb3IoaSBpbiBhKXRoaXMub24oaSxjLGQsYVtpXSxnKTtyZXR1cm4gdGhpc31kPT1udWxsJiZlPT1udWxsPyhlPWMsZD1jPWIpOmU9PW51bGwmJih0eXBlb2YgYz09InN0cmluZyI/KGU9ZCxkPWIpOihlPWQsZD1jLGM9YikpO2lmKGU9PT0hMSllPUo7ZWxzZSBpZighZSlyZXR1cm4gdGhpcztnPT09MSYmKGg9ZSxlPWZ1bmN0aW9uKGEpe2YoKS5vZmYoYSk7cmV0dXJuIGguYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLmd1aWQ9aC5ndWlkfHwoaC5ndWlkPWYuZ3VpZCsrKSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YuZXZlbnQuYWRkKHRoaXMsYSxlLGQsYyl9KX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uLmNhbGwodGhpcyxhLGIsYyxkLDEpfSxvZmY6ZnVuY3Rpb24oYSxjLGQpe2lmKGEmJmEucHJldmVudERlZmF1bHQmJmEuaGFuZGxlT2JqKXt2YXIgZT1hLmhhbmRsZU9iajtmKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihlLm5hbWVzcGFjZT9lLnR5cGUrIi4iK2UubmFtZXNwYWNlOmUudHlwZSxlLnNlbGVjdG9yLGUuaGFuZGxlcik7cmV0dXJuIHRoaXN9aWYodHlwZW9mIGE9PSJvYmplY3QiKXtmb3IodmFyIGcgaW4gYSl0aGlzLm9mZihnLGMsYVtnXSk7cmV0dXJuIHRoaXN9aWYoYz09PSExfHx0eXBlb2YgYz09ImZ1bmN0aW9uIilkPWMsYz1iO2Q9PT0hMSYmKGQ9Sik7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YuZXZlbnQucmVtb3ZlKHRoaXMsYSxkLGMpfSl9LGJpbmQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm9uKGEsbnVsbCxiLGMpfSx1bmJpbmQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5vZmYoYSxudWxsLGIpfSxsaXZlOmZ1bmN0aW9uKGEsYixjKXtmKHRoaXMuY29udGV4dCkub24oYSx0aGlzLnNlbGVjdG9yLGIsYyk7cmV0dXJuIHRoaXN9LGRpZTpmdW5jdGlvbihhLGIpe2YodGhpcy5jb250ZXh0KS5vZmYoYSx0aGlzLnNlbGVjdG9yfHwiKioiLGIpO3JldHVybiB0aGlzfSxkZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihiLGEsYyxkKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PTE/dGhpcy5vZmYoYSwiKioiKTp0aGlzLm9mZihiLGEsYyl9LHRyaWdnZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5ldmVudC50cmlnZ2VyKGEsYix0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihhLGIpe2lmKHRoaXNbMF0pcmV0dXJuIGYuZXZlbnQudHJpZ2dlcihhLGIsdGhpc1swXSwhMCl9LHRvZ2dsZTpmdW5jdGlvbihhKXt2YXIgYj1hcmd1bWVudHMsYz1hLmd1aWR8fGYuZ3VpZCsrLGQ9MCxlPWZ1bmN0aW9uKGMpe3ZhciBlPShmLl9kYXRhKHRoaXMsImxhc3RUb2dnbGUiK2EuZ3VpZCl8fDApJWQ7Zi5fZGF0YSh0aGlzLCJsYXN0VG9nZ2xlIithLmd1aWQsZSsxKSxjLnByZXZlbnREZWZhdWx0KCk7cmV0dXJuIGJbZV0uYXBwbHkodGhpcyxhcmd1bWVudHMpfHwhMX07ZS5ndWlkPWM7d2hpbGUoZDxiLmxlbmd0aCliW2QrK10uZ3VpZD1jO3JldHVybiB0aGlzLmNsaWNrKGUpfSxob3ZlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoYSkubW91c2VsZWF2ZShifHxhKX19KSxmLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtmLmZuW2JdPWZ1bmN0aW9uKGEsYyl7Yz09bnVsbCYmKGM9YSxhPW51bGwpO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjA/dGhpcy5vbihiLG51bGwsYSxjKTp0aGlzLnRyaWdnZXIoYil9LGYuYXR0ckZuJiYoZi5hdHRyRm5bYl09ITApLEMudGVzdChiKSYmKGYuZXZlbnQuZml4SG9va3NbYl09Zi5ldmVudC5rZXlIb29rcyksRC50ZXN0KGIpJiYoZi5ldmVudC5maXhIb29rc1tiXT1mLmV2ZW50Lm1vdXNlSG9va3MpfSksZnVuY3Rpb24oKXtmdW5jdGlvbiB4KGEsYixjLGUsZixnKXtmb3IodmFyIGg9MCxpPWUubGVuZ3RoO2g8aTtoKyspe3ZhciBqPWVbaF07aWYoail7dmFyIGs9ITE7aj1qW2FdO3doaWxlKGope2lmKGpbZF09PT1jKXtrPWVbai5zaXpzZXRdO2JyZWFrfWlmKGoubm9kZVR5cGU9PT0xKXtnfHwoaltkXT1jLGouc2l6c2V0PWgpO2lmKHR5cGVvZiBiIT0ic3RyaW5nIil7aWYoaj09PWIpe2s9ITA7YnJlYWt9fWVsc2UgaWYobS5maWx0ZXIoYixbal0pLmxlbmd0aD4wKXtrPWo7YnJlYWt9fWo9althXX1lW2hdPWt9fX1mdW5jdGlvbiB3KGEsYixjLGUsZixnKXtmb3IodmFyIGg9MCxpPWUubGVuZ3RoO2g8aTtoKyspe3ZhciBqPWVbaF07aWYoail7dmFyIGs9ITE7aj1qW2FdO3doaWxlKGope2lmKGpbZF09PT1jKXtrPWVbai5zaXpzZXRdO2JyZWFrfWoubm9kZVR5cGU9PT0xJiYhZyYmKGpbZF09YyxqLnNpenNldD1oKTtpZihqLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iKXtrPWo7YnJlYWt9aj1qW2FdfWVbaF09a319fXZhciBhPS8oKD86XCgoPzpcKFteKCldK1wpfFteKCldKykrXCl8XFsoPzpcW1teXFtcXV0qXF18WyciXVteJyJdKlsnIl18W15cW1xdJyJdKykrXF18XFwufFteID4rfiwoXFtcXF0rKSt8Wz4rfl0pKFxzKixccyopPygoPzoufFxyfFxuKSopL2csZD0ic2l6Y2FjaGUiKyhNYXRoLnJhbmRvbSgpKyIiKS5yZXBsYWNlKCIuIiwiIiksZT0wLGc9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxoPSExLGk9ITAsaj0vXFwvZyxrPS9cclxuL2csbD0vXFcvO1swLDBdLnNvcnQoZnVuY3Rpb24oKXtpPSExO3JldHVybiAwfSk7dmFyIG09ZnVuY3Rpb24oYixkLGUsZil7ZT1lfHxbXSxkPWR8fGM7dmFyIGg9ZDtpZihkLm5vZGVUeXBlIT09MSYmZC5ub2RlVHlwZSE9PTkpcmV0dXJuW107aWYoIWJ8fHR5cGVvZiBiIT0ic3RyaW5nIilyZXR1cm4gZTt2YXIgaSxqLGssbCxuLHEscix0LHU9ITAsdj1tLmlzWE1MKGQpLHc9W10seD1iO2Rve2EuZXhlYygiIiksaT1hLmV4ZWMoeCk7aWYoaSl7eD1pWzNdLHcucHVzaChpWzFdKTtpZihpWzJdKXtsPWlbM107YnJlYWt9fX13aGlsZShpKTtpZih3Lmxlbmd0aD4xJiZwLmV4ZWMoYikpaWYody5sZW5ndGg9PT0yJiZvLnJlbGF0aXZlW3dbMF1dKWo9eSh3WzBdK3dbMV0sZCxmKTtlbHNle2o9by5yZWxhdGl2ZVt3WzBdXT9bZF06bSh3LnNoaWZ0KCksZCk7d2hpbGUody5sZW5ndGgpYj13LnNoaWZ0KCksby5yZWxhdGl2ZVtiXSYmKGIrPXcuc2hpZnQoKSksaj15KGIsaixmKX1lbHNleyFmJiZ3Lmxlbmd0aD4xJiZkLm5vZGVUeXBlPT09OSYmIXYmJm8ubWF0Y2guSUQudGVzdCh3WzBdKSYmIW8ubWF0Y2guSUQudGVzdCh3W3cubGVuZ3RoLTFdKSYmKG49bS5maW5kKHcuc2hpZnQoKSxkLHYpLGQ9bi5leHByP20uZmlsdGVyKG4uZXhwcixuLnNldClbMF06bi5zZXRbMF0pO2lmKGQpe249Zj97ZXhwcjp3LnBvcCgpLHNldDpzKGYpfTptLmZpbmQody5wb3AoKSx3Lmxlbmd0aD09PTEmJih3WzBdPT09In4ifHx3WzBdPT09IisiKSYmZC5wYXJlbnROb2RlP2QucGFyZW50Tm9kZTpkLHYpLGo9bi5leHByP20uZmlsdGVyKG4uZXhwcixuLnNldCk6bi5zZXQsdy5sZW5ndGg+MD9rPXMoaik6dT0hMTt3aGlsZSh3Lmxlbmd0aClxPXcucG9wKCkscj1xLG8ucmVsYXRpdmVbcV0/cj13LnBvcCgpOnE9IiIscj09bnVsbCYmKHI9ZCksby5yZWxhdGl2ZVtxXShrLHIsdil9ZWxzZSBrPXc9W119a3x8KGs9aiksa3x8bS5lcnJvcihxfHxiKTtpZihnLmNhbGwoayk9PT0iW29iamVjdCBBcnJheV0iKWlmKCF1KWUucHVzaC5hcHBseShlLGspO2Vsc2UgaWYoZCYmZC5ub2RlVHlwZT09PTEpZm9yKHQ9MDtrW3RdIT1udWxsO3QrKylrW3RdJiYoa1t0XT09PSEwfHxrW3RdLm5vZGVUeXBlPT09MSYmbS5jb250YWlucyhkLGtbdF0pKSYmZS5wdXNoKGpbdF0pO2Vsc2UgZm9yKHQ9MDtrW3RdIT1udWxsO3QrKylrW3RdJiZrW3RdLm5vZGVUeXBlPT09MSYmZS5wdXNoKGpbdF0pO2Vsc2UgcyhrLGUpO2wmJihtKGwsaCxlLGYpLG0udW5pcXVlU29ydChlKSk7cmV0dXJuIGV9O20udW5pcXVlU29ydD1mdW5jdGlvbihhKXtpZih1KXtoPWksYS5zb3J0KHUpO2lmKGgpZm9yKHZhciBiPTE7YjxhLmxlbmd0aDtiKyspYVtiXT09PWFbYi0xXSYmYS5zcGxpY2UoYi0tLDEpfXJldHVybiBhfSxtLm1hdGNoZXM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbShhLG51bGwsbnVsbCxiKX0sbS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbShiLG51bGwsbnVsbCxbYV0pLmxlbmd0aD4wfSxtLmZpbmQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsaTtpZighYSlyZXR1cm5bXTtmb3IoZT0wLGY9by5vcmRlci5sZW5ndGg7ZTxmO2UrKyl7aD1vLm9yZGVyW2VdO2lmKGc9by5sZWZ0TWF0Y2hbaF0uZXhlYyhhKSl7aT1nWzFdLGcuc3BsaWNlKDEsMSk7aWYoaS5zdWJzdHIoaS5sZW5ndGgtMSkhPT0iXFwiKXtnWzFdPShnWzFdfHwiIikucmVwbGFjZShqLCIiKSxkPW8uZmluZFtoXShnLGIsYyk7aWYoZCE9bnVsbCl7YT1hLnJlcGxhY2Uoby5tYXRjaFtoXSwiIik7YnJlYWt9fX19ZHx8KGQ9dHlwZW9mIGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiP2IuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTpbXSk7cmV0dXJue3NldDpkLGV4cHI6YX19LG0uZmlsdGVyPWZ1bmN0aW9uKGEsYyxkLGUpe3ZhciBmLGcsaCxpLGosayxsLG4scCxxPWEscj1bXSxzPWMsdD1jJiZjWzBdJiZtLmlzWE1MKGNbMF0pO3doaWxlKGEmJmMubGVuZ3RoKXtmb3IoaCBpbiBvLmZpbHRlcilpZigoZj1vLmxlZnRNYXRjaFtoXS5leGVjKGEpKSE9bnVsbCYmZlsyXSl7az1vLmZpbHRlcltoXSxsPWZbMV0sZz0hMSxmLnNwbGljZSgxLDEpO2lmKGwuc3Vic3RyKGwubGVuZ3RoLTEpPT09IlxcIiljb250aW51ZTtzPT09ciYmKHI9W10pO2lmKG8ucHJlRmlsdGVyW2hdKXtmPW8ucHJlRmlsdGVyW2hdKGYscyxkLHIsZSx0KTtpZighZilnPWk9ITA7ZWxzZSBpZihmPT09ITApY29udGludWV9aWYoZilmb3Iobj0wOyhqPXNbbl0pIT1udWxsO24rKylqJiYoaT1rKGosZixuLHMpLHA9ZV5pLGQmJmkhPW51bGw/cD9nPSEwOnNbbl09ITE6cCYmKHIucHVzaChqKSxnPSEwKSk7aWYoaSE9PWIpe2R8fChzPXIpLGE9YS5yZXBsYWNlKG8ubWF0Y2hbaF0sIiIpO2lmKCFnKXJldHVybltdO2JyZWFrfX1pZihhPT09cSlpZihnPT1udWxsKW0uZXJyb3IoYSk7ZWxzZSBicmVhaztxPWF9cmV0dXJuIHN9LG0uZXJyb3I9ZnVuY3Rpb24oYSl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2EpfTt2YXIgbj1tLmdldFRleHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkPWEubm9kZVR5cGUsZT0iIjtpZihkKXtpZihkPT09MXx8ZD09PTkpe2lmKHR5cGVvZiBhLnRleHRDb250ZW50PT0ic3RyaW5nIilyZXR1cm4gYS50ZXh0Q29udGVudDtpZih0eXBlb2YgYS5pbm5lclRleHQ9PSJzdHJpbmciKXJldHVybiBhLmlubmVyVGV4dC5yZXBsYWNlKGssIiIpO2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZyllKz1uKGEpfWVsc2UgaWYoZD09PTN8fGQ9PT00KXJldHVybiBhLm5vZGVWYWx1ZX1lbHNlIGZvcihiPTA7Yz1hW2JdO2IrKyljLm5vZGVUeXBlIT09OCYmKGUrPW4oYykpO3JldHVybiBlfSxvPW0uc2VsZWN0b3JzPXtvcmRlcjpbIklEIiwiTkFNRSIsIlRBRyJdLG1hdGNoOntJRDovIygoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKS8sQ0xBU1M6L1wuKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspLyxOQU1FOi9cW25hbWU9WyciXSooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylbJyJdKlxdLyxBVFRSOi9cW1xzKigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKVxzKig/OihcUz89KVxzKig/OihbJyJdKSguKj8pXDN8KCM/KD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKil8KXwpXHMqXF0vLFRBRzovXigoPzpbXHdcdTAwYzAtXHVGRkZGXCpcLV18XFwuKSspLyxDSElMRDovOihvbmx5fG50aHxsYXN0fGZpcnN0KS1jaGlsZCg/OlwoXHMqKGV2ZW58b2RkfCg/OlsrXC1dP1xkK3woPzpbK1wtXT9cZCopP25ccyooPzpbK1wtXVxzKlxkKyk/KSlccypcKSk/LyxQT1M6LzoobnRofGVxfGd0fGx0fGZpcnN0fGxhc3R8ZXZlbnxvZGQpKD86XCgoXGQqKVwpKT8oPz1bXlwtXXwkKS8sUFNFVURPOi86KCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspKD86XCgoWyciXT8pKCg/OlwoW15cKV0rXCl8W15cKFwpXSopKylcMlwpKT8vfSxsZWZ0TWF0Y2g6e30sYXR0ck1hcDp7ImNsYXNzIjoiY2xhc3NOYW1lIiwiZm9yIjoiaHRtbEZvciJ9LGF0dHJIYW5kbGU6e2hyZWY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJocmVmIil9LHR5cGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJ0eXBlIil9fSxyZWxhdGl2ZTp7IisiOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGI9PSJzdHJpbmciLGQ9YyYmIWwudGVzdChiKSxlPWMmJiFkO2QmJihiPWIudG9Mb3dlckNhc2UoKSk7Zm9yKHZhciBmPTAsZz1hLmxlbmd0aCxoO2Y8ZztmKyspaWYoaD1hW2ZdKXt3aGlsZSgoaD1oLnByZXZpb3VzU2libGluZykmJmgubm9kZVR5cGUhPT0xKTthW2ZdPWV8fGgmJmgubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWI/aHx8ITE6aD09PWJ9ZSYmbS5maWx0ZXIoYixhLCEwKX0sIj4iOmZ1bmN0aW9uKGEsYil7dmFyIGMsZD10eXBlb2YgYj09InN0cmluZyIsZT0wLGY9YS5sZW5ndGg7aWYoZCYmIWwudGVzdChiKSl7Yj1iLnRvTG93ZXJDYXNlKCk7Zm9yKDtlPGY7ZSsrKXtjPWFbZV07aWYoYyl7dmFyIGc9Yy5wYXJlbnROb2RlO2FbZV09Zy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yj9nOiExfX19ZWxzZXtmb3IoO2U8ZjtlKyspYz1hW2VdLGMmJihhW2VdPWQ/Yy5wYXJlbnROb2RlOmMucGFyZW50Tm9kZT09PWIpO2QmJm0uZmlsdGVyKGIsYSwhMCl9fSwiIjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZj1lKyssZz14O3R5cGVvZiBiPT0ic3RyaW5nIiYmIWwudGVzdChiKSYmKGI9Yi50b0xvd2VyQ2FzZSgpLGQ9YixnPXcpLGcoInBhcmVudE5vZGUiLGIsZixhLGQsYyl9LCJ+IjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZj1lKyssZz14O3R5cGVvZiBiPT0ic3RyaW5nIiYmIWwudGVzdChiKSYmKGI9Yi50b0xvd2VyQ2FzZSgpLGQ9YixnPXcpLGcoInByZXZpb3VzU2libGluZyIsYixmLGEsZCxjKX19LGZpbmQ6e0lEOmZ1bmN0aW9uKGEsYixjKXtpZih0eXBlb2YgYi5nZXRFbGVtZW50QnlJZCE9InVuZGVmaW5lZCImJiFjKXt2YXIgZD1iLmdldEVsZW1lbnRCeUlkKGFbMV0pO3JldHVybiBkJiZkLnBhcmVudE5vZGU/W2RdOltdfX0sTkFNRTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlOYW1lIT0idW5kZWZpbmVkIil7dmFyIGM9W10sZD1iLmdldEVsZW1lbnRzQnlOYW1lKGFbMV0pO2Zvcih2YXIgZT0wLGY9ZC5sZW5ndGg7ZTxmO2UrKylkW2VdLmdldEF0dHJpYnV0ZSgibmFtZSIpPT09YVsxXSYmYy5wdXNoKGRbZV0pO3JldHVybiBjLmxlbmd0aD09PTA/bnVsbDpjfX0sVEFHOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiKXJldHVybiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGFbMV0pfX0scHJlRmlsdGVyOntDTEFTUzpmdW5jdGlvbihhLGIsYyxkLGUsZil7YT0iICIrYVsxXS5yZXBsYWNlKGosIiIpKyIgIjtpZihmKXJldHVybiBhO2Zvcih2YXIgZz0wLGg7KGg9YltnXSkhPW51bGw7ZysrKWgmJihlXihoLmNsYXNzTmFtZSYmKCIgIitoLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoL1tcdFxuXHJdL2csIiAiKS5pbmRleE9mKGEpPj0wKT9jfHxkLnB1c2goaCk6YyYmKGJbZ109ITEpKTtyZXR1cm4hMX0sSUQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV0ucmVwbGFjZShqLCIiKX0sVEFHOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGFbMV0ucmVwbGFjZShqLCIiKS50b0xvd2VyQ2FzZSgpfSxDSElMRDpmdW5jdGlvbihhKXtpZihhWzFdPT09Im50aCIpe2FbMl18fG0uZXJyb3IoYVswXSksYVsyXT1hWzJdLnJlcGxhY2UoL15cK3xccyovZywiIik7dmFyIGI9LygtPykoXGQqKSg/Om4oWytcLV0/XGQqKSk/Ly5leGVjKGFbMl09PT0iZXZlbiImJiIybiJ8fGFbMl09PT0ib2RkIiYmIjJuKzEifHwhL1xELy50ZXN0KGFbMl0pJiYiMG4rIithWzJdfHxhWzJdKTthWzJdPWJbMV0rKGJbMl18fDEpLTAsYVszXT1iWzNdLTB9ZWxzZSBhWzJdJiZtLmVycm9yKGFbMF0pO2FbMF09ZSsrO3JldHVybiBhfSxBVFRSOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt2YXIgZz1hWzFdPWFbMV0ucmVwbGFjZShqLCIiKTshZiYmby5hdHRyTWFwW2ddJiYoYVsxXT1vLmF0dHJNYXBbZ10pLGFbNF09KGFbNF18fGFbNV18fCIiKS5yZXBsYWNlKGosIiIpLGFbMl09PT0ifj0iJiYoYVs0XT0iICIrYVs0XSsiICIpO3JldHVybiBhfSxQU0VVRE86ZnVuY3Rpb24oYixjLGQsZSxmKXtpZihiWzFdPT09Im5vdCIpaWYoKGEuZXhlYyhiWzNdKXx8IiIpLmxlbmd0aD4xfHwvXlx3Ly50ZXN0KGJbM10pKWJbM109bShiWzNdLG51bGwsbnVsbCxjKTtlbHNle3ZhciBnPW0uZmlsdGVyKGJbM10sYyxkLCEwXmYpO2R8fGUucHVzaC5hcHBseShlLGcpO3JldHVybiExfWVsc2UgaWYoby5tYXRjaC5QT1MudGVzdChiWzBdKXx8by5tYXRjaC5DSElMRC50ZXN0KGJbMF0pKXJldHVybiEwO3JldHVybiBifSxQT1M6ZnVuY3Rpb24oYSl7YS51bnNoaWZ0KCEwKTtyZXR1cm4gYX19LGZpbHRlcnM6e2VuYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMSYmYS50eXBlIT09ImhpZGRlbiJ9LGRpc2FibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITB9LGNoZWNrZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2hlY2tlZD09PSEwfSxzZWxlY3RlZDpmdW5jdGlvbihhKXthLnBhcmVudE5vZGUmJmEucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O3JldHVybiBhLnNlbGVjdGVkPT09ITB9LHBhcmVudDpmdW5jdGlvbihhKXtyZXR1cm4hIWEuZmlyc3RDaGlsZH0sZW1wdHk6ZnVuY3Rpb24oYSl7cmV0dXJuIWEuZmlyc3RDaGlsZH0saGFzOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIW0oY1szXSxhKS5sZW5ndGh9LGhlYWRlcjpmdW5jdGlvbihhKXtyZXR1cm4vaFxkL2kudGVzdChhLm5vZGVOYW1lKX0sdGV4dDpmdW5jdGlvbihhKXt2YXIgYj1hLmdldEF0dHJpYnV0ZSgidHlwZSIpLGM9YS50eXBlO3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYidGV4dCI9PT1jJiYoYj09PWN8fGI9PT1udWxsKX0scmFkaW86ZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJiJyYWRpbyI9PT1hLnR5cGV9LGNoZWNrYm94OmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYiY2hlY2tib3giPT09YS50eXBlfSxmaWxlOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYiZmlsZSI9PT1hLnR5cGV9LHBhc3N3b3JkOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYicGFzc3dvcmQiPT09YS50eXBlfSxzdWJtaXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybihiPT09ImlucHV0Inx8Yj09PSJidXR0b24iKSYmInN1Ym1pdCI9PT1hLnR5cGV9LGltYWdlOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYiaW1hZ2UiPT09YS50eXBlfSxyZXNldDpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKGI9PT0iaW5wdXQifHxiPT09ImJ1dHRvbiIpJiYicmVzZXQiPT09YS50eXBlfSxidXR0b246ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiBiPT09ImlucHV0IiYmImJ1dHRvbiI9PT1hLnR5cGV8fGI9PT0iYnV0dG9uIn0saW5wdXQ6ZnVuY3Rpb24oYSl7cmV0dXJuL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24vaS50ZXN0KGEubm9kZU5hbWUpfSxmb2N1czpmdW5jdGlvbihhKXtyZXR1cm4gYT09PWEub3duZXJEb2N1bWVudC5hY3RpdmVFbGVtZW50fX0sc2V0RmlsdGVyczp7Zmlyc3Q6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj09PTB9LGxhc3Q6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGI9PT1kLmxlbmd0aC0xfSxldmVuOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIlMj09PTB9LG9kZDpmdW5jdGlvbihhLGIpe3JldHVybiBiJTI9PT0xfSxsdDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI8Y1szXS0wfSxndDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI+Y1szXS0wfSxudGg6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjWzNdLTA9PT1ifSxlcTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGNbM10tMD09PWJ9fSxmaWx0ZXI6e1BTRVVETzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1iWzFdLGY9by5maWx0ZXJzW2VdO2lmKGYpcmV0dXJuIGYoYSxjLGIsZCk7aWYoZT09PSJjb250YWlucyIpcmV0dXJuKGEudGV4dENvbnRlbnR8fGEuaW5uZXJUZXh0fHxuKFthXSl8fCIiKS5pbmRleE9mKGJbM10pPj0wO2lmKGU9PT0ibm90Iil7dmFyIGc9YlszXTtmb3IodmFyIGg9MCxpPWcubGVuZ3RoO2g8aTtoKyspaWYoZ1toXT09PWEpcmV0dXJuITE7cmV0dXJuITB9bS5lcnJvcihlKX0sQ0hJTEQ6ZnVuY3Rpb24oYSxiKXt2YXIgYyxlLGYsZyxoLGksaixrPWJbMV0sbD1hO3N3aXRjaChrKXtjYXNlIm9ubHkiOmNhc2UiZmlyc3QiOndoaWxlKGw9bC5wcmV2aW91c1NpYmxpbmcpaWYobC5ub2RlVHlwZT09PTEpcmV0dXJuITE7aWYoaz09PSJmaXJzdCIpcmV0dXJuITA7bD1hO2Nhc2UibGFzdCI6d2hpbGUobD1sLm5leHRTaWJsaW5nKWlmKGwubm9kZVR5cGU9PT0xKXJldHVybiExO3JldHVybiEwO2Nhc2UibnRoIjpjPWJbMl0sZT1iWzNdO2lmKGM9PT0xJiZlPT09MClyZXR1cm4hMDtmPWJbMF0sZz1hLnBhcmVudE5vZGU7aWYoZyYmKGdbZF0hPT1mfHwhYS5ub2RlSW5kZXgpKXtpPTA7Zm9yKGw9Zy5maXJzdENoaWxkO2w7bD1sLm5leHRTaWJsaW5nKWwubm9kZVR5cGU9PT0xJiYobC5ub2RlSW5kZXg9KytpKTtnW2RdPWZ9aj1hLm5vZGVJbmRleC1lO3JldHVybiBjPT09MD9qPT09MDpqJWM9PT0wJiZqL2M+PTB9fSxJRDpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVUeXBlPT09MSYmYS5nZXRBdHRyaWJ1dGUoImlkIik9PT1ifSxUQUc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj09PSIqIiYmYS5ub2RlVHlwZT09PTF8fCEhYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yn0sQ0xBU1M6ZnVuY3Rpb24oYSxiKXtyZXR1cm4oIiAiKyhhLmNsYXNzTmFtZXx8YS5nZXRBdHRyaWJ1dGUoImNsYXNzIikpKyIgIikuaW5kZXhPZihiKT4tMX0sQVRUUjpmdW5jdGlvbihhLGIpe3ZhciBjPWJbMV0sZD1tLmF0dHI/bS5hdHRyKGEsYyk6by5hdHRySGFuZGxlW2NdP28uYXR0ckhhbmRsZVtjXShhKTphW2NdIT1udWxsP2FbY106YS5nZXRBdHRyaWJ1dGUoYyksZT1kKyIiLGY9YlsyXSxnPWJbNF07cmV0dXJuIGQ9PW51bGw/Zj09PSIhPSI6IWYmJm0uYXR0cj9kIT1udWxsOmY9PT0iPSI/ZT09PWc6Zj09PSIqPSI/ZS5pbmRleE9mKGcpPj0wOmY9PT0ifj0iPygiICIrZSsiICIpLmluZGV4T2YoZyk+PTA6Zz9mPT09IiE9Ij9lIT09ZzpmPT09Il49Ij9lLmluZGV4T2YoZyk9PT0wOmY9PT0iJD0iP2Uuc3Vic3RyKGUubGVuZ3RoLWcubGVuZ3RoKT09PWc6Zj09PSJ8PSI/ZT09PWd8fGUuc3Vic3RyKDAsZy5sZW5ndGgrMSk9PT1nKyItIjohMTplJiZkIT09ITF9LFBPUzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1iWzJdLGY9by5zZXRGaWx0ZXJzW2VdO2lmKGYpcmV0dXJuIGYoYSxjLGIsZCl9fX0scD1vLm1hdGNoLlBPUyxxPWZ1bmN0aW9uKGEsYil7cmV0dXJuIlxcIisoYi0wKzEpfTtmb3IodmFyIHIgaW4gby5tYXRjaClvLm1hdGNoW3JdPW5ldyBSZWdFeHAoby5tYXRjaFtyXS5zb3VyY2UrLyg/IVteXFtdKlxdKSg/IVteXChdKlwpKS8uc291cmNlKSxvLmxlZnRNYXRjaFtyXT1uZXcgUmVnRXhwKC8oXig/Oi58XHJ8XG4pKj8pLy5zb3VyY2Urby5tYXRjaFtyXS5zb3VyY2UucmVwbGFjZSgvXFwoXGQrKS9nLHEpKTt2YXIgcz1mdW5jdGlvbihhLGIpe2E9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSwwKTtpZihiKXtiLnB1c2guYXBwbHkoYixhKTtyZXR1cm4gYn1yZXR1cm4gYX07dHJ5e0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGMuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMsMClbMF0ubm9kZVR5cGV9Y2F0Y2godCl7cz1mdW5jdGlvbihhLGIpe3ZhciBjPTAsZD1ifHxbXTtpZihnLmNhbGwoYSk9PT0iW29iamVjdCBBcnJheV0iKUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGQsYSk7ZWxzZSBpZih0eXBlb2YgYS5sZW5ndGg9PSJudW1iZXIiKWZvcih2YXIgZT1hLmxlbmd0aDtjPGU7YysrKWQucHVzaChhW2NdKTtlbHNlIGZvcig7YVtjXTtjKyspZC5wdXNoKGFbY10pO3JldHVybiBkfX12YXIgdSx2O2MuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP3U9ZnVuY3Rpb24oYSxiKXtpZihhPT09Yil7aD0hMDtyZXR1cm4gMH1pZighYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbnx8IWIuY29tcGFyZURvY3VtZW50UG9zaXRpb24pcmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24/LTE6MTtyZXR1cm4gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSY0Py0xOjF9Oih1PWZ1bmN0aW9uKGEsYil7aWYoYT09PWIpe2g9ITA7cmV0dXJuIDB9aWYoYS5zb3VyY2VJbmRleCYmYi5zb3VyY2VJbmRleClyZXR1cm4gYS5zb3VyY2VJbmRleC1iLnNvdXJjZUluZGV4O3ZhciBjLGQsZT1bXSxmPVtdLGc9YS5wYXJlbnROb2RlLGk9Yi5wYXJlbnROb2RlLGo9ZztpZihnPT09aSlyZXR1cm4gdihhLGIpO2lmKCFnKXJldHVybi0xO2lmKCFpKXJldHVybiAxO3doaWxlKGopZS51bnNoaWZ0KGopLGo9ai5wYXJlbnROb2RlO2o9aTt3aGlsZShqKWYudW5zaGlmdChqKSxqPWoucGFyZW50Tm9kZTtjPWUubGVuZ3RoLGQ9Zi5sZW5ndGg7Zm9yKHZhciBrPTA7azxjJiZrPGQ7aysrKWlmKGVba10hPT1mW2tdKXJldHVybiB2KGVba10sZltrXSk7cmV0dXJuIGs9PT1jP3YoYSxmW2tdLC0xKTp2KGVba10sYiwxKX0sdj1mdW5jdGlvbihhLGIsYyl7aWYoYT09PWIpcmV0dXJuIGM7dmFyIGQ9YS5uZXh0U2libGluZzt3aGlsZShkKXtpZihkPT09YilyZXR1cm4tMTtkPWQubmV4dFNpYmxpbmd9cmV0dXJuIDF9KSxmdW5jdGlvbigpe3ZhciBhPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksZD0ic2NyaXB0IisobmV3IERhdGUpLmdldFRpbWUoKSxlPWMuZG9jdW1lbnRFbGVtZW50O2EuaW5uZXJIVE1MPSI8YSBuYW1lPSciK2QrIicvPiIsZS5pbnNlcnRCZWZvcmUoYSxlLmZpcnN0Q2hpbGQpLGMuZ2V0RWxlbWVudEJ5SWQoZCkmJihvLmZpbmQuSUQ9ZnVuY3Rpb24oYSxjLGQpe2lmKHR5cGVvZiBjLmdldEVsZW1lbnRCeUlkIT0idW5kZWZpbmVkIiYmIWQpe3ZhciBlPWMuZ2V0RWxlbWVudEJ5SWQoYVsxXSk7cmV0dXJuIGU/ZS5pZD09PWFbMV18fHR5cGVvZiBlLmdldEF0dHJpYnV0ZU5vZGUhPSJ1bmRlZmluZWQiJiZlLmdldEF0dHJpYnV0ZU5vZGUoImlkIikubm9kZVZhbHVlPT09YVsxXT9bZV06YjpbXX19LG8uZmlsdGVyLklEPWZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGEuZ2V0QXR0cmlidXRlTm9kZSE9InVuZGVmaW5lZCImJmEuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gYS5ub2RlVHlwZT09PTEmJmMmJmMubm9kZVZhbHVlPT09Yn0pLGUucmVtb3ZlQ2hpbGQoYSksZT1hPW51bGx9KCksZnVuY3Rpb24oKXt2YXIgYT1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuYXBwZW5kQ2hpbGQoYy5jcmVhdGVDb21tZW50KCIiKSksYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aD4wJiYoby5maW5kLlRBRz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYVsxXSk7aWYoYVsxXT09PSIqIil7dmFyIGQ9W107Zm9yKHZhciBlPTA7Y1tlXTtlKyspY1tlXS5ub2RlVHlwZT09PTEmJmQucHVzaChjW2VdKTtjPWR9cmV0dXJuIGN9KSxhLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsYS5maXJzdENoaWxkJiZ0eXBlb2YgYS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSE9InVuZGVmaW5lZCImJmEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSE9PSIjIiYmKG8uYXR0ckhhbmRsZS5ocmVmPWZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIsMil9KSxhPW51bGx9KCksYy5xdWVyeVNlbGVjdG9yQWxsJiZmdW5jdGlvbigpe3ZhciBhPW0sYj1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9Il9fc2l6emxlX18iO2IuaW5uZXJIVE1MPSI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7aWYoIWIucXVlcnlTZWxlY3RvckFsbHx8Yi5xdWVyeVNlbGVjdG9yQWxsKCIuVEVTVCIpLmxlbmd0aCE9PTApe209ZnVuY3Rpb24oYixlLGYsZyl7ZT1lfHxjO2lmKCFnJiYhbS5pc1hNTChlKSl7dmFyIGg9L14oXHcrJCl8XlwuKFtcd1wtXSskKXxeIyhbXHdcLV0rJCkvLmV4ZWMoYik7aWYoaCYmKGUubm9kZVR5cGU9PT0xfHxlLm5vZGVUeXBlPT09OSkpe2lmKGhbMV0pcmV0dXJuIHMoZS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKSxmKTtpZihoWzJdJiZvLmZpbmQuQ0xBU1MmJmUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gcyhlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaFsyXSksZil9aWYoZS5ub2RlVHlwZT09PTkpe2lmKGI9PT0iYm9keSImJmUuYm9keSlyZXR1cm4gcyhbZS5ib2R5XSxmKTtpZihoJiZoWzNdKXt2YXIgaT1lLmdldEVsZW1lbnRCeUlkKGhbM10pO2lmKCFpfHwhaS5wYXJlbnROb2RlKXJldHVybiBzKFtdLGYpO2lmKGkuaWQ9PT1oWzNdKXJldHVybiBzKFtpXSxmKX10cnl7cmV0dXJuIHMoZS5xdWVyeVNlbGVjdG9yQWxsKGIpLGYpfWNhdGNoKGope319ZWxzZSBpZihlLm5vZGVUeXBlPT09MSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09Im9iamVjdCIpe3ZhciBrPWUsbD1lLmdldEF0dHJpYnV0ZSgiaWQiKSxuPWx8fGQscD1lLnBhcmVudE5vZGUscT0vXlxzKlsrfl0vLnRlc3QoYik7bD9uPW4ucmVwbGFjZSgvJy9nLCJcXCQmIik6ZS5zZXRBdHRyaWJ1dGUoImlkIixuKSxxJiZwJiYoZT1lLnBhcmVudE5vZGUpO3RyeXtpZighcXx8cClyZXR1cm4gcyhlLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZD0nIituKyInXSAiK2IpLGYpfWNhdGNoKHIpe31maW5hbGx5e2x8fGsucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGEoYixlLGYsZyl9O2Zvcih2YXIgZSBpbiBhKW1bZV09YVtlXTtiPW51bGx9fSgpLGZ1bmN0aW9uKCl7dmFyIGE9Yy5kb2N1bWVudEVsZW1lbnQsYj1hLm1hdGNoZXNTZWxlY3Rvcnx8YS5tb3pNYXRjaGVzU2VsZWN0b3J8fGEud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxhLm1zTWF0Y2hlc1NlbGVjdG9yO2lmKGIpe3ZhciBkPSFiLmNhbGwoYy5jcmVhdGVFbGVtZW50KCJkaXYiKSwiZGl2IiksZT0hMTt0cnl7Yi5jYWxsKGMuZG9jdW1lbnRFbGVtZW50LCJbdGVzdCE9JyddOnNpenpsZSIpfWNhdGNoKGYpe2U9ITB9bS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxjKXtjPWMucmVwbGFjZSgvXD1ccyooW14nIlxdXSopXHMqXF0vZywiPSckMSddIik7aWYoIW0uaXNYTUwoYSkpdHJ5e2lmKGV8fCFvLm1hdGNoLlBTRVVETy50ZXN0KGMpJiYhLyE9Ly50ZXN0KGMpKXt2YXIgZj1iLmNhbGwoYSxjKTtpZihmfHwhZHx8YS5kb2N1bWVudCYmYS5kb2N1bWVudC5ub2RlVHlwZSE9PTExKXJldHVybiBmfX1jYXRjaChnKXt9cmV0dXJuIG0oYyxudWxsLG51bGwsW2FdKS5sZW5ndGg+MH19fSgpLGZ1bmN0aW9uKCl7dmFyIGE9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmlubmVySFRNTD0iPGRpdiBjbGFzcz0ndGVzdCBlJz48L2Rpdj48ZGl2IGNsYXNzPSd0ZXN0Jz48L2Rpdj4iO2lmKCEhYS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZhLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGghPT0wKXthLmxhc3RDaGlsZC5jbGFzc05hbWU9ImUiO2lmKGEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aD09PTEpcmV0dXJuO28ub3JkZXIuc3BsaWNlKDEsMCwiQ0xBU1MiKSxvLmZpbmQuQ0xBU1M9ZnVuY3Rpb24oYSxiLGMpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUhPSJ1bmRlZmluZWQiJiYhYylyZXR1cm4gYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGFbMV0pfSxhPW51bGx9fSgpLGMuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zP20uY29udGFpbnM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSE9PWImJihhLmNvbnRhaW5zP2EuY29udGFpbnMoYik6ITApfTpjLmRvY3VtZW50RWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9tLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNil9Om0uY29udGFpbnM9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbS5pc1hNTD1mdW5jdGlvbihhKXt2YXIgYj0oYT9hLm93bmVyRG9jdW1lbnR8fGE6MCkuZG9jdW1lbnRFbGVtZW50O3JldHVybiBiP2Iubm9kZU5hbWUhPT0iSFRNTCI6ITF9O3ZhciB5PWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlPVtdLGY9IiIsZz1iLm5vZGVUeXBlP1tiXTpiO3doaWxlKGQ9by5tYXRjaC5QU0VVRE8uZXhlYyhhKSlmKz1kWzBdLGE9YS5yZXBsYWNlKG8ubWF0Y2guUFNFVURPLCIiKTthPW8ucmVsYXRpdmVbYV0/YSsiKiI6YTtmb3IodmFyIGg9MCxpPWcubGVuZ3RoO2g8aTtoKyspbShhLGdbaF0sZSxjKTtyZXR1cm4gbS5maWx0ZXIoZixlKX07bS5hdHRyPWYuYXR0cixtLnNlbGVjdG9ycy5hdHRyTWFwPXt9LGYuZmluZD1tLGYuZXhwcj1tLnNlbGVjdG9ycyxmLmV4cHJbIjoiXT1mLmV4cHIuZmlsdGVycyxmLnVuaXF1ZT1tLnVuaXF1ZVNvcnQsZi50ZXh0PW0uZ2V0VGV4dCxmLmlzWE1MRG9jPW0uaXNYTUwsZi5jb250YWlucz1tLmNvbnRhaW5zfSgpO3ZhciBMPS9VbnRpbCQvLE09L14oPzpwYXJlbnRzfHByZXZVbnRpbHxwcmV2QWxsKS8sTj0vLC8sTz0vXi5bXjojXFtcLixdKiQvLFA9QXJyYXkucHJvdG90eXBlLnNsaWNlLFE9Zi5leHByLm1hdGNoLlBPUyxSPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O2YuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYyxkO2lmKHR5cGVvZiBhIT0ic3RyaW5nIilyZXR1cm4gZihhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYz0wLGQ9Yi5sZW5ndGg7YzxkO2MrKylpZihmLmNvbnRhaW5zKGJbY10sdGhpcykpcmV0dXJuITB9KTt2YXIgZT10aGlzLnB1c2hTdGFjaygiIiwiZmluZCIsYSksZyxoLGk7Zm9yKGM9MCxkPXRoaXMubGVuZ3RoO2M8ZDtjKyspe2c9ZS5sZW5ndGgsZi5maW5kKGEsdGhpc1tjXSxlKTtpZihjPjApZm9yKGg9ZztoPGUubGVuZ3RoO2grKylmb3IoaT0wO2k8ZztpKyspaWYoZVtpXT09PWVbaF0pe2Uuc3BsaWNlKGgtLSwxKTticmVha319cmV0dXJuIGV9LGhhczpmdW5jdGlvbihhKXt2YXIgYj1mKGEpO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgYT0wLGM9Yi5sZW5ndGg7YTxjO2ErKylpZihmLmNvbnRhaW5zKHRoaXMsYlthXSkpcmV0dXJuITB9KX0sbm90OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhUKHRoaXMsYSwhMSksIm5vdCIsYSl9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soVCh0aGlzLGEsITApLCJmaWx0ZXIiLGEpfSxpczpmdW5jdGlvbihhKXtyZXR1cm4hIWEmJih0eXBlb2YgYT09InN0cmluZyI/US50ZXN0KGEpP2YoYSx0aGlzLmNvbnRleHQpLmluZGV4KHRoaXNbMF0pPj0wOmYuZmlsdGVyKGEsdGhpcykubGVuZ3RoPjA6dGhpcy5maWx0ZXIoYSkubGVuZ3RoPjApfSxjbG9zZXN0OmZ1bmN0aW9uKGEsYil7dmFyIGM9W10sZCxlLGc9dGhpc1swXTtpZihmLmlzQXJyYXkoYSkpe3ZhciBoPTE7d2hpbGUoZyYmZy5vd25lckRvY3VtZW50JiZnIT09Yil7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmKGcpLmlzKGFbZF0pJiZjLnB1c2goe3NlbGVjdG9yOmFbZF0sZWxlbTpnLGxldmVsOmh9KTtnPWcucGFyZW50Tm9kZSxoKyt9cmV0dXJuIGN9dmFyIGk9US50ZXN0KGEpfHx0eXBlb2YgYSE9InN0cmluZyI/ZihhLGJ8fHRoaXMuY29udGV4dCk6MDtmb3IoZD0wLGU9dGhpcy5sZW5ndGg7ZDxlO2QrKyl7Zz10aGlzW2RdO3doaWxlKGcpe2lmKGk/aS5pbmRleChnKT4tMTpmLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGcsYSkpe2MucHVzaChnKTticmVha31nPWcucGFyZW50Tm9kZTtpZighZ3x8IWcub3duZXJEb2N1bWVudHx8Zz09PWJ8fGcubm9kZVR5cGU9PT0xMSlicmVha319Yz1jLmxlbmd0aD4xP2YudW5pcXVlKGMpOmM7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGMsImNsb3Nlc3QiLGEpfSxpbmRleDpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4gdGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMucHJldkFsbCgpLmxlbmd0aDotMTtpZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIGYuaW5BcnJheSh0aGlzWzBdLGYoYSkpO3JldHVybiBmLmluQXJyYXkoYS5qcXVlcnk/YVswXTphLHRoaXMpfSxhZGQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYT09InN0cmluZyI/ZihhLGIpOmYubWFrZUFycmF5KGEmJmEubm9kZVR5cGU/W2FdOmEpLGQ9Zi5tZXJnZSh0aGlzLmdldCgpLGMpO3JldHVybiB0aGlzLnB1c2hTdGFjayhTKGNbMF0pfHxTKGRbMF0pP2Q6Zi51bmlxdWUoZCkpfSxhbmRTZWxmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWRkKHRoaXMucHJldk9iamVjdCl9fSksZi5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiZiLm5vZGVUeXBlIT09MTE/YjpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBmLmRpcihhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZGlyKGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBmLm50aChhLDIsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIGYubnRoKGEsMiwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZGlyKGEsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZGlyKGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmRpcihhLCJuZXh0U2libGluZyIsYyl9LHByZXZVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZGlyKGEsInByZXZpb3VzU2libGluZyIsYyl9LHNpYmxpbmdzOmZ1bmN0aW9uKGEpe3JldHVybiBmLnNpYmxpbmcoYS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiBmLnNpYmxpbmcoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGYubm9kZU5hbWUoYSwiaWZyYW1lIik/YS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDpmLm1ha2VBcnJheShhLmNoaWxkTm9kZXMpfX0sZnVuY3Rpb24oYSxiKXtmLmZuW2FdPWZ1bmN0aW9uKGMsZCl7dmFyIGU9Zi5tYXAodGhpcyxiLGMpO0wudGVzdChhKXx8KGQ9YyksZCYmdHlwZW9mIGQ9PSJzdHJpbmciJiYoZT1mLmZpbHRlcihkLGUpKSxlPXRoaXMubGVuZ3RoPjEmJiFSW2FdP2YudW5pcXVlKGUpOmUsKHRoaXMubGVuZ3RoPjF8fE4udGVzdChkKSkmJk0udGVzdChhKSYmKGU9ZS5yZXZlcnNlKCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhlLGEsUC5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpKX19KSxmLmV4dGVuZCh7ZmlsdGVyOmZ1bmN0aW9uKGEsYixjKXtjJiYoYT0iOm5vdCgiK2ErIikiKTtyZXR1cm4gYi5sZW5ndGg9PT0xP2YuZmluZC5tYXRjaGVzU2VsZWN0b3IoYlswXSxhKT9bYlswXV06W106Zi5maW5kLm1hdGNoZXMoYSxiKX0sZGlyOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1bXSxnPWFbY107d2hpbGUoZyYmZy5ub2RlVHlwZSE9PTkmJihkPT09Ynx8Zy5ub2RlVHlwZSE9PTF8fCFmKGcpLmlzKGQpKSlnLm5vZGVUeXBlPT09MSYmZS5wdXNoKGcpLGc9Z1tjXTtyZXR1cm4gZX0sbnRoOmZ1bmN0aW9uKGEsYixjLGQpe2I9Ynx8MTt2YXIgZT0wO2Zvcig7YTthPWFbY10paWYoYS5ub2RlVHlwZT09PTEmJisrZT09PWIpYnJlYWs7cmV0dXJuIGF9LHNpYmxpbmc6ZnVuY3Rpb24oYSxiKXt2YXIgYz1bXTtmb3IoO2E7YT1hLm5leHRTaWJsaW5nKWEubm9kZVR5cGU9PT0xJiZhIT09YiYmYy5wdXNoKGEpO3JldHVybiBjfX0pO3ZhciBWPSJhYmJyfGFydGljbGV8YXNpZGV8YXVkaW98Y2FudmFzfGRhdGFsaXN0fGRldGFpbHN8ZmlnY2FwdGlvbnxmaWd1cmV8Zm9vdGVyfGhlYWRlcnxoZ3JvdXB8bWFya3xtZXRlcnxuYXZ8b3V0cHV0fHByb2dyZXNzfHNlY3Rpb258c3VtbWFyeXx0aW1lfHZpZGVvIixXPS8galF1ZXJ5XGQrPSIoPzpcZCt8bnVsbCkiL2csWD0vXlxzKy8sWT0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2lnLFo9LzwoW1x3Ol0rKS8sJD0vPHRib2R5L2ksXz0vPHwmIz9cdys7LyxiYT0vPCg/OnNjcmlwdHxzdHlsZSkvaSxiYj0vPCg/OnNjcmlwdHxvYmplY3R8ZW1iZWR8b3B0aW9ufHN0eWxlKS9pLGJjPW5ldyBSZWdFeHAoIjwoPzoiK1YrIikiLCJpIiksYmQ9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksYmU9L1wvKGphdmF8ZWNtYSlzY3JpcHQvaSxiZj0vXlxzKjwhKD86XFtDREFUQVxbfFwtXC0pLyxiZz17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sbGVnZW5kOlsxLCI8ZmllbGRzZXQ+IiwiPC9maWVsZHNldD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLGFyZWE6WzEsIjxtYXA+IiwiPC9tYXA+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfSxiaD1VKGMpO2JnLm9wdGdyb3VwPWJnLm9wdGlvbixiZy50Ym9keT1iZy50Zm9vdD1iZy5jb2xncm91cD1iZy5jYXB0aW9uPWJnLnRoZWFkLGJnLnRoPWJnLnRkLGYuc3VwcG9ydC5odG1sU2VyaWFsaXplfHwoYmcuX2RlZmF1bHQ9WzEsImRpdjxkaXY+IiwiPC9kaXY+Il0pLGYuZm4uZXh0ZW5kKHt0ZXh0OmZ1bmN0aW9uKGEpe2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyk7Yy50ZXh0KGEuY2FsbCh0aGlzLGIsYy50ZXh0KCkpKX0pO2lmKHR5cGVvZiBhIT0ib2JqZWN0IiYmYSE9PWIpcmV0dXJuIHRoaXMuZW1wdHkoKS5hcHBlbmQoKHRoaXNbMF0mJnRoaXNbMF0ub3duZXJEb2N1bWVudHx8YykuY3JlYXRlVGV4dE5vZGUoYSkpO3JldHVybiBmLnRleHQodGhpcyl9LHdyYXBBbGw6ZnVuY3Rpb24oYSl7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS53cmFwQWxsKGEuY2FsbCh0aGlzLGIpKX0pO2lmKHRoaXNbMF0pe3ZhciBiPWYoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKTt0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGIubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aGlsZShhLmZpcnN0Q2hpbGQmJmEuZmlyc3RDaGlsZC5ub2RlVHlwZT09PTEpYT1hLmZpcnN0Q2hpbGQ7cmV0dXJuIGF9KS5hcHBlbmQodGhpcyl9cmV0dXJuIHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Zih0aGlzKSxjPWIuY29udGVudHMoKTtjLmxlbmd0aD9jLndyYXBBbGwoYSk6Yi5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXt2YXIgYj1mLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXtmKHRoaXMpLndyYXBBbGwoYj9hLmNhbGwodGhpcyxjKTphKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7Zi5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fGYodGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITAsZnVuY3Rpb24oYSl7dGhpcy5ub2RlVHlwZT09PTEmJnRoaXMuYXBwZW5kQ2hpbGQoYSl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywhMCxmdW5jdGlvbihhKXt0aGlzLm5vZGVUeXBlPT09MSYmdGhpcy5pbnNlcnRCZWZvcmUoYSx0aGlzLmZpcnN0Q2hpbGQpfSl9LGJlZm9yZTpmdW5jdGlvbigpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGE9Zi5jbGVhbihhcmd1bWVudHMpO2EucHVzaC5hcHBseShhLHRoaXMudG9BcnJheSgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYSwiYmVmb3JlIixhcmd1bWVudHMpfX0sYWZ0ZXI6ZnVuY3Rpb24oKXtpZih0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGUpcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCExLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzLm5leHRTaWJsaW5nKX0pO2lmKGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBhPXRoaXMucHVzaFN0YWNrKHRoaXMsImFmdGVyIixhcmd1bWVudHMpO2EucHVzaC5hcHBseShhLGYuY2xlYW4oYXJndW1lbnRzKSk7cmV0dXJuIGF9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MCxkOyhkPXRoaXNbY10pIT1udWxsO2MrKylpZighYXx8Zi5maWx0ZXIoYSxbZF0pLmxlbmd0aCkhYiYmZC5ub2RlVHlwZT09PTEmJihmLmNsZWFuRGF0YShkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpLGYuY2xlYW5EYXRhKFtkXSkpLGQucGFyZW50Tm9kZSYmZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpO3JldHVybiB0aGlzfSxlbXB0eTpmdW5jdGlvbigpCntmb3IodmFyIGE9MCxiOyhiPXRoaXNbYV0pIT1udWxsO2ErKyl7Yi5ub2RlVHlwZT09PTEmJmYuY2xlYW5EYXRhKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSk7d2hpbGUoYi5maXJzdENoaWxkKWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKX1yZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oYSxiKXthPWE9PW51bGw/ITE6YSxiPWI9PW51bGw/YTpiO3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBmLmNsb25lKHRoaXMsYSxiKX0pfSxodG1sOmZ1bmN0aW9uKGEpe2lmKGE9PT1iKXJldHVybiB0aGlzWzBdJiZ0aGlzWzBdLm5vZGVUeXBlPT09MT90aGlzWzBdLmlubmVySFRNTC5yZXBsYWNlKFcsIiIpOm51bGw7aWYodHlwZW9mIGE9PSJzdHJpbmciJiYhYmEudGVzdChhKSYmKGYuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZXx8IVgudGVzdChhKSkmJiFiZ1soWi5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7YT1hLnJlcGxhY2UoWSwiPCQxPjwvJDI+Iik7dHJ5e2Zvcih2YXIgYz0wLGQ9dGhpcy5sZW5ndGg7YzxkO2MrKyl0aGlzW2NdLm5vZGVUeXBlPT09MSYmKGYuY2xlYW5EYXRhKHRoaXNbY10uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSksdGhpc1tjXS5pbm5lckhUTUw9YSl9Y2F0Y2goZSl7dGhpcy5lbXB0eSgpLmFwcGVuZChhKX19ZWxzZSBmLmlzRnVuY3Rpb24oYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyk7Yy5odG1sKGEuY2FsbCh0aGlzLGIsYy5odG1sKCkpKX0pOnRoaXMuZW1wdHkoKS5hcHBlbmQoYSk7cmV0dXJuIHRoaXN9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKGEpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSl7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7dmFyIGM9Zih0aGlzKSxkPWMuaHRtbCgpO2MucmVwbGFjZVdpdGgoYS5jYWxsKHRoaXMsYixkKSl9KTt0eXBlb2YgYSE9InN0cmluZyImJihhPWYoYSkuZGV0YWNoKCkpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5leHRTaWJsaW5nLGM9dGhpcy5wYXJlbnROb2RlO2YodGhpcykucmVtb3ZlKCksYj9mKGIpLmJlZm9yZShhKTpmKGMpLmFwcGVuZChhKX0pfXJldHVybiB0aGlzLmxlbmd0aD90aGlzLnB1c2hTdGFjayhmKGYuaXNGdW5jdGlvbihhKT9hKCk6YSksInJlcGxhY2VXaXRoIixhKTp0aGlzfSxkZXRhY2g6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucmVtb3ZlKGEsITApfSxkb21NYW5pcDpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZyxoLGksaj1hWzBdLGs9W107aWYoIWYuc3VwcG9ydC5jaGVja0Nsb25lJiZhcmd1bWVudHMubGVuZ3RoPT09MyYmdHlwZW9mIGo9PSJzdHJpbmciJiZiZC50ZXN0KGopKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmKHRoaXMpLmRvbU1hbmlwKGEsYyxkLCEwKX0pO2lmKGYuaXNGdW5jdGlvbihqKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe3ZhciBnPWYodGhpcyk7YVswXT1qLmNhbGwodGhpcyxlLGM/Zy5odG1sKCk6YiksZy5kb21NYW5pcChhLGMsZCl9KTtpZih0aGlzWzBdKXtpPWomJmoucGFyZW50Tm9kZSxmLnN1cHBvcnQucGFyZW50Tm9kZSYmaSYmaS5ub2RlVHlwZT09PTExJiZpLmNoaWxkTm9kZXMubGVuZ3RoPT09dGhpcy5sZW5ndGg/ZT17ZnJhZ21lbnQ6aX06ZT1mLmJ1aWxkRnJhZ21lbnQoYSx0aGlzLGspLGg9ZS5mcmFnbWVudCxoLmNoaWxkTm9kZXMubGVuZ3RoPT09MT9nPWg9aC5maXJzdENoaWxkOmc9aC5maXJzdENoaWxkO2lmKGcpe2M9YyYmZi5ub2RlTmFtZShnLCJ0ciIpO2Zvcih2YXIgbD0wLG09dGhpcy5sZW5ndGgsbj1tLTE7bDxtO2wrKylkLmNhbGwoYz9iaSh0aGlzW2xdLGcpOnRoaXNbbF0sZS5jYWNoZWFibGV8fG0+MSYmbDxuP2YuY2xvbmUoaCwhMCwhMCk6aCl9ay5sZW5ndGgmJmYuZWFjaChrLGJwKX1yZXR1cm4gdGhpc319KSxmLmJ1aWxkRnJhZ21lbnQ9ZnVuY3Rpb24oYSxiLGQpe3ZhciBlLGcsaCxpLGo9YVswXTtiJiZiWzBdJiYoaT1iWzBdLm93bmVyRG9jdW1lbnR8fGJbMF0pLGkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudHx8KGk9YyksYS5sZW5ndGg9PT0xJiZ0eXBlb2Ygaj09InN0cmluZyImJmoubGVuZ3RoPDUxMiYmaT09PWMmJmouY2hhckF0KDApPT09IjwiJiYhYmIudGVzdChqKSYmKGYuc3VwcG9ydC5jaGVja0Nsb25lfHwhYmQudGVzdChqKSkmJihmLnN1cHBvcnQuaHRtbDVDbG9uZXx8IWJjLnRlc3QoaikpJiYoZz0hMCxoPWYuZnJhZ21lbnRzW2pdLGgmJmghPT0xJiYoZT1oKSksZXx8KGU9aS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksZi5jbGVhbihhLGksZSxkKSksZyYmKGYuZnJhZ21lbnRzW2pdPWg/ZToxKTtyZXR1cm57ZnJhZ21lbnQ6ZSxjYWNoZWFibGU6Z319LGYuZnJhZ21lbnRzPXt9LGYuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGEsYil7Zi5mblthXT1mdW5jdGlvbihjKXt2YXIgZD1bXSxlPWYoYyksZz10aGlzLmxlbmd0aD09PTEmJnRoaXNbMF0ucGFyZW50Tm9kZTtpZihnJiZnLm5vZGVUeXBlPT09MTEmJmcuY2hpbGROb2Rlcy5sZW5ndGg9PT0xJiZlLmxlbmd0aD09PTEpe2VbYl0odGhpc1swXSk7cmV0dXJuIHRoaXN9Zm9yKHZhciBoPTAsaT1lLmxlbmd0aDtoPGk7aCsrKXt2YXIgaj0oaD4wP3RoaXMuY2xvbmUoITApOnRoaXMpLmdldCgpO2YoZVtoXSlbYl0oaiksZD1kLmNvbmNhdChqKX1yZXR1cm4gdGhpcy5wdXNoU3RhY2soZCxhLGUuc2VsZWN0b3IpfX0pLGYuZXh0ZW5kKHtjbG9uZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxnLGg9Zi5zdXBwb3J0Lmh0bWw1Q2xvbmV8fCFiYy50ZXN0KCI8IithLm5vZGVOYW1lKT9hLmNsb25lTm9kZSghMCk6Ym8oYSk7aWYoKCFmLnN1cHBvcnQubm9DbG9uZUV2ZW50fHwhZi5zdXBwb3J0Lm5vQ2xvbmVDaGVja2VkKSYmKGEubm9kZVR5cGU9PT0xfHxhLm5vZGVUeXBlPT09MTEpJiYhZi5pc1hNTERvYyhhKSl7YmsoYSxoKSxkPWJsKGEpLGU9YmwoaCk7Zm9yKGc9MDtkW2ddOysrZyllW2ddJiZiayhkW2ddLGVbZ10pfWlmKGIpe2JqKGEsaCk7aWYoYyl7ZD1ibChhKSxlPWJsKGgpO2ZvcihnPTA7ZFtnXTsrK2cpYmooZFtnXSxlW2ddKX19ZD1lPW51bGw7cmV0dXJuIGh9LGNsZWFuOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBnO2I9Ynx8Yyx0eXBlb2YgYi5jcmVhdGVFbGVtZW50PT0idW5kZWZpbmVkIiYmKGI9Yi5vd25lckRvY3VtZW50fHxiWzBdJiZiWzBdLm93bmVyRG9jdW1lbnR8fGMpO3ZhciBoPVtdLGk7Zm9yKHZhciBqPTAsazsoaz1hW2pdKSE9bnVsbDtqKyspe3R5cGVvZiBrPT0ibnVtYmVyIiYmKGsrPSIiKTtpZighayljb250aW51ZTtpZih0eXBlb2Ygaz09InN0cmluZyIpaWYoIV8udGVzdChrKSlrPWIuY3JlYXRlVGV4dE5vZGUoayk7ZWxzZXtrPWsucmVwbGFjZShZLCI8JDE+PC8kMj4iKTt2YXIgbD0oWi5leGVjKGspfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLG09YmdbbF18fGJnLl9kZWZhdWx0LG49bVswXSxvPWIuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yj09PWM/YmguYXBwZW5kQ2hpbGQobyk6VShiKS5hcHBlbmRDaGlsZChvKSxvLmlubmVySFRNTD1tWzFdK2srbVsyXTt3aGlsZShuLS0pbz1vLmxhc3RDaGlsZDtpZighZi5zdXBwb3J0LnRib2R5KXt2YXIgcD0kLnRlc3QoaykscT1sPT09InRhYmxlIiYmIXA/by5maXJzdENoaWxkJiZvLmZpcnN0Q2hpbGQuY2hpbGROb2RlczptWzFdPT09Ijx0YWJsZT4iJiYhcD9vLmNoaWxkTm9kZXM6W107Zm9yKGk9cS5sZW5ndGgtMTtpPj0wOy0taSlmLm5vZGVOYW1lKHFbaV0sInRib2R5IikmJiFxW2ldLmNoaWxkTm9kZXMubGVuZ3RoJiZxW2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocVtpXSl9IWYuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSYmWC50ZXN0KGspJiZvLmluc2VydEJlZm9yZShiLmNyZWF0ZVRleHROb2RlKFguZXhlYyhrKVswXSksby5maXJzdENoaWxkKSxrPW8uY2hpbGROb2Rlc312YXIgcjtpZighZi5zdXBwb3J0LmFwcGVuZENoZWNrZWQpaWYoa1swXSYmdHlwZW9mIChyPWsubGVuZ3RoKT09Im51bWJlciIpZm9yKGk9MDtpPHI7aSsrKWJuKGtbaV0pO2Vsc2UgYm4oayk7ay5ub2RlVHlwZT9oLnB1c2goayk6aD1mLm1lcmdlKGgsayl9aWYoZCl7Zz1mdW5jdGlvbihhKXtyZXR1cm4hYS50eXBlfHxiZS50ZXN0KGEudHlwZSl9O2ZvcihqPTA7aFtqXTtqKyspaWYoZSYmZi5ub2RlTmFtZShoW2pdLCJzY3JpcHQiKSYmKCFoW2pdLnR5cGV8fGhbal0udHlwZS50b0xvd2VyQ2FzZSgpPT09InRleHQvamF2YXNjcmlwdCIpKWUucHVzaChoW2pdLnBhcmVudE5vZGU/aFtqXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGhbal0pOmhbal0pO2Vsc2V7aWYoaFtqXS5ub2RlVHlwZT09PTEpe3ZhciBzPWYuZ3JlcChoW2pdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSxnKTtoLnNwbGljZS5hcHBseShoLFtqKzEsMF0uY29uY2F0KHMpKX1kLmFwcGVuZENoaWxkKGhbal0pfX1yZXR1cm4gaH0sY2xlYW5EYXRhOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZD1mLmNhY2hlLGU9Zi5ldmVudC5zcGVjaWFsLGc9Zi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG87Zm9yKHZhciBoPTAsaTsoaT1hW2hdKSE9bnVsbDtoKyspe2lmKGkubm9kZU5hbWUmJmYubm9EYXRhW2kubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pY29udGludWU7Yz1pW2YuZXhwYW5kb107aWYoYyl7Yj1kW2NdO2lmKGImJmIuZXZlbnRzKXtmb3IodmFyIGogaW4gYi5ldmVudHMpZVtqXT9mLmV2ZW50LnJlbW92ZShpLGopOmYucmVtb3ZlRXZlbnQoaSxqLGIuaGFuZGxlKTtiLmhhbmRsZSYmKGIuaGFuZGxlLmVsZW09bnVsbCl9Zz9kZWxldGUgaVtmLmV4cGFuZG9dOmkucmVtb3ZlQXR0cmlidXRlJiZpLnJlbW92ZUF0dHJpYnV0ZShmLmV4cGFuZG8pLGRlbGV0ZSBkW2NdfX19fSk7dmFyIGJxPS9hbHBoYVwoW14pXSpcKS9pLGJyPS9vcGFjaXR5PShbXildKikvLGJzPS8oW0EtWl18Xm1zKS9nLGJ0PS9eLT9cZCsoPzpweCk/JC9pLGJ1PS9eLT9cZC8sYnY9L14oW1wtK10pPShbXC0rLlxkZV0rKS8sYnc9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LGJ4PVsiTGVmdCIsIlJpZ2h0Il0sYnk9WyJUb3AiLCJCb3R0b20iXSxieixiQSxiQjtmLmZuLmNzcz1mdW5jdGlvbihhLGMpe2lmKGFyZ3VtZW50cy5sZW5ndGg9PT0yJiZjPT09YilyZXR1cm4gdGhpcztyZXR1cm4gZi5hY2Nlc3ModGhpcyxhLGMsITAsZnVuY3Rpb24oYSxjLGQpe3JldHVybiBkIT09Yj9mLnN0eWxlKGEsYyxkKTpmLmNzcyhhLGMpfSl9LGYuZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGEsYil7aWYoYil7dmFyIGM9YnooYSwib3BhY2l0eSIsIm9wYWNpdHkiKTtyZXR1cm4gYz09PSIiPyIxIjpjfXJldHVybiBhLnN0eWxlLm9wYWNpdHl9fX0sY3NzTnVtYmVyOntmaWxsT3BhY2l0eTohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6Zi5zdXBwb3J0LmNzc0Zsb2F0PyJjc3NGbG9hdCI6InN0eWxlRmxvYXQifSxzdHlsZTpmdW5jdGlvbihhLGMsZCxlKXtpZighIWEmJmEubm9kZVR5cGUhPT0zJiZhLm5vZGVUeXBlIT09OCYmISFhLnN0eWxlKXt2YXIgZyxoLGk9Zi5jYW1lbENhc2UoYyksaj1hLnN0eWxlLGs9Zi5jc3NIb29rc1tpXTtjPWYuY3NzUHJvcHNbaV18fGk7aWYoZD09PWIpe2lmKGsmJiJnZXQiaW4gayYmKGc9ay5nZXQoYSwhMSxlKSkhPT1iKXJldHVybiBnO3JldHVybiBqW2NdfWg9dHlwZW9mIGQsaD09PSJzdHJpbmciJiYoZz1idi5leGVjKGQpKSYmKGQ9KyhnWzFdKzEpKitnWzJdK3BhcnNlRmxvYXQoZi5jc3MoYSxjKSksaD0ibnVtYmVyIik7aWYoZD09bnVsbHx8aD09PSJudW1iZXIiJiZpc05hTihkKSlyZXR1cm47aD09PSJudW1iZXIiJiYhZi5jc3NOdW1iZXJbaV0mJihkKz0icHgiKTtpZigha3x8ISgic2V0ImluIGspfHwoZD1rLnNldChhLGQpKSE9PWIpdHJ5e2pbY109ZH1jYXRjaChsKXt9fX0sY3NzOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxnO2M9Zi5jYW1lbENhc2UoYyksZz1mLmNzc0hvb2tzW2NdLGM9Zi5jc3NQcm9wc1tjXXx8YyxjPT09ImNzc0Zsb2F0IiYmKGM9ImZsb2F0Iik7aWYoZyYmImdldCJpbiBnJiYoZT1nLmdldChhLCEwLGQpKSE9PWIpcmV0dXJuIGU7aWYoYnopcmV0dXJuIGJ6KGEsYyl9LHN3YXA6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXt9O2Zvcih2YXIgZSBpbiBiKWRbZV09YS5zdHlsZVtlXSxhLnN0eWxlW2VdPWJbZV07Yy5jYWxsKGEpO2ZvcihlIGluIGIpYS5zdHlsZVtlXT1kW2VdfX0pLGYuY3VyQ1NTPWYuY3NzLGYuZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oYSxiKXtmLmNzc0hvb2tzW2JdPXtnZXQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlO2lmKGMpe2lmKGEub2Zmc2V0V2lkdGghPT0wKXJldHVybiBiQyhhLGIsZCk7Zi5zd2FwKGEsYncsZnVuY3Rpb24oKXtlPWJDKGEsYixkKX0pO3JldHVybiBlfX0sc2V0OmZ1bmN0aW9uKGEsYil7aWYoIWJ0LnRlc3QoYikpcmV0dXJuIGI7Yj1wYXJzZUZsb2F0KGIpO2lmKGI+PTApcmV0dXJuIGIrInB4In19fSksZi5zdXBwb3J0Lm9wYWNpdHl8fChmLmNzc0hvb2tzLm9wYWNpdHk9e2dldDpmdW5jdGlvbihhLGIpe3JldHVybiBici50ZXN0KChiJiZhLmN1cnJlbnRTdHlsZT9hLmN1cnJlbnRTdHlsZS5maWx0ZXI6YS5zdHlsZS5maWx0ZXIpfHwiIik/cGFyc2VGbG9hdChSZWdFeHAuJDEpLzEwMCsiIjpiPyIxIjoiIn0sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5zdHlsZSxkPWEuY3VycmVudFN0eWxlLGU9Zi5pc051bWVyaWMoYik/ImFscGhhKG9wYWNpdHk9IitiKjEwMCsiKSI6IiIsZz1kJiZkLmZpbHRlcnx8Yy5maWx0ZXJ8fCIiO2Muem9vbT0xO2lmKGI+PTEmJmYudHJpbShnLnJlcGxhY2UoYnEsIiIpKT09PSIiKXtjLnJlbW92ZUF0dHJpYnV0ZSgiZmlsdGVyIik7aWYoZCYmIWQuZmlsdGVyKXJldHVybn1jLmZpbHRlcj1icS50ZXN0KGcpP2cucmVwbGFjZShicSxlKTpnKyIgIitlfX0pLGYoZnVuY3Rpb24oKXtmLnN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodHx8KGYuY3NzSG9va3MubWFyZ2luUmlnaHQ9e2dldDpmdW5jdGlvbihhLGIpe3ZhciBjO2Yuc3dhcChhLHtkaXNwbGF5OiJpbmxpbmUtYmxvY2sifSxmdW5jdGlvbigpe2I/Yz1ieihhLCJtYXJnaW4tcmlnaHQiLCJtYXJnaW5SaWdodCIpOmM9YS5zdHlsZS5tYXJnaW5SaWdodH0pO3JldHVybiBjfX0pfSksYy5kZWZhdWx0VmlldyYmYy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlJiYoYkE9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU7Yj1iLnJlcGxhY2UoYnMsIi0kMSIpLnRvTG93ZXJDYXNlKCksKGQ9YS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KSYmKGU9ZC5nZXRDb21wdXRlZFN0eWxlKGEsbnVsbCkpJiYoYz1lLmdldFByb3BlcnR5VmFsdWUoYiksYz09PSIiJiYhZi5jb250YWlucyhhLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGEpJiYoYz1mLnN0eWxlKGEsYikpKTtyZXR1cm4gY30pLGMuZG9jdW1lbnRFbGVtZW50LmN1cnJlbnRTdHlsZSYmKGJCPWZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9YS5jdXJyZW50U3R5bGUmJmEuY3VycmVudFN0eWxlW2JdLGc9YS5zdHlsZTtmPT09bnVsbCYmZyYmKGU9Z1tiXSkmJihmPWUpLCFidC50ZXN0KGYpJiZidS50ZXN0KGYpJiYoYz1nLmxlZnQsZD1hLnJ1bnRpbWVTdHlsZSYmYS5ydW50aW1lU3R5bGUubGVmdCxkJiYoYS5ydW50aW1lU3R5bGUubGVmdD1hLmN1cnJlbnRTdHlsZS5sZWZ0KSxnLmxlZnQ9Yj09PSJmb250U2l6ZSI/IjFlbSI6Znx8MCxmPWcucGl4ZWxMZWZ0KyJweCIsZy5sZWZ0PWMsZCYmKGEucnVudGltZVN0eWxlLmxlZnQ9ZCkpO3JldHVybiBmPT09IiI/ImF1dG8iOmZ9KSxiej1iQXx8YkIsZi5leHByJiZmLmV4cHIuZmlsdGVycyYmKGYuZXhwci5maWx0ZXJzLmhpZGRlbj1mdW5jdGlvbihhKXt2YXIgYj1hLm9mZnNldFdpZHRoLGM9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGI9PT0wJiZjPT09MHx8IWYuc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHMmJihhLnN0eWxlJiZhLnN0eWxlLmRpc3BsYXl8fGYuY3NzKGEsImRpc3BsYXkiKSk9PT0ibm9uZSJ9LGYuZXhwci5maWx0ZXJzLnZpc2libGU9ZnVuY3Rpb24oYSl7cmV0dXJuIWYuZXhwci5maWx0ZXJzLmhpZGRlbihhKX0pO3ZhciBiRD0vJTIwL2csYkU9L1xbXF0kLyxiRj0vXHI/XG4vZyxiRz0vIy4qJC8sYkg9L14oLio/KTpbIFx0XSooW15cclxuXSopXHI/JC9tZyxiST0vXig/OmNvbG9yfGRhdGV8ZGF0ZXRpbWV8ZGF0ZXRpbWUtbG9jYWx8ZW1haWx8aGlkZGVufG1vbnRofG51bWJlcnxwYXNzd29yZHxyYW5nZXxzZWFyY2h8dGVsfHRleHR8dGltZXx1cmx8d2VlaykkL2ksYko9L14oPzphYm91dHxhcHB8YXBwXC1zdG9yYWdlfC4rXC1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxiSz0vXig/OkdFVHxIRUFEKSQvLGJMPS9eXC9cLy8sYk09L1w/LyxiTj0vPHNjcmlwdFxiW148XSooPzooPyE8XC9zY3JpcHQ+KTxbXjxdKikqPFwvc2NyaXB0Pi9naSxiTz0vXig/OnNlbGVjdHx0ZXh0YXJlYSkvaSxiUD0vXHMrLyxiUT0vKFs/Jl0pXz1bXiZdKi8sYlI9L14oW1x3XCtcLlwtXSs6KSg/OlwvXC8oW15cLz8jOl0qKSg/OjooXGQrKSk/KT8vLGJTPWYuZm4ubG9hZCxiVD17fSxiVT17fSxiVixiVyxiWD1bIiovIl0rWyIqIl07dHJ5e2JWPWUuaHJlZn1jYXRjaChiWSl7YlY9Yy5jcmVhdGVFbGVtZW50KCJhIiksYlYuaHJlZj0iIixiVj1iVi5ocmVmfWJXPWJSLmV4ZWMoYlYudG9Mb3dlckNhc2UoKSl8fFtdLGYuZm4uZXh0ZW5kKHtsb2FkOmZ1bmN0aW9uKGEsYyxkKXtpZih0eXBlb2YgYSE9InN0cmluZyImJmJTKXJldHVybiBiUy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYoIXRoaXMubGVuZ3RoKXJldHVybiB0aGlzO3ZhciBlPWEuaW5kZXhPZigiICIpO2lmKGU+PTApe3ZhciBnPWEuc2xpY2UoZSxhLmxlbmd0aCk7YT1hLnNsaWNlKDAsZSl9dmFyIGg9IkdFVCI7YyYmKGYuaXNGdW5jdGlvbihjKT8oZD1jLGM9Yik6dHlwZW9mIGM9PSJvYmplY3QiJiYoYz1mLnBhcmFtKGMsZi5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpLGg9IlBPU1QiKSk7dmFyIGk9dGhpcztmLmFqYXgoe3VybDphLHR5cGU6aCxkYXRhVHlwZToiaHRtbCIsZGF0YTpjLGNvbXBsZXRlOmZ1bmN0aW9uKGEsYixjKXtjPWEucmVzcG9uc2VUZXh0LGEuaXNSZXNvbHZlZCgpJiYoYS5kb25lKGZ1bmN0aW9uKGEpe2M9YX0pLGkuaHRtbChnP2YoIjxkaXY+IikuYXBwZW5kKGMucmVwbGFjZShiTiwiIikpLmZpbmQoZyk6YykpLGQmJmkuZWFjaChkLFtjLGIsYV0pfX0pO3JldHVybiB0aGlzfSxzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gZi5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnRzP2YubWFrZUFycmF5KHRoaXMuZWxlbWVudHMpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lJiYhdGhpcy5kaXNhYmxlZCYmKHRoaXMuY2hlY2tlZHx8Yk8udGVzdCh0aGlzLm5vZGVOYW1lKXx8YkkudGVzdCh0aGlzLnR5cGUpKX0pLm1hcChmdW5jdGlvbihhLGIpe3ZhciBjPWYodGhpcykudmFsKCk7cmV0dXJuIGM9PW51bGw/bnVsbDpmLmlzQXJyYXkoYyk/Zi5tYXAoYyxmdW5jdGlvbihhLGMpe3JldHVybntuYW1lOmIubmFtZSx2YWx1ZTphLnJlcGxhY2UoYkYsIlxyXG4iKX19KTp7bmFtZTpiLm5hbWUsdmFsdWU6Yy5yZXBsYWNlKGJGLCJcclxuIil9fSkuZ2V0KCl9fSksZi5lYWNoKCJhamF4U3RhcnQgYWpheFN0b3AgYWpheENvbXBsZXRlIGFqYXhFcnJvciBhamF4U3VjY2VzcyBhamF4U2VuZCIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe2YuZm5bYl09ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMub24oYixhKX19KSxmLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oYSxjKXtmW2NdPWZ1bmN0aW9uKGEsZCxlLGcpe2YuaXNGdW5jdGlvbihkKSYmKGc9Z3x8ZSxlPWQsZD1iKTtyZXR1cm4gZi5hamF4KHt0eXBlOmMsdXJsOmEsZGF0YTpkLHN1Y2Nlc3M6ZSxkYXRhVHlwZTpnfSl9fSksZi5leHRlbmQoe2dldFNjcmlwdDpmdW5jdGlvbihhLGMpe3JldHVybiBmLmdldChhLGIsYywic2NyaXB0Iil9LGdldEpTT046ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmdldChhLGIsYywianNvbiIpfSxhamF4U2V0dXA6ZnVuY3Rpb24oYSxiKXtiP2JfKGEsZi5hamF4U2V0dGluZ3MpOihiPWEsYT1mLmFqYXhTZXR0aW5ncyksYl8oYSxiKTtyZXR1cm4gYX0sYWpheFNldHRpbmdzOnt1cmw6YlYsaXNMb2NhbDpiSi50ZXN0KGJXWzFdKSxnbG9iYWw6ITAsdHlwZToiR0VUIixjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIixwcm9jZXNzRGF0YTohMCxhc3luYzohMCxhY2NlcHRzOnt4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGh0bWw6InRleHQvaHRtbCIsdGV4dDoidGV4dC9wbGFpbiIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0IiwiKiI6Ylh9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjphLlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpmLnBhcnNlSlNPTiwidGV4dCB4bWwiOmYucGFyc2VYTUx9LGZsYXRPcHRpb25zOntjb250ZXh0OiEwLHVybDohMH19LGFqYXhQcmVmaWx0ZXI6YlooYlQpLGFqYXhUcmFuc3BvcnQ6YlooYlUpLGFqYXg6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiB3KGEsYyxsLG0pe2lmKHMhPT0yKXtzPTIscSYmY2xlYXJUaW1lb3V0KHEpLHA9YixuPW18fCIiLHYucmVhZHlTdGF0ZT1hPjA/NDowO3ZhciBvLHIsdSx3PWMseD1sP2NiKGQsdixsKTpiLHksejtpZihhPj0yMDAmJmE8MzAwfHxhPT09MzA0KXtpZihkLmlmTW9kaWZpZWQpe2lmKHk9di5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpKWYubGFzdE1vZGlmaWVkW2tdPXk7aWYoej12LmdldFJlc3BvbnNlSGVhZGVyKCJFdGFnIikpZi5ldGFnW2tdPXp9aWYoYT09PTMwNCl3PSJub3Rtb2RpZmllZCIsbz0hMDtlbHNlIHRyeXtyPWNjKGQseCksdz0ic3VjY2VzcyIsbz0hMH1jYXRjaChBKXt3PSJwYXJzZXJlcnJvciIsdT1BfX1lbHNle3U9dztpZighd3x8YSl3PSJlcnJvciIsYTwwJiYoYT0wKX12LnN0YXR1cz1hLHYuc3RhdHVzVGV4dD0iIisoY3x8dyksbz9oLnJlc29sdmVXaXRoKGUsW3Isdyx2XSk6aC5yZWplY3RXaXRoKGUsW3Ysdyx1XSksdi5zdGF0dXNDb2RlKGopLGo9Yix0JiZnLnRyaWdnZXIoImFqYXgiKyhvPyJTdWNjZXNzIjoiRXJyb3IiKSxbdixkLG8/cjp1XSksaS5maXJlV2l0aChlLFt2LHddKSx0JiYoZy50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFt2LGRdKSwtLWYuYWN0aXZlfHxmLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpfX10eXBlb2YgYT09Im9iamVjdCImJihjPWEsYT1iKSxjPWN8fHt9O3ZhciBkPWYuYWpheFNldHVwKHt9LGMpLGU9ZC5jb250ZXh0fHxkLGc9ZSE9PWQmJihlLm5vZGVUeXBlfHxlIGluc3RhbmNlb2YgZik/ZihlKTpmLmV2ZW50LGg9Zi5EZWZlcnJlZCgpLGk9Zi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iiksaj1kLnN0YXR1c0NvZGV8fHt9LGssbD17fSxtPXt9LG4sbyxwLHEscixzPTAsdCx1LHY9e3JlYWR5U3RhdGU6MCxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7aWYoIXMpe3ZhciBjPWEudG9Mb3dlckNhc2UoKTthPW1bY109bVtjXXx8YSxsW2FdPWJ9cmV0dXJuIHRoaXN9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBzPT09Mj9uOm51bGx9LGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGEpe3ZhciBjO2lmKHM9PT0yKXtpZighbyl7bz17fTt3aGlsZShjPWJILmV4ZWMobikpb1tjWzFdLnRvTG93ZXJDYXNlKCldPWNbMl19Yz1vW2EudG9Mb3dlckNhc2UoKV19cmV0dXJuIGM9PT1iP251bGw6Y30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihhKXtzfHwoZC5taW1lVHlwZT1hKTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oYSl7YT1hfHwiYWJvcnQiLHAmJnAuYWJvcnQoYSksdygwLGEpO3JldHVybiB0aGlzfX07aC5wcm9taXNlKHYpLHYuc3VjY2Vzcz12LmRvbmUsdi5lcnJvcj12LmZhaWwsdi5jb21wbGV0ZT1pLmFkZCx2LnN0YXR1c0NvZGU9ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI7aWYoczwyKWZvcihiIGluIGEpaltiXT1baltiXSxhW2JdXTtlbHNlIGI9YVt2LnN0YXR1c10sdi50aGVuKGIsYil9cmV0dXJuIHRoaXN9LGQudXJsPSgoYXx8ZC51cmwpKyIiKS5yZXBsYWNlKGJHLCIiKS5yZXBsYWNlKGJMLGJXWzFdKyIvLyIpLGQuZGF0YVR5cGVzPWYudHJpbShkLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkuc3BsaXQoYlApLGQuY3Jvc3NEb21haW49PW51bGwmJihyPWJSLmV4ZWMoZC51cmwudG9Mb3dlckNhc2UoKSksZC5jcm9zc0RvbWFpbj0hKCFyfHxyWzFdPT1iV1sxXSYmclsyXT09YldbMl0mJihyWzNdfHwoclsxXT09PSJodHRwOiI/ODA6NDQzKSk9PShiV1szXXx8KGJXWzFdPT09Imh0dHA6Ij84MDo0NDMpKSkpLGQuZGF0YSYmZC5wcm9jZXNzRGF0YSYmdHlwZW9mIGQuZGF0YSE9InN0cmluZyImJihkLmRhdGE9Zi5wYXJhbShkLmRhdGEsZC50cmFkaXRpb25hbCkpLGIkKGJULGQsYyx2KTtpZihzPT09MilyZXR1cm4hMTt0PWQuZ2xvYmFsLGQudHlwZT1kLnR5cGUudG9VcHBlckNhc2UoKSxkLmhhc0NvbnRlbnQ9IWJLLnRlc3QoZC50eXBlKSx0JiZmLmFjdGl2ZSsrPT09MCYmZi5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKTtpZighZC5oYXNDb250ZW50KXtkLmRhdGEmJihkLnVybCs9KGJNLnRlc3QoZC51cmwpPyImIjoiPyIpK2QuZGF0YSxkZWxldGUgZC5kYXRhKSxrPWQudXJsO2lmKGQuY2FjaGU9PT0hMSl7dmFyIHg9Zi5ub3coKSx5PWQudXJsLnJlcGxhY2UoYlEsIiQxXz0iK3gpO2QudXJsPXkrKHk9PT1kLnVybD8oYk0udGVzdChkLnVybCk/IiYiOiI/IikrIl89Iit4OiIiKX19KGQuZGF0YSYmZC5oYXNDb250ZW50JiZkLmNvbnRlbnRUeXBlIT09ITF8fGMuY29udGVudFR5cGUpJiZ2LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsZC5jb250ZW50VHlwZSksZC5pZk1vZGlmaWVkJiYoaz1rfHxkLnVybCxmLmxhc3RNb2RpZmllZFtrXSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsZi5sYXN0TW9kaWZpZWRba10pLGYuZXRhZ1trXSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixmLmV0YWdba10pKSx2LnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsZC5kYXRhVHlwZXNbMF0mJmQuYWNjZXB0c1tkLmRhdGFUeXBlc1swXV0/ZC5hY2NlcHRzW2QuZGF0YVR5cGVzWzBdXSsoZC5kYXRhVHlwZXNbMF0hPT0iKiI/IiwgIitiWCsiOyBxPTAuMDEiOiIiKTpkLmFjY2VwdHNbIioiXSk7Zm9yKHUgaW4gZC5oZWFkZXJzKXYuc2V0UmVxdWVzdEhlYWRlcih1LGQuaGVhZGVyc1t1XSk7aWYoZC5iZWZvcmVTZW5kJiYoZC5iZWZvcmVTZW5kLmNhbGwoZSx2LGQpPT09ITF8fHM9PT0yKSl7di5hYm9ydCgpO3JldHVybiExfWZvcih1IGlue3N1Y2Nlc3M6MSxlcnJvcjoxLGNvbXBsZXRlOjF9KXZbdV0oZFt1XSk7cD1iJChiVSxkLGMsdik7aWYoIXApdygtMSwiTm8gVHJhbnNwb3J0Iik7ZWxzZXt2LnJlYWR5U3RhdGU9MSx0JiZnLnRyaWdnZXIoImFqYXhTZW5kIixbdixkXSksZC5hc3luYyYmZC50aW1lb3V0PjAmJihxPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2LmFib3J0KCJ0aW1lb3V0Iil9LGQudGltZW91dCkpO3RyeXtzPTEscC5zZW5kKGwsdyl9Y2F0Y2goeil7aWYoczwyKXcoLTEseik7ZWxzZSB0aHJvdyB6fX1yZXR1cm4gdn0scGFyYW06ZnVuY3Rpb24oYSxjKXt2YXIgZD1bXSxlPWZ1bmN0aW9uKGEsYil7Yj1mLmlzRnVuY3Rpb24oYik/YigpOmIsZFtkLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGEpKyI9IitlbmNvZGVVUklDb21wb25lbnQoYil9O2M9PT1iJiYoYz1mLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCk7aWYoZi5pc0FycmF5KGEpfHxhLmpxdWVyeSYmIWYuaXNQbGFpbk9iamVjdChhKSlmLmVhY2goYSxmdW5jdGlvbigpe2UodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IodmFyIGcgaW4gYSljYShnLGFbZ10sYyxlKTtyZXR1cm4gZC5qb2luKCImIikucmVwbGFjZShiRCwiKyIpfX0pLGYuZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fX0pO3ZhciBjZD1mLm5vdygpLGNlPS8oXD0pXD8oJnwkKXxcP1w/L2k7Zi5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3JldHVybiBmLmV4cGFuZG8rIl8iK2NkKyt9fSksZi5hamF4UHJlZmlsdGVyKCJqc29uIGpzb25wIixmdW5jdGlvbihiLGMsZCl7dmFyIGU9Yi5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiJiZ0eXBlb2YgYi5kYXRhPT0ic3RyaW5nIjtpZihiLmRhdGFUeXBlc1swXT09PSJqc29ucCJ8fGIuanNvbnAhPT0hMSYmKGNlLnRlc3QoYi51cmwpfHxlJiZjZS50ZXN0KGIuZGF0YSkpKXt2YXIgZyxoPWIuanNvbnBDYWxsYmFjaz1mLmlzRnVuY3Rpb24oYi5qc29ucENhbGxiYWNrKT9iLmpzb25wQ2FsbGJhY2soKTpiLmpzb25wQ2FsbGJhY2ssaT1hW2hdLGo9Yi51cmwsaz1iLmRhdGEsbD0iJDEiK2grIiQyIjtiLmpzb25wIT09ITEmJihqPWoucmVwbGFjZShjZSxsKSxiLnVybD09PWomJihlJiYoaz1rLnJlcGxhY2UoY2UsbCkpLGIuZGF0YT09PWsmJihqKz0oL1w/Ly50ZXN0KGopPyImIjoiPyIpK2IuanNvbnArIj0iK2gpKSksYi51cmw9aixiLmRhdGE9ayxhW2hdPWZ1bmN0aW9uKGEpe2c9W2FdfSxkLmFsd2F5cyhmdW5jdGlvbigpe2FbaF09aSxnJiZmLmlzRnVuY3Rpb24oaSkmJmFbaF0oZ1swXSl9KSxiLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtnfHxmLmVycm9yKGgrIiB3YXMgbm90IGNhbGxlZCIpO3JldHVybiBnWzBdfSxiLmRhdGFUeXBlc1swXT0ianNvbiI7cmV0dXJuInNjcmlwdCJ9fSksZi5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9qYXZhc2NyaXB0fGVjbWFzY3JpcHQvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGEpe2YuZ2xvYmFsRXZhbChhKTtyZXR1cm4gYX19fSksZi5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGEpe2EuY2FjaGU9PT1iJiYoYS5jYWNoZT0hMSksYS5jcm9zc0RvbWFpbiYmKGEudHlwZT0iR0VUIixhLmdsb2JhbD0hMSl9KSxmLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24oYSl7aWYoYS5jcm9zc0RvbWFpbil7dmFyIGQsZT1jLmhlYWR8fGMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXXx8Yy5kb2N1bWVudEVsZW1lbnQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZixnKXtkPWMuY3JlYXRlRWxlbWVudCgic2NyaXB0IiksZC5hc3luYz0iYXN5bmMiLGEuc2NyaXB0Q2hhcnNldCYmKGQuY2hhcnNldD1hLnNjcmlwdENoYXJzZXQpLGQuc3JjPWEudXJsLGQub25sb2FkPWQub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGEsYyl7aWYoY3x8IWQucmVhZHlTdGF0ZXx8L2xvYWRlZHxjb21wbGV0ZS8udGVzdChkLnJlYWR5U3RhdGUpKWQub25sb2FkPWQub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsZSYmZC5wYXJlbnROb2RlJiZlLnJlbW92ZUNoaWxkKGQpLGQ9YixjfHxnKDIwMCwic3VjY2VzcyIpfSxlLmluc2VydEJlZm9yZShkLGUuZmlyc3RDaGlsZCl9LGFib3J0OmZ1bmN0aW9uKCl7ZCYmZC5vbmxvYWQoMCwxKX19fX0pO3ZhciBjZj1hLkFjdGl2ZVhPYmplY3Q/ZnVuY3Rpb24oKXtmb3IodmFyIGEgaW4gY2gpY2hbYV0oMCwxKX06ITEsY2c9MCxjaDtmLmFqYXhTZXR0aW5ncy54aHI9YS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNMb2NhbCYmY2koKXx8Y2ooKX06Y2ksZnVuY3Rpb24oYSl7Zi5leHRlbmQoZi5zdXBwb3J0LHthamF4OiEhYSxjb3JzOiEhYSYmIndpdGhDcmVkZW50aWFscyJpbiBhfSl9KGYuYWpheFNldHRpbmdzLnhocigpKSxmLnN1cHBvcnQuYWpheCYmZi5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGMpe2lmKCFjLmNyb3NzRG9tYWlufHxmLnN1cHBvcnQuY29ycyl7dmFyIGQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZSxnKXt2YXIgaD1jLnhocigpLGksajtjLnVzZXJuYW1lP2gub3BlbihjLnR5cGUsYy51cmwsYy5hc3luYyxjLnVzZXJuYW1lLGMucGFzc3dvcmQpOmgub3BlbihjLnR5cGUsYy51cmwsYy5hc3luYyk7aWYoYy54aHJGaWVsZHMpZm9yKGogaW4gYy54aHJGaWVsZHMpaFtqXT1jLnhockZpZWxkc1tqXTtjLm1pbWVUeXBlJiZoLm92ZXJyaWRlTWltZVR5cGUmJmgub3ZlcnJpZGVNaW1lVHlwZShjLm1pbWVUeXBlKSwhYy5jcm9zc0RvbWFpbiYmIWVbIlgtUmVxdWVzdGVkLVdpdGgiXSYmKGVbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTt0cnl7Zm9yKGogaW4gZSloLnNldFJlcXVlc3RIZWFkZXIoaixlW2pdKX1jYXRjaChrKXt9aC5zZW5kKGMuaGFzQ29udGVudCYmYy5kYXRhfHxudWxsKSxkPWZ1bmN0aW9uKGEsZSl7dmFyIGosayxsLG0sbjt0cnl7aWYoZCYmKGV8fGgucmVhZHlTdGF0ZT09PTQpKXtkPWIsaSYmKGgub25yZWFkeXN0YXRlY2hhbmdlPWYubm9vcCxjZiYmZGVsZXRlIGNoW2ldKTtpZihlKWgucmVhZHlTdGF0ZSE9PTQmJmguYWJvcnQoKTtlbHNle2o9aC5zdGF0dXMsbD1oLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLG09e30sbj1oLnJlc3BvbnNlWE1MLG4mJm4uZG9jdW1lbnRFbGVtZW50JiYobS54bWw9biksbS50ZXh0PWgucmVzcG9uc2VUZXh0O3RyeXtrPWguc3RhdHVzVGV4dH1jYXRjaChvKXtrPSIifSFqJiZjLmlzTG9jYWwmJiFjLmNyb3NzRG9tYWluP2o9bS50ZXh0PzIwMDo0MDQ6aj09PTEyMjMmJihqPTIwNCl9fX1jYXRjaChwKXtlfHxnKC0xLHApfW0mJmcoaixrLG0sbCl9LCFjLmFzeW5jfHxoLnJlYWR5U3RhdGU9PT00P2QoKTooaT0rK2NnLGNmJiYoY2h8fChjaD17fSxmKGEpLnVubG9hZChjZikpLGNoW2ldPWQpLGgub25yZWFkeXN0YXRlY2hhbmdlPWQpfSxhYm9ydDpmdW5jdGlvbigpe2QmJmQoMCwxKX19fX0pO3ZhciBjaz17fSxjbCxjbSxjbj0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sY289L14oWytcLV09KT8oW1xkKy5cLV0rKShbYS16JV0qKSQvaSxjcCxjcT1bWyJoZWlnaHQiLCJtYXJnaW5Ub3AiLCJtYXJnaW5Cb3R0b20iLCJwYWRkaW5nVG9wIiwicGFkZGluZ0JvdHRvbSJdLFsid2lkdGgiLCJtYXJnaW5MZWZ0IiwibWFyZ2luUmlnaHQiLCJwYWRkaW5nTGVmdCIsInBhZGRpbmdSaWdodCJdLFsib3BhY2l0eSJdXSxjcjtmLmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhfHxhPT09MClyZXR1cm4gdGhpcy5hbmltYXRlKGN1KCJzaG93IiwzKSxhLGIsYyk7Zm9yKHZhciBnPTAsaD10aGlzLmxlbmd0aDtnPGg7ZysrKWQ9dGhpc1tnXSxkLnN0eWxlJiYoZT1kLnN0eWxlLmRpc3BsYXksIWYuX2RhdGEoZCwib2xkZGlzcGxheSIpJiZlPT09Im5vbmUiJiYoZT1kLnN0eWxlLmRpc3BsYXk9IiIpLGU9PT0iIiYmZi5jc3MoZCwiZGlzcGxheSIpPT09Im5vbmUiJiZmLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGN2KGQubm9kZU5hbWUpKSk7Zm9yKGc9MDtnPGg7ZysrKXtkPXRoaXNbZ107aWYoZC5zdHlsZSl7ZT1kLnN0eWxlLmRpc3BsYXk7aWYoZT09PSIifHxlPT09Im5vbmUiKWQuc3R5bGUuZGlzcGxheT1mLl9kYXRhKGQsIm9sZGRpc3BsYXkiKXx8IiJ9fXJldHVybiB0aGlzfSxoaWRlOmZ1bmN0aW9uKGEsYixjKXtpZihhfHxhPT09MClyZXR1cm4gdGhpcy5hbmltYXRlKGN1KCJoaWRlIiwzKSxhLGIsYyk7dmFyIGQsZSxnPTAsaD10aGlzLmxlbmd0aDtmb3IoO2c8aDtnKyspZD10aGlzW2ddLGQuc3R5bGUmJihlPWYuY3NzKGQsImRpc3BsYXkiKSxlIT09Im5vbmUiJiYhZi5fZGF0YShkLCJvbGRkaXNwbGF5IikmJmYuX2RhdGEoZCwib2xkZGlzcGxheSIsZSkpO2ZvcihnPTA7ZzxoO2crKyl0aGlzW2ddLnN0eWxlJiYodGhpc1tnXS5zdHlsZS5kaXNwbGF5PSJub25lIik7cmV0dXJuIHRoaXN9LF90b2dnbGU6Zi5mbi50b2dnbGUsdG9nZ2xlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10eXBlb2YgYT09ImJvb2xlYW4iO2YuaXNGdW5jdGlvbihhKSYmZi5pc0Z1bmN0aW9uKGIpP3RoaXMuX3RvZ2dsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6YT09bnVsbHx8ZD90aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1kP2E6Zih0aGlzKS5pcygiOmhpZGRlbiIpO2YodGhpcylbYj8ic2hvdyI6ImhpZGUiXSgpfSk6dGhpcy5hbmltYXRlKGN1KCJ0b2dnbGUiLDMpLGEsYixjKTtyZXR1cm4gdGhpc30sZmFkZVRvOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmZpbHRlcigiOmhpZGRlbiIpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6Yn0sYSxjLGQpfSxhbmltYXRlOmZ1bmN0aW9uKGEsYixjLGQpe2Z1bmN0aW9uIGcoKXtlLnF1ZXVlPT09ITEmJmYuX21hcmsodGhpcyk7dmFyIGI9Zi5leHRlbmQoe30sZSksYz10aGlzLm5vZGVUeXBlPT09MSxkPWMmJmYodGhpcykuaXMoIjpoaWRkZW4iKSxnLGgsaSxqLGssbCxtLG4sbztiLmFuaW1hdGVkUHJvcGVydGllcz17fTtmb3IoaSBpbiBhKXtnPWYuY2FtZWxDYXNlKGkpLGkhPT1nJiYoYVtnXT1hW2ldLGRlbGV0ZSBhW2ldKSxoPWFbZ10sZi5pc0FycmF5KGgpPyhiLmFuaW1hdGVkUHJvcGVydGllc1tnXT1oWzFdLGg9YVtnXT1oWzBdKTpiLmFuaW1hdGVkUHJvcGVydGllc1tnXT1iLnNwZWNpYWxFYXNpbmcmJmIuc3BlY2lhbEVhc2luZ1tnXXx8Yi5lYXNpbmd8fCJzd2luZyI7aWYoaD09PSJoaWRlIiYmZHx8aD09PSJzaG93IiYmIWQpcmV0dXJuIGIuY29tcGxldGUuY2FsbCh0aGlzKTtjJiYoZz09PSJoZWlnaHQifHxnPT09IndpZHRoIikmJihiLm92ZXJmbG93PVt0aGlzLnN0eWxlLm92ZXJmbG93LHRoaXMuc3R5bGUub3ZlcmZsb3dYLHRoaXMuc3R5bGUub3ZlcmZsb3dZXSxmLmNzcyh0aGlzLCJkaXNwbGF5Iik9PT0iaW5saW5lIiYmZi5jc3ModGhpcywiZmxvYXQiKT09PSJub25lIiYmKCFmLnN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dHx8Y3YodGhpcy5ub2RlTmFtZSk9PT0iaW5saW5lIj90aGlzLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayI6dGhpcy5zdHlsZS56b29tPTEpKX1iLm92ZXJmbG93IT1udWxsJiYodGhpcy5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIik7Zm9yKGkgaW4gYSlqPW5ldyBmLmZ4KHRoaXMsYixpKSxoPWFbaV0sY24udGVzdChoKT8obz1mLl9kYXRhKHRoaXMsInRvZ2dsZSIraSl8fChoPT09InRvZ2dsZSI/ZD8ic2hvdyI6ImhpZGUiOjApLG8/KGYuX2RhdGEodGhpcywidG9nZ2xlIitpLG89PT0ic2hvdyI/ImhpZGUiOiJzaG93IiksaltvXSgpKTpqW2hdKCkpOihrPWNvLmV4ZWMoaCksbD1qLmN1cigpLGs/KG09cGFyc2VGbG9hdChrWzJdKSxuPWtbM118fChmLmNzc051bWJlcltpXT8iIjoicHgiKSxuIT09InB4IiYmKGYuc3R5bGUodGhpcyxpLChtfHwxKStuKSxsPShtfHwxKS9qLmN1cigpKmwsZi5zdHlsZSh0aGlzLGksbCtuKSksa1sxXSYmKG09KGtbMV09PT0iLT0iPy0xOjEpKm0rbCksai5jdXN0b20obCxtLG4pKTpqLmN1c3RvbShsLGgsIiIpKTtyZXR1cm4hMH12YXIgZT1mLnNwZWVkKGIsYyxkKTtpZihmLmlzRW1wdHlPYmplY3QoYSkpcmV0dXJuIHRoaXMuZWFjaChlLmNvbXBsZXRlLFshMV0pO2E9Zi5leHRlbmQoe30sYSk7cmV0dXJuIGUucXVldWU9PT0hMT90aGlzLmVhY2goZyk6dGhpcy5xdWV1ZShlLnF1ZXVlLGcpfSxzdG9wOmZ1bmN0aW9uKGEsYyxkKXt0eXBlb2YgYSE9InN0cmluZyImJihkPWMsYz1hLGE9YiksYyYmYSE9PSExJiZ0aGlzLnF1ZXVlKGF8fCJmeCIsW10pO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmdW5jdGlvbiBoKGEsYixjKXt2YXIgZT1iW2NdO2YucmVtb3ZlRGF0YShhLGMsITApLGUuc3RvcChkKX12YXIgYixjPSExLGU9Zi50aW1lcnMsZz1mLl9kYXRhKHRoaXMpO2R8fGYuX3VubWFyayghMCx0aGlzKTtpZihhPT1udWxsKWZvcihiIGluIGcpZ1tiXSYmZ1tiXS5zdG9wJiZiLmluZGV4T2YoIi5ydW4iKT09PWIubGVuZ3RoLTQmJmgodGhpcyxnLGIpO2Vsc2UgZ1tiPWErIi5ydW4iXSYmZ1tiXS5zdG9wJiZoKHRoaXMsZyxiKTtmb3IoYj1lLmxlbmd0aDtiLS07KWVbYl0uZWxlbT09PXRoaXMmJihhPT1udWxsfHxlW2JdLnF1ZXVlPT09YSkmJihkP2VbYl0oITApOmVbYl0uc2F2ZVN0YXRlKCksYz0hMCxlLnNwbGljZShiLDEpKTsoIWR8fCFjKSYmZi5kZXF1ZXVlKHRoaXMsYSl9KX19KSxmLmVhY2goe3NsaWRlRG93bjpjdSgic2hvdyIsMSksc2xpZGVVcDpjdSgiaGlkZSIsMSksc2xpZGVUb2dnbGU6Y3UoInRvZ2dsZSIsMSksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihhLGIpe2YuZm5bYV09ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB0aGlzLmFuaW1hdGUoYixhLGMsZCl9fSksZi5leHRlbmQoe3NwZWVkOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hJiZ0eXBlb2YgYT09Im9iamVjdCI/Zi5leHRlbmQoe30sYSk6e2NvbXBsZXRlOmN8fCFjJiZifHxmLmlzRnVuY3Rpb24oYSkmJmEsZHVyYXRpb246YSxlYXNpbmc6YyYmYnx8YiYmIWYuaXNGdW5jdGlvbihiKSYmYn07ZC5kdXJhdGlvbj1mLmZ4Lm9mZj8wOnR5cGVvZiBkLmR1cmF0aW9uPT0ibnVtYmVyIj9kLmR1cmF0aW9uOmQuZHVyYXRpb24gaW4gZi5meC5zcGVlZHM/Zi5meC5zcGVlZHNbZC5kdXJhdGlvbl06Zi5meC5zcGVlZHMuX2RlZmF1bHQ7aWYoZC5xdWV1ZT09bnVsbHx8ZC5xdWV1ZT09PSEwKWQucXVldWU9ImZ4IjtkLm9sZD1kLmNvbXBsZXRlLGQuY29tcGxldGU9ZnVuY3Rpb24oYSl7Zi5pc0Z1bmN0aW9uKGQub2xkKSYmZC5vbGQuY2FsbCh0aGlzKSxkLnF1ZXVlP2YuZGVxdWV1ZSh0aGlzLGQucXVldWUpOmEhPT0hMSYmZi5fdW5tYXJrKHRoaXMpfTtyZXR1cm4gZH0sZWFzaW5nOntsaW5lYXI6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGMrZCphfSxzd2luZzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4oLU1hdGguY29zKGEqTWF0aC5QSSkvMisuNSkqZCtjfX0sdGltZXJzOltdLGZ4OmZ1bmN0aW9uKGEsYixjKXt0aGlzLm9wdGlvbnM9Yix0aGlzLmVsZW09YSx0aGlzLnByb3A9YyxiLm9yaWc9Yi5vcmlnfHx7fX19KSxmLmZ4LnByb3RvdHlwZT17dXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLChmLmZ4LnN0ZXBbdGhpcy5wcm9wXXx8Zi5meC5zdGVwLl9kZWZhdWx0KSh0aGlzKX0sY3VyOmZ1bmN0aW9uKCl7aWYodGhpcy5lbGVtW3RoaXMucHJvcF0hPW51bGwmJighdGhpcy5lbGVtLnN0eWxlfHx0aGlzLmVsZW0uc3R5bGVbdGhpcy5wcm9wXT09bnVsbCkpcmV0dXJuIHRoaXMuZWxlbVt0aGlzLnByb3BdO3ZhciBhLGI9Zi5jc3ModGhpcy5lbGVtLHRoaXMucHJvcCk7cmV0dXJuIGlzTmFOKGE9cGFyc2VGbG9hdChiKSk/IWJ8fGI9PT0iYXV0byI/MDpiOmF9LGN1c3RvbTpmdW5jdGlvbihhLGMsZCl7ZnVuY3Rpb24gaChhKXtyZXR1cm4gZS5zdGVwKGEpfXZhciBlPXRoaXMsZz1mLmZ4O3RoaXMuc3RhcnRUaW1lPWNyfHxjcygpLHRoaXMuZW5kPWMsdGhpcy5ub3c9dGhpcy5zdGFydD1hLHRoaXMucG9zPXRoaXMuc3RhdGU9MCx0aGlzLnVuaXQ9ZHx8dGhpcy51bml0fHwoZi5jc3NOdW1iZXJbdGhpcy5wcm9wXT8iIjoicHgiKSxoLnF1ZXVlPXRoaXMub3B0aW9ucy5xdWV1ZSxoLmVsZW09dGhpcy5lbGVtLGguc2F2ZVN0YXRlPWZ1bmN0aW9uKCl7ZS5vcHRpb25zLmhpZGUmJmYuX2RhdGEoZS5lbGVtLCJmeHNob3ciK2UucHJvcCk9PT1iJiZmLl9kYXRhKGUuZWxlbSwiZnhzaG93IitlLnByb3AsZS5zdGFydCl9LGgoKSYmZi50aW1lcnMucHVzaChoKSYmIWNwJiYoY3A9c2V0SW50ZXJ2YWwoZy50aWNrLGcuaW50ZXJ2YWwpKX0sc2hvdzpmdW5jdGlvbigpe3ZhciBhPWYuX2RhdGEodGhpcy5lbGVtLCJmeHNob3ciK3RoaXMucHJvcCk7dGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXT1hfHxmLnN0eWxlKHRoaXMuZWxlbSx0aGlzLnByb3ApLHRoaXMub3B0aW9ucy5zaG93PSEwLGEhPT1iP3RoaXMuY3VzdG9tKHRoaXMuY3VyKCksYSk6dGhpcy5jdXN0b20odGhpcy5wcm9wPT09IndpZHRoInx8dGhpcy5wcm9wPT09ImhlaWdodCI/MTowLHRoaXMuY3VyKCkpLGYodGhpcy5lbGVtKS5zaG93KCl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdPWYuX2RhdGEodGhpcy5lbGVtLCJmeHNob3ciK3RoaXMucHJvcCl8fGYuc3R5bGUodGhpcy5lbGVtLHRoaXMucHJvcCksdGhpcy5vcHRpb25zLmhpZGU9ITAsdGhpcy5jdXN0b20odGhpcy5jdXIoKSwwKX0sc3RlcDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZT1jcnx8Y3MoKSxnPSEwLGg9dGhpcy5lbGVtLGk9dGhpcy5vcHRpb25zO2lmKGF8fGU+PWkuZHVyYXRpb24rdGhpcy5zdGFydFRpbWUpe3RoaXMubm93PXRoaXMuZW5kLHRoaXMucG9zPXRoaXMuc3RhdGU9MSx0aGlzLnVwZGF0ZSgpLGkuYW5pbWF0ZWRQcm9wZXJ0aWVzW3RoaXMucHJvcF09ITA7Zm9yKGIgaW4gaS5hbmltYXRlZFByb3BlcnRpZXMpaS5hbmltYXRlZFByb3BlcnRpZXNbYl0hPT0hMCYmKGc9ITEpO2lmKGcpe2kub3ZlcmZsb3chPW51bGwmJiFmLnN1cHBvcnQuc2hyaW5rV3JhcEJsb2NrcyYmZi5lYWNoKFsiIiwiWCIsIlkiXSxmdW5jdGlvbihhLGIpe2guc3R5bGVbIm92ZXJmbG93IitiXT1pLm92ZXJmbG93W2FdfSksaS5oaWRlJiZmKGgpLmhpZGUoKTtpZihpLmhpZGV8fGkuc2hvdylmb3IoYiBpbiBpLmFuaW1hdGVkUHJvcGVydGllcylmLnN0eWxlKGgsYixpLm9yaWdbYl0pLGYucmVtb3ZlRGF0YShoLCJmeHNob3ciK2IsITApLGYucmVtb3ZlRGF0YShoLCJ0b2dnbGUiK2IsITApO2Q9aS5jb21wbGV0ZSxkJiYoaS5jb21wbGV0ZT0hMSxkLmNhbGwoaCkpfXJldHVybiExfWkuZHVyYXRpb249PUluZmluaXR5P3RoaXMubm93PWU6KGM9ZS10aGlzLnN0YXJ0VGltZSx0aGlzLnN0YXRlPWMvaS5kdXJhdGlvbix0aGlzLnBvcz1mLmVhc2luZ1tpLmFuaW1hdGVkUHJvcGVydGllc1t0aGlzLnByb3BdXSh0aGlzLnN0YXRlLGMsMCwxLGkuZHVyYXRpb24pLHRoaXMubm93PXRoaXMuc3RhcnQrKHRoaXMuZW5kLXRoaXMuc3RhcnQpKnRoaXMucG9zKSx0aGlzLnVwZGF0ZSgpO3JldHVybiEwfX0sZi5leHRlbmQoZi5meCx7dGljazpmdW5jdGlvbigpe3ZhciBhLGI9Zi50aW1lcnMsYz0wO2Zvcig7YzxiLmxlbmd0aDtjKyspYT1iW2NdLCFhKCkmJmJbY109PT1hJiZiLnNwbGljZShjLS0sMSk7Yi5sZW5ndGh8fGYuZnguc3RvcCgpfSxpbnRlcnZhbDoxMyxzdG9wOmZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbChjcCksY3A9bnVsbH0sc3BlZWRzOntzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LHN0ZXA6e29wYWNpdHk6ZnVuY3Rpb24oYSl7Zi5zdHlsZShhLmVsZW0sIm9wYWNpdHkiLGEubm93KX0sX2RlZmF1bHQ6ZnVuY3Rpb24oYSl7YS5lbGVtLnN0eWxlJiZhLmVsZW0uc3R5bGVbYS5wcm9wXSE9bnVsbD9hLmVsZW0uc3R5bGVbYS5wcm9wXT1hLm5vdythLnVuaXQ6YS5lbGVtW2EucHJvcF09YS5ub3d9fX0pLGYuZWFjaChbIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24oYSxiKXtmLmZ4LnN0ZXBbYl09ZnVuY3Rpb24oYSl7Zi5zdHlsZShhLmVsZW0sYixNYXRoLm1heCgwLGEubm93KSthLnVuaXQpfX0pLGYuZXhwciYmZi5leHByLmZpbHRlcnMmJihmLmV4cHIuZmlsdGVycy5hbmltYXRlZD1mdW5jdGlvbihhKXtyZXR1cm4gZi5ncmVwKGYudGltZXJzLGZ1bmN0aW9uKGIpe3JldHVybiBhPT09Yi5lbGVtfSkubGVuZ3RofSk7dmFyIGN3PS9edCg/OmFibGV8ZHxoKSQvaSxjeD0vXig/OmJvZHl8aHRtbCkkL2k7ImdldEJvdW5kaW5nQ2xpZW50UmVjdCJpbiBjLmRvY3VtZW50RWxlbWVudD9mLmZuLm9mZnNldD1mdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdLGM7aWYoYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2Yub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTtpZighYnx8IWIub3duZXJEb2N1bWVudClyZXR1cm4gbnVsbDtpZihiPT09Yi5vd25lckRvY3VtZW50LmJvZHkpcmV0dXJuIGYub2Zmc2V0LmJvZHlPZmZzZXQoYik7dHJ5e2M9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX1jYXRjaChkKXt9dmFyIGU9Yi5vd25lckRvY3VtZW50LGc9ZS5kb2N1bWVudEVsZW1lbnQ7aWYoIWN8fCFmLmNvbnRhaW5zKGcsYikpcmV0dXJuIGM/e3RvcDpjLnRvcCxsZWZ0OmMubGVmdH06e3RvcDowLGxlZnQ6MH07dmFyIGg9ZS5ib2R5LGk9Y3koZSksaj1nLmNsaWVudFRvcHx8aC5jbGllbnRUb3B8fDAsaz1nLmNsaWVudExlZnR8fGguY2xpZW50TGVmdHx8MCxsPWkucGFnZVlPZmZzZXR8fGYuc3VwcG9ydC5ib3hNb2RlbCYmZy5zY3JvbGxUb3B8fGguc2Nyb2xsVG9wLG09aS5wYWdlWE9mZnNldHx8Zi5zdXBwb3J0LmJveE1vZGVsJiZnLnNjcm9sbExlZnR8fGguc2Nyb2xsTGVmdCxuPWMudG9wK2wtaixvPWMubGVmdCttLWs7cmV0dXJue3RvcDpuLGxlZnQ6b319OmYuZm4ub2Zmc2V0PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF07aWYoYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2Yub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTtpZighYnx8IWIub3duZXJEb2N1bWVudClyZXR1cm4gbnVsbDtpZihiPT09Yi5vd25lckRvY3VtZW50LmJvZHkpcmV0dXJuIGYub2Zmc2V0LmJvZHlPZmZzZXQoYik7dmFyIGMsZD1iLm9mZnNldFBhcmVudCxlPWIsZz1iLm93bmVyRG9jdW1lbnQsaD1nLmRvY3VtZW50RWxlbWVudCxpPWcuYm9keSxqPWcuZGVmYXVsdFZpZXcsaz1qP2ouZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmIuY3VycmVudFN0eWxlLGw9Yi5vZmZzZXRUb3AsbT1iLm9mZnNldExlZnQ7d2hpbGUoKGI9Yi5wYXJlbnROb2RlKSYmYiE9PWkmJmIhPT1oKXtpZihmLnN1cHBvcnQuZml4ZWRQb3NpdGlvbiYmay5wb3NpdGlvbj09PSJmaXhlZCIpYnJlYWs7Yz1qP2ouZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmIuY3VycmVudFN0eWxlLGwtPWIuc2Nyb2xsVG9wLG0tPWIuc2Nyb2xsTGVmdCxiPT09ZCYmKGwrPWIub2Zmc2V0VG9wLG0rPWIub2Zmc2V0TGVmdCxmLnN1cHBvcnQuZG9lc05vdEFkZEJvcmRlciYmKCFmLnN1cHBvcnQuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHN8fCFjdy50ZXN0KGIubm9kZU5hbWUpKSYmKGwrPXBhcnNlRmxvYXQoYy5ib3JkZXJUb3BXaWR0aCl8fDAsbSs9cGFyc2VGbG9hdChjLmJvcmRlckxlZnRXaWR0aCl8fDApLGU9ZCxkPWIub2Zmc2V0UGFyZW50KSxmLnN1cHBvcnQuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlJiZjLm92ZXJmbG93IT09InZpc2libGUiJiYobCs9cGFyc2VGbG9hdChjLmJvcmRlclRvcFdpZHRoKXx8MCxtKz1wYXJzZUZsb2F0KGMuYm9yZGVyTGVmdFdpZHRoKXx8MCksaz1jfWlmKGsucG9zaXRpb249PT0icmVsYXRpdmUifHxrLnBvc2l0aW9uPT09InN0YXRpYyIpbCs9aS5vZmZzZXRUb3AsbSs9aS5vZmZzZXRMZWZ0O2Yuc3VwcG9ydC5maXhlZFBvc2l0aW9uJiZrLnBvc2l0aW9uPT09ImZpeGVkIiYmKGwrPU1hdGgubWF4KGguc2Nyb2xsVG9wLGkuc2Nyb2xsVG9wKSxtKz1NYXRoLm1heChoLnNjcm9sbExlZnQsaS5zY3JvbGxMZWZ0KSk7cmV0dXJue3RvcDpsLGxlZnQ6bX19LGYub2Zmc2V0PXtib2R5T2Zmc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEub2Zmc2V0VG9wLGM9YS5vZmZzZXRMZWZ0O2Yuc3VwcG9ydC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCYmKGIrPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luVG9wIikpfHwwLGMrPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luTGVmdCIpKXx8MCk7cmV0dXJue3RvcDpiLGxlZnQ6Y319LHNldE9mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9Zi5jc3MoYSwicG9zaXRpb24iKTtkPT09InN0YXRpYyImJihhLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpO3ZhciBlPWYoYSksZz1lLm9mZnNldCgpLGg9Zi5jc3MoYSwidG9wIiksaT1mLmNzcyhhLCJsZWZ0Iiksaj0oZD09PSJhYnNvbHV0ZSJ8fGQ9PT0iZml4ZWQiKSYmZi5pbkFycmF5KCJhdXRvIixbaCxpXSk+LTEsaz17fSxsPXt9LG0sbjtqPyhsPWUucG9zaXRpb24oKSxtPWwudG9wLG49bC5sZWZ0KToobT1wYXJzZUZsb2F0KGgpfHwwLG49cGFyc2VGbG9hdChpKXx8MCksZi5pc0Z1bmN0aW9uKGIpJiYoYj1iLmNhbGwoYSxjLGcpKSxiLnRvcCE9bnVsbCYmKGsudG9wPWIudG9wLWcudG9wK20pLGIubGVmdCE9bnVsbCYmKGsubGVmdD1iLmxlZnQtZy5sZWZ0K24pLCJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLGspOmUuY3NzKGspfX0sZi5mbi5leHRlbmQoe3Bvc2l0aW9uOmZ1bmN0aW9uKCl7aWYoIXRoaXNbMF0pcmV0dXJuIG51bGw7dmFyIGE9dGhpc1swXSxiPXRoaXMub2Zmc2V0UGFyZW50KCksYz10aGlzLm9mZnNldCgpLGQ9Y3gudGVzdChiWzBdLm5vZGVOYW1lKT97dG9wOjAsbGVmdDowfTpiLm9mZnNldCgpO2MudG9wLT1wYXJzZUZsb2F0KGYuY3NzKGEsIm1hcmdpblRvcCIpKXx8MCxjLmxlZnQtPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luTGVmdCIpKXx8MCxkLnRvcCs9cGFyc2VGbG9hdChmLmNzcyhiWzBdLCJib3JkZXJUb3BXaWR0aCIpKXx8MCxkLmxlZnQrPXBhcnNlRmxvYXQoZi5jc3MoYlswXSwiYm9yZGVyTGVmdFdpZHRoIikpfHwwO3JldHVybnt0b3A6Yy50b3AtZC50b3AsbGVmdDpjLmxlZnQtZC5sZWZ0fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vZmZzZXRQYXJlbnR8fGMuYm9keTt3aGlsZShhJiYhY3gudGVzdChhLm5vZGVOYW1lKSYmZi5jc3MoYSwicG9zaXRpb24iKT09PSJzdGF0aWMiKWE9YS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGF9KX19KSxmLmVhY2goWyJMZWZ0IiwiVG9wIl0sZnVuY3Rpb24oYSxjKXt2YXIgZD0ic2Nyb2xsIitjO2YuZm5bZF09ZnVuY3Rpb24oYyl7dmFyIGUsZztpZihjPT09Yil7ZT10aGlzWzBdO2lmKCFlKXJldHVybiBudWxsO2c9Y3koZSk7cmV0dXJuIGc/InBhZ2VYT2Zmc2V0ImluIGc/Z1thPyJwYWdlWU9mZnNldCI6InBhZ2VYT2Zmc2V0Il06Zi5zdXBwb3J0LmJveE1vZGVsJiZnLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXXx8Zy5kb2N1bWVudC5ib2R5W2RdOmVbZF19cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2c9Y3kodGhpcyksZz9nLnNjcm9sbFRvKGE/ZihnKS5zY3JvbGxMZWZ0KCk6YyxhP2M6ZihnKS5zY3JvbGxUb3AoKSk6dGhpc1tkXT1jfSl9fSksZi5lYWNoKFsiSGVpZ2h0IiwiV2lkdGgiXSxmdW5jdGlvbihhLGMpe3ZhciBkPWMudG9Mb3dlckNhc2UoKTtmLmZuWyJpbm5lciIrY109ZnVuY3Rpb24oKXt2YXIgYT10aGlzWzBdO3JldHVybiBhP2Euc3R5bGU/cGFyc2VGbG9hdChmLmNzcyhhLGQsInBhZGRpbmciKSk6dGhpc1tkXSgpOm51bGx9LGYuZm5bIm91dGVyIitjXT1mdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdO3JldHVybiBiP2Iuc3R5bGU/cGFyc2VGbG9hdChmLmNzcyhiLGQsYT8ibWFyZ2luIjoiYm9yZGVyIikpOnRoaXNbZF0oKTpudWxsfSxmLmZuW2RdPWZ1bmN0aW9uKGEpe3ZhciBlPXRoaXNbMF07aWYoIWUpcmV0dXJuIGE9PW51bGw/bnVsbDp0aGlzO2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyk7Y1tkXShhLmNhbGwodGhpcyxiLGNbZF0oKSkpfSk7aWYoZi5pc1dpbmRvdyhlKSl7dmFyIGc9ZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrY10saD1lLmRvY3VtZW50LmJvZHk7cmV0dXJuIGUuZG9jdW1lbnQuY29tcGF0TW9kZT09PSJDU1MxQ29tcGF0IiYmZ3x8aCYmaFsiY2xpZW50IitjXXx8Z31pZihlLm5vZGVUeXBlPT09OSlyZXR1cm4gTWF0aC5tYXgoZS5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrY10sZS5ib2R5WyJzY3JvbGwiK2NdLGUuZG9jdW1lbnRFbGVtZW50WyJzY3JvbGwiK2NdLGUuYm9keVsib2Zmc2V0IitjXSxlLmRvY3VtZW50RWxlbWVudFsib2Zmc2V0IitjXSk7aWYoYT09PWIpe3ZhciBpPWYuY3NzKGUsZCksaj1wYXJzZUZsb2F0KGkpO3JldHVybiBmLmlzTnVtZXJpYyhqKT9qOml9cmV0dXJuIHRoaXMuY3NzKGQsdHlwZW9mIGE9PSJzdHJpbmciP2E6YSsicHgiKX19KSxhLmpRdWVyeT1hLiQ9Zix0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kJiZkZWZpbmUuYW1kLmpRdWVyeSYmZGVmaW5lKCJqcXVlcnkiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIGZ9KX0pKHdpbmRvdyk7"></script>
		<script id="script_tl_jquery_story-embed_js" url="data:text/plain;base64,LyohCglTdG9yeUpTCglEZXNpZ25lZCBhbmQgYnVpbHQgYnkgWmFjaCBXaXNlIGF0IFbDqXJpdMOpQ28KCglUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljCglMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzCglmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgoqLy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICBCZWdpbiBMYXp5TG9hZC5qcwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovLypqc2xpbnQgYnJvd3NlcjogdHJ1ZSwgZXFlcWVxOiB0cnVlLCBiaXR3aXNlOiB0cnVlLCBuZXdjYXA6IHRydWUsIGltbWVkOiB0cnVlLCByZWdleHA6IGZhbHNlICovLyoKTGF6eUxvYWQgbWFrZXMgaXQgZWFzeSBhbmQgcGFpbmxlc3MgdG8gbGF6aWx5IGxvYWQgb25lIG9yIG1vcmUgZXh0ZXJuYWwKSmF2YVNjcmlwdCBvciBDU1MgZmlsZXMgb24gZGVtYW5kIGVpdGhlciBkdXJpbmcgb3IgYWZ0ZXIgdGhlIHJlbmRlcmluZyBvZiBhIHdlYgpwYWdlLgoKU3VwcG9ydGVkIGJyb3dzZXJzIGluY2x1ZGUgRmlyZWZveCAyKywgSUU2KywgU2FmYXJpIDMrIChpbmNsdWRpbmcgTW9iaWxlClNhZmFyaSksIEdvb2dsZSBDaHJvbWUsIGFuZCBPcGVyYSA5Ky4gT3RoZXIgYnJvd3NlcnMgbWF5IG9yIG1heSBub3Qgd29yayBhbmQKYXJlIG5vdCBvZmZpY2lhbGx5IHN1cHBvcnRlZC4KClZpc2l0IGh0dHBzOi8vZ2l0aHViLmNvbS9yZ3JvdmUvbGF6eWxvYWQvIGZvciBtb3JlIGluZm8uCgpDb3B5cmlnaHQgKGMpIDIwMTEgUnlhbiBHcm92ZSA8cnlhbkB3b25rby5jb20+CkFsbCByaWdodHMgcmVzZXJ2ZWQuCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCnRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICdTb2Z0d2FyZScpLCB0byBkZWFsIGluCnRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLApzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCkNPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgpJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgpDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKQG1vZHVsZSBsYXp5bG9hZApAY2xhc3MgTGF6eUxvYWQKQHN0YXRpYwpAdmVyc2lvbiAyLjAuMyAoZ2l0KQoqL2Z1bmN0aW9uIGdldEVtYmVkU2NyaXB0UGF0aChlKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iiksbj0iIixyPSIiO2Zvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSsrKXRbaV0uc3JjLm1hdGNoKGUpJiYobj10W2ldLnNyYyk7biE9IiImJihyPSIvIik7cmV0dXJuIG4uc3BsaXQoIj8iKVswXS5zcGxpdCgiLyIpLnNsaWNlKDAsLTEpLmpvaW4oIi8iKStyfWZ1bmN0aW9uIGNyZWF0ZVN0b3J5SlMoZSx0KXtmdW5jdGlvbiBnKCl7TG9hZExpYi5qcyhoLmpzLHkpfWZ1bmN0aW9uIHkoKXtsLmpzPSEwO2gubGFuZyE9ImVuIj9MYXp5TG9hZC5qcyhjLmxvY2FsZSxiKTpsLmxhbmd1YWdlPSEwO3goKX1mdW5jdGlvbiBiKCl7bC5sYW5ndWFnZT0hMDt4KCl9ZnVuY3Rpb24gdygpe2wuY3NzPSEwO3goKX1mdW5jdGlvbiBFKCl7bC5mb250LmNzcz0hMDt4KCl9ZnVuY3Rpb24gUygpe2wuZm9udC5qcz0hMDt4KCl9ZnVuY3Rpb24geCgpe2lmKGwuY2hlY2tzPjQwKXJldHVybjtsLmNoZWNrcysrO2lmKGwuanMmJmwuY3NzJiZsLmZvbnQuY3NzJiZsLmZvbnQuanMmJmwubGFuZ3VhZ2Upe2lmKCFsLmZpbmlzaGVkKXtsLmZpbmlzaGVkPSEwO04oKX19ZWxzZSBsLnRpbWVvdXQ9c2V0VGltZW91dCgib25sb2FkZWRfY2hlY2tfYWdhaW4oKTsiLDI1MCl9ZnVuY3Rpb24gVCgpe3ZhciBlPSJzdG9yeWpzLWVtYmVkIjtyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guZW1iZWRfaWQhPSIiP2k9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaC5lbWJlZF9pZCk6aT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGltZWxpbmUtZW1iZWQiKTtpLmFwcGVuZENoaWxkKHIpO3Iuc2V0QXR0cmlidXRlKCJpZCIsaC5pZCk7aWYoaC53aWR0aC50b1N0cmluZygpLm1hdGNoKCIlIikpaS5zdHlsZS53aWR0aD1oLndpZHRoLnNwbGl0KCIlIilbMF0rIiUiO2Vsc2V7aC53aWR0aD1oLndpZHRoLTI7aS5zdHlsZS53aWR0aD1oLndpZHRoKyJweCJ9aWYoaC5oZWlnaHQudG9TdHJpbmcoKS5tYXRjaCgiJSIpKXtpLnN0eWxlLmhlaWdodD1oLmhlaWdodDtlKz0iIGZ1bGwtZW1iZWQiO2kuc3R5bGUuaGVpZ2h0PWguaGVpZ2h0LnNwbGl0KCIlIilbMF0rIiUifWVsc2V7ZSs9IiBzaXplZC1lbWJlZCI7aC5oZWlnaHQ9aC5oZWlnaHQtMTY7aS5zdHlsZS5oZWlnaHQ9aC5oZWlnaHQrInB4In1pLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGUpO2kuc2V0QXR0cmlidXRlKCJjbGFzc05hbWUiLGUpO3Iuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIn1mdW5jdGlvbiBOKCl7Vk1NLmRlYnVnPWguZGVidWc7bj1uZXcgVk1NLlRpbWVsaW5lKGguaWQpO24uaW5pdChoKTtvJiZWTU0uYmluZEV2ZW50KGdsb2JhbCxvbkhlYWRsaW5lLCJIRUFETElORSIpfXZhciBuLHIsaSxzLG89ITEsdT0iMi4xNyIsYT0iMS43LjEiLGY9IiIsbD17dGltZW91dDoiIixjaGVja3M6MCxmaW5pc2hlZDohMSxqczohMSxjc3M6ITEsanF1ZXJ5OiExLGhhc19qcXVlcnk6ITEsbGFuZ3VhZ2U6ITEsZm9udDp7Y3NzOiExLGpzOiExfX0sYz17YmFzZTplbWJlZF9wYXRoLGNzczplbWJlZF9wYXRoKyJjc3MvIixqczplbWJlZF9wYXRoKyJqcy8iLGxvY2FsZTplbWJlZF9wYXRoKyJqcy9sb2NhbGUvIixqcXVlcnk6Imh0dHA6Ly9hamF4Lmdvb2dsZWFwaXMuY29tL2FqYXgvbGlicy9qcXVlcnkvMS43LjIvanF1ZXJ5Lm1pbi5qcyIsZm9udDp7Z29vZ2xlOiExLGNzczplbWJlZF9wYXRoKyJjc3MvdGhlbWVzL2ZvbnQvIixqczoiaHR0cDovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL3dlYmZvbnQvMS93ZWJmb250LmpzIn19LGg9e3ZlcnNpb246dSxkZWJ1ZzohMSx0eXBlOiJ0aW1lbGluZSIsaWQ6InN0b3J5anMiLGVtYmVkX2lkOiJ0aW1lbGluZS1lbWJlZCIsZW1iZWQ6ITAsd2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsc291cmNlOiJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldC9wdWI/a2V5PTBBZ2xfRHY2aUViRGFkRll6UmpKUFVHa3RZME5rV1hGVVdrVklaRE5HUkhjJm91dHB1dD1odG1sIixsYW5nOiJlbiIsZm9udDoiZGVmYXVsdCIsY3NzOmMuY3NzKyJ0aW1lbGluZS5jc3M/Iit1LGpzOmMuanMrInRpbWVsaW5lLW1pbi5qcz8iK3UsYXBpX2tleXM6e2dvb2dsZToiIixmbGlja3I6IiIsdHdpdHRlcjoiIn0sZ21hcF9rZXk6IiJ9LHA9W3tuYW1lOiJNZXJyaXdlYXRoZXItTmV3c0N5Y2xlIixnb29nbGU6WyJOZXdzK0N5Y2xlOjQwMCw3MDA6bGF0aW4iLCJNZXJyaXdlYXRoZXI6NDAwLDcwMCw5MDA6bGF0aW4iXX0se25hbWU6Ik5ld3NDeWNsZS1NZXJyaXdlYXRoZXIiLGdvb2dsZTpbIk5ld3MrQ3ljbGU6NDAwLDcwMDpsYXRpbiIsIk1lcnJpd2VhdGhlcjozMDAsNDAwLDcwMDpsYXRpbiJdfSx7bmFtZToiUG9pcmV0T25lLU1vbGVuZ28iLGdvb2dsZTpbIlBvaXJldCtPbmU6OmxhdGluIiwiTW9sZW5nbzo6bGF0aW4iXX0se25hbWU6IkFydm8tUFRTYW5zIixnb29nbGU6WyJBcnZvOjQwMCw3MDAsNDAwaXRhbGljOmxhdGluIiwiUFQrU2Fuczo0MDAsNzAwLDQwMGl0YWxpYzpsYXRpbiJdfSx7bmFtZToiUFRTZXJpZi1QVFNhbnMiLGdvb2dsZTpbIlBUK1NhbnM6NDAwLDcwMCw0MDBpdGFsaWM6bGF0aW4iLCJQVCtTZXJpZjo0MDAsNzAwLDQwMGl0YWxpYzpsYXRpbiJdfSx7bmFtZToiUFQiLGdvb2dsZTpbIlBUK1NhbnMrTmFycm93OjQwMCw3MDA6bGF0aW4iLCJQVCtTYW5zOjQwMCw3MDAsNDAwaXRhbGljOmxhdGluIiwiUFQrU2VyaWY6NDAwLDcwMCw0MDBpdGFsaWM6bGF0aW4iXX0se25hbWU6IkRyb2lkU2VyaWYtRHJvaWRTYW5zIixnb29nbGU6WyJEcm9pZCtTYW5zOjQwMCw3MDA6bGF0aW4iLCJEcm9pZCtTZXJpZjo0MDAsNzAwLDQwMGl0YWxpYzpsYXRpbiJdfSx7bmFtZToiTGVrdG9uLU1vbGVuZ28iLGdvb2dsZTpbIkxla3Rvbjo0MDAsNzAwLDQwMGl0YWxpYzpsYXRpbiIsIk1vbGVuZ286OmxhdGluIl19LHtuYW1lOiJOaXhpZU9uZS1MZWRnZXIiLGdvb2dsZTpbIk5peGllK09uZTo6bGF0aW4iLCJMZWRnZXI6OmxhdGluIl19LHtuYW1lOiJBYnJpbEZhdGZhY2UtQXZlcmFnZSIsZ29vZ2xlOlsiQXZlcmFnZTo6bGF0aW4iLCJBYnJpbCtGYXRmYWNlOjpsYXRpbiJdfSx7bmFtZToiUGxheWZhaXJEaXNwbGF5LU11bGkiLGdvb2dsZTpbIlBsYXlmYWlyK0Rpc3BsYXk6NDAwLDQwMGl0YWxpYzpsYXRpbiIsIk11bGk6MzAwLDQwMCwzMDBpdGFsaWMsNDAwaXRhbGljOmxhdGluIl19LHtuYW1lOiJSYW5jaG8tR3VkZWEiLGdvb2dsZTpbIlJhbmNobzo6bGF0aW4iLCJHdWRlYTo0MDAsNzAwLDQwMGl0YWxpYzpsYXRpbiJdfSx7bmFtZToiQmV2YW4tUG90YW5vU2FucyIsZ29vZ2xlOlsiQmV2YW46OmxhdGluIiwiUG9udGFubytTYW5zOjpsYXRpbiJdfSx7bmFtZToiQnJlZVNlcmlmLU9wZW5TYW5zIixnb29nbGU6WyJCcmVlK1NlcmlmOjpsYXRpbiIsIk9wZW4rU2FuczozMDBpdGFsaWMsNDAwaXRhbGljLDYwMGl0YWxpYyw3MDBpdGFsaWMsODAwaXRhbGljLDQwMCwzMDAsNjAwLDcwMCw4MDA6bGF0aW4iXX0se25hbWU6IlNhbnNpdGFPbmUtS2FtZXJvbiIsZ29vZ2xlOlsiU2Fuc2l0YStPbmU6OmxhdGluIiwiS2FtZXJvbjo0MDAsNzAwOmxhdGluIl19LHtuYW1lOiJMb3JhLUlzdG9rIixnb29nbGU6WyJMb3JhOjQwMCw3MDAsNDAwaXRhbGljLDcwMGl0YWxpYzpsYXRpbiIsIklzdG9rK1dlYjo0MDAsNzAwLDQwMGl0YWxpYyw3MDBpdGFsaWM6bGF0aW4iXX0se25hbWU6IlBhY2lmaWNvLUFyaW1vIixnb29nbGU6WyJQYWNpZmljbzo6bGF0aW4iLCJBcmltbzo0MDAsNzAwLDQwMGl0YWxpYyw3MDBpdGFsaWM6bGF0aW4iXX1dO2lmKHR5cGVvZiBlPT0ib2JqZWN0Iilmb3IocyBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHMpJiYoaFtzXT1lW3NdKTt0eXBlb2YgdCE9InVuZGVmaW5lZCImJihoLnNvdXJjZT10KTtpZih0eXBlb2YgdXJsX2NvbmZpZz09Im9iamVjdCIpe289ITA7aC5zb3VyY2UubWF0Y2goImRvY3MuZ29vZ2xlLmNvbSIpfHxoLnNvdXJjZS5tYXRjaCgianNvbiIpfHxoLnNvdXJjZS5tYXRjaCgic3RvcmlmeSIpfHwoaC5zb3VyY2U9Imh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0L3B1Yj9rZXk9IitoLnNvdXJjZSsiJm91dHB1dD1odG1sIil9aWYoaC5qcy5tYXRjaCgibG9jYWxlIikpe2gubGFuZz1oLmpzLnNwbGl0KCJsb2NhbGUvIilbMV0ucmVwbGFjZSgiLmpzIiwiIik7aC5qcz1jLmpzKyJ0aW1lbGluZS1taW4uanM/Iit1fWlmKCFoLmpzLm1hdGNoKCIvIikpe2guY3NzPWMuY3NzK2gudHlwZSsiLmNzcz8iK3U7aC5qcz1jLmpzK2gudHlwZSsiLW1pbi5qcz8iK3U7aC5pZD0ic3Rvcnlqcy0iK2gudHlwZX1oLmxhbmcubWF0Y2goIi8iKT9jLmxvY2FsZT1oLmxhbmc6Yy5sb2NhbGU9Yy5sb2NhbGUraC5sYW5nKyIuanM/Iit1O1QoKTtMb2FkTGliLmNzcyhoLmNzcyx3KTtpZihoLmZvbnQ9PSJkZWZhdWx0Iil7bC5mb250LmpzPSEwO2wuZm9udC5jc3M9ITB9ZWxzZXt2YXIgZDtpZihoLmZvbnQubWF0Y2goIi8iKSl7ZD1oLmZvbnQuc3BsaXQoIi5jc3MiKVswXS5zcGxpdCgiLyIpO2MuZm9udC5uYW1lPWRbZC5sZW5ndGgtMV07Yy5mb250LmNzcz1oLmZvbnR9ZWxzZXtjLmZvbnQubmFtZT1oLmZvbnQ7Yy5mb250LmNzcz1jLmZvbnQuY3NzK2guZm9udCsiLmNzcz8iK3V9TG9hZExpYi5jc3MoYy5mb250LmNzcyxFKTtmb3IodmFyIHY9MDt2PHAubGVuZ3RoO3YrKylpZihjLmZvbnQubmFtZT09cFt2XS5uYW1lKXtjLmZvbnQuZ29vZ2xlPSEwO1dlYkZvbnRDb25maWc9e2dvb2dsZTp7ZmFtaWxpZXM6cFt2XS5nb29nbGV9fX1jLmZvbnQuZ29vZ2xlP0xvYWRMaWIuanMoYy5mb250LmpzLFMpOmwuZm9udC5qcz0hMH10cnl7bC5oYXNfanF1ZXJ5PWpRdWVyeTtsLmhhc19qcXVlcnk9ITA7aWYobC5oYXNfanF1ZXJ5KXt2YXIgZj1wYXJzZUZsb2F0KGpRdWVyeS5mbi5qcXVlcnkpO2Y8cGFyc2VGbG9hdChhKT9sLmpxdWVyeT0hMTpsLmpxdWVyeT0hMH19Y2F0Y2gobSl7bC5qcXVlcnk9ITF9bC5qcXVlcnk/ZygpOkxvYWRMaWIuanMoYy5qcXVlcnksZyk7dGhpcy5vbmxvYWRlZF9jaGVja19hZ2Fpbj1mdW5jdGlvbigpe3goKX19TGF6eUxvYWQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdSh0LG4pe3ZhciByPWUuY3JlYXRlRWxlbWVudCh0KSxpO2ZvcihpIGluIG4pbi5oYXNPd25Qcm9wZXJ0eShpKSYmci5zZXRBdHRyaWJ1dGUoaSxuW2ldKTtyZXR1cm4gcn1mdW5jdGlvbiBhKGUpe3ZhciB0PXJbZV0sbixvO2lmKHQpe249dC5jYWxsYmFjaztvPXQudXJscztvLnNoaWZ0KCk7aT0wO2lmKCFvLmxlbmd0aCl7biYmbi5jYWxsKHQuY29udGV4dCx0Lm9iaik7cltlXT1udWxsO3NbZV0ubGVuZ3RoJiZsKGUpfX19ZnVuY3Rpb24gZigpe3ZhciBuPW5hdmlnYXRvci51c2VyQWdlbnQ7dD17YXN5bmM6ZS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKS5hc3luYz09PSEwfTsodC53ZWJraXQ9L0FwcGxlV2ViS2l0XC8vLnRlc3QobikpfHwodC5pZT0vTVNJRS8udGVzdChuKSl8fCh0Lm9wZXJhPS9PcGVyYS8udGVzdChuKSl8fCh0LmdlY2tvPS9HZWNrb1wvLy50ZXN0KG4pKXx8KHQudW5rbm93bj0hMCl9ZnVuY3Rpb24gbChpLG8sbCxwLGQpe3ZhciB2PWZ1bmN0aW9uKCl7YShpKX0sbT1pPT09ImNzcyIsZz1bXSx5LGIsdyxFLFMseDt0fHxmKCk7aWYobyl7bz10eXBlb2Ygbz09InN0cmluZyI/W29dOm8uY29uY2F0KCk7aWYobXx8dC5hc3luY3x8dC5nZWNrb3x8dC5vcGVyYSlzW2ldLnB1c2goe3VybHM6byxjYWxsYmFjazpsLG9iajpwLGNvbnRleHQ6ZH0pO2Vsc2UgZm9yKHk9MCxiPW8ubGVuZ3RoO3k8YjsrK3kpc1tpXS5wdXNoKHt1cmxzOltvW3ldXSxjYWxsYmFjazp5PT09Yi0xP2w6bnVsbCxvYmo6cCxjb250ZXh0OmR9KX1pZihyW2ldfHwhKEU9cltpXT1zW2ldLnNoaWZ0KCkpKXJldHVybjtufHwobj1lLmhlYWR8fGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXSk7Uz1FLnVybHM7Zm9yKHk9MCxiPVMubGVuZ3RoO3k8YjsrK3kpe3g9U1t5XTtpZihtKXc9dC5nZWNrbz91KCJzdHlsZSIpOnUoImxpbmsiLHtocmVmOngscmVsOiJzdHlsZXNoZWV0In0pO2Vsc2V7dz11KCJzY3JpcHQiLHtzcmM6eH0pO3cuYXN5bmM9ITF9dy5jbGFzc05hbWU9Imxhenlsb2FkIjt3LnNldEF0dHJpYnV0ZSgiY2hhcnNldCIsInV0Zi04Iik7aWYodC5pZSYmIW0pdy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtpZigvbG9hZGVkfGNvbXBsZXRlLy50ZXN0KHcucmVhZHlTdGF0ZSkpe3cub25yZWFkeXN0YXRlY2hhbmdlPW51bGw7digpfX07ZWxzZSBpZihtJiYodC5nZWNrb3x8dC53ZWJraXQpKWlmKHQud2Via2l0KXtFLnVybHNbeV09dy5ocmVmO2goKX1lbHNle3cuaW5uZXJIVE1MPSdAaW1wb3J0ICInK3grJyI7JztjKHcpfWVsc2Ugdy5vbmxvYWQ9dy5vbmVycm9yPXY7Zy5wdXNoKHcpfWZvcih5PTAsYj1nLmxlbmd0aDt5PGI7Kyt5KW4uYXBwZW5kQ2hpbGQoZ1t5XSl9ZnVuY3Rpb24gYyhlKXt2YXIgdDt0cnl7dD0hIWUuc2hlZXQuY3NzUnVsZXN9Y2F0Y2gobil7aSs9MTtpPDIwMD9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YyhlKX0sNTApOnQmJmEoImNzcyIpO3JldHVybn1hKCJjc3MiKX1mdW5jdGlvbiBoKCl7dmFyIGU9ci5jc3MsdDtpZihlKXt0PW8ubGVuZ3RoO3doaWxlKC0tdD49MClpZihvW3RdLmhyZWY9PT1lLnVybHNbMF0pe2EoImNzcyIpO2JyZWFrfWkrPTE7ZSYmKGk8MjAwP3NldFRpbWVvdXQoaCw1MCk6YSgiY3NzIikpfX12YXIgdCxuLHI9e30saT0wLHM9e2NzczpbXSxqczpbXX0sbz1lLnN0eWxlU2hlZXRzO3JldHVybntjc3M6ZnVuY3Rpb24oZSx0LG4scil7bCgiY3NzIixlLHQsbixyKX0sanM6ZnVuY3Rpb24oZSx0LG4scil7bCgianMiLGUsdCxuLHIpfX19KHRoaXMuZG9jdW1lbnQpO0xvYWRMaWI9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbihlKXt2YXIgbj0wLHI9ITE7Zm9yKG49MDtuPHQubGVuZ3RoO24rKyl0W25dPT1lJiYocj0hMCk7aWYocilyZXR1cm4hMDt0LnB1c2goZSk7cmV0dXJuITF9dmFyIHQ9W107cmV0dXJue2NzczpmdW5jdGlvbihlLHQscixpKXtuKGUpfHxMYXp5TG9hZC5jc3MoZSx0LHIsaSl9LGpzOmZ1bmN0aW9uKGUsdCxyLGkpe24oZSl8fExhenlMb2FkLmpzKGUsdCxyLGkpfX19KHRoaXMuZG9jdW1lbnQpO3ZhciBXZWJGb250Q29uZmlnO2lmKHR5cGVvZiBlbWJlZF9wYXRoPT0idW5kZWZpbmVkInx8dHlwZW9mIGVtYmVkX3BhdGg9PSJ1bmRlZmluZWQiKXZhciBlbWJlZF9wYXRoPWdldEVtYmVkU2NyaXB0UGF0aCgic3Rvcnlqcy1lbWJlZC5qcyIpLnNwbGl0KCJqcy8iKVswXTsoZnVuY3Rpb24oKXt0eXBlb2YgdXJsX2NvbmZpZz09Im9iamVjdCI/Y3JlYXRlU3RvcnlKUyh1cmxfY29uZmlnKTp0eXBlb2YgdGltZWxpbmVfY29uZmlnPT0ib2JqZWN0Ij9jcmVhdGVTdG9yeUpTKHRpbWVsaW5lX2NvbmZpZyk6dHlwZW9mIHN0b3J5anNfY29uZmlnPT0ib2JqZWN0Ij9jcmVhdGVTdG9yeUpTKHN0b3J5anNfY29uZmlnKTp0eXBlb2YgY29uZmlnPT0ib2JqZWN0IiYmY3JlYXRlU3RvcnlKUyhjb25maWcpfSkoKTs= "></script>
HTML_JS_tl;
	return($html_js_tl);
	}

function html_data_tl() {
	$html_data_tl=<<<HTML_DATA_tl
<script id="script_tl_data"  type="text/javascript">
	var tl_data = new Array();
// tl_data[0] = {
// var tl_dta = {
tl_dta = {
    "timeline": {
        "headline":"tl_dta timejack <a href=http://ka1/index.html><img src='/imgs/btn/ko.png'> tl_main tl_dta jkwii headline ",
        "type":"default",
		"text":"tl_text",
		"startDate":"2009,9,16",
        "date": [
            {
                "startDate":"2009,9,16",
		"endDate":"2013,2,15",
                "headline":"tl_headline=enddat",
                "text":"<p> <b>headline </b> <a href=gao.pdf>gao.pdf</a> ko_saic/timeline/examples/gao.pdf...</p>",
                "asset":
                {
                    "media":"",
                    "credit":"credit",
                    "caption":"caption_swf"
                }
            },



            {
                "startDate":"2012,7,4",
                "headline":"noko and shun ko0.us",
                "text":"<p>thepat ok but no ko</p>",
                "asset":
                {
                    "media":"http://duckduckgo.com",
                    "credit":"",
                    "caption":""
                }
            },
			{
                "startDate":"2012,11,01",
                "headline":"mischief engineering kickoff",
                "text":"test1.txt",
                "asset":
                {
                    "media":"",
                    "credit":"",
                    "caption":""
                }
            },
			{
                "startDate":"2011,12,12",
                "headline":"undisclosed location",
                "text":"",
                "asset":
                {
                    "media":"http://bing.com",
                    "credit":"",
                    "caption":"virtual datacenter, knowledgebase, datacall systems"
                }
            },
			{
                "startDate":"2012,12,14",
                "headline":"you can leave yesterday",
                "text":"",
                "asset":
                {
                    "media":"ko.png",
                    "credit":"ko.png",
                    "caption":"ko.png"
                }
            },

			{
                "startDate":"2012,12,15",
                "headline":"https://iperms.com/tl/htm/gao.pdf",
                "text":"text: examples/gao.pdf",
                "asset":
                {
                    "media":"media=https://ko2.us/tl/examples/gao.pdf",
                    "credit":"credit=https://ko2.us/tl/examples/gao.pdf",
                    "caption":"caption=https://ko2.us/tl/examples/gao.pdf"
                }
            },


			{
                "startDate":"2011,12,16",
                "headline":"https://ko2.us/ko_saic/ko_saic.php",
                "text":"http://ko2.us",
                "asset":
                {
                    "media":"http://ko2.us/ko_saic/ko_saic.php",
                    "credit":"credit ko_saic.php",
                    "caption":"caption ko_saic.php"
                }
            },




			{
                "startDate":"2013,2,4",
                "headline":"invoice 47 days",
                "text":"",
                "asset":
                {
                    "media":"http://iperms.com",
                    "credit":"",
                    "caption":"iperms.com caption_..."
                }
            },

			{
                "startDate":"2013,2,15",
                "headline":"headline=back to stl",
                "text":"",
                "asset":
                {
                    "media":"http://ko2.us/zm5",
                    "credit":"credit=credit",
                    "caption":"zm5 caption=caption_end"
                	} } ] } } 

tl_dta0 = {
    "timeline": {
        "headline":"tl_dta0 timejack <a href=http://ka2/index.html><img src='/imgs/btn/koeye.png'></a> tl_headline tl_dta0 tl_dta0 jkwii tl_dta_zero ",
        "type":"default",
		"text":"tl_text zero",
		"startDate":"2002,9,16",
        "date": [
            {
                "startDate":"2002,9,16",
		"endDate":"2013,2,15",
                "headline":"tl_headline=enddat",
                "text":"<p> <b>headline two </b> <a href=index_zm.html><img src=/imgs/btn/koeyew.png></a> ko_saic/timeline/examples/gao.pdf...</p>",
                "asset":
                {
                    "media":"",
                    "credit":"credit",
                    "caption":"caption_swf"
                }
            },
			{
                "startDate":"2013,2,15",
                "headline":"headline=back to stl",
                "text":"",
                "asset":
                {
                    "media":"http://ko2.us/zm5",
                    "credit":"credit=credit",
                    "caption":"zm5 caption=caption_end"
                	} } ] } } 







tl_dta1 = {
    "timeline": {
        "headline":"tl_dta1 timejack <a href=http://ka1/index_zm.html<img src=/imgs/btn/kbeyeb.png></a> tl_headline tl_dta1 jkwii tl_dta_one ",
        "type":"default",
		"text":"tl_text one",
		"startDate":"2009,9,16",
        "date": [
            {
                "startDate":"2001,9,16",
		"endDate":"2001,2,15",
                "headline":"tl_headline=enddat one",
                "text":"<p> <b>headline one </b> <a href=index_zm.html><img src=/imgs/btn/koeyew.png></a> ko_saic/timeline/examples/gao.pdf...</p>",
                "asset":
                {
                    "media":"",
                    "credit":"credit",
                    "caption":"caption_swf"
                }
            },
			{
                "startDate":"2013,2,15",
                "headline":"headline=back to stl",
                "text":"",
                "asset":
                {
                    "media":"http://ko2.us/zm5",
                    "credit":"credit=credit",
                    "caption":"zm5 caption=caption_end"
                	} } ] } } 
tl_dta2 = {
    "timeline": {
        "headline":"tl_dta2 timejack <a href=http://iperms.com><img src=/imgs/btn/kbeyew.png></a> tl_headline tl_dta2 jkwii tl_dta_two ",
        "type":"default",
		"text":"tl_text two",
		"startDate":"2002,9,16",
        "date": [
            {
                "startDate":"2002,9,16",
		"endDate":"2013,2,15",
                "headline":"tl_headline=enddat",
                "text":"<p> <b>headline two </b> <a href=index_zm.html><img src=/imgs/btn/koeyew.png></a> ko_saic/timeline/examples/gao.pdf...</p>",
                "asset":
                {
                    "media":"",
                    "credit":"credit",
                    "caption":"caption_swf"
                }
            },
			{
                "startDate":"2013,2,15",
                "headline":"headline=back to stl",
                "text":"",
                "asset":
                {
                    "media":"http://ko2.us/zm5",
                    "credit":"credit=credit",
                    "caption":"zm5 caption=caption_end"
                	} } ] } } 



	tl_data[0] = tl_dta;
	tl_data[1] = tl_dta1;
	tl_data[2] = tl_dta2;
	tl_data[3] = tl_dta;
//	tl_data[3] = tl_dta1;
//	tl_data[4] = tl_dta2;
	j= tl_data.length-1;
	tl_dta = tl_data[j];
//	alert( "BUGS_500 tl_dta="+tl_dta+" len="+tl_data.length );
			</script>

HTML_DATA_tl;
	return($html_data_tl);
	}


function html_view_tl() {
#	$html_view_tl0="<h1>BUGS_2325 html_view_tl KLUDGE</h1>";

	$gt='<';
	$html_view_bugs = "$gt"."script id=script_ream_my-timeline >";
	print( "<h1>BUGS_2330 html_view_tl0=".$html_view_bugs."</h1>" );

#	print( "<h1>BUGS_2332 html_view_tl=".$html_view_tl."</h1>" );
#	print( "<h1>BUGS_2333 html_view_tl1=".$html_view_tl1."</h1>" );
#	$html_view_tl1 = <<<HTML_VIEW_tl2

	$html_view_tl1 = "";
	$html_view_t11 .= '<script id="script_ream_my-timeline" >';
	print( "BUGS_2336:  html_view_tl1=$html_view_tl1<br>" );

	$html_view_tl1 .= "	$(document).ready(function() {";
	$html_view_tl1 .=	"		var j=0; var jlen=0;";
	$html_view_tl1 .=	"		tl_data[0] = tl_dta;";
	$html_view_tl1 .=	"		tl_data[1] = tl_dta0;";
	$html_view_tl1 .=	"		tl_data[2] = tl_dta1;";
	$html_view_tl1 .=	"		tl_data[3] = tl_dta2;";

	$html_view_tl1 .= "			createStoryJS({";
	$html_view_tl1 .= "				type:		'timeline',";
	$html_view_tl1 .= "				width:		'800',";
	$html_view_tl1 .= "				height:		'600',";
	$html_view_tl1 .= "				source:		'test_tl.php?q=tl&k=tl_ko&a=tl,tl_ko,json',";
//	$html_view_tl1 .= "				source:		'tl_bugs.json',";
//	$html_view_tl1 .= "				source:		'http://ka10/test_tl.php&json',";
//	$html_view_tl1 .= "				source:		'tl_iperms.json',";
	$html_view_tl1 .= "				embed_id:	'my-timeline',";
	$html_view_tl1 .= "				debug:		true";
	$html_view_tl1 .= "			});";
	$html_view_tl1 .= "});";
	$html_view_tl1 .= "	</script>";


	$html_view_tl="";
	$html_view_tl .= $html_view_tl1;
	print( "<h1>BUGS_2362 html_view_tl0=$html_view_tl0</h1>" );
	print( "<h1>BUGS_2362 html_view_tl1=$html_view_tl1</h1>" );
	print( "<h1>BUGS_2365 html_view_tl=$html_view_tl</h1>" );
	return($html_view_tl);
	}

function html_data_ko() {
	$html_data_ko=<<<HTML_DATA_ko
	<button type="button" onclick="addChild()">Append Child</button>
	<div id="i-want-more-timelines">
		<p>my-timelines_2_be</p>
		<hr color=white>	
<!--
		<div id="my-timeline"><h1>my-timeline</h1></div> 
		<div id="my-timeline-0"><h1>my-timeline-0</h1></div> 
		<div id="my-timeline-1"><h1>my-timeline-1</h1></div> 
		<div id="my-timeline-2"><h1>my-timeline-2</h1></div> 
	-->
		</div>

<button type="button" onclick="div_update()">div_result</button>
<button type="button" onclick="div_test()">div_test</button>
<button type="button" onclick="div_update_av()">div_update_av</button>
<button type="button" onclick="div_update_bb()">div_update_bb</button>
<button type="button" onclick="div_update_dd()">div_update_dd</button>
<button type="button" onclick="div_update_sl()">div_update_sl</button>
<button type="button" onclick="div_update_tl()">div_update_tl</button>
<button type="button" onclick="div_update_zm()">div_update_zm</button>

<hr color=red><hr color=white><hr color=blue>
<div id="div_tl"><h1>div id=div_tl</h1> </div>
<div id="div_test"><h1>div id=div_test</h1> </div>
<hr color=blue><hr color=white><hr color=red>


<div id="div_av"><h1>div id=div_av</h1> </div>
<div id="div_bb" ><h1>div id=div_bb</h1> </div>
<div id="div_dd"><h1>div id=div_dd</h1> </div>
<div id="div_sl"><h1>div id=div_sl</h1> </div>
<div id="div_zm"><h1>div id=div_zm</h1> </div>
<div id="Result"><h1>div id=result</h1> </div>

<script>
	var data="";
	function div_update_result() {
	data += "<h1><b>data_av</b><h1>";
	data += "<img src='./imgs/btn/p34.png'><br>";
	document.getElementById('Result').innerHTML += data;
	}

	var data_av="";
	function div_test() {
		var j = 0;

		script_avlist_load();
//		document.write( "bugs div_test avlist_len="+avlist.length );
		alert( "bugs292_div_new avlist_len=" + avlist.length );
		script_avlist_show();
		for( j=0; j < avlist.length; j++){
			data_av += "<h1><b>data_av-"+i+"</b><h1>";
			data_av += "<a href='?q="+i+"' ><img src='./imgs/btn/p34.png'></a><br>";
//			data_av += "<a href=?q="+i+"<img src='./imgs/btn/p34.png'></a><br>";
			}
		document.getElementById('div_av').innerHTML += data_av;
		document.getElementById('div_av').innerHTML = "";
		}
		
	var data_av = "";
	function div_update_av1() {
			alert( "bugs_div_update_av1 len="+avlist.length );
			script_avlist_load();
			alert( "bugs_script_avlist len="+avlist.length );
			script_avlist_show();
			document.write( "bugs_div_update_av avlist_len="+ avlist.length );
			data_av += "<h1><b>data_bb</b><h1>";
			data_av += "<img src='./imgs/btn/p12.png'><br>";
		document.getElementById('div_bb').innerHTML += data_bb;
		}
		
		
	var data_av = "";
	function div_update_av() {
			alert( "bugs_317:  div_update_av beforeload" );
			data_av += script_avlist_load();
			alert( "bugs_318:  div_update_av afterload" );
			data_av += "<h1><b>data_av jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj</b><h1>";
			data_av += "<img src='./imgs/btn/p13.png'><br>";
		document.getElementById('div_av').innerHTML += data_av;
		}

		
	var data_bb = "";
	function div_update_bb() {
			data_bb += "<h1><b>data_bb</b><h1>";
			data_bb += "<img src='./imgs/btn/p12.png'><br>";
		document.getElementById('div_bb').innerHTML += data_bb;
		}
		
	var data_dd = "";
	data_dd += "<div id='div_dd1' class='drg'>";
	function div_update_dd() {
			data_dd += "<h1><b>data_dd</b><h1>";
			data_dd += "<img src='./imgs/btn/kw.png'><br>";
			data_dd += "	</div>";
			document.getElementById('div_dd').innerHTML += data_dd;
			}
		
	var data_sl = "";
	function div_update_sl() {
			data_sl += "<h1><b>data_sl</b><h1>";
			for( j=0; j<5; j++ ) {
				data_sl += "<a href='?q="+i+"' ><img src='./imgs/btn/kb.png'></a><br>";
				}
		document.getElementById('div_sl').innerHTML += data_sl;
		}
		
	var data_tl = new Array();
	function div_update_tl() {
//			var tl_psv=tl_psv_load();
//			alert( "BUGS244 div_update_tl tl_psv0="+tl_psv[0] );


			j=0; jlen=tl_data.length;
			tl_dta = tl_data[j];
			data_tl[0] = ''
			data_tl[0] += "<h1><b>data_tl len="+jlen+"</b><h1>";
			data_tl[0] += "<img src='./imgs/btn/koeyeb.png'><br>";
			data_tl[1] = "<div><h1>bugs_248</h1>alert('bugs_248');</div>";
//			tl_dta=data_tl[0];
			tl_dta=new_tl.join('\n');


		document.getElementById('div_tl').innerHTML += tl_dta;
//		document.getElementById('div_tl').innerHTML += new_tl[1];
//		document.getElementById('div_tl').innerHTML += data_tl[0];
//		document.getElementById('div_tl').innerHTML += data_tl[1];
//		document.getElementById('div_tl').innerHTML += tl_data[0];
//		document.getElementById('div_tl').innerHTML += tl_dta;
		}
		
	function div_update_zm() {
			var data_zm = "";
			data_zm += "<h1><b>data_zm</b><h1>";
			data_zm += "<img src='./imgs/btn/koeyew.png'>";
		document.getElementById('div_zm').innerHTML += data_zm;
		}
		
		</script>

HTML_DATA_ko;
	return($html_data_ko);
	}

function html_view_ko() {
	$html_view_ko=<<<HTML_VIEW_ko


HTML_VIEW_ko;
	return($html_view_ko);
	}

#	<a href='http://ko2.us' > <img src='/imgs/btn/koeyeb.png' border=0> </a>
#	<a href='http://meet.jit.si/ko2us' > <img src='/imgs/btn/koeye_handhither.gif' border=0> </a>
#		"headline":"konet main timeline headline:  tl_konet.json <a href='http://ko2.us' > <img src='/imgs/btn/koeyeb.png' border=0> </a> <a href='http://meet.jit.si/ko2us' > <img src='/imgs/btn/koeye_handhither.gif' border=0> </a> ",


function json_tl_index( $kode, $fmt ) {
#	$json_tl_konet_hdr = "";
# 	$json_tl_konet_hdr .= '{'
#	$json_tl_konet_hdr .= '"timeline": {';
#	$json_tl_konet_hdr .= '"headline":';
#	$json_tl_konet_hdr .= '"konet main timeline headline:  tl_konet.json ",';

	$json_tl_index="";
	$json_tl_index = <<<JSON_tl_index
{
    "timeline":
    {
	"headline":"ka10 tl_index main timeline headline:  tl_index.json ",
        "type":"default",
	"text":"<p> ka10/tl/tl_index.json</p>",
	"startDate":"2001,1,11",
	"date": [
		{
		"startDate":"2018,07,18",
		"endDate":"2018,07,18",
		"headline":"tl_index",
		"text": "<p>index </p> <a href=http://index_tl.php?q=tl&k=tl_index&json&a=tl,tl_index,json target=_blank ><img src=/imgs/btn/koeye.png height=20 border=0></a>",
		"tag":"",
		"asset": {
			"media":"/index_tl.php?q=tl&kode=tl_index.json&a=tl,tl_index",
			"thumbnail":"/imgs/btn/kib.png",
			"credit":"credit_ko",
			"caption":"caption_ko"
			}
		} ,
		{
		"startDate":"2018,07,18",
		"endDate":"2018,07,18",
		"headline":"tl_ko",
		"text": "<p>tl_ko </p> <a href=http://index_tl.php?q=tl&k=tl_ko&json&a=tl,tl_ko,json target=_blank ><img src=/imgs/btn/koeye.png height=20 border=0></a>",
		"tag":"",
		"asset": {
			"media":"/index_tl.php?q=tl&kode=tl_ko.json&a=tl,tl_ko",
			"thumbnail":"/imgs/btn/kib.png",
			"credit":"credit_ko",
			"caption":"caption_ko"
			}
		} ,
		{
		"startDate":"2018,07,18",
		"endDate":"2018,07,18",
		"headline":"tl_kassil",
		"text": "<p>kassil </p> <a href=http://index_tl.php?q=tl&k=tl_kassil&json&a=tl,tl_kassil,json target=_blank ><img src=/imgs/btn/koeye.png height=20 border=0></a>",
		"tag":"",
		"asset": {
			"media":"/index_tl.php?q=tl&kode=tl_kassil.json&a=tl,tl_kassil",
			"thumbnail":"/imgs/btn/kib.png",
			"credit":"credit_kassil",
			"caption":"caption_kassil"
			}
		} ,
		{
		"startDate":"2018,07,18",
		"endDate":"2018,07,18",
		"headline":"tl_iperms",
		"text": "<p>iperms </p> <a href=http://index_tl.php?q=tl&k=tl_iperms&json&a=tl,tl_iperms,json target=_blank ><img src=/imgs/btn/koeye.png height=20 border=0></a>",
		"tag":"",
		"asset": {
			"media":"/index_tl.php?q=tl&kode=tl_iperms.json&a=tl,tl_iperms",
			"thumbnail":"/imgs/btn/kib.png",
			"credit":"credit_iperms",
			"caption":"caption_iperms"
			}
		} ,
		{
		"startDate":"2018,07,18",
		"endDate":"2018,07,18",
		"headline":"tl_jtfdc",
		"text": "<p>jtfdc </p> <a href=http://index_tl.php?q=tl&k=tl_jtfdc&json&a=tl,tl_jtfdc,json target=_blank ><img src=/imgs/btn/koeye.png height=20 border=0></a>",
		"tag":"",
		"asset": {
			"media":"/index_tl.php?q=tl&kode=tl_jtfdc.json&a=tl,tl_jtfdc",
			"thumbnail":"/imgs/btn/kib.png",
			"credit":"credit_jtfdc",
			"caption":"caption_jtfdc"
			}
		} ,
		{
		"startDate":"2018,07,18",
		"endDate":"2018,07,18",
		"headline":"tl_jtfinc",
		"text": "<p>jtfinc </p> <a href=http://index_tl.php?q=tl&k=tl_jtfinc&json&a=tl,tl_jtfinc,json target=_blank ><img src=/imgs/btn/koeye.png height=20 border=0></a>",
		"tag":"",
		"asset": {
			"media":"/index_tl.php?q=tl&kode=tl_jtfinc.json&a=tl,tl_jtfinc",
			"thumbnail":"/imgs/btn/kib.png",
			"credit":"credit_jtfinc",
			"caption":"caption_jtfinc"
			}
		} ,
		{
		"startDate":"2018,07,18",
		"endDate":"2018,07,18",
		"headline":"tl_law",
		"text": "<p>law </p> <a href=http://index_tl.php?q=tl&k=tl_law&json&a=tl,tl_law,json target=_blank ><img src=/imgs/btn/koeye.png height=20 border=0></a>",
		"tag":"",
		"asset": {
			"media":"/index_tl.php?q=tl&kode=tl_law.json&a=tl,tl_law",
			"thumbnail":"/imgs/btn/kib.png",
			"credit":"credit_law",
			"caption":"caption_law"
			}
		} ,
		{
		"startDate":"2018,07,18",
		"endDate":"2018,07,18",
		"headline":"tl",
		"text": "<p>tl </p> <a href=http://index_tl.php?q=tl&k=tl&json&a=tl,tl,json target=_blank ><img src=/imgs/btn/koeye.png height=20 border=0></a>",
		"tag":"tl",
		"asset": {
			"media":"/index_tl.php?q=tl&kode=tl.json&a=tl,tl",
			"thumbnail":"/imgs/btn/kib.png",
			"credit":"credit_tl",
			"caption":"caption_tl"
		{
		"startDate":"2018,07,18",
		"endDate":"2018,07,18",
		"headline":"go",
		"text": "<p>go </p> <a href=http://index_tl.php?q=tl&k=go&json&a=tl,go,json target=_blank ><img src=/imgs/btn/koeye.png height=20 border=0></a>",
		"tag":"go",
		"asset": {
			"media":"/index_tl.php?q=tl&kode=go.json&a=tl,go",
			"thumbnail":"/imgs/btn/kib.png",
			"credit":"credit_go",
			"caption":"caption_go"
			}
		} 
		],
	"era": [
		{
		"startDate":"1953,01,13",
		"endDate":"2018,07,18",
		"headline":"tl_konet jk",
		"tag":"us"
		}
		],
	"chart": [
		{
		"startDate":"1957,01,12",
		"endDate":"2018,07,18",
		"headline":"tl_konet sk",
		"value":"28"
		}
		]
	}}
JSON_tl_index;
	return( $json_tl_index );
	}

function json_tl_konet( $kode, $fmt ) {
#	$json_tl_konet_hdr = "";
# 	$json_tl_konet_hdr .= '{'
#	$json_tl_konet_hdr .= '"timeline": {';
#	$json_tl_konet_hdr .= '"headline":';
#	$json_tl_konet_hdr .= '"konet main timeline headline:  tl_konet.json ",';

	$json_tl_konet="";
	$json_tl_konet = <<<JSON_tl_konet
{
    "timeline":
    {
	"headline":"konet main timeline headline:  tl_konet.json ",
        "type":"default",
	"text":"<p> ka10/tl/tl_konet.json</p>",
	"startDate":"2001,1,11",
	"date": [
		{
		"startDate":"1981,01,12",
		"endDate":"2018,07,18",
		"headline":"konet founded",
		"text": "<p>konet founded cleveland 1981</p> <a href=http://ko2.us class='popover'> <img src=/imgs/btn/ko.png> <span><img src='/imgs/btn/ok.png'></span> </a>",
		"tag":"",
		"asset": {
			"media":"/index_tl.php?q=tl&kode=tl_konet.json&idx=1&json",
			"thumbnail":"/imgs/btn/ok.png",
			"credit":"",
			"caption":""
			}
		} 
		],
	"era": [
		{
		"startDate":"1953,01,13",
		"endDate":"2018,07,18",
		"headline":"tl_konet jk",
		"tag":"us"
		}
		],
	"chart": [
		{
		"startDate":"1957,01,12",
		"endDate":"2018,07,18",
		"headline":"tl_konet sk",
		"value":"28"
		}
		]
	}}

JSON_tl_konet;
	return( $json_tl_konet );
	}



function json_tl_ko() {
	$json_tl_ko=<<<JSON_tl_ko
{
    "timeline":
    {
        "headline":"ko timejak jkwii People Say",
        "type":"default",
		"text":"ko timejak jkwii People say stuff",
		"startDate":"1953,1,01",
        "date": [
            {
                "startDate":"1953,1,13",
				"endDate":"1957,1,12",
                "headline":"ko timejak jkwii Politicians Say",
                "text":"<p>In true political fashion, his character rattles off common jargon heard from people running for office.</p>",
                "asset":
                {
                    "media":"http://ka10/test_tl.php?q=tl&kode=tl_ko&fmt=json",
                    "credit":"",
                    "caption":""
                }
            },
            {
                "startDate":"2012,1,10",
                "headline":"ko timejak jkwii  Nobody Says",
                "text":"<p>Have you ever heard someone say “can I burn a copy of your Nickelback CD?” or “my Bazooka gum still has flavor!” Nobody says that.</p>",
                "asset":
                {
                    "media":"http://youtu.be/f-x8t0JOnVw",
                    "credit":"",
                    "caption":""
                }
            },
			{
                "startDate":"2012,1,26",
                "headline":"ko timejak jkwii Chicagoans Say",
                "text":"",
                "asset":
                {
                    "media":"/index_av.html",
                    "credit":"",
                    "caption":""
                }
            },
			{
                "startDate":"2011,12,12",
                "headline":"ko timejak jkwii Girls Say",
                "text":"",
                "asset":
                {
                    "media":"/index_yt.html",
                    "credit":"",
                    "caption":"Writers & Creators: Kyle Humphrey & Graydon Sheppard"
                }
            },
			{
                "startDate":"2012,1,4",
                "headline":"ko timejak jkwii Broke People Say",
                "text":"",
                "asset":
                {
                    "media":"index_avg.html",
                    "credit":"",
                    "caption":""
                }
            },

			{
                "startDate":"2012,1,4",
                "headline":"ko timejak jkwii Silicon Valley Says",
                "text":"",
                "asset":
                {
                    "media":"index_zm.html",
                    "credit":"",
                    "caption":"written, filmed, and edited by Kate Imbach & Tom Conrad"
                }
            },
			{
                "startDate":"2011,12,25",
                "headline":"ko timejak jkwii Vegans Say index_tl.html",
                "text":"",
                "asset":
                {
                    "media":"index_tl.html",
                    "credit":"",
                    "caption":""
                }
            },
			{
                "startDate":"2012,1,23",
                "headline":"ko timejak jkwii Graphic Designers Say index_js3",
                "text":"",
                "asset":
                {
                    "media":"index_js3.html",
                    "credit":"",
                    "caption":""
                }
            },
			{
                "startDate":"2011,12,30",
                "headline":"ko timejak jkwii Wookiees Say",
                "text":"",
                "asset":
                {
                    "media":"http://youtu.be/vJpBCzzcSgA",
                    "credit":"",
                    "caption":""
                }
            },
			{
                "startDate":"2012,1,17",
                "headline":"ko timejak jksii People Say About ko timejak jksi People Say Videos",
                "text":"",
                "asset":
                {
                    "media":"http://youtu.be/c9ehQ7vO7c0",
                    "credit":"",
                    "caption":""
                }
            },
			{
                "startDate":"2012,1,20",
                "headline":"ko timejak jkwii Social Media Pros Say",
                "text":"",
                "asset":
                {
                    "media":"http://youtu.be/eRQe-BT9g_U",
                    "credit":"",
                    "caption":""
                }
            },
			{
                "startDate":"2012,1,11",
                "headline":"ko timejak jkwii Old People Say About Computers",
                "text":"",
                "asset":
                {
                    "media":"http://youtu.be/HRmc5uuoUzA",
                    "credit":"",
                    "caption":""
                }
            },
			{
                "startDate":"2012,1,11",
                "headline":"ko timejak jkwii College Freshmen Say",
                "text":"",
                "asset":
                {
                    "media":"http://youtu.be/rwozXzo0MZk",
                    "credit":"",
                    "caption":""
                }
            },
			{
                "startDate":"2011,12,16",
                "headline":"ko timejak jkwii Girls Say - Episode 2",
                "text":"",
                "asset":
                {
                    "media":"http://youtu.be/kbovd-e-hRg",
                    "credit":"",
                    "caption":"Writers & Creators: Kyle Humphrey & Graydon Sheppard"
                }
            },
			{
                "startDate":"2011,12,24",
                "headline":"ko timejak jkwii Girls Say - Episode 3 Featuring Juliette Lewis",
                "text":"",
                "asset":
                {
                    "media":"http://youtu.be/bDHUhT71JN8",
                    "credit":"",
                    "caption":"Writers & Creators: Kyle Humphrey & Graydon Sheppard"
                }
            },
			{
                "startDate":"2012,1,27",
                "headline":"ko timejak jkwii Web Designers Say",
                "text":"",
                "asset":
                {
                    "media":"http://youtu.be/MEOb_meSHhQ",
                    "credit":"",
                    "caption":""
                }
            },
			{
                "startDate":"2012,1,12",
                "headline":"ko timejak jkwii Hipsters Say",
                "text":"No meme is complete without a bit of hipster-bashing.",
                "asset":
                {
                    "media":"http://youtu.be/FUhrSVyu0Kw",
                    "credit":"",
                    "caption":"Written, Directed, Conceptualized and Performed by Carrie Valentine and Jessica Katz"
                }
            },
			{
                "startDate":"2012,1,6",
                "headline":"ko timejak jkwii Cats Say",
                "text":"No meme is complete without cats. This had to happen, obviously.",
                "asset":
                {
                    "media":"http://youtu.be/MUX58Vi-YLg",
                    "credit":"",
                    "caption":""
                }
            },
			{
                "startDate":"2012,1,21",
                "headline":"ko timejak jkwii Cyclists Say",
                "text":"",
                "asset":
                {
                    "media":"http://youtu.be/GMCkuqL9IcM",
                    "credit":"",
                    "caption":"Video script, production, and editing by Allen Krughoff of Hardcastle Photography"
                }
            },
			{
                "startDate":"2011,12,30",
                "headline":"ko timejak jkwii Yogis Say",
                "text":"",
                "asset":
                {
                    "media":"http://youtu.be/IMC1_RH_b3k",
                    "credit":"",
                    "caption":""
                }
            },




			{
                "startDate":"2012,1,18",
                "headline":"ko timejak jkwii New Yorkers Say",
                "text":"",
                "asset":
                {
                    "media":"http://youtu.be/yRvJylbSg7o",
                    "credit":"",
                    "caption":"Directed and Edited by Matt Mayer, Produced by Seth Keim, Written by Eliot Glazer. Featuring Eliot and Ilana Glazer, who are siblings, not married."
                }
            }
        ]
    }
}

JSON_tl_ko;
	return( $json_tl_ko );
	}

function json_tl_ko1() {
	$json_tl_ko1_body=<<<JSON_tl_ko1_body
{ 
"timeline": { 
	"headline":"ko1 timejak jkwii People Say", 
	"type":"default", 
	"text":"ko timejak jkwii People say stuff", 
	"startDate":"1953,1,01", 
	"date": [ 
		{ 
		"startDate":"1953,1,13", 
		"endDate":"1957,1,12", 
		"headline":"ko timejak jkwii Politicians Say", 
		"text":"",
		"asset": { 
			"media":"http://ka10/test_tl.php?q=tl&kode=tl_ko&fmt=json", 
			"credit":"", 
			"caption":"" 
			}}, 
		{ 
		"startDate":"2012,1,10", 
		"headline":"ko timejak jkwii Nobody Says", 
		"text":"", 
		"asset": { 
			"media":"http://ko.png", 
			"credit":"", 
			"caption":"" 
			}}, 
		{ 
		"startDate":"2012,1,26", 
		"headline":"json_tl_ko1_ftr A timejak jkwii Chicagoans Say", 
		"text":"", 
		"asset": { 
			"media":"/index_av.html", 
			"credit":"", "caption":"" 
			}}, 
		{ 
		"startDate":"2011,12,30", 
		"headline":"json_tl_ko1_ftr B timejak jkwii Yogis Say", 
		"text":"", 
		"asset": { 
			"media":"http://youtu.be/IMC1_RH_b3k", 
			"credit":"", 
			"caption":"" 
			}}, 
		{ 
		"startDate":"2012,1,18", 
		"headline":"json_tl_ko1_ftr timejak jkwii Say bye", 
		"text":"", 
		"asset": { 
			"media":"http://ka10", 
			"credit":"", 
			"caption":"Directed and Edited by jkwii, Produced by adminiwii and adminhewii and jak1wii jak2wii and jak3wii, who are siblings, not married." 
			}} 
		] 
	} }

JSON_tl_ko1_body;
# JSON_tl_ko1_ftr;

	$json_tl_ko1="";
#	$json_tl_ko1 .= $json_tl_ko1_hdr;
	$json_tl_ko1 .= $json_tl_ko1_body;
#	$json_tl_ko1 .= $json_tl_ko1_ftr;

	return( $json_tl_ko1 );
	}

function html_ka1( $ko_host, $dbfile, $ko_code, $ko_fmt ) {
	$php_self=$_SERVER['PHP_SELF'];

	$dttm=date('Y,m,d_H:i:s');
	$progid="$ko_host.php";
	$dbfile="$ko_host.db3";
	$dbtable="links";

	$html_ka1 = "";
	$html_ka1 .= html_hdr($progid, $dttm );
	$html_ka1 .= html_cs_ko();
	$html_ka1 .= html_js_ko();
#	$html_ka1 .= html_js_load_lists( "svc" );

	$html_ka1 .= html_body_ko_buttons();
	$html_ka1 .= html_files();
	$html_ka1 .= html_upload();
	$html_ka1 .= html_data_ko();
	$html_ka1 .= html_view_ko();
	$html_ka1 .= html_ftr();
	return($html_ka1);

#	print( "<h1>html_index MSG_1040 kode=$kode fmt=$fmt</h1><br>" ); 
#	$sql_cr_table=sql_cr_table($dbfile, $dbtable);
#	print( "h1>html_index MSG_1041 sql_cr_table=$sql_cr_table<br>" );
#	$sql_insert_ka1=sql_insert_ka1($dbfile, $dbtable);

##	$html_ka1 = "";
##	$html_ka1 .= html_hdr( $progid, $dttm );
##	$html_ka1 .= html_cs_ko();
#	$html_ka1 .= html_cs_tl();	
##	$html_ka1 .= html_js_ko();
#	$html_ka1 .= html_js_tl();	
##	$html_ka1 .= html_body();	
##	$html_ka1 .= html_data_ko();	
##	$html_ka1 .= html_view_ko();	
#	$html_ka1 .= html_data_tl();	
#	$html_ka1 .= html_view_tl();	
#	$html_view_ka1=html_view_ka1();
#	print( "<h1>html_view_ka1=$html_view_ka1" );
##	$html_ka1 .= html_ftr();	
#	print( "h1>ka1.php MSG_1041 sql_insert_tl=$sql_insert_tl<br>" );
##	return( html_ka1 );
	}



function tl_codes() {
	$tl_codes = array();
	$tl_codes[0] = "tl_index|tl_ko|tl_konet ";
	$tl_codes[1] = "tl_jtf29_protect|jtf29_protect_30|jtf29_protect_31| jtf29_protect_38";
	$tl_codes[2] = "tl_jtfdc_preserve|tl_jtfdc_preserve1|tl_jtfdc_preserve2|tl_jtfdc_preserve3";
	$tl_codes[3] = "tl_jtfinc_revival|tl_jtfinc_revival1|tl_jtfinc_reival2|tl_jtfinc_reival3";
	$tl_codes[4] = "tl_stlc_modernization|tl_stlc_modernization1|";
	$tl_codes[5] = "tl_jtfdc|tl_jtfdc_28|tl_jtfdc_29|tl_jtfdc_30|tl_jtfdc_22|tl_jtfdc_31";
	$tl_codes[6] = "tl_jtfinc|tl_jtfinc_30|tl_jtfinc_31|tl_jtfinc_32|tl_jtfinc_38|tl_jtfinc_39|tl_jtfinc_00 ";
	$tl_codes[7] = "tl_jtfdcr_dogs|tl_jtfdcr_dogs_jtf30| tl_jtfdr_dogs_jtf31|tl_jtfdcr_dogs_jtf32|tl_jtfdcr_dogs_jtf38|tl_jtfdc_dogs_jtf39|tl_jtfdc_dogs_jtf00|";
	$tl_codes[8] = "tl_jtfdcr_police|tl_jtfdcr_police_001|tl_jtfdcr_police_9999";
	$tl_codes[9] = "tl_jtfdcr_traffic|tl_jtfdcr_traffic_tree|tl_jtfdcr_traffic_fedx tl_jtfdc_traffic_ups";
	$tl_codes[10] = "tl_jtfdcr_trials|tl_jtfdcr_trial1|tl_jtfdcr_trial2|tl_jtfdc_trial3|";
	$tl_codes[11] = "tl_jtfdcr_flees|tl_jtfdcr_flee1|tl_jtfdc_flee2|tl_jtfdc_flee3";
	$tl_codes[12] = "tl_jtfdcr_flee|tl_jtfdcr_flee1|tl_jtfdc_flee2|tl_jtfdc_flee3";
	$tl_codes[13] = "tl_jtfdcr|tl_jtfdcr_trial1|tl_jtfdc_trial2|tl_jtfdc_trial3|";
	$tl_codes[14] = "tl_jtfdcr|tl_jtf22|tl_jtf28|tl_jtf29|tl_jtf30|tl_jtf31 ";
	$tl_codes[15] = "tl_jtfdcr|tl_jtf38|tl_jtf39|tl_jtf00 ";
	$tl_codes[16] = "tl_ko_saic|tl_saic_contract1|tl_saic_contract2 ";
	$tl_codes[17] = "tl_law|tl_law_sb|tl_law_keuligh|tl_law_donavan|tl_law_elster|tl_law_kt|tl_law_tc|tl_law_cohan_a|tl_law_cohan_n";
	$tl_codes[18] = "tl_kassil|tl_jk|tl_sk|tl_jsk|tl_jak1|tl_jak2|tl_jak3 ";
	$tl_codes[19] = "tl_focus|tl_che|tl_dvunited|";
	$tl_codes[20] = "tl_realty|tl_realty_typos|tl_realty_miesner|";
	$tl_codes[21] = "tl_hoa|tl_hoa_jtfdc|tl_hoa_jtfinc|tl_hoa_barrington|tl_hoa_stonehenge";
	$tl_codes[22] = "tl_faith|tl_faith_lth|tl_faith_lth_bethany|tl_faith_lth_chapel|tl_lth_divinity|tl_hoa_stonehenge";
	$tl_codes[23] = "tl_faith_lds|tl_faith_jw|tl_faith_nfm|tl_faith_lth|";
	$tl_codes[24] = "tl_farkas|tl_hansa|tl_woohoo|tl_spiro|tl_edlwiese";
	$tl_codes[25] = "tl_mil|tl_mil_knox|tl_mil_scott|tl_mil_wood|tl_mil_carson";
	$tl_codes[26] = "tl_kt|tl_kt_akido|tl_kt_taichi|tl_kt_dethours|tl_kt_savelli|tl_mil_carson";
	return( $tl_codes );
	}

function tl_assets() {
	$tl_assets = array();
	$tl_assets[0] = "";
	$tl_assets[0] = "2001-01-01,2001-11-01,head-1,/imgs/btn/koeye.png,/imgs/btn/kob,caption-0,credit-0 jkwii";
	$tl_assets[1] = "2002-02-02,2002-12-02,head-2,/imgs/btn/koeyeb.png,/imgs/btn/koeyeb.png,caption-1,credit-1 jkwii";
	$tl_assets[2] = "2003-03-03,2003-12-30,head-3,/imgs/btn/koeyew.png,/imgs/btn/koeyew.png,caption-2,credit-2 jkwii";
	$tl_assets[3] = "2003-03-03,2003-12-30,head-4,/imgs/btn/kob.png,/imgs/btn/koeyew.png,caption-2,credit-2 jkwii";
	$tl_assets[4] = "2003-03-03,2003-12-30,head-5,/imgs/btn/kow.png,/imgs/btn/koeyew.png,caption-2,credit-2 jkwii";
	$tl_assets[5] = "2003-03-03,2003-12-30,head-6,/imgs/btn/kib.png,/imgs/btn/koeyew.png,caption-2,credit-2 jkwii";
	$tl_assets[6] = "2003-03-03,2003-12-30,head-7,/imgs/btn/kiw.png,/imgs/btn/koeyew.png,caption-2,credit-2 jkwii";
	return( $tl_assets );
	}

function tl_eras() {
	$tl_eras = array();
	$tl_eras[0] = "1953-01-13,2018-12-30,head-0,tag-0";
	$tl_eras[1] = "1957-01-12,2018-12-30,head-1,tag-1";
	$tl_eras[2] = "1977-07-04,2018-12-30,head-2,tag-2";
	$tl_eras[3] = "1984-04-14,2018-12-30,head-3,tag-2";
	$tl_eras[4] = "1989-08-16,2018-12-30,head-4,tag-2";
	$tl_eras[5] = "1996-10-04,2018-12-30,head-5,tag-2";
	$tl_eras[5] = "2012-12-13,2018-12-30,head-5,tag-2";
	return( $tl_eras );
	}

function tl_charts() {
	$tl_charts = array();
	$tl_charts[0] = "1950-01-01,2018-09-18,head,val";
	$tl_charts[1] = "1960-01-01,2018-09-18,head,val";
	$tl_charts[2] = "1970-01-01,2018-09-18,head,val";
	$tl_charts[3] = "1980-01-01,2018-09-18,head,val";
	$tl_charts[4] = "1990-01-01,2018-09-18,head,val";
	$tl_charts[5] = "2000-01-01,2018-09-18,head,val";
	$tl_charts[6] = "2010-01-01,2018-09-18,head,val";
	$tl_charts[7] = "2015-01-01,2018-09-18,head,val";
	$tl_charts[8] = "2018-01-01,2018-09-18,head,val";
	$tl_charts[8] = "2018-03-01,2018-09-18,head,val";
	$tl_charts[9] = "2018-07-01,2018-09-18,head,val";
	$tl_charts[10] = "2018-07-04,2018-09-18,head,val";
	$tl_charts[11] = "2018-07-18,2018-09-18,head,val";
	$tl_charts[12] = "2018-07-19,2018-09-18,head,val";
	$tl_charts[13] = "2018-07-18,2018-09-18,head,val";
	$tl_charts[14] = "2018-06-01,2018-09-18,head,val";
	$tl_charts[15] = "2018-09-01,2018-09-18,head,val";
	$tl_charts[16] = "2019-01-01,2018-09-18,head,val";
	$tl_charts[17] = "2020-01-01,2020-12-30,head,val";
	$tl_charts[18] = "2030-01-01,2030-12-30,head,val";
	$tl_charts[19] = "2040-01-01,2040-12-30,head,val";
	$tl_charts[20] = "2050-01-01,2050-12-30,head,val";
	return( $tl_charts );
	}

function tl_testdata($dbfile, $dbtable) {
	$args=array();

	$tl_codes =  tl_codes();
	$tl_assets =  tl_assets();
	$tl_eras =  tl_eras();
	$tl_charts =  tl_charts();

	sql_drop_table( $dbfile, "tl" );
	sql_cr_table( $dbfile, "tl" );
	sql_drop_table( $dbfile, "tla" );
	sql_cr_table( $dbfile, "tla" );
	sql_drop_table( "ka1.db3", "tle" );
	sql_cr_table( "ka1.db3", "tle" );
	sql_drop_table( "ka1.db3", "tlc" );
	sql_cr_table( "ka1.db3", "tlc" );

	$j=0;
	foreach( explode( " ", $tl_codes ) as $tl_code ) {
		$j++;
		print( "test_tl.php MSG_1060 j=$j tl_code=$tl_code<br>" );

		$id = $tl_code;
		$status = 'status';
		$dttm = '2018-07-18';
		$code = $tl_code;
		$grp = $tl_code;
		$idx = $j;
		$tlid = $tl_code;
		$title = 'title_'.$tl_code;
		$begdt = '1953-01-13';
		$enddt = '1957-01-12';
		
		$head = 'head_'.$tl_code;
		$text = 'text'.$tl_code;

		$tla_begdt = "2018-07-18";
		$tla_enddt = "2018-07-18";
		$tla_head = 'head_'.$tl_code;
		$tla_text = 'text'.$tl_code;
		$tla_media = "?q=".$tl_view.",".$tl_code.",".$tl_fmt.",".$tl_num;

		$tla_tn = "/tl/imgs/tn/tn_".$tl_code.".png";

		$tle_begdt = "2018-07-18";
		$tle_enddt = "2018-07-18";
		$tle_head = "test".$tl_code;
		$tle_tag = "tag_".$tl_code;

		$tlc_begdt = "2018-07-18";
		$tlc_enddt = "2018-07-18";
		$tlc_head = "test".$tl_code;
		$tlc_val = "val_".$tl_code;


		$ja=0;
		foreach( $tl_assets as $tl_asset ) {
			$ja++;
			$args = explode( ",", $tl_asset );
			$media = $args[0];
			$tn = $args[1];
			$credit = $args[2];
			$caption = $args[3];
	
			if( $ja == 1 ) { 
				$tla_media = $media; 	
				$tla_tn = $tn; 	
				$tla_credit=$credit;
				$tla_caption=$caption;
				}

#			$media = '/imgs/btn/koeye.png';
#			$tn = '/imgs/btn/koeyeb.png';
#			$credit = 'credit_'.$tl_code;
#			$caption = 'caption_'.$tl_code;


			$sql_insert_tla = "insert or ignore into tla ( ";
			$sql_insert_tla .= "	tlid, media, tn, credit, caption ";
			$sql_insert_tla .= "		) ";
			$sql_insert_tla .= "	values ( ";
			$sql_insert_tla .= "		'".$tlid."', ";
			$sql_insert_tla .= "		'".$media."', ";
			$sql_insert_tla .= "		'".$tn."', ";
			$sql_insert_tla .= "		'".$credit."', ";
			$sql_insert_tla .= "		'".$caption."' ";
			$sql_insert_tla .= "		); ";
	

			$pdo = newpdo( $dbfile );
			$pdo->exec( $sql_insert_tla );
			$pdo = null;
			print( "MSG_1151 <h1>$ja $tlid: sql_insert_tla=$sql_insert_tla</h1><br>" ); 
			print( "MSG_1151 $ja $tlid: tl_asset=$tl_asset media=$media tn=$tn credit=$credit capton=$caption<br>" );
			}

		$je=0;
		foreach( $tl_eras as $tl_era ) {
			$je++;
			$args=explode( ",", $tl_era );
			$e_begdt = $args[0];
			$e_enddt = $args[1];
			$e_head = $args[2];
			$e_tag = $args[3];

			$eras=$je;
			if( $e_begdt < $tle_begdt ) { $tle_begdt=$e_begdt; }
			if( $e_enddt > $tle_enddt ) { $tle_enddt=$e_enddt; }
			if( $je == 1 ) { 
				$tle_head=$e_head;
				$tle_tag=$e_tag;
				}
							

#			$e_begdt = '1953-01-13';
#			$e_enddt = '2018-09-18';
#			$e_head = 'id';
#			$e_tag = 'id';
	

			$sql_insert_tle = "insert or ignore into tle ( ";
			$sql_insert_tle .= "	tlid, e_begdt, e_enddt, e_head, e_tag ";
			$sql_insert_tle .= "		) ";
			$sql_insert_tle .= "	values ( ";
			$sql_insert_tle .= "		'".$tlid."', ";
			$sql_insert_tle .= "		'".$e_begdt."', ";
			$sql_insert_tle .= "		'".$e_enddt."', ";
			$sql_insert_tle .= "		'".$e_head."', ";
			$sql_insert_tle .= "		'".$e_tag."' ";
			$sql_insert_tle .= "		); ";
	
			$pdo = newpdo( $dbfile );
			$pdo->exec( $sql_insert_tle );
			$pdo = null;
	
			print( "MSG_1161 <h1>$je $tlid: sql_insert_tle=$sql_insert_tle</h1><br>" ); 
			print( "MSG_1161 $je $tlid: tl_era=$tl_era e_begdt=$e_begdt e_enddt=$e_enddt e_head=$e_head e_tag=$e_tag<br>" );
			}
	
			
		$jc=0;
		foreach( $tl_charts as $tl_chart ) {
			$jc++;
			$args = explode( ",", $tl_chart );
			$c_begdt = $args[0];
			$c_enddt = $args[1];
			$c_head = $args[2];
			$c_val = $args[3];

			if( $tlc_begdt < $c_begdt ) { $tlc_begdt=$c_begdt; }
			if( $tlc_enddt < $c_enddt ) { $tlc_enddt=$c_enddt; }
			if( $jc == 1 ) {
				$tlc_head=$c_head;
				$tlc_val=$c_val;
				}
	
#			$c_begdt = '1957-01-12';
#			$c_enddt = '2018-09-18';
#			$c_head = 'chart head_'.$jc;
#			$c_val = 'chart_val_'.$jc;
	
			$sql_insert_tlc = "insert or ignore into tlc ( ";
			$sql_insert_tlc .= "	tlid, c_begdt, c_enddt, c_head, c_val ";
			$sql_insert_tlc .= "		) ";
			$sql_insert_tlc .= "	values ( ";
			$sql_insert_tlc .= "		'".$tlid."', ";
			$sql_insert_tlc .= "		'".$c_begdt."', ";
			$sql_insert_tlc .= "		'".$c_enddt."', ";
			$sql_insert_tlc .= "		'".$c_head."', ";
			$sql_insert_tlc .= "		'".$c_val."' ";
			$sql_insert_tlc .= "		); ";
	
			$chart=$jc;


			$pdo = newpdo($dbfile);
			$pdo->exec( $sql_insert_tlc );
			$pdo=null;
	
			print( "MSG_1161 <h1>$jc $tlid: sql_insert_tlc=$sql_insert_tlc</h1><br>" ); 
			print( "MSG_1161 $jc $tlid: tl_chart=$tl_chart c_begdt=$c_begdt c_enddt=$c_enddt c_head=$c_head c_val=$c_val<br>" );
			}

		
		$filedt = 'id';
		$exifdt = 'id';
		$tempdt = 'id';

		$exifdt = 'exifdt_'. $tl_code; 
		$tempdt = 'tempdt_'. $tl_code;
		$x = 'x_'. $tl_code;
		$y = 'y_'. $tl_code;
		$z = 'z_'. $tl_code;
		$css = 'css_'. $tl_code;
		$js = 'js_'. $tl_code;
		$json = 'json_'. $tl_code;
		$html = 'html_'. $tl_code;
		$url = 'url_'. $tl_code;
		$ofile = 'ofile_'. $tl_code;
		$img = 'img_'. $tl_code;
		$imgtn = 'imgtn_'. $tl_code;
		$desc = 'desc_'. 'desc';
		$b64 = 'b64';

		$assets=$ja;

		$begdt=$tla_begdt;
		$enddt=$tla_enddt;
		$head=$tla_head;
		$text=$tla_text;
		$media=$tla_media;
		$tn=$tla_tn;

		$eras=$je;
		$e_begdt=$tle_begdt;
		$e_enddt=$tle_enddt;
		$e_head=$tle_head;
		$e_tag=$tle_tag;

		$charts=$jc;
		$c_begdt=$tlc_begdt;
		$c_enddt=$tlc_enddt;
		$c_head=$tlc_head;
		$c_val=$tlc_val;

#	update  $dbtable set $fld1 = $val1 where $fld2=$val2;
#	update tl SET begdt='2018-07-10' WHERE tlid='tl_index';
#	update tl SET begdt='2018-07-10' WHERE rowid=0;

#	delete from $dbtable where $fld1=$val1 or $fld2=$val2;

#	CREATE TABLE Book (
#		ID     INTEGER PRIMARY KEY AUTOINCREMENT,
#		Name   VARCHAR(60) UNIQUE,
#		TypeID INTEGER,
#		Level  INTEGER,
#		Seen   INTEGER
#		)

#	INSERT INTO Test (id, name)
#		SELECT 101 as id, 'Bob' as name FROM Test WHERE NOT EXISTS( 
#			SELECT * FROM Test WHERE id = 101 and name = 'Bob'
#			) LIMIT 1;

		$sql_insert_tl = "";
#		$sql_insert_tl .= "insert or replace into tl (";
		$sql_insert_tl .= "insert or ignore into tl (";
		$sql_insert_tl .= "	id,";
		$sql_insert_tl .= "	status,";
		$sql_insert_tl .= "	dttm,";
		$sql_insert_tl .= "	code,";
		$sql_insert_tl .= "	grp,";
		$sql_insert_tl .= "	idx,";
		$sql_insert_tl .= "	tlid,";
		$sql_insert_tl .= "	title,";
		$sql_insert_tl .= "	begdt,";
		$sql_insert_tl .= "	enddt,";
		$sql_insert_tl .= "	head,";
		$sql_insert_tl .= "	text,";
		$sql_insert_tl .= "	assets,";
		$sql_insert_tl .= "	media,";
		$sql_insert_tl .= "	tn,";
		$sql_insert_tl .= "	credit,";
		$sql_insert_tl .= "	caption,";
		$sql_insert_tl .= "	eras,";
		$sql_insert_tl .= "	e_begdt,";
		$sql_insert_tl .= "	e_enddt,";
		$sql_insert_tl .= "	e_head,";
		$sql_insert_tl .= "	e_tag,";
		$sql_insert_tl .= "	charts,";
		$sql_insert_tl .= "	c_begdt,";
		$sql_insert_tl .= "	c_enddt,";
		$sql_insert_tl .= "	c_head,";
		$sql_insert_tl .= "	c_val,";
		$sql_insert_tl .= "	filedt,	";
		$sql_insert_tl .= "	exifdt,";
		$sql_insert_tl .= "	tempdt,";
		$sql_insert_tl .= "	desc,";
		$sql_insert_tl .= "	b64";
		$sql_insert_tl .= "		)";
		$sql_insert_tl .= "	values (";
		$sql_insert_tl .= "		'".$id."',";
		$sql_insert_tl .= "		'".$status."',";
		$sql_insert_tl .= "		'".$dttm."',";
		$sql_insert_tl .= "		'".$code."',";
		$sql_insert_tl .= "		'".$grp."',";
		$sql_insert_tl .= "		'".$idx."',";
		$sql_insert_tl .= "		'".$tlid."',";
		$sql_insert_tl .= "		'".$title."',";
		$sql_insert_tl .= "		'".$begdt."',";
		$sql_insert_tl .= "		'".$enddt."',";
		$sql_insert_tl .= "		'".$head."',";
		$sql_insert_tl .= "		'".$text."',";
		$sql_insert_tl .= "		'".$assets."',";
		$sql_insert_tl .= "		'".$media."',";
		$sql_insert_tl .= "		'".$tn."',";
		$sql_insert_tl .= "		'".$credit."',";
		$sql_insert_tl .= "		'".$caption."',";
		$sql_insert_tl .= "";
		$sql_insert_tl .= "		'".$eras."',";
		$sql_insert_tl .= "		'".$e_begdt."',";
		$sql_insert_tl .= "		'".$e_enddt."',";
		$sql_insert_tl .= "		'".$e_head."',";
		$sql_insert_tl .= "		'".$e_tag."',";
		$sql_insert_tl .= "";
		$sql_insert_tl .= "		'".$chart."',";
		$sql_insert_tl .= "		'".$c_begdt."',";
		$sql_insert_tl .= "		'".$c_enddt."',";
		$sql_insert_tl .= "		'".$c_head."',";
		$sql_insert_tl .= "		'".$c_val."',";
		$sql_insert_tl .= "";
		$sql_insert_tl .= "		'".$filedt."',";
		$sql_insert_tl .= "		'".$exifdt."',";
		$sql_insert_tl .= "		'".$tempdt."',";
		$sql_insert_tl .= "		'".$desc."',";
		$sql_insert_tl .= "		'".$b64."'";
		$sql_insert_tl .= "		);";

		print( "html_index MSG_1150 $j tl_code=$tl_code sql_insert_tl=$sql_insert_tl<br>" );
		$pdo = newpdo($dbfile);
		$pdo->exec($sql_insert_tl);
		$pdo = null;
		}
	return( $sql_insert_tl );
	}



function sql_cr_table ($dbfile, $dbtable) {
	print( "sql_cr_table MSG_3490 dbfile=$dbfile dbtable=$dbtable<br>" );
	
	$sql_cr_table = "";
	$sql_cr_table .= "create table if not exists ".$dbtable." (";
	$sql_cr_table .= "		id varchar,";
	$sql_cr_table .= "		status varchar,";
	$sql_cr_table .= "		dttm varchar,";
	$sql_cr_table .= "		code varchar,";
	$sql_cr_table .= "		grp varchar,";
	$sql_cr_table .= "		num varchar,";
	$sql_cr_table .= "		tlid varchar,";
	$sql_cr_table .= "		title varchar,";
	$sql_cr_table .= "		begdt varchar,";
	$sql_cr_table .= "		enddt varchar,";
	$sql_cr_table .= "		head varchar,";
	$sql_cr_table .= "		text varchar,";
	$sql_cr_table .= "		assets varchar,";
	$sql_cr_table .= "		media varchar,";
	$sql_cr_table .= "		tn varchar,";
	$sql_cr_table .= "		credit varchar,";
	$sql_cr_table .= "		caption varchar,";
	$sql_cr_table .= "		eras varchar,";
	$sql_cr_table .= "		e_begdt varchar,";
	$sql_cr_table .= "		e_enddt varchar,";
	$sql_cr_table .= "		e_head varchar,";
	$sql_cr_table .= "		e_tag varchar,";
	$sql_cr_table .= "		charts varchar,";
	$sql_cr_table .= "		c_begdt varchar,";
	$sql_cr_table .= "		c_enddt varchar,";
	$sql_cr_table .= "		c_head varchar,";
	$sql_cr_table .= "		c_val varchar,";
	$sql_cr_table .= "		filedt varchar,	";
	$sql_cr_table .= "		exifdt varchar,";
	$sql_cr_table .= "		tempdt varchar,";
	$sql_cr_table .= "		x varchar,";
	$sql_cr_table .= "		y varchar,";
	$sql_cr_table .= "		x varchar,";
	$sql_cr_table .= "		css varchar,";
	$sql_cr_table .= "		js varchar,";
	$sql_cr_table .= "		json varchar,";
	$sql_cr_table .= "		html varchar,";
	$sql_cr_table .= "		url varchar,";
	$sql_cr_table .= "		ifile varchar,";
	$sql_cr_table .= "		ofile varchar,";
	$sql_cr_table .= "		img varchar,";
	$sql_cr_table .= "		imgtn varchar,";
	$sql_cr_table .= "		desc varchar,";
	$sql_cr_table .= "		b64 varchar";
	$sql_cr_table .= "		);";

	$pdo = newpdo( $dbfile );
	$pdo->exec($sql_cr_table);
	$pdo = null;
	return( $sql_cr_table );
	}

function sql_drop_table ( $dbfile, $dbtable) {
	$sql_drop_table="drop table if exists ".$dbtable;
	$pdo = newpdo ($dbfile );
	return( $sql_drop_table );
	}
function sql_cr_cfg( $cfg_dbfile, $cfg_dbtable, $cfgtext ) {
#	$cfg_dbfile="./ka1.db3";
#	$cfg_dbfile=$dbfile;
#	$cfg_dbtable="cfg";

#	$cfg_dbfile=$GLOBALS['cfg_dbfile'];
#	$cfg_dbtable=$GLOBALS['cfg_dbtable'];
#	$dbfile=$cfg_dbfile;
#	$dbtable=$cfg_dbtable;

	$sql_cr_cfg="";
	$sql_cr_cfg .= "create table if not exists ".$cfg_dbtable." (";
	$sql_cr_cfg .= "idx varchar,";
	$sql_cr_cfg .= "status varchar,";
	$sql_cr_cfg .= "dttm varchar,";
	$sql_cr_cfg .= "host varchar,";
	$sql_cr_cfg .= "code varchar,";
	$sql_cr_cfg .= "grp varchar,";
	$sql_cr_cfg .= "progid varchar,";
	$sql_cr_cfg .= "key varchar,";
	$sql_cr_cfg .= "val varchar,";

	$sql_cr_cfg .= "text varchar,";
	$sql_cr_cfg .= "local_addr varchar,";
	$sql_cr_cfg .= "local_port varchar,";
	$sql_cr_cfg .= "remote_addr varchar,";
	$sql_cr_cfg .= "remote_port varchar,";
	$sql_cr_cfg .= "http_host varchar,";
	$sql_cr_cfg .= "php_self varchar,";
	$sql_cr_cfg .= "user_agent varchar,";
	$sql_cr_cfg .= "query_string varchar,";
	$sql_cr_cfg .= "args varchar,";
	$sql_cr_cfg .= "css varchar,";
	$sql_cr_cfg .= "js varchar,";
	$sql_cr_cfg .= "json varchar,";
	$sql_cr_cfg .= "html varchar,";
	$sql_cr_cfg .= "x varchar,";
	$sql_cr_cfg .= "y varchar,";
	$sql_cr_cfg .= "z varchar,";
	$sql_cr_cfg .= "begdt varchar,";
	$sql_cr_cfg .= "enddt varchar,";
	$sql_cr_cfg .= "ifile varchar,";
	$sql_cr_cfg .= "ofile varchar,";
	$sql_cr_cfg .= "img varchar,";
	$sql_cr_cfg .= "tn varchar,";
	$sql_cr_cfg .= "desc varchar,";
	$sql_cr_cfg .= "b64 varchar";
	$sql_cr_cfg .= ")";

#	print( "BUGS_3590 sql_cr_cfg=$sql_cr_cfg<br>" );
	$pdo = newpdo( $cfg_dbfile );
	$pdo->exec($sql_cr_cfg);
	$pdo = null;

	return( $sql_cr_cfg );
	}


function sql_cr_log( $log_dbfile, $log_dbtable, $logtext ) {
#	$log_dbfile="./ka1_log.db3";
#	$log_dbtable="log";

	$log_dbfile=$GLOBALS['log_dbfile'];
	$log_dbtable=$GLOBALS['log_dbtable'];
	$dbfile=$log_dbfile;
	$dbtable=$log_dbtable;

	$sql_cr_log="";
	$sql_cr_log .= "create table if not exists ".$log_dbtable." (";
	$sql_cr_log .= "idx varchar,";
	$sql_cr_log .= "status varchar,";
	$sql_cr_log .= "dttm varchar,";
	$sql_cr_log .= "kode varchar,";
	$sql_cr_log .= "progid varchar,";
	$sql_cr_log .= "logtext varchar,";
	$sql_cr_log .= "local_addr varchar,";
	$sql_cr_log .= "local_port varchar,";
	$sql_cr_log .= "remote_addr varchar,";
	$sql_cr_log .= "remote_port varchar,";
	$sql_cr_log .= "http_host varchar,";
	$sql_cr_log .= "php_self varchar,";
	$sql_cr_log .= "user_agent varchar,";
	$sql_cr_log .= "query_string varchar,";
	$sql_cr_log .= "args varchar,";
	$sql_cr_log .= "css varchar,";
	$sql_cr_log .= "js varchar,";
	$sql_cr_log .= "json varchar,";
	$sql_cr_log .= "html varchar,";
	$sql_cr_log .= "begdt varchar,";
	$sql_cr_log .= "enddt varchar,";
	$sql_cr_log .= "x varchar,";
	$sql_cr_log .= "y varchar,";
	$sql_cr_log .= "ifile varchar,";
	$sql_cr_log .= "ofile varchar,";
	$sql_cr_log .= "img varchar,";
	$sql_cr_log .= "tn varchar,";
	$sql_cr_log .= "desc varchar,";
	$sql_cr_log .= "b64 varchar";
	$sql_cr_log .= ")";

#	print( "BUGS_3573 sql_cr_log=$sql_cr_log<br>" );
	$pdo = newpdo( $log_dbfile );
	$pdo->exec($sql_cr_log);
	$pdo = null;

	return( $sql_cr_log );
	}

function ko_io_match($ifile, $ofile, $match_beg, $match_end, $idata ) {
	print( "ko_io BUGS_3650 ifile=$ifile ofile=$ofile match_beg=$match_beg end=$match_end idata=$idata<br> " );
	$dttm=date('Y,m,d_H:i:s');
	$php_self=$_SERVER['PHP_SELF'];
	$remote_addr=$_SERVER['REMOTE_ADDR'];
#	$user_agent=$_SERVER['USER_AGENT'];
	$user_agent="user_agent";
	$query_string=$_SERVER['QUERY_STRING'];
	$progid=$GLOBALS['progid'];


	$ko_io_flag="yes"; $image=""; $oline="";
#	printf( "$progid $dttm MSG:_3660:  FOUND ifile=[$ifile][$remote_addr][$php_self]<br>\n" );
	if( $ko_io_flag == "yes" ) {
		if( file_exists( $ifile )) {
			printf( "$progid $dttm MSG:_3530:  FOUND ifile=[$ifile][$remote_addr][$php_self]<br>\n" );
			$fp = fopen( $ifile, 'r' );
			$matchflag="";
			$olines="";
			while( $bigline = fread($fp, 1024)) { 
				$image .= $bigline;
				$lines = explode("\n", $bigline );
				for( $j=0; $j < count($lines); $j++ ) {
					$line=$lines[$j];
//					printf( "$progid $dttm MSG:_150:  $j line=[$line] [$remote_addr]<br>\n" );
//					if( $remote_addr == $line ) { printf( "ALLOW<br>\n" ); }
					if( preg_match( "/$match_beg/", $line, $matches)) {
						$oline .= $line;
						if( $idata != "" ) {
							$oline .= $idata;
							}

						$matchflag=$line;
//						$allowflag="true";
						$allowflag=$line;
						$GLOBALS['allowflag']=$line;
						$GLOBALS['kb_ip']=$remote_addr;
						continue;
//						break;
						}
					if( preg_match( "/$match_end/", $line, $matches)) {
						$matchflag="";
						}
					}
				$olines .= $line;
//				printf( "$progid $dttm MSG_110:  line=[$line]<br>\n" );
				}
			fclose( $fp );

//			$fpo = fopen( $ofile, 'w' );
//			$fwrite( $fpo, $olines );
//			fclose( $fpo );
			}
		}
	else {
//		$logrec="$progid|$dttm|bugs_0161_notfound_hostsallow|$remote_addr|ERR_NOTFOUND_hosts_allow=$hosts_allow|\n"; logwrite( $logfil, $logrec );
//		printf( "$progid $dttm ERR_210: NOTFOUND hosts_allow=[$hosts_allow][$remote_addr]<br>\n" );
		}
	return( $olines );
	}

function db2_startup($args) {
	$htmout = "";
#	$htmout .= htmout_head('');

#	$dbname="dgs";
#	$server="localhost";
#	$user="root";
#	$pass="..root";
#	$db2=db2_connect($server,$dbname,$user,$pass);
#	$htmout .= mysql_cr_tbl($mysql,$tbl);
#	$sql="select * from $tbl";
	$sql="show tables;";
	db2_sel($mysql, $sql);

#	$htmout .= $htmout_tail('');
	print($htmout);
	return( $htmout );
	}



function db2_query_kludge( $server,$dbname,$tbl,$sql, $db3fil, $user,$pass ) {

	$fmt="html";
	if( $tbl == "" ) { $tbl="ko_temp"; }
	if( $dbname == "" ) { $dbname="dgs"; }
	if( $sql == "" ) { $sql="select * from $tbl"; }
	if( isset($_REQUEST['fmt'] )) { $fmt=$_REQUEST['fmt']; }
	if( isset($_REQUEST['dbname'] )) { $dbname=$_REQUEST['dbname']; }
	if( isset($_REQUEST['tbl'] )) { $tbl=$_REQUEST['tbl']; }
	if( isset($_REQUEST['sql'] )) { $sql=$_REQUEST['sql']; }

	print( "<h1>BUGS_34100 DB2_QUERY dbname=$dbname tbl=$tbl sql=$sql</h1>" );
	$htmout = "";
	$htmout .= "<table id=table=$tbl>\n";
	$htmout_table_hdr="";
	$htmout_table="";
	$json="";
	$json="{";
	$psv="";
	$csv="";
	try {
		$db2 = new PDO("mysql:host=$server;dbname=$dbname",$user,$pass);
		$db2->exec("SET CHARACTER SET utf8");
		}
	catch(PDOException $e) {
		print( "<h1>ERR_34105 DB2_QUERY dbname=$dbname tbl=$tbl sql=$sql e=".$e->getMessage()."</h1>\n" );
		}
	$db2 = null;
	return( $htmout );
	}


function mysql2sql3_create_kludge( $server,$dbname,$tbl,$user,$pass,$db3fil) {
	$htmout = "";
	$sql="describe $tbl;";
	print( "<h1>BUGS_34000 mysql2sql3 server=$server dbname=$dbname tbl=$tbl, user=$user, sql=$sql db3fil=$db3fil</h1>" );
	try {
		$db2 = new PDO("mysql:host=$server;dbname=$dbname",$user,$pass);
		$db2->exec("SET CHARACTER SET utf8");

#		print("<h1>MSG_34086 DB2_QUERY dbname=$dbname tbl=$tbl sql=$sql</h1>\n");
#		$sql = "use $db;insert into $tbl (fname,lname,email) values ('$fname', '$lname','$email');";

#		$result=$db2->query($sql);
#		print("<h1>MSG_34087 DB2_QUERY dbname=$dbname tbl=$tbl sql=$sql</h1>\n");


		$stmt = $db2->query($sql);
#		while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
#		while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
#		$sql2 = "create table if not exists $tbl ( \n";
		$csv_flds=""; $csv_vals="";
		$psv_flds=""; $psv_vals="";
		$j=0;
		while ($row = $stmt->fetch(PDO::FETCH_BOTH)) {
			$j=$j+1;
			$colnam=$row[0];
			$fld=$row[0];
			$val=$row[0];
			$type=$row[1];
			$len=$row[2];
			$htmout_table_flds="<td>$fld</td>";
			$htmout_table_vals = "<td>$val</td>";
			$json="'$fld','$val',";
			$psv_flds .= "$fld|";
			$psv_vals .= "$fld|";
#			print( "<h2>BUGS_34105 Name: row0=".$row[0]." row1=".$row[1]."</h2>");
			print( "<h2>BUGS_34102 j=$j tbl=$tbl colnam=$colnam type=$type len=$len</h2>" );
			}

		$psv_flds .= "\n";
		$psv_vals .= "\n";
		$json .= "}\n";

		$htmout .= $htmout_table_flds;
		$htmout .= $htmout_table_vals;
		$htmout .= "	</table>\n";
		$txt .= "\n";
		$json = preg_replace('/,}/', '}', $json );
		$psv_flds = preg_replace('/|\n/','\n',$psv_flds );
		$psv_vals = preg_replace('/|\n/','\n',$psv_flds );
		print( "<h2>BUGS_34160 fmt=$fmt</h2>" );
		print( "<h3>BUGS_34161 psv=$psv</h3>" );
		print( "<h3>BUGS_34162 json=$json</h3>" );
		print( "<h3>BUGS_34163 csv=$csv</h3>" );
		print( "<h3>BUGS_34164 htmout=$htmout</h3>" );
		print( "<h3>BUGS_34165 txt=$txt</h3>" );

		if( $fmt == "json" ) { return($json); }
		if( $fmt == "html" ) { return($html); }
		if( $fmt == "psv" ) { return($psv); }
		if( $fmt == "csv" ) { return($csv); }
		if( $fmt == "txt" ) { return($txt); }
		return($html);

		$sql2 .= ");";
		$sql3 = preg_replace('/, \)/', ' )', $sql2 );
		print( "<h2>BUGS_34103 j=$j tbl=$tbl sql3=$sql3</h2>" );
		$db3=newpdo($db3fil);
		$db3->exec($sql3);
		$db3=null;
		

		if($result !== false ) {
			$cols = $result->columnCount();
			$rows = 0;
#			print( "<h1>MSG_34088 DB2_QUERY rows=$rows cols=$cols dbname=$dbname tbl=$tbl sql=$sql </h1>\n" );

#			$rownames = $db2->query('SELECT * FROM my_table LIMIT 0');
#			$rownames = $db2->query($sql);
#			$j=0; $k=0;
#			for ($i = 0; $i < $rownames->columnCount(); $i++) {
#				$col = $rownames->getColumnMeta($i);
#				$tbl=$col['table'];
#				
#				$colname=$col['name'];
#				$collen=$col['len'];
#				if( $colname == "" ) { continue; }
#				print( "<h2>BUGS_34101 tbl=$tbl colname=$colname collen=$collen</h2>" );
##				print_r($col);

#				if( $i == 0 ) { $sql3 = "create table if not exists $tbl ("; }
#				$sql3 .= "	'$colname' varchar,";
#				$k=$k+1;
#				print( "<h2>BUGS_34102 tbl=$tbl colname=$colname collen=$collen</h2>" );
##				print_r($columns);
#				}

#			$sql3 .= " );";
#			$sql2 = preg_replace('/, \);/', ' );', $sql3 );
#			print( "<h1>MSG_34110 db3fil=$db3fil sql3=$sql3 </h1>" );
#			print( "<h2>MSG_34111 db3fil=$db3fil sql3=$sql3 </h2>" );
#			if( $db3fil == "" ) { $db3fil="dgs.db3"; }
#			$db3=newpdo($db3fil);
#			$db3->exec($sql);
#			$db3=null;
			
#			$result = $db2->query("select * from $tbl limit 1");
#			$j=0;
#			while($row = $result->fetch()) {
#				$j=$j+1;
#				print("<h1>MSG_232 MYSQL_SEL_FETCH j=$j db=$db sql=$sql</h1>\n");
##				print( "<h1>FETCH j=$j ".$row['id']." - ".$row['lname'] ." - ".$row['email']. "</h1>\n" );
#				print( "<h1>FETCH j=$j ".$row['id']." - ".$row['lname'] ." - ".$row['email']. "</h1>\n" );
#				}

#			$fields = array_keys($result->fetch(PDO::FETCH_ASSOC));
#			$cols= $result->columnCount();
#			print( "<h1>MSG_34091 cols=$cols ".fields=$fields[0]."<h1>" );
#			print( "<h1>MSG_34092 cols=$cols ".fields=$fields[0]."<h1>" );
#			print_r($fields);


			$j=0;
#			foreach($result as $row) {
#				print("<h1>MSG_233 MYSQL_SEL_AS j=$j db=$db sql=$sql</h1>\n");
#				print( "<h1>AS j=$j ".$row['id']." - ".$row['lname'] ." - ".$row['email']. "</h1>\n" );
#				print( "<h1>AS j=$j ".$row[$fields[0]]." - ".$row[$fields[1]] ." - ".$row[$fields[3]]. "</h1>\n" );
#				}
#			print("<h1>MSG_34104 DB2_QUERY j=$j dbname=$dbname sql=$sql</h1>\n");
			}
		$db2 = null;
		}
	catch(PDOException $e) {
		print( "<h1>ERR_34181 MYSQL2SQL3 j=$j dbname=$dbname sql=$sql e=".$e->getMessage()."</h1>\n" );
		}

#	print( "MSG_34110 $dbname rows=$rows cols=$cols sql=$sql<br>\n" );
	return($htmout);
	}



# jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj

# function db2_query( $db2,$tbl,$sql2,$db3fil) {
function db2_query( $server,$dbname,$tbl,$sql, $db3fil, $user,$pass ) {
#	print( "<h3>MSG_34310 DB2_QUERY TODO dbname=$dbname tbl=$tbl sql=$sql</h3>" );
	$htmout = ""; $j=0; $k=0;
	$fmt="html";
	if( $tbl == "" ) { $tbl="ko_temp"; }
	if( $dbname == "" ) { $dbname="dgs"; }
	if( $sql == "" ) { $sql="select * from $tbl"; }
	if( isset($_REQUEST['fmt'] )) { $fmt=$_REQUEST['fmt']; }
	if( isset($_REQUEST['dbname'] )) { $dbname=$_REQUEST['dbname']; }
	if( isset($_REQUEST['tbl'] )) { $tbl=$_REQUEST['tbl']; }
	if( isset($_REQUEST['sql'] )) { $sql=$_REQUEST['sql']; }
	
#	print( "<h2>BUGS_34290 DB2_QUERY dbname=$dbname tbl=$tbl sql=$sql</h2>" );
	$htmout = "";
	$htmout_table = "<table id=table=$tbl>\n";
	$htmout_table_hdr="";
	$htmout_table_body="";
	$htmout_table_body="	</table>\n";
	$json="";
	$json="{";
	$psv="";
	$csv="";
	$txt="";
	$sqlout="";
	$sqlout .= "insert or replace into $tbl ";
	try {
		$db2 = new PDO("mysql:host=$server;dbname=$dbname",$user,$pass);
		$db2->exec("SET CHARACTER SET utf8");
#		print( "<h3>MSG_34340 DB2_QUERY dbname=$dbname tbl=$tbl sql=$sql</h3>\n" );

		$db2 = new PDO("mysql:host=$server;dbname=$dbname",$user,$pass);
		$db2->exec("SET CHARACTER SET utf8");

		$result=$db2->query($sql);
#		print("<h1>MSG_34221 DB2_QUERY dbname=$dbname tbl=$tbl sql=$sql</h1>\n");

		$colcnt=$result->columnCount();
		$rowcnt=$result->rowCount();
		$table=$result->getColumnMeta(0)['table'];
		$j=0; $k=0; $i=0;
#		$colcnt=0; $rowcnt=0;
#		print( "<h3>MSG_34350 j=$j k=$k i=$i tbl=$tbl tbl=$tbl sql=$sql</h3>");
#		while ($row = $stmt->fetch(PDO::FETCH_BOTH)) {
		$sql_flds="";
		$sql_vals="";

		$htmout_table .= "<table id=table_show>";
		$htmout_table_hdr .= "<tr>";
		$htmout_table_body .= "<tr>";
		while ($row = $result->fetch(PDO::FETCH_BOTH)) {
			$sql_flds="(";
			$sql_vals="(";
#			print( "<h3>MSG_34235 j=$j k=$k i=$i tbl=$tbl colcnt=$colcnt rowcnt=$rowcnt</h3>");
			$htmout .= "<tr>";

			for( $k=0; $k<$colcnt; $k++ ) {
				$fld=$result->getColumnMeta($k)['name'];
				$val=$row[$fld];
#				$val=$row[$k];
				$sql_flds .= "'$fld',";	
				$sql_vals .= "'$val',";	

#				if( isset($_REQUEST['sql'])) { $url_sql = $_REQUEST['sql']; }
#				if(( preg_match('/show/',$url_sql)
#				|| ( preg_match('/tables/',$url_sql) 
#				|| ( preg_match('/show tables/',$url_sql) 
#				|| ( preg_match('/show_tables/',$sql_url)) {
#				if( preg_match('/show/',$url_sql)) {


				if(( preg_match('/show/',$_REQUEST['db2'])) 
				|| ( preg_match('/show/',$_REQUEST['db2']))) {
					print( "<h2>BUGS_34382 url_sql=$url_sql</h2>" );
					$tblnam = $val;
					$ht_link = "";
					$ht_link .= "<a href=./ko.php?db2=select_$tblnam target=_blank>\n";
					$ht_link .= "<img src='/imgs/btn/koeye.png' height=20>$tblnam $sql\n";
					$ht_link .= "	</a><br>";
					$htmout .= "<td>$ht_link</td>";
					print( $ht_link );
					}

				if(( preg_match('/select/',$_REQUEST['db2'])) 
				|| ( preg_match('/sel/',$_REQUEST['db2']))) {
#					print( "<h2>BUGS_34400 DB2_QUERY SELECT  tbl=$tbl sql=$sql</h2>" );
					$tblnam = $val;
					$ht_link = "";
#					$ht_link .= "<a href=./?db2=select_$tblnam target=_blank>\n";
#					$ht_link .= "<img src='/imgs/btn/koeye.png' height=20>$tblnam $sql\n";
#					$ht_link .= "	</a><br>";
#					$htmout .= "<td>$ht_link</td>";
					print( $ht_link );
					}

#				print( "MSG_34230 j=$j k=$k tbl=$tbl colcnt=$colcnt rowcnt=$rowcnt name=$name value=$value<br>");
				print( "MSG_34344 j=$j k=$k tbl=$tbl fld=<b>$fld</b> val=<b>$val</b><br>");
				}

			$htmout_table_hdr .= "</tr>\n";
			$htmout_table_body .= "</tr>\n";
			$htmout_table .= $htmout_table_hdr;
			$htmout_table .= $htmout_table_body;
			$htmout_table .= "	</table>\n";

			$sql_flds .= " )";
			$sql_vals .= " )";
			$sql3_flds = preg_replace("/, \)/", " );", $sql_flds );
			$sql3_vals = preg_replace("/, \)/", " );", $sql_vals );
			$htmout .= $htmout_table;
#			print( "MSG_34331 j=$j k=$k tbl=$tbl sql_flds=$sql_flds sql_vals=$sql_vals<br>");
#			print( "<h3>MSG_34351 j=$j k=$k tbl=$tbl sql3_insert=$sql3_insert</h3>");
		
			$j=$j+1;
			}	

#		$db3=newpdo($db3fil);
#		$db3->exec($sql3_insert);
#		$db3=null;

		print("<h2>MSG_34230 DB2_QUERY DONE j=$j k=$k i=$i dbname=$dbname tbl=$tbl rowcnt=$rowcnt colcnt=$colcnt sql=$sql</h2>\n");
		$sqlout .= $sql_flds . $sql_vals;
		if( $fmt == "html" ) { return($htmout); }
		if( $fmt == "json" ) { return($json); }
		if( $fmt == "psv" ) { return($psv); }
		if( $fmt == "csv" ) { return($csv); }
		if( $fmt == "sql" ) { return($sqlout); }
		if( $fmt == "txt" ) { return($txt); }
		return($htmout);
		}
			
	catch(PDOException $e) {
		print( "<h2>ERR_34352 DB2_QUERY j=$j k=$k dbname=$dbname sql=$sql e=".$e->getMessage()."</h2>\n" );
		}

#	print( "<h1>MSG_34360 DB2_QUERY j=$j k=$k dbname=$dbname tbl=$tbl sql=sql=$sql</h1>\n" );
#	print( "<h1>MSG_34360 $dbname tbl=$tbl rowcnt=$rowcnt colcnt=$colcnt sql=sql=$sql</h1>\n" );
	return($htmout);
	}

function mysql2sql3_insert( $server,$dbname,$tbl,$user,$pass,$db3fil) {
	print( "<h1>BUGS_34340 mysql2sql3_insert</h1" );
	$htmout = "";
	$sql="describe $tbl;";

#	print( "<h1>BUGS_34000 mysql2sql3 server=$server dbname=$dbname tbl=$tbl, user=$user, sql=$sql db3fil=$db3fil</h1>" );
	try {
		$db2 = new PDO("mysql:host=$server;dbname=$dbname",$user,$pass);
		$db2->exec("SET CHARACTER SET utf8");

#		print("<h1>MSG_34200 DB2_QUERY dbname=$dbname tbl=$tbl sql=$sql</h1>\n");
#		$sql = "use $db;insert into $tbl (fname,lname,email) values ('$fname', '$lname','$email');";

		$result=$db2->query($sql);
#		print("<h1>MSG_34221 DB2_QUERY dbname=$dbname tbl=$tbl sql=$sql</h1>\n");

		$colcnt=$result->columnCount();
		$rowcnt=$result->rowCount();
		$table=$result->getColumnMeta(0)['table'];
		$j=0; $k=0; $i=0;
#		$colcnt=0; $rowcnt=0;
		print( "<h3>MSG_34220 j=$j k=$k i=$i tbl=$tbl tbl=$tbl sql=$sql</h3>");
#		while ($row = $stmt->fetch(PDO::FETCH_BOTH)) {
#		$sql2="insert or replace into $tbl ";
		$sql2="create table if not exists   $tbl ";
		$sql2_flds="";
		$sql2_vals="";


		while ($row = $result->fetch(PDO::FETCH_BOTH)) {
			$sql2_flds="(";
			$sql2_vals="(";
			print( "<h3>MSG_34425 j=$j k=$k i=$i tbl=$tbl colcnt=$colcnt rowcnt=$rowcnt</h3>");

			for( $k=0; $k<$colcnt; $k++ ) {
				$fld=$result->getColumnMeta($k)['name'];
				$val=$row[$fld];
#				$val=$row[$k];
				$sql2_flds .= "$fld varchar, ";	
				$sql2_vals .= "'$val',";	

#				print( "MSG_34230 j=$j k=$k tbl=$tbl colcnt=$colcnt rowcnt=$rowcnt name=$name value=$value<br>");
				print( "MSG_34230 j=$j k=$k tbl=$tbl fld=$fld val=$val<br>");
				}
			$sql2_flds .= " )";
			$sql2_vals .= " )";
			$sql3_flds = preg_replace("/, \)/", " );", $sql2_flds );
			$sql3_vals = preg_replace("/, \)/", " );", $sql2_vals );

			$sql3_insert="insert or replace into $tbl ";
			$sql3_insert .= $sql3_flds;
			$sql3_insert .= " values ";
			$sql3_insert .= $sql3_vals;

#			print( "MSG_34231 j=$j k=$k tbl=$tbl sql_flds=$sql_flds sql_vals=$sql_vals<br>");
			print( "<h3>MSG_34231 j=$j k=$k tbl=$tbl sql3_insert=$sql3_insert</h3>");
		
			$j=$j+1;
			}	

		print("<h2>MSG_34230 DB2_QUERY DONE j=$j k=$k i=$i dbname=$dbname tbl=$tbl rowcnt=$rowcnt colcnt=$colcnt sql=$sql</h2>\n");
#		$db3=newpdo($db3fil);
#		$db3->exec($sql3_insert);
#		$db3=null;

		return("");
		}
			
	catch(PDOException $e) {
		print( "<h1>ERR_34380 MYSQL2SQL3 j=$j dbname=$dbname sql=$sql e=".$e->getMessage()."</h1>\n" );
		}

	print( "<h1>MSG_34300 $dbname tbl=$tbl rowcnt=$rowcnt colcnt=$colcnt sql=sql=$sql</h1>\n" );
	return($htmout);
	}




# kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk


function mysql2sql3_insert2( $server,$dbname,$tbl,$user,$pass,$db3fil) {
	print( "<h1>BUGS_34420 mysql2sql3_insert2</h1" );
	$htmout = "";
	$sql="describe $tbl;";
	$tbl="Players";
	$tbl="Games";
	$tbl="ko_temp";
	$sql="select * from $tbl";
	$sql="select id,lname,reg_date from $tbl";

#	print( "<h1>BUGS_34000 mysql2sql3 server=$server dbname=$dbname tbl=$tbl, user=$user, sql=$sql db3fil=$db3fil</h1>" );
	try {
		$db2 = new PDO("mysql:host=$server;dbname=$dbname",$user,$pass);
		$db2->exec("SET CHARACTER SET utf8");

#		print("<h1>MSG_34200 DB2_QUERY dbname=$dbname tbl=$tbl sql=$sql</h1>\n");
#		$sql = "use $db;insert into $tbl (fname,lname,email) values ('$fname', '$lname','$email');";

		$result=$db2->query($sql);
#		print("<h1>MSG_34221 DB2_QUERY dbname=$dbname tbl=$tbl sql=$sql</h1>\n");

		$colcnt=$result->columnCount();
		$rowcnt=$result->rowCount();
		$table=$result->getColumnMeta(0)['table'];
		$j=0; $k=0; $i=0;
#		$colcnt=0; $rowcnt=0;
		print( "<h3>MSG_34220 j=$j k=$k i=$i tbl=$tbl tbl=$tbl sql=$sql</h3>");
#		while ($row = $stmt->fetch(PDO::FETCH_BOTH)) {
		$sql2="insert or replace into $tbl ";
		$sql2_flds="";
		$sql2_vals="";


		while ($row = $result->fetch(PDO::FETCH_BOTH)) {
			$sql2_flds="(";
			$sql2_vals="(";
#			print( "<h3>MSG_34225 j=$j k=$k i=$i tbl=$tbl colcnt=$colcnt rowcnt=$rowcnt</h3>");

			for( $k=0; $k<$colcnt; $k++ ) {
				$fld=$result->getColumnMeta($k)['name'];
				$val=$row[$fld];
#				$val=$row[$k];
				$sql2_flds .= "'$fld',";	
				$sql2_vals .= "'$val',";	

#				print( "MSG_34230 j=$j k=$k tbl=$tbl colcnt=$colcnt rowcnt=$rowcnt name=$name value=$value<br>");
				print( "MSG_34230 j=$j k=$k tbl=$tbl fld=$fld val=$val<br>");
				}
			$sql2_flds .= " )";
			$sql2_vals .= " )";
			$sql3_flds = preg_replace("/, \)/", " );", $sql2_flds );
			$sql3_vals = preg_replace("/, \)/", " );", $sql2_vals );

			$sql3_insert="insert or replace into $tbl ";
			$sql3_insert .= $sql3_flds;
			$sql3_insert .= " values ";
			$sql3_insert .= $sql3_vals;

#			print( "MSG_34231 j=$j k=$k tbl=$tbl sql_flds=$sql_flds sql_vals=$sql_vals<br>");
			print( "<h3>MSG_34231 j=$j k=$k tbl=$tbl sql3_insert=$sql3_insert</h3>");
		
			$j=$j+1;
			}	

		print("<h2>MSG_34230 DB2_QUERY DONE j=$j k=$k i=$i dbname=$dbname tbl=$tbl rowcnt=$rowcnt colcnt=$colcnt sql=$sql</h2>\n");
#		$db3=newpdo($db3fil);
#		$db3->exec($sql3_insert);
#		$db3=null;

		return("");
		}
			
	catch(PDOException $e) {
		print( "<h1>ERR_34380 MYSQL2SQL3 j=$j dbname=$dbname sql=$sql e=".$e->getMessage()."</h1>\n" );
		}

	print( "<h1>MSG_34300 $dbname tbl=$tbl rowcnt=$rowcnt colcnt=$colcnt sql=sql=$sql</h1>\n" );
	return($htmout);
	}


#
# $sql = <<<____SQL
#      CREATE TABLE IF NOT EXISTS `request_hist` (
#        `rqid` int(11) NOT NULL,
#        `rqtid` int(11) NOT NULL,
#        `rqsid` int(11) NOT NULL,
#        `rqdate` datetime NOT NULL,
#        `rqcode` tinyint(1) NOT NULL,
#        `rssid` int(11) NOT NULL,
#        `rsdate` datetime,
#        `rscode` tinyint(1)
#       ) ENGINE=ARCHIVE COMMENT='request archive';
# ____SQL;
# $result = $this->db->getConnection()->exec($sql); 

function getFruit($db3) {
	$sql = 'SELECT name, colour, calories FROM fruit ORDER BY name';
	foreach ($db3->query($sql) as $row) {
		print $row['NAME'] . "\t";
		print $row['COLOUR'] . "\t";
		print $row['CALORIES'] . "\n";
		}

	$db3 = new PDO('odbc:sample', 'db2inst1', 'ibmdb2');
	$sth = $db3->prepare("SELECT name, colour FROM fruit");

/* Count the number of columns in the (non-existent) result set */
	$colcount = $sth->columnCount();
	print("Before execute(), result set has $colcount columns (should be 0)\n");

	$sth->execute();

/* Count the number of columns in the result set */
	$colcount = $sth->columnCount();
	print("After execute(), result set has $colcount columns (should be 2)\n");





	}


function db2_exec($db2, $dbname, $sql) {
	$htmout = "";

	try {
#		$db2 = new PDO("mysql:host=$server;dbname=$db",$user,$pass);
		$db2->exec("SET CHARACTER SET utf8");
		print("<h1>MSG_34120 DB2_EXEC dbname=$dbname sql=$sql</h1>\n");
#		$sql = "use $db;insert into $tbl (fname,lname,email) values ('$fname', '$lname','$email');";
#		$sql = "show schema;";
#		$sql = "show tables;";
#		$sql = "select * from Players;";
		$result=$db2->query($sql);
#		$result=$db2->exec($sql);
		print("<h1>MSG_34125 DB2_EXEC dbname=$dbname sql=$sql</h1>\n");

		if($result !== false ) {
			$cols = $result->columnCount();
			$rows = count($result);
			print( "<h1>MSG_34130 DB2_EXEC rows=$rows cols=$cols</h1>\n" );


			$fields = array_keys($result->fetch(PDO::FETCH_ASSOC));
			$j=0;
			print("<h1>MSG_34140 DB2_EXEC j=$j dbname=$dbname sql=$sql</h1>\n");
			}
		$db2 = null;
		}
	catch(PDOException $e) {
		print( "<h1>ERR_34149 DB2_EXEC dbname=$dbname sql=$sql e=".$e->getMessage()."</h1>\n" );
		}

	print( "BUGS_34150 DB2_EXEC $dbname sql=$sql<br>\n" );
	return($htmout);
	}

function db3_connect($db3fil) {
	print( "<h1>MSG_34150 DB3_CONNECT db3fil=$db3fil</h1>\n" );
	$db3 = newpdo($db3fil);
#	$db3->exec($sql);
	$db3=null;
	return($db3);
	}

function db3_query($db3fil) {
	print( "<h1>MSG_34150 DB3_QUERY db3fil=$db3fil</h1>\n" );
	$htmout = "";
	$db3 = newpdo($db3fil);
	$db3->query($sql);
	$db3=null;
	return($htmout);
	}

function db3_exec($db3fil) {
	print( "<h1>MSG_34150 DB3_EXEC db3fil=$db3fil</h1>\n" );
	$htmout = "";
	$db3 = newpdo($db3fil);
	$db3->exec($sql);
	$db3=null;
	return($htmout);
	}



function db3_startup($db3fil) {
	$htmout = "";
	$htmout .= "<h1>BUGS_33990 db3fil=$db3fil</h1>";
	print( $htmout );
	return( $htmout );
	}

# function htmout_head('') {
# 	$htmout = "";
# 	$htmout .= "<html>\n";
# 	$htmout .= "<head>\n";
# 	$htmout .= "	<title>$progid $dttm </title>\n";
# 	$htmout .= "	</head>\n";
# 	$htmout .= "<body bgcolor=linen onload=\"startup(''); return false;\" >\n";
# 	return($htmout);
# 	}
# 
# function htmout_tail('') {
# 	$htmout="";
# 	$htmout .= "	</body>";
# 	$htmout .= "	</html>";
# 	return($htmout);
# 	}
 
function db2_connect($server,$dbname,$user,$pass) {
	$htmout = "";
#	print( "<h1>BUGS_34000 dbname=$dbname</h1>\n" );
	if( isset($_REQUEST['user'])) { $u=isset($_REQUEST['user']); }
	if( isset($_REQUEST['p'])) { $p=isset($_REQUEST['p']); }
	if( isset($_REQUEST['db2'])) { 
		$request_dbname=$_REQUEST['db2']; 
		if( $request_dbname != "" ) { $dbname=$request_dbname; }
		}
	$htmout .= "<h1>MSG_34001 server=$server $dbname=$dbname user=$user</h1>";
	try {
		$db2 = new PDO("mysql:host=$server;dbname=$dbname", $user, $pass);

// set the PDO error mode to exception
		$db2->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
		$htmout .= "<h1>MSG_34002 server=$server dbname=$dbname user=$user </h1>";
		}
		
	catch(PDOException $e) {
//		echo "<h1>ERR_34003 FAIL_CONNECT server=$server dbname=$dbname user=$user err=" . $e->getMessage();
		$htmout .=  "<h1>ERR_34003 FAIL DB2_CONNECT: server=$server dbname=$dbname user=$user server=$server errmsg=" . $e->getMessage();
		}

#	$db2 = null;
#	print( $htmout );
	return($db2);
	}


function db2_close($db2) {
	$db2 = null;
	}

function getColumnNames(){
        $sql = 'SHOW COLUMNS FROM ' . $this->table_name;
        
        $this->stmt = $this->dbc->prepare($sql);
            
	try {    
		if($this->stmt->execute()) {
			$raw_column_data = $this->stmt->fetchAll();
                
			foreach($raw_column_data as $outer_key => $array) {
				foreach($array as $inner_key => $value) {
					if ($inner_key === 'Field') {
						if (!(int)$inner_key) {
							$this->column_names[] = $value;
                                			}
						}
       					}
				}        
			}
		return true;
		} 
	catch (Exception $e) {
                return $e->getMessage(); //return exception
		}        
	}


# function mysql_cr_db($c,$d) {
# 	try {
# 		$sql = "create database $d;";
# 		$c->exec($sql);
# 		$htmout =  "$progid $dttm MSG_202 CR_DB u=$u d=$d sql=$sql<br>\n";
# 		}
# 	catch(PDOException $e ) {
# 		$htmout =  "$progid $dttm ERR_203 CR_DB u=$u d=$d sql=$sql<br>\n";
# 		}
# 	return($htmout);
# 	}
# 
# function mysql_cr_tbl($c,$t) {
# 	
# 	$sql = "CREATE TABLE $t (
# 		id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
# 		fname VARCHAR(30) NOT NULL,
# 		lname VARCHAR(30) NOT NULL,
# 		email VARCHAR(50),
# 		reg_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
# 		)";
# 
# 	try {
# 		$sql = "create table $t ;";
# 		$c->exec($sql);
# 		$htmout =  "$progid $dttm MSG_302 CR_TBL u=$u t=$t sql=$sql<br>\n";
# 		}
# 	catch(PDOException $e ) {
# 		$htmout =  "$progid $dttm ERR_303 CR_TBL u=$u t=$t sql=$sql<br>\n";
# 		}
# 	return($htmout);
# 	}
# 
# 
# function mysql_insert($mysql,$tbl) {
# 	$htmout = "";
# 	try {
# 		$sql = "";
# 		$sql .= "insert into $tbl ";
# 		$sql .= "(fname,lname,email) "
# 		$sql .= "values('droll','smileworthy','dsmileworthy@drollville.com')";
# 		$mysql->exec($sql);
# 		$last_id=$mysql->lastInsertId();
# 		$htmout =  "$progid $dttm MSG_402 INSERT last_id=$last_id  u=$u d=$d sql=$sql<br>\n";
# 		}
# 	catch(PDOException $e ) {
# 		$htmout =  "$progid $dttm ERR_403 INSERT u=$u d=$d sql=$sql<br>\n";
# 		}
# 	return($htmout);
# 	}
# 
# function mysql_sel($mysql,$sql) {
# 	$htmout = "";
#	}
# 
# function mysql_bind($mysql,$sql) {
# 	$htmout = "";
# 
# 	$stmt = $mysql->prepare("insert into $tbl 
# ( fname, lname, email)
# values (:fname, :lname, :email)");
# 	$stmt->bindParam(':fname', $fname);
# 	$stmt->bindParam(':lname', $lname);
# 	$stmt->bindParam(':email', $email);
# $fname="fname1";
# $lname="lname1";
# $email="lname1@somewhere.com";
# 	$stmt->execute();
# $fname="fname2";
# $lname="lname2";
# $email="lname2@somewhere.com";
# 	$stmt->execute();
# $fname="fname3";
# $lname="lname3";
# $email="lname3@somewhere.com";
# 	$stmt->execute();
# 
# 		$htmout =  "$progid $dttm MSG_202 CREATEDB u=$u d=$d sql=$sql<br>\n";
# 		}
# 	catch(PDOException $e ) {
# 		$htmout =  "$progid $dttm ERR_203 CREATEDB u=$u d=$d sql=$sql<br>\n";
# 		}
# 	return($htmout);
# 	}
# 

function mysql_sel($mysql, $sql ) {
	$htmout = "";

$server="localhost";
$user="root";
$pass="..root";
$db="zc";
$sql="use zc;show tables;describe Products;";
$sql="use zc;select * from Products";


$db="zc";
$db="dgs";
$sql="use dgs;show tables;describe Players;";
# $sql="use dgs;create table ko_test ('fname','lname','email') values ('fname1','lname1','lname1@somewhere.com' );"
$tbl="ko_temp";
$sql = "CREATE TABLE $tbl (
	id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
	fname VARCHAR(30) NOT NULL,
	lname VARCHAR(30) NOT NULL,
	email VARCHAR(50),
	reg_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
	)";

	$tbl="ko_temp"; $db="zc";
#	$i=7; $fname="fname$i"; $lname="lname$i"; $email="$lname@somewhere.com";
#	$sql = "insert into $tbl (fname,lname,email) values ('$fname', '$lname','$email');";
#	$sql = "use $db;insert into $tbl (fname,lname,email) values ('$fname', '$lname','$email');";
#	print( "<h1>BUGS_206 fname=$fname lname=$fname email=$email</h1><br>\n" );

#	$tbl="Players"; $db="dgs";
#	$tbl="ko_temp"; $db="dgs";
#	$tbl="ko_temp"; $db="zc";
#	$tbl="Products"; $db="zc";
	$sql = "select * from $tbl;";
	

	$htmout .= "<h1>BUGS_209 MYSQL_SEL user=$user db=$db sql=$sql</h1>\n";
	print( $htmout );


	try {
		$mysql = new PDO("mysql:host=$server;dbname=$db",$user,$pass);
		$mysql->exec("SET CHARACTER SET utf8");



		print("<h1>MSG_181 MYSQL_SEL db=$db sql=$sql</h1>\n");
#		$sql = "use $db;insert into $tbl (fname,lname,email) values ('$fname', '$lname','$email');";
#		$sql = "show tables;";
		$sql = "show schema;";
		$result=$mysql->query($sql);
#		$result=$mysql->exec($sql);
		print("<h1>MSG_220 MYSQL_SEL db=$db sql=$sql</h1>\n");

		if($result !== false ) {
			$cols = $result->columnCount();
			print( "<h1>MSG_231 cols=$cols</h1>\n" );


#			$rownames = $mysql->query('SELECT * FROM my_table LIMIT 0');
#			for ($i = 0; $i < $rownames->columnCount(); $i++) {
#				$col = $rownames->getColumnMeta($i);
#				$columns[] = $col['name'];
#				
#				}
#			print_r($columns);
#			$result = $mysql->query("select * from $tbl limit 1");


#			$j=0;
#			while($row = $result->fetch()) {
#				$j=$j+1;
#				print("<h1>MSG_232 MYSQL_SEL_FETCH j=$j db=$db sql=$sql</h1>\n");
##				print( "<h1>FETCH j=$j ".$row['id']." - ".$row['lname'] ." - ".$row['email']. "</h1>\n" );
#				print( "<h1>FETCH j=$j ".$row['id']." - ".$row['lname'] ." - ".$row['email']. "</h1>\n" );
#				}

			$fields = array_keys($result->fetch(PDO::FETCH_ASSOC));
			print( "<h1>BUGS_250 fields=$fields<h1>" );
			print_r($fields);


			$j=0;
			foreach($result as $row) {
#				print("<h1>MSG_233 MYSQL_SEL_AS j=$j db=$db sql=$sql</h1>\n");
#				print( "<h1>AS j=$j ".$row['id']." - ".$row['lname'] ." - ".$row['email']. "</h1>\n" );
				print( "<h1>AS j=$j ".$row[$fields[0]]." - ".$row[$fields[1]] ." - ".$row[$fields[3]]. "</h1>\n" );
				}

			print("<h1>MSG_234 MYSQL_SEL j=$j db=$db sql=$sql</h1>\n");
			}
		$mysql = null;
		}
	catch(PDOException $e) {
		print( "<h1>ERR_240 sql=$sql e=".$e->getMessage()."</h1>\n" );
		}

	print("<h1>MSG_245 MYSQL_SEL db=$db sql=$sql</h1>\n");
	return( $htmout );
	}

# function mysql_sel_iterate($mysql,$sql) {
# $servername="localhost";
# $username="root";
# $password="..root";
# $dbname="dgs";
# 
# 	$htmout = "";
#
#
#				}
#			foreach($result as $row) {
#				$j=$j+1;
#				print("<h1>MSG_232 MYSQL_SEL j=$j db=$db sql=$sql</h1>\n");
#				print( $row['id']." - ".$row['name'] . "<br>\n" );
#				}
#			print("<h1>MSG_233 MYSQL_SEL j=$j db=$db sql=$sql</h1>\n");
#			}
#		$mysql = null;
#		}
#	catch(PDOException $e) {
#		print( "<h1>ERR_240 sql=$sql e=".$e->getMessage()."</h1>\n" );
#		}
#
#	print("<h1>MSG_245 MYSQL_SEL j=$j db=$db sql=$sql</h1>\n");
#	return( $htmout );
#	}

# function mysql_sel_iterate($mysql,$sql) {
# $servername="localhost";
# $username="root";
# $password="..root";
# $dbname="dgs";
# 
# 	$htmout = "";
# 	$htmout .= "<table style='border: solid 1px black;'>\n";
# 	$htmout .= "<tr><th>id</th><th>fname</th><th>lname</th></tr>\n";
# 
# 	class TableRows extends RecursiveIteratorIterator {
# 		function __construct($it) {
# 			parrent::__construct($it, self::LEAVES_ONLY);
# 			}
# 		function beginChildren() {
# 			$htmout .= "<tr>";
# 			}
# 		function endChildren() {
# 			$htmout .= "</tr>\n";
# 			}
# 		}
# 
# 
# #	$tbl="ko_test";
# #	$sql="select id,firstname,lastname from $tbl" );
# 	try {
# #		$mysql = new PDO("mysql:host=$servername;dbname=$dbname",$username,$password);
# 		$stmt = $mysql->prepare($sql);
# 		$stmt->execute();
# 
# 		$result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
# 		foreach(new TableRows(new
# RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) {
# 			$htmout .= "v=$v<br>\n";
# 			}
# 		}
# 	catch(PDOException $e ) {
# 		$htmout = "ERR_500 ".$e-getMessage();
# 		}
# 	
#	$mysql = null;
#	$htmout .= "</table>";
# 	return($htmout);
#	}

function show_tables($dbname) {

$show_tables_dgs="
Adminlog
Bio
Bulletin
BulletinRead
BulletinTarget
Clock
ConfigBoard
ConfigPages
Contacts
Contribution
Errorlog
FAQ
FAQlog
Feature
FeatureVote
Folders
Forumlog
Forumreads
Forums
GameInvitation
GamePlayers
Games
GameSgf
GamesNotes
GamesPriority
GameStats
Intro
IpStats
ko_temp
Links
MessageCorrespondents
Messages
MoveMessages
Moves
MoveSequence
MoveStats
Observers
Players
Posts
Profiles
RatingChangeAdmin
Ratinglog
Shape
Statistics
Survey
SurveyOption
SurveyUser
SurveyVote
Tagged
Tags
Tournament
TournamentDirector
TournamentExtension
TournamentGames
TournamentLadder
TournamentLadderProps
Tournamentlog
TournamentNews
TournamentParticipant
TournamentPoints
TournamentPool
TournamentProperties
TournamentResult
TournamentRound
TournamentRules
TournamentVisit
TranslationFoundInGroup
TranslationGroups
TranslationLanguages
Translationlog
TranslationPages
Translations
TranslationTexts
UserQuota
Verification
Waitingroom
WaitingroomJoined
";

$show_tables_zc="
address_book
address_format
admin
admin_activity_log
admin_menus
admin_notifications
admin_pages
admin_pages_to_profiles
admin_profiles
authorizenet
banners
banners_history
categories
categories_description
configuration
configuration_group
count_product_views
counter
counter_history
countries
coupon_email_track
coupon_gv_customer
coupon_gv_queue
coupon_redeem_track
coupon_restrict
coupons
coupons_description
currencies
customers
customers_basket
customers_basket_attributes
customers_info
db_cache
email_archive
ezpages
ezpages_content
featured
files_uploaded
geo_zones
get_terms_to_filter
group_pricing
ko_temp
languages
layout_boxes
manufacturers
manufacturers_info
media_clips
media_manager
media_to_products
media_types
meta_tags_categories_description
meta_tags_products_description
music_genre
newsletters
orders
orders_products
orders_products_attributes
orders_products_download
orders_status
orders_status_history
orders_total
paypal
paypal_payment_status
paypal_payment_status_history
paypal_session
paypal_testing
plugin_control
plugin_control_versions
plugin_groups
plugin_groups_description
product_music_extra
product_type_layout
product_types
product_types_to_category
products
products_attributes
products_attributes_download
products_description
products_discount_quantity
products_notifications
products_options
products_options_types
products_options_values
products_options_values_to_products_options
products_to_categories
project_version
project_version_history
query_builder
record_artists
record_artists_info
record_company
record_company_info
reviews
reviews_description
salemaker_sales
sessions
specials
square_payments
tax_class
tax_rates
template_select
test
upgrade_exceptions
whos_online
zones
zones_to_geo_zones
";

	if( $dbname == "dgs" ) { return( $show_tables_dgs); }
	if( $dbname == "zc" ) { return( $show_tables_zc); }
	return( $show_tables_dgs );
	}


function img2tn1($img,$w,$h) {
	$image = imagecreatefromjpeg($img); // image 600 x 324 px
	$tn_img = imagecreatetruecolor(300, 162); // smaller by 50%
	$tn="tn_$img";

// IMAGECOPYRESAMPLED(TARGET, SOURCE, TX, TY, SX, SY, TWIDTH, THEIGHT, SWIDTH, SHEIGHT)
	imagecopyresampled($tn_img, $image, 0, 0, 0, 0, 300, 162, 600, 324);

// (D) SAVE/OUTPUT RESIZED IMAGE
	imagejpeg($tn_img, $tn);

// (E) OPTIONAL - CLEAN UP
	imagedestroy($image);
	imagedestroy($tn_img);
	return($tn);
	}

function ko_gd($options) {
	$htmout="";
	$htmout .= "<h1>BUGS_37500 ko_gd options=$options</h1>";

//	imagecreatetruecolor();
//	imagecreatefromjpeg();
//	imagecreatefrompng();
//	imagecreatefromgif();
//	imagerotate();
//	imagescale();
//	imagecrop();
//	imageflip(IMG_FLIP_HORIZONTAL);
//	imageflip(IMG_FLIP_VERTICAL);
//	imageflip(IMG_FLIP_BOTH);
//	imagesx(); imagesy();
//	getimagesize();
//	imagejpeg(); imagepng(); imagesgif();
//	imagesetpixel($images,$x,$y,$color);



//	$im_php = imagecreatefromjpeg('/fb/pages/zn/zn_1.jpg');
//	$im_php = imagecreatefromjpeg('/Volumes/ka1tbr2/ht/fb/pages/zn/zn_1.jpg');
//	$size = min(imagesx($im_php), imagesy($im_php));
//	$im_php = imagecrop($im_php, ['x' => $size*0.4, 'y' => 0, 'width' => $size, 'height' => $size]);
//	$im_php = imagescale($im_php, 300);






	printf( $htmout );
	return($htmout);
	}

function bugs($options) {
	$htmout="";
	$htmout .= "<h1>BUGS options=$options</h1>\n";
	printf( $htmout );
	return($htmout);
	}

function img2tn($img) {
//	$filename = 'fancy_name.png';
//	$filename = "../fb/pages/zn/zn_1.jpg";

	$dr=$_SERVER['DOCUMENT_ROOT'];
	$dr_img="$dr/$img";
	$imgdir="./imgs";
	$tndir="$imgdir/tn";
	$htmout = "";

	if( $img == "" ) { $img = "/fb/pages/zn/zn_1.jpg"; }
	if( ! file_exists( $dr_img )) {
		$htmout .= "<h1>ERR_37550 NOTFOUND dr_img=$dr_img</h1>";
		return($htmout);
		}
	if( ! is_dir( $imgdir )) {
		$htmout .= "<h1>ERR_37560 NOTFOUND imgdir=$imgdir</h1>";
		return($htmout);
		}
	if( ! is_dir( $tndir )) {
		$htmout .= "<h1>ERR_37570 NOTFOUND tndir=$tndir</h1>";
		return($htmout);
		}

//	$pathparts = pathinfo($img);
	$pathparts = pathinfo($dr_img);
	$dirname=$pathparts['dirname'];
	$basename=$pathparts['basename'];
	$ext="";
	if( isset($pathparts['extension'])) {
		$ext=$pathparts['extension'];
		}
	if( $ext == "" ) {
		$htmout .= "<h1>ERR_37580 NOTFOUND ext=$ext</h1>";
		return($htmout);
		}
	else {
		$htmout .= "<h1>MSG_37580 dirname=$dirname basename=$basename  ext=$ext</h1>";
		}

	$tn="./imgs/tn/tn_$basename";
	if( $ext == "jpg" ) { $tn="./imgs/tn/tn_$basename"; }
	if( $ext == "png" ) { $tn="./imgs/tn/tn_$basename"; }
	if( $ext == "gif" ) { $tn="./imgs/tn/tn_$basename"; }

	if(( $ext == "jpg" ) || ( $ext == "JPG" )) {
		$im = imagecreatefromjpg($img);
//		$im = imagecreatefromjpg($dr_img);
		}
	if(( $ext == "png" ) || ( $ext == "PNG" )) {
		$im = imagecreatefrompng($img);
//		$im = imagecreatefrompng($dr_img);
		}
	if(( $ext == "gif" ) || ( $ext == "GIF" )) {
		$im = imagecreatefromgif($img);
//		$im = imagecreatefromgif($dr_img);
		}
// create a thumbnail
	$tnimg = imagestyle($im,'autosize:100 100');
//	$resized = imagestyle($image,'resize:200 0;');
//	$cropped = imagestyle($image,'crop:0 50 200 200;');


//	$origin_color = imagecolorsforindex($im, imagecolorat($im, 0, 0));
//	$dark_red = imagecolorallocate($im, 100, 0, 30);
//	list($width, $height, $type, $attr) = getimagesize($img);
//	for($x = 0; $x <= $width - 1; $x++) {
//		for($y = 0; $y <= $height - 1; $y++) {
//			$index_color = imagecolorsforindex($im, imagecolorat($im, $x, $y));
//			if($origin_color == $index_color) {
//				imagesetpixel($im, $x, $y, $dark_red);
//				}
//			}
//		}

//	imagepng($im, 'fancy_name_red.png');

	if( $ext == "png" ) { imagepng($im, '$tn_png'); }
	if( $ext == "jpg" ) { imagejpg($im, '$tn_jpg'); }
	if( $ext == "gif" ) { imagegif($im, '$tn_gif'); }
	imagedestroy($im);

	$htmout .= "<h2>img=$img tn=$tn</h2>";
	$htmout .= "<a href=$img target=_blank>";
	$htmout .= "	<img src=$img border=0>";
	$htmout .= "	</a><br>";
	return($htmout);

	}


function img2dirs() {
	$htmout = ""; $j=0; $k=0; $ext="";
	$kups="";
#	printf( "<h1>BUGS_37660 img2dirs </h1>\n");

#	if( isset($_FILES["image"])) {
	if( isset($_FILES["kups"])) {
		printf( "BUGS_37971 FILES_KUPS<br>\n" );
		$kups = $_FILES['kups'];
		}
	if( isset($_FILES["plupload"])) {
		printf( "BUGS_37972 FILDS_PLUPLOAD<br>\n" );
		$kups = $_FILES['pluplad'];
		}


	if( isset($_FILES["plupload"])) {
		if( isset($_FILES['plupload']['tmp_name'])) {
			$kups = $_FILES['plupload']['tmp_name'];
			}
		if( isset($_FILES['plupload']['name'] )) {
			$imageName = $_FILES['plupload']['name'];
			}		
		printf( "BUGS_37981 ISSET kups<br>\n" );

		$imgProperties = getimagesize($kups);
		$tnName="tn_$imageName";
	
#		$pathToImages = "./imgs/";
#		$pathToThumbs = "./imgs/tn/";
		$pathToImages = "./kups/";
		$pathToThumbs = "./kups/tn/";
		$extension = pathinfo($_FILES['kups']['name'], PATHINFO_EXTENSION);
		$ext=$extension;
		$img_type = $imgProperties[2];
		$htmout = "";
		}

	printf( "BUGS_37980 isset? kups=$kups<br>\n" );
	if( isset($_FILES["kups"])) {
		printf( "BUGS_37981 ISSET kups<br>\n" );
		if( isset($_FILES['kups']['tmp_name'])) {
			$kups = $_FILES['kups']['tmp_name'];
			}
		if( isset($_FILES['kups']['name'] )) {
			$imageName = $_FILES['kups']['name'];
			}		

		$imgProperties = getimagesize($kups);
		$tnName="tn_$imageName";
	
#		$pathToImages = "./imgs/";
#		$pathToThumbs = "./imgs/tn/";
		$pathToImages = "./kups/";
		$pathToThumbs = "./kups/tn/";


		$extension = pathinfo($_FILES['kups']['name'], PATHINFO_EXTENSION);
		$ext=$extension;
		$img_type = $imgProperties[2];

		$htmout = "";
		$htmout .= "kups=$kups<br>";
#		$htmout .= "imgProperties=$imgProperties<br>";
		$htmout .= "imageName=$imageName<br>";


		if( $img_type == IMAGETYPE_JPEG ) {
			$source = imagecreatefromjpeg($kups);
			$resizeImg = image_resize($source,$imgProperties[0],$imgProperties[1]);
#			imagejpeg($resizeImg,$pathToThumbs.$imageName);
			imagejpeg($resizeImg,$pathToThumbs.$tnName);
			}

		if ($img_type == IMAGETYPE_PNG ) {
			$source = imagecreatefrompng($kups);
			$resizeImg = image_resize($source,$imgProperties[0],$imgProperties[1]);
#			imagepng($resizeImg,$pathToThumbs.$imageName);
			imagepng($resizeImg,$pathToThumbs.$tnName);
			}

		if ($img_type == IMAGETYPE_GIF ) {
			$source = imagecreatefromgif($kups);
			$resizeImg = image_resize($source,$imgProperties[0],$imgProperties[1]);
#			imagegif($resizeImg,$pathToThumbs.$imageName);
			imagegif($resizeImg,$pathToThumbs.$tnName);
			}


		if( $ext == "txt" ) {
			$pathToImages="./txt";
			}
		if( $ext == "csv" ) {
			$pathToImages="./txt";
			}
		if( $ext == "psv" ) {
			$pathToImages="./txt";
			}
		if( $ext == "mp3" ) {
			$pathToImages="./mp3";
			}
		if( $ext == "mp4" ) {
			$pathToImages="./mp4";
			}
		if( $ext == "pdf" ) {
			$pathToImages="./pdf";
			}

		$htmout .= "pathToThumbs=$pathToThumbs imageName=$imageName<br>";
		move_uploaded_file($kups, $pathToImages.$imageName);
#		echo "Image resize successfully.";
		$htmout .= "<h1>kup.php MSG_37721 ext=$ext pathToImages=$pathToImages imageName=$imageName</h1>";
		$htmout .= "<h1>kup.php MSG_37722 ext=$ext pathToThumbs=$pathToThumbs tnName=$tnName</h1>";


		$htmout .= "<html>\n";
		$htmout .= "<head>\n";
		$htmout .= "<title>$imageName</title>\n";
		$htmout .= "	</head>\n";

		$htmout .= "<body bgcolor=linen>\n";
		$htmout .= "<a href=./ target=_blank><img src=ko.png height=20 border=0></a>\n";
		$htmout .= "<hr color=black>\n";
		$htmout .= "<h1>$imageName</h1>\n";
		$htmout .= "<a href=$pathToImages/$imageName target=_blank>";
		$htmout .= "	<img src=$pathToThumbs/$tnName border=0>";
		$htmout .= "	</a>\n";
		$htmout .= "<hr color=black>\n";
		$htmout .= "<a href=./ko.php?kup target=_blank>";
		$htmout .= "	<img src=/imgs/btn/kob.png height=20 border=0>";
		$htmout .= "	</a>./ko.php?kup\n";
		$htmout .= "&nbsp &nbsp &nbsp";
		$htmout .= "<a href=./ko.php?todo=kups target=_blank>";
		$htmout .= "	<img src=/imgs/btn/kob.png height=20 border=0>";
		$htmout .= "	</a>ko.php?todo=kups\n";
		$htmout .= "<br><br><br><br>\n";
		$htmout .= "<a href=./ko.php?todo=sql_kups target=_blank>";
		$htmout .= "	<img src=/imgs/btn/kob.png height=20 border=0>";
		$htmout .= "	</a>ko.php?todo=sql3_kups\n";

//		$htmout .= "<a href=./ko.php?todo=imgs target=_blank>";
//		$htmout .= "	<img src=/imgs/btn/kob.png height=20 border=0>";
//		$htmout .= "	</a>ko.php?todo=imgs\n";

		$htmout .= "	</body>\n";
		$htmout .= "	</html>\n";
		}
	else { 
#		$htmout .= "<h1>kup.php ERR_37729 ext=$ext pathToImages=$pathToImages</h1>";
	
		}
	$htmout="";
		$htmout = "<h1>kup.php ERR_38080</h1>";
	return($htmout);
	}

#	upload_tmp_dir = /var/www/foo.bar/sessions
#	ini_set(‘upload_tmp_dir’, ‘/path/to/dir’);


# function image_resize($source,$width,$height) {
# 	$new_width =150;
# 	$new_height =150;
# 	$thumbImg=imagecreatetruecolor($new_width,$new_height);
# 	imagecopyresampled($thumbImg,$source,0,0,0,0,$new_width,$new_height,$width,$height);
# 	return $thumbImg;
# 	}


function plupload($args) {
	$html=""; $j=0; $k=0;
	$file_name[]="";
	$file_status[]="";
	$file_desc[]="";
	$file_newname[]="";
	$file_dest[]="";
	$plupload="";
	if( isset( $_REQUEST['plupload'] )) {
		$plupload=$_REQUEST['plupload'];
		}
	if( $plupload == "go" ) { 
		printf( "BUGS_38101 plupload GO<br>\n" );
		echo "<script>cmd=prompt('q=quit e=exit s=skip g=go:  '); alert(cmd);</script>";

		$htmout = img2dirs();
#		phpinfo();
#		$cmd = rtrim(fgets(STDIN));
#		printf( "got it: cmd=" . $cmd."<br>\n");
#		if (PHP_SAPI === 'cli') parse_str(implode('&', array_slice($argv, 1)), $_GET);
#		var_dump($_GET);


		kups('plupload'); 
		return($args); 
		}

	$html .= "<html>\n";
	$html .= "<body bgcolor=linen>\n";
	$html .= "<h1>ko_plupload</h1>\n";
	$html .= "<form id=form_plupload action=\"ko.php?plupload=go\">\n";



	$plupload=""; $view_mode_uploader=""; $uploader_count=0;
#	printf( "BUGS_38090 plupload args=$args\n" );
	if( $_REQUEST['plupload']) {
		$plupload=$_REQUEST['plupload'];
		}
	if( $_REQUEST['view_mode_uploader']) {
		$view_mode_uploader=$_REQUEST['view_mode_uploader'];
		}
	if( $_REQUEST['uploader_count']) {
		$uploader_count=$_REQUEST['uploader_count'];
		}
	if(( $uploader_count == "" ) || ( $uploader_count == "0" )) {
#		printf( "BUGS_38100 j=$j NOTODO uploader_count=$uploader_count<br>\n" );
		}
	else {
#		printf( "BUGS_38100 j=$j ___TODO uploader_count=$uploader_count<br>\n" );
		}
	$j=0; 
	foreach($_REQUEST as $name => $value ) {
		$j=$j+1;
#		printf( "BUGS_38100 j=$j name=$name value=$value<br>\n" );
#		$html.="BUGS_38101 $j $name=$name value=$value<br>\n";
		}

//	$html.="BUGS_31102 $j $name=$name value=$value<br>\n";

//	$html.="<h1>filename=".$filename[$j]." filestatus=".$filestatus[$j]."<h1>\n";
	$html.="<hr color=black>\n";
	$html.="<table id=table_plupload>\n";
	$html.="<tr>\n";
	$html.="<td width=20>num</td>";
	$html.="<td width=100>name</td>";
	$html.="<td width=100>newname</td>";
	$html.="<td width=20>status</td>";
	$html.="<td width=400>desc</td>";
	$html.="<td width=20>dest</td>";
	$html.="	</tr>\n";
	for( $j=0; $j < $uploader_count; $j++ ) {
		$filename_id="uploader_".$j."_name";
		$filestatus_id="uploader_".$j."_status";
		if( $_REQUEST[$filename_id]) {
			$filename[$j]=$_REQUEST[$filename_id];
			}
		if( $_REQUEST[$filestatus_id]) {
			$filestatus[$j]=$_REQUEST[$filestatus_id];
			}
		$html.="<tr>\n";
		$html.="<td width=20>$j</td>";
		$html.="<td width=100><input type=text name=file_name_$j id=file_name_$j value=\"\"></input></td>\n";
		$html.="<td width=100><input type=text newname=file_newname_$j id=file_newname_$j value=\"\"></input></td>\n";
		$html.="<td width=20><input type=text name=file_status_$j id=file_status_$j value=\"\"></input></td>\n";
		$html.="<td width=400><input type=text name=file_desc_$j id=file_desc_$j value=\"\"></input></td>\n";
		$html.="<td width=20><input type=text name=file_dest_$j id=file_dest_$j value=\"\"></input></td>\n";
		$html.="	</tr>\n";

#		$html.="BUGS_31140 $j filename=".$filename[$j]." filestatus=".$filestatus[$j]."<br>\n";
		}
	$html.="	</table id=table_plupload_end>\n";
	$html.= "	<input name=plupload value=\"go\" id=plupload type=text value=\"\"></input>\n";
	$html.="<br>\n";
	$html.= "	<input id=reset type=reset></input>\n";
	$html.= "	<input id=submit type=submit></input>\n";
	$html.= "	</form id=form_plupload_end>\n";
	$html.= "<hr color=black>\n";
	$html.= "<hr color=white>\n";
	$html.= "<hr color=black>\n";
	$html.= "	</body>\n";
	$html.= "	</html>\n";
	
	printf($html);
	exit;

	return($html);
	}


function contacts($args) {
	$dttm=date('Ymd_His');
	$db3="/ko/ko.db3";
	$htmout=""; $j=0; $k=0;
	$tbl="contacts";
	$fmt="";
	$limit="100";
	$sql="select * from $tbl";
	if( $limit != "" ) { $sql="select * from $tbl limit $limit"; }

	if ( isset( $_REQUEST['db3'] )) { $db3=$_REQUEST['db3']; }
	if ( isset( $_REQUEST['sql'] )) { $sql=$_REQUEST['sql']; }
	if ( isset( $_REQUEST['tbl'] )) { $tbl=$_REQUEST['tbl']; }
	if ( isset( $_REQUEST['limit'] )) { $limit=$_REQUEST['limit']; }
	if ( isset( $_REQUEST['fmt'] )) { $fmt=$_REQUEST['fmt']; }



	$psv=""; $psv_head=""; $psv_body=""; $psv_tail="";
	$html=""; $html_head=""; $html_body=""; $html_tail="";
	$json=""; $json_head=""; $json_body=""; $json_tail="";

	$html_head="";
	$html_head.="<html><head>\n";
	$html_head.="<title>ko.php</title>\n";
	$html_head="	</leds_head>\n";
	$html_head="<div id=div_leds>\n";
	$html_head="<h1>div_leds</h1>\n";
	$html_head="<h2>db3=$db3 tbl=$tbl fmt=$fmt</h2>\n";
	$html_head="<h3>$dttm</h3>\n";
	$html_body="";
	$html_tail="	</div id=div_leds>\n";
	$html_tail="	</body>\n";
	$html_tail="	</html>\n";


	$flds_kov="rid|id|status|progid|effdt|grp|title|subject|dt|startdate|starttime|enddate|endtime|pathfile|path|file|ext|tmp|href|txtcnt|content";
	$flds_contacts="id|progid|dttm|status|grp|account|attachment|bcc|role|callback|carphone|categories|cc|dueby|duedate|duration|email|email2|email3|actualwork|address_selected|address_selector|all_day_event|bday|dday|notedays varchar|anniversary|assigned|assistants_name|assistants_phone|billing_information|birthday|bizaddr|bizaddrcity|bizaddrcountry|bizaddrpobox|bizaddrpocode|bizaddrstate|bizaddrstreet|bizfax|bizhomepage|bizphn|bizph2|changedby|children|city|company|coname|cophn|complete|computer|contact|contacts|content|conversation|country|created|custid|dtdone|defertil|dept|distlistname|noautoarchive|downloadstate|emailselected|emailselector|end|entrytype|expires|fileas|fname|flagstatus|followupflag|sendfrom|ftpsite|fullname|gender|govid|haverepliessentto|hobbies|home_addr|home_addrcity|home_addrcountry|home_addrpobox|home_addrpostalcode|home_addrstate|home_addrstreet|home_fax|home_phone|home_phone2|iconformdescription|importance|infolder|initials|inetfreebusyaddress|isdn|jobtitle|journal|junkmailtype|language|lname|lastsavedtm|location|mailaddr|mailaddrflag|managersname|meetingstatus|msg|msgclass|msgflag|mname|mileage|mblphn|modified|meetingurl|nickname|notes|officeloc|optattendees|orgid|organizer|otheraddr|otheraddr_city|othaddr_country|othaddr_pobox|othaddr_postalcode|othaddr_state|othaddr_street|othfax|othphn|outlookiver|outlookver|owner|pager|personalurl|phnselected|phnselector|pobox|primaryphn|priority|private|profession|radiophn|read|received|recur|recurpattern|recurrangeend|recurrangestart|recurring|referby|remindbeforehand|remind|remindoverridedefault|remindsound|remindsoundfile|remindtime|remindtopic|remotestatus|reqstatus|requestedby|requiredattendess|resources|responserequested|retrievaltime|schedpriority|sendtextonly|sensitivity|sent|showtimeas|size|spouse|start|state|straddr|subject|suffix|teamtask|telex|title|sendto|totalwork|trackstat|ttytddphn|user1|user2|user3|user4|webpage|zipcode|pathfile|path|file|base|ext|src|tn|startdate|starttime|enddate|endtime|headline|media|credit|text|led|type|speed|color|bldg|loc|j|k|l|m|h|w|x|y|z|t|x1|y1|z1|t1|x2|y2|z2|t2|temp|desc|";
	$flds_leds="led_id|led_status|led_code|led_name|led_dttm|led_color|led_speed|led_type|led_date|led_cmd|led_cmdout|led_desc|led_misc|led_city|led_bldg|led_loc_code|led_floor|led_group|led_orgs|led_title|led_published|led_width|led_height|led_comment|led_filename|led_user|led_user_ip|led_referer|led_remote_port|led_viewrole|led_user_agent|led_unique_id|led_err|led_fix|led_os|id|grp|status|dttm|pathfile|path|file|base|ext|size|ctime|mtime|exif_dttm|exif_dt|exif_tm|title|thumbnail|alt|link|linktarget|src|tn|startdate|enddate|headline|text|assets|media|credit|caption|i|j|k|w|h|t|x|y|z|t1|x1|y1|z1|t2|x2|y2|z2|temp|desc";

#	$flds=explode("|",$flds_contacts);
#	$flds=explode("|",$flds_kov);
#	$flds=explode("|",$flds_leds);
	$flds=explode("|",$flds_contacts);

	$html_head.="<html>\n";
	$html_head.="<head>\n";
	$html_head.="	<title>/ko/ko.php $dttm</title>\n";
	$html_head.="	</head>\n";
	$html_head.="<body bgcolor=linen>\n";
	$html_head.="	<div id=div_$tbl>\n";
	$html_head.="	<h1>div_$tbl</h1>\n";

	$html_tail.="	</div id=div_$tbl"."_end>\n";
	$html_tail.="	</body>\n";
	$html_tail.="	</html>\n";

	$progid="ko";	
	$text="text_$tbl"; $kludge="..kludge..";

	$request="contacts";
	$json_head.="{ \"$request\": {\n";
	$json_head.="\"progid\":\"".$progid."\",\n";
	$json_head.="\"dttm\":\"".$dttm."\",\n";
	$json_head.="\"db3\":\"".$db3."\",\n";
	$json_head.="\"tbl\":\"".$tbl."\",\n";
	$json_head.="\"sql\":\"".$sql."\",\n";
	$json_head.="\"limit\":\"".$limit."\",\n";
	$json_head.="\"text\":\"".$text."\",\n";
	$json_head.="\"contact\": [\n";


	$dr="./";
	if ( isset( $_SERVER['DOCUMENT_ROOT'] )) { $dr=$_SERVER['DOCUMENT_ROOT']; }
	$db3fil=$dr.$db3;	
	if( ! is_file($db3fil)) {
		printf( "BUGS_38150 NOTFOUND db3fil=$db3fil\n" );
		exit;
		}




	$fldscnt=count($flds);
	$sql="select * from $tbl limit 100";
#	printf( "BUGS_38161 contacts fldscnt=$fldscnt<br>\n" );
#	printf( "BUGS_38162 contacts sql=$sql<br>\n" );

	$html_head.="<table id=table_$tbl>\n";
	$html_head.="	<tr>";
	foreach( $flds as $fld ) { 
		$html_head.="<td>".$fld."</td>"; 
		$psv_head.=$fld."|";
		}
	$psv_head.="\n";
	$html_head.="		</tr>\n";
	$html_tail.="	</table id=table_".$tbl."_end>\n";

	$json_body.="";
	$json_tail.="{ \"kludge\":\"kludge_kov\" }\n";
	$json_tail.="]}}\n";
#	printf( "BUGS_38180 psv_head=$psv_head<br>\n" );

	$pdo = newpdo($db3fil);
	$j=0;
	foreach( $pdo->query($sql) as $row ) {
		$j=$j+1;
		$k=0;

//		foreach( $row as $fld=>$vals ) {
//			$k=$k+1;
//			printf( "BUGS_31181 ($j,$k) fld=$fld<br>\n" );
//			foreach($vals as $val ) {
//				printf( "BUGS_38180 ($j,$k) $tbl fld=$fld val=$val<br>\n" );
//				}
//			}


		$json_body.="{\n";	
		$html_body.="<tr>";
#		foreach( $flds as $fld ) { 
		foreach( $row as $fld=>$val ) {
			$k=$k+1;
#			printf( "BUGS_38180 k=$k fld=$fld val=$val<br>\n" );
			$psv_body.=$row[$fld]."|";
			$json_body.="\"".$fld."\":\"'".$row[$fld]."\",\n";
			$html_body.="<td>".$fld."</td><td>".$row[$fld]."</td>";
			}
		$psv_body.="\n";
		$html_body.="	</tr>";
		$json_body.="\"kludge\":\"kludge\"\n";
		$json_body.="	},";
		}

	$json.=$json_head;
	$json.=$json_body;
	$json.=$json_tail;

	$psv=""; $psv.=$psv_head; $psv.=$psv_body;
	$html=""; $html.=$html_head; $html.=$html_body; $html.=$html_tail;

	if( $fmt == "psv" ) { printf( $psv ); exit; }
	if( $fmt == "csv" ) { 
		$csv=str_replace("|",",",$psv); 
		printf( $csv ); 
		exit; 
		}
	if( $fmt == "json" ) { 
		header('Content-type: Application/json'); 
		printf( $json); 
		exit; 
		}
	if(( $fmt == "html" ) || ( $fmt == "htm" )) { 
		printf( $html); 
		exit; 
		}

	printf( $html );
	exit;
	}


function kov($args) {
	$dttm=date('Ymd_His');
#	$db3fil="/ko/ko.db3"; $pdo = newpdo($db3fil); $pdo->exec($sql);
	$db3="/ko/ko_v.db3";
	$tbl="ko_v";
	$fmt="";
	$limit="100";
	$sql="select * from $tbl";

	if( $limit != "" ) { $sql="select * from $tbl limit $limit"; }
	if ( isset( $_REQUEST['db3'] )) { $db3=$_REQUEST['db3']; }
	if ( isset( $_REQUEST['tbl'] )) { $tbl=$_REQUEST['tbl']; }
	if ( isset( $_REQUEST['fmt'] )) { $fmt=$_REQUEST['fmt']; }
	if ( isset( $_REQUEST['limit'] )) { $limit=$_REQUEST['limit']; }
	if ( isset( $_REQUEST['sql'] )) { $sql=$_REQUEST['sql']; }

	$psv=""; $psv_head=""; $psv_body=""; $psv_tail="";
	$html=""; $html_head=""; $html_body=""; $html_tail="";
	$json=""; $json_head=""; $json_body=""; $json_tail="";

	$html_head.="<html><head>\n";
	$html_head.="<title>ko.php</title>\n";
	$html_head="	</leds_head>\n";
	$html_head="<div id=div_leds>\n";
	$html_head="<h1>div_leds</h1>\n";
	$html_head="<h2>db3=$db3 tbl=$tbl fmt=$fmt</h2>\n";
	$html_head="<h3><font style=\"font-size:12\">$dttm</font></h3>\n";
	$html_tail="	</div id=div_leds>\n";
	$html_tail="	</body>\n";
	$html_tail="	</html>\n";



	$flds_kov="rid|id|status|progid|effdt|grp|title|subject|dt|startdate|starttime|enddate|endtime|pathfile|path|file|ext|tmp|href|txtcnt|content";
	$flds_contacts="id|progid|dttm|status|grp|account|attachment|bcc|role|callback|carphone|categories|cc|dueby|duedate|duration|email|email2|email3|actualwork|address_selected|address_selector|all_day_event|bday|dday|notedays varchar|anniversary|assigned|assistants_name|assistants_phone|billing_information|birthday|bizaddr|bizaddrcity|bizaddrcountry|bizaddrpobox|bizaddrpocode|bizaddrstate|bizaddrstreet|bizfax|bizhomepage|bizphn|bizph2|changedby|children|city|company|coname|cophn|complete|computer|contact|contacts|content|conversation|country|created|custid|dtdone|defertil|dept|distlistname|noautoarchive|downloadstate|emailselected|emailselector|end|entrytype|expires|fileas|fname|flagstatus|followupflag|sendfrom|ftpsite|fullname|gender|govid|haverepliessentto|hobbies|home_addr|home_addrcity|home_addrcountry|home_addrpobox|home_addrpostalcode|home_addrstate|home_addrstreet|home_fax|home_phone|home_phone2|iconformdescription|importance|infolder|initials|inetfreebusyaddress|isdn|jobtitle|journal|junkmailtype|language|lname|lastsavedtm|location|mailaddr|mailaddrflag|managersname|meetingstatus|msg|msgclass|msgflag|mname|mileage|mblphn|modified|meetingurl|nickname|notes|officeloc|optattendees|orgid|organizer|otheraddr|otheraddr_city|othaddr_country|othaddr_pobox|othaddr_postalcode|othaddr_state|othaddr_street|othfax|othphn|outlookiver|outlookver|owner|pager|personalurl|phnselected|phnselector|pobox|primaryphn|priority|private|profession|radiophn|read|received|recur|recurpattern|recurrangeend|recurrangestart|recurring|referby|remindbeforehand|remind|remindoverridedefault|remindsound|remindsoundfile|remindtime|remindtopic|remotestatus|reqstatus|requestedby|requiredattendess|resources|responserequested|retrievaltime|schedpriority|sendtextonly|sensitivity|sent|showtimeas|size|spouse|start|state|straddr|subject|suffix|teamtask|telex|title|sendto|totalwork|trackstat|ttytddphn|user1|user2|user3|user4|webpage|zipcode|pathfile|path|file|base|ext|src|tn|startdate|starttime|enddate|endtime|headline|media|credit|text|led|type|speed|color|bldg|loc|j|k|l|m|h|w|x|y|z|t|x1|y1|z1|t1|x2|y2|z2|t2|temp|desc|";
	$flds_leds="led_id|led_status|led_code|led_name|led_dttm|led_color|led_speed|led_type|led_date|led_cmd|led_cmdout|led_desc|led_misc|led_city|led_bldg|led_loc_code|led_floor|led_group|led_orgs|led_title|led_published|led_width|led_height|led_comment|led_filename|led_user|led_user_ip|led_referer|led_remote_port|led_viewrole|led_user_agent|led_unique_id|led_err|led_fix|led_os|id|grp|status|dttm|pathfile|path|file|base|ext|size|ctime|mtime|exif_dttm|exif_dt|exif_tm|title|thumbnail|alt|link|linktarget|src|tn|startdate|enddate|headline|text|assets|media|credit|caption|i|j|k|w|h|t|x|y|z|t1|x1|y1|z1|t2|x2|y2|z2|temp|desc";

#	$flds=explode("|",$flds_contacts);
#	$flds=explode("|",$flds_kov);
#	$flds=explode("|",$flds_leds);
	$flds=explode("|",$flds_kov);


	$html_head.="<html><head><title>/ko/ko.php 20230219_1730</title>\n";
	$html_head.="	</head>\n";
	$html_head.="<body bgcolor=linen>\n";
	$html_head.="	<div id=div_".$tbl.">\n";
	$html_head.="	<h1>div_".$tbl."</h1>\n";

	$html_tail.="	</div id=div_".$tbl."_end>\n";
	$html_tail.="	</body>\n";
	$html_tail.="	</html>\n";

	$text="kov_text";
	$request="ko_v";
	$json_head.="{ \"$request\": {\n";
	$json_head.="\"dttm\":\"".$dttm."\",\n";
	$json_head.="\"db3\":\"".$db3."\",\n";
	$json_head.="\"tbl\":\"".$tbl."\",\n";
	$json_head.="\"sql\":\"".$sql."\",\n";
	$json_head.="\"limit\":\"".$limit."\",\n";
	$json_head.="\"text\":\"".$text."\",\n";
	$json_head.="\"kov\": [\n";


	$dr="./";
	if ( isset( $_SERVER['DOCUMENT_ROOT'] )) { $dr=$_SERVER['DOCUMENT_ROOT']; }
	$db3fil=$dr.$db3;	
	if( ! is_file($db3fil)) {
		printf( "BUGS_313 NOTFOUND db3fil=$db3fil\n" );
		exit;
		}

	$sql="select * from $tbl";
	if( $limit != "" ) { $sql="select * from $tbl limit $limit"; } 

#	printf( "BUGS_38140 kov sql=$sql<br>\n" );

	$pdo = newpdo($db3fil);
	$j=0;
	foreach( $pdo->query($sql) as $row ) {
		$j=$j+1; $k=0;

		$json_body.="{\n";
		$html_body.="<tr>\n";
		$html_body.="	<td>($j,$k)</td>";
		foreach( $flds as $fld ) {
			$k=$k+1;
			$json_body.="\"".$fld."\":\"".$row[$fld]."\",\n";
			$psv_body.=$row[$fld]."|";
			$html_body.="<td>".$fld."</td><td>".$row[$fld]."\",\n";
			}
		
		$psv_body.="\n";
		$html_body.="	</tr>\n";
		$json_body.="\"kludge\":\"kludge_kov\"\n";
		$json_body.="	},\n";
		}
	$json_body.="{\"kludge\":\"kludge\"}\n";
	$json_tail ="\n"; $json_tail .= "]}}\n";

	$psv.=$psv_head; $psv.=$psv_body;
	$json.=$json_head; $json.=$json_body; $json.=$json_tail;
	$html.=$html_head; $html.=$html_body; $html.=$html_tail;

	if( $fmt == "psv" ) {  printf( $psv ); exit; }
	if( $fmt == "csv" ) {  
		$csv=replace("|",",",$psv); 
		printf( $csv ); 
		exit; 
		}
	if( $fmt == "json" ) { 
		header('Content-type: application/json'); 
		printf( $json ); 
		exit; 
		}
	
$help_fts5=<<<HELP_FTS5
<pre id=pre_sqlite3_fts5>
<phrase>    := string [*]
<phrase>    := <phrase> + <phrase>
<neargroup> := NEAR ( <phrase> <phrase> ... [, N] )
<query>     := [ [-] <colspec> :] [^] <phrase>
<query>     := [ [-] <colspec> :] <neargroup>
<query>     := [ [-] <colspec> :] ( <query> )
<query>     := <query> AND <query>
<query>     := <query> OR <query>
<query>     := <query> NOT <query>
<colspec>   := colname
<colspec>   := { colname1 colname2 ... }

Non-ASCII range characters (i.e. unicode codepoints greater than 127), or
One of the 52 upper and lower case ASCII characters, or
One of the 10 decimal digit ASCII characters, or
The underscore character (unicode codepoint 96).
The substitute character (unicode codepoint 26).

... MATCH '"one two three"'
... MATCH 'one + two + three'
... MATCH '"one two" + three'
... MATCH 'one.two.three'

... MATCH '"one two thr" * '
... MATCH 'one + two + thr*'
... MATCH '"one two thr*"'      -- May not work as expected!

... MATCH '^one'              -- first token in any column must be "one"
... MATCH '^ one + two'       -- phrase "one two" must appear at start of a column
... MATCH '^ "one two"'       -- same as previous 
... MATCH 'a : ^two'          -- first token of column "a" must be "two"
... MATCH 'NEAR(^one, two)'   -- syntax error! 
... MATCH 'one + ^two'        -- syntax error! 
... MATCH '"^one two"'        -- May not work as expected!

CREATE VIRTUAL TABLE f USING fts5(x);
INSERT INTO f(rowid, x) VALUES(1, 'A B C D x x x E F x');

... MATCH 'NEAR(e d, 4)';                      -- Matches!
... MATCH 'NEAR(e d, 3)';                      -- Matches!
... MATCH 'NEAR(e d, 2)';                      -- Does not match!

... MATCH 'NEAR("c d" "e f", 3)';              -- Matches!
... MATCH 'NEAR("c"   "e f", 3)';              -- Does not match!

... MATCH 'NEAR(a d e, 6)';                    -- Matches!
... MATCH 'NEAR(a d e, 5)';                    -- Does not match!

... MATCH 'NEAR("a b c d" "b c" "e f", 4)';    -- Matches!
... MATCH 'NEAR("a b c d" "b c" "e f", 3)';    -- Does not match!
	</pre id=pre_sqlite3_fts5_end>
HELP_FTS5;

	$html_body.="<hr color=black>\n";
	$html_body.="<a href=/pdf/web/viewer.html?file=/pdf/sqlite3_fts5.pdf target=_blank>\n";
	$html_body.="<img id=img_sqlite3_fts5_pdf title=\"          sqlite3_fts5_pdf\" src=/imgs/btn/koeye_pdf.png height=50></a>\n";
	$html_body.="<hr color=black>\n";
	$html_body.=$help_fts5;
	$html_body.="<hr color=black>\n";
	$html=""; $html.=$html_head; $html.=$html_body; $html.=$html_tail;
	if( $fmt == "html" ) { 
		printf( $html ); 
		exit; 
		}

	printf($html);
	return($html);
	}

function leds($args) {
	$dttm=date('Ymd_His');
	$htmout=""; $j=0; $k=0;
	$db3="ko.db3";
	$tbl="leds";
	$fmt="";
	$limit="100";
	$sql="select * from $tbl";
	if( $limit != "" ) { $sql="select * from $tbl limit $limit"; }

	if( isset($_REQUEST['db3'])) { $db3=$_REQUEST['db3']; }
	if( isset($_REQUEST['tbl'])) { $tbl=$_REQUEST['tbl']; }
	if( isset($_REQUEST['fmt'])) { $fmt=$_REQUEST['fmt']; }
	if( isset($_REQUEST['limit'])) { $limit=$_REQUEST['limit']; }
	if( isset($_REQUEST['sql'])) { $sql=$_REQUEST['sql']; }

	$html=""; $html_head=""; $html_body=""; $html_tail="";
	$psv=""; $psv_head=""; $psv_body=""; $psv_tail="";
	$json=""; $json_head=""; $json_body=""; $json_tail="";

	$html_head.="<html><head>\n";
	$html_head.="<title>/ko/ko.php 20230217_1815</title>\n";
	$html_head.="</head>\n";
	$html_head.="<body bgcolor=linen>\n";
	$html_head.="	<div id=div_leds>\n";
	$html_head.="	<h1>div_leds</h1>\n";
	$html_head.="	<h2>db3=$db3 tbl=$tbl fmt=$fmt</h2>\n";
	$html_head.="	<h3><font style=\"font-size:16\">20230220_1330</font></h3>\n";
	$html_head.="	<table id=table_".$tbl.">\n";

	$html_tail.="	</table id=table_".$tbl."_end>\n";
	$html_tail.="	</div id=div_leds>\n";
	$html_tail.="	</body>\n";
	$html_tail.="	</html>\n";

	$flds_kov="rid|id|status|progid|effdt|grp|title|subject|dt|startdate|starttime|enddate|endtime|pathfile|path|file|ext|tmp|href|txtcnt|content";
	$flds_contacts="id|progid|dttm|status|grp|account|attachment|bcc|role|callback|carphone|categories|cc|dueby|duedate|duration|email|email2|email3|actualwork|address_selected|address_selector|all_day_event|bday|dday|notedays varchar|anniversary|assigned|assistants_name|assistants_phone|billing_information|birthday|bizaddr|bizaddrcity|bizaddrcountry|bizaddrpobox|bizaddrpocode|bizaddrstate|bizaddrstreet|bizfax|bizhomepage|bizphn|bizph2|changedby|children|city|company|coname|cophn|complete|computer|contact|contacts|content|conversation|country|created|custid|dtdone|defertil|dept|distlistname|noautoarchive|downloadstate|emailselected|emailselector|end|entrytype|expires|fileas|fname|flagstatus|followupflag|sendfrom|ftpsite|fullname|gender|govid|haverepliessentto|hobbies|home_addr|home_addrcity|home_addrcountry|home_addrpobox|home_addrpostalcode|home_addrstate|home_addrstreet|home_fax|home_phone|home_phone2|iconformdescription|importance|infolder|initials|inetfreebusyaddress|isdn|jobtitle|journal|junkmailtype|language|lname|lastsavedtm|location|mailaddr|mailaddrflag|managersname|meetingstatus|msg|msgclass|msgflag|mname|mileage|mblphn|modified|meetingurl|nickname|notes|officeloc|optattendees|orgid|organizer|otheraddr|otheraddr_city|othaddr_country|othaddr_pobox|othaddr_postalcode|othaddr_state|othaddr_street|othfax|othphn|outlookiver|outlookver|owner|pager|personalurl|phnselected|phnselector|pobox|primaryphn|priority|private|profession|radiophn|read|received|recur|recurpattern|recurrangeend|recurrangestart|recurring|referby|remindbeforehand|remind|remindoverridedefault|remindsound|remindsoundfile|remindtime|remindtopic|remotestatus|reqstatus|requestedby|requiredattendess|resources|responserequested|retrievaltime|schedpriority|sendtextonly|sensitivity|sent|showtimeas|size|spouse|start|state|straddr|subject|suffix|teamtask|telex|title|sendto|totalwork|trackstat|ttytddphn|user1|user2|user3|user4|webpage|zipcode|pathfile|path|file|base|ext|src|tn|startdate|starttime|enddate|endtime|headline|media|credit|text|led|type|speed|color|bldg|loc|j|k|l|m|h|w|x|y|z|t|x1|y1|z1|t1|x2|y2|z2|t2|temp|desc|";
	$flds_leds="led_id|led_status|led_code|led_name|led_dttm|led_color|led_speed|led_type|led_date|led_cmd|led_cmdout|led_desc|led_misc|led_city|led_bldg|led_loc_code|led_floor|led_group|led_orgs|led_title|led_published|led_width|led_height|led_comment|led_filename|led_user|led_user_ip|led_referer|led_remote_port|led_viewrole|led_user_agent|led_unique_id|led_err|led_fix|led_os|id|grp|status|dttm|pathfile|path|file|base|ext|size|ctime|mtime|exif_dttm|exif_dt|exif_tm|title|thumbnail|alt|link|linktarget|src|tn|startdate|enddate|headline|text|assets|media|credit|caption|i|j|k|w|h|t|x|y|z|t1|x1|y1|z1|t2|x2|y2|z2|temp|desc";
#	$flds=explode("|",$flds_contacts);
#	$flds=explode("|",$flds_kov);
#	$flds=explode("|",$flds_leds);
	$flds=explode("|",$flds_leds);

#	foreach( $flds as $fld ) { printf( "($j,$k) fld=$fld val=".$row[$fld]."<br>\n" ); }
#	rtrim($string,"," );
#	replace_substr($string,"", -1 );
#	substr($string, 0, -1 );

	$text="text_$tbl";
	$request="leds";
	$json_head.="{ \"$request\": {\n";
	$json_head.="\"dttm\":\"".$dttm."\",\n";
	$json_head.="\"db3\":\"".$db3."\",\n";
	$json_head.="\"tbl\":\"".$tbl."\",\n";
	$json_head.="\"limit\":\"".$limit."\",\n";
	$json_head.="\"sql\":\"".$sql."\",\n";
	$json_head.="\"text\":\"".$text."\",\n";
	$json_head.="\"led\": [\n";


	$db3fil=$db3;	
	$tbl="leds";
	$limit=100;
	if( ! is_file($db3fil)) {
		printf( "BUGS_313 NOTFOUND db3fil=$db3fil\n" );
		exit;
		}
	$sql="select * from $tbl limit $limit";
	$pdo = newpdo($db3fil);

	foreach( $pdo->query($sql) as $row ) {
		$j=$j+1;

		$html_body.="<tr>";
		$json_body.="{\n";
		foreach( $flds as $fld ) { 
#			printf( "($j,$k) fld=$fld<br>\n" ); 
			$psv_body.=$row[$fld]."|";
			$json_body.="\"".$fld."\":\"".$row[$fld]."\",\n";
			$html_body.="<td>".$fld."</td><td>".$row[$fld]."</td>";
			}
		$psv_body.="\n";
		$json_body.="\"kludge\":\"kludge\"";
		$json_body.="	},\n";
		$html_body.="	</tr>\n";
		}

#	$string=chop($string,",");
#	echo substr($string, 0, strlen($string)-1);
#	rtrim($string,",");	
#	$comma_separated = implode(",",$array);

	$json_tail ="{\"kludge\":\"kludge\" }\n";
	$json_tail .= "]}}\n";

	$html=""; $html.=$html_head; $html.=$html_body; $html.=$html_tail;
	$json=""; $json.=$json_head; $json.=$json_body; $json.=$json_tail;
	$psv=""; $psv.=$psv_head; $psv.=$psv_body;
	
	if( $fmt == "psv" ) {  printf( $psv ); exit; }
	if( $fmt == "csv" ) {  
		$csv=replace("|",",",$psv); 
		printf( $csv ); 
		exit; 
		}
	if( $fmt == "json" ) { 
		header('Content-type: application/json'); 
		printf( $json ); 
		exit; 
		}
	if(( $fmt == "html" )  || ( $fmt == "htm" )) { 
		printf( $html ); 
		exit; 
		}

	printf($html);
	return($html);
	}


# function kups($options) {
#	$htmout = "";
# $htmout_kups=<<<HTMOUT_KUPS
# 	<html>
# <head>
# 	<title>/ka/ko.php?kups 20230126_2100</title>
# 	</head>
# <body bgcolor=linen>
# 	<h3>/ka/ko.php?kups</h3>
# 	<hr color=goldenrod>
# 	<form id=form_kups action="./ko.php?kups_review" method="post" enctype="multipart/form-data">
# 		<input type="file" name="kups" multiple /><br /><br />
# 		<br><br><br><br>
# 		<input type="reset" name="reset" value="reset" />
# 		<br><br><br><br>
# 		<input type="submit" name="submit" value="submit" />
# 		</form id=form_kups_end>
# 	<hr color=goldenrod>
# 	</body>
# 	</html>
# HTMOUT_KUPS;
# 
# 	$htmout = $htmout_kups;
#	return($htmout);
#	}


# function myFunc() {
# 	for ($i = 0; $i < func_num_args(); $i++) {
# 		printf("Argument %d: %s\n", $i, func_get_arg($i));
# 		}
# 	}


function kups_review($options) {
	$htmout="";

	define('KB', 1024);
	define('MB', 1048576);
	define('GB', 1073741824);
	define('TB', 1099511627776);

#	$env_username="";
#	$cookie_username="";
#	$session_username="";
#	if( isset($_ENV['username'])) { $env_username=$_ENV['username']; }
#	if( isset($_COOKIE['username'])) { $cookie_username=$_COOKIE['username']; }
#	session_start();
#	$_SESSION['user'] = "guest";
#	$_SESSION['usid'] = "usid";
#	session_stop();
#	if( isset($_SESSION['user'])) { $session_user=$_SESSION['user']; }
#	if( isset($_SESSION['usid'])) { $session_user=$_SESSION['usid']; }
#	if( isset($_SESSION['ip'])) { $session_user=$_SESSION['ip']; }

	$htmout .= "<html>\n";
	$htmout .= "<head>\n";
	$htmout .= "	<title>/ka/ko.php?kups=review.html 20230128_2045</title>\n";
	$htmout .= "	</head>\n";
	$htmout .= "<body bgcolor=linen>\n";
	$htmout .= "<h3>/ka/ko.php?kups=review</h3>\n";
	$htmout .= "<hr color=goldenrod>\n";
	$htmout .= "<form id=form_kups_review action='./ko.php?kups=go' method='post' enctype='multipart/form-data'>\n";
	$htmout .= "	<input type='text' name='user' value='user' >user<br><br>\n";
	$htmout .= "	<input type='text' name='pass' value='pass' >pass<br><br>\n";
	$htmout .= "	<input type='text' name='ip' value='ip' >ip<br><br>\n";
	$htmout .= "	<input type='text' name='to' value='kups' >to<br><br>\n";


	if( isset($_FILES['kups']) && $_FILES['kups']['error'] == 0) {
		$filecount=count($_FILES['kups']);
		$htmout .= "<h1>filecount=$filecount</h1>\n";
		for( $f=0; $f<$filecount; $f++ ) {
			$file_name=$_FILES['kups']['name'][$f];
			$file_size="";
#			$file_size=$_FILES['kups']['size'][$f];
			$file_type=$_FILES['kups']['type'][$f];
			$file_tmp_name=$_FILES['kups']['tmp_name'][$f];
#			$file_error=$_FILES['kups']['error'][$f];
			$file_error="";
			$htmout .= "<h1>file_name=$file_name</h1>\n";
			$htmout .= "<h1>file_type=$file_type</h1>\n";

			$htmout .= "	<input type='text' name='file_name$f' value='$file_name' >";
			$htmout .= "<table id=table_kups_file$f>\n";
			$htmout .= "	<tr>";
			$htmout .= "		<td width=200>$file_name</td>";
			$htmout .= "		<td width=100>$file_size</td>";
			$htmout .= "		<td width=100>$file_type</td>";
			$htmout .= "		<td width=300>$file_tmp_name</td>";
			$htmout .= "		<td width=100>$file_error</td>";
			$htmout .= "		</tr>\n";
			$htmout .= "	</table id=table_kups_file$f"."_end>\n";
			$htmout .= "<hr color=goldenrod>\n";

#			$dttm=date('Ymd_His');
#			$newFilePath="./kups/$dttm"."_$file_name";
#			if( move_uploaded_file($file_tmp_name, $newFilePath)) {;}

# https://stackoverflow.com/questions/2704314/multiple-file-upload-in-php
#			foreach($_FILES as $file) {
#				echo $file['tmp_name'].'</br>'; 
#				move_uploaded_file($file['tmp_name'], "./kups/".$file["name"]);
#				}
#			$htmout .= '	<input type="text" name="filedesc$f" >';
#			$htmout .= '	<input type="text" name="fileskip$f" >\n';
			}
		}

	$htmout .= "<input type='text' name='filedesc0' > <input type='text' name='fileskip0' >file0<br><br>";
	$htmout .= "<input type='text' name='filedesc1' > <input type='text' name='fileskip1' >file1<br><br>";
	$htmout .= "<input type='text' name='filedesc2' > <input type='text' name='fileskip2' >file2<br><br>";
	$htmout .= "<input type='text' name='filedesc3' > <input type='text' name='fileskip3' >file3<br><br>";
	$htmout .= "<input type='text' name='filedesc4' > <input type='text' name='fileskip4' >file4<br><br>";
	$htmout .= "<input type='text' name='filedesc5' > <input type='text' name='fileskip5' >file5<br><br>";
	$htmout .= "<input type='text' name='filedesc6' > <input type='text' name='fileskip6' >file6<br><br>";
	$htmout .= "<input type='file' name='kups' multiple ><br><br>";
	$htmout .= "<br><br><br><br>";
	$htmout .= "<input type='reset' name='reset' value='reset' >";
	$htmout .= "<br><br><br><br>";
	$htmout .= "<input type='submit' name='submit' value='submit' >";
	$htmout .= "</form id=form_kup_end>";
	$htmout .= "<hr color=goldenrod>";

	$htmout_files="";
	if( isset( $_FILES['kups'] )) {
		$filcnt=count($_FILES['kups']);
		print_r($_FILES['kups'] );
		$htmout_files .= "<h1>filcnt=$filcnt</h1>\n";
		for( $f=0; $f<$filcnt; $f++ ) {
			$filename=$_FILES['kups']['name'][$f];
			$filename="file_$f";
			$htmout_files .= "f=$f filename=$filename<br>";
			}
		}

#	$htmout = $htmout_kups_review;
	$htmout .= $htmout_files;
	$htmout .= "	</body>\n";
	$htmout .= "	</html>\n";
#	printf($htmout);
	return($htmout);
	}

function kups($options) {
	$htmout="";
	$htmout .= "<html>\n";
	$htmout .= "<head><title>kups 20230129_0100</title></head>\n";
	$htmout .= "<body bgcolor=linen>";
	$htmout .= "<hr color=goldenrod>";
	$htmout .= "<div id=div_kups>";
	$htmout .= "<h1>div_kups</h1>";
	$htmout .= '<hr color=goldenrod>';
	$htmout .= '<form id=form_kups_review action="./ko.php?kups=review" method="post" enctype="multipart/form-data">';
	$htmout .= '	<input type="text" name="user" ><br><br>';
	$htmout .= '	<input type="file" name="kups" multiple ><br><br>';
	$htmout .= '	<br><br><br><br>';
	$htmout .= '	<input type="reset" name="reset" value="reset" >';
	$htmout .= '	<br><br><br><br>';
	$htmout .= '	<input type="submit" name="submit" value="submit" >';
	$htmout .= '	</form id=form_kup_end>';
	$htmout .= '<hr color=goldenrod>';
	$htmout .= "	</div id=div_kups_end>";
	$htmout .= "<hr color=goldenrod>";
	$htmout .= "	</body>";
	$htmout .= "	</html>";
#	printf( $htmout );
	return($htmout);
	}



function kups_go($options) {
	$htmout = "";
	$htmout .= "<html>\n";
	$htmout  .= "<head><title>ko.php?kups=go 20230128_2100</title></head>\n";
	$htmout .= "<body bgcolor=linen>\n";
	$htmout .= "	<div id=div_kups_go>\n";
	$htmout .= "	<h1>kups_go</h1>\n";
	$htmout .= "	</div id=div_kups_go_end>\n";
	$htmout .= "	</body>\n";
	$htmout .= "	</html>\n";
	return($htmout);
	}











// Creates an HTML Img Tag with Base64 Image Data
//	$gdImg = imagecreate( 100, 100 );
//	imagecolorallocate( $gdImg, 0, 0, 0 );
//	echo gdImgToHTML( $gdImg );
//	imagedestroy( $gdImg );
//	$im = imagecreate( 100, 100 );
//	imagecolorallocate( $im, 0, 0, 0 );
//	echo gdImgToHTML($im);

function gdImgToHTML( $gdImg, $format='jpeg' ) {
	ob_start();
	if( $format == 'jpeg') { imagejpeg( $gdImg ); }
    	if( $format == 'png' ) { imagepng( $gdImg ); }
	if( $format == 'gif' ) { imagegif( $gdImg ); }

	$image_data = ob_get_contents();
	ob_end_clean();

	return "<img src='data:image/$format;base64," . base64_encode( $image_data ) . "'>";
	}



function img2b64( $imgfil, $fmt ) {
#	img2b64("./imgs/btn/kobrd.png","png","b64" );
# 	img2b64("./imgs/bg/ko_colorado_white.jpg","jpg","b64" );
# 	img2b64("./imgs/btn/kobrd.png","png","html" );
# 	img2b64("./imgs/btn/kobrd.png","png","" );
	$format="png";
	if( ! is_file($imgfil)){ 
		$htmout="<h1>ERR_400 NOTFOUND imgfil=$imgfil</h1>\n";
		print($htmout);
		exit;
		}
	$ext=explode(".",$imgfil)[1];

	ob_start();
	if( $ext == 'jpeg') { $format="jpeg"; imagejpeg( $imgfil ); }
	if( $ext == 'jpg') { $format="jpeg";  imagejpeg( $imgfil ); }
    	if( $ext == 'png' ) {$format="png";  imagepng( $imgfil ); }
	if( $ext == 'gif' ) {$format="gif";  imagegif( $imgfil ); }
	$img = ob_get_contents();
	ob_end_clean();

	if( $fmt == "html" ) {
		$htmout = "<img src='data:image/$format;base64," . base64_encode( $img ) . "'>";
		return($htmout);
		}
	$b64 = "'data:image/$format;base64," . base64_encode( $img ) . "'";
	return($b64);
	}

function image2b64( $img, $ifmt, $ofmt ) {
#	img2b64("./imgs/btn/kobrd.png","png","b64" );
# 	img2b64("./imgs/bg/ko_colorado_white.jpg","jpg","b64" );
# 	img2b64("./imgs/btn/kobrd.png","png","html" );
# 	img2b64("./imgs/btn/kobrd.png","png","" );

	ob_start();
	if( $ifmt == 'jpeg') { $format="jpeg"; imagejpeg( $img ); }
	if( $ifmt == 'jpg') { $format="jpeg";  imagejpeg( $img ); }
    	if( $ifmt == 'png' ) { $format="png"; imagepng( $img ); }
	if( $ifmt == 'gif' ) { $format="gif"; imagegif( $img ); }
	$image_data = ob_get_contents();
	ob_end_clean();
	
	if( $ofmt == "b64" ) {
		$b64 = "'data:image/$format;base64," . base64_encode( $image_data ) . "'";
		return($b64);
		}

	$htmout = "<img src='data:image/$format;base64," . base64_encode( $image_data ) . "'>";
	return($htmout);
	}


#	identify -list font
#	$options="";
#	newimg($options);
#	txt2imgs($options);
#	txt2img($img,$fontid,$ids,$fmt,$save);
#	poster($options);
	exit;

function newimg($options) {
#	header('Content-type: image/png');
	$png_img = imagecreate(150, 150);
	$png_tn = imagecreate(50, 50);
	$jpg_img = imagecreate(600, 600);
	imagecolorallocate($png_img, 15, 142, 210);
	imagecolorallocate($png_tn, 15, 142, 210);
	imagecolorallocate($jpg_img, 15, 142, 210);
	$pngfil = './kups/gd1.png';
	$tnfil = './kups/tn/tn_gd1.png';
	$jpgfil = './kups/gd1.jpg';

	$htmout="";
	$htmout .= "<html>\n";
	$htmout .= "<head><title>/ka/gd1.php</title></head>\n";
	$htmout .= "<body bgcolor=linen>\n";
	$htmout .= "<h1>pngfil=$pngfil</h1>\n";
	$htmout .= "<h1>jpgfil=$jpgfil</h1>\n";
	$htmout .= "<h1>tnfil=$tnfil</h1>\n";
	$htmout .= "<a href=$pngfil target=_blank>\n";
	$htmout .= "<img src=$tnfil height=200 border=0>\n";
	$htmout .= "</a>png<br>\n";
	$htmout .= "&nbsp &nbsp";
	$htmout .= "<a href=$jpgfil target=_blank>\n";
	$htmout .= "<img src=$tnfil  border=0>\n";
	$htmout .= "</a>jpg<br>\n";
	$htmout .= "&nbsp &nbsp";
	$htmout .= "<a href=$tnfil target=_blank>\n";
	$htmout .= "<img src=$tnfil  border=0>\n";
	$htmout .= "</a>jpg<br>\n";
	$htmout .= "	</body>\n";
	$htmout .= "	</html>\n";
	printf ($htmout);

	imagejpeg($jpg_img, $jpgfil);
	imagepng($png_img, $pngfil);
	imagepng($png_tn, $tnfil);

#	imagepng($png_img);
#	imagejpeg($jpg_img);
#	imagepng($jpg_img);

	imagedestroy($png_img);
	imagedestroy($png_tn);
	imagedestroy($jpg_img);
	}




function load_image($filename, $type) {
#	$new = 'new34.jpeg';
	$new = '/ka/kups/gd1_load.jpg';
	if( $type == IMAGETYPE_JPEG ) {
		$image = imagecreatefromjpeg($filename);
		echo "here is jpeg output:";
		imagejpeg($image, $new);
		}
	if( $type == IMAGETYPE_PNG ) {
		$image = imagecreatefrompng($filename);
		echo "here is png output:";
		imagepng($image,$new);
		}
	if( $type == IMAGETYPE_GIF ) {
		$image = imagecreatefromgif($filename);
		echo "here is gif output:";
		imagejpeg($image, $new);
		}
	return $new;
	}


#	$filename = "/fb/pages/zn/zn_1.jpg";
#	list($width, $height,$type) = getimagesize($filename);
#	echo "Width:" , $width,"\n";
#	echo "Height:", $height,"\n";
#	echo "Type:", $type, "\n";
#	$old_image = load_image($filename, $type);


function txt2imgs($fontid,$ids) {
	$dr="/Volumes/ka1tbr2/ht/";
	if ( isset( $_SERVER['DOCUMENT_ROOT'] )) { $dr=$_SERVER['DOCUMENT_ROOT']; }
	$htmout = ""; $fontid="fontid"; $id="id"; $coverid="ko_colorado_mocha";
	$image_file="/Volumes/ka1tbr2/ht/ka/pages/zn/zn_1.jpg";
	$bgid="ko_colorado_mocha"; $fontid="fontid";
	$image_id_file="./imgs/bg/$bgid"."_$fontid.jpg";
	$cover_file="./imgs/bg/ko_colorado_mocha.jpg";
	$fontid="yokkmokk";
	$cover_id_file="./imgs/bg/ko_colorado_mocha_$fontid"."_$id.jpg"; $bgid="ko_colorado_mocha";
	$koeye_file="./imgs/btn/koeye.png";
	$koeyeb_file="./imgs/btn/koeyeb.png";
	$koeyew_file="./imgs/btn/koeyew.png";


	$image = imagecreatefromjpeg($image_file);
	$white = imagecolorallocate($image, 255, 255, 255);
	$black = imagecolorallocate($image, 0, 0, 0);
	$text_color=0;
	$font_size="18"; $angle=0; $x=100; $y=200; 
	$font="arial.ttf";
	$font="yokkmokk.ttf";
	$font_arial="$dr/fonts/arial.ttf";
	$font_yokkmokk="$dr/fonts/yokkmokk.ttf";
	$font_papyrus="$dr/fonts/PAPYRUS.TTF";
	$font_montserrat_xbold="$dr/fonts/Montserrat-ExtraBold.ttf";
	$font_montserrat_xlight="$dr/fonts/Montserrat-ExtraLight.ttf";
	$font_montserrat="$dr/fonts/Montserrat-Regular.ttf";
	$font_file=$font_papyrus;
	$font_file=$font_montserrat;
	$font_file=$font_yokkmokk;

	if( $ids == "" ) { $ids="bugs ka jsk jsk2 jk sk jak1 jak2 jak3 gjw am jh"; }
	if( $fontid == "" ) { $fontid="papyrus"; }
	$id="bugs";
	$lim = count($ids);
#	$text="jsk2 Sophia Rene K and Amelia Ann too";
	$text="bugs";
	$cover_black=""; $cover_white="";
#	$font_file=$font_arial; $text="bugs"; $x=65; $y=60; $font_size="40"; 
	$font_file=$font_arial; $text="bugs"; $x=65; $y=60; $font_size="40"; $fontid="arial";
	$font_file=$font_papyrus; $text="bugs"; $x=65; $y=60; $font_size="40"; $fontid="papyrus";
	$font_file=$font_yokkmokk; $text="bugs"; $x=65; $y=60; $font_size="40"; $fontid="yokkmokk";
	$font_file=$font_montserrat; $text="bugs"; $coverx=65; $covery=60; $cover_font_size="40"; $fontid="montserrat";
	$font_file=$font_arial; $text="bugs"; $coverx=65; $covery=60; $cover_font_size="80"; $fontid="arial";
	$font_file=$font_yokkmokk; $text="bugs"; $coverx=65; $covery=60; $cover_font_size="80"; $fontid="yokkmokk";
	$font_file=$font_papyrus; $text="bugs"; $coverx=65; $covery=60; $cover_font_size="80"; $fontid="papyrus";


	$fontid="arial";
	$fontid="papyrus";
	$fontid="montserrat";
	$fontid="yokkmokk";

	if( $fontid == "papyrus" ) { $font_file=$font_papyrus; $text="bugs"; $coverx=50; $covery=100; $cover_font_size="60"; $x=70; $y=50; $font_size="24"; }
	if ( $fontid == "yokkmokk" ) { $font_file=$font_yokkmokk; $text="bugs"; $coverx=50; $covery=100; $cover_font_size="64"; $x=80; $y=50; $font_size="32";  }
	if( $fontid == "arial" ) { $font_file=$font_arial; $text="bugs"; $coverx=50; $covery=100; $cover_font_size="60"; $x=70; $y=50; $font_size="24";  }
	if( $fontid == "montserrat" ) { $font_file=$font_montserrat; $text="bugs"; $coverx=50; $covery=150; $cover_font_size="70"; $x=70; $y=50; $font_size="24"; }

	if( isset($_REQUEST['fontid'])) { $fontid=$_REQUEST['fontid']; }
	if( isset($_REQUEST['font_file'])) { $fontid=$_REQUEST['font_file']; }
	if( isset($_REQUEST['text'])) { $fontid=$_REQUEST['text']; }
	if( isset($_REQUEST['coverx'])) { $fontid=$_REQUEST['coverx']; }
	if( isset($_REQUEST['covery'])) { $fontid=$_REQUEST['covery']; }
	if( isset($_REQUEST['cover_font_size'])) { $fontid=$_REQUEST['cover_font_size']; }

#	$image = imagecreatefromjpeg($image_file);
#	$image_black = imagecolorallocate($image, 0, 0, 0);
#	$image_white = imagecolorallocate($image, 255, 255, 255);
#	if( is_file($font_file)) {
#		imagettftext($image, $cover_font_size, $angle, $coverx, $covery, $image_black, $font_file, $text);
#		}
#	else {
#		imagestring($image, 5, $coverx, $covery, $text, $image_black);
#
#		}		
#	imagejpeg($image, $image_id_file);
#	imagedestroy($image);
#	$htmout .= "<a href=$image_id_file target=_blank><img src=$image_id_file height=50 border=0></a>$image_id_file<br> \n";

	$htmout .= "fontid=$fontid font_file=$font_file<br>\n";
	$htmout .= "cover_font_size=$cover_font_size text=$text x=$x y=$y text_color=$text_color<br>\n";

	if ( isset( $_REQUEST['text'])) { $cover_id_file=$_REQUEST['text']; }
	if ( isset( $_REQUEST['ids'])) { $cover_id_file=$_REQUEST['ids']; }
	if ( isset( $_REQUEST['cover_file'])) { $cover_id_file=$_REQUEST['cover_file']; }
	if ( isset( $_REQUEST['koeye_id_file'])) { $koeye_id_file=$_REQUEST['koeye_id_file']; }
	if ( isset( $_REQUEST['koeyeb_id_file'])) { $koeyeb_id_file=$_REQUEST['koeyeb_id_file']; }
	if ( isset( $_REQUEST['koeyew_id_file'])) { $koeyew_id_file=$_REQUEST['koeyew_id_file']; }

	$image_text="ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz_0123456789";
	for( $j=0; $j<$lim; $j++ ) {
		$id=$ids[$j];
		$text=$id;

		$cover_id_file="./imgs/bg/$bgid"."_$fontid"."_$id.jpg";
		$koeye_id_file="./imgs/btn/koeye_$id.png";
		$koeyeb_id_file="./imgs/btn/koeyeb_$id.png";
		$koeyew_id_file="./imgs/btn/koeyew_$id.png";
		$koeye_font_id_file="./imgs/btn/koeye_$fontid"."_$id.png";
		$koeyeb_font_id_file="./imgs/btn/koeyeb_$fontid"."_$id.png";
		$koeyew_font_id_file="./imgs/btn/koeyew_$fontid"."_$id.png";

		if ( isset( $_REQUEST['cover_id_file'])) { $cover_id_file=$_REQUEST['cover_id_file']; }
		if ( isset( $_REQUEST['koeye_id_file'])) { $koeye_id_file=$_REQUEST['koeye_id_file']; }
		if ( isset( $_REQUEST['koeyeb_id_file'])) { $koeyeb_id_file=$_REQUEST['koeyeb_id_file']; }
		if ( isset( $_REQUEST['koeyew_id_file'])) { $koeyew_id_file=$_REQUEST['koeyew_id_file']; }

		$htmout .=  "j=$j id=$id koeye_id_file=$koeye_id_file<br>\n";
		$cover = imagecreatefromjpeg($cover_file);
		$koeye = imagecreatefrompng($koeye_file);
		$koeyeb = imagecreatefrompng($koeyeb_file);
		$koeyew = imagecreatefrompng($koeyew_file);

		$cover_white = imagecolorallocate($cover, 255, 255, 255);
		$cover_black = imagecolorallocate($cover, 0, 0, 0);
		$koeye_white = imagecolorallocate($koeye, 255, 255, 255);
		$koeye_black = imagecolorallocate($koeye, 0, 0, 0);
		$koeyeb_white = imagecolorallocate($koeyeb, 255, 255, 255);
		$koeyeb_black = imagecolorallocate($koeyeb, 0, 0, 0);
		$koeyew_white = imagecolorallocate($koeyew, 255, 255, 255);
		$koeyew_black = imagecolorallocate($koeyew, 0, 0, 0);

		if( is_file($font_file)) {
#			printf( "<h1>BUGS_90 ___FOUND font_file=$font_file</h1>\n" );
			imagettftext($cover, $cover_font_size, $angle, $coverx, $covery, $cover_black, $font_file, $text);
			imagettftext($koeye, $font_size, $angle, $x, $y, $koeye_black, $font_file, $text);
			imagettftext($koeyeb, $font_size, $angle, $x, $y, $koeyeb_white, $font_file, $text);
			imagettftext($koeyew, $font_size, $angle, $x, $y, $koeyew_black, $font_file, $text);
			}
		else {
#			printf( "<h1>BUGS_91 NOTFOUND font_file=$font_file</h1>\n" );
			imagestring($cover, 5, $coverx, $covery, $text, $cover_black);
			imagestring($koeye, 5, $x, $y, $text, $koeye_black);
			imagestring($koeyeb, 5, $x, $y, $text, $koeyeb_white);
			imagestring($koeyew, 5, $x, $y, $text, $koeyew_black);
			}

		$htmout .= "<hr color=goldenrod>\n";
		$htmout .= "<a href=$cover_id_file target=_blank><img src=$cover_id_file height=50 border=0></a>$cover_id_file<br> \n";
		$htmout .= "<a href=$koeye_id_file target=_blank><img src=$koeye_id_file height=20 border=0></a>$koeye_id_file<br> \n";
		$htmout .= "<a href=$koeyeb_id_file target=_blank><img src=$koeyeb_id_file height=20 border=0></a>$koeyeb_id_file<br>\n";
		$htmout .= "<a href=$koeyew_id_file target=_blank><img src=$koeyew_id_file height=20 border=0></a>$koeyew_id_file<br>\n";
#	header("Content-type: image/jpeg");
#	header("Content-type: image/png");

		imagejpeg($cover, $cover_id_file);
		imagepng($koeye, $koeye_id_file);
		imagepng($koeyeb, $koeyeb_id_file);
		imagepng($koeyew, $koeyew_id_file);
		imagepng($koeye, $koeye_font_id_file);
		imagepng($koeyeb, $koeyeb_font_id_file);
		imagepng($koeyew, $koeyew_font_id_file);

#		imagepng($koeye);
#		imagepng($koeyeb);
#		imagepng($koeyew);

		imagedestroy($cover);
		imagedestroy($koeye);
		imagedestroy($koeyeb);
		imagedestroy($koeyew);
		}
	printf( $htmout );
	exit;




	if ( is_file( $imgnam )) {
		$image = imagecreatefromjpeg($imgnam);
		}
	else {
		printf( "</h1>BUGS_90 NOTFOUND $imgnam</h1>\n" );
		exit;
		}

// Allocate colors

	imagestring($koeye, 5, 200, 200, $text, $white);
	imagestring($koeyeb, 5, 200, 200, $text, $white);
	imagestring($koeyew, 5, 200, 200, $text, $black);


	imagestring($image, 5, 200, 200, $text, $white);
#	imagestring($image, 5, 200, 200, $text, $white);
#	imagestring($image, 5, 10, 10, $text, $white);
#	imagestring($image, 5, 10, 10, "jkwii is me", $black);
#	$font_file="/fonts/Montserrate.ttf";
#	$font_file="/fonts/Papyrus.TTF";
#	$x1=0; $y1=0; $x2=500; $y2=600; $color=$white; $start=0; $end=10;
#	$cx=10; $cy=20; $w=10; $h=20, $start, $end
#	$img = ImageCreateFromJPEG('pages/zn/zn_1.jpg'); // path to the existing image
#	$tn = ImageCreateFrompng('pages/tn/tn_1.png'); // path to the existing image
#	$jpg = ImageCreateFromJPEG('pages/zn/zn_1.jpg'); // path to the existing image
#	$png = ImageCreateFrompng('pages/tn/tn_1.png'); // path to the existing image
#	$gif = ImageCreateFromgif('pages/zn/1.gif'); // path to the existing image

#	$tn = imagecreate( 400, 600 );
#	$img = imagecreate( 1100, 1500 );
#	$tnx = imagesx($tn);
#	$tny = imagesy($tn);
#	$imgx = imagesx($img);
#	$imgy = imagesy($img);
#	$backgroundColor1 = imagecolorallocate($tn, 255,255,255);
#	$textColor1 = imagecolorallocate($tn, 0,0,0);
#	$backgroundColor2 = imagecolorallocate($tn, 255,255,255);
#	$textColor2 = imagecolorallocate($tn, 0,0,0);
#	$img = imagerotate( $img1, 20, $backgroundColor );
#	$img = imagecopyresampled($img, $tn, 0,0,0, 148,16,74, 8 );
#	imagecopymerge($newimg, $img, 350, 20, 0, 0, $imgx, $imgy, 100);
#	imageline($img, $x1, $y1, $x2, $y2, $color);
#	imagerectangle($img, $x1,$y1, $x2, $y2, $color );
#	imagearc($img, $cs, $cy, $w, $h, $start, $end, $color )
#	imagepolygon($img, $w1, $h1, $w2, $h2, 3, $color );
#	imageopenpolygon($img, $w1, $h1, $w2, $h2, 3, $color );
#	imagefilledrectangle();
#	imagesetthickness($img, $thickness);
#	imagefilledrectangle();
#	imagechar($img,$font, $x, $y, $text, $color); 
#	imagecharup($img,$font, $x, $y, $text, $color); 
#	imagestring($img,$font, $x, $y, $text, $color); 
#	imagestringup($img,$font, $x, $y, $text, $color); 

#	$img = imagecreatetruecolor($img_width, $img_height);
#	$clouds = imagecreatefrompng('imgs/clouds.png');
#	$clouds = imagescale($clouds, 250);
#	imagesetthickness($img, 5);
#	imagesetbrush($img, $clouds);
#	imageline($img, $img_width*9/10, 50, $img_width*9/10, 50, IMG_COLOR_BRUSHED);



	if( is_file($font_file)) {
#		printf( "<h1>BUGS_90 ___FOUND font_file=$font_file</h1>\n" );
		imagettftext($image, $font_size, $angle, $x, $y, $text_color, $font_file, $text);
		imagettftext($koeye, $font_size, $angle, $x, $y, $white, $font_file, $text);
		imagettftext($koeyeb, $font_size, $angle, $x, $y, $white, $font_file, $text);
		imagettftext($koeyew, $font_size, $angle, $x, $y, $black, $font_file, $text);
		}
	else {
#		printf( "<h1>BUGS_91 NOTFOUND font_file=$font_file</h1>\n" );
		imagestring($image, 5, 100, 200, $text, $white);
		imagestring($koeye, 5, 100, 200, $text, $white);
		imagestring($koeyeb, 5, 100, 200, $text, $white);
		imagestring($koeyew, 5, 100, 200, $text, $black);
		}

	header("Content-type: image/jpeg");
	imagejpeg($image);
	imagepng($koeye);
	imagepng($koeyeb);
	imagepng($koeyew);
	imagedestroy($image);
	}


function txt2img($imgfil,$fontid,$text,$fmt,$savefile) {
#	txt2img("koeye.png","yokkmokk","jkwii","b64","save")
	$dr="/Volumes/ka1tbr2/ht/";
	if ( isset( $_SERVER['DOCUMENT_ROOT'] )) { $dr=$_SERVER['DOCUMENT_ROOT']; }
	$htmout = ""; $fontid="fontid"; $id="id"; $coverid="ko_colorado_mocha";
	if( ! is_file($imgid)) {
		$htmout = "<h1>BUGS_500 txt2img NOTFOUND imgid=$imgid</h1>\n";
		return( $htmout );
		}
	if(( $fontid == "" ) || ( $fontid="fontid" )) { $fontid="yokkmokk"; }
	if(( $fmt == "" ) || ( $fmt="fmt" )) { $fmt="b64"; }

	$ext=explode(".",$imgid)[1];
	$text_color=0;
	$font_size="18"; $angle=0; $x=100; $y=200; 

	$font_arial="$dr/fonts/arial.ttf";
	$font_yokkmokk="$dr/fonts/yokkmokk.ttf";
	$font_papyrus="$dr/fonts/PAPYRUS.TTF";
	$font_montserrat_xbold="$dr/fonts/Montserrat-ExtraBold.ttf";
	$font_montserrat_xlight="$dr/fonts/Montserrat-ExtraLight.ttf";
	$font_montserrat="$dr/fonts/Montserrat-Regular.ttf";
	$font_file=$font_papyrus;
	$font_file=$font_montserrat;
	$font_file=$font_yokkmokk;

	if( $ids == "" ) { $ids="bugs ka jsk jsk2 jk sk jak1 jak2 jak3 gjw am jh"; }
	$lim = count($ids);

	if( $fontid == "papyrus" ) { $font_file=$font_papyrus; $text="bugs"; $coverx=50; $covery=100; $cover_font_size="60"; $x=70; $y=50; $font_size="24"; }
	if ( $fontid == "yokkmokk" ) { $font_file=$font_yokkmokk; $text="bugs"; $coverx=50; $covery=100; $cover_font_size="64"; $x=80; $y=50; $font_size="32";  }
	if( $fontid == "arial" ) { $font_file=$font_arial; $text="bugs"; $coverx=50; $covery=100; $cover_font_size="60"; $x=70; $y=50; $font_size="24";  }
	if( $fontid == "montserrat" ) { $font_file=$font_montserrat; $text="bugs"; $coverx=50; $covery=150; $cover_font_size="70"; $x=70; $y=50; $font_size="24"; }

	if( isset($_REQUEST['fontid'])) { $fontid=$_REQUEST['fontid']; }
	if( isset($_REQUEST['font_file'])) { $fontid=$_REQUEST['font_file']; }
	if( isset($_REQUEST['text'])) { $fontid=$_REQUEST['text']; }
	if( isset($_REQUEST['coverx'])) { $fontid=$_REQUEST['coverx']; }
	if( isset($_REQUEST['covery'])) { $fontid=$_REQUEST['covery']; }
	if( isset($_REQUEST['cover_font_size'])) { $fontid=$_REQUEST['cover_font_size']; }

	if( $ext == "png" ) { $img = imagescreatefrompng($imgfil); }
	if( $ext == "jpg" ) { $img = imagescreatefromjpeg($imgfil); }
	$white = imagecolorallocate($img, 255, 255, 255);
	$black = imagecolorallocate($img, 0, 0, 0);

	if( is_file($font_file)) {
		imagettftext($img, $font_size, $angle, $x, $y, $black, $font_file, $text);
		}
	else {
		imagestring($img, 5, $x, $y, $text, $black);
		}		

	if( $savefile != "" ) {
		if( $ext == "png" ) { imagepng($img, $savefile); }
		if( $ext == "jpg" ) { imagejpeg($img, $savefile); }
		}

	if( $ext == "png" ) { 
		header("Content-type: image/png");
		imagepng($img); 
		}
	if( $ext == "jpg" ) { 
		header("Content-type: image/jpeg");
		imagejpeg($img); 
		}

	imagedestroy($img);
	printf( $htmout );
	exit;
	}



# https://www.delftstack.com/howto/php/image-resizing-in-php/
function poster($options) {
	header("Content-type: image/jpeg");
#	header("Content-type: image/png");

	$imgfil="/ka/pages/zn/zn_1.jpg";
	$img = imagecreatefromjpeg($imgfil);

	$img_width = 800;
	$img_height = 600;

	$png= imagecreate(150, 150);
	$tn = imagecreate(50, 50);
	$jpg= imagecreate(1100, 1600);
#	$img= imagecreate(650, 700);

	imagecolorallocate($png, 15, 142, 210);
	imagecolorallocate($tn, 15, 242, 220);
	imagecolorallocate($jpg, 15, 142, 200);
	imagecolorallocate($img, 25, 242, 210);

        $pngfil = './kups/gd1.png';
        $tnfil = './kups/tn/tn_gd1.png';
        $jpgfil = './kups/gd1.jpg';

	printf( "<h1>BUGS_10 /ka/gd2.php</h1>\n" );
	imagepng($png);
#	imagepng($tn);
#	imagejpeg($jpg);
#	imagejpeg($img);


#	$tn = imagecreatetruecolor($img_width, $img_height);
#	$img = imagecreatetruecolor($img_width, $img_height);
#	$black = imagecolorallocate($img, 0, 0, 0);
#	$white = imagecolorallocate($img, 255, 255, 255);
#	$red   = imagecolorallocate($img, 255, 0, 0);
#	$green = imagecolorallocate($img, 0, 255, 0);
#	$blue  = imagecolorallocate($img, 0, 200, 250);
#	$orange = imagecolorallocate($img, 255, 200, 0);
#	$brown = imagecolorallocate($img, 220, 110, 0);

	$dr="/Volumes/ka1tbr2/ht";
	$tildapub="~/public_html";
	if ( isset( $_SERVER['DOCUMENT_ROOT'] )) { $dr = $_SERVER['DOCUMENT_ROOT']; }

	printf( "<h1>BUGS_201 dr=$dr dirname=".dirname(__FILE__). "</h1>\n" );
	printf( "<h1>BUGS_202 dr=$dr dirname=$tildapub</h1>\n" );


#	imagefill($img, 0, 0, $white);
#	imagestringup($img, 5, $img_width*19/20, $img_height*19/20, 'This sentence was written using imagestringup()!', $blue);
#	imagestring($img, 5, $img_width/20, $img_height/20, 'This sentence was written using imagestring()!', $red);

#	$passion_one = dirname(__FILE__) . '/PassionOne-Regular.ttf';
	$passion_one = '$dr/fonts/yokkmokk.ttf';
	$passion_one = "/Volumes/ka1tbr2/ht/fonts/yokkmokk.ttf";
#	imagettftext($img, 32, 0, $img_width/20, $img_height*2/10, $black, $passion_one, 'This is Passion One Font!');

#	$merriweather = dirname(__FILE__) . '/Merriweather-Regular.ttf';
	$merriweather = '$dr/fonts/yokkmokk.ttf';
	$merriweather = "/Volumes/ka1tbr2/ht/fonts/yokkmokk.ttf";
#	imagettftext($img, 24, 90, $img_width*9/10, $img_height*19/20, $black, $merriweather, 'This is Merriweather Regular Font!');

#	$patua_one = dirname(__FILE__) . '/PatuaOne-Regular.ttf';
	$patua_one = "$dr/fonts/yokkmokk.ttf";
	$patua_one = "/Volumes/ka1tbr2/ht/fonts/yokkmokk.ttf";
#	imagettftext($img, 32, 0, $img_width/20, $img_height*3/10 + 2, $black, $patua_one, 'This is Patua One Font!');
#	imagettftext($img, 32, 0, $img_width/20, $img_height*3/10, $orange, $patua_one, 'This is Patua One Font!');

#	$monoton = dirname(__FILE__) . '/Monoton-Regular.ttf';
	$monoton = "$dr/fonts/yokkmokk.ttf";
#	imagettftext($img, 72, 0, $img_width/20, $img_height*5.5/10 - 5, $brown, $monoton, 'MONOTON');
#	imagettftext($img, 72, 0, $img_width/20, $img_height*5.5/10 + 5, $orange, $monoton, 'MONOTON');
#	imagettftext($img, 72, 0, $img_width/20, $img_height*5.5/10, $blue, $monoton, 'MONOTON');

#	$kaushan = dirname(__FILE__) . '/KaushanScript-Regular.ttf';
	$papyrus = "$dr/fonts/PAPYRUS.TTF";
#	imagettftext($img, 84, 0, $img_width/20, $img_height*8/10 - 2, $brown, $papyrus, 'Good Night!');
#	imagettftext($img, 84, 0, $img_width/20, $img_height*8/10 + 2, $black, $papyrus, 'Good Night!');
#	imagettftext($img, 84, 0, $img_width/20 - 2, $img_height*8/10, $brown, $papyrus, 'Good Night!');
#	imagettftext($img, 84, 0, $img_width/20 + 2, $img_height*8/10, $black, $papyrus, 'Good Night!');
#	imagettftext($img, 84, 0, $img_width/20, $img_height*8/10, $white, $papyrus, 'Good Night!');

#	imagepng($img);
#	imagejpeg($jpg);
#	imagepng($png);
#	imagepng($tn);
#	imagejpeg($jpg_img, $jpgfil);
#	imagepng($png_img, $pngfil);
#	imagepng($png_tn, $tnfil);
#

#	header("Content-type: image/png");
	imagepng($png);
#	imagepng($tn);

#	header("Content-type: image/jpeg");
#	imagejpeg($jpg);
#	imagejpeg($img);

	imagedestroy($png);
	imagedestroy($tn);
	imagedestroy($jpg);
	imagedestroy($img);

	}

//	document.getElementById("myForm").submit();
//	document.getElementById("myForm").requestSubmit();

function k9($k9) {
	$htmout="";
	$htmout .= "<html><head><title>ko.php?k9=$k9</title></head>\n";
	$htmout .= "<body bgcolor=linen>\n";
	$htmout .= "<div id=div_k9_$k9>\n";
	$htmout .= "<h1>div_k9_$k9</h1>\n";
	$session_id="ko_session_id";
	$session_user="user";
	$session_pass="pass";
	$session_ip="ip";
	$session_count=0;

	if( isset($_SESSION['id'] )) { $session_id=$_SESSION['id']; }
	if( isset($_SESSION['user'] )) { $session_user=$_SESSION['user']; }
	if( isset($_SESSION['pass'] )) { $session_pass=$_SESSION['pass']; }
	if( isset($_SESSION['ip'] )) { $session_ip=$_SESSION['ip']; }
	if( isset($_SESSION['count'] )) { 
		$session_count=$_SESSION['count'] ;
		$session_count++;
		$_SESSION['count'] = $session_count;
		}

	if( $k9 == "woof" ) {
#		session_id($ko_session_id);
		$session_id=session_id();
		session_start();

		$_SESSION['id'] = "id1";
		$_SESSION['user'] = "user1";
		$_SESSION['pass'] = "pass1";
		$_SESSION['ip'] = "ip";
		$_SESSION['count'] = "1";

		$session_id=$_SESSION['id'];
		$session_user=$_SESSION['user'];
		$session_pass=$_SESSION['pass'];
		$session_ip=$_SESSION['ip'];
		$session_ip=$_SESSION['count'];

		$htmout .= kolog_submit();


		$htmout .= "<h1>BUGS_910 k9 MEOW k9=$k9 session_id=$session_id</h1>\n";
		$htmout .= "<h1>BUGS_911 k9 WOOF k9=$k9 session_id=$session_id</h1>\n";
		$htmout .= "<h2>BUGS_912 k9 WOOF k9=$k9 session_user=$session_user</h2>\n";
		$htmout .= "<h2>BUGS_913 k9 WOOF k9=$k9 session_pass=$session_pass</h2>\n";
		$htmout .= "<h2>BUGS_914 k9 WOOF k9=$k9 session_ip=$session_ip</h2>\n";
		$htmout .= "</div></body></html>\n";

#		unset($_SESSION);
#		session_destroy();
		return($htmout);
		}


	if( $k9 == "meow" ) {
		if( isset($_SESSION['pass'])) { unset($_SESSION['pass']); }
		unset($_SESSION);
		session_destroy();

		$htmout .= "<h1>BUGS_920 k9 MEOW k9=$k9 session_id=$session_id</h1>\n";
		$htmout .= "<h2>BUGS_921 k9 MEOW k9=$k9 session_user=$session_user</h2>\n";
		$htmout .= "<h2>BUGS_922 k9 MEOW k9=$k9 session_pass=$session_pass</h2>\n";
		$htmout .= "<h2>BUGS_923 k9 MEOW k9=$k9 session_ip=$session_ip</h2>\n";
		$htmout .= "<h1>BUGS_924 k9 MEOW k9=$k9 session_count=$session_count</h1>\n";
		$htmout .= "</div></body></html>\n";
		return($htmout);
		}

	$htmout .= "<a href=/ka target=_blank>\n";
	$htmout .= "	<img src=/imgs/btn/koeye.png height=20 border=0>\n";
	$htmout .= "	</a>ka\n";
	$htmout .= "<hr color=black>\n";
	$htmout .= "<h1>BUGS_930 k9 ____ k9=$k9 session_id=$session_id</h1>\n";
	$htmout .= "<h2>BUGS_931 k9 ____ k9=$k9 session_user=$session_user</h2>\n";
	$htmout .= "<h2>BUGS_932 k9 ____ k9=$k9 session_pass=$session_pass</h2>\n";
	$htmout .= "<h2>BUGS_933 k9 ____ k9=$k9 session_ip=$session_ip</h2>\n";
	$htmout .= "<h1>BUGS_934 k9 ____ k9=$k9 session_count=$session_count</h1>\n";
	$htmout .= "	</div id=div_k9>\n";
	$htmout .= "</body></html>\n";
	return($htmout);

#	CREATE TABLE sessions (
#		'session_id' varchar,
#		'created' var'har,
#		'session_data' varchar
#		);
#	PRIMARY KEY('session_id');
	}



function gd($gd) {
	$htmout=""; $j=0; $k=0;
	$htmout .= "<html><head><title>ko.php?gd</title></head>\n";
	$htmout .= "<body bgcolor=linen>\n";
	$htmout .= "	<div id=div_gd>\n";
	$htmout .= "		<h1>div_gd</h1>\n";

$jpgs_data=<<<TXT2IMG_JPGS_DATA
ko_colorado_mocha|./imgs/bg/ko_colorado_mocha.jpg
ko_colorado_mocha|./imgs/bg/ko_colorado_white.jpg
ko_colorado_mocha|./imgs/bg/ko_colorado_mocha.jpg
bg_frax1|./imgs/bg/bg_frax01.jpg
bg_frax2|./imgs/bg/bg_frax02.jpg
bg_frax4|./imgs/bg/bg_frax04.jpg
bg_frax5|./imgs/bg/bg_frax05.jpg
bg_frax_mozaic|./imgs/bg/bg_frax_mozaic.jpg
bg_frax_ribbon|./imgs/bg/bg_frax_ribbon.jpg
bg_frax_thorn|./imgs/bg/bg_frax_thorn.jpg
bg_frax_thorn2|./imgs/bg/bg_frax_thorn2.jpg
bg_frax_fraxflam02mozaic|./imgs/bg/bg_fraxflam02.jpg
bg_grass|./imgs/bg/bg_grass.jpg
bg_grass1|./imgs/bg/bg_grass1.jpg
bg_grass2|./imgs/bg/bg_grass2.jpg
bg_newton04|./imgs/bg/bg_newton04.jpg
bg_newton04b_opt|./imgs/bg/bg_newton04b_opt.jpg
bg_newton05b|./imgs/bg/bg_newton05b.jpg
bg_newton05b_opt|./imgs/bg/bg_newton05b_opt.jpg
bg_newton05w_opt|./imgs/bg/bg_newton05bw_opt.jpg
bg_newton05bw_tran|./imgs/bg/bg_newton05bw_tran.jpg
bg_newton06b|./imgs/bg/bg_newton06b.jpg
bg_newton06b_opt|./imgs/bg/bg_newton06b_opt.jpg
bg_newton07a|./imgs/bg/bg_newton07a.jpg
bg_newton07b|./imgs/bg/bg_newton07b.jpg
bg_newton07b_opt|./imgs/bg/bg_newton07b_opt.jpg
bg_newton09_opt|./imgs/bg/bg_newton09_opt.jpg
bg_newton10_opt|./imgs/bg/bg_newton10_opt.jpg
bg_newton11|./imgs/bg/bg_newton11.jpg
bg_noise01|./imgs/bg/bg_noise01.jpg
bg_noise02|./imgs/bg/bg_noise02.jpg
bg_noise03|./imgs/bg/bg_noise03.jpg
bg_noise04|./imgs/bg/bg_noise04.jpg
bg_noise05|./imgs/bg/bg_noise05.jpg
bg_swoorl01|./imgs/bg/bg_swoorl01.jpg
bg_swoorl02|./imgs/bg/bg_swoorl02.jpg
bg_swoorl03|./imgs/bg/bg_swoorl03.jpg
ko_colorado_white|./imgs/bg/ko_colorado_white.jpg
ko_colorado_white_kobig|./imgs/bg/ko_colorado_white_kobig.jpg
ko_colorado_white_koeye|./imgs/bg/ko_colorado_white_koeye.jpg
TXT2IMG_JPGS_DATA;
$jpgs=explode("\n",$jpgs_data);

$pngs_data=<<<TXT2IMG_PNGS_DATA
koeye|./imgs/btn/koeye.png
koeyeb|./imgs/btn/koeyeb.png
koeyew|./imgs/btn/koeyew.png
kobrd|./imgs/btn/kobrd.png
kobrdb|./imgs/btn/kobrdb.png
kobrdw|./imgs/btn/kobrdw.png
TXT2IMG_PNGS_DATA;
$pngs=explode("\n",$pngs_data);

$fontids=explode(" ","montserrat yokkmokk papyrus arial");
$ids=explode(" ","ka jk sk jak1 jak2 jak3 jsk jsk2 gjw am jh");

	$jpgs_count=count($jpgs);
	$pngs_count=count($pngs);
	$fontids_count=count($fontids);
	$ids_count=count($ids);

	$htmout .= "<h2>jpgs jpgs_count=$jpgs_count</h2>\n";
	for( $j=0; $j<$jpgs_count; $j++ ) {

		$jpgid=explode("|",$jpgs[$j])[0];
		$jpgfil=explode("|",$jpgs[$j])[1];
		$htmout .= "$j <a href=./ko.php?gd=txt2img&img=$jpgfil target=_blank>\n";
		$htmout .= "	</img src=$jpgfil height=100 border=0>\n";
		$htmout .= "	</a>$jpgid<br>\n";
		}

	$htmout .= "<h2>pngs pngs_count=$pngs_count</h2>\n";
	for( $j=0; $j<$pngs_count; $j++ ) {
		$pngid=explode("|",$pngs[$j])[0];
		$pngfil=explode("|",$pngs[$j])[1];
		$htmout .= "$j <a href=./ko.php?gd=txt2img&img=$pngid target=_blank>\n";
		$htmout .= "	</img src=$pngfil height=100 border=0>\n";
		$htmout .= "	</a>$pngid<br>\n";
		}
	
	$fontids_count=count($fontids);
	$htmout .= "<h2>fontids fontids_count=$fontids_count</h2>\n";
	for( $j=0; $j<$fontids_count; $j++ ) {
		$fontid=$fontids[$j];
		$htmout .= "$j <a href=./ko.php?gd&fontid=$fontid target=_blank>\n";
		$htmout .= "	</img src=./imgs/btn/koeye.png height=100 border=0>\n";
		$htmout .= "	</a>$pngid<br>\n";
		}

	$htmout .= "		</div id=div_gd_end>\n";
	$htmout .= "	</body>\n";
	$htmout .= "	</html>\n";

	$htmout .= txt2img($fontid,$ids);
	printf($htmout);
	exit;
	}
//


koh5_pano



Your browser does not support the HTML5 canvas element.


Drag mouse to navigate.

Navigation





17.Aug.2010, Martin Wengenmayer