DIR : /home/kozerus/public_html/go/ko_canvas_20211130_2100.html

/home/kozerus/public_html/go

<html>
<head>
	<title>/go/canvas.html 20211130_1330</title>
	<script id=startup_canvas>
		function startup_canvas(args) {
			htmout = "";
			ko_canvas("startup");
			return(htmout);
			}
		</script>

	<script id=ko_canvas>
		function ko_canvas(args) {
//			alert( "BUGS_100 ko_canvas args="+args );
			var htmout="";
var woods="wood1 wood2 wood3 wood4 wood5 wood6 wood7 wood8";
var wood="wood8";
//			alert( "BUGS_101 ko_canvas wood="+wood );
			var canvas = document.getElementById('canvas');
//			alert( "BUGS_102 canvas="+canvas );


			if( canvas.getContext ) {
				var ctx = canvas.getContext('2d');
				ctx.clearRect(0,0,400,400);
//				ctx.save();
				}
			else {
				alert( "ERR_109 canvas NOTFOUND ctx=" );
				}

			if( ctx == null ) { return(htmout); }
//			alert( "BUGS_030 ko_canvas args="+args );

//			grad = ctx.createRadialGradient(0,0,0,0,0,600);			
//			grad.addColorStop(0,'#000');
//			grad.addColorStop(1,'rgb('+color+', '+color+', '+color+')');

var x=0;
var y=0;
var dy=4;
var dx=4;
var WIDTH=1100;
var HEIGHT=800;

var img_ko = new Image();
var img_ok = new Image();
var img_koeye = new Image();
var img_koeyeb = new Image();
var img_koeyew = new Image();

var img_brd = new Image();
var img_b = new Image();
var img_b_b = new Image();
var img_b_w = new Image();
var img_w = new Image();
var img_w_b = new Image();
var img_w_w = new Image();

// img_ko.src="/imgs/btn/ko.png";
// img_ok.src="imgs/btn/ok.png";
// img_koeye.src="/imgs/btn/koeye.png";
// img_koeyeb.src="/imgs/btn/koeyeb.png";
// img_koeyew.src="/imgs/btn/koeyew.png";
// img_b.src_b="/go/dgs/images/50/b_b.gif";
// img_b_b.src="/go/dgs/images/50/b_b.gif";
// img_b_w.src="/go/dgs/images/50/b_w.gif";
// img_w.src="/go/dgs/images/50/w.gif";
// img_w_b.src="/go/dgs/images/50/w_b.gif";
// img_w_w.src="/go/dgs/images/50/w_w.gif";
// img_brd.src="/go/dgs/images/50/"+wood+".gif";
 
 
			var c = document.getElementById("canvas");
			var ctx = c.getContext("2d");
			var img = document.getElementById("img_ko");
			var img_ko = document.getElementById("img_ko");
			var img_ok = document.getElementById("img_ok");
			var img_koeye = document.getElementById("img_koeye");
			var img_koeyeb = document.getElementById("img_koeyeb");
			var img_koeyew = document.getElementById("img_koeyew");
		
			var img_brd = document.getElementById("img_wood8");
			var img_b = document.getElementById("img_b");
			var img_w = document.getElementById("img_w");
//			alert( "BUGS_100 img_brd="+img_brd );		

			var img_b_b = document.getElementById("img_b_b");
			var img_b_w = document.getElementById("img_b_w");
			var img_w_b = document.getElementById("img_w_b");
			var img_w_w = document.getElementById("img_w_w");

			var brd_dx=100; var brd_dy=10;
			x=0; y=20; ctx.drawImage(img_ko,x,y);
			x=250; y=20; ctx.drawImage(img_koeye,x,y);
			x=450; y=20; ctx.drawImage(img_koeyeb,x,y);
			x=650; y=20; ctx.drawImage(img_koeyew,x,y);
			x=900; y=20; ctx.drawImage(img_ok,x,y);

//			alert( "BUGS_101 img_brd="+img_brd );
			x=300; y=300; ctx.drawImage(img_brd,x,y);
//			alert( "BUGS_102 img_b="+img_b );
			x=260; y=260; ctx.drawImage(img_b,x,y);
			x=440; y=440; ctx.drawImage(img_w,x,y);

			x=200; y=800; ctx.drawImage(img_b_b,x,y);
			x=250; y=800; ctx.drawImage(img_b_w,x,y);
			x=300; y=800; ctx.drawImage(img_w_b,x,y);
			x=350; y=800; ctx.drawImage(img_w_w,x,y);

//			
			ctx.beginPath();
			x=600; y=600; dx=700; dy=700;
			ctx.moveTo(x,y);
			ctx.lineTo(dx,y);
			ctx.lineTo(x,dy);
//			ctx.fillStyle="#FBF7F8";
			ctx.fill();

//			alert( "BUGS_130 img_w="+img_w );
			x=700; y=700; dx1=800; dy1=800; dx2=100; dy2=100;
			ctx.beginPath();
			ctx.moveTo(x,y);
			ctx.lineTo(dx1,dy2);
			ctx.lineTo(dx1,dy2);
			ctx.lineTo(dx2,dy1);
			ctx.closePath();
			ctx.stroke();
			ctx.fillStyle="#FAF7F8";
//			ctx.fill();
//			alert( "BUGS_140 img_w="+img_w );



//			var img_ko=new Image();
//			img_ko.src="imgs/btn/ko.png";
//			alert( "BUGS_106 ko_canvas x="+x+" y="+y+" img="+img_ko.src );
//			x=100; y=100; ctx.drawImage(img_ko,x,y); x=x+dx; y=y+dy;
//			alert( "BUGS_107 ko_canvas x="+x+" y="+y+" img="+img_ko.src );

			x=300; y=600; ctx.drawImage(img_w_b,x,y);
			x=350; y=650; ctx.drawImage(img_w_w,x,y);
			x=400; y=700; ctx.drawImage(img_b_b,x,y);
			x=450; y=750; ctx.drawImage(img_b_w,x,y);
//			alert( 'BUGS_150 IMG_B_B...IMG_W_W');
			return("");

//			x=500; y=500; ctx.drawImage(img_b,x,y); x=x+dx; y=y+dy;
//			x=220; y=220; ctx.drawImage(img_b_b,x,y); x=x+dx; y=y+dy;
//			x=230; y=230; ctx.drawImage(img_b_w,x,y); x=x+dx; y=y+dy;
			x=x+dx; y=y+dy;
			x=x+dx; y=y+dy;
//			x=310; y=700; ctx.drawImage(img_w,x,y); x=x+dx; y=y+dy;
//			x=320; y=320; ctx.drawImage(img_w_b,x,y); x=x+dx; y=y+dy;
//			x=330; y=330; ctx.drawImage(img_w_w,x,y); x=x+dx; y=y+dy;


//			if( document.getElemntById("div_layer1")) {
//				div_layer1 = document.getElemntById("div_layer1");
//				div_ctx1 = div_layer1.getContext("2d");
//				}
//			if( document.getElemntById("div_layer2")) {
//				div_layer2 = document.getElemntById("div_layer2");			
//				div_ctx2 = div_layer2.getContext("2d");
//				}
//			if( document.getElemntById("div_layer3")) {
//				div_layer3 = document.getElemntById("div_layer3");			
//				div_ctx3 = div_layer3.getContext("2d");
//				}

			ctx.clearRect(0,0,WIDTH,HEIGHT);
			ctx.fillStyle="#FAF7F8";
			ctx.begPath();
//			ctx.rect(0,0,WIDTH,HEIGHT);
			ctx.arc(x,y,10,0,Math.PI*2,true);
			ctx.closePath();
			ctx.fill();

			if(x+dx>WIDTH||x+dx<0) dx=-dx;			
			if(y+dy>HEIGHT||y+dy<0) dy=-dy;
			x+=dx;
			y+=dy;
			x=0; y=0;
			var img_b = new Image();
			var t=0;
			var bx=0; var by=0;
			var bxlim = 7; var bxliim=7;
			var x2 = 0; var y2 = 0;
			var dx = 10; var dy = 10;			
//			img_b.onload = function() {
//				var w1 = 1100;
//				var h1 = 1100;
//				var w2 = 10;
//				var h2 = 10;
				for( bx = 0; bx < bxlim; bx=bx+1) {
					if( x2 < bxlim )  { x2 = x2+dx; }
					else { x2=0; }
					for( by = 0; by < bylim; by=by+1) {
						if( y2 < bylim )  { y2 = y2+dy; }
						else { y2=0; }
//						var x2 = canvas.width / 2 - w2 / 2;
//						var y2 = canvas.height / 2 - h2 / 2;
				
						ctx.drawImage(img_b, x1,y1,w1,h1, x2,y2,w2,h2);
						}
					}
//				}

// fonts
	
			var font_italic="Italic 30px Sans-Serif"
			var font_bold="Italic 30px Sans-Serif"
			var fillstyle="#00F";
			var textalign="center";
			var textbaseline="Top";
			var filltext="filltext";
			var maxwidth=400;
			var filltext="filltext";
			var text="ko_canvas";
			x=200; y=200;
			ctx.fillStyle=fillstyle;
			ctx.font=font;
			ctx.fillStyle=fillstyle;
			ctx.textBaseline=textbaseline;
			ctx.fillText(filltext,x,y);
			strokeText(text,x,y,maxwidth);

			return(htmout);
			}
		</script>

	<script id=script_toggle>
// $('#msform').fadeOut(50);
// $('#msform').fadeIn(50);
// $(body).html($(body).html().replace('lollypops', 'marshmellows'));

		function toggle(divid) {
			var imgid=divid.replace("div_","img_" );
			if(! document.getElementById(divid)) { return; }

			var imgid=divid.replace("div_","img_" );
			style_display=document.getElementById(divid).style.display;
			
			if( style_display == "none" ) {
				img="<img src=/imgs/btn/koeyew.png id="+imgid+" height=50 onclick=\"toggle('"+divid+"'); return false;\" >";
//				alert( "BUGS_37881 NONE img="+img );
				document.getElementById(divid).style.display="inline";
				document.getElementById(imgid).innerHTML=img;
				document.getElementById(imgid).src="/imgs/btn/koeyew.png";
				}
			else {
				img="<img src=/imgs/btn/koeyeb.png id="+imgid+" height=50 onclick=\"toggle('"+divid+"'); return false;\" >";
				document.getElementById(divid).style.display="none";
				document.getElementById(imgid).innerHTML=img;
				document.getElementById(imgid).src="/imgs/btn/koeyeb.png";
				}
			}
		</script>

	<script id=script_konva src='data:/text/plain;base64,IWZ1bmN0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoZSk6KHQ9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6dHx8c2VsZikuS29udmE9ZSgpfSh0aGlzLChmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjsKLyoKICAgKiBLb252YSBKYXZhU2NyaXB0IEZyYW1ld29yayB2OC4zLjAKICAgKiBodHRwOi8va29udmFqcy5vcmcvCiAgICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVAogICAqIERhdGU6IE1vbiBOb3YgMTUgMjAyMQogICAqCiAgICogT3JpZ2luYWwgd29yayBDb3B5cmlnaHQgKEMpIDIwMTEgLSAyMDEzIGJ5IEVyaWMgUm93ZWxsIChLaW5ldGljSlMpCiAgICogTW9kaWZpZWQgd29yayBDb3B5cmlnaHQgKEMpIDIwMTQgLSBwcmVzZW50IGJ5IEFudG9uIExhdnJlbm92IChLb252YSkKICAgKgogICAqIEBsaWNlbnNlCiAgICovdmFyIHQ9TWF0aC5QSS8xODA7Y29uc3QgZT0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2YgV29ya2VyR2xvYmFsU2NvcGU/c2VsZjp7fSxpPXtfZ2xvYmFsOmUsdmVyc2lvbjoiOC4zLjAiLGlzQnJvd3NlcjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmKCJbb2JqZWN0IFdpbmRvd10iPT09e30udG9TdHJpbmcuY2FsbCh3aW5kb3cpfHwiW29iamVjdCBnbG9iYWxdIj09PXt9LnRvU3RyaW5nLmNhbGwod2luZG93KSksaXNVbm1pbmlmaWVkOi9wYXJhbS8udGVzdChmdW5jdGlvbih0KXt9LnRvU3RyaW5nKCkpLGRibENsaWNrV2luZG93OjQwMCxnZXRBbmdsZTplPT5pLmFuZ2xlRGVnP2UqdDplLGVuYWJsZVRyYWNlOiExLHBvaW50ZXJFdmVudHNFbmFibGVkOiEwLGF1dG9EcmF3RW5hYmxlZDohMCxoaXRPbkRyYWdFbmFibGVkOiExLGNhcHR1cmVQb2ludGVyRXZlbnRzRW5hYmxlZDohMSxfbW91c2VMaXN0ZW5DbGljazohMSxfdG91Y2hMaXN0ZW5DbGljazohMSxfcG9pbnRlckxpc3RlbkNsaWNrOiExLF9tb3VzZUluRGJsQ2xpY2tXaW5kb3c6ITEsX3RvdWNoSW5EYmxDbGlja1dpbmRvdzohMSxfcG9pbnRlckluRGJsQ2xpY2tXaW5kb3c6ITEsX21vdXNlRGJsQ2xpY2tQb2ludGVySWQ6bnVsbCxfdG91Y2hEYmxDbGlja1BvaW50ZXJJZDpudWxsLF9wb2ludGVyRGJsQ2xpY2tQb2ludGVySWQ6bnVsbCxwaXhlbFJhdGlvOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb3x8MSxkcmFnRGlzdGFuY2U6MyxhbmdsZURlZzohMCxzaG93V2FybmluZ3M6ITAsZHJhZ0J1dHRvbnM6WzAsMV0saXNEcmFnZ2luZzooKT0+aS5ERC5pc0RyYWdnaW5nLGlzRHJhZ1JlYWR5OigpPT4hIWkuREQubm9kZSxkb2N1bWVudDplLmRvY3VtZW50LF9pbmplY3RHbG9iYWwodCl7ZS5Lb252YT10fX0scj10PT57aVt0LnByb3RvdHlwZS5nZXRDbGFzc05hbWUoKV09dH07aS5faW5qZWN0R2xvYmFsKGkpO2NsYXNzIGF7Y29uc3RydWN0b3IodD1bMSwwLDAsMSwwLDBdKXt0aGlzLmRpcnR5PSExLHRoaXMubT10JiZ0LnNsaWNlKCl8fFsxLDAsMCwxLDAsMF19cmVzZXQoKXt0aGlzLm1bMF09MSx0aGlzLm1bMV09MCx0aGlzLm1bMl09MCx0aGlzLm1bM109MSx0aGlzLm1bNF09MCx0aGlzLm1bNV09MH1jb3B5KCl7cmV0dXJuIG5ldyBhKHRoaXMubSl9Y29weUludG8odCl7dC5tWzBdPXRoaXMubVswXSx0Lm1bMV09dGhpcy5tWzFdLHQubVsyXT10aGlzLm1bMl0sdC5tWzNdPXRoaXMubVszXSx0Lm1bNF09dGhpcy5tWzRdLHQubVs1XT10aGlzLm1bNV19cG9pbnQodCl7dmFyIGU9dGhpcy5tO3JldHVybnt4OmVbMF0qdC54K2VbMl0qdC55K2VbNF0seTplWzFdKnQueCtlWzNdKnQueStlWzVdfX10cmFuc2xhdGUodCxlKXtyZXR1cm4gdGhpcy5tWzRdKz10aGlzLm1bMF0qdCt0aGlzLm1bMl0qZSx0aGlzLm1bNV0rPXRoaXMubVsxXSp0K3RoaXMubVszXSplLHRoaXN9c2NhbGUodCxlKXtyZXR1cm4gdGhpcy5tWzBdKj10LHRoaXMubVsxXSo9dCx0aGlzLm1bMl0qPWUsdGhpcy5tWzNdKj1lLHRoaXN9cm90YXRlKHQpe3ZhciBlPU1hdGguY29zKHQpLGk9TWF0aC5zaW4odCkscj10aGlzLm1bMF0qZSt0aGlzLm1bMl0qaSxhPXRoaXMubVsxXSplK3RoaXMubVszXSppLG49dGhpcy5tWzBdKi1pK3RoaXMubVsyXSplLHM9dGhpcy5tWzFdKi1pK3RoaXMubVszXSplO3JldHVybiB0aGlzLm1bMF09cix0aGlzLm1bMV09YSx0aGlzLm1bMl09bix0aGlzLm1bM109cyx0aGlzfWdldFRyYW5zbGF0aW9uKCl7cmV0dXJue3g6dGhpcy5tWzRdLHk6dGhpcy5tWzVdfX1za2V3KHQsZSl7dmFyIGk9dGhpcy5tWzBdK3RoaXMubVsyXSplLHI9dGhpcy5tWzFdK3RoaXMubVszXSplLGE9dGhpcy5tWzJdK3RoaXMubVswXSp0LG49dGhpcy5tWzNdK3RoaXMubVsxXSp0O3JldHVybiB0aGlzLm1bMF09aSx0aGlzLm1bMV09cix0aGlzLm1bMl09YSx0aGlzLm1bM109bix0aGlzfW11bHRpcGx5KHQpe3ZhciBlPXRoaXMubVswXSp0Lm1bMF0rdGhpcy5tWzJdKnQubVsxXSxpPXRoaXMubVsxXSp0Lm1bMF0rdGhpcy5tWzNdKnQubVsxXSxyPXRoaXMubVswXSp0Lm1bMl0rdGhpcy5tWzJdKnQubVszXSxhPXRoaXMubVsxXSp0Lm1bMl0rdGhpcy5tWzNdKnQubVszXSxuPXRoaXMubVswXSp0Lm1bNF0rdGhpcy5tWzJdKnQubVs1XSt0aGlzLm1bNF0scz10aGlzLm1bMV0qdC5tWzRdK3RoaXMubVszXSp0Lm1bNV0rdGhpcy5tWzVdO3JldHVybiB0aGlzLm1bMF09ZSx0aGlzLm1bMV09aSx0aGlzLm1bMl09cix0aGlzLm1bM109YSx0aGlzLm1bNF09bix0aGlzLm1bNV09cyx0aGlzfWludmVydCgpe3ZhciB0PTEvKHRoaXMubVswXSp0aGlzLm1bM10tdGhpcy5tWzFdKnRoaXMubVsyXSksZT10aGlzLm1bM10qdCxpPS10aGlzLm1bMV0qdCxyPS10aGlzLm1bMl0qdCxhPXRoaXMubVswXSp0LG49dCoodGhpcy5tWzJdKnRoaXMubVs1XS10aGlzLm1bM10qdGhpcy5tWzRdKSxzPXQqKHRoaXMubVsxXSp0aGlzLm1bNF0tdGhpcy5tWzBdKnRoaXMubVs1XSk7cmV0dXJuIHRoaXMubVswXT1lLHRoaXMubVsxXT1pLHRoaXMubVsyXT1yLHRoaXMubVszXT1hLHRoaXMubVs0XT1uLHRoaXMubVs1XT1zLHRoaXN9Z2V0TWF0cml4KCl7cmV0dXJuIHRoaXMubX1zZXRBYnNvbHV0ZVBvc2l0aW9uKHQsZSl7dmFyIGk9dGhpcy5tWzBdLHI9dGhpcy5tWzFdLGE9dGhpcy5tWzJdLG49dGhpcy5tWzNdLHM9dGhpcy5tWzRdLG89KGkqKGUtdGhpcy5tWzVdKS1yKih0LXMpKS8oaSpuLXIqYSksaD0odC1zLWEqbykvaTtyZXR1cm4gdGhpcy50cmFuc2xhdGUoaCxvKX1kZWNvbXBvc2UoKXt2YXIgdD10aGlzLm1bMF0sZT10aGlzLm1bMV0saT10aGlzLm1bMl0scj10aGlzLm1bM10sYT10KnItZSppO2xldCBuPXt4OnRoaXMubVs0XSx5OnRoaXMubVs1XSxyb3RhdGlvbjowLHNjYWxlWDowLHNjYWxlWTowLHNrZXdYOjAsc2tld1k6MH07aWYoMCE9dHx8MCE9ZSl7dmFyIHM9TWF0aC5zcXJ0KHQqdCtlKmUpO24ucm90YXRpb249ZT4wP01hdGguYWNvcyh0L3MpOi1NYXRoLmFjb3ModC9zKSxuLnNjYWxlWD1zLG4uc2NhbGVZPWEvcyxuLnNrZXdYPSh0KmkrZSpyKS9hLG4uc2tld1k9MH1lbHNlIGlmKDAhPWl8fDAhPXIpe3ZhciBvPU1hdGguc3FydChpKmkrcipyKTtuLnJvdGF0aW9uPU1hdGguUEkvMi0ocj4wP01hdGguYWNvcygtaS9vKTotTWF0aC5hY29zKGkvbykpLG4uc2NhbGVYPWEvbyxuLnNjYWxlWT1vLG4uc2tld1g9MCxuLnNrZXdZPSh0KmkrZSpyKS9hfXJldHVybiBuLnJvdGF0aW9uPWcuX2dldFJvdGF0aW9uKG4ucm90YXRpb24pLG59fXZhciBuPU1hdGguUEkvMTgwLHM9MTgwL01hdGguUEksbz0iS29udmEgZXJyb3I6ICIsaD17YWxpY2VibHVlOlsyNDAsMjQ4LDI1NV0sYW50aXF1ZXdoaXRlOlsyNTAsMjM1LDIxNV0sYXF1YTpbMCwyNTUsMjU1XSxhcXVhbWFyaW5lOlsxMjcsMjU1LDIxMl0sYXp1cmU6WzI0MCwyNTUsMjU1XSxiZWlnZTpbMjQ1LDI0NSwyMjBdLGJpc3F1ZTpbMjU1LDIyOCwxOTZdLGJsYWNrOlswLDAsMF0sYmxhbmNoZWRhbG1vbmQ6WzI1NSwyMzUsMjA1XSxibHVlOlswLDAsMjU1XSxibHVldmlvbGV0OlsxMzgsNDMsMjI2XSxicm93bjpbMTY1LDQyLDQyXSxidXJseXdvb2Q6WzIyMiwxODQsMTM1XSxjYWRldGJsdWU6Wzk1LDE1OCwxNjBdLGNoYXJ0cmV1c2U6WzEyNywyNTUsMF0sY2hvY29sYXRlOlsyMTAsMTA1LDMwXSxjb3JhbDpbMjU1LDEyNyw4MF0sY29ybmZsb3dlcmJsdWU6WzEwMCwxNDksMjM3XSxjb3Juc2lsazpbMjU1LDI0OCwyMjBdLGNyaW1zb246WzIyMCwyMCw2MF0sY3lhbjpbMCwyNTUsMjU1XSxkYXJrYmx1ZTpbMCwwLDEzOV0sZGFya2N5YW46WzAsMTM5LDEzOV0sZGFya2dvbGRlbnJvZDpbMTg0LDEzMiwxMV0sZGFya2dyYXk6WzE2OSwxNjksMTY5XSxkYXJrZ3JlZW46WzAsMTAwLDBdLGRhcmtncmV5OlsxNjksMTY5LDE2OV0sZGFya2toYWtpOlsxODksMTgzLDEwN10sZGFya21hZ2VudGE6WzEzOSwwLDEzOV0sZGFya29saXZlZ3JlZW46Wzg1LDEwNyw0N10sZGFya29yYW5nZTpbMjU1LDE0MCwwXSxkYXJrb3JjaGlkOlsxNTMsNTAsMjA0XSxkYXJrcmVkOlsxMzksMCwwXSxkYXJrc2FsbW9uOlsyMzMsMTUwLDEyMl0sZGFya3NlYWdyZWVuOlsxNDMsMTg4LDE0M10sZGFya3NsYXRlYmx1ZTpbNzIsNjEsMTM5XSxkYXJrc2xhdGVncmF5Ols0Nyw3OSw3OV0sZGFya3NsYXRlZ3JleTpbNDcsNzksNzldLGRhcmt0dXJxdW9pc2U6WzAsMjA2LDIwOV0sZGFya3Zpb2xldDpbMTQ4LDAsMjExXSxkZWVwcGluazpbMjU1LDIwLDE0N10sZGVlcHNreWJsdWU6WzAsMTkxLDI1NV0sZGltZ3JheTpbMTA1LDEwNSwxMDVdLGRpbWdyZXk6WzEwNSwxMDUsMTA1XSxkb2RnZXJibHVlOlszMCwxNDQsMjU1XSxmaXJlYnJpY2s6WzE3OCwzNCwzNF0sZmxvcmFsd2hpdGU6WzI1NSwyNTUsMjQwXSxmb3Jlc3RncmVlbjpbMzQsMTM5LDM0XSxmdWNoc2lhOlsyNTUsMCwyNTVdLGdhaW5zYm9ybzpbMjIwLDIyMCwyMjBdLGdob3N0d2hpdGU6WzI0OCwyNDgsMjU1XSxnb2xkOlsyNTUsMjE1LDBdLGdvbGRlbnJvZDpbMjE4LDE2NSwzMl0sZ3JheTpbMTI4LDEyOCwxMjhdLGdyZWVuOlswLDEyOCwwXSxncmVlbnllbGxvdzpbMTczLDI1NSw0N10sZ3JleTpbMTI4LDEyOCwxMjhdLGhvbmV5ZGV3OlsyNDAsMjU1LDI0MF0saG90cGluazpbMjU1LDEwNSwxODBdLGluZGlhbnJlZDpbMjA1LDkyLDkyXSxpbmRpZ286Wzc1LDAsMTMwXSxpdm9yeTpbMjU1LDI1NSwyNDBdLGtoYWtpOlsyNDAsMjMwLDE0MF0sbGF2ZW5kZXI6WzIzMCwyMzAsMjUwXSxsYXZlbmRlcmJsdXNoOlsyNTUsMjQwLDI0NV0sbGF3bmdyZWVuOlsxMjQsMjUyLDBdLGxlbW9uY2hpZmZvbjpbMjU1LDI1MCwyMDVdLGxpZ2h0Ymx1ZTpbMTczLDIxNiwyMzBdLGxpZ2h0Y29yYWw6WzI0MCwxMjgsMTI4XSxsaWdodGN5YW46WzIyNCwyNTUsMjU1XSxsaWdodGdvbGRlbnJvZHllbGxvdzpbMjUwLDI1MCwyMTBdLGxpZ2h0Z3JheTpbMjExLDIxMSwyMTFdLGxpZ2h0Z3JlZW46WzE0NCwyMzgsMTQ0XSxsaWdodGdyZXk6WzIxMSwyMTEsMjExXSxsaWdodHBpbms6WzI1NSwxODIsMTkzXSxsaWdodHNhbG1vbjpbMjU1LDE2MCwxMjJdLGxpZ2h0c2VhZ3JlZW46WzMyLDE3OCwxNzBdLGxpZ2h0c2t5Ymx1ZTpbMTM1LDIwNiwyNTBdLGxpZ2h0c2xhdGVncmF5OlsxMTksMTM2LDE1M10sbGlnaHRzbGF0ZWdyZXk6WzExOSwxMzYsMTUzXSxsaWdodHN0ZWVsYmx1ZTpbMTc2LDE5NiwyMjJdLGxpZ2h0eWVsbG93OlsyNTUsMjU1LDIyNF0sbGltZTpbMCwyNTUsMF0sbGltZWdyZWVuOls1MCwyMDUsNTBdLGxpbmVuOlsyNTAsMjQwLDIzMF0sbWFnZW50YTpbMjU1LDAsMjU1XSxtYXJvb246WzEyOCwwLDBdLG1lZGl1bWFxdWFtYXJpbmU6WzEwMiwyMDUsMTcwXSxtZWRpdW1ibHVlOlswLDAsMjA1XSxtZWRpdW1vcmNoaWQ6WzE4Niw4NSwyMTFdLG1lZGl1bXB1cnBsZTpbMTQ3LDExMiwyMTldLG1lZGl1bXNlYWdyZWVuOls2MCwxNzksMTEzXSxtZWRpdW1zbGF0ZWJsdWU6WzEyMywxMDQsMjM4XSxtZWRpdW1zcHJpbmdncmVlbjpbMCwyNTAsMTU0XSxtZWRpdW10dXJxdW9pc2U6WzcyLDIwOSwyMDRdLG1lZGl1bXZpb2xldHJlZDpbMTk5LDIxLDEzM10sbWlkbmlnaHRibHVlOlsyNSwyNSwxMTJdLG1pbnRjcmVhbTpbMjQ1LDI1NSwyNTBdLG1pc3R5cm9zZTpbMjU1LDIyOCwyMjVdLG1vY2Nhc2luOlsyNTUsMjI4LDE4MV0sbmF2YWpvd2hpdGU6WzI1NSwyMjIsMTczXSxuYXZ5OlswLDAsMTI4XSxvbGRsYWNlOlsyNTMsMjQ1LDIzMF0sb2xpdmU6WzEyOCwxMjgsMF0sb2xpdmVkcmFiOlsxMDcsMTQyLDM1XSxvcmFuZ2U6WzI1NSwxNjUsMF0sb3JhbmdlcmVkOlsyNTUsNjksMF0sb3JjaGlkOlsyMTgsMTEyLDIxNF0scGFsZWdvbGRlbnJvZDpbMjM4LDIzMiwxNzBdLHBhbGVncmVlbjpbMTUyLDI1MSwxNTJdLHBhbGV0dXJxdW9pc2U6WzE3NSwyMzgsMjM4XSxwYWxldmlvbGV0cmVkOlsyMTksMTEyLDE0N10scGFwYXlhd2hpcDpbMjU1LDIzOSwyMTNdLHBlYWNocHVmZjpbMjU1LDIxOCwxODVdLHBlcnU6WzIwNSwxMzMsNjNdLHBpbms6WzI1NSwxOTIsMjAzXSxwbHVtOlsyMjEsMTYwLDIwM10scG93ZGVyYmx1ZTpbMTc2LDIyNCwyMzBdLHB1cnBsZTpbMTI4LDAsMTI4XSxyZWJlY2NhcHVycGxlOlsxMDIsNTEsMTUzXSxyZWQ6WzI1NSwwLDBdLHJvc3licm93bjpbMTg4LDE0MywxNDNdLHJveWFsYmx1ZTpbNjUsMTA1LDIyNV0sc2FkZGxlYnJvd246WzEzOSw2OSwxOV0sc2FsbW9uOlsyNTAsMTI4LDExNF0sc2FuZHlicm93bjpbMjQ0LDE2NCw5Nl0sc2VhZ3JlZW46WzQ2LDEzOSw4N10sc2Vhc2hlbGw6WzI1NSwyNDUsMjM4XSxzaWVubmE6WzE2MCw4Miw0NV0sc2lsdmVyOlsxOTIsMTkyLDE5Ml0sc2t5Ymx1ZTpbMTM1LDIwNiwyMzVdLHNsYXRlYmx1ZTpbMTA2LDkwLDIwNV0sc2xhdGVncmF5OlsxMTksMTI4LDE0NF0sc2xhdGVncmV5OlsxMTksMTI4LDE0NF0sc25vdzpbMjU1LDI1NSwyNTBdLHNwcmluZ2dyZWVuOlswLDI1NSwxMjddLHN0ZWVsYmx1ZTpbNzAsMTMwLDE4MF0sdGFuOlsyMTAsMTgwLDE0MF0sdGVhbDpbMCwxMjgsMTI4XSx0aGlzdGxlOlsyMTYsMTkxLDIxNl0sdHJhbnNwYXJlbnQ6WzI1NSwyNTUsMjU1LDBdLHRvbWF0bzpbMjU1LDk5LDcxXSx0dXJxdW9pc2U6WzY0LDIyNCwyMDhdLHZpb2xldDpbMjM4LDEzMCwyMzhdLHdoZWF0OlsyNDUsMjIyLDE3OV0sd2hpdGU6WzI1NSwyNTUsMjU1XSx3aGl0ZXNtb2tlOlsyNDUsMjQ1LDI0NV0seWVsbG93OlsyNTUsMjU1LDBdLHllbGxvd2dyZWVuOlsxNTQsMjA1LDVdfSxsPS9yZ2JcKChcZHsxLDN9KSwoXGR7MSwzfSksKFxkezEsM30pXCkvLGQ9W107Y29uc3QgYz0idW5kZWZpbmVkIiE9dHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSYmcmVxdWVzdEFuaW1hdGlvbkZyYW1lfHxmdW5jdGlvbih0KXtzZXRUaW1lb3V0KHQsNjApfSxnPXtfaXNFbGVtZW50OnQ9PiEoIXR8fDEhPXQubm9kZVR5cGUpLF9pc0Z1bmN0aW9uOnQ9PiEhKHQmJnQuY29uc3RydWN0b3ImJnQuY2FsbCYmdC5hcHBseSksX2lzUGxhaW5PYmplY3Q6dD0+ISF0JiZ0LmNvbnN0cnVjdG9yPT09T2JqZWN0LF9pc0FycmF5OnQ9PiJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCksX2lzTnVtYmVyOnQ9PiJbb2JqZWN0IE51bWJlcl0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpJiYhaXNOYU4odCkmJmlzRmluaXRlKHQpLF9pc1N0cmluZzp0PT4iW29iamVjdCBTdHJpbmddIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSxfaXNCb29sZWFuOnQ9PiJbb2JqZWN0IEJvb2xlYW5dIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSxpc09iamVjdDp0PT50IGluc3RhbmNlb2YgT2JqZWN0LGlzVmFsaWRTZWxlY3Rvcih0KXtpZigic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuITE7dmFyIGU9dFswXTtyZXR1cm4iIyI9PT1lfHwiLiI9PT1lfHxlPT09ZS50b1VwcGVyQ2FzZSgpfSxfc2lnbjp0PT4wPT09dHx8dD4wPzE6LTEscmVxdWVzdEFuaW1GcmFtZSh0KXtkLnB1c2godCksMT09PWQubGVuZ3RoJiZjKChmdW5jdGlvbigpe2NvbnN0IHQ9ZDtkPVtdLHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7dCgpfSkpfSkpfSxjcmVhdGVDYW52YXNFbGVtZW50KCl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7dHJ5e3Quc3R5bGU9dC5zdHlsZXx8e319Y2F0Y2godCl7fXJldHVybiB0fSxjcmVhdGVJbWFnZUVsZW1lbnQ6KCk9PmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLF9pc0luRG9jdW1lbnQodCl7Zm9yKDt0PXQucGFyZW50Tm9kZTspaWYodD09ZG9jdW1lbnQpcmV0dXJuITA7cmV0dXJuITF9LF91cmxUb0ltYWdlKHQsZSl7dmFyIGk9Zy5jcmVhdGVJbWFnZUVsZW1lbnQoKTtpLm9ubG9hZD1mdW5jdGlvbigpe2UoaSl9LGkuc3JjPXR9LF9yZ2JUb0hleDoodCxlLGkpPT4oKDE8PDI0KSsodDw8MTYpKyhlPDw4KStpKS50b1N0cmluZygxNikuc2xpY2UoMSksX2hleFRvUmdiKHQpe3Q9dC5yZXBsYWNlKCIjIiwiIik7dmFyIGU9cGFyc2VJbnQodCwxNik7cmV0dXJue3I6ZT4+MTYmMjU1LGc6ZT4+OCYyNTUsYjoyNTUmZX19LGdldFJhbmRvbUNvbG9yKCl7Zm9yKHZhciB0PSgxNjc3NzIxNSpNYXRoLnJhbmRvbSgpPDwwKS50b1N0cmluZygxNik7dC5sZW5ndGg8NjspdD0iMCIrdDtyZXR1cm4iIyIrdH0sZ2V0UkdCKHQpe3ZhciBlO3JldHVybiB0IGluIGg/e3I6KGU9aFt0XSlbMF0sZzplWzFdLGI6ZVsyXX06IiMiPT09dFswXT90aGlzLl9oZXhUb1JnYih0LnN1YnN0cmluZygxKSk6InJnYigiPT09dC5zdWJzdHIoMCw0KT8oZT1sLmV4ZWModC5yZXBsYWNlKC8gL2csIiIpKSx7cjpwYXJzZUludChlWzFdLDEwKSxnOnBhcnNlSW50KGVbMl0sMTApLGI6cGFyc2VJbnQoZVszXSwxMCl9KTp7cjowLGc6MCxiOjB9fSxjb2xvclRvUkdCQTp0PT4odD10fHwiYmxhY2siLGcuX25hbWVkQ29sb3JUb1JCQSh0KXx8Zy5faGV4M0NvbG9yVG9SR0JBKHQpfHxnLl9oZXg2Q29sb3JUb1JHQkEodCl8fGcuX3JnYkNvbG9yVG9SR0JBKHQpfHxnLl9yZ2JhQ29sb3JUb1JHQkEodCl8fGcuX2hzbENvbG9yVG9SR0JBKHQpKSxfbmFtZWRDb2xvclRvUkJBKHQpe3ZhciBlPWhbdC50b0xvd2VyQ2FzZSgpXTtyZXR1cm4gZT97cjplWzBdLGc6ZVsxXSxiOmVbMl0sYToxfTpudWxsfSxfcmdiQ29sb3JUb1JHQkEodCl7aWYoMD09PXQuaW5kZXhPZigicmdiKCIpKXt2YXIgZT0odD10Lm1hdGNoKC9yZ2JcKChbXildKylcKS8pWzFdKS5zcGxpdCgvICosICovKS5tYXAoTnVtYmVyKTtyZXR1cm57cjplWzBdLGc6ZVsxXSxiOmVbMl0sYToxfX19LF9yZ2JhQ29sb3JUb1JHQkEodCl7aWYoMD09PXQuaW5kZXhPZigicmdiYSgiKSl7dmFyIGU9KHQ9dC5tYXRjaCgvcmdiYVwoKFteKV0rKVwpLylbMV0pLnNwbGl0KC8gKiwgKi8pLm1hcChOdW1iZXIpO3JldHVybntyOmVbMF0sZzplWzFdLGI6ZVsyXSxhOmVbM119fX0sX2hleDZDb2xvclRvUkdCQSh0KXtpZigiIyI9PT10WzBdJiY3PT09dC5sZW5ndGgpcmV0dXJue3I6cGFyc2VJbnQodC5zbGljZSgxLDMpLDE2KSxnOnBhcnNlSW50KHQuc2xpY2UoMyw1KSwxNiksYjpwYXJzZUludCh0LnNsaWNlKDUsNyksMTYpLGE6MX19LF9oZXgzQ29sb3JUb1JHQkEodCl7aWYoIiMiPT09dFswXSYmND09PXQubGVuZ3RoKXJldHVybntyOnBhcnNlSW50KHRbMV0rdFsxXSwxNiksZzpwYXJzZUludCh0WzJdK3RbMl0sMTYpLGI6cGFyc2VJbnQodFszXSt0WzNdLDE2KSxhOjF9fSxfaHNsQ29sb3JUb1JHQkEodCl7aWYoL2hzbFwoKFxkKyksXHMqKFtcZC5dKyklLFxzKihbXGQuXSspJVwpL2cudGVzdCh0KSl7Y29uc3RbZSwuLi5pXT0vaHNsXCgoXGQrKSxccyooW1xkLl0rKSUsXHMqKFtcZC5dKyklXCkvZy5leGVjKHQpLHI9TnVtYmVyKGlbMF0pLzM2MCxhPU51bWJlcihpWzFdKS8xMDAsbj1OdW1iZXIoaVsyXSkvMTAwO2xldCBzLG8saDtpZigwPT09YSlyZXR1cm4gaD0yNTUqbix7cjpNYXRoLnJvdW5kKGgpLGc6TWF0aC5yb3VuZChoKSxiOk1hdGgucm91bmQoaCksYToxfTtzPW48LjU/biooMSthKTpuK2EtbiphO2NvbnN0IGw9MipuLXMsZD1bMCwwLDBdO2ZvcihsZXQgdD0wO3Q8Mzt0Kyspbz1yKzEvMyotKHQtMSksbzwwJiZvKyssbz4xJiZvLS0saD02Km88MT9sKzYqKHMtbCkqbzoyKm88MT9zOjMqbzwyP2wrKHMtbCkqKDIvMy1vKSo2OmwsZFt0XT0yNTUqaDtyZXR1cm57cjpNYXRoLnJvdW5kKGRbMF0pLGc6TWF0aC5yb3VuZChkWzFdKSxiOk1hdGgucm91bmQoZFsyXSksYToxfX19LGhhdmVJbnRlcnNlY3Rpb246KHQsZSk9PiEoZS54PnQueCt0LndpZHRofHxlLngrZS53aWR0aDx0Lnh8fGUueT50LnkrdC5oZWlnaHR8fGUueStlLmhlaWdodDx0LnkpLGNsb25lT2JqZWN0KHQpe3ZhciBlPXt9O2Zvcih2YXIgaSBpbiB0KXRoaXMuX2lzUGxhaW5PYmplY3QodFtpXSk/ZVtpXT10aGlzLmNsb25lT2JqZWN0KHRbaV0pOnRoaXMuX2lzQXJyYXkodFtpXSk/ZVtpXT10aGlzLmNsb25lQXJyYXkodFtpXSk6ZVtpXT10W2ldO3JldHVybiBlfSxjbG9uZUFycmF5OnQ9PnQuc2xpY2UoMCksZGVnVG9SYWQ6dD0+dCpuLHJhZFRvRGVnOnQ9PnQqcyxfZGVnVG9SYWQ6dD0+KGcud2FybigiVXRpbC5fZGVnVG9SYWQgaXMgcmVtb3ZlZC4gUGxlYXNlIHVzZSBwdWJsaWMgVXRpbC5kZWdUb1JhZCBpbnN0ZWFkLiIpLGcuZGVnVG9SYWQodCkpLF9yYWRUb0RlZzp0PT4oZy53YXJuKCJVdGlsLl9yYWRUb0RlZyBpcyByZW1vdmVkLiBQbGVhc2UgdXNlIHB1YmxpYyBVdGlsLnJhZFRvRGVnIGluc3RlYWQuIiksZy5yYWRUb0RlZyh0KSksX2dldFJvdGF0aW9uOnQ9PmkuYW5nbGVEZWc/Zy5yYWRUb0RlZyh0KTp0LF9jYXBpdGFsaXplOnQ9PnQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKSx0aHJvdyh0KXt0aHJvdyBuZXcgRXJyb3Iobyt0KX0sZXJyb3IodCl7Y29uc29sZS5lcnJvcihvK3QpfSx3YXJuKHQpe2kuc2hvd1dhcm5pbmdzJiZjb25zb2xlLndhcm4oIktvbnZhIHdhcm5pbmc6ICIrdCl9LGVhY2godCxlKXtmb3IodmFyIGkgaW4gdCllKGksdFtpXSl9LF9pblJhbmdlOih0LGUsaSk9PmU8PXQmJnQ8aSxfZ2V0UHJvamVjdGlvblRvU2VnbWVudCh0LGUsaSxyLGEsbil7dmFyIHMsbyxoLGw9KHQtaSkqKHQtaSkrKGUtcikqKGUtcik7aWYoMD09bClzPXQsbz1lLGg9KGEtaSkqKGEtaSkrKG4tcikqKG4tcik7ZWxzZXt2YXIgZD0oKGEtdCkqKGktdCkrKG4tZSkqKHItZSkpL2w7ZDwwPyhzPXQsbz1lLGg9KHQtYSkqKHQtYSkrKGUtbikqKGUtbikpOmQ+MT8ocz1pLG89cixoPShpLWEpKihpLWEpKyhyLW4pKihyLW4pKTpoPSgocz10K2QqKGktdCkpLWEpKihzLWEpKygobz1lK2QqKHItZSkpLW4pKihvLW4pfXJldHVybltzLG8saF19LF9nZXRQcm9qZWN0aW9uVG9MaW5lKHQsZSxpKXt2YXIgcj1nLmNsb25lT2JqZWN0KHQpLGE9TnVtYmVyLk1BWF9WQUxVRTtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihuLHMpe2lmKGl8fHMhPT1lLmxlbmd0aC0xKXt2YXIgbz1lWyhzKzEpJWUubGVuZ3RoXSxoPWcuX2dldFByb2plY3Rpb25Ub1NlZ21lbnQobi54LG4ueSxvLngsby55LHQueCx0LnkpLGw9aFswXSxkPWhbMV0sYz1oWzJdO2M8YSYmKHIueD1sLHIueT1kLGE9Yyl9fSkpLHJ9LF9wcmVwYXJlQXJyYXlGb3JUd2Vlbih0LGUsaSl7dmFyIHIsYT1bXSxuPVtdO2lmKHQubGVuZ3RoPmUubGVuZ3RoKXt2YXIgcz1lO2U9dCx0PXN9Zm9yKHI9MDtyPHQubGVuZ3RoO3IrPTIpYS5wdXNoKHt4OnRbcl0seTp0W3IrMV19KTtmb3Iocj0wO3I8ZS5sZW5ndGg7cis9MiluLnB1c2goe3g6ZVtyXSx5OmVbcisxXX0pO3ZhciBvPVtdO3JldHVybiBuLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPWcuX2dldFByb2plY3Rpb25Ub0xpbmUodCxhLGkpO28ucHVzaChlLngpLG8ucHVzaChlLnkpfSkpLG99LF9wcmVwYXJlVG9TdHJpbmdpZnkodCl7dmFyIGU7Zm9yKHZhciBpIGluIHQudmlzaXRlZEJ5Q2lyY3VsYXJSZWZlcmVuY2VSZW1vdmFsPSEwLHQpaWYodC5oYXNPd25Qcm9wZXJ0eShpKSYmdFtpXSYmIm9iamVjdCI9PXR5cGVvZiB0W2ldKWlmKGU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGkpLHRbaV0udmlzaXRlZEJ5Q2lyY3VsYXJSZWZlcmVuY2VSZW1vdmFsfHxnLl9pc0VsZW1lbnQodFtpXSkpe2lmKCFlLmNvbmZpZ3VyYWJsZSlyZXR1cm4gbnVsbDtkZWxldGUgdFtpXX1lbHNlIGlmKG51bGw9PT1nLl9wcmVwYXJlVG9TdHJpbmdpZnkodFtpXSkpe2lmKCFlLmNvbmZpZ3VyYWJsZSlyZXR1cm4gbnVsbDtkZWxldGUgdFtpXX1yZXR1cm4gZGVsZXRlIHQudmlzaXRlZEJ5Q2lyY3VsYXJSZWZlcmVuY2VSZW1vdmFsLHR9LF9hc3NpZ24odCxlKXtmb3IodmFyIGkgaW4gZSl0W2ldPWVbaV07cmV0dXJuIHR9LF9nZXRGaXJzdFBvaW50ZXJJZDp0PT50LnRvdWNoZXM/dC5jaGFuZ2VkVG91Y2hlc1swXS5pZGVudGlmaWVyOnQucG9pbnRlcklkfHw5OTl9O2Z1bmN0aW9uIHUodCl7cmV0dXJuIGcuX2lzU3RyaW5nKHQpPyciJyt0KyciJzoiW29iamVjdCBOdW1iZXJdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KXx8Zy5faXNCb29sZWFuKHQpP3Q6T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIGYodCl7cmV0dXJuIHQ+MjU1PzI1NTp0PDA/MDpNYXRoLnJvdW5kKHQpfWZ1bmN0aW9uIHAoKXtpZihpLmlzVW5taW5pZmllZClyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gZy5faXNOdW1iZXIodCl8fGcud2Fybih1KHQpKycgaXMgYSBub3QgdmFsaWQgdmFsdWUgZm9yICInK2UrJyIgYXR0cmlidXRlLiBUaGUgdmFsdWUgc2hvdWxkIGJlIGEgbnVtYmVyLicpLHR9fWZ1bmN0aW9uIHYodCl7aWYoaS5pc1VubWluaWZpZWQpcmV0dXJuIGZ1bmN0aW9uKGUsaSl7bGV0IHI9Zy5faXNOdW1iZXIoZSksYT1nLl9pc0FycmF5KGUpJiZlLmxlbmd0aD09dDtyZXR1cm4gcnx8YXx8Zy53YXJuKHUoZSkrJyBpcyBhIG5vdCB2YWxpZCB2YWx1ZSBmb3IgIicraSsnIiBhdHRyaWJ1dGUuIFRoZSB2YWx1ZSBzaG91bGQgYmUgYSBudW1iZXIgb3IgQXJyYXk8bnVtYmVyPignK3QrIikiKSxlfX1mdW5jdGlvbiBtKCl7aWYoaS5pc1VubWluaWZpZWQpcmV0dXJuIGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGcuX2lzTnVtYmVyKHQpfHwiYXV0byI9PT10fHxnLndhcm4odSh0KSsnIGlzIGEgbm90IHZhbGlkIHZhbHVlIGZvciAiJytlKyciIGF0dHJpYnV0ZS4gVGhlIHZhbHVlIHNob3VsZCBiZSBhIG51bWJlciBvciAiYXV0byIuJyksdH19ZnVuY3Rpb24gXygpe2lmKGkuaXNVbm1pbmlmaWVkKXJldHVybiBmdW5jdGlvbih0LGUpe3JldHVybiBnLl9pc1N0cmluZyh0KXx8Zy53YXJuKHUodCkrJyBpcyBhIG5vdCB2YWxpZCB2YWx1ZSBmb3IgIicrZSsnIiBhdHRyaWJ1dGUuIFRoZSB2YWx1ZSBzaG91bGQgYmUgYSBzdHJpbmcuJyksdH19ZnVuY3Rpb24geSgpe2lmKGkuaXNVbm1pbmlmaWVkKXJldHVybiBmdW5jdGlvbih0LGUpe2NvbnN0IGk9Zy5faXNTdHJpbmcodCkscj0iW29iamVjdCBDYW52YXNHcmFkaWVudF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfHx0JiZ0LmFkZENvbG9yU3RvcDtyZXR1cm4gaXx8cnx8Zy53YXJuKHUodCkrJyBpcyBhIG5vdCB2YWxpZCB2YWx1ZSBmb3IgIicrZSsnIiBhdHRyaWJ1dGUuIFRoZSB2YWx1ZSBzaG91bGQgYmUgYSBzdHJpbmcgb3IgYSBuYXRpdmUgZ3JhZGllbnQuJyksdH19ZnVuY3Rpb24geCgpe2lmKGkuaXNVbm1pbmlmaWVkKXJldHVybiBmdW5jdGlvbih0LGUpe3JldHVybiEwPT09dHx8ITE9PT10fHxnLndhcm4odSh0KSsnIGlzIGEgbm90IHZhbGlkIHZhbHVlIGZvciAiJytlKyciIGF0dHJpYnV0ZS4gVGhlIHZhbHVlIHNob3VsZCBiZSBhIGJvb2xlYW4uJyksdH19dmFyIGI9ImdldCIsUz0ic2V0Ijtjb25zdCB3PXthZGRHZXR0ZXJTZXR0ZXIodCxlLGkscixhKXt3LmFkZEdldHRlcih0LGUsaSksdy5hZGRTZXR0ZXIodCxlLHIsYSksdy5hZGRPdmVybG9hZGVkR2V0dGVyU2V0dGVyKHQsZSl9LGFkZEdldHRlcih0LGUsaSl7dmFyIHI9YitnLl9jYXBpdGFsaXplKGUpO3QucHJvdG90eXBlW3JdPXQucHJvdG90eXBlW3JdfHxmdW5jdGlvbigpe3ZhciB0PXRoaXMuYXR0cnNbZV07cmV0dXJuIHZvaWQgMD09PXQ/aTp0fX0sYWRkU2V0dGVyKHQsZSxpLHIpe3ZhciBhPVMrZy5fY2FwaXRhbGl6ZShlKTt0LnByb3RvdHlwZVthXXx8dy5vdmVyV3JpdGVTZXR0ZXIodCxlLGkscil9LG92ZXJXcml0ZVNldHRlcih0LGUsaSxyKXt2YXIgYT1TK2cuX2NhcGl0YWxpemUoZSk7dC5wcm90b3R5cGVbYV09ZnVuY3Rpb24odCl7cmV0dXJuIGkmJm51bGwhPXQmJih0PWkuY2FsbCh0aGlzLHQsZSkpLHRoaXMuX3NldEF0dHIoZSx0KSxyJiZyLmNhbGwodGhpcyksdGhpc319LGFkZENvbXBvbmVudHNHZXR0ZXJTZXR0ZXIodCxlLHIsYSxuKXt2YXIgcyxvLGg9ci5sZW5ndGgsbD1nLl9jYXBpdGFsaXplLGQ9YitsKGUpLGM9UytsKGUpO3QucHJvdG90eXBlW2RdPWZ1bmN0aW9uKCl7dmFyIHQ9e307Zm9yKHM9MDtzPGg7cysrKXRbbz1yW3NdXT10aGlzLmdldEF0dHIoZStsKG8pKTtyZXR1cm4gdH07dmFyIGY9ZnVuY3Rpb24odCl7aWYoaS5pc1VubWluaWZpZWQpcmV0dXJuIGZ1bmN0aW9uKGUsaSl7cmV0dXJuIGcuaXNPYmplY3QoZSl8fGcud2Fybih1KGUpKycgaXMgYSBub3QgdmFsaWQgdmFsdWUgZm9yICInK2krJyIgYXR0cmlidXRlLiBUaGUgdmFsdWUgc2hvdWxkIGJlIGFuIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgJyt0KSxlfX0ocik7dC5wcm90b3R5cGVbY109ZnVuY3Rpb24odCl7dmFyIGkscj10aGlzLmF0dHJzW2VdO2ZvcihpIGluIGEmJih0PWEuY2FsbCh0aGlzLHQpKSxmJiZmLmNhbGwodGhpcyx0LGUpLHQpdC5oYXNPd25Qcm9wZXJ0eShpKSYmdGhpcy5fc2V0QXR0cihlK2woaSksdFtpXSk7cmV0dXJuIHRoaXMuX2ZpcmVDaGFuZ2VFdmVudChlLHIsdCksbiYmbi5jYWxsKHRoaXMpLHRoaXN9LHcuYWRkT3ZlcmxvYWRlZEdldHRlclNldHRlcih0LGUpfSxhZGRPdmVybG9hZGVkR2V0dGVyU2V0dGVyKHQsZSl7dmFyIGk9Zy5fY2FwaXRhbGl6ZShlKSxyPVMraSxhPWIraTt0LnByb3RvdHlwZVtlXT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzW3JdKGFyZ3VtZW50c1swXSksdGhpcyk6dGhpc1thXSgpfX0sYWRkRGVwcmVjYXRlZEdldHRlclNldHRlcih0LGUsaSxyKXtnLmVycm9yKCJBZGRpbmcgZGVwcmVjYXRlZCAiK2UpO3ZhciBhPWIrZy5fY2FwaXRhbGl6ZShlKSxuPWUrIiBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgc29vbi4gTG9vayBhdCBLb252YSBjaGFuZ2UgbG9nIGZvciBtb3JlIGluZm9ybWF0aW9uLiI7dC5wcm90b3R5cGVbYV09ZnVuY3Rpb24oKXtnLmVycm9yKG4pO3ZhciB0PXRoaXMuYXR0cnNbZV07cmV0dXJuIHZvaWQgMD09PXQ/aTp0fSx3LmFkZFNldHRlcih0LGUsciwoZnVuY3Rpb24oKXtnLmVycm9yKG4pfSkpLHcuYWRkT3ZlcmxvYWRlZEdldHRlclNldHRlcih0LGUpfSxiYWNrQ29tcGF0KHQsZSl7Zy5lYWNoKGUsKGZ1bmN0aW9uKGUsaSl7dmFyIHI9dC5wcm90b3R5cGVbaV0sYT1iK2cuX2NhcGl0YWxpemUoZSksbj1TK2cuX2NhcGl0YWxpemUoZSk7ZnVuY3Rpb24gcygpe3IuYXBwbHkodGhpcyxhcmd1bWVudHMpLGcuZXJyb3IoJyInK2UrJyIgbWV0aG9kIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBzb29uLiBVc2UgIiInK2krJyIgaW5zdGVhZC4nKX10LnByb3RvdHlwZVtlXT1zLHQucHJvdG90eXBlW2FdPXMsdC5wcm90b3R5cGVbbl09c30pKX0sYWZ0ZXJTZXRGaWx0ZXIoKXt0aGlzLl9maWx0ZXJVcFRvRGF0ZT0hMX19O2Z1bmN0aW9uIEModCl7dmFyIGUsaSxyPVtdLGE9dC5sZW5ndGgsbj1nO2ZvcihlPTA7ZTxhO2UrKylpPXRbZV0sbi5faXNOdW1iZXIoaSk/aT1NYXRoLnJvdW5kKDFlMyppKS8xZTM6bi5faXNTdHJpbmcoaSl8fChpKz0iIiksci5wdXNoKGkpO3JldHVybiByfXZhciBrPVsiYXJjIiwiYXJjVG8iLCJiZWdpblBhdGgiLCJiZXppZXJDdXJ2ZVRvIiwiY2xlYXJSZWN0IiwiY2xpcCIsImNsb3NlUGF0aCIsImNyZWF0ZUxpbmVhckdyYWRpZW50IiwiY3JlYXRlUGF0dGVybiIsImNyZWF0ZVJhZGlhbEdyYWRpZW50IiwiZHJhd0ltYWdlIiwiZWxsaXBzZSIsImZpbGwiLCJmaWxsVGV4dCIsImdldEltYWdlRGF0YSIsImNyZWF0ZUltYWdlRGF0YSIsImxpbmVUbyIsIm1vdmVUbyIsInB1dEltYWdlRGF0YSIsInF1YWRyYXRpY0N1cnZlVG8iLCJyZWN0IiwicmVzdG9yZSIsInJvdGF0ZSIsInNhdmUiLCJzY2FsZSIsInNldExpbmVEYXNoIiwic2V0VHJhbnNmb3JtIiwic3Ryb2tlIiwic3Ryb2tlVGV4dCIsInRyYW5zZm9ybSIsInRyYW5zbGF0ZSJdO2NsYXNzIFB7Y29uc3RydWN0b3IodCl7dGhpcy5jYW52YXM9dCx0aGlzLl9jb250ZXh0PXQuX2NhbnZhcy5nZXRDb250ZXh0KCIyZCIpLGkuZW5hYmxlVHJhY2UmJih0aGlzLnRyYWNlQXJyPVtdLHRoaXMuX2VuYWJsZVRyYWNlKCkpfWZpbGxTaGFwZSh0KXt0LmZpbGxFbmFibGVkKCkmJnRoaXMuX2ZpbGwodCl9X2ZpbGwodCl7fXN0cm9rZVNoYXBlKHQpe3QuaGFzU3Ryb2tlKCkmJnRoaXMuX3N0cm9rZSh0KX1fc3Ryb2tlKHQpe31maWxsU3Ryb2tlU2hhcGUodCl7dC5hdHRycy5maWxsQWZ0ZXJTdHJva2VFbmFibGVkPyh0aGlzLnN0cm9rZVNoYXBlKHQpLHRoaXMuZmlsbFNoYXBlKHQpKToodGhpcy5maWxsU2hhcGUodCksdGhpcy5zdHJva2VTaGFwZSh0KSl9Z2V0VHJhY2UodCxlKXt2YXIgaSxyLGEsbixzPXRoaXMudHJhY2VBcnIsbz1zLmxlbmd0aCxoPSIiO2ZvcihpPTA7aTxvO2krKykoYT0ocj1zW2ldKS5tZXRob2QpPyhuPXIuYXJncyxoKz1hLHQ/aCs9IigpIjpnLl9pc0FycmF5KG5bMF0pP2grPSIoWyIrbi5qb2luKCIsIikrIl0pIjooZSYmKG49bi5tYXAoKHQ9PiJudW1iZXIiPT10eXBlb2YgdD9NYXRoLmZsb29yKHQpOnQpKSksaCs9IigiK24uam9pbigiLCIpKyIpIikpOihoKz1yLnByb3BlcnR5LHR8fChoKz0iPSIrci52YWwpKSxoKz0iOyI7cmV0dXJuIGh9Y2xlYXJUcmFjZSgpe3RoaXMudHJhY2VBcnI9W119X3RyYWNlKHQpe3ZhciBlPXRoaXMudHJhY2VBcnI7ZS5wdXNoKHQpLGUubGVuZ3RoPj0xMDAmJmUuc2hpZnQoKX1yZXNldCgpe3ZhciB0PXRoaXMuZ2V0Q2FudmFzKCkuZ2V0UGl4ZWxSYXRpbygpO3RoaXMuc2V0VHJhbnNmb3JtKDEqdCwwLDAsMSp0LDAsMCl9Z2V0Q2FudmFzKCl7cmV0dXJuIHRoaXMuY2FudmFzfWNsZWFyKHQpe3ZhciBlPXRoaXMuZ2V0Q2FudmFzKCk7dD90aGlzLmNsZWFyUmVjdCh0Lnh8fDAsdC55fHwwLHQud2lkdGh8fDAsdC5oZWlnaHR8fDApOnRoaXMuY2xlYXJSZWN0KDAsMCxlLmdldFdpZHRoKCkvZS5waXhlbFJhdGlvLGUuZ2V0SGVpZ2h0KCkvZS5waXhlbFJhdGlvKX1fYXBwbHlMaW5lQ2FwKHQpe3ZhciBlPXQuZ2V0TGluZUNhcCgpO2UmJnRoaXMuc2V0QXR0cigibGluZUNhcCIsZSl9X2FwcGx5T3BhY2l0eSh0KXt2YXIgZT10LmdldEFic29sdXRlT3BhY2l0eSgpOzEhPT1lJiZ0aGlzLnNldEF0dHIoImdsb2JhbEFscGhhIixlKX1fYXBwbHlMaW5lSm9pbih0KXt2YXIgZT10LmF0dHJzLmxpbmVKb2luO2UmJnRoaXMuc2V0QXR0cigibGluZUpvaW4iLGUpfXNldEF0dHIodCxlKXt0aGlzLl9jb250ZXh0W3RdPWV9YXJjKHQsZSxpLHIsYSxuKXt0aGlzLl9jb250ZXh0LmFyYyh0LGUsaSxyLGEsbil9YXJjVG8odCxlLGkscixhKXt0aGlzLl9jb250ZXh0LmFyY1RvKHQsZSxpLHIsYSl9YmVnaW5QYXRoKCl7dGhpcy5fY29udGV4dC5iZWdpblBhdGgoKX1iZXppZXJDdXJ2ZVRvKHQsZSxpLHIsYSxuKXt0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8odCxlLGkscixhLG4pfWNsZWFyUmVjdCh0LGUsaSxyKXt0aGlzLl9jb250ZXh0LmNsZWFyUmVjdCh0LGUsaSxyKX1jbGlwKCl7dGhpcy5fY29udGV4dC5jbGlwKCl9Y2xvc2VQYXRoKCl7dGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKX1jcmVhdGVJbWFnZURhdGEodCxlKXt2YXIgaT1hcmd1bWVudHM7cmV0dXJuIDI9PT1pLmxlbmd0aD90aGlzLl9jb250ZXh0LmNyZWF0ZUltYWdlRGF0YSh0LGUpOjE9PT1pLmxlbmd0aD90aGlzLl9jb250ZXh0LmNyZWF0ZUltYWdlRGF0YSh0KTp2b2lkIDB9Y3JlYXRlTGluZWFyR3JhZGllbnQodCxlLGkscil7cmV0dXJuIHRoaXMuX2NvbnRleHQuY3JlYXRlTGluZWFyR3JhZGllbnQodCxlLGkscil9Y3JlYXRlUGF0dGVybih0LGUpe3JldHVybiB0aGlzLl9jb250ZXh0LmNyZWF0ZVBhdHRlcm4odCxlKX1jcmVhdGVSYWRpYWxHcmFkaWVudCh0LGUsaSxyLGEsbil7cmV0dXJuIHRoaXMuX2NvbnRleHQuY3JlYXRlUmFkaWFsR3JhZGllbnQodCxlLGkscixhLG4pfWRyYXdJbWFnZSh0LGUsaSxyLGEsbixzLG8saCl7dmFyIGw9YXJndW1lbnRzLGQ9dGhpcy5fY29udGV4dDszPT09bC5sZW5ndGg/ZC5kcmF3SW1hZ2UodCxlLGkpOjU9PT1sLmxlbmd0aD9kLmRyYXdJbWFnZSh0LGUsaSxyLGEpOjk9PT1sLmxlbmd0aCYmZC5kcmF3SW1hZ2UodCxlLGkscixhLG4scyxvLGgpfWVsbGlwc2UodCxlLGkscixhLG4scyxvKXt0aGlzLl9jb250ZXh0LmVsbGlwc2UodCxlLGkscixhLG4scyxvKX1pc1BvaW50SW5QYXRoKHQsZSl7cmV0dXJuIHRoaXMuX2NvbnRleHQuaXNQb2ludEluUGF0aCh0LGUpfWZpbGwodCl7dD90aGlzLl9jb250ZXh0LmZpbGwodCk6dGhpcy5fY29udGV4dC5maWxsKCl9ZmlsbFJlY3QodCxlLGkscil7dGhpcy5fY29udGV4dC5maWxsUmVjdCh0LGUsaSxyKX1zdHJva2VSZWN0KHQsZSxpLHIpe3RoaXMuX2NvbnRleHQuc3Ryb2tlUmVjdCh0LGUsaSxyKX1maWxsVGV4dCh0LGUsaSxyKXtyP3RoaXMuX2NvbnRleHQuZmlsbFRleHQodCxlLGkscik6dGhpcy5fY29udGV4dC5maWxsVGV4dCh0LGUsaSl9bWVhc3VyZVRleHQodCl7cmV0dXJuIHRoaXMuX2NvbnRleHQubWVhc3VyZVRleHQodCl9Z2V0SW1hZ2VEYXRhKHQsZSxpLHIpe3JldHVybiB0aGlzLl9jb250ZXh0LmdldEltYWdlRGF0YSh0LGUsaSxyKX1saW5lVG8odCxlKXt0aGlzLl9jb250ZXh0LmxpbmVUbyh0LGUpfW1vdmVUbyh0LGUpe3RoaXMuX2NvbnRleHQubW92ZVRvKHQsZSl9cmVjdCh0LGUsaSxyKXt0aGlzLl9jb250ZXh0LnJlY3QodCxlLGkscil9cHV0SW1hZ2VEYXRhKHQsZSxpKXt0aGlzLl9jb250ZXh0LnB1dEltYWdlRGF0YSh0LGUsaSl9cXVhZHJhdGljQ3VydmVUbyh0LGUsaSxyKXt0aGlzLl9jb250ZXh0LnF1YWRyYXRpY0N1cnZlVG8odCxlLGkscil9cmVzdG9yZSgpe3RoaXMuX2NvbnRleHQucmVzdG9yZSgpfXJvdGF0ZSh0KXt0aGlzLl9jb250ZXh0LnJvdGF0ZSh0KX1zYXZlKCl7dGhpcy5fY29udGV4dC5zYXZlKCl9c2NhbGUodCxlKXt0aGlzLl9jb250ZXh0LnNjYWxlKHQsZSl9c2V0TGluZURhc2godCl7dGhpcy5fY29udGV4dC5zZXRMaW5lRGFzaD90aGlzLl9jb250ZXh0LnNldExpbmVEYXNoKHQpOiJtb3pEYXNoImluIHRoaXMuX2NvbnRleHQ/dGhpcy5fY29udGV4dC5tb3pEYXNoPXQ6IndlYmtpdExpbmVEYXNoImluIHRoaXMuX2NvbnRleHQmJih0aGlzLl9jb250ZXh0LndlYmtpdExpbmVEYXNoPXQpfWdldExpbmVEYXNoKCl7cmV0dXJuIHRoaXMuX2NvbnRleHQuZ2V0TGluZURhc2goKX1zZXRUcmFuc2Zvcm0odCxlLGkscixhLG4pe3RoaXMuX2NvbnRleHQuc2V0VHJhbnNmb3JtKHQsZSxpLHIsYSxuKX1zdHJva2UodCl7dD90aGlzLl9jb250ZXh0LnN0cm9rZSh0KTp0aGlzLl9jb250ZXh0LnN0cm9rZSgpfXN0cm9rZVRleHQodCxlLGkscil7dGhpcy5fY29udGV4dC5zdHJva2VUZXh0KHQsZSxpLHIpfXRyYW5zZm9ybSh0LGUsaSxyLGEsbil7dGhpcy5fY29udGV4dC50cmFuc2Zvcm0odCxlLGkscixhLG4pfXRyYW5zbGF0ZSh0LGUpe3RoaXMuX2NvbnRleHQudHJhbnNsYXRlKHQsZSl9X2VuYWJsZVRyYWNlKCl7dmFyIHQsZSxpPXRoaXMscj1rLmxlbmd0aCxhPXRoaXMuc2V0QXR0cixuPWZ1bmN0aW9uKHQpe3ZhciByLGE9aVt0XTtpW3RdPWZ1bmN0aW9uKCl7cmV0dXJuIGU9QyhBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCkpLHI9YS5hcHBseShpLGFyZ3VtZW50cyksaS5fdHJhY2Uoe21ldGhvZDp0LGFyZ3M6ZX0pLHJ9fTtmb3IodD0wO3Q8cjt0KyspbihrW3RdKTtpLnNldEF0dHI9ZnVuY3Rpb24oKXthLmFwcGx5KGksYXJndW1lbnRzKTt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07InNoYWRvd09mZnNldFgiIT09dCYmInNoYWRvd09mZnNldFkiIT09dCYmInNoYWRvd0JsdXIiIT09dHx8KGUvPXRoaXMuY2FudmFzLmdldFBpeGVsUmF0aW8oKSksaS5fdHJhY2Uoe3Byb3BlcnR5OnQsdmFsOmV9KX19X2FwcGx5R2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uKHQpe2NvbnN0IGU9dC5hdHRycy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb247IWV8fCJzb3VyY2Utb3ZlciI9PT1lfHx0aGlzLnNldEF0dHIoImdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiIsZSl9fVsiZmlsbFN0eWxlIiwic3Ryb2tlU3R5bGUiLCJzaGFkb3dDb2xvciIsInNoYWRvd0JsdXIiLCJzaGFkb3dPZmZzZXRYIiwic2hhZG93T2Zmc2V0WSIsImxpbmVDYXAiLCJsaW5lRGFzaE9mZnNldCIsImxpbmVKb2luIiwibGluZVdpZHRoIiwibWl0ZXJMaW1pdCIsImZvbnQiLCJ0ZXh0QWxpZ24iLCJ0ZXh0QmFzZWxpbmUiLCJnbG9iYWxBbHBoYSIsImdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiIsImltYWdlU21vb3RoaW5nRW5hYmxlZCJdLmZvckVhY2goKGZ1bmN0aW9uKHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShQLnByb3RvdHlwZSx0LHtnZXQoKXtyZXR1cm4gdGhpcy5fY29udGV4dFt0XX0sc2V0KGUpe3RoaXMuX2NvbnRleHRbdF09ZX19KX0pKTtjbGFzcyBUIGV4dGVuZHMgUHtfZmlsbENvbG9yKHQpe3ZhciBlPXQuZmlsbCgpO3RoaXMuc2V0QXR0cigiZmlsbFN0eWxlIixlKSx0Ll9maWxsRnVuYyh0aGlzKX1fZmlsbFBhdHRlcm4odCl7dGhpcy5zZXRBdHRyKCJmaWxsU3R5bGUiLHQuX2dldEZpbGxQYXR0ZXJuKCkpLHQuX2ZpbGxGdW5jKHRoaXMpfV9maWxsTGluZWFyR3JhZGllbnQodCl7dmFyIGU9dC5fZ2V0TGluZWFyR3JhZGllbnQoKTtlJiYodGhpcy5zZXRBdHRyKCJmaWxsU3R5bGUiLGUpLHQuX2ZpbGxGdW5jKHRoaXMpKX1fZmlsbFJhZGlhbEdyYWRpZW50KHQpe3ZhciBlPXQuX2dldFJhZGlhbEdyYWRpZW50KCk7ZSYmKHRoaXMuc2V0QXR0cigiZmlsbFN0eWxlIixlKSx0Ll9maWxsRnVuYyh0aGlzKSl9X2ZpbGwodCl7dmFyIGU9dC5maWxsKCksaT10LmdldEZpbGxQcmlvcml0eSgpO2lmKGUmJiJjb2xvciI9PT1pKXRoaXMuX2ZpbGxDb2xvcih0KTtlbHNle3ZhciByPXQuZ2V0RmlsbFBhdHRlcm5JbWFnZSgpO2lmKHImJiJwYXR0ZXJuIj09PWkpdGhpcy5fZmlsbFBhdHRlcm4odCk7ZWxzZXt2YXIgYT10LmdldEZpbGxMaW5lYXJHcmFkaWVudENvbG9yU3RvcHMoKTtpZihhJiYibGluZWFyLWdyYWRpZW50Ij09PWkpdGhpcy5fZmlsbExpbmVhckdyYWRpZW50KHQpO2Vsc2V7dmFyIG49dC5nZXRGaWxsUmFkaWFsR3JhZGllbnRDb2xvclN0b3BzKCk7biYmInJhZGlhbC1ncmFkaWVudCI9PT1pP3RoaXMuX2ZpbGxSYWRpYWxHcmFkaWVudCh0KTplP3RoaXMuX2ZpbGxDb2xvcih0KTpyP3RoaXMuX2ZpbGxQYXR0ZXJuKHQpOmE/dGhpcy5fZmlsbExpbmVhckdyYWRpZW50KHQpOm4mJnRoaXMuX2ZpbGxSYWRpYWxHcmFkaWVudCh0KX19fX1fc3Ryb2tlTGluZWFyR3JhZGllbnQodCl7dmFyIGU9dC5nZXRTdHJva2VMaW5lYXJHcmFkaWVudFN0YXJ0UG9pbnQoKSxpPXQuZ2V0U3Ryb2tlTGluZWFyR3JhZGllbnRFbmRQb2ludCgpLHI9dC5nZXRTdHJva2VMaW5lYXJHcmFkaWVudENvbG9yU3RvcHMoKSxhPXRoaXMuY3JlYXRlTGluZWFyR3JhZGllbnQoZS54LGUueSxpLngsaS55KTtpZihyKXtmb3IodmFyIG49MDtuPHIubGVuZ3RoO24rPTIpYS5hZGRDb2xvclN0b3AocltuXSxyW24rMV0pO3RoaXMuc2V0QXR0cigic3Ryb2tlU3R5bGUiLGEpfX1fc3Ryb2tlKHQpe3ZhciBlPXQuZGFzaCgpLGk9dC5nZXRTdHJva2VTY2FsZUVuYWJsZWQoKTtpZih0Lmhhc1N0cm9rZSgpKXtpZighaSl7dGhpcy5zYXZlKCk7dmFyIHI9dGhpcy5nZXRDYW52YXMoKS5nZXRQaXhlbFJhdGlvKCk7dGhpcy5zZXRUcmFuc2Zvcm0ociwwLDAsciwwLDApfXRoaXMuX2FwcGx5TGluZUNhcCh0KSxlJiZ0LmRhc2hFbmFibGVkKCkmJih0aGlzLnNldExpbmVEYXNoKGUpLHRoaXMuc2V0QXR0cigibGluZURhc2hPZmZzZXQiLHQuZGFzaE9mZnNldCgpKSksdGhpcy5zZXRBdHRyKCJsaW5lV2lkdGgiLHQuc3Ryb2tlV2lkdGgoKSksdC5nZXRTaGFkb3dGb3JTdHJva2VFbmFibGVkKCl8fHRoaXMuc2V0QXR0cigic2hhZG93Q29sb3IiLCJyZ2JhKDAsMCwwLDApIiksdC5nZXRTdHJva2VMaW5lYXJHcmFkaWVudENvbG9yU3RvcHMoKT90aGlzLl9zdHJva2VMaW5lYXJHcmFkaWVudCh0KTp0aGlzLnNldEF0dHIoInN0cm9rZVN0eWxlIix0LnN0cm9rZSgpKSx0Ll9zdHJva2VGdW5jKHRoaXMpLGl8fHRoaXMucmVzdG9yZSgpfX1fYXBwbHlTaGFkb3codCl7dmFyIGUsaSxyLGE9bnVsbCE9PShlPXQuZ2V0U2hhZG93UkdCQSgpKSYmdm9pZCAwIT09ZT9lOiJibGFjayIsbj1udWxsIT09KGk9dC5nZXRTaGFkb3dCbHVyKCkpJiZ2b2lkIDAhPT1pP2k6NSxzPW51bGwhPT0ocj10LmdldFNoYWRvd09mZnNldCgpKSYmdm9pZCAwIT09cj9yOnt4OjAseTowfSxvPXQuZ2V0QWJzb2x1dGVTY2FsZSgpLGg9dGhpcy5jYW52YXMuZ2V0UGl4ZWxSYXRpbygpLGw9by54KmgsZD1vLnkqaDt0aGlzLnNldEF0dHIoInNoYWRvd0NvbG9yIixhKSx0aGlzLnNldEF0dHIoInNoYWRvd0JsdXIiLG4qTWF0aC5taW4oTWF0aC5hYnMobCksTWF0aC5hYnMoZCkpKSx0aGlzLnNldEF0dHIoInNoYWRvd09mZnNldFgiLHMueCpsKSx0aGlzLnNldEF0dHIoInNoYWRvd09mZnNldFkiLHMueSpkKX19Y2xhc3MgQSBleHRlbmRzIFB7X2ZpbGwodCl7dGhpcy5zYXZlKCksdGhpcy5zZXRBdHRyKCJmaWxsU3R5bGUiLHQuY29sb3JLZXkpLHQuX2ZpbGxGdW5jSGl0KHRoaXMpLHRoaXMucmVzdG9yZSgpfXN0cm9rZVNoYXBlKHQpe3QuaGFzSGl0U3Ryb2tlKCkmJnRoaXMuX3N0cm9rZSh0KX1fc3Ryb2tlKHQpe2lmKHQuaGFzSGl0U3Ryb2tlKCkpe3ZhciBlPXQuZ2V0U3Ryb2tlU2NhbGVFbmFibGVkKCk7aWYoIWUpe3RoaXMuc2F2ZSgpO3ZhciBpPXRoaXMuZ2V0Q2FudmFzKCkuZ2V0UGl4ZWxSYXRpbygpO3RoaXMuc2V0VHJhbnNmb3JtKGksMCwwLGksMCwwKX10aGlzLl9hcHBseUxpbmVDYXAodCk7dmFyIHI9dC5oaXRTdHJva2VXaWR0aCgpLGE9ImF1dG8iPT09cj90LnN0cm9rZVdpZHRoKCk6cjt0aGlzLnNldEF0dHIoImxpbmVXaWR0aCIsYSksdGhpcy5zZXRBdHRyKCJzdHJva2VTdHlsZSIsdC5jb2xvcktleSksdC5fc3Ryb2tlRnVuY0hpdCh0aGlzKSxlfHx0aGlzLnJlc3RvcmUoKX19fXZhciBNO2NsYXNzIEd7Y29uc3RydWN0b3IodCl7dGhpcy5waXhlbFJhdGlvPTEsdGhpcy53aWR0aD0wLHRoaXMuaGVpZ2h0PTAsdGhpcy5pc0NhY2hlPSExO3ZhciBlPSh0fHx7fSkucGl4ZWxSYXRpb3x8aS5waXhlbFJhdGlvfHxmdW5jdGlvbigpe2lmKE0pcmV0dXJuIE07dmFyIHQ9Zy5jcmVhdGVDYW52YXNFbGVtZW50KCkuZ2V0Q29udGV4dCgiMmQiKTtyZXR1cm4gTT0oaS5fZ2xvYmFsLmRldmljZVBpeGVsUmF0aW98fDEpLyh0LndlYmtpdEJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fHQubW96QmFja2luZ1N0b3JlUGl4ZWxSYXRpb3x8dC5tc0JhY2tpbmdTdG9yZVBpeGVsUmF0aW98fHQub0JhY2tpbmdTdG9yZVBpeGVsUmF0aW98fHQuYmFja2luZ1N0b3JlUGl4ZWxSYXRpb3x8MSl9KCk7dGhpcy5waXhlbFJhdGlvPWUsdGhpcy5fY2FudmFzPWcuY3JlYXRlQ2FudmFzRWxlbWVudCgpLHRoaXMuX2NhbnZhcy5zdHlsZS5wYWRkaW5nPSIwIix0aGlzLl9jYW52YXMuc3R5bGUubWFyZ2luPSIwIix0aGlzLl9jYW52YXMuc3R5bGUuYm9yZGVyPSIwIix0aGlzLl9jYW52YXMuc3R5bGUuYmFja2dyb3VuZD0idHJhbnNwYXJlbnQiLHRoaXMuX2NhbnZhcy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuX2NhbnZhcy5zdHlsZS50b3A9IjAiLHRoaXMuX2NhbnZhcy5zdHlsZS5sZWZ0PSIwIn1nZXRDb250ZXh0KCl7cmV0dXJuIHRoaXMuY29udGV4dH1nZXRQaXhlbFJhdGlvKCl7cmV0dXJuIHRoaXMucGl4ZWxSYXRpb31zZXRQaXhlbFJhdGlvKHQpe3ZhciBlPXRoaXMucGl4ZWxSYXRpbzt0aGlzLnBpeGVsUmF0aW89dCx0aGlzLnNldFNpemUodGhpcy5nZXRXaWR0aCgpL2UsdGhpcy5nZXRIZWlnaHQoKS9lKX1zZXRXaWR0aCh0KXt0aGlzLndpZHRoPXRoaXMuX2NhbnZhcy53aWR0aD10KnRoaXMucGl4ZWxSYXRpbyx0aGlzLl9jYW52YXMuc3R5bGUud2lkdGg9dCsicHgiO3ZhciBlPXRoaXMucGl4ZWxSYXRpbzt0aGlzLmdldENvbnRleHQoKS5fY29udGV4dC5zY2FsZShlLGUpfXNldEhlaWdodCh0KXt0aGlzLmhlaWdodD10aGlzLl9jYW52YXMuaGVpZ2h0PXQqdGhpcy5waXhlbFJhdGlvLHRoaXMuX2NhbnZhcy5zdHlsZS5oZWlnaHQ9dCsicHgiO3ZhciBlPXRoaXMucGl4ZWxSYXRpbzt0aGlzLmdldENvbnRleHQoKS5fY29udGV4dC5zY2FsZShlLGUpfWdldFdpZHRoKCl7cmV0dXJuIHRoaXMud2lkdGh9Z2V0SGVpZ2h0KCl7cmV0dXJuIHRoaXMuaGVpZ2h0fXNldFNpemUodCxlKXt0aGlzLnNldFdpZHRoKHR8fDApLHRoaXMuc2V0SGVpZ2h0KGV8fDApfXRvRGF0YVVSTCh0LGUpe3RyeXtyZXR1cm4gdGhpcy5fY2FudmFzLnRvRGF0YVVSTCh0LGUpfWNhdGNoKHQpe3RyeXtyZXR1cm4gdGhpcy5fY2FudmFzLnRvRGF0YVVSTCgpfWNhdGNoKHQpe3JldHVybiBnLmVycm9yKCJVbmFibGUgdG8gZ2V0IGRhdGEgVVJMLiAiK3QubWVzc2FnZSsiIEZvciBtb3JlIGluZm8gcmVhZCBodHRwczovL2tvbnZhanMub3JnL2RvY3MvcG9zdHMvVGFpbnRlZF9DYW52YXMuaHRtbC4iKSwiIn19fX13LmFkZEdldHRlclNldHRlcihHLCJwaXhlbFJhdGlvIix2b2lkIDAscCgpKTtjbGFzcyBFIGV4dGVuZHMgR3tjb25zdHJ1Y3Rvcih0PXt3aWR0aDowLGhlaWdodDowfSl7c3VwZXIodCksdGhpcy5jb250ZXh0PW5ldyBUKHRoaXMpLHRoaXMuc2V0U2l6ZSh0LndpZHRoLHQuaGVpZ2h0KX19Y2xhc3MgUiBleHRlbmRzIEd7Y29uc3RydWN0b3IodD17d2lkdGg6MCxoZWlnaHQ6MH0pe3N1cGVyKHQpLHRoaXMuaGl0Q2FudmFzPSEwLHRoaXMuY29udGV4dD1uZXcgQSh0aGlzKSx0aGlzLnNldFNpemUodC53aWR0aCx0LmhlaWdodCl9fWNvbnN0IEw9e2dldCBpc0RyYWdnaW5nKCl7dmFyIHQ9ITE7cmV0dXJuIEwuX2RyYWdFbGVtZW50cy5mb3JFYWNoKChlPT57ImRyYWdnaW5nIj09PWUuZHJhZ1N0YXR1cyYmKHQ9ITApfSkpLHR9LGp1c3REcmFnZ2VkOiExLGdldCBub2RlKCl7dmFyIHQ7cmV0dXJuIEwuX2RyYWdFbGVtZW50cy5mb3JFYWNoKChlPT57dD1lLm5vZGV9KSksdH0sX2RyYWdFbGVtZW50czpuZXcgTWFwLF9kcmFnKHQpe2NvbnN0IGU9W107TC5fZHJhZ0VsZW1lbnRzLmZvckVhY2goKChpLHIpPT57Y29uc3R7bm9kZTphfT1pLG49YS5nZXRTdGFnZSgpO24uc2V0UG9pbnRlcnNQb3NpdGlvbnModCksdm9pZCAwPT09aS5wb2ludGVySWQmJihpLnBvaW50ZXJJZD1nLl9nZXRGaXJzdFBvaW50ZXJJZCh0KSk7Y29uc3Qgcz1uLl9jaGFuZ2VkUG9pbnRlclBvc2l0aW9ucy5maW5kKCh0PT50LmlkPT09aS5wb2ludGVySWQpKTtpZihzKXtpZigiZHJhZ2dpbmciIT09aS5kcmFnU3RhdHVzKXt2YXIgbz1hLmRyYWdEaXN0YW5jZSgpO2lmKE1hdGgubWF4KE1hdGguYWJzKHMueC1pLnN0YXJ0UG9pbnRlclBvcy54KSxNYXRoLmFicyhzLnktaS5zdGFydFBvaW50ZXJQb3MueSkpPG8pcmV0dXJuO2lmKGEuc3RhcnREcmFnKHtldnQ6dH0pLCFhLmlzRHJhZ2dpbmcoKSlyZXR1cm59YS5fc2V0RHJhZ1Bvc2l0aW9uKHQsaSksZS5wdXNoKGEpfX0pKSxlLmZvckVhY2goKGU9PntlLmZpcmUoImRyYWdtb3ZlIix7dHlwZToiZHJhZ21vdmUiLHRhcmdldDplLGV2dDp0fSwhMCl9KSl9LF9lbmREcmFnQmVmb3JlKHQpe0wuX2RyYWdFbGVtZW50cy5mb3JFYWNoKChlPT57Y29uc3R7bm9kZTpyfT1lLGE9ci5nZXRTdGFnZSgpO3QmJmEuc2V0UG9pbnRlcnNQb3NpdGlvbnModCk7aWYoIWEuX2NoYW5nZWRQb2ludGVyUG9zaXRpb25zLmZpbmQoKHQ9PnQuaWQ9PT1lLnBvaW50ZXJJZCkpKXJldHVybjsiZHJhZ2dpbmciIT09ZS5kcmFnU3RhdHVzJiYic3RvcHBlZCIhPT1lLmRyYWdTdGF0dXN8fChMLmp1c3REcmFnZ2VkPSEwLGkuX21vdXNlTGlzdGVuQ2xpY2s9ITEsaS5fdG91Y2hMaXN0ZW5DbGljaz0hMSxpLl9wb2ludGVyTGlzdGVuQ2xpY2s9ITEsZS5kcmFnU3RhdHVzPSJzdG9wcGVkIik7Y29uc3Qgbj1lLm5vZGUuZ2V0TGF5ZXIoKXx8ZS5ub2RlIGluc3RhbmNlb2YgaS5TdGFnZSYmZS5ub2RlO24mJm4uYmF0Y2hEcmF3KCl9KSl9LF9lbmREcmFnQWZ0ZXIodCl7TC5fZHJhZ0VsZW1lbnRzLmZvckVhY2goKChlLGkpPT57InN0b3BwZWQiPT09ZS5kcmFnU3RhdHVzJiZlLm5vZGUuZmlyZSgiZHJhZ2VuZCIse3R5cGU6ImRyYWdlbmQiLHRhcmdldDplLm5vZGUsZXZ0OnR9LCEwKSwiZHJhZ2dpbmciIT09ZS5kcmFnU3RhdHVzJiZMLl9kcmFnRWxlbWVudHMuZGVsZXRlKGkpfSkpfX07aS5pc0Jyb3dzZXImJih3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsTC5fZW5kRHJhZ0JlZm9yZSwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixMLl9lbmREcmFnQmVmb3JlLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixMLl9kcmFnKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixMLl9kcmFnKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsTC5fZW5kRHJhZ0FmdGVyLCExKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEwuX2VuZERyYWdBZnRlciwhMSkpO3ZhciBEPSJhYnNvbHV0ZU9wYWNpdHkiLE89ImFsbEV2ZW50TGlzdGVuZXJzIixJPSJhYnNvbHV0ZVRyYW5zZm9ybSIsRj0iYWJzb2x1dGVTY2FsZSIsTj0iY2FudmFzIixCPSJsaXN0ZW5pbmciLHo9Im1vdXNlZW50ZXIiLFc9Im1vdXNlbGVhdmUiLEg9IlNoYXBlIixZPSIgIixYPSJzdGFnZSIsaj0idHJhbnNmb3JtIixVPSJ2aXNpYmxlIixxPVsieENoYW5nZS5rb252YSIsInlDaGFuZ2Uua29udmEiLCJzY2FsZVhDaGFuZ2Uua29udmEiLCJzY2FsZVlDaGFuZ2Uua29udmEiLCJza2V3WENoYW5nZS5rb252YSIsInNrZXdZQ2hhbmdlLmtvbnZhIiwicm90YXRpb25DaGFuZ2Uua29udmEiLCJvZmZzZXRYQ2hhbmdlLmtvbnZhIiwib2Zmc2V0WUNoYW5nZS5rb252YSIsInRyYW5zZm9ybXNFbmFibGVkQ2hhbmdlLmtvbnZhIl0uam9pbihZKTtsZXQgVj0xO2NsYXNzIEt7Y29uc3RydWN0b3IodCl7dGhpcy5faWQ9VisrLHRoaXMuZXZlbnRMaXN0ZW5lcnM9e30sdGhpcy5hdHRycz17fSx0aGlzLmluZGV4PTAsdGhpcy5fYWxsRXZlbnRMaXN0ZW5lcnM9bnVsbCx0aGlzLnBhcmVudD1udWxsLHRoaXMuX2NhY2hlPW5ldyBNYXAsdGhpcy5fYXR0YWNoZWREZXBzTGlzdGVuZXJzPW5ldyBNYXAsdGhpcy5fbGFzdFBvcz1udWxsLHRoaXMuX2JhdGNoaW5nVHJhbnNmb3JtQ2hhbmdlPSExLHRoaXMuX25lZWRDbGVhclRyYW5zZm9ybUNhY2hlPSExLHRoaXMuX2ZpbHRlclVwVG9EYXRlPSExLHRoaXMuX2lzVW5kZXJDYWNoZT0hMSx0aGlzLl9kcmFnRXZlbnRJZD1udWxsLHRoaXMuX3Nob3VsZEZpcmVDaGFuZ2VFdmVudHM9ITEsdGhpcy5zZXRBdHRycyh0KSx0aGlzLl9zaG91bGRGaXJlQ2hhbmdlRXZlbnRzPSEwfWhhc0NoaWxkcmVuKCl7cmV0dXJuITF9X2NsZWFyQ2FjaGUodCl7dCE9PWomJnQhPT1JfHwhdGhpcy5fY2FjaGUuZ2V0KHQpP3Q/dGhpcy5fY2FjaGUuZGVsZXRlKHQpOnRoaXMuX2NhY2hlLmNsZWFyKCk6dGhpcy5fY2FjaGUuZ2V0KHQpLmRpcnR5PSEwfV9nZXRDYWNoZSh0LGUpe3ZhciBpPXRoaXMuX2NhY2hlLmdldCh0KTtyZXR1cm4odm9pZCAwPT09aXx8KHQ9PT1qfHx0PT09SSkmJiEwPT09aS5kaXJ0eSkmJihpPWUuY2FsbCh0aGlzKSx0aGlzLl9jYWNoZS5zZXQodCxpKSksaX1fY2FsY3VsYXRlKHQsZSxpKXtpZighdGhpcy5fYXR0YWNoZWREZXBzTGlzdGVuZXJzLmdldCh0KSl7Y29uc3QgaT1lLm1hcCgodD0+dCsiQ2hhbmdlLmtvbnZhIikpLmpvaW4oWSk7dGhpcy5vbihpLCgoKT0+e3RoaXMuX2NsZWFyQ2FjaGUodCl9KSksdGhpcy5fYXR0YWNoZWREZXBzTGlzdGVuZXJzLnNldCh0LCEwKX1yZXR1cm4gdGhpcy5fZ2V0Q2FjaGUodCxpKX1fZ2V0Q2FudmFzQ2FjaGUoKXtyZXR1cm4gdGhpcy5fY2FjaGUuZ2V0KE4pfV9jbGVhclNlbGZBbmREZXNjZW5kYW50Q2FjaGUodCl7dGhpcy5fY2xlYXJDYWNoZSh0KSx0PT09SSYmdGhpcy5maXJlKCJhYnNvbHV0ZVRyYW5zZm9ybUNoYW5nZSIpfWNsZWFyQ2FjaGUoKXtyZXR1cm4gdGhpcy5fY2FjaGUuZGVsZXRlKE4pLHRoaXMuX2NsZWFyU2VsZkFuZERlc2NlbmRhbnRDYWNoZSgpLHRoaXMuX3JlcXVlc3REcmF3KCksdGhpc31jYWNoZSh0KXt2YXIgZT10fHx7fSxpPXt9O3ZvaWQgMCE9PWUueCYmdm9pZCAwIT09ZS55JiZ2b2lkIDAhPT1lLndpZHRoJiZ2b2lkIDAhPT1lLmhlaWdodHx8KGk9dGhpcy5nZXRDbGllbnRSZWN0KHtza2lwVHJhbnNmb3JtOiEwLHJlbGF0aXZlVG86dGhpcy5nZXRQYXJlbnQoKX0pKTt2YXIgcj1NYXRoLmNlaWwoZS53aWR0aHx8aS53aWR0aCksYT1NYXRoLmNlaWwoZS5oZWlnaHR8fGkuaGVpZ2h0KSxuPWUucGl4ZWxSYXRpbyxzPXZvaWQgMD09PWUueD9pLng6ZS54LG89dm9pZCAwPT09ZS55P2kueTplLnksaD1lLm9mZnNldHx8MCxsPWUuZHJhd0JvcmRlcnx8ITEsZD1lLmhpdENhbnZhc1BpeGVsUmF0aW98fDE7aWYociYmYSl7cy09aCxvLT1oO3ZhciBjPW5ldyBFKHtwaXhlbFJhdGlvOm4sd2lkdGg6cis9MipoLGhlaWdodDphKz0yKmh9KSx1PW5ldyBFKHtwaXhlbFJhdGlvOm4sd2lkdGg6MCxoZWlnaHQ6MH0pLGY9bmV3IFIoe3BpeGVsUmF0aW86ZCx3aWR0aDpyLGhlaWdodDphfSkscD1jLmdldENvbnRleHQoKSx2PWYuZ2V0Q29udGV4dCgpO3JldHVybiBmLmlzQ2FjaGU9ITAsYy5pc0NhY2hlPSEwLHRoaXMuX2NhY2hlLmRlbGV0ZShOKSx0aGlzLl9maWx0ZXJVcFRvRGF0ZT0hMSwhMT09PWUuaW1hZ2VTbW9vdGhpbmdFbmFibGVkJiYoYy5nZXRDb250ZXh0KCkuX2NvbnRleHQuaW1hZ2VTbW9vdGhpbmdFbmFibGVkPSExLHUuZ2V0Q29udGV4dCgpLl9jb250ZXh0LmltYWdlU21vb3RoaW5nRW5hYmxlZD0hMSkscC5zYXZlKCksdi5zYXZlKCkscC50cmFuc2xhdGUoLXMsLW8pLHYudHJhbnNsYXRlKC1zLC1vKSx0aGlzLl9pc1VuZGVyQ2FjaGU9ITAsdGhpcy5fY2xlYXJTZWxmQW5kRGVzY2VuZGFudENhY2hlKEQpLHRoaXMuX2NsZWFyU2VsZkFuZERlc2NlbmRhbnRDYWNoZShGKSx0aGlzLmRyYXdTY2VuZShjLHRoaXMpLHRoaXMuZHJhd0hpdChmLHRoaXMpLHRoaXMuX2lzVW5kZXJDYWNoZT0hMSxwLnJlc3RvcmUoKSx2LnJlc3RvcmUoKSxsJiYocC5zYXZlKCkscC5iZWdpblBhdGgoKSxwLnJlY3QoMCwwLHIsYSkscC5jbG9zZVBhdGgoKSxwLnNldEF0dHIoInN0cm9rZVN0eWxlIiwicmVkIikscC5zZXRBdHRyKCJsaW5lV2lkdGgiLDUpLHAuc3Ryb2tlKCkscC5yZXN0b3JlKCkpLHRoaXMuX2NhY2hlLnNldChOLHtzY2VuZTpjLGZpbHRlcjp1LGhpdDpmLHg6cyx5Om99KSx0aGlzLl9yZXF1ZXN0RHJhdygpLHRoaXN9Zy5lcnJvcigiQ2FuIG5vdCBjYWNoZSB0aGUgbm9kZS4gV2lkdGggb3IgaGVpZ2h0IG9mIHRoZSBub2RlIGVxdWFscyAwLiBDYWNoaW5nIGlzIHNraXBwZWQuIil9aXNDYWNoZWQoKXtyZXR1cm4gdGhpcy5fY2FjaGUuaGFzKE4pfWdldENsaWVudFJlY3QodCl7dGhyb3cgbmV3IEVycm9yKCdhYnN0cmFjdCAiZ2V0Q2xpZW50UmVjdCIgbWV0aG9kIGNhbGwnKX1fdHJhbnNmb3JtZWRSZWN0KHQsZSl7dmFyIGkscixhLG4scz1be3g6dC54LHk6dC55fSx7eDp0LngrdC53aWR0aCx5OnQueX0se3g6dC54K3Qud2lkdGgseTp0LnkrdC5oZWlnaHR9LHt4OnQueCx5OnQueSt0LmhlaWdodH1dLG89dGhpcy5nZXRBYnNvbHV0ZVRyYW5zZm9ybShlKTtyZXR1cm4gcy5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT1vLnBvaW50KHQpO3ZvaWQgMD09PWkmJihpPWE9ZS54LHI9bj1lLnkpLGk9TWF0aC5taW4oaSxlLngpLHI9TWF0aC5taW4ocixlLnkpLGE9TWF0aC5tYXgoYSxlLngpLG49TWF0aC5tYXgobixlLnkpfSkpLHt4OmkseTpyLHdpZHRoOmEtaSxoZWlnaHQ6bi1yfX1fZHJhd0NhY2hlZFNjZW5lQ2FudmFzKHQpe3Quc2F2ZSgpLHQuX2FwcGx5T3BhY2l0eSh0aGlzKSx0Ll9hcHBseUdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbih0aGlzKTtjb25zdCBlPXRoaXMuX2dldENhbnZhc0NhY2hlKCk7dC50cmFuc2xhdGUoZS54LGUueSk7dmFyIGk9dGhpcy5fZ2V0Q2FjaGVkU2NlbmVDYW52YXMoKSxyPWkucGl4ZWxSYXRpbzt0LmRyYXdJbWFnZShpLl9jYW52YXMsMCwwLGkud2lkdGgvcixpLmhlaWdodC9yKSx0LnJlc3RvcmUoKX1fZHJhd0NhY2hlZEhpdENhbnZhcyh0KXt2YXIgZT10aGlzLl9nZXRDYW52YXNDYWNoZSgpLGk9ZS5oaXQ7dC5zYXZlKCksdC50cmFuc2xhdGUoZS54LGUueSksdC5kcmF3SW1hZ2UoaS5fY2FudmFzLDAsMCxpLndpZHRoL2kucGl4ZWxSYXRpbyxpLmhlaWdodC9pLnBpeGVsUmF0aW8pLHQucmVzdG9yZSgpfV9nZXRDYWNoZWRTY2VuZUNhbnZhcygpe3ZhciB0LGUsaSxyLGE9dGhpcy5maWx0ZXJzKCksbj10aGlzLl9nZXRDYW52YXNDYWNoZSgpLHM9bi5zY2VuZSxvPW4uZmlsdGVyLGg9by5nZXRDb250ZXh0KCk7aWYoYSl7aWYoIXRoaXMuX2ZpbHRlclVwVG9EYXRlKXt2YXIgbD1zLnBpeGVsUmF0aW87by5zZXRTaXplKHMud2lkdGgvcy5waXhlbFJhdGlvLHMuaGVpZ2h0L3MucGl4ZWxSYXRpbyk7dHJ5e2Zvcih0PWEubGVuZ3RoLGguY2xlYXIoKSxoLmRyYXdJbWFnZShzLl9jYW52YXMsMCwwLHMuZ2V0V2lkdGgoKS9sLHMuZ2V0SGVpZ2h0KCkvbCksZT1oLmdldEltYWdlRGF0YSgwLDAsby5nZXRXaWR0aCgpLG8uZ2V0SGVpZ2h0KCkpLGk9MDtpPHQ7aSsrKSJmdW5jdGlvbiI9PXR5cGVvZihyPWFbaV0pPyhyLmNhbGwodGhpcyxlKSxoLnB1dEltYWdlRGF0YShlLDAsMCkpOmcuZXJyb3IoIkZpbHRlciBzaG91bGQgYmUgdHlwZSBvZiBmdW5jdGlvbiwgYnV0IGdvdCAiK3R5cGVvZiByKyIgaW5zdGVhZC4gUGxlYXNlIGNoZWNrIGNvcnJlY3QgZmlsdGVycyIpfWNhdGNoKHQpe2cuZXJyb3IoIlVuYWJsZSB0byBhcHBseSBmaWx0ZXIuICIrdC5tZXNzYWdlKyIgVGhpcyBwb3N0IG15IGhlbHAgeW91IGh0dHBzOi8va29udmFqcy5vcmcvZG9jcy9wb3N0cy9UYWludGVkX0NhbnZhcy5odG1sLiIpfXRoaXMuX2ZpbHRlclVwVG9EYXRlPSEwfXJldHVybiBvfXJldHVybiBzfW9uKHQsZSl7aWYodGhpcy5fY2FjaGUmJnRoaXMuX2NhY2hlLmRlbGV0ZShPKSwzPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5fZGVsZWdhdGUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBpLHIsYSxuLHM9dC5zcGxpdChZKSxvPXMubGVuZ3RoO2ZvcihpPTA7aTxvO2krKylhPShyPXNbaV0uc3BsaXQoIi4iKSlbMF0sbj1yWzFdfHwiIix0aGlzLmV2ZW50TGlzdGVuZXJzW2FdfHwodGhpcy5ldmVudExpc3RlbmVyc1thXT1bXSksdGhpcy5ldmVudExpc3RlbmVyc1thXS5wdXNoKHtuYW1lOm4saGFuZGxlcjplfSk7cmV0dXJuIHRoaXN9b2ZmKHQsZSl7dmFyIGkscixhLG4scyxvPSh0fHwiIikuc3BsaXQoWSksaD1vLmxlbmd0aDtpZih0aGlzLl9jYWNoZSYmdGhpcy5fY2FjaGUuZGVsZXRlKE8pLCF0KWZvcihyIGluIHRoaXMuZXZlbnRMaXN0ZW5lcnMpdGhpcy5fb2ZmKHIpO2ZvcihpPTA7aTxoO2krKylpZihuPShhPW9baV0uc3BsaXQoIi4iKSlbMF0scz1hWzFdLG4pdGhpcy5ldmVudExpc3RlbmVyc1tuXSYmdGhpcy5fb2ZmKG4scyxlKTtlbHNlIGZvcihyIGluIHRoaXMuZXZlbnRMaXN0ZW5lcnMpdGhpcy5fb2ZmKHIscyxlKTtyZXR1cm4gdGhpc31kaXNwYXRjaEV2ZW50KHQpe3ZhciBlPXt0YXJnZXQ6dGhpcyx0eXBlOnQudHlwZSxldnQ6dH07cmV0dXJuIHRoaXMuZmlyZSh0LnR5cGUsZSksdGhpc31hZGRFdmVudExpc3RlbmVyKHQsZSl7cmV0dXJuIHRoaXMub24odCwoZnVuY3Rpb24odCl7ZS5jYWxsKHRoaXMsdC5ldnQpfSkpLHRoaXN9cmVtb3ZlRXZlbnRMaXN0ZW5lcih0KXtyZXR1cm4gdGhpcy5vZmYodCksdGhpc31fZGVsZWdhdGUodCxlLGkpe3ZhciByPXRoaXM7dGhpcy5vbih0LChmdW5jdGlvbih0KXtmb3IodmFyIGE9dC50YXJnZXQuZmluZEFuY2VzdG9ycyhlLCEwLHIpLG49MDtuPGEubGVuZ3RoO24rKykodD1nLmNsb25lT2JqZWN0KHQpKS5jdXJyZW50VGFyZ2V0PWFbbl0saS5jYWxsKGFbbl0sdCl9KSl9cmVtb3ZlKCl7cmV0dXJuIHRoaXMuaXNEcmFnZ2luZygpJiZ0aGlzLnN0b3BEcmFnKCksTC5fZHJhZ0VsZW1lbnRzLmRlbGV0ZSh0aGlzLl9pZCksdGhpcy5fcmVtb3ZlKCksdGhpc31fY2xlYXJDYWNoZXMoKXt0aGlzLl9jbGVhclNlbGZBbmREZXNjZW5kYW50Q2FjaGUoSSksdGhpcy5fY2xlYXJTZWxmQW5kRGVzY2VuZGFudENhY2hlKEQpLHRoaXMuX2NsZWFyU2VsZkFuZERlc2NlbmRhbnRDYWNoZShGKSx0aGlzLl9jbGVhclNlbGZBbmREZXNjZW5kYW50Q2FjaGUoWCksdGhpcy5fY2xlYXJTZWxmQW5kRGVzY2VuZGFudENhY2hlKFUpLHRoaXMuX2NsZWFyU2VsZkFuZERlc2NlbmRhbnRDYWNoZShCKX1fcmVtb3ZlKCl7dGhpcy5fY2xlYXJDYWNoZXMoKTt2YXIgdD10aGlzLmdldFBhcmVudCgpO3QmJnQuY2hpbGRyZW4mJih0LmNoaWxkcmVuLnNwbGljZSh0aGlzLmluZGV4LDEpLHQuX3NldENoaWxkcmVuSW5kaWNlcygpLHRoaXMucGFyZW50PW51bGwpfWRlc3Ryb3koKXtyZXR1cm4gdGhpcy5yZW1vdmUoKSx0aGlzfWdldEF0dHIodCl7dmFyIGU9ImdldCIrZy5fY2FwaXRhbGl6ZSh0KTtyZXR1cm4gZy5faXNGdW5jdGlvbih0aGlzW2VdKT90aGlzW2VdKCk6dGhpcy5hdHRyc1t0XX1nZXRBbmNlc3RvcnMoKXtmb3IodmFyIHQ9dGhpcy5nZXRQYXJlbnQoKSxlPVtdO3Q7KWUucHVzaCh0KSx0PXQuZ2V0UGFyZW50KCk7cmV0dXJuIGV9Z2V0QXR0cnMoKXtyZXR1cm4gdGhpcy5hdHRyc3x8e319c2V0QXR0cnModCl7cmV0dXJuIHRoaXMuX2JhdGNoVHJhbnNmb3JtQ2hhbmdlcygoKCk9Pnt2YXIgZSxpO2lmKCF0KXJldHVybiB0aGlzO2ZvcihlIGluIHQpImNoaWxkcmVuIiE9PWUmJihpPSJzZXQiK2cuX2NhcGl0YWxpemUoZSksZy5faXNGdW5jdGlvbih0aGlzW2ldKT90aGlzW2ldKHRbZV0pOnRoaXMuX3NldEF0dHIoZSx0W2VdKSl9KSksdGhpc31pc0xpc3RlbmluZygpe3JldHVybiB0aGlzLl9nZXRDYWNoZShCLHRoaXMuX2lzTGlzdGVuaW5nKX1faXNMaXN0ZW5pbmcodCl7aWYoIXRoaXMubGlzdGVuaW5nKCkpcmV0dXJuITE7Y29uc3QgZT10aGlzLmdldFBhcmVudCgpO3JldHVybiFlfHxlPT09dHx8dGhpcz09PXR8fGUuX2lzTGlzdGVuaW5nKHQpfWlzVmlzaWJsZSgpe3JldHVybiB0aGlzLl9nZXRDYWNoZShVLHRoaXMuX2lzVmlzaWJsZSl9X2lzVmlzaWJsZSh0KXtpZighdGhpcy52aXNpYmxlKCkpcmV0dXJuITE7Y29uc3QgZT10aGlzLmdldFBhcmVudCgpO3JldHVybiFlfHxlPT09dHx8dGhpcz09PXR8fGUuX2lzVmlzaWJsZSh0KX1zaG91bGREcmF3SGl0KHQsZT0hMSl7aWYodClyZXR1cm4gdGhpcy5faXNWaXNpYmxlKHQpJiZ0aGlzLl9pc0xpc3RlbmluZyh0KTt2YXIgcj10aGlzLmdldExheWVyKCksYT0hMTtMLl9kcmFnRWxlbWVudHMuZm9yRWFjaCgodD0+eyJkcmFnZ2luZyI9PT10LmRyYWdTdGF0dXMmJigiU3RhZ2UiPT09dC5ub2RlLm5vZGVUeXBlfHx0Lm5vZGUuZ2V0TGF5ZXIoKT09PXIpJiYoYT0hMCl9KSk7dmFyIG49IWUmJiFpLmhpdE9uRHJhZ0VuYWJsZWQmJmE7cmV0dXJuIHRoaXMuaXNMaXN0ZW5pbmcoKSYmdGhpcy5pc1Zpc2libGUoKSYmIW59c2hvdygpe3JldHVybiB0aGlzLnZpc2libGUoITApLHRoaXN9aGlkZSgpe3JldHVybiB0aGlzLnZpc2libGUoITEpLHRoaXN9Z2V0WkluZGV4KCl7cmV0dXJuIHRoaXMuaW5kZXh8fDB9Z2V0QWJzb2x1dGVaSW5kZXgoKXt2YXIgdCxlLGkscixhPXRoaXMuZ2V0RGVwdGgoKSxuPXRoaXMscz0wO3JldHVybiJTdGFnZSIhPT1uLm5vZGVUeXBlJiZmdW5jdGlvbiBvKGgpe2Zvcih0PVtdLGU9aC5sZW5ndGgsaT0wO2k8ZTtpKyspcj1oW2ldLHMrKyxyLm5vZGVUeXBlIT09SCYmKHQ9dC5jb25jYXQoci5nZXRDaGlsZHJlbigpLnNsaWNlKCkpKSxyLl9pZD09PW4uX2lkJiYoaT1lKTt0Lmxlbmd0aD4wJiZ0WzBdLmdldERlcHRoKCk8PWEmJm8odCl9KG4uZ2V0U3RhZ2UoKS5nZXRDaGlsZHJlbigpKSxzfWdldERlcHRoKCl7Zm9yKHZhciB0PTAsZT10aGlzLnBhcmVudDtlOyl0KyssZT1lLnBhcmVudDtyZXR1cm4gdH1fYmF0Y2hUcmFuc2Zvcm1DaGFuZ2VzKHQpe3RoaXMuX2JhdGNoaW5nVHJhbnNmb3JtQ2hhbmdlPSEwLHQoKSx0aGlzLl9iYXRjaGluZ1RyYW5zZm9ybUNoYW5nZT0hMSx0aGlzLl9uZWVkQ2xlYXJUcmFuc2Zvcm1DYWNoZSYmKHRoaXMuX2NsZWFyQ2FjaGUoaiksdGhpcy5fY2xlYXJTZWxmQW5kRGVzY2VuZGFudENhY2hlKEkpKSx0aGlzLl9uZWVkQ2xlYXJUcmFuc2Zvcm1DYWNoZT0hMX1zZXRQb3NpdGlvbih0KXtyZXR1cm4gdGhpcy5fYmF0Y2hUcmFuc2Zvcm1DaGFuZ2VzKCgoKT0+e3RoaXMueCh0LngpLHRoaXMueSh0LnkpfSkpLHRoaXN9Z2V0UG9zaXRpb24oKXtyZXR1cm57eDp0aGlzLngoKSx5OnRoaXMueSgpfX1nZXRSZWxhdGl2ZVBvaW50ZXJQb3NpdGlvbigpe2lmKCF0aGlzLmdldFN0YWdlKCkpcmV0dXJuIG51bGw7dmFyIHQ9dGhpcy5nZXRTdGFnZSgpLmdldFBvaW50ZXJQb3NpdGlvbigpO2lmKCF0KXJldHVybiBudWxsO3ZhciBlPXRoaXMuZ2V0QWJzb2x1dGVUcmFuc2Zvcm0oKS5jb3B5KCk7cmV0dXJuIGUuaW52ZXJ0KCksZS5wb2ludCh0KX1nZXRBYnNvbHV0ZVBvc2l0aW9uKHQpe2xldCBlPSExLGk9dGhpcy5wYXJlbnQ7Zm9yKDtpOyl7aWYoaS5pc0NhY2hlZCgpKXtlPSEwO2JyZWFrfWk9aS5wYXJlbnR9ZSYmIXQmJih0PSEwKTt2YXIgcj10aGlzLmdldEFic29sdXRlVHJhbnNmb3JtKHQpLmdldE1hdHJpeCgpLG49bmV3IGEscz10aGlzLm9mZnNldCgpO3JldHVybiBuLm09ci5zbGljZSgpLG4udHJhbnNsYXRlKHMueCxzLnkpLG4uZ2V0VHJhbnNsYXRpb24oKX1zZXRBYnNvbHV0ZVBvc2l0aW9uKHQpe3ZhciBlPXRoaXMuX2NsZWFyVHJhbnNmb3JtKCk7dGhpcy5hdHRycy54PWUueCx0aGlzLmF0dHJzLnk9ZS55LGRlbGV0ZSBlLngsZGVsZXRlIGUueSx0aGlzLl9jbGVhckNhY2hlKGopO3ZhciBpPXRoaXMuX2dldEFic29sdXRlVHJhbnNmb3JtKCkuY29weSgpO3JldHVybiBpLmludmVydCgpLGkudHJhbnNsYXRlKHQueCx0LnkpLHQ9e3g6dGhpcy5hdHRycy54K2kuZ2V0VHJhbnNsYXRpb24oKS54LHk6dGhpcy5hdHRycy55K2kuZ2V0VHJhbnNsYXRpb24oKS55fSx0aGlzLl9zZXRUcmFuc2Zvcm0oZSksdGhpcy5zZXRQb3NpdGlvbih7eDp0LngseTp0Lnl9KSx0aGlzLl9jbGVhckNhY2hlKGopLHRoaXMuX2NsZWFyU2VsZkFuZERlc2NlbmRhbnRDYWNoZShJKSx0aGlzfV9zZXRUcmFuc2Zvcm0odCl7dmFyIGU7Zm9yKGUgaW4gdCl0aGlzLmF0dHJzW2VdPXRbZV19X2NsZWFyVHJhbnNmb3JtKCl7dmFyIHQ9e3g6dGhpcy54KCkseTp0aGlzLnkoKSxyb3RhdGlvbjp0aGlzLnJvdGF0aW9uKCksc2NhbGVYOnRoaXMuc2NhbGVYKCksc2NhbGVZOnRoaXMuc2NhbGVZKCksb2Zmc2V0WDp0aGlzLm9mZnNldFgoKSxvZmZzZXRZOnRoaXMub2Zmc2V0WSgpLHNrZXdYOnRoaXMuc2tld1goKSxza2V3WTp0aGlzLnNrZXdZKCl9O3JldHVybiB0aGlzLmF0dHJzLng9MCx0aGlzLmF0dHJzLnk9MCx0aGlzLmF0dHJzLnJvdGF0aW9uPTAsdGhpcy5hdHRycy5zY2FsZVg9MSx0aGlzLmF0dHJzLnNjYWxlWT0xLHRoaXMuYXR0cnMub2Zmc2V0WD0wLHRoaXMuYXR0cnMub2Zmc2V0WT0wLHRoaXMuYXR0cnMuc2tld1g9MCx0aGlzLmF0dHJzLnNrZXdZPTAsdH1tb3ZlKHQpe3ZhciBlPXQueCxpPXQueSxyPXRoaXMueCgpLGE9dGhpcy55KCk7cmV0dXJuIHZvaWQgMCE9PWUmJihyKz1lKSx2b2lkIDAhPT1pJiYoYSs9aSksdGhpcy5zZXRQb3NpdGlvbih7eDpyLHk6YX0pLHRoaXN9X2VhY2hBbmNlc3RvclJldmVyc2UodCxlKXt2YXIgaSxyLGE9W10sbj10aGlzLmdldFBhcmVudCgpO2lmKCFlfHxlLl9pZCE9PXRoaXMuX2lkKXtmb3IoYS51bnNoaWZ0KHRoaXMpO24mJighZXx8bi5faWQhPT1lLl9pZCk7KWEudW5zaGlmdChuKSxuPW4ucGFyZW50O2ZvcihpPWEubGVuZ3RoLHI9MDtyPGk7cisrKXQoYVtyXSl9fXJvdGF0ZSh0KXtyZXR1cm4gdGhpcy5yb3RhdGlvbih0aGlzLnJvdGF0aW9uKCkrdCksdGhpc31tb3ZlVG9Ub3AoKXtpZighdGhpcy5wYXJlbnQpcmV0dXJuIGcud2FybigiTm9kZSBoYXMgbm8gcGFyZW50LiBtb3ZlVG9Ub3AgZnVuY3Rpb24gaXMgaWdub3JlZC4iKSwhMTt2YXIgdD10aGlzLmluZGV4O3JldHVybiB0aGlzLnBhcmVudC5jaGlsZHJlbi5zcGxpY2UodCwxKSx0aGlzLnBhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMpLHRoaXMucGFyZW50Ll9zZXRDaGlsZHJlbkluZGljZXMoKSwhMH1tb3ZlVXAoKXtpZighdGhpcy5wYXJlbnQpcmV0dXJuIGcud2FybigiTm9kZSBoYXMgbm8gcGFyZW50LiBtb3ZlVXAgZnVuY3Rpb24gaXMgaWdub3JlZC4iKSwhMTt2YXIgdD10aGlzLmluZGV4O3JldHVybiB0PHRoaXMucGFyZW50LmdldENoaWxkcmVuKCkubGVuZ3RoLTEmJih0aGlzLnBhcmVudC5jaGlsZHJlbi5zcGxpY2UodCwxKSx0aGlzLnBhcmVudC5jaGlsZHJlbi5zcGxpY2UodCsxLDAsdGhpcyksdGhpcy5wYXJlbnQuX3NldENoaWxkcmVuSW5kaWNlcygpLCEwKX1tb3ZlRG93bigpe2lmKCF0aGlzLnBhcmVudClyZXR1cm4gZy53YXJuKCJOb2RlIGhhcyBubyBwYXJlbnQuIG1vdmVEb3duIGZ1bmN0aW9uIGlzIGlnbm9yZWQuIiksITE7dmFyIHQ9dGhpcy5pbmRleDtyZXR1cm4gdD4wJiYodGhpcy5wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKHQsMSksdGhpcy5wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKHQtMSwwLHRoaXMpLHRoaXMucGFyZW50Ll9zZXRDaGlsZHJlbkluZGljZXMoKSwhMCl9bW92ZVRvQm90dG9tKCl7aWYoIXRoaXMucGFyZW50KXJldHVybiBnLndhcm4oIk5vZGUgaGFzIG5vIHBhcmVudC4gbW92ZVRvQm90dG9tIGZ1bmN0aW9uIGlzIGlnbm9yZWQuIiksITE7dmFyIHQ9dGhpcy5pbmRleDtyZXR1cm4gdD4wJiYodGhpcy5wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKHQsMSksdGhpcy5wYXJlbnQuY2hpbGRyZW4udW5zaGlmdCh0aGlzKSx0aGlzLnBhcmVudC5fc2V0Q2hpbGRyZW5JbmRpY2VzKCksITApfXNldFpJbmRleCh0KXtpZighdGhpcy5wYXJlbnQpcmV0dXJuIGcud2FybigiTm9kZSBoYXMgbm8gcGFyZW50LiB6SW5kZXggcGFyYW1ldGVyIGlzIGlnbm9yZWQuIiksdGhpczsodDwwfHx0Pj10aGlzLnBhcmVudC5jaGlsZHJlbi5sZW5ndGgpJiZnLndhcm4oIlVuZXhwZWN0ZWQgdmFsdWUgIit0KyIgZm9yIHpJbmRleCBwcm9wZXJ0eS4gekluZGV4IGlzIGp1c3QgaW5kZXggb2YgYSBub2RlIGluIGNoaWxkcmVuIG9mIGl0cyBwYXJlbnQuIEV4cGVjdGVkIHZhbHVlIGlzIGZyb20gMCB0byAiKyh0aGlzLnBhcmVudC5jaGlsZHJlbi5sZW5ndGgtMSkrIi4iKTt2YXIgZT10aGlzLmluZGV4O3JldHVybiB0aGlzLnBhcmVudC5jaGlsZHJlbi5zcGxpY2UoZSwxKSx0aGlzLnBhcmVudC5jaGlsZHJlbi5zcGxpY2UodCwwLHRoaXMpLHRoaXMucGFyZW50Ll9zZXRDaGlsZHJlbkluZGljZXMoKSx0aGlzfWdldEFic29sdXRlT3BhY2l0eSgpe3JldHVybiB0aGlzLl9nZXRDYWNoZShELHRoaXMuX2dldEFic29sdXRlT3BhY2l0eSl9X2dldEFic29sdXRlT3BhY2l0eSgpe3ZhciB0PXRoaXMub3BhY2l0eSgpLGU9dGhpcy5nZXRQYXJlbnQoKTtyZXR1cm4gZSYmIWUuX2lzVW5kZXJDYWNoZSYmKHQqPWUuZ2V0QWJzb2x1dGVPcGFjaXR5KCkpLHR9bW92ZVRvKHQpe3JldHVybiB0aGlzLmdldFBhcmVudCgpIT09dCYmKHRoaXMuX3JlbW92ZSgpLHQuYWRkKHRoaXMpKSx0aGlzfXRvT2JqZWN0KCl7dmFyIHQsZSxpLHIsYT17fSxuPXRoaXMuZ2V0QXR0cnMoKTtmb3IodCBpbiBhLmF0dHJzPXt9LG4pZT1uW3RdLGcuaXNPYmplY3QoZSkmJiFnLl9pc1BsYWluT2JqZWN0KGUpJiYhZy5faXNBcnJheShlKXx8KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXNbdF0mJnRoaXNbdF0sZGVsZXRlIG5bdF0scj1pP2kuY2FsbCh0aGlzKTpudWxsLG5bdF09ZSxyIT09ZSYmKGEuYXR0cnNbdF09ZSkpO3JldHVybiBhLmNsYXNzTmFtZT10aGlzLmdldENsYXNzTmFtZSgpLGcuX3ByZXBhcmVUb1N0cmluZ2lmeShhKX10b0pTT04oKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy50b09iamVjdCgpKX1nZXRQYXJlbnQoKXtyZXR1cm4gdGhpcy5wYXJlbnR9ZmluZEFuY2VzdG9ycyh0LGUsaSl7dmFyIHI9W107ZSYmdGhpcy5faXNNYXRjaCh0KSYmci5wdXNoKHRoaXMpO2Zvcih2YXIgYT10aGlzLnBhcmVudDthOyl7aWYoYT09PWkpcmV0dXJuIHI7YS5faXNNYXRjaCh0KSYmci5wdXNoKGEpLGE9YS5wYXJlbnR9cmV0dXJuIHJ9aXNBbmNlc3Rvck9mKHQpe3JldHVybiExfWZpbmRBbmNlc3Rvcih0LGUsaSl7cmV0dXJuIHRoaXMuZmluZEFuY2VzdG9ycyh0LGUsaSlbMF19X2lzTWF0Y2godCl7aWYoIXQpcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQpcmV0dXJuIHQodGhpcyk7dmFyIGUsaSxyPXQucmVwbGFjZSgvIC9nLCIiKS5zcGxpdCgiLCIpLGE9ci5sZW5ndGg7Zm9yKGU9MDtlPGE7ZSsrKWlmKGk9cltlXSxnLmlzVmFsaWRTZWxlY3RvcihpKXx8KGcud2FybignU2VsZWN0b3IgIicraSsnIiBpcyBpbnZhbGlkLiBBbGxvd2VkIHNlbGVjdG9ycyBleGFtcGxlcyBhcmUgIiNmb28iLCAiLmJhciIgb3IgIkdyb3VwIi4nKSxnLndhcm4oJ0lmIHlvdSBoYXZlIGEgY3VzdG9tIHNoYXBlIHdpdGggc3VjaCBjbGFzc05hbWUsIHBsZWFzZSBjaGFuZ2UgaXQgdG8gc3RhcnQgd2l0aCB1cHBlciBsZXR0ZXIgbGlrZSAiVHJpYW5nbGUiLicpLGcud2FybigiS29udmEgaXMgYXdlc29tZSwgcmlnaHQ/IikpLCIjIj09PWkuY2hhckF0KDApKXtpZih0aGlzLmlkKCk9PT1pLnNsaWNlKDEpKXJldHVybiEwfWVsc2UgaWYoIi4iPT09aS5jaGFyQXQoMCkpe2lmKHRoaXMuaGFzTmFtZShpLnNsaWNlKDEpKSlyZXR1cm4hMH1lbHNlIGlmKHRoaXMuY2xhc3NOYW1lPT09aXx8dGhpcy5ub2RlVHlwZT09PWkpcmV0dXJuITA7cmV0dXJuITF9Z2V0TGF5ZXIoKXt2YXIgdD10aGlzLmdldFBhcmVudCgpO3JldHVybiB0P3QuZ2V0TGF5ZXIoKTpudWxsfWdldFN0YWdlKCl7cmV0dXJuIHRoaXMuX2dldENhY2hlKFgsdGhpcy5fZ2V0U3RhZ2UpfV9nZXRTdGFnZSgpe3ZhciB0PXRoaXMuZ2V0UGFyZW50KCk7cmV0dXJuIHQ/dC5nZXRTdGFnZSgpOnZvaWQgMH1maXJlKHQsZT17fSxpKXtyZXR1cm4gZS50YXJnZXQ9ZS50YXJnZXR8fHRoaXMsaT90aGlzLl9maXJlQW5kQnViYmxlKHQsZSk6dGhpcy5fZmlyZSh0LGUpLHRoaXN9Z2V0QWJzb2x1dGVUcmFuc2Zvcm0odCl7cmV0dXJuIHQ/dGhpcy5fZ2V0QWJzb2x1dGVUcmFuc2Zvcm0odCk6dGhpcy5fZ2V0Q2FjaGUoSSx0aGlzLl9nZXRBYnNvbHV0ZVRyYW5zZm9ybSl9X2dldEFic29sdXRlVHJhbnNmb3JtKHQpe3ZhciBlO2lmKHQpcmV0dXJuIGU9bmV3IGEsdGhpcy5fZWFjaEFuY2VzdG9yUmV2ZXJzZSgoZnVuY3Rpb24odCl7dmFyIGk9dC50cmFuc2Zvcm1zRW5hYmxlZCgpOyJhbGwiPT09aT9lLm11bHRpcGx5KHQuZ2V0VHJhbnNmb3JtKCkpOiJwb3NpdGlvbiI9PT1pJiZlLnRyYW5zbGF0ZSh0LngoKS10Lm9mZnNldFgoKSx0LnkoKS10Lm9mZnNldFkoKSl9KSx0KSxlO2U9dGhpcy5fY2FjaGUuZ2V0KEkpfHxuZXcgYSx0aGlzLnBhcmVudD90aGlzLnBhcmVudC5nZXRBYnNvbHV0ZVRyYW5zZm9ybSgpLmNvcHlJbnRvKGUpOmUucmVzZXQoKTt2YXIgaT10aGlzLnRyYW5zZm9ybXNFbmFibGVkKCk7aWYoImFsbCI9PT1pKWUubXVsdGlwbHkodGhpcy5nZXRUcmFuc2Zvcm0oKSk7ZWxzZSBpZigicG9zaXRpb24iPT09aSl7Y29uc3QgdD10aGlzLmF0dHJzLnh8fDAsaT10aGlzLmF0dHJzLnl8fDAscj10aGlzLmF0dHJzLm9mZnNldFh8fDAsYT10aGlzLmF0dHJzLm9mZnNldFl8fDA7ZS50cmFuc2xhdGUodC1yLGktYSl9cmV0dXJuIGUuZGlydHk9ITEsZX1nZXRBYnNvbHV0ZVNjYWxlKHQpe2Zvcih2YXIgZT10aGlzO2U7KWUuX2lzVW5kZXJDYWNoZSYmKHQ9ZSksZT1lLmdldFBhcmVudCgpO2NvbnN0IGk9dGhpcy5nZXRBYnNvbHV0ZVRyYW5zZm9ybSh0KS5kZWNvbXBvc2UoKTtyZXR1cm57eDppLnNjYWxlWCx5Omkuc2NhbGVZfX1nZXRBYnNvbHV0ZVJvdGF0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0QWJzb2x1dGVUcmFuc2Zvcm0oKS5kZWNvbXBvc2UoKS5yb3RhdGlvbn1nZXRUcmFuc2Zvcm0oKXtyZXR1cm4gdGhpcy5fZ2V0Q2FjaGUoaix0aGlzLl9nZXRUcmFuc2Zvcm0pfV9nZXRUcmFuc2Zvcm0oKXt2YXIgdCxlLHI9dGhpcy5fY2FjaGUuZ2V0KGopfHxuZXcgYTtyLnJlc2V0KCk7dmFyIG49dGhpcy54KCkscz10aGlzLnkoKSxvPWkuZ2V0QW5nbGUodGhpcy5yb3RhdGlvbigpKSxoPW51bGwhPT0odD10aGlzLmF0dHJzLnNjYWxlWCkmJnZvaWQgMCE9PXQ/dDoxLGw9bnVsbCE9PShlPXRoaXMuYXR0cnMuc2NhbGVZKSYmdm9pZCAwIT09ZT9lOjEsZD10aGlzLmF0dHJzLnNrZXdYfHwwLGM9dGhpcy5hdHRycy5za2V3WXx8MCxnPXRoaXMuYXR0cnMub2Zmc2V0WHx8MCx1PXRoaXMuYXR0cnMub2Zmc2V0WXx8MDtyZXR1cm4gMD09PW4mJjA9PT1zfHxyLnRyYW5zbGF0ZShuLHMpLDAhPT1vJiZyLnJvdGF0ZShvKSwwPT09ZCYmMD09PWN8fHIuc2tldyhkLGMpLDE9PT1oJiYxPT09bHx8ci5zY2FsZShoLGwpLDA9PT1nJiYwPT09dXx8ci50cmFuc2xhdGUoLTEqZywtMSp1KSxyLmRpcnR5PSExLHJ9Y2xvbmUodCl7dmFyIGUsaSxyLGEsbixzPWcuY2xvbmVPYmplY3QodGhpcy5hdHRycyk7Zm9yKGUgaW4gdClzW2VdPXRbZV07dmFyIG89bmV3IHRoaXMuY29uc3RydWN0b3Iocyk7Zm9yKGUgaW4gdGhpcy5ldmVudExpc3RlbmVycylmb3Iocj0oaT10aGlzLmV2ZW50TGlzdGVuZXJzW2VdKS5sZW5ndGgsYT0wO2E8cjthKyspKG49aVthXSkubmFtZS5pbmRleE9mKCJrb252YSIpPDAmJihvLmV2ZW50TGlzdGVuZXJzW2VdfHwoby5ldmVudExpc3RlbmVyc1tlXT1bXSksby5ldmVudExpc3RlbmVyc1tlXS5wdXNoKG4pKTtyZXR1cm4gb31fdG9Lb252YUNhbnZhcyh0KXt0PXR8fHt9O3ZhciBlPXRoaXMuZ2V0Q2xpZW50UmVjdCgpLGk9dGhpcy5nZXRTdGFnZSgpLHI9dm9pZCAwIT09dC54P3QueDplLngsYT12b2lkIDAhPT10Lnk/dC55OmUueSxuPXQucGl4ZWxSYXRpb3x8MSxzPW5ldyBFKHt3aWR0aDp0LndpZHRofHxlLndpZHRofHwoaT9pLndpZHRoKCk6MCksaGVpZ2h0OnQuaGVpZ2h0fHxlLmhlaWdodHx8KGk/aS5oZWlnaHQoKTowKSxwaXhlbFJhdGlvOm59KSxvPXMuZ2V0Q29udGV4dCgpO3JldHVybiBvLnNhdmUoKSwocnx8YSkmJm8udHJhbnNsYXRlKC0xKnIsLTEqYSksdGhpcy5kcmF3U2NlbmUocyksby5yZXN0b3JlKCksc310b0NhbnZhcyh0KXtyZXR1cm4gdGhpcy5fdG9Lb252YUNhbnZhcyh0KS5fY2FudmFzfXRvRGF0YVVSTCh0KXt2YXIgZT0odD10fHx7fSkubWltZVR5cGV8fG51bGwsaT10LnF1YWxpdHl8fG51bGwscj10aGlzLl90b0tvbnZhQ2FudmFzKHQpLnRvRGF0YVVSTChlLGkpO3JldHVybiB0LmNhbGxiYWNrJiZ0LmNhbGxiYWNrKHIpLHJ9dG9JbWFnZSh0KXtpZighdHx8IXQuY2FsbGJhY2spdGhyb3ciY2FsbGJhY2sgcmVxdWlyZWQgZm9yIHRvSW1hZ2UgbWV0aG9kIGNvbmZpZyBhcmd1bWVudCI7dmFyIGU9dC5jYWxsYmFjaztkZWxldGUgdC5jYWxsYmFjayxnLl91cmxUb0ltYWdlKHRoaXMudG9EYXRhVVJMKHQpLChmdW5jdGlvbih0KXtlKHQpfSkpfXNldFNpemUodCl7cmV0dXJuIHRoaXMud2lkdGgodC53aWR0aCksdGhpcy5oZWlnaHQodC5oZWlnaHQpLHRoaXN9Z2V0U2l6ZSgpe3JldHVybnt3aWR0aDp0aGlzLndpZHRoKCksaGVpZ2h0OnRoaXMuaGVpZ2h0KCl9fWdldENsYXNzTmFtZSgpe3JldHVybiB0aGlzLmNsYXNzTmFtZXx8dGhpcy5ub2RlVHlwZX1nZXRUeXBlKCl7cmV0dXJuIHRoaXMubm9kZVR5cGV9Z2V0RHJhZ0Rpc3RhbmNlKCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuYXR0cnMuZHJhZ0Rpc3RhbmNlP3RoaXMuYXR0cnMuZHJhZ0Rpc3RhbmNlOnRoaXMucGFyZW50P3RoaXMucGFyZW50LmdldERyYWdEaXN0YW5jZSgpOmkuZHJhZ0Rpc3RhbmNlfV9vZmYodCxlLGkpe3ZhciByLGEsbixzPXRoaXMuZXZlbnRMaXN0ZW5lcnNbdF07Zm9yKHI9MDtyPHMubGVuZ3RoO3IrKylpZihhPXNbcl0ubmFtZSxuPXNbcl0uaGFuZGxlciwhKCJrb252YSI9PT1hJiYia29udmEiIT09ZXx8ZSYmYSE9PWV8fGkmJmkhPT1uKSl7aWYocy5zcGxpY2UociwxKSwwPT09cy5sZW5ndGgpe2RlbGV0ZSB0aGlzLmV2ZW50TGlzdGVuZXJzW3RdO2JyZWFrfXItLX19X2ZpcmVDaGFuZ2VFdmVudCh0LGUsaSl7dGhpcy5fZmlyZSh0KyJDaGFuZ2UiLHtvbGRWYWw6ZSxuZXdWYWw6aX0pfWFkZE5hbWUodCl7aWYoIXRoaXMuaGFzTmFtZSh0KSl7dmFyIGU9dGhpcy5uYW1lKCksaT1lP2UrIiAiK3Q6dDt0aGlzLm5hbWUoaSl9cmV0dXJuIHRoaXN9aGFzTmFtZSh0KXtpZighdClyZXR1cm4hMTtjb25zdCBlPXRoaXMubmFtZSgpO3JldHVybiEhZSYmLTEhPT0oZXx8IiIpLnNwbGl0KC9ccy9nKS5pbmRleE9mKHQpfXJlbW92ZU5hbWUodCl7dmFyIGU9KHRoaXMubmFtZSgpfHwiIikuc3BsaXQoL1xzL2cpLGk9ZS5pbmRleE9mKHQpO3JldHVybi0xIT09aSYmKGUuc3BsaWNlKGksMSksdGhpcy5uYW1lKGUuam9pbigiICIpKSksdGhpc31zZXRBdHRyKHQsZSl7dmFyIGk9dGhpc1sic2V0IitnLl9jYXBpdGFsaXplKHQpXTtyZXR1cm4gZy5faXNGdW5jdGlvbihpKT9pLmNhbGwodGhpcyxlKTp0aGlzLl9zZXRBdHRyKHQsZSksdGhpc31fcmVxdWVzdERyYXcoKXtpZihpLmF1dG9EcmF3RW5hYmxlZCl7Y29uc3QgdD10aGlzLmdldExheWVyKCl8fHRoaXMuZ2V0U3RhZ2UoKTtudWxsPT10fHx0LmJhdGNoRHJhdygpfX1fc2V0QXR0cih0LGUpe3ZhciBpPXRoaXMuYXR0cnNbdF07KGkhPT1lfHxnLmlzT2JqZWN0KGUpKSYmKG51bGw9PWU/ZGVsZXRlIHRoaXMuYXR0cnNbdF06dGhpcy5hdHRyc1t0XT1lLHRoaXMuX3Nob3VsZEZpcmVDaGFuZ2VFdmVudHMmJnRoaXMuX2ZpcmVDaGFuZ2VFdmVudCh0LGksZSksdGhpcy5fcmVxdWVzdERyYXcoKSl9X3NldENvbXBvbmVudEF0dHIodCxlLGkpe3ZhciByO3ZvaWQgMCE9PWkmJigocj10aGlzLmF0dHJzW3RdKXx8KHRoaXMuYXR0cnNbdF09dGhpcy5nZXRBdHRyKHQpKSx0aGlzLmF0dHJzW3RdW2VdPWksdGhpcy5fZmlyZUNoYW5nZUV2ZW50KHQscixpKSl9X2ZpcmVBbmRCdWJibGUodCxlLGkpe2lmKGUmJnRoaXMubm9kZVR5cGU9PT1IJiYoZS50YXJnZXQ9dGhpcyksISgodD09PXp8fHQ9PT1XKSYmKGkmJih0aGlzPT09aXx8dGhpcy5pc0FuY2VzdG9yT2YmJnRoaXMuaXNBbmNlc3Rvck9mKGkpKXx8IlN0YWdlIj09PXRoaXMubm9kZVR5cGUmJiFpKSkpe3RoaXMuX2ZpcmUodCxlKTt2YXIgcj0odD09PXp8fHQ9PT1XKSYmaSYmaS5pc0FuY2VzdG9yT2YmJmkuaXNBbmNlc3Rvck9mKHRoaXMpJiYhaS5pc0FuY2VzdG9yT2YodGhpcy5wYXJlbnQpOyhlJiYhZS5jYW5jZWxCdWJibGV8fCFlKSYmdGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmlzTGlzdGVuaW5nKCkmJiFyJiYoaSYmaS5wYXJlbnQ/dGhpcy5fZmlyZUFuZEJ1YmJsZS5jYWxsKHRoaXMucGFyZW50LHQsZSxpKTp0aGlzLl9maXJlQW5kQnViYmxlLmNhbGwodGhpcy5wYXJlbnQsdCxlKSl9fV9nZXRQcm90b0xpc3RlbmVycyh0KXtsZXQgZT10aGlzLl9jYWNoZS5nZXQoTyk7aWYoIWUpe2U9e307bGV0IHQ9T2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpO2Zvcig7dDspaWYodC5ldmVudExpc3RlbmVycyl7Zm9yKHZhciBpIGluIHQuZXZlbnRMaXN0ZW5lcnMpe2NvbnN0IHI9dC5ldmVudExpc3RlbmVyc1tpXSxhPWVbaV18fFtdO2VbaV09ci5jb25jYXQoYSl9dD1PYmplY3QuZ2V0UHJvdG90eXBlT2YodCl9ZWxzZSB0PU9iamVjdC5nZXRQcm90b3R5cGVPZih0KTt0aGlzLl9jYWNoZS5zZXQoTyxlKX1yZXR1cm4gZVt0XX1fZmlyZSh0LGUpeyhlPWV8fHt9KS5jdXJyZW50VGFyZ2V0PXRoaXMsZS50eXBlPXQ7Y29uc3QgaT10aGlzLl9nZXRQcm90b0xpc3RlbmVycyh0KTtpZihpKWZvcih2YXIgcj0wO3I8aS5sZW5ndGg7cisrKWlbcl0uaGFuZGxlci5jYWxsKHRoaXMsZSk7Y29uc3QgYT10aGlzLmV2ZW50TGlzdGVuZXJzW3RdO2lmKGEpZm9yKHI9MDtyPGEubGVuZ3RoO3IrKylhW3JdLmhhbmRsZXIuY2FsbCh0aGlzLGUpfWRyYXcoKXtyZXR1cm4gdGhpcy5kcmF3U2NlbmUoKSx0aGlzLmRyYXdIaXQoKSx0aGlzfV9jcmVhdGVEcmFnRWxlbWVudCh0KXt2YXIgZT10P3QucG9pbnRlcklkOnZvaWQgMCxpPXRoaXMuZ2V0U3RhZ2UoKSxyPXRoaXMuZ2V0QWJzb2x1dGVQb3NpdGlvbigpLGE9aS5fZ2V0UG9pbnRlckJ5SWQoZSl8fGkuX2NoYW5nZWRQb2ludGVyUG9zaXRpb25zWzBdfHxyO0wuX2RyYWdFbGVtZW50cy5zZXQodGhpcy5faWQse25vZGU6dGhpcyxzdGFydFBvaW50ZXJQb3M6YSxvZmZzZXQ6e3g6YS54LXIueCx5OmEueS1yLnl9LGRyYWdTdGF0dXM6InJlYWR5Iixwb2ludGVySWQ6ZX0pfXN0YXJ0RHJhZyh0LGU9ITApe0wuX2RyYWdFbGVtZW50cy5oYXModGhpcy5faWQpfHx0aGlzLl9jcmVhdGVEcmFnRWxlbWVudCh0KTtMLl9kcmFnRWxlbWVudHMuZ2V0KHRoaXMuX2lkKS5kcmFnU3RhdHVzPSJkcmFnZ2luZyIsdGhpcy5maXJlKCJkcmFnc3RhcnQiLHt0eXBlOiJkcmFnc3RhcnQiLHRhcmdldDp0aGlzLGV2dDp0JiZ0LmV2dH0sZSl9X3NldERyYWdQb3NpdGlvbih0LGUpe2NvbnN0IGk9dGhpcy5nZXRTdGFnZSgpLl9nZXRQb2ludGVyQnlJZChlLnBvaW50ZXJJZCk7aWYoaSl7dmFyIHI9e3g6aS54LWUub2Zmc2V0LngseTppLnktZS5vZmZzZXQueX0sYT10aGlzLmRyYWdCb3VuZEZ1bmMoKTtpZih2b2lkIDAhPT1hKXtjb25zdCBlPWEuY2FsbCh0aGlzLHIsdCk7ZT9yPWU6Zy53YXJuKCJkcmFnQm91bmRGdW5jIGRpZCBub3QgcmV0dXJuIGFueSB2YWx1ZS4gVGhhdCBpcyB1bmV4cGVjdGVkIGJlaGF2aW9yLiBZb3UgbXVzdCByZXR1cm4gbmV3IGFic29sdXRlIHBvc2l0aW9uIGZyb20gZHJhZ0JvdW5kRnVuYy4iKX10aGlzLl9sYXN0UG9zJiZ0aGlzLl9sYXN0UG9zLng9PT1yLngmJnRoaXMuX2xhc3RQb3MueT09PXIueXx8KHRoaXMuc2V0QWJzb2x1dGVQb3NpdGlvbihyKSx0aGlzLl9yZXF1ZXN0RHJhdygpKSx0aGlzLl9sYXN0UG9zPXJ9fXN0b3BEcmFnKHQpe2NvbnN0IGU9TC5fZHJhZ0VsZW1lbnRzLmdldCh0aGlzLl9pZCk7ZSYmKGUuZHJhZ1N0YXR1cz0ic3RvcHBlZCIpLEwuX2VuZERyYWdCZWZvcmUodCksTC5fZW5kRHJhZ0FmdGVyKHQpfXNldERyYWdnYWJsZSh0KXt0aGlzLl9zZXRBdHRyKCJkcmFnZ2FibGUiLHQpLHRoaXMuX2RyYWdDaGFuZ2UoKX1pc0RyYWdnaW5nKCl7Y29uc3QgdD1MLl9kcmFnRWxlbWVudHMuZ2V0KHRoaXMuX2lkKTtyZXR1cm4hIXQmJiJkcmFnZ2luZyI9PT10LmRyYWdTdGF0dXN9X2xpc3RlbkRyYWcoKXt0aGlzLl9kcmFnQ2xlYW51cCgpLHRoaXMub24oIm1vdXNlZG93bi5rb252YSB0b3VjaHN0YXJ0LmtvbnZhIiwoZnVuY3Rpb24odCl7aWYoKCEodm9pZCAwIT09dC5ldnQuYnV0dG9uKXx8aS5kcmFnQnV0dG9ucy5pbmRleE9mKHQuZXZ0LmJ1dHRvbik+PTApJiYhdGhpcy5pc0RyYWdnaW5nKCkpe3ZhciBlPSExO0wuX2RyYWdFbGVtZW50cy5mb3JFYWNoKCh0PT57dGhpcy5pc0FuY2VzdG9yT2YodC5ub2RlKSYmKGU9ITApfSkpLGV8fHRoaXMuX2NyZWF0ZURyYWdFbGVtZW50KHQpfX0pKX1fZHJhZ0NoYW5nZSgpe2lmKHRoaXMuYXR0cnMuZHJhZ2dhYmxlKXRoaXMuX2xpc3RlbkRyYWcoKTtlbHNle2lmKHRoaXMuX2RyYWdDbGVhbnVwKCksIXRoaXMuZ2V0U3RhZ2UoKSlyZXR1cm47Y29uc3QgdD1MLl9kcmFnRWxlbWVudHMuZ2V0KHRoaXMuX2lkKSxlPXQmJiJkcmFnZ2luZyI9PT10LmRyYWdTdGF0dXMsaT10JiYicmVhZHkiPT09dC5kcmFnU3RhdHVzO2U/dGhpcy5zdG9wRHJhZygpOmkmJkwuX2RyYWdFbGVtZW50cy5kZWxldGUodGhpcy5faWQpfX1fZHJhZ0NsZWFudXAoKXt0aGlzLm9mZigibW91c2Vkb3duLmtvbnZhIiksdGhpcy5vZmYoInRvdWNoc3RhcnQua29udmEiKX1pc0NsaWVudFJlY3RPblNjcmVlbih0PXt4OjAseTowfSl7Y29uc3QgZT10aGlzLmdldFN0YWdlKCk7aWYoIWUpcmV0dXJuITE7Y29uc3QgaT17eDotdC54LHk6LXQueSx3aWR0aDplLndpZHRoKCkrdC54LGhlaWdodDplLmhlaWdodCgpK3QueX07cmV0dXJuIGcuaGF2ZUludGVyc2VjdGlvbihpLHRoaXMuZ2V0Q2xpZW50UmVjdCgpKX1zdGF0aWMgY3JlYXRlKHQsZSl7cmV0dXJuIGcuX2lzU3RyaW5nKHQpJiYodD1KU09OLnBhcnNlKHQpKSx0aGlzLl9jcmVhdGVOb2RlKHQsZSl9c3RhdGljIF9jcmVhdGVOb2RlKHQsZSl7dmFyIHIsYSxuLHM9Sy5wcm90b3R5cGUuZ2V0Q2xhc3NOYW1lLmNhbGwodCksbz10LmNoaWxkcmVuO2UmJih0LmF0dHJzLmNvbnRhaW5lcj1lKSxpW3NdfHwoZy53YXJuKCdDYW4gbm90IGZpbmQgYSBub2RlIHdpdGggY2xhc3MgbmFtZSAiJytzKyciLiBGYWxsYmFjayB0byAiU2hhcGUiLicpLHM9IlNoYXBlIik7aWYocj1uZXcoMCxpW3NdKSh0LmF0dHJzKSxvKWZvcihhPW8ubGVuZ3RoLG49MDtuPGE7bisrKXIuYWRkKEsuX2NyZWF0ZU5vZGUob1tuXSkpO3JldHVybiByfX1LLnByb3RvdHlwZS5ub2RlVHlwZT0iTm9kZSIsSy5wcm90b3R5cGUuX2F0dHJzQWZmZWN0aW5nU2l6ZT1bXSxLLnByb3RvdHlwZS5ldmVudExpc3RlbmVycz17fSxLLnByb3RvdHlwZS5vbi5jYWxsKEsucHJvdG90eXBlLHEsKGZ1bmN0aW9uKCl7dGhpcy5fYmF0Y2hpbmdUcmFuc2Zvcm1DaGFuZ2U/dGhpcy5fbmVlZENsZWFyVHJhbnNmb3JtQ2FjaGU9ITA6KHRoaXMuX2NsZWFyQ2FjaGUoaiksdGhpcy5fY2xlYXJTZWxmQW5kRGVzY2VuZGFudENhY2hlKEkpKX0pKSxLLnByb3RvdHlwZS5vbi5jYWxsKEsucHJvdG90eXBlLCJ2aXNpYmxlQ2hhbmdlLmtvbnZhIiwoZnVuY3Rpb24oKXt0aGlzLl9jbGVhclNlbGZBbmREZXNjZW5kYW50Q2FjaGUoVSl9KSksSy5wcm90b3R5cGUub24uY2FsbChLLnByb3RvdHlwZSwibGlzdGVuaW5nQ2hhbmdlLmtvbnZhIiwoZnVuY3Rpb24oKXt0aGlzLl9jbGVhclNlbGZBbmREZXNjZW5kYW50Q2FjaGUoQil9KSksSy5wcm90b3R5cGUub24uY2FsbChLLnByb3RvdHlwZSwib3BhY2l0eUNoYW5nZS5rb252YSIsKGZ1bmN0aW9uKCl7dGhpcy5fY2xlYXJTZWxmQW5kRGVzY2VuZGFudENhY2hlKEQpfSkpO2NvbnN0IFE9dy5hZGRHZXR0ZXJTZXR0ZXI7UShLLCJ6SW5kZXgiKSxRKEssImFic29sdXRlUG9zaXRpb24iKSxRKEssInBvc2l0aW9uIiksUShLLCJ4IiwwLHAoKSksUShLLCJ5IiwwLHAoKSksUShLLCJnbG9iYWxDb21wb3NpdGVPcGVyYXRpb24iLCJzb3VyY2Utb3ZlciIsXygpKSxRKEssIm9wYWNpdHkiLDEscCgpKSxRKEssIm5hbWUiLCIiLF8oKSksUShLLCJpZCIsIiIsXygpKSxRKEssInJvdGF0aW9uIiwwLHAoKSksdy5hZGRDb21wb25lbnRzR2V0dGVyU2V0dGVyKEssInNjYWxlIixbIngiLCJ5Il0pLFEoSywic2NhbGVYIiwxLHAoKSksUShLLCJzY2FsZVkiLDEscCgpKSx3LmFkZENvbXBvbmVudHNHZXR0ZXJTZXR0ZXIoSywic2tldyIsWyJ4IiwieSJdKSxRKEssInNrZXdYIiwwLHAoKSksUShLLCJza2V3WSIsMCxwKCkpLHcuYWRkQ29tcG9uZW50c0dldHRlclNldHRlcihLLCJvZmZzZXQiLFsieCIsInkiXSksUShLLCJvZmZzZXRYIiwwLHAoKSksUShLLCJvZmZzZXRZIiwwLHAoKSksUShLLCJkcmFnRGlzdGFuY2UiLG51bGwscCgpKSxRKEssIndpZHRoIiwwLHAoKSksUShLLCJoZWlnaHQiLDAscCgpKSxRKEssImxpc3RlbmluZyIsITAseCgpKSxRKEssInByZXZlbnREZWZhdWx0IiwhMCx4KCkpLFEoSywiZmlsdGVycyIsbnVsbCwoZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2ZpbHRlclVwVG9EYXRlPSExLHR9KSksUShLLCJ2aXNpYmxlIiwhMCx4KCkpLFEoSywidHJhbnNmb3Jtc0VuYWJsZWQiLCJhbGwiLF8oKSksUShLLCJzaXplIiksUShLLCJkcmFnQm91bmRGdW5jIiksUShLLCJkcmFnZ2FibGUiLCExLHgoKSksdy5iYWNrQ29tcGF0KEsse3JvdGF0ZURlZzoicm90YXRlIixzZXRSb3RhdGlvbkRlZzoic2V0Um90YXRpb24iLGdldFJvdGF0aW9uRGVnOiJnZXRSb3RhdGlvbiJ9KTtjbGFzcyBKIGV4dGVuZHMgS3tjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jaGlsZHJlbj1bXX1nZXRDaGlsZHJlbih0KXtpZighdClyZXR1cm4gdGhpcy5jaGlsZHJlbnx8W107Y29uc3QgZT10aGlzLmNoaWxkcmVufHxbXTt2YXIgaT1bXTtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihlKXt0KGUpJiZpLnB1c2goZSl9KSksaX1oYXNDaGlsZHJlbigpe3JldHVybiB0aGlzLmdldENoaWxkcmVuKCkubGVuZ3RoPjB9cmVtb3ZlQ2hpbGRyZW4oKXtyZXR1cm4gdGhpcy5nZXRDaGlsZHJlbigpLmZvckVhY2goKHQ9Pnt0LnBhcmVudD1udWxsLHQuaW5kZXg9MCx0LnJlbW92ZSgpfSkpLHRoaXMuY2hpbGRyZW49W10sdGhpcy5fcmVxdWVzdERyYXcoKSx0aGlzfWRlc3Ryb3lDaGlsZHJlbigpe3JldHVybiB0aGlzLmdldENoaWxkcmVuKCkuZm9yRWFjaCgodD0+e3QucGFyZW50PW51bGwsdC5pbmRleD0wLHQuZGVzdHJveSgpfSkpLHRoaXMuY2hpbGRyZW49W10sdGhpcy5fcmVxdWVzdERyYXcoKSx0aGlzfWFkZCguLi50KXtpZihhcmd1bWVudHMubGVuZ3RoPjEpe2Zvcih2YXIgZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdGhpcy5hZGQoYXJndW1lbnRzW2VdKTtyZXR1cm4gdGhpc312YXIgaT10WzBdO3JldHVybiBpLmdldFBhcmVudCgpPyhpLm1vdmVUbyh0aGlzKSx0aGlzKToodGhpcy5fdmFsaWRhdGVBZGQoaSksaS5pbmRleD10aGlzLmdldENoaWxkcmVuKCkubGVuZ3RoLGkucGFyZW50PXRoaXMsaS5fY2xlYXJDYWNoZXMoKSx0aGlzLmdldENoaWxkcmVuKCkucHVzaChpKSx0aGlzLl9maXJlKCJhZGQiLHtjaGlsZDppfSksdGhpcy5fcmVxdWVzdERyYXcoKSx0aGlzKX1kZXN0cm95KCl7cmV0dXJuIHRoaXMuaGFzQ2hpbGRyZW4oKSYmdGhpcy5kZXN0cm95Q2hpbGRyZW4oKSxzdXBlci5kZXN0cm95KCksdGhpc31maW5kKHQpe3JldHVybiB0aGlzLl9nZW5lcmFsRmluZCh0LCExKX1maW5kT25lKHQpe3ZhciBlPXRoaXMuX2dlbmVyYWxGaW5kKHQsITApO3JldHVybiBlLmxlbmd0aD4wP2VbMF06dm9pZCAwfV9nZW5lcmFsRmluZCh0LGUpe3ZhciBpPVtdO3JldHVybiB0aGlzLl9kZXNjZW5kYW50cygocj0+e2NvbnN0IGE9ci5faXNNYXRjaCh0KTtyZXR1cm4gYSYmaS5wdXNoKHIpLCEoIWF8fCFlKX0pKSxpfV9kZXNjZW5kYW50cyh0KXtsZXQgZT0hMTtjb25zdCBpPXRoaXMuZ2V0Q2hpbGRyZW4oKTtmb3IoY29uc3QgciBvZiBpKXtpZihlPXQociksZSlyZXR1cm4hMDtpZihyLmhhc0NoaWxkcmVuKCkmJihlPXIuX2Rlc2NlbmRhbnRzKHQpLGUpKXJldHVybiEwfXJldHVybiExfXRvT2JqZWN0KCl7dmFyIHQ9Sy5wcm90b3R5cGUudG9PYmplY3QuY2FsbCh0aGlzKTtyZXR1cm4gdC5jaGlsZHJlbj1bXSx0aGlzLmdldENoaWxkcmVuKCkuZm9yRWFjaCgoZT0+e3QuY2hpbGRyZW4ucHVzaChlLnRvT2JqZWN0KCkpfSkpLHR9aXNBbmNlc3Rvck9mKHQpe2Zvcih2YXIgZT10LmdldFBhcmVudCgpO2U7KXtpZihlLl9pZD09PXRoaXMuX2lkKXJldHVybiEwO2U9ZS5nZXRQYXJlbnQoKX1yZXR1cm4hMX1jbG9uZSh0KXt2YXIgZT1LLnByb3RvdHlwZS5jbG9uZS5jYWxsKHRoaXMsdCk7cmV0dXJuIHRoaXMuZ2V0Q2hpbGRyZW4oKS5mb3JFYWNoKChmdW5jdGlvbih0KXtlLmFkZCh0LmNsb25lKCkpfSkpLGV9Z2V0QWxsSW50ZXJzZWN0aW9ucyh0KXt2YXIgZT1bXTtyZXR1cm4gdGhpcy5maW5kKCJTaGFwZSIpLmZvckVhY2goKGZ1bmN0aW9uKGkpe2kuaXNWaXNpYmxlKCkmJmkuaW50ZXJzZWN0cyh0KSYmZS5wdXNoKGkpfSkpLGV9X2NsZWFyU2VsZkFuZERlc2NlbmRhbnRDYWNoZSh0KXt2YXIgZTtzdXBlci5fY2xlYXJTZWxmQW5kRGVzY2VuZGFudENhY2hlKHQpLHRoaXMuaXNDYWNoZWQoKXx8bnVsbD09PShlPXRoaXMuY2hpbGRyZW4pfHx2b2lkIDA9PT1lfHxlLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuX2NsZWFyU2VsZkFuZERlc2NlbmRhbnRDYWNoZSh0KX0pKX1fc2V0Q2hpbGRyZW5JbmRpY2VzKCl7dmFyIHQ7bnVsbD09PSh0PXRoaXMuY2hpbGRyZW4pfHx2b2lkIDA9PT10fHx0LmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7dC5pbmRleD1lfSkpLHRoaXMuX3JlcXVlc3REcmF3KCl9ZHJhd1NjZW5lKHQsZSl7dmFyIGk9dGhpcy5nZXRMYXllcigpLHI9dHx8aSYmaS5nZXRDYW52YXMoKSxhPXImJnIuZ2V0Q29udGV4dCgpLG49dGhpcy5fZ2V0Q2FudmFzQ2FjaGUoKSxzPW4mJm4uc2NlbmUsbz1yJiZyLmlzQ2FjaGU7aWYoIXRoaXMuaXNWaXNpYmxlKCkmJiFvKXJldHVybiB0aGlzO2lmKHMpe2Euc2F2ZSgpO3ZhciBoPXRoaXMuZ2V0QWJzb2x1dGVUcmFuc2Zvcm0oZSkuZ2V0TWF0cml4KCk7YS50cmFuc2Zvcm0oaFswXSxoWzFdLGhbMl0saFszXSxoWzRdLGhbNV0pLHRoaXMuX2RyYXdDYWNoZWRTY2VuZUNhbnZhcyhhKSxhLnJlc3RvcmUoKX1lbHNlIHRoaXMuX2RyYXdDaGlsZHJlbigiZHJhd1NjZW5lIixyLGUpO3JldHVybiB0aGlzfWRyYXdIaXQodCxlKXtpZighdGhpcy5zaG91bGREcmF3SGl0KGUpKXJldHVybiB0aGlzO3ZhciBpPXRoaXMuZ2V0TGF5ZXIoKSxyPXR8fGkmJmkuaGl0Q2FudmFzLGE9ciYmci5nZXRDb250ZXh0KCksbj10aGlzLl9nZXRDYW52YXNDYWNoZSgpO2lmKG4mJm4uaGl0KXthLnNhdmUoKTt2YXIgcz10aGlzLmdldEFic29sdXRlVHJhbnNmb3JtKGUpLmdldE1hdHJpeCgpO2EudHJhbnNmb3JtKHNbMF0sc1sxXSxzWzJdLHNbM10sc1s0XSxzWzVdKSx0aGlzLl9kcmF3Q2FjaGVkSGl0Q2FudmFzKGEpLGEucmVzdG9yZSgpfWVsc2UgdGhpcy5fZHJhd0NoaWxkcmVuKCJkcmF3SGl0IixyLGUpO3JldHVybiB0aGlzfV9kcmF3Q2hpbGRyZW4odCxlLGkpe3ZhciByLGE9ZSYmZS5nZXRDb250ZXh0KCksbj10aGlzLmNsaXBXaWR0aCgpLHM9dGhpcy5jbGlwSGVpZ2h0KCksbz10aGlzLmNsaXBGdW5jKCksaD1uJiZzfHxvO2NvbnN0IGw9aT09PXRoaXM7aWYoaCl7YS5zYXZlKCk7dmFyIGQ9dGhpcy5nZXRBYnNvbHV0ZVRyYW5zZm9ybShpKSxjPWQuZ2V0TWF0cml4KCk7aWYoYS50cmFuc2Zvcm0oY1swXSxjWzFdLGNbMl0sY1szXSxjWzRdLGNbNV0pLGEuYmVnaW5QYXRoKCksbylvLmNhbGwodGhpcyxhLHRoaXMpO2Vsc2V7dmFyIGc9dGhpcy5jbGlwWCgpLHU9dGhpcy5jbGlwWSgpO2EucmVjdChnLHUsbixzKX1hLmNsaXAoKSxjPWQuY29weSgpLmludmVydCgpLmdldE1hdHJpeCgpLGEudHJhbnNmb3JtKGNbMF0sY1sxXSxjWzJdLGNbM10sY1s0XSxjWzVdKX12YXIgZj0hbCYmInNvdXJjZS1vdmVyIiE9PXRoaXMuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uKCkmJiJkcmF3U2NlbmUiPT09dDtmJiYoYS5zYXZlKCksYS5fYXBwbHlHbG9iYWxDb21wb3NpdGVPcGVyYXRpb24odGhpcykpLG51bGw9PT0ocj10aGlzLmNoaWxkcmVuKXx8dm9pZCAwPT09cnx8ci5mb3JFYWNoKChmdW5jdGlvbihyKXtyW3RdKGUsaSl9KSksZiYmYS5yZXN0b3JlKCksaCYmYS5yZXN0b3JlKCl9Z2V0Q2xpZW50UmVjdCh0KXt2YXIgZSxpLHIsYSxuLHM9KHQ9dHx8e30pLnNraXBUcmFuc2Zvcm0sbz10LnJlbGF0aXZlVG8saD17eDoxLzAseToxLzAsd2lkdGg6MCxoZWlnaHQ6MH0sbD10aGlzO251bGw9PT0oZT10aGlzLmNoaWxkcmVuKXx8dm9pZCAwPT09ZXx8ZS5mb3JFYWNoKChmdW5jdGlvbihlKXtpZihlLnZpc2libGUoKSl7dmFyIHM9ZS5nZXRDbGllbnRSZWN0KHtyZWxhdGl2ZVRvOmwsc2tpcFNoYWRvdzp0LnNraXBTaGFkb3csc2tpcFN0cm9rZTp0LnNraXBTdHJva2V9KTswPT09cy53aWR0aCYmMD09PXMuaGVpZ2h0fHwodm9pZCAwPT09aT8oaT1zLngscj1zLnksYT1zLngrcy53aWR0aCxuPXMueStzLmhlaWdodCk6KGk9TWF0aC5taW4oaSxzLngpLHI9TWF0aC5taW4ocixzLnkpLGE9TWF0aC5tYXgoYSxzLngrcy53aWR0aCksbj1NYXRoLm1heChuLHMueStzLmhlaWdodCkpKX19KSk7Zm9yKHZhciBkPXRoaXMuZmluZCgiU2hhcGUiKSxjPSExLGc9MDtnPGQubGVuZ3RoO2crKyl7aWYoZFtnXS5faXNWaXNpYmxlKHRoaXMpKXtjPSEwO2JyZWFrfX1yZXR1cm4gaD1jJiZ2b2lkIDAhPT1pP3t4OmkseTpyLHdpZHRoOmEtaSxoZWlnaHQ6bi1yfTp7eDowLHk6MCx3aWR0aDowLGhlaWdodDowfSxzP2g6dGhpcy5fdHJhbnNmb3JtZWRSZWN0KGgsbyl9fXcuYWRkQ29tcG9uZW50c0dldHRlclNldHRlcihKLCJjbGlwIixbIngiLCJ5Iiwid2lkdGgiLCJoZWlnaHQiXSksdy5hZGRHZXR0ZXJTZXR0ZXIoSiwiY2xpcFgiLHZvaWQgMCxwKCkpLHcuYWRkR2V0dGVyU2V0dGVyKEosImNsaXBZIix2b2lkIDAscCgpKSx3LmFkZEdldHRlclNldHRlcihKLCJjbGlwV2lkdGgiLHZvaWQgMCxwKCkpLHcuYWRkR2V0dGVyU2V0dGVyKEosImNsaXBIZWlnaHQiLHZvaWQgMCxwKCkpLHcuYWRkR2V0dGVyU2V0dGVyKEosImNsaXBGdW5jIik7Y29uc3QgWj1uZXcgTWFwLCQ9dm9pZCAwIT09aS5fZ2xvYmFsLlBvaW50ZXJFdmVudDtmdW5jdGlvbiB0dCh0KXtyZXR1cm4gWi5nZXQodCl9ZnVuY3Rpb24gZXQodCl7cmV0dXJue2V2dDp0LHBvaW50ZXJJZDp0LnBvaW50ZXJJZH19ZnVuY3Rpb24gaXQodCxlKXtyZXR1cm4gWi5nZXQodCk9PT1lfWZ1bmN0aW9uIHJ0KHQsZSl7YXQodCk7ZS5nZXRTdGFnZSgpJiYoWi5zZXQodCxlKSwkJiZlLl9maXJlKCJnb3Rwb2ludGVyY2FwdHVyZSIsZXQobmV3IFBvaW50ZXJFdmVudCgiZ290cG9pbnRlcmNhcHR1cmUiKSkpKX1mdW5jdGlvbiBhdCh0LGUpe2NvbnN0IGk9Wi5nZXQodCk7aWYoIWkpcmV0dXJuO2NvbnN0IHI9aS5nZXRTdGFnZSgpO3ImJnIuY29udGVudCxaLmRlbGV0ZSh0KSwkJiZpLl9maXJlKCJsb3N0cG9pbnRlcmNhcHR1cmUiLGV0KG5ldyBQb2ludGVyRXZlbnQoImxvc3Rwb2ludGVyY2FwdHVyZSIpKSl9dmFyIG50PSJtb3VzZWxlYXZlIixzdD0ibW91c2VvdmVyIixvdD0ibW91c2VlbnRlciIsaHQ9Im1vdXNlbW92ZSIsbHQ9Im1vdXNlZG93biIsZHQ9Im1vdXNldXAiLGN0PSJwb2ludGVybW92ZSIsZ3Q9InBvaW50ZXJkb3duIix1dD0icG9pbnRlcnVwIixmdD0icG9pbnRlcmNhbmNlbCIscHQ9InBvaW50ZXJvdXQiLHZ0PSJwb2ludGVybGVhdmUiLG10PSJwb2ludGVyb3ZlciIsX3Q9InBvaW50ZXJlbnRlciIseXQ9ImNvbnRleHRtZW51Iix4dD0idG91Y2hzdGFydCIsYnQ9InRvdWNoZW5kIixTdD0idG91Y2htb3ZlIix3dD0idG91Y2hjYW5jZWwiLEN0PSJ3aGVlbCIsa3Q9W1tvdCwiX3BvaW50ZXJlbnRlciJdLFtsdCwiX3BvaW50ZXJkb3duIl0sW2h0LCJfcG9pbnRlcm1vdmUiXSxbZHQsIl9wb2ludGVydXAiXSxbbnQsIl9wb2ludGVybGVhdmUiXSxbeHQsIl9wb2ludGVyZG93biJdLFtTdCwiX3BvaW50ZXJtb3ZlIl0sW2J0LCJfcG9pbnRlcnVwIl0sW3d0LCJfcG9pbnRlcmNhbmNlbCJdLFtzdCwiX3BvaW50ZXJvdmVyIl0sW0N0LCJfd2hlZWwiXSxbeXQsIl9jb250ZXh0bWVudSJdLFtndCwiX3BvaW50ZXJkb3duIl0sW2N0LCJfcG9pbnRlcm1vdmUiXSxbdXQsIl9wb2ludGVydXAiXSxbZnQsIl9wb2ludGVyY2FuY2VsIl0sWyJsb3N0cG9pbnRlcmNhcHR1cmUiLCJfbG9zdHBvaW50ZXJjYXB0dXJlIl1dO2NvbnN0IFB0PXttb3VzZTp7W3B0XToibW91c2VvdXQiLFt2dF06bnQsW210XTpzdCxbX3RdOm90LFtjdF06aHQsW2d0XTpsdCxbdXRdOmR0LFtmdF06Im1vdXNlY2FuY2VsIixwb2ludGVyY2xpY2s6ImNsaWNrIixwb2ludGVyZGJsY2xpY2s6ImRibGNsaWNrIn0sdG91Y2g6e1twdF06InRvdWNob3V0IixbdnRdOiJ0b3VjaGxlYXZlIixbbXRdOiJ0b3VjaG92ZXIiLFtfdF06InRvdWNoZW50ZXIiLFtjdF06U3QsW2d0XTp4dCxbdXRdOmJ0LFtmdF06d3QscG9pbnRlcmNsaWNrOiJ0YXAiLHBvaW50ZXJkYmxjbGljazoiZGJsdGFwIn0scG9pbnRlcjp7W3B0XTpwdCxbdnRdOnZ0LFttdF06bXQsW190XTpfdCxbY3RdOmN0LFtndF06Z3QsW3V0XTp1dCxbZnRdOmZ0LHBvaW50ZXJjbGljazoicG9pbnRlcmNsaWNrIixwb2ludGVyZGJsY2xpY2s6InBvaW50ZXJkYmxjbGljayJ9fSxUdD10PT50LmluZGV4T2YoInBvaW50ZXIiKT49MD8icG9pbnRlciI6dC5pbmRleE9mKCJ0b3VjaCIpPj0wPyJ0b3VjaCI6Im1vdXNlIixBdD10PT57Y29uc3QgZT1UdCh0KTtyZXR1cm4icG9pbnRlciI9PT1lP2kucG9pbnRlckV2ZW50c0VuYWJsZWQmJlB0LnBvaW50ZXI6InRvdWNoIj09PWU/UHQudG91Y2g6Im1vdXNlIj09PWU/UHQubW91c2U6dm9pZCAwfTtmdW5jdGlvbiBNdCh0PXt9KXtyZXR1cm4odC5jbGlwRnVuY3x8dC5jbGlwV2lkdGh8fHQuY2xpcEhlaWdodCkmJmcud2FybigiU3RhZ2UgZG9lcyBub3Qgc3VwcG9ydCBjbGlwcGluZy4gUGxlYXNlIHVzZSBjbGlwIGZvciBMYXllcnMgb3IgR3JvdXBzLiIpLHR9Y29uc3QgR3Q9W107Y2xhc3MgRXQgZXh0ZW5kcyBKe2NvbnN0cnVjdG9yKHQpe3N1cGVyKE10KHQpKSx0aGlzLl9wb2ludGVyUG9zaXRpb25zPVtdLHRoaXMuX2NoYW5nZWRQb2ludGVyUG9zaXRpb25zPVtdLHRoaXMuX2J1aWxkRE9NKCksdGhpcy5fYmluZENvbnRlbnRFdmVudHMoKSxHdC5wdXNoKHRoaXMpLHRoaXMub24oIndpZHRoQ2hhbmdlLmtvbnZhIGhlaWdodENoYW5nZS5rb252YSIsdGhpcy5fcmVzaXplRE9NKSx0aGlzLm9uKCJ2aXNpYmxlQ2hhbmdlLmtvbnZhIix0aGlzLl9jaGVja1Zpc2liaWxpdHkpLHRoaXMub24oImNsaXBXaWR0aENoYW5nZS5rb252YSBjbGlwSGVpZ2h0Q2hhbmdlLmtvbnZhIGNsaXBGdW5jQ2hhbmdlLmtvbnZhIiwoKCk9PntNdCh0aGlzLmF0dHJzKX0pKSx0aGlzLl9jaGVja1Zpc2liaWxpdHkoKX1fdmFsaWRhdGVBZGQodCl7Y29uc3QgZT0iTGF5ZXIiPT09dC5nZXRUeXBlKCksaT0iRmFzdExheWVyIj09PXQuZ2V0VHlwZSgpO2V8fGl8fGcudGhyb3coIllvdSBtYXkgb25seSBhZGQgbGF5ZXJzIHRvIHRoZSBzdGFnZS4iKX1fY2hlY2tWaXNpYmlsaXR5KCl7aWYoIXRoaXMuY29udGVudClyZXR1cm47Y29uc3QgdD10aGlzLnZpc2libGUoKT8iIjoibm9uZSI7dGhpcy5jb250ZW50LnN0eWxlLmRpc3BsYXk9dH1zZXRDb250YWluZXIodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtpZigiLiI9PT10LmNoYXJBdCgwKSl7dmFyIGU9dC5zbGljZSgxKTt0PWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZSlbMF19ZWxzZXt2YXIgaTtpPSIjIiE9PXQuY2hhckF0KDApP3Q6dC5zbGljZSgxKSx0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGkpfWlmKCF0KXRocm93IkNhbiBub3QgZmluZCBjb250YWluZXIgaW4gZG9jdW1lbnQgd2l0aCBpZCAiK2l9cmV0dXJuIHRoaXMuX3NldEF0dHIoImNvbnRhaW5lciIsdCksdGhpcy5jb250ZW50JiYodGhpcy5jb250ZW50LnBhcmVudEVsZW1lbnQmJnRoaXMuY29udGVudC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMuY29udGVudCksdC5hcHBlbmRDaGlsZCh0aGlzLmNvbnRlbnQpKSx0aGlzfXNob3VsZERyYXdIaXQoKXtyZXR1cm4hMH1jbGVhcigpe3ZhciB0LGU9dGhpcy5jaGlsZHJlbixpPWUubGVuZ3RoO2Zvcih0PTA7dDxpO3QrKyllW3RdLmNsZWFyKCk7cmV0dXJuIHRoaXN9Y2xvbmUodCl7cmV0dXJuIHR8fCh0PXt9KSx0LmNvbnRhaW5lcj0idW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiZkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxKLnByb3RvdHlwZS5jbG9uZS5jYWxsKHRoaXMsdCl9ZGVzdHJveSgpe3N1cGVyLmRlc3Ryb3koKTt2YXIgdD10aGlzLmNvbnRlbnQ7dCYmZy5faXNJbkRvY3VtZW50KHQpJiZ0aGlzLmNvbnRhaW5lcigpLnJlbW92ZUNoaWxkKHQpO3ZhciBlPUd0LmluZGV4T2YodGhpcyk7cmV0dXJuIGU+LTEmJkd0LnNwbGljZShlLDEpLHRoaXN9Z2V0UG9pbnRlclBvc2l0aW9uKCl7Y29uc3QgdD10aGlzLl9wb2ludGVyUG9zaXRpb25zWzBdfHx0aGlzLl9jaGFuZ2VkUG9pbnRlclBvc2l0aW9uc1swXTtyZXR1cm4gdD97eDp0LngseTp0Lnl9OihnLndhcm4oIlBvaW50ZXIgcG9zaXRpb24gaXMgbWlzc2luZyBhbmQgbm90IHJlZ2lzdGVyZWQgYnkgdGhlIHN0YWdlLiBMb29rcyBsaWtlIGl0IGlzIG91dHNpZGUgb2YgdGhlIHN0YWdlIGNvbnRhaW5lci4gWW91IGNhbiBzZXQgaXQgbWFudWFsbHkgZnJvbSBldmVudDogc3RhZ2Uuc2V0UG9pbnRlcnNQb3NpdGlvbnMoZXZlbnQpOyIpLG51bGwpfV9nZXRQb2ludGVyQnlJZCh0KXtyZXR1cm4gdGhpcy5fcG9pbnRlclBvc2l0aW9ucy5maW5kKChlPT5lLmlkPT09dCkpfWdldFBvaW50ZXJzUG9zaXRpb25zKCl7cmV0dXJuIHRoaXMuX3BvaW50ZXJQb3NpdGlvbnN9Z2V0U3RhZ2UoKXtyZXR1cm4gdGhpc31nZXRDb250ZW50KCl7cmV0dXJuIHRoaXMuY29udGVudH1fdG9Lb252YUNhbnZhcyh0KXsodD10fHx7fSkueD10Lnh8fDAsdC55PXQueXx8MCx0LndpZHRoPXQud2lkdGh8fHRoaXMud2lkdGgoKSx0LmhlaWdodD10LmhlaWdodHx8dGhpcy5oZWlnaHQoKTt2YXIgZT1uZXcgRSh7d2lkdGg6dC53aWR0aCxoZWlnaHQ6dC5oZWlnaHQscGl4ZWxSYXRpbzp0LnBpeGVsUmF0aW98fDF9KSxpPWUuZ2V0Q29udGV4dCgpLl9jb250ZXh0LHI9dGhpcy5jaGlsZHJlbjtyZXR1cm4odC54fHx0LnkpJiZpLnRyYW5zbGF0ZSgtMSp0LngsLTEqdC55KSxyLmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKGUuaXNWaXNpYmxlKCkpe3ZhciByPWUuX3RvS29udmFDYW52YXModCk7aS5kcmF3SW1hZ2Uoci5fY2FudmFzLHQueCx0Lnksci5nZXRXaWR0aCgpL3IuZ2V0UGl4ZWxSYXRpbygpLHIuZ2V0SGVpZ2h0KCkvci5nZXRQaXhlbFJhdGlvKCkpfX0pKSxlfWdldEludGVyc2VjdGlvbih0KXtpZighdClyZXR1cm4gbnVsbDt2YXIgZSxpPXRoaXMuY2hpbGRyZW47Zm9yKGU9aS5sZW5ndGgtMTtlPj0wO2UtLSl7Y29uc3Qgcj1pW2VdLmdldEludGVyc2VjdGlvbih0KTtpZihyKXJldHVybiByfXJldHVybiBudWxsfV9yZXNpemVET00oKXt2YXIgdD10aGlzLndpZHRoKCksZT10aGlzLmhlaWdodCgpO3RoaXMuY29udGVudCYmKHRoaXMuY29udGVudC5zdHlsZS53aWR0aD10KyJweCIsdGhpcy5jb250ZW50LnN0eWxlLmhlaWdodD1lKyJweCIpLHRoaXMuYnVmZmVyQ2FudmFzLnNldFNpemUodCxlKSx0aGlzLmJ1ZmZlckhpdENhbnZhcy5zZXRTaXplKHQsZSksdGhpcy5jaGlsZHJlbi5mb3JFYWNoKChpPT57aS5zZXRTaXplKHt3aWR0aDp0LGhlaWdodDplfSksaS5kcmF3KCl9KSl9YWRkKHQsLi4uZSl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXtmb3IodmFyIHI9MDtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKXRoaXMuYWRkKGFyZ3VtZW50c1tyXSk7cmV0dXJuIHRoaXN9c3VwZXIuYWRkKHQpO3ZhciBhPXRoaXMuY2hpbGRyZW4ubGVuZ3RoO3JldHVybiBhPjUmJmcud2FybigiVGhlIHN0YWdlIGhhcyAiK2ErIiBsYXllcnMuIFJlY29tbWVuZGVkIG1heGltdW0gbnVtYmVyIG9mIGxheWVycyBpcyAzLTUuIEFkZGluZyBtb3JlIGxheWVycyBpbnRvIHRoZSBzdGFnZSBtYXkgZHJvcCB0aGUgcGVyZm9ybWFuY2UuIFJldGhpbmsgeW91ciB0cmVlIHN0cnVjdHVyZSwgeW91IGNhbiB1c2UgS29udmEuR3JvdXAuIiksdC5zZXRTaXplKHt3aWR0aDp0aGlzLndpZHRoKCksaGVpZ2h0OnRoaXMuaGVpZ2h0KCl9KSx0LmRyYXcoKSxpLmlzQnJvd3NlciYmdGhpcy5jb250ZW50LmFwcGVuZENoaWxkKHQuY2FudmFzLl9jYW52YXMpLHRoaXN9Z2V0UGFyZW50KCl7cmV0dXJuIG51bGx9Z2V0TGF5ZXIoKXtyZXR1cm4gbnVsbH1oYXNQb2ludGVyQ2FwdHVyZSh0KXtyZXR1cm4gaXQodCx0aGlzKX1zZXRQb2ludGVyQ2FwdHVyZSh0KXtydCh0LHRoaXMpfXJlbGVhc2VDYXB0dXJlKHQpe2F0KHQpfWdldExheWVycygpe3JldHVybiB0aGlzLmNoaWxkcmVufV9iaW5kQ29udGVudEV2ZW50cygpe2kuaXNCcm93c2VyJiZrdC5mb3JFYWNoKCgoW3QsZV0pPT57dGhpcy5jb250ZW50LmFkZEV2ZW50TGlzdGVuZXIodCwodD0+e3RoaXNbZV0odCl9KSl9KSl9X3BvaW50ZXJlbnRlcih0KXt0aGlzLnNldFBvaW50ZXJzUG9zaXRpb25zKHQpO2NvbnN0IGU9QXQodC50eXBlKTt0aGlzLl9maXJlKGUucG9pbnRlcmVudGVyLHtldnQ6dCx0YXJnZXQ6dGhpcyxjdXJyZW50VGFyZ2V0OnRoaXN9KX1fcG9pbnRlcm92ZXIodCl7dGhpcy5zZXRQb2ludGVyc1Bvc2l0aW9ucyh0KTtjb25zdCBlPUF0KHQudHlwZSk7dGhpcy5fZmlyZShlLnBvaW50ZXJvdmVyLHtldnQ6dCx0YXJnZXQ6dGhpcyxjdXJyZW50VGFyZ2V0OnRoaXN9KX1fZ2V0VGFyZ2V0U2hhcGUodCl7bGV0IGU9dGhpc1t0KyJ0YXJnZXRTaGFwZSJdO3JldHVybiBlJiYhZS5nZXRTdGFnZSgpJiYoZT1udWxsKSxlfV9wb2ludGVybGVhdmUodCl7Y29uc3QgZT1BdCh0LnR5cGUpLHI9VHQodC50eXBlKTtpZihlKXt0aGlzLnNldFBvaW50ZXJzUG9zaXRpb25zKHQpO3ZhciBhPXRoaXMuX2dldFRhcmdldFNoYXBlKHIpLG49IUwuaXNEcmFnZ2luZ3x8aS5oaXRPbkRyYWdFbmFibGVkO2EmJm4/KGEuX2ZpcmVBbmRCdWJibGUoZS5wb2ludGVyb3V0LHtldnQ6dH0pLGEuX2ZpcmVBbmRCdWJibGUoZS5wb2ludGVybGVhdmUse2V2dDp0fSksdGhpcy5fZmlyZShlLnBvaW50ZXJsZWF2ZSx7ZXZ0OnQsdGFyZ2V0OnRoaXMsY3VycmVudFRhcmdldDp0aGlzfSksdGhpc1tyKyJ0YXJnZXRTaGFwZSJdPW51bGwpOm4mJih0aGlzLl9maXJlKGUucG9pbnRlcmxlYXZlLHtldnQ6dCx0YXJnZXQ6dGhpcyxjdXJyZW50VGFyZ2V0OnRoaXN9KSx0aGlzLl9maXJlKGUucG9pbnRlcm91dCx7ZXZ0OnQsdGFyZ2V0OnRoaXMsY3VycmVudFRhcmdldDp0aGlzfSkpLHRoaXMucG9pbnRlclBvcz12b2lkIDAsdGhpcy5fcG9pbnRlclBvc2l0aW9ucz1bXX19X3BvaW50ZXJkb3duKHQpe2NvbnN0IGU9QXQodC50eXBlKSxyPVR0KHQudHlwZSk7aWYoZSl7dGhpcy5zZXRQb2ludGVyc1Bvc2l0aW9ucyh0KTt2YXIgYT0hMTt0aGlzLl9jaGFuZ2VkUG9pbnRlclBvc2l0aW9ucy5mb3JFYWNoKChuPT57dmFyIHM9dGhpcy5nZXRJbnRlcnNlY3Rpb24obik7TC5qdXN0RHJhZ2dlZD0hMSxpWyJfIityKyJMaXN0ZW5DbGljayJdPSEwO2lmKCEocyYmcy5pc0xpc3RlbmluZygpKSlyZXR1cm47aS5jYXB0dXJlUG9pbnRlckV2ZW50c0VuYWJsZWQmJnMuc2V0UG9pbnRlckNhcHR1cmUobi5pZCksdGhpc1tyKyJDbGlja1N0YXJ0U2hhcGUiXT1zLHMuX2ZpcmVBbmRCdWJibGUoZS5wb2ludGVyZG93bix7ZXZ0OnQscG9pbnRlcklkOm4uaWR9KSxhPSEwO2NvbnN0IG89dC50eXBlLmluZGV4T2YoInRvdWNoIik+PTA7cy5wcmV2ZW50RGVmYXVsdCgpJiZ0LmNhbmNlbGFibGUmJm8mJnQucHJldmVudERlZmF1bHQoKX0pKSxhfHx0aGlzLl9maXJlKGUucG9pbnRlcmRvd24se2V2dDp0LHRhcmdldDp0aGlzLGN1cnJlbnRUYXJnZXQ6dGhpcyxwb2ludGVySWQ6dGhpcy5fcG9pbnRlclBvc2l0aW9uc1swXS5pZH0pfX1fcG9pbnRlcm1vdmUodCl7Y29uc3QgZT1BdCh0LnR5cGUpLHI9VHQodC50eXBlKTtpZighZSlyZXR1cm47aWYoTC5pc0RyYWdnaW5nJiZMLm5vZGUucHJldmVudERlZmF1bHQoKSYmdC5jYW5jZWxhYmxlJiZ0LnByZXZlbnREZWZhdWx0KCksdGhpcy5zZXRQb2ludGVyc1Bvc2l0aW9ucyh0KSwhKCFMLmlzRHJhZ2dpbmd8fGkuaGl0T25EcmFnRW5hYmxlZCkpcmV0dXJuO3ZhciBhPXt9O2xldCBuPSExO3ZhciBzPXRoaXMuX2dldFRhcmdldFNoYXBlKHIpO3RoaXMuX2NoYW5nZWRQb2ludGVyUG9zaXRpb25zLmZvckVhY2goKGk9Pntjb25zdCBvPXR0KGkuaWQpfHx0aGlzLmdldEludGVyc2VjdGlvbihpKSxoPWkuaWQsbD17ZXZ0OnQscG9pbnRlcklkOmh9O3ZhciBkPXMhPT1vO2lmKGQmJnMmJihzLl9maXJlQW5kQnViYmxlKGUucG9pbnRlcm91dCxPYmplY3QuYXNzaWduKHt9LGwpLG8pLHMuX2ZpcmVBbmRCdWJibGUoZS5wb2ludGVybGVhdmUsT2JqZWN0LmFzc2lnbih7fSxsKSxvKSksbyl7aWYoYVtvLl9pZF0pcmV0dXJuO2Fbby5faWRdPSEwfW8mJm8uaXNMaXN0ZW5pbmcoKT8obj0hMCxkJiYoby5fZmlyZUFuZEJ1YmJsZShlLnBvaW50ZXJvdmVyLE9iamVjdC5hc3NpZ24oe30sbCkscyksby5fZmlyZUFuZEJ1YmJsZShlLnBvaW50ZXJlbnRlcixPYmplY3QuYXNzaWduKHt9LGwpLHMpLHRoaXNbcisidGFyZ2V0U2hhcGUiXT1vKSxvLl9maXJlQW5kQnViYmxlKGUucG9pbnRlcm1vdmUsT2JqZWN0LmFzc2lnbih7fSxsKSkpOnMmJih0aGlzLl9maXJlKGUucG9pbnRlcm92ZXIse2V2dDp0LHRhcmdldDp0aGlzLGN1cnJlbnRUYXJnZXQ6dGhpcyxwb2ludGVySWQ6aH0pLHRoaXNbcisidGFyZ2V0U2hhcGUiXT1udWxsKX0pKSxufHx0aGlzLl9maXJlKGUucG9pbnRlcm1vdmUse2V2dDp0LHRhcmdldDp0aGlzLGN1cnJlbnRUYXJnZXQ6dGhpcyxwb2ludGVySWQ6dGhpcy5fY2hhbmdlZFBvaW50ZXJQb3NpdGlvbnNbMF0uaWR9KX1fcG9pbnRlcnVwKHQpe2NvbnN0IGU9QXQodC50eXBlKSxyPVR0KHQudHlwZSk7aWYoIWUpcmV0dXJuO3RoaXMuc2V0UG9pbnRlcnNQb3NpdGlvbnModCk7Y29uc3QgYT10aGlzW3IrIkNsaWNrU3RhcnRTaGFwZSJdLG49dGhpc1tyKyJDbGlja0VuZFNoYXBlIl07dmFyIHM9e307bGV0IG89ITE7dGhpcy5fY2hhbmdlZFBvaW50ZXJQb3NpdGlvbnMuZm9yRWFjaCgoaD0+e2NvbnN0IGw9dHQoaC5pZCl8fHRoaXMuZ2V0SW50ZXJzZWN0aW9uKGgpO2lmKGwpe2lmKGwucmVsZWFzZUNhcHR1cmUoaC5pZCksc1tsLl9pZF0pcmV0dXJuO3NbbC5faWRdPSEwfWNvbnN0IGQ9aC5pZCxjPXtldnQ6dCxwb2ludGVySWQ6ZH07bGV0IGc9ITE7aVsiXyIrcisiSW5EYmxDbGlja1dpbmRvdyJdJiZpWyJfIityKyJJbkRibENsaWNrV2luZG93SWQiXT09PWQ/KGc9ITAsY2xlYXJUaW1lb3V0KHRoaXNbcisiRGJsVGltZW91dCJdKSk6TC5qdXN0RHJhZ2dlZHx8KGlbIl8iK3IrIkluRGJsQ2xpY2tXaW5kb3ciXT0hMCxpWyJfIityKyJJbkRibENsaWNrV2luZG93SWQiXT1kLGNsZWFyVGltZW91dCh0aGlzW3IrIkRibFRpbWVvdXQiXSkpLHRoaXNbcisiRGJsVGltZW91dCJdPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aVsiXyIrcisiSW5EYmxDbGlja1dpbmRvdyJdPSExfSksaS5kYmxDbGlja1dpbmRvdyksbCYmbC5pc0xpc3RlbmluZygpPyhvPSEwLHRoaXNbcisiQ2xpY2tFbmRTaGFwZSJdPWwsbC5fZmlyZUFuZEJ1YmJsZShlLnBvaW50ZXJ1cCxPYmplY3QuYXNzaWduKHt9LGMpKSxpWyJfIityKyJMaXN0ZW5DbGljayJdJiZhJiZhPT09bCYmKGwuX2ZpcmVBbmRCdWJibGUoZS5wb2ludGVyY2xpY2ssT2JqZWN0LmFzc2lnbih7fSxjKSksZyYmbiYmbj09PWwmJmwuX2ZpcmVBbmRCdWJibGUoZS5wb2ludGVyZGJsY2xpY2ssT2JqZWN0LmFzc2lnbih7fSxjKSkpKToodGhpc1tyKyJDbGlja0VuZFNoYXBlIl09bnVsbCxpWyJfIityKyJMaXN0ZW5DbGljayJdJiZ0aGlzLl9maXJlKGUucG9pbnRlcmNsaWNrLHtldnQ6dCx0YXJnZXQ6dGhpcyxjdXJyZW50VGFyZ2V0OnRoaXMscG9pbnRlcklkOmR9KSxnJiZ0aGlzLl9maXJlKGUucG9pbnRlcmRibGNsaWNrLHtldnQ6dCx0YXJnZXQ6dGhpcyxjdXJyZW50VGFyZ2V0OnRoaXMscG9pbnRlcklkOmR9KSl9KSksb3x8dGhpcy5fZmlyZShlLnBvaW50ZXJ1cCx7ZXZ0OnQsdGFyZ2V0OnRoaXMsY3VycmVudFRhcmdldDp0aGlzLHBvaW50ZXJJZDp0aGlzLl9jaGFuZ2VkUG9pbnRlclBvc2l0aW9uc1swXS5pZH0pLGlbIl8iK3IrIkxpc3RlbkNsaWNrIl09ITEsdC5jYW5jZWxhYmxlJiZ0LnByZXZlbnREZWZhdWx0KCl9X2NvbnRleHRtZW51KHQpe3RoaXMuc2V0UG9pbnRlcnNQb3NpdGlvbnModCk7dmFyIGU9dGhpcy5nZXRJbnRlcnNlY3Rpb24odGhpcy5nZXRQb2ludGVyUG9zaXRpb24oKSk7ZSYmZS5pc0xpc3RlbmluZygpP2UuX2ZpcmVBbmRCdWJibGUoeXQse2V2dDp0fSk6dGhpcy5fZmlyZSh5dCx7ZXZ0OnQsdGFyZ2V0OnRoaXMsY3VycmVudFRhcmdldDp0aGlzfSl9X3doZWVsKHQpe3RoaXMuc2V0UG9pbnRlcnNQb3NpdGlvbnModCk7dmFyIGU9dGhpcy5nZXRJbnRlcnNlY3Rpb24odGhpcy5nZXRQb2ludGVyUG9zaXRpb24oKSk7ZSYmZS5pc0xpc3RlbmluZygpP2UuX2ZpcmVBbmRCdWJibGUoQ3Qse2V2dDp0fSk6dGhpcy5fZmlyZShDdCx7ZXZ0OnQsdGFyZ2V0OnRoaXMsY3VycmVudFRhcmdldDp0aGlzfSl9X3BvaW50ZXJjYW5jZWwodCl7dGhpcy5zZXRQb2ludGVyc1Bvc2l0aW9ucyh0KTtjb25zdCBlPXR0KHQucG9pbnRlcklkKXx8dGhpcy5nZXRJbnRlcnNlY3Rpb24odGhpcy5nZXRQb2ludGVyUG9zaXRpb24oKSk7ZSYmZS5fZmlyZUFuZEJ1YmJsZSh1dCxldCh0KSksYXQodC5wb2ludGVySWQpfV9sb3N0cG9pbnRlcmNhcHR1cmUodCl7YXQodC5wb2ludGVySWQpfXNldFBvaW50ZXJzUG9zaXRpb25zKHQpe3ZhciBlPXRoaXMuX2dldENvbnRlbnRQb3NpdGlvbigpLGk9bnVsbCxyPW51bGw7dm9pZCAwIT09KHQ9dHx8d2luZG93LmV2ZW50KS50b3VjaGVzPyh0aGlzLl9wb2ludGVyUG9zaXRpb25zPVtdLHRoaXMuX2NoYW5nZWRQb2ludGVyUG9zaXRpb25zPVtdLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodC50b3VjaGVzLCh0PT57dGhpcy5fcG9pbnRlclBvc2l0aW9ucy5wdXNoKHtpZDp0LmlkZW50aWZpZXIseDoodC5jbGllbnRYLWUubGVmdCkvZS5zY2FsZVgseToodC5jbGllbnRZLWUudG9wKS9lLnNjYWxlWX0pfSkpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodC5jaGFuZ2VkVG91Y2hlc3x8dC50b3VjaGVzLCh0PT57dGhpcy5fY2hhbmdlZFBvaW50ZXJQb3NpdGlvbnMucHVzaCh7aWQ6dC5pZGVudGlmaWVyLHg6KHQuY2xpZW50WC1lLmxlZnQpL2Uuc2NhbGVYLHk6KHQuY2xpZW50WS1lLnRvcCkvZS5zY2FsZVl9KX0pKSk6KGk9KHQuY2xpZW50WC1lLmxlZnQpL2Uuc2NhbGVYLHI9KHQuY2xpZW50WS1lLnRvcCkvZS5zY2FsZVksdGhpcy5wb2ludGVyUG9zPXt4OmkseTpyfSx0aGlzLl9wb2ludGVyUG9zaXRpb25zPVt7eDppLHk6cixpZDpnLl9nZXRGaXJzdFBvaW50ZXJJZCh0KX1dLHRoaXMuX2NoYW5nZWRQb2ludGVyUG9zaXRpb25zPVt7eDppLHk6cixpZDpnLl9nZXRGaXJzdFBvaW50ZXJJZCh0KX1dKX1fc2V0UG9pbnRlclBvc2l0aW9uKHQpe2cud2FybignTWV0aG9kIF9zZXRQb2ludGVyUG9zaXRpb24gaXMgZGVwcmVjYXRlZC4gVXNlICJzdGFnZS5zZXRQb2ludGVyc1Bvc2l0aW9ucyhldmVudCkiIGluc3RlYWQuJyksdGhpcy5zZXRQb2ludGVyc1Bvc2l0aW9ucyh0KX1fZ2V0Q29udGVudFBvc2l0aW9uKCl7aWYoIXRoaXMuY29udGVudHx8IXRoaXMuY29udGVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJue3RvcDowLGxlZnQ6MCxzY2FsZVg6MSxzY2FsZVk6MX07dmFyIHQ9dGhpcy5jb250ZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybnt0b3A6dC50b3AsbGVmdDp0LmxlZnQsc2NhbGVYOnQud2lkdGgvdGhpcy5jb250ZW50LmNsaWVudFdpZHRofHwxLHNjYWxlWTp0LmhlaWdodC90aGlzLmNvbnRlbnQuY2xpZW50SGVpZ2h0fHwxfX1fYnVpbGRET00oKXtpZih0aGlzLmJ1ZmZlckNhbnZhcz1uZXcgRSh7d2lkdGg6dGhpcy53aWR0aCgpLGhlaWdodDp0aGlzLmhlaWdodCgpfSksdGhpcy5idWZmZXJIaXRDYW52YXM9bmV3IFIoe3BpeGVsUmF0aW86MSx3aWR0aDp0aGlzLndpZHRoKCksaGVpZ2h0OnRoaXMuaGVpZ2h0KCl9KSxpLmlzQnJvd3Nlcil7dmFyIHQ9dGhpcy5jb250YWluZXIoKTtpZighdCl0aHJvdyJTdGFnZSBoYXMgbm8gY29udGFpbmVyLiBBIGNvbnRhaW5lciBpcyByZXF1aXJlZC4iO3QuaW5uZXJIVE1MPSIiLHRoaXMuY29udGVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbnRlbnQuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIix0aGlzLmNvbnRlbnQuc3R5bGUudXNlclNlbGVjdD0ibm9uZSIsdGhpcy5jb250ZW50LmNsYXNzTmFtZT0ia29udmFqcy1jb250ZW50Iix0aGlzLmNvbnRlbnQuc2V0QXR0cmlidXRlKCJyb2xlIiwicHJlc2VudGF0aW9uIiksdC5hcHBlbmRDaGlsZCh0aGlzLmNvbnRlbnQpLHRoaXMuX3Jlc2l6ZURPTSgpfX1jYWNoZSgpe3JldHVybiBnLndhcm4oIkNhY2hlIGZ1bmN0aW9uIGlzIG5vdCBhbGxvd2VkIGZvciBzdGFnZS4gWW91IG1heSB1c2UgY2FjaGUgb25seSBmb3IgbGF5ZXJzLCBncm91cHMgYW5kIHNoYXBlcy4iKSx0aGlzfWNsZWFyQ2FjaGUoKXtyZXR1cm4gdGhpc31iYXRjaERyYXcoKXtyZXR1cm4gdGhpcy5nZXRDaGlsZHJlbigpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuYmF0Y2hEcmF3KCl9KSksdGhpc319RXQucHJvdG90eXBlLm5vZGVUeXBlPSJTdGFnZSIscihFdCksdy5hZGRHZXR0ZXJTZXR0ZXIoRXQsImNvbnRhaW5lciIpO3ZhciBSdD0iaGFzU2hhZG93IixMdD0ic2hhZG93UkdCQSIsRHQ9InBhdHRlcm5JbWFnZSIsT3Q9ImxpbmVhckdyYWRpZW50IixJdD0icmFkaWFsR3JhZGllbnQiO2xldCBGdDtmdW5jdGlvbiBOdCgpe3JldHVybiBGdHx8KEZ0PWcuY3JlYXRlQ2FudmFzRWxlbWVudCgpLmdldENvbnRleHQoIjJkIiksRnQpfWNvbnN0IEJ0PXt9O2NsYXNzIHp0IGV4dGVuZHMgS3tjb25zdHJ1Y3Rvcih0KXtsZXQgZTtmb3Ioc3VwZXIodCk7ZT1nLmdldFJhbmRvbUNvbG9yKCksIWV8fGUgaW4gQnQ7KTt0aGlzLmNvbG9yS2V5PWUsQnRbZV09dGhpc31nZXRDb250ZXh0KCl7cmV0dXJuIGcud2Fybigic2hhcGUuZ2V0Q29udGV4dCgpIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2UgZG8gbm90IHVzZSBpdC4iKSx0aGlzLmdldExheWVyKCkuZ2V0Q29udGV4dCgpfWdldENhbnZhcygpe3JldHVybiBnLndhcm4oInNoYXBlLmdldENhbnZhcygpIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2UgZG8gbm90IHVzZSBpdC4iKSx0aGlzLmdldExheWVyKCkuZ2V0Q2FudmFzKCl9Z2V0U2NlbmVGdW5jKCl7cmV0dXJuIHRoaXMuYXR0cnMuc2NlbmVGdW5jfHx0aGlzLl9zY2VuZUZ1bmN9Z2V0SGl0RnVuYygpe3JldHVybiB0aGlzLmF0dHJzLmhpdEZ1bmN8fHRoaXMuX2hpdEZ1bmN9aGFzU2hhZG93KCl7cmV0dXJuIHRoaXMuX2dldENhY2hlKFJ0LHRoaXMuX2hhc1NoYWRvdyl9X2hhc1NoYWRvdygpe3JldHVybiB0aGlzLnNoYWRvd0VuYWJsZWQoKSYmMCE9PXRoaXMuc2hhZG93T3BhY2l0eSgpJiYhISh0aGlzLnNoYWRvd0NvbG9yKCl8fHRoaXMuc2hhZG93Qmx1cigpfHx0aGlzLnNoYWRvd09mZnNldFgoKXx8dGhpcy5zaGFkb3dPZmZzZXRZKCkpfV9nZXRGaWxsUGF0dGVybigpe3JldHVybiB0aGlzLl9nZXRDYWNoZShEdCx0aGlzLl9fZ2V0RmlsbFBhdHRlcm4pfV9fZ2V0RmlsbFBhdHRlcm4oKXtpZih0aGlzLmZpbGxQYXR0ZXJuSW1hZ2UoKSl7Y29uc3QgdD1OdCgpLmNyZWF0ZVBhdHRlcm4odGhpcy5maWxsUGF0dGVybkltYWdlKCksdGhpcy5maWxsUGF0dGVyblJlcGVhdCgpfHwicmVwZWF0Iik7aWYodCYmdC5zZXRUcmFuc2Zvcm0pe2NvbnN0IGU9bmV3IGE7ZS50cmFuc2xhdGUodGhpcy5maWxsUGF0dGVyblgoKSx0aGlzLmZpbGxQYXR0ZXJuWSgpKSxlLnJvdGF0ZShpLmdldEFuZ2xlKHRoaXMuZmlsbFBhdHRlcm5Sb3RhdGlvbigpKSksZS5zY2FsZSh0aGlzLmZpbGxQYXR0ZXJuU2NhbGVYKCksdGhpcy5maWxsUGF0dGVyblNjYWxlWSgpKSxlLnRyYW5zbGF0ZSgtMSp0aGlzLmZpbGxQYXR0ZXJuT2Zmc2V0WCgpLC0xKnRoaXMuZmlsbFBhdHRlcm5PZmZzZXRZKCkpO2NvbnN0IHI9ZS5nZXRNYXRyaXgoKTt0LnNldFRyYW5zZm9ybSh7YTpyWzBdLGI6clsxXSxjOnJbMl0sZDpyWzNdLGU6cls0XSxmOnJbNV19KX1yZXR1cm4gdH19X2dldExpbmVhckdyYWRpZW50KCl7cmV0dXJuIHRoaXMuX2dldENhY2hlKE90LHRoaXMuX19nZXRMaW5lYXJHcmFkaWVudCl9X19nZXRMaW5lYXJHcmFkaWVudCgpe3ZhciB0PXRoaXMuZmlsbExpbmVhckdyYWRpZW50Q29sb3JTdG9wcygpO2lmKHQpe2Zvcih2YXIgZT1OdCgpLGk9dGhpcy5maWxsTGluZWFyR3JhZGllbnRTdGFydFBvaW50KCkscj10aGlzLmZpbGxMaW5lYXJHcmFkaWVudEVuZFBvaW50KCksYT1lLmNyZWF0ZUxpbmVhckdyYWRpZW50KGkueCxpLnksci54LHIueSksbj0wO248dC5sZW5ndGg7bis9MilhLmFkZENvbG9yU3RvcCh0W25dLHRbbisxXSk7cmV0dXJuIGF9fV9nZXRSYWRpYWxHcmFkaWVudCgpe3JldHVybiB0aGlzLl9nZXRDYWNoZShJdCx0aGlzLl9fZ2V0UmFkaWFsR3JhZGllbnQpfV9fZ2V0UmFkaWFsR3JhZGllbnQoKXt2YXIgdD10aGlzLmZpbGxSYWRpYWxHcmFkaWVudENvbG9yU3RvcHMoKTtpZih0KXtmb3IodmFyIGU9TnQoKSxpPXRoaXMuZmlsbFJhZGlhbEdyYWRpZW50U3RhcnRQb2ludCgpLHI9dGhpcy5maWxsUmFkaWFsR3JhZGllbnRFbmRQb2ludCgpLGE9ZS5jcmVhdGVSYWRpYWxHcmFkaWVudChpLngsaS55LHRoaXMuZmlsbFJhZGlhbEdyYWRpZW50U3RhcnRSYWRpdXMoKSxyLngsci55LHRoaXMuZmlsbFJhZGlhbEdyYWRpZW50RW5kUmFkaXVzKCkpLG49MDtuPHQubGVuZ3RoO24rPTIpYS5hZGRDb2xvclN0b3AodFtuXSx0W24rMV0pO3JldHVybiBhfX1nZXRTaGFkb3dSR0JBKCl7cmV0dXJuIHRoaXMuX2dldENhY2hlKEx0LHRoaXMuX2dldFNoYWRvd1JHQkEpfV9nZXRTaGFkb3dSR0JBKCl7aWYodGhpcy5oYXNTaGFkb3coKSl7dmFyIHQ9Zy5jb2xvclRvUkdCQSh0aGlzLnNoYWRvd0NvbG9yKCkpO3JldHVybiJyZ2JhKCIrdC5yKyIsIit0LmcrIiwiK3QuYisiLCIrdC5hKih0aGlzLnNoYWRvd09wYWNpdHkoKXx8MSkrIikifX1oYXNGaWxsKCl7cmV0dXJuIHRoaXMuX2NhbGN1bGF0ZSgiaGFzRmlsbCIsWyJmaWxsRW5hYmxlZCIsImZpbGwiLCJmaWxsUGF0dGVybkltYWdlIiwiZmlsbExpbmVhckdyYWRpZW50Q29sb3JTdG9wcyIsImZpbGxSYWRpYWxHcmFkaWVudENvbG9yU3RvcHMiXSwoKCk9PnRoaXMuZmlsbEVuYWJsZWQoKSYmISEodGhpcy5maWxsKCl8fHRoaXMuZmlsbFBhdHRlcm5JbWFnZSgpfHx0aGlzLmZpbGxMaW5lYXJHcmFkaWVudENvbG9yU3RvcHMoKXx8dGhpcy5maWxsUmFkaWFsR3JhZGllbnRDb2xvclN0b3BzKCkpKSl9aGFzU3Ryb2tlKCl7cmV0dXJuIHRoaXMuX2NhbGN1bGF0ZSgiaGFzU3Ryb2tlIixbInN0cm9rZUVuYWJsZWQiLCJzdHJva2VXaWR0aCIsInN0cm9rZSIsInN0cm9rZUxpbmVhckdyYWRpZW50Q29sb3JTdG9wcyJdLCgoKT0+dGhpcy5zdHJva2VFbmFibGVkKCkmJnRoaXMuc3Ryb2tlV2lkdGgoKSYmISghdGhpcy5zdHJva2UoKSYmIXRoaXMuc3Ryb2tlTGluZWFyR3JhZGllbnRDb2xvclN0b3BzKCkpKSl9aGFzSGl0U3Ryb2tlKCl7Y29uc3QgdD10aGlzLmhpdFN0cm9rZVdpZHRoKCk7cmV0dXJuImF1dG8iPT09dD90aGlzLmhhc1N0cm9rZSgpOnRoaXMuc3Ryb2tlRW5hYmxlZCgpJiYhIXR9aW50ZXJzZWN0cyh0KXt2YXIgZT10aGlzLmdldFN0YWdlKCkuYnVmZmVySGl0Q2FudmFzO3JldHVybiBlLmdldENvbnRleHQoKS5jbGVhcigpLHRoaXMuZHJhd0hpdChlLG51bGwsITApLGUuY29udGV4dC5nZXRJbWFnZURhdGEoTWF0aC5yb3VuZCh0LngpLE1hdGgucm91bmQodC55KSwxLDEpLmRhdGFbM10+MH1kZXN0cm95KCl7cmV0dXJuIEsucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKSxkZWxldGUgQnRbdGhpcy5jb2xvcktleV0sZGVsZXRlIHRoaXMuY29sb3JLZXksdGhpc31fdXNlQnVmZmVyQ2FudmFzKHQpe3ZhciBlO2lmKCF0aGlzLmdldFN0YWdlKCkpcmV0dXJuITE7aWYoIShudWxsPT09KGU9dGhpcy5hdHRycy5wZXJmZWN0RHJhd0VuYWJsZWQpfHx2b2lkIDA9PT1lfHxlKSlyZXR1cm4hMTtjb25zdCBpPXR8fHRoaXMuaGFzRmlsbCgpLHI9dGhpcy5oYXNTdHJva2UoKSxhPTEhPT10aGlzLmdldEFic29sdXRlT3BhY2l0eSgpO2lmKGkmJnImJmEpcmV0dXJuITA7Y29uc3Qgbj10aGlzLmhhc1NoYWRvdygpLHM9dGhpcy5zaGFkb3dGb3JTdHJva2VFbmFibGVkKCk7cmV0dXJuISEoaSYmciYmbiYmcyl9c2V0U3Ryb2tlSGl0RW5hYmxlZCh0KXtnLndhcm4oInN0cm9rZUhpdEVuYWJsZWQgcHJvcGVydHkgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBoaXRTdHJva2VXaWR0aCBpbnN0ZWFkLiIpLHQ/dGhpcy5oaXRTdHJva2VXaWR0aCgiYXV0byIpOnRoaXMuaGl0U3Ryb2tlV2lkdGgoMCl9Z2V0U3Ryb2tlSGl0RW5hYmxlZCgpe3JldHVybiAwIT09dGhpcy5oaXRTdHJva2VXaWR0aCgpfWdldFNlbGZSZWN0KCl7dmFyIHQ9dGhpcy5zaXplKCk7cmV0dXJue3g6dGhpcy5fY2VudHJvaWQ/LXQud2lkdGgvMjowLHk6dGhpcy5fY2VudHJvaWQ/LXQuaGVpZ2h0LzI6MCx3aWR0aDp0LndpZHRoLGhlaWdodDp0LmhlaWdodH19Z2V0Q2xpZW50UmVjdCh0PXt9KXtjb25zdCBlPXQuc2tpcFRyYW5zZm9ybSxpPXQucmVsYXRpdmVUbyxyPXRoaXMuZ2V0U2VsZlJlY3QoKSxhPSF0LnNraXBTdHJva2UmJnRoaXMuaGFzU3Ryb2tlKCkmJnRoaXMuc3Ryb2tlV2lkdGgoKXx8MCxuPXIud2lkdGgrYSxzPXIuaGVpZ2h0K2Esbz0hdC5za2lwU2hhZG93JiZ0aGlzLmhhc1NoYWRvdygpLGg9bz90aGlzLnNoYWRvd09mZnNldFgoKTowLGw9bz90aGlzLnNoYWRvd09mZnNldFkoKTowLGQ9bitNYXRoLmFicyhoKSxjPXMrTWF0aC5hYnMobCksZz1vJiZ0aGlzLnNoYWRvd0JsdXIoKXx8MCx1PWQrMipnLGY9YysyKmc7bGV0IHA9MDtNYXRoLnJvdW5kKGEvMikhPT1hLzImJihwPTEpO2NvbnN0IHY9e3dpZHRoOnUrcCxoZWlnaHQ6ZitwLHg6LU1hdGgucm91bmQoYS8yK2cpK01hdGgubWluKGgsMCkrci54LHk6LU1hdGgucm91bmQoYS8yK2cpK01hdGgubWluKGwsMCkrci55fTtyZXR1cm4gZT92OnRoaXMuX3RyYW5zZm9ybWVkUmVjdCh2LGkpfWRyYXdTY2VuZSh0LGUpe3ZhciBpLHIsYT10aGlzLmdldExheWVyKCksbj10fHxhLmdldENhbnZhcygpLHM9bi5nZXRDb250ZXh0KCksbz10aGlzLl9nZXRDYW52YXNDYWNoZSgpLGg9dGhpcy5nZXRTY2VuZUZ1bmMoKSxsPXRoaXMuaGFzU2hhZG93KCksZD1uLmlzQ2FjaGUsYz1lPT09dGhpcztpZighdGhpcy5pc1Zpc2libGUoKSYmIWMpcmV0dXJuIHRoaXM7aWYobyl7cy5zYXZlKCk7dmFyIGc9dGhpcy5nZXRBYnNvbHV0ZVRyYW5zZm9ybShlKS5nZXRNYXRyaXgoKTtyZXR1cm4gcy50cmFuc2Zvcm0oZ1swXSxnWzFdLGdbMl0sZ1szXSxnWzRdLGdbNV0pLHRoaXMuX2RyYXdDYWNoZWRTY2VuZUNhbnZhcyhzKSxzLnJlc3RvcmUoKSx0aGlzfWlmKCFoKXJldHVybiB0aGlzO2lmKHMuc2F2ZSgpLHRoaXMuX3VzZUJ1ZmZlckNhbnZhcygpJiYhZCl7KHI9KGk9dGhpcy5nZXRTdGFnZSgpLmJ1ZmZlckNhbnZhcykuZ2V0Q29udGV4dCgpKS5jbGVhcigpLHIuc2F2ZSgpLHIuX2FwcGx5TGluZUpvaW4odGhpcyk7dmFyIHU9dGhpcy5nZXRBYnNvbHV0ZVRyYW5zZm9ybShlKS5nZXRNYXRyaXgoKTtyLnRyYW5zZm9ybSh1WzBdLHVbMV0sdVsyXSx1WzNdLHVbNF0sdVs1XSksaC5jYWxsKHRoaXMscix0aGlzKSxyLnJlc3RvcmUoKTt2YXIgZj1pLnBpeGVsUmF0aW87bCYmcy5fYXBwbHlTaGFkb3codGhpcykscy5fYXBwbHlPcGFjaXR5KHRoaXMpLHMuX2FwcGx5R2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uKHRoaXMpLHMuZHJhd0ltYWdlKGkuX2NhbnZhcywwLDAsaS53aWR0aC9mLGkuaGVpZ2h0L2YpfWVsc2V7aWYocy5fYXBwbHlMaW5lSm9pbih0aGlzKSwhYyl7dT10aGlzLmdldEFic29sdXRlVHJhbnNmb3JtKGUpLmdldE1hdHJpeCgpO3MudHJhbnNmb3JtKHVbMF0sdVsxXSx1WzJdLHVbM10sdVs0XSx1WzVdKSxzLl9hcHBseU9wYWNpdHkodGhpcykscy5fYXBwbHlHbG9iYWxDb21wb3NpdGVPcGVyYXRpb24odGhpcyl9bCYmcy5fYXBwbHlTaGFkb3codGhpcyksaC5jYWxsKHRoaXMscyx0aGlzKX1yZXR1cm4gcy5yZXN0b3JlKCksdGhpc31kcmF3SGl0KHQsZSxpPSExKXtpZighdGhpcy5zaG91bGREcmF3SGl0KGUsaSkpcmV0dXJuIHRoaXM7dmFyIHI9dGhpcy5nZXRMYXllcigpLGE9dHx8ci5oaXRDYW52YXMsbj1hJiZhLmdldENvbnRleHQoKSxzPXRoaXMuaGl0RnVuYygpfHx0aGlzLnNjZW5lRnVuYygpLG89dGhpcy5fZ2V0Q2FudmFzQ2FjaGUoKSxoPW8mJm8uaGl0O2lmKHRoaXMuY29sb3JLZXl8fGcud2FybigiTG9va3MgbGlrZSB5b3VyIGNhbnZhcyBoYXMgYSBkZXN0cm95ZWQgc2hhcGUgaW4gaXQuIERvIG5vdCByZXVzZSBzaGFwZSBhZnRlciB5b3UgZGVzdHJveWVkIGl0LiBJZiB5b3Ugd2FudCB0byByZXVzZSBzaGFwZSB5b3Ugc2hvdWxkIGNhbGwgcmVtb3ZlKCkgaW5zdGVhZCBvZiBkZXN0cm95KCkiKSxoKXtuLnNhdmUoKTt2YXIgbD10aGlzLmdldEFic29sdXRlVHJhbnNmb3JtKGUpLmdldE1hdHJpeCgpO3JldHVybiBuLnRyYW5zZm9ybShsWzBdLGxbMV0sbFsyXSxsWzNdLGxbNF0sbFs1XSksdGhpcy5fZHJhd0NhY2hlZEhpdENhbnZhcyhuKSxuLnJlc3RvcmUoKSx0aGlzfWlmKCFzKXJldHVybiB0aGlzO24uc2F2ZSgpLG4uX2FwcGx5TGluZUpvaW4odGhpcyk7aWYoISh0aGlzPT09ZSkpe3ZhciBkPXRoaXMuZ2V0QWJzb2x1dGVUcmFuc2Zvcm0oZSkuZ2V0TWF0cml4KCk7bi50cmFuc2Zvcm0oZFswXSxkWzFdLGRbMl0sZFszXSxkWzRdLGRbNV0pfXJldHVybiBzLmNhbGwodGhpcyxuLHRoaXMpLG4ucmVzdG9yZSgpLHRoaXN9ZHJhd0hpdEZyb21DYWNoZSh0PTApe3ZhciBlLGkscixhLG4scz10aGlzLl9nZXRDYW52YXNDYWNoZSgpLG89dGhpcy5fZ2V0Q2FjaGVkU2NlbmVDYW52YXMoKSxoPXMuaGl0LGw9aC5nZXRDb250ZXh0KCksZD1oLmdldFdpZHRoKCksYz1oLmdldEhlaWdodCgpO2wuY2xlYXIoKSxsLmRyYXdJbWFnZShvLl9jYW52YXMsMCwwLGQsYyk7dHJ5e2ZvcihyPShpPShlPWwuZ2V0SW1hZ2VEYXRhKDAsMCxkLGMpKS5kYXRhKS5sZW5ndGgsYT1nLl9oZXhUb1JnYih0aGlzLmNvbG9yS2V5KSxuPTA7bjxyO24rPTQpaVtuKzNdPnQ/KGlbbl09YS5yLGlbbisxXT1hLmcsaVtuKzJdPWEuYixpW24rM109MjU1KTppW24rM109MDtsLnB1dEltYWdlRGF0YShlLDAsMCl9Y2F0Y2godCl7Zy5lcnJvcigiVW5hYmxlIHRvIGRyYXcgaGl0IGdyYXBoIGZyb20gY2FjaGVkIHNjZW5lIGNhbnZhcy4gIit0Lm1lc3NhZ2UpfXJldHVybiB0aGlzfWhhc1BvaW50ZXJDYXB0dXJlKHQpe3JldHVybiBpdCh0LHRoaXMpfXNldFBvaW50ZXJDYXB0dXJlKHQpe3J0KHQsdGhpcyl9cmVsZWFzZUNhcHR1cmUodCl7YXQodCl9fXp0LnByb3RvdHlwZS5fZmlsbEZ1bmM9ZnVuY3Rpb24odCl7dC5maWxsKCl9LHp0LnByb3RvdHlwZS5fc3Ryb2tlRnVuYz1mdW5jdGlvbih0KXt0LnN0cm9rZSgpfSx6dC5wcm90b3R5cGUuX2ZpbGxGdW5jSGl0PWZ1bmN0aW9uKHQpe3QuZmlsbCgpfSx6dC5wcm90b3R5cGUuX3N0cm9rZUZ1bmNIaXQ9ZnVuY3Rpb24odCl7dC5zdHJva2UoKX0senQucHJvdG90eXBlLl9jZW50cm9pZD0hMSx6dC5wcm90b3R5cGUubm9kZVR5cGU9IlNoYXBlIixyKHp0KSx6dC5wcm90b3R5cGUuZXZlbnRMaXN0ZW5lcnM9e30senQucHJvdG90eXBlLm9uLmNhbGwoenQucHJvdG90eXBlLCJzaGFkb3dDb2xvckNoYW5nZS5rb252YSBzaGFkb3dCbHVyQ2hhbmdlLmtvbnZhIHNoYWRvd09mZnNldENoYW5nZS5rb252YSBzaGFkb3dPcGFjaXR5Q2hhbmdlLmtvbnZhIHNoYWRvd0VuYWJsZWRDaGFuZ2Uua29udmEiLChmdW5jdGlvbigpe3RoaXMuX2NsZWFyQ2FjaGUoUnQpfSkpLHp0LnByb3RvdHlwZS5vbi5jYWxsKHp0LnByb3RvdHlwZSwic2hhZG93Q29sb3JDaGFuZ2Uua29udmEgc2hhZG93T3BhY2l0eUNoYW5nZS5rb252YSBzaGFkb3dFbmFibGVkQ2hhbmdlLmtvbnZhIiwoZnVuY3Rpb24oKXt0aGlzLl9jbGVhckNhY2hlKEx0KX0pKSx6dC5wcm90b3R5cGUub24uY2FsbCh6dC5wcm90b3R5cGUsImZpbGxQcmlvcml0eUNoYW5nZS5rb252YSBmaWxsUGF0dGVybkltYWdlQ2hhbmdlLmtvbnZhIGZpbGxQYXR0ZXJuUmVwZWF0Q2hhbmdlLmtvbnZhIGZpbGxQYXR0ZXJuU2NhbGVYQ2hhbmdlLmtvbnZhIGZpbGxQYXR0ZXJuU2NhbGVZQ2hhbmdlLmtvbnZhIGZpbGxQYXR0ZXJuT2Zmc2V0WENoYW5nZS5rb252YSBmaWxsUGF0dGVybk9mZnNldFlDaGFuZ2Uua29udmEgZmlsbFBhdHRlcm5YQ2hhbmdlLmtvbnZhIGZpbGxQYXR0ZXJuWUNoYW5nZS5rb252YSBmaWxsUGF0dGVyblJvdGF0aW9uQ2hhbmdlLmtvbnZhIiwoZnVuY3Rpb24oKXt0aGlzLl9jbGVhckNhY2hlKER0KX0pKSx6dC5wcm90b3R5cGUub24uY2FsbCh6dC5wcm90b3R5cGUsImZpbGxQcmlvcml0eUNoYW5nZS5rb252YSBmaWxsTGluZWFyR3JhZGllbnRDb2xvclN0b3BzQ2hhbmdlLmtvbnZhIGZpbGxMaW5lYXJHcmFkaWVudFN0YXJ0UG9pbnRYQ2hhbmdlLmtvbnZhIGZpbGxMaW5lYXJHcmFkaWVudFN0YXJ0UG9pbnRZQ2hhbmdlLmtvbnZhIGZpbGxMaW5lYXJHcmFkaWVudEVuZFBvaW50WENoYW5nZS5rb252YSBmaWxsTGluZWFyR3JhZGllbnRFbmRQb2ludFlDaGFuZ2Uua29udmEiLChmdW5jdGlvbigpe3RoaXMuX2NsZWFyQ2FjaGUoT3QpfSkpLHp0LnByb3RvdHlwZS5vbi5jYWxsKHp0LnByb3RvdHlwZSwiZmlsbFByaW9yaXR5Q2hhbmdlLmtvbnZhIGZpbGxSYWRpYWxHcmFkaWVudENvbG9yU3RvcHNDaGFuZ2Uua29udmEgZmlsbFJhZGlhbEdyYWRpZW50U3RhcnRQb2ludFhDaGFuZ2Uua29udmEgZmlsbFJhZGlhbEdyYWRpZW50U3RhcnRQb2ludFlDaGFuZ2Uua29udmEgZmlsbFJhZGlhbEdyYWRpZW50RW5kUG9pbnRYQ2hhbmdlLmtvbnZhIGZpbGxSYWRpYWxHcmFkaWVudEVuZFBvaW50WUNoYW5nZS5rb252YSBmaWxsUmFkaWFsR3JhZGllbnRTdGFydFJhZGl1c0NoYW5nZS5rb252YSBmaWxsUmFkaWFsR3JhZGllbnRFbmRSYWRpdXNDaGFuZ2Uua29udmEiLChmdW5jdGlvbigpe3RoaXMuX2NsZWFyQ2FjaGUoSXQpfSkpLHcuYWRkR2V0dGVyU2V0dGVyKHp0LCJzdHJva2UiLHZvaWQgMCx5KCkpLHcuYWRkR2V0dGVyU2V0dGVyKHp0LCJzdHJva2VXaWR0aCIsMixwKCkpLHcuYWRkR2V0dGVyU2V0dGVyKHp0LCJmaWxsQWZ0ZXJTdHJva2VFbmFibGVkIiwhMSksdy5hZGRHZXR0ZXJTZXR0ZXIoenQsImhpdFN0cm9rZVdpZHRoIiwiYXV0byIsbSgpKSx3LmFkZEdldHRlclNldHRlcih6dCwic3Ryb2tlSGl0RW5hYmxlZCIsITAseCgpKSx3LmFkZEdldHRlclNldHRlcih6dCwicGVyZmVjdERyYXdFbmFibGVkIiwhMCx4KCkpLHcuYWRkR2V0dGVyU2V0dGVyKHp0LCJzaGFkb3dGb3JTdHJva2VFbmFibGVkIiwhMCx4KCkpLHcuYWRkR2V0dGVyU2V0dGVyKHp0LCJsaW5lSm9pbiIpLHcuYWRkR2V0dGVyU2V0dGVyKHp0LCJsaW5lQ2FwIiksdy5hZGRHZXR0ZXJTZXR0ZXIoenQsInNjZW5lRnVuYyIpLHcuYWRkR2V0dGVyU2V0dGVyKHp0LCJoaXRGdW5jIiksdy5hZGRHZXR0ZXJTZXR0ZXIoenQsImRhc2giKSx3LmFkZEdldHRlclNldHRlcih6dCwiZGFzaE9mZnNldCIsMCxwKCkpLHcuYWRkR2V0dGVyU2V0dGVyKHp0LCJzaGFkb3dDb2xvciIsdm9pZCAwLF8oKSksdy5hZGRHZXR0ZXJTZXR0ZXIoenQsInNoYWRvd0JsdXIiLDAscCgpKSx3LmFkZEdldHRlclNldHRlcih6dCwic2hhZG93T3BhY2l0eSIsMSxwKCkpLHcuYWRkQ29tcG9uZW50c0dldHRlclNldHRlcih6dCwic2hhZG93T2Zmc2V0IixbIngiLCJ5Il0pLHcuYWRkR2V0dGVyU2V0dGVyKHp0LCJzaGFkb3dPZmZzZXRYIiwwLHAoKSksdy5hZGRHZXR0ZXJTZXR0ZXIoenQsInNoYWRvd09mZnNldFkiLDAscCgpKSx3LmFkZEdldHRlclNldHRlcih6dCwiZmlsbFBhdHRlcm5JbWFnZSIpLHcuYWRkR2V0dGVyU2V0dGVyKHp0LCJmaWxsIix2b2lkIDAseSgpKSx3LmFkZEdldHRlclNldHRlcih6dCwiZmlsbFBhdHRlcm5YIiwwLHAoKSksdy5hZGRHZXR0ZXJTZXR0ZXIoenQsImZpbGxQYXR0ZXJuWSIsMCxwKCkpLHcuYWRkR2V0dGVyU2V0dGVyKHp0LCJmaWxsTGluZWFyR3JhZGllbnRDb2xvclN0b3BzIiksdy5hZGRHZXR0ZXJTZXR0ZXIoenQsInN0cm9rZUxpbmVhckdyYWRpZW50Q29sb3JTdG9wcyIpLHcuYWRkR2V0dGVyU2V0dGVyKHp0LCJmaWxsUmFkaWFsR3JhZGllbnRTdGFydFJhZGl1cyIsMCksdy5hZGRHZXR0ZXJTZXR0ZXIoenQsImZpbGxSYWRpYWxHcmFkaWVudEVuZFJhZGl1cyIsMCksdy5hZGRHZXR0ZXJTZXR0ZXIoenQsImZpbGxSYWRpYWxHcmFkaWVudENvbG9yU3RvcHMiKSx3LmFkZEdldHRlclNldHRlcih6dCwiZmlsbFBhdHRlcm5SZXBlYXQiLCJyZXBlYXQiKSx3LmFkZEdldHRlclNldHRlcih6dCwiZmlsbEVuYWJsZWQiLCEwKSx3LmFkZEdldHRlclNldHRlcih6dCwic3Ryb2tlRW5hYmxlZCIsITApLHcuYWRkR2V0dGVyU2V0dGVyKHp0LCJzaGFkb3dFbmFibGVkIiwhMCksdy5hZGRHZXR0ZXJTZXR0ZXIoenQsImRhc2hFbmFibGVkIiwhMCksdy5hZGRHZXR0ZXJTZXR0ZXIoenQsInN0cm9rZVNjYWxlRW5hYmxlZCIsITApLHcuYWRkR2V0dGVyU2V0dGVyKHp0LCJmaWxsUHJpb3JpdHkiLCJjb2xvciIpLHcuYWRkQ29tcG9uZW50c0dldHRlclNldHRlcih6dCwiZmlsbFBhdHRlcm5PZmZzZXQiLFsieCIsInkiXSksdy5hZGRHZXR0ZXJTZXR0ZXIoenQsImZpbGxQYXR0ZXJuT2Zmc2V0WCIsMCxwKCkpLHcuYWRkR2V0dGVyU2V0dGVyKHp0LCJmaWxsUGF0dGVybk9mZnNldFkiLDAscCgpKSx3LmFkZENvbXBvbmVudHNHZXR0ZXJTZXR0ZXIoenQsImZpbGxQYXR0ZXJuU2NhbGUiLFsieCIsInkiXSksdy5hZGRHZXR0ZXJTZXR0ZXIoenQsImZpbGxQYXR0ZXJuU2NhbGVYIiwxLHAoKSksdy5hZGRHZXR0ZXJTZXR0ZXIoenQsImZpbGxQYXR0ZXJuU2NhbGVZIiwxLHAoKSksdy5hZGRDb21wb25lbnRzR2V0dGVyU2V0dGVyKHp0LCJmaWxsTGluZWFyR3JhZGllbnRTdGFydFBvaW50IixbIngiLCJ5Il0pLHcuYWRkQ29tcG9uZW50c0dldHRlclNldHRlcih6dCwic3Ryb2tlTGluZWFyR3JhZGllbnRTdGFydFBvaW50IixbIngiLCJ5Il0pLHcuYWRkR2V0dGVyU2V0dGVyKHp0LCJmaWxsTGluZWFyR3JhZGllbnRTdGFydFBvaW50WCIsMCksdy5hZGRHZXR0ZXJTZXR0ZXIoenQsInN0cm9rZUxpbmVhckdyYWRpZW50U3RhcnRQb2ludFgiLDApLHcuYWRkR2V0dGVyU2V0dGVyKHp0LCJmaWxsTGluZWFyR3JhZGllbnRTdGFydFBvaW50WSIsMCksdy5hZGRHZXR0ZXJTZXR0ZXIoenQsInN0cm9rZUxpbmVhckdyYWRpZW50U3RhcnRQb2ludFkiLDApLHcuYWRkQ29tcG9uZW50c0dldHRlclNldHRlcih6dCwiZmlsbExpbmVhckdyYWRpZW50RW5kUG9pbnQiLFsieCIsInkiXSksdy5hZGRDb21wb25lbnRzR2V0dGVyU2V0dGVyKHp0LCJzdHJva2VMaW5lYXJHcmFkaWVudEVuZFBvaW50IixbIngiLCJ5Il0pLHcuYWRkR2V0dGVyU2V0dGVyKHp0LCJmaWxsTGluZWFyR3JhZGllbnRFbmRQb2ludFgiLDApLHcuYWRkR2V0dGVyU2V0dGVyKHp0LCJzdHJva2VMaW5lYXJHcmFkaWVudEVuZFBvaW50WCIsMCksdy5hZGRHZXR0ZXJTZXR0ZXIoenQsImZpbGxMaW5lYXJHcmFkaWVudEVuZFBvaW50WSIsMCksdy5hZGRHZXR0ZXJTZXR0ZXIoenQsInN0cm9rZUxpbmVhckdyYWRpZW50RW5kUG9pbnRZIiwwKSx3LmFkZENvbXBvbmVudHNHZXR0ZXJTZXR0ZXIoenQsImZpbGxSYWRpYWxHcmFkaWVudFN0YXJ0UG9pbnQiLFsieCIsInkiXSksdy5hZGRHZXR0ZXJTZXR0ZXIoenQsImZpbGxSYWRpYWxHcmFkaWVudFN0YXJ0UG9pbnRYIiwwKSx3LmFkZEdldHRlclNldHRlcih6dCwiZmlsbFJhZGlhbEdyYWRpZW50U3RhcnRQb2ludFkiLDApLHcuYWRkQ29tcG9uZW50c0dldHRlclNldHRlcih6dCwiZmlsbFJhZGlhbEdyYWRpZW50RW5kUG9pbnQiLFsieCIsInkiXSksdy5hZGRHZXR0ZXJTZXR0ZXIoenQsImZpbGxSYWRpYWxHcmFkaWVudEVuZFBvaW50WCIsMCksdy5hZGRHZXR0ZXJTZXR0ZXIoenQsImZpbGxSYWRpYWxHcmFkaWVudEVuZFBvaW50WSIsMCksdy5hZGRHZXR0ZXJTZXR0ZXIoenQsImZpbGxQYXR0ZXJuUm90YXRpb24iLDApLHcuYmFja0NvbXBhdCh6dCx7ZGFzaEFycmF5OiJkYXNoIixnZXREYXNoQXJyYXk6ImdldERhc2giLHNldERhc2hBcnJheToiZ2V0RGFzaCIsZHJhd0Z1bmM6InNjZW5lRnVuYyIsZ2V0RHJhd0Z1bmM6ImdldFNjZW5lRnVuYyIsc2V0RHJhd0Z1bmM6InNldFNjZW5lRnVuYyIsZHJhd0hpdEZ1bmM6ImhpdEZ1bmMiLGdldERyYXdIaXRGdW5jOiJnZXRIaXRGdW5jIixzZXREcmF3SGl0RnVuYzoic2V0SGl0RnVuYyJ9KTt2YXIgV3Q9W3t4OjAseTowfSx7eDotMSx5Oi0xfSx7eDoxLHk6LTF9LHt4OjEseToxfSx7eDotMSx5OjF9XSxIdD1XdC5sZW5ndGg7Y2xhc3MgWXQgZXh0ZW5kcyBKe2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMuY2FudmFzPW5ldyBFLHRoaXMuaGl0Q2FudmFzPW5ldyBSKHtwaXhlbFJhdGlvOjF9KSx0aGlzLl93YWl0aW5nRm9yRHJhdz0hMSx0aGlzLm9uKCJ2aXNpYmxlQ2hhbmdlLmtvbnZhIix0aGlzLl9jaGVja1Zpc2liaWxpdHkpLHRoaXMuX2NoZWNrVmlzaWJpbGl0eSgpLHRoaXMub24oImltYWdlU21vb3RoaW5nRW5hYmxlZENoYW5nZS5rb252YSIsdGhpcy5fc2V0U21vb3RoRW5hYmxlZCksdGhpcy5fc2V0U21vb3RoRW5hYmxlZCgpfWNyZWF0ZVBOR1N0cmVhbSgpe3JldHVybiB0aGlzLmNhbnZhcy5fY2FudmFzLmNyZWF0ZVBOR1N0cmVhbSgpfWdldENhbnZhcygpe3JldHVybiB0aGlzLmNhbnZhc31nZXROYXRpdmVDYW52YXNFbGVtZW50KCl7cmV0dXJuIHRoaXMuY2FudmFzLl9jYW52YXN9Z2V0SGl0Q2FudmFzKCl7cmV0dXJuIHRoaXMuaGl0Q2FudmFzfWdldENvbnRleHQoKXtyZXR1cm4gdGhpcy5nZXRDYW52YXMoKS5nZXRDb250ZXh0KCl9Y2xlYXIodCl7cmV0dXJuIHRoaXMuZ2V0Q29udGV4dCgpLmNsZWFyKHQpLHRoaXMuZ2V0SGl0Q2FudmFzKCkuZ2V0Q29udGV4dCgpLmNsZWFyKHQpLHRoaXN9c2V0WkluZGV4KHQpe3N1cGVyLnNldFpJbmRleCh0KTt2YXIgZT10aGlzLmdldFN0YWdlKCk7cmV0dXJuIGUmJmUuY29udGVudCYmKGUuY29udGVudC5yZW1vdmVDaGlsZCh0aGlzLmdldE5hdGl2ZUNhbnZhc0VsZW1lbnQoKSksdDxlLmNoaWxkcmVuLmxlbmd0aC0xP2UuY29udGVudC5pbnNlcnRCZWZvcmUodGhpcy5nZXROYXRpdmVDYW52YXNFbGVtZW50KCksZS5jaGlsZHJlblt0KzFdLmdldENhbnZhcygpLl9jYW52YXMpOmUuY29udGVudC5hcHBlbmRDaGlsZCh0aGlzLmdldE5hdGl2ZUNhbnZhc0VsZW1lbnQoKSkpLHRoaXN9bW92ZVRvVG9wKCl7Sy5wcm90b3R5cGUubW92ZVRvVG9wLmNhbGwodGhpcyk7dmFyIHQ9dGhpcy5nZXRTdGFnZSgpO3JldHVybiB0JiZ0LmNvbnRlbnQmJih0LmNvbnRlbnQucmVtb3ZlQ2hpbGQodGhpcy5nZXROYXRpdmVDYW52YXNFbGVtZW50KCkpLHQuY29udGVudC5hcHBlbmRDaGlsZCh0aGlzLmdldE5hdGl2ZUNhbnZhc0VsZW1lbnQoKSkpLCEwfW1vdmVVcCgpe2lmKCFLLnByb3RvdHlwZS5tb3ZlVXAuY2FsbCh0aGlzKSlyZXR1cm4hMTt2YXIgdD10aGlzLmdldFN0YWdlKCk7cmV0dXJuISghdHx8IXQuY29udGVudCkmJih0LmNvbnRlbnQucmVtb3ZlQ2hpbGQodGhpcy5nZXROYXRpdmVDYW52YXNFbGVtZW50KCkpLHRoaXMuaW5kZXg8dC5jaGlsZHJlbi5sZW5ndGgtMT90LmNvbnRlbnQuaW5zZXJ0QmVmb3JlKHRoaXMuZ2V0TmF0aXZlQ2FudmFzRWxlbWVudCgpLHQuY2hpbGRyZW5bdGhpcy5pbmRleCsxXS5nZXRDYW52YXMoKS5fY2FudmFzKTp0LmNvbnRlbnQuYXBwZW5kQ2hpbGQodGhpcy5nZXROYXRpdmVDYW52YXNFbGVtZW50KCkpLCEwKX1tb3ZlRG93bigpe2lmKEsucHJvdG90eXBlLm1vdmVEb3duLmNhbGwodGhpcykpe3ZhciB0PXRoaXMuZ2V0U3RhZ2UoKTtpZih0KXt2YXIgZT10LmNoaWxkcmVuO3QuY29udGVudCYmKHQuY29udGVudC5yZW1vdmVDaGlsZCh0aGlzLmdldE5hdGl2ZUNhbnZhc0VsZW1lbnQoKSksdC5jb250ZW50Lmluc2VydEJlZm9yZSh0aGlzLmdldE5hdGl2ZUNhbnZhc0VsZW1lbnQoKSxlW3RoaXMuaW5kZXgrMV0uZ2V0Q2FudmFzKCkuX2NhbnZhcykpfXJldHVybiEwfXJldHVybiExfW1vdmVUb0JvdHRvbSgpe2lmKEsucHJvdG90eXBlLm1vdmVUb0JvdHRvbS5jYWxsKHRoaXMpKXt2YXIgdD10aGlzLmdldFN0YWdlKCk7aWYodCl7dmFyIGU9dC5jaGlsZHJlbjt0LmNvbnRlbnQmJih0LmNvbnRlbnQucmVtb3ZlQ2hpbGQodGhpcy5nZXROYXRpdmVDYW52YXNFbGVtZW50KCkpLHQuY29udGVudC5pbnNlcnRCZWZvcmUodGhpcy5nZXROYXRpdmVDYW52YXNFbGVtZW50KCksZVsxXS5nZXRDYW52YXMoKS5fY2FudmFzKSl9cmV0dXJuITB9cmV0dXJuITF9Z2V0TGF5ZXIoKXtyZXR1cm4gdGhpc31yZW1vdmUoKXt2YXIgdD10aGlzLmdldE5hdGl2ZUNhbnZhc0VsZW1lbnQoKTtyZXR1cm4gSy5wcm90b3R5cGUucmVtb3ZlLmNhbGwodGhpcyksdCYmdC5wYXJlbnROb2RlJiZnLl9pc0luRG9jdW1lbnQodCkmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSx0aGlzfWdldFN0YWdlKCl7cmV0dXJuIHRoaXMucGFyZW50fXNldFNpemUoe3dpZHRoOnQsaGVpZ2h0OmV9KXtyZXR1cm4gdGhpcy5jYW52YXMuc2V0U2l6ZSh0LGUpLHRoaXMuaGl0Q2FudmFzLnNldFNpemUodCxlKSx0aGlzLl9zZXRTbW9vdGhFbmFibGVkKCksdGhpc31fdmFsaWRhdGVBZGQodCl7dmFyIGU9dC5nZXRUeXBlKCk7Ikdyb3VwIiE9PWUmJiJTaGFwZSIhPT1lJiZnLnRocm93KCJZb3UgbWF5IG9ubHkgYWRkIGdyb3VwcyBhbmQgc2hhcGVzIHRvIGEgbGF5ZXIuIil9X3RvS29udmFDYW52YXModCl7cmV0dXJuKHQ9dHx8e30pLndpZHRoPXQud2lkdGh8fHRoaXMuZ2V0V2lkdGgoKSx0LmhlaWdodD10LmhlaWdodHx8dGhpcy5nZXRIZWlnaHQoKSx0Lng9dm9pZCAwIT09dC54P3QueDp0aGlzLngoKSx0Lnk9dm9pZCAwIT09dC55P3QueTp0aGlzLnkoKSxLLnByb3RvdHlwZS5fdG9Lb252YUNhbnZhcy5jYWxsKHRoaXMsdCl9X2NoZWNrVmlzaWJpbGl0eSgpe2NvbnN0IHQ9dGhpcy52aXNpYmxlKCk7dGhpcy5jYW52YXMuX2NhbnZhcy5zdHlsZS5kaXNwbGF5PXQ/ImJsb2NrIjoibm9uZSJ9X3NldFNtb290aEVuYWJsZWQoKXt0aGlzLmdldENvbnRleHQoKS5fY29udGV4dC5pbWFnZVNtb290aGluZ0VuYWJsZWQ9dGhpcy5pbWFnZVNtb290aGluZ0VuYWJsZWQoKX1nZXRXaWR0aCgpe2lmKHRoaXMucGFyZW50KXJldHVybiB0aGlzLnBhcmVudC53aWR0aCgpfXNldFdpZHRoKCl7Zy53YXJuKCdDYW4gbm90IGNoYW5nZSB3aWR0aCBvZiBsYXllci4gVXNlICJzdGFnZS53aWR0aCh2YWx1ZSkiIGZ1bmN0aW9uIGluc3RlYWQuJyl9Z2V0SGVpZ2h0KCl7aWYodGhpcy5wYXJlbnQpcmV0dXJuIHRoaXMucGFyZW50LmhlaWdodCgpfXNldEhlaWdodCgpe2cud2FybignQ2FuIG5vdCBjaGFuZ2UgaGVpZ2h0IG9mIGxheWVyLiBVc2UgInN0YWdlLmhlaWdodCh2YWx1ZSkiIGZ1bmN0aW9uIGluc3RlYWQuJyl9YmF0Y2hEcmF3KCl7cmV0dXJuIHRoaXMuX3dhaXRpbmdGb3JEcmF3fHwodGhpcy5fd2FpdGluZ0ZvckRyYXc9ITAsZy5yZXF1ZXN0QW5pbUZyYW1lKCgoKT0+e3RoaXMuZHJhdygpLHRoaXMuX3dhaXRpbmdGb3JEcmF3PSExfSkpKSx0aGlzfWdldEludGVyc2VjdGlvbih0KXtpZighdGhpcy5pc0xpc3RlbmluZygpfHwhdGhpcy5pc1Zpc2libGUoKSlyZXR1cm4gbnVsbDtmb3IodmFyIGU9MSxpPSExOzspe2ZvcihsZXQgcj0wO3I8SHQ7cisrKXtjb25zdCBhPVd0W3JdLG49dGhpcy5fZ2V0SW50ZXJzZWN0aW9uKHt4OnQueCthLngqZSx5OnQueSthLnkqZX0pLHM9bi5zaGFwZTtpZihzKXJldHVybiBzO2lmKGk9ISFuLmFudGlhbGlhc2VkLCFuLmFudGlhbGlhc2VkKWJyZWFrfWlmKCFpKXJldHVybiBudWxsO2UrPTF9fV9nZXRJbnRlcnNlY3Rpb24odCl7Y29uc3QgZT10aGlzLmhpdENhbnZhcy5waXhlbFJhdGlvLGk9dGhpcy5oaXRDYW52YXMuY29udGV4dC5nZXRJbWFnZURhdGEoTWF0aC5yb3VuZCh0LngqZSksTWF0aC5yb3VuZCh0LnkqZSksMSwxKS5kYXRhLHI9aVszXTtpZigyNTU9PT1yKXtjb25zdCB0PWcuX3JnYlRvSGV4KGlbMF0saVsxXSxpWzJdKSxlPUJ0WyIjIit0XTtyZXR1cm4gZT97c2hhcGU6ZX06e2FudGlhbGlhc2VkOiEwfX1yZXR1cm4gcj4wP3thbnRpYWxpYXNlZDohMH06e319ZHJhd1NjZW5lKHQsZSl7dmFyIGk9dGhpcy5nZXRMYXllcigpLHI9dHx8aSYmaS5nZXRDYW52YXMoKTtyZXR1cm4gdGhpcy5fZmlyZSgiYmVmb3JlRHJhdyIse25vZGU6dGhpc30pLHRoaXMuY2xlYXJCZWZvcmVEcmF3KCkmJnIuZ2V0Q29udGV4dCgpLmNsZWFyKCksSi5wcm90b3R5cGUuZHJhd1NjZW5lLmNhbGwodGhpcyxyLGUpLHRoaXMuX2ZpcmUoImRyYXciLHtub2RlOnRoaXN9KSx0aGlzfWRyYXdIaXQodCxlKXt2YXIgaT10aGlzLmdldExheWVyKCkscj10fHxpJiZpLmhpdENhbnZhcztyZXR1cm4gaSYmaS5jbGVhckJlZm9yZURyYXcoKSYmaS5nZXRIaXRDYW52YXMoKS5nZXRDb250ZXh0KCkuY2xlYXIoKSxKLnByb3RvdHlwZS5kcmF3SGl0LmNhbGwodGhpcyxyLGUpLHRoaXN9ZW5hYmxlSGl0R3JhcGgoKXtyZXR1cm4gdGhpcy5oaXRHcmFwaEVuYWJsZWQoITApLHRoaXN9ZGlzYWJsZUhpdEdyYXBoKCl7cmV0dXJuIHRoaXMuaGl0R3JhcGhFbmFibGVkKCExKSx0aGlzfXNldEhpdEdyYXBoRW5hYmxlZCh0KXtnLndhcm4oImhpdEdyYXBoRW5hYmxlZCBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBsYXllci5saXN0ZW5pbmcoKSBpbnN0ZWFkLiIpLHRoaXMubGlzdGVuaW5nKHQpfWdldEhpdEdyYXBoRW5hYmxlZCh0KXtyZXR1cm4gZy53YXJuKCJoaXRHcmFwaEVuYWJsZWQgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgbGF5ZXIubGlzdGVuaW5nKCkgaW5zdGVhZC4iKSx0aGlzLmxpc3RlbmluZygpfXRvZ2dsZUhpdENhbnZhcygpe2lmKHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5jb250ZW50KXt2YXIgdD10aGlzLnBhcmVudDshIXRoaXMuaGl0Q2FudmFzLl9jYW52YXMucGFyZW50Tm9kZT90LmNvbnRlbnQucmVtb3ZlQ2hpbGQodGhpcy5oaXRDYW52YXMuX2NhbnZhcyk6dC5jb250ZW50LmFwcGVuZENoaWxkKHRoaXMuaGl0Q2FudmFzLl9jYW52YXMpfX19WXQucHJvdG90eXBlLm5vZGVUeXBlPSJMYXllciIscihZdCksdy5hZGRHZXR0ZXJTZXR0ZXIoWXQsImltYWdlU21vb3RoaW5nRW5hYmxlZCIsITApLHcuYWRkR2V0dGVyU2V0dGVyKFl0LCJjbGVhckJlZm9yZURyYXciLCEwKSx3LmFkZEdldHRlclNldHRlcihZdCwiaGl0R3JhcGhFbmFibGVkIiwhMCx4KCkpO2NsYXNzIFh0IGV4dGVuZHMgWXR7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy5saXN0ZW5pbmcoITEpLGcud2FybignS29udmEuRmFzdCBsYXllciBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlICJuZXcgS29udmEuTGF5ZXIoeyBsaXN0ZW5pbmc6IGZhbHNlIH0pIiBpbnN0ZWFkLicpfX1YdC5wcm90b3R5cGUubm9kZVR5cGU9IkZhc3RMYXllciIscihYdCk7Y2xhc3MganQgZXh0ZW5kcyBKe192YWxpZGF0ZUFkZCh0KXt2YXIgZT10LmdldFR5cGUoKTsiR3JvdXAiIT09ZSYmIlNoYXBlIiE9PWUmJmcudGhyb3coIllvdSBtYXkgb25seSBhZGQgZ3JvdXBzIGFuZCBzaGFwZXMgdG8gZ3JvdXBzLiIpfX1qdC5wcm90b3R5cGUubm9kZVR5cGU9Ikdyb3VwIixyKGp0KTt2YXIgVXQ9ZS5wZXJmb3JtYW5jZSYmZS5wZXJmb3JtYW5jZS5ub3c/ZnVuY3Rpb24oKXtyZXR1cm4gZS5wZXJmb3JtYW5jZS5ub3coKX06ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX07Y2xhc3MgcXR7Y29uc3RydWN0b3IodCxlKXt0aGlzLmlkPXF0LmFuaW1JZENvdW50ZXIrKyx0aGlzLmZyYW1lPXt0aW1lOjAsdGltZURpZmY6MCxsYXN0VGltZTpVdCgpLGZyYW1lUmF0ZTowfSx0aGlzLmZ1bmM9dCx0aGlzLnNldExheWVycyhlKX1zZXRMYXllcnModCl7dmFyIGU9W107cmV0dXJuIGU9dD90Lmxlbmd0aD4wP3Q6W3RdOltdLHRoaXMubGF5ZXJzPWUsdGhpc31nZXRMYXllcnMoKXtyZXR1cm4gdGhpcy5sYXllcnN9YWRkTGF5ZXIodCl7dmFyIGUsaT10aGlzLmxheWVycyxyPWkubGVuZ3RoO2ZvcihlPTA7ZTxyO2UrKylpZihpW2VdLl9pZD09PXQuX2lkKXJldHVybiExO3JldHVybiB0aGlzLmxheWVycy5wdXNoKHQpLCEwfWlzUnVubmluZygpe3ZhciB0LGU9cXQuYW5pbWF0aW9ucyxpPWUubGVuZ3RoO2Zvcih0PTA7dDxpO3QrKylpZihlW3RdLmlkPT09dGhpcy5pZClyZXR1cm4hMDtyZXR1cm4hMX1zdGFydCgpe3JldHVybiB0aGlzLnN0b3AoKSx0aGlzLmZyYW1lLnRpbWVEaWZmPTAsdGhpcy5mcmFtZS5sYXN0VGltZT1VdCgpLHF0Ll9hZGRBbmltYXRpb24odGhpcyksdGhpc31zdG9wKCl7cmV0dXJuIHF0Ll9yZW1vdmVBbmltYXRpb24odGhpcyksdGhpc31fdXBkYXRlRnJhbWVPYmplY3QodCl7dGhpcy5mcmFtZS50aW1lRGlmZj10LXRoaXMuZnJhbWUubGFzdFRpbWUsdGhpcy5mcmFtZS5sYXN0VGltZT10LHRoaXMuZnJhbWUudGltZSs9dGhpcy5mcmFtZS50aW1lRGlmZix0aGlzLmZyYW1lLmZyYW1lUmF0ZT0xZTMvdGhpcy5mcmFtZS50aW1lRGlmZn1zdGF0aWMgX2FkZEFuaW1hdGlvbih0KXt0aGlzLmFuaW1hdGlvbnMucHVzaCh0KSx0aGlzLl9oYW5kbGVBbmltYXRpb24oKX1zdGF0aWMgX3JlbW92ZUFuaW1hdGlvbih0KXt2YXIgZSxpPXQuaWQscj10aGlzLmFuaW1hdGlvbnMsYT1yLmxlbmd0aDtmb3IoZT0wO2U8YTtlKyspaWYocltlXS5pZD09PWkpe3RoaXMuYW5pbWF0aW9ucy5zcGxpY2UoZSwxKTticmVha319c3RhdGljIF9ydW5GcmFtZXMoKXt2YXIgdCxlLGkscixhLG4scyxvLGg9e30sbD10aGlzLmFuaW1hdGlvbnM7Zm9yKHI9MDtyPGwubGVuZ3RoO3IrKylpZihlPSh0PWxbcl0pLmxheWVycyxpPXQuZnVuYyx0Ll91cGRhdGVGcmFtZU9iamVjdChVdCgpKSxuPWUubGVuZ3RoLCFpfHwhMSE9PWkuY2FsbCh0LHQuZnJhbWUpKWZvcihhPTA7YTxuO2ErKyl2b2lkIDAhPT0ocz1lW2FdKS5faWQmJihoW3MuX2lkXT1zKTtmb3IobyBpbiBoKWguaGFzT3duUHJvcGVydHkobykmJmhbb10uYmF0Y2hEcmF3KCl9c3RhdGljIF9hbmltYXRpb25Mb29wKCl7dmFyIHQ9cXQ7dC5hbmltYXRpb25zLmxlbmd0aD8odC5fcnVuRnJhbWVzKCksZy5yZXF1ZXN0QW5pbUZyYW1lKHQuX2FuaW1hdGlvbkxvb3ApKTp0LmFuaW1SdW5uaW5nPSExfXN0YXRpYyBfaGFuZGxlQW5pbWF0aW9uKCl7dGhpcy5hbmltUnVubmluZ3x8KHRoaXMuYW5pbVJ1bm5pbmc9ITAsZy5yZXF1ZXN0QW5pbUZyYW1lKHRoaXMuX2FuaW1hdGlvbkxvb3ApKX19cXQuYW5pbWF0aW9ucz1bXSxxdC5hbmltSWRDb3VudGVyPTAscXQuYW5pbVJ1bm5pbmc9ITE7dmFyIFZ0PXtub2RlOjEsZHVyYXRpb246MSxlYXNpbmc6MSxvbkZpbmlzaDoxLHlveW86MX0sS3Q9MCxRdD1bImZpbGwiLCJzdHJva2UiLCJzaGFkb3dDb2xvciJdO2NsYXNzIEp0e2NvbnN0cnVjdG9yKHQsZSxpLHIsYSxuLHMpe3RoaXMucHJvcD10LHRoaXMucHJvcEZ1bmM9ZSx0aGlzLmJlZ2luPXIsdGhpcy5fcG9zPXIsdGhpcy5kdXJhdGlvbj1uLHRoaXMuX2NoYW5nZT0wLHRoaXMucHJldlBvcz0wLHRoaXMueW95bz1zLHRoaXMuX3RpbWU9MCx0aGlzLl9wb3NpdGlvbj0wLHRoaXMuX3N0YXJ0VGltZT0wLHRoaXMuX2ZpbmlzaD0wLHRoaXMuZnVuYz1pLHRoaXMuX2NoYW5nZT1hLXRoaXMuYmVnaW4sdGhpcy5wYXVzZSgpfWZpcmUodCl7dmFyIGU9dGhpc1t0XTtlJiZlKCl9c2V0VGltZSh0KXt0PnRoaXMuZHVyYXRpb24/dGhpcy55b3lvPyh0aGlzLl90aW1lPXRoaXMuZHVyYXRpb24sdGhpcy5yZXZlcnNlKCkpOnRoaXMuZmluaXNoKCk6dDwwP3RoaXMueW95bz8odGhpcy5fdGltZT0wLHRoaXMucGxheSgpKTp0aGlzLnJlc2V0KCk6KHRoaXMuX3RpbWU9dCx0aGlzLnVwZGF0ZSgpKX1nZXRUaW1lKCl7cmV0dXJuIHRoaXMuX3RpbWV9c2V0UG9zaXRpb24odCl7dGhpcy5wcmV2UG9zPXRoaXMuX3Bvcyx0aGlzLnByb3BGdW5jKHQpLHRoaXMuX3Bvcz10fWdldFBvc2l0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10JiYodD10aGlzLl90aW1lKSx0aGlzLmZ1bmModCx0aGlzLmJlZ2luLHRoaXMuX2NoYW5nZSx0aGlzLmR1cmF0aW9uKX1wbGF5KCl7dGhpcy5zdGF0ZT0yLHRoaXMuX3N0YXJ0VGltZT10aGlzLmdldFRpbWVyKCktdGhpcy5fdGltZSx0aGlzLm9uRW50ZXJGcmFtZSgpLHRoaXMuZmlyZSgib25QbGF5Iil9cmV2ZXJzZSgpe3RoaXMuc3RhdGU9Myx0aGlzLl90aW1lPXRoaXMuZHVyYXRpb24tdGhpcy5fdGltZSx0aGlzLl9zdGFydFRpbWU9dGhpcy5nZXRUaW1lcigpLXRoaXMuX3RpbWUsdGhpcy5vbkVudGVyRnJhbWUoKSx0aGlzLmZpcmUoIm9uUmV2ZXJzZSIpfXNlZWsodCl7dGhpcy5wYXVzZSgpLHRoaXMuX3RpbWU9dCx0aGlzLnVwZGF0ZSgpLHRoaXMuZmlyZSgib25TZWVrIil9cmVzZXQoKXt0aGlzLnBhdXNlKCksdGhpcy5fdGltZT0wLHRoaXMudXBkYXRlKCksdGhpcy5maXJlKCJvblJlc2V0Iil9ZmluaXNoKCl7dGhpcy5wYXVzZSgpLHRoaXMuX3RpbWU9dGhpcy5kdXJhdGlvbix0aGlzLnVwZGF0ZSgpLHRoaXMuZmlyZSgib25GaW5pc2giKX11cGRhdGUoKXt0aGlzLnNldFBvc2l0aW9uKHRoaXMuZ2V0UG9zaXRpb24odGhpcy5fdGltZSkpLHRoaXMuZmlyZSgib25VcGRhdGUiKX1vbkVudGVyRnJhbWUoKXt2YXIgdD10aGlzLmdldFRpbWVyKCktdGhpcy5fc3RhcnRUaW1lOzI9PT10aGlzLnN0YXRlP3RoaXMuc2V0VGltZSh0KTozPT09dGhpcy5zdGF0ZSYmdGhpcy5zZXRUaW1lKHRoaXMuZHVyYXRpb24tdCl9cGF1c2UoKXt0aGlzLnN0YXRlPTEsdGhpcy5maXJlKCJvblBhdXNlIil9Z2V0VGltZXIoKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX19Y2xhc3MgWnR7Y29uc3RydWN0b3IodCl7dmFyIGUscixhPXRoaXMsbj10Lm5vZGUscz1uLl9pZCxvPXQuZWFzaW5nfHwkdC5MaW5lYXIsaD0hIXQueW95bztlPXZvaWQgMD09PXQuZHVyYXRpb24/LjM6MD09PXQuZHVyYXRpb24/LjAwMTp0LmR1cmF0aW9uLHRoaXMubm9kZT1uLHRoaXMuX2lkPUt0Kys7dmFyIGw9bi5nZXRMYXllcigpfHwobiBpbnN0YW5jZW9mIGkuU3RhZ2U/bi5nZXRMYXllcnMoKTpudWxsKTtmb3IociBpbiBsfHxnLmVycm9yKCJUd2VlbiBjb25zdHJ1Y3RvciBoYXZlIGBub2RlYCB0aGF0IGlzIG5vdCBpbiBhIGxheWVyLiBQbGVhc2UgYWRkIG5vZGUgaW50byBsYXllciBmaXJzdC4iKSx0aGlzLmFuaW09bmV3IHF0KChmdW5jdGlvbigpe2EudHdlZW4ub25FbnRlckZyYW1lKCl9KSxsKSx0aGlzLnR3ZWVuPW5ldyBKdChyLChmdW5jdGlvbih0KXthLl90d2VlbkZ1bmModCl9KSxvLDAsMSwxZTMqZSxoKSx0aGlzLl9hZGRMaXN0ZW5lcnMoKSxadC5hdHRyc1tzXXx8KFp0LmF0dHJzW3NdPXt9KSxadC5hdHRyc1tzXVt0aGlzLl9pZF18fChadC5hdHRyc1tzXVt0aGlzLl9pZF09e30pLFp0LnR3ZWVuc1tzXXx8KFp0LnR3ZWVuc1tzXT17fSksdCl2b2lkIDA9PT1WdFtyXSYmdGhpcy5fYWRkQXR0cihyLHRbcl0pO3RoaXMucmVzZXQoKSx0aGlzLm9uRmluaXNoPXQub25GaW5pc2gsdGhpcy5vblJlc2V0PXQub25SZXNldCx0aGlzLm9uVXBkYXRlPXQub25VcGRhdGV9X2FkZEF0dHIodCxlKXt2YXIgaSxyLGEsbixzLG8saCxsLGQ9dGhpcy5ub2RlLGM9ZC5faWQ7aWYoKGE9WnQudHdlZW5zW2NdW3RdKSYmZGVsZXRlIFp0LmF0dHJzW2NdW2FdW3RdLGk9ZC5nZXRBdHRyKHQpLGcuX2lzQXJyYXkoZSkpaWYocj1bXSxzPU1hdGgubWF4KGUubGVuZ3RoLGkubGVuZ3RoKSwicG9pbnRzIj09PXQmJmUubGVuZ3RoIT09aS5sZW5ndGgmJihlLmxlbmd0aD5pLmxlbmd0aD8oaD1pLGk9Zy5fcHJlcGFyZUFycmF5Rm9yVHdlZW4oaSxlLGQuY2xvc2VkKCkpKToobz1lLGU9Zy5fcHJlcGFyZUFycmF5Rm9yVHdlZW4oZSxpLGQuY2xvc2VkKCkpKSksMD09PXQuaW5kZXhPZigiZmlsbCIpKWZvcihuPTA7bjxzO24rKylpZihuJTI9PTApci5wdXNoKGVbbl0taVtuXSk7ZWxzZXt2YXIgdT1nLmNvbG9yVG9SR0JBKGlbbl0pO2w9Zy5jb2xvclRvUkdCQShlW25dKSxpW25dPXUsci5wdXNoKHtyOmwuci11LnIsZzpsLmctdS5nLGI6bC5iLXUuYixhOmwuYS11LmF9KX1lbHNlIGZvcihuPTA7bjxzO24rKylyLnB1c2goZVtuXS1pW25dKTtlbHNlLTEhPT1RdC5pbmRleE9mKHQpPyhpPWcuY29sb3JUb1JHQkEoaSkscj17cjoobD1nLmNvbG9yVG9SR0JBKGUpKS5yLWkucixnOmwuZy1pLmcsYjpsLmItaS5iLGE6bC5hLWkuYX0pOnI9ZS1pO1p0LmF0dHJzW2NdW3RoaXMuX2lkXVt0XT17c3RhcnQ6aSxkaWZmOnIsZW5kOmUsdHJ1ZUVuZDpvLHRydWVTdGFydDpofSxadC50d2VlbnNbY11bdF09dGhpcy5faWR9X3R3ZWVuRnVuYyh0KXt2YXIgZSxpLHIsYSxuLHMsbyxoLGw9dGhpcy5ub2RlLGQ9WnQuYXR0cnNbbC5faWRdW3RoaXMuX2lkXTtmb3IoZSBpbiBkKXtpZihyPShpPWRbZV0pLnN0YXJ0LGE9aS5kaWZmLGg9aS5lbmQsZy5faXNBcnJheShyKSlpZihuPVtdLG89TWF0aC5tYXgoci5sZW5ndGgsaC5sZW5ndGgpLDA9PT1lLmluZGV4T2YoImZpbGwiKSlmb3Iocz0wO3M8bztzKyspcyUyPT0wP24ucHVzaCgocltzXXx8MCkrYVtzXSp0KTpuLnB1c2goInJnYmEoIitNYXRoLnJvdW5kKHJbc10ucithW3NdLnIqdCkrIiwiK01hdGgucm91bmQocltzXS5nK2Fbc10uZyp0KSsiLCIrTWF0aC5yb3VuZChyW3NdLmIrYVtzXS5iKnQpKyIsIisocltzXS5hK2Fbc10uYSp0KSsiKSIpO2Vsc2UgZm9yKHM9MDtzPG87cysrKW4ucHVzaCgocltzXXx8MCkrYVtzXSp0KTtlbHNlIG49LTEhPT1RdC5pbmRleE9mKGUpPyJyZ2JhKCIrTWF0aC5yb3VuZChyLnIrYS5yKnQpKyIsIitNYXRoLnJvdW5kKHIuZythLmcqdCkrIiwiK01hdGgucm91bmQoci5iK2EuYip0KSsiLCIrKHIuYSthLmEqdCkrIikiOnIrYSp0O2wuc2V0QXR0cihlLG4pfX1fYWRkTGlzdGVuZXJzKCl7dGhpcy50d2Vlbi5vblBsYXk9KCk9Pnt0aGlzLmFuaW0uc3RhcnQoKX0sdGhpcy50d2Vlbi5vblJldmVyc2U9KCk9Pnt0aGlzLmFuaW0uc3RhcnQoKX0sdGhpcy50d2Vlbi5vblBhdXNlPSgpPT57dGhpcy5hbmltLnN0b3AoKX0sdGhpcy50d2Vlbi5vbkZpbmlzaD0oKT0+e3ZhciB0PXRoaXMubm9kZSxlPVp0LmF0dHJzW3QuX2lkXVt0aGlzLl9pZF07ZS5wb2ludHMmJmUucG9pbnRzLnRydWVFbmQmJnQuc2V0QXR0cigicG9pbnRzIixlLnBvaW50cy50cnVlRW5kKSx0aGlzLm9uRmluaXNoJiZ0aGlzLm9uRmluaXNoLmNhbGwodGhpcyl9LHRoaXMudHdlZW4ub25SZXNldD0oKT0+e3ZhciB0PXRoaXMubm9kZSxlPVp0LmF0dHJzW3QuX2lkXVt0aGlzLl9pZF07ZS5wb2ludHMmJmUucG9pbnRzLnRydWVTdGFydCYmdC5wb2ludHMoZS5wb2ludHMudHJ1ZVN0YXJ0KSx0aGlzLm9uUmVzZXQmJnRoaXMub25SZXNldCgpfSx0aGlzLnR3ZWVuLm9uVXBkYXRlPSgpPT57dGhpcy5vblVwZGF0ZSYmdGhpcy5vblVwZGF0ZS5jYWxsKHRoaXMpfX1wbGF5KCl7cmV0dXJuIHRoaXMudHdlZW4ucGxheSgpLHRoaXN9cmV2ZXJzZSgpe3JldHVybiB0aGlzLnR3ZWVuLnJldmVyc2UoKSx0aGlzfXJlc2V0KCl7cmV0dXJuIHRoaXMudHdlZW4ucmVzZXQoKSx0aGlzfXNlZWsodCl7cmV0dXJuIHRoaXMudHdlZW4uc2VlaygxZTMqdCksdGhpc31wYXVzZSgpe3JldHVybiB0aGlzLnR3ZWVuLnBhdXNlKCksdGhpc31maW5pc2goKXtyZXR1cm4gdGhpcy50d2Vlbi5maW5pc2goKSx0aGlzfWRlc3Ryb3koKXt2YXIgdCxlPXRoaXMubm9kZS5faWQsaT10aGlzLl9pZCxyPVp0LnR3ZWVuc1tlXTtmb3IodCBpbiB0aGlzLnBhdXNlKCkscilkZWxldGUgWnQudHdlZW5zW2VdW3RdO2RlbGV0ZSBadC5hdHRyc1tlXVtpXX19WnQuYXR0cnM9e30sWnQudHdlZW5zPXt9LEsucHJvdG90eXBlLnRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQub25GaW5pc2g7dC5ub2RlPXRoaXMsdC5vbkZpbmlzaD1mdW5jdGlvbigpe3RoaXMuZGVzdHJveSgpLGUmJmUoKX0sbmV3IFp0KHQpLnBsYXkoKX07Y29uc3QgJHQ9e0JhY2tFYXNlSW4odCxlLGkscil7dmFyIGE9MS43MDE1ODtyZXR1cm4gaSoodC89cikqdCooKGErMSkqdC1hKStlfSxCYWNrRWFzZU91dCh0LGUsaSxyKXt2YXIgYT0xLjcwMTU4O3JldHVybiBpKigodD10L3ItMSkqdCooKGErMSkqdCthKSsxKStlfSxCYWNrRWFzZUluT3V0KHQsZSxpLHIpe3ZhciBhPTEuNzAxNTg7cmV0dXJuKHQvPXIvMik8MT9pLzIqKHQqdCooKDErKGEqPTEuNTI1KSkqdC1hKSkrZTppLzIqKCh0LT0yKSp0KigoMSsoYSo9MS41MjUpKSp0K2EpKzIpK2V9LEVsYXN0aWNFYXNlSW4odCxlLGkscixhLG4pe3ZhciBzPTA7cmV0dXJuIDA9PT10P2U6MT09KHQvPXIpP2UraToobnx8KG49LjMqciksIWF8fGE8TWF0aC5hYnMoaSk/KGE9aSxzPW4vNCk6cz1uLygyKk1hdGguUEkpKk1hdGguYXNpbihpL2EpLC1hKk1hdGgucG93KDIsMTAqKHQtPTEpKSpNYXRoLnNpbigodCpyLXMpKigyKk1hdGguUEkpL24pK2UpfSxFbGFzdGljRWFzZU91dCh0LGUsaSxyLGEsbil7dmFyIHM9MDtyZXR1cm4gMD09PXQ/ZToxPT0odC89cik/ZStpOihufHwobj0uMypyKSwhYXx8YTxNYXRoLmFicyhpKT8oYT1pLHM9bi80KTpzPW4vKDIqTWF0aC5QSSkqTWF0aC5hc2luKGkvYSksYSpNYXRoLnBvdygyLC0xMCp0KSpNYXRoLnNpbigodCpyLXMpKigyKk1hdGguUEkpL24pK2krZSl9LEVsYXN0aWNFYXNlSW5PdXQodCxlLGkscixhLG4pe3ZhciBzPTA7cmV0dXJuIDA9PT10P2U6Mj09KHQvPXIvMik/ZStpOihufHwobj1yKiguMyoxLjUpKSwhYXx8YTxNYXRoLmFicyhpKT8oYT1pLHM9bi80KTpzPW4vKDIqTWF0aC5QSSkqTWF0aC5hc2luKGkvYSksdDwxP2EqTWF0aC5wb3coMiwxMCoodC09MSkpKk1hdGguc2luKCh0KnItcykqKDIqTWF0aC5QSSkvbikqLS41K2U6YSpNYXRoLnBvdygyLC0xMCoodC09MSkpKk1hdGguc2luKCh0KnItcykqKDIqTWF0aC5QSSkvbikqLjUraStlKX0sQm91bmNlRWFzZU91dDoodCxlLGkscik9Pih0Lz1yKTwxLzIuNzU/aSooNy41NjI1KnQqdCkrZTp0PDIvMi43NT9pKig3LjU2MjUqKHQtPTEuNS8yLjc1KSp0Ky43NSkrZTp0PDIuNS8yLjc1P2kqKDcuNTYyNSoodC09Mi4yNS8yLjc1KSp0Ky45Mzc1KStlOmkqKDcuNTYyNSoodC09Mi42MjUvMi43NSkqdCsuOTg0Mzc1KStlLEJvdW5jZUVhc2VJbjoodCxlLGkscik9PmktJHQuQm91bmNlRWFzZU91dChyLXQsMCxpLHIpK2UsQm91bmNlRWFzZUluT3V0Oih0LGUsaSxyKT0+dDxyLzI/LjUqJHQuQm91bmNlRWFzZUluKDIqdCwwLGkscikrZTouNSokdC5Cb3VuY2VFYXNlT3V0KDIqdC1yLDAsaSxyKSsuNSppK2UsRWFzZUluOih0LGUsaSxyKT0+aSoodC89cikqdCtlLEVhc2VPdXQ6KHQsZSxpLHIpPT4taSoodC89cikqKHQtMikrZSxFYXNlSW5PdXQ6KHQsZSxpLHIpPT4odC89ci8yKTwxP2kvMip0KnQrZTotaS8yKigtLXQqKHQtMiktMSkrZSxTdHJvbmdFYXNlSW46KHQsZSxpLHIpPT5pKih0Lz1yKSp0KnQqdCp0K2UsU3Ryb25nRWFzZU91dDoodCxlLGkscik9PmkqKCh0PXQvci0xKSp0KnQqdCp0KzEpK2UsU3Ryb25nRWFzZUluT3V0Oih0LGUsaSxyKT0+KHQvPXIvMik8MT9pLzIqdCp0KnQqdCp0K2U6aS8yKigodC09MikqdCp0KnQqdCsyKStlLExpbmVhcjoodCxlLGkscik9PmkqdC9yK2V9LHRlPWcuX2Fzc2lnbihpLHtVdGlsOmcsVHJhbnNmb3JtOmEsTm9kZTpLLENvbnRhaW5lcjpKLFN0YWdlOkV0LHN0YWdlczpHdCxMYXllcjpZdCxGYXN0TGF5ZXI6WHQsR3JvdXA6anQsREQ6TCxTaGFwZTp6dCxzaGFwZXM6QnQsQW5pbWF0aW9uOnF0LFR3ZWVuOlp0LEVhc2luZ3M6JHQsQ29udGV4dDpQLENhbnZhczpHfSk7Y2xhc3MgZWUgZXh0ZW5kcyB6dHtfc2NlbmVGdW5jKHQpe3ZhciBlPWkuZ2V0QW5nbGUodGhpcy5hbmdsZSgpKSxyPXRoaXMuY2xvY2t3aXNlKCk7dC5iZWdpblBhdGgoKSx0LmFyYygwLDAsdGhpcy5vdXRlclJhZGl1cygpLDAsZSxyKSx0LmFyYygwLDAsdGhpcy5pbm5lclJhZGl1cygpLGUsMCwhciksdC5jbG9zZVBhdGgoKSx0LmZpbGxTdHJva2VTaGFwZSh0aGlzKX1nZXRXaWR0aCgpe3JldHVybiAyKnRoaXMub3V0ZXJSYWRpdXMoKX1nZXRIZWlnaHQoKXtyZXR1cm4gMip0aGlzLm91dGVyUmFkaXVzKCl9c2V0V2lkdGgodCl7dGhpcy5vdXRlclJhZGl1cyh0LzIpfXNldEhlaWdodCh0KXt0aGlzLm91dGVyUmFkaXVzKHQvMil9fWZ1bmN0aW9uIGllKHQsZSxpLHIsYSxuLHMpe3ZhciBvPU1hdGguc3FydChNYXRoLnBvdyhpLXQsMikrTWF0aC5wb3coci1lLDIpKSxoPU1hdGguc3FydChNYXRoLnBvdyhhLWksMikrTWF0aC5wb3cobi1yLDIpKSxsPXMqby8obytoKSxkPXMqaC8obytoKTtyZXR1cm5baS1sKihhLXQpLHItbCoobi1lKSxpK2QqKGEtdCkscitkKihuLWUpXX1mdW5jdGlvbiByZSh0LGUpe3ZhciBpLHIsYT10Lmxlbmd0aCxuPVtdO2ZvcihpPTI7aTxhLTI7aSs9MilyPWllKHRbaS0yXSx0W2ktMV0sdFtpXSx0W2krMV0sdFtpKzJdLHRbaSszXSxlKSxpc05hTihyWzBdKXx8KG4ucHVzaChyWzBdKSxuLnB1c2goclsxXSksbi5wdXNoKHRbaV0pLG4ucHVzaCh0W2krMV0pLG4ucHVzaChyWzJdKSxuLnB1c2goclszXSkpO3JldHVybiBufWVlLnByb3RvdHlwZS5fY2VudHJvaWQ9ITAsZWUucHJvdG90eXBlLmNsYXNzTmFtZT0iQXJjIixlZS5wcm90b3R5cGUuX2F0dHJzQWZmZWN0aW5nU2l6ZT1bImlubmVyUmFkaXVzIiwib3V0ZXJSYWRpdXMiXSxyKGVlKSx3LmFkZEdldHRlclNldHRlcihlZSwiaW5uZXJSYWRpdXMiLDAscCgpKSx3LmFkZEdldHRlclNldHRlcihlZSwib3V0ZXJSYWRpdXMiLDAscCgpKSx3LmFkZEdldHRlclNldHRlcihlZSwiYW5nbGUiLDAscCgpKSx3LmFkZEdldHRlclNldHRlcihlZSwiY2xvY2t3aXNlIiwhMSx4KCkpO2NsYXNzIGFlIGV4dGVuZHMgenR7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy5vbigicG9pbnRzQ2hhbmdlLmtvbnZhIHRlbnNpb25DaGFuZ2Uua29udmEgY2xvc2VkQ2hhbmdlLmtvbnZhIGJlemllckNoYW5nZS5rb252YSIsKGZ1bmN0aW9uKCl7dGhpcy5fY2xlYXJDYWNoZSgidGVuc2lvblBvaW50cyIpfSkpfV9zY2VuZUZ1bmModCl7dmFyIGUsaSxyLGE9dGhpcy5wb2ludHMoKSxuPWEubGVuZ3RoLHM9dGhpcy50ZW5zaW9uKCksbz10aGlzLmNsb3NlZCgpLGg9dGhpcy5iZXppZXIoKTtpZihuKXtpZih0LmJlZ2luUGF0aCgpLHQubW92ZVRvKGFbMF0sYVsxXSksMCE9PXMmJm4+NCl7Zm9yKGk9KGU9dGhpcy5nZXRUZW5zaW9uUG9pbnRzKCkpLmxlbmd0aCxyPW8/MDo0LG98fHQucXVhZHJhdGljQ3VydmVUbyhlWzBdLGVbMV0sZVsyXSxlWzNdKTtyPGktMjspdC5iZXppZXJDdXJ2ZVRvKGVbcisrXSxlW3IrK10sZVtyKytdLGVbcisrXSxlW3IrK10sZVtyKytdKTtvfHx0LnF1YWRyYXRpY0N1cnZlVG8oZVtpLTJdLGVbaS0xXSxhW24tMl0sYVtuLTFdKX1lbHNlIGlmKGgpZm9yKHI9MjtyPG47KXQuYmV6aWVyQ3VydmVUbyhhW3IrK10sYVtyKytdLGFbcisrXSxhW3IrK10sYVtyKytdLGFbcisrXSk7ZWxzZSBmb3Iocj0yO3I8bjtyKz0yKXQubGluZVRvKGFbcl0sYVtyKzFdKTtvPyh0LmNsb3NlUGF0aCgpLHQuZmlsbFN0cm9rZVNoYXBlKHRoaXMpKTp0LnN0cm9rZVNoYXBlKHRoaXMpfX1nZXRUZW5zaW9uUG9pbnRzKCl7cmV0dXJuIHRoaXMuX2dldENhY2hlKCJ0ZW5zaW9uUG9pbnRzIix0aGlzLl9nZXRUZW5zaW9uUG9pbnRzKX1fZ2V0VGVuc2lvblBvaW50cygpe3JldHVybiB0aGlzLmNsb3NlZCgpP3RoaXMuX2dldFRlbnNpb25Qb2ludHNDbG9zZWQoKTpyZSh0aGlzLnBvaW50cygpLHRoaXMudGVuc2lvbigpKX1fZ2V0VGVuc2lvblBvaW50c0Nsb3NlZCgpe3ZhciB0PXRoaXMucG9pbnRzKCksZT10Lmxlbmd0aCxpPXRoaXMudGVuc2lvbigpLHI9aWUodFtlLTJdLHRbZS0xXSx0WzBdLHRbMV0sdFsyXSx0WzNdLGkpLGE9aWUodFtlLTRdLHRbZS0zXSx0W2UtMl0sdFtlLTFdLHRbMF0sdFsxXSxpKSxuPXJlKHQsaSk7cmV0dXJuW3JbMl0sclszXV0uY29uY2F0KG4pLmNvbmNhdChbYVswXSxhWzFdLHRbZS0yXSx0W2UtMV0sYVsyXSxhWzNdLHJbMF0sclsxXSx0WzBdLHRbMV1dKX1nZXRXaWR0aCgpe3JldHVybiB0aGlzLmdldFNlbGZSZWN0KCkud2lkdGh9Z2V0SGVpZ2h0KCl7cmV0dXJuIHRoaXMuZ2V0U2VsZlJlY3QoKS5oZWlnaHR9Z2V0U2VsZlJlY3QoKXt2YXIgdD10aGlzLnBvaW50cygpO2lmKHQubGVuZ3RoPDQpcmV0dXJue3g6dFswXXx8MCx5OnRbMV18fDAsd2lkdGg6MCxoZWlnaHQ6MH07Zm9yKHZhciBlLGkscj0odD0wIT09dGhpcy50ZW5zaW9uKCk/W3RbMF0sdFsxXSwuLi50aGlzLl9nZXRUZW5zaW9uUG9pbnRzKCksdFt0Lmxlbmd0aC0yXSx0W3QubGVuZ3RoLTFdXTp0aGlzLnBvaW50cygpKVswXSxhPXRbMF0sbj10WzFdLHM9dFsxXSxvPTA7bzx0Lmxlbmd0aC8yO28rKyllPXRbMipvXSxpPXRbMipvKzFdLHI9TWF0aC5taW4ocixlKSxhPU1hdGgubWF4KGEsZSksbj1NYXRoLm1pbihuLGkpLHM9TWF0aC5tYXgocyxpKTtyZXR1cm57eDpyLHk6bix3aWR0aDphLXIsaGVpZ2h0OnMtbn19fWFlLnByb3RvdHlwZS5jbGFzc05hbWU9IkxpbmUiLGFlLnByb3RvdHlwZS5fYXR0cnNBZmZlY3RpbmdTaXplPVsicG9pbnRzIiwiYmV6aWVyIiwidGVuc2lvbiJdLHIoYWUpLHcuYWRkR2V0dGVyU2V0dGVyKGFlLCJjbG9zZWQiLCExKSx3LmFkZEdldHRlclNldHRlcihhZSwiYmV6aWVyIiwhMSksdy5hZGRHZXR0ZXJTZXR0ZXIoYWUsInRlbnNpb24iLDAscCgpKSx3LmFkZEdldHRlclNldHRlcihhZSwicG9pbnRzIixbXSxmdW5jdGlvbigpe2lmKGkuaXNVbm1pbmlmaWVkKXJldHVybiBmdW5jdGlvbih0LGUpe3JldHVybiBnLl9pc0FycmF5KHQpP3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7Zy5faXNOdW1iZXIodCl8fGcud2FybignIicrZSsnIiBhdHRyaWJ1dGUgaGFzIG5vbiBudW1lcmljIGVsZW1lbnQgJyt0KyIuIE1ha2Ugc3VyZSB0aGF0IGFsbCBlbGVtZW50cyBhcmUgbnVtYmVycy4iKX0pKTpnLndhcm4odSh0KSsnIGlzIGEgbm90IHZhbGlkIHZhbHVlIGZvciAiJytlKyciIGF0dHJpYnV0ZS4gVGhlIHZhbHVlIHNob3VsZCBiZSBhIGFycmF5IG9mIG51bWJlcnMuJyksdH19KCkpO2NsYXNzIG5lIGV4dGVuZHMgenR7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy5kYXRhQXJyYXk9W10sdGhpcy5wYXRoTGVuZ3RoPTAsdGhpcy5kYXRhQXJyYXk9bmUucGFyc2VQYXRoRGF0YSh0aGlzLmRhdGEoKSksdGhpcy5wYXRoTGVuZ3RoPTA7Zm9yKHZhciBlPTA7ZTx0aGlzLmRhdGFBcnJheS5sZW5ndGg7KytlKXRoaXMucGF0aExlbmd0aCs9dGhpcy5kYXRhQXJyYXlbZV0ucGF0aExlbmd0aDt0aGlzLm9uKCJkYXRhQ2hhbmdlLmtvbnZhIiwoZnVuY3Rpb24oKXt0aGlzLmRhdGFBcnJheT1uZS5wYXJzZVBhdGhEYXRhKHRoaXMuZGF0YSgpKSx0aGlzLnBhdGhMZW5ndGg9MDtmb3IodmFyIHQ9MDt0PHRoaXMuZGF0YUFycmF5Lmxlbmd0aDsrK3QpdGhpcy5wYXRoTGVuZ3RoKz10aGlzLmRhdGFBcnJheVt0XS5wYXRoTGVuZ3RofSkpfV9zY2VuZUZ1bmModCl7dmFyIGU9dGhpcy5kYXRhQXJyYXk7dC5iZWdpblBhdGgoKTtmb3IodmFyIGk9ITEscj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgYT1lW3JdLmNvbW1hbmQsbj1lW3JdLnBvaW50cztzd2l0Y2goYSl7Y2FzZSJMIjp0LmxpbmVUbyhuWzBdLG5bMV0pO2JyZWFrO2Nhc2UiTSI6dC5tb3ZlVG8oblswXSxuWzFdKTticmVhaztjYXNlIkMiOnQuYmV6aWVyQ3VydmVUbyhuWzBdLG5bMV0sblsyXSxuWzNdLG5bNF0sbls1XSk7YnJlYWs7Y2FzZSJRIjp0LnF1YWRyYXRpY0N1cnZlVG8oblswXSxuWzFdLG5bMl0sblszXSk7YnJlYWs7Y2FzZSJBIjp2YXIgcz1uWzBdLG89blsxXSxoPW5bMl0sbD1uWzNdLGQ9bls0XSxjPW5bNV0sZz1uWzZdLHU9bls3XSxmPWg+bD9oOmwscD1oPmw/MTpoL2wsdj1oPmw/bC9oOjE7dC50cmFuc2xhdGUocyxvKSx0LnJvdGF0ZShnKSx0LnNjYWxlKHAsdiksdC5hcmMoMCwwLGYsZCxkK2MsMS11KSx0LnNjYWxlKDEvcCwxL3YpLHQucm90YXRlKC1nKSx0LnRyYW5zbGF0ZSgtcywtbyk7YnJlYWs7Y2FzZSJ6IjppPSEwLHQuY2xvc2VQYXRoKCl9fWl8fHRoaXMuaGFzRmlsbCgpP3QuZmlsbFN0cm9rZVNoYXBlKHRoaXMpOnQuc3Ryb2tlU2hhcGUodGhpcyl9Z2V0U2VsZlJlY3QoKXt2YXIgdD1bXTt0aGlzLmRhdGFBcnJheS5mb3JFYWNoKChmdW5jdGlvbihlKXtpZigiQSI9PT1lLmNvbW1hbmQpe3ZhciBpPWUucG9pbnRzWzRdLHI9ZS5wb2ludHNbNV0sYT1lLnBvaW50c1s0XStyLG49TWF0aC5QSS8xODA7aWYoTWF0aC5hYnMoaS1hKTxuJiYobj1NYXRoLmFicyhpLWEpKSxyPDApZm9yKGxldCByPWktbjtyPmE7ci09bil7Y29uc3QgaT1uZS5nZXRQb2ludE9uRWxsaXB0aWNhbEFyYyhlLnBvaW50c1swXSxlLnBvaW50c1sxXSxlLnBvaW50c1syXSxlLnBvaW50c1szXSxyLDApO3QucHVzaChpLngsaS55KX1lbHNlIGZvcihsZXQgcj1pK247cjxhO3IrPW4pe2NvbnN0IGk9bmUuZ2V0UG9pbnRPbkVsbGlwdGljYWxBcmMoZS5wb2ludHNbMF0sZS5wb2ludHNbMV0sZS5wb2ludHNbMl0sZS5wb2ludHNbM10sciwwKTt0LnB1c2goaS54LGkueSl9fWVsc2UgaWYoIkMiPT09ZS5jb21tYW5kKWZvcihsZXQgaT0wO2k8PTE7aSs9LjAxKXtjb25zdCByPW5lLmdldFBvaW50T25DdWJpY0JlemllcihpLGUuc3RhcnQueCxlLnN0YXJ0LnksZS5wb2ludHNbMF0sZS5wb2ludHNbMV0sZS5wb2ludHNbMl0sZS5wb2ludHNbM10sZS5wb2ludHNbNF0sZS5wb2ludHNbNV0pO3QucHVzaChyLngsci55KX1lbHNlIHQ9dC5jb25jYXQoZS5wb2ludHMpfSkpO2Zvcih2YXIgZSxpLHI9dFswXSxhPXRbMF0sbj10WzFdLHM9dFsxXSxvPTA7bzx0Lmxlbmd0aC8yO28rKyllPXRbMipvXSxpPXRbMipvKzFdLGlzTmFOKGUpfHwocj1NYXRoLm1pbihyLGUpLGE9TWF0aC5tYXgoYSxlKSksaXNOYU4oaSl8fChuPU1hdGgubWluKG4saSkscz1NYXRoLm1heChzLGkpKTtyZXR1cm57eDpNYXRoLnJvdW5kKHIpLHk6TWF0aC5yb3VuZChuKSx3aWR0aDpNYXRoLnJvdW5kKGEtciksaGVpZ2h0Ok1hdGgucm91bmQocy1uKX19Z2V0TGVuZ3RoKCl7cmV0dXJuIHRoaXMucGF0aExlbmd0aH1nZXRQb2ludEF0TGVuZ3RoKHQpe3ZhciBlLGk9MCxyPXRoaXMuZGF0YUFycmF5Lmxlbmd0aDtpZighcilyZXR1cm4gbnVsbDtmb3IoO2k8ciYmdD50aGlzLmRhdGFBcnJheVtpXS5wYXRoTGVuZ3RoOyl0LT10aGlzLmRhdGFBcnJheVtpXS5wYXRoTGVuZ3RoLCsraTtpZihpPT09cilyZXR1cm57eDooZT10aGlzLmRhdGFBcnJheVtpLTFdLnBvaW50cy5zbGljZSgtMikpWzBdLHk6ZVsxXX07aWYodDwuMDEpcmV0dXJue3g6KGU9dGhpcy5kYXRhQXJyYXlbaV0ucG9pbnRzLnNsaWNlKDAsMikpWzBdLHk6ZVsxXX07dmFyIGE9dGhpcy5kYXRhQXJyYXlbaV0sbj1hLnBvaW50cztzd2l0Y2goYS5jb21tYW5kKXtjYXNlIkwiOnJldHVybiBuZS5nZXRQb2ludE9uTGluZSh0LGEuc3RhcnQueCxhLnN0YXJ0LnksblswXSxuWzFdKTtjYXNlIkMiOnJldHVybiBuZS5nZXRQb2ludE9uQ3ViaWNCZXppZXIodC9hLnBhdGhMZW5ndGgsYS5zdGFydC54LGEuc3RhcnQueSxuWzBdLG5bMV0sblsyXSxuWzNdLG5bNF0sbls1XSk7Y2FzZSJRIjpyZXR1cm4gbmUuZ2V0UG9pbnRPblF1YWRyYXRpY0Jlemllcih0L2EucGF0aExlbmd0aCxhLnN0YXJ0LngsYS5zdGFydC55LG5bMF0sblsxXSxuWzJdLG5bM10pO2Nhc2UiQSI6dmFyIHM9blswXSxvPW5bMV0saD1uWzJdLGw9blszXSxkPW5bNF0sYz1uWzVdLGc9bls2XTtyZXR1cm4gZCs9Yyp0L2EucGF0aExlbmd0aCxuZS5nZXRQb2ludE9uRWxsaXB0aWNhbEFyYyhzLG8saCxsLGQsZyl9cmV0dXJuIG51bGx9c3RhdGljIGdldExpbmVMZW5ndGgodCxlLGkscil7cmV0dXJuIE1hdGguc3FydCgoaS10KSooaS10KSsoci1lKSooci1lKSl9c3RhdGljIGdldFBvaW50T25MaW5lKHQsZSxpLHIsYSxuLHMpe3ZvaWQgMD09PW4mJihuPWUpLHZvaWQgMD09PXMmJihzPWkpO3ZhciBvPShhLWkpLyhyLWUrMWUtOCksaD1NYXRoLnNxcnQodCp0LygxK28qbykpO3I8ZSYmKGgqPS0xKTt2YXIgbCxkPW8qaDtpZihyPT09ZSlsPXt4Om4seTpzK2R9O2Vsc2UgaWYoKHMtaSkvKG4tZSsxZS04KT09PW8pbD17eDpuK2gseTpzK2R9O2Vsc2V7dmFyIGMsZyx1PXRoaXMuZ2V0TGluZUxlbmd0aChlLGkscixhKSxmPShuLWUpKihyLWUpKyhzLWkpKihhLWkpO2M9ZSsoZi89dSp1KSooci1lKSxnPWkrZiooYS1pKTt2YXIgcD10aGlzLmdldExpbmVMZW5ndGgobixzLGMsZyksdj1NYXRoLnNxcnQodCp0LXAqcCk7aD1NYXRoLnNxcnQodip2LygxK28qbykpLHI8ZSYmKGgqPS0xKSxsPXt4OmMraCx5OmcrKGQ9bypoKX19cmV0dXJuIGx9c3RhdGljIGdldFBvaW50T25DdWJpY0Jlemllcih0LGUsaSxyLGEsbixzLG8saCl7ZnVuY3Rpb24gbCh0KXtyZXR1cm4gdCp0KnR9ZnVuY3Rpb24gZCh0KXtyZXR1cm4gMyp0KnQqKDEtdCl9ZnVuY3Rpb24gYyh0KXtyZXR1cm4gMyp0KigxLXQpKigxLXQpfWZ1bmN0aW9uIGcodCl7cmV0dXJuKDEtdCkqKDEtdCkqKDEtdCl9cmV0dXJue3g6bypsKHQpK24qZCh0KStyKmModCkrZSpnKHQpLHk6aCpsKHQpK3MqZCh0KSthKmModCkraSpnKHQpfX1zdGF0aWMgZ2V0UG9pbnRPblF1YWRyYXRpY0Jlemllcih0LGUsaSxyLGEsbixzKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0KnR9ZnVuY3Rpb24gaCh0KXtyZXR1cm4gMip0KigxLXQpfWZ1bmN0aW9uIGwodCl7cmV0dXJuKDEtdCkqKDEtdCl9cmV0dXJue3g6bipvKHQpK3IqaCh0KStlKmwodCkseTpzKm8odCkrYSpoKHQpK2kqbCh0KX19c3RhdGljIGdldFBvaW50T25FbGxpcHRpY2FsQXJjKHQsZSxpLHIsYSxuKXt2YXIgcz1NYXRoLmNvcyhuKSxvPU1hdGguc2luKG4pLGg9aSpNYXRoLmNvcyhhKSxsPXIqTWF0aC5zaW4oYSk7cmV0dXJue3g6dCsoaCpzLWwqbykseTplKyhoKm8rbCpzKX19c3RhdGljIHBhcnNlUGF0aERhdGEodCl7aWYoIXQpcmV0dXJuW107dmFyIGU9dCxpPVsibSIsIk0iLCJsIiwiTCIsInYiLCJWIiwiaCIsIkgiLCJ6IiwiWiIsImMiLCJDIiwicSIsIlEiLCJ0IiwiVCIsInMiLCJTIiwiYSIsIkEiXTtlPWUucmVwbGFjZShuZXcgUmVnRXhwKCIgIiwiZyIpLCIsIik7Zm9yKHZhciByPTA7cjxpLmxlbmd0aDtyKyspZT1lLnJlcGxhY2UobmV3IFJlZ0V4cChpW3JdLCJnIiksInwiK2lbcl0pO3ZhciBhLG49ZS5zcGxpdCgifCIpLHM9W10sbz1bXSxoPTAsbD0wLGQ9LyhbLStdPygoXGQrXC5cZCspfCgoXGQrKXwoXC5cZCspKSkoPzplWy0rXT9cZCspPykvZ2k7Zm9yKHI9MTtyPG4ubGVuZ3RoO3IrKyl7dmFyIGM9bltyXSxnPWMuY2hhckF0KDApO2ZvcihjPWMuc2xpY2UoMSksby5sZW5ndGg9MDthPWQuZXhlYyhjKTspby5wdXNoKGFbMF0pO2Zvcih2YXIgdT1bXSxmPTAscD1vLmxlbmd0aDtmPHA7ZisrKWlmKCIwMCIhPT1vW2ZdKXt2YXIgdj1wYXJzZUZsb2F0KG9bZl0pO2lzTmFOKHYpP3UucHVzaCgwKTp1LnB1c2godil9ZWxzZSB1LnB1c2goMCwwKTtmb3IoO3UubGVuZ3RoPjAmJiFpc05hTih1WzBdKTspe3ZhciBtLF8seSx4LGIsUyx3LEMsayxQLFQ9bnVsbCxBPVtdLE09aCxHPWw7c3dpdGNoKGcpe2Nhc2UibCI6aCs9dS5zaGlmdCgpLGwrPXUuc2hpZnQoKSxUPSJMIixBLnB1c2goaCxsKTticmVhaztjYXNlIkwiOmg9dS5zaGlmdCgpLGw9dS5zaGlmdCgpLEEucHVzaChoLGwpO2JyZWFrO2Nhc2UibSI6dmFyIEU9dS5zaGlmdCgpLFI9dS5zaGlmdCgpO2lmKGgrPUUsbCs9UixUPSJNIixzLmxlbmd0aD4yJiYieiI9PT1zW3MubGVuZ3RoLTFdLmNvbW1hbmQpZm9yKHZhciBMPXMubGVuZ3RoLTI7TD49MDtMLS0paWYoIk0iPT09c1tMXS5jb21tYW5kKXtoPXNbTF0ucG9pbnRzWzBdK0UsbD1zW0xdLnBvaW50c1sxXStSO2JyZWFrfUEucHVzaChoLGwpLGc9ImwiO2JyZWFrO2Nhc2UiTSI6aD11LnNoaWZ0KCksbD11LnNoaWZ0KCksVD0iTSIsQS5wdXNoKGgsbCksZz0iTCI7YnJlYWs7Y2FzZSJoIjpoKz11LnNoaWZ0KCksVD0iTCIsQS5wdXNoKGgsbCk7YnJlYWs7Y2FzZSJIIjpoPXUuc2hpZnQoKSxUPSJMIixBLnB1c2goaCxsKTticmVhaztjYXNlInYiOmwrPXUuc2hpZnQoKSxUPSJMIixBLnB1c2goaCxsKTticmVhaztjYXNlIlYiOmw9dS5zaGlmdCgpLFQ9IkwiLEEucHVzaChoLGwpO2JyZWFrO2Nhc2UiQyI6QS5wdXNoKHUuc2hpZnQoKSx1LnNoaWZ0KCksdS5zaGlmdCgpLHUuc2hpZnQoKSksaD11LnNoaWZ0KCksbD11LnNoaWZ0KCksQS5wdXNoKGgsbCk7YnJlYWs7Y2FzZSJjIjpBLnB1c2goaCt1LnNoaWZ0KCksbCt1LnNoaWZ0KCksaCt1LnNoaWZ0KCksbCt1LnNoaWZ0KCkpLGgrPXUuc2hpZnQoKSxsKz11LnNoaWZ0KCksVD0iQyIsQS5wdXNoKGgsbCk7YnJlYWs7Y2FzZSJTIjpfPWgseT1sLCJDIj09PShtPXNbcy5sZW5ndGgtMV0pLmNvbW1hbmQmJihfPWgrKGgtbS5wb2ludHNbMl0pLHk9bCsobC1tLnBvaW50c1szXSkpLEEucHVzaChfLHksdS5zaGlmdCgpLHUuc2hpZnQoKSksaD11LnNoaWZ0KCksbD11LnNoaWZ0KCksVD0iQyIsQS5wdXNoKGgsbCk7YnJlYWs7Y2FzZSJzIjpfPWgseT1sLCJDIj09PShtPXNbcy5sZW5ndGgtMV0pLmNvbW1hbmQmJihfPWgrKGgtbS5wb2ludHNbMl0pLHk9bCsobC1tLnBvaW50c1szXSkpLEEucHVzaChfLHksaCt1LnNoaWZ0KCksbCt1LnNoaWZ0KCkpLGgrPXUuc2hpZnQoKSxsKz11LnNoaWZ0KCksVD0iQyIsQS5wdXNoKGgsbCk7YnJlYWs7Y2FzZSJRIjpBLnB1c2godS5zaGlmdCgpLHUuc2hpZnQoKSksaD11LnNoaWZ0KCksbD11LnNoaWZ0KCksQS5wdXNoKGgsbCk7YnJlYWs7Y2FzZSJxIjpBLnB1c2goaCt1LnNoaWZ0KCksbCt1LnNoaWZ0KCkpLGgrPXUuc2hpZnQoKSxsKz11LnNoaWZ0KCksVD0iUSIsQS5wdXNoKGgsbCk7YnJlYWs7Y2FzZSJUIjpfPWgseT1sLCJRIj09PShtPXNbcy5sZW5ndGgtMV0pLmNvbW1hbmQmJihfPWgrKGgtbS5wb2ludHNbMF0pLHk9bCsobC1tLnBvaW50c1sxXSkpLGg9dS5zaGlmdCgpLGw9dS5zaGlmdCgpLFQ9IlEiLEEucHVzaChfLHksaCxsKTticmVhaztjYXNlInQiOl89aCx5PWwsIlEiPT09KG09c1tzLmxlbmd0aC0xXSkuY29tbWFuZCYmKF89aCsoaC1tLnBvaW50c1swXSkseT1sKyhsLW0ucG9pbnRzWzFdKSksaCs9dS5zaGlmdCgpLGwrPXUuc2hpZnQoKSxUPSJRIixBLnB1c2goXyx5LGgsbCk7YnJlYWs7Y2FzZSJBIjp4PXUuc2hpZnQoKSxiPXUuc2hpZnQoKSxTPXUuc2hpZnQoKSx3PXUuc2hpZnQoKSxDPXUuc2hpZnQoKSxrPWgsUD1sLGg9dS5zaGlmdCgpLGw9dS5zaGlmdCgpLFQ9IkEiLEE9dGhpcy5jb252ZXJ0RW5kcG9pbnRUb0NlbnRlclBhcmFtZXRlcml6YXRpb24oayxQLGgsbCx3LEMseCxiLFMpO2JyZWFrO2Nhc2UiYSI6eD11LnNoaWZ0KCksYj11LnNoaWZ0KCksUz11LnNoaWZ0KCksdz11LnNoaWZ0KCksQz11LnNoaWZ0KCksaz1oLFA9bCxoKz11LnNoaWZ0KCksbCs9dS5zaGlmdCgpLFQ9IkEiLEE9dGhpcy5jb252ZXJ0RW5kcG9pbnRUb0NlbnRlclBhcmFtZXRlcml6YXRpb24oayxQLGgsbCx3LEMseCxiLFMpfXMucHVzaCh7Y29tbWFuZDpUfHxnLHBvaW50czpBLHN0YXJ0Ont4Ok0seTpHfSxwYXRoTGVuZ3RoOnRoaXMuY2FsY0xlbmd0aChNLEcsVHx8ZyxBKX0pfSJ6IiE9PWcmJiJaIiE9PWd8fHMucHVzaCh7Y29tbWFuZDoieiIscG9pbnRzOltdLHN0YXJ0OnZvaWQgMCxwYXRoTGVuZ3RoOjB9KX1yZXR1cm4gc31zdGF0aWMgY2FsY0xlbmd0aCh0LGUsaSxyKXt2YXIgYSxuLHMsbyxoPW5lO3N3aXRjaChpKXtjYXNlIkwiOnJldHVybiBoLmdldExpbmVMZW5ndGgodCxlLHJbMF0sclsxXSk7Y2FzZSJDIjpmb3IoYT0wLG49aC5nZXRQb2ludE9uQ3ViaWNCZXppZXIoMCx0LGUsclswXSxyWzFdLHJbMl0sclszXSxyWzRdLHJbNV0pLG89LjAxO288PTE7bys9LjAxKXM9aC5nZXRQb2ludE9uQ3ViaWNCZXppZXIobyx0LGUsclswXSxyWzFdLHJbMl0sclszXSxyWzRdLHJbNV0pLGErPWguZ2V0TGluZUxlbmd0aChuLngsbi55LHMueCxzLnkpLG49cztyZXR1cm4gYTtjYXNlIlEiOmZvcihhPTAsbj1oLmdldFBvaW50T25RdWFkcmF0aWNCZXppZXIoMCx0LGUsclswXSxyWzFdLHJbMl0sclszXSksbz0uMDE7bzw9MTtvKz0uMDEpcz1oLmdldFBvaW50T25RdWFkcmF0aWNCZXppZXIobyx0LGUsclswXSxyWzFdLHJbMl0sclszXSksYSs9aC5nZXRMaW5lTGVuZ3RoKG4ueCxuLnkscy54LHMueSksbj1zO3JldHVybiBhO2Nhc2UiQSI6YT0wO3ZhciBsPXJbNF0sZD1yWzVdLGM9cls0XStkLGc9TWF0aC5QSS8xODA7aWYoTWF0aC5hYnMobC1jKTxnJiYoZz1NYXRoLmFicyhsLWMpKSxuPWguZ2V0UG9pbnRPbkVsbGlwdGljYWxBcmMoclswXSxyWzFdLHJbMl0sclszXSxsLDApLGQ8MClmb3Iobz1sLWc7bz5jO28tPWcpcz1oLmdldFBvaW50T25FbGxpcHRpY2FsQXJjKHJbMF0sclsxXSxyWzJdLHJbM10sbywwKSxhKz1oLmdldExpbmVMZW5ndGgobi54LG4ueSxzLngscy55KSxuPXM7ZWxzZSBmb3Iobz1sK2c7bzxjO28rPWcpcz1oLmdldFBvaW50T25FbGxpcHRpY2FsQXJjKHJbMF0sclsxXSxyWzJdLHJbM10sbywwKSxhKz1oLmdldExpbmVMZW5ndGgobi54LG4ueSxzLngscy55KSxuPXM7cmV0dXJuIHM9aC5nZXRQb2ludE9uRWxsaXB0aWNhbEFyYyhyWzBdLHJbMV0sclsyXSxyWzNdLGMsMCksYSs9aC5nZXRMaW5lTGVuZ3RoKG4ueCxuLnkscy54LHMueSl9cmV0dXJuIDB9c3RhdGljIGNvbnZlcnRFbmRwb2ludFRvQ2VudGVyUGFyYW1ldGVyaXphdGlvbih0LGUsaSxyLGEsbixzLG8saCl7dmFyIGw9aCooTWF0aC5QSS8xODApLGQ9TWF0aC5jb3MobCkqKHQtaSkvMitNYXRoLnNpbihsKSooZS1yKS8yLGM9LTEqTWF0aC5zaW4obCkqKHQtaSkvMitNYXRoLmNvcyhsKSooZS1yKS8yLGc9ZCpkLyhzKnMpK2MqYy8obypvKTtnPjEmJihzKj1NYXRoLnNxcnQoZyksbyo9TWF0aC5zcXJ0KGcpKTt2YXIgdT1NYXRoLnNxcnQoKHMqcyoobypvKS1zKnMqKGMqYyktbypvKihkKmQpKS8ocypzKihjKmMpK28qbyooZCpkKSkpO2E9PT1uJiYodSo9LTEpLGlzTmFOKHUpJiYodT0wKTt2YXIgZj11KnMqYy9vLHA9dSotbypkL3Msdj0odCtpKS8yK01hdGguY29zKGwpKmYtTWF0aC5zaW4obCkqcCxtPShlK3IpLzIrTWF0aC5zaW4obCkqZitNYXRoLmNvcyhsKSpwLF89ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydCh0WzBdKnRbMF0rdFsxXSp0WzFdKX0seT1mdW5jdGlvbih0LGUpe3JldHVybih0WzBdKmVbMF0rdFsxXSplWzFdKS8oXyh0KSpfKGUpKX0seD1mdW5jdGlvbih0LGUpe3JldHVybih0WzBdKmVbMV08dFsxXSplWzBdPy0xOjEpKk1hdGguYWNvcyh5KHQsZSkpfSxiPXgoWzEsMF0sWyhkLWYpL3MsKGMtcCkvb10pLFM9WyhkLWYpL3MsKGMtcCkvb10sdz1bKC0xKmQtZikvcywoLTEqYy1wKS9vXSxDPXgoUyx3KTtyZXR1cm4geShTLHcpPD0tMSYmKEM9TWF0aC5QSSkseShTLHcpPj0xJiYoQz0wKSwwPT09biYmQz4wJiYoQy09MipNYXRoLlBJKSwxPT09biYmQzwwJiYoQys9MipNYXRoLlBJKSxbdixtLHMsbyxiLEMsbCxuXX19bmUucHJvdG90eXBlLmNsYXNzTmFtZT0iUGF0aCIsbmUucHJvdG90eXBlLl9hdHRyc0FmZmVjdGluZ1NpemU9WyJkYXRhIl0scihuZSksdy5hZGRHZXR0ZXJTZXR0ZXIobmUsImRhdGEiKTtjbGFzcyBzZSBleHRlbmRzIGFle19zY2VuZUZ1bmModCl7c3VwZXIuX3NjZW5lRnVuYyh0KTt2YXIgZT0yKk1hdGguUEksaT10aGlzLnBvaW50cygpLHI9aSxhPTAhPT10aGlzLnRlbnNpb24oKSYmaS5sZW5ndGg+NDthJiYocj10aGlzLmdldFRlbnNpb25Qb2ludHMoKSk7dmFyIG4scyxvPXRoaXMucG9pbnRlckxlbmd0aCgpLGg9aS5sZW5ndGg7aWYoYSl7Y29uc3QgdD1bcltyLmxlbmd0aC00XSxyW3IubGVuZ3RoLTNdLHJbci5sZW5ndGgtMl0scltyLmxlbmd0aC0xXSxpW2gtMl0saVtoLTFdXSxlPW5lLmNhbGNMZW5ndGgocltyLmxlbmd0aC00XSxyW3IubGVuZ3RoLTNdLCJDIix0KSxhPW5lLmdldFBvaW50T25RdWFkcmF0aWNCZXppZXIoTWF0aC5taW4oMSwxLW8vZSksdFswXSx0WzFdLHRbMl0sdFszXSx0WzRdLHRbNV0pO249aVtoLTJdLWEueCxzPWlbaC0xXS1hLnl9ZWxzZSBuPWlbaC0yXS1pW2gtNF0scz1pW2gtMV0taVtoLTNdO3ZhciBsPShNYXRoLmF0YW4yKHMsbikrZSklZSxkPXRoaXMucG9pbnRlcldpZHRoKCk7dGhpcy5wb2ludGVyQXRFbmRpbmcoKSYmKHQuc2F2ZSgpLHQuYmVnaW5QYXRoKCksdC50cmFuc2xhdGUoaVtoLTJdLGlbaC0xXSksdC5yb3RhdGUobCksdC5tb3ZlVG8oMCwwKSx0LmxpbmVUbygtbyxkLzIpLHQubGluZVRvKC1vLC1kLzIpLHQuY2xvc2VQYXRoKCksdC5yZXN0b3JlKCksdGhpcy5fX2ZpbGxTdHJva2UodCkpLHRoaXMucG9pbnRlckF0QmVnaW5uaW5nKCkmJih0LnNhdmUoKSx0LmJlZ2luUGF0aCgpLHQudHJhbnNsYXRlKGlbMF0saVsxXSksYT8obj0oclswXStyWzJdKS8yLWlbMF0scz0oclsxXStyWzNdKS8yLWlbMV0pOihuPWlbMl0taVswXSxzPWlbM10taVsxXSksdC5yb3RhdGUoKE1hdGguYXRhbjIoLXMsLW4pK2UpJWUpLHQubW92ZVRvKDAsMCksdC5saW5lVG8oLW8sZC8yKSx0LmxpbmVUbygtbywtZC8yKSx0LmNsb3NlUGF0aCgpLHQucmVzdG9yZSgpLHRoaXMuX19maWxsU3Ryb2tlKHQpKX1fX2ZpbGxTdHJva2UodCl7dmFyIGU9dGhpcy5kYXNoRW5hYmxlZCgpO2UmJih0aGlzLmF0dHJzLmRhc2hFbmFibGVkPSExLHQuc2V0TGluZURhc2goW10pKSx0LmZpbGxTdHJva2VTaGFwZSh0aGlzKSxlJiYodGhpcy5hdHRycy5kYXNoRW5hYmxlZD0hMCl9Z2V0U2VsZlJlY3QoKXtjb25zdCB0PXN1cGVyLmdldFNlbGZSZWN0KCksZT10aGlzLnBvaW50ZXJXaWR0aCgpLzI7cmV0dXJue3g6dC54LWUseTp0LnktZSx3aWR0aDp0LndpZHRoKzIqZSxoZWlnaHQ6dC5oZWlnaHQrMiplfX19c2UucHJvdG90eXBlLmNsYXNzTmFtZT0iQXJyb3ciLHIoc2UpLHcuYWRkR2V0dGVyU2V0dGVyKHNlLCJwb2ludGVyTGVuZ3RoIiwxMCxwKCkpLHcuYWRkR2V0dGVyU2V0dGVyKHNlLCJwb2ludGVyV2lkdGgiLDEwLHAoKSksdy5hZGRHZXR0ZXJTZXR0ZXIoc2UsInBvaW50ZXJBdEJlZ2lubmluZyIsITEpLHcuYWRkR2V0dGVyU2V0dGVyKHNlLCJwb2ludGVyQXRFbmRpbmciLCEwKTtjbGFzcyBvZSBleHRlbmRzIHp0e19zY2VuZUZ1bmModCl7dC5iZWdpblBhdGgoKSx0LmFyYygwLDAsdGhpcy5hdHRycy5yYWRpdXN8fDAsMCwyKk1hdGguUEksITEpLHQuY2xvc2VQYXRoKCksdC5maWxsU3Ryb2tlU2hhcGUodGhpcyl9Z2V0V2lkdGgoKXtyZXR1cm4gMip0aGlzLnJhZGl1cygpfWdldEhlaWdodCgpe3JldHVybiAyKnRoaXMucmFkaXVzKCl9c2V0V2lkdGgodCl7dGhpcy5yYWRpdXMoKSE9PXQvMiYmdGhpcy5yYWRpdXModC8yKX1zZXRIZWlnaHQodCl7dGhpcy5yYWRpdXMoKSE9PXQvMiYmdGhpcy5yYWRpdXModC8yKX19b2UucHJvdG90eXBlLl9jZW50cm9pZD0hMCxvZS5wcm90b3R5cGUuY2xhc3NOYW1lPSJDaXJjbGUiLG9lLnByb3RvdHlwZS5fYXR0cnNBZmZlY3RpbmdTaXplPVsicmFkaXVzIl0scihvZSksdy5hZGRHZXR0ZXJTZXR0ZXIob2UsInJhZGl1cyIsMCxwKCkpO2NsYXNzIGhlIGV4dGVuZHMgenR7X3NjZW5lRnVuYyh0KXt2YXIgZT10aGlzLnJhZGl1c1goKSxpPXRoaXMucmFkaXVzWSgpO3QuYmVnaW5QYXRoKCksdC5zYXZlKCksZSE9PWkmJnQuc2NhbGUoMSxpL2UpLHQuYXJjKDAsMCxlLDAsMipNYXRoLlBJLCExKSx0LnJlc3RvcmUoKSx0LmNsb3NlUGF0aCgpLHQuZmlsbFN0cm9rZVNoYXBlKHRoaXMpfWdldFdpZHRoKCl7cmV0dXJuIDIqdGhpcy5yYWRpdXNYKCl9Z2V0SGVpZ2h0KCl7cmV0dXJuIDIqdGhpcy5yYWRpdXNZKCl9c2V0V2lkdGgodCl7dGhpcy5yYWRpdXNYKHQvMil9c2V0SGVpZ2h0KHQpe3RoaXMucmFkaXVzWSh0LzIpfX1oZS5wcm90b3R5cGUuY2xhc3NOYW1lPSJFbGxpcHNlIixoZS5wcm90b3R5cGUuX2NlbnRyb2lkPSEwLGhlLnByb3RvdHlwZS5fYXR0cnNBZmZlY3RpbmdTaXplPVsicmFkaXVzWCIsInJhZGl1c1kiXSxyKGhlKSx3LmFkZENvbXBvbmVudHNHZXR0ZXJTZXR0ZXIoaGUsInJhZGl1cyIsWyJ4IiwieSJdKSx3LmFkZEdldHRlclNldHRlcihoZSwicmFkaXVzWCIsMCxwKCkpLHcuYWRkR2V0dGVyU2V0dGVyKGhlLCJyYWRpdXNZIiwwLHAoKSk7Y2xhc3MgbGUgZXh0ZW5kcyB6dHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLm9uKCJpbWFnZUNoYW5nZS5rb252YSIsKCgpPT57dGhpcy5fc2V0SW1hZ2VMb2FkKCl9KSksdGhpcy5fc2V0SW1hZ2VMb2FkKCl9X3NldEltYWdlTG9hZCgpe2NvbnN0IHQ9dGhpcy5pbWFnZSgpO3QmJnQuY29tcGxldGV8fHQmJjQ9PT10LnJlYWR5U3RhdGV8fHQmJnQuYWRkRXZlbnRMaXN0ZW5lciYmdC5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoKCk9Pnt0aGlzLl9yZXF1ZXN0RHJhdygpfSkpfV91c2VCdWZmZXJDYW52YXMoKXtyZXR1cm4gc3VwZXIuX3VzZUJ1ZmZlckNhbnZhcyghMCl9X3NjZW5lRnVuYyh0KXtjb25zdCBlPXRoaXMuZ2V0V2lkdGgoKSxpPXRoaXMuZ2V0SGVpZ2h0KCkscj10aGlzLmF0dHJzLmltYWdlO2xldCBhO2lmKHIpe2NvbnN0IHQ9dGhpcy5hdHRycy5jcm9wV2lkdGgsbj10aGlzLmF0dHJzLmNyb3BIZWlnaHQ7YT10JiZuP1tyLHRoaXMuY3JvcFgoKSx0aGlzLmNyb3BZKCksdCxuLDAsMCxlLGldOltyLDAsMCxlLGldfSh0aGlzLmhhc0ZpbGwoKXx8dGhpcy5oYXNTdHJva2UoKSkmJih0LmJlZ2luUGF0aCgpLHQucmVjdCgwLDAsZSxpKSx0LmNsb3NlUGF0aCgpLHQuZmlsbFN0cm9rZVNoYXBlKHRoaXMpKSxyJiZ0LmRyYXdJbWFnZS5hcHBseSh0LGEpfV9oaXRGdW5jKHQpe3ZhciBlPXRoaXMud2lkdGgoKSxpPXRoaXMuaGVpZ2h0KCk7dC5iZWdpblBhdGgoKSx0LnJlY3QoMCwwLGUsaSksdC5jbG9zZVBhdGgoKSx0LmZpbGxTdHJva2VTaGFwZSh0aGlzKX1nZXRXaWR0aCgpe3ZhciB0LGU7cmV0dXJuIG51bGwhPT0odD10aGlzLmF0dHJzLndpZHRoKSYmdm9pZCAwIT09dD90Om51bGw9PT0oZT10aGlzLmltYWdlKCkpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLndpZHRofWdldEhlaWdodCgpe3ZhciB0LGU7cmV0dXJuIG51bGwhPT0odD10aGlzLmF0dHJzLmhlaWdodCkmJnZvaWQgMCE9PXQ/dDpudWxsPT09KGU9dGhpcy5pbWFnZSgpKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5oZWlnaHR9c3RhdGljIGZyb21VUkwodCxlKXt2YXIgaT1nLmNyZWF0ZUltYWdlRWxlbWVudCgpO2kub25sb2FkPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGxlKHtpbWFnZTppfSk7ZSh0KX0saS5jcm9zc09yaWdpbj0iQW5vbnltb3VzIixpLnNyYz10fX1sZS5wcm90b3R5cGUuY2xhc3NOYW1lPSJJbWFnZSIscihsZSksdy5hZGRHZXR0ZXJTZXR0ZXIobGUsImltYWdlIiksdy5hZGRDb21wb25lbnRzR2V0dGVyU2V0dGVyKGxlLCJjcm9wIixbIngiLCJ5Iiwid2lkdGgiLCJoZWlnaHQiXSksdy5hZGRHZXR0ZXJTZXR0ZXIobGUsImNyb3BYIiwwLHAoKSksdy5hZGRHZXR0ZXJTZXR0ZXIobGUsImNyb3BZIiwwLHAoKSksdy5hZGRHZXR0ZXJTZXR0ZXIobGUsImNyb3BXaWR0aCIsMCxwKCkpLHcuYWRkR2V0dGVyU2V0dGVyKGxlLCJjcm9wSGVpZ2h0IiwwLHAoKSk7dmFyIGRlPVsiZm9udEZhbWlseSIsImZvbnRTaXplIiwiZm9udFN0eWxlIiwicGFkZGluZyIsImxpbmVIZWlnaHQiLCJ0ZXh0Iiwid2lkdGgiLCJoZWlnaHQiXSxjZT0idXAiLGdlPSJyaWdodCIsdWU9ImRvd24iLGZlPSJsZWZ0IixwZT1kZS5sZW5ndGg7Y2xhc3MgdmUgZXh0ZW5kcyBqdHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLm9uKCJhZGQua29udmEiLChmdW5jdGlvbih0KXt0aGlzLl9hZGRMaXN0ZW5lcnModC5jaGlsZCksdGhpcy5fc3luYygpfSkpfWdldFRleHQoKXtyZXR1cm4gdGhpcy5maW5kKCJUZXh0IilbMF19Z2V0VGFnKCl7cmV0dXJuIHRoaXMuZmluZCgiVGFnIilbMF19X2FkZExpc3RlbmVycyh0KXt2YXIgZSxpPXRoaXMscj1mdW5jdGlvbigpe2kuX3N5bmMoKX07Zm9yKGU9MDtlPHBlO2UrKyl0Lm9uKGRlW2VdKyJDaGFuZ2Uua29udmEiLHIpfWdldFdpZHRoKCl7cmV0dXJuIHRoaXMuZ2V0VGV4dCgpLndpZHRoKCl9Z2V0SGVpZ2h0KCl7cmV0dXJuIHRoaXMuZ2V0VGV4dCgpLmhlaWdodCgpfV9zeW5jKCl7dmFyIHQsZSxpLHIsYSxuLHMsbz10aGlzLmdldFRleHQoKSxoPXRoaXMuZ2V0VGFnKCk7aWYobyYmaCl7c3dpdGNoKHQ9by53aWR0aCgpLGU9by5oZWlnaHQoKSxpPWgucG9pbnRlckRpcmVjdGlvbigpLHI9aC5wb2ludGVyV2lkdGgoKSxzPWgucG9pbnRlckhlaWdodCgpLGE9MCxuPTAsaSl7Y2FzZSBjZTphPXQvMixuPS0xKnM7YnJlYWs7Y2FzZSBnZTphPXQrcixuPWUvMjticmVhaztjYXNlIHVlOmE9dC8yLG49ZStzO2JyZWFrO2Nhc2UgZmU6YT0tMSpyLG49ZS8yfWguc2V0QXR0cnMoe3g6LTEqYSx5Oi0xKm4sd2lkdGg6dCxoZWlnaHQ6ZX0pLG8uc2V0QXR0cnMoe3g6LTEqYSx5Oi0xKm59KX19fXZlLnByb3RvdHlwZS5jbGFzc05hbWU9IkxhYmVsIixyKHZlKTtjbGFzcyBtZSBleHRlbmRzIHp0e19zY2VuZUZ1bmModCl7dmFyIGU9dGhpcy53aWR0aCgpLGk9dGhpcy5oZWlnaHQoKSxyPXRoaXMucG9pbnRlckRpcmVjdGlvbigpLGE9dGhpcy5wb2ludGVyV2lkdGgoKSxuPXRoaXMucG9pbnRlckhlaWdodCgpLHM9dGhpcy5jb3JuZXJSYWRpdXMoKTtsZXQgbz0wLGg9MCxsPTAsZD0wOyJudW1iZXIiPT10eXBlb2Ygcz9vPWg9bD1kPU1hdGgubWluKHMsZS8yLGkvMik6KG89TWF0aC5taW4oc1swXXx8MCxlLzIsaS8yKSxoPU1hdGgubWluKHNbMV18fDAsZS8yLGkvMiksZD1NYXRoLm1pbihzWzJdfHwwLGUvMixpLzIpLGw9TWF0aC5taW4oc1szXXx8MCxlLzIsaS8yKSksdC5iZWdpblBhdGgoKSx0Lm1vdmVUbyhvLDApLHI9PT1jZSYmKHQubGluZVRvKChlLWEpLzIsMCksdC5saW5lVG8oZS8yLC0xKm4pLHQubGluZVRvKChlK2EpLzIsMCkpLHQubGluZVRvKGUtaCwwKSx0LmFyYyhlLWgsaCxoLDMqTWF0aC5QSS8yLDAsITEpLHI9PT1nZSYmKHQubGluZVRvKGUsKGktbikvMiksdC5saW5lVG8oZSthLGkvMiksdC5saW5lVG8oZSwoaStuKS8yKSksdC5saW5lVG8oZSxpLWQpLHQuYXJjKGUtZCxpLWQsZCwwLE1hdGguUEkvMiwhMSkscj09PXVlJiYodC5saW5lVG8oKGUrYSkvMixpKSx0LmxpbmVUbyhlLzIsaStuKSx0LmxpbmVUbygoZS1hKS8yLGkpKSx0LmxpbmVUbyhsLGkpLHQuYXJjKGwsaS1sLGwsTWF0aC5QSS8yLE1hdGguUEksITEpLHI9PT1mZSYmKHQubGluZVRvKDAsKGkrbikvMiksdC5saW5lVG8oLTEqYSxpLzIpLHQubGluZVRvKDAsKGktbikvMikpLHQubGluZVRvKDAsbyksdC5hcmMobyxvLG8sTWF0aC5QSSwzKk1hdGguUEkvMiwhMSksdC5jbG9zZVBhdGgoKSx0LmZpbGxTdHJva2VTaGFwZSh0aGlzKX1nZXRTZWxmUmVjdCgpe3ZhciB0PTAsZT0wLGk9dGhpcy5wb2ludGVyV2lkdGgoKSxyPXRoaXMucG9pbnRlckhlaWdodCgpLGE9dGhpcy5wb2ludGVyRGlyZWN0aW9uKCksbj10aGlzLndpZHRoKCkscz10aGlzLmhlaWdodCgpO3JldHVybiBhPT09Y2U/KGUtPXIscys9cik6YT09PXVlP3MrPXI6YT09PWZlPyh0LT0xLjUqaSxuKz1pKTphPT09Z2UmJihuKz0xLjUqaSkse3g6dCx5OmUsd2lkdGg6bixoZWlnaHQ6c319fW1lLnByb3RvdHlwZS5jbGFzc05hbWU9IlRhZyIscihtZSksdy5hZGRHZXR0ZXJTZXR0ZXIobWUsInBvaW50ZXJEaXJlY3Rpb24iLCJub25lIiksdy5hZGRHZXR0ZXJTZXR0ZXIobWUsInBvaW50ZXJXaWR0aCIsMCxwKCkpLHcuYWRkR2V0dGVyU2V0dGVyKG1lLCJwb2ludGVySGVpZ2h0IiwwLHAoKSksdy5hZGRHZXR0ZXJTZXR0ZXIobWUsImNvcm5lclJhZGl1cyIsMCx2KDQpKTtjbGFzcyBfZSBleHRlbmRzIHp0e19zY2VuZUZ1bmModCl7dmFyIGU9dGhpcy5jb3JuZXJSYWRpdXMoKSxpPXRoaXMud2lkdGgoKSxyPXRoaXMuaGVpZ2h0KCk7aWYodC5iZWdpblBhdGgoKSxlKXtsZXQgYT0wLG49MCxzPTAsbz0wOyJudW1iZXIiPT10eXBlb2YgZT9hPW49cz1vPU1hdGgubWluKGUsaS8yLHIvMik6KGE9TWF0aC5taW4oZVswXXx8MCxpLzIsci8yKSxuPU1hdGgubWluKGVbMV18fDAsaS8yLHIvMiksbz1NYXRoLm1pbihlWzJdfHwwLGkvMixyLzIpLHM9TWF0aC5taW4oZVszXXx8MCxpLzIsci8yKSksdC5tb3ZlVG8oYSwwKSx0LmxpbmVUbyhpLW4sMCksdC5hcmMoaS1uLG4sbiwzKk1hdGguUEkvMiwwLCExKSx0LmxpbmVUbyhpLHItbyksdC5hcmMoaS1vLHItbyxvLDAsTWF0aC5QSS8yLCExKSx0LmxpbmVUbyhzLHIpLHQuYXJjKHMsci1zLHMsTWF0aC5QSS8yLE1hdGguUEksITEpLHQubGluZVRvKDAsYSksdC5hcmMoYSxhLGEsTWF0aC5QSSwzKk1hdGguUEkvMiwhMSl9ZWxzZSB0LnJlY3QoMCwwLGkscik7dC5jbG9zZVBhdGgoKSx0LmZpbGxTdHJva2VTaGFwZSh0aGlzKX19X2UucHJvdG90eXBlLmNsYXNzTmFtZT0iUmVjdCIscihfZSksdy5hZGRHZXR0ZXJTZXR0ZXIoX2UsImNvcm5lclJhZGl1cyIsMCx2KDQpKTtjbGFzcyB5ZSBleHRlbmRzIHp0e19zY2VuZUZ1bmModCl7Y29uc3QgZT10aGlzLl9nZXRQb2ludHMoKTt0LmJlZ2luUGF0aCgpLHQubW92ZVRvKGVbMF0ueCxlWzBdLnkpO2Zvcih2YXIgaT0xO2k8ZS5sZW5ndGg7aSsrKXQubGluZVRvKGVbaV0ueCxlW2ldLnkpO3QuY2xvc2VQYXRoKCksdC5maWxsU3Ryb2tlU2hhcGUodGhpcyl9X2dldFBvaW50cygpe2NvbnN0IHQ9dGhpcy5hdHRycy5zaWRlcyxlPXRoaXMuYXR0cnMucmFkaXVzfHwwLGk9W107Zm9yKHZhciByPTA7cjx0O3IrKylpLnB1c2goe3g6ZSpNYXRoLnNpbigyKnIqTWF0aC5QSS90KSx5Oi0xKmUqTWF0aC5jb3MoMipyKk1hdGguUEkvdCl9KTtyZXR1cm4gaX1nZXRTZWxmUmVjdCgpe2NvbnN0IHQ9dGhpcy5fZ2V0UG9pbnRzKCk7dmFyIGU9dFswXS54LGk9dFswXS55LHI9dFswXS54LGE9dFswXS55O3JldHVybiB0LmZvckVhY2goKHQ9PntlPU1hdGgubWluKGUsdC54KSxpPU1hdGgubWF4KGksdC54KSxyPU1hdGgubWluKHIsdC55KSxhPU1hdGgubWF4KGEsdC55KX0pKSx7eDplLHk6cix3aWR0aDppLWUsaGVpZ2h0OmEtcn19Z2V0V2lkdGgoKXtyZXR1cm4gMip0aGlzLnJhZGl1cygpfWdldEhlaWdodCgpe3JldHVybiAyKnRoaXMucmFkaXVzKCl9c2V0V2lkdGgodCl7dGhpcy5yYWRpdXModC8yKX1zZXRIZWlnaHQodCl7dGhpcy5yYWRpdXModC8yKX19eWUucHJvdG90eXBlLmNsYXNzTmFtZT0iUmVndWxhclBvbHlnb24iLHllLnByb3RvdHlwZS5fY2VudHJvaWQ9ITAseWUucHJvdG90eXBlLl9hdHRyc0FmZmVjdGluZ1NpemU9WyJyYWRpdXMiXSxyKHllKSx3LmFkZEdldHRlclNldHRlcih5ZSwicmFkaXVzIiwwLHAoKSksdy5hZGRHZXR0ZXJTZXR0ZXIoeWUsInNpZGVzIiwwLHAoKSk7dmFyIHhlPTIqTWF0aC5QSTtjbGFzcyBiZSBleHRlbmRzIHp0e19zY2VuZUZ1bmModCl7dC5iZWdpblBhdGgoKSx0LmFyYygwLDAsdGhpcy5pbm5lclJhZGl1cygpLDAseGUsITEpLHQubW92ZVRvKHRoaXMub3V0ZXJSYWRpdXMoKSwwKSx0LmFyYygwLDAsdGhpcy5vdXRlclJhZGl1cygpLHhlLDAsITApLHQuY2xvc2VQYXRoKCksdC5maWxsU3Ryb2tlU2hhcGUodGhpcyl9Z2V0V2lkdGgoKXtyZXR1cm4gMip0aGlzLm91dGVyUmFkaXVzKCl9Z2V0SGVpZ2h0KCl7cmV0dXJuIDIqdGhpcy5vdXRlclJhZGl1cygpfXNldFdpZHRoKHQpe3RoaXMub3V0ZXJSYWRpdXModC8yKX1zZXRIZWlnaHQodCl7dGhpcy5vdXRlclJhZGl1cyh0LzIpfX1iZS5wcm90b3R5cGUuY2xhc3NOYW1lPSJSaW5nIixiZS5wcm90b3R5cGUuX2NlbnRyb2lkPSEwLGJlLnByb3RvdHlwZS5fYXR0cnNBZmZlY3RpbmdTaXplPVsiaW5uZXJSYWRpdXMiLCJvdXRlclJhZGl1cyJdLHIoYmUpLHcuYWRkR2V0dGVyU2V0dGVyKGJlLCJpbm5lclJhZGl1cyIsMCxwKCkpLHcuYWRkR2V0dGVyU2V0dGVyKGJlLCJvdXRlclJhZGl1cyIsMCxwKCkpO2NsYXNzIFNlIGV4dGVuZHMgenR7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy5fdXBkYXRlZD0hMCx0aGlzLmFuaW09bmV3IHF0KCgoKT0+e3ZhciB0PXRoaXMuX3VwZGF0ZWQ7cmV0dXJuIHRoaXMuX3VwZGF0ZWQ9ITEsdH0pKSx0aGlzLm9uKCJhbmltYXRpb25DaGFuZ2Uua29udmEiLChmdW5jdGlvbigpe3RoaXMuZnJhbWVJbmRleCgwKX0pKSx0aGlzLm9uKCJmcmFtZUluZGV4Q2hhbmdlLmtvbnZhIiwoZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVkPSEwfSkpLHRoaXMub24oImZyYW1lUmF0ZUNoYW5nZS5rb252YSIsKGZ1bmN0aW9uKCl7dGhpcy5hbmltLmlzUnVubmluZygpJiYoY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKSx0aGlzLl9zZXRJbnRlcnZhbCgpKX0pKX1fc2NlbmVGdW5jKHQpe3ZhciBlPXRoaXMuYW5pbWF0aW9uKCksaT10aGlzLmZyYW1lSW5kZXgoKSxyPTQqaSxhPXRoaXMuYW5pbWF0aW9ucygpW2VdLG49dGhpcy5mcmFtZU9mZnNldHMoKSxzPWFbciswXSxvPWFbcisxXSxoPWFbcisyXSxsPWFbciszXSxkPXRoaXMuaW1hZ2UoKTtpZigodGhpcy5oYXNGaWxsKCl8fHRoaXMuaGFzU3Ryb2tlKCkpJiYodC5iZWdpblBhdGgoKSx0LnJlY3QoMCwwLGgsbCksdC5jbG9zZVBhdGgoKSx0LmZpbGxTdHJva2VTaGFwZSh0aGlzKSksZClpZihuKXt2YXIgYz1uW2VdLGc9MippO3QuZHJhd0ltYWdlKGQscyxvLGgsbCxjW2crMF0sY1tnKzFdLGgsbCl9ZWxzZSB0LmRyYXdJbWFnZShkLHMsbyxoLGwsMCwwLGgsbCl9X2hpdEZ1bmModCl7dmFyIGU9dGhpcy5hbmltYXRpb24oKSxpPXRoaXMuZnJhbWVJbmRleCgpLHI9NCppLGE9dGhpcy5hbmltYXRpb25zKClbZV0sbj10aGlzLmZyYW1lT2Zmc2V0cygpLHM9YVtyKzJdLG89YVtyKzNdO2lmKHQuYmVnaW5QYXRoKCksbil7dmFyIGg9bltlXSxsPTIqaTt0LnJlY3QoaFtsKzBdLGhbbCsxXSxzLG8pfWVsc2UgdC5yZWN0KDAsMCxzLG8pO3QuY2xvc2VQYXRoKCksdC5maWxsU2hhcGUodGhpcyl9X3VzZUJ1ZmZlckNhbnZhcygpe3JldHVybiBzdXBlci5fdXNlQnVmZmVyQ2FudmFzKCEwKX1fc2V0SW50ZXJ2YWwoKXt2YXIgdD10aGlzO3RoaXMuaW50ZXJ2YWw9c2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7dC5fdXBkYXRlSW5kZXgoKX0pLDFlMy90aGlzLmZyYW1lUmF0ZSgpKX1zdGFydCgpe2lmKCF0aGlzLmlzUnVubmluZygpKXt2YXIgdD10aGlzLmdldExheWVyKCk7dGhpcy5hbmltLnNldExheWVycyh0KSx0aGlzLl9zZXRJbnRlcnZhbCgpLHRoaXMuYW5pbS5zdGFydCgpfX1zdG9wKCl7dGhpcy5hbmltLnN0b3AoKSxjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWwpfWlzUnVubmluZygpe3JldHVybiB0aGlzLmFuaW0uaXNSdW5uaW5nKCl9X3VwZGF0ZUluZGV4KCl7dmFyIHQ9dGhpcy5mcmFtZUluZGV4KCksZT10aGlzLmFuaW1hdGlvbigpO3Q8dGhpcy5hbmltYXRpb25zKClbZV0ubGVuZ3RoLzQtMT90aGlzLmZyYW1lSW5kZXgodCsxKTp0aGlzLmZyYW1lSW5kZXgoMCl9fVNlLnByb3RvdHlwZS5jbGFzc05hbWU9IlNwcml0ZSIscihTZSksdy5hZGRHZXR0ZXJTZXR0ZXIoU2UsImFuaW1hdGlvbiIpLHcuYWRkR2V0dGVyU2V0dGVyKFNlLCJhbmltYXRpb25zIiksdy5hZGRHZXR0ZXJTZXR0ZXIoU2UsImZyYW1lT2Zmc2V0cyIpLHcuYWRkR2V0dGVyU2V0dGVyKFNlLCJpbWFnZSIpLHcuYWRkR2V0dGVyU2V0dGVyKFNlLCJmcmFtZUluZGV4IiwwLHAoKSksdy5hZGRHZXR0ZXJTZXR0ZXIoU2UsImZyYW1lUmF0ZSIsMTcscCgpKSx3LmJhY2tDb21wYXQoU2Use2luZGV4OiJmcmFtZUluZGV4IixnZXRJbmRleDoiZ2V0RnJhbWVJbmRleCIsc2V0SW5kZXg6InNldEZyYW1lSW5kZXgifSk7Y2xhc3Mgd2UgZXh0ZW5kcyB6dHtfc2NlbmVGdW5jKHQpe3ZhciBlPXRoaXMuaW5uZXJSYWRpdXMoKSxpPXRoaXMub3V0ZXJSYWRpdXMoKSxyPXRoaXMubnVtUG9pbnRzKCk7dC5iZWdpblBhdGgoKSx0Lm1vdmVUbygwLDAtaSk7Zm9yKHZhciBhPTE7YTwyKnI7YSsrKXt2YXIgbj1hJTI9PTA/aTplLHM9bipNYXRoLnNpbihhKk1hdGguUEkvciksbz0tMSpuKk1hdGguY29zKGEqTWF0aC5QSS9yKTt0LmxpbmVUbyhzLG8pfXQuY2xvc2VQYXRoKCksdC5maWxsU3Ryb2tlU2hhcGUodGhpcyl9Z2V0V2lkdGgoKXtyZXR1cm4gMip0aGlzLm91dGVyUmFkaXVzKCl9Z2V0SGVpZ2h0KCl7cmV0dXJuIDIqdGhpcy5vdXRlclJhZGl1cygpfXNldFdpZHRoKHQpe3RoaXMub3V0ZXJSYWRpdXModC8yKX1zZXRIZWlnaHQodCl7dGhpcy5vdXRlclJhZGl1cyh0LzIpfX1mdW5jdGlvbiBDZSh0KXtyZXR1cm4gQXJyYXkuZnJvbSh0KX13ZS5wcm90b3R5cGUuY2xhc3NOYW1lPSJTdGFyIix3ZS5wcm90b3R5cGUuX2NlbnRyb2lkPSEwLHdlLnByb3RvdHlwZS5fYXR0cnNBZmZlY3RpbmdTaXplPVsiaW5uZXJSYWRpdXMiLCJvdXRlclJhZGl1cyJdLHIod2UpLHcuYWRkR2V0dGVyU2V0dGVyKHdlLCJudW1Qb2ludHMiLDUscCgpKSx3LmFkZEdldHRlclNldHRlcih3ZSwiaW5uZXJSYWRpdXMiLDAscCgpKSx3LmFkZEdldHRlclNldHRlcih3ZSwib3V0ZXJSYWRpdXMiLDAscCgpKTt2YXIga2UsUGU9ImF1dG8iLFRlPSJqdXN0aWZ5IixBZT0ibGVmdCIsTWU9Im1pZGRsZSIsR2U9Im5vcm1hbCIsRWU9IiAiLFJlPVsiZm9udEZhbWlseSIsImZvbnRTaXplIiwiZm9udFN0eWxlIiwiZm9udFZhcmlhbnQiLCJwYWRkaW5nIiwiYWxpZ24iLCJ2ZXJ0aWNhbEFsaWduIiwibGluZUhlaWdodCIsInRleHQiLCJ3aWR0aCIsImhlaWdodCIsIndyYXAiLCJlbGxpcHNpcyIsImxldHRlclNwYWNpbmciXSxMZT1SZS5sZW5ndGg7ZnVuY3Rpb24gRGUoKXtyZXR1cm4ga2V8fChrZT1nLmNyZWF0ZUNhbnZhc0VsZW1lbnQoKS5nZXRDb250ZXh0KCIyZCIpKX1jbGFzcyBPZSBleHRlbmRzIHp0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKGZ1bmN0aW9uKHQpe3JldHVybih0PXR8fHt9KS5maWxsTGluZWFyR3JhZGllbnRDb2xvclN0b3BzfHx0LmZpbGxSYWRpYWxHcmFkaWVudENvbG9yU3RvcHN8fHQuZmlsbFBhdHRlcm5JbWFnZXx8KHQuZmlsbD10LmZpbGx8fCJibGFjayIpLHR9KHQpKSx0aGlzLl9wYXJ0aWFsVGV4dFg9MCx0aGlzLl9wYXJ0aWFsVGV4dFk9MDtmb3IodmFyIGU9MDtlPExlO2UrKyl0aGlzLm9uKFJlW2VdKyJDaGFuZ2Uua29udmEiLHRoaXMuX3NldFRleHREYXRhKTt0aGlzLl9zZXRUZXh0RGF0YSgpfV9zY2VuZUZ1bmModCl7dmFyIGU9dGhpcy50ZXh0QXJyLGk9ZS5sZW5ndGg7aWYodGhpcy50ZXh0KCkpe3ZhciByLGE9dGhpcy5wYWRkaW5nKCksbj10aGlzLmZvbnRTaXplKCkscz10aGlzLmxpbmVIZWlnaHQoKSpuLG89dGhpcy52ZXJ0aWNhbEFsaWduKCksaD0wLGw9dGhpcy5hbGlnbigpLGQ9dGhpcy5nZXRXaWR0aCgpLGM9dGhpcy5sZXR0ZXJTcGFjaW5nKCksZz10aGlzLmZpbGwoKSx1PXRoaXMudGV4dERlY29yYXRpb24oKSxmPS0xIT09dS5pbmRleE9mKCJ1bmRlcmxpbmUiKSxwPS0xIT09dS5pbmRleE9mKCJsaW5lLXRocm91Z2giKSx2PTAsbT0odj1zLzIsMCksXz0wO2Zvcih0LnNldEF0dHIoImZvbnQiLHRoaXMuX2dldENvbnRleHRGb250KCkpLHQuc2V0QXR0cigidGV4dEJhc2VsaW5lIixNZSksdC5zZXRBdHRyKCJ0ZXh0QWxpZ24iLEFlKSxvPT09TWU/aD0odGhpcy5nZXRIZWlnaHQoKS1pKnMtMiphKS8yOiJib3R0b20iPT09byYmKGg9dGhpcy5nZXRIZWlnaHQoKS1pKnMtMiphKSx0LnRyYW5zbGF0ZShhLGgrYSkscj0wO3I8aTtyKyspe209MCxfPTA7dmFyIHkseCxiLFM9ZVtyXSx3PVMudGV4dCxDPVMud2lkdGgsaz1yIT09aS0xO2lmKHQuc2F2ZSgpLCJyaWdodCI9PT1sP20rPWQtQy0yKmE6ImNlbnRlciI9PT1sJiYobSs9KGQtQy0yKmEpLzIpLGYmJih0LnNhdmUoKSx0LmJlZ2luUGF0aCgpLHQubW92ZVRvKG0sditfK01hdGgucm91bmQobi8yKSkseD0wPT09KHk9dy5zcGxpdCgiICIpLmxlbmd0aC0xKSxiPWw9PT1UZSYmayYmIXg/ZC0yKmE6Qyx0LmxpbmVUbyhtK01hdGgucm91bmQoYiksditfK01hdGgucm91bmQobi8yKSksdC5saW5lV2lkdGg9bi8xNSx0LnN0cm9rZVN0eWxlPWcsdC5zdHJva2UoKSx0LnJlc3RvcmUoKSkscCYmKHQuc2F2ZSgpLHQuYmVnaW5QYXRoKCksdC5tb3ZlVG8obSx2K18pLHg9MD09PSh5PXcuc3BsaXQoIiAiKS5sZW5ndGgtMSksYj1sPT09VGUmJmsmJiF4P2QtMiphOkMsdC5saW5lVG8obStNYXRoLnJvdW5kKGIpLHYrXyksdC5saW5lV2lkdGg9bi8xNSx0LnN0cm9rZVN0eWxlPWcsdC5zdHJva2UoKSx0LnJlc3RvcmUoKSksMCE9PWN8fGw9PT1UZSl7eT13LnNwbGl0KCIgIikubGVuZ3RoLTE7Zm9yKHZhciBQPUNlKHcpLFQ9MDtUPFAubGVuZ3RoO1QrKyl7dmFyIEE9UFtUXTsiICI9PT1BJiZyIT09aS0xJiZsPT09VGUmJihtKz0oZC0yKmEtQykveSksdGhpcy5fcGFydGlhbFRleHRYPW0sdGhpcy5fcGFydGlhbFRleHRZPXYrXyx0aGlzLl9wYXJ0aWFsVGV4dD1BLHQuZmlsbFN0cm9rZVNoYXBlKHRoaXMpLG0rPXRoaXMubWVhc3VyZVNpemUoQSkud2lkdGgrY319ZWxzZSB0aGlzLl9wYXJ0aWFsVGV4dFg9bSx0aGlzLl9wYXJ0aWFsVGV4dFk9ditfLHRoaXMuX3BhcnRpYWxUZXh0PXcsdC5maWxsU3Ryb2tlU2hhcGUodGhpcyk7dC5yZXN0b3JlKCksaT4xJiYodis9cyl9fX1faGl0RnVuYyh0KXt2YXIgZT10aGlzLmdldFdpZHRoKCksaT10aGlzLmdldEhlaWdodCgpO3QuYmVnaW5QYXRoKCksdC5yZWN0KDAsMCxlLGkpLHQuY2xvc2VQYXRoKCksdC5maWxsU3Ryb2tlU2hhcGUodGhpcyl9c2V0VGV4dCh0KXt2YXIgZT1nLl9pc1N0cmluZyh0KT90Om51bGw9PXQ/IiI6dCsiIjtyZXR1cm4gdGhpcy5fc2V0QXR0cigidGV4dCIsZSksdGhpc31nZXRXaWR0aCgpe3JldHVybiB0aGlzLmF0dHJzLndpZHRoPT09UGV8fHZvaWQgMD09PXRoaXMuYXR0cnMud2lkdGg/dGhpcy5nZXRUZXh0V2lkdGgoKSsyKnRoaXMucGFkZGluZygpOnRoaXMuYXR0cnMud2lkdGh9Z2V0SGVpZ2h0KCl7cmV0dXJuIHRoaXMuYXR0cnMuaGVpZ2h0PT09UGV8fHZvaWQgMD09PXRoaXMuYXR0cnMuaGVpZ2h0P3RoaXMuZm9udFNpemUoKSp0aGlzLnRleHRBcnIubGVuZ3RoKnRoaXMubGluZUhlaWdodCgpKzIqdGhpcy5wYWRkaW5nKCk6dGhpcy5hdHRycy5oZWlnaHR9Z2V0VGV4dFdpZHRoKCl7cmV0dXJuIHRoaXMudGV4dFdpZHRofWdldFRleHRIZWlnaHQoKXtyZXR1cm4gZy53YXJuKCJ0ZXh0LmdldFRleHRIZWlnaHQoKSBtZXRob2QgaXMgZGVwcmVjYXRlZC4gVXNlIHRleHQuaGVpZ2h0KCkgLSBmb3IgZnVsbCBoZWlnaHQgYW5kIHRleHQuZm9udFNpemUoKSAtIGZvciBvbmUgbGluZSBoZWlnaHQuIiksdGhpcy50ZXh0SGVpZ2h0fW1lYXN1cmVTaXplKHQpe3ZhciBlLGk9RGUoKSxyPXRoaXMuZm9udFNpemUoKTtyZXR1cm4gaS5zYXZlKCksaS5mb250PXRoaXMuX2dldENvbnRleHRGb250KCksZT1pLm1lYXN1cmVUZXh0KHQpLGkucmVzdG9yZSgpLHt3aWR0aDplLndpZHRoLGhlaWdodDpyfX1fZ2V0Q29udGV4dEZvbnQoKXtyZXR1cm4gdGhpcy5mb250U3R5bGUoKStFZSt0aGlzLmZvbnRWYXJpYW50KCkrRWUrKHRoaXMuZm9udFNpemUoKSsicHggIikrdGhpcy5mb250RmFtaWx5KCkuc3BsaXQoIiwiKS5tYXAoKHQ9Pntjb25zdCBlPSh0PXQudHJpbSgpKS5pbmRleE9mKCIgIik+PTAsaT10LmluZGV4T2YoJyInKT49MHx8dC5pbmRleE9mKCInIik+PTA7cmV0dXJuIGUmJiFpJiYodD1gIiR7dH0iYCksdH0pKS5qb2luKCIsICIpfV9hZGRUZXh0TGluZSh0KXt0aGlzLmFsaWduKCk9PT1UZSYmKHQ9dC50cmltKCkpO3ZhciBlPXRoaXMuX2dldFRleHRXaWR0aCh0KTtyZXR1cm4gdGhpcy50ZXh0QXJyLnB1c2goe3RleHQ6dCx3aWR0aDplfSl9X2dldFRleHRXaWR0aCh0KXt2YXIgZT10aGlzLmxldHRlclNwYWNpbmcoKSxpPXQubGVuZ3RoO3JldHVybiBEZSgpLm1lYXN1cmVUZXh0KHQpLndpZHRoKyhpP2UqKGktMSk6MCl9X3NldFRleHREYXRhKCl7dmFyIHQ9dGhpcy50ZXh0KCkuc3BsaXQoIlxuIiksZT0rdGhpcy5mb250U2l6ZSgpLGk9MCxyPXRoaXMubGluZUhlaWdodCgpKmUsYT10aGlzLmF0dHJzLndpZHRoLG49dGhpcy5hdHRycy5oZWlnaHQscz1hIT09UGUmJnZvaWQgMCE9PWEsbz1uIT09UGUmJnZvaWQgMCE9PW4saD10aGlzLnBhZGRpbmcoKSxsPWEtMipoLGQ9bi0yKmgsYz0wLGc9dGhpcy53cmFwKCksdT0ibm9uZSIhPT1nLGY9ImNoYXIiIT09ZyYmdSxwPXRoaXMuZWxsaXBzaXMoKTt0aGlzLnRleHRBcnI9W10sRGUoKS5mb250PXRoaXMuX2dldENvbnRleHRGb250KCk7Zm9yKHZhciB2PXA/dGhpcy5fZ2V0VGV4dFdpZHRoKCLigKYiKTowLG09MCxfPXQubGVuZ3RoO208XzsrK20pe3ZhciB5PXRbbV0seD10aGlzLl9nZXRUZXh0V2lkdGgoeSk7aWYocyYmeD5sKWZvcig7eS5sZW5ndGg+MDspe2Zvcih2YXIgYj0wLFM9eS5sZW5ndGgsdz0iIixDPTA7YjxTOyl7dmFyIGs9YitTPj4+MSxQPXkuc2xpY2UoMCxrKzEpLFQ9dGhpcy5fZ2V0VGV4dFdpZHRoKFApK3Y7VDw9bD8oYj1rKzEsdz1QLEM9VCk6Uz1rfWlmKCF3KWJyZWFrO2lmKGYpe3ZhciBBLE09eVt3Lmxlbmd0aF07KEE9KE09PT1FZXx8Ii0iPT09TSkmJkM8PWw/dy5sZW5ndGg6TWF0aC5tYXgody5sYXN0SW5kZXhPZihFZSksdy5sYXN0SW5kZXhPZigiLSIpKSsxKT4wJiYoYj1BLHc9dy5zbGljZSgwLGIpLEM9dGhpcy5fZ2V0VGV4dFdpZHRoKHcpKX1pZih3PXcudHJpbVJpZ2h0KCksdGhpcy5fYWRkVGV4dExpbmUodyksaT1NYXRoLm1heChpLEMpLGMrPXIsIXV8fG8mJmMrcj5kKXt2YXIgRz10aGlzLnRleHRBcnJbdGhpcy50ZXh0QXJyLmxlbmd0aC0xXTtpZihHKWlmKHApdGhpcy5fZ2V0VGV4dFdpZHRoKEcudGV4dCsi4oCmIik8bHx8KEcudGV4dD1HLnRleHQuc2xpY2UoMCxHLnRleHQubGVuZ3RoLTMpKSx0aGlzLnRleHRBcnIuc3BsaWNlKHRoaXMudGV4dEFyci5sZW5ndGgtMSwxKSx0aGlzLl9hZGRUZXh0TGluZShHLnRleHQrIuKApiIpO2JyZWFrfWlmKCh5PSh5PXkuc2xpY2UoYikpLnRyaW1MZWZ0KCkpLmxlbmd0aD4wJiYoeD10aGlzLl9nZXRUZXh0V2lkdGgoeSkpPD1sKXt0aGlzLl9hZGRUZXh0TGluZSh5KSxjKz1yLGk9TWF0aC5tYXgoaSx4KTticmVha319ZWxzZSB0aGlzLl9hZGRUZXh0TGluZSh5KSxjKz1yLGk9TWF0aC5tYXgoaSx4KTtpZihvJiZjK3I+ZClicmVha310aGlzLnRleHRIZWlnaHQ9ZSx0aGlzLnRleHRXaWR0aD1pfWdldFN0cm9rZVNjYWxlRW5hYmxlZCgpe3JldHVybiEwfX1PZS5wcm90b3R5cGUuX2ZpbGxGdW5jPWZ1bmN0aW9uKHQpe3QuZmlsbFRleHQodGhpcy5fcGFydGlhbFRleHQsdGhpcy5fcGFydGlhbFRleHRYLHRoaXMuX3BhcnRpYWxUZXh0WSl9LE9lLnByb3RvdHlwZS5fc3Ryb2tlRnVuYz1mdW5jdGlvbih0KXt0LnN0cm9rZVRleHQodGhpcy5fcGFydGlhbFRleHQsdGhpcy5fcGFydGlhbFRleHRYLHRoaXMuX3BhcnRpYWxUZXh0WSl9LE9lLnByb3RvdHlwZS5jbGFzc05hbWU9IlRleHQiLE9lLnByb3RvdHlwZS5fYXR0cnNBZmZlY3RpbmdTaXplPVsidGV4dCIsImZvbnRTaXplIiwicGFkZGluZyIsIndyYXAiLCJsaW5lSGVpZ2h0IiwibGV0dGVyU3BhY2luZyJdLHIoT2UpLHcub3ZlcldyaXRlU2V0dGVyKE9lLCJ3aWR0aCIsbSgpKSx3Lm92ZXJXcml0ZVNldHRlcihPZSwiaGVpZ2h0IixtKCkpLHcuYWRkR2V0dGVyU2V0dGVyKE9lLCJmb250RmFtaWx5IiwiQXJpYWwiKSx3LmFkZEdldHRlclNldHRlcihPZSwiZm9udFNpemUiLDEyLHAoKSksdy5hZGRHZXR0ZXJTZXR0ZXIoT2UsImZvbnRTdHlsZSIsR2UpLHcuYWRkR2V0dGVyU2V0dGVyKE9lLCJmb250VmFyaWFudCIsR2UpLHcuYWRkR2V0dGVyU2V0dGVyKE9lLCJwYWRkaW5nIiwwLHAoKSksdy5hZGRHZXR0ZXJTZXR0ZXIoT2UsImFsaWduIixBZSksdy5hZGRHZXR0ZXJTZXR0ZXIoT2UsInZlcnRpY2FsQWxpZ24iLCJ0b3AiKSx3LmFkZEdldHRlclNldHRlcihPZSwibGluZUhlaWdodCIsMSxwKCkpLHcuYWRkR2V0dGVyU2V0dGVyKE9lLCJ3cmFwIiwid29yZCIpLHcuYWRkR2V0dGVyU2V0dGVyKE9lLCJlbGxpcHNpcyIsITEseCgpKSx3LmFkZEdldHRlclNldHRlcihPZSwibGV0dGVyU3BhY2luZyIsMCxwKCkpLHcuYWRkR2V0dGVyU2V0dGVyKE9lLCJ0ZXh0IiwiIixfKCkpLHcuYWRkR2V0dGVyU2V0dGVyKE9lLCJ0ZXh0RGVjb3JhdGlvbiIsIiIpO3ZhciBJZT0ibm9ybWFsIjtmdW5jdGlvbiBGZSh0KXt0LmZpbGxUZXh0KHRoaXMucGFydGlhbFRleHQsMCwwKX1mdW5jdGlvbiBOZSh0KXt0LnN0cm9rZVRleHQodGhpcy5wYXJ0aWFsVGV4dCwwLDApfWNsYXNzIEJlIGV4dGVuZHMgenR7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy5kdW1teUNhbnZhcz1nLmNyZWF0ZUNhbnZhc0VsZW1lbnQoKSx0aGlzLmRhdGFBcnJheT1bXSx0aGlzLmRhdGFBcnJheT1uZS5wYXJzZVBhdGhEYXRhKHRoaXMuYXR0cnMuZGF0YSksdGhpcy5vbigiZGF0YUNoYW5nZS5rb252YSIsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhQXJyYXk9bmUucGFyc2VQYXRoRGF0YSh0aGlzLmF0dHJzLmRhdGEpLHRoaXMuX3NldFRleHREYXRhKCl9KSksdGhpcy5vbigidGV4dENoYW5nZS5rb252YSBhbGlnbkNoYW5nZS5rb252YSBsZXR0ZXJTcGFjaW5nQ2hhbmdlLmtvbnZhIGtlcm5pbmdGdW5jQ2hhbmdlLmtvbnZhIGZvbnRTaXplQ2hhbmdlLmtvbnZhIix0aGlzLl9zZXRUZXh0RGF0YSksdGhpcy5fc2V0VGV4dERhdGEoKX1fc2NlbmVGdW5jKHQpe3Quc2V0QXR0cigiZm9udCIsdGhpcy5fZ2V0Q29udGV4dEZvbnQoKSksdC5zZXRBdHRyKCJ0ZXh0QmFzZWxpbmUiLHRoaXMudGV4dEJhc2VsaW5lKCkpLHQuc2V0QXR0cigidGV4dEFsaWduIiwibGVmdCIpLHQuc2F2ZSgpO3ZhciBlPXRoaXMudGV4dERlY29yYXRpb24oKSxpPXRoaXMuZmlsbCgpLHI9dGhpcy5mb250U2l6ZSgpLGE9dGhpcy5nbHlwaEluZm87InVuZGVybGluZSI9PT1lJiZ0LmJlZ2luUGF0aCgpO2Zvcih2YXIgbj0wO248YS5sZW5ndGg7bisrKXt0LnNhdmUoKTt2YXIgcz1hW25dLnAwO3QudHJhbnNsYXRlKHMueCxzLnkpLHQucm90YXRlKGFbbl0ucm90YXRpb24pLHRoaXMucGFydGlhbFRleHQ9YVtuXS50ZXh0LHQuZmlsbFN0cm9rZVNoYXBlKHRoaXMpLCJ1bmRlcmxpbmUiPT09ZSYmKDA9PT1uJiZ0Lm1vdmVUbygwLHIvMisxKSx0LmxpbmVUbyhyLHIvMisxKSksdC5yZXN0b3JlKCl9InVuZGVybGluZSI9PT1lJiYodC5zdHJva2VTdHlsZT1pLHQubGluZVdpZHRoPXIvMjAsdC5zdHJva2UoKSksdC5yZXN0b3JlKCl9X2hpdEZ1bmModCl7dC5iZWdpblBhdGgoKTt2YXIgZT10aGlzLmdseXBoSW5mbztpZihlLmxlbmd0aD49MSl7dmFyIGk9ZVswXS5wMDt0Lm1vdmVUbyhpLngsaS55KX1mb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIGE9ZVtyXS5wMTt0LmxpbmVUbyhhLngsYS55KX10LnNldEF0dHIoImxpbmVXaWR0aCIsdGhpcy5mb250U2l6ZSgpKSx0LnNldEF0dHIoInN0cm9rZVN0eWxlIix0aGlzLmNvbG9yS2V5KSx0LnN0cm9rZSgpfWdldFRleHRXaWR0aCgpe3JldHVybiB0aGlzLnRleHRXaWR0aH1nZXRUZXh0SGVpZ2h0KCl7cmV0dXJuIGcud2FybigidGV4dC5nZXRUZXh0SGVpZ2h0KCkgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFVzZSB0ZXh0LmhlaWdodCgpIC0gZm9yIGZ1bGwgaGVpZ2h0IGFuZCB0ZXh0LmZvbnRTaXplKCkgLSBmb3Igb25lIGxpbmUgaGVpZ2h0LiIpLHRoaXMudGV4dEhlaWdodH1zZXRUZXh0KHQpe3JldHVybiBPZS5wcm90b3R5cGUuc2V0VGV4dC5jYWxsKHRoaXMsdCl9X2dldENvbnRleHRGb250KCl7cmV0dXJuIE9lLnByb3RvdHlwZS5fZ2V0Q29udGV4dEZvbnQuY2FsbCh0aGlzKX1fZ2V0VGV4dFNpemUodCl7dmFyIGU9dGhpcy5kdW1teUNhbnZhcy5nZXRDb250ZXh0KCIyZCIpO2Uuc2F2ZSgpLGUuZm9udD10aGlzLl9nZXRDb250ZXh0Rm9udCgpO3ZhciBpPWUubWVhc3VyZVRleHQodCk7cmV0dXJuIGUucmVzdG9yZSgpLHt3aWR0aDppLndpZHRoLGhlaWdodDpwYXJzZUludCh0aGlzLmF0dHJzLmZvbnRTaXplLDEwKX19X3NldFRleHREYXRhKCl7dmFyIHQ9dGhpcyxlPXRoaXMuX2dldFRleHRTaXplKHRoaXMuYXR0cnMudGV4dCksaT10aGlzLmxldHRlclNwYWNpbmcoKSxyPXRoaXMuYWxpZ24oKSxhPXRoaXMua2VybmluZ0Z1bmMoKTt0aGlzLnRleHRXaWR0aD1lLndpZHRoLHRoaXMudGV4dEhlaWdodD1lLmhlaWdodDt2YXIgbj1NYXRoLm1heCh0aGlzLnRleHRXaWR0aCsoKHRoaXMuYXR0cnMudGV4dHx8IiIpLmxlbmd0aC0xKSppLDApO3RoaXMuZ2x5cGhJbmZvPVtdO2Zvcih2YXIgcz0wLG89MDtvPHQuZGF0YUFycmF5Lmxlbmd0aDtvKyspdC5kYXRhQXJyYXlbb10ucGF0aExlbmd0aD4wJiYocys9dC5kYXRhQXJyYXlbb10ucGF0aExlbmd0aCk7dmFyIGg9MDsiY2VudGVyIj09PXImJihoPU1hdGgubWF4KDAscy8yLW4vMikpLCJyaWdodCI9PT1yJiYoaD1NYXRoLm1heCgwLHMtbikpO2Zvcih2YXIgbCxkLGMsZz1DZSh0aGlzLnRleHQoKSksdT10aGlzLnRleHQoKS5zcGxpdCgiICIpLmxlbmd0aC0xLGY9LTEscD0wLHY9ZnVuY3Rpb24oKXtwPTA7Zm9yKHZhciBlPXQuZGF0YUFycmF5LGk9ZisxO2k8ZS5sZW5ndGg7aSsrKXtpZihlW2ldLnBhdGhMZW5ndGg+MClyZXR1cm4gZj1pLGVbaV07Ik0iPT09ZVtpXS5jb21tYW5kJiYobD17eDplW2ldLnBvaW50c1swXSx5OmVbaV0ucG9pbnRzWzFdfSl9cmV0dXJue319LG09ZnVuY3Rpb24oZSl7dmFyIGE9dC5fZ2V0VGV4dFNpemUoZSkud2lkdGgraTsiICI9PT1lJiYianVzdGlmeSI9PT1yJiYoYSs9KHMtbikvdSk7dmFyIG89MCxoPTA7Zm9yKGQ9dm9pZCAwO01hdGguYWJzKGEtbykvYT4uMDEmJmg8MjA7KXtoKys7Zm9yKHZhciBnPW87dm9pZCAwPT09YzspKGM9digpKSYmZytjLnBhdGhMZW5ndGg8YSYmKGcrPWMucGF0aExlbmd0aCxjPXZvaWQgMCk7aWYoYz09PXt9fHx2b2lkIDA9PT1sKXJldHVybjt2YXIgZj0hMTtzd2l0Y2goYy5jb21tYW5kKXtjYXNlIkwiOm5lLmdldExpbmVMZW5ndGgobC54LGwueSxjLnBvaW50c1swXSxjLnBvaW50c1sxXSk+YT9kPW5lLmdldFBvaW50T25MaW5lKGEsbC54LGwueSxjLnBvaW50c1swXSxjLnBvaW50c1sxXSxsLngsbC55KTpjPXZvaWQgMDticmVhaztjYXNlIkEiOnZhciBtPWMucG9pbnRzWzRdLF89Yy5wb2ludHNbNV0seT1jLnBvaW50c1s0XStfOzA9PT1wP3A9bSsxZS04OmE+bz9wKz1NYXRoLlBJLzE4MCpfL01hdGguYWJzKF8pOnAtPU1hdGguUEkvMzYwKl8vTWF0aC5hYnMoXyksKF88MCYmcDx5fHxfPj0wJiZwPnkpJiYocD15LGY9ITApLGQ9bmUuZ2V0UG9pbnRPbkVsbGlwdGljYWxBcmMoYy5wb2ludHNbMF0sYy5wb2ludHNbMV0sYy5wb2ludHNbMl0sYy5wb2ludHNbM10scCxjLnBvaW50c1s2XSk7YnJlYWs7Y2FzZSJDIjowPT09cD9wPWE+Yy5wYXRoTGVuZ3RoPzFlLTg6YS9jLnBhdGhMZW5ndGg6YT5vP3ArPShhLW8pL2MucGF0aExlbmd0aC8yOnA9TWF0aC5tYXgocC0oby1hKS9jLnBhdGhMZW5ndGgvMiwwKSxwPjEmJihwPTEsZj0hMCksZD1uZS5nZXRQb2ludE9uQ3ViaWNCZXppZXIocCxjLnN0YXJ0LngsYy5zdGFydC55LGMucG9pbnRzWzBdLGMucG9pbnRzWzFdLGMucG9pbnRzWzJdLGMucG9pbnRzWzNdLGMucG9pbnRzWzRdLGMucG9pbnRzWzVdKTticmVhaztjYXNlIlEiOjA9PT1wP3A9YS9jLnBhdGhMZW5ndGg6YT5vP3ArPShhLW8pL2MucGF0aExlbmd0aDpwLT0oby1hKS9jLnBhdGhMZW5ndGgscD4xJiYocD0xLGY9ITApLGQ9bmUuZ2V0UG9pbnRPblF1YWRyYXRpY0JlemllcihwLGMuc3RhcnQueCxjLnN0YXJ0LnksYy5wb2ludHNbMF0sYy5wb2ludHNbMV0sYy5wb2ludHNbMl0sYy5wb2ludHNbM10pfXZvaWQgMCE9PWQmJihvPW5lLmdldExpbmVMZW5ndGgobC54LGwueSxkLngsZC55KSksZiYmKGY9ITEsYz12b2lkIDApfX0sXz1oLyh0Ll9nZXRUZXh0U2l6ZSgiQyIpLndpZHRoK2kpLTEseT0wO3k8XyYmKG0oIkMiKSx2b2lkIDAhPT1sJiZ2b2lkIDAhPT1kKTt5KyspbD1kO2Zvcih2YXIgeD0wO3g8Zy5sZW5ndGgmJihtKGdbeF0pLHZvaWQgMCE9PWwmJnZvaWQgMCE9PWQpO3grKyl7dmFyIGI9bmUuZ2V0TGluZUxlbmd0aChsLngsbC55LGQueCxkLnkpLFM9MDtpZihhKXRyeXtTPWEoZ1t4LTFdLGdbeF0pKnRoaXMuZm9udFNpemUoKX1jYXRjaCh0KXtTPTB9bC54Kz1TLGQueCs9Uyx0aGlzLnRleHRXaWR0aCs9Uzt2YXIgdz1uZS5nZXRQb2ludE9uTGluZShTK2IvMixsLngsbC55LGQueCxkLnkpLEM9TWF0aC5hdGFuMihkLnktbC55LGQueC1sLngpO3RoaXMuZ2x5cGhJbmZvLnB1c2goe3RyYW5zcG9zZVg6dy54LHRyYW5zcG9zZVk6dy55LHRleHQ6Z1t4XSxyb3RhdGlvbjpDLHAwOmwscDE6ZH0pLGw9ZH19Z2V0U2VsZlJlY3QoKXtpZighdGhpcy5nbHlwaEluZm8ubGVuZ3RoKXJldHVybnt4OjAseTowLHdpZHRoOjAsaGVpZ2h0OjB9O3ZhciB0PVtdO3RoaXMuZ2x5cGhJbmZvLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QucHVzaChlLnAwLngpLHQucHVzaChlLnAwLnkpLHQucHVzaChlLnAxLngpLHQucHVzaChlLnAxLnkpfSkpO2Zvcih2YXIgZSxpLHI9dFswXXx8MCxhPXRbMF18fDAsbj10WzFdfHwwLHM9dFsxXXx8MCxvPTA7bzx0Lmxlbmd0aC8yO28rKyllPXRbMipvXSxpPXRbMipvKzFdLHI9TWF0aC5taW4ocixlKSxhPU1hdGgubWF4KGEsZSksbj1NYXRoLm1pbihuLGkpLHM9TWF0aC5tYXgocyxpKTt2YXIgaD10aGlzLmZvbnRTaXplKCk7cmV0dXJue3g6ci1oLzIseTpuLWgvMix3aWR0aDphLXIraCxoZWlnaHQ6cy1uK2h9fX1CZS5wcm90b3R5cGUuX2ZpbGxGdW5jPUZlLEJlLnByb3RvdHlwZS5fc3Ryb2tlRnVuYz1OZSxCZS5wcm90b3R5cGUuX2ZpbGxGdW5jSGl0PUZlLEJlLnByb3RvdHlwZS5fc3Ryb2tlRnVuY0hpdD1OZSxCZS5wcm90b3R5cGUuY2xhc3NOYW1lPSJUZXh0UGF0aCIsQmUucHJvdG90eXBlLl9hdHRyc0FmZmVjdGluZ1NpemU9WyJ0ZXh0IiwiZm9udFNpemUiLCJkYXRhIl0scihCZSksdy5hZGRHZXR0ZXJTZXR0ZXIoQmUsImRhdGEiKSx3LmFkZEdldHRlclNldHRlcihCZSwiZm9udEZhbWlseSIsIkFyaWFsIiksdy5hZGRHZXR0ZXJTZXR0ZXIoQmUsImZvbnRTaXplIiwxMixwKCkpLHcuYWRkR2V0dGVyU2V0dGVyKEJlLCJmb250U3R5bGUiLEllKSx3LmFkZEdldHRlclNldHRlcihCZSwiYWxpZ24iLCJsZWZ0Iiksdy5hZGRHZXR0ZXJTZXR0ZXIoQmUsImxldHRlclNwYWNpbmciLDAscCgpKSx3LmFkZEdldHRlclNldHRlcihCZSwidGV4dEJhc2VsaW5lIiwibWlkZGxlIiksdy5hZGRHZXR0ZXJTZXR0ZXIoQmUsImZvbnRWYXJpYW50IixJZSksdy5hZGRHZXR0ZXJTZXR0ZXIoQmUsInRleHQiLCIiKSx3LmFkZEdldHRlclNldHRlcihCZSwidGV4dERlY29yYXRpb24iLG51bGwpLHcuYWRkR2V0dGVyU2V0dGVyKEJlLCJrZXJuaW5nRnVuYyIsbnVsbCk7dmFyIHplPSJ0ci1rb252YSIsV2U9WyJyZXNpemVFbmFibGVkQ2hhbmdlIiwicm90YXRlQW5jaG9yT2Zmc2V0Q2hhbmdlIiwicm90YXRlRW5hYmxlZENoYW5nZSIsImVuYWJsZWRBbmNob3JzQ2hhbmdlIiwiYW5jaG9yU2l6ZUNoYW5nZSIsImJvcmRlckVuYWJsZWRDaGFuZ2UiLCJib3JkZXJTdHJva2VDaGFuZ2UiLCJib3JkZXJTdHJva2VXaWR0aENoYW5nZSIsImJvcmRlckRhc2hDaGFuZ2UiLCJhbmNob3JTdHJva2VDaGFuZ2UiLCJhbmNob3JTdHJva2VXaWR0aENoYW5nZSIsImFuY2hvckZpbGxDaGFuZ2UiLCJhbmNob3JDb3JuZXJSYWRpdXNDaGFuZ2UiLCJpZ25vcmVTdHJva2VDaGFuZ2UiXS5tYXAoKHQ9PnQrIi50ci1rb252YSIpKS5qb2luKCIgIiksSGU9Im5vZGVzUmVjdCIsWWU9WyJ3aWR0aENoYW5nZSIsImhlaWdodENoYW5nZSIsInNjYWxlWENoYW5nZSIsInNjYWxlWUNoYW5nZSIsInNrZXdYQ2hhbmdlIiwic2tld1lDaGFuZ2UiLCJyb3RhdGlvbkNoYW5nZSIsIm9mZnNldFhDaGFuZ2UiLCJvZmZzZXRZQ2hhbmdlIiwidHJhbnNmb3Jtc0VuYWJsZWRDaGFuZ2UiLCJzdHJva2VXaWR0aENoYW5nZSJdLFhlPXsidG9wLWxlZnQiOi00NSwidG9wLWNlbnRlciI6MCwidG9wLXJpZ2h0Ijo0NSwibWlkZGxlLXJpZ2h0IjotOTAsIm1pZGRsZS1sZWZ0Ijo5MCwiYm90dG9tLWxlZnQiOi0xMzUsImJvdHRvbS1jZW50ZXIiOjE4MCwiYm90dG9tLXJpZ2h0IjoxMzV9O2NvbnN0IGplPSJvbnRvdWNoc3RhcnQiaW4gaS5fZ2xvYmFsO3ZhciBVZT1bInRvcC1sZWZ0IiwidG9wLWNlbnRlciIsInRvcC1yaWdodCIsIm1pZGRsZS1yaWdodCIsIm1pZGRsZS1sZWZ0IiwiYm90dG9tLWxlZnQiLCJib3R0b20tY2VudGVyIiwiYm90dG9tLXJpZ2h0Il07ZnVuY3Rpb24gcWUodCxlLGkpe2NvbnN0IHI9aS54Kyh0LngtaS54KSpNYXRoLmNvcyhlKS0odC55LWkueSkqTWF0aC5zaW4oZSksYT1pLnkrKHQueC1pLngpKk1hdGguc2luKGUpKyh0LnktaS55KSpNYXRoLmNvcyhlKTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtyb3RhdGlvbjp0LnJvdGF0aW9uK2UseDpyLHk6YX0pfWZ1bmN0aW9uIFZlKHQsZSl7Y29uc3QgaT1mdW5jdGlvbih0KXtyZXR1cm57eDp0LngrdC53aWR0aC8yKk1hdGguY29zKHQucm90YXRpb24pK3QuaGVpZ2h0LzIqTWF0aC5zaW4oLXQucm90YXRpb24pLHk6dC55K3QuaGVpZ2h0LzIqTWF0aC5jb3ModC5yb3RhdGlvbikrdC53aWR0aC8yKk1hdGguc2luKHQucm90YXRpb24pfX0odCk7cmV0dXJuIHFlKHQsZSxpKX1jbGFzcyBLZSBleHRlbmRzIGp0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMuX3RyYW5zZm9ybWluZz0hMSx0aGlzLl9jcmVhdGVFbGVtZW50cygpLHRoaXMuX2hhbmRsZU1vdXNlTW92ZT10aGlzLl9oYW5kbGVNb3VzZU1vdmUuYmluZCh0aGlzKSx0aGlzLl9oYW5kbGVNb3VzZVVwPXRoaXMuX2hhbmRsZU1vdXNlVXAuYmluZCh0aGlzKSx0aGlzLnVwZGF0ZT10aGlzLnVwZGF0ZS5iaW5kKHRoaXMpLHRoaXMub24oV2UsdGhpcy51cGRhdGUpLHRoaXMuZ2V0Tm9kZSgpJiZ0aGlzLnVwZGF0ZSgpfWF0dGFjaFRvKHQpe3JldHVybiB0aGlzLnNldE5vZGUodCksdGhpc31zZXROb2RlKHQpe3JldHVybiBnLndhcm4oInRyLnNldE5vZGUoc2hhcGUpLCB0ci5ub2RlKHNoYXBlKSBhbmQgdHIuYXR0YWNoVG8oc2hhcGUpIG1ldGhvZHMgYXJlIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdHIubm9kZXMobm9kZXNBcnJheSkgaW5zdGVhZC4iKSx0aGlzLnNldE5vZGVzKFt0XSl9Z2V0Tm9kZSgpe3JldHVybiB0aGlzLl9ub2RlcyYmdGhpcy5fbm9kZXNbMF19X2dldEV2ZW50TmFtZXNwYWNlKCl7cmV0dXJuIHplK3RoaXMuX2lkfXNldE5vZGVzKHQ9W10pe3JldHVybiB0aGlzLl9ub2RlcyYmdGhpcy5fbm9kZXMubGVuZ3RoJiZ0aGlzLmRldGFjaCgpLHRoaXMuX25vZGVzPXQsMT09PXQubGVuZ3RoJiZ0aGlzLnVzZVNpbmdsZU5vZGVSb3RhdGlvbigpP3RoaXMucm90YXRpb24odFswXS5nZXRBYnNvbHV0ZVJvdGF0aW9uKCkpOnRoaXMucm90YXRpb24oMCksdGhpcy5fbm9kZXMuZm9yRWFjaCgodD0+e2NvbnN0IGU9KCk9PnsxPT09dGhpcy5ub2RlcygpLmxlbmd0aCYmdGhpcy51c2VTaW5nbGVOb2RlUm90YXRpb24oKSYmdGhpcy5yb3RhdGlvbih0aGlzLm5vZGVzKClbMF0uZ2V0QWJzb2x1dGVSb3RhdGlvbigpKSx0aGlzLl9yZXNldFRyYW5zZm9ybUNhY2hlKCksdGhpcy5fdHJhbnNmb3JtaW5nfHx0aGlzLmlzRHJhZ2dpbmcoKXx8dGhpcy51cGRhdGUoKX0saT10Ll9hdHRyc0FmZmVjdGluZ1NpemUubWFwKCh0PT50KyJDaGFuZ2UuIit0aGlzLl9nZXRFdmVudE5hbWVzcGFjZSgpKSkuam9pbigiICIpO3Qub24oaSxlKSx0Lm9uKFllLm1hcCgodD0+dCtgLiR7dGhpcy5fZ2V0RXZlbnROYW1lc3BhY2UoKX1gKSkuam9pbigiICIpLGUpLHQub24oYGFic29sdXRlVHJhbnNmb3JtQ2hhbmdlLiR7dGhpcy5fZ2V0RXZlbnROYW1lc3BhY2UoKX1gLGUpLHRoaXMuX3Byb3h5RHJhZyh0KX0pKSx0aGlzLl9yZXNldFRyYW5zZm9ybUNhY2hlKCksISF0aGlzLmZpbmRPbmUoIi50b3AtbGVmdCIpJiZ0aGlzLnVwZGF0ZSgpLHRoaXN9X3Byb3h5RHJhZyh0KXtsZXQgZTt0Lm9uKGBkcmFnc3RhcnQuJHt0aGlzLl9nZXRFdmVudE5hbWVzcGFjZSgpfWAsKGk9PntlPXQuZ2V0QWJzb2x1dGVQb3NpdGlvbigpLHRoaXMuaXNEcmFnZ2luZygpfHx0PT09dGhpcy5maW5kT25lKCIuYmFjayIpfHx0aGlzLnN0YXJ0RHJhZyhpLCExKX0pKSx0Lm9uKGBkcmFnbW92ZS4ke3RoaXMuX2dldEV2ZW50TmFtZXNwYWNlKCl9YCwoaT0+e2lmKCFlKXJldHVybjtjb25zdCByPXQuZ2V0QWJzb2x1dGVQb3NpdGlvbigpLGE9ci54LWUueCxuPXIueS1lLnk7dGhpcy5ub2RlcygpLmZvckVhY2goKGU9PntpZihlPT09dClyZXR1cm47aWYoZS5pc0RyYWdnaW5nKCkpcmV0dXJuO2NvbnN0IHI9ZS5nZXRBYnNvbHV0ZVBvc2l0aW9uKCk7ZS5zZXRBYnNvbHV0ZVBvc2l0aW9uKHt4OnIueCthLHk6ci55K259KSxlLnN0YXJ0RHJhZyhpKX0pKSxlPW51bGx9KSl9Z2V0Tm9kZXMoKXtyZXR1cm4gdGhpcy5fbm9kZXN8fFtdfWdldEFjdGl2ZUFuY2hvcigpe3JldHVybiB0aGlzLl9tb3ZpbmdBbmNob3JOYW1lfWRldGFjaCgpe3RoaXMuX25vZGVzJiZ0aGlzLl9ub2Rlcy5mb3JFYWNoKCh0PT57dC5vZmYoIi4iK3RoaXMuX2dldEV2ZW50TmFtZXNwYWNlKCkpfSkpLHRoaXMuX25vZGVzPVtdLHRoaXMuX3Jlc2V0VHJhbnNmb3JtQ2FjaGUoKX1fcmVzZXRUcmFuc2Zvcm1DYWNoZSgpe3RoaXMuX2NsZWFyQ2FjaGUoSGUpLHRoaXMuX2NsZWFyQ2FjaGUoInRyYW5zZm9ybSIpLHRoaXMuX2NsZWFyU2VsZkFuZERlc2NlbmRhbnRDYWNoZSgiYWJzb2x1dGVUcmFuc2Zvcm0iKX1fZ2V0Tm9kZVJlY3QoKXtyZXR1cm4gdGhpcy5fZ2V0Q2FjaGUoSGUsdGhpcy5fX2dldE5vZGVSZWN0KX1fX2dldE5vZGVTaGFwZSh0LGU9dGhpcy5yb3RhdGlvbigpLHIpe3ZhciBhPXQuZ2V0Q2xpZW50UmVjdCh7c2tpcFRyYW5zZm9ybTohMCxza2lwU2hhZG93OiEwLHNraXBTdHJva2U6dGhpcy5pZ25vcmVTdHJva2UoKX0pLG49dC5nZXRBYnNvbHV0ZVNjYWxlKHIpLHM9dC5nZXRBYnNvbHV0ZVBvc2l0aW9uKHIpLG89YS54Km4ueC10Lm9mZnNldFgoKSpuLngsaD1hLnkqbi55LXQub2Zmc2V0WSgpKm4ueTtjb25zdCBsPShpLmdldEFuZ2xlKHQuZ2V0QWJzb2x1dGVSb3RhdGlvbigpKSsyKk1hdGguUEkpJSgyKk1hdGguUEkpO3JldHVybiBxZSh7eDpzLngrbypNYXRoLmNvcyhsKStoKk1hdGguc2luKC1sKSx5OnMueStoKk1hdGguY29zKGwpK28qTWF0aC5zaW4obCksd2lkdGg6YS53aWR0aCpuLngsaGVpZ2h0OmEuaGVpZ2h0Km4ueSxyb3RhdGlvbjpsfSwtaS5nZXRBbmdsZShlKSx7eDowLHk6MH0pfV9fZ2V0Tm9kZVJlY3QoKXtpZighdGhpcy5nZXROb2RlKCkpcmV0dXJue3g6LTFlOCx5Oi0xZTgsd2lkdGg6MCxoZWlnaHQ6MCxyb3RhdGlvbjowfTtjb25zdCB0PVtdO3RoaXMubm9kZXMoKS5tYXAoKGU9Pntjb25zdCBpPWUuZ2V0Q2xpZW50UmVjdCh7c2tpcFRyYW5zZm9ybTohMCxza2lwU2hhZG93OiEwLHNraXBTdHJva2U6dGhpcy5pZ25vcmVTdHJva2UoKX0pO3ZhciByPVt7eDppLngseTppLnl9LHt4OmkueCtpLndpZHRoLHk6aS55fSx7eDppLngraS53aWR0aCx5OmkueStpLmhlaWdodH0se3g6aS54LHk6aS55K2kuaGVpZ2h0fV0sYT1lLmdldEFic29sdXRlVHJhbnNmb3JtKCk7ci5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgaT1hLnBvaW50KGUpO3QucHVzaChpKX0pKX0pKTtjb25zdCBlPW5ldyBhO3ZhciByLG4scyxvO2Uucm90YXRlKC1pLmdldEFuZ2xlKHRoaXMucm90YXRpb24oKSkpLHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGk9ZS5wb2ludCh0KTt2b2lkIDA9PT1yJiYocj1zPWkueCxuPW89aS55KSxyPU1hdGgubWluKHIsaS54KSxuPU1hdGgubWluKG4saS55KSxzPU1hdGgubWF4KHMsaS54KSxvPU1hdGgubWF4KG8saS55KX0pKSxlLmludmVydCgpO2NvbnN0IGg9ZS5wb2ludCh7eDpyLHk6bn0pO3JldHVybnt4OmgueCx5OmgueSx3aWR0aDpzLXIsaGVpZ2h0Om8tbixyb3RhdGlvbjppLmdldEFuZ2xlKHRoaXMucm90YXRpb24oKSl9fWdldFgoKXtyZXR1cm4gdGhpcy5fZ2V0Tm9kZVJlY3QoKS54fWdldFkoKXtyZXR1cm4gdGhpcy5fZ2V0Tm9kZVJlY3QoKS55fWdldFdpZHRoKCl7cmV0dXJuIHRoaXMuX2dldE5vZGVSZWN0KCkud2lkdGh9Z2V0SGVpZ2h0KCl7cmV0dXJuIHRoaXMuX2dldE5vZGVSZWN0KCkuaGVpZ2h0fV9jcmVhdGVFbGVtZW50cygpe3RoaXMuX2NyZWF0ZUJhY2soKSxVZS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3RoaXMuX2NyZWF0ZUFuY2hvcih0KX0uYmluZCh0aGlzKSksdGhpcy5fY3JlYXRlQW5jaG9yKCJyb3RhdGVyIil9X2NyZWF0ZUFuY2hvcih0KXt2YXIgZT1uZXcgX2Uoe3N0cm9rZToicmdiKDAsIDE2MSwgMjU1KSIsZmlsbDoid2hpdGUiLHN0cm9rZVdpZHRoOjEsbmFtZTp0KyIgX2FuY2hvciIsZHJhZ0Rpc3RhbmNlOjAsZHJhZ2dhYmxlOiEwLGhpdFN0cm9rZVdpZHRoOmplPzEwOiJhdXRvIn0pLHI9dGhpcztlLm9uKCJtb3VzZWRvd24gdG91Y2hzdGFydCIsKGZ1bmN0aW9uKHQpe3IuX2hhbmRsZU1vdXNlRG93bih0KX0pKSxlLm9uKCJkcmFnc3RhcnQiLCh0PT57ZS5zdG9wRHJhZygpLHQuY2FuY2VsQnViYmxlPSEwfSkpLGUub24oImRyYWdlbmQiLCh0PT57dC5jYW5jZWxCdWJibGU9ITB9KSksZS5vbigibW91c2VlbnRlciIsKCgpPT57dmFyIHI9aS5nZXRBbmdsZSh0aGlzLnJvdGF0aW9uKCkpLGE9ZnVuY3Rpb24odCxlKXtpZigicm90YXRlciI9PT10KXJldHVybiJjcm9zc2hhaXIiO2UrPWcuZGVnVG9SYWQoWGVbdF18fDApO3ZhciBpPShnLnJhZFRvRGVnKGUpJTM2MCszNjApJTM2MDtyZXR1cm4gZy5faW5SYW5nZShpLDMzNy41LDM2MCl8fGcuX2luUmFuZ2UoaSwwLDIyLjUpPyJucy1yZXNpemUiOmcuX2luUmFuZ2UoaSwyMi41LDY3LjUpPyJuZXN3LXJlc2l6ZSI6Zy5faW5SYW5nZShpLDY3LjUsMTEyLjUpPyJldy1yZXNpemUiOmcuX2luUmFuZ2UoaSwxMTIuNSwxNTcuNSk/Im53c2UtcmVzaXplIjpnLl9pblJhbmdlKGksMTU3LjUsMjAyLjUpPyJucy1yZXNpemUiOmcuX2luUmFuZ2UoaSwyMDIuNSwyNDcuNSk/Im5lc3ctcmVzaXplIjpnLl9pblJhbmdlKGksMjQ3LjUsMjkyLjUpPyJldy1yZXNpemUiOmcuX2luUmFuZ2UoaSwyOTIuNSwzMzcuNSk/Im53c2UtcmVzaXplIjooZy5lcnJvcigiVHJhbnNmb3JtZXIgaGFzIHVua25vd24gYW5nbGUgZm9yIGN1cnNvciBkZXRlY3Rpb246ICIraSksInBvaW50ZXIiKX0odCxyKTtlLmdldFN0YWdlKCkuY29udGVudCYmKGUuZ2V0U3RhZ2UoKS5jb250ZW50LnN0eWxlLmN1cnNvcj1hKSx0aGlzLl9jdXJzb3JDaGFuZ2U9ITB9KSksZS5vbigibW91c2VvdXQiLCgoKT0+e2UuZ2V0U3RhZ2UoKS5jb250ZW50JiYoZS5nZXRTdGFnZSgpLmNvbnRlbnQuc3R5bGUuY3Vyc29yPSIiKSx0aGlzLl9jdXJzb3JDaGFuZ2U9ITF9KSksdGhpcy5hZGQoZSl9X2NyZWF0ZUJhY2soKXt2YXIgdD1uZXcgenQoe25hbWU6ImJhY2siLHdpZHRoOjAsaGVpZ2h0OjAsZHJhZ2dhYmxlOiEwLHNjZW5lRnVuYyh0KXt2YXIgZT10aGlzLmdldFBhcmVudCgpLGk9ZS5wYWRkaW5nKCk7dC5iZWdpblBhdGgoKSx0LnJlY3QoLWksLWksdGhpcy53aWR0aCgpKzIqaSx0aGlzLmhlaWdodCgpKzIqaSksdC5tb3ZlVG8odGhpcy53aWR0aCgpLzIsLWkpLGUucm90YXRlRW5hYmxlZCgpJiZ0LmxpbmVUbyh0aGlzLndpZHRoKCkvMiwtZS5yb3RhdGVBbmNob3JPZmZzZXQoKSpnLl9zaWduKHRoaXMuaGVpZ2h0KCkpLWkpLHQuZmlsbFN0cm9rZVNoYXBlKHRoaXMpfSxoaXRGdW5jOih0LGUpPT57aWYodGhpcy5zaG91bGRPdmVyZHJhd1dob2xlQXJlYSgpKXt2YXIgaT10aGlzLnBhZGRpbmcoKTt0LmJlZ2luUGF0aCgpLHQucmVjdCgtaSwtaSxlLndpZHRoKCkrMippLGUuaGVpZ2h0KCkrMippKSx0LmZpbGxTdHJva2VTaGFwZShlKX19fSk7dGhpcy5hZGQodCksdGhpcy5fcHJveHlEcmFnKHQpLHQub24oImRyYWdzdGFydCIsKHQ9Pnt0LmNhbmNlbEJ1YmJsZT0hMH0pKSx0Lm9uKCJkcmFnbW92ZSIsKHQ9Pnt0LmNhbmNlbEJ1YmJsZT0hMH0pKSx0Lm9uKCJkcmFnZW5kIiwodD0+e3QuY2FuY2VsQnViYmxlPSEwfSkpLHRoaXMub24oImRyYWdtb3ZlIiwodD0+e3RoaXMudXBkYXRlKCl9KSl9X2hhbmRsZU1vdXNlRG93bih0KXt0aGlzLl9tb3ZpbmdBbmNob3JOYW1lPXQudGFyZ2V0Lm5hbWUoKS5zcGxpdCgiICIpWzBdO3ZhciBlPXRoaXMuX2dldE5vZGVSZWN0KCksaT1lLndpZHRoLHI9ZS5oZWlnaHQsYT1NYXRoLnNxcnQoTWF0aC5wb3coaSwyKStNYXRoLnBvdyhyLDIpKTt0aGlzLnNpbj1NYXRoLmFicyhyL2EpLHRoaXMuY29zPU1hdGguYWJzKGkvYSksInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJih3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIix0aGlzLl9oYW5kbGVNb3VzZU1vdmUpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLHRoaXMuX2hhbmRsZU1vdXNlTW92ZSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLHRoaXMuX2hhbmRsZU1vdXNlVXAsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsdGhpcy5faGFuZGxlTW91c2VVcCwhMCkpLHRoaXMuX3RyYW5zZm9ybWluZz0hMDt2YXIgbj10LnRhcmdldC5nZXRBYnNvbHV0ZVBvc2l0aW9uKCkscz10LnRhcmdldC5nZXRTdGFnZSgpLmdldFBvaW50ZXJQb3NpdGlvbigpO3RoaXMuX2FuY2hvckRyYWdPZmZzZXQ9e3g6cy54LW4ueCx5OnMueS1uLnl9LHRoaXMuX2ZpcmUoInRyYW5zZm9ybXN0YXJ0Iix7ZXZ0OnQsdGFyZ2V0OnRoaXMuZ2V0Tm9kZSgpfSksdGhpcy5fbm9kZXMuZm9yRWFjaCgoZT0+e2UuX2ZpcmUoInRyYW5zZm9ybXN0YXJ0Iix7ZXZ0OnQsdGFyZ2V0OmV9KX0pKX1faGFuZGxlTW91c2VNb3ZlKHQpe3ZhciBlLHIsYSxuPXRoaXMuZmluZE9uZSgiLiIrdGhpcy5fbW92aW5nQW5jaG9yTmFtZSkscz1uLmdldFN0YWdlKCk7cy5zZXRQb2ludGVyc1Bvc2l0aW9ucyh0KTtjb25zdCBvPXMuZ2V0UG9pbnRlclBvc2l0aW9uKCk7bGV0IGg9e3g6by54LXRoaXMuX2FuY2hvckRyYWdPZmZzZXQueCx5Om8ueS10aGlzLl9hbmNob3JEcmFnT2Zmc2V0Lnl9O2NvbnN0IGw9bi5nZXRBYnNvbHV0ZVBvc2l0aW9uKCk7dGhpcy5hbmNob3JEcmFnQm91bmRGdW5jKCkmJihoPXRoaXMuYW5jaG9yRHJhZ0JvdW5kRnVuYygpKGwsaCx0KSksbi5zZXRBYnNvbHV0ZVBvc2l0aW9uKGgpO2NvbnN0IGQ9bi5nZXRBYnNvbHV0ZVBvc2l0aW9uKCk7aWYobC54IT09ZC54fHxsLnkhPT1kLnkpaWYoInJvdGF0ZXIiIT09dGhpcy5fbW92aW5nQW5jaG9yTmFtZSl7dmFyIGM9dGhpcy5rZWVwUmF0aW8oKXx8dC5zaGlmdEtleSxnPXRoaXMuY2VudGVyZWRTY2FsaW5nKCl8fHQuYWx0S2V5O2lmKCJ0b3AtbGVmdCI9PT10aGlzLl9tb3ZpbmdBbmNob3JOYW1lKXtpZihjKXt2YXIgdT1nP3t4OnRoaXMud2lkdGgoKS8yLHk6dGhpcy5oZWlnaHQoKS8yfTp7eDp0aGlzLmZpbmRPbmUoIi5ib3R0b20tcmlnaHQiKS54KCkseTp0aGlzLmZpbmRPbmUoIi5ib3R0b20tcmlnaHQiKS55KCl9O2E9TWF0aC5zcXJ0KE1hdGgucG93KHUueC1uLngoKSwyKStNYXRoLnBvdyh1Lnktbi55KCksMikpO3ZhciBmPXRoaXMuZmluZE9uZSgiLnRvcC1sZWZ0IikueCgpPnUueD8tMToxLHA9dGhpcy5maW5kT25lKCIudG9wLWxlZnQiKS55KCk+dS55Py0xOjE7ZT1hKnRoaXMuY29zKmYscj1hKnRoaXMuc2luKnAsdGhpcy5maW5kT25lKCIudG9wLWxlZnQiKS54KHUueC1lKSx0aGlzLmZpbmRPbmUoIi50b3AtbGVmdCIpLnkodS55LXIpfX1lbHNlIGlmKCJ0b3AtY2VudGVyIj09PXRoaXMuX21vdmluZ0FuY2hvck5hbWUpdGhpcy5maW5kT25lKCIudG9wLWxlZnQiKS55KG4ueSgpKTtlbHNlIGlmKCJ0b3AtcmlnaHQiPT09dGhpcy5fbW92aW5nQW5jaG9yTmFtZSl7aWYoYyl7dT1nP3t4OnRoaXMud2lkdGgoKS8yLHk6dGhpcy5oZWlnaHQoKS8yfTp7eDp0aGlzLmZpbmRPbmUoIi5ib3R0b20tbGVmdCIpLngoKSx5OnRoaXMuZmluZE9uZSgiLmJvdHRvbS1sZWZ0IikueSgpfTthPU1hdGguc3FydChNYXRoLnBvdyhuLngoKS11LngsMikrTWF0aC5wb3codS55LW4ueSgpLDIpKTtmPXRoaXMuZmluZE9uZSgiLnRvcC1yaWdodCIpLngoKTx1Lng/LTE6MSxwPXRoaXMuZmluZE9uZSgiLnRvcC1yaWdodCIpLnkoKT51Lnk/LTE6MTtlPWEqdGhpcy5jb3MqZixyPWEqdGhpcy5zaW4qcCx0aGlzLmZpbmRPbmUoIi50b3AtcmlnaHQiKS54KHUueCtlKSx0aGlzLmZpbmRPbmUoIi50b3AtcmlnaHQiKS55KHUueS1yKX12YXIgdj1uLnBvc2l0aW9uKCk7dGhpcy5maW5kT25lKCIudG9wLWxlZnQiKS55KHYueSksdGhpcy5maW5kT25lKCIuYm90dG9tLXJpZ2h0IikueCh2LngpfWVsc2UgaWYoIm1pZGRsZS1sZWZ0Ij09PXRoaXMuX21vdmluZ0FuY2hvck5hbWUpdGhpcy5maW5kT25lKCIudG9wLWxlZnQiKS54KG4ueCgpKTtlbHNlIGlmKCJtaWRkbGUtcmlnaHQiPT09dGhpcy5fbW92aW5nQW5jaG9yTmFtZSl0aGlzLmZpbmRPbmUoIi5ib3R0b20tcmlnaHQiKS54KG4ueCgpKTtlbHNlIGlmKCJib3R0b20tbGVmdCI9PT10aGlzLl9tb3ZpbmdBbmNob3JOYW1lKXtpZihjKXt1PWc/e3g6dGhpcy53aWR0aCgpLzIseTp0aGlzLmhlaWdodCgpLzJ9Ont4OnRoaXMuZmluZE9uZSgiLnRvcC1yaWdodCIpLngoKSx5OnRoaXMuZmluZE9uZSgiLnRvcC1yaWdodCIpLnkoKX07YT1NYXRoLnNxcnQoTWF0aC5wb3codS54LW4ueCgpLDIpK01hdGgucG93KG4ueSgpLXUueSwyKSk7Zj11Lng8bi54KCk/LTE6MSxwPW4ueSgpPHUueT8tMToxO2U9YSp0aGlzLmNvcypmLHI9YSp0aGlzLnNpbipwLG4ueCh1LngtZSksbi55KHUueStyKX12PW4ucG9zaXRpb24oKSx0aGlzLmZpbmRPbmUoIi50b3AtbGVmdCIpLngodi54KSx0aGlzLmZpbmRPbmUoIi5ib3R0b20tcmlnaHQiKS55KHYueSl9ZWxzZSBpZigiYm90dG9tLWNlbnRlciI9PT10aGlzLl9tb3ZpbmdBbmNob3JOYW1lKXRoaXMuZmluZE9uZSgiLmJvdHRvbS1yaWdodCIpLnkobi55KCkpO2Vsc2UgaWYoImJvdHRvbS1yaWdodCI9PT10aGlzLl9tb3ZpbmdBbmNob3JOYW1lKXtpZihjKXt1PWc/e3g6dGhpcy53aWR0aCgpLzIseTp0aGlzLmhlaWdodCgpLzJ9Ont4OnRoaXMuZmluZE9uZSgiLnRvcC1sZWZ0IikueCgpLHk6dGhpcy5maW5kT25lKCIudG9wLWxlZnQiKS55KCl9O2E9TWF0aC5zcXJ0KE1hdGgucG93KG4ueCgpLXUueCwyKStNYXRoLnBvdyhuLnkoKS11LnksMikpO2Y9dGhpcy5maW5kT25lKCIuYm90dG9tLXJpZ2h0IikueCgpPHUueD8tMToxLHA9dGhpcy5maW5kT25lKCIuYm90dG9tLXJpZ2h0IikueSgpPHUueT8tMToxO2U9YSp0aGlzLmNvcypmLHI9YSp0aGlzLnNpbipwLHRoaXMuZmluZE9uZSgiLmJvdHRvbS1yaWdodCIpLngodS54K2UpLHRoaXMuZmluZE9uZSgiLmJvdHRvbS1yaWdodCIpLnkodS55K3IpfX1lbHNlIGNvbnNvbGUuZXJyb3IobmV3IEVycm9yKCJXcm9uZyBwb3NpdGlvbiBhcmd1bWVudCBvZiBzZWxlY3Rpb24gcmVzaXplcjogIit0aGlzLl9tb3ZpbmdBbmNob3JOYW1lKSk7aWYoZz10aGlzLmNlbnRlcmVkU2NhbGluZygpfHx0LmFsdEtleSl7dmFyIG09dGhpcy5maW5kT25lKCIudG9wLWxlZnQiKSxfPXRoaXMuZmluZE9uZSgiLmJvdHRvbS1yaWdodCIpLHk9bS54KCkseD1tLnkoKSxiPXRoaXMuZ2V0V2lkdGgoKS1fLngoKSxTPXRoaXMuZ2V0SGVpZ2h0KCktXy55KCk7Xy5tb3ZlKHt4Oi15LHk6LXh9KSxtLm1vdmUoe3g6Yix5OlN9KX12YXIgdz10aGlzLmZpbmRPbmUoIi50b3AtbGVmdCIpLmdldEFic29sdXRlUG9zaXRpb24oKTtlPXcueCxyPXcueTt2YXIgQz10aGlzLmZpbmRPbmUoIi5ib3R0b20tcmlnaHQiKS54KCktdGhpcy5maW5kT25lKCIudG9wLWxlZnQiKS54KCksaz10aGlzLmZpbmRPbmUoIi5ib3R0b20tcmlnaHQiKS55KCktdGhpcy5maW5kT25lKCIudG9wLWxlZnQiKS55KCk7dGhpcy5fZml0Tm9kZXNJbnRvKHt4OmUseTpyLHdpZHRoOkMsaGVpZ2h0Omsscm90YXRpb246aS5nZXRBbmdsZSh0aGlzLnJvdGF0aW9uKCkpfSx0KX1lbHNle3ZhciBQPXRoaXMuX2dldE5vZGVSZWN0KCk7ZT1uLngoKS1QLndpZHRoLzIscj0tbi55KCkrUC5oZWlnaHQvMjtsZXQgYT1NYXRoLmF0YW4yKC1yLGUpK01hdGguUEkvMjtQLmhlaWdodDwwJiYoYS09TWF0aC5QSSk7Y29uc3Qgcz1pLmdldEFuZ2xlKHRoaXMucm90YXRpb24oKSkrYSxvPWkuZ2V0QW5nbGUodGhpcy5yb3RhdGlvblNuYXBUb2xlcmFuY2UoKSksaD1mdW5jdGlvbih0LGUscil7bGV0IGE9ZTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7Y29uc3Qgcz1pLmdldEFuZ2xlKHRbbl0pLG89TWF0aC5hYnMocy1lKSUoMipNYXRoLlBJKTtNYXRoLm1pbihvLDIqTWF0aC5QSS1vKTxyJiYoYT1zKX1yZXR1cm4gYX0odGhpcy5yb3RhdGlvblNuYXBzKCkscyxvKSxsPVZlKFAsaC1QLnJvdGF0aW9uKTt0aGlzLl9maXROb2Rlc0ludG8obCx0KX19X2hhbmRsZU1vdXNlVXAodCl7dGhpcy5fcmVtb3ZlRXZlbnRzKHQpfWdldEFic29sdXRlVHJhbnNmb3JtKCl7cmV0dXJuIHRoaXMuZ2V0VHJhbnNmb3JtKCl9X3JlbW92ZUV2ZW50cyh0KXtpZih0aGlzLl90cmFuc2Zvcm1pbmcpe3RoaXMuX3RyYW5zZm9ybWluZz0hMSwidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmKHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHRoaXMuX2hhbmRsZU1vdXNlTW92ZSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsdGhpcy5faGFuZGxlTW91c2VNb3ZlKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsdGhpcy5faGFuZGxlTW91c2VVcCwhMCksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIix0aGlzLl9oYW5kbGVNb3VzZVVwLCEwKSk7dmFyIGU9dGhpcy5nZXROb2RlKCk7dGhpcy5fZmlyZSgidHJhbnNmb3JtZW5kIix7ZXZ0OnQsdGFyZ2V0OmV9KSxlJiZ0aGlzLl9ub2Rlcy5mb3JFYWNoKChlPT57ZS5fZmlyZSgidHJhbnNmb3JtZW5kIix7ZXZ0OnQsdGFyZ2V0OmV9KX0pKSx0aGlzLl9tb3ZpbmdBbmNob3JOYW1lPW51bGx9fV9maXROb2Rlc0ludG8odCxlKXt2YXIgcj10aGlzLl9nZXROb2RlUmVjdCgpO2lmKGcuX2luUmFuZ2UodC53aWR0aCwyKi10aGlzLnBhZGRpbmcoKS0xLDEpKXJldHVybiB2b2lkIHRoaXMudXBkYXRlKCk7aWYoZy5faW5SYW5nZSh0LmhlaWdodCwyKi10aGlzLnBhZGRpbmcoKS0xLDEpKXJldHVybiB2b2lkIHRoaXMudXBkYXRlKCk7Y29uc3Qgbj10aGlzLmZsaXBFbmFibGVkKCk7dmFyIHM9bmV3IGE7aWYocy5yb3RhdGUoaS5nZXRBbmdsZSh0aGlzLnJvdGF0aW9uKCkpKSx0aGlzLl9tb3ZpbmdBbmNob3JOYW1lJiZ0LndpZHRoPDAmJnRoaXMuX21vdmluZ0FuY2hvck5hbWUuaW5kZXhPZigibGVmdCIpPj0wKXtjb25zdCBlPXMucG9pbnQoe3g6MiotdGhpcy5wYWRkaW5nKCkseTowfSk7aWYodC54Kz1lLngsdC55Kz1lLnksdC53aWR0aCs9Mip0aGlzLnBhZGRpbmcoKSx0aGlzLl9tb3ZpbmdBbmNob3JOYW1lPXRoaXMuX21vdmluZ0FuY2hvck5hbWUucmVwbGFjZSgibGVmdCIsInJpZ2h0IiksdGhpcy5fYW5jaG9yRHJhZ09mZnNldC54LT1lLngsdGhpcy5fYW5jaG9yRHJhZ09mZnNldC55LT1lLnksIW4pcmV0dXJuIHZvaWQgdGhpcy51cGRhdGUoKX1lbHNlIGlmKHRoaXMuX21vdmluZ0FuY2hvck5hbWUmJnQud2lkdGg8MCYmdGhpcy5fbW92aW5nQW5jaG9yTmFtZS5pbmRleE9mKCJyaWdodCIpPj0wKXtjb25zdCBlPXMucG9pbnQoe3g6Mip0aGlzLnBhZGRpbmcoKSx5OjB9KTtpZih0aGlzLl9tb3ZpbmdBbmNob3JOYW1lPXRoaXMuX21vdmluZ0FuY2hvck5hbWUucmVwbGFjZSgicmlnaHQiLCJsZWZ0IiksdGhpcy5fYW5jaG9yRHJhZ09mZnNldC54LT1lLngsdGhpcy5fYW5jaG9yRHJhZ09mZnNldC55LT1lLnksdC53aWR0aCs9Mip0aGlzLnBhZGRpbmcoKSwhbilyZXR1cm4gdm9pZCB0aGlzLnVwZGF0ZSgpfWlmKHRoaXMuX21vdmluZ0FuY2hvck5hbWUmJnQuaGVpZ2h0PDAmJnRoaXMuX21vdmluZ0FuY2hvck5hbWUuaW5kZXhPZigidG9wIik+PTApe2NvbnN0IGU9cy5wb2ludCh7eDowLHk6MiotdGhpcy5wYWRkaW5nKCl9KTtpZih0LngrPWUueCx0LnkrPWUueSx0aGlzLl9tb3ZpbmdBbmNob3JOYW1lPXRoaXMuX21vdmluZ0FuY2hvck5hbWUucmVwbGFjZSgidG9wIiwiYm90dG9tIiksdGhpcy5fYW5jaG9yRHJhZ09mZnNldC54LT1lLngsdGhpcy5fYW5jaG9yRHJhZ09mZnNldC55LT1lLnksdC5oZWlnaHQrPTIqdGhpcy5wYWRkaW5nKCksIW4pcmV0dXJuIHZvaWQgdGhpcy51cGRhdGUoKX1lbHNlIGlmKHRoaXMuX21vdmluZ0FuY2hvck5hbWUmJnQuaGVpZ2h0PDAmJnRoaXMuX21vdmluZ0FuY2hvck5hbWUuaW5kZXhPZigiYm90dG9tIik+PTApe2NvbnN0IGU9cy5wb2ludCh7eDowLHk6Mip0aGlzLnBhZGRpbmcoKX0pO2lmKHRoaXMuX21vdmluZ0FuY2hvck5hbWU9dGhpcy5fbW92aW5nQW5jaG9yTmFtZS5yZXBsYWNlKCJib3R0b20iLCJ0b3AiKSx0aGlzLl9hbmNob3JEcmFnT2Zmc2V0LngtPWUueCx0aGlzLl9hbmNob3JEcmFnT2Zmc2V0LnktPWUueSx0LmhlaWdodCs9Mip0aGlzLnBhZGRpbmcoKSwhbilyZXR1cm4gdm9pZCB0aGlzLnVwZGF0ZSgpfWlmKHRoaXMuYm91bmRCb3hGdW5jKCkpe2NvbnN0IGU9dGhpcy5ib3VuZEJveEZ1bmMoKShyLHQpO2U/dD1lOmcud2FybigiYm91bmRCb3hGdW5jIHJldHVybmVkIGZhbHN5LiBZb3Ugc2hvdWxkIHJldHVybiBuZXcgYm91bmQgcmVjdCBmcm9tIGl0ISIpfWNvbnN0IG89MWU3LGg9bmV3IGE7aC50cmFuc2xhdGUoci54LHIueSksaC5yb3RhdGUoci5yb3RhdGlvbiksaC5zY2FsZShyLndpZHRoL28sci5oZWlnaHQvbyk7Y29uc3QgbD1uZXcgYTtsLnRyYW5zbGF0ZSh0LngsdC55KSxsLnJvdGF0ZSh0LnJvdGF0aW9uKSxsLnNjYWxlKHQud2lkdGgvbyx0LmhlaWdodC9vKTtjb25zdCBkPWwubXVsdGlwbHkoaC5pbnZlcnQoKSk7dGhpcy5fbm9kZXMuZm9yRWFjaCgodD0+e3ZhciBpO2NvbnN0IHI9dC5nZXRQYXJlbnQoKS5nZXRBYnNvbHV0ZVRyYW5zZm9ybSgpLG49dC5nZXRUcmFuc2Zvcm0oKS5jb3B5KCk7bi50cmFuc2xhdGUodC5vZmZzZXRYKCksdC5vZmZzZXRZKCkpO2NvbnN0IHM9bmV3IGE7cy5tdWx0aXBseShyLmNvcHkoKS5pbnZlcnQoKSkubXVsdGlwbHkoZCkubXVsdGlwbHkocikubXVsdGlwbHkobik7Y29uc3Qgbz1zLmRlY29tcG9zZSgpO3Quc2V0QXR0cnMobyksdGhpcy5fZmlyZSgidHJhbnNmb3JtIix7ZXZ0OmUsdGFyZ2V0OnR9KSx0Ll9maXJlKCJ0cmFuc2Zvcm0iLHtldnQ6ZSx0YXJnZXQ6dH0pLG51bGw9PT0oaT10LmdldExheWVyKCkpfHx2b2lkIDA9PT1pfHxpLmJhdGNoRHJhdygpfSkpLHRoaXMucm90YXRpb24oZy5fZ2V0Um90YXRpb24odC5yb3RhdGlvbikpLHRoaXMuX3Jlc2V0VHJhbnNmb3JtQ2FjaGUoKSx0aGlzLnVwZGF0ZSgpLHRoaXMuZ2V0TGF5ZXIoKS5iYXRjaERyYXcoKX1mb3JjZVVwZGF0ZSgpe3RoaXMuX3Jlc2V0VHJhbnNmb3JtQ2FjaGUoKSx0aGlzLnVwZGF0ZSgpfV9iYXRjaENoYW5nZUNoaWxkKHQsZSl7dGhpcy5maW5kT25lKHQpLnNldEF0dHJzKGUpfXVwZGF0ZSgpe3ZhciB0LGU9dGhpcy5fZ2V0Tm9kZVJlY3QoKTt0aGlzLnJvdGF0aW9uKGcuX2dldFJvdGF0aW9uKGUucm90YXRpb24pKTt2YXIgaT1lLndpZHRoLHI9ZS5oZWlnaHQsYT10aGlzLmVuYWJsZWRBbmNob3JzKCksbj10aGlzLnJlc2l6ZUVuYWJsZWQoKSxzPXRoaXMucGFkZGluZygpLG89dGhpcy5hbmNob3JTaXplKCk7dGhpcy5maW5kKCIuX2FuY2hvciIpLmZvckVhY2goKHQ9Pnt0LnNldEF0dHJzKHt3aWR0aDpvLGhlaWdodDpvLG9mZnNldFg6by8yLG9mZnNldFk6by8yLHN0cm9rZTp0aGlzLmFuY2hvclN0cm9rZSgpLHN0cm9rZVdpZHRoOnRoaXMuYW5jaG9yU3Ryb2tlV2lkdGgoKSxmaWxsOnRoaXMuYW5jaG9yRmlsbCgpLGNvcm5lclJhZGl1czp0aGlzLmFuY2hvckNvcm5lclJhZGl1cygpfSl9KSksdGhpcy5fYmF0Y2hDaGFuZ2VDaGlsZCgiLnRvcC1sZWZ0Iix7eDowLHk6MCxvZmZzZXRYOm8vMitzLG9mZnNldFk6by8yK3MsdmlzaWJsZTpuJiZhLmluZGV4T2YoInRvcC1sZWZ0Iik+PTB9KSx0aGlzLl9iYXRjaENoYW5nZUNoaWxkKCIudG9wLWNlbnRlciIse3g6aS8yLHk6MCxvZmZzZXRZOm8vMitzLHZpc2libGU6biYmYS5pbmRleE9mKCJ0b3AtY2VudGVyIik+PTB9KSx0aGlzLl9iYXRjaENoYW5nZUNoaWxkKCIudG9wLXJpZ2h0Iix7eDppLHk6MCxvZmZzZXRYOm8vMi1zLG9mZnNldFk6by8yK3MsdmlzaWJsZTpuJiZhLmluZGV4T2YoInRvcC1yaWdodCIpPj0wfSksdGhpcy5fYmF0Y2hDaGFuZ2VDaGlsZCgiLm1pZGRsZS1sZWZ0Iix7eDowLHk6ci8yLG9mZnNldFg6by8yK3MsdmlzaWJsZTpuJiZhLmluZGV4T2YoIm1pZGRsZS1sZWZ0Iik+PTB9KSx0aGlzLl9iYXRjaENoYW5nZUNoaWxkKCIubWlkZGxlLXJpZ2h0Iix7eDppLHk6ci8yLG9mZnNldFg6by8yLXMsdmlzaWJsZTpuJiZhLmluZGV4T2YoIm1pZGRsZS1yaWdodCIpPj0wfSksdGhpcy5fYmF0Y2hDaGFuZ2VDaGlsZCgiLmJvdHRvbS1sZWZ0Iix7eDowLHk6cixvZmZzZXRYOm8vMitzLG9mZnNldFk6by8yLXMsdmlzaWJsZTpuJiZhLmluZGV4T2YoImJvdHRvbS1sZWZ0Iik+PTB9KSx0aGlzLl9iYXRjaENoYW5nZUNoaWxkKCIuYm90dG9tLWNlbnRlciIse3g6aS8yLHk6cixvZmZzZXRZOm8vMi1zLHZpc2libGU6biYmYS5pbmRleE9mKCJib3R0b20tY2VudGVyIik+PTB9KSx0aGlzLl9iYXRjaENoYW5nZUNoaWxkKCIuYm90dG9tLXJpZ2h0Iix7eDppLHk6cixvZmZzZXRYOm8vMi1zLG9mZnNldFk6by8yLXMsdmlzaWJsZTpuJiZhLmluZGV4T2YoImJvdHRvbS1yaWdodCIpPj0wfSksdGhpcy5fYmF0Y2hDaGFuZ2VDaGlsZCgiLnJvdGF0ZXIiLHt4OmkvMix5Oi10aGlzLnJvdGF0ZUFuY2hvck9mZnNldCgpKmcuX3NpZ24ociktcyx2aXNpYmxlOnRoaXMucm90YXRlRW5hYmxlZCgpfSksdGhpcy5fYmF0Y2hDaGFuZ2VDaGlsZCgiLmJhY2siLHt3aWR0aDppLGhlaWdodDpyLHZpc2libGU6dGhpcy5ib3JkZXJFbmFibGVkKCksc3Ryb2tlOnRoaXMuYm9yZGVyU3Ryb2tlKCksc3Ryb2tlV2lkdGg6dGhpcy5ib3JkZXJTdHJva2VXaWR0aCgpLGRhc2g6dGhpcy5ib3JkZXJEYXNoKCkseDowLHk6MH0pLG51bGw9PT0odD10aGlzLmdldExheWVyKCkpfHx2b2lkIDA9PT10fHx0LmJhdGNoRHJhdygpfWlzVHJhbnNmb3JtaW5nKCl7cmV0dXJuIHRoaXMuX3RyYW5zZm9ybWluZ31zdG9wVHJhbnNmb3JtKCl7aWYodGhpcy5fdHJhbnNmb3JtaW5nKXt0aGlzLl9yZW1vdmVFdmVudHMoKTt2YXIgdD10aGlzLmZpbmRPbmUoIi4iK3RoaXMuX21vdmluZ0FuY2hvck5hbWUpO3QmJnQuc3RvcERyYWcoKX19ZGVzdHJveSgpe3JldHVybiB0aGlzLmdldFN0YWdlKCkmJnRoaXMuX2N1cnNvckNoYW5nZSYmdGhpcy5nZXRTdGFnZSgpLmNvbnRlbnQmJih0aGlzLmdldFN0YWdlKCkuY29udGVudC5zdHlsZS5jdXJzb3I9IiIpLGp0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyksdGhpcy5kZXRhY2goKSx0aGlzLl9yZW1vdmVFdmVudHMoKSx0aGlzfXRvT2JqZWN0KCl7cmV0dXJuIEsucHJvdG90eXBlLnRvT2JqZWN0LmNhbGwodGhpcyl9fUtlLnByb3RvdHlwZS5jbGFzc05hbWU9IlRyYW5zZm9ybWVyIixyKEtlKSx3LmFkZEdldHRlclNldHRlcihLZSwiZW5hYmxlZEFuY2hvcnMiLFVlLChmdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEFycmF5fHxnLndhcm4oImVuYWJsZWRBbmNob3JzIHZhbHVlIHNob3VsZCBiZSBhbiBhcnJheSIpLHQgaW5zdGFuY2VvZiBBcnJheSYmdC5mb3JFYWNoKChmdW5jdGlvbih0KXstMT09PVVlLmluZGV4T2YodCkmJmcud2FybigiVW5rbm93biBhbmNob3IgbmFtZTogIit0KyIuIEF2YWlsYWJsZSBuYW1lcyBhcmU6ICIrVWUuam9pbigiLCAiKSl9KSksdHx8W119KSksdy5hZGRHZXR0ZXJTZXR0ZXIoS2UsImZsaXBFbmFibGVkIiwhMCx4KCkpLHcuYWRkR2V0dGVyU2V0dGVyKEtlLCJyZXNpemVFbmFibGVkIiwhMCksdy5hZGRHZXR0ZXJTZXR0ZXIoS2UsImFuY2hvclNpemUiLDEwLHAoKSksdy5hZGRHZXR0ZXJTZXR0ZXIoS2UsInJvdGF0ZUVuYWJsZWQiLCEwKSx3LmFkZEdldHRlclNldHRlcihLZSwicm90YXRpb25TbmFwcyIsW10pLHcuYWRkR2V0dGVyU2V0dGVyKEtlLCJyb3RhdGVBbmNob3JPZmZzZXQiLDUwLHAoKSksdy5hZGRHZXR0ZXJTZXR0ZXIoS2UsInJvdGF0aW9uU25hcFRvbGVyYW5jZSIsNSxwKCkpLHcuYWRkR2V0dGVyU2V0dGVyKEtlLCJib3JkZXJFbmFibGVkIiwhMCksdy5hZGRHZXR0ZXJTZXR0ZXIoS2UsImFuY2hvclN0cm9rZSIsInJnYigwLCAxNjEsIDI1NSkiKSx3LmFkZEdldHRlclNldHRlcihLZSwiYW5jaG9yU3Ryb2tlV2lkdGgiLDEscCgpKSx3LmFkZEdldHRlclNldHRlcihLZSwiYW5jaG9yRmlsbCIsIndoaXRlIiksdy5hZGRHZXR0ZXJTZXR0ZXIoS2UsImFuY2hvckNvcm5lclJhZGl1cyIsMCxwKCkpLHcuYWRkR2V0dGVyU2V0dGVyKEtlLCJib3JkZXJTdHJva2UiLCJyZ2IoMCwgMTYxLCAyNTUpIiksdy5hZGRHZXR0ZXJTZXR0ZXIoS2UsImJvcmRlclN0cm9rZVdpZHRoIiwxLHAoKSksdy5hZGRHZXR0ZXJTZXR0ZXIoS2UsImJvcmRlckRhc2giKSx3LmFkZEdldHRlclNldHRlcihLZSwia2VlcFJhdGlvIiwhMCksdy5hZGRHZXR0ZXJTZXR0ZXIoS2UsImNlbnRlcmVkU2NhbGluZyIsITEpLHcuYWRkR2V0dGVyU2V0dGVyKEtlLCJpZ25vcmVTdHJva2UiLCExKSx3LmFkZEdldHRlclNldHRlcihLZSwicGFkZGluZyIsMCxwKCkpLHcuYWRkR2V0dGVyU2V0dGVyKEtlLCJub2RlIiksdy5hZGRHZXR0ZXJTZXR0ZXIoS2UsIm5vZGVzIiksdy5hZGRHZXR0ZXJTZXR0ZXIoS2UsImJvdW5kQm94RnVuYyIpLHcuYWRkR2V0dGVyU2V0dGVyKEtlLCJhbmNob3JEcmFnQm91bmRGdW5jIiksdy5hZGRHZXR0ZXJTZXR0ZXIoS2UsInNob3VsZE92ZXJkcmF3V2hvbGVBcmVhIiwhMSksdy5hZGRHZXR0ZXJTZXR0ZXIoS2UsInVzZVNpbmdsZU5vZGVSb3RhdGlvbiIsITApLHcuYmFja0NvbXBhdChLZSx7bGluZUVuYWJsZWQ6ImJvcmRlckVuYWJsZWQiLHJvdGF0ZUhhbmRsZXJPZmZzZXQ6InJvdGF0ZUFuY2hvck9mZnNldCIsZW5hYmxlZEhhbmRsZXJzOiJlbmFibGVkQW5jaG9ycyJ9KTtjbGFzcyBRZSBleHRlbmRzIHp0e19zY2VuZUZ1bmModCl7dC5iZWdpblBhdGgoKSx0LmFyYygwLDAsdGhpcy5yYWRpdXMoKSwwLGkuZ2V0QW5nbGUodGhpcy5hbmdsZSgpKSx0aGlzLmNsb2Nrd2lzZSgpKSx0LmxpbmVUbygwLDApLHQuY2xvc2VQYXRoKCksdC5maWxsU3Ryb2tlU2hhcGUodGhpcyl9Z2V0V2lkdGgoKXtyZXR1cm4gMip0aGlzLnJhZGl1cygpfWdldEhlaWdodCgpe3JldHVybiAyKnRoaXMucmFkaXVzKCl9c2V0V2lkdGgodCl7dGhpcy5yYWRpdXModC8yKX1zZXRIZWlnaHQodCl7dGhpcy5yYWRpdXModC8yKX19ZnVuY3Rpb24gSmUoKXt0aGlzLnI9MCx0aGlzLmc9MCx0aGlzLmI9MCx0aGlzLmE9MCx0aGlzLm5leHQ9bnVsbH1RZS5wcm90b3R5cGUuY2xhc3NOYW1lPSJXZWRnZSIsUWUucHJvdG90eXBlLl9jZW50cm9pZD0hMCxRZS5wcm90b3R5cGUuX2F0dHJzQWZmZWN0aW5nU2l6ZT1bInJhZGl1cyJdLHIoUWUpLHcuYWRkR2V0dGVyU2V0dGVyKFFlLCJyYWRpdXMiLDAscCgpKSx3LmFkZEdldHRlclNldHRlcihRZSwiYW5nbGUiLDAscCgpKSx3LmFkZEdldHRlclNldHRlcihRZSwiY2xvY2t3aXNlIiwhMSksdy5iYWNrQ29tcGF0KFFlLHthbmdsZURlZzoiYW5nbGUiLGdldEFuZ2xlRGVnOiJnZXRBbmdsZSIsc2V0QW5nbGVEZWc6InNldEFuZ2xlIn0pO3ZhciBaZT1bNTEyLDUxMiw0NTYsNTEyLDMyOCw0NTYsMzM1LDUxMiw0MDUsMzI4LDI3MSw0NTYsMzg4LDMzNSwyOTIsNTEyLDQ1NCw0MDUsMzY0LDMyOCwyOTgsMjcxLDQ5Niw0NTYsNDIwLDM4OCwzNjAsMzM1LDMxMiwyOTIsMjczLDUxMiw0ODIsNDU0LDQyOCw0MDUsMzgzLDM2NCwzNDUsMzI4LDMxMiwyOTgsMjg0LDI3MSwyNTksNDk2LDQ3NSw0NTYsNDM3LDQyMCw0MDQsMzg4LDM3NCwzNjAsMzQ3LDMzNSwzMjMsMzEyLDMwMiwyOTIsMjgyLDI3MywyNjUsNTEyLDQ5Nyw0ODIsNDY4LDQ1NCw0NDEsNDI4LDQxNyw0MDUsMzk0LDM4MywzNzMsMzY0LDM1NCwzNDUsMzM3LDMyOCwzMjAsMzEyLDMwNSwyOTgsMjkxLDI4NCwyNzgsMjcxLDI2NSwyNTksNTA3LDQ5Niw0ODUsNDc1LDQ2NSw0NTYsNDQ2LDQzNyw0MjgsNDIwLDQxMiw0MDQsMzk2LDM4OCwzODEsMzc0LDM2NywzNjAsMzU0LDM0NywzNDEsMzM1LDMyOSwzMjMsMzE4LDMxMiwzMDcsMzAyLDI5NywyOTIsMjg3LDI4MiwyNzgsMjczLDI2OSwyNjUsMjYxLDUxMiw1MDUsNDk3LDQ4OSw0ODIsNDc1LDQ2OCw0NjEsNDU0LDQ0Nyw0NDEsNDM1LDQyOCw0MjIsNDE3LDQxMSw0MDUsMzk5LDM5NCwzODksMzgzLDM3OCwzNzMsMzY4LDM2NCwzNTksMzU0LDM1MCwzNDUsMzQxLDMzNywzMzIsMzI4LDMyNCwzMjAsMzE2LDMxMiwzMDksMzA1LDMwMSwyOTgsMjk0LDI5MSwyODcsMjg0LDI4MSwyNzgsMjc0LDI3MSwyNjgsMjY1LDI2MiwyNTksMjU3LDUwNyw1MDEsNDk2LDQ5MSw0ODUsNDgwLDQ3NSw0NzAsNDY1LDQ2MCw0NTYsNDUxLDQ0Niw0NDIsNDM3LDQzMyw0MjgsNDI0LDQyMCw0MTYsNDEyLDQwOCw0MDQsNDAwLDM5NiwzOTIsMzg4LDM4NSwzODEsMzc3LDM3NCwzNzAsMzY3LDM2MywzNjAsMzU3LDM1NCwzNTAsMzQ3LDM0NCwzNDEsMzM4LDMzNSwzMzIsMzI5LDMyNiwzMjMsMzIwLDMxOCwzMTUsMzEyLDMxMCwzMDcsMzA0LDMwMiwyOTksMjk3LDI5NCwyOTIsMjg5LDI4NywyODUsMjgyLDI4MCwyNzgsMjc1LDI3MywyNzEsMjY5LDI2NywyNjUsMjYzLDI2MSwyNTldLCRlPVs5LDExLDEyLDEzLDEzLDE0LDE0LDE1LDE1LDE1LDE1LDE2LDE2LDE2LDE2LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE4LDE4LDE4LDE4LDE4LDE4LDE4LDE4LDE4LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDIwLDIwLDIwLDIwLDIwLDIwLDIwLDIwLDIwLDIwLDIwLDIwLDIwLDIwLDIwLDIwLDIwLDIwLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDIzLDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0XTt3LmFkZEdldHRlclNldHRlcihLLCJibHVyUmFkaXVzIiwwLHAoKSx3LmFmdGVyU2V0RmlsdGVyKTt3LmFkZEdldHRlclNldHRlcihLLCJicmlnaHRuZXNzIiwwLHAoKSx3LmFmdGVyU2V0RmlsdGVyKTt3LmFkZEdldHRlclNldHRlcihLLCJjb250cmFzdCIsMCxwKCksdy5hZnRlclNldEZpbHRlcik7ZnVuY3Rpb24gdGkodCxlLGkscixhKXt2YXIgbj1pLWUscz1hLXI7cmV0dXJuIDA9PT1uP3Ircy8yOjA9PT1zP3I6cyooKHQtZSkvbikrcn13LmFkZEdldHRlclNldHRlcihLLCJlbWJvc3NTdHJlbmd0aCIsLjUscCgpLHcuYWZ0ZXJTZXRGaWx0ZXIpLHcuYWRkR2V0dGVyU2V0dGVyKEssImVtYm9zc1doaXRlTGV2ZWwiLC41LHAoKSx3LmFmdGVyU2V0RmlsdGVyKSx3LmFkZEdldHRlclNldHRlcihLLCJlbWJvc3NEaXJlY3Rpb24iLCJ0b3AtbGVmdCIsbnVsbCx3LmFmdGVyU2V0RmlsdGVyKSx3LmFkZEdldHRlclNldHRlcihLLCJlbWJvc3NCbGVuZCIsITEsbnVsbCx3LmFmdGVyU2V0RmlsdGVyKTt3LmFkZEdldHRlclNldHRlcihLLCJlbmhhbmNlIiwwLHAoKSx3LmFmdGVyU2V0RmlsdGVyKTt3LmFkZEdldHRlclNldHRlcihLLCJodWUiLDAscCgpLHcuYWZ0ZXJTZXRGaWx0ZXIpLHcuYWRkR2V0dGVyU2V0dGVyKEssInNhdHVyYXRpb24iLDAscCgpLHcuYWZ0ZXJTZXRGaWx0ZXIpLHcuYWRkR2V0dGVyU2V0dGVyKEssImx1bWluYW5jZSIsMCxwKCksdy5hZnRlclNldEZpbHRlcik7dy5hZGRHZXR0ZXJTZXR0ZXIoSywiaHVlIiwwLHAoKSx3LmFmdGVyU2V0RmlsdGVyKSx3LmFkZEdldHRlclNldHRlcihLLCJzYXR1cmF0aW9uIiwwLHAoKSx3LmFmdGVyU2V0RmlsdGVyKSx3LmFkZEdldHRlclNldHRlcihLLCJ2YWx1ZSIsMCxwKCksdy5hZnRlclNldEZpbHRlcik7ZnVuY3Rpb24gZWkodCxlLGkpe3ZhciByPTQqKGkqdC53aWR0aCtlKSxhPVtdO3JldHVybiBhLnB1c2godC5kYXRhW3IrK10sdC5kYXRhW3IrK10sdC5kYXRhW3IrK10sdC5kYXRhW3IrK10pLGF9ZnVuY3Rpb24gaWkodCxlKXtyZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KHRbMF0tZVswXSwyKStNYXRoLnBvdyh0WzFdLWVbMV0sMikrTWF0aC5wb3codFsyXS1lWzJdLDIpKX13LmFkZEdldHRlclNldHRlcihLLCJrYWxlaWRvc2NvcGVQb3dlciIsMixwKCksdy5hZnRlclNldEZpbHRlciksdy5hZGRHZXR0ZXJTZXR0ZXIoSywia2FsZWlkb3Njb3BlQW5nbGUiLDAscCgpLHcuYWZ0ZXJTZXRGaWx0ZXIpO3cuYWRkR2V0dGVyU2V0dGVyKEssInRocmVzaG9sZCIsMCxwKCksdy5hZnRlclNldEZpbHRlcik7dy5hZGRHZXR0ZXJTZXR0ZXIoSywibm9pc2UiLC4yLHAoKSx3LmFmdGVyU2V0RmlsdGVyKTt3LmFkZEdldHRlclNldHRlcihLLCJwaXhlbFNpemUiLDgscCgpLHcuYWZ0ZXJTZXRGaWx0ZXIpO3cuYWRkR2V0dGVyU2V0dGVyKEssImxldmVscyIsLjUscCgpLHcuYWZ0ZXJTZXRGaWx0ZXIpO3cuYWRkR2V0dGVyU2V0dGVyKEssInJlZCIsMCwoZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2ZpbHRlclVwVG9EYXRlPSExLHQ+MjU1PzI1NTp0PDA/MDpNYXRoLnJvdW5kKHQpfSkpLHcuYWRkR2V0dGVyU2V0dGVyKEssImdyZWVuIiwwLChmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZmlsdGVyVXBUb0RhdGU9ITEsdD4yNTU/MjU1OnQ8MD8wOk1hdGgucm91bmQodCl9KSksdy5hZGRHZXR0ZXJTZXR0ZXIoSywiYmx1ZSIsMCxmLHcuYWZ0ZXJTZXRGaWx0ZXIpO3cuYWRkR2V0dGVyU2V0dGVyKEssInJlZCIsMCwoZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2ZpbHRlclVwVG9EYXRlPSExLHQ+MjU1PzI1NTp0PDA/MDpNYXRoLnJvdW5kKHQpfSkpLHcuYWRkR2V0dGVyU2V0dGVyKEssImdyZWVuIiwwLChmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZmlsdGVyVXBUb0RhdGU9ITEsdD4yNTU/MjU1OnQ8MD8wOk1hdGgucm91bmQodCl9KSksdy5hZGRHZXR0ZXJTZXR0ZXIoSywiYmx1ZSIsMCxmLHcuYWZ0ZXJTZXRGaWx0ZXIpLHcuYWRkR2V0dGVyU2V0dGVyKEssImFscGhhIiwxLChmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZmlsdGVyVXBUb0RhdGU9ITEsdD4xPzE6dDwwPzA6dH0pKTt3LmFkZEdldHRlclNldHRlcihLLCJ0aHJlc2hvbGQiLC41LHAoKSx3LmFmdGVyU2V0RmlsdGVyKTtyZXR1cm4gdGUuVXRpbC5fYXNzaWduKHRlLHtBcmM6ZWUsQXJyb3c6c2UsQ2lyY2xlOm9lLEVsbGlwc2U6aGUsSW1hZ2U6bGUsTGFiZWw6dmUsVGFnOm1lLExpbmU6YWUsUGF0aDpuZSxSZWN0Ol9lLFJlZ3VsYXJQb2x5Z29uOnllLFJpbmc6YmUsU3ByaXRlOlNlLFN0YXI6d2UsVGV4dDpPZSxUZXh0UGF0aDpCZSxUcmFuc2Zvcm1lcjpLZSxXZWRnZTpRZSxGaWx0ZXJzOntCbHVyOmZ1bmN0aW9uKHQpe3ZhciBlPU1hdGgucm91bmQodGhpcy5ibHVyUmFkaXVzKCkpO2U+MCYmZnVuY3Rpb24odCxlKXt2YXIgaSxyLGEsbixzLG8saCxsLGQsYyxnLHUsZixwLHYsbSxfLHkseCxiLFMsdyxDLGssUD10LmRhdGEsVD10LndpZHRoLEE9dC5oZWlnaHQsTT1lK2UrMSxHPVQtMSxFPUEtMSxSPWUrMSxMPVIqKFIrMSkvMixEPW5ldyBKZSxPPW51bGwsST1ELEY9bnVsbCxOPW51bGwsQj1aZVtlXSx6PSRlW2VdO2ZvcihhPTE7YTxNO2ErKylJPUkubmV4dD1uZXcgSmUsYT09PVImJihPPUkpO2ZvcihJLm5leHQ9RCxoPW89MCxyPTA7cjxBO3IrKyl7Zm9yKG09Xz15PXg9bD1kPWM9Zz0wLHU9UiooYj1QW29dKSxmPVIqKFM9UFtvKzFdKSxwPVIqKHc9UFtvKzJdKSx2PVIqKEM9UFtvKzNdKSxsKz1MKmIsZCs9TCpTLGMrPUwqdyxnKz1MKkMsST1ELGE9MDthPFI7YSsrKUkucj1iLEkuZz1TLEkuYj13LEkuYT1DLEk9SS5uZXh0O2ZvcihhPTE7YTxSO2ErKyluPW8rKChHPGE/RzphKTw8MiksbCs9KEkucj1iPVBbbl0pKihrPVItYSksZCs9KEkuZz1TPVBbbisxXSkqayxjKz0oSS5iPXc9UFtuKzJdKSprLGcrPShJLmE9Qz1QW24rM10pKmssbSs9YixfKz1TLHkrPXcseCs9QyxJPUkubmV4dDtmb3IoRj1ELE49TyxpPTA7aTxUO2krKylQW28rM109Qz1nKkI+PnosMCE9PUM/KEM9MjU1L0MsUFtvXT0obCpCPj56KSpDLFBbbysxXT0oZCpCPj56KSpDLFBbbysyXT0oYypCPj56KSpDKTpQW29dPVBbbysxXT1QW28rMl09MCxsLT11LGQtPWYsYy09cCxnLT12LHUtPUYucixmLT1GLmcscC09Ri5iLHYtPUYuYSxuPWgrKChuPWkrZSsxKTxHP246Ryk8PDIsbCs9bSs9Ri5yPVBbbl0sZCs9Xys9Ri5nPVBbbisxXSxjKz15Kz1GLmI9UFtuKzJdLGcrPXgrPUYuYT1QW24rM10sRj1GLm5leHQsdSs9Yj1OLnIsZis9Uz1OLmcscCs9dz1OLmIsdis9Qz1OLmEsbS09YixfLT1TLHktPXcseC09QyxOPU4ubmV4dCxvKz00O2grPVR9Zm9yKGk9MDtpPFQ7aSsrKXtmb3IoXz15PXg9bT1kPWM9Zz1sPTAsdT1SKihiPVBbbz1pPDwyXSksZj1SKihTPVBbbysxXSkscD1SKih3PVBbbysyXSksdj1SKihDPVBbbyszXSksbCs9TCpiLGQrPUwqUyxjKz1MKncsZys9TCpDLEk9RCxhPTA7YTxSO2ErKylJLnI9YixJLmc9UyxJLmI9dyxJLmE9QyxJPUkubmV4dDtmb3Iocz1ULGE9MTthPD1lO2ErKylvPXMraTw8MixsKz0oSS5yPWI9UFtvXSkqKGs9Ui1hKSxkKz0oSS5nPVM9UFtvKzFdKSprLGMrPShJLmI9dz1QW28rMl0pKmssZys9KEkuYT1DPVBbbyszXSkqayxtKz1iLF8rPVMseSs9dyx4Kz1DLEk9SS5uZXh0LGE8RSYmKHMrPVQpO2ZvcihvPWksRj1ELE49TyxyPTA7cjxBO3IrKylQWzMrKG49bzw8MildPUM9ZypCPj56LEM+MD8oQz0yNTUvQyxQW25dPShsKkI+PnopKkMsUFtuKzFdPShkKkI+PnopKkMsUFtuKzJdPShjKkI+PnopKkMpOlBbbl09UFtuKzFdPVBbbisyXT0wLGwtPXUsZC09ZixjLT1wLGctPXYsdS09Ri5yLGYtPUYuZyxwLT1GLmIsdi09Ri5hLG49aSsoKG49citSKTxFP246RSkqVDw8MixsKz1tKz1GLnI9UFtuXSxkKz1fKz1GLmc9UFtuKzFdLGMrPXkrPUYuYj1QW24rMl0sZys9eCs9Ri5hPVBbbiszXSxGPUYubmV4dCx1Kz1iPU4ucixmKz1TPU4uZyxwKz13PU4uYix2Kz1DPU4uYSxtLT1iLF8tPVMseS09dyx4LT1DLE49Ti5uZXh0LG8rPVR9fSh0LGUpfSxCcmlnaHRlbjpmdW5jdGlvbih0KXt2YXIgZSxpPTI1NSp0aGlzLmJyaWdodG5lc3MoKSxyPXQuZGF0YSxhPXIubGVuZ3RoO2ZvcihlPTA7ZTxhO2UrPTQpcltlXSs9aSxyW2UrMV0rPWkscltlKzJdKz1pfSxDb250cmFzdDpmdW5jdGlvbih0KXt2YXIgZSxpPU1hdGgucG93KCh0aGlzLmNvbnRyYXN0KCkrMTAwKS8xMDAsMikscj10LmRhdGEsYT1yLmxlbmd0aCxuPTE1MCxzPTE1MCxvPTE1MDtmb3IoZT0wO2U8YTtlKz00KW49cltlXSxzPXJbZSsxXSxvPXJbZSsyXSxuLz0yNTUsbi09LjUsbio9aSxuKz0uNSxzLz0yNTUscy09LjUscyo9aSxzKz0uNSxvLz0yNTUsby09LjUsbyo9aSxvKz0uNSxuPShuKj0yNTUpPDA/MDpuPjI1NT8yNTU6bixzPShzKj0yNTUpPDA/MDpzPjI1NT8yNTU6cyxvPShvKj0yNTUpPDA/MDpvPjI1NT8yNTU6byxyW2VdPW4scltlKzFdPXMscltlKzJdPW99LEVtYm9zczpmdW5jdGlvbih0KXt2YXIgZT0xMCp0aGlzLmVtYm9zc1N0cmVuZ3RoKCksaT0yNTUqdGhpcy5lbWJvc3NXaGl0ZUxldmVsKCkscj10aGlzLmVtYm9zc0RpcmVjdGlvbigpLGE9dGhpcy5lbWJvc3NCbGVuZCgpLG49MCxzPTAsbz10LmRhdGEsaD10LndpZHRoLGw9dC5oZWlnaHQsZD00KmgsYz1sO3N3aXRjaChyKXtjYXNlInRvcC1sZWZ0IjpuPS0xLHM9LTE7YnJlYWs7Y2FzZSJ0b3AiOm49LTEscz0wO2JyZWFrO2Nhc2UidG9wLXJpZ2h0IjpuPS0xLHM9MTticmVhaztjYXNlInJpZ2h0IjpuPTAscz0xO2JyZWFrO2Nhc2UiYm90dG9tLXJpZ2h0IjpuPTEscz0xO2JyZWFrO2Nhc2UiYm90dG9tIjpuPTEscz0wO2JyZWFrO2Nhc2UiYm90dG9tLWxlZnQiOm49MSxzPS0xO2JyZWFrO2Nhc2UibGVmdCI6bj0wLHM9LTE7YnJlYWs7ZGVmYXVsdDpnLmVycm9yKCJVbmtub3duIGVtYm9zcyBkaXJlY3Rpb246ICIrcil9ZG97dmFyIHU9KGMtMSkqZCxmPW47YytmPDEmJihmPTApLGMrZj5sJiYoZj0wKTt2YXIgcD0oYy0xK2YpKmgqNCx2PWg7ZG97dmFyIG09dSs0Kih2LTEpLF89czt2K188MSYmKF89MCksditfPmgmJihfPTApO3ZhciB5PXArNCoodi0xK18pLHg9b1ttXS1vW3ldLGI9b1ttKzFdLW9beSsxXSxTPW9bbSsyXS1vW3krMl0sdz14LEM9dz4wP3c6LXc7aWYoKGI+MD9iOi1iKT5DJiYodz1iKSwoUz4wP1M6LVMpPkMmJih3PVMpLHcqPWUsYSl7dmFyIGs9b1ttXSt3LFA9b1ttKzFdK3csVD1vW20rMl0rdztvW21dPWs+MjU1PzI1NTprPDA/MDprLG9bbSsxXT1QPjI1NT8yNTU6UDwwPzA6UCxvW20rMl09VD4yNTU/MjU1OlQ8MD8wOlR9ZWxzZXt2YXIgQT1pLXc7QTwwP0E9MDpBPjI1NSYmKEE9MjU1KSxvW21dPW9bbSsxXT1vW20rMl09QX19d2hpbGUoLS12KX13aGlsZSgtLWMpfSxFbmhhbmNlOmZ1bmN0aW9uKHQpe3ZhciBlLGkscixhLG49dC5kYXRhLHM9bi5sZW5ndGgsbz1uWzBdLGg9byxsPW5bMV0sZD1sLGM9blsyXSxnPWMsdT10aGlzLmVuaGFuY2UoKTtpZigwIT09dSl7Zm9yKGE9MDthPHM7YSs9NCkoZT1uW2ErMF0pPG8/bz1lOmU+aCYmKGg9ZSksKGk9blthKzFdKTxsP2w9aTppPmQmJihkPWkpLChyPW5bYSsyXSk8Yz9jPXI6cj5nJiYoZz1yKTt2YXIgZixwLHYsbSxfLHkseCxiLFM7Zm9yKGg9PT1vJiYoaD0yNTUsbz0wKSxkPT09bCYmKGQ9MjU1LGw9MCksZz09PWMmJihnPTI1NSxjPTApLHU+MD8ocD1oK3UqKDI1NS1oKSx2PW8tdSooby0wKSxfPWQrdSooMjU1LWQpLHk9bC11KihsLTApLGI9Zyt1KigyNTUtZyksUz1jLXUqKGMtMCkpOihwPWgrdSooaC0oZj0uNSooaCtvKSkpLHY9byt1KihvLWYpLF89ZCt1KihkLShtPS41KihkK2wpKSkseT1sK3UqKGwtbSksYj1nK3UqKGctKHg9LjUqKGcrYykpKSxTPWMrdSooYy14KSksYT0wO2E8czthKz00KW5bYSswXT10aShuW2ErMF0sbyxoLHYscCksblthKzFdPXRpKG5bYSsxXSxsLGQseSxfKSxuW2ErMl09dGkoblthKzJdLGMsZyxTLGIpfX0sR3JheXNjYWxlOmZ1bmN0aW9uKHQpe3ZhciBlLGkscj10LmRhdGEsYT1yLmxlbmd0aDtmb3IoZT0wO2U8YTtlKz00KWk9LjM0KnJbZV0rLjUqcltlKzFdKy4xNipyW2UrMl0scltlXT1pLHJbZSsxXT1pLHJbZSsyXT1pfSxIU0w6ZnVuY3Rpb24odCl7dmFyIGUsaSxyLGEsbixzPXQuZGF0YSxvPXMubGVuZ3RoLGg9TWF0aC5wb3coMix0aGlzLnNhdHVyYXRpb24oKSksbD1NYXRoLmFicyh0aGlzLmh1ZSgpKzM2MCklMzYwLGQ9MTI3KnRoaXMubHVtaW5hbmNlKCksYz0xKmgqTWF0aC5jb3MobCpNYXRoLlBJLzE4MCksZz0xKmgqTWF0aC5zaW4obCpNYXRoLlBJLzE4MCksdT0uMjk5Ky43MDEqYysuMTY3KmcsZj0uNTg3LS41ODcqYysuMzMqZyxwPS4xMTQtLjExNCpjLS40OTcqZyx2PS4yOTktLjI5OSpjLS4zMjgqZyxtPS41ODcrLjQxMypjKy4wMzUqZyxfPS4xMTQtLjExNCpjKy4yOTMqZyx5PS4yOTktLjMqYysxLjI1KmcseD0uNTg3LS41ODYqYy0xLjA1KmcsYj0uMTE0Ky44ODYqYy0uMipnO2ZvcihlPTA7ZTxvO2UrPTQpaT1zW2UrMF0scj1zW2UrMV0sYT1zW2UrMl0sbj1zW2UrM10sc1tlKzBdPXUqaStmKnIrcCphK2Qsc1tlKzFdPXYqaSttKnIrXyphK2Qsc1tlKzJdPXkqaSt4KnIrYiphK2Qsc1tlKzNdPW59LEhTVjpmdW5jdGlvbih0KXt2YXIgZSxpLHIsYSxuLHM9dC5kYXRhLG89cy5sZW5ndGgsaD1NYXRoLnBvdygyLHRoaXMudmFsdWUoKSksbD1NYXRoLnBvdygyLHRoaXMuc2F0dXJhdGlvbigpKSxkPU1hdGguYWJzKHRoaXMuaHVlKCkrMzYwKSUzNjAsYz1oKmwqTWF0aC5jb3MoZCpNYXRoLlBJLzE4MCksZz1oKmwqTWF0aC5zaW4oZCpNYXRoLlBJLzE4MCksdT0uMjk5KmgrLjcwMSpjKy4xNjcqZyxmPS41ODcqaC0uNTg3KmMrLjMzKmcscD0uMTE0KmgtLjExNCpjLS40OTcqZyx2PS4yOTkqaC0uMjk5KmMtLjMyOCpnLG09LjU4NypoKy40MTMqYysuMDM1KmcsXz0uMTE0KmgtLjExNCpjKy4yOTMqZyx5PS4yOTkqaC0uMypjKzEuMjUqZyx4PS41ODcqaC0uNTg2KmMtMS4wNSpnLGI9LjExNCpoKy44ODYqYy0uMipnO2ZvcihlPTA7ZTxvO2UrPTQpaT1zW2UrMF0scj1zW2UrMV0sYT1zW2UrMl0sbj1zW2UrM10sc1tlKzBdPXUqaStmKnIrcCphLHNbZSsxXT12KmkrbSpyK18qYSxzW2UrMl09eSppK3gqcitiKmEsc1tlKzNdPW59LEludmVydDpmdW5jdGlvbih0KXt2YXIgZSxpPXQuZGF0YSxyPWkubGVuZ3RoO2ZvcihlPTA7ZTxyO2UrPTQpaVtlXT0yNTUtaVtlXSxpW2UrMV09MjU1LWlbZSsxXSxpW2UrMl09MjU1LWlbZSsyXX0sS2FsZWlkb3Njb3BlOmZ1bmN0aW9uKHQpe3ZhciBlLGkscixhLG4scyxvLGgsbCxkPXQud2lkdGgsYz10LmhlaWdodCx1PU1hdGgucm91bmQodGhpcy5rYWxlaWRvc2NvcGVQb3dlcigpKSxmPU1hdGgucm91bmQodGhpcy5rYWxlaWRvc2NvcGVBbmdsZSgpKSxwPU1hdGguZmxvb3IoZCooZiUzNjApLzM2MCk7aWYoISh1PDEpKXt2YXIgdj1nLmNyZWF0ZUNhbnZhc0VsZW1lbnQoKTt2LndpZHRoPWQsdi5oZWlnaHQ9Yzt2YXIgbT12LmdldENvbnRleHQoIjJkIikuZ2V0SW1hZ2VEYXRhKDAsMCxkLGMpOyFmdW5jdGlvbih0LGUsaSl7dmFyIHIsYSxuLHMsbz10LmRhdGEsaD1lLmRhdGEsbD10LndpZHRoLGQ9dC5oZWlnaHQsYz1pLnBvbGFyQ2VudGVyWHx8bC8yLGc9aS5wb2xhckNlbnRlcll8fGQvMix1PTAsZj0wLHA9MCx2PTAsbT1NYXRoLnNxcnQoYypjK2cqZyk7YT1sLWMsbj1kLWcsbT0ocz1NYXRoLnNxcnQoYSphK24qbikpPm0/czptO3ZhciBfLHkseCxiLFM9ZCx3PWwsQz0zNjAvdypNYXRoLlBJLzE4MDtmb3IoeT0wO3k8dzt5Kz0xKWZvcih4PU1hdGguc2luKHkqQyksYj1NYXRoLmNvcyh5KkMpLF89MDtfPFM7Xys9MSlhPU1hdGguZmxvb3IoYyttKl8vUypiKSx1PW9bMCsocj00Kigobj1NYXRoLmZsb29yKGcrbSpfL1MqeCkpKmwrYSkpXSxmPW9bcisxXSxwPW9bcisyXSx2PW9bciszXSxoWzArKHI9NCooeStfKmwpKV09dSxoW3IrMV09ZixoW3IrMl09cCxoW3IrM109dn0odCxtLHtwb2xhckNlbnRlclg6ZC8yLHBvbGFyQ2VudGVyWTpjLzJ9KTtmb3IodmFyIF89ZC9NYXRoLnBvdygyLHUpO188PTg7KV8qPTIsdS09MTt2YXIgeT1fPU1hdGguY2VpbChfKSx4PTAsYj15LFM9MTtmb3IocCtfPmQmJih4PXksYj0wLFM9LTEpLGk9MDtpPGM7aSs9MSlmb3IoZT14O2UhPT1iO2UrPVMpaD00KihkKmkrTWF0aC5yb3VuZChlK3ApJWQpLGE9bS5kYXRhW2grMF0sbj1tLmRhdGFbaCsxXSxzPW0uZGF0YVtoKzJdLG89bS5kYXRhW2grM10sbD00KihkKmkrZSksbS5kYXRhW2wrMF09YSxtLmRhdGFbbCsxXT1uLG0uZGF0YVtsKzJdPXMsbS5kYXRhW2wrM109bztmb3IoaT0wO2k8YztpKz0xKWZvcih5PU1hdGguZmxvb3IoXykscj0wO3I8dTtyKz0xKXtmb3IoZT0wO2U8eSsxO2UrPTEpaD00KihkKmkrZSksYT1tLmRhdGFbaCswXSxuPW0uZGF0YVtoKzFdLHM9bS5kYXRhW2grMl0sbz1tLmRhdGFbaCszXSxsPTQqKGQqaSsyKnktZS0xKSxtLmRhdGFbbCswXT1hLG0uZGF0YVtsKzFdPW4sbS5kYXRhW2wrMl09cyxtLmRhdGFbbCszXT1vO3kqPTJ9IWZ1bmN0aW9uKHQsZSxpKXt2YXIgcixhLG4scyxvLGgsbD10LmRhdGEsZD1lLmRhdGEsYz10LndpZHRoLGc9dC5oZWlnaHQsdT1pLnBvbGFyQ2VudGVyWHx8Yy8yLGY9aS5wb2xhckNlbnRlcll8fGcvMixwPTAsdj0wLG09MCxfPTAseT1NYXRoLnNxcnQodSp1K2YqZik7YT1jLXUsbj1nLWYseT0oaD1NYXRoLnNxcnQoYSphK24qbikpPnk/aDp5O3ZhciB4LGIsUyx3PWcsQz1jLGs9aS5wb2xhclJvdGF0aW9ufHwwO2ZvcihhPTA7YTxjO2ErPTEpZm9yKG49MDtuPGc7bis9MSlzPWEtdSxvPW4tZix4PU1hdGguc3FydChzKnMrbypvKSp3L3ksYj0oYj0oMTgwKk1hdGguYXRhbjIobyxzKS9NYXRoLlBJKzM2MCtrKSUzNjApKkMvMzYwLFM9TWF0aC5mbG9vcihiKSxwPWxbMCsocj00KihNYXRoLmZsb29yKHgpKmMrUykpXSx2PWxbcisxXSxtPWxbcisyXSxfPWxbciszXSxkWzArKHI9NCoobipjK2EpKV09cCxkW3IrMV09dixkW3IrMl09bSxkW3IrM109X30obSx0LHtwb2xhclJvdGF0aW9uOjB9KX19LE1hc2s6ZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24odCxlKXt2YXIgaT1laSh0LDAsMCkscj1laSh0LHQud2lkdGgtMSwwKSxhPWVpKHQsMCx0LmhlaWdodC0xKSxuPWVpKHQsdC53aWR0aC0xLHQuaGVpZ2h0LTEpLHM9ZXx8MTA7aWYoaWkoaSxyKTxzJiZpaShyLG4pPHMmJmlpKG4sYSk8cyYmaWkoYSxpKTxzKXtmb3IodmFyIG89ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVswLDAsMF0saT0wO2k8dC5sZW5ndGg7aSsrKWVbMF0rPXRbaV1bMF0sZVsxXSs9dFtpXVsxXSxlWzJdKz10W2ldWzJdO3JldHVybiBlWzBdLz10Lmxlbmd0aCxlWzFdLz10Lmxlbmd0aCxlWzJdLz10Lmxlbmd0aCxlfShbcixpLG4sYV0pLGg9W10sbD0wO2w8dC53aWR0aCp0LmhlaWdodDtsKyspe3ZhciBkPWlpKG8sW3QuZGF0YVs0KmxdLHQuZGF0YVs0KmwrMV0sdC5kYXRhWzQqbCsyXV0pO2hbbF09ZDxzPzA6MjU1fXJldHVybiBofX0odCx0aGlzLnRocmVzaG9sZCgpKTtyZXR1cm4gZSYmZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9MDtpPHQud2lkdGgqdC5oZWlnaHQ7aSsrKXQuZGF0YVs0KmkrM109ZVtpXX0odCxlPWZ1bmN0aW9uKHQsZSxpKXtmb3IodmFyIHI9WzEvOSwxLzksMS85LDEvOSwxLzksMS85LDEvOSwxLzksMS85XSxhPU1hdGgucm91bmQoTWF0aC5zcXJ0KHIubGVuZ3RoKSksbj1NYXRoLmZsb29yKGEvMikscz1bXSxvPTA7bzxpO28rKylmb3IodmFyIGg9MDtoPGU7aCsrKXtmb3IodmFyIGw9byplK2gsZD0wLGM9MDtjPGE7YysrKWZvcih2YXIgZz0wO2c8YTtnKyspe3ZhciB1PW8rYy1uLGY9aCtnLW47aWYodT49MCYmdTxpJiZmPj0wJiZmPGUpe3ZhciBwPXJbYyphK2ddO2QrPXRbdSplK2ZdKnB9fXNbbF09ZH1yZXR1cm4gc30oZT1mdW5jdGlvbih0LGUsaSl7Zm9yKHZhciByPVsxLDEsMSwxLDEsMSwxLDEsMV0sYT1NYXRoLnJvdW5kKE1hdGguc3FydChyLmxlbmd0aCkpLG49TWF0aC5mbG9vcihhLzIpLHM9W10sbz0wO288aTtvKyspZm9yKHZhciBoPTA7aDxlO2grKyl7Zm9yKHZhciBsPW8qZStoLGQ9MCxjPTA7YzxhO2MrKylmb3IodmFyIGc9MDtnPGE7ZysrKXt2YXIgdT1vK2MtbixmPWgrZy1uO2lmKHU+PTAmJnU8aSYmZj49MCYmZjxlKXt2YXIgcD1yW2MqYStnXTtkKz10W3UqZStmXSpwfX1zW2xdPWQ+PTEwMjA/MjU1OjB9cmV0dXJuIHN9KGU9ZnVuY3Rpb24odCxlLGkpe2Zvcih2YXIgcj1bMSwxLDEsMSwwLDEsMSwxLDFdLGE9TWF0aC5yb3VuZChNYXRoLnNxcnQoci5sZW5ndGgpKSxuPU1hdGguZmxvb3IoYS8yKSxzPVtdLG89MDtvPGk7bysrKWZvcih2YXIgaD0wO2g8ZTtoKyspe2Zvcih2YXIgbD1vKmUraCxkPTAsYz0wO2M8YTtjKyspZm9yKHZhciBnPTA7ZzxhO2crKyl7dmFyIHU9bytjLW4sZj1oK2ctbjtpZih1Pj0wJiZ1PGkmJmY+PTAmJmY8ZSl7dmFyIHA9cltjKmErZ107ZCs9dFt1KmUrZl0qcH19c1tsXT0yMDQwPT09ZD8yNTU6MH1yZXR1cm4gc30oZSx0LndpZHRoLHQuaGVpZ2h0KSx0LndpZHRoLHQuaGVpZ2h0KSx0LndpZHRoLHQuaGVpZ2h0KSksdH0sTm9pc2U6ZnVuY3Rpb24odCl7dmFyIGUsaT0yNTUqdGhpcy5ub2lzZSgpLHI9dC5kYXRhLGE9ci5sZW5ndGgsbj1pLzI7Zm9yKGU9MDtlPGE7ZSs9NClyW2UrMF0rPW4tMipuKk1hdGgucmFuZG9tKCkscltlKzFdKz1uLTIqbipNYXRoLnJhbmRvbSgpLHJbZSsyXSs9bi0yKm4qTWF0aC5yYW5kb20oKX0sUGl4ZWxhdGU6ZnVuY3Rpb24odCl7dmFyIGUsaSxyLGEsbixzLG8saCxsLGQsYyx1LGYscCx2PU1hdGguY2VpbCh0aGlzLnBpeGVsU2l6ZSgpKSxtPXQud2lkdGgsXz10LmhlaWdodCx5PU1hdGguY2VpbChtL3YpLHg9TWF0aC5jZWlsKF8vdiksYj10LmRhdGE7aWYodjw9MClnLmVycm9yKCJwaXhlbFNpemUgdmFsdWUgY2FuIG5vdCBiZSA8PSAwIik7ZWxzZSBmb3IodT0wO3U8eTt1Kz0xKWZvcihmPTA7Zjx4O2YrPTEpe2ZvcihhPTAsbj0wLHM9MCxvPTAsbD0oaD11KnYpK3YsYz0oZD1mKnYpK3YscD0wLGU9aDtlPGw7ZSs9MSlpZighKGU+PW0pKWZvcihpPWQ7aTxjO2krPTEpaT49X3x8KGErPWJbKHI9NCoobSppK2UpKSswXSxuKz1iW3IrMV0scys9YltyKzJdLG8rPWJbciszXSxwKz0xKTtmb3IoYS89cCxuLz1wLHMvPXAsby89cCxlPWg7ZTxsO2UrPTEpaWYoIShlPj1tKSlmb3IoaT1kO2k8YztpKz0xKWk+PV98fChiWyhyPTQqKG0qaStlKSkrMF09YSxiW3IrMV09bixiW3IrMl09cyxiW3IrM109byl9fSxQb3N0ZXJpemU6ZnVuY3Rpb24odCl7dmFyIGUsaT1NYXRoLnJvdW5kKDI1NCp0aGlzLmxldmVscygpKSsxLHI9dC5kYXRhLGE9ci5sZW5ndGgsbj0yNTUvaTtmb3IoZT0wO2U8YTtlKz0xKXJbZV09TWF0aC5mbG9vcihyW2VdL24pKm59LFJHQjpmdW5jdGlvbih0KXt2YXIgZSxpLHI9dC5kYXRhLGE9ci5sZW5ndGgsbj10aGlzLnJlZCgpLHM9dGhpcy5ncmVlbigpLG89dGhpcy5ibHVlKCk7Zm9yKGU9MDtlPGE7ZSs9NClpPSguMzQqcltlXSsuNSpyW2UrMV0rLjE2KnJbZSsyXSkvMjU1LHJbZV09aSpuLHJbZSsxXT1pKnMscltlKzJdPWkqbyxyW2UrM109cltlKzNdfSxSR0JBOmZ1bmN0aW9uKHQpe3ZhciBlLGkscj10LmRhdGEsYT1yLmxlbmd0aCxuPXRoaXMucmVkKCkscz10aGlzLmdyZWVuKCksbz10aGlzLmJsdWUoKSxoPXRoaXMuYWxwaGEoKTtmb3IoZT0wO2U8YTtlKz00KWk9MS1oLHJbZV09bipoK3JbZV0qaSxyW2UrMV09cypoK3JbZSsxXSppLHJbZSsyXT1vKmgrcltlKzJdKml9LFNlcGlhOmZ1bmN0aW9uKHQpe3ZhciBlLGkscixhLG49dC5kYXRhLHM9bi5sZW5ndGg7Zm9yKGU9MDtlPHM7ZSs9NClpPW5bZSswXSxyPW5bZSsxXSxhPW5bZSsyXSxuW2UrMF09TWF0aC5taW4oMjU1LC4zOTMqaSsuNzY5KnIrLjE4OSphKSxuW2UrMV09TWF0aC5taW4oMjU1LC4zNDkqaSsuNjg2KnIrLjE2OCphKSxuW2UrMl09TWF0aC5taW4oMjU1LC4yNzIqaSsuNTM0KnIrLjEzMSphKX0sU29sYXJpemU6ZnVuY3Rpb24odCl7dmFyIGU9dC5kYXRhLGk9dC53aWR0aCxyPTQqaSxhPXQuaGVpZ2h0O2Rve3ZhciBuPShhLTEpKnIscz1pO2Rve3ZhciBvPW4rNCoocy0xKSxoPWVbb10sbD1lW28rMV0sZD1lW28rMl07aD4xMjcmJihoPTI1NS1oKSxsPjEyNyYmKGw9MjU1LWwpLGQ+MTI3JiYoZD0yNTUtZCksZVtvXT1oLGVbbysxXT1sLGVbbysyXT1kfXdoaWxlKC0tcyl9d2hpbGUoLS1hKX0sVGhyZXNob2xkOmZ1bmN0aW9uKHQpe3ZhciBlLGk9MjU1KnRoaXMudGhyZXNob2xkKCkscj10LmRhdGEsYT1yLmxlbmd0aDtmb3IoZT0wO2U8YTtlKz0xKXJbZV09cltlXTxpPzA6MjU1fX19KX0pKTsK'></script>

	<style id=style_ko_canvas>
		body {
			margin: 5px;
			padding: 5px;
			}
		</style>

<!-- 	<script id=script_konva src=konva.min.js></script> -->
	</head>

<body bgcolor=linen onload="startup_canvas(''); return false;">
	<img src=/imgs/btn/koeyeb.png id=img_ko_canvas_draw onclick="ko_canvas('button');return false;" height=50>
	&nbsp &nbsp &nbsp &nbsp






<hr color=black>
<hr color=white>
	<h1>ko go ko_canvas</h1>
	<img src=/imgs/btn/koeye.png id=img_ko_canvas onclick="toggle('div_ko_canvas');return false;" height=50>
<hr color=black>
<hr color=white>
	<div id=div_ko_canvas hidden>
		<hr color=black>
		<hr color=white>
		<h1>ko_canvas</h1>
		<hr color=white>
		<hr color=black>
		<canvas id="canvas" height=1100 width=1100 style="border:15px solid #000066;">
			NO_CANVAS
			</canvas>
		<hr color=black>
		<hr color=white>
		</div>

	<hr color=black>
	<hr color=white>
	<div id=layer1 hidden><h3>div_layer1</h3></div>
	<div id=layer2 hidden><h3>div_layer2</h3></div>
	<div id=layer3 hidden><h3>div_layer3</h3></div>
	<hr color=white>
	<hr color=black>

	<div id=div_imgs hidden>
		<h1>div_imgs</h1>
<img src=/imgs/btn/ko.png id=img_ko height=20>
<img src=/imgs/btn/ok.png id=img_ok height=20>
<img src=/imgs/btn/koeye.png id=img_koeye height=20>
<img src=/imgs/btn/koeyeb.png id=img_koeyeb height=20>
<img src=/imgs/btn/koeyew.png id=img_koeyew height=20>

<hr color=black>
<img src=/go/dgs/images/50/b.gif id=img_b height=20>
<img src=/go/dgs/images/50/b_b.gif id=img_b_b height=20>
<img src=/go/dgs/images/50/b_w.gif id=img_b_w height=20>
&nbsp &nbsp &nbsp
<img src=/go/dgs/images/50/w.gif id=img_w height=20>
<img src=/go/dgs/images/50/w_b.gif id=img_w_b height=20>
<img src=/go/dgs/images/50/w_w.gif id=img_w_w height=20>
<hr color=black>
<img src=/go/dgs/images/wood1.gif id=img_wood1 height=200>
<img src=/go/dgs/images/wood2.gif id=img_wood2 height=200>
<img src=/go/dgs/images/wood3.gif id=img_wood3 height=200>
<img src=/go/dgs/images/wood4.gif id=img_wood4 height=200>
<img src=/go/dgs/images/wood5.gif id=img_wood5 height=200>
<img src=/go/dgs/images/wood6.gif id=img_wood6 height=200>
<img src=/go/dgs/images/wood7.gif id=img_wood7 height=200>
<img src=/go/dgs/images/wood8.gif id=img_wood8 height=200>


<hr color=black>
<img src=/imgs/btn/ko.png id=img_ko height=20>
<img src=/imgs/btn/ko.png id=img_ko height=20>
<img src=/imgs/btn/ko.png id=img_ko height=20>
<img src=/imgs/btn/ko.png id=img_ko height=20>
<img src=/imgs/btn/ko.png id=img_ko height=20>
<img src=/imgs/btn/ko.png id=img_ko height=20>


		</div>
<hr color=black>
<hr color=white>
<img src=/imgs/btn/koeye.png id="img_konva" onclick="toggle('div_konva');return false;" height=50>
<hr color=black>
<hr color=white>

	<div id=div_konva hidden>
		<h1>div_konva drag n drop</h1>
		<div id="container"></div>
		<script id=script_konva>
			var width = window.innerWidth;
			var height = window.innerHeight;

function update(activeAnchor) {
	var group = activeAnchor.getParent();

        var topLeft = group.get('.topLeft')[0];
        var topRight = group.get('.topRight')[0];
        var bottomRight = group.get('.bottomRight')[0];
        var bottomLeft = group.get('.bottomLeft')[0];
        var image = group.get('Image')[0];

        var anchorX = activeAnchor.getX();
        var anchorY = activeAnchor.getY();

        // update anchor positions
        switch (activeAnchor.getName()) {
          case 'topLeft':
            topRight.y(anchorY);
            bottomLeft.x(anchorX);
            break;
          case 'topRight':
            topLeft.y(anchorY);
            bottomRight.x(anchorX);
            break;
          case 'bottomRight':
            bottomLeft.y(anchorY);
            topRight.x(anchorX);
            break;
          case 'bottomLeft':
            bottomRight.y(anchorY);
            topLeft.x(anchorX);
            break;
        }

        image.position(topLeft.position());

        var width = topRight.getX() - topLeft.getX();
        var height = bottomLeft.getY() - topLeft.getY();
        if (width && height) {
          image.width(width);
          image.height(height);
        }
      }
      function addAnchor(group, x, y, name) {
        var stage = group.getStage();
        var layer = group.getLayer();

        var anchor = new Konva.Circle({
          x: x,
          y: y,
          stroke: '#666',
          fill: '#ddd',
          strokeWidth: 2,
          radius: 8,
          name: name,
          draggable: true,
          dragOnTop: false,
        });

        anchor.on('dragmove', function () {
          update(this);
        });
        anchor.on('mousedown touchstart', function () {
          group.draggable(false);
          this.moveToTop();
        });
        anchor.on('dragend', function () {
          group.draggable(true);
        });
        // add hover styling
        anchor.on('mouseover', function () {
          var layer = this.getLayer();
          document.body.style.cursor = 'pointer';
          this.strokeWidth(4);
        });
		anchor.on('mouseout', function () {
			var layer = this.getLayer();
			document.body.style.cursor = 'default';
			this.strokeWidth(2);
			});

		group.add(anchor);
		}

		var stage = new Konva.Stage({ 
			container: 'container', 
			width: width, height: height, 
			});

		var layer = new Konva.Layer();
		stage.add(layer);

// darth vader
//		var darthVaderImg = new Konva.Image({ width: 200, height: 137, });
		var darthVaderImg = new Konva.Image({ width: 50, height: 50, });

// yoda
//		var yodaImg = new Konva.Image({ width: 93, height: 104, });
		var yodaImg = new Konva.Image({ width: 50, height: 50, });
		var darthVaderGroup = new Konva.Group({ x: 180, y: 50, draggable: true, });

		layer.add(darthVaderGroup);
		darthVaderGroup.add(darthVaderImg);
		addAnchor(darthVaderGroup, 0, 0, 'topLeft');
		addAnchor(darthVaderGroup, 200, 0, 'topRight');
		addAnchor(darthVaderGroup, 200, 138, 'bottomRight');
		addAnchor(darthVaderGroup, 0, 138, 'bottomLeft');

		var yodaGroup = new Konva.Group({
			x: 20,
			y: 110,
			draggable: true,
			});

		layer.add(yodaGroup);
		yodaGroup.add(yodaImg);
		addAnchor(yodaGroup, 0, 0, 'topLeft');
		addAnchor(yodaGroup, 93, 0, 'topRight');
		addAnchor(yodaGroup, 93, 104, 'bottomRight');
		addAnchor(yodaGroup, 0, 104, 'bottomLeft');

		var imageObj1 = new Image();
		imageObj1.onload = function () {
			darthVaderImg.image(imageObj1);
			};
//		imageObj1.src = '/assets/darth-vader.jpg';
		imageObj1.src = '/imgs/btn/kob.png';

		var imageObj2 = new Image();
		imageObj2.onload = function () {
			yodaImg.image(imageObj2);
			};
//		imageObj2.src = '/assets/yoda.jpg';
		imageObj2.src = '/imgs/btn/kow.png';
		</script>
		</div>


	<hr color=black>
	<img src=/imgs/btn/koeye.png id=img_konva_demos onclick="toggle('div_konva_demos');return false;" height=50>
	<hr color=black>
	<div id=div_konva_demos hidden>
		<h1>div_konva_demos</h1>
<!--	<img src=/imgs/btn/koeyeb.png id=img_konva1 onclick="window.open('/go/konva1.html');return false;" height=25>redspot -->
	&nbsp &nbsp &nbsp &nbsp
	<img src=/imgs/btn/koeyeb.png id=img_konva2 onclick="window.open('/go/konva2.html');return false;" height=25> dots
	&nbsp &nbsp &nbsp &nbsp
	<img src=/imgs/btn/koeyeb.png id=img_konva3 onclick="window.open('/go/konva3.html');return false;" height=25> drop
	&nbsp &nbsp &nbsp &nbsp
	<img src=/imgs/btn/koeyeb.png id=img_konva4 onclick="window.open('/go/konva4.html');return false;" height=25> pdf
	&nbsp &nbsp &nbsp &nbsp

<!--	<img src=/imgs/btn/koeyeb.png id=img_konva5 onclick="window.open('/go/konva5.html');return false;" height=25> -->
<!-- <img src=/imgs/btn/koeyeb.png id=img_ko_konva6 onclick="window.open('/go/konva6.html');return false;" height=25> -->
	<img src=/imgs/btn/koeyeb.png id=img_ko_konva7 onclick="window.open('/go/konva7.html');return false;" height=25> text
//


koh5_pano



Your browser does not support the HTML5 canvas element.


Drag mouse to navigate.

Navigation





17.Aug.2010, Martin Wengenmayer