html5手机天气预报app代码

版权:原创 更新时间:1年以上
[该文章底部包含文件资源,可根据自己情况,决定是否下载资源使用,时间>金钱,如有需要,立即查看资源]

以下是 html5手机天气预报app代码 的示例演示效果:

当前平台(PC电脑)
  • 平台:

部分效果截图:

html5手机天气预报app代码

HTML代码(index.html):

<!DOCTYPE html>
<html lang="en" class="no-js">

<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>html5手机天气预报app代码 </title>
<!--可无视-->
<link rel="stylesheet" type="text/css" href="css/normalize.css" />
<!--<link href='http://fonts.useso.com/css?family=Roboto:400,100,300,700,500,900' rel='stylesheet' type='text/css'>-->
<link rel="stylesheet" type="text/css" href="css/demo.css" />
<!--必要样式-->
<link rel="stylesheet" type="text/css" href="css/style1.css" />
<!--[if IE]>
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
</head>

<body class="demo-1">

	<div class="image-preload">
		<img src="img/drop-color.png" alt="">
		<img src="img/drop-alpha.png" alt="">
		<img src="img/weather/texture-rain-fg.png" />
		<img src="img/weather/texture-rain-bg.png" />
		<img src="img/weather/texture-sun-fg.png" />
		<img src="img/weather/texture-sun-bg.png" />
		<img src="img/weather/texture-fallout-fg.png" />
		<img src="img/weather/texture-fallout-bg.png" />
		<img src="img/weather/texture-drizzle-fg.png" />
		<img src="img/weather/texture-drizzle-bg.png" />
	</div>
	<div class="container">
		<header class="codrops-header">
			<h1>Rain &amp; Water Effects</h1>
			<nav class="codrops-demos">
				<a class="current-demo" href="index.html">Weather</a>
				<a href="index2.html">Water</a>
				<a href="index3.html">Video</a>
			</nav>
		</header>
		<div class="slideshow">
			<canvas width="1" height="1" id="container" style="position:absolute"></canvas>
			<!-- Heavy Rain -->
			<div class="slide" id="slide-1" data-weather="rain">
				<div class="slide__element slide__element--date">Sunday, 24<sup>th</sup> of October 2043</div>
				<div class="slide__element slide__element--temp">12°<small>C</small></div>
			</div>
			<!-- Drizzle -->
			<div class="slide" id="slide-2" data-weather="drizzle">
				<div class="slide__element slide__element--date">Saturday, 25<sup>th</sup> of October 2043</div>
				<div class="slide__element slide__element--temp">18°<small>C</small></div>
			</div>
			<!-- Sunny -->
			<div class="slide" id="slide-3" data-weather="sunny">
				<div class="slide__element slide__element--date">Monday, 26<sup>th</sup> of October 2043</div>
				<div class="slide__element slide__element--temp">25°<small>C</small></div>
			</div>
			<!-- Heavy rain -->
			<div class="slide" id="slide-5" data-weather="storm">
				<div class="slide__element slide__element--date">Wednesday, 28<sup>th</sup> of October 2043</div>
				<div class="slide__element slide__element--temp">20°<small>C</small></div>
			</div>
			<!-- Fallout (greenish overlay with slightly greenish/yellowish drops) -->
			<div class="slide" id="slide-4" data-weather="fallout">
				<div class="slide__element slide__element--date">Tuesday, 27<sup>th</sup> of October 2043</div>
				<div class="slide__element slide__element--temp">34°<small>C</small></div>
			</div>
			<nav class="slideshow__nav">
				<a class="nav-item" href="#slide-1"><i class="icon icon--rainy"></i><span>10/24</span></a>
				<a class="nav-item" href="#slide-2"><i class="icon icon--drizzle"></i><span>10/25</span></a>
				<a class="nav-item" href="#slide-3"><i class="icon icon--sun"></i><span>10/26</span></a>
				<a class="nav-item" href="#slide-5"><i class="icon icon--storm"></i><span>10/28</span></a>
				<a class="nav-item" href="#slide-4"><i class="icon icon--radioactive"></i><span>10/27</span></a>
			</nav>
		</div>
		<p class="nosupport">对不起,您的浏览器不支持WebGL!</p>
	</div>
	<!-- /container -->
	<script src="js/index.min.js"></script>

</body>
</html>

HTML代码(index2.html):

<!DOCTYPE html>
<html lang="en" class="no-js">

<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>html5手机天气预报app代码 </title>
<!--可无视-->
<link rel="stylesheet" type="text/css" href="css/normalize.css" />
<link rel="stylesheet" type="text/css" href="css/demo.css" />

<!--必要样式-->
<link rel="stylesheet" type="text/css" href="css/style2.css" />
<!--[if IE]>
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
</head>

<body class="demo-2">
	<div class="container">
		<header class="codrops-header">
			<h1>Rain &amp; Water Effects</h1>
			<nav class="codrops-demos">
				<a href="index.html">Weather</a>
				<a class="current-demo" href="index2.html">Water</a>
				<a href="index3.html">Video</a>
			</nav>
			<p class="info">Based on the <a href="https://dribbble.com/shots/2257687-Water-introduction-mobile-Experiment">Dribbble shot</a> by Bilal</p>
		</header>
		<div class="content">
			<img class="device" src="img/iphone.svg" alt="iPhone" />
			<div class="app">
				<canvas id="container" width="261" height="463" style="position:absolute;top:0;left:0;width:100%;height:100%"></canvas>
				<div class="app-content">
					<button class="app__button-menu"><i class="fa fa-navicon"></i></button>
					<h2 class="app__title">water</h2>
					<p class="app__info">The wettest thing on planet Earth.</p>
					<button class="app__button">Learn more</button>
					<p class="app__info app__info--small">I'm not thirsty</p>
				</div>
			</div>
		</div>
		<p class="nosupport">对不起,您的浏览器不支持WebGL!</p>
	</div>
	<!-- /container -->
	<script src="js/index2.min.js"></script>

</body>
</html>

HTML代码(index3.html):

<!DOCTYPE html>
<html lang="en" class="no-js">

<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>html5手机天气预报app代码</title>
<!--可无视-->
<link rel="stylesheet" type="text/css" href="css/normalize.css" />
<link rel="stylesheet" type="text/css" href="css/demo.css" />

<!--必要样式-->
<link rel="stylesheet" type="text/css" href="css/style3.css" />
<!--[if IE]>
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
</head>

<body class="demo-3">
	<video class="videobg" src="media/video.mp4" poster="media/video.jpg" autoplay loop muted>
		<source src="media/video.webm" type="video/web">
		<source src="media/video.mp4" type="video/mp4">
	</video>
	<canvas id="container" width="1" height="1" style="position:absolute"></canvas>
	<div class="container">
		<header class="codrops-header">
			<h1>Rain &amp; Water Effects</h1>
			<nav class="codrops-demos">
				<a href="index.html">Weather</a>
				<a href="index2.html">Water</a>
				<a class="current-demo" href="index3.html">Video</a>
			</nav>
		</header>
		<img class="logo-img" src="img/logo.svg" alt="logo" />
		<p class="nosupport">对不起,您的浏览器不支持WebGL!</p>
	</div>
	<!-- /container -->
	<script src="js/index3.min.js"></script>

</body>
</html>

JS代码(main.js):

(function e(t,n,r){
	function s(o,u){
	if(!n[o]){
	if(!t[o]){
	var a=typeof require=="function"&&require;
	if(!u&&a)return a(o,!0);
	if(i)return i(o,!0);
	var f=new Error("Cannot find module '"+o+"'");
	throw f.code="MODULE_NOT_FOUND",f}
var l=n[o]={
	exports:{
}
}
;
	t[o][0].call(l.exports,function(e){
	var n=t[o][1][e];
	return s(n?n:e)}
,l,l.exports,e,t,n,r)}
return n[o].exports}
var i=typeof require=="function"&&require;
	for(var o=0;
	o<r.length;
	o++)s(r[o]);
	return s}
)({
	1:[function(require,module,exports){
	require('./shim');
	require('./modules/core.dict');
	require('./modules/core.get-iterator-method');
	require('./modules/core.get-iterator');
	require('./modules/core.is-iterable');
	require('./modules/core.delay');
	require('./modules/core.function.part');
	require('./modules/core.object.is-object');
	require('./modules/core.object.classof');
	require('./modules/core.object.define');
	require('./modules/core.object.make');
	require('./modules/core.number.iterator');
	require('./modules/core.string.escape-html');
	require('./modules/core.string.unescape-html');
	require('./modules/core.log');
	module.exports = require('./modules/$.core');
}
,{
	"./modules/$.core":15,"./modules/core.delay":83,"./modules/core.dict":84,"./modules/core.function.part":85,"./modules/core.get-iterator":87,"./modules/core.get-iterator-method":86,"./modules/core.is-iterable":88,"./modules/core.log":89,"./modules/core.number.iterator":90,"./modules/core.object.classof":91,"./modules/core.object.define":92,"./modules/core.object.is-object":93,"./modules/core.object.make":94,"./modules/core.string.escape-html":95,"./modules/core.string.unescape-html":96,"./shim":200}
],2:[function(require,module,exports){
	module.exports = function(it){
	if(typeof it != 'function')throw TypeError(it + ' is not a function!');
	return it;
}
;
}
,{
}
],3:[function(require,module,exports){
	var isObject = require('./$.is-object');
	module.exports = function(it){
	if(!isObject(it))throw TypeError(it + ' is not an object!');
	return it;
}
;
}
,{
	"./$.is-object":37}
],4:[function(require,module,exports){
	// 22.1.3.3 Array.prototype.copyWithin(target,start,end = this.length)'use strict';
	var toObject = require('./$.to-object'),toIndex = require('./$.to-index'),toLength = require('./$.to-length');
	module.exports = [].copyWithin || function copyWithin(target/*= 0*/
,start/*= 0,end = @length*/
){
	var O = toObject(this),len = toLength(O.length),to = toIndex(target,len),from = toIndex(start,len),$$ = arguments,end = $$.length > 2 ? $$[2]:undefined,count = Math.min((end === undefined ? len:toIndex(end,len)) - from,len - to),inc = 1;
	if(from < to && to < from + count){
	inc = -1;
	from += count - 1;
	to += count - 1;
}
while(count-- > 0){
	if(from in O)O[to] = O[from];
	else delete O[to];
	to += inc;
	from += inc;
}
return O;
}
;
}
,{
	"./$.to-index":75,"./$.to-length":78,"./$.to-object":79}
],5:[function(require,module,exports){
	// 22.1.3.6 Array.prototype.fill(value,start = 0,end = this.length)'use strict';
	var toObject = require('./$.to-object'),toIndex = require('./$.to-index'),toLength = require('./$.to-length');
	module.exports = [].fill || function fill(value /*,start = 0,end = @length */
){
	var O = toObject(this,true),length = toLength(O.length),$$ = arguments,$$len = $$.length,index = toIndex($$len > 1 ? $$[1]:undefined,length),end = $$len > 2 ? $$[2]:undefined,endPos = end === undefined ? length:toIndex(end,length);
	while(endPos > index)O[index++] = value;
	return O;
}
;
}
,{
	"./$.to-index":75,"./$.to-length":78,"./$.to-object":79}
],6:[function(require,module,exports){
	// false -> Array#indexOf// true -> Array#includesvar toIObject = require('./$.to-iobject'),toLength = require('./$.to-length'),toIndex = require('./$.to-index');
	module.exports = function(IS_INCLUDES){
	return function($this,el,fromIndex){
	var O = toIObject($this),length = toLength(O.length),index = toIndex(fromIndex,length),value;
	// Array#includes uses SameValueZero equality algorithm if(IS_INCLUDES && el != el)while(length > index){
	value = O[index++];
	if(value != value)return true;
	// Array#toIndex ignores holes,Array#includes - not}
else for(;
	length > index;
	index++)if(IS_INCLUDES || index in O){
	if(O[index] === el)return IS_INCLUDES || index;
}
return !IS_INCLUDES && -1;
}
;
}
;
}
,{
	"./$.to-index":75,"./$.to-iobject":77,"./$.to-length":78}
],7:[function(require,module,exports){
	// 0 -> Array#forEach// 1 -> Array#map// 2 -> Array#filter// 3 -> Array#some// 4 -> Array#every// 5 -> Array#find// 6 -> Array#findIndexvar ctx = require('./$.ctx'),isObject = require('./$.is-object'),IObject = require('./$.iobject'),toObject = require('./$.to-object'),toLength = require('./$.to-length'),isArray = require('./$.is-array'),SPECIES = require('./$.wks')('species');
	// 9.4.2.3 ArraySpeciesCreate(originalArray,length)var ASC = function(original,length){
	var C;
	if(isArray(original) && isObject(C = original.constructor)){
	C = C[SPECIES];
	if(C === null)C = undefined;
}
return new (C === undefined ? Array:C)(length);
}
;
	module.exports = function(TYPE){
	var IS_MAP = TYPE == 1,IS_FILTER = TYPE == 2,IS_SOME = TYPE == 3,IS_EVERY = TYPE == 4,IS_FIND_INDEX = TYPE == 6,NO_HOLES = TYPE == 5 || IS_FIND_INDEX;
	return function($this,callbackfn,that){
	var O = toObject($this),self = IObject(O),f = ctx(callbackfn,that,3),length = toLength(self.length),index = 0,result = IS_MAP ? ASC($this,length):IS_FILTER ? ASC($this,0):undefined,val,res;
	for(;
	length > index;
	index++)if(NO_HOLES || index in self){
	val = self[index];
	res = f(val,index,O);
	if(TYPE){
	if(IS_MAP)result[index] = res;
	// map else if(res)switch(TYPE){
	case 3:return true;
	// some case 5:return val;
	// find case 6:return index;
	// findIndex case 2:result.push(val);
	// filter}
else if(IS_EVERY)return false;
	// every}
}
return IS_FIND_INDEX ? -1:IS_SOME || IS_EVERY ? IS_EVERY:result;
}
;
}
;
}
,{
	"./$.ctx":16,"./$.iobject":33,"./$.is-array":35,"./$.is-object":37,"./$.to-length":78,"./$.to-object":79,"./$.wks":82}
],8:[function(require,module,exports){
	// 19.1.2.1 Object.assign(target,source,...)var $ = require('./$'),toObject = require('./$.to-object'),IObject = require('./$.iobject');
	// should work with symbols and should have deterministic property order (V8 bug)module.exports = require('./$.fails')(function(){
	var a = Object.assign,A ={
}
,B ={
}
,S = Symbol(),K = 'abcdefghijklmnopqrst';
	A[S] = 7;
	K.split('').forEach(function(k){
	B[k] = k;
}
);
	return a({
}
,A)[S] != 7 || Object.keys(a({
}
,B)).join('') != K;
}
) ? function assign(target,source){
	// eslint-disable-line no-unused-vars var T = toObject(target),$$ = arguments,$$len = $$.length,index = 1,getKeys = $.getKeys,getSymbols = $.getSymbols,isEnum = $.isEnum;
	while($$len > index){
	var S = IObject($$[index++]),keys = getSymbols ? getKeys(S).concat(getSymbols(S)):getKeys(S),length = keys.length,j = 0,key;
	while(length > j)if(isEnum.call(S,key = keys[j++]))T[key] = S[key];
}
return T;
}
:Object.assign;
}
,{
	"./$":45,"./$.fails":23,"./$.iobject":33,"./$.to-object":79}
],9:[function(require,module,exports){
	// getting tag from 19.1.3.6 Object.prototype.toString()var cof = require('./$.cof'),TAG = require('./$.wks')('toStringTag') // ES3 wrong here,ARG = cof(function(){
	return arguments;
}
()) == 'Arguments';
	module.exports = function(it){
	var O,T,B;
	return it === undefined ? 'Undefined':it === null ? 'Null' // @@toStringTag case:typeof (T = (O = Object(it))[TAG]) == 'string' ? T // builtinTag case:ARG ? cof(O) // ES3 arguments fallback:(B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments':B;
}
;
}
,{
	"./$.cof":10,"./$.wks":82}
],10:[function(require,module,exports){
	var toString ={
}
.toString;
	module.exports = function(it){
	return toString.call(it).slice(8,-1);
}
;
}
,{
}
],11:[function(require,module,exports){
	'use strict';
	var $ = require('./$'),hide = require('./$.hide'),ctx = require('./$.ctx'),species = require('./$.species'),strictNew = require('./$.strict-new'),defined = require('./$.defined'),forOf = require('./$.for-of'),step = require('./$.iter-step'),ID = require('./$.uid')('id'),$has = require('./$.has'),isObject = require('./$.is-object'),isExtensible = Object.isExtensible || isObject,SUPPORT_DESC = require('./$.support-desc'),SIZE = SUPPORT_DESC ? '_s':'size',id = 0;
	var fastKey = function(it,create){
	// return primitive with prefix if(!isObject(it))return typeof it == 'symbol' ? it:(typeof it == 'string' ? 'S':'P') + it;
	if(!$has(it,ID)){
	// can't set id to frozen object if(!isExtensible(it))return 'F';
	// not necessary to add id if(!create)return 'E';
	// add missing object id hide(it,ID,++id);
	// return object id with prefix}
return 'O' + it[ID];
}
;
	var getEntry = function(that,key){
	// fast case var index = fastKey(key),entry;
	if(index !== 'F')return that._i[index];
	// frozen object case for(entry = that._f;
	entry;
	entry = entry.n){
	if(entry.k == key)return entry;
}
}
;
	module.exports ={
	getConstructor:function(wrapper,NAME,IS_MAP,ADDER){
	var C = wrapper(function(that,iterable){
	strictNew(that,C,NAME);
	that._i = $.create(null);
	// index that._f = undefined;
	// first entry that._l = undefined;
	// last entry that[SIZE] = 0;
	// size if(iterable != undefined)forOf(iterable,IS_MAP,that[ADDER],that);
}
);
	require('./$.mix')(C.prototype,{
	// 23.1.3.1 Map.prototype.clear() // 23.2.3.2 Set.prototype.clear() clear:function clear(){
	for(var that = this,data = that._i,entry = that._f;
	entry;
	entry = entry.n){
	entry.r = true;
	if(entry.p)entry.p = entry.p.n = undefined;
	delete data[entry.i];
}
that._f = that._l = undefined;
	that[SIZE] = 0;
}
,// 23.1.3.3 Map.prototype.delete(key) // 23.2.3.4 Set.prototype.delete(value) 'delete':function(key){
	var that = this,entry = getEntry(that,key);
	if(entry){
	var next = entry.n,prev = entry.p;
	delete that._i[entry.i];
	entry.r = true;
	if(prev)prev.n = next;
	if(next)next.p = prev;
	if(that._f == entry)that._f = next;
	if(that._l == entry)that._l = prev;
	that[SIZE]--;
}
return !!entry;
}
,// 23.2.3.6 Set.prototype.forEach(callbackfn,thisArg = undefined) // 23.1.3.5 Map.prototype.forEach(callbackfn,thisArg = undefined) forEach:function forEach(callbackfn /*,that = undefined */
){
	var f = ctx(callbackfn,arguments.length > 1 ? arguments[1]:undefined,3),entry;
	while(entry = entry ? entry.n:this._f){
	f(entry.v,entry.k,this);
	// revert to the last existing entry while(entry && entry.r)entry = entry.p;
}
}
,// 23.1.3.7 Map.prototype.has(key) // 23.2.3.7 Set.prototype.has(value) has:function has(key){
	return !!getEntry(this,key);
}
}
);
	if(SUPPORT_DESC)$.setDesc(C.prototype,'size',{
	get:function(){
	return defined(this[SIZE]);
}
}
);
	return C;
}
,def:function(that,key,value){
	var entry = getEntry(that,key),prev,index;
	// change existing entry if(entry){
	entry.v = value;
	// create new entry}
else{
	that._l = entry ={
	i:index = fastKey(key,true),// <- index k:key,// <- key v:value,// <- value p:prev = that._l,// <- previous entry n:undefined,// <- next entry r:false // <- removed}
;
	if(!that._f)that._f = entry;
	if(prev)prev.n = entry;
	that[SIZE]++;
	// add to index if(index !== 'F')that._i[index] = entry;
}
return that;
}
,getEntry:getEntry,setStrong:function(C,NAME,IS_MAP){
	// add .keys,.values,.entries,[@@iterator] // 23.1.3.4,23.1.3.8,23.1.3.11,23.1.3.12,23.2.3.5,23.2.3.8,23.2.3.10,23.2.3.11 require('./$.iter-define')(C,NAME,function(iterated,kind){
	this._t = iterated;
	// target this._k = kind;
	// kind this._l = undefined;
	// previous}
,function(){
	var that = this,kind = that._k,entry = that._l;
	// revert to the last existing entry while(entry && entry.r)entry = entry.p;
	// get next entry if(!that._t || !(that._l = entry = entry ? entry.n:that._t._f)){
	// or finish the iteration that._t = undefined;
	return step(1);
}
// return step by kind if(kind == 'keys' )return step(0,entry.k);
	if(kind == 'values')return step(0,entry.v);
	return step(0,[entry.k,entry.v]);
}
,IS_MAP ? 'entries':'values',!IS_MAP,true);
	// add [@@species],23.1.2.2,23.2.2.2 species(C);
	species(require('./$.core')[NAME]);
	// for wrapper}
}
;
}
,{
	"./$":45,"./$.core":15,"./$.ctx":16,"./$.defined":18,"./$.for-of":26,"./$.has":29,"./$.hide":30,"./$.is-object":37,"./$.iter-define":41,"./$.iter-step":43,"./$.mix":50,"./$.species":65,"./$.strict-new":66,"./$.support-desc":72,"./$.uid":80}
],12:[function(require,module,exports){
	// https://github.com/DavidBruant/Map-Set.prototype.toJSONvar forOf = require('./$.for-of'),classof = require('./$.classof');
	module.exports = function(NAME){
	return function toJSON(){
	if(classof(this) != NAME)throw TypeError(NAME + "#toJSON isn't generic");
	var arr = [];
	forOf(this,false,arr.push,arr);
	return arr;
}
;
}
;
}
,{
	"./$.classof":9,"./$.for-of":26}
],13:[function(require,module,exports){
	'use strict';
	var hide = require('./$.hide'),anObject = require('./$.an-object'),strictNew = require('./$.strict-new'),forOf = require('./$.for-of'),method = require('./$.array-methods'),WEAK = require('./$.uid')('weak'),isObject = require('./$.is-object'),$has = require('./$.has'),isExtensible = Object.isExtensible || isObject,find = method(5),findIndex = method(6),id = 0;
	// fallback for frozen keysvar frozenStore = function(that){
	return that._l || (that._l = new FrozenStore);
}
;
	var FrozenStore = function(){
	this.a = [];
}
;
	var findFrozen = function(store,key){
	return find(store.a,function(it){
	return it[0] === key;
}
);
}
;
	FrozenStore.prototype ={
	get:function(key){
	var entry = findFrozen(this,key);
	if(entry)return entry[1];
}
,has:function(key){
	return !!findFrozen(this,key);
}
,set:function(key,value){
	var entry = findFrozen(this,key);
	if(entry)entry[1] = value;
	else this.a.push([key,value]);
}
,'delete':function(key){
	var index = findIndex(this.a,function(it){
	return it[0] === key;
}
);
	if(~index)this.a.splice(index,1);
	return !!~index;
}
}
;
	module.exports ={
	getConstructor:function(wrapper,NAME,IS_MAP,ADDER){
	var C = wrapper(function(that,iterable){
	strictNew(that,C,NAME);
	that._i = id++;
	// collection id that._l = undefined;
	// leak store for frozen objects if(iterable != undefined)forOf(iterable,IS_MAP,that[ADDER],that);
}
);
	require('./$.mix')(C.prototype,{
	// 23.3.3.2 WeakMap.prototype.delete(key) // 23.4.3.3 WeakSet.prototype.delete(value) 'delete':function(key){
	if(!isObject(key))return false;
	if(!isExtensible(key))return frozenStore(this)['delete'](key);
	return $has(key,WEAK) && $has(key[WEAK],this._i) && delete key[WEAK][this._i];
}
,// 23.3.3.4 WeakMap.prototype.has(key) // 23.4.3.4 WeakSet.prototype.has(value) has:function has(key){
	if(!isObject(key))return false;
	if(!isExtensible(key))return frozenStore(this).has(key);
	return $has(key,WEAK) && $has(key[WEAK],this._i);
}
}
);
	return C;
}
,def:function(that,key,value){
	if(!isExtensible(anObject(key))){
	frozenStore(that).set(key,value);
}
else{
	$has(key,WEAK) || hide(key,WEAK,{
}
);
	key[WEAK][that._i] = value;
}
return that;
}
,frozenStore:frozenStore,WEAK:WEAK}
;
}
,{
	"./$.an-object":3,"./$.array-methods":7,"./$.for-of":26,"./$.has":29,"./$.hide":30,"./$.is-object":37,"./$.mix":50,"./$.strict-new":66,"./$.uid":80}
],14:[function(require,module,exports){
	'use strict';
	var global = require('./$.global'),$def = require('./$.def'),forOf = require('./$.for-of'),strictNew = require('./$.strict-new');
	module.exports = function(NAME,wrapper,methods,common,IS_MAP,IS_WEAK){
	var Base = global[NAME],C = Base,ADDER = IS_MAP ? 'set':'add',proto = C && C.prototype,O ={
}
;
	var fixMethod = function(KEY){
	var fn = proto[KEY];
	require('./$.redef')(proto,KEY,KEY == 'delete' ? function(a){
	return fn.call(this,a === 0 ? 0:a);
}
:KEY == 'has' ? function has(a){
	return fn.call(this,a === 0 ? 0:a);
}
:KEY == 'get' ? function get(a){
	return fn.call(this,a === 0 ? 0:a);
}
:KEY == 'add' ? function add(a){
	fn.call(this,a === 0 ? 0:a);
	return this;
}
:function set(a,b){
	fn.call(this,a === 0 ? 0:a,b);
	return this;
}
);
}
;
	if(typeof C != 'function' || !(IS_WEAK || proto.forEach && !require('./$.fails')(function(){
	new C().entries().next();
}
))){
	// create collection constructor C = common.getConstructor(wrapper,NAME,IS_MAP,ADDER);
	require('./$.mix')(C.prototype,methods);
}
else{
	var inst = new C,chain = inst[ADDER](IS_WEAK ?{
}
:-0,1),buggyZero;
	// wrap for init collections from iterable if(!require('./$.iter-detect')(function(iter){
	new C(iter);
}
)){
	// eslint-disable-line no-new C = wrapper(function(target,iterable){
	strictNew(target,C,NAME);
	var that = new Base;
	if(iterable != undefined)forOf(iterable,IS_MAP,that[ADDER],that);
	return that;
}
);
	C.prototype = proto;
	proto.constructor = C;
}
IS_WEAK || inst.forEach(function(val,key){
	buggyZero = 1 / key === -Infinity;
}
);
	// fix converting -0 key to +0 if(buggyZero){
	fixMethod('delete');
	fixMethod('has');
	IS_MAP && fixMethod('get');
}
// + fix .add & .set for chaining if(buggyZero || chain !== inst)fixMethod(ADDER);
	// weak collections should not contains .clear method if(IS_WEAK && proto.clear)delete proto.clear;
}
require('./$.tag')(C,NAME);
	O[NAME] = C;
	$def($def.G + $def.W + $def.F * (C != Base),O);
	if(!IS_WEAK)common.setStrong(C,NAME,IS_MAP);
	return C;
}
;
}
,{
	"./$.def":17,"./$.fails":23,"./$.for-of":26,"./$.global":28,"./$.iter-detect":42,"./$.mix":50,"./$.redef":58,"./$.strict-new":66,"./$.tag":73}
],15:[function(require,module,exports){
	var core = module.exports ={
	version:'1.2.3'}
;
	if(typeof __e == 'number')__e = core;
	// eslint-disable-line no-undef}
,{
}
],16:[function(require,module,exports){
	// optional / simple context bindingvar aFunction = require('./$.a-function');
	module.exports = function(fn,that,length){
	aFunction(fn);
	if(that === undefined)return fn;
	switch(length){
	case 1:return function(a){
	return fn.call(that,a);
}
;
	case 2:return function(a,b){
	return fn.call(that,a,b);
}
;
	case 3:return function(a,b,c){
	return fn.call(that,a,b,c);
}
;
}
return function(/* ...args */
){
	return fn.apply(that,arguments);
}
;
}
;
}
,{
	"./$.a-function":2}
],17:[function(require,module,exports){
	var global = require('./$.global'),core = require('./$.core'),hide = require('./$.hide'),$redef = require('./$.redef'),PROTOTYPE = 'prototype';
	var ctx = function(fn,that){
	return function(){
	return fn.apply(that,arguments);
}
;
}
;
	var $def = function(type,name,source){
	var key,own,out,exp,isGlobal = type & $def.G,isProto = type & $def.P,target = isGlobal ? global:type & $def.S ? global[name] || (global[name] ={
}
):(global[name] ||{
}
)[PROTOTYPE],exports = isGlobal ? core:core[name] || (core[name] ={
}
);
	if(isGlobal)source = name;
	for(key in source){
	// contains in native own = !(type & $def.F) && target && key in target;
	// export native or passed out = (own ? target:source)[key];
	// bind timers to global for call from export context if(type & $def.B && own)exp = ctx(out,global);
	else exp = isProto && typeof out == 'function' ? ctx(Function.call,out):out;
	// extend global if(target && !own)$redef(target,key,out);
	// export if(exports[key] != out)hide(exports,key,exp);
	if(isProto)(exports[PROTOTYPE] || (exports[PROTOTYPE] ={
}
))[key] = out;
}
}
;
	global.core = core;
	// type bitmap$def.F = 1;
	// forced$def.G = 2;
	// global$def.S = 4;
	// static$def.P = 8;
	// proto$def.B = 16;
	// bind$def.W = 32;
	// wrapmodule.exports = $def;
}
,{
	"./$.core":15,"./$.global":28,"./$.hide":30,"./$.redef":58}
],18:[function(require,module,exports){
	// 7.2.1 RequireObjectCoercible(argument)module.exports = function(it){
	if(it == undefined)throw TypeError("Can't call method on " + it);
	return it;
}
;
}
,{
}
],19:[function(require,module,exports){
	var isObject = require('./$.is-object'),document = require('./$.global').document // in old IE typeof document.createElement is 'object',is = isObject(document) && isObject(document.createElement);
	module.exports = function(it){
	return is ? document.createElement(it):{
}
;
}
;
}
,{
	"./$.global":28,"./$.is-object":37}
],20:[function(require,module,exports){
	// all enumerable object keys,includes symbolsvar $ = require('./$');
	module.exports = function(it){
	var keys = $.getKeys(it),getSymbols = $.getSymbols;
	if(getSymbols){
	var symbols = getSymbols(it),isEnum = $.isEnum,i = 0,key;
	while(symbols.length > i)if(isEnum.call(it,key = symbols[i++]))keys.push(key);
}
return keys;
}
;
}
,{
	"./$":45}
],21:[function(require,module,exports){
	// 20.2.2.14 Math.expm1(x)module.exports = Math.expm1 || function expm1(x){
	return (x = +x) == 0 ? x:x > -1e-6 && x < 1e-6 ? x + x * x / 2:Math.exp(x) - 1;
}
;
}
,{
}
],22:[function(require,module,exports){
	module.exports = function(KEY){
	var re = /./;
	try{
	'/./'[KEY](re);
}
catch(e){
	try{
	re[require('./$.wks')('match')] = false;
	return !'/./'[KEY](re);
}
catch(f){
	/* empty */
}
}
return true;
}
;
}
,{
	"./$.wks":82}
],23:[function(require,module,exports){
	module.exports = function(exec){
	try{
	return !!exec();
}
catch(e){
	return true;
}
}
;
}
,{
}
],24:[function(require,module,exports){
	'use strict';
	module.exports = function(KEY,length,exec){
	var defined = require('./$.defined'),SYMBOL = require('./$.wks')(KEY),original = ''[KEY];
	if(require('./$.fails')(function(){
	var O ={
}
;
	O[SYMBOL] = function(){
	return 7;
}
;
	return ''[KEY](O) != 7;
}
)){
	require('./$.redef')(String.prototype,KEY,exec(defined,SYMBOL,original));
	require('./$.hide')(RegExp.prototype,SYMBOL,length == 2 // 21.2.5.8 RegExp.prototype[@@replace](string,replaceValue) // 21.2.5.11 RegExp.prototype[@@split](string,limit) ? function(string,arg){
	return original.call(string,this,arg);
}
// 21.2.5.6 RegExp.prototype[@@match](string) // 21.2.5.9 RegExp.prototype[@@search](string):function(string){
	return original.call(string,this);
}
);
}
}
;
}
,{
	"./$.defined":18,"./$.fails":23,"./$.hide":30,"./$.redef":58,"./$.wks":82}
],25:[function(require,module,exports){
	'use strict';
	// 21.2.5.3 get RegExp.prototype.flagsvar anObject = require('./$.an-object');
	module.exports = function(){
	var that = anObject(this),result = '';
	if(that.global)result += 'g';
	if(that.ignoreCase)result += 'i';
	if(that.multiline)result += 'm';
	if(that.unicode)result += 'u';
	if(that.sticky)result += 'y';
	return result;
}
;
}
,{
	"./$.an-object":3}
],26:[function(require,module,exports){
	var ctx = require('./$.ctx'),call = require('./$.iter-call'),isArrayIter = require('./$.is-array-iter'),anObject = require('./$.an-object'),toLength = require('./$.to-length'),getIterFn = require('./core.get-iterator-method');
	module.exports = function(iterable,entries,fn,that){
	var iterFn = getIterFn(iterable),f = ctx(fn,that,entries ? 2:1),index = 0,length,step,iterator;
	if(typeof iterFn != 'function')throw TypeError(iterable + ' is not iterable!');
	// fast case for arrays with default iterator if(isArrayIter(iterFn))for(length = toLength(iterable.length);
	length > index;
	index++){
	entries ? f(anObject(step = iterable[index])[0],step[1]):f(iterable[index]);
}
else for(iterator = iterFn.call(iterable);
	!(step = iterator.next()).done;
	){
	call(iterator,f,step.value,entries);
}
}
;
}
,{
	"./$.an-object":3,"./$.ctx":16,"./$.is-array-iter":34,"./$.iter-call":39,"./$.to-length":78,"./core.get-iterator-method":86}
],27:[function(require,module,exports){
	// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and windowvar toString ={
}
.toString,toIObject = require('./$.to-iobject'),getNames = require('./$').getNames;
	var windowNames = typeof window == 'object' && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window):[];
	var getWindowNames = function(it){
	try{
	return getNames(it);
}
catch(e){
	return windowNames.slice();
}
}
;
	module.exports.get = function getOwnPropertyNames(it){
	if(windowNames && toString.call(it) == '[object Window]')return getWindowNames(it);
	return getNames(toIObject(it));
}
;
}
,{
	"./$":45,"./$.to-iobject":77}
],28:[function(require,module,exports){
	// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028var global = module.exports = typeof window != 'undefined' && window.Math == Math ? window:typeof self != 'undefined' && self.Math == Math ? self:Function('return this')();
	if(typeof __g == 'number')__g = global;
	// eslint-disable-line no-undef}
,{
}
],29:[function(require,module,exports){
	var hasOwnProperty ={
}
.hasOwnProperty;
	module.exports = function(it,key){
	return hasOwnProperty.call(it,key);
}
;
}
,{
}
],30:[function(require,module,exports){
	var $ = require('./$'),createDesc = require('./$.property-desc');
	module.exports = require('./$.support-desc') ? function(object,key,value){
	return $.setDesc(object,key,createDesc(1,value));
}
:function(object,key,value){
	object[key] = value;
	return object;
}
;
}
,{
	"./$":45,"./$.property-desc":57,"./$.support-desc":72}
],31:[function(require,module,exports){
	module.exports = require('./$.global').document && document.documentElement;
}
,{
	"./$.global":28}
],32:[function(require,module,exports){
	// fast apply,http://jsperf.lnkit.com/fast-apply/5module.exports = function(fn,args,that){
	var un = that === undefined;
	switch(args.length){
	case 0:return un ? fn():fn.call(that);
	case 1:return un ? fn(args[0]):fn.call(that,args[0]);
	case 2:return un ? fn(args[0],args[1]):fn.call(that,args[0],args[1]);
	case 3:return un ? fn(args[0],args[1],args[2]):fn.call(that,args[0],args[1],args[2]);
	case 4:return un ? fn(args[0],args[1],args[2],args[3]):fn.call(that,args[0],args[1],args[2],args[3]);
}
return fn.apply(that,args);
}
;
}
,{
}
],33:[function(require,module,exports){
	// fallback for non-array-like ES3 and non-enumerable old V8 stringsvar cof = require('./$.cof');
	module.exports = Object('z').propertyIsEnumerable(0) ? Object:function(it){
	return cof(it) == 'String' ? it.split(''):Object(it);
}
;
}
,{
	"./$.cof":10}
],34:[function(require,module,exports){
	// check on default Array iteratorvar Iterators = require('./$.iterators'),ITERATOR = require('./$.wks')('iterator');
	module.exports = function(it){
	return (Iterators.Array || Array.prototype[ITERATOR]) === it;
}
;
}
,{
	"./$.iterators":44,"./$.wks":82}
],35:[function(require,module,exports){
	// 7.2.2 IsArray(argument)var cof = require('./$.cof');
	module.exports = Array.isArray || function(arg){
	return cof(arg) == 'Array';
}
;
}
,{
	"./$.cof":10}
],36:[function(require,module,exports){
	// 20.1.2.3 Number.isInteger(number)var isObject = require('./$.is-object'),floor = Math.floor;
	module.exports = function isInteger(it){
	return !isObject(it) && isFinite(it) && floor(it) === it;
}
;
}
,{
	"./$.is-object":37}
],37:[function(require,module,exports){
	module.exports = function(it){
	return typeof it === 'object' ? it !== null:typeof it === 'function';
}
;
}
,{
}
],38:[function(require,module,exports){
	// 7.2.8 IsRegExp(argument)var isObject = require('./$.is-object'),cof = require('./$.cof'),MATCH = require('./$.wks')('match');
	module.exports = function(it){
	var isRegExp;
	return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp:cof(it) == 'RegExp');
}
;
}
,{
	"./$.cof":10,"./$.is-object":37,"./$.wks":82}
],39:[function(require,module,exports){
	// call something on iterator step with safe closing on errorvar anObject = require('./$.an-object');
	module.exports = function(iterator,fn,value,entries){
	try{
	return entries ? fn(anObject(value)[0],value[1]):fn(value);
	// 7.4.6 IteratorClose(iterator,completion)}
catch(e){
	var ret = iterator['return'];
	if(ret !== undefined)anObject(ret.call(iterator));
	throw e;
}
}
;
}
,{
	"./$.an-object":3}
],40:[function(require,module,exports){
	'use strict';
	var $ = require('./$'),IteratorPrototype ={
}
;
	// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()require('./$.hide')(IteratorPrototype,require('./$.wks')('iterator'),function(){
	return this;
}
);
	module.exports = function(Constructor,NAME,next){
	Constructor.prototype = $.create(IteratorPrototype,{
	next:require('./$.property-desc')(1,next)}
);
	require('./$.tag')(Constructor,NAME + ' Iterator');
}
;
}
,{
	"./$":45,"./$.hide":30,"./$.property-desc":57,"./$.tag":73,"./$.wks":82}
],41:[function(require,module,exports){
	'use strict';
	var LIBRARY = require('./$.library'),$def = require('./$.def'),$redef = require('./$.redef'),hide = require('./$.hide'),has = require('./$.has'),SYMBOL_ITERATOR = require('./$.wks')('iterator'),Iterators = require('./$.iterators'),BUGGY = !([].keys && 'next' in [].keys()) // Safari has buggy iterators w/o `next`,FF_ITERATOR = '@@iterator',KEYS = 'keys',VALUES = 'values';
	var returnThis = function(){
	return this;
}
;
	module.exports = function(Base,NAME,Constructor,next,DEFAULT,IS_SET,FORCE){
	require('./$.iter-create')(Constructor,NAME,next);
	var createMethod = function(kind){
	switch(kind){
	case KEYS:return function keys(){
	return new Constructor(this,kind);
}
;
	case VALUES:return function values(){
	return new Constructor(this,kind);
}
;
}
return function entries(){
	return new Constructor(this,kind);
}
;
}
;
	var TAG = NAME + ' Iterator',proto = Base.prototype,_native = proto[SYMBOL_ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT],_default = _native || createMethod(DEFAULT),methods,key;
	// Fix native if(_native){
	var IteratorPrototype = require('./$').getProto(_default.call(new Base));
	// Set @@toStringTag to native iterators require('./$.tag')(IteratorPrototype,TAG,true);
	// FF fix if(!LIBRARY && has(proto,FF_ITERATOR))hide(IteratorPrototype,SYMBOL_ITERATOR,returnThis);
}
// Define iterator if(!LIBRARY || FORCE)hide(proto,SYMBOL_ITERATOR,_default);
	// Plug for library Iterators[NAME] = _default;
	Iterators[TAG] = returnThis;
	if(DEFAULT){
	methods ={
	values:DEFAULT == VALUES ? _default:createMethod(VALUES),keys:IS_SET ? _default:createMethod(KEYS),entries:DEFAULT != VALUES ? _default:createMethod('entries')}
;
	if(FORCE)for(key in methods){
	if(!(key in proto))$redef(proto,key,methods[key]);
}
else $def($def.P + $def.F * BUGGY,NAME,methods);
}
}
;
}
,{
	"./$":45,"./$.def":17,"./$.has":29,"./$.hide":30,"./$.iter-create":40,"./$.iterators":44,"./$.library":47,"./$.redef":58,"./$.tag":73,"./$.wks":82}
],42:[function(require,module,exports){
	var SYMBOL_ITERATOR = require('./$.wks')('iterator'),SAFE_CLOSING = false;
	try{
	var riter = [7][SYMBOL_ITERATOR]();
	riter['return'] = function(){
	SAFE_CLOSING = true;
}
;
	Array.from(riter,function(){
	throw 2;
}
);
}
catch(e){
	/* empty */
}
module.exports = function(exec,skipClosing){
	if(!skipClosing && !SAFE_CLOSING)return false;
	var safe = false;
	try{
	var arr = [7],iter = arr[SYMBOL_ITERATOR]();
	iter.next = function(){
	safe = true;
}
;
	arr[SYMBOL_ITERATOR] = function(){
	return iter;
}
;
	exec(arr);
}
catch(e){
	/* empty */
}
return safe;
}
;
}
,{
	"./$.wks":82}
],43:[function(require,module,exports){
	module.exports = function(done,value){
	return{
	value:value,done:!!done}
;
}
;
}
,{
}
],44:[function(require,module,exports){
	module.exports ={
}
;
}
,{
}
],45:[function(require,module,exports){
	var $Object = Object;
	module.exports ={
	create:$Object.create,getProto:$Object.getPrototypeOf,isEnum:{
}
.propertyIsEnumerable,getDesc:$Object.getOwnPropertyDescriptor,setDesc:$Object.defineProperty,setDescs:$Object.defineProperties,getKeys:$Object.keys,getNames:$Object.getOwnPropertyNames,getSymbols:$Object.getOwnPropertySymbols,each:[].forEach}
;
}
,{
}
],46:[function(require,module,exports){
	var $ = require('./$'),toIObject = require('./$.to-iobject');
	module.exports = function(object,el){
	var O = toIObject(object),keys = $.getKeys(O),length = keys.length,index = 0,key;
	while(length > index)if(O[key = keys[index++]] === el)return key;
}
;
}
,{
	"./$":45,"./$.to-iobject":77}
],47:[function(require,module,exports){
	module.exports = false;
}
,{
}
],48:[function(require,module,exports){
	// 20.2.2.20 Math.log1p(x)module.exports = Math.log1p || function log1p(x){
	return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2:Math.log(1 + x);
}
;
}
,{
}
],49:[function(require,module,exports){
	var global = require('./$.global'),macrotask = require('./$.task').set,Observer = global.MutationObserver || global.WebKitMutationObserver,process = global.process,isNode = require('./$.cof')(process) == 'process',head,last,notify;
	var flush = function(){
	var parent,domain;
	if(isNode && (parent = process.domain)){
	process.domain = null;
	parent.exit();
}
while(head){
	domain = head.domain;
	if(domain)domain.enter();
	head.fn.call();
	// <- currently we use it only for Promise - try / catch not required if(domain)domain.exit();
	head = head.next;
}
last = undefined;
	if(parent)parent.enter();
}
;
	// Node.jsif(isNode){
	notify = function(){
	process.nextTick(flush);
}
;
	// browsers with MutationObserver}
else if(Observer){
	var toggle = 1,node = document.createTextNode('');
	new Observer(flush).observe(node,{
	characterData:true}
);
	// eslint-disable-line no-new notify = function(){
	node.data = toggle = -toggle;
}
;
	// for other environments - macrotask based on:// - setImmediate// - MessageChannel// - window.postMessag// - onreadystatechange// - setTimeout}
else{
	notify = function(){
	// strange IE + webpack dev server bug - use .call(global) macrotask.call(global,flush);
}
;
}
module.exports = function asap(fn){
	var task ={
	fn:fn,next:undefined,domain:isNode && process.domain}
;
	if(last)last.next = task;
	if(!head){
	head = task;
	notify();
}
last = task;
}
;
}
,{
	"./$.cof":10,"./$.global":28,"./$.task":74}
],50:[function(require,module,exports){
	var $redef = require('./$.redef');
	module.exports = function(target,src){
	for(var key in src)$redef(target,key,src[key]);
	return target;
}
;
}
,{
	"./$.redef":58}
],51:[function(require,module,exports){
	var $ = require('./$'),ownKeys = require('./$.own-keys'),toIObject = require('./$.to-iobject');
	module.exports = function define(target,mixin){
	var keys = ownKeys(toIObject(mixin)),length = keys.length,i = 0,key;
	while(length > i)$.setDesc(target,key = keys[i++],$.getDesc(mixin,key));
	return target;
}
;
}
,{
	"./$":45,"./$.own-keys":54,"./$.to-iobject":77}
],52:[function(require,module,exports){
	// most Object methods by ES6 should accept primitivesmodule.exports = function(KEY,exec){
	var $def = require('./$.def'),fn = (require('./$.core').Object ||{
}
)[KEY] || Object[KEY],exp ={
}
;
	exp[KEY] = exec(fn);
	$def($def.S + $def.F * require('./$.fails')(function(){
	fn(1);
}
),'Object',exp);
}
;
}
,{
	"./$.core":15,"./$.def":17,"./$.fails":23}
],53:[function(require,module,exports){
	var $ = require('./$'),toIObject = require('./$.to-iobject'),isEnum = $.isEnum;
	module.exports = function(isEntries){
	return function(it){
	var O = toIObject(it),keys = $.getKeys(O),length = keys.length,i = 0,result = [],key;
	while(length > i)if(isEnum.call(O,key = keys[i++])){
	result.push(isEntries ? [key,O[key]]:O[key]);
}
return result;
}
;
}
;
}
,{
	"./$":45,"./$.to-iobject":77}
],54:[function(require,module,exports){
	// all object keys,includes non-enumerable and symbolsvar $ = require('./$'),anObject = require('./$.an-object'),Reflect = require('./$.global').Reflect;
	module.exports = Reflect && Reflect.ownKeys || function ownKeys(it){
	var keys = $.getNames(anObject(it)),getSymbols = $.getSymbols;
	return getSymbols ? keys.concat(getSymbols(it)):keys;
}
;
}
,{
	"./$":45,"./$.an-object":3,"./$.global":28}
],55:[function(require,module,exports){
	'use strict';
	var path = require('./$.path'),invoke = require('./$.invoke'),aFunction = require('./$.a-function');
	module.exports = function(/* ...pargs */
){
	var fn = aFunction(this),length = arguments.length,pargs = Array(length),i = 0,_ = path._,holder = false;
	while(length > i)if((pargs[i] = arguments[i++]) === _)holder = true;
	return function(/* ...args */
){
	var that = this,$$ = arguments,$$len = $$.length,j = 0,k = 0,args;
	if(!holder && !$$len)return invoke(fn,pargs,that);
	args = pargs.slice();
	if(holder)for(;
	length > j;
	j++)if(args[j] === _)args[j] = $$[k++];
	while($$len > k)args.push($$[k++]);
	return invoke(fn,args,that);
}
;
}
;
}
,{
	"./$.a-function":2,"./$.invoke":32,"./$.path":56}
],56:[function(require,module,exports){
	module.exports = require('./$.global');
}
,{
	"./$.global":28}
],57:[function(require,module,exports){
	module.exports = function(bitmap,value){
	return{
	enumerable:!(bitmap & 1),configurable:!(bitmap & 2),writable:!(bitmap & 4),value:value}
;
}
;
}
,{
}
],58:[function(require,module,exports){
	// add fake Function#toString// for correct work wrapped methods / constructors with methods like LoDash isNativevar global = require('./$.global'),hide = require('./$.hide'),SRC = require('./$.uid')('src'),TO_STRING = 'toString',$toString = Function[TO_STRING],TPL = ('' + $toString).split(TO_STRING);
	require('./$.core').inspectSource = function(it){
	return $toString.call(it);
}
;
	(module.exports = function(O,key,val,safe){
	if(typeof val == 'function'){
	val.hasOwnProperty(SRC) || hide(val,SRC,O[key] ? '' + O[key]:TPL.join(String(key)));
	val.hasOwnProperty('name') || hide(val,'name',key);
}
if(O === global){
	O[key] = val;
}
else{
	if(!safe)delete O[key];
	hide(O,key,val);
}
}
)(Function.prototype,TO_STRING,function toString(){
	return typeof this == 'function' && this[SRC] || $toString.call(this);
}
);
}
,{
	"./$.core":15,"./$.global":28,"./$.hide":30,"./$.uid":80}
],59:[function(require,module,exports){
	module.exports = function(regExp,replace){
	var replacer = replace === Object(replace) ? function(part){
	return replace[part];
}
:replace;
	return function(it){
	return String(it).replace(regExp,replacer);
}
;
}
;
}
,{
}
],60:[function(require,module,exports){
	module.exports = Object.is || function is(x,y){
	return x === y ? x !== 0 || 1 / x === 1 / y:x != x && y != y;
}
;
}
,{
}
],61:[function(require,module,exports){
	// Works with __proto__ only. Old v8 can't work with null proto objects./* eslint-disable no-proto */
var getDesc = require('./$').getDesc,isObject = require('./$.is-object'),anObject = require('./$.an-object');
	var check = function(O,proto){
	anObject(O);
	if(!isObject(proto) && proto !== null)throw TypeError(proto + ":can't set as prototype!");
}
;
	module.exports ={
	set:Object.setPrototypeOf || ('__proto__' in{
}
? // eslint-disable-line function(test,buggy,set){
	try{
	set = require('./$.ctx')(Function.call,getDesc(Object.prototype,'__proto__').set,2);
	set(test,[]);
	buggy = !(test instanceof Array);
}
catch(e){
	buggy = true;
}
return function setPrototypeOf(O,proto){
	check(O,proto);
	if(buggy)O.__proto__ = proto;
	else set(O,proto);
	return O;
}
;
}
({
}
,false):undefined),check:check}
;
}
,{
	"./$":45,"./$.an-object":3,"./$.ctx":16,"./$.is-object":37}
],62:[function(require,module,exports){
	var global = require('./$.global'),SHARED = '__core-js_shared__',store = global[SHARED] || (global[SHARED] ={
}
);
	module.exports = function(key){
	return store[key] || (store[key] ={
}
);
}
;
}
,{
	"./$.global":28}
],63:[function(require,module,exports){
	// 20.2.2.28 Math.sign(x)module.exports = Math.sign || function sign(x){
	return (x = +x) == 0 || x != x ? x:x < 0 ? -1:1;
}
;
}
,{
}
],64:[function(require,module,exports){
	// 7.3.20 SpeciesConstructor(O,defaultConstructor)var anObject = require('./$.an-object'),aFunction = require('./$.a-function'),SPECIES = require('./$.wks')('species');
	module.exports = function(O,D){
	var C = anObject(O).constructor,S;
	return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D:aFunction(S);
}
;
}
,{
	"./$.a-function":2,"./$.an-object":3,"./$.wks":82}
],65:[function(require,module,exports){
	'use strict';
	var $ = require('./$'),SPECIES = require('./$.wks')('species');
	module.exports = function(C){
	if(require('./$.support-desc') && !(SPECIES in C))$.setDesc(C,SPECIES,{
	configurable:true,get:function(){
	return this;
}
}
);
}
;
}
,{
	"./$":45,"./$.support-desc":72,"./$.wks":82}
],66:[function(require,module,exports){
	module.exports = function(it,Constructor,name){
	if(!(it instanceof Constructor))throw TypeError(name + ":use the 'new' operator!");
	return it;
}
;
}
,{
}
],67:[function(require,module,exports){
	// true -> String#at// false -> String#codePointAtvar toInteger = require('./$.to-integer'),defined = require('./$.defined');
	module.exports = function(TO_STRING){
	return function(that,pos){
	var s = String(defined(that)),i = toInteger(pos),l = s.length,a,b;
	if(i < 0 || i >= l)return TO_STRING ? '':undefined;
	a = s.charCodeAt(i);
	return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff ? TO_STRING ? s.charAt(i):a:TO_STRING ? s.slice(i,i + 2):(a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
}
;
}
;
}
,{
	"./$.defined":18,"./$.to-integer":76}
],68:[function(require,module,exports){
	// helper for String#{
	startsWith,endsWith,includes}
var isRegExp = require('./$.is-regexp'),defined = require('./$.defined');
	module.exports = function(that,searchString,NAME){
	if(isRegExp(searchString))throw TypeError('String#' + NAME + " doesn't accept regex!");
	return String(defined(that));
}
;
}
,{
	"./$.defined":18,"./$.is-regexp":38}
],69:[function(require,module,exports){
	// https://github.com/ljharb/proposal-string-pad-left-rightvar toLength = require('./$.to-length'),repeat = require('./$.string-repeat'),defined = require('./$.defined');
	module.exports = function(that,maxLength,fillString,left){
	var S = String(defined(that)),stringLength = S.length,fillStr = fillString === undefined ? ' ':String(fillString),intMaxLength = toLength(maxLength);
	if(intMaxLength <= stringLength)return S;
	if(fillStr == '')fillStr = ' ';
	var fillLen = intMaxLength - stringLength,stringFiller = repeat.call(fillStr,Math.ceil(fillLen / fillStr.length));
	if(stringFiller.length > fillLen)stringFiller = stringFiller.slice(0,fillLen);
	return left ? stringFiller + S:S + stringFiller;
}
;
}
,{
	"./$.defined":18,"./$.string-repeat":70,"./$.to-length":78}
],70:[function(require,module,exports){
	'use strict';
	var toInteger = require('./$.to-integer'),defined = require('./$.defined');
	module.exports = function repeat(count){
	var str = String(defined(this)),res = '',n = toInteger(count);
	if(n < 0 || n == Infinity)throw RangeError("Count can't be negative");
	for(;
	n > 0;
	(n >>>= 1) && (str += str))if(n & 1)res += str;
	return res;
}
;
}
,{
	"./$.defined":18,"./$.to-integer":76}
],71:[function(require,module,exports){
	// 1 -> String#trimLeft// 2 -> String#trimRight// 3 -> String#trimvar trim = function(string,TYPE){
	string = String(defined(string));
	if(TYPE & 1)string = string.replace(ltrim,'');
	if(TYPE & 2)string = string.replace(rtrim,'');
	return string;
}
;
	var $def = require('./$.def'),defined = require('./$.defined'),spaces = '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003' + '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF',space = '[' + spaces + ']',non = '\u200b\u0085',ltrim = RegExp('^' + space + space + '*'),rtrim = RegExp(space + space + '*$');
	module.exports = function(KEY,exec){
	var exp ={
}
;
	exp[KEY] = exec(trim);
	$def($def.P + $def.F * require('./$.fails')(function(){
	return !!spaces[KEY]() || non[KEY]() != non;
}
),'String',exp);
}
;
}
,{
	"./$.def":17,"./$.defined":18,"./$.fails":23}
],72:[function(require,module,exports){
	// Thank's IE8 for his funny definePropertymodule.exports = !require('./$.fails')(function(){
	return Object.defineProperty({
}
,'a',{
	get:function(){
	return 7;
}
}
).a != 7;
}
);
}
,{
	"./$.fails":23}
],73:[function(require,module,exports){
	var def = require('./$').setDesc,has = require('./$.has'),TAG = require('./$.wks')('toStringTag');
	module.exports = function(it,tag,stat){
	if(it && !has(it = stat ? it:it.prototype,TAG))def(it,TAG,{
	configurable:true,value:tag}
);
}
;
}
,{
	"./$":45,"./$.has":29,"./$.wks":82}
],74:[function(require,module,exports){
	'use strict';
	var ctx = require('./$.ctx'),invoke = require('./$.invoke'),html = require('./$.html'),cel = require('./$.dom-create'),global = require('./$.global'),process = global.process,setTask = global.setImmediate,clearTask = global.clearImmediate,MessageChannel = global.MessageChannel,counter = 0,queue ={
}
,ONREADYSTATECHANGE = 'onreadystatechange',defer,channel,port;
	var run = function(){
	var id = +this;
	if(queue.hasOwnProperty(id)){
	var fn = queue[id];
	delete queue[id];
	fn();
}
}
;
	var listner = function(event){
	run.call(event.data);
}
;
	// Node.js 0.9+ & IE10+ has setImmediate,otherwise:if(!setTask || !clearTask){
	setTask = function setImmediate(fn){
	var args = [],i = 1;
	while(arguments.length > i)args.push(arguments[i++]);
	queue[++counter] = function(){
	invoke(typeof fn == 'function' ? fn:Function(fn),args);
}
;
	defer(counter);
	return counter;
}
;
	clearTask = function clearImmediate(id){
	delete queue[id];
}
;
	// Node.js 0.8- if(require('./$.cof')(process) == 'process'){
	defer = function(id){
	process.nextTick(ctx(run,id,1));
}
;
	// Browsers with MessageChannel,includes WebWorkers}
else if(MessageChannel){
	channel = new MessageChannel;
	port = channel.port2;
	channel.port1.onmessage = listner;
	defer = ctx(port.postMessage,port,1);
	// Browsers with postMessage,skip WebWorkers // IE8 has postMessage,but it's sync & typeof its postMessage is 'object'}
else if(global.addEventListener && typeof postMessage == 'function' && !global.importScripts){
	defer = function(id){
	global.postMessage(id + '','*');
}
;
	global.addEventListener('message',listner,false);
	// IE8-}
else if(ONREADYSTATECHANGE in cel('script')){
	defer = function(id){
	html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function(){
	html.removeChild(this);
	run.call(id);
}
;
}
;
	// Rest old browsers}
else{
	defer = function(id){
	setTimeout(ctx(run,id,1),0);
}
;
}
}
module.exports ={
	set:setTask,clear:clearTask}
;
}
,{
	"./$.cof":10,"./$.ctx":16,"./$.dom-create":19,"./$.global":28,"./$.html":31,"./$.invoke":32}
],75:[function(require,module,exports){
	var toInteger = require('./$.to-integer'),max = Math.max,min = Math.min;
	module.exports = function(index,length){
	index = toInteger(index);
	return index < 0 ? max(index + length,0):min(index,length);
}
;
}
,{
	"./$.to-integer":76}
],76:[function(require,module,exports){
	// 7.1.4 ToIntegervar ceil = Math.ceil,floor = Math.floor;
	module.exports = function(it){
	return isNaN(it = +it) ? 0:(it > 0 ? floor:ceil)(it);
}
;
}
,{
}
],77:[function(require,module,exports){
	// to indexed object,toObject with fallback for non-array-like ES3 stringsvar IObject = require('./$.iobject'),defined = require('./$.defined');
	module.exports = function(it){
	return IObject(defined(it));
}
;
}
,{
	"./$.defined":18,"./$.iobject":33}
],78:[function(require,module,exports){
	// 7.1.15 ToLengthvar toInteger = require('./$.to-integer'),min = Math.min;
	module.exports = function(it){
	return it > 0 ? min(toInteger(it),0x1fffffffffffff):0;
	// pow(2,53) - 1 == 9007199254740991}
;
}
,{
	"./$.to-integer":76}
],79:[function(require,module,exports){
	// 7.1.13 ToObject(argument)var defined = require('./$.defined');
	module.exports = function(it){
	return Object(defined(it));
}
;
}
,{
	"./$.defined":18}
],80:[function(require,module,exports){
	var id = 0,px = Math.random();
	module.exports = function(key){
	return 'Symbol('.concat(key === undefined ? '':key,')_',(++id + px).toString(36));
}
;
}
,{
}
],81:[function(require,module,exports){
	// 22.1.3.31 Array.prototype[@@unscopables]var UNSCOPABLES = require('./$.wks')('unscopables');
	if([][UNSCOPABLES] == undefined)require('./$.hide')(Array.prototype,UNSCOPABLES,{
}
);
	module.exports = function(key){
	[][UNSCOPABLES][key] = true;
}
;
}
,{
	"./$.hide":30,"./$.wks":82}
],82:[function(require,module,exports){
	var store = require('./$.shared')('wks'),Symbol = require('./$.global').Symbol;
	module.exports = function(name){
	return store[name] || (store[name] = Symbol && Symbol[name] || (Symbol || require('./$.uid'))('Symbol.' + name));
}
;
}
,{
	"./$.global":28,"./$.shared":62,"./$.uid":80}
],83:[function(require,module,exports){
	var global = require('./$.global'),core = require('./$.core'),$def = require('./$.def'),partial = require('./$.partial');
	// https://esdiscuss.org/topic/promise-returning-delay-function$def($def.G + $def.F,{
	delay:function delay(time){
	return new (core.Promise || global.Promise)(function(resolve){
	setTimeout(partial.call(resolve,true),time);
}
);
}
}
);
}
,{
	"./$.core":15,"./$.def":17,"./$.global":28,"./$.partial":55}
],84:[function(require,module,exports){
	'use strict';
	var $ = require('./$'),ctx = require('./$.ctx'),$def = require('./$.def'),createDesc = require('./$.property-desc'),assign = require('./$.assign'),keyOf = require('./$.keyof'),aFunction = require('./$.a-function'),forOf = require('./$.for-of'),isIterable = require('./core.is-iterable'),step = require('./$.iter-step'),isObject = require('./$.is-object'),toIObject = require('./$.to-iobject'),SUPPORT_DESC = require('./$.support-desc'),has = require('./$.has'),getKeys = $.getKeys;
	// 0 -> Dict.forEach// 1 -> Dict.map// 2 -> Dict.filter// 3 -> Dict.some// 4 -> Dict.every// 5 -> Dict.find// 6 -> Dict.findKey// 7 -> Dict.mapPairsvar createDictMethod = function(TYPE){
	var IS_MAP = TYPE == 1,IS_EVERY = TYPE == 4;
	return function(object,callbackfn,that /* = undefined */
){
	var f = ctx(callbackfn,that,3),O = toIObject(object),result = IS_MAP || TYPE == 7 || TYPE == 2 ? new (typeof this == 'function' ? this:Dict):undefined,key,val,res;
	for(key in O)if(has(O,key)){
	val = O[key];
	res = f(val,key,object);
	if(TYPE){
	if(IS_MAP)result[key] = res;
	// map else if(res)switch(TYPE){
	case 2:result[key] = val;
	break;
	// filter case 3:return true;
	// some case 5:return val;
	// find case 6:return key;
	// findKey case 7:result[res[0]] = res[1];
	// mapPairs}
else if(IS_EVERY)return false;
	// every}
}
return TYPE == 3 || IS_EVERY ? IS_EVERY:result;
}
;
}
;
	var findKey = createDictMethod(6);
	var createDictIter = function(kind){
	return function(it){
	return new DictIterator(it,kind);
}
;
}
;
	var DictIterator = function(iterated,kind){
	this._t = toIObject(iterated);
	// target this._a = getKeys(iterated);
	// keys this._i = 0;
	// next index this._k = kind;
	// kind}
;
	require('./$.iter-create')(DictIterator,'Dict',function(){
	var that = this,O = that._t,keys = that._a,kind = that._k,key;
	do{
	if(that._i >= keys.length){
	that._t = undefined;
	return step(1);
}
}
while(!has(O,key = keys[that._i++]));
	if(kind == 'keys' )return step(0,key);
	if(kind == 'values')return step(0,O[key]);
	return step(0,[key,O[key]]);
}
);
	function Dict(iterable){
	var dict = $.create(null);
	if(iterable != undefined){
	if(isIterable(iterable)){
	forOf(iterable,true,function(key,value){
	dict[key] = value;
}
);
}
else assign(dict,iterable);
}
return dict;
}
Dict.prototype = null;
	function reduce(object,mapfn,init){
	aFunction(mapfn);
	var O = toIObject(object),keys = getKeys(O),length = keys.length,i = 0,memo,key;
	if(arguments.length < 3){
	if(!length)throw TypeError('Reduce of empty object with no initial value');
	memo = O[keys[i++]];
}
else memo = Object(init);
	while(length > i)if(has(O,key = keys[i++])){
	memo = mapfn(memo,O[key],key,object);
}
return memo;
}
function includes(object,el){
	return (el == el ? keyOf(object,el):findKey(object,function(it){
	return it != it;
}
)) !== undefined;
}
function get(object,key){
	if(has(object,key))return object[key];
}
function set(object,key,value){
	if(SUPPORT_DESC && key in Object)$.setDesc(object,key,createDesc(0,value));
	else object[key] = value;
	return object;
}
function isDict(it){
	return isObject(it) && $.getProto(it) === Dict.prototype;
}
$def($def.G + $def.F,{
	Dict:Dict}
);
	$def($def.S,'Dict',{
	keys:createDictIter('keys'),values:createDictIter('values'),entries:createDictIter('entries'),forEach:createDictMethod(0),map:createDictMethod(1),filter:createDictMethod(2),some:createDictMethod(3),every:createDictMethod(4),find:createDictMethod(5),findKey:findKey,mapPairs:createDictMethod(7),reduce:reduce,keyOf:keyOf,includes:includes,has:has,get:get,set:set,isDict:isDict}
);
}
,{
	"./$":45,"./$.a-function":2,"./$.assign":8,"./$.ctx":16,"./$.def":17,"./$.for-of":26,"./$.has":29,"./$.is-object":37,"./$.iter-create":40,"./$.iter-step":43,"./$.keyof":46,"./$.property-desc":57,"./$.support-desc":72,"./$.to-iobject":77,"./core.is-iterable":88}
],85:[function(require,module,exports){
	'use strict';
	var path = require('./$.path'),$def = require('./$.def');
	// Placeholderrequire('./$.core')._ = path._ = path._ ||{
}
;
	$def($def.P + $def.F,'Function',{
	part:require('./$.partial')}
);
}
,{
	"./$.core":15,"./$.def":17,"./$.partial":55,"./$.path":56}
],86:[function(require,module,exports){
	var classof = require('./$.classof'),ITERATOR = require('./$.wks')('iterator'),Iterators = require('./$.iterators');
	module.exports = require('./$.core').getIteratorMethod = function(it){
	if(it != undefined)return it[ITERATOR] || it['@@iterator'] || Iterators[classof(it)];
}
;
}
,{
	"./$.classof":9,"./$.core":15,"./$.iterators":44,"./$.wks":82}
],87:[function(require,module,exports){
	var anObject = require('./$.an-object'),get = require('./core.get-iterator-method');
	module.exports = require('./$.core').getIterator = function(it){
	var iterFn = get(it);
	if(typeof iterFn != 'function')throw TypeError(it + ' is not iterable!');
	return anObject(iterFn.call(it));
}
;
}
,{
	"./$.an-object":3,"./$.core":15,"./core.get-iterator-method":86}
],88:[function(require,module,exports){
	var classof = require('./$.classof'),ITERATOR = require('./$.wks')('iterator'),Iterators = require('./$.iterators');
	module.exports = require('./$.core').isIterable = function(it){
	var O = Object(it);
	return ITERATOR in O || '@@iterator' in O || Iterators.hasOwnProperty(classof(O));
}
;
}
,{
	"./$.classof":9,"./$.core":15,"./$.iterators":44,"./$.wks":82}
],89:[function(require,module,exports){
	var $ = require('./$'),global = require('./$.global'),$def = require('./$.def'),log ={
}
,enabled = true;
	// Methods from https://github.com/DeveloperToolsWG/console-object/blob/master/api.md$.each.call(( 'assert,clear,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,' + 'info,isIndependentlyComposed,log,markTimeline,profile,profileEnd,table,' + 'time,timeEnd,timeline,timelineEnd,timeStamp,trace,warn').split(','),function(key){
	log[key] = function(){
	var $console = global.console;
	if(enabled && $console && $console[key]){
	return Function.apply.call($console[key],$console,arguments);
}
}
;
}
);
	$def($def.G + $def.F,{
	log:require('./$.assign')(log.log,log,{
	enable:function(){
	enabled = true;
}
,disable:function(){
	enabled = false;
}
}
)}
);
}
,{
	"./$":45,"./$.assign":8,"./$.def":17,"./$.global":28}
],90:[function(require,module,exports){
	'use strict';
	require('./$.iter-define')(Number,'Number',function(iterated){
	this._l = +iterated;
	this._i = 0;
}
,function(){
	var i = this._i++,done = !(i < this._l);
	return{
	done:done,value:done ? undefined:i}
;
}
);
}
,{
	"./$.iter-define":41}
],91:[function(require,module,exports){
	var $def = require('./$.def');
	$def($def.S + $def.F,'Object',{
	classof:require('./$.classof')}
);
}
,{
	"./$.classof":9,"./$.def":17}
],92:[function(require,module,exports){
	var $def = require('./$.def'),define = require('./$.object-define');
	$def($def.S + $def.F,'Object',{
	define:define}
);
}
,{
	"./$.def":17,"./$.object-define":51}
],93:[function(require,module,exports){
	var $def = require('./$.def');
	$def($def.S + $def.F,'Object',{
	isObject:require('./$.is-object')}
);
}
,{
	"./$.def":17,"./$.is-object":37}
],94:[function(require,module,exports){
	var $def = require('./$.def'),create = require('./$').create,define = require('./$.object-define');
	$def($def.S + $def.F,'Object',{
	make:function(proto,mixin){
	return define(create(proto),mixin);
}
}
);
}
,{
	"./$":45,"./$.def":17,"./$.object-define":51}
],95:[function(require,module,exports){
	'use strict';
	var $def = require('./$.def'),$re = require('./$.replacer')(/[&<>"']/g,{
	'&':'&amp;
	','<':'&lt;
	','>':'&gt;
	','"':'&quot;
	',"'":'&apos;
	'}
);
	$def($def.P + $def.F,'String',{
	escapeHTML:function escapeHTML(){
	return $re(this);
}
}
);
}
,{
	"./$.def":17,"./$.replacer":59}
],96:[function(require,module,exports){
	'use strict';
	var $def = require('./$.def'),$re = require('./$.replacer')(/&(?:amp|lt|gt|quot|apos);
	/g,{
	'&amp;
	':'&','&lt;
	':'<','&gt;
	':'>','&quot;
	':'"','&apos;
	':"'"}
);
	$def($def.P + $def.F,'String',{
	unescapeHTML:function unescapeHTML(){
	return $re(this);
}
}
);
}
,{
	"./$.def":17,"./$.replacer":59}
],97:[function(require,module,exports){
	'use strict';
	var $ = require('./$'),SUPPORT_DESC = require('./$.support-desc'),createDesc = require('./$.property-desc'),html = require('./$.html'),cel = require('./$.dom-create'),has = require('./$.has'),cof = require('./$.cof'),$def = require('./$.def'),invoke = require('./$.invoke'),arrayMethod = require('./$.array-methods'),IE_PROTO = require('./$.uid')('__proto__'),isObject = require('./$.is-object'),anObject = require('./$.an-object'),aFunction = require('./$.a-function'),toObject = require('./$.to-object'),toIObject = require('./$.to-iobject'),toInteger = require('./$.to-integer'),toIndex = require('./$.to-index'),toLength = require('./$.to-length'),IObject = require('./$.iobject'),fails = require('./$.fails'),ObjectProto = Object.prototype,A = [],_slice = A.slice,_join = A.join,defineProperty = $.setDesc,getOwnDescriptor = $.getDesc,defineProperties = $.setDescs,$indexOf = require('./$.array-includes')(false),factories ={
}
,IE8_DOM_DEFINE;
	if(!SUPPORT_DESC){
	IE8_DOM_DEFINE = !fails(function(){
	return defineProperty(cel('div'),'a',{
	get:function(){
	return 7;
}
}
).a != 7;
}
);
	$.setDesc = function(O,P,Attributes){
	if(IE8_DOM_DEFINE)try{
	return defineProperty(O,P,Attributes);
}
catch(e){
	/* empty */
}
if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!');
	if('value' in Attributes)anObject(O)[P] = Attributes.value;
	return O;
}
;
	$.getDesc = function(O,P){
	if(IE8_DOM_DEFINE)try{
	return getOwnDescriptor(O,P);
}
catch(e){
	/* empty */
}
if(has(O,P))return createDesc(!ObjectProto.propertyIsEnumerable.call(O,P),O[P]);
}
;
	$.setDescs = defineProperties = function(O,Properties){
	anObject(O);
	var keys = $.getKeys(Properties),length = keys.length,i = 0,P;
	while(length > i)$.setDesc(O,P = keys[i++],Properties[P]);
	return O;
}
;
}
$def($def.S + $def.F * !SUPPORT_DESC,'Object',{
	// 19.1.2.6 / 15.2.3.3 Object.getOwnPropertyDescriptor(O,P) getOwnPropertyDescriptor:$.getDesc,// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O,P,Attributes) defineProperty:$.setDesc,// 19.1.2.3 / 15.2.3.7 Object.defineProperties(O,Properties) defineProperties:defineProperties}
);
	// IE 8- don't enum bug keysvar keys1 = ('constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,' + 'toLocaleString,toString,valueOf').split(',') // Additional keys for getOwnPropertyNames,keys2 = keys1.concat('length','prototype'),keysLen1 = keys1.length;
	// Create object with `null` prototype:use iframe Object with cleared prototypevar createDict = function(){
	// Thrash,waste and sodomy:IE GC bug var iframe = cel('iframe'),i = keysLen1,gt = '>',iframeDocument;
	iframe.style.display = 'none';
	html.appendChild(iframe);
	iframe.src = 'javascript:';
	// eslint-disable-line no-script-url // createDict = iframe.contentWindow.Object;
	// html.removeChild(iframe);
	iframeDocument = iframe.contentWindow.document;
	iframeDocument.open();
	iframeDocument.write('<script>document.F=Object</script' + gt);
	iframeDocument.close();
	createDict = iframeDocument.F;
	while(i--)delete createDict.prototype[keys1[i]];
	return createDict();
}
;
	var createGetKeys = function(names,length){
	return function(object){
	var O = toIObject(object),i = 0,result = [],key;
	for(key in O)if(key != IE_PROTO)has(O,key) && result.push(key);
	// Don't enum bug & hidden keys while(length > i)if(has(O,key = names[i++])){
	~$indexOf(result,key) || result.push(key);
}
return result;
}
;
}
;
	var Empty = function(){
}
;
	$def($def.S,'Object',{
	// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) getPrototypeOf:$.getProto = $.getProto || function(O){
	O = toObject(O);
	if(has(O,IE_PROTO))return O[IE_PROTO];
	if(typeof O.constructor == 'function' && O instanceof O.constructor){
	return O.constructor.prototype;
}
return O instanceof Object ? ObjectProto:null;
}
,// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O) getOwnPropertyNames:$.getNames = $.getNames || createGetKeys(keys2,keys2.length,true),// 19.1.2.2 / 15.2.3.5 Object.create(O [,Properties]) create:$.create = $.create || function(O,/*?*/
Properties){
	var result;
	if(O !== null){
	Empty.prototype = anObject(O);
	result = new Empty();
	Empty.prototype = null;
	// add "__proto__" for Object.getPrototypeOf shim result[IE_PROTO] = O;
}
else result = createDict();
	return Properties === undefined ? result:defineProperties(result,Properties);
}
,// 19.1.2.14 / 15.2.3.14 Object.keys(O) keys:$.getKeys = $.getKeys || createGetKeys(keys1,keysLen1,false)}
);
	var construct = function(F,len,args){
	if(!(len in factories)){
	for(var n = [],i = 0;
	i < len;
	i++)n[i] = 'a[' + i + ']';
	factories[len] = Function('F,a','return new F(' + n.join(',') + ')');
}
return factories[len](F,args);
}
;
	// 19.2.3.2 / 15.3.4.5 Function.prototype.bind(thisArg,args...)$def($def.P,'Function',{
	bind:function bind(that /*,args... */
){
	var fn = aFunction(this),partArgs = _slice.call(arguments,1);
	var bound = function(/* args... */
){
	var args = partArgs.concat(_slice.call(arguments));
	return this instanceof bound ? construct(fn,args.length,args):invoke(fn,args,that);
}
;
	if(isObject(fn.prototype))bound.prototype = fn.prototype;
	return bound;
}
}
);
	// fallback for not array-like ES3 strings and DOM objectsvar buggySlice = fails(function(){
	if(html)_slice.call(html);
}
);
	$def($def.P + $def.F * buggySlice,'Array',{
	slice:function(begin,end){
	var len = toLength(this.length),klass = cof(this);
	end = end === undefined ? len:end;
	if(klass == 'Array')return _slice.call(this,begin,end);
	var start = toIndex(begin,len),upTo = toIndex(end,len),size = toLength(upTo - start),cloned = Array(size),i = 0;
	for(;
	i < size;
	i++)cloned[i] = klass == 'String' ? this.charAt(start + i):this[start + i];
	return cloned;
}
}
);
	$def($def.P + $def.F * (IObject != Object),'Array',{
	join:function(){
	return _join.apply(IObject(this),arguments);
}
}
);
	// 22.1.2.2 / 15.4.3.2 Array.isArray(arg)$def($def.S,'Array',{
	isArray:require('./$.is-array')}
);
	var createArrayReduce = function(isRight){
	return function(callbackfn,memo){
	aFunction(callbackfn);
	var O = IObject(this),length = toLength(O.length),index = isRight ? length - 1:0,i = isRight ? -1:1;
	if(arguments.length < 2)for(;
	;
	){
	if(index in O){
	memo = O[index];
	index += i;
	break;
}
index += i;
	if(isRight ? index < 0:length <= index){
	throw TypeError('Reduce of empty array with no initial value');
}
}
for(;
	isRight ? index >= 0:length > index;
	index += i)if(index in O){
	memo = callbackfn(memo,O[index],index,this);
}
return memo;
}
;
}
;
	var methodize = function($fn){
	return function(arg1/*,arg2 = undefined */
){
	return $fn(this,arg1,arguments[1]);
}
;
}
;
	$def($def.P,'Array',{
	// 22.1.3.10 / 15.4.4.18 Array.prototype.forEach(callbackfn [,thisArg]) forEach:$.each = $.each || methodize(arrayMethod(0)),// 22.1.3.15 / 15.4.4.19 Array.prototype.map(callbackfn [,thisArg]) map:methodize(arrayMethod(1)),// 22.1.3.7 / 15.4.4.20 Array.prototype.filter(callbackfn [,thisArg]) filter:methodize(arrayMethod(2)),// 22.1.3.23 / 15.4.4.17 Array.prototype.some(callbackfn [,thisArg]) some:methodize(arrayMethod(3)),// 22.1.3.5 / 15.4.4.16 Array.prototype.every(callbackfn [,thisArg]) every:methodize(arrayMethod(4)),// 22.1.3.18 / 15.4.4.21 Array.prototype.reduce(callbackfn [,initialValue]) reduce:createArrayReduce(false),// 22.1.3.19 / 15.4.4.22 Array.prototype.reduceRight(callbackfn [,initialValue]) reduceRight:createArrayReduce(true),// 22.1.3.11 / 15.4.4.14 Array.prototype.indexOf(searchElement [,fromIndex]) indexOf:methodize($indexOf),// 22.1.3.14 / 15.4.4.15 Array.prototype.lastIndexOf(searchElement [,fromIndex]) lastIndexOf:function(el,fromIndex /* = @[*-1] */
){
	var O = toIObject(this),length = toLength(O.length),index = length - 1;
	if(arguments.length > 1)index = Math.min(index,toInteger(fromIndex));
	if(index < 0)index = toLength(length + index);
	for(;
	index >= 0;
	index--)if(index in O)if(O[index] === el)return index;
	return -1;
}
}
);
	// 20.3.3.1 / 15.9.4.4 Date.now()$def($def.S,'Date',{
	now:function(){
	return +new Date;
}
}
);
	var lz = function(num){
	return num > 9 ? num:'0' + num;
}
;
	// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()// PhantomJS and old webkit had a broken Date implementation.var date = new Date(-5e13 - 1),brokenDate = !(date.toISOString && date.toISOString() == '0385-07-25T07:06:39.999Z' && fails(function(){
	new Date(NaN).toISOString();
}
));
	$def($def.P + $def.F * brokenDate,'Date',{
	toISOString:function toISOString(){
	if(!isFinite(this))throw RangeError('Invalid time value');
	var d = this,y = d.getUTCFullYear(),m = d.getUTCMilliseconds(),s = y < 0 ? '-':y > 9999 ? '+':'';
	return s + ('00000' + Math.abs(y)).slice(s ? -6:-4) + '-' + lz(d.getUTCMonth() + 1) + '-' + lz(d.getUTCDate()) + 'T' + lz(d.getUTCHours()) + ':' + lz(d.getUTCMinutes()) + ':' + lz(d.getUTCSeconds()) + '.' + (m > 99 ? m:'0' + lz(m)) + 'Z';
}
}
);
}
,{
	"./$":45,"./$.a-function":2,"./$.an-object":3,"./$.array-includes":6,"./$.array-methods":7,"./$.cof":10,"./$.def":17,"./$.dom-create":19,"./$.fails":23,"./$.has":29,"./$.html":31,"./$.invoke":32,"./$.iobject":33,"./$.is-array":35,"./$.is-object":37,"./$.property-desc":57,"./$.support-desc":72,"./$.to-index":75,"./$.to-integer":76,"./$.to-iobject":77,"./$.to-length":78,"./$.to-object":79,"./$.uid":80}
],98:[function(require,module,exports){
	// 22.1.3.3 Array.prototype.copyWithin(target,start,end = this.length)'use strict';
	var $def = require('./$.def');
	$def($def.P,'Array',{
	copyWithin:require('./$.array-copy-within')}
);
	require('./$.unscope')('copyWithin');
}
,{
	"./$.array-copy-within":4,"./$.def":17,"./$.unscope":81}
],99:[function(require,module,exports){
	// 22.1.3.6 Array.prototype.fill(value,start = 0,end = this.length)var $def = require('./$.def');
	$def($def.P,'Array',{
	fill:require('./$.array-fill')}
);
	require('./$.unscope')('fill');
}
,{
	"./$.array-fill":5,"./$.def":17,"./$.unscope":81}
],100:[function(require,module,exports){
	'use strict';
	// 22.1.3.9 Array.prototype.findIndex(predicate,thisArg = undefined)var KEY = 'findIndex',$def = require('./$.def'),forced = true,$find = require('./$.array-methods')(6);
	// Shouldn't skip holesif(KEY in [])Array(1)[KEY](function(){
	forced = false;
}
);
	$def($def.P + $def.F * forced,'Array',{
	findIndex:function findIndex(callbackfn/*,that = undefined */
){
	return $find(this,callbackfn,arguments.length > 1 ? arguments[1]:undefined);
}
}
);
	require('./$.unscope')(KEY);
}
,{
	"./$.array-methods":7,"./$.def":17,"./$.unscope":81}
],101:[function(require,module,exports){
	'use strict';
	// 22.1.3.8 Array.prototype.find(predicate,thisArg = undefined)var KEY = 'find',$def = require('./$.def'),forced = true,$find = require('./$.array-methods')(5);
	// Shouldn't skip holesif(KEY in [])Array(1)[KEY](function(){
	forced = false;
}
);
	$def($def.P + $def.F * forced,'Array',{
	find:function find(callbackfn/*,that = undefined */
){
	return $find(this,callbackfn,arguments.length > 1 ? arguments[1]:undefined);
}
}
);
	require('./$.unscope')(KEY);
}
,{
	"./$.array-methods":7,"./$.def":17,"./$.unscope":81}
],102:[function(require,module,exports){
	'use strict';
	var ctx = require('./$.ctx'),$def = require('./$.def'),toObject = require('./$.to-object'),call = require('./$.iter-call'),isArrayIter = require('./$.is-array-iter'),toLength = require('./$.to-length'),getIterFn = require('./core.get-iterator-method');
	$def($def.S + $def.F * !require('./$.iter-detect')(function(iter){
	Array.from(iter);
}
),'Array',{
	// 22.1.2.1 Array.from(arrayLike,mapfn = undefined,thisArg = undefined) from:function from(arrayLike/*,mapfn = undefined,thisArg = undefined*/
){
	var O = toObject(arrayLike),C = typeof this == 'function' ? this:Array,$$ = arguments,$$len = $$.length,mapfn = $$len > 1 ? $$[1]:undefined,mapping = mapfn !== undefined,index = 0,iterFn = getIterFn(O),length,result,step,iterator;
	if(mapping)mapfn = ctx(mapfn,$$len > 2 ? $$[2]:undefined,2);
	// if object isn't iterable or it's array with default iterator - use simple case if(iterFn != undefined && !(C == Array && isArrayIter(iterFn))){
	for(iterator = iterFn.call(O),result = new C;
	!(step = iterator.next()).done;
	index++){
	result[index] = mapping ? call(iterator,mapfn,[step.value,index],true):step.value;
}
}
else{
	length = toLength(O.length);
	for(result = new C(length);
	length > index;
	index++){
	result[index] = mapping ? mapfn(O[index],index):O[index];
}
}
result.length = index;
	return result;
}
}
);
}
,{
	"./$.ctx":16,"./$.def":17,"./$.is-array-iter":34,"./$.iter-call":39,"./$.iter-detect":42,"./$.to-length":78,"./$.to-object":79,"./core.get-iterator-method":86}
],103:[function(require,module,exports){
	'use strict';
	var setUnscope = require('./$.unscope'),step = require('./$.iter-step'),Iterators = require('./$.iterators'),toIObject = require('./$.to-iobject');
	// 22.1.3.4 Array.prototype.entries()// 22.1.3.13 Array.prototype.keys()// 22.1.3.29 Array.prototype.values()// 22.1.3.30 Array.prototype[@@iterator]()require('./$.iter-define')(Array,'Array',function(iterated,kind){
	this._t = toIObject(iterated);
	// target this._i = 0;
	// next index this._k = kind;
	// kind// 22.1.5.2.1 %ArrayIteratorPrototype%.next()}
,function(){
	var O = this._t,kind = this._k,index = this._i++;
	if(!O || index >= O.length){
	this._t = undefined;
	return step(1);
}
if(kind == 'keys' )return step(0,index);
	if(kind == 'values')return step(0,O[index]);
	return step(0,[index,O[index]]);
}
,'values');
	// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6,9.4.4.7)Iterators.Arguments = Iterators.Array;
	setUnscope('keys');
	setUnscope('values');
	setUnscope('entries');
}
,{
	"./$.iter-define":41,"./$.iter-step":43,"./$.iterators":44,"./$.to-iobject":77,"./$.unscope":81}
],104:[function(require,module,exports){
	'use strict';
	var $def = require('./$.def');
	// WebKit Array.of isn't generic$def($def.S + $def.F * require('./$.fails')(function(){
	function F(){
}
return !(Array.of.call(F) instanceof F);
}
),'Array',{
	// 22.1.2.3 Array.of( ...items) of:function of(/* ...args */
){
	var index = 0,$$ = arguments,$$len = $$.length,result = new (typeof this == 'function' ? this:Array)($$len);
	while($$len > index)result[index] = $$[index++];
	result.length = $$len;
	return result;
}
}
);
}
,{
	"./$.def":17,"./$.fails":23}
],105:[function(require,module,exports){
	require('./$.species')(Array);
}
,{
	"./$.species":65}
],106:[function(require,module,exports){
	'use strict';
	var $ = require('./$'),isObject = require('./$.is-object'),HAS_INSTANCE = require('./$.wks')('hasInstance'),FunctionProto = Function.prototype;
	// 19.2.3.6 Function.prototype[@@hasInstance](V)if(!(HAS_INSTANCE in FunctionProto))$.setDesc(FunctionProto,HAS_INSTANCE,{
	value:function(O){
	if(typeof this != 'function' || !isObject(O))return false;
	if(!isObject(this.prototype))return O instanceof this;
	// for environment w/o native `@@hasInstance` logic enough `instanceof`,but add this:while(O = $.getProto(O))if(this.prototype === O)return true;
	return false;
}
}
);
}
,{
	"./$":45,"./$.is-object":37,"./$.wks":82}
],107:[function(require,module,exports){
	var setDesc = require('./$').setDesc,createDesc = require('./$.property-desc'),has = require('./$.has'),FProto = Function.prototype,nameRE = /^\s*function ([^ (]*)/,NAME = 'name';
	// 19.2.4.2 nameNAME in FProto || require('./$.support-desc') && setDesc(FProto,NAME,{
	configurable:true,get:function(){
	var match = ('' + this).match(nameRE),name = match ? match[1]:'';
	has(this,NAME) || setDesc(this,NAME,createDesc(5,name));
	return name;
}
}
);
}
,{
	"./$":45,"./$.has":29,"./$.property-desc":57,"./$.support-desc":72}
],108:[function(require,module,exports){
	'use strict';
	var strong = require('./$.collection-strong');
	// 23.1 Map Objectsrequire('./$.collection')('Map',function(get){
	return function Map(){
	return get(this,arguments.length > 0 ? arguments[0]:undefined);
}
;
}
,{
	// 23.1.3.6 Map.prototype.get(key) get:function get(key){
	var entry = strong.getEntry(this,key);
	return entry && entry.v;
}
,// 23.1.3.9 Map.prototype.set(key,value) set:function set(key,value){
	return strong.def(this,key === 0 ? 0:key,value);
}
}
,strong,true);
}
,{
	"./$.collection":14,"./$.collection-strong":11}
],109:[function(require,module,exports){
	// 20.2.2.3 Math.acosh(x)var $def = require('./$.def'),log1p = require('./$.log1p'),sqrt = Math.sqrt,$acosh = Math.acosh;
	// V8 bug https://code.google.com/p/v8/issues/detail?id=3509$def($def.S + $def.F * !($acosh && Math.floor($acosh(Number.MAX_VALUE)) == 710),'Math',{
	acosh:function acosh(x){
	return (x = +x) < 1 ? NaN:x > 94906265.62425156 ? Math.log(x) + Math.LN2:log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));
}
}
);
}
,{
	"./$.def":17,"./$.log1p":48}
],110:[function(require,module,exports){
	// 20.2.2.5 Math.asinh(x)var $def = require('./$.def');
	function asinh(x){
	return !isFinite(x = +x) || x == 0 ? x:x < 0 ? -asinh(-x):Math.log(x + Math.sqrt(x * x + 1));
}
$def($def.S,'Math',{
	asinh:asinh}
);
}
,{
	"./$.def":17}
],111:[function(require,module,exports){
	// 20.2.2.7 Math.atanh(x)var $def = require('./$.def');
	$def($def.S,'Math',{
	atanh:function atanh(x){
	return (x = +x) == 0 ? x:Math.log((1 + x) / (1 - x)) / 2;
}
}
);
}
,{
	"./$.def":17}
],112:[function(require,module,exports){
	// 20.2.2.9 Math.cbrt(x)var $def = require('./$.def'),sign = require('./$.sign');
	$def($def.S,'Math',{
	cbrt:function cbrt(x){
	return sign(x = +x) * Math.pow(Math.abs(x),1 / 3);
}
}
);
}
,{
	"./$.def":17,"./$.sign":63}
],113:[function(require,module,exports){
	// 20.2.2.11 Math.clz32(x)var $def = require('./$.def');
	$def($def.S,'Math',{
	clz32:function clz32(x){
	return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E):32;
}
}
);
}
,{
	"./$.def":17}
],114:[function(require,module,exports){
	// 20.2.2.12 Math.cosh(x)var $def = require('./$.def'),exp = Math.exp;
	$def($def.S,'Math',{
	cosh:function cosh(x){
	return (exp(x = +x) + exp(-x)) / 2;
}
}
);
}
,{
	"./$.def":17}
],115:[function(require,module,exports){
	// 20.2.2.14 Math.expm1(x)var $def = require('./$.def');
	$def($def.S,'Math',{
	expm1:require('./$.expm1')}
);
}
,{
	"./$.def":17,"./$.expm1":21}
],116:[function(require,module,exports){
	// 20.2.2.16 Math.fround(x)var $def = require('./$.def'),sign = require('./$.sign'),pow = Math.pow,EPSILON = pow(2,-52),EPSILON32 = pow(2,-23),MAX32 = pow(2,127) * (2 - EPSILON32),MIN32 = pow(2,-126);
	var roundTiesToEven = function(n){
	return n + 1 / EPSILON - 1 / EPSILON;
}
;
	$def($def.S,'Math',{
	fround:function fround(x){
	var $abs = Math.abs(x),$sign = sign(x),a,result;
	if($abs < MIN32)return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;
	a = (1 + EPSILON32 / EPSILON) * $abs;
	result = a - (a - $abs);
	if(result > MAX32 || result != result)return $sign * Infinity;
	return $sign * result;
}
}
);
}
,{
	"./$.def":17,"./$.sign":63}
],117:[function(require,module,exports){
	// 20.2.2.17 Math.hypot([value1[,value2[,… ]]])var $def = require('./$.def'),abs = Math.abs;
	$def($def.S,'Math',{
	hypot:function hypot(value1,value2){
	// eslint-disable-line no-unused-vars var sum = 0,i = 0,$$ = arguments,$$len = $$.length,larg = 0,arg,div;
	while(i < $$len){
	arg = abs($$[i++]);
	if(larg < arg){
	div = larg / arg;
	sum = sum * div * div + 1;
	larg = arg;
}
else if(arg > 0){
	div = arg / larg;
	sum += div * div;
}
else sum += arg;
}
return larg === Infinity ? Infinity:larg * Math.sqrt(sum);
}
}
);
}
,{
	"./$.def":17}
],118:[function(require,module,exports){
	// 20.2.2.18 Math.imul(x,y)var $def = require('./$.def'),$imul = Math.imul;
	// some WebKit versions fails with big numbers,some has wrong arity$def($def.S + $def.F * require('./$.fails')(function(){
	return $imul(0xffffffff,5) != -5 || $imul.length != 2;
}
),'Math',{
	imul:function imul(x,y){
	var UINT16 = 0xffff,xn = +x,yn = +y,xl = UINT16 & xn,yl = UINT16 & yn;
	return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);
}
}
);
}
,{
	"./$.def":17,"./$.fails":23}
],119:[function(require,module,exports){
	// 20.2.2.21 Math.log10(x)var $def = require('./$.def');
	$def($def.S,'Math',{
	log10:function log10(x){
	return Math.log(x) / Math.LN10;
}
}
);
}
,{
	"./$.def":17}
],120:[function(require,module,exports){
	// 20.2.2.20 Math.log1p(x)var $def = require('./$.def');
	$def($def.S,'Math',{
	log1p:require('./$.log1p')}
);
}
,{
	"./$.def":17,"./$.log1p":48}
],121:[function(require,module,exports){
	// 20.2.2.22 Math.log2(x)var $def = require('./$.def');
	$def($def.S,'Math',{
	log2:function log2(x){
	return Math.log(x) / Math.LN2;
}
}
);
}
,{
	"./$.def":17}
],122:[function(require,module,exports){
	// 20.2.2.28 Math.sign(x)var $def = require('./$.def');
	$def($def.S,'Math',{
	sign:require('./$.sign')}
);
}
,{
	"./$.def":17,"./$.sign":63}
],123:[function(require,module,exports){
	// 20.2.2.30 Math.sinh(x)var $def = require('./$.def'),expm1 = require('./$.expm1'),exp = Math.exp;
	// V8 near Chromium 38 has a problem with very small numbers$def($def.S + $def.F * require('./$.fails')(function(){
	return !Math.sinh(-2e-17) != -2e-17;
}
),'Math',{
	sinh:function sinh(x){
	return Math.abs(x = +x) < 1 ? (expm1(x) - expm1(-x)) / 2:(exp(x - 1) - exp(-x - 1)) * (Math.E / 2);
}
}
);
}
,{
	"./$.def":17,"./$.expm1":21,"./$.fails":23}
],124:[function(require,module,exports){
	// 20.2.2.33 Math.tanh(x)var $def = require('./$.def'),expm1 = require('./$.expm1'),exp = Math.exp;
	$def($def.S,'Math',{
	tanh:function tanh(x){
	var a = expm1(x = +x),b = expm1(-x);
	return a == Infinity ? 1:b == Infinity ? -1:(a - b) / (exp(x) + exp(-x));
}
}
);
}
,{
	"./$.def":17,"./$.expm1":21}
],125:[function(require,module,exports){
	// 20.2.2.34 Math.trunc(x)var $def = require('./$.def');
	$def($def.S,'Math',{
	trunc:function trunc(it){
	return (it > 0 ? Math.floor:Math.ceil)(it);
}
}
);
}
,{
	"./$.def":17}
],126:[function(require,module,exports){
	'use strict';
	var $ = require('./$'),global = require('./$.global'),has = require('./$.has'),cof = require('./$.cof'),isObject = require('./$.is-object'),fails = require('./$.fails'),NUMBER = 'Number',$Number = global[NUMBER],Base = $Number,proto = $Number.prototype // Opera ~12 has broken Object#toString,BROKEN_COF = cof($.create(proto)) == NUMBER;
	var toPrimitive = function(it){
	var fn,val;
	if(typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it)))return val;
	if(typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;
	throw TypeError("Can't convert object to number");
}
;
	var toNumber = function(it){
	if(isObject(it))it = toPrimitive(it);
	if(typeof it == 'string' && it.length > 2 && it.charCodeAt(0) == 48){
	var binary = false;
	switch(it.charCodeAt(1)){
	case 66:case 98:binary = true;
	case 79:case 111:return parseInt(it.slice(2),binary ? 2:8);
}
}
return +it;
}
;
	if(!($Number('0o1') && $Number('0b1'))){
	$Number = function Number(it){
	var that = this;
	return that instanceof $Number // check on 1..constructor(foo) case && (BROKEN_COF ? fails(function(){
	proto.valueOf.call(that);
}
):cof(that) != NUMBER) ? new Base(toNumber(it)):toNumber(it);
}
;
	$.each.call(require('./$.support-desc') ? $.getNames(Base):( // ES3:'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' + // ES6 (in case,if modules with ES6 Number statics required before):'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' + 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger' ).split(','),function(key){
	if(has(Base,key) && !has($Number,key)){
	$.setDesc($Number,key,$.getDesc(Base,key));
}
}
);
	$Number.prototype = proto;
	proto.constructor = $Number;
	require('./$.redef')(global,NUMBER,$Number);
}
}
,{
	"./$":45,"./$.cof":10,"./$.fails":23,"./$.global":28,"./$.has":29,"./$.is-object":37,"./$.redef":58,"./$.support-desc":72}
],127:[function(require,module,exports){
	// 20.1.2.1 Number.EPSILONvar $def = require('./$.def');
	$def($def.S,'Number',{
	EPSILON:Math.pow(2,-52)}
);
}
,{
	"./$.def":17}
],128:[function(require,module,exports){
	// 20.1.2.2 Number.isFinite(number)var $def = require('./$.def'),_isFinite = require('./$.global').isFinite;
	$def($def.S,'Number',{
	isFinite:function isFinite(it){
	return typeof it == 'number' && _isFinite(it);
}
}
);
}
,{
	"./$.def":17,"./$.global":28}
],129:[function(require,module,exports){
	// 20.1.2.3 Number.isInteger(number)var $def = require('./$.def');
	$def($def.S,'Number',{
	isInteger:require('./$.is-integer')}
);
}
,{
	"./$.def":17,"./$.is-integer":36}
],130:[function(require,module,exports){
	// 20.1.2.4 Number.isNaN(number)var $def = require('./$.def');
	$def($def.S,'Number',{
	isNaN:function isNaN(number){
	return number != number;
}
}
);
}
,{
	"./$.def":17}
],131:[function(require,module,exports){
	// 20.1.2.5 Number.isSafeInteger(number)var $def = require('./$.def'),isInteger = require('./$.is-integer'),abs = Math.abs;
	$def($def.S,'Number',{
	isSafeInteger:function isSafeInteger(number){
	return isInteger(number) && abs(number) <= 0x1fffffffffffff;
}
}
);
}
,{
	"./$.def":17,"./$.is-integer":36}
],132:[function(require,module,exports){
	// 20.1.2.6 Number.MAX_SAFE_INTEGERvar $def = require('./$.def');
	$def($def.S,'Number',{
	MAX_SAFE_INTEGER:0x1fffffffffffff}
);
}
,{
	"./$.def":17}
],133:[function(require,module,exports){
	// 20.1.2.10 Number.MIN_SAFE_INTEGERvar $def = require('./$.def');
	$def($def.S,'Number',{
	MIN_SAFE_INTEGER:-0x1fffffffffffff}
);
}
,{
	"./$.def":17}
],134:[function(require,module,exports){
	// 20.1.2.12 Number.parseFloat(string)var $def = require('./$.def');
	$def($def.S,'Number',{
	parseFloat:parseFloat}
);
}
,{
	"./$.def":17}
],135:[function(require,module,exports){
	// 20.1.2.13 Number.parseInt(string,radix)var $def = require('./$.def');
	$def($def.S,'Number',{
	parseInt:parseInt}
);
}
,{
	"./$.def":17}
],136:[function(require,module,exports){
	// 19.1.3.1 Object.assign(target,source)var $def = require('./$.def');
	$def($def.S + $def.F,'Object',{
	assign:require('./$.assign')}
);
}
,{
	"./$.assign":8,"./$.def":17}
],137:[function(require,module,exports){
	// 19.1.2.5 Object.freeze(O)var isObject = require('./$.is-object');
	require('./$.object-sap')('freeze',function($freeze){
	return function freeze(it){
	return $freeze && isObject(it) ? $freeze(it):it;
}
;
}
);
}
,{
	"./$.is-object":37,"./$.object-sap":52}
],138:[function(require,module,exports){
	// 19.1.2.6 Object.getOwnPropertyDescriptor(O,P)var toIObject = require('./$.to-iobject');
	require('./$.object-sap')('getOwnPropertyDescriptor',function($getOwnPropertyDescriptor){
	return function getOwnPropertyDescriptor(it,key){
	return $getOwnPropertyDescriptor(toIObject(it),key);
}
;
}
);
}
,{
	"./$.object-sap":52,"./$.to-iobject":77}
],139:[function(require,module,exports){
	// 19.1.2.7 Object.getOwnPropertyNames(O)require('./$.object-sap')('getOwnPropertyNames',function(){
	return require('./$.get-names').get;
}
);
}
,{
	"./$.get-names":27,"./$.object-sap":52}
],140:[function(require,module,exports){
	// 19.1.2.9 Object.getPrototypeOf(O)var toObject = require('./$.to-object');
	require('./$.object-sap')('getPrototypeOf',function($getPrototypeOf){
	return function getPrototypeOf(it){
	return $getPrototypeOf(toObject(it));
}
;
}
);
}
,{
	"./$.object-sap":52,"./$.to-object":79}
],141:[function(require,module,exports){
	// 19.1.2.11 Object.isExtensible(O)var isObject = require('./$.is-object');
	require('./$.object-sap')('isExtensible',function($isExtensible){
	return function isExtensible(it){
	return isObject(it) ? $isExtensible ? $isExtensible(it):true:false;
}
;
}
);
}
,{
	"./$.is-object":37,"./$.object-sap":52}
],142:[function(require,module,exports){
	// 19.1.2.12 Object.isFrozen(O)var isObject = require('./$.is-object');
	require('./$.object-sap')('isFrozen',function($isFrozen){
	return function isFrozen(it){
	return isObject(it) ? $isFrozen ? $isFrozen(it):false:true;
}
;
}
);
}
,{
	"./$.is-object":37,"./$.object-sap":52}
],143:[function(require,module,exports){
	// 19.1.2.13 Object.isSealed(O)var isObject = require('./$.is-object');
	require('./$.object-sap')('isSealed',function($isSealed){
	return function isSealed(it){
	return isObject(it) ? $isSealed ? $isSealed(it):false:true;
}
;
}
);
}
,{
	"./$.is-object":37,"./$.object-sap":52}
],144:[function(require,module,exports){
	// 19.1.3.10 Object.is(value1,value2)var $def = require('./$.def');
	$def($def.S,'Object',{
	is:require('./$.same')}
);
}
,{
	"./$.def":17,"./$.same":60}
],145:[function(require,module,exports){
	// 19.1.2.14 Object.keys(O)var toObject = require('./$.to-object');
	require('./$.object-sap')('keys',function($keys){
	return function keys(it){
	return $keys(toObject(it));
}
;
}
);
}
,{
	"./$.object-sap":52,"./$.to-object":79}
],146:[function(require,module,exports){
	// 19.1.2.15 Object.preventExtensions(O)var isObject = require('./$.is-object');
	require('./$.object-sap')('preventExtensions',function($preventExtensions){
	return function preventExtensions(it){
	return $preventExtensions && isObject(it) ? $preventExtensions(it):it;
}
;
}
);
}
,{
	"./$.is-object":37,"./$.object-sap":52}
],147:[function(require,module,exports){
	// 19.1.2.17 Object.seal(O)var isObject = require('./$.is-object');
	require('./$.object-sap')('seal',function($seal){
	return function seal(it){
	return $seal && isObject(it) ? $seal(it):it;
}
;
}
);
}
,{
	"./$.is-object":37,"./$.object-sap":52}
],148:[function(require,module,exports){
	// 19.1.3.19 Object.setPrototypeOf(O,proto)var $def = require('./$.def');
	$def($def.S,'Object',{
	setPrototypeOf:require('./$.set-proto').set}
);
}
,{
	"./$.def":17,"./$.set-proto":61}
],149:[function(require,module,exports){
	'use strict';
	// 19.1.3.6 Object.prototype.toString()var classof = require('./$.classof'),test ={
}
;
	test[require('./$.wks')('toStringTag')] = 'z';
	if(test + '' != '[object z]'){
	require('./$.redef')(Object.prototype,'toString',function toString(){
	return '[object ' + classof(this) + ']';
}
,true);
}
}
,{
	"./$.classof":9,"./$.redef":58,"./$.wks":82}
],150:[function(require,module,exports){
	'use strict';
	var $ = require('./$'),LIBRARY = require('./$.library'),global = require('./$.global'),ctx = require('./$.ctx'),classof = require('./$.classof'),$def = require('./$.def'),isObject = require('./$.is-object'),anObject = require('./$.an-object'),aFunction = require('./$.a-function'),strictNew = require('./$.strict-new'),forOf = require('./$.for-of'),setProto = require('./$.set-proto').set,same = require('./$.same'),species = require('./$.species'),SPECIES = require('./$.wks')('species'),speciesConstructor = require('./$.species-constructor'),RECORD = require('./$.uid')('record'),asap = require('./$.microtask'),PROMISE = 'Promise',process = global.process,isNode = classof(process) == 'process',P = global[PROMISE],Wrapper;
	var testResolve = function(sub){
	var test = new P(function(){
}
);
	if(sub)test.constructor = Object;
	return P.resolve(test) === test;
}
;
	var useNative = function(){
	var works = false;
	function P2(x){
	var self = new P(x);
	setProto(self,P2.prototype);
	return self;
}
try{
	works = P && P.resolve && testResolve();
	setProto(P2,P);
	P2.prototype = $.create(P.prototype,{
	constructor:{
	value:P2}
}
);
	// actual Firefox has broken subclass support,test that if(!(P2.resolve(5).then(function(){
}
) instanceof P2)){
	works = false;
}
// actual V8 bug,https://code.google.com/p/v8/issues/detail?id=4162 if(works && require('./$.support-desc')){
	var thenableThenGotten = false;
	P.resolve($.setDesc({
}
,'then',{
	get:function(){
	thenableThenGotten = true;
}
}
));
	works = thenableThenGotten;
}
}
catch(e){
	works = false;
}
return works;
}
();
	// helpersvar isPromise = function(it){
	return isObject(it) && (useNative ? classof(it) == 'Promise':RECORD in it);
}
;
	var sameConstructor = function(a,b){
	// library wrapper special case if(LIBRARY && a === P && b === Wrapper)return true;
	return same(a,b);
}
;
	var getConstructor = function(C){
	var S = anObject(C)[SPECIES];
	return S != undefined ? S:C;
}
;
	var isThenable = function(it){
	var then;
	return isObject(it) && typeof (then = it.then) == 'function' ? then:false;
}
;
	var notify = function(record,isReject){
	if(record.n)return;
	record.n = true;
	var chain = record.c;
	asap(function(){
	var value = record.v,ok = record.s == 1,i = 0;
	var run = function(react){
	var cb = ok ? react.ok:react.fail,ret,then;
	try{
	if(cb){
	if(!ok)record.h = true;
	ret = cb === true ? value:cb(value);
	if(ret === react.P){
	react.rej(TypeError('Promise-chain cycle'));
}
else if(then = isThenable(ret)){
	then.call(ret,react.res,react.rej);
}
else react.res(ret);
}
else react.rej(value);
}
catch(err){
	react.rej(err);
}
}
;
	while(chain.length > i)run(chain[i++]);
	// variable length - can't use forEach chain.length = 0;
	record.n = false;
	if(isReject)setTimeout(function(){
	var promise = record.p,handler,console;
	if(isUnhandled(promise)){
	if(isNode){
	process.emit('unhandledRejection',value,promise);
}
else if(handler = global.onunhandledrejection){
	handler({
	promise:promise,reason:value}
);
}
else if((console = global.console) && console.error){
	console.error('Unhandled promise rejection',value);
}
}
record.a = undefined;
}
,1);
}
);
}
;
	var isUnhandled = function(promise){
	var record = promise[RECORD],chain = record.a || record.c,i = 0,react;
	if(record.h)return false;
	while(chain.length > i){
	react = chain[i++];
	if(react.fail || !isUnhandled(react.P))return false;
}
return true;
}
;
	var $reject = function(value){
	var record = this;
	if(record.d)return;
	record.d = true;
	record = record.r || record;
	// unwrap record.v = value;
	record.s = 2;
	record.a = record.c.slice();
	notify(record,true);
}
;
	var $resolve = function(value){
	var record = this,then;
	if(record.d)return;
	record.d = true;
	record = record.r || record;
	// unwrap try{
	if(then = isThenable(value)){
	asap(function(){
	var wrapper ={
	r:record,d:false}
;
	// wrap try{
	then.call(value,ctx($resolve,wrapper,1),ctx($reject,wrapper,1));
}
catch(e){
	$reject.call(wrapper,e);
}
}
);
}
else{
	record.v = value;
	record.s = 1;
	notify(record,false);
}
}
catch(e){
	$reject.call({
	r:record,d:false}
,e);
	// wrap}
}
;
	// constructor polyfillif(!useNative){
	// 25.4.3.1 Promise(executor) P = function Promise(executor){
	aFunction(executor);
	var record ={
	p:strictNew(this,P,PROMISE),// <- promise c:[],// <- awaiting reactions a:undefined,// <- checked in isUnhandled reactions s:0,// <- state d:false,// <- done v:undefined,// <- value h:false,// <- handled rejection n:false // <- notify}
;
	this[RECORD] = record;
	try{
	executor(ctx($resolve,record,1),ctx($reject,record,1));
}
catch(err){
	$reject.call(record,err);
}
}
;
	require('./$.mix')(P.prototype,{
	// 25.4.5.3 Promise.prototype.then(onFulfilled,onRejected) then:function then(onFulfilled,onRejected){
	var react ={
	ok:typeof onFulfilled == 'function' ? onFulfilled:true,fail:typeof onRejected == 'function' ? onRejected:false}
;
	var promise = react.P = new (speciesConstructor(this,P))(function(res,rej){
	react.res = res;
	react.rej = rej;
}
);
	aFunction(react.res);
	aFunction(react.rej);
	var record = this[RECORD];
	record.c.push(react);
	if(record.a)record.a.push(react);
	if(record.s)notify(record,false);
	return promise;
}
,// 25.4.5.1 Promise.prototype.catch(onRejected) 'catch':function(onRejected){
	return this.then(undefined,onRejected);
}
}
);
}
// export$def($def.G + $def.W + $def.F * !useNative,{
	Promise:P}
);
	require('./$.tag')(P,PROMISE);
	species(P);
	species(Wrapper = require('./$.core')[PROMISE]);
	// statics$def($def.S + $def.F * !useNative,PROMISE,{
	// 25.4.4.5 Promise.reject(r) reject:function reject(r){
	return new this(function(res,rej){
	rej(r);
}
);
}
}
);
	$def($def.S + $def.F * (!useNative || testResolve(true)),PROMISE,{
	// 25.4.4.6 Promise.resolve(x) resolve:function resolve(x){
	return isPromise(x) && sameConstructor(x.constructor,this) ? x:new this(function(res){
	res(x);
}
);
}
}
);
	$def($def.S + $def.F * !(useNative && require('./$.iter-detect')(function(iter){
	P.all(iter)['catch'](function(){
}
);
}
)),PROMISE,{
	// 25.4.4.1 Promise.all(iterable) all:function all(iterable){
	var C = getConstructor(this),values = [];
	return new C(function(res,rej){
	forOf(iterable,false,values.push,values);
	var remaining = values.length,results = Array(remaining);
	if(remaining)$.each.call(values,function(promise,index){
	C.resolve(promise).then(function(value){
	results[index] = value;
	--remaining || res(results);
}
,rej);
}
);
	else res(results);
}
);
}
,// 25.4.4.4 Promise.race(iterable) race:function race(iterable){
	var C = getConstructor(this);
	return new C(function(res,rej){
	forOf(iterable,false,function(promise){
	C.resolve(promise).then(res,rej);
}
);
}
);
}
}
);
}
,{
	"./$":45,"./$.a-function":2,"./$.an-object":3,"./$.classof":9,"./$.core":15,"./$.ctx":16,"./$.def":17,"./$.for-of":26,"./$.global":28,"./$.is-object":37,"./$.iter-detect":42,"./$.library":47,"./$.microtask":49,"./$.mix":50,"./$.same":60,"./$.set-proto":61,"./$.species":65,"./$.species-constructor":64,"./$.strict-new":66,"./$.support-desc":72,"./$.tag":73,"./$.uid":80,"./$.wks":82}
],151:[function(require,module,exports){
	// 26.1.1 Reflect.apply(target,thisArgument,argumentsList)var $def = require('./$.def'),_apply = Function.apply;
	$def($def.S,'Reflect',{
	apply:function apply(target,thisArgument,argumentsList){
	return _apply.call(target,thisArgument,argumentsList);
}
}
);
}
,{
	"./$.def":17}
],152:[function(require,module,exports){
	// 26.1.2 Reflect.construct(target,argumentsList [,newTarget])var $ = require('./$'),$def = require('./$.def'),aFunction = require('./$.a-function'),anObject = require('./$.an-object'),isObject = require('./$.is-object'),bind = Function.bind || require('./$.core').Function.prototype.bind;
	// MS Edge supports only 2 arguments// FF Nightly sets third argument as `new.target`,but does not create `this` from it$def($def.S + $def.F * require('./$.fails')(function(){
	function F(){
}
return !(Reflect.construct(function(){
}
,[],F) instanceof F);
}
),'Reflect',{
	construct:function construct(Target,args /*,newTarget*/
){
	aFunction(Target);
	var newTarget = arguments.length < 3 ? Target:aFunction(arguments[2]);
	if(Target == newTarget){
	// w/o altered newTarget,optimization for 0-4 arguments if(args != undefined)switch(anObject(args).length){
	case 0:return new Target;
	case 1:return new Target(args[0]);
	case 2:return new Target(args[0],args[1]);
	case 3:return new Target(args[0],args[1],args[2]);
	case 4:return new Target(args[0],args[1],args[2],args[3]);
}
// w/o altered newTarget,lot of arguments case var $args = [null];
	$args.push.apply($args,args);
	return new (bind.apply(Target,$args));
}
// with altered newTarget,not support built-in constructors var proto = newTarget.prototype,instance = $.create(isObject(proto) ? proto:Object.prototype),result = Function.apply.call(Target,instance,args);
	return isObject(result) ? result:instance;
}
}
);
}
,{
	"./$":45,"./$.a-function":2,"./$.an-object":3,"./$.core":15,"./$.def":17,"./$.fails":23,"./$.is-object":37}
],153:[function(require,module,exports){
	// 26.1.3 Reflect.defineProperty(target,propertyKey,attributes)var $ = require('./$'),$def = require('./$.def'),anObject = require('./$.an-object');
	// MS Edge has broken Reflect.defineProperty - throwing instead of returning false$def($def.S + $def.F * require('./$.fails')(function(){
	Reflect.defineProperty($.setDesc({
}
,1,{
	value:1}
),1,{
	value:2}
);
}
),'Reflect',{
	defineProperty:function defineProperty(target,propertyKey,attributes){
	anObject(target);
	try{
	$.setDesc(target,propertyKey,attributes);
	return true;
}
catch(e){
	return false;
}
}
}
);
}
,{
	"./$":45,"./$.an-object":3,"./$.def":17,"./$.fails":23}
],154:[function(require,module,exports){
	// 26.1.4 Reflect.deleteProperty(target,propertyKey)var $def = require('./$.def'),getDesc = require('./$').getDesc,anObject = require('./$.an-object');
	$def($def.S,'Reflect',{
	deleteProperty:function deleteProperty(target,propertyKey){
	var desc = getDesc(anObject(target),propertyKey);
	return desc && !desc.configurable ? false:delete target[propertyKey];
}
}
);
}
,{
	"./$":45,"./$.an-object":3,"./$.def":17}
],155:[function(require,module,exports){
	'use strict';
	// 26.1.5 Reflect.enumerate(target)var $def = require('./$.def'),anObject = require('./$.an-object');
	var Enumerate = function(iterated){
	this._t = anObject(iterated);
	// target this._i = 0;
	// next index var keys = this._k = [] // keys,key;
	for(key in iterated)keys.push(key);
}
;
	require('./$.iter-create')(Enumerate,'Object',function(){
	var that = this,keys = that._k,key;
	do{
	if(that._i >= keys.length)return{
	value:undefined,done:true}
;
}
while(!((key = keys[that._i++]) in that._t));
	return{
	value:key,done:false}
;
}
);
	$def($def.S,'Reflect',{
	enumerate:function enumerate(target){
	return new Enumerate(target);
}
}
);
}
,{
	"./$.an-object":3,"./$.def":17,"./$.iter-create":40}
],156:[function(require,module,exports){
	// 26.1.7 Reflect.getOwnPropertyDescriptor(target,propertyKey)var $ = require('./$'),$def = require('./$.def'),anObject = require('./$.an-object');
	$def($def.S,'Reflect',{
	getOwnPropertyDescriptor:function getOwnPropertyDescriptor(target,propertyKey){
	return $.getDesc(anObject(target),propertyKey);
}
}
);
}
,{
	"./$":45,"./$.an-object":3,"./$.def":17}
],157:[function(require,module,exports){
	// 26.1.8 Reflect.getPrototypeOf(target)var $def = require('./$.def'),getProto = require('./$').getProto,anObject = require('./$.an-object');
	$def($def.S,'Reflect',{
	getPrototypeOf:function getPrototypeOf(target){
	return getProto(anObject(target));
}
}
);
}
,{
	"./$":45,"./$.an-object":3,"./$.def":17}
],158:[function(require,module,exports){
	// 26.1.6 Reflect.get(target,propertyKey [,receiver])var $ = require('./$'),has = require('./$.has'),$def = require('./$.def'),isObject = require('./$.is-object'),anObject = require('./$.an-object');
	function get(target,propertyKey/*,receiver*/
){
	var receiver = arguments.length < 3 ? target:arguments[2],desc,proto;
	if(anObject(target) === receiver)return target[propertyKey];
	if(desc = $.getDesc(target,propertyKey))return has(desc,'value') ? desc.value:desc.get !== undefined ? desc.get.call(receiver):undefined;
	if(isObject(proto = $.getProto(target)))return get(proto,propertyKey,receiver);
}
$def($def.S,'Reflect',{
	get:get}
);
}
,{
	"./$":45,"./$.an-object":3,"./$.def":17,"./$.has":29,"./$.is-object":37}
],159:[function(require,module,exports){
	// 26.1.9 Reflect.has(target,propertyKey)var $def = require('./$.def');
	$def($def.S,'Reflect',{
	has:function has(target,propertyKey){
	return propertyKey in target;
}
}
);
}
,{
	"./$.def":17}
],160:[function(require,module,exports){
	// 26.1.10 Reflect.isExtensible(target)var $def = require('./$.def'),anObject = require('./$.an-object'),$isExtensible = Object.isExtensible;
	$def($def.S,'Reflect',{
	isExtensible:function isExtensible(target){
	anObject(target);
	return $isExtensible ? $isExtensible(target):true;
}
}
);
}
,{
	"./$.an-object":3,"./$.def":17}
],161:[function(require,module,exports){
	// 26.1.11 Reflect.ownKeys(target)var $def = require('./$.def');
	$def($def.S,'Reflect',{
	ownKeys:require('./$.own-keys')}
);
}
,{
	"./$.def":17,"./$.own-keys":54}
],162:[function(require,module,exports){
	// 26.1.12 Reflect.preventExtensions(target)var $def = require('./$.def'),anObject = require('./$.an-object'),$preventExtensions = Object.preventExtensions;
	$def($def.S,'Reflect',{
	preventExtensions:function preventExtensions(target){
	anObject(target);
	try{
	if($preventExtensions)$preventExtensions(target);
	return true;
}
catch(e){
	return false;
}
}
}
);
}
,{
	"./$.an-object":3,"./$.def":17}
],163:[function(require,module,exports){
	// 26.1.14 Reflect.setPrototypeOf(target,proto)var $def = require('./$.def'),setProto = require('./$.set-proto');
	if(setProto)$def($def.S,'Reflect',{
	setPrototypeOf:function setPrototypeOf(target,proto){
	setProto.check(target,proto);
	try{
	setProto.set(target,proto);
	return true;
}
catch(e){
	return false;
}
}
}
);
}
,{
	"./$.def":17,"./$.set-proto":61}
],164:[function(require,module,exports){
	// 26.1.13 Reflect.set(target,propertyKey,V [,receiver])var $ = require('./$'),has = require('./$.has'),$def = require('./$.def'),createDesc = require('./$.property-desc'),anObject = require('./$.an-object'),isObject = require('./$.is-object');
	function set(target,propertyKey,V/*,receiver*/
){
	var receiver = arguments.length < 4 ? target:arguments[3],ownDesc = $.getDesc(anObject(target),propertyKey),existingDescriptor,proto;
	if(!ownDesc){
	if(isObject(proto = $.getProto(target))){
	return set(proto,propertyKey,V,receiver);
}
ownDesc = createDesc(0);
}
if(has(ownDesc,'value')){
	if(ownDesc.writable === false || !isObject(receiver))return false;
	existingDescriptor = $.getDesc(receiver,propertyKey) || createDesc(0);
	existingDescriptor.value = V;
	$.setDesc(receiver,propertyKey,existingDescriptor);
	return true;
}
return ownDesc.set === undefined ? false:(ownDesc.set.call(receiver,V),true);
}
$def($def.S,'Reflect',{
	set:set}
);
}
,{
	"./$":45,"./$.an-object":3,"./$.def":17,"./$.has":29,"./$.is-object":37,"./$.property-desc":57}
],165:[function(require,module,exports){
	var $ = require('./$'),global = require('./$.global'),isRegExp = require('./$.is-regexp'),$flags = require('./$.flags'),$RegExp = global.RegExp,Base = $RegExp,proto = $RegExp.prototype,re1 = /a/g,re2 = /a/g // "new" creates a new object,old webkit buggy here,CORRECT_NEW = new $RegExp(re1) !== re1;
	if(require('./$.support-desc') && (!CORRECT_NEW || require('./$.fails')(function(){
	re2[require('./$.wks')('match')] = false;
	// RegExp constructor can alter flags and IsRegExp works correct with @@match return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1,'i') != '/a/i';
}
))){
	$RegExp = function RegExp(p,f){
	var piRE = isRegExp(p),fiU = f === undefined;
	return !(this instanceof $RegExp) && piRE && p.constructor === $RegExp && fiU ? p:CORRECT_NEW ? new Base(piRE && !fiU ? p.source:p,f):Base((piRE = p instanceof $RegExp) ? p.source:p,piRE && fiU ? $flags.call(p):f);
}
;
	$.each.call($.getNames(Base),function(key){
	key in $RegExp || $.setDesc($RegExp,key,{
	configurable:true,get:function(){
	return Base[key];
}
,set:function(it){
	Base[key] = it;
}
}
);
}
);
	proto.constructor = $RegExp;
	$RegExp.prototype = proto;
	require('./$.redef')(global,'RegExp',$RegExp);
}
require('./$.species')($RegExp);
}
,{
	"./$":45,"./$.fails":23,"./$.flags":25,"./$.global":28,"./$.is-regexp":38,"./$.redef":58,"./$.species":65,"./$.support-desc":72,"./$.wks":82}
],166:[function(require,module,exports){
	// 21.2.5.3 get RegExp.prototype.flags()var $ = require('./$');
	if(require('./$.support-desc') && /./g.flags != 'g')$.setDesc(RegExp.prototype,'flags',{
	configurable:true,get:require('./$.flags')}
);
}
,{
	"./$":45,"./$.flags":25,"./$.support-desc":72}
],167:[function(require,module,exports){
	// @@match logicrequire('./$.fix-re-wks')('match',1,function(defined,MATCH){
	// 21.1.3.11 String.prototype.match(regexp) return function match(regexp){
	'use strict';
	var O = defined(this),fn = regexp == undefined ? undefined:regexp[MATCH];
	return fn !== undefined ? fn.call(regexp,O):new RegExp(regexp)[MATCH](String(O));
}
;
}
);
}
,{
	"./$.fix-re-wks":24}
],168:[function(require,module,exports){
	// @@replace logicrequire('./$.fix-re-wks')('replace',2,function(defined,REPLACE,$replace){
	// 21.1.3.14 String.prototype.replace(searchValue,replaceValue) return function replace(searchValue,replaceValue){
	'use strict';
	var O = defined(this),fn = searchValue == undefined ? undefined:searchValue[REPLACE];
	return fn !== undefined ? fn.call(searchValue,O,replaceValue):$replace.call(String(O),searchValue,replaceValue);
}
;
}
);
}
,{
	"./$.fix-re-wks":24}
],169:[function(require,module,exports){
	// @@search logicrequire('./$.fix-re-wks')('search',1,function(defined,SEARCH){
	// 21.1.3.15 String.prototype.search(regexp) return function search(regexp){
	'use strict';
	var O = defined(this),fn = regexp == undefined ? undefined:regexp[SEARCH];
	return fn !== undefined ? fn.call(regexp,O):new RegExp(regexp)[SEARCH](String(O));
}
;
}
);
}
,{
	"./$.fix-re-wks":24}
],170:[function(require,module,exports){
	// @@split logicrequire('./$.fix-re-wks')('split',2,function(defined,SPLIT,$split){
	// 21.1.3.17 String.prototype.split(separator,limit) return function split(separator,limit){
	'use strict';
	var O = defined(this),fn = separator == undefined ? undefined:separator[SPLIT];
	return fn !== undefined ? fn.call(separator,O,limit):$split.call(String(O),separator,limit);
}
;
}
);
}
,{
	"./$.fix-re-wks":24}
],171:[function(require,module,exports){
	'use strict';
	var strong = require('./$.collection-strong');
	// 23.2 Set Objectsrequire('./$.collection')('Set',function(get){
	return function Set(){
	return get(this,arguments.length > 0 ? arguments[0]:undefined);
}
;
}
,{
	// 23.2.3.1 Set.prototype.add(value) add:function add(value){
	return strong.def(this,value = value === 0 ? 0:value,value);
}
}
,strong);
}
,{
	"./$.collection":14,"./$.collection-strong":11}
],172:[function(require,module,exports){
	'use strict';
	var $def = require('./$.def'),$at = require('./$.string-at')(false);
	$def($def.P,'String',{
	// 21.1.3.3 String.prototype.codePointAt(pos) codePointAt:function codePointAt(pos){
	return $at(this,pos);
}
}
);
}
,{
	"./$.def":17,"./$.string-at":67}
],173:[function(require,module,exports){
	// 21.1.3.6 String.prototype.endsWith(searchString [,endPosition])'use strict';
	var $def = require('./$.def'),toLength = require('./$.to-length'),context = require('./$.string-context'),ENDS_WITH = 'endsWith',$endsWith = ''[ENDS_WITH];
	$def($def.P + $def.F * require('./$.fails-is-regexp')(ENDS_WITH),'String',{
	endsWith:function endsWith(searchString /*,endPosition = @length */
){
	var that = context(this,searchString,ENDS_WITH),$$ = arguments,endPosition = $$.length > 1 ? $$[1]:undefined,len = toLength(that.length),end = endPosition === undefined ? len:Math.min(toLength(endPosition),len),search = String(searchString);
	return $endsWith ? $endsWith.call(that,search,end):that.slice(end - search.length,end) === search;
}
}
);
}
,{
	"./$.def":17,"./$.fails-is-regexp":22,"./$.string-context":68,"./$.to-length":78}
],174:[function(require,module,exports){
	var $def = require('./$.def'),toIndex = require('./$.to-index'),fromCharCode = String.fromCharCode,$fromCodePoint = String.fromCodePoint;
	// length should be 1,old FF problem$def($def.S + $def.F * (!!$fromCodePoint && $fromCodePoint.length != 1),'String',{
	// 21.1.2.2 String.fromCodePoint(...codePoints) fromCodePoint:function fromCodePoint(x){
	// eslint-disable-line no-unused-vars var res = [],$$ = arguments,$$len = $$.length,i = 0,code;
	while($$len > i){
	code = +$$[i++];
	if(toIndex(code,0x10ffff) !== code)throw RangeError(code + ' is not a valid code point');
	res.push(code < 0x10000 ? fromCharCode(code):fromCharCode(((code -= 0x10000) >> 10) + 0xd800,code % 0x400 + 0xdc00) );
}
return res.join('');
}
}
);
}
,{
	"./$.def":17,"./$.to-index":75}
],175:[function(require,module,exports){
	// 21.1.3.7 String.prototype.includes(searchString,position = 0)'use strict';
	var $def = require('./$.def'),context = require('./$.string-context'),INCLUDES = 'includes';
	$def($def.P + $def.F * require('./$.fails-is-regexp')(INCLUDES),'String',{
	includes:function includes(searchString /*,position = 0 */
){
	return !!~context(this,searchString,INCLUDES).indexOf(searchString,arguments.length > 1 ? arguments[1]:undefined);
}
}
);
}
,{
	"./$.def":17,"./$.fails-is-regexp":22,"./$.string-context":68}
],176:[function(require,module,exports){
	'use strict';
	var $at = require('./$.string-at')(true);
	// 21.1.3.27 String.prototype[@@iterator]()require('./$.iter-define')(String,'String',function(iterated){
	this._t = String(iterated);
	// target this._i = 0;
	// next index// 21.1.5.2.1 %StringIteratorPrototype%.next()}
,function(){
	var O = this._t,index = this._i,point;
	if(index >= O.length)return{
	value:undefined,done:true}
;
	point = $at(O,index);
	this._i += point.length;
	return{
	value:point,done:false}
;
}
);
}
,{
	"./$.iter-define":41,"./$.string-at":67}
],177:[function(require,module,exports){
	var $def = require('./$.def'),toIObject = require('./$.to-iobject'),toLength = require('./$.to-length');
	$def($def.S,'String',{
	// 21.1.2.4 String.raw(callSite,...substitutions) raw:function raw(callSite){
	var tpl = toIObject(callSite.raw),len = toLength(tpl.length),$$ = arguments,$$len = $$.length,res = [],i = 0;
	while(len > i){
	res.push(String(tpl[i++]));
	if(i < $$len)res.push(String($$[i]));
}
return res.join('');
}
}
);
}
,{
	"./$.def":17,"./$.to-iobject":77,"./$.to-length":78}
],178:[function(require,module,exports){
	var $def = require('./$.def');
	$def($def.P,'String',{
	// 21.1.3.13 String.prototype.repeat(count) repeat:require('./$.string-repeat')}
);
}
,{
	"./$.def":17,"./$.string-repeat":70}
],179:[function(require,module,exports){
	// 21.1.3.18 String.prototype.startsWith(searchString [,position ])'use strict';
	var $def = require('./$.def'),toLength = require('./$.to-length'),context = require('./$.string-context'),STARTS_WITH = 'startsWith',$startsWith = ''[STARTS_WITH];
	$def($def.P + $def.F * require('./$.fails-is-regexp')(STARTS_WITH),'String',{
	startsWith:function startsWith(searchString /*,position = 0 */
){
	var that = context(this,searchString,STARTS_WITH),$$ = arguments,index = toLength(Math.min($$.length > 1 ? $$[1]:undefined,that.length)),search = String(searchString);
	return $startsWith ? $startsWith.call(that,search,index):that.slice(index,index + search.length) === search;
}
}
);
}
,{
	"./$.def":17,"./$.fails-is-regexp":22,"./$.string-context":68,"./$.to-length":78}
],180:[function(require,module,exports){
	'use strict';
	// 21.1.3.25 String.prototype.trim()require('./$.string-trim')('trim',function($trim){
	return function trim(){
	return $trim(this,3);
}
;
}
);
}
,{
	"./$.string-trim":71}
],181:[function(require,module,exports){
	'use strict';
	// ECMAScript 6 symbols shimvar $ = require('./$'),global = require('./$.global'),has = require('./$.has'),SUPPORT_DESC = require('./$.support-desc'),$def = require('./$.def'),$redef = require('./$.redef'),$fails = require('./$.fails'),shared = require('./$.shared'),setTag = require('./$.tag'),uid = require('./$.uid'),wks = require('./$.wks'),keyOf = require('./$.keyof'),$names = require('./$.get-names'),enumKeys = require('./$.enum-keys'),isArray = require('./$.is-array'),anObject = require('./$.an-object'),toIObject = require('./$.to-iobject'),createDesc = require('./$.property-desc'),getDesc = $.getDesc,setDesc = $.setDesc,_create = $.create,getNames = $names.get,$Symbol = global.Symbol,$JSON = global.JSON,_stringify = $JSON && $JSON.stringify,setter = false,HIDDEN = wks('_hidden'),isEnum = $.isEnum,SymbolRegistry = shared('symbol-registry'),AllSymbols = shared('symbols'),useNative = typeof $Symbol == 'function',ObjectProto = Object.prototype;
	// fallback for old Android,https://code.google.com/p/v8/issues/detail?id=687var setSymbolDesc = SUPPORT_DESC && $fails(function(){
	return _create(setDesc({
}
,'a',{
	get:function(){
	return setDesc(this,'a',{
	value:7}
).a;
}
}
)).a != 7;
}
) ? function(it,key,D){
	var protoDesc = getDesc(ObjectProto,key);
	if(protoDesc)delete ObjectProto[key];
	setDesc(it,key,D);
	if(protoDesc && it !== ObjectProto)setDesc(ObjectProto,key,protoDesc);
}
:setDesc;
	var wrap = function(tag){
	var sym = AllSymbols[tag] = _create($Symbol.prototype);
	sym._k = tag;
	SUPPORT_DESC && setter && setSymbolDesc(ObjectProto,tag,{
	configurable:true,set:function(value){
	if(has(this,HIDDEN) && has(this[HIDDEN],tag))this[HIDDEN][tag] = false;
	setSymbolDesc(this,tag,createDesc(1,value));
}
}
);
	return sym;
}
;
	var isSymbol = function(it){
	return typeof it == 'symbol';
}
;
	var $defineProperty = function defineProperty(it,key,D){
	if(D && has(AllSymbols,key)){
	if(!D.enumerable){
	if(!has(it,HIDDEN))setDesc(it,HIDDEN,createDesc(1,{
}
));
	it[HIDDEN][key] = true;
}
else{
	if(has(it,HIDDEN) && it[HIDDEN][key])it[HIDDEN][key] = false;
	D = _create(D,{
	enumerable:createDesc(0,false)}
);
}
return setSymbolDesc(it,key,D);
}
return setDesc(it,key,D);
}
;
	var $defineProperties = function defineProperties(it,P){
	anObject(it);
	var keys = enumKeys(P = toIObject(P)),i = 0,l = keys.length,key;
	while(l > i)$defineProperty(it,key = keys[i++],P[key]);
	return it;
}
;
	var $create = function create(it,P){
	return P === undefined ? _create(it):$defineProperties(_create(it),P);
}
;
	var $propertyIsEnumerable = function propertyIsEnumerable(key){
	var E = isEnum.call(this,key);
	return E || !has(this,key) || !has(AllSymbols,key) || has(this,HIDDEN) && this[HIDDEN][key] ? E:true;
}
;
	var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it,key){
	var D = getDesc(it = toIObject(it),key);
	if(D && has(AllSymbols,key) && !(has(it,HIDDEN) && it[HIDDEN][key]))D.enumerable = true;
	return D;
}
;
	var $getOwnPropertyNames = function getOwnPropertyNames(it){
	var names = getNames(toIObject(it)),result = [],i = 0,key;
	while(names.length > i)if(!has(AllSymbols,key = names[i++]) && key != HIDDEN)result.push(key);
	return result;
}
;
	var $getOwnPropertySymbols = function getOwnPropertySymbols(it){
	var names = getNames(toIObject(it)),result = [],i = 0,key;
	while(names.length > i)if(has(AllSymbols,key = names[i++]))result.push(AllSymbols[key]);
	return result;
}
;
	var $stringify = function stringify(it){
	var args = [it],i = 1,$$ = arguments,replacer,$replacer;
	while($$.length > i)args.push($$[i++]);
	replacer = args[1];
	if(typeof replacer == 'function')$replacer = replacer;
	if($replacer || !isArray(replacer))replacer = function(key,value){
	if($replacer)value = $replacer.call(this,key,value);
	if(!isSymbol(value))return value;
}
;
	args[1] = replacer;
	return _stringify.apply($JSON,args);
}
;
	var buggyJSON = $fails(function(){
	var S = $Symbol();
	// MS Edge converts symbol values to JSON as{
}
// WebKit converts symbol values to JSON as null // V8 throws on boxed symbols return _stringify([S]) != '[null]' || _stringify({
	a:S}
) != '{
}
' || _stringify(Object(S)) != '{
}
';
}
);
	// 19.4.1.1 Symbol([description])if(!useNative){
	$Symbol = function Symbol(){
	if(isSymbol(this))throw TypeError('Symbol is not a constructor');
	return wrap(uid(arguments.length > 0 ? arguments[0]:undefined));
}
;
	$redef($Symbol.prototype,'toString',function toString(){
	return this._k;
}
);
	isSymbol = function(it){
	return it instanceof $Symbol;
}
;
	$.create = $create;
	$.isEnum = $propertyIsEnumerable;
	$.getDesc = $getOwnPropertyDescriptor;
	$.setDesc = $defineProperty;
	$.setDescs = $defineProperties;
	$.getNames = $names.get = $getOwnPropertyNames;
	$.getSymbols = $getOwnPropertySymbols;
	if(SUPPORT_DESC && !require('./$.library')){
	$redef(ObjectProto,'propertyIsEnumerable',$propertyIsEnumerable,true);
}
}
var symbolStatics ={
	// 19.4.2.1 Symbol.for(key) 'for':function(key){
	return has(SymbolRegistry,key += '') ? SymbolRegistry[key]:SymbolRegistry[key] = $Symbol(key);
}
,// 19.4.2.5 Symbol.keyFor(sym) keyFor:function keyFor(key){
	return keyOf(SymbolRegistry,key);
}
,useSetter:function(){
	setter = true;
}
,useSimple:function(){
	setter = false;
}
}
;
	// 19.4.2.2 Symbol.hasInstance// 19.4.2.3 Symbol.isConcatSpreadable// 19.4.2.4 Symbol.iterator// 19.4.2.6 Symbol.match// 19.4.2.8 Symbol.replace// 19.4.2.9 Symbol.search// 19.4.2.10 Symbol.species// 19.4.2.11 Symbol.split// 19.4.2.12 Symbol.toPrimitive// 19.4.2.13 Symbol.toStringTag// 19.4.2.14 Symbol.unscopables$.each.call(( 'hasInstance,isConcatSpreadable,iterator,match,replace,search,' + 'species,split,toPrimitive,toStringTag,unscopables').split(','),function(it){
	var sym = wks(it);
	symbolStatics[it] = useNative ? sym:wrap(sym);
}
);
	setter = true;
	$def($def.G + $def.W,{
	Symbol:$Symbol}
);
	$def($def.S,'Symbol',symbolStatics);
	$def($def.S + $def.F * !useNative,'Object',{
	// 19.1.2.2 Object.create(O [,Properties]) create:$create,// 19.1.2.4 Object.defineProperty(O,P,Attributes) defineProperty:$defineProperty,// 19.1.2.3 Object.defineProperties(O,Properties) defineProperties:$defineProperties,// 19.1.2.6 Object.getOwnPropertyDescriptor(O,P) getOwnPropertyDescriptor:$getOwnPropertyDescriptor,// 19.1.2.7 Object.getOwnPropertyNames(O) getOwnPropertyNames:$getOwnPropertyNames,// 19.1.2.8 Object.getOwnPropertySymbols(O) getOwnPropertySymbols:$getOwnPropertySymbols}
);
	// 24.3.2 JSON.stringify(value [,replacer [,space]])$JSON && $def($def.S + $def.F * (!useNative || buggyJSON),'JSON',{
	stringify:$stringify}
);
	// 19.4.3.5 Symbol.prototype[@@toStringTag]setTag($Symbol,'Symbol');
	// 20.2.1.9 Math[@@toStringTag]setTag(Math,'Math',true);
	// 24.3.3 JSON[@@toStringTag]setTag(global.JSON,'JSON',true);
}
,{
	"./$":45,"./$.an-object":3,"./$.def":17,"./$.enum-keys":20,"./$.fails":23,"./$.get-names":27,"./$.global":28,"./$.has":29,"./$.is-array":35,"./$.keyof":46,"./$.library":47,"./$.property-desc":57,"./$.redef":58,"./$.shared":62,"./$.support-desc":72,"./$.tag":73,"./$.to-iobject":77,"./$.uid":80,"./$.wks":82}
],182:[function(require,module,exports){
	'use strict';
	var $ = require('./$'),weak = require('./$.collection-weak'),isObject = require('./$.is-object'),has = require('./$.has'),frozenStore = weak.frozenStore,WEAK = weak.WEAK,isExtensible = Object.isExtensible || isObject,tmp ={
}
;
	// 23.3 WeakMap Objectsvar $WeakMap = require('./$.collection')('WeakMap',function(get){
	return function WeakMap(){
	return get(this,arguments.length > 0 ? arguments[0]:undefined);
}
;
}
,{
	// 23.3.3.3 WeakMap.prototype.get(key) get:function get(key){
	if(isObject(key)){
	if(!isExtensible(key))return frozenStore(this).get(key);
	if(has(key,WEAK))return key[WEAK][this._i];
}
}
,// 23.3.3.5 WeakMap.prototype.set(key,value) set:function set(key,value){
	return weak.def(this,key,value);
}
}
,weak,true,true);
	// IE11 WeakMap frozen keys fixif(new $WeakMap().set((Object.freeze || Object)(tmp),7).get(tmp) != 7){
	$.each.call(['delete','has','get','set'],function(key){
	var proto = $WeakMap.prototype,method = proto[key];
	require('./$.redef')(proto,key,function(a,b){
	// store frozen objects on leaky map if(isObject(a) && !isExtensible(a)){
	var result = frozenStore(this)[key](a,b);
	return key == 'set' ? this:result;
	// store all the rest on native weakmap}
return method.call(this,a,b);
}
);
}
);
}
}
,{
	"./$":45,"./$.collection":14,"./$.collection-weak":13,"./$.has":29,"./$.is-object":37,"./$.redef":58}
],183:[function(require,module,exports){
	'use strict';
	var weak = require('./$.collection-weak');
	// 23.4 WeakSet Objectsrequire('./$.collection')('WeakSet',function(get){
	return function WeakSet(){
	return get(this,arguments.length > 0 ? arguments[0]:undefined);
}
;
}
,{
	// 23.4.3.1 WeakSet.prototype.add(value) add:function add(value){
	return weak.def(this,value,true);
}
}
,weak,false,true);
}
,{
	"./$.collection":14,"./$.collection-weak":13}
],184:[function(require,module,exports){
	'use strict';
	var $def = require('./$.def'),$includes = require('./$.array-includes')(true);
	$def($def.P,'Array',{
	// https://github.com/domenic/Array.prototype.includes includes:function includes(el /*,fromIndex = 0 */
){
	return $includes(this,el,arguments.length > 1 ? arguments[1]:undefined);
}
}
);
	require('./$.unscope')('includes');
}
,{
	"./$.array-includes":6,"./$.def":17,"./$.unscope":81}
],185:[function(require,module,exports){
	// https://github.com/DavidBruant/Map-Set.prototype.toJSONvar $def = require('./$.def');
	$def($def.P,'Map',{
	toJSON:require('./$.collection-to-json')('Map')}
);
}
,{
	"./$.collection-to-json":12,"./$.def":17}
],186:[function(require,module,exports){
	// http://goo.gl/XkBrjDvar $def = require('./$.def'),$entries = require('./$.object-to-array')(true);
	$def($def.S,'Object',{
	entries:function entries(it){
	return $entries(it);
}
}
);
}
,{
	"./$.def":17,"./$.object-to-array":53}
],187:[function(require,module,exports){
	// https://gist.github.com/WebReflection/9353781var $ = require('./$'),$def = require('./$.def'),ownKeys = require('./$.own-keys'),toIObject = require('./$.to-iobject'),createDesc = require('./$.property-desc');
	$def($def.S,'Object',{
	getOwnPropertyDescriptors:function getOwnPropertyDescriptors(object){
	var O = toIObject(object),setDesc = $.setDesc,getDesc = $.getDesc,keys = ownKeys(O),result ={
}
,i = 0,key,D;
	while(keys.length > i){
	D = getDesc(O,key = keys[i++]);
	if(key in result)setDesc(result,key,createDesc(0,D));
	else result[key] = D;
}
return result;
}
}
);
}
,{
	"./$":45,"./$.def":17,"./$.own-keys":54,"./$.property-desc":57,"./$.to-iobject":77}
],188:[function(require,module,exports){
	// http://goo.gl/XkBrjDvar $def = require('./$.def'),$values = require('./$.object-to-array')(false);
	$def($def.S,'Object',{
	values:function values(it){
	return $values(it);
}
}
);
}
,{
	"./$.def":17,"./$.object-to-array":53}
],189:[function(require,module,exports){
	// https://github.com/benjamingr/RexExp.escapevar $def = require('./$.def'),$re = require('./$.replacer')(/[\\^$*+?.()|[\]{
}
]/g,'\\$&');
	$def($def.S,'RegExp',{
	escape:function escape(it){
	return $re(it);
}
}
);
}
,{
	"./$.def":17,"./$.replacer":59}
],190:[function(require,module,exports){
	// https://github.com/DavidBruant/Map-Set.prototype.toJSONvar $def = require('./$.def');
	$def($def.P,'Set',{
	toJSON:require('./$.collection-to-json')('Set')}
);
}
,{
	"./$.collection-to-json":12,"./$.def":17}
],191:[function(require,module,exports){
	// https://github.com/mathiasbynens/String.prototype.at'use strict';
	var $def = require('./$.def'),$at = require('./$.string-at')(true);
	$def($def.P,'String',{
	at:function at(pos){
	return $at(this,pos);
}
}
);
}
,{
	"./$.def":17,"./$.string-at":67}
],192:[function(require,module,exports){
	'use strict';
	var $def = require('./$.def'),$pad = require('./$.string-pad');
	$def($def.P,'String',{
	padLeft:function padLeft(maxLength /*,fillString = ' ' */
){
	return $pad(this,maxLength,arguments.length > 1 ? arguments[1]:undefined,true);
}
}
);
}
,{
	"./$.def":17,"./$.string-pad":69}
],193:[function(require,module,exports){
	'use strict';
	var $def = require('./$.def'),$pad = require('./$.string-pad');
	$def($def.P,'String',{
	padRight:function padRight(maxLength /*,fillString = ' ' */
){
	return $pad(this,maxLength,arguments.length > 1 ? arguments[1]:undefined,false);
}
}
);
}
,{
	"./$.def":17,"./$.string-pad":69}
],194:[function(require,module,exports){
	'use strict';
	// https://github.com/sebmarkbage/ecmascript-string-left-right-trimrequire('./$.string-trim')('trimLeft',function($trim){
	return function trimLeft(){
	return $trim(this,1);
}
;
}
);
}
,{
	"./$.string-trim":71}
],195:[function(require,module,exports){
	'use strict';
	// https://github.com/sebmarkbage/ecmascript-string-left-right-trimrequire('./$.string-trim')('trimRight',function($trim){
	return function trimRight(){
	return $trim(this,2);
}
;
}
);
}
,{
	"./$.string-trim":71}
],196:[function(require,module,exports){
	// JavaScript 1.6 / Strawman array statics shimvar $ = require('./$'),$def = require('./$.def'),$Array = require('./$.core').Array || Array,statics ={
}
;
	var setStatics = function(keys,length){
	$.each.call(keys.split(','),function(key){
	if(length == undefined && key in $Array)statics[key] = $Array[key];
	else if(key in [])statics[key] = require('./$.ctx')(Function.call,[][key],length);
}
);
}
;
	setStatics('pop,reverse,shift,keys,values,entries',1);
	setStatics('indexOf,every,some,forEach,map,filter,find,findIndex,includes',3);
	setStatics('join,slice,concat,push,splice,unshift,sort,lastIndexOf,' + 'reduce,reduceRight,copyWithin,fill');
	$def($def.S,'Array',statics);
}
,{
	"./$":45,"./$.core":15,"./$.ctx":16,"./$.def":17}
],197:[function(require,module,exports){
	require('./es6.array.iterator');
	var global = require('./$.global'),hide = require('./$.hide'),Iterators = require('./$.iterators'),ITERATOR = require('./$.wks')('iterator'),NL = global.NodeList,HTC = global.HTMLCollection,NLProto = NL && NL.prototype,HTCProto = HTC && HTC.prototype,ArrayValues = Iterators.NodeList = Iterators.HTMLCollection = Iterators.Array;
	if(NL && !(ITERATOR in NLProto))hide(NLProto,ITERATOR,ArrayValues);
	if(HTC && !(ITERATOR in HTCProto))hide(HTCProto,ITERATOR,ArrayValues);
}
,{
	"./$.global":28,"./$.hide":30,"./$.iterators":44,"./$.wks":82,"./es6.array.iterator":103}
],198:[function(require,module,exports){
	var $def = require('./$.def'),$task = require('./$.task');
	$def($def.G + $def.B,{
	setImmediate:$task.set,clearImmediate:$task.clear}
);
}
,{
	"./$.def":17,"./$.task":74}
],199:[function(require,module,exports){
	// ie9- setTimeout & setInterval additional parameters fixvar global = require('./$.global'),$def = require('./$.def'),invoke = require('./$.invoke'),partial = require('./$.partial'),navigator = global.navigator,MSIE = !!navigator && /MSIE .\./.test(navigator.userAgent);
	// <- dirty ie9- checkvar wrap = function(set){
	return MSIE ? function(fn,time /*,...args */
){
	return set(invoke( partial,[].slice.call(arguments,2),typeof fn == 'function' ? fn:Function(fn) ),time);
}
:set;
}
;
	$def($def.G + $def.B + $def.F * MSIE,{
	setTimeout:wrap(global.setTimeout),setInterval:wrap(global.setInterval)}
);
}
,{
	"./$.def":17,"./$.global":28,"./$.invoke":32,"./$.partial":55}
],200:[function(require,module,exports){
	require('./modules/es5');
	require('./modules/es6.symbol');
	require('./modules/es6.object.assign');
	require('./modules/es6.object.is');
	require('./modules/es6.object.set-prototype-of');
	require('./modules/es6.object.to-string');
	require('./modules/es6.object.freeze');
	require('./modules/es6.object.seal');
	require('./modules/es6.object.prevent-extensions');
	require('./modules/es6.object.is-frozen');
	require('./modules/es6.object.is-sealed');
	require('./modules/es6.object.is-extensible');
	require('./modules/es6.object.get-own-property-descriptor');
	require('./modules/es6.object.get-prototype-of');
	require('./modules/es6.object.keys');
	require('./modules/es6.object.get-own-property-names');
	require('./modules/es6.function.name');
	require('./modules/es6.function.has-instance');
	require('./modules/es6.number.constructor');
	require('./modules/es6.number.epsilon');
	require('./modules/es6.number.is-finite');
	require('./modules/es6.number.is-integer');
	require('./modules/es6.number.is-nan');
	require('./modules/es6.number.is-safe-integer');
	require('./modules/es6.number.max-safe-integer');
	require('./modules/es6.number.min-safe-integer');
	require('./modules/es6.number.parse-float');
	require('./modules/es6.number.parse-int');
	require('./modules/es6.math.acosh');
	require('./modules/es6.math.asinh');
	require('./modules/es6.math.atanh');
	require('./modules/es6.math.cbrt');
	require('./modules/es6.math.clz32');
	require('./modules/es6.math.cosh');
	require('./modules/es6.math.expm1');
	require('./modules/es6.math.fround');
	require('./modules/es6.math.hypot');
	require('./modules/es6.math.imul');
	require('./modules/es6.math.log10');
	require('./modules/es6.math.log1p');
	require('./modules/es6.math.log2');
	require('./modules/es6.math.sign');
	require('./modules/es6.math.sinh');
	require('./modules/es6.math.tanh');
	require('./modules/es6.math.trunc');
	require('./modules/es6.string.from-code-point');
	require('./modules/es6.string.raw');
	require('./modules/es6.string.trim');
	require('./modules/es6.string.iterator');
	require('./modules/es6.string.code-point-at');
	require('./modules/es6.string.ends-with');
	require('./modules/es6.string.includes');
	require('./modules/es6.string.repeat');
	require('./modules/es6.string.starts-with');
	require('./modules/es6.array.from');
	require('./modules/es6.array.of');
	require('./modules/es6.array.iterator');
	require('./modules/es6.array.species');
	require('./modules/es6.array.copy-within');
	require('./modules/es6.array.fill');
	require('./modules/es6.array.find');
	require('./modules/es6.array.find-index');
	require('./modules/es6.regexp.constructor');
	require('./modules/es6.regexp.flags');
	require('./modules/es6.regexp.match');
	require('./modules/es6.regexp.replace');
	require('./modules/es6.regexp.search');
	require('./modules/es6.regexp.split');
	require('./modules/es6.promise');
	require('./modules/es6.map');
	require('./modules/es6.set');
	require('./modules/es6.weak-map');
	require('./modules/es6.weak-set');
	require('./modules/es6.reflect.apply');
	require('./modules/es6.reflect.construct');
	require('./modules/es6.reflect.define-property');
	require('./modules/es6.reflect.delete-property');
	require('./modules/es6.reflect.enumerate');
	require('./modules/es6.reflect.get');
	require('./modules/es6.reflect.get-own-property-descriptor');
	require('./modules/es6.reflect.get-prototype-of');
	require('./modules/es6.reflect.has');
	require('./modules/es6.reflect.is-extensible');
	require('./modules/es6.reflect.own-keys');
	require('./modules/es6.reflect.prevent-extensions');
	require('./modules/es6.reflect.set');
	require('./modules/es6.reflect.set-prototype-of');
	require('./modules/es7.array.includes');
	require('./modules/es7.string.at');
	require('./modules/es7.string.pad-left');
	require('./modules/es7.string.pad-right');
	require('./modules/es7.string.trim-left');
	require('./modules/es7.string.trim-right');
	require('./modules/es7.regexp.escape');
	require('./modules/es7.object.get-own-property-descriptors');
	require('./modules/es7.object.values');
	require('./modules/es7.object.entries');
	require('./modules/es7.map.to-json');
	require('./modules/es7.set.to-json');
	require('./modules/js.array.statics');
	require('./modules/web.timers');
	require('./modules/web.immediate');
	require('./modules/web.dom.iterable');
	module.exports = require('./modules/$.core');
}
,{
	"./modules/$.core":15,"./modules/es5":97,"./modules/es6.array.copy-within":98,"./modules/es6.array.fill":99,"./modules/es6.array.find":101,"./modules/es6.array.find-index":100,"./modules/es6.array.from":102,"./modules/es6.array.iterator":103,"./modules/es6.array.of":104,"./modules/es6.array.species":105,"./modules/es6.function.has-instance":106,"./modules/es6.function.name":107,"./modules/es6.map":108,"./modules/es6.math.acosh":109,"./modules/es6.math.asinh":110,"./modules/es6.math.atanh":111,"./modules/es6.math.cbrt":112,"./modules/es6.math.clz32":113,"./modules/es6.math.cosh":114,"./modules/es6.math.expm1":115,"./modules/es6.math.fround":116,"./modules/es6.math.hypot":117,"./modules/es6.math.imul":118,"./modules/es6.math.log10":119,"./modules/es6.math.log1p":120,"./modules/es6.math.log2":121,"./modules/es6.math.sign":122,"./modules/es6.math.sinh":123,"./modules/es6.math.tanh":124,"./modules/es6.math.trunc":125,"./modules/es6.number.constructor":126,"./modules/es6.number.epsilon":127,"./modules/es6.number.is-finite":128,"./modules/es6.number.is-integer":129,"./modules/es6.number.is-nan":130,"./modules/es6.number.is-safe-integer":131,"./modules/es6.number.max-safe-integer":132,"./modules/es6.number.min-safe-integer":133,"./modules/es6.number.parse-float":134,"./modules/es6.number.parse-int":135,"./modules/es6.object.assign":136,"./modules/es6.object.freeze":137,"./modules/es6.object.get-own-property-descriptor":138,"./modules/es6.object.get-own-property-names":139,"./modules/es6.object.get-prototype-of":140,"./modules/es6.object.is":144,"./modules/es6.object.is-extensible":141,"./modules/es6.object.is-frozen":142,"./modules/es6.object.is-sealed":143,"./modules/es6.object.keys":145,"./modules/es6.object.prevent-extensions":146,"./modules/es6.object.seal":147,"./modules/es6.object.set-prototype-of":148,"./modules/es6.object.to-string":149,"./modules/es6.promise":150,"./modules/es6.reflect.apply":151,"./modules/es6.reflect.construct":152,"./modules/es6.reflect.define-property":153,"./modules/es6.reflect.delete-property":154,"./modules/es6.reflect.enumerate":155,"./modules/es6.reflect.get":158,"./modules/es6.reflect.get-own-property-descriptor":156,"./modules/es6.reflect.get-prototype-of":157,"./modules/es6.reflect.has":159,"./modules/es6.reflect.is-extensible":160,"./modules/es6.reflect.own-keys":161,"./modules/es6.reflect.prevent-extensions":162,"./modules/es6.reflect.set":164,"./modules/es6.reflect.set-prototype-of":163,"./modules/es6.regexp.constructor":165,"./modules/es6.regexp.flags":166,"./modules/es6.regexp.match":167,"./modules/es6.regexp.replace":168,"./modules/es6.regexp.search":169,"./modules/es6.regexp.split":170,"./modules/es6.set":171,"./modules/es6.string.code-point-at":172,"./modules/es6.string.ends-with":173,"./modules/es6.string.from-code-point":174,"./modules/es6.string.includes":175,"./modules/es6.string.iterator":176,"./modules/es6.string.raw":177,"./modules/es6.string.repeat":178,"./modules/es6.string.starts-with":179,"./modules/es6.string.trim":180,"./modules/es6.symbol":181,"./modules/es6.weak-map":182,"./modules/es6.weak-set":183,"./modules/es7.array.includes":184,"./modules/es7.map.to-json":185,"./modules/es7.object.entries":186,"./modules/es7.object.get-own-property-descriptors":187,"./modules/es7.object.values":188,"./modules/es7.regexp.escape":189,"./modules/es7.set.to-json":190,"./modules/es7.string.at":191,"./modules/es7.string.pad-left":192,"./modules/es7.string.pad-right":193,"./modules/es7.string.trim-left":194,"./modules/es7.string.trim-right":195,"./modules/js.array.statics":196,"./modules/web.dom.iterable":197,"./modules/web.immediate":198,"./modules/web.timers":199}
],201:[function(require,module,exports){
	"use strict";
	Object.defineProperty(exports,"__esModule",{
	value:true}
);
	exports["default"] = createCanvas;
	function createCanvas(width,height){
	var canvas = document.createElement("canvas");
	canvas.width = width;
	canvas.height = height;
	return canvas;
}
module.exports = exports["default"];
}
,{
}
],202:[function(require,module,exports){
	"use strict";
	Object.defineProperty(exports,"__esModule",{
	value:true}
);
	function _interopRequireWildcard(obj){
	if (obj && obj.__esModule){
	return obj;
}
else{
	var newObj ={
}
;
	if (obj != null){
	for (var key in obj){
	if (Object.prototype.hasOwnProperty.call(obj,key)) newObj[key] = obj[key];
}
}
newObj["default"] = obj;
	return newObj;
}
}
var _webgl = require("./webgl");
	var WebGL = _interopRequireWildcard(_webgl);
	function GL(canvas,options,vert,frag){
	this.init(canvas,options,vert,frag);
}
GL.prototype ={
	canvas:null,gl:null,program:null,width:0,height:0,init:function init(canvas,options,vert,frag){
	this.canvas = canvas;
	this.width = canvas.width;
	this.height = canvas.height;
	this.gl = WebGL.getContext(canvas,options);
	this.program = this.createProgram(vert,frag);
	this.useProgram(this.program);
}
,createProgram:function createProgram(vert,frag){
	var program = WebGL.createProgram(this.gl,vert,frag);
	// WebGL.createUniform(this.gl,program,"2f","resolution",this.canvas.width,this.canvas.height);
	// WebGL.createUniform(this.gl,program,"2f","pixel",1/this.canvas.width,1/this.canvas.height);
	return program;
}
,useProgram:function useProgram(program){
	this.program = program;
	this.gl.useProgram(program);
}
,createTexture:function createTexture(source,i){
	return WebGL.createTexture(this.gl,source,i);
}
,createUniform:function createUniform(type,name){
	for (var _len = arguments.length,v = Array(_len > 2 ? _len - 2:0),_key = 2;
	_key < _len;
	_key++){
	v[_key - 2] = arguments[_key];
}
WebGL.createUniform.apply(WebGL,[this.gl,this.program,type,name].concat(v));
}
,activeTexture:function activeTexture(i){
	WebGL.activeTexture(this.gl,i);
}
,updateTexture:function updateTexture(source){
	WebGL.updateTexture(this.gl,source);
}
,draw:function draw(){
	WebGL.setRectangle(this.gl,0,0,this.width,this.height);
	this.gl.drawArrays(this.gl.TRIANGLES,0,6);
}
}
;
	exports["default"] = GL;
	module.exports = exports["default"];
}
,{
	"./webgl":209}
],203:[function(require,module,exports){
	"use strict";
	Object.defineProperty(exports,"__esModule",{
	value:true}
);
	exports["default"] = ImageLoader;
	function loadImage(src,i,onLoad){
	return new Promise(function (resolve,reject){
	if (typeof src == "string"){
	src ={
	name:"image" + i,src:src}
;
}
var img = new Image();
	src.img = img;
	img.addEventListener("load",function (event){
	if (typeof onLoad == "function"){
	onLoad.call(null,img,i);
}
resolve(src);
}
);
	img.src = src.src;
}
);
}
function loadImages(images,onLoad){
	return Promise.all(images.map(function (src,i){
	return loadImage(src,i,onLoad);
}
));
}
function ImageLoader(images,onLoad){
	return new Promise(function (resolve,reject){
	loadImages(images,onLoad).then(function (loadedImages){
	var r ={
}
;
	loadedImages.forEach(function (curImage){
	r[curImage.name] ={
	img:curImage.img,src:curImage.src}
;
}
);
	resolve(r);
}
);
}
);
}
module.exports = exports["default"];
}
,{
}
],204:[function(require,module,exports){
	"use strict";
	function _interopRequireDefault(obj){
	return obj && obj.__esModule ? obj:{
	"default":obj}
;
}
require('core-js');
	var _webglLiquid = require("./webgl-liquid");
	var _webglLiquid2 = _interopRequireDefault(_webglLiquid);
	var _raindrops = require("./raindrops");
	var _raindrops2 = _interopRequireDefault(_raindrops);
	var _imageLoader = require("./image-loader");
	var _imageLoader2 = _interopRequireDefault(_imageLoader);
	var _createCanvas = require("./create-canvas");
	var _createCanvas2 = _interopRequireDefault(_createCanvas);
	//import * as shader from "./shaders/water.frag";
	var canvas = document.querySelector('#container');
	var dpi = 1 + (window.devicePixelRatio - 1) * 0.5;
	canvas.width = window.innerWidth;
	canvas.height = window.innerHeight;
	// canvas.style.width=window.innerWidth+"px";
	// canvas.style.height=window.innerHeight+"px";
	var r = new _raindrops2["default"](canvas.width,canvas.height);
	(0,_imageLoader2["default"])([{
	name:"shine",src:"img/shine6.png"}
,{
	name:"textureRain",src:"img/texture10.png"}
,{
	name:"textureRainBlur",src:"img/texture10-blur.png"}
,{
	name:"textureSun",src:"img/texture8-sun.png"}
,{
	name:"textureSunBlur",src:"img/texture8-sun-blur.png"}
]).then(function (images){
	var texture = (0,_createCanvas2["default"])(192 / 2,128 / 2);
	var textureCtx = texture.getContext('2d');
	var textureBlur = (0,_createCanvas2["default"])(384,256);
	var textureBlurCtx = textureBlur.getContext('2d');
	function generateTextures(){
	var sun = arguments.length <= 0 || arguments[0] === undefined ? 0:arguments[0];
	textureCtx.globalAlpha = 1;
	textureCtx.drawImage(images.textureRain.img,0,0,192 / 2,128 / 2);
	textureCtx.globalAlpha = sun;
	textureCtx.drawImage(images.textureSun.img,0,0,192 / 2,128 / 2);
	textureBlurCtx.globalAlpha = 1;
	textureBlurCtx.drawImage(images.textureRainBlur.img,0,0);
	textureBlurCtx.globalAlpha = sun;
	textureBlurCtx.drawImage(images.textureSunBlur.img,0,0);
}
generateTextures();
	var liquid = new _webglLiquid2["default"](canvas,r.canvas,images.shine.img,texture,textureBlur);
	var currentSun = 0;
	var transition = 0;
	canvas.addEventListener('click',function (event){
	r.raining = !r.raining;
	r.clearDrops();
	if (!r.raining){
	clearInterval(transition);
	transition = setInterval(function (){
	currentSun += 0.03;
	if (currentSun >= 1){
	currentSun = 1;
	clearTimeout(transition);
}
generateTextures(currentSun);
	liquid.updateTextures();
}
,33);
}
else{
	clearInterval(transition);
	transition = setInterval(function (){
	currentSun -= 0.03;
	if (currentSun <= 0){
	currentSun = 0;
	clearTimeout(transition);
}
generateTextures(currentSun);
	liquid.updateTextures();
}
,33);
}
}
);
	canvas.addEventListener('mousemove',function (event){
}
);
}
);
}
,{
	"./create-canvas":201,"./image-loader":203,"./raindrops":205,"./webgl-liquid":208,"core-js":1}
],205:[function(require,module,exports){
	"use strict";
	Object.defineProperty(exports,"__esModule",{
	value:true}
);
	function _interopRequireDefault(obj){
	return obj && obj.__esModule ? obj:{
	"default":obj}
;
}
var _imageLoader = require("./image-loader");
	var _imageLoader2 = _interopRequireDefault(_imageLoader);
	var _timesJs = require("./times.js");
	var _timesJs2 = _interopRequireDefault(_timesJs);
	var _createCanvasJs = require("./create-canvas.js");
	var _createCanvasJs2 = _interopRequireDefault(_createCanvasJs);
	var _random = require("./random");
	var minR = 10;
	var maxR = 40;
	var deltaR = maxR - minR;
	var dropSize = 64;
	var maxDrops = 800;
	var Drop ={
	x:0,y:0,r:0,spreadX:0,spreadY:0,momentum:0,momentumX:0,lastSpawn:0,nextSpawn:0,parent:null,isNew:true,killed:false,tension:0,shrink:0}
;
	function Raindrops(w,h){
	this.width = w;
	this.height = h;
	this.init();
}
Raindrops.prototype ={
	canvas:null,ctx:null,width:0,height:0,texture:null,textureCtx:null,texturePixelDensity:1,drops:null,dropsGfx:null,paintGfx:null,raining:true,lastRender:null,init:function init(){
	this.canvas = (0,_createCanvasJs2["default"])(this.width,this.height);
	this.ctx = this.canvas.getContext('2d');
	this.texture = (0,_createCanvasJs2["default"])(this.width * this.texturePixelDensity,this.height * this.texturePixelDensity);
	this.textureCtx = this.texture.getContext('2d');
	this.drops = [];
	this.newDrops = [];
	this.dropsGfx = [];
	this.renderDropsGfx();
}
,renderTexture:function renderTexture(){
	var _this = this;
	(0,_timesJs2["default"])(5000,function (i){
	_this.drawTextureDrop((0,_random.random)(_this.width),(0,_random.random)(_this.height),(0,_random.random)(2,4));
}
);
}
,drawTextureDrop:function drawTextureDrop(x,y,r){
	// this.textureCtx.globalCompositeOperation="normal";
	this.drawDrop(this.textureCtx,Object.assign(Object.create(Drop),{
	x:x * this.texturePixelDensity,y:y * this.texturePixelDensity,r:r * this.texturePixelDensity}
),true);
}
,renderDropsGfx:function renderDropsGfx(){
	var _this2 = this;
	(0,_imageLoader2["default"])([{
	name:'alpha',src:'img/drop4-alpha4.png'}
,{
	name:'color',src:'img/drop7.png'}
]).then(function (images){
	var dropBuffer = (0,_createCanvasJs2["default"])(dropSize,dropSize);
	var dropBufferCtx = dropBuffer.getContext('2d');
	_this2.dropsGfx = Array.apply(null,Array(255)).map(function (cur,i){
	var drop = (0,_createCanvasJs2["default"])(dropSize,dropSize);
	var dropCtx = drop.getContext('2d');
	dropBufferCtx.clearRect(0,0,dropSize,dropSize);
	// color dropBufferCtx.globalCompositeOperation = "normal";
	dropBufferCtx.drawImage(images.color.img,0,0,dropSize,dropSize);
	// blue overlay,for depth dropBufferCtx.globalCompositeOperation = "screen";
	dropBufferCtx.fillStyle = "rgba(0,0," + i + ",1)";
	dropBufferCtx.fillRect(0,0,dropSize,dropSize);
	// alpha dropCtx.globalCompositeOperation = "normal";
	dropCtx.drawImage(images.alpha.img,0,0,dropSize,dropSize);
	dropCtx.globalCompositeOperation = "source-in";
	dropCtx.drawImage(dropBuffer,0,0,dropSize,dropSize);
	return drop;
}
);
	_this2.paintGfx = (0,_createCanvasJs2["default"])(128,128);
	var paintCtx = _this2.paintGfx.getContext("2d");
	paintCtx.fillStyle = "#000";
	paintCtx.beginPath();
	paintCtx.arc(64,64,64,0,Math.PI * 2);
	paintCtx.fill();
	_this2.renderTexture();
	(0,_timesJs2["default"])(100,function (i){
	_this2.drops.push(_this2.createDrop({
	x:(0,_random.random)(_this2.width),y:(0,_random.random)(_this2.height),r:(0,_random.random)(minR,maxR,function (n){
	return n * n * n;
}
)}
));
}
);
	_this2.update();
}
);
}
,drawDrop:function drawDrop(ctx,drop){
	var normalBlend = arguments.length <= 2 || arguments[2] === undefined ? false:arguments[2];
	if (this.dropsGfx.length > 0){
	var x = drop.x;
	var y = drop.y;
	var r = drop.r;
	var spreadX = drop.spreadX;
	var spreadY = drop.spreadY;
	var scaleX = 1;
	var scaleY = 1.5;
	var d = Math.max(0,Math.min(1,(r - minR) / deltaR * 0.9));
	d *= 1 / ((drop.spreadX + drop.spreadY) * 0.5 + 1);
	ctx.globalAlpha = 1;
	ctx.globalCompositeOperation = normalBlend ? "normal":"normal";
	d = Math.floor(d * (this.dropsGfx.length - 1));
	ctx.drawImage(this.dropsGfx[d],x - r * scaleX * (spreadX + 1),y - r * scaleY * (spreadY + 1),r * 2 * scaleX * (spreadX + 1),r * 2 * scaleY * (spreadY + 1));
}
}
,paint:function paint(x,y){
	var r = arguments.length <= 2 || arguments[2] === undefined ? 30:arguments[2];
	var ctx = this.textureCtx;
	ctx.globalCompositeOperation = "destination-out";
	ctx.drawImage(this.paintGfx,(x - r) * this.texturePixelDensity,(y - r) * this.texturePixelDensity,r * 2 * this.texturePixelDensity,r * 2 * this.texturePixelDensity * 1.5);
}
,clearCanvas:function clearCanvas(){
	this.ctx.clearRect(0,0,this.width,this.height);
}
,createDrop:function createDrop(options){
	if (this.drops.length >= maxDrops) return null;
	return Object.assign(Object.create(Drop),options);
}
,updateRain:function updateRain(){
	var rainDrops = [];
	if (this.raining){
	var limit = 3;
	var count = 0;
	while ((0,_random.chance)(0.3) && count < limit){
	count++;
	// let r=(minR*0.5)+(Math.pow(Math.random(),3)*(deltaR));
	var r = (0,_random.random)(minR,maxR,function (n){
	return Math.pow(n,3);
}
);
	var rainDrop = this.createDrop({
	x:(0,_random.random)(this.width),y:(0,_random.random)(this.height) - 100,r:r,momentum:1 + (r - minR) * 0.3 + (0,_random.random)(2),spreadX:1.5,spreadY:1.5}
);
	if (rainDrop != null){
	rainDrops.push(rainDrop);
}
}
}
return rainDrops;
}
,clearDrops:function clearDrops(){
	this.drops.forEach(function (drop){
	setTimeout(function (){
	drop.shrink = 0.1 + Math.random() * 0.5;
}
,Math.random() * 1200);
}
);
}
,updateTexture:function updateTexture(){
	var _this3 = this;
	this.ctx.drawImage(this.texture,0,0,this.width,this.height);
	if (this.raining){
	(0,_timesJs2["default"])(50,function (i){
	_this3.drawTextureDrop((0,_random.random)(_this3.width),(0,_random.random)(_this3.height),(0,_random.random)(1.5,4));
}
);
}
}
,updateDrops:function updateDrops(timeScale){
	var _this4 = this;
	var newDrops = [];
	var rainDrops = this.updateRain();
	newDrops = newDrops.concat(rainDrops);
	this.drops.sort(function (a,b){
	var va = a.y * _this4.width + a.x;
	var vb = b.y * _this4.width + b.x;
	return va > vb ? 1:va == vb ? 0:-1;
}
);
	this.drops.forEach(function (drop,i){
	if (!drop.killed){
	// update gravity if ((0,_random.chance)((drop.r - minR) * (0.1 / deltaR) * timeScale)){
	drop.momentum += (0,_random.random)(drop.r / maxR * 4);
}
// clean small drops if (drop.r <= minR && (0,_random.chance)(0.05 * timeScale)){
	drop.shrink += 0.01;
}
//update shrinkage drop.r -= drop.shrink * timeScale;
	if (drop.r <= 0) drop.killed = true;
	// update trails drop.lastSpawn += drop.momentum * timeScale;
	if (drop.lastSpawn > drop.nextSpawn){
	var trailDrop = this.createDrop({
	x:drop.x + (0,_random.random)(-drop.r,drop.r) * 0.1,y:drop.y - drop.r * 0.1,r:drop.r * (0,_random.random)(0.2,0.5),spreadY:drop.momentum * 0.1,parent:drop}
);
	if (trailDrop != null){
	newDrops.push(trailDrop);
	drop.r *= Math.pow(0.97,timeScale);
	drop.lastSpawn = 0;
	drop.nextSpawn = (0,_random.random)(minR,maxR) - drop.momentum * 2 + (maxR - drop.r);
}
}
//normalize spread drop.spreadX *= Math.pow(0.4,timeScale);
	drop.spreadY *= Math.pow(0.7,timeScale);
	//update position var moved = drop.momentum > 0;
	if (moved && !drop.killed){
	drop.y += drop.momentum * timeScale;
	drop.x += drop.momentumX * timeScale;
	if (drop.y > this.height + drop.r){
	drop.killed = true;
}
}
// collision var checkCollision = (moved || drop.isNew) && !drop.killed;
	drop.isNew = false;
	if (checkCollision){
	this.drops.slice(i + 1,i + 70).forEach(function (drop2){
	//basic check if (drop != drop2 && drop.r > drop2.r && drop.parent != drop2 && drop2.parent != drop && !drop2.killed){
	var dx = drop2.x - drop.x;
	var dy = drop2.y - drop.y;
	var d = Math.sqrt(dx * dx + dy * dy);
	//if it's within acceptable distance if (d < (drop.r + drop2.r) * (0.65 + drop.momentum * 0.01)){
	var pi = Math.PI;
	var r1 = drop.r;
	var r2 = drop2.r;
	var a1 = pi * (r1 * r1);
	var a2 = pi * (r2 * r2);
	var targetR = Math.sqrt((a1 + a2 * 0.8) / pi);
	if (targetR > maxR){
	targetR = maxR;
}
drop.r = targetR;
	drop.momentumX += dx * 0.1;
	drop.spreadX = 0;
	drop.spreadY = 0;
	drop2.killed = true;
	drop.momentum = Math.max(drop2.momentum,Math.min(40,drop.momentum + targetR * 0.04 + 1));
}
}
}
);
}
//slowdown momentum drop.momentum -= Math.max(1,minR * 0.5 - drop.momentum) * 0.1 * timeScale;
	if (drop.momentum < 0) drop.momentum = 0;
	drop.momentumX *= Math.pow(0.7,timeScale);
	if (!drop.killed){
	newDrops.push(drop);
	if (moved) this.paint(drop.x,drop.y,drop.r * 0.45);
	this.drawDrop(this.ctx,drop);
}
}
}
,this);
	this.drops = newDrops;
}
,update:function update(){
	this.clearCanvas();
	this.updateTexture();
	var now = Date.now();
	if (this.lastRender == null) this.lastRender = now;
	var deltaT = now - this.lastRender;
	var timeScale = deltaT / (1 / 60 * 1000);
	this.lastRender = now;
	this.updateDrops(timeScale);
	requestAnimationFrame(this.update.bind(this));
}
}
;
	exports["default"] = Raindrops;
	module.exports = exports["default"];
}
,{
	"./create-canvas.js":201,"./image-loader":203,"./random":206,"./times.js":207}
],206:[function(require,module,exports){
	"use strict";
	Object.defineProperty(exports,"__esModule",{
	value:true}
);
	exports.random = random;
	exports.chance = chance;
	function random(){
	var from = arguments.length <= 0 || arguments[0] === undefined ? null:arguments[0];
	var to = arguments.length <= 1 || arguments[1] === undefined ? null:arguments[1];
	var interpolation = arguments.length <= 2 || arguments[2] === undefined ? null:arguments[2];
	if (from == null){
	from = 0;
	to = 1;
}
else if (from != null && to == null){
	to = from;
	from = 0;
}
var delta = to - from;
	if (interpolation == null){
	interpolation = function (n){
	return n;
}
;
}
return from + interpolation(Math.random()) * delta;
}
function chance(c){
	return random() <= c;
}
}
,{
}
],207:[function(require,module,exports){
	"use strict";
	Object.defineProperty(exports,"__esModule",{
	value:true}
);
	exports["default"] = times;
	function times(n,f){
	for (var i = 0;
	i < n;
	i++){
	f.call(this,i);
}
}
module.exports = exports["default"];
}
,{
}
],208:[function(require,module,exports){
	"use strict";
	Object.defineProperty(exports,"__esModule",{
	value:true}
);
	function _interopRequireDefault(obj){
	return obj && obj.__esModule ? obj:{
	"default":obj}
;
}
function _interopRequireWildcard(obj){
	if (obj && obj.__esModule){
	return obj;
}
else{
	var newObj ={
}
;
	if (obj != null){
	for (var key in obj){
	if (Object.prototype.hasOwnProperty.call(obj,key)) newObj[key] = obj[key];
}
}
newObj["default"] = obj;
	return newObj;
}
}
var _webgl = require("./webgl");
	var WebGL = _interopRequireWildcard(_webgl);
	var _glObj = require("./gl-obj");
	var _glObj2 = _interopRequireDefault(_glObj);
	var _imageLoader = require("./image-loader");
	var _imageLoader2 = _interopRequireDefault(_imageLoader);
	var vertexShader = "#define GLSLIFY 1\nprecision mediump float;
	\n\nattribute vec2 a_position;
	\nattribute vec2 a_texCoord;
	\n\nuniform vec2 u_resolution;
	\n\nvarying vec2 v_texCoord;
	\nvarying vec2 v_resolution;
	\n\nvoid main(){
	\n // convert the rectangle from pixels to 0.0 to 1.0\n vec2 zeroToOne = a_position / u_resolution;
	\n\n // convert from 0->1 to 0->2\n vec2 zeroToTwo = zeroToOne * 2.0;
	\n\n // convert from 0->2 to -1->+1 (clipspace)\n vec2 clipSpace = zeroToTwo - 1.0;
	\n\n gl_Position = vec4(clipSpace * vec2(1,-1),0,1);
	\n\n // pass the texCoord to the fragment shader\n // The GPU will interpolate this value between points.\n v_texCoord = a_texCoord;
	\n v_resolution = u_resolution;
	\n}
\n";
	var fragShaderWater = "#define GLSLIFY 1\nprecision mediump float;
	\n\n// our texture\nuniform sampler2D u_liquid;
	\nuniform sampler2D u_shine;
	\nuniform sampler2D u_texture;
	\nuniform sampler2D u_textureBlur;
	\n\n// the texCoords passed in from the vertex shader.\nvarying vec2 v_texCoord;
	\nvarying vec2 v_resolution;
	\n\nvec4 blend(vec4 bg,vec4 fg){
	\n vec3 bgm=bg.rgb*bg.a;
	\n vec3 fgm=fg.rgb*fg.a;
	\n float ia=1.-fg.a;
	\n float a=(fg.a + bg.a * ia);
	\n vec3 rgb=(fgm + bgm * ia) / a;
	\n return vec4(rgb,a);
	\n}
\n\nvec3 mod289(vec3 x){
	\n return x - floor(x * (1.0 / 289.0)) * 289.0;
	\n}
\n\nvec2 mod289(vec2 x){
	\n return x - floor(x * (1.0 / 289.0)) * 289.0;
	\n}
\n\nvec3 permute(vec3 x){
	\n return mod289(((x*34.0)+1.0)*x);
	\n}
\n\nfloat snoise(vec2 v)\n{
	\n const vec4 C = vec4(0.211324865405187,// (3.0-sqrt(3.0))/6.0\n 0.366025403784439,// 0.5*(sqrt(3.0)-1.0)\n -0.577350269189626,// -1.0 + 2.0 * C.x\n 0.024390243902439);
	// 1.0 / 41.0\n// First corner\n vec2 i = floor(v + dot(v,C.yy) );
	\n vec2 x0 = v - i + dot(i,C.xx);
	\n\n// Other corners\n vec2 i1;
	\n //i1.x = step( x0.y,x0.x );
	// x0.x > x0.y ? 1.0:0.0\n //i1.y = 1.0 - i1.x;
	\n i1 = (x0.x > x0.y) ? vec2(1.0,0.0):vec2(0.0,1.0);
	\n // x0 = x0 - 0.0 + 0.0 * C.xx;
	\n // x1 = x0 - i1 + 1.0 * C.xx;
	\n // x2 = x0 - 1.0 + 2.0 * C.xx;
	\n vec4 x12 = x0.xyxy + C.xxzz;
	\n x12.xy -= i1;
	\n\n// Permutations\n i = mod289(i);
	// Avoid truncation effects in permutation\n vec3 p = permute( permute( i.y + vec3(0.0,i1.y,1.0 ))\n\t\t+ i.x + vec3(0.0,i1.x,1.0 ));
	\n\n vec3 m = max(0.5 - vec3(dot(x0,x0),dot(x12.xy,x12.xy),dot(x12.zw,x12.zw)),0.0);
	\n m = m*m;
	\n m = m*m;
	\n\n// Gradients:41 points uniformly over a line,mapped onto a diamond.\n// The ring size 17*17 = 289 is close to a multiple of 41 (41*7 = 287)\n\n vec3 x = 2.0 * fract(p * C.www) - 1.0;
	\n vec3 h = abs(x) - 0.5;
	\n vec3 ox = floor(x + 0.5);
	\n vec3 a0 = x - ox;
	\n\n// Normalise gradients implicitly by scaling m\n// Approximation of:m *= inversesqrt( a0*a0 + h*h );
	\n m *= 1.79284291400159 - 0.85373472095314 * ( a0*a0 + h*h );
	\n\n// Compute final noise value at P\n vec3 g;
	\n g.x = a0.x * x0.x + h.x * x0.y;
	\n g.yz = a0.yz * x12.xz + h.yz * x12.yw;
	\n return 130.0 * dot(m,g);
	\n}
\nvec2 texCoord(){
	\n return v_texCoord;
	//+((snoise(v_texCoord*1000.))*0.001);
	\n}
\nvec2 pixel(){
	\n return vec2(1.,1.)/v_resolution;
	\n}
\n\nvec4 offset(float x,float y){
	\n return texture2D(u_liquid,texCoord()+(pixel()*vec2(x,y)));
	\n}
\n\nvoid main(){
	\n\n vec4 center = offset(0.,0.);
	\n\n float d=center.b;
	\n float x=center.g;
	\n float y=center.r;
	\n\n float a=clamp(center.a*20.-5.,0.,1.);
	\n\n //d*=clamp(((1.-center.r)*3.)-0.4,0.,1.);
	\n\n vec2 texturePos=(vec2(x,y)-0.5)*2.;
	\n vec2 texturePos2=texCoord()+(pixel()*texturePos*(256.+(d*256.)));
	\n vec4 tex=texture2D(u_texture,texturePos2);
	\n\n //tex=vec4(x,y,0,1);
	\n // tex*=0.95+(min(1.,center.g*center.a*2.)*0.1);
	\n //tex*=0.95+(center.g*0.1);
	\n //tex=vec4(a,a,a,1);
	\n // tex=vec4(d,d,d,1);
	\n //if(texturePos2.x>1. || texturePos2.x<0. || texturePos2.y>1. || texturePos2.y<0.){
	\n // tex=vec4(0.,0.,0.,1.);
	\n //}
\n //if(abs(texturePos.x)>1.5) tex=vec4(0,0,0,1);
	\n //if(abs(texturePos.y)>1.3) tex=vec4(0,0,0,1);
	\n //if(center.a<0.45) tex=vec4(0,0,0,1);
	\n //vec4 tex=texture2D(u_texture,v_texCoord-(v_texCoord/2.));
	\n float maxShine=512.;
	\n float minShine=maxShine*0.2;
	\n vec4 shine=texture2D(u_shine,vec2(0.5,0.5) + ((1./512.)*texturePos)*-(minShine+((maxShine-minShine)*d)));
	\n //tex=vec4(0.,0.,d,1);
	\n\n //vec4 tex=vec4(texturePos.x,texturePos.y,0.,1.);
	\n\n // float shadowAlpha=offset(0.,-2.).a;
	\n // shadowAlpha+=offset(-0.5,0.5).a;
	\n // shadowAlpha=shadowAlpha*18.-7.;
	\n // if(shadowAlpha<0.) shadowAlpha=0.;
	\n // if(shadowAlpha>1.) shadowAlpha=1.;
	\n // shadowAlpha*=0.2;
	\n //float borderAlpha = 1.-offset(0.,3.5*d).a;
	\n //borderAlpha=(borderAlpha-(0.72-(0.1*d)))*20.;
	\n //borderAlpha*=20.;
	\n //if(borderAlpha<0.) borderAlpha=0.;
	\n //if(borderAlpha>1.) borderAlpha=1.;
	\n\n //borderAlpha*=0.4;
	\n //vec4 border=vec4(0.,0.,0.,borderAlpha);
	\n\n vec4 bg=texture2D(u_textureBlur,v_texCoord);
	\n // vec4 shadow=vec4(vec3(0.),shadowAlpha);
	\n\n //bool hasShine=true;
	\n // vec4 fg=vec4(blend(tex,shine).rgb,a);
	\n vec4 fg=vec4(tex.rgb*1.05,a);
	\n // vec4 fg=vec4(blend(blend(tex,shine),border).rgb,a);
	\n //vec4 fg=vec4(blend(tex,border).rgb,a);
	\n //vec4 fg=vec4(tex.rgb,a);
	\n\n // gl_FragColor = blend(bg,blend(shadow,fg));
	\n gl_FragColor = blend(bg,fg);
	\n\n // gl_FragColor=vec4(0,0,center.b,1);
	\n}
\n";
	var blurShader = "#define GLSLIFY 1\nprecision mediump float;
	\n\nuniform vec2 u_resolution;
	\nuniform sampler2D u_texture;
	\nuniform bool flip;
	\n// uniform vec2 direction;
	\nuniform vec2 u_delta;
	\nvec4 blur13(sampler2D image,vec2 uv,vec2 resolution,vec2 direction){
	\n vec4 color = vec4(0.0);
	\n vec2 off1 = vec2(1.411764705882353) * direction;
	\n vec2 off2 = vec2(3.2941176470588234) * direction;
	\n vec2 off3 = vec2(5.176470588235294) * direction;
	\n color += texture2D(image,uv) * 0.1964825501511404;
	\n color += texture2D(image,uv + (off1 / resolution)) * 0.2969069646728344;
	\n color += texture2D(image,uv - (off1 / resolution)) * 0.2969069646728344;
	\n color += texture2D(image,uv + (off2 / resolution)) * 0.09447039785044732;
	\n color += texture2D(image,uv - (off2 / resolution)) * 0.09447039785044732;
	\n color += texture2D(image,uv + (off3 / resolution)) * 0.010381362401148057;
	\n color += texture2D(image,uv - (off3 / resolution)) * 0.010381362401148057;
	\n return color;
	\n}
\n\nvoid main(){
	\n vec2 uv = vec2(gl_FragCoord.xy / u_resolution.xy);
	\n if (true){
	\n uv.y = 1.0 - uv.y;
	\n}
\n\n vec2 direction=u_delta;
	\n\n gl_FragColor = blur13(u_texture,uv,u_resolution.xy,direction);
	\n}
\n";
	function WebGLLiquid(canvas,canvasLiquid,imageShine,imageBg,imageBgThrough){
	this.canvas = canvas;
	this.canvasLiquid = canvasLiquid;
	this.imageShine = imageShine;
	this.imageBg = imageBg;
	this.imageBgThrough = imageBgThrough;
	this.init();
}
WebGLLiquid.prototype = Object.defineProperties({
	canvas:null,gl:null,canvasLiquid:null,width:0,height:0,imageShine:"",imageBg:"",imageBgThrough:"",textures:null,programWater:null,programBlurX:null,programBlurY:null,init:function init(){
	this.width = this.canvas.width;
	this.height = this.canvas.height;
	this.gl = new _glObj2["default"](this.canvas,{
	alpha:false}
,vertexShader,fragShaderWater);
	var gl = this.gl;
	this.programWater = gl.program;
	gl.createUniform("2f","resolution",this.width,this.height);
	gl.createTexture(null,0);
	this.textures = [{
	name:'shine',img:this.imageShine}
,{
	name:'texture',img:this.imageBg}
,{
	name:'textureBlur',img:this.imageBgThrough}
];
	this.textures.forEach(function (texture,i){
	gl.createTexture(texture.img,i + 1);
	gl.createUniform("1i",texture.name,i + 1);
}
);
	this.programBlurY = gl.createProgram(vertexShader,blurShader);
	gl.useProgram(this.programBlurY);
	gl.createUniform("2f","resolution",this.width,this.height);
	gl.createUniform("2f","pixel",1 / this.width,1 / this.height);
	gl.createUniform("2f","delta",0,1);
	this.programBlurX = gl.createProgram(vertexShader,blurShader);
	gl.useProgram(this.programBlurX);
	gl.createUniform("2f","resolution",this.width,this.height);
	gl.createUniform("2f","pixel",1 / this.width,1 / this.height);
	gl.createUniform("2f","delta",1,0);
	this.draw();
}
,draw:function draw(){
	this.gl.useProgram(this.programWater);
	this.updateTexture();
	this.gl.draw();
	// this.gl.useProgram(this.programBlurX);
	// this.gl.updateTexture(this.canvas);
	// this.gl.draw();
	// // this.gl.useProgram(this.programBlurY);
	// this.gl.updateTexture(this.canvas);
	// this.gl.draw();
	requestAnimationFrame(this.draw.bind(this));
}
,updateTextures:function updateTextures(){
	var _this = this;
	this.textures.forEach(function (texture,i){
	_this.gl.activeTexture(i + 1);
	_this.gl.updateTexture(texture.img);
}
);
}
,updateTexture:function updateTexture(){
	this.gl.activeTexture(0);
	this.gl.updateTexture(this.canvasLiquid);
}
,resize:function resize(){
}
}
,{
	overlayTexture:{
	get:function get(){
}
,set:function set(v){
}
,configurable:true,enumerable:true}
}
);
	exports["default"] = WebGLLiquid;
	module.exports = exports["default"];
}
,{
	"./gl-obj":202,"./image-loader":203,"./webgl":209}
],209:[function(require,module,exports){
	"use strict";
	Object.defineProperty(exports,"__esModule",{
	value:true}
);
	exports.getContext = getContext;
	exports.createProgram = createProgram;
	exports.createShader = createShader;
	exports.createTexture = createTexture;
	exports.createUniform = createUniform;
	exports.activeTexture = activeTexture;
	exports.updateTexture = updateTexture;
	exports.setRectangle = setRectangle;
	function getContext(canvas){
	var options = arguments.length <= 1 || arguments[1] === undefined ?{
}
:arguments[1];
	var contexts = ["webgl","experimental-webgl"];
	var context = null;
	contexts.some(function (name){
	try{
	context = canvas.getContext(name,options);
}
catch (e){
}
;
	return context != null;
}
);
	return context;
}
function createProgram(gl,vertexScript,fragScript){
	var vertexShader = createShader(gl,vertexScript,gl.VERTEX_SHADER);
	var fragShader = createShader(gl,fragScript,gl.FRAGMENT_SHADER);
	var program = gl.createProgram();
	gl.attachShader(program,vertexShader);
	gl.attachShader(program,fragShader);
	gl.linkProgram(program);
	var linked = gl.getProgramParameter(program,gl.LINK_STATUS);
	if (!linked){
	var lastError = gl.getProgramInfoLog(program);
	error("Error in program linking:" + lastError);
	gl.deleteProgram(program);
	return null;
}
var positionLocation = gl.getAttribLocation(program,"a_position");
	var texCoordLocation = gl.getAttribLocation(program,"a_texCoord");
	var texCoordBuffer = gl.createBuffer();
	gl.bindBuffer(gl.ARRAY_BUFFER,texCoordBuffer);
	gl.bufferData(gl.ARRAY_BUFFER,new Float32Array([0.0,0.0,1.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,1.0,1.0]),gl.STATIC_DRAW);
	gl.enableVertexAttribArray(texCoordLocation);
	gl.vertexAttribPointer(texCoordLocation,2,gl.FLOAT,false,0,0);
	// Create a buffer for the position of the rectangle corners. var buffer = gl.createBuffer();
	gl.bindBuffer(gl.ARRAY_BUFFER,buffer);
	gl.enableVertexAttribArray(positionLocation);
	gl.vertexAttribPointer(positionLocation,2,gl.FLOAT,false,0,0);
	return program;
}
function createShader(gl,script,type){
	var shader = gl.createShader(type);
	gl.shaderSource(shader,script);
	gl.compileShader(shader);
	var compiled = gl.getShaderParameter(shader,gl.COMPILE_STATUS);
	if (!compiled){
	var lastError = gl.getShaderInfoLog(shader);
	error("Error compiling shader '" + shader + "':" + lastError);
	gl.deleteShader(shader);
	return null;
}
return shader;
}
function createTexture(gl,source,i){
	var texture = gl.createTexture();
	activeTexture(gl,i);
	gl.bindTexture(gl.TEXTURE_2D,texture);
	// Set the parameters so we can render any size image. gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S,gl.CLAMP_TO_EDGE);
	gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T,gl.CLAMP_TO_EDGE);
	gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR);
	gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.LINEAR);
	updateTexture(gl,source);
	return texture;
}
function createUniform(gl,program,type,name){
	var location = gl.getUniformLocation(program,"u_" + name);
	for (var _len = arguments.length,args = Array(_len > 4 ? _len - 4:0),_key = 4;
	_key < _len;
	_key++){
	args[_key - 4] = arguments[_key];
}
gl["uniform" + type].apply(gl,[location].concat(args));
}
function activeTexture(gl,i){
	gl.activeTexture(gl["TEXTURE" + i]);
}
function updateTexture(gl,source){
	gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,gl.RGBA,gl.UNSIGNED_BYTE,source);
}
function setRectangle(gl,x,y,width,height){
	var x1 = x;
	var x2 = x + width;
	var y1 = y;
	var y2 = y + height;
	gl.bufferData(gl.ARRAY_BUFFER,new Float32Array([x1,y1,x2,y1,x1,y2,x1,y2,x2,y1,x2,y2]),gl.STATIC_DRAW);
}
function error(msg){
	console.error(msg);
}
}
,{
}
]}
,{
}
,[204])//# sourceMappingURL=data:application/json;
	charset:utf-8;
	base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5hLWZ1bmN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLmFuLW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5hcnJheS1jb3B5LXdpdGhpbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5hcnJheS1maWxsLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLmFycmF5LWluY2x1ZGVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLmFycmF5LW1ldGhvZHMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuYXNzaWduLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLmNsYXNzb2YuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuY29mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLmNvbGxlY3Rpb24tc3Ryb25nLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLmNvbGxlY3Rpb24tdG8tanNvbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5jb2xsZWN0aW9uLXdlYWsuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuY29sbGVjdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5jb3JlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLmN0eC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5kZWYuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuZGVmaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5kb20tY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLmVudW0ta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5leHBtMS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5mYWlscy1pcy1yZWdleHAuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuZmFpbHMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuZml4LXJlLXdrcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5mbGFncy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5mb3Itb2YuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuZ2V0LW5hbWVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLmdsb2JhbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5oYXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuaGlkZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5odG1sLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLmludm9rZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5pb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLmlzLWFycmF5LWl0ZXIuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuaXMtYXJyYXkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuaXMtaW50ZWdlci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5pcy1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuaXMtcmVnZXhwLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLml0ZXItY2FsbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5pdGVyLWNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5pdGVyLWRlZmluZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5pdGVyLWRldGVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5pdGVyLXN0ZXAuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuaXRlcmF0b3JzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLmtleW9mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLmxpYnJhcnkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQubG9nMXAuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQubWljcm90YXNrLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLm1peC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5vYmplY3QtZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLm9iamVjdC1zYXAuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQub2JqZWN0LXRvLWFycmF5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLm93bi1rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLnBhcnRpYWwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQucGF0aC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5wcm9wZXJ0eS1kZXNjLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLnJlZGVmLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLnJlcGxhY2VyLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLnNhbWUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuc2V0LXByb3RvLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLnNoYXJlZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5zaWduLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLnNwZWNpZXMtY29uc3RydWN0b3IuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuc3BlY2llcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5zdHJpY3QtbmV3LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLnN0cmluZy1hdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5zdHJpbmctY29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC5zdHJpbmctcGFkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLnN0cmluZy1yZXBlYXQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuc3RyaW5nLXRyaW0uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQuc3VwcG9ydC1kZXNjLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLnRhZy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC50YXNrLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLnRvLWluZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLnRvLWludGVnZXIuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQudG8taW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC50by1sZW5ndGguanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzLyQudG8tb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLnVpZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvJC51bnNjb3BlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy8kLndrcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvY29yZS5kZWxheS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvY29yZS5kaWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9jb3JlLmZ1bmN0aW9uLnBhcnQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3IuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2NvcmUuaXMtaXRlcmFibGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2NvcmUubG9nLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9jb3JlLm51bWJlci5pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvY29yZS5vYmplY3QuY2xhc3NvZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvY29yZS5vYmplY3QuZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9jb3JlLm9iamVjdC5pcy1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2NvcmUub2JqZWN0Lm1ha2UuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2NvcmUuc3RyaW5nLmVzY2FwZS1odG1sLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9jb3JlLnN0cmluZy51bmVzY2FwZS1odG1sLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5jb3B5LXdpdGhpbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZpbGwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5maW5kLWluZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZmluZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZyb20uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lm9mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuc3BlY2llcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmZ1bmN0aW9uLmhhcy1pbnN0YW5jZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmZ1bmN0aW9uLm5hbWUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXAuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmFjb3NoLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5hc2luaC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguYXRhbmguanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmNicnQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmNsejMyLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5jb3NoLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5leHBtMS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguZnJvdW5kLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5oeXBvdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguaW11bC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgubG9nMTAuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmxvZzFwLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5sb2cyLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5zaWduLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5zaW5oLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC50YW5oLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC50cnVuYy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5jb25zdHJ1Y3Rvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5lcHNpbG9uLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLWZpbml0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5pcy1pbnRlZ2VyLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLW5hbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5pcy1zYWZlLWludGVnZXIuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIubWF4LXNhZmUtaW50ZWdlci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5taW4tc2FmZS1pbnRlZ2VyLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnBhcnNlLWZsb2F0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnBhcnNlLWludC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5hc3NpZ24uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuZnJlZXplLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmdldC1wcm90b3R5cGUtb2YuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuaXMtZXh0ZW5zaWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5pcy1mcm96ZW4uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuaXMtc2VhbGVkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmtleXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QucHJldmVudC1leHRlbnNpb25zLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnNlYWwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3Quc2V0LXByb3RvdHlwZS1vZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5wcm9taXNlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5hcHBseS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuY29uc3RydWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5kZWZpbmUtcHJvcGVydHkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmRlbGV0ZS1wcm9wZXJ0eS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZW51bWVyYXRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldC1wcm90b3R5cGUtb2YuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuaGFzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5pcy1leHRlbnNpYmxlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5vd24ta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QucHJldmVudC1leHRlbnNpb25zLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5zZXQtcHJvdG90eXBlLW9mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5zZXQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuY29uc3RydWN0b3IuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuZmxhZ3MuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAubWF0Y2guanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAucmVwbGFjZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5zZWFyY2guanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuc3BsaXQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zZXQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuY29kZS1wb2ludC1hdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5lbmRzLXdpdGguanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuZnJvbS1jb2RlLXBvaW50LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmluY2x1ZGVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnJhdy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5yZXBlYXQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuc3RhcnRzLXdpdGguanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcudHJpbS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN5bWJvbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LndlYWstbWFwLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYud2Vhay1zZXQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5hcnJheS5pbmNsdWRlcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hcC50by1qc29uLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LmVudHJpZXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9ycy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC52YWx1ZXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5yZWdleHAuZXNjYXBlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuc2V0LnRvLWpzb24uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcuYXQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcucGFkLWxlZnQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcucGFkLXJpZ2h0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLnRyaW0tbGVmdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy50cmltLXJpZ2h0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9qcy5hcnJheS5zdGF0aWNzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuaW1tZWRpYXRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIudGltZXJzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvc2hpbS5qcyIsIi9Vc2Vycy9KYW5hL0Rlc2t0b3AvbHVjYXMvY29kcm9wcy1yYWluL3NyYy9jcmVhdGUtY2FudmFzLmpzIiwiL1VzZXJzL0phbmEvRGVza3RvcC9sdWNhcy9jb2Ryb3BzLXJhaW4vc3JjL2dsLW9iai5qcyIsIi9Vc2Vycy9KYW5hL0Rlc2t0b3AvbHVjYXMvY29kcm9wcy1yYWluL3NyYy9pbWFnZS1sb2FkZXIuanMiLCIvVXNlcnMvSmFuYS9EZXNrdG9wL2x1Y2FzL2NvZHJvcHMtcmFpbi9zcmMvbWFpbi5qcyIsIi9Vc2Vycy9KYW5hL0Rlc2t0b3AvbHVjYXMvY29kcm9wcy1yYWluL3NyYy9yYWluZHJvcHMuanMiLCIvVXNlcnMvSmFuYS9EZXNrdG9wL2x1Y2FzL2NvZHJvcHMtcmFpbi9zcmMvcmFuZG9tLmpzIiwiL1VzZXJzL0phbmEvRGVza3RvcC9sdWNhcy9jb2Ryb3BzLXJhaW4vc3JjL3RpbWVzLmpzIiwiL1VzZXJzL0phbmEvRGVza3RvcC9sdWNhcy9jb2Ryb3BzLXJhaW4vc3JjL3dlYmdsLWxpcXVpZC5qcyIsIi9Vc2Vycy9KYW5hL0Rlc2t0b3AvbHVjYXMvY29kcm9wcy1yYWluL3NyYy93ZWJnbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsRUE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTs7QUNGQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7O0FDRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25EQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7cUJDdkd3QixZQUFZOztBQUFyQixTQUFTLFlBQVksQ0FBQyxLQUFLLEVBQUMsTUFBTSxFQUFDO0FBQ2hELE1BQUksTUFBTSxHQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDNUMsUUFBTSxDQUFDLEtBQUssR0FBQyxLQUFLLENBQUM7QUFDbkIsUUFBTSxDQUFDLE1BQU0sR0FBQyxNQUFNLENBQUM7QUFDckIsU0FBTyxNQUFNLENBQUM7Q0FDZjs7Ozs7Ozs7Ozs7OztxQkNMc0IsU0FBUzs7SUFBcEIsS0FBSzs7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O0NBQzdFOztBQUNNLFNBQVMsWUFBWSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7QUFDcEQsTUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ1gsTUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUNuQixNQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDWCxNQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQ3BCLElBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxJQUFJLFlBQVksQ0FBQyxDQUM3QyxFQUFFLEVBQUUsRUFBRSxFQUNOLEVBQUUsRUFBRSxFQUFFLEVBQ04sRUFBRSxFQUFFLEVBQUUsRUFDTixFQUFFLEVBQUUsRUFBRSxFQUNOLEVBQUUsRUFBRSxFQUFFLEVBQ04sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0NBQzlCOztBQUVELFNBQVMsS0FBSyxDQUFDLEdBQUcsRUFBQztBQUNqQixTQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ3BCIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsInJlcXVpcmUoJy4vc2hpbScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2NvcmUuZGljdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2NvcmUuZ2V0LWl0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvY29yZS5pcy1pdGVyYWJsZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2NvcmUuZGVsYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9jb3JlLmZ1bmN0aW9uLnBhcnQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9jb3JlLm9iamVjdC5pcy1vYmplY3QnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9jb3JlLm9iamVjdC5jbGFzc29mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvY29yZS5vYmplY3QuZGVmaW5lJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvY29yZS5vYmplY3QubWFrZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2NvcmUubnVtYmVyLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvY29yZS5zdHJpbmcuZXNjYXBlLWh0bWwnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9jb3JlLnN0cmluZy51bmVzY2FwZS1odG1sJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvY29yZS5sb2cnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9tb2R1bGVzLyQuY29yZScpOyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICBpZih0eXBlb2YgaXQgIT0gJ2Z1bmN0aW9uJyl0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uIScpO1xuICByZXR1cm4gaXQ7XG59OyIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vJC5pcy1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICBpZighaXNPYmplY3QoaXQpKXRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGFuIG9iamVjdCEnKTtcbiAgcmV0dXJuIGl0O1xufTsiLCIvLyAyMi4xLjMuMyBBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbih0YXJnZXQsIHN0YXJ0LCBlbmQgPSB0aGlzLmxlbmd0aClcbid1c2Ugc3RyaWN0JztcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vJC50by1vYmplY3QnKVxuICAsIHRvSW5kZXggID0gcmVxdWlyZSgnLi8kLnRvLWluZGV4JylcbiAgLCB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vJC50by1sZW5ndGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBbXS5jb3B5V2l0aGluIHx8IGZ1bmN0aW9uIGNvcHlXaXRoaW4odGFyZ2V0Lyo9IDAqLywgc3RhcnQvKj0gMCwgZW5kID0gQGxlbmd0aCovKXtcbiAgdmFyIE8gICAgID0gdG9PYmplY3QodGhpcylcbiAgICAsIGxlbiAgID0gdG9MZW5ndGgoTy5sZW5ndGgpXG4gICAgLCB0byAgICA9IHRvSW5kZXgodGFyZ2V0LCBsZW4pXG4gICAgLCBmcm9tICA9IHRvSW5kZXgoc3RhcnQsIGxlbilcbiAgICAsICQkICAgID0gYXJndW1lbnRzXG4gICAgLCBlbmQgICA9ICQkLmxlbmd0aCA+IDIgPyAkJFsyXSA6IHVuZGVmaW5lZFxuICAgICwgY291bnQgPSBNYXRoLm1pbigoZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB0b0luZGV4KGVuZCwgbGVuKSkgLSBmcm9tLCBsZW4gLSB0bylcbiAgICAsIGluYyAgID0gMTtcbiAgaWYoZnJvbSA8IHRvICYmIHRvIDwgZnJvbSArIGNvdW50KXtcbiAgICBpbmMgID0gLTE7XG4gICAgZnJvbSArPSBjb3VudCAtIDE7XG4gICAgdG8gICArPSBjb3VudCAtIDE7XG4gIH1cbiAgd2hpbGUoY291bnQtLSA+IDApe1xuICAgIGlmKGZyb20gaW4gTylPW3RvXSA9IE9bZnJvbV07XG4gICAgZWxzZSBkZWxldGUgT1t0b107XG4gICAgdG8gICArPSBpbmM7XG4gICAgZnJvbSArPSBpbmM7XG4gIH0gcmV0dXJuIE87XG59OyIsIi8vIDIyLjEuMy42IEFycmF5LnByb3RvdHlwZS5maWxsKHZhbHVlLCBzdGFydCA9IDAsIGVuZCA9IHRoaXMubGVuZ3RoKVxuJ3VzZSBzdHJpY3QnO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi8kLnRvLW9iamVjdCcpXG4gICwgdG9JbmRleCAgPSByZXF1aXJlKCcuLyQudG8taW5kZXgnKVxuICAsIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi8kLnRvLWxlbmd0aCcpO1xubW9kdWxlLmV4cG9ydHMgPSBbXS5maWxsIHx8IGZ1bmN0aW9uIGZpbGwodmFsdWUgLyosIHN0YXJ0ID0gMCwgZW5kID0gQGxlbmd0aCAqLyl7XG4gIHZhciBPICAgICAgPSB0b09iamVjdCh0aGlzLCB0cnVlKVxuICAgICwgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpXG4gICAgLCAkJCAgICAgPSBhcmd1bWVudHNcbiAgICAsICQkbGVuICA9ICQkLmxlbmd0aFxuICAgICwgaW5kZXggID0gdG9JbmRleCgkJGxlbiA+IDEgPyAkJFsxXSA6IHVuZGVmaW5lZCwgbGVuZ3RoKVxuICAgICwgZW5kICAgID0gJCRsZW4gPiAyID8gJCRbMl0gOiB1bmRlZmluZWRcbiAgICAsIGVuZFBvcyA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogdG9JbmRleChlbmQsIGxlbmd0aCk7XG4gIHdoaWxlKGVuZFBvcyA+IGluZGV4KU9baW5kZXgrK10gPSB2YWx1ZTtcbiAgcmV0dXJuIE87XG59OyIsIi8vIGZhbHNlIC0+IEFycmF5I2luZGV4T2Zcbi8vIHRydWUgIC0+IEFycmF5I2luY2x1ZGVzXG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi8kLnRvLWlvYmplY3QnKVxuICAsIHRvTGVuZ3RoICA9IHJlcXVpcmUoJy4vJC50by1sZW5ndGgnKVxuICAsIHRvSW5kZXggICA9IHJlcXVpcmUoJy4vJC50by1pbmRleCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihJU19JTkNMVURFUyl7XG4gIHJldHVybiBmdW5jdGlvbigkdGhpcywgZWwsIGZyb21JbmRleCl7XG4gICAgdmFyIE8gICAgICA9IHRvSU9iamVjdCgkdGhpcylcbiAgICAgICwgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpXG4gICAgICAsIGluZGV4ICA9IHRvSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpXG4gICAgICAsIHZhbHVlO1xuICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG1cbiAgICBpZihJU19JTkNMVURFUyAmJiBlbCAhPSBlbCl3aGlsZShsZW5ndGggPiBpbmRleCl7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICBpZih2YWx1ZSAhPSB2YWx1ZSlyZXR1cm4gdHJ1ZTtcbiAgICAvLyBBcnJheSN0b0luZGV4IGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG4gICAgfSBlbHNlIGZvcig7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspaWYoSVNfSU5DTFVERVMgfHwgaW5kZXggaW4gTyl7XG4gICAgICBpZihPW2luZGV4XSA9PT0gZWwpcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4O1xuICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgfTtcbn07IiwiLy8gMCAtPiBBcnJheSNmb3JFYWNoXG4vLyAxIC0+IEFycmF5I21hcFxuLy8gMiAtPiBBcnJheSNmaWx0ZXJcbi8vIDMgLT4gQXJyYXkjc29tZVxuLy8gNCAtPiBBcnJheSNldmVyeVxuLy8gNSAtPiBBcnJheSNmaW5kXG4vLyA2IC0+IEFycmF5I2ZpbmRJbmRleFxudmFyIGN0eCAgICAgID0gcmVxdWlyZSgnLi8kLmN0eCcpXG4gICwgaXNPYmplY3QgPSByZXF1aXJlKCcuLyQuaXMtb2JqZWN0JylcbiAgLCBJT2JqZWN0ICA9IHJlcXVpcmUoJy4vJC5pb2JqZWN0JylcbiAgLCB0b09iamVjdCA9IHJlcXVpcmUoJy4vJC50by1vYmplY3QnKVxuICAsIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi8kLnRvLWxlbmd0aCcpXG4gICwgaXNBcnJheSAgPSByZXF1aXJlKCcuLyQuaXMtYXJyYXknKVxuICAsIFNQRUNJRVMgID0gcmVxdWlyZSgnLi8kLndrcycpKCdzcGVjaWVzJyk7XG4vLyA5LjQuMi4zIEFycmF5U3BlY2llc0NyZWF0ZShvcmlnaW5hbEFycmF5LCBsZW5ndGgpXG52YXIgQVNDID0gZnVuY3Rpb24ob3JpZ2luYWwsIGxlbmd0aCl7XG4gIHZhciBDO1xuICBpZihpc0FycmF5KG9yaWdpbmFsKSAmJiBpc09iamVjdChDID0gb3JpZ2luYWwuY29uc3RydWN0b3IpKXtcbiAgICBDID0gQ1tTUEVDSUVTXTtcbiAgICBpZihDID09PSBudWxsKUMgPSB1bmRlZmluZWQ7XG4gIH0gcmV0dXJuIG5ldyAoQyA9PT0gdW5kZWZpbmVkID8gQXJyYXkgOiBDKShsZW5ndGgpO1xufTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oVFlQRSl7XG4gIHZhciBJU19NQVAgICAgICAgID0gVFlQRSA9PSAxXG4gICAgLCBJU19GSUxURVIgICAgID0gVFlQRSA9PSAyXG4gICAgLCBJU19TT01FICAgICAgID0gVFlQRSA9PSAzXG4gICAgLCBJU19FVkVSWSAgICAgID0gVFlQRSA9PSA0XG4gICAgLCBJU19GSU5EX0lOREVYID0gVFlQRSA9PSA2XG4gICAgLCBOT19IT0xFUyAgICAgID0gVFlQRSA9PSA1IHx8IElTX0ZJTkRfSU5ERVg7XG4gIHJldHVybiBmdW5jdGlvbigkdGhpcywgY2FsbGJhY2tmbiwgdGhhdCl7XG4gICAgdmFyIE8gICAgICA9IHRvT2JqZWN0KCR0aGlzKVxuICAgICAgLCBzZWxmICAgPSBJT2JqZWN0KE8pXG4gICAgICAsIGYgICAgICA9IGN0eChjYWxsYmFja2ZuLCB0aGF0LCAzKVxuICAgICAgLCBsZW5ndGggPSB0b0xlbmd0aChzZWxmLmxlbmd0aClcbiAgICAgICwgaW5kZXggID0gMFxuICAgICAgLCByZXN1bHQgPSBJU19NQVAgPyBBU0MoJHRoaXMsIGxlbmd0aCkgOiBJU19GSUxURVIgPyBBU0MoJHRoaXMsIDApIDogdW5kZWZpbmVkXG4gICAgICAsIHZhbCwgcmVzO1xuICAgIGZvcig7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspaWYoTk9fSE9MRVMgfHwgaW5kZXggaW4gc2VsZil7XG4gICAgICB2YWwgPSBzZWxmW2luZGV4XTtcbiAgICAgIHJlcyA9IGYodmFsLCBpbmRleCwgTyk7XG4gICAgICBpZihUWVBFKXtcbiAgICAgICAgaWYoSVNfTUFQKXJlc3VsdFtpbmRleF0gPSByZXM7ICAgICAgICAgICAgLy8gbWFwXG4gICAgICAgIGVsc2UgaWYocmVzKXN3aXRjaChUWVBFKXtcbiAgICAgICAgICBjYXNlIDM6IHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgLy8gc29tZVxuICAgICAgICAgIGNhc2UgNTogcmV0dXJuIHZhbDsgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kXG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gaW5kZXg7ICAgICAgICAgICAgICAgICAgIC8vIGZpbmRJbmRleFxuICAgICAgICAgIGNhc2UgMjogcmVzdWx0LnB1c2godmFsKTsgICAgICAgICAgICAgICAvLyBmaWx0ZXJcbiAgICAgICAgfSBlbHNlIGlmKElTX0VWRVJZKXJldHVybiBmYWxzZTsgICAgICAgICAgLy8gZXZlcnlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIElTX0ZJTkRfSU5ERVggPyAtMSA6IElTX1NPTUUgfHwgSVNfRVZFUlkgPyBJU19FVkVSWSA6IHJlc3VsdDtcbiAgfTtcbn07IiwiLy8gMTkuMS4yLjEgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSwgLi4uKVxudmFyICQgICAgICAgID0gcmVxdWlyZSgnLi8kJylcbiAgLCB0b09iamVjdCA9IHJlcXVpcmUoJy4vJC50by1vYmplY3QnKVxuICAsIElPYmplY3QgID0gcmVxdWlyZSgnLi8kLmlvYmplY3QnKTtcblxuLy8gc2hvdWxkIHdvcmsgd2l0aCBzeW1ib2xzIGFuZCBzaG91bGQgaGF2ZSBkZXRlcm1pbmlzdGljIHByb3BlcnR5IG9yZGVyIChWOCBidWcpXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vJC5mYWlscycpKGZ1bmN0aW9uKCl7XG4gIHZhciBhID0gT2JqZWN0LmFzc2lnblxuICAgICwgQSA9IHt9XG4gICAgLCBCID0ge31cbiAgICAsIFMgPSBTeW1ib2woKVxuICAgICwgSyA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdCc7XG4gIEFbU10gPSA3O1xuICBLLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uKGspeyBCW2tdID0gazsgfSk7XG4gIHJldHVybiBhKHt9LCBBKVtTXSAhPSA3IHx8IE9iamVjdC5rZXlzKGEoe30sIEIpKS5qb2luKCcnKSAhPSBLO1xufSkgPyBmdW5jdGlvbiBhc3NpZ24odGFyZ2V0LCBzb3VyY2UpeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHZhciBUICAgICA9IHRvT2JqZWN0KHRhcmdldClcbiAgICAsICQkICAgID0gYXJndW1lbnRzXG4gICAgLCAkJGxlbiA9ICQkLmxlbmd0aFxuICAgICwgaW5kZXggPSAxXG4gICAgLCBnZXRLZXlzICAgID0gJC5nZXRLZXlzXG4gICAgLCBnZXRTeW1ib2xzID0gJC5nZXRTeW1ib2xzXG4gICAgLCBpc0VudW0gICAgID0gJC5pc0VudW07XG4gIHdoaWxlKCQkbGVuID4gaW5kZXgpe1xuICAgIHZhciBTICAgICAgPSBJT2JqZWN0KCQkW2luZGV4KytdKVxuICAgICAgLCBrZXlzICAgPSBnZXRTeW1ib2xzID8gZ2V0S2V5cyhTKS5jb25jYXQoZ2V0U3ltYm9scyhTKSkgOiBnZXRLZXlzKFMpXG4gICAgICAsIGxlbmd0aCA9IGtleXMubGVuZ3RoXG4gICAgICAsIGogICAgICA9IDBcbiAgICAgICwga2V5O1xuICAgIHdoaWxlKGxlbmd0aCA+IGopaWYoaXNFbnVtLmNhbGwoUywga2V5ID0ga2V5c1tqKytdKSlUW2tleV0gPSBTW2tleV07XG4gIH1cbiAgcmV0dXJuIFQ7XG59IDogT2JqZWN0LmFzc2lnbjsiLCIvLyBnZXR0aW5nIHRhZyBmcm9tIDE5LjEuMy42IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcoKVxudmFyIGNvZiA9IHJlcXVpcmUoJy4vJC5jb2YnKVxuICAsIFRBRyA9IHJlcXVpcmUoJy4vJC53a3MnKSgndG9TdHJpbmdUYWcnKVxuICAvLyBFUzMgd3JvbmcgaGVyZVxuICAsIEFSRyA9IGNvZihmdW5jdGlvbigpeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgdmFyIE8sIFQsIEI7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mIChUID0gKE8gPSBPYmplY3QoaXQpKVtUQUddKSA9PSAnc3RyaW5nJyA/IFRcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IEFSRyA/IGNvZihPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChCID0gY29mKE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogQjtcbn07IiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpO1xufTsiLCIndXNlIHN0cmljdCc7XG52YXIgJCAgICAgICAgICAgID0gcmVxdWlyZSgnLi8kJylcbiAgLCBoaWRlICAgICAgICAgPSByZXF1aXJlKCcuLyQuaGlkZScpXG4gICwgY3R4ICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmN0eCcpXG4gICwgc3BlY2llcyAgICAgID0gcmVxdWlyZSgnLi8kLnNwZWNpZXMnKVxuICAsIHN0cmljdE5ldyAgICA9IHJlcXVpcmUoJy4vJC5zdHJpY3QtbmV3JylcbiAgLCBkZWZpbmVkICAgICAgPSByZXF1aXJlKCcuLyQuZGVmaW5lZCcpXG4gICwgZm9yT2YgICAgICAgID0gcmVxdWlyZSgnLi8kLmZvci1vZicpXG4gICwgc3RlcCAgICAgICAgID0gcmVxdWlyZSgnLi8kLml0ZXItc3RlcCcpXG4gICwgSUQgICAgICAgICAgID0gcmVxdWlyZSgnLi8kLnVpZCcpKCdpZCcpXG4gICwgJGhhcyAgICAgICAgID0gcmVxdWlyZSgnLi8kLmhhcycpXG4gICwgaXNPYmplY3QgICAgID0gcmVxdWlyZSgnLi8kLmlzLW9iamVjdCcpXG4gICwgaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZSB8fCBpc09iamVjdFxuICAsIFNVUFBPUlRfREVTQyA9IHJlcXVpcmUoJy4vJC5zdXBwb3J0LWRlc2MnKVxuICAsIFNJWkUgICAgICAgICA9IFNVUFBPUlRfREVTQyA/ICdfcycgOiAnc2l6ZSdcbiAgLCBpZCAgICAgICAgICAgPSAwO1xuXG52YXIgZmFzdEtleSA9IGZ1bmN0aW9uKGl0LCBjcmVhdGUpe1xuICAvLyByZXR1cm4gcHJpbWl0aXZlIHdpdGggcHJlZml4XG4gIGlmKCFpc09iamVjdChpdCkpcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJyA/IGl0IDogKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyA/ICdTJyA6ICdQJykgKyBpdDtcbiAgaWYoISRoYXMoaXQsIElEKSl7XG4gICAgLy8gY2FuJ3Qgc2V0IGlkIHRvIGZyb3plbiBvYmplY3RcbiAgICBpZighaXNFeHRlbnNpYmxlKGl0KSlyZXR1cm4gJ0YnO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIGlkXG4gICAgaWYoIWNyZWF0ZSlyZXR1cm4gJ0UnO1xuICAgIC8vIGFkZCBtaXNzaW5nIG9iamVjdCBpZFxuICAgIGhpZGUoaXQsIElELCArK2lkKTtcbiAgLy8gcmV0dXJuIG9iamVjdCBpZCB3aXRoIHByZWZpeFxuICB9IHJldHVybiAnTycgKyBpdFtJRF07XG59O1xuXG52YXIgZ2V0RW50cnkgPSBmdW5jdGlvbih0aGF0LCBrZXkpe1xuICAvLyBmYXN0IGNhc2VcbiAgdmFyIGluZGV4ID0gZmFzdEtleShrZXkpLCBlbnRyeTtcbiAgaWYoaW5kZXggIT09ICdGJylyZXR1cm4gdGhhdC5faVtpbmRleF07XG4gIC8vIGZyb3plbiBvYmplY3QgY2FzZVxuICBmb3IoZW50cnkgPSB0aGF0Ll9mOyBlbnRyeTsgZW50cnkgPSBlbnRyeS5uKXtcbiAgICBpZihlbnRyeS5rID09IGtleSlyZXR1cm4gZW50cnk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRDb25zdHJ1Y3RvcjogZnVuY3Rpb24od3JhcHBlciwgTkFNRSwgSVNfTUFQLCBBRERFUil7XG4gICAgdmFyIEMgPSB3cmFwcGVyKGZ1bmN0aW9uKHRoYXQsIGl0ZXJhYmxlKXtcbiAgICAgIHN0cmljdE5ldyh0aGF0LCBDLCBOQU1FKTtcbiAgICAgIHRoYXQuX2kgPSAkLmNyZWF0ZShudWxsKTsgLy8gaW5kZXhcbiAgICAgIHRoYXQuX2YgPSB1bmRlZmluZWQ7ICAgICAgLy8gZmlyc3QgZW50cnlcbiAgICAgIHRoYXQuX2wgPSB1bmRlZmluZWQ7ICAgICAgLy8gbGFzdCBlbnRyeVxuICAgICAgdGhhdFtTSVpFXSA9IDA7ICAgICAgICAgICAvLyBzaXplXG4gICAgICBpZihpdGVyYWJsZSAhPSB1bmRlZmluZWQpZm9yT2YoaXRlcmFibGUsIElTX01BUCwgdGhhdFtBRERFUl0sIHRoYXQpO1xuICAgIH0pO1xuICAgIHJlcXVpcmUoJy4vJC5taXgnKShDLnByb3RvdHlwZSwge1xuICAgICAgLy8gMjMuMS4zLjEgTWFwLnByb3RvdHlwZS5jbGVhcigpXG4gICAgICAvLyAyMy4yLjMuMiBTZXQucHJvdG90eXBlLmNsZWFyKClcbiAgICAgIGNsZWFyOiBmdW5jdGlvbiBjbGVhcigpe1xuICAgICAgICBmb3IodmFyIHRoYXQgPSB0aGlzLCBkYXRhID0gdGhhdC5faSwgZW50cnkgPSB0aGF0Ll9mOyBlbnRyeTsgZW50cnkgPSBlbnRyeS5uKXtcbiAgICAgICAgICBlbnRyeS5yID0gdHJ1ZTtcbiAgICAgICAgICBpZihlbnRyeS5wKWVudHJ5LnAgPSBlbnRyeS5wLm4gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgZGVsZXRlIGRhdGFbZW50cnkuaV07XG4gICAgICAgIH1cbiAgICAgICAgdGhhdC5fZiA9IHRoYXQuX2wgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoYXRbU0laRV0gPSAwO1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy4zIE1hcC5wcm90b3R5cGUuZGVsZXRlKGtleSlcbiAgICAgIC8vIDIzLjIuMy40IFNldC5wcm90b3R5cGUuZGVsZXRlKHZhbHVlKVxuICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uKGtleSl7XG4gICAgICAgIHZhciB0aGF0ICA9IHRoaXNcbiAgICAgICAgICAsIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KTtcbiAgICAgICAgaWYoZW50cnkpe1xuICAgICAgICAgIHZhciBuZXh0ID0gZW50cnkublxuICAgICAgICAgICAgLCBwcmV2ID0gZW50cnkucDtcbiAgICAgICAgICBkZWxldGUgdGhhdC5faVtlbnRyeS5pXTtcbiAgICAgICAgICBlbnRyeS5yID0gdHJ1ZTtcbiAgICAgICAgICBpZihwcmV2KXByZXYubiA9IG5leHQ7XG4gICAgICAgICAgaWYobmV4dCluZXh0LnAgPSBwcmV2O1xuICAgICAgICAgIGlmKHRoYXQuX2YgPT0gZW50cnkpdGhhdC5fZiA9IG5leHQ7XG4gICAgICAgICAgaWYodGhhdC5fbCA9PSBlbnRyeSl0aGF0Ll9sID0gcHJldjtcbiAgICAgICAgICB0aGF0W1NJWkVdLS07XG4gICAgICAgIH0gcmV0dXJuICEhZW50cnk7XG4gICAgICB9LFxuICAgICAgLy8gMjMuMi4zLjYgU2V0LnByb3RvdHlwZS5mb3JFYWNoKGNhbGxiYWNrZm4sIHRoaXNBcmcgPSB1bmRlZmluZWQpXG4gICAgICAvLyAyMy4xLjMuNSBNYXAucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbiAgICAgIGZvckVhY2g6IGZ1bmN0aW9uIGZvckVhY2goY2FsbGJhY2tmbiAvKiwgdGhhdCA9IHVuZGVmaW5lZCAqLyl7XG4gICAgICAgIHZhciBmID0gY3R4KGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCAzKVxuICAgICAgICAgICwgZW50cnk7XG4gICAgICAgIHdoaWxlKGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uIDogdGhpcy5fZil7XG4gICAgICAgICAgZihlbnRyeS52LCBlbnRyeS5rLCB0aGlzKTtcbiAgICAgICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgICAgICB3aGlsZShlbnRyeSAmJiBlbnRyeS5yKWVudHJ5ID0gZW50cnkucDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy43IE1hcC5wcm90b3R5cGUuaGFzKGtleSlcbiAgICAgIC8vIDIzLjIuMy43IFNldC5wcm90b3R5cGUuaGFzKHZhbHVlKVxuICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KXtcbiAgICAgICAgcmV0dXJuICEhZ2V0RW50cnkodGhpcywga2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZihTVVBQT1JUX0RFU0MpJC5zZXREZXNjKEMucHJvdG90eXBlLCAnc2l6ZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKXtcbiAgICAgICAgcmV0dXJuIGRlZmluZWQodGhpc1tTSVpFXSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIEM7XG4gIH0sXG4gIGRlZjogZnVuY3Rpb24odGhhdCwga2V5LCB2YWx1ZSl7XG4gICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KVxuICAgICAgLCBwcmV2LCBpbmRleDtcbiAgICAvLyBjaGFuZ2UgZXhpc3RpbmcgZW50cnlcbiAgICBpZihlbnRyeSl7XG4gICAgICBlbnRyeS52ID0gdmFsdWU7XG4gICAgLy8gY3JlYXRlIG5ldyBlbnRyeVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGF0Ll9sID0gZW50cnkgPSB7XG4gICAgICAgIGk6IGluZGV4ID0gZmFzdEtleShrZXksIHRydWUpLCAvLyA8LSBpbmRleFxuICAgICAgICBrOiBrZXksICAgICAgICAgICAgICAgICAgICAgICAgLy8gPC0ga2V5XG4gICAgICAgIHY6IHZhbHVlLCAgICAgICAgICAgICAgICAgICAgICAvLyA8LSB2YWx1ZVxuICAgICAgICBwOiBwcmV2ID0gdGhhdC5fbCwgICAgICAgICAgICAgLy8gPC0gcHJldmlvdXMgZW50cnlcbiAgICAgICAgbjogdW5kZWZpbmVkLCAgICAgICAgICAgICAgICAgIC8vIDwtIG5leHQgZW50cnlcbiAgICAgICAgcjogZmFsc2UgICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIHJlbW92ZWRcbiAgICAgIH07XG4gICAgICBpZighdGhhdC5fZil0aGF0Ll9mID0gZW50cnk7XG4gICAgICBpZihwcmV2KXByZXYubiA9IGVudHJ5O1xuICAgICAgdGhhdFtTSVpFXSsrO1xuICAgICAgLy8gYWRkIHRvIGluZGV4XG4gICAgICBpZihpbmRleCAhPT0gJ0YnKXRoYXQuX2lbaW5kZXhdID0gZW50cnk7XG4gICAgfSByZXR1cm4gdGhhdDtcbiAgfSxcbiAgZ2V0RW50cnk6IGdldEVudHJ5LFxuICBzZXRTdHJvbmc6IGZ1bmN0aW9uKEMsIE5BTUUsIElTX01BUCl7XG4gICAgLy8gYWRkIC5rZXlzLCAudmFsdWVzLCAuZW50cmllcywgW0BAaXRlcmF0b3JdXG4gICAgLy8gMjMuMS4zLjQsIDIzLjEuMy44LCAyMy4xLjMuMTEsIDIzLjEuMy4xMiwgMjMuMi4zLjUsIDIzLjIuMy44LCAyMy4yLjMuMTAsIDIzLjIuMy4xMVxuICAgIHJlcXVpcmUoJy4vJC5pdGVyLWRlZmluZScpKEMsIE5BTUUsIGZ1bmN0aW9uKGl0ZXJhdGVkLCBraW5kKXtcbiAgICAgIHRoaXMuX3QgPSBpdGVyYXRlZDsgIC8vIHRhcmdldFxuICAgICAgdGhpcy5fayA9IGtpbmQ7ICAgICAgLy8ga2luZFxuICAgICAgdGhpcy5fbCA9IHVuZGVmaW5lZDsgLy8gcHJldmlvdXNcbiAgICB9LCBmdW5jdGlvbigpe1xuICAgICAgdmFyIHRoYXQgID0gdGhpc1xuICAgICAgICAsIGtpbmQgID0gdGhhdC5fa1xuICAgICAgICAsIGVudHJ5ID0gdGhhdC5fbDtcbiAgICAgIC8vIHJldmVydCB0byB0aGUgbGFzdCBleGlzdGluZyBlbnRyeVxuICAgICAgd2hpbGUoZW50cnkgJiYgZW50cnkucillbnRyeSA9IGVudHJ5LnA7XG4gICAgICAvLyBnZXQgbmV4dCBlbnRyeVxuICAgICAgaWYoIXRoYXQuX3QgfHwgISh0aGF0Ll9sID0gZW50cnkgPSBlbnRyeSA/IGVudHJ5Lm4gOiB0aGF0Ll90Ll9mKSl7XG4gICAgICAgIC8vIG9yIGZpbmlzaCB0aGUgaXRlcmF0aW9uXG4gICAgICAgIHRoYXQuX3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBzdGVwKDEpO1xuICAgICAgfVxuICAgICAgLy8gcmV0dXJuIHN0ZXAgYnkga2luZFxuICAgICAgaWYoa2luZCA9PSAna2V5cycgIClyZXR1cm4gc3RlcCgwLCBlbnRyeS5rKTtcbiAgICAgIGlmKGtpbmQgPT0gJ3ZhbHVlcycpcmV0dXJuIHN0ZXAoMCwgZW50cnkudik7XG4gICAgICByZXR1cm4gc3RlcCgwLCBbZW50cnkuaywgZW50cnkudl0pO1xuICAgIH0sIElTX01BUCA/ICdlbnRyaWVzJyA6ICd2YWx1ZXMnICwgIUlTX01BUCwgdHJ1ZSk7XG5cbiAgICAvLyBhZGQgW0BAc3BlY2llc10sIDIzLjEuMi4yLCAyMy4yLjIuMlxuICAgIHNwZWNpZXMoQyk7XG4gICAgc3BlY2llcyhyZXF1aXJlKCcuLyQuY29yZScpW05BTUVdKTsgLy8gZm9yIHdyYXBwZXJcbiAgfVxufTsiLCIvLyBodHRwczovL2dpdGh1Yi5jb20vRGF2aWRCcnVhbnQvTWFwLVNldC5wcm90b3R5cGUudG9KU09OXG52YXIgZm9yT2YgICA9IHJlcXVpcmUoJy4vJC5mb3Itb2YnKVxuICAsIGNsYXNzb2YgPSByZXF1aXJlKCcuLyQuY2xhc3NvZicpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihOQU1FKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRvSlNPTigpe1xuICAgIGlmKGNsYXNzb2YodGhpcykgIT0gTkFNRSl0aHJvdyBUeXBlRXJyb3IoTkFNRSArIFwiI3RvSlNPTiBpc24ndCBnZW5lcmljXCIpO1xuICAgIHZhciBhcnIgPSBbXTtcbiAgICBmb3JPZih0aGlzLCBmYWxzZSwgYXJyLnB1c2gsIGFycik7XG4gICAgcmV0dXJuIGFycjtcbiAgfTtcbn07IiwiJ3VzZSBzdHJpY3QnO1xudmFyIGhpZGUgICAgICAgICA9IHJlcXVpcmUoJy4vJC5oaWRlJylcbiAgLCBhbk9iamVjdCAgICAgPSByZXF1aXJlKCcuLyQuYW4tb2JqZWN0JylcbiAgLCBzdHJpY3ROZXcgICAgPSByZXF1aXJlKCcuLyQuc3RyaWN0LW5ldycpXG4gICwgZm9yT2YgICAgICAgID0gcmVxdWlyZSgnLi8kLmZvci1vZicpXG4gICwgbWV0aG9kICAgICAgID0gcmVxdWlyZSgnLi8kLmFycmF5LW1ldGhvZHMnKVxuICAsIFdFQUsgICAgICAgICA9IHJlcXVpcmUoJy4vJC51aWQnKSgnd2VhaycpXG4gICwgaXNPYmplY3QgICAgID0gcmVxdWlyZSgnLi8kLmlzLW9iamVjdCcpXG4gICwgJGhhcyAgICAgICAgID0gcmVxdWlyZSgnLi8kLmhhcycpXG4gICwgaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZSB8fCBpc09iamVjdFxuICAsIGZpbmQgICAgICAgICA9IG1ldGhvZCg1KVxuICAsIGZpbmRJbmRleCAgICA9IG1ldGhvZCg2KVxuICAsIGlkICAgICAgICAgICA9IDA7XG5cbi8vIGZhbGxiYWNrIGZvciBmcm96ZW4ga2V5c1xudmFyIGZyb3plblN0b3JlID0gZnVuY3Rpb24odGhhdCl7XG4gIHJldHVybiB0aGF0Ll9sIHx8ICh0aGF0Ll9sID0gbmV3IEZyb3plblN0b3JlKTtcbn07XG52YXIgRnJvemVuU3RvcmUgPSBmdW5jdGlvbigpe1xuICB0aGlzLmEgPSBbXTtcbn07XG52YXIgZmluZEZyb3plbiA9IGZ1bmN0aW9uKHN0b3JlLCBrZXkpe1xuICByZXR1cm4gZmluZChzdG9yZS5hLCBmdW5jdGlvbihpdCl7XG4gICAgcmV0dXJuIGl0WzBdID09PSBrZXk7XG4gIH0pO1xufTtcbkZyb3plblN0b3JlLnByb3RvdHlwZSA9IHtcbiAgZ2V0OiBmdW5jdGlvbihrZXkpe1xuICAgIHZhciBlbnRyeSA9IGZpbmRGcm96ZW4odGhpcywga2V5KTtcbiAgICBpZihlbnRyeSlyZXR1cm4gZW50cnlbMV07XG4gIH0sXG4gIGhhczogZnVuY3Rpb24oa2V5KXtcbiAgICByZXR1cm4gISFmaW5kRnJvemVuKHRoaXMsIGtleSk7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24oa2V5LCB2YWx1ZSl7XG4gICAgdmFyIGVudHJ5ID0gZmluZEZyb3plbih0aGlzLCBrZXkpO1xuICAgIGlmKGVudHJ5KWVudHJ5WzFdID0gdmFsdWU7XG4gICAgZWxzZSB0aGlzLmEucHVzaChba2V5LCB2YWx1ZV0pO1xuICB9LFxuICAnZGVsZXRlJzogZnVuY3Rpb24oa2V5KXtcbiAgICB2YXIgaW5kZXggPSBmaW5kSW5kZXgodGhpcy5hLCBmdW5jdGlvbihpdCl7XG4gICAgICByZXR1cm4gaXRbMF0gPT09IGtleTtcbiAgICB9KTtcbiAgICBpZih+aW5kZXgpdGhpcy5hLnNwbGljZShpbmRleCwgMSk7XG4gICAgcmV0dXJuICEhfmluZGV4O1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0Q29uc3RydWN0b3I6IGZ1bmN0aW9uKHdyYXBwZXIsIE5BTUUsIElTX01BUCwgQURERVIpe1xuICAgIHZhciBDID0gd3JhcHBlcihmdW5jdGlvbih0aGF0LCBpdGVyYWJsZSl7XG4gICAgICBzdHJpY3ROZXcodGhhdCwgQywgTkFNRSk7XG4gICAgICB0aGF0Ll9pID0gaWQrKzsgICAgICAvLyBjb2xsZWN0aW9uIGlkXG4gICAgICB0aGF0Ll9sID0gdW5kZWZpbmVkOyAvLyBsZWFrIHN0b3JlIGZvciBmcm96ZW4gb2JqZWN0c1xuICAgICAgaWYoaXRlcmFibGUgIT0gdW5kZWZpbmVkKWZvck9mKGl0ZXJhYmxlLCBJU19NQVAsIHRoYXRbQURERVJdLCB0aGF0KTtcbiAgICB9KTtcbiAgICByZXF1aXJlKCcuLyQubWl4JykoQy5wcm90b3R5cGUsIHtcbiAgICAgIC8vIDIzLjMuMy4yIFdlYWtNYXAucHJvdG90eXBlLmRlbGV0ZShrZXkpXG4gICAgICAvLyAyMy40LjMuMyBXZWFrU2V0LnByb3RvdHlwZS5kZWxldGUodmFsdWUpXG4gICAgICAnZGVsZXRlJzogZnVuY3Rpb24oa2V5KXtcbiAgICAgICAgaWYoIWlzT2JqZWN0KGtleSkpcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZighaXNFeHRlbnNpYmxlKGtleSkpcmV0dXJuIGZyb3plblN0b3JlKHRoaXMpWydkZWxldGUnXShrZXkpO1xuICAgICAgICByZXR1cm4gJGhhcyhrZXksIFdFQUspICYmICRoYXMoa2V5W1dFQUtdLCB0aGlzLl9pKSAmJiBkZWxldGUga2V5W1dFQUtdW3RoaXMuX2ldO1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjMuMy40IFdlYWtNYXAucHJvdG90eXBlLmhhcyhrZXkpXG4gICAgICAvLyAyMy40LjMuNCBXZWFrU2V0LnByb3RvdHlwZS5oYXModmFsdWUpXG4gICAgICBoYXM6IGZ1bmN0aW9uIGhhcyhrZXkpe1xuICAgICAgICBpZighaXNPYmplY3Qoa2V5KSlyZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmKCFpc0V4dGVuc2libGUoa2V5KSlyZXR1cm4gZnJvemVuU3RvcmUodGhpcykuaGFzKGtleSk7XG4gICAgICAgIHJldHVybiAkaGFzKGtleSwgV0VBSykgJiYgJGhhcyhrZXlbV0VBS10sIHRoaXMuX2kpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBDO1xuICB9LFxuICBkZWY6IGZ1bmN0aW9uKHRoYXQsIGtleSwgdmFsdWUpe1xuICAgIGlmKCFpc0V4dGVuc2libGUoYW5PYmplY3Qoa2V5KSkpe1xuICAgICAgZnJvemVuU3RvcmUodGhhdCkuc2V0KGtleSwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAkaGFzKGtleSwgV0VBSykgfHwgaGlkZShrZXksIFdFQUssIHt9KTtcbiAgICAgIGtleVtXRUFLXVt0aGF0Ll9pXSA9IHZhbHVlO1xuICAgIH0gcmV0dXJuIHRoYXQ7XG4gIH0sXG4gIGZyb3plblN0b3JlOiBmcm96ZW5TdG9yZSxcbiAgV0VBSzogV0VBS1xufTsiLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsICAgICA9IHJlcXVpcmUoJy4vJC5nbG9iYWwnKVxuICAsICRkZWYgICAgICAgPSByZXF1aXJlKCcuLyQuZGVmJylcbiAgLCBmb3JPZiAgICAgID0gcmVxdWlyZSgnLi8kLmZvci1vZicpXG4gICwgc3RyaWN0TmV3ICA9IHJlcXVpcmUoJy4vJC5zdHJpY3QtbmV3Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oTkFNRSwgd3JhcHBlciwgbWV0aG9kcywgY29tbW9uLCBJU19NQVAsIElTX1dFQUspe1xuICB2YXIgQmFzZSAgPSBnbG9iYWxbTkFNRV1cbiAgICAsIEMgICAgID0gQmFzZVxuICAgICwgQURERVIgPSBJU19NQVAgPyAnc2V0JyA6ICdhZGQnXG4gICAgLCBwcm90byA9IEMgJiYgQy5wcm90b3R5cGVcbiAgICAsIE8gICAgID0ge307XG4gIHZhciBmaXhNZXRob2QgPSBmdW5jdGlvbihLRVkpe1xuICAgIHZhciBmbiA9IHByb3RvW0tFWV07XG4gICAgcmVxdWlyZSgnLi8kLnJlZGVmJykocHJvdG8sIEtFWSxcbiAgICAgIEtFWSA9PSAnZGVsZXRlJyA/IGZ1bmN0aW9uKGEpeyByZXR1cm4gZm4uY2FsbCh0aGlzLCBhID09PSAwID8gMCA6IGEpOyB9XG4gICAgICA6IEtFWSA9PSAnaGFzJyA/IGZ1bmN0aW9uIGhhcyhhKXsgcmV0dXJuIGZuLmNhbGwodGhpcywgYSA9PT0gMCA/IDAgOiBhKTsgfVxuICAgICAgOiBLRVkgPT0gJ2dldCcgPyBmdW5jdGlvbiBnZXQoYSl7IHJldHVybiBmbi5jYWxsKHRoaXMsIGEgPT09IDAgPyAwIDogYSk7IH1cbiAgICAgIDogS0VZID09ICdhZGQnID8gZnVuY3Rpb24gYWRkKGEpeyBmbi5jYWxsKHRoaXMsIGEgPT09IDAgPyAwIDogYSk7IHJldHVybiB0aGlzOyB9XG4gICAgICA6IGZ1bmN0aW9uIHNldChhLCBiKXsgZm4uY2FsbCh0aGlzLCBhID09PSAwID8gMCA6IGEsIGIpOyByZXR1cm4gdGhpczsgfVxuICAgICk7XG4gIH07XG4gIGlmKHR5cGVvZiBDICE9ICdmdW5jdGlvbicgfHwgIShJU19XRUFLIHx8IHByb3RvLmZvckVhY2ggJiYgIXJlcXVpcmUoJy4vJC5mYWlscycpKGZ1bmN0aW9uKCl7XG4gICAgbmV3IEMoKS5lbnRyaWVzKCkubmV4dCgpO1xuICB9KSkpe1xuICAgIC8vIGNyZWF0ZSBjb2xsZWN0aW9uIGNvbnN0cnVjdG9yXG4gICAgQyA9IGNvbW1vbi5nZXRDb25zdHJ1Y3Rvcih3cmFwcGVyLCBOQU1FLCBJU19NQVAsIEFEREVSKTtcbiAgICByZXF1aXJlKCcuLyQubWl4JykoQy5wcm90b3R5cGUsIG1ldGhvZHMpO1xuICB9IGVsc2Uge1xuICAgIHZhciBpbnN0ICA9IG5ldyBDXG4gICAgICAsIGNoYWluID0gaW5zdFtBRERFUl0oSVNfV0VBSyA/IHt9IDogLTAsIDEpXG4gICAgICAsIGJ1Z2d5WmVybztcbiAgICAvLyB3cmFwIGZvciBpbml0IGNvbGxlY3Rpb25zIGZyb20gaXRlcmFibGVcbiAgICBpZighcmVxdWlyZSgnLi8kLml0ZXItZGV0ZWN0JykoZnVuY3Rpb24oaXRlcil7IG5ldyBDKGl0ZXIpOyB9KSl7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgICBDID0gd3JhcHBlcihmdW5jdGlvbih0YXJnZXQsIGl0ZXJhYmxlKXtcbiAgICAgICAgc3RyaWN0TmV3KHRhcmdldCwgQywgTkFNRSk7XG4gICAgICAgIHZhciB0aGF0ID0gbmV3IEJhc2U7XG4gICAgICAgIGlmKGl0ZXJhYmxlICE9IHVuZGVmaW5lZClmb3JPZihpdGVyYWJsZSwgSVNfTUFQLCB0aGF0W0FEREVSXSwgdGhhdCk7XG4gICAgICAgIHJldHVybiB0aGF0O1xuICAgICAgfSk7XG4gICAgICBDLnByb3RvdHlwZSA9IHByb3RvO1xuICAgICAgcHJvdG8uY29uc3RydWN0b3IgPSBDO1xuICAgIH1cbiAgICBJU19XRUFLIHx8IGluc3QuZm9yRWFjaChmdW5jdGlvbih2YWwsIGtleSl7XG4gICAgICBidWdneVplcm8gPSAxIC8ga2V5ID09PSAtSW5maW5pdHk7XG4gICAgfSk7XG4gICAgLy8gZml4IGNvbnZlcnRpbmcgLTAga2V5IHRvICswXG4gICAgaWYoYnVnZ3laZXJvKXtcbiAgICAgIGZpeE1ldGhvZCgnZGVsZXRlJyk7XG4gICAgICBmaXhNZXRob2QoJ2hhcycpO1xuICAgICAgSVNfTUFQICYmIGZpeE1ldGhvZCgnZ2V0Jyk7XG4gICAgfVxuICAgIC8vICsgZml4IC5hZGQgJiAuc2V0IGZvciBjaGFpbmluZ1xuICAgIGlmKGJ1Z2d5WmVybyB8fCBjaGFpbiAhPT0gaW5zdClmaXhNZXRob2QoQURERVIpO1xuICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgc2hvdWxkIG5vdCBjb250YWlucyAuY2xlYXIgbWV0aG9kXG4gICAgaWYoSVNfV0VBSyAmJiBwcm90by5jbGVhcilkZWxldGUgcHJvdG8uY2xlYXI7XG4gIH1cblxuICByZXF1aXJlKCcuLyQudGFnJykoQywgTkFNRSk7XG5cbiAgT1tOQU1FXSA9IEM7XG4gICRkZWYoJGRlZi5HICsgJGRlZi5XICsgJGRlZi5GICogKEMgIT0gQmFzZSksIE8pO1xuXG4gIGlmKCFJU19XRUFLKWNvbW1vbi5zZXRTdHJvbmcoQywgTkFNRSwgSVNfTUFQKTtcblxuICByZXR1cm4gQztcbn07IiwidmFyIGNvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IHt2ZXJzaW9uOiAnMS4yLjMnfTtcbmlmKHR5cGVvZiBfX2UgPT0gJ251bWJlcicpX19lID0gY29yZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZiIsIi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vJC5hLWZ1bmN0aW9uJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGZuLCB0aGF0LCBsZW5ndGgpe1xuICBhRnVuY3Rpb24oZm4pO1xuICBpZih0aGF0ID09PSB1bmRlZmluZWQpcmV0dXJuIGZuO1xuICBzd2l0Y2gobGVuZ3RoKXtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbihhKXtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuICAgIH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24oYSwgYil7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiKTtcbiAgICB9O1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uKGEsIGIsIGMpe1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24oLyogLi4uYXJncyAqLyl7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7XG4gIH07XG59OyIsInZhciBnbG9iYWwgICAgID0gcmVxdWlyZSgnLi8kLmdsb2JhbCcpXG4gICwgY29yZSAgICAgICA9IHJlcXVpcmUoJy4vJC5jb3JlJylcbiAgLCBoaWRlICAgICAgID0gcmVxdWlyZSgnLi8kLmhpZGUnKVxuICAsICRyZWRlZiAgICAgPSByZXF1aXJlKCcuLyQucmVkZWYnKVxuICAsIFBST1RPVFlQRSAgPSAncHJvdG90eXBlJztcbnZhciBjdHggPSBmdW5jdGlvbihmbiwgdGhhdCl7XG4gIHJldHVybiBmdW5jdGlvbigpe1xuICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICB9O1xufTtcbnZhciAkZGVmID0gZnVuY3Rpb24odHlwZSwgbmFtZSwgc291cmNlKXtcbiAgdmFyIGtleSwgb3duLCBvdXQsIGV4cFxuICAgICwgaXNHbG9iYWwgPSB0eXBlICYgJGRlZi5HXG4gICAgLCBpc1Byb3RvICA9IHR5cGUgJiAkZGVmLlBcbiAgICAsIHRhcmdldCAgID0gaXNHbG9iYWwgPyBnbG9iYWwgOiB0eXBlICYgJGRlZi5TXG4gICAgICAgID8gZ2xvYmFsW25hbWVdIHx8IChnbG9iYWxbbmFtZV0gPSB7fSkgOiAoZ2xvYmFsW25hbWVdIHx8IHt9KVtQUk9UT1RZUEVdXG4gICAgLCBleHBvcnRzICA9IGlzR2xvYmFsID8gY29yZSA6IGNvcmVbbmFtZV0gfHwgKGNvcmVbbmFtZV0gPSB7fSk7XG4gIGlmKGlzR2xvYmFsKXNvdXJjZSA9IG5hbWU7XG4gIGZvcihrZXkgaW4gc291cmNlKXtcbiAgICAvLyBjb250YWlucyBpbiBuYXRpdmVcbiAgICBvd24gPSAhKHR5cGUgJiAkZGVmLkYpICYmIHRhcmdldCAmJiBrZXkgaW4gdGFyZ2V0O1xuICAgIC8vIGV4cG9ydCBuYXRpdmUgb3IgcGFzc2VkXG4gICAgb3V0ID0gKG93biA/IHRhcmdldCA6IHNvdXJjZSlba2V5XTtcbiAgICAvLyBiaW5kIHRpbWVycyB0byBnbG9iYWwgZm9yIGNhbGwgZnJvbSBleHBvcnQgY29udGV4dFxuICAgIGlmKHR5cGUgJiAkZGVmLkIgJiYgb3duKWV4cCA9IGN0eChvdXQsIGdsb2JhbCk7XG4gICAgZWxzZSBleHAgPSBpc1Byb3RvICYmIHR5cGVvZiBvdXQgPT0gJ2Z1bmN0aW9uJyA/IGN0eChGdW5jdGlvbi5jYWxsLCBvdXQpIDogb3V0O1xuICAgIC8vIGV4dGVuZCBnbG9iYWxcbiAgICBpZih0YXJnZXQgJiYgIW93bikkcmVkZWYodGFyZ2V0LCBrZXksIG91dCk7XG4gICAgLy8gZXhwb3J0XG4gICAgaWYoZXhwb3J0c1trZXldICE9IG91dCloaWRlKGV4cG9ydHMsIGtleSwgZXhwKTtcbiAgICBpZihpc1Byb3RvKShleHBvcnRzW1BST1RPVFlQRV0gfHwgKGV4cG9ydHNbUFJPVE9UWVBFXSA9IHt9KSlba2V5XSA9IG91dDtcbiAgfVxufTtcbmdsb2JhbC5jb3JlID0gY29yZTtcbi8vIHR5cGUgYml0bWFwXG4kZGVmLkYgPSAxOyAgLy8gZm9yY2VkXG4kZGVmLkcgPSAyOyAgLy8gZ2xvYmFsXG4kZGVmLlMgPSA0OyAgLy8gc3RhdGljXG4kZGVmLlAgPSA4OyAgLy8gcHJvdG9cbiRkZWYuQiA9IDE2OyAvLyBiaW5kXG4kZGVmLlcgPSAzMjsgLy8gd3JhcFxubW9kdWxlLmV4cG9ydHMgPSAkZGVmOyIsIi8vIDcuMi4xIFJlcXVpcmVPYmplY3RDb2VyY2libGUoYXJndW1lbnQpXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgaWYoaXQgPT0gdW5kZWZpbmVkKXRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uICBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTsiLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLyQuaXMtb2JqZWN0JylcbiAgLCBkb2N1bWVudCA9IHJlcXVpcmUoJy4vJC5nbG9iYWwnKS5kb2N1bWVudFxuICAvLyBpbiBvbGQgSUUgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCdcbiAgLCBpcyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTsiLCIvLyBhbGwgZW51bWVyYWJsZSBvYmplY3Qga2V5cywgaW5jbHVkZXMgc3ltYm9sc1xudmFyICQgPSByZXF1aXJlKCcuLyQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICB2YXIga2V5cyAgICAgICA9ICQuZ2V0S2V5cyhpdClcbiAgICAsIGdldFN5bWJvbHMgPSAkLmdldFN5bWJvbHM7XG4gIGlmKGdldFN5bWJvbHMpe1xuICAgIHZhciBzeW1ib2xzID0gZ2V0U3ltYm9scyhpdClcbiAgICAgICwgaXNFbnVtICA9ICQuaXNFbnVtXG4gICAgICAsIGkgICAgICAgPSAwXG4gICAgICAsIGtleTtcbiAgICB3aGlsZShzeW1ib2xzLmxlbmd0aCA+IGkpaWYoaXNFbnVtLmNhbGwoaXQsIGtleSA9IHN5bWJvbHNbaSsrXSkpa2V5cy5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIGtleXM7XG59OyIsIi8vIDIwLjIuMi4xNCBNYXRoLmV4cG0xKHgpXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGguZXhwbTEgfHwgZnVuY3Rpb24gZXhwbTEoeCl7XG4gIHJldHVybiAoeCA9ICt4KSA9PSAwID8geCA6IHggPiAtMWUtNiAmJiB4IDwgMWUtNiA/IHggKyB4ICogeCAvIDIgOiBNYXRoLmV4cCh4KSAtIDE7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oS0VZKXtcbiAgdmFyIHJlID0gLy4vO1xuICB0cnkge1xuICAgICcvLi8nW0tFWV0ocmUpO1xuICB9IGNhdGNoKGUpe1xuICAgIHRyeSB7XG4gICAgICByZVtyZXF1aXJlKCcuLyQud2tzJykoJ21hdGNoJyldID0gZmFsc2U7XG4gICAgICByZXR1cm4gIScvLi8nW0tFWV0ocmUpO1xuICAgIH0gY2F0Y2goZil7IC8qIGVtcHR5ICovIH1cbiAgfSByZXR1cm4gdHJ1ZTtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihleGVjKXtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFleGVjKCk7XG4gIH0gY2F0Y2goZSl7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07IiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihLRVksIGxlbmd0aCwgZXhlYyl7XG4gIHZhciBkZWZpbmVkICA9IHJlcXVpcmUoJy4vJC5kZWZpbmVkJylcbiAgICAsIFNZTUJPTCAgID0gcmVxdWlyZSgnLi8kLndrcycpKEtFWSlcbiAgICAsIG9yaWdpbmFsID0gJydbS0VZXTtcbiAgaWYocmVxdWlyZSgnLi8kLmZhaWxzJykoZnVuY3Rpb24oKXtcbiAgICB2YXIgTyA9IHt9O1xuICAgIE9bU1lNQk9MXSA9IGZ1bmN0aW9uKCl7IHJldHVybiA3OyB9O1xuICAgIHJldHVybiAnJ1tLRVldKE8pICE9IDc7XG4gIH0pKXtcbiAgICByZXF1aXJlKCcuLyQucmVkZWYnKShTdHJpbmcucHJvdG90eXBlLCBLRVksIGV4ZWMoZGVmaW5lZCwgU1lNQk9MLCBvcmlnaW5hbCkpO1xuICAgIHJlcXVpcmUoJy4vJC5oaWRlJykoUmVnRXhwLnByb3RvdHlwZSwgU1lNQk9MLCBsZW5ndGggPT0gMlxuICAgICAgLy8gMjEuMi41LjggUmVnRXhwLnByb3RvdHlwZVtAQHJlcGxhY2VdKHN0cmluZywgcmVwbGFjZVZhbHVlKVxuICAgICAgLy8gMjEuMi41LjExIFJlZ0V4cC5wcm90b3R5cGVbQEBzcGxpdF0oc3RyaW5nLCBsaW1pdClcbiAgICAgID8gZnVuY3Rpb24oc3RyaW5nLCBhcmcpeyByZXR1cm4gb3JpZ2luYWwuY2FsbChzdHJpbmcsIHRoaXMsIGFyZyk7IH1cbiAgICAgIC8vIDIxLjIuNS42IFJlZ0V4cC5wcm90b3R5cGVbQEBtYXRjaF0oc3RyaW5nKVxuICAgICAgLy8gMjEuMi41LjkgUmVnRXhwLnByb3RvdHlwZVtAQHNlYXJjaF0oc3RyaW5nKVxuICAgICAgOiBmdW5jdGlvbihzdHJpbmcpeyByZXR1cm4gb3JpZ2luYWwuY2FsbChzdHJpbmcsIHRoaXMpOyB9XG4gICAgKTtcbiAgfVxufTsiLCIndXNlIHN0cmljdCc7XG4vLyAyMS4yLjUuMyBnZXQgUmVnRXhwLnByb3RvdHlwZS5mbGFnc1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi8kLmFuLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpe1xuICB2YXIgdGhhdCAgID0gYW5PYmplY3QodGhpcylcbiAgICAsIHJlc3VsdCA9ICcnO1xuICBpZih0aGF0Lmdsb2JhbClyZXN1bHQgKz0gJ2cnO1xuICBpZih0aGF0Lmlnbm9yZUNhc2UpcmVzdWx0ICs9ICdpJztcbiAgaWYodGhhdC5tdWx0aWxpbmUpcmVzdWx0ICs9ICdtJztcbiAgaWYodGhhdC51bmljb2RlKXJlc3VsdCArPSAndSc7XG4gIGlmKHRoYXQuc3RpY2t5KXJlc3VsdCArPSAneSc7XG4gIHJldHVybiByZXN1bHQ7XG59OyIsInZhciBjdHggICAgICAgICA9IHJlcXVpcmUoJy4vJC5jdHgnKVxuICAsIGNhbGwgICAgICAgID0gcmVxdWlyZSgnLi8kLml0ZXItY2FsbCcpXG4gICwgaXNBcnJheUl0ZXIgPSByZXF1aXJlKCcuLyQuaXMtYXJyYXktaXRlcicpXG4gICwgYW5PYmplY3QgICAgPSByZXF1aXJlKCcuLyQuYW4tb2JqZWN0JylcbiAgLCB0b0xlbmd0aCAgICA9IHJlcXVpcmUoJy4vJC50by1sZW5ndGgnKVxuICAsIGdldEl0ZXJGbiAgID0gcmVxdWlyZSgnLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXRlcmFibGUsIGVudHJpZXMsIGZuLCB0aGF0KXtcbiAgdmFyIGl0ZXJGbiA9IGdldEl0ZXJGbihpdGVyYWJsZSlcbiAgICAsIGYgICAgICA9IGN0eChmbiwgdGhhdCwgZW50cmllcyA/IDIgOiAxKVxuICAgICwgaW5kZXggID0gMFxuICAgICwgbGVuZ3RoLCBzdGVwLCBpdGVyYXRvcjtcbiAgaWYodHlwZW9mIGl0ZXJGbiAhPSAnZnVuY3Rpb24nKXRocm93IFR5cGVFcnJvcihpdGVyYWJsZSArICcgaXMgbm90IGl0ZXJhYmxlIScpO1xuICAvLyBmYXN0IGNhc2UgZm9yIGFycmF5cyB3aXRoIGRlZmF1bHQgaXRlcmF0b3JcbiAgaWYoaXNBcnJheUl0ZXIoaXRlckZuKSlmb3IobGVuZ3RoID0gdG9MZW5ndGgoaXRlcmFibGUubGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4Kyspe1xuICAgIGVudHJpZXMgPyBmKGFuT2JqZWN0KHN0ZXAgPSBpdGVyYWJsZVtpbmRleF0pWzBdLCBzdGVwWzFdKSA6IGYoaXRlcmFibGVbaW5kZXhdKTtcbiAgfSBlbHNlIGZvcihpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKGl0ZXJhYmxlKTsgIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lOyApe1xuICAgIGNhbGwoaXRlcmF0b3IsIGYsIHN0ZXAudmFsdWUsIGVudHJpZXMpO1xuICB9XG59OyIsIi8vIGZhbGxiYWNrIGZvciBJRTExIGJ1Z2d5IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHdpdGggaWZyYW1lIGFuZCB3aW5kb3dcbnZhciB0b1N0cmluZyAgPSB7fS50b1N0cmluZ1xuICAsIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vJC50by1pb2JqZWN0JylcbiAgLCBnZXROYW1lcyAgPSByZXF1aXJlKCcuLyQnKS5nZXROYW1lcztcblxudmFyIHdpbmRvd05hbWVzID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc1xuICA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHdpbmRvdykgOiBbXTtcblxudmFyIGdldFdpbmRvd05hbWVzID0gZnVuY3Rpb24oaXQpe1xuICB0cnkge1xuICAgIHJldHVybiBnZXROYW1lcyhpdCk7XG4gIH0gY2F0Y2goZSl7XG4gICAgcmV0dXJuIHdpbmRvd05hbWVzLnNsaWNlKCk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzLmdldCA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpe1xuICBpZih3aW5kb3dOYW1lcyAmJiB0b1N0cmluZy5jYWxsKGl0KSA9PSAnW29iamVjdCBXaW5kb3ddJylyZXR1cm4gZ2V0V2luZG93TmFtZXMoaXQpO1xuICByZXR1cm4gZ2V0TmFtZXModG9JT2JqZWN0KGl0KSk7XG59OyIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG52YXIgZ2xvYmFsID0gbW9kdWxlLmV4cG9ydHMgPSB0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnICYmIHdpbmRvdy5NYXRoID09IE1hdGhcbiAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiAhPSAndW5kZWZpbmVkJyAmJiBzZWxmLk1hdGggPT0gTWF0aCA/IHNlbGYgOiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuaWYodHlwZW9mIF9fZyA9PSAnbnVtYmVyJylfX2cgPSBnbG9iYWw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWYiLCJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIGtleSl7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xufTsiLCJ2YXIgJCAgICAgICAgICA9IHJlcXVpcmUoJy4vJCcpXG4gICwgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vJC5wcm9wZXJ0eS1kZXNjJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vJC5zdXBwb3J0LWRlc2MnKSA/IGZ1bmN0aW9uKG9iamVjdCwga2V5LCB2YWx1ZSl7XG4gIHJldHVybiAkLnNldERlc2Mob2JqZWN0LCBrZXksIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbihvYmplY3QsIGtleSwgdmFsdWUpe1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vJC5nbG9iYWwnKS5kb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7IiwiLy8gZmFzdCBhcHBseSwgaHR0cDovL2pzcGVyZi5sbmtpdC5jb20vZmFzdC1hcHBseS81XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGZuLCBhcmdzLCB0aGF0KXtcbiAgdmFyIHVuID0gdGhhdCA9PT0gdW5kZWZpbmVkO1xuICBzd2l0Y2goYXJncy5sZW5ndGgpe1xuICAgIGNhc2UgMDogcmV0dXJuIHVuID8gZm4oKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0KTtcbiAgICBjYXNlIDE6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgY2FzZSAzOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICBjYXNlIDQ6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuICB9IHJldHVybiAgICAgICAgICAgICAgZm4uYXBwbHkodGhhdCwgYXJncyk7XG59OyIsIi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG52YXIgY29mID0gcmVxdWlyZSgnLi8kLmNvZicpO1xubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKSA/IE9iamVjdCA6IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGNvZihpdCkgPT0gJ1N0cmluZycgPyBpdC5zcGxpdCgnJykgOiBPYmplY3QoaXQpO1xufTsiLCIvLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi8kLml0ZXJhdG9ycycpXG4gICwgSVRFUkFUT1IgID0gcmVxdWlyZSgnLi8kLndrcycpKCdpdGVyYXRvcicpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiAoSXRlcmF0b3JzLkFycmF5IHx8IEFycmF5LnByb3RvdHlwZVtJVEVSQVRPUl0pID09PSBpdDtcbn07IiwiLy8gNy4yLjIgSXNBcnJheShhcmd1bWVudClcbnZhciBjb2YgPSByZXF1aXJlKCcuLyQuY29mJyk7XG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24oYXJnKXtcbiAgcmV0dXJuIGNvZihhcmcpID09ICdBcnJheSc7XG59OyIsIi8vIDIwLjEuMi4zIE51bWJlci5pc0ludGVnZXIobnVtYmVyKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi8kLmlzLW9iamVjdCcpXG4gICwgZmxvb3IgICAgPSBNYXRoLmZsb29yO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0ludGVnZXIoaXQpe1xuICByZXR1cm4gIWlzT2JqZWN0KGl0KSAmJiBpc0Zpbml0ZShpdCkgJiYgZmxvb3IoaXQpID09PSBpdDtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59OyIsIi8vIDcuMi44IElzUmVnRXhwKGFyZ3VtZW50KVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi8kLmlzLW9iamVjdCcpXG4gICwgY29mICAgICAgPSByZXF1aXJlKCcuLyQuY29mJylcbiAgLCBNQVRDSCAgICA9IHJlcXVpcmUoJy4vJC53a3MnKSgnbWF0Y2gnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICB2YXIgaXNSZWdFeHA7XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgKChpc1JlZ0V4cCA9IGl0W01BVENIXSkgIT09IHVuZGVmaW5lZCA/ICEhaXNSZWdFeHAgOiBjb2YoaXQpID09ICdSZWdFeHAnKTtcbn07IiwiLy8gY2FsbCBzb21ldGhpbmcgb24gaXRlcmF0b3Igc3RlcCB3aXRoIHNhZmUgY2xvc2luZyBvbiBlcnJvclxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi8kLmFuLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdGVyYXRvciwgZm4sIHZhbHVlLCBlbnRyaWVzKXtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZW50cmllcyA/IGZuKGFuT2JqZWN0KHZhbHVlKVswXSwgdmFsdWVbMV0pIDogZm4odmFsdWUpO1xuICAvLyA3LjQuNiBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCBjb21wbGV0aW9uKVxuICB9IGNhdGNoKGUpe1xuICAgIHZhciByZXQgPSBpdGVyYXRvclsncmV0dXJuJ107XG4gICAgaWYocmV0ICE9PSB1bmRlZmluZWQpYW5PYmplY3QocmV0LmNhbGwoaXRlcmF0b3IpKTtcbiAgICB0aHJvdyBlO1xuICB9XG59OyIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi8kJylcbiAgLCBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuXG4vLyAyNS4xLjIuMS4xICVJdGVyYXRvclByb3RvdHlwZSVbQEBpdGVyYXRvcl0oKVxucmVxdWlyZSgnLi8kLmhpZGUnKShJdGVyYXRvclByb3RvdHlwZSwgcmVxdWlyZSgnLi8kLndrcycpKCdpdGVyYXRvcicpLCBmdW5jdGlvbigpeyByZXR1cm4gdGhpczsgfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpe1xuICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSAkLmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwge25leHQ6IHJlcXVpcmUoJy4vJC5wcm9wZXJ0eS1kZXNjJykoMSxuZXh0KX0pO1xuICByZXF1aXJlKCcuLyQudGFnJykoQ29uc3RydWN0b3IsIE5BTUUgKyAnIEl0ZXJhdG9yJyk7XG59OyIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZICAgICAgICAgPSByZXF1aXJlKCcuLyQubGlicmFyeScpXG4gICwgJGRlZiAgICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmRlZicpXG4gICwgJHJlZGVmICAgICAgICAgID0gcmVxdWlyZSgnLi8kLnJlZGVmJylcbiAgLCBoaWRlICAgICAgICAgICAgPSByZXF1aXJlKCcuLyQuaGlkZScpXG4gICwgaGFzICAgICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmhhcycpXG4gICwgU1lNQk9MX0lURVJBVE9SID0gcmVxdWlyZSgnLi8kLndrcycpKCdpdGVyYXRvcicpXG4gICwgSXRlcmF0b3JzICAgICAgID0gcmVxdWlyZSgnLi8kLml0ZXJhdG9ycycpXG4gICwgQlVHR1kgICAgICAgICAgID0gIShbXS5rZXlzICYmICduZXh0JyBpbiBbXS5rZXlzKCkpIC8vIFNhZmFyaSBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbiAgLCBGRl9JVEVSQVRPUiAgICAgPSAnQEBpdGVyYXRvcidcbiAgLCBLRVlTICAgICAgICAgICAgPSAna2V5cydcbiAgLCBWQUxVRVMgICAgICAgICAgPSAndmFsdWVzJztcbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24oKXsgcmV0dXJuIHRoaXM7IH07XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKEJhc2UsIE5BTUUsIENvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFKXtcbiAgcmVxdWlyZSgnLi8kLml0ZXItY3JlYXRlJykoQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpO1xuICB2YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24oa2luZCl7XG4gICAgc3dpdGNoKGtpbmQpe1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgICAgY2FzZSBWQUxVRVM6IHJldHVybiBmdW5jdGlvbiB2YWx1ZXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICB9IHJldHVybiBmdW5jdGlvbiBlbnRyaWVzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gIH07XG4gIHZhciBUQUcgICAgICA9IE5BTUUgKyAnIEl0ZXJhdG9yJ1xuICAgICwgcHJvdG8gICAgPSBCYXNlLnByb3RvdHlwZVxuICAgICwgX25hdGl2ZSAgPSBwcm90b1tTWU1CT0xfSVRFUkFUT1JdIHx8IHByb3RvW0ZGX0lURVJBVE9SXSB8fCBERUZBVUxUICYmIHByb3RvW0RFRkFVTFRdXG4gICAgLCBfZGVmYXVsdCA9IF9uYXRpdmUgfHwgY3JlYXRlTWV0aG9kKERFRkFVTFQpXG4gICAgLCBtZXRob2RzLCBrZXk7XG4gIC8vIEZpeCBuYXRpdmVcbiAgaWYoX25hdGl2ZSl7XG4gICAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0gcmVxdWlyZSgnLi8kJykuZ2V0UHJvdG8oX2RlZmF1bHQuY2FsbChuZXcgQmFzZSkpO1xuICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICByZXF1aXJlKCcuLyQudGFnJykoSXRlcmF0b3JQcm90b3R5cGUsIFRBRywgdHJ1ZSk7XG4gICAgLy8gRkYgZml4XG4gICAgaWYoIUxJQlJBUlkgJiYgaGFzKHByb3RvLCBGRl9JVEVSQVRPUikpaGlkZShJdGVyYXRvclByb3RvdHlwZSwgU1lNQk9MX0lURVJBVE9SLCByZXR1cm5UaGlzKTtcbiAgfVxuICAvLyBEZWZpbmUgaXRlcmF0b3JcbiAgaWYoIUxJQlJBUlkgfHwgRk9SQ0UpaGlkZShwcm90bywgU1lNQk9MX0lURVJBVE9SLCBfZGVmYXVsdCk7XG4gIC8vIFBsdWcgZm9yIGxpYnJhcnlcbiAgSXRlcmF0b3JzW05BTUVdID0gX2RlZmF1bHQ7XG4gIEl0ZXJhdG9yc1tUQUddICA9IHJldHVyblRoaXM7XG4gIGlmKERFRkFVTFQpe1xuICAgIG1ldGhvZHMgPSB7XG4gICAgICB2YWx1ZXM6ICBERUZBVUxUID09IFZBTFVFUyA/IF9kZWZhdWx0IDogY3JlYXRlTWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiAgICBJU19TRVQgICAgICAgICAgICA/IF9kZWZhdWx0IDogY3JlYXRlTWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogREVGQVVMVCAhPSBWQUxVRVMgPyBfZGVmYXVsdCA6IGNyZWF0ZU1ldGhvZCgnZW50cmllcycpXG4gICAgfTtcbiAgICBpZihGT1JDRSlmb3Ioa2V5IGluIG1ldGhvZHMpe1xuICAgICAgaWYoIShrZXkgaW4gcHJvdG8pKSRyZWRlZihwcm90bywga2V5LCBtZXRob2RzW2tleV0pO1xuICAgIH0gZWxzZSAkZGVmKCRkZWYuUCArICRkZWYuRiAqIEJVR0dZLCBOQU1FLCBtZXRob2RzKTtcbiAgfVxufTsiLCJ2YXIgU1lNQk9MX0lURVJBVE9SID0gcmVxdWlyZSgnLi8kLndrcycpKCdpdGVyYXRvcicpXG4gICwgU0FGRV9DTE9TSU5HICAgID0gZmFsc2U7XG50cnkge1xuICB2YXIgcml0ZXIgPSBbN11bU1lNQk9MX0lURVJBVE9SXSgpO1xuICByaXRlclsncmV0dXJuJ10gPSBmdW5jdGlvbigpeyBTQUZFX0NMT1NJTkcgPSB0cnVlOyB9O1xuICBBcnJheS5mcm9tKHJpdGVyLCBmdW5jdGlvbigpeyB0aHJvdyAyOyB9KTtcbn0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZXhlYywgc2tpcENsb3Npbmcpe1xuICBpZighc2tpcENsb3NpbmcgJiYgIVNBRkVfQ0xPU0lORylyZXR1cm4gZmFsc2U7XG4gIHZhciBzYWZlID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgdmFyIGFyciAgPSBbN11cbiAgICAgICwgaXRlciA9IGFycltTWU1CT0xfSVRFUkFUT1JdKCk7XG4gICAgaXRlci5uZXh0ID0gZnVuY3Rpb24oKXsgc2FmZSA9IHRydWU7IH07XG4gICAgYXJyW1NZTUJPTF9JVEVSQVRPUl0gPSBmdW5jdGlvbigpeyByZXR1cm4gaXRlcjsgfTtcbiAgICBleGVjKGFycik7XG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIHNhZmU7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZG9uZSwgdmFsdWUpe1xuICByZXR1cm4ge3ZhbHVlOiB2YWx1ZSwgZG9uZTogISFkb25lfTtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSB7fTsiLCJ2YXIgJE9iamVjdCA9IE9iamVjdDtcbm1vZHVsZS5leHBvcnRzID0ge1xuICBjcmVhdGU6ICAgICAkT2JqZWN0LmNyZWF0ZSxcbiAgZ2V0UHJvdG86ICAgJE9iamVjdC5nZXRQcm90b3R5cGVPZixcbiAgaXNFbnVtOiAgICAge30ucHJvcGVydHlJc0VudW1lcmFibGUsXG4gIGdldERlc2M6ICAgICRPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICBzZXREZXNjOiAgICAkT2JqZWN0LmRlZmluZVByb3BlcnR5LFxuICBzZXREZXNjczogICAkT2JqZWN0LmRlZmluZVByb3BlcnRpZXMsXG4gIGdldEtleXM6ICAgICRPYmplY3Qua2V5cyxcbiAgZ2V0TmFtZXM6ICAgJE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzLFxuICBnZXRTeW1ib2xzOiAkT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxcbiAgZWFjaDogICAgICAgW10uZm9yRWFjaFxufTsiLCJ2YXIgJCAgICAgICAgID0gcmVxdWlyZSgnLi8kJylcbiAgLCB0b0lPYmplY3QgPSByZXF1aXJlKCcuLyQudG8taW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvYmplY3QsIGVsKXtcbiAgdmFyIE8gICAgICA9IHRvSU9iamVjdChvYmplY3QpXG4gICAgLCBrZXlzICAgPSAkLmdldEtleXMoTylcbiAgICAsIGxlbmd0aCA9IGtleXMubGVuZ3RoXG4gICAgLCBpbmRleCAgPSAwXG4gICAgLCBrZXk7XG4gIHdoaWxlKGxlbmd0aCA+IGluZGV4KWlmKE9ba2V5ID0ga2V5c1tpbmRleCsrXV0gPT09IGVsKXJldHVybiBrZXk7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gZmFsc2U7IiwiLy8gMjAuMi4yLjIwIE1hdGgubG9nMXAoeClcbm1vZHVsZS5leHBvcnRzID0gTWF0aC5sb2cxcCB8fCBmdW5jdGlvbiBsb2cxcCh4KXtcbiAgcmV0dXJuICh4ID0gK3gpID4gLTFlLTggJiYgeCA8IDFlLTggPyB4IC0geCAqIHggLyAyIDogTWF0aC5sb2coMSArIHgpO1xufTsiLCJ2YXIgZ2xvYmFsICAgID0gcmVxdWlyZSgnLi8kLmdsb2JhbCcpXG4gICwgbWFjcm90YXNrID0gcmVxdWlyZSgnLi8kLnRhc2snKS5zZXRcbiAgLCBPYnNlcnZlciAgPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlclxuICAsIHByb2Nlc3MgICA9IGdsb2JhbC5wcm9jZXNzXG4gICwgaXNOb2RlICAgID0gcmVxdWlyZSgnLi8kLmNvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJ1xuICAsIGhlYWQsIGxhc3QsIG5vdGlmeTtcblxudmFyIGZsdXNoID0gZnVuY3Rpb24oKXtcbiAgdmFyIHBhcmVudCwgZG9tYWluO1xuICBpZihpc05vZGUgJiYgKHBhcmVudCA9IHByb2Nlc3MuZG9tYWluKSl7XG4gICAgcHJvY2Vzcy5kb21haW4gPSBudWxsO1xuICAgIHBhcmVudC5leGl0KCk7XG4gIH1cbiAgd2hpbGUoaGVhZCl7XG4gICAgZG9tYWluID0gaGVhZC5kb21haW47XG4gICAgaWYoZG9tYWluKWRvbWFpbi5lbnRlcigpO1xuICAgIGhlYWQuZm4uY2FsbCgpOyAvLyA8LSBjdXJyZW50bHkgd2UgdXNlIGl0IG9ubHkgZm9yIFByb21pc2UgLSB0cnkgLyBjYXRjaCBub3QgcmVxdWlyZWRcbiAgICBpZihkb21haW4pZG9tYWluLmV4aXQoKTtcbiAgICBoZWFkID0gaGVhZC5uZXh0O1xuICB9IGxhc3QgPSB1bmRlZmluZWQ7XG4gIGlmKHBhcmVudClwYXJlbnQuZW50ZXIoKTtcbn07XG5cbi8vIE5vZGUuanNcbmlmKGlzTm9kZSl7XG4gIG5vdGlmeSA9IGZ1bmN0aW9uKCl7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhmbHVzaCk7XG4gIH07XG4vLyBicm93c2VycyB3aXRoIE11dGF0aW9uT2JzZXJ2ZXJcbn0gZWxzZSBpZihPYnNlcnZlcil7XG4gIHZhciB0b2dnbGUgPSAxXG4gICAgLCBub2RlICAgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gIG5ldyBPYnNlcnZlcihmbHVzaCkub2JzZXJ2ZShub2RlLCB7Y2hhcmFjdGVyRGF0YTogdHJ1ZX0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICBub3RpZnkgPSBmdW5jdGlvbigpe1xuICAgIG5vZGUuZGF0YSA9IHRvZ2dsZSA9IC10b2dnbGU7XG4gIH07XG4vLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuLy8gLSBzZXRJbW1lZGlhdGVcbi8vIC0gTWVzc2FnZUNoYW5uZWxcbi8vIC0gd2luZG93LnBvc3RNZXNzYWdcbi8vIC0gb25yZWFkeXN0YXRlY2hhbmdlXG4vLyAtIHNldFRpbWVvdXRcbn0gZWxzZSB7XG4gIG5vdGlmeSA9IGZ1bmN0aW9uKCl7XG4gICAgLy8gc3RyYW5nZSBJRSArIHdlYnBhY2sgZGV2IHNlcnZlciBidWcgLSB1c2UgLmNhbGwoZ2xvYmFsKVxuICAgIG1hY3JvdGFzay5jYWxsKGdsb2JhbCwgZmx1c2gpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGFzYXAoZm4pe1xuICB2YXIgdGFzayA9IHtmbjogZm4sIG5leHQ6IHVuZGVmaW5lZCwgZG9tYWluOiBpc05vZGUgJiYgcHJvY2Vzcy5kb21haW59O1xuICBpZihsYXN0KWxhc3QubmV4dCA9IHRhc2s7XG4gIGlmKCFoZWFkKXtcbiAgICBoZWFkID0gdGFzaztcbiAgICBub3RpZnkoKTtcbiAgfSBsYXN0ID0gdGFzaztcbn07IiwidmFyICRyZWRlZiA9IHJlcXVpcmUoJy4vJC5yZWRlZicpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih0YXJnZXQsIHNyYyl7XG4gIGZvcih2YXIga2V5IGluIHNyYykkcmVkZWYodGFyZ2V0LCBrZXksIHNyY1trZXldKTtcbiAgcmV0dXJuIHRhcmdldDtcbn07IiwidmFyICQgICAgICAgICA9IHJlcXVpcmUoJy4vJCcpXG4gICwgb3duS2V5cyAgID0gcmVxdWlyZSgnLi8kLm93bi1rZXlzJylcbiAgLCB0b0lPYmplY3QgPSByZXF1aXJlKCcuLyQudG8taW9iamVjdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRlZmluZSh0YXJnZXQsIG1peGluKXtcbiAgdmFyIGtleXMgICA9IG93bktleXModG9JT2JqZWN0KG1peGluKSlcbiAgICAsIGxlbmd0aCA9IGtleXMubGVuZ3RoXG4gICAgLCBpID0gMCwga2V5O1xuICB3aGlsZShsZW5ndGggPiBpKSQuc2V0RGVzYyh0YXJnZXQsIGtleSA9IGtleXNbaSsrXSwgJC5nZXREZXNjKG1peGluLCBrZXkpKTtcbiAgcmV0dXJuIHRhcmdldDtcbn07IiwiLy8gbW9zdCBPYmplY3QgbWV0aG9kcyBieSBFUzYgc2hvdWxkIGFjY2VwdCBwcmltaXRpdmVzXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKEtFWSwgZXhlYyl7XG4gIHZhciAkZGVmID0gcmVxdWlyZSgnLi8kLmRlZicpXG4gICAgLCBmbiAgID0gKHJlcXVpcmUoJy4vJC5jb3JlJykuT2JqZWN0IHx8IHt9KVtLRVldIHx8IE9iamVjdFtLRVldXG4gICAgLCBleHAgID0ge307XG4gIGV4cFtLRVldID0gZXhlYyhmbik7XG4gICRkZWYoJGRlZi5TICsgJGRlZi5GICogcmVxdWlyZSgnLi8kLmZhaWxzJykoZnVuY3Rpb24oKXsgZm4oMSk7IH0pLCAnT2JqZWN0JywgZXhwKTtcbn07IiwidmFyICQgICAgICAgICA9IHJlcXVpcmUoJy4vJCcpXG4gICwgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi8kLnRvLWlvYmplY3QnKVxuICAsIGlzRW51bSAgICA9ICQuaXNFbnVtO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpc0VudHJpZXMpe1xuICByZXR1cm4gZnVuY3Rpb24oaXQpe1xuICAgIHZhciBPICAgICAgPSB0b0lPYmplY3QoaXQpXG4gICAgICAsIGtleXMgICA9ICQuZ2V0S2V5cyhPKVxuICAgICAgLCBsZW5ndGggPSBrZXlzLmxlbmd0aFxuICAgICAgLCBpICAgICAgPSAwXG4gICAgICAsIHJlc3VsdCA9IFtdXG4gICAgICAsIGtleTtcbiAgICB3aGlsZShsZW5ndGggPiBpKWlmKGlzRW51bS5jYWxsKE8sIGtleSA9IGtleXNbaSsrXSkpe1xuICAgICAgcmVzdWx0LnB1c2goaXNFbnRyaWVzID8gW2tleSwgT1trZXldXSA6IE9ba2V5XSk7XG4gICAgfSByZXR1cm4gcmVzdWx0O1xuICB9O1xufTsiLCIvLyBhbGwgb2JqZWN0IGtleXMsIGluY2x1ZGVzIG5vbi1lbnVtZXJhYmxlIGFuZCBzeW1ib2xzXG52YXIgJCAgICAgICAgPSByZXF1aXJlKCcuLyQnKVxuICAsIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi8kLmFuLW9iamVjdCcpXG4gICwgUmVmbGVjdCAgPSByZXF1aXJlKCcuLyQuZ2xvYmFsJykuUmVmbGVjdDtcbm1vZHVsZS5leHBvcnRzID0gUmVmbGVjdCAmJiBSZWZsZWN0Lm93bktleXMgfHwgZnVuY3Rpb24gb3duS2V5cyhpdCl7XG4gIHZhciBrZXlzICAgICAgID0gJC5nZXROYW1lcyhhbk9iamVjdChpdCkpXG4gICAgLCBnZXRTeW1ib2xzID0gJC5nZXRTeW1ib2xzO1xuICByZXR1cm4gZ2V0U3ltYm9scyA/IGtleXMuY29uY2F0KGdldFN5bWJvbHMoaXQpKSA6IGtleXM7XG59OyIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXRoICAgICAgPSByZXF1aXJlKCcuLyQucGF0aCcpXG4gICwgaW52b2tlICAgID0gcmVxdWlyZSgnLi8kLmludm9rZScpXG4gICwgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi8kLmEtZnVuY3Rpb24nKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oLyogLi4ucGFyZ3MgKi8pe1xuICB2YXIgZm4gICAgID0gYUZ1bmN0aW9uKHRoaXMpXG4gICAgLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgLCBwYXJncyAgPSBBcnJheShsZW5ndGgpXG4gICAgLCBpICAgICAgPSAwXG4gICAgLCBfICAgICAgPSBwYXRoLl9cbiAgICAsIGhvbGRlciA9IGZhbHNlO1xuICB3aGlsZShsZW5ndGggPiBpKWlmKChwYXJnc1tpXSA9IGFyZ3VtZW50c1tpKytdKSA9PT0gXylob2xkZXIgPSB0cnVlO1xuICByZXR1cm4gZnVuY3Rpb24oLyogLi4uYXJncyAqLyl7XG4gICAgdmFyIHRoYXQgID0gdGhpc1xuICAgICAgLCAkJCAgICA9IGFyZ3VtZW50c1xuICAgICAgLCAkJGxlbiA9ICQkLmxlbmd0aFxuICAgICAgLCBqID0gMCwgayA9IDAsIGFyZ3M7XG4gICAgaWYoIWhvbGRlciAmJiAhJCRsZW4pcmV0dXJuIGludm9rZShmbiwgcGFyZ3MsIHRoYXQpO1xuICAgIGFyZ3MgPSBwYXJncy5zbGljZSgpO1xuICAgIGlmKGhvbGRlcilmb3IoO2xlbmd0aCA+IGo7IGorKylpZihhcmdzW2pdID09PSBfKWFyZ3Nbal0gPSAkJFtrKytdO1xuICAgIHdoaWxlKCQkbGVuID4gaylhcmdzLnB1c2goJCRbaysrXSk7XG4gICAgcmV0dXJuIGludm9rZShmbiwgYXJncywgdGhhdCk7XG4gIH07XG59OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi8kLmdsb2JhbCcpOyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oYml0bWFwLCB2YWx1ZSl7XG4gIHJldHVybiB7XG4gICAgZW51bWVyYWJsZSAgOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZSAgICA6ICEoYml0bWFwICYgNCksXG4gICAgdmFsdWUgICAgICAgOiB2YWx1ZVxuICB9O1xufTsiLCIvLyBhZGQgZmFrZSBGdW5jdGlvbiN0b1N0cmluZ1xuLy8gZm9yIGNvcnJlY3Qgd29yayB3cmFwcGVkIG1ldGhvZHMgLyBjb25zdHJ1Y3RvcnMgd2l0aCBtZXRob2RzIGxpa2UgTG9EYXNoIGlzTmF0aXZlXG52YXIgZ2xvYmFsICAgID0gcmVxdWlyZSgnLi8kLmdsb2JhbCcpXG4gICwgaGlkZSAgICAgID0gcmVxdWlyZSgnLi8kLmhpZGUnKVxuICAsIFNSQyAgICAgICA9IHJlcXVpcmUoJy4vJC51aWQnKSgnc3JjJylcbiAgLCBUT19TVFJJTkcgPSAndG9TdHJpbmcnXG4gICwgJHRvU3RyaW5nID0gRnVuY3Rpb25bVE9fU1RSSU5HXVxuICAsIFRQTCAgICAgICA9ICgnJyArICR0b1N0cmluZykuc3BsaXQoVE9fU1RSSU5HKTtcblxucmVxdWlyZSgnLi8kLmNvcmUnKS5pbnNwZWN0U291cmNlID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gJHRvU3RyaW5nLmNhbGwoaXQpO1xufTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oTywga2V5LCB2YWwsIHNhZmUpe1xuICBpZih0eXBlb2YgdmFsID09ICdmdW5jdGlvbicpe1xuICAgIHZhbC5oYXNPd25Qcm9wZXJ0eShTUkMpIHx8IGhpZGUodmFsLCBTUkMsIE9ba2V5XSA/ICcnICsgT1trZXldIDogVFBMLmpvaW4oU3RyaW5nKGtleSkpKTtcbiAgICB2YWwuaGFzT3duUHJvcGVydHkoJ25hbWUnKSB8fCBoaWRlKHZhbCwgJ25hbWUnLCBrZXkpO1xuICB9XG4gIGlmKE8gPT09IGdsb2JhbCl7XG4gICAgT1trZXldID0gdmFsO1xuICB9IGVsc2Uge1xuICAgIGlmKCFzYWZlKWRlbGV0ZSBPW2tleV07XG4gICAgaGlkZShPLCBrZXksIHZhbCk7XG4gIH1cbn0pKEZ1bmN0aW9uLnByb3RvdHlwZSwgVE9fU1RSSU5HLCBmdW5jdGlvbiB0b1N0cmluZygpe1xuICByZXR1cm4gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyAmJiB0aGlzW1NSQ10gfHwgJHRvU3RyaW5nLmNhbGwodGhpcyk7XG59KTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHJlZ0V4cCwgcmVwbGFjZSl7XG4gIHZhciByZXBsYWNlciA9IHJlcGxhY2UgPT09IE9iamVjdChyZXBsYWNlKSA/IGZ1bmN0aW9uKHBhcnQpe1xuICAgIHJldHVybiByZXBsYWNlW3BhcnRdO1xuICB9IDogcmVwbGFjZTtcbiAgcmV0dXJuIGZ1bmN0aW9uKGl0KXtcbiAgICByZXR1cm4gU3RyaW5nKGl0KS5yZXBsYWNlKHJlZ0V4cCwgcmVwbGFjZXIpO1xuICB9O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5pcyB8fCBmdW5jdGlvbiBpcyh4LCB5KXtcbiAgcmV0dXJuIHggPT09IHkgPyB4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geSA6IHggIT0geCAmJiB5ICE9IHk7XG59OyIsIi8vIFdvcmtzIHdpdGggX19wcm90b19fIG9ubHkuIE9sZCB2OCBjYW4ndCB3b3JrIHdpdGggbnVsbCBwcm90byBvYmplY3RzLlxuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cbnZhciBnZXREZXNjICA9IHJlcXVpcmUoJy4vJCcpLmdldERlc2NcbiAgLCBpc09iamVjdCA9IHJlcXVpcmUoJy4vJC5pcy1vYmplY3QnKVxuICAsIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi8kLmFuLW9iamVjdCcpO1xudmFyIGNoZWNrID0gZnVuY3Rpb24oTywgcHJvdG8pe1xuICBhbk9iamVjdChPKTtcbiAgaWYoIWlzT2JqZWN0KHByb3RvKSAmJiBwcm90byAhPT0gbnVsbCl0aHJvdyBUeXBlRXJyb3IocHJvdG8gKyBcIjogY2FuJ3Qgc2V0IGFzIHByb3RvdHlwZSFcIik7XG59O1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8ICgnX19wcm90b19fJyBpbiB7fSA/IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICBmdW5jdGlvbih0ZXN0LCBidWdneSwgc2V0KXtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNldCA9IHJlcXVpcmUoJy4vJC5jdHgnKShGdW5jdGlvbi5jYWxsLCBnZXREZXNjKE9iamVjdC5wcm90b3R5cGUsICdfX3Byb3RvX18nKS5zZXQsIDIpO1xuICAgICAgICBzZXQodGVzdCwgW10pO1xuICAgICAgICBidWdneSA9ICEodGVzdCBpbnN0YW5jZW9mIEFycmF5KTtcbiAgICAgIH0gY2F0Y2goZSl7IGJ1Z2d5ID0gdHJ1ZTsgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKE8sIHByb3RvKXtcbiAgICAgICAgY2hlY2soTywgcHJvdG8pO1xuICAgICAgICBpZihidWdneSlPLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgICAgICBlbHNlIHNldChPLCBwcm90byk7XG4gICAgICAgIHJldHVybiBPO1xuICAgICAgfTtcbiAgICB9KHt9LCBmYWxzZSkgOiB1bmRlZmluZWQpLFxuICBjaGVjazogY2hlY2tcbn07IiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vJC5nbG9iYWwnKVxuICAsIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nXG4gICwgc3RvcmUgID0gZ2xvYmFsW1NIQVJFRF0gfHwgKGdsb2JhbFtTSEFSRURdID0ge30pO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHt9KTtcbn07IiwiLy8gMjAuMi4yLjI4IE1hdGguc2lnbih4KVxubW9kdWxlLmV4cG9ydHMgPSBNYXRoLnNpZ24gfHwgZnVuY3Rpb24gc2lnbih4KXtcbiAgcmV0dXJuICh4ID0gK3gpID09IDAgfHwgeCAhPSB4ID8geCA6IHggPCAwID8gLTEgOiAxO1xufTsiLCIvLyA3LjMuMjAgU3BlY2llc0NvbnN0cnVjdG9yKE8sIGRlZmF1bHRDb25zdHJ1Y3RvcilcclxudmFyIGFuT2JqZWN0ICA9IHJlcXVpcmUoJy4vJC5hbi1vYmplY3QnKVxyXG4gICwgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi8kLmEtZnVuY3Rpb24nKVxyXG4gICwgU1BFQ0lFUyAgID0gcmVxdWlyZSgnLi8kLndrcycpKCdzcGVjaWVzJyk7XHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oTywgRCl7XHJcbiAgdmFyIEMgPSBhbk9iamVjdChPKS5jb25zdHJ1Y3RvciwgUztcclxuICByZXR1cm4gQyA9PT0gdW5kZWZpbmVkIHx8IChTID0gYW5PYmplY3QoQylbU1BFQ0lFU10pID09IHVuZGVmaW5lZCA/IEQgOiBhRnVuY3Rpb24oUyk7XHJcbn07IiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgICAgICAgPSByZXF1aXJlKCcuLyQnKVxuICAsIFNQRUNJRVMgPSByZXF1aXJlKCcuLyQud2tzJykoJ3NwZWNpZXMnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQyl7XG4gIGlmKHJlcXVpcmUoJy4vJC5zdXBwb3J0LWRlc2MnKSAmJiAhKFNQRUNJRVMgaW4gQykpJC5zZXREZXNjKEMsIFNQRUNJRVMsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbigpeyByZXR1cm4gdGhpczsgfVxuICB9KTtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwgQ29uc3RydWN0b3IsIG5hbWUpe1xuICBpZighKGl0IGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKXRocm93IFR5cGVFcnJvcihuYW1lICsgXCI6IHVzZSB0aGUgJ25ldycgb3BlcmF0b3IhXCIpO1xuICByZXR1cm4gaXQ7XG59OyIsIi8vIHRydWUgIC0+IFN0cmluZyNhdFxuLy8gZmFsc2UgLT4gU3RyaW5nI2NvZGVQb2ludEF0XG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi8kLnRvLWludGVnZXInKVxuICAsIGRlZmluZWQgICA9IHJlcXVpcmUoJy4vJC5kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKFRPX1NUUklORyl7XG4gIHJldHVybiBmdW5jdGlvbih0aGF0LCBwb3Mpe1xuICAgIHZhciBzID0gU3RyaW5nKGRlZmluZWQodGhhdCkpXG4gICAgICAsIGkgPSB0b0ludGVnZXIocG9zKVxuICAgICAgLCBsID0gcy5sZW5ndGhcbiAgICAgICwgYSwgYjtcbiAgICBpZihpIDwgMCB8fCBpID49IGwpcmV0dXJuIFRPX1NUUklORyA/ICcnIDogdW5kZWZpbmVkO1xuICAgIGEgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgcmV0dXJuIGEgPCAweGQ4MDAgfHwgYSA+IDB4ZGJmZiB8fCBpICsgMSA9PT0gbFxuICAgICAgfHwgKGIgPSBzLmNoYXJDb2RlQXQoaSArIDEpKSA8IDB4ZGMwMCB8fCBiID4gMHhkZmZmXG4gICAgICAgID8gVE9fU1RSSU5HID8gcy5jaGFyQXQoaSkgOiBhXG4gICAgICAgIDogVE9fU1RSSU5HID8gcy5zbGljZShpLCBpICsgMikgOiAoYSAtIDB4ZDgwMCA8PCAxMCkgKyAoYiAtIDB4ZGMwMCkgKyAweDEwMDAwO1xuICB9O1xufTsiLCIvLyBoZWxwZXIgZm9yIFN0cmluZyN7c3RhcnRzV2l0aCwgZW5kc1dpdGgsIGluY2x1ZGVzfVxudmFyIGlzUmVnRXhwID0gcmVxdWlyZSgnLi8kLmlzLXJlZ2V4cCcpXG4gICwgZGVmaW5lZCAgPSByZXF1aXJlKCcuLyQuZGVmaW5lZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHRoYXQsIHNlYXJjaFN0cmluZywgTkFNRSl7XG4gIGlmKGlzUmVnRXhwKHNlYXJjaFN0cmluZykpdGhyb3cgVHlwZUVycm9yKCdTdHJpbmcjJyArIE5BTUUgKyBcIiBkb2Vzbid0IGFjY2VwdCByZWdleCFcIik7XG4gIHJldHVybiBTdHJpbmcoZGVmaW5lZCh0aGF0KSk7XG59OyIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9samhhcmIvcHJvcG9zYWwtc3RyaW5nLXBhZC1sZWZ0LXJpZ2h0XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLyQudG8tbGVuZ3RoJylcbiAgLCByZXBlYXQgICA9IHJlcXVpcmUoJy4vJC5zdHJpbmctcmVwZWF0JylcbiAgLCBkZWZpbmVkICA9IHJlcXVpcmUoJy4vJC5kZWZpbmVkJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odGhhdCwgbWF4TGVuZ3RoLCBmaWxsU3RyaW5nLCBsZWZ0KXtcbiAgdmFyIFMgICAgICAgICAgICA9IFN0cmluZyhkZWZpbmVkKHRoYXQpKVxuICAgICwgc3RyaW5nTGVuZ3RoID0gUy5sZW5ndGhcbiAgICAsIGZpbGxTdHIgICAgICA9IGZpbGxTdHJpbmcgPT09IHVuZGVmaW5lZCA/ICcgJyA6IFN0cmluZyhmaWxsU3RyaW5nKVxuICAgICwgaW50TWF4TGVuZ3RoID0gdG9MZW5ndGgobWF4TGVuZ3RoKTtcbiAgaWYoaW50TWF4TGVuZ3RoIDw9IHN0cmluZ0xlbmd0aClyZXR1cm4gUztcbiAgaWYoZmlsbFN0ciA9PSAnJylmaWxsU3RyID0gJyAnO1xuICB2YXIgZmlsbExlbiA9IGludE1heExlbmd0aCAtIHN0cmluZ0xlbmd0aFxuICAgICwgc3RyaW5nRmlsbGVyID0gcmVwZWF0LmNhbGwoZmlsbFN0ciwgTWF0aC5jZWlsKGZpbGxMZW4gLyBmaWxsU3RyLmxlbmd0aCkpO1xuICBpZihzdHJpbmdGaWxsZXIubGVuZ3RoID4gZmlsbExlbilzdHJpbmdGaWxsZXIgPSBzdHJpbmdGaWxsZXIuc2xpY2UoMCwgZmlsbExlbik7XG4gIHJldHVybiBsZWZ0ID8gc3RyaW5nRmlsbGVyICsgUyA6IFMgKyBzdHJpbmdGaWxsZXI7XG59OyIsIid1c2Ugc3RyaWN0JztcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuLyQudG8taW50ZWdlcicpXG4gICwgZGVmaW5lZCAgID0gcmVxdWlyZSgnLi8kLmRlZmluZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiByZXBlYXQoY291bnQpe1xuICB2YXIgc3RyID0gU3RyaW5nKGRlZmluZWQodGhpcykpXG4gICAgLCByZXMgPSAnJ1xuICAgICwgbiAgID0gdG9JbnRlZ2VyKGNvdW50KTtcbiAgaWYobiA8IDAgfHwgbiA9PSBJbmZpbml0eSl0aHJvdyBSYW5nZUVycm9yKFwiQ291bnQgY2FuJ3QgYmUgbmVnYXRpdmVcIik7XG4gIGZvcig7biA+IDA7IChuID4+Pj0gMSkgJiYgKHN0ciArPSBzdHIpKWlmKG4gJiAxKXJlcyArPSBzdHI7XG4gIHJldHVybiByZXM7XG59OyIsIi8vIDEgLT4gU3RyaW5nI3RyaW1MZWZ0XG4vLyAyIC0+IFN0cmluZyN0cmltUmlnaHRcbi8vIDMgLT4gU3RyaW5nI3RyaW1cbnZhciB0cmltID0gZnVuY3Rpb24oc3RyaW5nLCBUWVBFKXtcbiAgc3RyaW5nID0gU3RyaW5nKGRlZmluZWQoc3RyaW5nKSk7XG4gIGlmKFRZUEUgJiAxKXN0cmluZyA9IHN0cmluZy5yZXBsYWNlKGx0cmltLCAnJyk7XG4gIGlmKFRZUEUgJiAyKXN0cmluZyA9IHN0cmluZy5yZXBsYWNlKHJ0cmltLCAnJyk7XG4gIHJldHVybiBzdHJpbmc7XG59O1xuXG52YXIgJGRlZiAgICA9IHJlcXVpcmUoJy4vJC5kZWYnKVxuICAsIGRlZmluZWQgPSByZXF1aXJlKCcuLyQuZGVmaW5lZCcpXG4gICwgc3BhY2VzICA9ICdcXHgwOVxceDBBXFx4MEJcXHgwQ1xceDBEXFx4MjBcXHhBMFxcdTE2ODBcXHUxODBFXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwMycgK1xuICAgICAgJ1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMEFcXHUyMDJGXFx1MjA1RlxcdTMwMDBcXHUyMDI4XFx1MjAyOVxcdUZFRkYnXG4gICwgc3BhY2UgICA9ICdbJyArIHNwYWNlcyArICddJ1xuICAsIG5vbiAgICAgPSAnXFx1MjAwYlxcdTAwODUnXG4gICwgbHRyaW0gICA9IFJlZ0V4cCgnXicgKyBzcGFjZSArIHNwYWNlICsgJyonKVxuICAsIHJ0cmltICAgPSBSZWdFeHAoc3BhY2UgKyBzcGFjZSArICcqJCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKEtFWSwgZXhlYyl7XG4gIHZhciBleHAgID0ge307XG4gIGV4cFtLRVldID0gZXhlYyh0cmltKTtcbiAgJGRlZigkZGVmLlAgKyAkZGVmLkYgKiByZXF1aXJlKCcuLyQuZmFpbHMnKShmdW5jdGlvbigpe1xuICAgIHJldHVybiAhIXNwYWNlc1tLRVldKCkgfHwgbm9uW0tFWV0oKSAhPSBub247XG4gIH0pLCAnU3RyaW5nJywgZXhwKTtcbn07IiwiLy8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhcmVxdWlyZSgnLi8kLmZhaWxzJykoZnVuY3Rpb24oKXtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7Z2V0OiBmdW5jdGlvbigpeyByZXR1cm4gNzsgfX0pLmEgIT0gNztcbn0pOyIsInZhciBkZWYgPSByZXF1aXJlKCcuLyQnKS5zZXREZXNjXG4gICwgaGFzID0gcmVxdWlyZSgnLi8kLmhhcycpXG4gICwgVEFHID0gcmVxdWlyZSgnLi8kLndrcycpKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCB0YWcsIHN0YXQpe1xuICBpZihpdCAmJiAhaGFzKGl0ID0gc3RhdCA/IGl0IDogaXQucHJvdG90eXBlLCBUQUcpKWRlZihpdCwgVEFHLCB7Y29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogdGFnfSk7XG59OyIsIid1c2Ugc3RyaWN0JztcbnZhciBjdHggICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuLyQuY3R4JylcbiAgLCBpbnZva2UgICAgICAgICAgICAgPSByZXF1aXJlKCcuLyQuaW52b2tlJylcbiAgLCBodG1sICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuLyQuaHRtbCcpXG4gICwgY2VsICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmRvbS1jcmVhdGUnKVxuICAsIGdsb2JhbCAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5nbG9iYWwnKVxuICAsIHByb2Nlc3MgICAgICAgICAgICA9IGdsb2JhbC5wcm9jZXNzXG4gICwgc2V0VGFzayAgICAgICAgICAgID0gZ2xvYmFsLnNldEltbWVkaWF0ZVxuICAsIGNsZWFyVGFzayAgICAgICAgICA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZVxuICAsIE1lc3NhZ2VDaGFubmVsICAgICA9IGdsb2JhbC5NZXNzYWdlQ2hhbm5lbFxuICAsIGNvdW50ZXIgICAgICAgICAgICA9IDBcbiAgLCBxdWV1ZSAgICAgICAgICAgICAgPSB7fVxuICAsIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnXG4gICwgZGVmZXIsIGNoYW5uZWwsIHBvcnQ7XG52YXIgcnVuID0gZnVuY3Rpb24oKXtcbiAgdmFyIGlkID0gK3RoaXM7XG4gIGlmKHF1ZXVlLmhhc093blByb3BlcnR5KGlkKSl7XG4gICAgdmFyIGZuID0gcXVldWVbaWRdO1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gICAgZm4oKTtcbiAgfVxufTtcbnZhciBsaXN0bmVyID0gZnVuY3Rpb24oZXZlbnQpe1xuICBydW4uY2FsbChldmVudC5kYXRhKTtcbn07XG4vLyBOb2RlLmpzIDAuOSsgJiBJRTEwKyBoYXMgc2V0SW1tZWRpYXRlLCBvdGhlcndpc2U6XG5pZighc2V0VGFzayB8fCAhY2xlYXJUYXNrKXtcbiAgc2V0VGFzayA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShmbil7XG4gICAgdmFyIGFyZ3MgPSBbXSwgaSA9IDE7XG4gICAgd2hpbGUoYXJndW1lbnRzLmxlbmd0aCA+IGkpYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTtcbiAgICBxdWV1ZVsrK2NvdW50ZXJdID0gZnVuY3Rpb24oKXtcbiAgICAgIGludm9rZSh0eXBlb2YgZm4gPT0gJ2Z1bmN0aW9uJyA/IGZuIDogRnVuY3Rpb24oZm4pLCBhcmdzKTtcbiAgICB9O1xuICAgIGRlZmVyKGNvdW50ZXIpO1xuICAgIHJldHVybiBjb3VudGVyO1xuICB9O1xuICBjbGVhclRhc2sgPSBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShpZCl7XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgfTtcbiAgLy8gTm9kZS5qcyAwLjgtXG4gIGlmKHJlcXVpcmUoJy4vJC5jb2YnKShwcm9jZXNzKSA9PSAncHJvY2Vzcycpe1xuICAgIGRlZmVyID0gZnVuY3Rpb24oaWQpe1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhjdHgocnVuLCBpZCwgMSkpO1xuICAgIH07XG4gIC8vIEJyb3dzZXJzIHdpdGggTWVzc2FnZUNoYW5uZWwsIGluY2x1ZGVzIFdlYldvcmtlcnNcbiAgfSBlbHNlIGlmKE1lc3NhZ2VDaGFubmVsKXtcbiAgICBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsO1xuICAgIHBvcnQgICAgPSBjaGFubmVsLnBvcnQyO1xuICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gbGlzdG5lcjtcbiAgICBkZWZlciA9IGN0eChwb3J0LnBvc3RNZXNzYWdlLCBwb3J0LCAxKTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBwb3N0TWVzc2FnZSwgc2tpcCBXZWJXb3JrZXJzXG4gIC8vIElFOCBoYXMgcG9zdE1lc3NhZ2UsIGJ1dCBpdCdzIHN5bmMgJiB0eXBlb2YgaXRzIHBvc3RNZXNzYWdlIGlzICdvYmplY3QnXG4gIH0gZWxzZSBpZihnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lciAmJiB0eXBlb2YgcG9zdE1lc3NhZ2UgPT0gJ2Z1bmN0aW9uJyAmJiAhZ2xvYmFsLmltcG9ydFNjcmlwdHMpe1xuICAgIGRlZmVyID0gZnVuY3Rpb24oaWQpe1xuICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKGlkICsgJycsICcqJyk7XG4gICAgfTtcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RuZXIsIGZhbHNlKTtcbiAgLy8gSUU4LVxuICB9IGVsc2UgaWYoT05SRUFEWVNUQVRFQ0hBTkdFIGluIGNlbCgnc2NyaXB0Jykpe1xuICAgIGRlZmVyID0gZnVuY3Rpb24oaWQpe1xuICAgICAgaHRtbC5hcHBlbmRDaGlsZChjZWwoJ3NjcmlwdCcpKVtPTlJFQURZU1RBVEVDSEFOR0VdID0gZnVuY3Rpb24oKXtcbiAgICAgICAgaHRtbC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgICAgICAgcnVuLmNhbGwoaWQpO1xuICAgICAgfTtcbiAgICB9O1xuICAvLyBSZXN0IG9sZCBicm93c2Vyc1xuICB9IGVsc2Uge1xuICAgIGRlZmVyID0gZnVuY3Rpb24oaWQpe1xuICAgICAgc2V0VGltZW91dChjdHgocnVuLCBpZCwgMSksIDApO1xuICAgIH07XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6ICAgc2V0VGFzayxcbiAgY2xlYXI6IGNsZWFyVGFza1xufTsiLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi8kLnRvLWludGVnZXInKVxuICAsIG1heCAgICAgICA9IE1hdGgubWF4XG4gICwgbWluICAgICAgID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGluZGV4LCBsZW5ndGgpe1xuICBpbmRleCA9IHRvSW50ZWdlcihpbmRleCk7XG4gIHJldHVybiBpbmRleCA8IDAgPyBtYXgoaW5kZXggKyBsZW5ndGgsIDApIDogbWluKGluZGV4LCBsZW5ndGgpO1xufTsiLCIvLyA3LjEuNCBUb0ludGVnZXJcbnZhciBjZWlsICA9IE1hdGguY2VpbFxuICAsIGZsb29yID0gTWF0aC5mbG9vcjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXNOYU4oaXQgPSAraXQpID8gMCA6IChpdCA+IDAgPyBmbG9vciA6IGNlaWwpKGl0KTtcbn07IiwiLy8gdG8gaW5kZXhlZCBvYmplY3QsIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vJC5pb2JqZWN0JylcbiAgLCBkZWZpbmVkID0gcmVxdWlyZSgnLi8kLmRlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gSU9iamVjdChkZWZpbmVkKGl0KSk7XG59OyIsIi8vIDcuMS4xNSBUb0xlbmd0aFxudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vJC50by1pbnRlZ2VyJylcbiAgLCBtaW4gICAgICAgPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXQgPiAwID8gbWluKHRvSW50ZWdlcihpdCksIDB4MWZmZmZmZmZmZmZmZmYpIDogMDsgLy8gcG93KDIsIDUzKSAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxufTsiLCIvLyA3LjEuMTMgVG9PYmplY3QoYXJndW1lbnQpXG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vJC5kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIE9iamVjdChkZWZpbmVkKGl0KSk7XG59OyIsInZhciBpZCA9IDBcbiAgLCBweCA9IE1hdGgucmFuZG9tKCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG4gIHJldHVybiAnU3ltYm9sKCcuY29uY2F0KGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXksICcpXycsICgrK2lkICsgcHgpLnRvU3RyaW5nKDM2KSk7XG59OyIsIi8vIDIyLjEuMy4zMSBBcnJheS5wcm90b3R5cGVbQEB1bnNjb3BhYmxlc11cbnZhciBVTlNDT1BBQkxFUyA9IHJlcXVpcmUoJy4vJC53a3MnKSgndW5zY29wYWJsZXMnKTtcbmlmKFtdW1VOU0NPUEFCTEVTXSA9PSB1bmRlZmluZWQpcmVxdWlyZSgnLi8kLmhpZGUnKShBcnJheS5wcm90b3R5cGUsIFVOU0NPUEFCTEVTLCB7fSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG4gIFtdW1VOU0NPUEFCTEVTXVtrZXldID0gdHJ1ZTtcbn07IiwidmFyIHN0b3JlICA9IHJlcXVpcmUoJy4vJC5zaGFyZWQnKSgnd2tzJylcbiAgLCBTeW1ib2wgPSByZXF1aXJlKCcuLyQuZ2xvYmFsJykuU3ltYm9sO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihuYW1lKXtcbiAgcmV0dXJuIHN0b3JlW25hbWVdIHx8IChzdG9yZVtuYW1lXSA9XG4gICAgU3ltYm9sICYmIFN5bWJvbFtuYW1lXSB8fCAoU3ltYm9sIHx8IHJlcXVpcmUoJy4vJC51aWQnKSkoJ1N5bWJvbC4nICsgbmFtZSkpO1xufTsiLCJ2YXIgZ2xvYmFsICA9IHJlcXVpcmUoJy4vJC5nbG9iYWwnKVxuICAsIGNvcmUgICAgPSByZXF1aXJlKCcuLyQuY29yZScpXG4gICwgJGRlZiAgICA9IHJlcXVpcmUoJy4vJC5kZWYnKVxuICAsIHBhcnRpYWwgPSByZXF1aXJlKCcuLyQucGFydGlhbCcpO1xuLy8gaHR0cHM6Ly9lc2Rpc2N1c3Mub3JnL3RvcGljL3Byb21pc2UtcmV0dXJuaW5nLWRlbGF5LWZ1bmN0aW9uXG4kZGVmKCRkZWYuRyArICRkZWYuRiwge1xuICBkZWxheTogZnVuY3Rpb24gZGVsYXkodGltZSl7XG4gICAgcmV0dXJuIG5ldyAoY29yZS5Qcm9taXNlIHx8IGdsb2JhbC5Qcm9taXNlKShmdW5jdGlvbihyZXNvbHZlKXtcbiAgICAgIHNldFRpbWVvdXQocGFydGlhbC5jYWxsKHJlc29sdmUsIHRydWUpLCB0aW1lKTtcbiAgICB9KTtcbiAgfVxufSk7IiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgICAgICAgICAgICA9IHJlcXVpcmUoJy4vJCcpXG4gICwgY3R4ICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmN0eCcpXG4gICwgJGRlZiAgICAgICAgID0gcmVxdWlyZSgnLi8kLmRlZicpXG4gICwgY3JlYXRlRGVzYyAgID0gcmVxdWlyZSgnLi8kLnByb3BlcnR5LWRlc2MnKVxuICAsIGFzc2lnbiAgICAgICA9IHJlcXVpcmUoJy4vJC5hc3NpZ24nKVxuICAsIGtleU9mICAgICAgICA9IHJlcXVpcmUoJy4vJC5rZXlvZicpXG4gICwgYUZ1bmN0aW9uICAgID0gcmVxdWlyZSgnLi8kLmEtZnVuY3Rpb24nKVxuICAsIGZvck9mICAgICAgICA9IHJlcXVpcmUoJy4vJC5mb3Itb2YnKVxuICAsIGlzSXRlcmFibGUgICA9IHJlcXVpcmUoJy4vY29yZS5pcy1pdGVyYWJsZScpXG4gICwgc3RlcCAgICAgICAgID0gcmVxdWlyZSgnLi8kLml0ZXItc3RlcCcpXG4gICwgaXNPYmplY3QgICAgID0gcmVxdWlyZSgnLi8kLmlzLW9iamVjdCcpXG4gICwgdG9JT2JqZWN0ICAgID0gcmVxdWlyZSgnLi8kLnRvLWlvYmplY3QnKVxuICAsIFNVUFBPUlRfREVTQyA9IHJlcXVpcmUoJy4vJC5zdXBwb3J0LWRlc2MnKVxuICAsIGhhcyAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5oYXMnKVxuICAsIGdldEtleXMgICAgICA9ICQuZ2V0S2V5cztcblxuLy8gMCAtPiBEaWN0LmZvckVhY2hcbi8vIDEgLT4gRGljdC5tYXBcbi8vIDIgLT4gRGljdC5maWx0ZXJcbi8vIDMgLT4gRGljdC5zb21lXG4vLyA0IC0+IERpY3QuZXZlcnlcbi8vIDUgLT4gRGljdC5maW5kXG4vLyA2IC0+IERpY3QuZmluZEtleVxuLy8gNyAtPiBEaWN0Lm1hcFBhaXJzXG52YXIgY3JlYXRlRGljdE1ldGhvZCA9IGZ1bmN0aW9uKFRZUEUpe1xuICB2YXIgSVNfTUFQICAgPSBUWVBFID09IDFcbiAgICAsIElTX0VWRVJZID0gVFlQRSA9PSA0O1xuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0LCBjYWxsYmFja2ZuLCB0aGF0IC8qID0gdW5kZWZpbmVkICovKXtcbiAgICB2YXIgZiAgICAgID0gY3R4KGNhbGxiYWNrZm4sIHRoYXQsIDMpXG4gICAgICAsIE8gICAgICA9IHRvSU9iamVjdChvYmplY3QpXG4gICAgICAsIHJlc3VsdCA9IElTX01BUCB8fCBUWVBFID09IDcgfHwgVFlQRSA9PSAyXG4gICAgICAgICAgPyBuZXcgKHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgPyB0aGlzIDogRGljdCkgOiB1bmRlZmluZWRcbiAgICAgICwga2V5LCB2YWwsIHJlcztcbiAgICBmb3Ioa2V5IGluIE8paWYoaGFzKE8sIGtleSkpe1xuICAgICAgdmFsID0gT1trZXldO1xuICAgICAgcmVzID0gZih2YWwsIGtleSwgb2JqZWN0KTtcbiAgICAgIGlmKFRZUEUpe1xuICAgICAgICBpZihJU19NQVApcmVzdWx0W2tleV0gPSByZXM7ICAgICAgICAgICAgLy8gbWFwXG4gICAgICAgIGVsc2UgaWYocmVzKXN3aXRjaChUWVBFKXtcbiAgICAgICAgICBjYXNlIDI6IHJlc3VsdFtrZXldID0gdmFsOyBicmVhazsgICAgIC8vIGZpbHRlclxuICAgICAgICAgIGNhc2UgMzogcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAgICAgLy8gc29tZVxuICAgICAgICAgIGNhc2UgNTogcmV0dXJuIHZhbDsgICAgICAgICAgICAgICAgICAgLy8gZmluZFxuICAgICAgICAgIGNhc2UgNjogcmV0dXJuIGtleTsgICAgICAgICAgICAgICAgICAgLy8gZmluZEtleVxuICAgICAgICAgIGNhc2UgNzogcmVzdWx0W3Jlc1swXV0gPSByZXNbMV07ICAgICAgLy8gbWFwUGFpcnNcbiAgICAgICAgfSBlbHNlIGlmKElTX0VWRVJZKXJldHVybiBmYWxzZTsgICAgICAgIC8vIGV2ZXJ5XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBUWVBFID09IDMgfHwgSVNfRVZFUlkgPyBJU19FVkVSWSA6IHJlc3VsdDtcbiAgfTtcbn07XG52YXIgZmluZEtleSA9IGNyZWF0ZURpY3RNZXRob2QoNik7XG5cbnZhciBjcmVhdGVEaWN0SXRlciA9IGZ1bmN0aW9uKGtpbmQpe1xuICByZXR1cm4gZnVuY3Rpb24oaXQpe1xuICAgIHJldHVybiBuZXcgRGljdEl0ZXJhdG9yKGl0LCBraW5kKTtcbiAgfTtcbn07XG52YXIgRGljdEl0ZXJhdG9yID0gZnVuY3Rpb24oaXRlcmF0ZWQsIGtpbmQpe1xuICB0aGlzLl90ID0gdG9JT2JqZWN0KGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2EgPSBnZXRLZXlzKGl0ZXJhdGVkKTsgICAvLyBrZXlzXG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4gIHRoaXMuX2sgPSBraW5kOyAgICAgICAgICAgICAgICAvLyBraW5kXG59O1xucmVxdWlyZSgnLi8kLml0ZXItY3JlYXRlJykoRGljdEl0ZXJhdG9yLCAnRGljdCcsIGZ1bmN0aW9uKCl7XG4gIHZhciB0aGF0ID0gdGhpc1xuICAgICwgTyAgICA9IHRoYXQuX3RcbiAgICAsIGtleXMgPSB0aGF0Ll9hXG4gICAgLCBraW5kID0gdGhhdC5fa1xuICAgICwga2V5O1xuICBkbyB7XG4gICAgaWYodGhhdC5faSA+PSBrZXlzLmxlbmd0aCl7XG4gICAgICB0aGF0Ll90ID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHN0ZXAoMSk7XG4gICAgfVxuICB9IHdoaWxlKCFoYXMoTywga2V5ID0ga2V5c1t0aGF0Ll9pKytdKSk7XG4gIGlmKGtpbmQgPT0gJ2tleXMnICApcmV0dXJuIHN0ZXAoMCwga2V5KTtcbiAgaWYoa2luZCA9PSAndmFsdWVzJylyZXR1cm4gc3RlcCgwLCBPW2tleV0pO1xuICByZXR1cm4gc3RlcCgwLCBba2V5LCBPW2tleV1dKTtcbn0pO1xuXG5mdW5jdGlvbiBEaWN0KGl0ZXJhYmxlKXtcbiAgdmFyIGRpY3QgPSAkLmNyZWF0ZShudWxsKTtcbiAgaWYoaXRlcmFibGUgIT0gdW5kZWZpbmVkKXtcbiAgICBpZihpc0l0ZXJhYmxlKGl0ZXJhYmxlKSl7XG4gICAgICBmb3JPZihpdGVyYWJsZSwgdHJ1ZSwgZnVuY3Rpb24oa2V5LCB2YWx1ZSl7XG4gICAgICAgIGRpY3Rba2V5XSA9IHZhbHVlO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGFzc2lnbihkaWN0LCBpdGVyYWJsZSk7XG4gIH1cbiAgcmV0dXJuIGRpY3Q7XG59XG5EaWN0LnByb3RvdHlwZSA9IG51bGw7XG5cbmZ1bmN0aW9uIHJlZHVjZShvYmplY3QsIG1hcGZuLCBpbml0KXtcbiAgYUZ1bmN0aW9uKG1hcGZuKTtcbiAgdmFyIE8gICAgICA9IHRvSU9iamVjdChvYmplY3QpXG4gICAgLCBrZXlzICAgPSBnZXRLZXlzKE8pXG4gICAgLCBsZW5ndGggPSBrZXlzLmxlbmd0aFxuICAgICwgaSAgICAgID0gMFxuICAgICwgbWVtbywga2V5O1xuICBpZihhcmd1bWVudHMubGVuZ3RoIDwgMyl7XG4gICAgaWYoIWxlbmd0aCl0aHJvdyBUeXBlRXJyb3IoJ1JlZHVjZSBvZiBlbXB0eSBvYmplY3Qgd2l0aCBubyBpbml0aWFsIHZhbHVlJyk7XG4gICAgbWVtbyA9IE9ba2V5c1tpKytdXTtcbiAgfSBlbHNlIG1lbW8gPSBPYmplY3QoaW5pdCk7XG4gIHdoaWxlKGxlbmd0aCA+IGkpaWYoaGFzKE8sIGtleSA9IGtleXNbaSsrXSkpe1xuICAgIG1lbW8gPSBtYXBmbihtZW1vLCBPW2tleV0sIGtleSwgb2JqZWN0KTtcbiAgfVxuICByZXR1cm4gbWVtbztcbn1cblxuZnVuY3Rpb24gaW5jbHVkZXMob2JqZWN0LCBlbCl7XG4gIHJldHVybiAoZWwgPT0gZWwgPyBrZXlPZihvYmplY3QsIGVsKSA6IGZpbmRLZXkob2JqZWN0LCBmdW5jdGlvbihpdCl7XG4gICAgcmV0dXJuIGl0ICE9IGl0O1xuICB9KSkgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0KG9iamVjdCwga2V5KXtcbiAgaWYoaGFzKG9iamVjdCwga2V5KSlyZXR1cm4gb2JqZWN0W2tleV07XG59XG5mdW5jdGlvbiBzZXQob2JqZWN0LCBrZXksIHZhbHVlKXtcbiAgaWYoU1VQUE9SVF9ERVNDICYmIGtleSBpbiBPYmplY3QpJC5zZXREZXNjKG9iamVjdCwga2V5LCBjcmVhdGVEZXNjKDAsIHZhbHVlKSk7XG4gIGVsc2Ugb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iamVjdDtcbn1cblxuZnVuY3Rpb24gaXNEaWN0KGl0KXtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiAkLmdldFByb3RvKGl0KSA9PT0gRGljdC5wcm90b3R5cGU7XG59XG5cbiRkZWYoJGRlZi5HICsgJGRlZi5GLCB7RGljdDogRGljdH0pO1xuXG4kZGVmKCRkZWYuUywgJ0RpY3QnLCB7XG4gIGtleXM6ICAgICBjcmVhdGVEaWN0SXRlcigna2V5cycpLFxuICB2YWx1ZXM6ICAgY3JlYXRlRGljdEl0ZXIoJ3ZhbHVlcycpLFxuICBlbnRyaWVzOiAgY3JlYXRlRGljdEl0ZXIoJ2VudHJpZXMnKSxcbiAgZm9yRWFjaDogIGNyZWF0ZURpY3RNZXRob2QoMCksXG4gIG1hcDogICAgICBjcmVhdGVEaWN0TWV0aG9kKDEpLFxuICBmaWx0ZXI6ICAgY3JlYXRlRGljdE1ldGhvZCgyKSxcbiAgc29tZTogICAgIGNyZWF0ZURpY3RNZXRob2QoMyksXG4gIGV2ZXJ5OiAgICBjcmVhdGVEaWN0TWV0aG9kKDQpLFxuICBmaW5kOiAgICAgY3JlYXRlRGljdE1ldGhvZCg1KSxcbiAgZmluZEtleTogIGZpbmRLZXksXG4gIG1hcFBhaXJzOiBjcmVhdGVEaWN0TWV0aG9kKDcpLFxuICByZWR1Y2U6ICAgcmVkdWNlLFxuICBrZXlPZjogICAga2V5T2YsXG4gIGluY2x1ZGVzOiBpbmNsdWRlcyxcbiAgaGFzOiAgICAgIGhhcyxcbiAgZ2V0OiAgICAgIGdldCxcbiAgc2V0OiAgICAgIHNldCxcbiAgaXNEaWN0OiAgIGlzRGljdFxufSk7IiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLyQucGF0aCcpXG4gICwgJGRlZiA9IHJlcXVpcmUoJy4vJC5kZWYnKTtcblxuLy8gUGxhY2Vob2xkZXJcbnJlcXVpcmUoJy4vJC5jb3JlJykuXyA9IHBhdGguXyA9IHBhdGguXyB8fCB7fTtcblxuJGRlZigkZGVmLlAgKyAkZGVmLkYsICdGdW5jdGlvbicsIHtwYXJ0OiByZXF1aXJlKCcuLyQucGFydGlhbCcpfSk7IiwidmFyIGNsYXNzb2YgICA9IHJlcXVpcmUoJy4vJC5jbGFzc29mJylcbiAgLCBJVEVSQVRPUiAgPSByZXF1aXJlKCcuLyQud2tzJykoJ2l0ZXJhdG9yJylcbiAgLCBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLyQuaXRlcmF0b3JzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vJC5jb3JlJykuZ2V0SXRlcmF0b3JNZXRob2QgPSBmdW5jdGlvbihpdCl7XG4gIGlmKGl0ICE9IHVuZGVmaW5lZClyZXR1cm4gaXRbSVRFUkFUT1JdXG4gICAgfHwgaXRbJ0BAaXRlcmF0b3InXVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59OyIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vJC5hbi1vYmplY3QnKVxuICAsIGdldCAgICAgID0gcmVxdWlyZSgnLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi8kLmNvcmUnKS5nZXRJdGVyYXRvciA9IGZ1bmN0aW9uKGl0KXtcbiAgdmFyIGl0ZXJGbiA9IGdldChpdCk7XG4gIGlmKHR5cGVvZiBpdGVyRm4gIT0gJ2Z1bmN0aW9uJyl0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBpdGVyYWJsZSEnKTtcbiAgcmV0dXJuIGFuT2JqZWN0KGl0ZXJGbi5jYWxsKGl0KSk7XG59OyIsInZhciBjbGFzc29mICAgPSByZXF1aXJlKCcuLyQuY2xhc3NvZicpXG4gICwgSVRFUkFUT1IgID0gcmVxdWlyZSgnLi8kLndrcycpKCdpdGVyYXRvcicpXG4gICwgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi8kLml0ZXJhdG9ycycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLyQuY29yZScpLmlzSXRlcmFibGUgPSBmdW5jdGlvbihpdCl7XG4gIHZhciBPID0gT2JqZWN0KGl0KTtcbiAgcmV0dXJuIElURVJBVE9SIGluIE9cbiAgICB8fCAnQEBpdGVyYXRvcicgaW4gT1xuICAgIHx8IEl0ZXJhdG9ycy5oYXNPd25Qcm9wZXJ0eShjbGFzc29mKE8pKTtcbn07IiwidmFyICQgICAgICAgPSByZXF1aXJlKCcuLyQnKVxuICAsIGdsb2JhbCAgPSByZXF1aXJlKCcuLyQuZ2xvYmFsJylcbiAgLCAkZGVmICAgID0gcmVxdWlyZSgnLi8kLmRlZicpXG4gICwgbG9nICAgICA9IHt9XG4gICwgZW5hYmxlZCA9IHRydWU7XG4vLyBNZXRob2RzIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL0RldmVsb3BlclRvb2xzV0cvY29uc29sZS1vYmplY3QvYmxvYi9tYXN0ZXIvYXBpLm1kXG4kLmVhY2guY2FsbCgoXG4gICdhc3NlcnQsY2xlYXIsY291bnQsZGVidWcsZGlyLGRpcnhtbCxlcnJvcixleGNlcHRpb24sZ3JvdXAsZ3JvdXBDb2xsYXBzZWQsZ3JvdXBFbmQsJyArXG4gICdpbmZvLGlzSW5kZXBlbmRlbnRseUNvbXBvc2VkLGxvZyxtYXJrVGltZWxpbmUscHJvZmlsZSxwcm9maWxlRW5kLHRhYmxlLCcgK1xuICAndGltZSx0aW1lRW5kLHRpbWVsaW5lLHRpbWVsaW5lRW5kLHRpbWVTdGFtcCx0cmFjZSx3YXJuJ1xuKS5zcGxpdCgnLCcpLCBmdW5jdGlvbihrZXkpe1xuICBsb2dba2V5XSA9IGZ1bmN0aW9uKCl7XG4gICAgdmFyICRjb25zb2xlID0gZ2xvYmFsLmNvbnNvbGU7XG4gICAgaWYoZW5hYmxlZCAmJiAkY29uc29sZSAmJiAkY29uc29sZVtrZXldKXtcbiAgICAgIHJldHVybiBGdW5jdGlvbi5hcHBseS5jYWxsKCRjb25zb2xlW2tleV0sICRjb25zb2xlLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfTtcbn0pO1xuJGRlZigkZGVmLkcgKyAkZGVmLkYsIHtsb2c6IHJlcXVpcmUoJy4vJC5hc3NpZ24nKShsb2cubG9nLCBsb2csIHtcbiAgZW5hYmxlOiBmdW5jdGlvbigpe1xuICAgIGVuYWJsZWQgPSB0cnVlO1xuICB9LFxuICBkaXNhYmxlOiBmdW5jdGlvbigpe1xuICAgIGVuYWJsZWQgPSBmYWxzZTtcbiAgfVxufSl9KTsiLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLyQuaXRlci1kZWZpbmUnKShOdW1iZXIsICdOdW1iZXInLCBmdW5jdGlvbihpdGVyYXRlZCl7XG4gIHRoaXMuX2wgPSAraXRlcmF0ZWQ7XG4gIHRoaXMuX2kgPSAwO1xufSwgZnVuY3Rpb24oKXtcbiAgdmFyIGkgICAgPSB0aGlzLl9pKytcbiAgICAsIGRvbmUgPSAhKGkgPCB0aGlzLl9sKTtcbiAgcmV0dXJuIHtkb25lOiBkb25lLCB2YWx1ZTogZG9uZSA/IHVuZGVmaW5lZCA6IGl9O1xufSk7IiwidmFyICRkZWYgPSByZXF1aXJlKCcuLyQuZGVmJyk7XG5cbiRkZWYoJGRlZi5TICsgJGRlZi5GLCAnT2JqZWN0Jywge2NsYXNzb2Y6IHJlcXVpcmUoJy4vJC5jbGFzc29mJyl9KTsiLCJ2YXIgJGRlZiAgID0gcmVxdWlyZSgnLi8kLmRlZicpXG4gICwgZGVmaW5lID0gcmVxdWlyZSgnLi8kLm9iamVjdC1kZWZpbmUnKTtcblxuJGRlZigkZGVmLlMgKyAkZGVmLkYsICdPYmplY3QnLCB7ZGVmaW5lOiBkZWZpbmV9KTsiLCJ2YXIgJGRlZiA9IHJlcXVpcmUoJy4vJC5kZWYnKTtcblxuJGRlZigkZGVmLlMgKyAkZGVmLkYsICdPYmplY3QnLCB7aXNPYmplY3Q6IHJlcXVpcmUoJy4vJC5pcy1vYmplY3QnKX0pOyIsInZhciAkZGVmICAgPSByZXF1aXJlKCcuLyQuZGVmJylcbiAgLCBjcmVhdGUgPSByZXF1aXJlKCcuLyQnKS5jcmVhdGVcbiAgLCBkZWZpbmUgPSByZXF1aXJlKCcuLyQub2JqZWN0LWRlZmluZScpO1xuXG4kZGVmKCRkZWYuUyArICRkZWYuRiwgJ09iamVjdCcsIHtcbiAgbWFrZTogZnVuY3Rpb24ocHJvdG8sIG1peGluKXtcbiAgICByZXR1cm4gZGVmaW5lKGNyZWF0ZShwcm90byksIG1peGluKTtcbiAgfVxufSk7IiwiJ3VzZSBzdHJpY3QnO1xudmFyICRkZWYgPSByZXF1aXJlKCcuLyQuZGVmJylcbiAgLCAkcmUgID0gcmVxdWlyZSgnLi8kLnJlcGxhY2VyJykoL1smPD5cIiddL2csIHtcbiAgICAnJic6ICcmYW1wOycsXG4gICAgJzwnOiAnJmx0OycsXG4gICAgJz4nOiAnJmd0OycsXG4gICAgJ1wiJzogJyZxdW90OycsXG4gICAgXCInXCI6ICcmYXBvczsnXG4gIH0pO1xuXG4kZGVmKCRkZWYuUCArICRkZWYuRiwgJ1N0cmluZycsIHtlc2NhcGVIVE1MOiBmdW5jdGlvbiBlc2NhcGVIVE1MKCl7IHJldHVybiAkcmUodGhpcyk7IH19KTsiLCIndXNlIHN0cmljdCc7XG52YXIgJGRlZiA9IHJlcXVpcmUoJy4vJC5kZWYnKVxuICAsICRyZSAgPSByZXF1aXJlKCcuLyQucmVwbGFjZXInKSgvJig/OmFtcHxsdHxndHxxdW90fGFwb3MpOy9nLCB7XG4gICAgJyZhbXA7JzogICcmJyxcbiAgICAnJmx0Oyc6ICAgJzwnLFxuICAgICcmZ3Q7JzogICAnPicsXG4gICAgJyZxdW90Oyc6ICdcIicsXG4gICAgJyZhcG9zOyc6IFwiJ1wiXG4gIH0pO1xuXG4kZGVmKCRkZWYuUCArICRkZWYuRiwgJ1N0cmluZycsIHt1bmVzY2FwZUhUTUw6ICBmdW5jdGlvbiB1bmVzY2FwZUhUTUwoKXsgcmV0dXJuICRyZSh0aGlzKTsgfX0pOyIsIid1c2Ugc3RyaWN0JztcbnZhciAkICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi8kJylcbiAgLCBTVVBQT1JUX0RFU0MgICAgID0gcmVxdWlyZSgnLi8kLnN1cHBvcnQtZGVzYycpXG4gICwgY3JlYXRlRGVzYyAgICAgICA9IHJlcXVpcmUoJy4vJC5wcm9wZXJ0eS1kZXNjJylcbiAgLCBodG1sICAgICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmh0bWwnKVxuICAsIGNlbCAgICAgICAgICAgICAgPSByZXF1aXJlKCcuLyQuZG9tLWNyZWF0ZScpXG4gICwgaGFzICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5oYXMnKVxuICAsIGNvZiAgICAgICAgICAgICAgPSByZXF1aXJlKCcuLyQuY29mJylcbiAgLCAkZGVmICAgICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmRlZicpXG4gICwgaW52b2tlICAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5pbnZva2UnKVxuICAsIGFycmF5TWV0aG9kICAgICAgPSByZXF1aXJlKCcuLyQuYXJyYXktbWV0aG9kcycpXG4gICwgSUVfUFJPVE8gICAgICAgICA9IHJlcXVpcmUoJy4vJC51aWQnKSgnX19wcm90b19fJylcbiAgLCBpc09iamVjdCAgICAgICAgID0gcmVxdWlyZSgnLi8kLmlzLW9iamVjdCcpXG4gICwgYW5PYmplY3QgICAgICAgICA9IHJlcXVpcmUoJy4vJC5hbi1vYmplY3QnKVxuICAsIGFGdW5jdGlvbiAgICAgICAgPSByZXF1aXJlKCcuLyQuYS1mdW5jdGlvbicpXG4gICwgdG9PYmplY3QgICAgICAgICA9IHJlcXVpcmUoJy4vJC50by1vYmplY3QnKVxuICAsIHRvSU9iamVjdCAgICAgICAgPSByZXF1aXJlKCcuLyQudG8taW9iamVjdCcpXG4gICwgdG9JbnRlZ2VyICAgICAgICA9IHJlcXVpcmUoJy4vJC50by1pbnRlZ2VyJylcbiAgLCB0b0luZGV4ICAgICAgICAgID0gcmVxdWlyZSgnLi8kLnRvLWluZGV4JylcbiAgLCB0b0xlbmd0aCAgICAgICAgID0gcmVxdWlyZSgnLi8kLnRvLWxlbmd0aCcpXG4gICwgSU9iamVjdCAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5pb2JqZWN0JylcbiAgLCBmYWlscyAgICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmZhaWxzJylcbiAgLCBPYmplY3RQcm90byAgICAgID0gT2JqZWN0LnByb3RvdHlwZVxuICAsIEEgICAgICAgICAgICAgICAgPSBbXVxuICAsIF9zbGljZSAgICAgICAgICAgPSBBLnNsaWNlXG4gICwgX2pvaW4gICAgICAgICAgICA9IEEuam9pblxuICAsIGRlZmluZVByb3BlcnR5ICAgPSAkLnNldERlc2NcbiAgLCBnZXRPd25EZXNjcmlwdG9yID0gJC5nZXREZXNjXG4gICwgZGVmaW5lUHJvcGVydGllcyA9ICQuc2V0RGVzY3NcbiAgLCAkaW5kZXhPZiAgICAgICAgID0gcmVxdWlyZSgnLi8kLmFycmF5LWluY2x1ZGVzJykoZmFsc2UpXG4gICwgZmFjdG9yaWVzICAgICAgICA9IHt9XG4gICwgSUU4X0RPTV9ERUZJTkU7XG5cbmlmKCFTVVBQT1JUX0RFU0Mpe1xuICBJRThfRE9NX0RFRklORSA9ICFmYWlscyhmdW5jdGlvbigpe1xuICAgIHJldHVybiBkZWZpbmVQcm9wZXJ0eShjZWwoJ2RpdicpLCAnYScsIHtnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiA3OyB9fSkuYSAhPSA3O1xuICB9KTtcbiAgJC5zZXREZXNjID0gZnVuY3Rpb24oTywgUCwgQXR0cmlidXRlcyl7XG4gICAgaWYoSUU4X0RPTV9ERUZJTkUpdHJ5IHtcbiAgICAgIHJldHVybiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG4gICAgaWYoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKXRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhJyk7XG4gICAgaWYoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKWFuT2JqZWN0KE8pW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgICByZXR1cm4gTztcbiAgfTtcbiAgJC5nZXREZXNjID0gZnVuY3Rpb24oTywgUCl7XG4gICAgaWYoSUU4X0RPTV9ERUZJTkUpdHJ5IHtcbiAgICAgIHJldHVybiBnZXRPd25EZXNjcmlwdG9yKE8sIFApO1xuICAgIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbiAgICBpZihoYXMoTywgUCkpcmV0dXJuIGNyZWF0ZURlc2MoIU9iamVjdFByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoTywgUCksIE9bUF0pO1xuICB9O1xuICAkLnNldERlc2NzID0gZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uKE8sIFByb3BlcnRpZXMpe1xuICAgIGFuT2JqZWN0KE8pO1xuICAgIHZhciBrZXlzICAgPSAkLmdldEtleXMoUHJvcGVydGllcylcbiAgICAgICwgbGVuZ3RoID0ga2V5cy5sZW5ndGhcbiAgICAgICwgaSA9IDBcbiAgICAgICwgUDtcbiAgICB3aGlsZShsZW5ndGggPiBpKSQuc2V0RGVzYyhPLCBQID0ga2V5c1tpKytdLCBQcm9wZXJ0aWVzW1BdKTtcbiAgICByZXR1cm4gTztcbiAgfTtcbn1cbiRkZWYoJGRlZi5TICsgJGRlZi5GICogIVNVUFBPUlRfREVTQywgJ09iamVjdCcsIHtcbiAgLy8gMTkuMS4yLjYgLyAxNS4yLjMuMyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogJC5nZXREZXNjLFxuICAvLyAxOS4xLjIuNCAvIDE1LjIuMy42IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKVxuICBkZWZpbmVQcm9wZXJ0eTogJC5zZXREZXNjLFxuICAvLyAxOS4xLjIuMyAvIDE1LjIuMy43IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpXG4gIGRlZmluZVByb3BlcnRpZXM6IGRlZmluZVByb3BlcnRpZXNcbn0pO1xuXG4gIC8vIElFIDgtIGRvbid0IGVudW0gYnVnIGtleXNcbnZhciBrZXlzMSA9ICgnY29uc3RydWN0b3IsaGFzT3duUHJvcGVydHksaXNQcm90b3R5cGVPZixwcm9wZXJ0eUlzRW51bWVyYWJsZSwnICtcbiAgICAgICAgICAgICd0b0xvY2FsZVN0cmluZyx0b1N0cmluZyx2YWx1ZU9mJykuc3BsaXQoJywnKVxuICAvLyBBZGRpdGlvbmFsIGtleXMgZm9yIGdldE93blByb3BlcnR5TmFtZXNcbiAgLCBrZXlzMiA9IGtleXMxLmNvbmNhdCgnbGVuZ3RoJywgJ3Byb3RvdHlwZScpXG4gICwga2V5c0xlbjEgPSBrZXlzMS5sZW5ndGg7XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgY3JlYXRlRGljdCA9IGZ1bmN0aW9uKCl7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSBjZWwoJ2lmcmFtZScpXG4gICAgLCBpICAgICAgPSBrZXlzTGVuMVxuICAgICwgZ3QgICAgID0gJz4nXG4gICAgLCBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGh0bWwuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lLnNyYyA9ICdqYXZhc2NyaXB0Oic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2NyaXB0LXVybFxuICAvLyBjcmVhdGVEaWN0ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuT2JqZWN0O1xuICAvLyBodG1sLnJlbW92ZUNoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUoJzxzY3JpcHQ+ZG9jdW1lbnQuRj1PYmplY3Q8L3NjcmlwdCcgKyBndCk7XG4gIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG4gIGNyZWF0ZURpY3QgPSBpZnJhbWVEb2N1bWVudC5GO1xuICB3aGlsZShpLS0pZGVsZXRlIGNyZWF0ZURpY3QucHJvdG90eXBlW2tleXMxW2ldXTtcbiAgcmV0dXJuIGNyZWF0ZURpY3QoKTtcbn07XG52YXIgY3JlYXRlR2V0S2V5cyA9IGZ1bmN0aW9uKG5hbWVzLCBsZW5ndGgpe1xuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXtcbiAgICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KG9iamVjdClcbiAgICAgICwgaSAgICAgID0gMFxuICAgICAgLCByZXN1bHQgPSBbXVxuICAgICAgLCBrZXk7XG4gICAgZm9yKGtleSBpbiBPKWlmKGtleSAhPSBJRV9QUk9UTyloYXMoTywga2V5KSAmJiByZXN1bHQucHVzaChrZXkpO1xuICAgIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgICB3aGlsZShsZW5ndGggPiBpKWlmKGhhcyhPLCBrZXkgPSBuYW1lc1tpKytdKSl7XG4gICAgICB+JGluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59O1xudmFyIEVtcHR5ID0gZnVuY3Rpb24oKXt9O1xuJGRlZigkZGVmLlMsICdPYmplY3QnLCB7XG4gIC8vIDE5LjEuMi45IC8gMTUuMi4zLjIgT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pXG4gIGdldFByb3RvdHlwZU9mOiAkLmdldFByb3RvID0gJC5nZXRQcm90byB8fCBmdW5jdGlvbihPKXtcbiAgICBPID0gdG9PYmplY3QoTyk7XG4gICAgaWYoaGFzKE8sIElFX1BST1RPKSlyZXR1cm4gT1tJRV9QUk9UT107XG4gICAgaWYodHlwZW9mIE8uY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBPIGluc3RhbmNlb2YgTy5jb25zdHJ1Y3Rvcil7XG4gICAgICByZXR1cm4gTy5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gICAgfSByZXR1cm4gTyBpbnN0YW5jZW9mIE9iamVjdCA/IE9iamVjdFByb3RvIDogbnVsbDtcbiAgfSxcbiAgLy8gMTkuMS4yLjcgLyAxNS4yLjMuNCBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxuICBnZXRPd25Qcm9wZXJ0eU5hbWVzOiAkLmdldE5hbWVzID0gJC5nZXROYW1lcyB8fCBjcmVhdGVHZXRLZXlzKGtleXMyLCBrZXlzMi5sZW5ndGgsIHRydWUpLFxuICAvLyAxOS4xLjIuMiAvIDE1LjIuMy41IE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbiAgY3JlYXRlOiAkLmNyZWF0ZSA9ICQuY3JlYXRlIHx8IGZ1bmN0aW9uKE8sIC8qPyovUHJvcGVydGllcyl7XG4gICAgdmFyIHJlc3VsdDtcbiAgICBpZihPICE9PSBudWxsKXtcbiAgICAgIEVtcHR5LnByb3RvdHlwZSA9IGFuT2JqZWN0KE8pO1xuICAgICAgcmVzdWx0ID0gbmV3IEVtcHR5KCk7XG4gICAgICBFbXB0eS5wcm90b3R5cGUgPSBudWxsO1xuICAgICAgLy8gYWRkIFwiX19wcm90b19fXCIgZm9yIE9iamVjdC5nZXRQcm90b3R5cGVPZiBzaGltXG4gICAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgICB9IGVsc2UgcmVzdWx0ID0gY3JlYXRlRGljdCgpO1xuICAgIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkZWZpbmVQcm9wZXJ0aWVzKHJlc3VsdCwgUHJvcGVydGllcyk7XG4gIH0sXG4gIC8vIDE5LjEuMi4xNCAvIDE1LjIuMy4xNCBPYmplY3Qua2V5cyhPKVxuICBrZXlzOiAkLmdldEtleXMgPSAkLmdldEtleXMgfHwgY3JlYXRlR2V0S2V5cyhrZXlzMSwga2V5c0xlbjEsIGZhbHNlKVxufSk7XG5cbnZhciBjb25zdHJ1Y3QgPSBmdW5jdGlvbihGLCBsZW4sIGFyZ3Mpe1xuICBpZighKGxlbiBpbiBmYWN0b3JpZXMpKXtcbiAgICBmb3IodmFyIG4gPSBbXSwgaSA9IDA7IGkgPCBsZW47IGkrKyluW2ldID0gJ2FbJyArIGkgKyAnXSc7XG4gICAgZmFjdG9yaWVzW2xlbl0gPSBGdW5jdGlvbignRixhJywgJ3JldHVybiBuZXcgRignICsgbi5qb2luKCcsJykgKyAnKScpO1xuICB9XG4gIHJldHVybiBmYWN0b3JpZXNbbGVuXShGLCBhcmdzKTtcbn07XG5cbi8vIDE5LjIuMy4yIC8gMTUuMy40LjUgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQodGhpc0FyZywgYXJncy4uLilcbiRkZWYoJGRlZi5QLCAnRnVuY3Rpb24nLCB7XG4gIGJpbmQ6IGZ1bmN0aW9uIGJpbmQodGhhdCAvKiwgYXJncy4uLiAqLyl7XG4gICAgdmFyIGZuICAgICAgID0gYUZ1bmN0aW9uKHRoaXMpXG4gICAgICAsIHBhcnRBcmdzID0gX3NsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICB2YXIgYm91bmQgPSBmdW5jdGlvbigvKiBhcmdzLi4uICovKXtcbiAgICAgIHZhciBhcmdzID0gcGFydEFyZ3MuY29uY2F0KF9zbGljZS5jYWxsKGFyZ3VtZW50cykpO1xuICAgICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBib3VuZCA/IGNvbnN0cnVjdChmbiwgYXJncy5sZW5ndGgsIGFyZ3MpIDogaW52b2tlKGZuLCBhcmdzLCB0aGF0KTtcbiAgICB9O1xuICAgIGlmKGlzT2JqZWN0KGZuLnByb3RvdHlwZSkpYm91bmQucHJvdG90eXBlID0gZm4ucHJvdG90eXBlO1xuICAgIHJldHVybiBib3VuZDtcbiAgfVxufSk7XG5cbi8vIGZhbGxiYWNrIGZvciBub3QgYXJyYXktbGlrZSBFUzMgc3RyaW5ncyBhbmQgRE9NIG9iamVjdHNcbnZhciBidWdneVNsaWNlID0gZmFpbHMoZnVuY3Rpb24oKXtcbiAgaWYoaHRtbClfc2xpY2UuY2FsbChodG1sKTtcbn0pO1xuXG4kZGVmKCRkZWYuUCArICRkZWYuRiAqIGJ1Z2d5U2xpY2UsICdBcnJheScsIHtcbiAgc2xpY2U6IGZ1bmN0aW9uKGJlZ2luLCBlbmQpe1xuICAgIHZhciBsZW4gICA9IHRvTGVuZ3RoKHRoaXMubGVuZ3RoKVxuICAgICAgLCBrbGFzcyA9IGNvZih0aGlzKTtcbiAgICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IGVuZDtcbiAgICBpZihrbGFzcyA9PSAnQXJyYXknKXJldHVybiBfc2xpY2UuY2FsbCh0aGlzLCBiZWdpbiwgZW5kKTtcbiAgICB2YXIgc3RhcnQgID0gdG9JbmRleChiZWdpbiwgbGVuKVxuICAgICAgLCB1cFRvICAgPSB0b0luZGV4KGVuZCwgbGVuKVxuICAgICAgLCBzaXplICAgPSB0b0xlbmd0aCh1cFRvIC0gc3RhcnQpXG4gICAgICAsIGNsb25lZCA9IEFycmF5KHNpemUpXG4gICAgICAsIGkgICAgICA9IDA7XG4gICAgZm9yKDsgaSA8IHNpemU7IGkrKyljbG9uZWRbaV0gPSBrbGFzcyA9PSAnU3RyaW5nJ1xuICAgICAgPyB0aGlzLmNoYXJBdChzdGFydCArIGkpXG4gICAgICA6IHRoaXNbc3RhcnQgKyBpXTtcbiAgICByZXR1cm4gY2xvbmVkO1xuICB9XG59KTtcbiRkZWYoJGRlZi5QICsgJGRlZi5GICogKElPYmplY3QgIT0gT2JqZWN0KSwgJ0FycmF5Jywge1xuICBqb2luOiBmdW5jdGlvbigpe1xuICAgIHJldHVybiBfam9pbi5hcHBseShJT2JqZWN0KHRoaXMpLCBhcmd1bWVudHMpO1xuICB9XG59KTtcblxuLy8gMjIuMS4yLjIgLyAxNS40LjMuMiBBcnJheS5pc0FycmF5KGFyZylcbiRkZWYoJGRlZi5TLCAnQXJyYXknLCB7aXNBcnJheTogcmVxdWlyZSgnLi8kLmlzLWFycmF5Jyl9KTtcblxudmFyIGNyZWF0ZUFycmF5UmVkdWNlID0gZnVuY3Rpb24oaXNSaWdodCl7XG4gIHJldHVybiBmdW5jdGlvbihjYWxsYmFja2ZuLCBtZW1vKXtcbiAgICBhRnVuY3Rpb24oY2FsbGJhY2tmbik7XG4gICAgdmFyIE8gICAgICA9IElPYmplY3QodGhpcylcbiAgICAgICwgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpXG4gICAgICAsIGluZGV4ICA9IGlzUmlnaHQgPyBsZW5ndGggLSAxIDogMFxuICAgICAgLCBpICAgICAgPSBpc1JpZ2h0ID8gLTEgOiAxO1xuICAgIGlmKGFyZ3VtZW50cy5sZW5ndGggPCAyKWZvcig7Oyl7XG4gICAgICBpZihpbmRleCBpbiBPKXtcbiAgICAgICAgbWVtbyA9IE9baW5kZXhdO1xuICAgICAgICBpbmRleCArPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGluZGV4ICs9IGk7XG4gICAgICBpZihpc1JpZ2h0ID8gaW5kZXggPCAwIDogbGVuZ3RoIDw9IGluZGV4KXtcbiAgICAgICAgdGhyb3cgVHlwZUVycm9yKCdSZWR1Y2Ugb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZhbHVlJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvcig7aXNSaWdodCA/IGluZGV4ID49IDAgOiBsZW5ndGggPiBpbmRleDsgaW5kZXggKz0gaSlpZihpbmRleCBpbiBPKXtcbiAgICAgIG1lbW8gPSBjYWxsYmFja2ZuKG1lbW8sIE9baW5kZXhdLCBpbmRleCwgdGhpcyk7XG4gICAgfVxuICAgIHJldHVybiBtZW1vO1xuICB9O1xufTtcbnZhciBtZXRob2RpemUgPSBmdW5jdGlvbigkZm4pe1xuICByZXR1cm4gZnVuY3Rpb24oYXJnMS8qLCBhcmcyID0gdW5kZWZpbmVkICovKXtcbiAgICByZXR1cm4gJGZuKHRoaXMsIGFyZzEsIGFyZ3VtZW50c1sxXSk7XG4gIH07XG59O1xuJGRlZigkZGVmLlAsICdBcnJheScsIHtcbiAgLy8gMjIuMS4zLjEwIC8gMTUuNC40LjE4IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoKGNhbGxiYWNrZm4gWywgdGhpc0FyZ10pXG4gIGZvckVhY2g6ICQuZWFjaCA9ICQuZWFjaCB8fCBtZXRob2RpemUoYXJyYXlNZXRob2QoMCkpLFxuICAvLyAyMi4xLjMuMTUgLyAxNS40LjQuMTkgQXJyYXkucHJvdG90eXBlLm1hcChjYWxsYmFja2ZuIFssIHRoaXNBcmddKVxuICBtYXA6IG1ldGhvZGl6ZShhcnJheU1ldGhvZCgxKSksXG4gIC8vIDIyLjEuMy43IC8gMTUuNC40LjIwIEFycmF5LnByb3RvdHlwZS5maWx0ZXIoY2FsbGJhY2tmbiBbLCB0aGlzQXJnXSlcbiAgZmlsdGVyOiBtZXRob2RpemUoYXJyYXlNZXRob2QoMikpLFxuICAvLyAyMi4xLjMuMjMgLyAxNS40LjQuMTcgQXJyYXkucHJvdG90eXBlLnNvbWUoY2FsbGJhY2tmbiBbLCB0aGlzQXJnXSlcbiAgc29tZTogbWV0aG9kaXplKGFycmF5TWV0aG9kKDMpKSxcbiAgLy8gMjIuMS4zLjUgLyAxNS40LjQuMTYgQXJyYXkucHJvdG90eXBlLmV2ZXJ5KGNhbGxiYWNrZm4gWywgdGhpc0FyZ10pXG4gIGV2ZXJ5OiBtZXRob2RpemUoYXJyYXlNZXRob2QoNCkpLFxuICAvLyAyMi4xLjMuMTggLyAxNS40LjQuMjEgQXJyYXkucHJvdG90eXBlLnJlZHVjZShjYWxsYmFja2ZuIFssIGluaXRpYWxWYWx1ZV0pXG4gIHJlZHVjZTogY3JlYXRlQXJyYXlSZWR1Y2UoZmFsc2UpLFxuICAvLyAyMi4xLjMuMTkgLyAxNS40LjQuMjIgQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0KGNhbGxiYWNrZm4gWywgaW5pdGlhbFZhbHVlXSlcbiAgcmVkdWNlUmlnaHQ6IGNyZWF0ZUFycmF5UmVkdWNlKHRydWUpLFxuICAvLyAyMi4xLjMuMTEgLyAxNS40LjQuMTQgQXJyYXkucHJvdG90eXBlLmluZGV4T2Yoc2VhcmNoRWxlbWVudCBbLCBmcm9tSW5kZXhdKVxuICBpbmRleE9mOiBtZXRob2RpemUoJGluZGV4T2YpLFxuICAvLyAyMi4xLjMuMTQgLyAxNS40LjQuMTUgQXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mKHNlYXJjaEVsZW1lbnQgWywgZnJvbUluZGV4XSlcbiAgbGFzdEluZGV4T2Y6IGZ1bmN0aW9uKGVsLCBmcm9tSW5kZXggLyogPSBAWyotMV0gKi8pe1xuICAgIHZhciBPICAgICAgPSB0b0lPYmplY3QodGhpcylcbiAgICAgICwgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpXG4gICAgICAsIGluZGV4ICA9IGxlbmd0aCAtIDE7XG4gICAgaWYoYXJndW1lbnRzLmxlbmd0aCA+IDEpaW5kZXggPSBNYXRoLm1pbihpbmRleCwgdG9JbnRlZ2VyKGZyb21JbmRleCkpO1xuICAgIGlmKGluZGV4IDwgMClpbmRleCA9IHRvTGVuZ3RoKGxlbmd0aCArIGluZGV4KTtcbiAgICBmb3IoO2luZGV4ID49IDA7IGluZGV4LS0paWYoaW5kZXggaW4gTylpZihPW2luZGV4XSA9PT0gZWwpcmV0dXJuIGluZGV4O1xuICAgIHJldHVybiAtMTtcbiAgfVxufSk7XG5cbi8vIDIwLjMuMy4xIC8gMTUuOS40LjQgRGF0ZS5ub3coKVxuJGRlZigkZGVmLlMsICdEYXRlJywge25vdzogZnVuY3Rpb24oKXsgcmV0dXJuICtuZXcgRGF0ZTsgfX0pO1xuXG52YXIgbHogPSBmdW5jdGlvbihudW0pe1xuICByZXR1cm4gbnVtID4gOSA/IG51bSA6ICcwJyArIG51bTtcbn07XG5cbi8vIDIwLjMuNC4zNiAvIDE1LjkuNS40MyBEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZygpXG4vLyBQaGFudG9tSlMgYW5kIG9sZCB3ZWJraXQgaGFkIGEgYnJva2VuIERhdGUgaW1wbGVtZW50YXRpb24uXG52YXIgZGF0ZSAgICAgICA9IG5ldyBEYXRlKC01ZTEzIC0gMSlcbiAgLCBicm9rZW5EYXRlID0gIShkYXRlLnRvSVNPU3RyaW5nICYmIGRhdGUudG9JU09TdHJpbmcoKSA9PSAnMDM4NS0wNy0yNVQwNzowNjozOS45OTlaJ1xuICAgICAgJiYgZmFpbHMoZnVuY3Rpb24oKXsgbmV3IERhdGUoTmFOKS50b0lTT1N0cmluZygpOyB9KSk7XG4kZGVmKCRkZWYuUCArICRkZWYuRiAqIGJyb2tlbkRhdGUsICdEYXRlJywge1xuICB0b0lTT1N0cmluZzogZnVuY3Rpb24gdG9JU09TdHJpbmcoKXtcbiAgICBpZighaXNGaW5pdGUodGhpcykpdGhyb3cgUmFuZ2VFcnJvcignSW52YWxpZCB0aW1lIHZhbHVlJyk7XG4gICAgdmFyIGQgPSB0aGlzXG4gICAgICAsIHkgPSBkLmdldFVUQ0Z1bGxZZWFyKClcbiAgICAgICwgbSA9IGQuZ2V0VVRDTWlsbGlzZWNvbmRzKClcbiAgICAgICwgcyA9IHkgPCAwID8gJy0nIDogeSA+IDk5OTkgPyAnKycgOiAnJztcbiAgICByZXR1cm4gcyArICgnMDAwMDAnICsgTWF0aC5hYnMoeSkpLnNsaWNlKHMgPyAtNiA6IC00KSArXG4gICAgICAnLScgKyBseihkLmdldFVUQ01vbnRoKCkgKyAxKSArICctJyArIGx6KGQuZ2V0VVRDRGF0ZSgpKSArXG4gICAgICAnVCcgKyBseihkLmdldFVUQ0hvdXJzKCkpICsgJzonICsgbHooZC5nZXRVVENNaW51dGVzKCkpICtcbiAgICAgICc6JyArIGx6KGQuZ2V0VVRDU2Vjb25kcygpKSArICcuJyArIChtID4gOTkgPyBtIDogJzAnICsgbHoobSkpICsgJ1onO1xuICB9XG59KTsiLCIvLyAyMi4xLjMuMyBBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbih0YXJnZXQsIHN0YXJ0LCBlbmQgPSB0aGlzLmxlbmd0aClcbid1c2Ugc3RyaWN0JztcbnZhciAkZGVmID0gcmVxdWlyZSgnLi8kLmRlZicpO1xuXG4kZGVmKCRkZWYuUCwgJ0FycmF5Jywge2NvcHlXaXRoaW46IHJlcXVpcmUoJy4vJC5hcnJheS1jb3B5LXdpdGhpbicpfSk7XG5cbnJlcXVpcmUoJy4vJC51bnNjb3BlJykoJ2NvcHlXaXRoaW4nKTsiLCIvLyAyMi4xLjMuNiBBcnJheS5wcm90b3R5cGUuZmlsbCh2YWx1ZSwgc3RhcnQgPSAwLCBlbmQgPSB0aGlzLmxlbmd0aClcbnZhciAkZGVmID0gcmVxdWlyZSgnLi8kLmRlZicpO1xuXG4kZGVmKCRkZWYuUCwgJ0FycmF5Jywge2ZpbGw6IHJlcXVpcmUoJy4vJC5hcnJheS1maWxsJyl9KTtcblxucmVxdWlyZSgnLi8kLnVuc2NvcGUnKSgnZmlsbCcpOyIsIid1c2Ugc3RyaWN0Jztcbi8vIDIyLjEuMy45IEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXgocHJlZGljYXRlLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxudmFyIEtFWSAgICA9ICdmaW5kSW5kZXgnXG4gICwgJGRlZiAgID0gcmVxdWlyZSgnLi8kLmRlZicpXG4gICwgZm9yY2VkID0gdHJ1ZVxuICAsICRmaW5kICA9IHJlcXVpcmUoJy4vJC5hcnJheS1tZXRob2RzJykoNik7XG4vLyBTaG91bGRuJ3Qgc2tpcCBob2xlc1xuaWYoS0VZIGluIFtdKUFycmF5KDEpW0tFWV0oZnVuY3Rpb24oKXsgZm9yY2VkID0gZmFsc2U7IH0pO1xuJGRlZigkZGVmLlAgKyAkZGVmLkYgKiBmb3JjZWQsICdBcnJheScsIHtcbiAgZmluZEluZGV4OiBmdW5jdGlvbiBmaW5kSW5kZXgoY2FsbGJhY2tmbi8qLCB0aGF0ID0gdW5kZWZpbmVkICovKXtcbiAgICByZXR1cm4gJGZpbmQodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcbnJlcXVpcmUoJy4vJC51bnNjb3BlJykoS0VZKTsiLCIndXNlIHN0cmljdCc7XG4vLyAyMi4xLjMuOCBBcnJheS5wcm90b3R5cGUuZmluZChwcmVkaWNhdGUsIHRoaXNBcmcgPSB1bmRlZmluZWQpXG52YXIgS0VZICAgID0gJ2ZpbmQnXG4gICwgJGRlZiAgID0gcmVxdWlyZSgnLi8kLmRlZicpXG4gICwgZm9yY2VkID0gdHJ1ZVxuICAsICRmaW5kICA9IHJlcXVpcmUoJy4vJC5hcnJheS1tZXRob2RzJykoNSk7XG4vLyBTaG91bGRuJ3Qgc2tpcCBob2xlc1xuaWYoS0VZIGluIFtdKUFycmF5KDEpW0tFWV0oZnVuY3Rpb24oKXsgZm9yY2VkID0gZmFsc2U7IH0pO1xuJGRlZigkZGVmLlAgKyAkZGVmLkYgKiBmb3JjZWQsICdBcnJheScsIHtcbiAgZmluZDogZnVuY3Rpb24gZmluZChjYWxsYmFja2ZuLyosIHRoYXQgPSB1bmRlZmluZWQgKi8pe1xuICAgIHJldHVybiAkZmluZCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xucmVxdWlyZSgnLi8kLnVuc2NvcGUnKShLRVkpOyIsIid1c2Ugc3RyaWN0JztcbnZhciBjdHggICAgICAgICA9IHJlcXVpcmUoJy4vJC5jdHgnKVxuICAsICRkZWYgICAgICAgID0gcmVxdWlyZSgnLi8kLmRlZicpXG4gICwgdG9PYmplY3QgICAgPSByZXF1aXJlKCcuLyQudG8tb2JqZWN0JylcbiAgLCBjYWxsICAgICAgICA9IHJlcXVpcmUoJy4vJC5pdGVyLWNhbGwnKVxuICAsIGlzQXJyYXlJdGVyID0gcmVxdWlyZSgnLi8kLmlzLWFycmF5LWl0ZXInKVxuICAsIHRvTGVuZ3RoICAgID0gcmVxdWlyZSgnLi8kLnRvLWxlbmd0aCcpXG4gICwgZ2V0SXRlckZuICAgPSByZXF1aXJlKCcuL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xuJGRlZigkZGVmLlMgKyAkZGVmLkYgKiAhcmVxdWlyZSgnLi8kLml0ZXItZGV0ZWN0JykoZnVuY3Rpb24oaXRlcil7IEFycmF5LmZyb20oaXRlcik7IH0pLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMi4xIEFycmF5LmZyb20oYXJyYXlMaWtlLCBtYXBmbiA9IHVuZGVmaW5lZCwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbiAgZnJvbTogZnVuY3Rpb24gZnJvbShhcnJheUxpa2UvKiwgbWFwZm4gPSB1bmRlZmluZWQsIHRoaXNBcmcgPSB1bmRlZmluZWQqLyl7XG4gICAgdmFyIE8gICAgICAgPSB0b09iamVjdChhcnJheUxpa2UpXG4gICAgICAsIEMgICAgICAgPSB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nID8gdGhpcyA6IEFycmF5XG4gICAgICAsICQkICAgICAgPSBhcmd1bWVudHNcbiAgICAgICwgJCRsZW4gICA9ICQkLmxlbmd0aFxuICAgICAgLCBtYXBmbiAgID0gJCRsZW4gPiAxID8gJCRbMV0gOiB1bmRlZmluZWRcbiAgICAgICwgbWFwcGluZyA9IG1hcGZuICE9PSB1bmRlZmluZWRcbiAgICAgICwgaW5kZXggICA9IDBcbiAgICAgICwgaXRlckZuICA9IGdldEl0ZXJGbihPKVxuICAgICAgLCBsZW5ndGgsIHJlc3VsdCwgc3RlcCwgaXRlcmF0b3I7XG4gICAgaWYobWFwcGluZyltYXBmbiA9IGN0eChtYXBmbiwgJCRsZW4gPiAyID8gJCRbMl0gOiB1bmRlZmluZWQsIDIpO1xuICAgIC8vIGlmIG9iamVjdCBpc24ndCBpdGVyYWJsZSBvciBpdCdzIGFycmF5IHdpdGggZGVmYXVsdCBpdGVyYXRvciAtIHVzZSBzaW1wbGUgY2FzZVxuICAgIGlmKGl0ZXJGbiAhPSB1bmRlZmluZWQgJiYgIShDID09IEFycmF5ICYmIGlzQXJyYXlJdGVyKGl0ZXJGbikpKXtcbiAgICAgIGZvcihpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKE8pLCByZXN1bHQgPSBuZXcgQzsgIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lOyBpbmRleCsrKXtcbiAgICAgICAgcmVzdWx0W2luZGV4XSA9IG1hcHBpbmcgPyBjYWxsKGl0ZXJhdG9yLCBtYXBmbiwgW3N0ZXAudmFsdWUsIGluZGV4XSwgdHJ1ZSkgOiBzdGVwLnZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgICBmb3IocmVzdWx0ID0gbmV3IEMobGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4Kyspe1xuICAgICAgICByZXN1bHRbaW5kZXhdID0gbWFwcGluZyA/IG1hcGZuKE9baW5kZXhdLCBpbmRleCkgOiBPW2luZGV4XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0Lmxlbmd0aCA9IGluZGV4O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHNldFVuc2NvcGUgPSByZXF1aXJlKCcuLyQudW5zY29wZScpXG4gICwgc3RlcCAgICAgICA9IHJlcXVpcmUoJy4vJC5pdGVyLXN0ZXAnKVxuICAsIEl0ZXJhdG9ycyAgPSByZXF1aXJlKCcuLyQuaXRlcmF0b3JzJylcbiAgLCB0b0lPYmplY3QgID0gcmVxdWlyZSgnLi8kLnRvLWlvYmplY3QnKTtcblxuLy8gMjIuMS4zLjQgQXJyYXkucHJvdG90eXBlLmVudHJpZXMoKVxuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5rZXlzKClcbi8vIDIyLjEuMy4yOSBBcnJheS5wcm90b3R5cGUudmFsdWVzKClcbi8vIDIyLjEuMy4zMCBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxucmVxdWlyZSgnLi8kLml0ZXItZGVmaW5lJykoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uKGl0ZXJhdGVkLCBraW5kKXtcbiAgdGhpcy5fdCA9IHRvSU9iamVjdChpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgLy8ga2luZFxuLy8gMjIuMS41LjIuMSAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbigpe1xuICB2YXIgTyAgICAgPSB0aGlzLl90XG4gICAgLCBraW5kICA9IHRoaXMuX2tcbiAgICAsIGluZGV4ID0gdGhpcy5faSsrO1xuICBpZighTyB8fCBpbmRleCA+PSBPLmxlbmd0aCl7XG4gICAgdGhpcy5fdCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gc3RlcCgxKTtcbiAgfVxuICBpZihraW5kID09ICdrZXlzJyAgKXJldHVybiBzdGVwKDAsIGluZGV4KTtcbiAgaWYoa2luZCA9PSAndmFsdWVzJylyZXR1cm4gc3RlcCgwLCBPW2luZGV4XSk7XG4gIHJldHVybiBzdGVwKDAsIFtpbmRleCwgT1tpbmRleF1dKTtcbn0sICd2YWx1ZXMnKTtcblxuLy8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlICg5LjQuNC42LCA5LjQuNC43KVxuSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblxuc2V0VW5zY29wZSgna2V5cycpO1xuc2V0VW5zY29wZSgndmFsdWVzJyk7XG5zZXRVbnNjb3BlKCdlbnRyaWVzJyk7IiwiJ3VzZSBzdHJpY3QnO1xudmFyICRkZWYgPSByZXF1aXJlKCcuLyQuZGVmJyk7XG5cbi8vIFdlYktpdCBBcnJheS5vZiBpc24ndCBnZW5lcmljXG4kZGVmKCRkZWYuUyArICRkZWYuRiAqIHJlcXVpcmUoJy4vJC5mYWlscycpKGZ1bmN0aW9uKCl7XG4gIGZ1bmN0aW9uIEYoKXt9XG4gIHJldHVybiAhKEFycmF5Lm9mLmNhbGwoRikgaW5zdGFuY2VvZiBGKTtcbn0pLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMi4zIEFycmF5Lm9mKCAuLi5pdGVtcylcbiAgb2Y6IGZ1bmN0aW9uIG9mKC8qIC4uLmFyZ3MgKi8pe1xuICAgIHZhciBpbmRleCAgPSAwXG4gICAgICAsICQkICAgICA9IGFyZ3VtZW50c1xuICAgICAgLCAkJGxlbiAgPSAkJC5sZW5ndGhcbiAgICAgICwgcmVzdWx0ID0gbmV3ICh0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nID8gdGhpcyA6IEFycmF5KSgkJGxlbik7XG4gICAgd2hpbGUoJCRsZW4gPiBpbmRleClyZXN1bHRbaW5kZXhdID0gJCRbaW5kZXgrK107XG4gICAgcmVzdWx0Lmxlbmd0aCA9ICQkbGVuO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn0pOyIsInJlcXVpcmUoJy4vJC5zcGVjaWVzJykoQXJyYXkpOyIsIid1c2Ugc3RyaWN0JztcbnZhciAkICAgICAgICAgICAgID0gcmVxdWlyZSgnLi8kJylcbiAgLCBpc09iamVjdCAgICAgID0gcmVxdWlyZSgnLi8kLmlzLW9iamVjdCcpXG4gICwgSEFTX0lOU1RBTkNFICA9IHJlcXVpcmUoJy4vJC53a3MnKSgnaGFzSW5zdGFuY2UnKVxuICAsIEZ1bmN0aW9uUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGU7XG4vLyAxOS4yLjMuNiBGdW5jdGlvbi5wcm90b3R5cGVbQEBoYXNJbnN0YW5jZV0oVilcbmlmKCEoSEFTX0lOU1RBTkNFIGluIEZ1bmN0aW9uUHJvdG8pKSQuc2V0RGVzYyhGdW5jdGlvblByb3RvLCBIQVNfSU5TVEFOQ0UsIHt2YWx1ZTogZnVuY3Rpb24oTyl7XG4gIGlmKHR5cGVvZiB0aGlzICE9ICdmdW5jdGlvbicgfHwgIWlzT2JqZWN0KE8pKXJldHVybiBmYWxzZTtcbiAgaWYoIWlzT2JqZWN0KHRoaXMucHJvdG90eXBlKSlyZXR1cm4gTyBpbnN0YW5jZW9mIHRoaXM7XG4gIC8vIGZvciBlbnZpcm9ubWVudCB3L28gbmF0aXZlIGBAQGhhc0luc3RhbmNlYCBsb2dpYyBlbm91Z2ggYGluc3RhbmNlb2ZgLCBidXQgYWRkIHRoaXM6XG4gIHdoaWxlKE8gPSAkLmdldFByb3RvKE8pKWlmKHRoaXMucHJvdG90eXBlID09PSBPKXJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59fSk7IiwidmFyIHNldERlc2MgICAgPSByZXF1aXJlKCcuLyQnKS5zZXREZXNjXG4gICwgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vJC5wcm9wZXJ0eS1kZXNjJylcbiAgLCBoYXMgICAgICAgID0gcmVxdWlyZSgnLi8kLmhhcycpXG4gICwgRlByb3RvICAgICA9IEZ1bmN0aW9uLnByb3RvdHlwZVxuICAsIG5hbWVSRSAgICAgPSAvXlxccypmdW5jdGlvbiAoW14gKF0qKS9cbiAgLCBOQU1FICAgICAgID0gJ25hbWUnO1xuLy8gMTkuMi40LjIgbmFtZVxuTkFNRSBpbiBGUHJvdG8gfHwgcmVxdWlyZSgnLi8kLnN1cHBvcnQtZGVzYycpICYmIHNldERlc2MoRlByb3RvLCBOQU1FLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbigpe1xuICAgIHZhciBtYXRjaCA9ICgnJyArIHRoaXMpLm1hdGNoKG5hbWVSRSlcbiAgICAgICwgbmFtZSAgPSBtYXRjaCA/IG1hdGNoWzFdIDogJyc7XG4gICAgaGFzKHRoaXMsIE5BTUUpIHx8IHNldERlc2ModGhpcywgTkFNRSwgY3JlYXRlRGVzYyg1LCBuYW1lKSk7XG4gICAgcmV0dXJuIG5hbWU7XG4gIH1cbn0pOyIsIid1c2Ugc3RyaWN0JztcbnZhciBzdHJvbmcgPSByZXF1aXJlKCcuLyQuY29sbGVjdGlvbi1zdHJvbmcnKTtcblxuLy8gMjMuMSBNYXAgT2JqZWN0c1xucmVxdWlyZSgnLi8kLmNvbGxlY3Rpb24nKSgnTWFwJywgZnVuY3Rpb24oZ2V0KXtcbiAgcmV0dXJuIGZ1bmN0aW9uIE1hcCgpeyByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIHtcbiAgLy8gMjMuMS4zLjYgTWFwLnByb3RvdHlwZS5nZXQoa2V5KVxuICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpe1xuICAgIHZhciBlbnRyeSA9IHN0cm9uZy5nZXRFbnRyeSh0aGlzLCBrZXkpO1xuICAgIHJldHVybiBlbnRyeSAmJiBlbnRyeS52O1xuICB9LFxuICAvLyAyMy4xLjMuOSBNYXAucHJvdG90eXBlLnNldChrZXksIHZhbHVlKVxuICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKXtcbiAgICByZXR1cm4gc3Ryb25nLmRlZih0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5LCB2YWx1ZSk7XG4gIH1cbn0sIHN0cm9uZywgdHJ1ZSk7IiwiLy8gMjAuMi4yLjMgTWF0aC5hY29zaCh4KVxudmFyICRkZWYgICA9IHJlcXVpcmUoJy4vJC5kZWYnKVxuICAsIGxvZzFwICA9IHJlcXVpcmUoJy4vJC5sb2cxcCcpXG4gICwgc3FydCAgID0gTWF0aC5zcXJ0XG4gICwgJGFjb3NoID0gTWF0aC5hY29zaDtcblxuLy8gVjggYnVnIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zNTA5XG4kZGVmKCRkZWYuUyArICRkZWYuRiAqICEoJGFjb3NoICYmIE1hdGguZmxvb3IoJGFjb3NoKE51bWJlci5NQVhfVkFMVUUpKSA9PSA3MTApLCAnTWF0aCcsIHtcbiAgYWNvc2g6IGZ1bmN0aW9uIGFjb3NoKHgpe1xuICAgIHJldHVybiAoeCA9ICt4KSA8IDEgPyBOYU4gOiB4ID4gOTQ5MDYyNjUuNjI0MjUxNTZcbiAgICAgID8gTWF0aC5sb2coeCkgKyBNYXRoLkxOMlxuICAgICAgOiBsb2cxcCh4IC0gMSArIHNxcnQoeCAtIDEpICogc3FydCh4ICsgMSkpO1xuICB9XG59KTsiLCIvLyAyMC4yLjIuNSBNYXRoLmFzaW5oKHgpXG52YXIgJGRlZiA9IHJlcXVpcmUoJy4vJC5kZWYnKTtcblxuZnVuY3Rpb24gYXNpbmgoeCl7XG4gIHJldHVybiAhaXNGaW5pdGUoeCA9ICt4KSB8fCB4ID09IDAgPyB4IDogeCA8IDAgPyAtYXNpbmgoLXgpIDogTWF0aC5sb2coeCArIE1hdGguc3FydCh4ICogeCArIDEpKTtcbn1cblxuJGRlZigkZGVmLlMsICdNYXRoJywge2FzaW5oOiBhc2luaH0pOyIsIi8vIDIwLjIuMi43IE1hdGguYXRhbmgoeClcbnZhciAkZGVmID0gcmVxdWlyZSgnLi8kLmRlZicpO1xuXG4kZGVmKCRkZWYuUywgJ01hdGgnLCB7XG4gIGF0YW5oOiBmdW5jdGlvbiBhdGFuaCh4KXtcbiAgICByZXR1cm4gKHggPSAreCkgPT0gMCA/IHggOiBNYXRoLmxvZygoMSArIHgpIC8gKDEgLSB4KSkgLyAyO1xuICB9XG59KTsiLCIvLyAyMC4yLjIuOSBNYXRoLmNicnQoeClcbnZhciAkZGVmID0gcmVxdWlyZSgnLi8kLmRlZicpXG4gICwgc2lnbiA9IHJlcXVpcmUoJy4vJC5zaWduJyk7XG5cbiRkZWYoJGRlZi5TLCAnTWF0aCcsIHtcbiAgY2JydDogZnVuY3Rpb24gY2JydCh4KXtcbiAgICByZXR1cm4gc2lnbih4ID0gK3gpICogTWF0aC5wb3coTWF0aC5hYnMoeCksIDEgLyAzKTtcbiAgfVxufSk7IiwiLy8gMjAuMi4yLjExIE1hdGguY2x6MzIoeClcbnZhciAkZGVmID0gcmVxdWlyZSgnLi8kLmRlZicpO1xuXG4kZGVmKCRkZWYuUywgJ01hdGgnLCB7XG4gIGNsejMyOiBmdW5jdGlvbiBjbHozMih4KXtcbiAgICByZXR1cm4gKHggPj4+PSAwKSA/IDMxIC0gTWF0aC5mbG9vcihNYXRoLmxvZyh4ICsgMC41KSAqIE1hdGguTE9HMkUpIDogMzI7XG4gIH1cbn0pOyIsIi8vIDIwLjIuMi4xMiBNYXRoLmNvc2goeClcbnZhciAkZGVmID0gcmVxdWlyZSgnLi8kLmRlZicpXG4gICwgZXhwICA9IE1hdGguZXhwO1xuXG4kZGVmKCRkZWYuUywgJ01hdGgnLCB7XG4gIGNvc2g6IGZ1bmN0aW9uIGNvc2goeCl7XG4gICAgcmV0dXJuIChleHAoeCA9ICt4KSArIGV4cCgteCkpIC8gMjtcbiAgfVxufSk7IiwiLy8gMjAuMi4yLjE0IE1hdGguZXhwbTEoeClcbnZhciAkZGVmID0gcmVxdWlyZSgnLi8kLmRlZicpO1xuXG4kZGVmKCRkZWYuUywgJ01hdGgnLCB7ZXhwbTE6IHJlcXVpcmUoJy4vJC5leHBtMScpfSk7IiwiLy8gMjAuMi4yLjE2IE1hdGguZnJvdW5kKHgpXG52YXIgJGRlZiAgPSByZXF1aXJlKCcuLyQuZGVmJylcbiAgLCBzaWduICA9IHJlcXVpcmUoJy4vJC5zaWduJylcbiAgLCBwb3cgICA9IE1hdGgucG93XG4gICwgRVBTSUxPTiAgID0gcG93KDIsIC01MilcbiAgLCBFUFNJTE9OMzIgPSBwb3coMiwgLTIzKVxuICAsIE1BWDMyICAgICA9IHBvdygyLCAxMjcpICogKDIgLSBFUFNJTE9OMzIpXG4gICwgTUlOMzIgICAgID0gcG93KDIsIC0xMjYpO1xuXG52YXIgcm91bmRUaWVzVG9FdmVuID0gZnVuY3Rpb24obil7XG4gIHJldHVybiBuICsgMSAvIEVQU0lMT04gLSAxIC8gRVBTSUxPTjtcbn07XG5cblxuJGRlZigkZGVmLlMsICdNYXRoJywge1xuICBmcm91bmQ6IGZ1bmN0aW9uIGZyb3VuZCh4KXtcbiAgICB2YXIgJGFicyAgPSBNYXRoLmFicyh4KVxuICAgICAgLCAkc2lnbiA9IHNpZ24oeClcbiAgICAgICwgYSwgcmVzdWx0O1xuICAgIGlmKCRhYnMgPCBNSU4zMilyZXR1cm4gJHNpZ24gKiByb3VuZFRpZXNUb0V2ZW4oJGFicyAvIE1JTjMyIC8gRVBTSUxPTjMyKSAqIE1JTjMyICogRVBTSUxPTjMyO1xuICAgIGEgPSAoMSArIEVQU0lMT04zMiAvIEVQU0lMT04pICogJGFicztcbiAgICByZXN1bHQgPSBhIC0gKGEgLSAkYWJzKTtcbiAgICBpZihyZXN1bHQgPiBNQVgzMiB8fCByZXN1bHQgIT0gcmVzdWx0KXJldHVybiAkc2lnbiAqIEluZmluaXR5O1xuICAgIHJldHVybiAkc2lnbiAqIHJlc3VsdDtcbiAgfVxufSk7IiwiLy8gMjAuMi4yLjE3IE1hdGguaHlwb3QoW3ZhbHVlMVssIHZhbHVlMlssIOKApiBdXV0pXG52YXIgJGRlZiA9IHJlcXVpcmUoJy4vJC5kZWYnKVxuICAsIGFicyAgPSBNYXRoLmFicztcblxuJGRlZigkZGVmLlMsICdNYXRoJywge1xuICBoeXBvdDogZnVuY3Rpb24gaHlwb3QodmFsdWUxLCB2YWx1ZTIpeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgdmFyIHN1bSAgID0gMFxuICAgICAgLCBpICAgICA9IDBcbiAgICAgICwgJCQgICAgPSBhcmd1bWVudHNcbiAgICAgICwgJCRsZW4gPSAkJC5sZW5ndGhcbiAgICAgICwgbGFyZyAgPSAwXG4gICAgICAsIGFyZywgZGl2O1xuICAgIHdoaWxlKGkgPCAkJGxlbil7XG4gICAgICBhcmcgPSBhYnMoJCRbaSsrXSk7XG4gICAgICBpZihsYXJnIDwgYXJnKXtcbiAgICAgICAgZGl2ICA9IGxhcmcgLyBhcmc7XG4gICAgICAgIHN1bSAgPSBzdW0gKiBkaXYgKiBkaXYgKyAxO1xuICAgICAgICBsYXJnID0gYXJnO1xuICAgICAgfSBlbHNlIGlmKGFyZyA+IDApe1xuICAgICAgICBkaXYgID0gYXJnIC8gbGFyZztcbiAgICAgICAgc3VtICs9IGRpdiAqIGRpdjtcbiAgICAgIH0gZWxzZSBzdW0gKz0gYXJnO1xuICAgIH1cbiAgICByZXR1cm4gbGFyZyA9PT0gSW5maW5pdHkgPyBJbmZpbml0eSA6IGxhcmcgKiBNYXRoLnNxcnQoc3VtKTtcbiAgfVxufSk7IiwiLy8gMjAuMi4yLjE4IE1hdGguaW11bCh4LCB5KVxudmFyICRkZWYgID0gcmVxdWlyZSgnLi8kLmRlZicpXG4gICwgJGltdWwgPSBNYXRoLmltdWw7XG5cbi8vIHNvbWUgV2ViS2l0IHZlcnNpb25zIGZhaWxzIHdpdGggYmlnIG51bWJlcnMsIHNvbWUgaGFzIHdyb25nIGFyaXR5XG4kZGVmKCRkZWYuUyArICRkZWYuRiAqIHJlcXVpcmUoJy4vJC5mYWlscycpKGZ1bmN0aW9uKCl7XG4gIHJldHVybiAkaW11bCgweGZmZmZmZmZmLCA1KSAhPSAtNSB8fCAkaW11bC5sZW5ndGggIT0gMjtcbn0pLCAnTWF0aCcsIHtcbiAgaW11bDogZnVuY3Rpb24gaW11bCh4LCB5KXtcbiAgICB2YXIgVUlOVDE2ID0gMHhmZmZmXG4gICAgICAsIHhuID0gK3hcbiAgICAgICwgeW4gPSAreVxuICAgICAgLCB4bCA9IFVJTlQxNiAmIHhuXG4gICAgICAsIHlsID0gVUlOVDE2ICYgeW47XG4gICAgcmV0dXJuIDAgfCB4bCAqIHlsICsgKChVSU5UMTYgJiB4biA+Pj4gMTYpICogeWwgKyB4bCAqIChVSU5UMTYgJiB5biA+Pj4gMTYpIDw8IDE2ID4+PiAwKTtcbiAgfVxufSk7IiwiLy8gMjAuMi4yLjIxIE1hdGgubG9nMTAoeClcbnZhciAkZGVmID0gcmVxdWlyZSgnLi8kLmRlZicpO1xuXG4kZGVmKCRkZWYuUywgJ01hdGgnLCB7XG4gIGxvZzEwOiBmdW5jdGlvbiBsb2cxMCh4KXtcbiAgICByZXR1cm4gTWF0aC5sb2coeCkgLyBNYXRoLkxOMTA7XG4gIH1cbn0pOyIsIi8vIDIwLjIuMi4yMCBNYXRoLmxvZzFwKHgpXG52YXIgJGRlZiA9IHJlcXVpcmUoJy4vJC5kZWYnKTtcblxuJGRlZigkZGVmLlMsICdNYXRoJywge2xvZzFwOiByZXF1aXJlKCcuLyQubG9nMXAnKX0pOyIsIi8vIDIwLjIuMi4yMiBNYXRoLmxvZzIoeClcbnZhciAkZGVmID0gcmVxdWlyZSgnLi8kLmRlZicpO1xuXG4kZGVmKCRkZWYuUywgJ01hdGgnLCB7XG4gIGxvZzI6IGZ1bmN0aW9uIGxvZzIoeCl7XG4gICAgcmV0dXJuIE1hdGgubG9nKHgpIC8gTWF0aC5MTjI7XG4gIH1cbn0pOyIsIi8vIDIwLjIuMi4yOCBNYXRoLnNpZ24oeClcbnZhciAkZGVmID0gcmVxdWlyZSgnLi8kLmRlZicpO1xuXG4kZGVmKCRkZWYuUywgJ01hdGgnLCB7c2lnbjogcmVxdWlyZSgnLi8kLnNpZ24nKX0pOyIsIi8vIDIwLjIuMi4zMCBNYXRoLnNpbmgoeClcbnZhciAkZGVmICA9IHJlcXVpcmUoJy4vJC5kZWYnKVxuICAsIGV4cG0xID0gcmVxdWlyZSgnLi8kLmV4cG0xJylcbiAgLCBleHAgICA9IE1hdGguZXhwO1xuXG4vLyBWOCBuZWFyIENocm9taXVtIDM4IGhhcyBhIHByb2JsZW0gd2l0aCB2ZXJ5IHNtYWxsIG51bWJlcnNcbiRkZWYoJGRlZi5TICsgJGRlZi5GICogcmVxdWlyZSgnLi8kLmZhaWxzJykoZnVuY3Rpb24oKXtcbiAgcmV0dXJuICFNYXRoLnNpbmgoLTJlLTE3KSAhPSAtMmUtMTc7XG59KSwgJ01hdGgnLCB7XG4gIHNpbmg6IGZ1bmN0aW9uIHNpbmgoeCl7XG4gICAgcmV0dXJuIE1hdGguYWJzKHggPSAreCkgPCAxXG4gICAgICA/IChleHBtMSh4KSAtIGV4cG0xKC14KSkgLyAyXG4gICAgICA6IChleHAoeCAtIDEpIC0gZXhwKC14IC0gMSkpICogKE1hdGguRSAvIDIpO1xuICB9XG59KTsiLCIvLyAyMC4yLjIuMzMgTWF0aC50YW5oKHgpXG52YXIgJGRlZiAgPSByZXF1aXJlKCcuLyQuZGVmJylcbiAgLCBleHBtMSA9IHJlcXVpcmUoJy4vJC5leHBtMScpXG4gICwgZXhwICAgPSBNYXRoLmV4cDtcblxuJGRlZigkZGVmLlMsICdNYXRoJywge1xuICB0YW5oOiBmdW5jdGlvbiB0YW5oKHgpe1xuICAgIHZhciBhID0gZXhwbTEoeCA9ICt4KVxuICAgICAgLCBiID0gZXhwbTEoLXgpO1xuICAgIHJldHVybiBhID09IEluZmluaXR5ID8gMSA6IGIgPT0gSW5maW5pdHkgPyAtMSA6IChhIC0gYikgLyAoZXhwKHgpICsgZXhwKC14KSk7XG4gIH1cbn0pOyIsIi8vIDIwLjIuMi4zNCBNYXRoLnRydW5jKHgpXG52YXIgJGRlZiA9IHJlcXVpcmUoJy4vJC5kZWYnKTtcblxuJGRlZigkZGVmLlMsICdNYXRoJywge1xuICB0cnVuYzogZnVuY3Rpb24gdHJ1bmMoaXQpe1xuICAgIHJldHVybiAoaXQgPiAwID8gTWF0aC5mbG9vciA6IE1hdGguY2VpbCkoaXQpO1xuICB9XG59KTsiLCIndXNlIHN0cmljdCc7XG52YXIgJCAgICAgICAgICA9IHJlcXVpcmUoJy4vJCcpXG4gICwgZ2xvYmFsICAgICA9IHJlcXVpcmUoJy4vJC5nbG9iYWwnKVxuICAsIGhhcyAgICAgICAgPSByZXF1aXJlKCcuLyQuaGFzJylcbiAgLCBjb2YgICAgICAgID0gcmVxdWlyZSgnLi8kLmNvZicpXG4gICwgaXNPYmplY3QgICA9IHJlcXVpcmUoJy4vJC5pcy1vYmplY3QnKVxuICAsIGZhaWxzICAgICAgPSByZXF1aXJlKCcuLyQuZmFpbHMnKVxuICAsIE5VTUJFUiAgICAgPSAnTnVtYmVyJ1xuICAsICROdW1iZXIgICAgPSBnbG9iYWxbTlVNQkVSXVxuICAsIEJhc2UgICAgICAgPSAkTnVtYmVyXG4gICwgcHJvdG8gICAgICA9ICROdW1iZXIucHJvdG90eXBlXG4gIC8vIE9wZXJhIH4xMiBoYXMgYnJva2VuIE9iamVjdCN0b1N0cmluZ1xuICAsIEJST0tFTl9DT0YgPSBjb2YoJC5jcmVhdGUocHJvdG8pKSA9PSBOVU1CRVI7XG52YXIgdG9QcmltaXRpdmUgPSBmdW5jdGlvbihpdCl7XG4gIHZhciBmbiwgdmFsO1xuICBpZih0eXBlb2YgKGZuID0gaXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKXJldHVybiB2YWw7XG4gIGlmKHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKXJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIG51bWJlclwiKTtcbn07XG52YXIgdG9OdW1iZXIgPSBmdW5jdGlvbihpdCl7XG4gIGlmKGlzT2JqZWN0KGl0KSlpdCA9IHRvUHJpbWl0aXZlKGl0KTtcbiAgaWYodHlwZW9mIGl0ID09ICdzdHJpbmcnICYmIGl0Lmxlbmd0aCA+IDIgJiYgaXQuY2hhckNvZGVBdCgwKSA9PSA0OCl7XG4gICAgdmFyIGJpbmFyeSA9IGZhbHNlO1xuICAgIHN3aXRjaChpdC5jaGFyQ29kZUF0KDEpKXtcbiAgICAgIGNhc2UgNjYgOiBjYXNlIDk4ICA6IGJpbmFyeSA9IHRydWU7XG4gICAgICBjYXNlIDc5IDogY2FzZSAxMTEgOiByZXR1cm4gcGFyc2VJbnQoaXQuc2xpY2UoMiksIGJpbmFyeSA/IDIgOiA4KTtcbiAgICB9XG4gIH0gcmV0dXJuICtpdDtcbn07XG5pZighKCROdW1iZXIoJzBvMScpICYmICROdW1iZXIoJzBiMScpKSl7XG4gICROdW1iZXIgPSBmdW5jdGlvbiBOdW1iZXIoaXQpe1xuICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICByZXR1cm4gdGhhdCBpbnN0YW5jZW9mICROdW1iZXJcbiAgICAgIC8vIGNoZWNrIG9uIDEuLmNvbnN0cnVjdG9yKGZvbykgY2FzZVxuICAgICAgJiYgKEJST0tFTl9DT0YgPyBmYWlscyhmdW5jdGlvbigpeyBwcm90by52YWx1ZU9mLmNhbGwodGhhdCk7IH0pIDogY29mKHRoYXQpICE9IE5VTUJFUilcbiAgICAgICAgPyBuZXcgQmFzZSh0b051bWJlcihpdCkpIDogdG9OdW1iZXIoaXQpO1xuICB9O1xuICAkLmVhY2guY2FsbChyZXF1aXJlKCcuLyQuc3VwcG9ydC1kZXNjJykgPyAkLmdldE5hbWVzKEJhc2UpIDogKFxuICAgIC8vIEVTMzpcbiAgICAnTUFYX1ZBTFVFLE1JTl9WQUxVRSxOYU4sTkVHQVRJVkVfSU5GSU5JVFksUE9TSVRJVkVfSU5GSU5JVFksJyArXG4gICAgLy8gRVM2IChpbiBjYXNlLCBpZiBtb2R1bGVzIHdpdGggRVM2IE51bWJlciBzdGF0aWNzIHJlcXVpcmVkIGJlZm9yZSk6XG4gICAgJ0VQU0lMT04saXNGaW5pdGUsaXNJbnRlZ2VyLGlzTmFOLGlzU2FmZUludGVnZXIsTUFYX1NBRkVfSU5URUdFUiwnICtcbiAgICAnTUlOX1NBRkVfSU5URUdFUixwYXJzZUZsb2F0LHBhcnNlSW50LGlzSW50ZWdlcidcbiAgKS5zcGxpdCgnLCcpLCBmdW5jdGlvbihrZXkpe1xuICAgIGlmKGhhcyhCYXNlLCBrZXkpICYmICFoYXMoJE51bWJlciwga2V5KSl7XG4gICAgICAkLnNldERlc2MoJE51bWJlciwga2V5LCAkLmdldERlc2MoQmFzZSwga2V5KSk7XG4gICAgfVxuICB9KTtcbiAgJE51bWJlci5wcm90b3R5cGUgPSBwcm90bztcbiAgcHJvdG8uY29uc3RydWN0b3IgPSAkTnVtYmVyO1xuICByZXF1aXJlKCcuLyQucmVkZWYnKShnbG9iYWwsIE5VTUJFUiwgJE51bWJlcik7XG59IiwiLy8gMjAuMS4yLjEgTnVtYmVyLkVQU0lMT05cbnZhciAkZGVmID0gcmVxdWlyZSgnLi8kLmRlZicpO1xuXG4kZGVmKCRkZWYuUywgJ051bWJlcicsIHtFUFNJTE9OOiBNYXRoLnBvdygyLCAtNTIpfSk7IiwiLy8gMjAuMS4yLjIgTnVtYmVyLmlzRmluaXRlKG51bWJlcilcbnZhciAkZGVmICAgICAgPSByZXF1aXJlKCcuLyQuZGVmJylcbiAgLCBfaXNGaW5pdGUgPSByZXF1aXJlKCcuLyQuZ2xvYmFsJykuaXNGaW5pdGU7XG5cbiRkZWYoJGRlZi5TLCAnTnVtYmVyJywge1xuICBpc0Zpbml0ZTogZnVuY3Rpb24gaXNGaW5pdGUoaXQpe1xuICAgIHJldHVybiB0eXBlb2YgaXQgPT0gJ251bWJlcicgJiYgX2lzRmluaXRlKGl0KTtcbiAgfVxufSk7IiwiLy8gMjAuMS4yLjMgTnVtYmVyLmlzSW50ZWdlcihudW1iZXIpXG52YXIgJGRlZiA9IHJlcXVpcmUoJy4vJC5kZWYnKTtcblxuJGRlZigkZGVmLlMsICdOdW1iZXInLCB7aXNJbnRlZ2VyOiByZXF1aXJlKCcuLyQuaXMtaW50ZWdlcicpfSk7IiwiLy8gMjAuMS4yLjQgTnVtYmVyLmlzTmFOKG51bWJlcilcbnZhciAkZGVmID0gcmVxdWlyZSgnLi8kLmRlZicpO1xuXG4kZGVmKCRkZWYuUywgJ051bWJlcicsIHtcbiAgaXNOYU46IGZ1bmN0aW9uIGlzTmFOKG51bWJlcil7XG4gICAgcmV0dXJuIG51bWJlciAhPSBudW1iZXI7XG4gIH1cbn0pOyIsIi8vIDIwLjEuMi41IE51bWJlci5pc1NhZmVJbnRlZ2VyKG51bWJlcilcbnZhciAkZGVmICAgICAgPSByZXF1aXJlKCcuLyQuZGVmJylcbiAgLCBpc0ludGVnZXIgPSByZXF1aXJlKCcuLyQuaXMtaW50ZWdlcicpXG4gICwgYWJzICAgICAgID0gTWF0aC5hYnM7XG5cbiRkZWYoJGRlZi5TLCAnTnVtYmVyJywge1xuICBpc1NhZmVJbnRlZ2VyOiBmdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKG51bWJlcil7XG4gICAgcmV0dXJuIGlzSW50ZWdlcihudW1iZXIpICYmIGFicyhudW1iZXIpIDw9IDB4MWZmZmZmZmZmZmZmZmY7XG4gIH1cbn0pOyIsIi8vIDIwLjEuMi42IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXG52YXIgJGRlZiA9IHJlcXVpcmUoJy4vJC5kZWYnKTtcblxuJGRlZigkZGVmLlMsICdOdW1iZXInLCB7TUFYX1NBRkVfSU5URUdFUjogMHgxZmZmZmZmZmZmZmZmZn0pOyIsIi8vIDIwLjEuMi4xMCBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUlxudmFyICRkZWYgPSByZXF1aXJlKCcuLyQuZGVmJyk7XG5cbiRkZWYoJGRlZi5TLCAnTnVtYmVyJywge01JTl9TQUZFX0lOVEVHRVI6IC0weDFmZmZmZmZmZmZmZmZmfSk7IiwiLy8gMjAuMS4yLjEyIE51bWJlci5wYXJzZUZsb2F0KHN0cmluZylcbnZhciAkZGVmID0gcmVxdWlyZSgnLi8kLmRlZicpO1xuXG4kZGVmKCRkZWYuUywgJ051bWJlcicsIHtwYXJzZUZsb2F0OiBwYXJzZUZsb2F0fSk7IiwiLy8gMjAuMS4yLjEzIE51bWJlci5wYXJzZUludChzdHJpbmcsIHJhZGl4KVxudmFyICRkZWYgPSByZXF1aXJlKCcuLyQuZGVmJyk7XG5cbiRkZWYoJGRlZi5TLCAnTnVtYmVyJywge3BhcnNlSW50OiBwYXJzZUludH0pOyIsIi8vIDE5LjEuMy4xIE9iamVjdC5hc3NpZ24odGFyZ2V0LCBzb3VyY2UpXG52YXIgJGRlZiA9IHJlcXVpcmUoJy4vJC5kZWYnKTtcblxuJGRlZigkZGVmLlMgKyAkZGVmLkYsICdPYmplY3QnLCB7YXNzaWduOiByZXF1aXJlKCcuLyQuYXNzaWduJyl9KTsiLCIvLyAxOS4xLjIuNSBPYmplY3QuZnJlZXplKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLyQuaXMtb2JqZWN0Jyk7XG5cbnJlcXVpcmUoJy4vJC5vYmplY3Qtc2FwJykoJ2ZyZWV6ZScsIGZ1bmN0aW9uKCRmcmVlemUpe1xuICByZXR1cm4gZnVuY3Rpb24gZnJlZXplKGl0KXtcbiAgICByZXR1cm4gJGZyZWV6ZSAmJiBpc09iamVjdChpdCkgPyAkZnJlZXplKGl0KSA6IGl0O1xuICB9O1xufSk7IiwiLy8gMTkuMS4yLjYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKVxudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vJC50by1pb2JqZWN0Jyk7XG5cbnJlcXVpcmUoJy4vJC5vYmplY3Qtc2FwJykoJ2dldE93blByb3BlcnR5RGVzY3JpcHRvcicsIGZ1bmN0aW9uKCRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ipe1xuICByZXR1cm4gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpe1xuICAgIHJldHVybiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRvSU9iamVjdChpdCksIGtleSk7XG4gIH07XG59KTsiLCIvLyAxOS4xLjIuNyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxucmVxdWlyZSgnLi8kLm9iamVjdC1zYXAnKSgnZ2V0T3duUHJvcGVydHlOYW1lcycsIGZ1bmN0aW9uKCl7XG4gIHJldHVybiByZXF1aXJlKCcuLyQuZ2V0LW5hbWVzJykuZ2V0O1xufSk7IiwiLy8gMTkuMS4yLjkgT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pXG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLyQudG8tb2JqZWN0Jyk7XG5cbnJlcXVpcmUoJy4vJC5vYmplY3Qtc2FwJykoJ2dldFByb3RvdHlwZU9mJywgZnVuY3Rpb24oJGdldFByb3RvdHlwZU9mKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKGl0KXtcbiAgICByZXR1cm4gJGdldFByb3RvdHlwZU9mKHRvT2JqZWN0KGl0KSk7XG4gIH07XG59KTsiLCIvLyAxOS4xLjIuMTEgT2JqZWN0LmlzRXh0ZW5zaWJsZShPKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi8kLmlzLW9iamVjdCcpO1xuXG5yZXF1aXJlKCcuLyQub2JqZWN0LXNhcCcpKCdpc0V4dGVuc2libGUnLCBmdW5jdGlvbigkaXNFeHRlbnNpYmxlKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZShpdCl7XG4gICAgcmV0dXJuIGlzT2JqZWN0KGl0KSA/ICRpc0V4dGVuc2libGUgPyAkaXNFeHRlbnNpYmxlKGl0KSA6IHRydWUgOiBmYWxzZTtcbiAgfTtcbn0pOyIsIi8vIDE5LjEuMi4xMiBPYmplY3QuaXNGcm96ZW4oTylcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vJC5pcy1vYmplY3QnKTtcblxucmVxdWlyZSgnLi8kLm9iamVjdC1zYXAnKSgnaXNGcm96ZW4nLCBmdW5jdGlvbigkaXNGcm96ZW4pe1xuICByZXR1cm4gZnVuY3Rpb24gaXNGcm96ZW4oaXQpe1xuICAgIHJldHVybiBpc09iamVjdChpdCkgPyAkaXNGcm96ZW4gPyAkaXNGcm96ZW4oaXQpIDogZmFsc2UgOiB0cnVlO1xuICB9O1xufSk7IiwiLy8gMTkuMS4yLjEzIE9iamVjdC5pc1NlYWxlZChPKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi8kLmlzLW9iamVjdCcpO1xuXG5yZXF1aXJlKCcuLyQub2JqZWN0LXNhcCcpKCdpc1NlYWxlZCcsIGZ1bmN0aW9uKCRpc1NlYWxlZCl7XG4gIHJldHVybiBmdW5jdGlvbiBpc1NlYWxlZChpdCl7XG4gICAgcmV0dXJuIGlzT2JqZWN0KGl0KSA/ICRpc1NlYWxlZCA/ICRpc1NlYWxlZChpdCkgOiBmYWxzZSA6IHRydWU7XG4gIH07XG59KTsiLCIvLyAxOS4xLjMuMTAgT2JqZWN0LmlzKHZhbHVlMSwgdmFsdWUyKVxudmFyICRkZWYgPSByZXF1aXJlKCcuLyQuZGVmJyk7XG4kZGVmKCRkZWYuUywgJ09iamVjdCcsIHtcbiAgaXM6IHJlcXVpcmUoJy4vJC5zYW1lJylcbn0pOyIsIi8vIDE5LjEuMi4xNCBPYmplY3Qua2V5cyhPKVxudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi8kLnRvLW9iamVjdCcpO1xuXG5yZXF1aXJlKCcuLyQub2JqZWN0LXNhcCcpKCdrZXlzJywgZnVuY3Rpb24oJGtleXMpe1xuICByZXR1cm4gZnVuY3Rpb24ga2V5cyhpdCl7XG4gICAgcmV0dXJuICRrZXlzKHRvT2JqZWN0KGl0KSk7XG4gIH07XG59KTsiLCIvLyAxOS4xLjIuMTUgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLyQuaXMtb2JqZWN0Jyk7XG5cbnJlcXVpcmUoJy4vJC5vYmplY3Qtc2FwJykoJ3ByZXZlbnRFeHRlbnNpb25zJywgZnVuY3Rpb24oJHByZXZlbnRFeHRlbnNpb25zKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIHByZXZlbnRFeHRlbnNpb25zKGl0KXtcbiAgICByZXR1cm4gJHByZXZlbnRFeHRlbnNpb25zICYmIGlzT2JqZWN0KGl0KSA/ICRwcmV2ZW50RXh0ZW5zaW9ucyhpdCkgOiBpdDtcbiAgfTtcbn0pOyIsIi8vIDE5LjEuMi4xNyBPYmplY3Quc2VhbChPKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi8kLmlzLW9iamVjdCcpO1xuXG5yZXF1aXJlKCcuLyQub2JqZWN0LXNhcCcpKCdzZWFsJywgZnVuY3Rpb24oJHNlYWwpe1xuICByZXR1cm4gZnVuY3Rpb24gc2VhbChpdCl7XG4gICAgcmV0dXJuICRzZWFsICYmIGlzT2JqZWN0KGl0KSA/ICRzZWFsKGl0KSA6IGl0O1xuICB9O1xufSk7IiwiLy8gMTkuMS4zLjE5IE9iamVjdC5zZXRQcm90b3R5cGVPZihPLCBwcm90bylcbnZhciAkZGVmID0gcmVxdWlyZSgnLi8kLmRlZicpO1xuJGRlZigkZGVmLlMsICdPYmplY3QnLCB7c2V0UHJvdG90eXBlT2Y6IHJlcXVpcmUoJy4vJC5zZXQtcHJvdG8nKS5zZXR9KTsiLCIndXNlIHN0cmljdCc7XG4vLyAxOS4xLjMuNiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKClcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi8kLmNsYXNzb2YnKVxuICAsIHRlc3QgICAgPSB7fTtcbnRlc3RbcmVxdWlyZSgnLi8kLndrcycpKCd0b1N0cmluZ1RhZycpXSA9ICd6JztcbmlmKHRlc3QgKyAnJyAhPSAnW29iamVjdCB6XScpe1xuICByZXF1aXJlKCcuLyQucmVkZWYnKShPYmplY3QucHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpe1xuICAgIHJldHVybiAnW29iamVjdCAnICsgY2xhc3NvZih0aGlzKSArICddJztcbiAgfSwgdHJ1ZSk7XG59IiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgICAgICAgICAgPSByZXF1aXJlKCcuLyQnKVxuICAsIExJQlJBUlkgICAgPSByZXF1aXJlKCcuLyQubGlicmFyeScpXG4gICwgZ2xvYmFsICAgICA9IHJlcXVpcmUoJy4vJC5nbG9iYWwnKVxuICAsIGN0eCAgICAgICAgPSByZXF1aXJlKCcuLyQuY3R4JylcbiAgLCBjbGFzc29mICAgID0gcmVxdWlyZSgnLi8kLmNsYXNzb2YnKVxuICAsICRkZWYgICAgICAgPSByZXF1aXJlKCcuLyQuZGVmJylcbiAgLCBpc09iamVjdCAgID0gcmVxdWlyZSgnLi8kLmlzLW9iamVjdCcpXG4gICwgYW5PYmplY3QgICA9IHJlcXVpcmUoJy4vJC5hbi1vYmplY3QnKVxuICAsIGFGdW5jdGlvbiAgPSByZXF1aXJlKCcuLyQuYS1mdW5jdGlvbicpXG4gICwgc3RyaWN0TmV3ICA9IHJlcXVpcmUoJy4vJC5zdHJpY3QtbmV3JylcbiAgLCBmb3JPZiAgICAgID0gcmVxdWlyZSgnLi8kLmZvci1vZicpXG4gICwgc2V0UHJvdG8gICA9IHJlcXVpcmUoJy4vJC5zZXQtcHJvdG8nKS5zZXRcbiAgLCBzYW1lICAgICAgID0gcmVxdWlyZSgnLi8kLnNhbWUnKVxuICAsIHNwZWNpZXMgICAgPSByZXF1aXJlKCcuLyQuc3BlY2llcycpXG4gICwgU1BFQ0lFUyAgICA9IHJlcXVpcmUoJy4vJC53a3MnKSgnc3BlY2llcycpXG4gICwgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi8kLnNwZWNpZXMtY29uc3RydWN0b3InKVxuICAsIFJFQ09SRCAgICAgPSByZXF1aXJlKCcuLyQudWlkJykoJ3JlY29yZCcpXG4gICwgYXNhcCAgICAgICA9IHJlcXVpcmUoJy4vJC5taWNyb3Rhc2snKVxuICAsIFBST01JU0UgICAgPSAnUHJvbWlzZSdcbiAgLCBwcm9jZXNzICAgID0gZ2xvYmFsLnByb2Nlc3NcbiAgLCBpc05vZGUgICAgID0gY2xhc3NvZihwcm9jZXNzKSA9PSAncHJvY2VzcydcbiAgLCBQICAgICAgICAgID0gZ2xvYmFsW1BST01JU0VdXG4gICwgV3JhcHBlcjtcblxudmFyIHRlc3RSZXNvbHZlID0gZnVuY3Rpb24oc3ViKXtcbiAgdmFyIHRlc3QgPSBuZXcgUChmdW5jdGlvbigpe30pO1xuICBpZihzdWIpdGVzdC5jb25zdHJ1Y3RvciA9IE9iamVjdDtcbiAgcmV0dXJuIFAucmVzb2x2ZSh0ZXN0KSA9PT0gdGVzdDtcbn07XG5cbnZhciB1c2VOYXRpdmUgPSBmdW5jdGlvbigpe1xuICB2YXIgd29ya3MgPSBmYWxzZTtcbiAgZnVuY3Rpb24gUDIoeCl7XG4gICAgdmFyIHNlbGYgPSBuZXcgUCh4KTtcbiAgICBzZXRQcm90byhzZWxmLCBQMi5wcm90b3R5cGUpO1xuICAgIHJldHVybiBzZWxmO1xuICB9XG4gIHRyeSB7XG4gICAgd29ya3MgPSBQICYmIFAucmVzb2x2ZSAmJiB0ZXN0UmVzb2x2ZSgpO1xuICAgIHNldFByb3RvKFAyLCBQKTtcbiAgICBQMi5wcm90b3R5cGUgPSAkLmNyZWF0ZShQLnByb3RvdHlwZSwge2NvbnN0cnVjdG9yOiB7dmFsdWU6IFAyfX0pO1xuICAgIC8vIGFjdHVhbCBGaXJlZm94IGhhcyBicm9rZW4gc3ViY2xhc3Mgc3VwcG9ydCwgdGVzdCB0aGF0XG4gICAgaWYoIShQMi5yZXNvbHZlKDUpLnRoZW4oZnVuY3Rpb24oKXt9KSBpbnN0YW5jZW9mIFAyKSl7XG4gICAgICB3b3JrcyA9IGZhbHNlO1xuICAgIH1cbiAgICAvLyBhY3R1YWwgVjggYnVnLCBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9NDE2MlxuICAgIGlmKHdvcmtzICYmIHJlcXVpcmUoJy4vJC5zdXBwb3J0LWRlc2MnKSl7XG4gICAgICB2YXIgdGhlbmFibGVUaGVuR290dGVuID0gZmFsc2U7XG4gICAgICBQLnJlc29sdmUoJC5zZXREZXNjKHt9LCAndGhlbicsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbigpeyB0aGVuYWJsZVRoZW5Hb3R0ZW4gPSB0cnVlOyB9XG4gICAgICB9KSk7XG4gICAgICB3b3JrcyA9IHRoZW5hYmxlVGhlbkdvdHRlbjtcbiAgICB9XG4gIH0gY2F0Y2goZSl7IHdvcmtzID0gZmFsc2U7IH1cbiAgcmV0dXJuIHdvcmtzO1xufSgpO1xuXG4vLyBoZWxwZXJzXG52YXIgaXNQcm9taXNlID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmICh1c2VOYXRpdmUgPyBjbGFzc29mKGl0KSA9PSAnUHJvbWlzZScgOiBSRUNPUkQgaW4gaXQpO1xufTtcbnZhciBzYW1lQ29uc3RydWN0b3IgPSBmdW5jdGlvbihhLCBiKXtcbiAgLy8gbGlicmFyeSB3cmFwcGVyIHNwZWNpYWwgY2FzZVxuICBpZihMSUJSQVJZICYmIGEgPT09IFAgJiYgYiA9PT0gV3JhcHBlcilyZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIHNhbWUoYSwgYik7XG59O1xudmFyIGdldENvbnN0cnVjdG9yID0gZnVuY3Rpb24oQyl7XG4gIHZhciBTID0gYW5PYmplY3QoQylbU1BFQ0lFU107XG4gIHJldHVybiBTICE9IHVuZGVmaW5lZCA/IFMgOiBDO1xufTtcbnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24oaXQpe1xuICB2YXIgdGhlbjtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiB0eXBlb2YgKHRoZW4gPSBpdC50aGVuKSA9PSAnZnVuY3Rpb24nID8gdGhlbiA6IGZhbHNlO1xufTtcbnZhciBub3RpZnkgPSBmdW5jdGlvbihyZWNvcmQsIGlzUmVqZWN0KXtcbiAgaWYocmVjb3JkLm4pcmV0dXJuO1xuICByZWNvcmQubiA9IHRydWU7XG4gIHZhciBjaGFpbiA9IHJlY29yZC5jO1xuICBhc2FwKGZ1bmN0aW9uKCl7XG4gICAgdmFyIHZhbHVlID0gcmVjb3JkLnZcbiAgICAgICwgb2sgICAgPSByZWNvcmQucyA9PSAxXG4gICAgICAsIGkgICAgID0gMDtcbiAgICB2YXIgcnVuID0gZnVuY3Rpb24ocmVhY3Qpe1xuICAgICAgdmFyIGNiID0gb2sgPyByZWFjdC5vayA6IHJlYWN0LmZhaWxcbiAgICAgICAgLCByZXQsIHRoZW47XG4gICAgICB0cnkge1xuICAgICAgICBpZihjYil7XG4gICAgICAgICAgaWYoIW9rKXJlY29yZC5oID0gdHJ1ZTtcbiAgICAgICAgICByZXQgPSBjYiA9PT0gdHJ1ZSA/IHZhbHVlIDogY2IodmFsdWUpO1xuICAgICAgICAgIGlmKHJldCA9PT0gcmVhY3QuUCl7XG4gICAgICAgICAgICByZWFjdC5yZWooVHlwZUVycm9yKCdQcm9taXNlLWNoYWluIGN5Y2xlJykpO1xuICAgICAgICAgIH0gZWxzZSBpZih0aGVuID0gaXNUaGVuYWJsZShyZXQpKXtcbiAgICAgICAgICAgIHRoZW4uY2FsbChyZXQsIHJlYWN0LnJlcywgcmVhY3QucmVqKTtcbiAgICAgICAgICB9IGVsc2UgcmVhY3QucmVzKHJldCk7XG4gICAgICAgIH0gZWxzZSByZWFjdC5yZWoodmFsdWUpO1xuICAgICAgfSBjYXRjaChlcnIpe1xuICAgICAgICByZWFjdC5yZWooZXJyKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdoaWxlKGNoYWluLmxlbmd0aCA+IGkpcnVuKGNoYWluW2krK10pOyAvLyB2YXJpYWJsZSBsZW5ndGggLSBjYW4ndCB1c2UgZm9yRWFjaFxuICAgIGNoYWluLmxlbmd0aCA9IDA7XG4gICAgcmVjb3JkLm4gPSBmYWxzZTtcbiAgICBpZihpc1JlamVjdClzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICB2YXIgcHJvbWlzZSA9IHJlY29yZC5wXG4gICAgICAgICwgaGFuZGxlciwgY29uc29sZTtcbiAgICAgIGlmKGlzVW5oYW5kbGVkKHByb21pc2UpKXtcbiAgICAgICAgaWYoaXNOb2RlKXtcbiAgICAgICAgICBwcm9jZXNzLmVtaXQoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHZhbHVlLCBwcm9taXNlKTtcbiAgICAgICAgfSBlbHNlIGlmKGhhbmRsZXIgPSBnbG9iYWwub251bmhhbmRsZWRyZWplY3Rpb24pe1xuICAgICAgICAgIGhhbmRsZXIoe3Byb21pc2U6IHByb21pc2UsIHJlYXNvbjogdmFsdWV9KTtcbiAgICAgICAgfSBlbHNlIGlmKChjb25zb2xlID0gZ2xvYmFsLmNvbnNvbGUpICYmIGNvbnNvbGUuZXJyb3Ipe1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSByZWNvcmQuYSA9IHVuZGVmaW5lZDtcbiAgICB9LCAxKTtcbiAgfSk7XG59O1xudmFyIGlzVW5oYW5kbGVkID0gZnVuY3Rpb24ocHJvbWlzZSl7XG4gIHZhciByZWNvcmQgPSBwcm9taXNlW1JFQ09SRF1cbiAgICAsIGNoYWluICA9IHJlY29yZC5hIHx8IHJlY29yZC5jXG4gICAgLCBpICAgICAgPSAwXG4gICAgLCByZWFjdDtcbiAgaWYocmVjb3JkLmgpcmV0dXJuIGZhbHNlO1xuICB3aGlsZShjaGFpbi5sZW5ndGggPiBpKXtcbiAgICByZWFjdCA9IGNoYWluW2krK107XG4gICAgaWYocmVhY3QuZmFpbCB8fCAhaXNVbmhhbmRsZWQocmVhY3QuUCkpcmV0dXJuIGZhbHNlO1xuICB9IHJldHVybiB0cnVlO1xufTtcbnZhciAkcmVqZWN0ID0gZnVuY3Rpb24odmFsdWUpe1xuICB2YXIgcmVjb3JkID0gdGhpcztcbiAgaWYocmVjb3JkLmQpcmV0dXJuO1xuICByZWNvcmQuZCA9IHRydWU7XG4gIHJlY29yZCA9IHJlY29yZC5yIHx8IHJlY29yZDsgLy8gdW53cmFwXG4gIHJlY29yZC52ID0gdmFsdWU7XG4gIHJlY29yZC5zID0gMjtcbiAgcmVjb3JkLmEgPSByZWNvcmQuYy5zbGljZSgpO1xuICBub3RpZnkocmVjb3JkLCB0cnVlKTtcbn07XG52YXIgJHJlc29sdmUgPSBmdW5jdGlvbih2YWx1ZSl7XG4gIHZhciByZWNvcmQgPSB0aGlzXG4gICAgLCB0aGVuO1xuICBpZihyZWNvcmQuZClyZXR1cm47XG4gIHJlY29yZC5kID0gdHJ1ZTtcbiAgcmVjb3JkID0gcmVjb3JkLnIgfHwgcmVjb3JkOyAvLyB1bndyYXBcbiAgdHJ5IHtcbiAgICBpZih0aGVuID0gaXNUaGVuYWJsZSh2YWx1ZSkpe1xuICAgICAgYXNhcChmdW5jdGlvbigpe1xuICAgICAgICB2YXIgd3JhcHBlciA9IHtyOiByZWNvcmQsIGQ6IGZhbHNlfTsgLy8gd3JhcFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoZW4uY2FsbCh2YWx1ZSwgY3R4KCRyZXNvbHZlLCB3cmFwcGVyLCAxKSwgY3R4KCRyZWplY3QsIHdyYXBwZXIsIDEpKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAkcmVqZWN0LmNhbGwod3JhcHBlciwgZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWNvcmQudiA9IHZhbHVlO1xuICAgICAgcmVjb3JkLnMgPSAxO1xuICAgICAgbm90aWZ5KHJlY29yZCwgZmFsc2UpO1xuICAgIH1cbiAgfSBjYXRjaChlKXtcbiAgICAkcmVqZWN0LmNhbGwoe3I6IHJlY29yZCwgZDogZmFsc2V9LCBlKTsgLy8gd3JhcFxuICB9XG59O1xuXG4vLyBjb25zdHJ1Y3RvciBwb2x5ZmlsbFxuaWYoIXVzZU5hdGl2ZSl7XG4gIC8vIDI1LjQuMy4xIFByb21pc2UoZXhlY3V0b3IpXG4gIFAgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKXtcbiAgICBhRnVuY3Rpb24oZXhlY3V0b3IpO1xuICAgIHZhciByZWNvcmQgPSB7XG4gICAgICBwOiBzdHJpY3ROZXcodGhpcywgUCwgUFJPTUlTRSksICAgICAgICAgLy8gPC0gcHJvbWlzZVxuICAgICAgYzogW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIGF3YWl0aW5nIHJlYWN0aW9uc1xuICAgICAgYTogdW5kZWZpbmVkLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIGNoZWNrZWQgaW4gaXNVbmhhbmRsZWQgcmVhY3Rpb25zXG4gICAgICBzOiAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPC0gc3RhdGVcbiAgICAgIGQ6IGZhbHNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA8LSBkb25lXG4gICAgICB2OiB1bmRlZmluZWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPC0gdmFsdWVcbiAgICAgIGg6IGZhbHNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA8LSBoYW5kbGVkIHJlamVjdGlvblxuICAgICAgbjogZmFsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIG5vdGlmeVxuICAgIH07XG4gICAgdGhpc1tSRUNPUkRdID0gcmVjb3JkO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihjdHgoJHJlc29sdmUsIHJlY29yZCwgMSksIGN0eCgkcmVqZWN0LCByZWNvcmQsIDEpKTtcbiAgICB9IGNhdGNoKGVycil7XG4gICAgICAkcmVqZWN0LmNhbGwocmVjb3JkLCBlcnIpO1xuICAgIH1cbiAgfTtcbiAgcmVxdWlyZSgnLi8kLm1peCcpKFAucHJvdG90eXBlLCB7XG4gICAgLy8gMjUuNC41LjMgUHJvbWlzZS5wcm90b3R5cGUudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZClcbiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKXtcbiAgICAgIHZhciByZWFjdCA9IHtcbiAgICAgICAgb2s6ICAgdHlwZW9mIG9uRnVsZmlsbGVkID09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IHRydWUsXG4gICAgICAgIGZhaWw6IHR5cGVvZiBvblJlamVjdGVkID09ICdmdW5jdGlvbicgID8gb25SZWplY3RlZCAgOiBmYWxzZVxuICAgICAgfTtcbiAgICAgIHZhciBwcm9taXNlID0gcmVhY3QuUCA9IG5ldyAoc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIFApKShmdW5jdGlvbihyZXMsIHJlail7XG4gICAgICAgIHJlYWN0LnJlcyA9IHJlcztcbiAgICAgICAgcmVhY3QucmVqID0gcmVqO1xuICAgICAgfSk7XG4gICAgICBhRnVuY3Rpb24ocmVhY3QucmVzKTtcbiAgICAgIGFGdW5jdGlvbihyZWFjdC5yZWopO1xuICAgICAgdmFyIHJlY29yZCA9IHRoaXNbUkVDT1JEXTtcbiAgICAgIHJlY29yZC5jLnB1c2gocmVhY3QpO1xuICAgICAgaWYocmVjb3JkLmEpcmVjb3JkLmEucHVzaChyZWFjdCk7XG4gICAgICBpZihyZWNvcmQucylub3RpZnkocmVjb3JkLCBmYWxzZSk7XG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9LFxuICAgIC8vIDI1LjQuNS4xIFByb21pc2UucHJvdG90eXBlLmNhdGNoKG9uUmVqZWN0ZWQpXG4gICAgJ2NhdGNoJzogZnVuY3Rpb24ob25SZWplY3RlZCl7XG4gICAgICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgb25SZWplY3RlZCk7XG4gICAgfVxuICB9KTtcbn1cblxuLy8gZXhwb3J0XG4kZGVmKCRkZWYuRyArICRkZWYuVyArICRkZWYuRiAqICF1c2VOYXRpdmUsIHtQcm9taXNlOiBQfSk7XG5yZXF1aXJlKCcuLyQudGFnJykoUCwgUFJPTUlTRSk7XG5zcGVjaWVzKFApO1xuc3BlY2llcyhXcmFwcGVyID0gcmVxdWlyZSgnLi8kLmNvcmUnKVtQUk9NSVNFXSk7XG5cbi8vIHN0YXRpY3NcbiRkZWYoJGRlZi5TICsgJGRlZi5GICogIXVzZU5hdGl2ZSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuNSBQcm9taXNlLnJlamVjdChyKVxuICByZWplY3Q6IGZ1bmN0aW9uIHJlamVjdChyKXtcbiAgICByZXR1cm4gbmV3IHRoaXMoZnVuY3Rpb24ocmVzLCByZWopeyByZWoocik7IH0pO1xuICB9XG59KTtcbiRkZWYoJGRlZi5TICsgJGRlZi5GICogKCF1c2VOYXRpdmUgfHwgdGVzdFJlc29sdmUodHJ1ZSkpLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC42IFByb21pc2UucmVzb2x2ZSh4KVxuICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKHgpe1xuICAgIHJldHVybiBpc1Byb21pc2UoeCkgJiYgc2FtZUNvbnN0cnVjdG9yKHguY29uc3RydWN0b3IsIHRoaXMpXG4gICAgICA/IHggOiBuZXcgdGhpcyhmdW5jdGlvbihyZXMpeyByZXMoeCk7IH0pO1xuICB9XG59KTtcbiRkZWYoJGRlZi5TICsgJGRlZi5GICogISh1c2VOYXRpdmUgJiYgcmVxdWlyZSgnLi8kLml0ZXItZGV0ZWN0JykoZnVuY3Rpb24oaXRlcil7XG4gIFAuYWxsKGl0ZXIpWydjYXRjaCddKGZ1bmN0aW9uKCl7fSk7XG59KSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjEgUHJvbWlzZS5hbGwoaXRlcmFibGUpXG4gIGFsbDogZnVuY3Rpb24gYWxsKGl0ZXJhYmxlKXtcbiAgICB2YXIgQyAgICAgID0gZ2V0Q29uc3RydWN0b3IodGhpcylcbiAgICAgICwgdmFsdWVzID0gW107XG4gICAgcmV0dXJuIG5ldyBDKGZ1bmN0aW9uKHJlcywgcmVqKXtcbiAgICAgIGZvck9mKGl0ZXJhYmxlLCBmYWxzZSwgdmFsdWVzLnB1c2gsIHZhbHVlcyk7XG4gICAgICB2YXIgcmVtYWluaW5nID0gdmFsdWVzLmxlbmd0aFxuICAgICAgICAsIHJlc3VsdHMgICA9IEFycmF5KHJlbWFpbmluZyk7XG4gICAgICBpZihyZW1haW5pbmcpJC5lYWNoLmNhbGwodmFsdWVzLCBmdW5jdGlvbihwcm9taXNlLCBpbmRleCl7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGZ1bmN0aW9uKHZhbHVlKXtcbiAgICAgICAgICByZXN1bHRzW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlcyhyZXN1bHRzKTtcbiAgICAgICAgfSwgcmVqKTtcbiAgICAgIH0pO1xuICAgICAgZWxzZSByZXMocmVzdWx0cyk7XG4gICAgfSk7XG4gIH0sXG4gIC8vIDI1LjQuNC40IFByb21pc2UucmFjZShpdGVyYWJsZSlcbiAgcmFjZTogZnVuY3Rpb24gcmFjZShpdGVyYWJsZSl7XG4gICAgdmFyIEMgPSBnZXRDb25zdHJ1Y3Rvcih0aGlzKTtcbiAgICByZXR1cm4gbmV3IEMoZnVuY3Rpb24ocmVzLCByZWope1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbihwcm9taXNlKXtcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4ocmVzLCByZWopO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn0pOyIsIi8vIDI2LjEuMSBSZWZsZWN0LmFwcGx5KHRhcmdldCwgdGhpc0FyZ3VtZW50LCBhcmd1bWVudHNMaXN0KVxudmFyICRkZWYgICA9IHJlcXVpcmUoJy4vJC5kZWYnKVxuICAsIF9hcHBseSA9IEZ1bmN0aW9uLmFwcGx5O1xuXG4kZGVmKCRkZWYuUywgJ1JlZmxlY3QnLCB7XG4gIGFwcGx5OiBmdW5jdGlvbiBhcHBseSh0YXJnZXQsIHRoaXNBcmd1bWVudCwgYXJndW1lbnRzTGlzdCl7XG4gICAgcmV0dXJuIF9hcHBseS5jYWxsKHRhcmdldCwgdGhpc0FyZ3VtZW50LCBhcmd1bWVudHNMaXN0KTtcbiAgfVxufSk7IiwiLy8gMjYuMS4yIFJlZmxlY3QuY29uc3RydWN0KHRhcmdldCwgYXJndW1lbnRzTGlzdCBbLCBuZXdUYXJnZXRdKVxudmFyICQgICAgICAgICA9IHJlcXVpcmUoJy4vJCcpXG4gICwgJGRlZiAgICAgID0gcmVxdWlyZSgnLi8kLmRlZicpXG4gICwgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi8kLmEtZnVuY3Rpb24nKVxuICAsIGFuT2JqZWN0ICA9IHJlcXVpcmUoJy4vJC5hbi1vYmplY3QnKVxuICAsIGlzT2JqZWN0ICA9IHJlcXVpcmUoJy4vJC5pcy1vYmplY3QnKVxuICAsIGJpbmQgICAgICA9IEZ1bmN0aW9uLmJpbmQgfHwgcmVxdWlyZSgnLi8kLmNvcmUnKS5GdW5jdGlvbi5wcm90b3R5cGUuYmluZDtcblxuLy8gTVMgRWRnZSBzdXBwb3J0cyBvbmx5IDIgYXJndW1lbnRzXG4vLyBGRiBOaWdodGx5IHNldHMgdGhpcmQgYXJndW1lbnQgYXMgYG5ldy50YXJnZXRgLCBidXQgZG9lcyBub3QgY3JlYXRlIGB0aGlzYCBmcm9tIGl0XG4kZGVmKCRkZWYuUyArICRkZWYuRiAqIHJlcXVpcmUoJy4vJC5mYWlscycpKGZ1bmN0aW9uKCl7XG4gIGZ1bmN0aW9uIEYoKXt9XG4gIHJldHVybiAhKFJlZmxlY3QuY29uc3RydWN0KGZ1bmN0aW9uKCl7fSwgW10sIEYpIGluc3RhbmNlb2YgRik7XG59KSwgJ1JlZmxlY3QnLCB7XG4gIGNvbnN0cnVjdDogZnVuY3Rpb24gY29uc3RydWN0KFRhcmdldCwgYXJncyAvKiwgbmV3VGFyZ2V0Ki8pe1xuICAgIGFGdW5jdGlvbihUYXJnZXQpO1xuICAgIHZhciBuZXdUYXJnZXQgPSBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IFRhcmdldCA6IGFGdW5jdGlvbihhcmd1bWVudHNbMl0pO1xuICAgIGlmKFRhcmdldCA9PSBuZXdUYXJnZXQpe1xuICAgICAgLy8gdy9vIGFsdGVyZWQgbmV3VGFyZ2V0LCBvcHRpbWl6YXRpb24gZm9yIDAtNCBhcmd1bWVudHNcbiAgICAgIGlmKGFyZ3MgIT0gdW5kZWZpbmVkKXN3aXRjaChhbk9iamVjdChhcmdzKS5sZW5ndGgpe1xuICAgICAgICBjYXNlIDA6IHJldHVybiBuZXcgVGFyZ2V0O1xuICAgICAgICBjYXNlIDE6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0pO1xuICAgICAgICBjYXNlIDI6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICBjYXNlIDM6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgICBjYXNlIDQ6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuICAgICAgfVxuICAgICAgLy8gdy9vIGFsdGVyZWQgbmV3VGFyZ2V0LCBsb3Qgb2YgYXJndW1lbnRzIGNhc2VcbiAgICAgIHZhciAkYXJncyA9IFtudWxsXTtcbiAgICAgICRhcmdzLnB1c2guYXBwbHkoJGFyZ3MsIGFyZ3MpO1xuICAgICAgcmV0dXJuIG5ldyAoYmluZC5hcHBseShUYXJnZXQsICRhcmdzKSk7XG4gICAgfVxuICAgIC8vIHdpdGggYWx0ZXJlZCBuZXdUYXJnZXQsIG5vdCBzdXBwb3J0IGJ1aWx0LWluIGNvbnN0cnVjdG9yc1xuICAgIHZhciBwcm90byAgICA9IG5ld1RhcmdldC5wcm90b3R5cGVcbiAgICAgICwgaW5zdGFuY2UgPSAkLmNyZWF0ZShpc09iamVjdChwcm90bykgPyBwcm90byA6IE9iamVjdC5wcm90b3R5cGUpXG4gICAgICAsIHJlc3VsdCAgID0gRnVuY3Rpb24uYXBwbHkuY2FsbChUYXJnZXQsIGluc3RhbmNlLCBhcmdzKTtcbiAgICByZXR1cm4gaXNPYmplY3QocmVzdWx0KSA/IHJlc3VsdCA6IGluc3RhbmNlO1xuICB9XG59KTsiLCIvLyAyNi4xLjMgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCBhdHRyaWJ1dGVzKVxudmFyICQgICAgICAgID0gcmVxdWlyZSgnLi8kJylcbiAgLCAkZGVmICAgICA9IHJlcXVpcmUoJy4vJC5kZWYnKVxuICAsIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi8kLmFuLW9iamVjdCcpO1xuXG4vLyBNUyBFZGdlIGhhcyBicm9rZW4gUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSAtIHRocm93aW5nIGluc3RlYWQgb2YgcmV0dXJuaW5nIGZhbHNlXG4kZGVmKCRkZWYuUyArICRkZWYuRiAqIHJlcXVpcmUoJy4vJC5mYWlscycpKGZ1bmN0aW9uKCl7XG4gIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkoJC5zZXREZXNjKHt9LCAxLCB7dmFsdWU6IDF9KSwgMSwge3ZhbHVlOiAyfSk7XG59KSwgJ1JlZmxlY3QnLCB7XG4gIGRlZmluZVByb3BlcnR5OiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCBhdHRyaWJ1dGVzKXtcbiAgICBhbk9iamVjdCh0YXJnZXQpO1xuICAgIHRyeSB7XG4gICAgICAkLnNldERlc2ModGFyZ2V0LCBwcm9wZXJ0eUtleSwgYXR0cmlidXRlcyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufSk7IiwiLy8gMjYuMS40IFJlZmxlY3QuZGVsZXRlUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSlcbnZhciAkZGVmICAgICA9IHJlcXVpcmUoJy4vJC5kZWYnKVxuICAsIGdldERlc2MgID0gcmVxdWlyZSgnLi8kJykuZ2V0RGVzY1xuICAsIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi8kLmFuLW9iamVjdCcpO1xuXG4kZGVmKCRkZWYuUywgJ1JlZmxlY3QnLCB7XG4gIGRlbGV0ZVByb3BlcnR5OiBmdW5jdGlvbiBkZWxldGVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5KXtcbiAgICB2YXIgZGVzYyA9IGdldERlc2MoYW5PYmplY3QodGFyZ2V0KSwgcHJvcGVydHlLZXkpO1xuICAgIHJldHVybiBkZXNjICYmICFkZXNjLmNvbmZpZ3VyYWJsZSA/IGZhbHNlIDogZGVsZXRlIHRhcmdldFtwcm9wZXJ0eUtleV07XG4gIH1cbn0pOyIsIid1c2Ugc3RyaWN0Jztcbi8vIDI2LjEuNSBSZWZsZWN0LmVudW1lcmF0ZSh0YXJnZXQpXG52YXIgJGRlZiAgICAgPSByZXF1aXJlKCcuLyQuZGVmJylcbiAgLCBhbk9iamVjdCA9IHJlcXVpcmUoJy4vJC5hbi1vYmplY3QnKTtcbnZhciBFbnVtZXJhdGUgPSBmdW5jdGlvbihpdGVyYXRlZCl7XG4gIHRoaXMuX3QgPSBhbk9iamVjdChpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4gIHZhciBrZXlzID0gdGhpcy5fayA9IFtdICAgICAgIC8vIGtleXNcbiAgICAsIGtleTtcbiAgZm9yKGtleSBpbiBpdGVyYXRlZClrZXlzLnB1c2goa2V5KTtcbn07XG5yZXF1aXJlKCcuLyQuaXRlci1jcmVhdGUnKShFbnVtZXJhdGUsICdPYmplY3QnLCBmdW5jdGlvbigpe1xuICB2YXIgdGhhdCA9IHRoaXNcbiAgICAsIGtleXMgPSB0aGF0Ll9rXG4gICAgLCBrZXk7XG4gIGRvIHtcbiAgICBpZih0aGF0Ll9pID49IGtleXMubGVuZ3RoKXJldHVybiB7dmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZX07XG4gIH0gd2hpbGUoISgoa2V5ID0ga2V5c1t0aGF0Ll9pKytdKSBpbiB0aGF0Ll90KSk7XG4gIHJldHVybiB7dmFsdWU6IGtleSwgZG9uZTogZmFsc2V9O1xufSk7XG5cbiRkZWYoJGRlZi5TLCAnUmVmbGVjdCcsIHtcbiAgZW51bWVyYXRlOiBmdW5jdGlvbiBlbnVtZXJhdGUodGFyZ2V0KXtcbiAgICByZXR1cm4gbmV3IEVudW1lcmF0ZSh0YXJnZXQpO1xuICB9XG59KTsiLCIvLyAyNi4xLjcgUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSlcbnZhciAkICAgICAgICA9IHJlcXVpcmUoJy4vJCcpXG4gICwgJGRlZiAgICAgPSByZXF1aXJlKCcuLyQuZGVmJylcbiAgLCBhbk9iamVjdCA9IHJlcXVpcmUoJy4vJC5hbi1vYmplY3QnKTtcblxuJGRlZigkZGVmLlMsICdSZWZsZWN0Jywge1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3BlcnR5S2V5KXtcbiAgICByZXR1cm4gJC5nZXREZXNjKGFuT2JqZWN0KHRhcmdldCksIHByb3BlcnR5S2V5KTtcbiAgfVxufSk7IiwiLy8gMjYuMS44IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YodGFyZ2V0KVxudmFyICRkZWYgICAgID0gcmVxdWlyZSgnLi8kLmRlZicpXG4gICwgZ2V0UHJvdG8gPSByZXF1aXJlKCcuLyQnKS5nZXRQcm90b1xuICAsIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi8kLmFuLW9iamVjdCcpO1xuXG4kZGVmKCRkZWYuUywgJ1JlZmxlY3QnLCB7XG4gIGdldFByb3RvdHlwZU9mOiBmdW5jdGlvbiBnZXRQcm90b3R5cGVPZih0YXJnZXQpe1xuICAgIHJldHVybiBnZXRQcm90byhhbk9iamVjdCh0YXJnZXQpKTtcbiAgfVxufSk7IiwiLy8gMjYuMS42IFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcGVydHlLZXkgWywgcmVjZWl2ZXJdKVxudmFyICQgICAgICAgID0gcmVxdWlyZSgnLi8kJylcbiAgLCBoYXMgICAgICA9IHJlcXVpcmUoJy4vJC5oYXMnKVxuICAsICRkZWYgICAgID0gcmVxdWlyZSgnLi8kLmRlZicpXG4gICwgaXNPYmplY3QgPSByZXF1aXJlKCcuLyQuaXMtb2JqZWN0JylcbiAgLCBhbk9iamVjdCA9IHJlcXVpcmUoJy4vJC5hbi1vYmplY3QnKTtcblxuZnVuY3Rpb24gZ2V0KHRhcmdldCwgcHJvcGVydHlLZXkvKiwgcmVjZWl2ZXIqLyl7XG4gIHZhciByZWNlaXZlciA9IGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdGFyZ2V0IDogYXJndW1lbnRzWzJdXG4gICAgLCBkZXNjLCBwcm90bztcbiAgaWYoYW5PYmplY3QodGFyZ2V0KSA9PT0gcmVjZWl2ZXIpcmV0dXJuIHRhcmdldFtwcm9wZXJ0eUtleV07XG4gIGlmKGRlc2MgPSAkLmdldERlc2ModGFyZ2V0LCBwcm9wZXJ0eUtleSkpcmV0dXJuIGhhcyhkZXNjLCAndmFsdWUnKVxuICAgID8gZGVzYy52YWx1ZVxuICAgIDogZGVzYy5nZXQgIT09IHVuZGVmaW5lZFxuICAgICAgPyBkZXNjLmdldC5jYWxsKHJlY2VpdmVyKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGlmKGlzT2JqZWN0KHByb3RvID0gJC5nZXRQcm90byh0YXJnZXQpKSlyZXR1cm4gZ2V0KHByb3RvLCBwcm9wZXJ0eUtleSwgcmVjZWl2ZXIpO1xufVxuXG4kZGVmKCRkZWYuUywgJ1JlZmxlY3QnLCB7Z2V0OiBnZXR9KTsiLCIvLyAyNi4xLjkgUmVmbGVjdC5oYXModGFyZ2V0LCBwcm9wZXJ0eUtleSlcbnZhciAkZGVmID0gcmVxdWlyZSgnLi8kLmRlZicpO1xuXG4kZGVmKCRkZWYuUywgJ1JlZmxlY3QnLCB7XG4gIGhhczogZnVuY3Rpb24gaGFzKHRhcmdldCwgcHJvcGVydHlLZXkpe1xuICAgIHJldHVybiBwcm9wZXJ0eUtleSBpbiB0YXJnZXQ7XG4gIH1cbn0pOyIsIi8vIDI2LjEuMTAgUmVmbGVjdC5pc0V4dGVuc2libGUodGFyZ2V0KVxudmFyICRkZWYgICAgICAgICAgPSByZXF1aXJlKCcuLyQuZGVmJylcbiAgLCBhbk9iamVjdCAgICAgID0gcmVxdWlyZSgnLi8kLmFuLW9iamVjdCcpXG4gICwgJGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGU7XG5cbiRkZWYoJGRlZi5TLCAnUmVmbGVjdCcsIHtcbiAgaXNFeHRlbnNpYmxlOiBmdW5jdGlvbiBpc0V4dGVuc2libGUodGFyZ2V0KXtcbiAgICBhbk9iamVjdCh0YXJnZXQpO1xuICAgIHJldHVybiAkaXNFeHRlbnNpYmxlID8gJGlzRXh0ZW5zaWJsZSh0YXJnZXQpIDogdHJ1ZTtcbiAgfVxufSk7IiwiLy8gMjYuMS4xMSBSZWZsZWN0Lm93bktleXModGFyZ2V0KVxudmFyICRkZWYgPSByZXF1aXJlKCcuLyQuZGVmJyk7XG5cbiRkZWYoJGRlZi5TLCAnUmVmbGVjdCcsIHtvd25LZXlzOiByZXF1aXJlKCcuLyQub3duLWtleXMnKX0pOyIsIi8vIDI2LjEuMTIgUmVmbGVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh0YXJnZXQpXG52YXIgJGRlZiAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmRlZicpXG4gICwgYW5PYmplY3QgICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmFuLW9iamVjdCcpXG4gICwgJHByZXZlbnRFeHRlbnNpb25zID0gT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zO1xuXG4kZGVmKCRkZWYuUywgJ1JlZmxlY3QnLCB7XG4gIHByZXZlbnRFeHRlbnNpb25zOiBmdW5jdGlvbiBwcmV2ZW50RXh0ZW5zaW9ucyh0YXJnZXQpe1xuICAgIGFuT2JqZWN0KHRhcmdldCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmKCRwcmV2ZW50RXh0ZW5zaW9ucykkcHJldmVudEV4dGVuc2lvbnModGFyZ2V0KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59KTsiLCIvLyAyNi4xLjE0IFJlZmxlY3Quc2V0UHJvdG90eXBlT2YodGFyZ2V0LCBwcm90bylcbnZhciAkZGVmICAgICA9IHJlcXVpcmUoJy4vJC5kZWYnKVxuICAsIHNldFByb3RvID0gcmVxdWlyZSgnLi8kLnNldC1wcm90bycpO1xuXG5pZihzZXRQcm90bykkZGVmKCRkZWYuUywgJ1JlZmxlY3QnLCB7XG4gIHNldFByb3RvdHlwZU9mOiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZih0YXJnZXQsIHByb3RvKXtcbiAgICBzZXRQcm90by5jaGVjayh0YXJnZXQsIHByb3RvKTtcbiAgICB0cnkge1xuICAgICAgc2V0UHJvdG8uc2V0KHRhcmdldCwgcHJvdG8pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn0pOyIsIi8vIDI2LjEuMTMgUmVmbGVjdC5zZXQodGFyZ2V0LCBwcm9wZXJ0eUtleSwgViBbLCByZWNlaXZlcl0pXG52YXIgJCAgICAgICAgICA9IHJlcXVpcmUoJy4vJCcpXG4gICwgaGFzICAgICAgICA9IHJlcXVpcmUoJy4vJC5oYXMnKVxuICAsICRkZWYgICAgICAgPSByZXF1aXJlKCcuLyQuZGVmJylcbiAgLCBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi8kLnByb3BlcnR5LWRlc2MnKVxuICAsIGFuT2JqZWN0ICAgPSByZXF1aXJlKCcuLyQuYW4tb2JqZWN0JylcbiAgLCBpc09iamVjdCAgID0gcmVxdWlyZSgnLi8kLmlzLW9iamVjdCcpO1xuXG5mdW5jdGlvbiBzZXQodGFyZ2V0LCBwcm9wZXJ0eUtleSwgVi8qLCByZWNlaXZlciovKXtcbiAgdmFyIHJlY2VpdmVyID0gYXJndW1lbnRzLmxlbmd0aCA8IDQgPyB0YXJnZXQgOiBhcmd1bWVudHNbM11cbiAgICAsIG93bkRlc2MgID0gJC5nZXREZXNjKGFuT2JqZWN0KHRhcmdldCksIHByb3BlcnR5S2V5KVxuICAgICwgZXhpc3RpbmdEZXNjcmlwdG9yLCBwcm90bztcbiAgaWYoIW93bkRlc2Mpe1xuICAgIGlmKGlzT2JqZWN0KHByb3RvID0gJC5nZXRQcm90byh0YXJnZXQpKSl7XG4gICAgICByZXR1cm4gc2V0KHByb3RvLCBwcm9wZXJ0eUtleSwgViwgcmVjZWl2ZXIpO1xuICAgIH1cbiAgICBvd25EZXNjID0gY3JlYXRlRGVzYygwKTtcbiAgfVxuICBpZihoYXMob3duRGVzYywgJ3ZhbHVlJykpe1xuICAgIGlmKG93bkRlc2Mud3JpdGFibGUgPT09IGZhbHNlIHx8ICFpc09iamVjdChyZWNlaXZlcikpcmV0dXJuIGZhbHNlO1xuICAgIGV4aXN0aW5nRGVzY3JpcHRvciA9ICQuZ2V0RGVzYyhyZWNlaXZlciwgcHJvcGVydHlLZXkpIHx8IGNyZWF0ZURlc2MoMCk7XG4gICAgZXhpc3RpbmdEZXNjcmlwdG9yLnZhbHVlID0gVjtcbiAgICAkLnNldERlc2MocmVjZWl2ZXIsIHByb3BlcnR5S2V5LCBleGlzdGluZ0Rlc2NyaXB0b3IpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBvd25EZXNjLnNldCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiAob3duRGVzYy5zZXQuY2FsbChyZWNlaXZlciwgViksIHRydWUpO1xufVxuXG4kZGVmKCRkZWYuUywgJ1JlZmxlY3QnLCB7c2V0OiBzZXR9KTsiLCJ2YXIgJCAgICAgICAgPSByZXF1aXJlKCcuLyQnKVxuICAsIGdsb2JhbCAgID0gcmVxdWlyZSgnLi8kLmdsb2JhbCcpXG4gICwgaXNSZWdFeHAgPSByZXF1aXJlKCcuLyQuaXMtcmVnZXhwJylcbiAgLCAkZmxhZ3MgICA9IHJlcXVpcmUoJy4vJC5mbGFncycpXG4gICwgJFJlZ0V4cCAgPSBnbG9iYWwuUmVnRXhwXG4gICwgQmFzZSAgICAgPSAkUmVnRXhwXG4gICwgcHJvdG8gICAgPSAkUmVnRXhwLnByb3RvdHlwZVxuICAsIHJlMSAgICAgID0gL2EvZ1xuICAsIHJlMiAgICAgID0gL2EvZ1xuICAvLyBcIm5ld1wiIGNyZWF0ZXMgYSBuZXcgb2JqZWN0LCBvbGQgd2Via2l0IGJ1Z2d5IGhlcmVcbiAgLCBDT1JSRUNUX05FVyA9IG5ldyAkUmVnRXhwKHJlMSkgIT09IHJlMTtcblxuaWYocmVxdWlyZSgnLi8kLnN1cHBvcnQtZGVzYycpICYmICghQ09SUkVDVF9ORVcgfHwgcmVxdWlyZSgnLi8kLmZhaWxzJykoZnVuY3Rpb24oKXtcbiAgcmUyW3JlcXVpcmUoJy4vJC53a3MnKSgnbWF0Y2gnKV0gPSBmYWxzZTtcbiAgLy8gUmVnRXhwIGNvbnN0cnVjdG9yIGNhbiBhbHRlciBmbGFncyBhbmQgSXNSZWdFeHAgd29ya3MgY29ycmVjdCB3aXRoIEBAbWF0Y2hcbiAgcmV0dXJuICRSZWdFeHAocmUxKSAhPSByZTEgfHwgJFJlZ0V4cChyZTIpID09IHJlMiB8fCAkUmVnRXhwKHJlMSwgJ2knKSAhPSAnL2EvaSc7XG59KSkpe1xuICAkUmVnRXhwID0gZnVuY3Rpb24gUmVnRXhwKHAsIGYpe1xuICAgIHZhciBwaVJFID0gaXNSZWdFeHAocClcbiAgICAgICwgZmlVICA9IGYgPT09IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gISh0aGlzIGluc3RhbmNlb2YgJFJlZ0V4cCkgJiYgcGlSRSAmJiBwLmNvbnN0cnVjdG9yID09PSAkUmVnRXhwICYmIGZpVSA/IHBcbiAgICAgIDogQ09SUkVDVF9ORVdcbiAgICAgICAgPyBuZXcgQmFzZShwaVJFICYmICFmaVUgPyBwLnNvdXJjZSA6IHAsIGYpXG4gICAgICAgIDogQmFzZSgocGlSRSA9IHAgaW5zdGFuY2VvZiAkUmVnRXhwKSA/IHAuc291cmNlIDogcCwgcGlSRSAmJiBmaVUgPyAkZmxhZ3MuY2FsbChwKSA6IGYpO1xuICB9O1xuICAkLmVhY2guY2FsbCgkLmdldE5hbWVzKEJhc2UpLCBmdW5jdGlvbihrZXkpe1xuICAgIGtleSBpbiAkUmVnRXhwIHx8ICQuc2V0RGVzYygkUmVnRXhwLCBrZXksIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24oKXsgcmV0dXJuIEJhc2Vba2V5XTsgfSxcbiAgICAgIHNldDogZnVuY3Rpb24oaXQpeyBCYXNlW2tleV0gPSBpdDsgfVxuICAgIH0pO1xuICB9KTtcbiAgcHJvdG8uY29uc3RydWN0b3IgPSAkUmVnRXhwO1xuICAkUmVnRXhwLnByb3RvdHlwZSA9IHByb3RvO1xuICByZXF1aXJlKCcuLyQucmVkZWYnKShnbG9iYWwsICdSZWdFeHAnLCAkUmVnRXhwKTtcbn1cblxucmVxdWlyZSgnLi8kLnNwZWNpZXMnKSgkUmVnRXhwKTsiLCIvLyAyMS4yLjUuMyBnZXQgUmVnRXhwLnByb3RvdHlwZS5mbGFncygpXG52YXIgJCA9IHJlcXVpcmUoJy4vJCcpO1xuaWYocmVxdWlyZSgnLi8kLnN1cHBvcnQtZGVzYycpICYmIC8uL2cuZmxhZ3MgIT0gJ2cnKSQuc2V0RGVzYyhSZWdFeHAucHJvdG90eXBlLCAnZmxhZ3MnLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZ2V0OiByZXF1aXJlKCcuLyQuZmxhZ3MnKVxufSk7IiwiLy8gQEBtYXRjaCBsb2dpY1xucmVxdWlyZSgnLi8kLmZpeC1yZS13a3MnKSgnbWF0Y2gnLCAxLCBmdW5jdGlvbihkZWZpbmVkLCBNQVRDSCl7XG4gIC8vIDIxLjEuMy4xMSBTdHJpbmcucHJvdG90eXBlLm1hdGNoKHJlZ2V4cClcbiAgcmV0dXJuIGZ1bmN0aW9uIG1hdGNoKHJlZ2V4cCl7XG4gICAgJ3VzZSBzdHJpY3QnO1xuICAgIHZhciBPICA9IGRlZmluZWQodGhpcylcbiAgICAgICwgZm4gPSByZWdleHAgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcmVnZXhwW01BVENIXTtcbiAgICByZXR1cm4gZm4gIT09IHVuZGVmaW5lZCA/IGZuLmNhbGwocmVnZXhwLCBPKSA6IG5ldyBSZWdFeHAocmVnZXhwKVtNQVRDSF0oU3RyaW5nKE8pKTtcbiAgfTtcbn0pOyIsIi8vIEBAcmVwbGFjZSBsb2dpY1xucmVxdWlyZSgnLi8kLmZpeC1yZS13a3MnKSgncmVwbGFjZScsIDIsIGZ1bmN0aW9uKGRlZmluZWQsIFJFUExBQ0UsICRyZXBsYWNlKXtcbiAgLy8gMjEuMS4zLjE0IFN0cmluZy5wcm90b3R5cGUucmVwbGFjZShzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlKVxuICByZXR1cm4gZnVuY3Rpb24gcmVwbGFjZShzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlKXtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgdmFyIE8gID0gZGVmaW5lZCh0aGlzKVxuICAgICAgLCBmbiA9IHNlYXJjaFZhbHVlID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHNlYXJjaFZhbHVlW1JFUExBQ0VdO1xuICAgIHJldHVybiBmbiAhPT0gdW5kZWZpbmVkXG4gICAgICA/IGZuLmNhbGwoc2VhcmNoVmFsdWUsIE8sIHJlcGxhY2VWYWx1ZSlcbiAgICAgIDogJHJlcGxhY2UuY2FsbChTdHJpbmcoTyksIHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpO1xuICB9O1xufSk7IiwiLy8gQEBzZWFyY2ggbG9naWNcbnJlcXVpcmUoJy4vJC5maXgtcmUtd2tzJykoJ3NlYXJjaCcsIDEsIGZ1bmN0aW9uKGRlZmluZWQsIFNFQVJDSCl7XG4gIC8vIDIxLjEuMy4xNSBTdHJpbmcucHJvdG90eXBlLnNlYXJjaChyZWdleHApXG4gIHJldHVybiBmdW5jdGlvbiBzZWFyY2gocmVnZXhwKXtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgdmFyIE8gID0gZGVmaW5lZCh0aGlzKVxuICAgICAgLCBmbiA9IHJlZ2V4cCA9PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByZWdleHBbU0VBUkNIXTtcbiAgICByZXR1cm4gZm4gIT09IHVuZGVmaW5lZCA/IGZuLmNhbGwocmVnZXhwLCBPKSA6IG5ldyBSZWdFeHAocmVnZXhwKVtTRUFSQ0hdKFN0cmluZyhPKSk7XG4gIH07XG59KTsiLCIvLyBAQHNwbGl0IGxvZ2ljXG5yZXF1aXJlKCcuLyQuZml4LXJlLXdrcycpKCdzcGxpdCcsIDIsIGZ1bmN0aW9uKGRlZmluZWQsIFNQTElULCAkc3BsaXQpe1xuICAvLyAyMS4xLjMuMTcgU3RyaW5nLnByb3RvdHlwZS5zcGxpdChzZXBhcmF0b3IsIGxpbWl0KVxuICByZXR1cm4gZnVuY3Rpb24gc3BsaXQoc2VwYXJhdG9yLCBsaW1pdCl7XG4gICAgJ3VzZSBzdHJpY3QnO1xuICAgIHZhciBPICA9IGRlZmluZWQodGhpcylcbiAgICAgICwgZm4gPSBzZXBhcmF0b3IgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2VwYXJhdG9yW1NQTElUXTtcbiAgICByZXR1cm4gZm4gIT09IHVuZGVmaW5lZFxuICAgICAgPyBmbi5jYWxsKHNlcGFyYXRvciwgTywgbGltaXQpXG4gICAgICA6ICRzcGxpdC5jYWxsKFN0cmluZyhPKSwgc2VwYXJhdG9yLCBsaW1pdCk7XG4gIH07XG59KTsiLCIndXNlIHN0cmljdCc7XG52YXIgc3Ryb25nID0gcmVxdWlyZSgnLi8kLmNvbGxlY3Rpb24tc3Ryb25nJyk7XG5cbi8vIDIzLjIgU2V0IE9iamVjdHNcbnJlcXVpcmUoJy4vJC5jb2xsZWN0aW9uJykoJ1NldCcsIGZ1bmN0aW9uKGdldCl7XG4gIHJldHVybiBmdW5jdGlvbiBTZXQoKXsgcmV0dXJuIGdldCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7IH07XG59LCB7XG4gIC8vIDIzLjIuMy4xIFNldC5wcm90b3R5cGUuYWRkKHZhbHVlKVxuICBhZGQ6IGZ1bmN0aW9uIGFkZCh2YWx1ZSl7XG4gICAgcmV0dXJuIHN0cm9uZy5kZWYodGhpcywgdmFsdWUgPSB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZSwgdmFsdWUpO1xuICB9XG59LCBzdHJvbmcpOyIsIid1c2Ugc3RyaWN0JztcbnZhciAkZGVmID0gcmVxdWlyZSgnLi8kLmRlZicpXG4gICwgJGF0ICA9IHJlcXVpcmUoJy4vJC5zdHJpbmctYXQnKShmYWxzZSk7XG4kZGVmKCRkZWYuUCwgJ1N0cmluZycsIHtcbiAgLy8gMjEuMS4zLjMgU3RyaW5nLnByb3RvdHlwZS5jb2RlUG9pbnRBdChwb3MpXG4gIGNvZGVQb2ludEF0OiBmdW5jdGlvbiBjb2RlUG9pbnRBdChwb3Mpe1xuICAgIHJldHVybiAkYXQodGhpcywgcG9zKTtcbiAgfVxufSk7IiwiLy8gMjEuMS4zLjYgU3RyaW5nLnByb3RvdHlwZS5lbmRzV2l0aChzZWFyY2hTdHJpbmcgWywgZW5kUG9zaXRpb25dKVxuJ3VzZSBzdHJpY3QnO1xudmFyICRkZWYgICAgICA9IHJlcXVpcmUoJy4vJC5kZWYnKVxuICAsIHRvTGVuZ3RoICA9IHJlcXVpcmUoJy4vJC50by1sZW5ndGgnKVxuICAsIGNvbnRleHQgICA9IHJlcXVpcmUoJy4vJC5zdHJpbmctY29udGV4dCcpXG4gICwgRU5EU19XSVRIID0gJ2VuZHNXaXRoJ1xuICAsICRlbmRzV2l0aCA9ICcnW0VORFNfV0lUSF07XG5cbiRkZWYoJGRlZi5QICsgJGRlZi5GICogcmVxdWlyZSgnLi8kLmZhaWxzLWlzLXJlZ2V4cCcpKEVORFNfV0lUSCksICdTdHJpbmcnLCB7XG4gIGVuZHNXaXRoOiBmdW5jdGlvbiBlbmRzV2l0aChzZWFyY2hTdHJpbmcgLyosIGVuZFBvc2l0aW9uID0gQGxlbmd0aCAqLyl7XG4gICAgdmFyIHRoYXQgPSBjb250ZXh0KHRoaXMsIHNlYXJjaFN0cmluZywgRU5EU19XSVRIKVxuICAgICAgLCAkJCAgID0gYXJndW1lbnRzXG4gICAgICAsIGVuZFBvc2l0aW9uID0gJCQubGVuZ3RoID4gMSA/ICQkWzFdIDogdW5kZWZpbmVkXG4gICAgICAsIGxlbiAgICA9IHRvTGVuZ3RoKHRoYXQubGVuZ3RoKVxuICAgICAgLCBlbmQgICAgPSBlbmRQb3NpdGlvbiA9PT0gdW5kZWZpbmVkID8gbGVuIDogTWF0aC5taW4odG9MZW5ndGgoZW5kUG9zaXRpb24pLCBsZW4pXG4gICAgICAsIHNlYXJjaCA9IFN0cmluZyhzZWFyY2hTdHJpbmcpO1xuICAgIHJldHVybiAkZW5kc1dpdGhcbiAgICAgID8gJGVuZHNXaXRoLmNhbGwodGhhdCwgc2VhcmNoLCBlbmQpXG4gICAgICA6IHRoYXQuc2xpY2UoZW5kIC0gc2VhcmNoLmxlbmd0aCwgZW5kKSA9PT0gc2VhcmNoO1xuICB9XG59KTsiLCJ2YXIgJGRlZiAgICA9IHJlcXVpcmUoJy4vJC5kZWYnKVxuICAsIHRvSW5kZXggPSByZXF1aXJlKCcuLyQudG8taW5kZXgnKVxuICAsIGZyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGVcbiAgLCAkZnJvbUNvZGVQb2ludCA9IFN0cmluZy5mcm9tQ29kZVBvaW50O1xuXG4vLyBsZW5ndGggc2hvdWxkIGJlIDEsIG9sZCBGRiBwcm9ibGVtXG4kZGVmKCRkZWYuUyArICRkZWYuRiAqICghISRmcm9tQ29kZVBvaW50ICYmICRmcm9tQ29kZVBvaW50Lmxlbmd0aCAhPSAxKSwgJ1N0cmluZycsIHtcbiAgLy8gMjEuMS4yLjIgU3RyaW5nLmZyb21Db2RlUG9pbnQoLi4uY29kZVBvaW50cylcbiAgZnJvbUNvZGVQb2ludDogZnVuY3Rpb24gZnJvbUNvZGVQb2ludCh4KXsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHZhciByZXMgICA9IFtdXG4gICAgICAsICQkICAgID0gYXJndW1lbnRzXG4gICAgICAsICQkbGVuID0gJCQubGVuZ3RoXG4gICAgICAsIGkgICAgID0gMFxuICAgICAgLCBjb2RlO1xuICAgIHdoaWxlKCQkbGVuID4gaSl7XG4gICAgICBjb2RlID0gKyQkW2krK107XG4gICAgICBpZih0b0luZGV4KGNvZGUsIDB4MTBmZmZmKSAhPT0gY29kZSl0aHJvdyBSYW5nZUVycm9yKGNvZGUgKyAnIGlzIG5vdCBhIHZhbGlkIGNvZGUgcG9pbnQnKTtcbiAgICAgIHJlcy5wdXNoKGNvZGUgPCAweDEwMDAwXG4gICAgICAgID8gZnJvbUNoYXJDb2RlKGNvZGUpXG4gICAgICAgIDogZnJvbUNoYXJDb2RlKCgoY29kZSAtPSAweDEwMDAwKSA+PiAxMCkgKyAweGQ4MDAsIGNvZGUgJSAweDQwMCArIDB4ZGMwMClcbiAgICAgICk7XG4gICAgfSByZXR1cm4gcmVzLmpvaW4oJycpO1xuICB9XG59KTsiLCIvLyAyMS4xLjMuNyBTdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzKHNlYXJjaFN0cmluZywgcG9zaXRpb24gPSAwKVxuJ3VzZSBzdHJpY3QnO1xudmFyICRkZWYgICAgID0gcmVxdWlyZSgnLi8kLmRlZicpXG4gICwgY29udGV4dCAgPSByZXF1aXJlKCcuLyQuc3RyaW5nLWNvbnRleHQnKVxuICAsIElOQ0xVREVTID0gJ2luY2x1ZGVzJztcblxuJGRlZigkZGVmLlAgKyAkZGVmLkYgKiByZXF1aXJlKCcuLyQuZmFpbHMtaXMtcmVnZXhwJykoSU5DTFVERVMpLCAnU3RyaW5nJywge1xuICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoc2VhcmNoU3RyaW5nIC8qLCBwb3NpdGlvbiA9IDAgKi8pe1xuICAgIHJldHVybiAhIX5jb250ZXh0KHRoaXMsIHNlYXJjaFN0cmluZywgSU5DTFVERVMpLmluZGV4T2Yoc2VhcmNoU3RyaW5nLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pOyIsIid1c2Ugc3RyaWN0JztcbnZhciAkYXQgID0gcmVxdWlyZSgnLi8kLnN0cmluZy1hdCcpKHRydWUpO1xuXG4vLyAyMS4xLjMuMjcgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuLyQuaXRlci1kZWZpbmUnKShTdHJpbmcsICdTdHJpbmcnLCBmdW5jdGlvbihpdGVyYXRlZCl7XG4gIHRoaXMuX3QgPSBTdHJpbmcoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbi8vIDIxLjEuNS4yLjEgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uKCl7XG4gIHZhciBPICAgICA9IHRoaXMuX3RcbiAgICAsIGluZGV4ID0gdGhpcy5faVxuICAgICwgcG9pbnQ7XG4gIGlmKGluZGV4ID49IE8ubGVuZ3RoKXJldHVybiB7dmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZX07XG4gIHBvaW50ID0gJGF0KE8sIGluZGV4KTtcbiAgdGhpcy5faSArPSBwb2ludC5sZW5ndGg7XG4gIHJldHVybiB7dmFsdWU6IHBvaW50LCBkb25lOiBmYWxzZX07XG59KTsiLCJ2YXIgJGRlZiAgICAgID0gcmVxdWlyZSgnLi8kLmRlZicpXG4gICwgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi8kLnRvLWlvYmplY3QnKVxuICAsIHRvTGVuZ3RoICA9IHJlcXVpcmUoJy4vJC50by1sZW5ndGgnKTtcblxuJGRlZigkZGVmLlMsICdTdHJpbmcnLCB7XG4gIC8vIDIxLjEuMi40IFN0cmluZy5yYXcoY2FsbFNpdGUsIC4uLnN1YnN0aXR1dGlvbnMpXG4gIHJhdzogZnVuY3Rpb24gcmF3KGNhbGxTaXRlKXtcbiAgICB2YXIgdHBsICAgPSB0b0lPYmplY3QoY2FsbFNpdGUucmF3KVxuICAgICAgLCBsZW4gICA9IHRvTGVuZ3RoKHRwbC5sZW5ndGgpXG4gICAgICAsICQkICAgID0gYXJndW1lbnRzXG4gICAgICAsICQkbGVuID0gJCQubGVuZ3RoXG4gICAgICAsIHJlcyAgID0gW11cbiAgICAgICwgaSAgICAgPSAwO1xuICAgIHdoaWxlKGxlbiA+IGkpe1xuICAgICAgcmVzLnB1c2goU3RyaW5nKHRwbFtpKytdKSk7XG4gICAgICBpZihpIDwgJCRsZW4pcmVzLnB1c2goU3RyaW5nKCQkW2ldKSk7XG4gICAgfSByZXR1cm4gcmVzLmpvaW4oJycpO1xuICB9XG59KTsiLCJ2YXIgJGRlZiA9IHJlcXVpcmUoJy4vJC5kZWYnKTtcblxuJGRlZigkZGVmLlAsICdTdHJpbmcnLCB7XG4gIC8vIDIxLjEuMy4xMyBTdHJpbmcucHJvdG90eXBlLnJlcGVhdChjb3VudClcbiAgcmVwZWF0OiByZXF1aXJlKCcuLyQuc3RyaW5nLXJlcGVhdCcpXG59KTsiLCIvLyAyMS4xLjMuMTggU3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoKHNlYXJjaFN0cmluZyBbLCBwb3NpdGlvbiBdKVxuJ3VzZSBzdHJpY3QnO1xudmFyICRkZWYgICAgICAgID0gcmVxdWlyZSgnLi8kLmRlZicpXG4gICwgdG9MZW5ndGggICAgPSByZXF1aXJlKCcuLyQudG8tbGVuZ3RoJylcbiAgLCBjb250ZXh0ICAgICA9IHJlcXVpcmUoJy4vJC5zdHJpbmctY29udGV4dCcpXG4gICwgU1RBUlRTX1dJVEggPSAnc3RhcnRzV2l0aCdcbiAgLCAkc3RhcnRzV2l0aCA9ICcnW1NUQVJUU19XSVRIXTtcblxuJGRlZigkZGVmLlAgKyAkZGVmLkYgKiByZXF1aXJlKCcuLyQuZmFpbHMtaXMtcmVnZXhwJykoU1RBUlRTX1dJVEgpLCAnU3RyaW5nJywge1xuICBzdGFydHNXaXRoOiBmdW5jdGlvbiBzdGFydHNXaXRoKHNlYXJjaFN0cmluZyAvKiwgcG9zaXRpb24gPSAwICovKXtcbiAgICB2YXIgdGhhdCAgID0gY29udGV4dCh0aGlzLCBzZWFyY2hTdHJpbmcsIFNUQVJUU19XSVRIKVxuICAgICAgLCAkJCAgICAgPSBhcmd1bWVudHNcbiAgICAgICwgaW5kZXggID0gdG9MZW5ndGgoTWF0aC5taW4oJCQubGVuZ3RoID4gMSA/ICQkWzFdIDogdW5kZWZpbmVkLCB0aGF0Lmxlbmd0aCkpXG4gICAgICAsIHNlYXJjaCA9IFN0cmluZyhzZWFyY2hTdHJpbmcpO1xuICAgIHJldHVybiAkc3RhcnRzV2l0aFxuICAgICAgPyAkc3RhcnRzV2l0aC5jYWxsKHRoYXQsIHNlYXJjaCwgaW5kZXgpXG4gICAgICA6IHRoYXQuc2xpY2UoaW5kZXgsIGluZGV4ICsgc2VhcmNoLmxlbmd0aCkgPT09IHNlYXJjaDtcbiAgfVxufSk7IiwiJ3VzZSBzdHJpY3QnO1xuLy8gMjEuMS4zLjI1IFN0cmluZy5wcm90b3R5cGUudHJpbSgpXG5yZXF1aXJlKCcuLyQuc3RyaW5nLXRyaW0nKSgndHJpbScsIGZ1bmN0aW9uKCR0cmltKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRyaW0oKXtcbiAgICByZXR1cm4gJHRyaW0odGhpcywgMyk7XG4gIH07XG59KTsiLCIndXNlIHN0cmljdCc7XG4vLyBFQ01BU2NyaXB0IDYgc3ltYm9scyBzaGltXG52YXIgJCAgICAgICAgICAgICAgPSByZXF1aXJlKCcuLyQnKVxuICAsIGdsb2JhbCAgICAgICAgID0gcmVxdWlyZSgnLi8kLmdsb2JhbCcpXG4gICwgaGFzICAgICAgICAgICAgPSByZXF1aXJlKCcuLyQuaGFzJylcbiAgLCBTVVBQT1JUX0RFU0MgICA9IHJlcXVpcmUoJy4vJC5zdXBwb3J0LWRlc2MnKVxuICAsICRkZWYgICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmRlZicpXG4gICwgJHJlZGVmICAgICAgICAgPSByZXF1aXJlKCcuLyQucmVkZWYnKVxuICAsICRmYWlscyAgICAgICAgID0gcmVxdWlyZSgnLi8kLmZhaWxzJylcbiAgLCBzaGFyZWQgICAgICAgICA9IHJlcXVpcmUoJy4vJC5zaGFyZWQnKVxuICAsIHNldFRhZyAgICAgICAgID0gcmVxdWlyZSgnLi8kLnRhZycpXG4gICwgdWlkICAgICAgICAgICAgPSByZXF1aXJlKCcuLyQudWlkJylcbiAgLCB3a3MgICAgICAgICAgICA9IHJlcXVpcmUoJy4vJC53a3MnKVxuICAsIGtleU9mICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmtleW9mJylcbiAgLCAkbmFtZXMgICAgICAgICA9IHJlcXVpcmUoJy4vJC5nZXQtbmFtZXMnKVxuICAsIGVudW1LZXlzICAgICAgID0gcmVxdWlyZSgnLi8kLmVudW0ta2V5cycpXG4gICwgaXNBcnJheSAgICAgICAgPSByZXF1aXJlKCcuLyQuaXMtYXJyYXknKVxuICAsIGFuT2JqZWN0ICAgICAgID0gcmVxdWlyZSgnLi8kLmFuLW9iamVjdCcpXG4gICwgdG9JT2JqZWN0ICAgICAgPSByZXF1aXJlKCcuLyQudG8taW9iamVjdCcpXG4gICwgY3JlYXRlRGVzYyAgICAgPSByZXF1aXJlKCcuLyQucHJvcGVydHktZGVzYycpXG4gICwgZ2V0RGVzYyAgICAgICAgPSAkLmdldERlc2NcbiAgLCBzZXREZXNjICAgICAgICA9ICQuc2V0RGVzY1xuICAsIF9jcmVhdGUgICAgICAgID0gJC5jcmVhdGVcbiAgLCBnZXROYW1lcyAgICAgICA9ICRuYW1lcy5nZXRcbiAgLCAkU3ltYm9sICAgICAgICA9IGdsb2JhbC5TeW1ib2xcbiAgLCAkSlNPTiAgICAgICAgICA9IGdsb2JhbC5KU09OXG4gICwgX3N0cmluZ2lmeSAgICAgPSAkSlNPTiAmJiAkSlNPTi5zdHJpbmdpZnlcbiAgLCBzZXR0ZXIgICAgICAgICA9IGZhbHNlXG4gICwgSElEREVOICAgICAgICAgPSB3a3MoJ19oaWRkZW4nKVxuICAsIGlzRW51bSAgICAgICAgID0gJC5pc0VudW1cbiAgLCBTeW1ib2xSZWdpc3RyeSA9IHNoYXJlZCgnc3ltYm9sLXJlZ2lzdHJ5JylcbiAgLCBBbGxTeW1ib2xzICAgICA9IHNoYXJlZCgnc3ltYm9scycpXG4gICwgdXNlTmF0aXZlICAgICAgPSB0eXBlb2YgJFN5bWJvbCA9PSAnZnVuY3Rpb24nXG4gICwgT2JqZWN0UHJvdG8gICAgPSBPYmplY3QucHJvdG90eXBlO1xuXG4vLyBmYWxsYmFjayBmb3Igb2xkIEFuZHJvaWQsIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD02ODdcbnZhciBzZXRTeW1ib2xEZXNjID0gU1VQUE9SVF9ERVNDICYmICRmYWlscyhmdW5jdGlvbigpe1xuICByZXR1cm4gX2NyZWF0ZShzZXREZXNjKHt9LCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiBzZXREZXNjKHRoaXMsICdhJywge3ZhbHVlOiA3fSkuYTsgfVxuICB9KSkuYSAhPSA3O1xufSkgPyBmdW5jdGlvbihpdCwga2V5LCBEKXtcbiAgdmFyIHByb3RvRGVzYyA9IGdldERlc2MoT2JqZWN0UHJvdG8sIGtleSk7XG4gIGlmKHByb3RvRGVzYylkZWxldGUgT2JqZWN0UHJvdG9ba2V5XTtcbiAgc2V0RGVzYyhpdCwga2V5LCBEKTtcbiAgaWYocHJvdG9EZXNjICYmIGl0ICE9PSBPYmplY3RQcm90bylzZXREZXNjKE9iamVjdFByb3RvLCBrZXksIHByb3RvRGVzYyk7XG59IDogc2V0RGVzYztcblxudmFyIHdyYXAgPSBmdW5jdGlvbih0YWcpe1xuICB2YXIgc3ltID0gQWxsU3ltYm9sc1t0YWddID0gX2NyZWF0ZSgkU3ltYm9sLnByb3RvdHlwZSk7XG4gIHN5bS5fayA9IHRhZztcbiAgU1VQUE9SVF9ERVNDICYmIHNldHRlciAmJiBzZXRTeW1ib2xEZXNjKE9iamVjdFByb3RvLCB0YWcsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgc2V0OiBmdW5jdGlvbih2YWx1ZSl7XG4gICAgICBpZihoYXModGhpcywgSElEREVOKSAmJiBoYXModGhpc1tISURERU5dLCB0YWcpKXRoaXNbSElEREVOXVt0YWddID0gZmFsc2U7XG4gICAgICBzZXRTeW1ib2xEZXNjKHRoaXMsIHRhZywgY3JlYXRlRGVzYygxLCB2YWx1ZSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBzeW07XG59O1xuXG52YXIgaXNTeW1ib2wgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCc7XG59O1xuXG52YXIgJGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoaXQsIGtleSwgRCl7XG4gIGlmKEQgJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkpe1xuICAgIGlmKCFELmVudW1lcmFibGUpe1xuICAgICAgaWYoIWhhcyhpdCwgSElEREVOKSlzZXREZXNjKGl0LCBISURERU4sIGNyZWF0ZURlc2MoMSwge30pKTtcbiAgICAgIGl0W0hJRERFTl1ba2V5XSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmKGhhcyhpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0paXRbSElEREVOXVtrZXldID0gZmFsc2U7XG4gICAgICBEID0gX2NyZWF0ZShELCB7ZW51bWVyYWJsZTogY3JlYXRlRGVzYygwLCBmYWxzZSl9KTtcbiAgICB9IHJldHVybiBzZXRTeW1ib2xEZXNjKGl0LCBrZXksIEQpO1xuICB9IHJldHVybiBzZXREZXNjKGl0LCBrZXksIEQpO1xufTtcbnZhciAkZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoaXQsIFApe1xuICBhbk9iamVjdChpdCk7XG4gIHZhciBrZXlzID0gZW51bUtleXMoUCA9IHRvSU9iamVjdChQKSlcbiAgICAsIGkgICAgPSAwXG4gICAgLCBsID0ga2V5cy5sZW5ndGhcbiAgICAsIGtleTtcbiAgd2hpbGUobCA+IGkpJGRlZmluZVByb3BlcnR5KGl0LCBrZXkgPSBrZXlzW2krK10sIFBba2V5XSk7XG4gIHJldHVybiBpdDtcbn07XG52YXIgJGNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShpdCwgUCl7XG4gIHJldHVybiBQID09PSB1bmRlZmluZWQgPyBfY3JlYXRlKGl0KSA6ICRkZWZpbmVQcm9wZXJ0aWVzKF9jcmVhdGUoaXQpLCBQKTtcbn07XG52YXIgJHByb3BlcnR5SXNFbnVtZXJhYmxlID0gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoa2V5KXtcbiAgdmFyIEUgPSBpc0VudW0uY2FsbCh0aGlzLCBrZXkpO1xuICByZXR1cm4gRSB8fCAhaGFzKHRoaXMsIGtleSkgfHwgIWhhcyhBbGxTeW1ib2xzLCBrZXkpIHx8IGhhcyh0aGlzLCBISURERU4pICYmIHRoaXNbSElEREVOXVtrZXldXG4gICAgPyBFIDogdHJ1ZTtcbn07XG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KXtcbiAgdmFyIEQgPSBnZXREZXNjKGl0ID0gdG9JT2JqZWN0KGl0KSwga2V5KTtcbiAgaWYoRCAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhKGhhcyhpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0pKUQuZW51bWVyYWJsZSA9IHRydWU7XG4gIHJldHVybiBEO1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpe1xuICB2YXIgbmFtZXMgID0gZ2V0TmFtZXModG9JT2JqZWN0KGl0KSlcbiAgICAsIHJlc3VsdCA9IFtdXG4gICAgLCBpICAgICAgPSAwXG4gICAgLCBrZXk7XG4gIHdoaWxlKG5hbWVzLmxlbmd0aCA+IGkpaWYoIWhhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSAmJiBrZXkgIT0gSElEREVOKXJlc3VsdC5wdXNoKGtleSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xudmFyICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpe1xuICB2YXIgbmFtZXMgID0gZ2V0TmFtZXModG9JT2JqZWN0KGl0KSlcbiAgICAsIHJlc3VsdCA9IFtdXG4gICAgLCBpICAgICAgPSAwXG4gICAgLCBrZXk7XG4gIHdoaWxlKG5hbWVzLmxlbmd0aCA+IGkpaWYoaGFzKEFsbFN5bWJvbHMsIGtleSA9IG5hbWVzW2krK10pKXJlc3VsdC5wdXNoKEFsbFN5bWJvbHNba2V5XSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xudmFyICRzdHJpbmdpZnkgPSBmdW5jdGlvbiBzdHJpbmdpZnkoaXQpe1xuICB2YXIgYXJncyA9IFtpdF1cbiAgICAsIGkgICAgPSAxXG4gICAgLCAkJCAgID0gYXJndW1lbnRzXG4gICAgLCByZXBsYWNlciwgJHJlcGxhY2VyO1xuICB3aGlsZSgkJC5sZW5ndGggPiBpKWFyZ3MucHVzaCgkJFtpKytdKTtcbiAgcmVwbGFjZXIgPSBhcmdzWzFdO1xuICBpZih0eXBlb2YgcmVwbGFjZXIgPT0gJ2Z1bmN0aW9uJykkcmVwbGFjZXIgPSByZXBsYWNlcjtcbiAgaWYoJHJlcGxhY2VyIHx8ICFpc0FycmF5KHJlcGxhY2VyKSlyZXBsYWNlciA9IGZ1bmN0aW9uKGtleSwgdmFsdWUpe1xuICAgIGlmKCRyZXBsYWNlcil2YWx1ZSA9ICRyZXBsYWNlci5jYWxsKHRoaXMsIGtleSwgdmFsdWUpO1xuICAgIGlmKCFpc1N5bWJvbCh2YWx1ZSkpcmV0dXJuIHZhbHVlO1xuICB9O1xuICBhcmdzWzFdID0gcmVwbGFjZXI7XG4gIHJldHVybiBfc3RyaW5naWZ5LmFwcGx5KCRKU09OLCBhcmdzKTtcbn07XG52YXIgYnVnZ3lKU09OID0gJGZhaWxzKGZ1bmN0aW9uKCl7XG4gIHZhciBTID0gJFN5bWJvbCgpO1xuICAvLyBNUyBFZGdlIGNvbnZlcnRzIHN5bWJvbCB2YWx1ZXMgdG8gSlNPTiBhcyB7fVxuICAvLyBXZWJLaXQgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIG51bGxcbiAgLy8gVjggdGhyb3dzIG9uIGJveGVkIHN5bWJvbHNcbiAgcmV0dXJuIF9zdHJpbmdpZnkoW1NdKSAhPSAnW251bGxdJyB8fCBfc3RyaW5naWZ5KHthOiBTfSkgIT0gJ3t9JyB8fCBfc3RyaW5naWZ5KE9iamVjdChTKSkgIT0gJ3t9Jztcbn0pO1xuXG4vLyAxOS40LjEuMSBTeW1ib2woW2Rlc2NyaXB0aW9uXSlcbmlmKCF1c2VOYXRpdmUpe1xuICAkU3ltYm9sID0gZnVuY3Rpb24gU3ltYm9sKCl7XG4gICAgaWYoaXNTeW1ib2wodGhpcykpdGhyb3cgVHlwZUVycm9yKCdTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3InKTtcbiAgICByZXR1cm4gd3JhcCh1aWQoYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpKTtcbiAgfTtcbiAgJHJlZGVmKCRTeW1ib2wucHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpe1xuICAgIHJldHVybiB0aGlzLl9rO1xuICB9KTtcblxuICBpc1N5bWJvbCA9IGZ1bmN0aW9uKGl0KXtcbiAgICByZXR1cm4gaXQgaW5zdGFuY2VvZiAkU3ltYm9sO1xuICB9O1xuXG4gICQuY3JlYXRlICAgICA9ICRjcmVhdGU7XG4gICQuaXNFbnVtICAgICA9ICRwcm9wZXJ0eUlzRW51bWVyYWJsZTtcbiAgJC5nZXREZXNjICAgID0gJGdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbiAgJC5zZXREZXNjICAgID0gJGRlZmluZVByb3BlcnR5O1xuICAkLnNldERlc2NzICAgPSAkZGVmaW5lUHJvcGVydGllcztcbiAgJC5nZXROYW1lcyAgID0gJG5hbWVzLmdldCA9ICRnZXRPd25Qcm9wZXJ0eU5hbWVzO1xuICAkLmdldFN5bWJvbHMgPSAkZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4gIGlmKFNVUFBPUlRfREVTQyAmJiAhcmVxdWlyZSgnLi8kLmxpYnJhcnknKSl7XG4gICAgJHJlZGVmKE9iamVjdFByb3RvLCAncHJvcGVydHlJc0VudW1lcmFibGUnLCAkcHJvcGVydHlJc0VudW1lcmFibGUsIHRydWUpO1xuICB9XG59XG5cbnZhciBzeW1ib2xTdGF0aWNzID0ge1xuICAvLyAxOS40LjIuMSBTeW1ib2wuZm9yKGtleSlcbiAgJ2Zvcic6IGZ1bmN0aW9uKGtleSl7XG4gICAgcmV0dXJuIGhhcyhTeW1ib2xSZWdpc3RyeSwga2V5ICs9ICcnKVxuICAgICAgPyBTeW1ib2xSZWdpc3RyeVtrZXldXG4gICAgICA6IFN5bWJvbFJlZ2lzdHJ5W2tleV0gPSAkU3ltYm9sKGtleSk7XG4gIH0sXG4gIC8vIDE5LjQuMi41IFN5bWJvbC5rZXlGb3Ioc3ltKVxuICBrZXlGb3I6IGZ1bmN0aW9uIGtleUZvcihrZXkpe1xuICAgIHJldHVybiBrZXlPZihTeW1ib2xSZWdpc3RyeSwga2V5KTtcbiAgfSxcbiAgdXNlU2V0dGVyOiBmdW5jdGlvbigpeyBzZXR0ZXIgPSB0cnVlOyB9LFxuICB1c2VTaW1wbGU6IGZ1bmN0aW9uKCl7IHNldHRlciA9IGZhbHNlOyB9XG59O1xuLy8gMTkuNC4yLjIgU3ltYm9sLmhhc0luc3RhbmNlXG4vLyAxOS40LjIuMyBTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlXG4vLyAxOS40LjIuNCBTeW1ib2wuaXRlcmF0b3Jcbi8vIDE5LjQuMi42IFN5bWJvbC5tYXRjaFxuLy8gMTkuNC4yLjggU3ltYm9sLnJlcGxhY2Vcbi8vIDE5LjQuMi45IFN5bWJvbC5zZWFyY2hcbi8vIDE5LjQuMi4xMCBTeW1ib2wuc3BlY2llc1xuLy8gMTkuNC4yLjExIFN5bWJvbC5zcGxpdFxuLy8gMTkuNC4yLjEyIFN5bWJvbC50b1ByaW1pdGl2ZVxuLy8gMTkuNC4yLjEzIFN5bWJvbC50b1N0cmluZ1RhZ1xuLy8gMTkuNC4yLjE0IFN5bWJvbC51bnNjb3BhYmxlc1xuJC5lYWNoLmNhbGwoKFxuICAnaGFzSW5zdGFuY2UsaXNDb25jYXRTcHJlYWRhYmxlLGl0ZXJhdG9yLG1hdGNoLHJlcGxhY2Usc2VhcmNoLCcgK1xuICAnc3BlY2llcyxzcGxpdCx0b1ByaW1pdGl2ZSx0b1N0cmluZ1RhZyx1bnNjb3BhYmxlcydcbikuc3BsaXQoJywnKSwgZnVuY3Rpb24oaXQpe1xuICB2YXIgc3ltID0gd2tzKGl0KTtcbiAgc3ltYm9sU3RhdGljc1tpdF0gPSB1c2VOYXRpdmUgPyBzeW0gOiB3cmFwKHN5bSk7XG59KTtcblxuc2V0dGVyID0gdHJ1ZTtcblxuJGRlZigkZGVmLkcgKyAkZGVmLlcsIHtTeW1ib2w6ICRTeW1ib2x9KTtcblxuJGRlZigkZGVmLlMsICdTeW1ib2wnLCBzeW1ib2xTdGF0aWNzKTtcblxuJGRlZigkZGVmLlMgKyAkZGVmLkYgKiAhdXNlTmF0aXZlLCAnT2JqZWN0Jywge1xuICAvLyAxOS4xLjIuMiBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG4gIGNyZWF0ZTogJGNyZWF0ZSxcbiAgLy8gMTkuMS4yLjQgT2JqZWN0LmRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpXG4gIGRlZmluZVByb3BlcnR5OiAkZGVmaW5lUHJvcGVydHksXG4gIC8vIDE5LjEuMi4zIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpXG4gIGRlZmluZVByb3BlcnRpZXM6ICRkZWZpbmVQcm9wZXJ0aWVzLFxuICAvLyAxOS4xLjIuNiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogJGdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbiAgLy8gMTkuMS4yLjcgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbiAgZ2V0T3duUHJvcGVydHlOYW1lczogJGdldE93blByb3BlcnR5TmFtZXMsXG4gIC8vIDE5LjEuMi44IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoTylcbiAgZ2V0T3duUHJvcGVydHlTeW1ib2xzOiAkZ2V0T3duUHJvcGVydHlTeW1ib2xzXG59KTtcblxuLy8gMjQuMy4yIEpTT04uc3RyaW5naWZ5KHZhbHVlIFssIHJlcGxhY2VyIFssIHNwYWNlXV0pXG4kSlNPTiAmJiAkZGVmKCRkZWYuUyArICRkZWYuRiAqICghdXNlTmF0aXZlIHx8IGJ1Z2d5SlNPTiksICdKU09OJywge3N0cmluZ2lmeTogJHN0cmluZ2lmeX0pO1xuXG4vLyAxOS40LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddXG5zZXRUYWcoJFN5bWJvbCwgJ1N5bWJvbCcpO1xuLy8gMjAuMi4xLjkgTWF0aFtAQHRvU3RyaW5nVGFnXVxuc2V0VGFnKE1hdGgsICdNYXRoJywgdHJ1ZSk7XG4vLyAyNC4zLjMgSlNPTltAQHRvU3RyaW5nVGFnXVxuc2V0VGFnKGdsb2JhbC5KU09OLCAnSlNPTicsIHRydWUpOyIsIid1c2Ugc3RyaWN0JztcbnZhciAkICAgICAgICAgICAgPSByZXF1aXJlKCcuLyQnKVxuICAsIHdlYWsgICAgICAgICA9IHJlcXVpcmUoJy4vJC5jb2xsZWN0aW9uLXdlYWsnKVxuICAsIGlzT2JqZWN0ICAgICA9IHJlcXVpcmUoJy4vJC5pcy1vYmplY3QnKVxuICAsIGhhcyAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5oYXMnKVxuICAsIGZyb3plblN0b3JlICA9IHdlYWsuZnJvemVuU3RvcmVcbiAgLCBXRUFLICAgICAgICAgPSB3ZWFrLldFQUtcbiAgLCBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlIHx8IGlzT2JqZWN0XG4gICwgdG1wICAgICAgICAgID0ge307XG5cbi8vIDIzLjMgV2Vha01hcCBPYmplY3RzXG52YXIgJFdlYWtNYXAgPSByZXF1aXJlKCcuLyQuY29sbGVjdGlvbicpKCdXZWFrTWFwJywgZnVuY3Rpb24oZ2V0KXtcbiAgcmV0dXJuIGZ1bmN0aW9uIFdlYWtNYXAoKXsgcmV0dXJuIGdldCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7IH07XG59LCB7XG4gIC8vIDIzLjMuMy4zIFdlYWtNYXAucHJvdG90eXBlLmdldChrZXkpXG4gIGdldDogZnVuY3Rpb24gZ2V0KGtleSl7XG4gICAgaWYoaXNPYmplY3Qoa2V5KSl7XG4gICAgICBpZighaXNFeHRlbnNpYmxlKGtleSkpcmV0dXJuIGZyb3plblN0b3JlKHRoaXMpLmdldChrZXkpO1xuICAgICAgaWYoaGFzKGtleSwgV0VBSykpcmV0dXJuIGtleVtXRUFLXVt0aGlzLl9pXTtcbiAgICB9XG4gIH0sXG4gIC8vIDIzLjMuMy41IFdlYWtNYXAucHJvdG90eXBlLnNldChrZXksIHZhbHVlKVxuICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKXtcbiAgICByZXR1cm4gd2Vhay5kZWYodGhpcywga2V5LCB2YWx1ZSk7XG4gIH1cbn0sIHdlYWssIHRydWUsIHRydWUpO1xuXG4vLyBJRTExIFdlYWtNYXAgZnJvemVuIGtleXMgZml4XG5pZihuZXcgJFdlYWtNYXAoKS5zZXQoKE9iamVjdC5mcmVlemUgfHwgT2JqZWN0KSh0bXApLCA3KS5nZXQodG1wKSAhPSA3KXtcbiAgJC5lYWNoLmNhbGwoWydkZWxldGUnLCAnaGFzJywgJ2dldCcsICdzZXQnXSwgZnVuY3Rpb24oa2V5KXtcbiAgICB2YXIgcHJvdG8gID0gJFdlYWtNYXAucHJvdG90eXBlXG4gICAgICAsIG1ldGhvZCA9IHByb3RvW2tleV07XG4gICAgcmVxdWlyZSgnLi8kLnJlZGVmJykocHJvdG8sIGtleSwgZnVuY3Rpb24oYSwgYil7XG4gICAgICAvLyBzdG9yZSBmcm96ZW4gb2JqZWN0cyBvbiBsZWFreSBtYXBcbiAgICAgIGlmKGlzT2JqZWN0KGEpICYmICFpc0V4dGVuc2libGUoYSkpe1xuICAgICAgICB2YXIgcmVzdWx0ID0gZnJvemVuU3RvcmUodGhpcylba2V5XShhLCBiKTtcbiAgICAgICAgcmV0dXJuIGtleSA9PSAnc2V0JyA/IHRoaXMgOiByZXN1bHQ7XG4gICAgICAvLyBzdG9yZSBhbGwgdGhlIHJlc3Qgb24gbmF0aXZlIHdlYWttYXBcbiAgICAgIH0gcmV0dXJuIG1ldGhvZC5jYWxsKHRoaXMsIGEsIGIpO1xuICAgIH0pO1xuICB9KTtcbn0iLCIndXNlIHN0cmljdCc7XG52YXIgd2VhayA9IHJlcXVpcmUoJy4vJC5jb2xsZWN0aW9uLXdlYWsnKTtcblxuLy8gMjMuNCBXZWFrU2V0IE9iamVjdHNcbnJlcXVpcmUoJy4vJC5jb2xsZWN0aW9uJykoJ1dlYWtTZXQnLCBmdW5jdGlvbihnZXQpe1xuICByZXR1cm4gZnVuY3Rpb24gV2Vha1NldCgpeyByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIHtcbiAgLy8gMjMuNC4zLjEgV2Vha1NldC5wcm90b3R5cGUuYWRkKHZhbHVlKVxuICBhZGQ6IGZ1bmN0aW9uIGFkZCh2YWx1ZSl7XG4gICAgcmV0dXJuIHdlYWsuZGVmKHRoaXMsIHZhbHVlLCB0cnVlKTtcbiAgfVxufSwgd2VhaywgZmFsc2UsIHRydWUpOyIsIid1c2Ugc3RyaWN0JztcbnZhciAkZGVmICAgICAgPSByZXF1aXJlKCcuLyQuZGVmJylcbiAgLCAkaW5jbHVkZXMgPSByZXF1aXJlKCcuLyQuYXJyYXktaW5jbHVkZXMnKSh0cnVlKTtcbiRkZWYoJGRlZi5QLCAnQXJyYXknLCB7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kb21lbmljL0FycmF5LnByb3RvdHlwZS5pbmNsdWRlc1xuICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoZWwgLyosIGZyb21JbmRleCA9IDAgKi8pe1xuICAgIHJldHVybiAkaW5jbHVkZXModGhpcywgZWwsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5yZXF1aXJlKCcuLyQudW5zY29wZScpKCdpbmNsdWRlcycpOyIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9EYXZpZEJydWFudC9NYXAtU2V0LnByb3RvdHlwZS50b0pTT05cbnZhciAkZGVmICA9IHJlcXVpcmUoJy4vJC5kZWYnKTtcblxuJGRlZigkZGVmLlAsICdNYXAnLCB7dG9KU09OOiByZXF1aXJlKCcuLyQuY29sbGVjdGlvbi10by1qc29uJykoJ01hcCcpfSk7IiwiLy8gaHR0cDovL2dvby5nbC9Ya0JyakRcbnZhciAkZGVmICAgICA9IHJlcXVpcmUoJy4vJC5kZWYnKVxuICAsICRlbnRyaWVzID0gcmVxdWlyZSgnLi8kLm9iamVjdC10by1hcnJheScpKHRydWUpO1xuXG4kZGVmKCRkZWYuUywgJ09iamVjdCcsIHtcbiAgZW50cmllczogZnVuY3Rpb24gZW50cmllcyhpdCl7XG4gICAgcmV0dXJuICRlbnRyaWVzKGl0KTtcbiAgfVxufSk7IiwiLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vV2ViUmVmbGVjdGlvbi85MzUzNzgxXG52YXIgJCAgICAgICAgICA9IHJlcXVpcmUoJy4vJCcpXG4gICwgJGRlZiAgICAgICA9IHJlcXVpcmUoJy4vJC5kZWYnKVxuICAsIG93bktleXMgICAgPSByZXF1aXJlKCcuLyQub3duLWtleXMnKVxuICAsIHRvSU9iamVjdCAgPSByZXF1aXJlKCcuLyQudG8taW9iamVjdCcpXG4gICwgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vJC5wcm9wZXJ0eS1kZXNjJyk7XG5cbiRkZWYoJGRlZi5TLCAnT2JqZWN0Jywge1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCl7XG4gICAgdmFyIE8gICAgICAgPSB0b0lPYmplY3Qob2JqZWN0KVxuICAgICAgLCBzZXREZXNjID0gJC5zZXREZXNjXG4gICAgICAsIGdldERlc2MgPSAkLmdldERlc2NcbiAgICAgICwga2V5cyAgICA9IG93bktleXMoTylcbiAgICAgICwgcmVzdWx0ICA9IHt9XG4gICAgICAsIGkgICAgICAgPSAwXG4gICAgICAsIGtleSwgRDtcbiAgICB3aGlsZShrZXlzLmxlbmd0aCA+IGkpe1xuICAgICAgRCA9IGdldERlc2MoTywga2V5ID0ga2V5c1tpKytdKTtcbiAgICAgIGlmKGtleSBpbiByZXN1bHQpc2V0RGVzYyhyZXN1bHQsIGtleSwgY3JlYXRlRGVzYygwLCBEKSk7XG4gICAgICBlbHNlIHJlc3VsdFtrZXldID0gRDtcbiAgICB9IHJldHVybiByZXN1bHQ7XG4gIH1cbn0pOyIsIi8vIGh0dHA6Ly9nb28uZ2wvWGtCcmpEXG52YXIgJGRlZiAgICA9IHJlcXVpcmUoJy4vJC5kZWYnKVxuICAsICR2YWx1ZXMgPSByZXF1aXJlKCcuLyQub2JqZWN0LXRvLWFycmF5JykoZmFsc2UpO1xuXG4kZGVmKCRkZWYuUywgJ09iamVjdCcsIHtcbiAgdmFsdWVzOiBmdW5jdGlvbiB2YWx1ZXMoaXQpe1xuICAgIHJldHVybiAkdmFsdWVzKGl0KTtcbiAgfVxufSk7IiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL2JlbmphbWluZ3IvUmV4RXhwLmVzY2FwZVxudmFyICRkZWYgPSByZXF1aXJlKCcuLyQuZGVmJylcbiAgLCAkcmUgID0gcmVxdWlyZSgnLi8kLnJlcGxhY2VyJykoL1tcXFxcXiQqKz8uKCl8W1xcXXt9XS9nLCAnXFxcXCQmJyk7XG4kZGVmKCRkZWYuUywgJ1JlZ0V4cCcsIHtlc2NhcGU6IGZ1bmN0aW9uIGVzY2FwZShpdCl7IHJldHVybiAkcmUoaXQpOyB9fSk7XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vRGF2aWRCcnVhbnQvTWFwLVNldC5wcm90b3R5cGUudG9KU09OXG52YXIgJGRlZiAgPSByZXF1aXJlKCcuLyQuZGVmJyk7XG5cbiRkZWYoJGRlZi5QLCAnU2V0Jywge3RvSlNPTjogcmVxdWlyZSgnLi8kLmNvbGxlY3Rpb24tdG8tanNvbicpKCdTZXQnKX0pOyIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5wcm90b3R5cGUuYXRcbid1c2Ugc3RyaWN0JztcbnZhciAkZGVmID0gcmVxdWlyZSgnLi8kLmRlZicpXG4gICwgJGF0ICA9IHJlcXVpcmUoJy4vJC5zdHJpbmctYXQnKSh0cnVlKTtcbiRkZWYoJGRlZi5QLCAnU3RyaW5nJywge1xuICBhdDogZnVuY3Rpb24gYXQocG9zKXtcbiAgICByZXR1cm4gJGF0KHRoaXMsIHBvcyk7XG4gIH1cbn0pOyIsIid1c2Ugc3RyaWN0JztcbnZhciAkZGVmID0gcmVxdWlyZSgnLi8kLmRlZicpXG4gICwgJHBhZCA9IHJlcXVpcmUoJy4vJC5zdHJpbmctcGFkJyk7XG4kZGVmKCRkZWYuUCwgJ1N0cmluZycsIHtcbiAgcGFkTGVmdDogZnVuY3Rpb24gcGFkTGVmdChtYXhMZW5ndGggLyosIGZpbGxTdHJpbmcgPSAnICcgKi8pe1xuICAgIHJldHVybiAkcGFkKHRoaXMsIG1heExlbmd0aCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIHRydWUpO1xuICB9XG59KTsiLCIndXNlIHN0cmljdCc7XG52YXIgJGRlZiA9IHJlcXVpcmUoJy4vJC5kZWYnKVxuICAsICRwYWQgPSByZXF1aXJlKCcuLyQuc3RyaW5nLXBhZCcpO1xuJGRlZigkZGVmLlAsICdTdHJpbmcnLCB7XG4gIHBhZFJpZ2h0OiBmdW5jdGlvbiBwYWRSaWdodChtYXhMZW5ndGggLyosIGZpbGxTdHJpbmcgPSAnICcgKi8pe1xuICAgIHJldHVybiAkcGFkKHRoaXMsIG1heExlbmd0aCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIGZhbHNlKTtcbiAgfVxufSk7IiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3NlYm1hcmtiYWdlL2VjbWFzY3JpcHQtc3RyaW5nLWxlZnQtcmlnaHQtdHJpbVxucmVxdWlyZSgnLi8kLnN0cmluZy10cmltJykoJ3RyaW1MZWZ0JywgZnVuY3Rpb24oJHRyaW0pe1xuICByZXR1cm4gZnVuY3Rpb24gdHJpbUxlZnQoKXtcbiAgICByZXR1cm4gJHRyaW0odGhpcywgMSk7XG4gIH07XG59KTsiLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vc2VibWFya2JhZ2UvZWNtYXNjcmlwdC1zdHJpbmctbGVmdC1yaWdodC10cmltXG5yZXF1aXJlKCcuLyQuc3RyaW5nLXRyaW0nKSgndHJpbVJpZ2h0JywgZnVuY3Rpb24oJHRyaW0pe1xuICByZXR1cm4gZnVuY3Rpb24gdHJpbVJpZ2h0KCl7XG4gICAgcmV0dXJuICR0cmltKHRoaXMsIDIpO1xuICB9O1xufSk7IiwiLy8gSmF2YVNjcmlwdCAxLjYgLyBTdHJhd21hbiBhcnJheSBzdGF0aWNzIHNoaW1cbnZhciAkICAgICAgID0gcmVxdWlyZSgnLi8kJylcbiAgLCAkZGVmICAgID0gcmVxdWlyZSgnLi8kLmRlZicpXG4gICwgJEFycmF5ICA9IHJlcXVpcmUoJy4vJC5jb3JlJykuQXJyYXkgfHwgQXJyYXlcbiAgLCBzdGF0aWNzID0ge307XG52YXIgc2V0U3RhdGljcyA9IGZ1bmN0aW9uKGtleXMsIGxlbmd0aCl7XG4gICQuZWFjaC5jYWxsKGtleXMuc3BsaXQoJywnKSwgZnVuY3Rpb24oa2V5KXtcbiAgICBpZihsZW5ndGggPT0gdW5kZWZpbmVkICYmIGtleSBpbiAkQXJyYXkpc3RhdGljc1trZXldID0gJEFycmF5W2tleV07XG4gICAgZWxzZSBpZihrZXkgaW4gW10pc3RhdGljc1trZXldID0gcmVxdWlyZSgnLi8kLmN0eCcpKEZ1bmN0aW9uLmNhbGwsIFtdW2tleV0sIGxlbmd0aCk7XG4gIH0pO1xufTtcbnNldFN0YXRpY3MoJ3BvcCxyZXZlcnNlLHNoaWZ0LGtleXMsdmFsdWVzLGVudHJpZXMnLCAxKTtcbnNldFN0YXRpY3MoJ2luZGV4T2YsZXZlcnksc29tZSxmb3JFYWNoLG1hcCxmaWx0ZXIsZmluZCxmaW5kSW5kZXgsaW5jbHVkZXMnLCAzKTtcbnNldFN0YXRpY3MoJ2pvaW4sc2xpY2UsY29uY2F0LHB1c2gsc3BsaWNlLHVuc2hpZnQsc29ydCxsYXN0SW5kZXhPZiwnICtcbiAgICAgICAgICAgJ3JlZHVjZSxyZWR1Y2VSaWdodCxjb3B5V2l0aGluLGZpbGwnKTtcbiRkZWYoJGRlZi5TLCAnQXJyYXknLCBzdGF0aWNzKTsiLCJyZXF1aXJlKCcuL2VzNi5hcnJheS5pdGVyYXRvcicpO1xudmFyIGdsb2JhbCAgICAgID0gcmVxdWlyZSgnLi8kLmdsb2JhbCcpXG4gICwgaGlkZSAgICAgICAgPSByZXF1aXJlKCcuLyQuaGlkZScpXG4gICwgSXRlcmF0b3JzICAgPSByZXF1aXJlKCcuLyQuaXRlcmF0b3JzJylcbiAgLCBJVEVSQVRPUiAgICA9IHJlcXVpcmUoJy4vJC53a3MnKSgnaXRlcmF0b3InKVxuICAsIE5MICAgICAgICAgID0gZ2xvYmFsLk5vZGVMaXN0XG4gICwgSFRDICAgICAgICAgPSBnbG9iYWwuSFRNTENvbGxlY3Rpb25cbiAgLCBOTFByb3RvICAgICA9IE5MICYmIE5MLnByb3RvdHlwZVxuICAsIEhUQ1Byb3RvICAgID0gSFRDICYmIEhUQy5wcm90b3R5cGVcbiAgLCBBcnJheVZhbHVlcyA9IEl0ZXJhdG9ycy5Ob2RlTGlzdCA9IEl0ZXJhdG9ycy5IVE1MQ29sbGVjdGlvbiA9IEl0ZXJhdG9ycy5BcnJheTtcbmlmKE5MICYmICEoSVRFUkFUT1IgaW4gTkxQcm90bykpaGlkZShOTFByb3RvLCBJVEVSQVRPUiwgQXJyYXlWYWx1ZXMpO1xuaWYoSFRDICYmICEoSVRFUkFUT1IgaW4gSFRDUHJvdG8pKWhpZGUoSFRDUHJvdG8sIElURVJBVE9SLCBBcnJheVZhbHVlcyk7IiwidmFyICRkZWYgID0gcmVxdWlyZSgnLi8kLmRlZicpXG4gICwgJHRhc2sgPSByZXF1aXJlKCcuLyQudGFzaycpO1xuJGRlZigkZGVmLkcgKyAkZGVmLkIsIHtcbiAgc2V0SW1tZWRpYXRlOiAgICR0YXNrLnNldCxcbiAgY2xlYXJJbW1lZGlhdGU6ICR0YXNrLmNsZWFyXG59KTsiLCIvLyBpZTktIHNldFRpbWVvdXQgJiBzZXRJbnRlcnZhbCBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgZml4XG52YXIgZ2xvYmFsICAgICA9IHJlcXVpcmUoJy4vJC5nbG9iYWwnKVxuICAsICRkZWYgICAgICAgPSByZXF1aXJlKCcuLyQuZGVmJylcbiAgLCBpbnZva2UgICAgID0gcmVxdWlyZSgnLi8kLmludm9rZScpXG4gICwgcGFydGlhbCAgICA9IHJlcXVpcmUoJy4vJC5wYXJ0aWFsJylcbiAgLCBuYXZpZ2F0b3IgID0gZ2xvYmFsLm5hdmlnYXRvclxuICAsIE1TSUUgICAgICAgPSAhIW5hdmlnYXRvciAmJiAvTVNJRSAuXFwuLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpOyAvLyA8LSBkaXJ0eSBpZTktIGNoZWNrXG52YXIgd3JhcCA9IGZ1bmN0aW9uKHNldCl7XG4gIHJldHVybiBNU0lFID8gZnVuY3Rpb24oZm4sIHRpbWUgLyosIC4uLmFyZ3MgKi8pe1xuICAgIHJldHVybiBzZXQoaW52b2tlKFxuICAgICAgcGFydGlhbCxcbiAgICAgIFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKSxcbiAgICAgIHR5cGVvZiBmbiA9PSAnZnVuY3Rpb24nID8gZm4gOiBGdW5jdGlvbihmbilcbiAgICApLCB0aW1lKTtcbiAgfSA6IHNldDtcbn07XG4kZGVmKCRkZWYuRyArICRkZWYuQiArICRkZWYuRiAqIE1TSUUsIHtcbiAgc2V0VGltZW91dDogIHdyYXAoZ2xvYmFsLnNldFRpbWVvdXQpLFxuICBzZXRJbnRlcnZhbDogd3JhcChnbG9iYWwuc2V0SW50ZXJ2YWwpXG59KTsiLCJyZXF1aXJlKCcuL21vZHVsZXMvZXM1Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN5bWJvbCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuYXNzaWduJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5pcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3Quc2V0LXByb3RvdHlwZS1vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5mcmVlemUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LnNlYWwnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LnByZXZlbnQtZXh0ZW5zaW9ucycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuaXMtZnJvemVuJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5pcy1zZWFsZWQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmlzLWV4dGVuc2libGUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuZ2V0LXByb3RvdHlwZS1vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3Qua2V5cycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5mdW5jdGlvbi5uYW1lJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmZ1bmN0aW9uLmhhcy1pbnN0YW5jZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIuY29uc3RydWN0b3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLmVwc2lsb24nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLmlzLWZpbml0ZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIuaXMtaW50ZWdlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIuaXMtbmFuJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5pcy1zYWZlLWludGVnZXInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLm1heC1zYWZlLWludGVnZXInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLm1pbi1zYWZlLWludGVnZXInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLnBhcnNlLWZsb2F0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5wYXJzZS1pbnQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5hY29zaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmFzaW5oJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguYXRhbmgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5jYnJ0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguY2x6MzInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5jb3NoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguZXhwbTEnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5mcm91bmQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5oeXBvdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmltdWwnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5sb2cxMCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmxvZzFwJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGgubG9nMicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLnNpZ24nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5zaW5oJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGgudGFuaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLnRydW5jJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5mcm9tLWNvZGUtcG9pbnQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLnJhdycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcudHJpbScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmNvZGUtcG9pbnQtYXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmVuZHMtd2l0aCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuaW5jbHVkZXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLnJlcGVhdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuc3RhcnRzLXdpdGgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuZnJvbScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5zcGVjaWVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmNvcHktd2l0aGluJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmZpbGwnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuZmluZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5maW5kLWluZGV4Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC5jb25zdHJ1Y3RvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWdleHAuZmxhZ3MnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVnZXhwLm1hdGNoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC5yZXBsYWNlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC5zZWFyY2gnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVnZXhwLnNwbGl0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnByb21pc2UnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWFwJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnNldCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi53ZWFrLW1hcCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi53ZWFrLXNldCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmFwcGx5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuY29uc3RydWN0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuZGVmaW5lLXByb3BlcnR5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuZGVsZXRlLXByb3BlcnR5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuZW51bWVyYXRlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0LXByb3RvdHlwZS1vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmhhcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmlzLWV4dGVuc2libGUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5vd24ta2V5cycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LnByZXZlbnQtZXh0ZW5zaW9ucycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LnNldCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LnNldC1wcm90b3R5cGUtb2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuYXJyYXkuaW5jbHVkZXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3RyaW5nLmF0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN0cmluZy5wYWQtbGVmdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zdHJpbmcucGFkLXJpZ2h0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN0cmluZy50cmltLWxlZnQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3RyaW5nLnRyaW0tcmlnaHQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucmVnZXhwLmVzY2FwZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9ycycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5vYmplY3QudmFsdWVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5lbnRyaWVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hcC50by1qc29uJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnNldC50by1qc29uJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvanMuYXJyYXkuc3RhdGljcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL3dlYi50aW1lcnMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy93ZWIuaW1tZWRpYXRlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL21vZHVsZXMvJC5jb3JlJyk7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlQ2FudmFzKHdpZHRoLGhlaWdodCl7XG4gIGxldCBjYW52YXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgY2FudmFzLndpZHRoPXdpZHRoO1xuICBjYW52YXMuaGVpZ2h0PWhlaWdodDtcbiAgcmV0dXJuIGNhbnZhcztcbn1cbiIsImltcG9ydCAqIGFzIFdlYkdMIGZyb20gXCIuL3dlYmdsXCI7XG5cbmZ1bmN0aW9uIEdMKGNhbnZhcyxvcHRpb25zLHZlcnQsZnJhZyl7XG4gIHRoaXMuaW5pdChjYW52YXMsb3B0aW9ucyx2ZXJ0LGZyYWcpO1xufVxuR0wucHJvdG90eXBlPXtcbiAgY2FudmFzOm51bGwsXG4gIGdsOm51bGwsXG4gIHByb2dyYW06bnVsbCxcbiAgd2lkdGg6MCxcbiAgaGVpZ2h0OjAsXG4gIGluaXQoY2FudmFzLG9wdGlvbnMsdmVydCxmcmFnKXtcbiAgICB0aGlzLmNhbnZhcz1jYW52YXM7XG4gICAgdGhpcy53aWR0aD1jYW52YXMud2lkdGg7XG4gICAgdGhpcy5oZWlnaHQ9Y2FudmFzLmhlaWdodDtcbiAgICB0aGlzLmdsPVdlYkdMLmdldENvbnRleHQoY2FudmFzLG9wdGlvbnMpO1xuICAgIHRoaXMucHJvZ3JhbT10aGlzLmNyZWF0ZVByb2dyYW0odmVydCxmcmFnKTtcbiAgICB0aGlzLnVzZVByb2dyYW0odGhpcy5wcm9ncmFtKTtcbiAgfSxcbiAgY3JlYXRlUHJvZ3JhbSh2ZXJ0LGZyYWcpe1xuICAgIGxldCBwcm9ncmFtPVdlYkdMLmNyZWF0ZVByb2dyYW0odGhpcy5nbCx2ZXJ0LGZyYWcpO1xuICAgIC8vIFdlYkdMLmNyZWF0ZVVuaWZvcm0odGhpcy5nbCxwcm9ncmFtLFwiMmZcIixcInJlc29sdXRpb25cIix0aGlzLmNhbnZhcy53aWR0aCx0aGlzLmNhbnZhcy5oZWlnaHQpO1xuICAgIC8vIFdlYkdMLmNyZWF0ZVVuaWZvcm0odGhpcy5nbCxwcm9ncmFtLFwiMmZcIixcInBpeGVsXCIsIDEvdGhpcy5jYW52YXMud2lkdGgsIDEvdGhpcy5jYW52YXMuaGVpZ2h0KTtcbiAgICByZXR1cm4gcHJvZ3JhbTtcbiAgfSxcbiAgdXNlUHJvZ3JhbShwcm9ncmFtKXtcbiAgICB0aGlzLnByb2dyYW09cHJvZ3JhbTtcbiAgICB0aGlzLmdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7XG4gIH0sXG4gIGNyZWF0ZVRleHR1cmUoc291cmNlLGkpe1xuICAgIHJldHVybiBXZWJHTC5jcmVhdGVUZXh0dXJlKHRoaXMuZ2wsc291cmNlLGkpO1xuICB9LFxuICBjcmVhdGVVbmlmb3JtKHR5cGUsbmFtZSwuLi52KXtcbiAgICBXZWJHTC5jcmVhdGVVbmlmb3JtKHRoaXMuZ2wsdGhpcy5wcm9ncmFtLHR5cGUsbmFtZSwuLi52KTtcbiAgfSxcbiAgYWN0aXZlVGV4dHVyZShpKXtcbiAgICBXZWJHTC5hY3RpdmVUZXh0dXJlKHRoaXMuZ2wsaSk7XG4gIH0sXG4gIHVwZGF0ZVRleHR1cmUoc291cmNlKXtcbiAgICBXZWJHTC51cGRhdGVUZXh0dXJlKHRoaXMuZ2wsc291cmNlKTtcbiAgfSxcbiAgZHJhdygpe1xuICAgIFdlYkdMLnNldFJlY3RhbmdsZSh0aGlzLmdsLCAwLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG4gICAgdGhpcy5nbC5kcmF3QXJyYXlzKHRoaXMuZ2wuVFJJQU5HTEVTLCAwLCA2KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBHTDtcbiIsImZ1bmN0aW9uIGxvYWRJbWFnZShzcmMsaSxvbkxvYWQpe1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUscmVqZWN0KT0+e1xuICAgIGlmKHR5cGVvZiBzcmM9PVwic3RyaW5nXCIpe1xuICAgICAgc3JjPXtcbiAgICAgICAgbmFtZTpcImltYWdlXCIraSxcbiAgICAgICAgc3JjLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBsZXQgaW1nPW5ldyBJbWFnZSgpO1xuICAgIHNyYy5pbWc9aW1nO1xuICAgIGltZy5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLChldmVudCk9PntcbiAgICAgIGlmKHR5cGVvZiBvbkxvYWQ9PVwiZnVuY3Rpb25cIil7XG4gICAgICAgIG9uTG9hZC5jYWxsKG51bGwsaW1nLGkpO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShzcmMpO1xuICAgIH0pO1xuICAgIGltZy5zcmM9c3JjLnNyYztcbiAgfSlcbn1cblxuZnVuY3Rpb24gbG9hZEltYWdlcyhpbWFnZXMsb25Mb2FkKXtcbiAgcmV0dXJuIFByb21pc2UuYWxsKGltYWdlcy5tYXAoKHNyYyxpKT0+e1xuICAgIHJldHVybiBsb2FkSW1hZ2Uoc3JjLGksb25Mb2FkKTtcbiAgfSkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBJbWFnZUxvYWRlcihpbWFnZXMsb25Mb2FkKXtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLHJlamVjdCk9PntcbiAgICBsb2FkSW1hZ2VzKGltYWdlcyxvbkxvYWQpLnRoZW4oKGxvYWRlZEltYWdlcyk9PntcbiAgICAgIGxldCByPXt9O1xuICAgICAgbG9hZGVkSW1hZ2VzLmZvckVhY2goKGN1ckltYWdlKT0+e1xuICAgICAgICByW2N1ckltYWdlLm5hbWVdPXtcbiAgICAgICAgICBpbWc6Y3VySW1hZ2UuaW1nLFxuICAgICAgICAgIHNyYzpjdXJJbWFnZS5zcmMsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgXG4gICAgICByZXNvbHZlKHIpO1xuICAgIH0pO1xuICB9KVxufVxuIiwiaW1wb3J0ICdjb3JlLWpzJztcbmltcG9ydCBXZWJHTExpcXVpZCBmcm9tIFwiLi93ZWJnbC1saXF1aWRcIjtcbmltcG9ydCBSYWluZHJvcHMgZnJvbSBcIi4vcmFpbmRyb3BzXCI7XG5pbXBvcnQgbG9hZEltYWdlcyBmcm9tIFwiLi9pbWFnZS1sb2FkZXJcIjtcbmltcG9ydCBjcmVhdGVDYW52YXMgZnJvbSBcIi4vY3JlYXRlLWNhbnZhc1wiO1xuLy9pbXBvcnQgKiBhcyBzaGFkZXIgZnJvbSBcIi4vc2hhZGVycy93YXRlci5mcmFnXCI7XG5cbmxldCBjYW52YXM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2NvbnRhaW5lcicpO1xubGV0IGRwaT0xKygod2luZG93LmRldmljZVBpeGVsUmF0aW8tMSkqMC41KTtcbmNhbnZhcy53aWR0aD13aW5kb3cuaW5uZXJXaWR0aDtcbmNhbnZhcy5oZWlnaHQ9d2luZG93LmlubmVySGVpZ2h0O1xuLy8gY2FudmFzLnN0eWxlLndpZHRoPXdpbmRvdy5pbm5lcldpZHRoK1wicHhcIjtcbi8vIGNhbnZhcy5zdHlsZS5oZWlnaHQ9d2luZG93LmlubmVySGVpZ2h0K1wicHhcIjtcbnZhciByPW5ldyBSYWluZHJvcHMoY2FudmFzLndpZHRoLGNhbnZhcy5oZWlnaHQpO1xuXG5sb2FkSW1hZ2VzKFtcbiAge25hbWU6XCJzaGluZVwiLHNyYzpcImltZy9zaGluZTYucG5nXCJ9LFxuXG4gIHtuYW1lOlwidGV4dHVyZVJhaW5cIixzcmM6XCJpbWcvdGV4dHVyZTEwLnBuZ1wifSxcbiAge25hbWU6XCJ0ZXh0dXJlUmFpbkJsdXJcIixzcmM6XCJpbWcvdGV4dHVyZTEwLWJsdXIucG5nXCJ9LFxuXG4gIHtuYW1lOlwidGV4dHVyZVN1blwiLHNyYzpcImltZy90ZXh0dXJlOC1zdW4ucG5nXCJ9LFxuICB7bmFtZTpcInRleHR1cmVTdW5CbHVyXCIsc3JjOlwiaW1nL3RleHR1cmU4LXN1bi1ibHVyLnBuZ1wifSxcbl0pLnRoZW4oKGltYWdlcyk9PntcbiAgbGV0IHRleHR1cmU9Y3JlYXRlQ2FudmFzKDE5Mi8yLDEyOC8yKTtcbiAgbGV0IHRleHR1cmVDdHg9dGV4dHVyZS5nZXRDb250ZXh0KCcyZCcpO1xuICBsZXQgdGV4dHVyZUJsdXI9Y3JlYXRlQ2FudmFzKDM4NCwyNTYpO1xuICBsZXQgdGV4dHVyZUJsdXJDdHg9dGV4dHVyZUJsdXIuZ2V0Q29udGV4dCgnMmQnKTtcblxuXG4gIGZ1bmN0aW9uIGdlbmVyYXRlVGV4dHVyZXMoc3VuPTApe1xuICAgIHRleHR1cmVDdHguZ2xvYmFsQWxwaGE9MTtcbiAgICB0ZXh0dXJlQ3R4LmRyYXdJbWFnZShpbWFnZXMudGV4dHVyZVJhaW4uaW1nLDAsMCwxOTIvMiwxMjgvMik7XG4gICAgdGV4dHVyZUN0eC5nbG9iYWxBbHBoYT1zdW47XG4gICAgdGV4dHVyZUN0eC5kcmF3SW1hZ2UoaW1hZ2VzLnRleHR1cmVTdW4uaW1nLDAsMCwxOTIvMiwxMjgvMik7XG5cbiAgICB0ZXh0dXJlQmx1ckN0eC5nbG9iYWxBbHBoYT0xO1xuICAgIHRleHR1cmVCbHVyQ3R4LmRyYXdJbWFnZShpbWFnZXMudGV4dHVyZVJhaW5CbHVyLmltZywwLDApO1xuICAgIHRleHR1cmVCbHVyQ3R4Lmdsb2JhbEFscGhhPXN1bjtcbiAgICB0ZXh0dXJlQmx1ckN0eC5kcmF3SW1hZ2UoaW1hZ2VzLnRleHR1cmVTdW5CbHVyLmltZywwLDApO1xuICB9XG4gIGdlbmVyYXRlVGV4dHVyZXMoKTtcblxuICBsZXQgbGlxdWlkPW5ldyBXZWJHTExpcXVpZChjYW52YXMsci5jYW52YXMsaW1hZ2VzLnNoaW5lLmltZywgdGV4dHVyZSwgdGV4dHVyZUJsdXIpO1xuXG4gIGxldCBjdXJyZW50U3VuPTA7XG4gIGxldCB0cmFuc2l0aW9uPTA7XG4gIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsKGV2ZW50KT0+e1xuICAgIHIucmFpbmluZz0hci5yYWluaW5nO1xuICAgIHIuY2xlYXJEcm9wcygpO1xuXG4gICAgaWYoIXIucmFpbmluZyl7XG4gICAgICBjbGVhckludGVydmFsKHRyYW5zaXRpb24pO1xuICAgICAgdHJhbnNpdGlvbj1zZXRJbnRlcnZhbCgoKT0+e1xuICAgICAgICBjdXJyZW50U3VuKz0wLjAzO1xuICAgICAgICBpZihjdXJyZW50U3VuPj0xKXtcbiAgICAgICAgICBjdXJyZW50U3VuPTE7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRyYW5zaXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGdlbmVyYXRlVGV4dHVyZXMoY3VycmVudFN1bik7XG4gICAgICAgIGxpcXVpZC51cGRhdGVUZXh0dXJlcygpO1xuICAgICAgfSwzMyk7XG4gICAgfWVsc2V7XG4gICAgICBjbGVhckludGVydmFsKHRyYW5zaXRpb24pO1xuICAgICAgdHJhbnNpdGlvbj1zZXRJbnRlcnZhbCgoKT0+e1xuICAgICAgICBjdXJyZW50U3VuLT0wLjAzO1xuICAgICAgICBpZihjdXJyZW50U3VuPD0wKXtcbiAgICAgICAgICBjdXJyZW50U3VuPTA7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRyYW5zaXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGdlbmVyYXRlVGV4dHVyZXMoY3VycmVudFN1bik7XG4gICAgICAgIGxpcXVpZC51cGRhdGVUZXh0dXJlcygpO1xuICAgICAgfSwzMyk7XG4gICAgfVxuICB9KTtcblxuICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywoZXZlbnQpPT57XG5cbiAgfSlcbn0pXG4iLCJpbXBvcnQgbG9hZEltYWdlcyBmcm9tIFwiLi9pbWFnZS1sb2FkZXJcIjtcbmltcG9ydCB0aW1lcyBmcm9tIFwiLi90aW1lcy5qc1wiO1xuaW1wb3J0IGNyZWF0ZUNhbnZhcyBmcm9tIFwiLi9jcmVhdGUtY2FudmFzLmpzXCI7XG5pbXBvcnQge3JhbmRvbSwgY2hhbmNlfSBmcm9tIFwiLi9yYW5kb21cIjtcblxubGV0IG1pblI9MTA7XG5sZXQgbWF4Uj00MDtcbmxldCBkZWx0YVI9bWF4Ui1taW5SO1xubGV0IGRyb3BTaXplPTY0O1xubGV0IG1heERyb3BzPTgwMDtcblxubGV0IERyb3A9e1xuICB4OjAsXG4gIHk6MCxcbiAgcjowLFxuICBzcHJlYWRYOjAsXG4gIHNwcmVhZFk6MCxcbiAgbW9tZW50dW06MCxcbiAgbW9tZW50dW1YOjAsXG4gIGxhc3RTcGF3bjowLFxuICBuZXh0U3Bhd246MCxcbiAgcGFyZW50Om51bGwsXG4gIGlzTmV3OnRydWUsXG4gIGtpbGxlZDpmYWxzZSxcbiAgdGVuc2lvbjowLFxuICBzaHJpbms6MCxcbn1cblxuZnVuY3Rpb24gUmFpbmRyb3BzKHcsaCl7XG4gIHRoaXMud2lkdGg9dztcbiAgdGhpcy5oZWlnaHQ9aDtcbiAgdGhpcy5pbml0KCk7XG59XG5cblJhaW5kcm9wcy5wcm90b3R5cGU9e1xuICBjYW52YXM6bnVsbCxcbiAgY3R4Om51bGwsXG4gIHdpZHRoOjAsXG4gIGhlaWdodDowLFxuICB0ZXh0dXJlOm51bGwsXG4gIHRleHR1cmVDdHg6bnVsbCxcbiAgdGV4dHVyZVBpeGVsRGVuc2l0eToxLFxuICBkcm9wczpudWxsLFxuICBkcm9wc0dmeDpudWxsLFxuICBwYWludEdmeDpudWxsLFxuICByYWluaW5nOnRydWUsXG4gIGxhc3RSZW5kZXI6bnVsbCxcbiAgaW5pdCgpe1xuICAgIHRoaXMuY2FudmFzID0gY3JlYXRlQ2FudmFzKHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpO1xuICAgIHRoaXMuY3R4PXRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG5cbiAgICB0aGlzLnRleHR1cmUgPSBjcmVhdGVDYW52YXModGhpcy53aWR0aCp0aGlzLnRleHR1cmVQaXhlbERlbnNpdHksdGhpcy5oZWlnaHQqdGhpcy50ZXh0dXJlUGl4ZWxEZW5zaXR5KTtcbiAgICB0aGlzLnRleHR1cmVDdHg9dGhpcy50ZXh0dXJlLmdldENvbnRleHQoJzJkJyk7XG5cbiAgICB0aGlzLmRyb3BzPVtdO1xuICAgIHRoaXMubmV3RHJvcHM9W107XG4gICAgdGhpcy5kcm9wc0dmeD1bXTtcblxuICAgIHRoaXMucmVuZGVyRHJvcHNHZngoKTtcbiAgfSxcbiAgcmVuZGVyVGV4dHVyZSgpe1xuICAgIHRpbWVzKDUwMDAsKGkpPT57XG4gICAgICB0aGlzLmRyYXdUZXh0dXJlRHJvcChcbiAgICAgICAgcmFuZG9tKHRoaXMud2lkdGgpLFxuICAgICAgICByYW5kb20odGhpcy5oZWlnaHQpLFxuICAgICAgICByYW5kb20oMiw0KVxuICAgICAgKVxuICAgIH0pXG4gIH0sXG4gIGRyYXdUZXh0dXJlRHJvcCh4LHkscil7XG4gICAgLy8gdGhpcy50ZXh0dXJlQ3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1cIm5vcm1hbFwiO1xuICAgIHRoaXMuZHJhd0Ryb3AodGhpcy50ZXh0dXJlQ3R4LE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEcm9wKSx7XG4gICAgICB4OngqdGhpcy50ZXh0dXJlUGl4ZWxEZW5zaXR5LFxuICAgICAgeTp5KnRoaXMudGV4dHVyZVBpeGVsRGVuc2l0eSxcbiAgICAgIHI6cip0aGlzLnRleHR1cmVQaXhlbERlbnNpdHlcbiAgICB9KSx0cnVlKTtcbiAgfSxcblxuICByZW5kZXJEcm9wc0dmeCgpe1xuICAgIGxvYWRJbWFnZXMoW1xuICAgICAge25hbWU6J2FscGhhJyxzcmM6J2ltZy9kcm9wNC1hbHBoYTQucG5nJ30sXG4gICAgICB7bmFtZTonY29sb3InLHNyYzonaW1nL2Ryb3A3LnBuZyd9XG4gICAgXSkudGhlbigoaW1hZ2VzKT0+e1xuICAgICAgbGV0IGRyb3BCdWZmZXI9Y3JlYXRlQ2FudmFzKGRyb3BTaXplLGRyb3BTaXplKTtcbiAgICAgIGxldCBkcm9wQnVmZmVyQ3R4PWRyb3BCdWZmZXIuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgIHRoaXMuZHJvcHNHZng9QXJyYXkuYXBwbHkobnVsbCxBcnJheSgyNTUpKVxuICAgICAgICAubWFwKChjdXIsaSk9PntcbiAgICAgICAgICBsZXQgZHJvcD1jcmVhdGVDYW52YXMoZHJvcFNpemUsZHJvcFNpemUpO1xuICAgICAgICAgIGxldCBkcm9wQ3R4PWRyb3AuZ2V0Q29udGV4dCgnMmQnKTtcblxuICAgICAgICAgIGRyb3BCdWZmZXJDdHguY2xlYXJSZWN0KDAsMCxkcm9wU2l6ZSxkcm9wU2l6ZSk7XG5cbiAgICAgICAgICAvLyBjb2xvclxuICAgICAgICAgIGRyb3BCdWZmZXJDdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPVwibm9ybWFsXCI7XG4gICAgICAgICAgZHJvcEJ1ZmZlckN0eC5kcmF3SW1hZ2UoaW1hZ2VzLmNvbG9yLmltZywwLDAsZHJvcFNpemUsZHJvcFNpemUpO1xuXG4gICAgICAgICAgLy8gYmx1ZSBvdmVybGF5LCBmb3IgZGVwdGhcbiAgICAgICAgICBkcm9wQnVmZmVyQ3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1cInNjcmVlblwiO1xuICAgICAgICAgIGRyb3BCdWZmZXJDdHguZmlsbFN0eWxlPVwicmdiYSgwLDAsXCIraStcIiwxKVwiO1xuICAgICAgICAgIGRyb3BCdWZmZXJDdHguZmlsbFJlY3QoMCwwLGRyb3BTaXplLGRyb3BTaXplKTtcblxuICAgICAgICAgIC8vIGFscGhhXG4gICAgICAgICAgZHJvcEN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249XCJub3JtYWxcIjtcbiAgICAgICAgICBkcm9wQ3R4LmRyYXdJbWFnZShpbWFnZXMuYWxwaGEuaW1nLDAsMCxkcm9wU2l6ZSxkcm9wU2l6ZSk7XG5cbiAgICAgICAgICBkcm9wQ3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1cInNvdXJjZS1pblwiO1xuICAgICAgICAgIGRyb3BDdHguZHJhd0ltYWdlKGRyb3BCdWZmZXIsMCwwLGRyb3BTaXplLGRyb3BTaXplKTtcbiAgICAgICAgICByZXR1cm4gZHJvcDtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnBhaW50R2Z4PWNyZWF0ZUNhbnZhcygxMjgsMTI4KTtcbiAgICAgIGxldCBwYWludEN0eD10aGlzLnBhaW50R2Z4LmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgIHBhaW50Q3R4LmZpbGxTdHlsZT1cIiMwMDBcIjtcbiAgICAgIHBhaW50Q3R4LmJlZ2luUGF0aCgpO1xuICAgICAgcGFpbnRDdHguYXJjKDY0LDY0LDY0LDAsTWF0aC5QSSoyKTtcbiAgICAgIHBhaW50Q3R4LmZpbGwoKTtcblxuICAgICAgdGhpcy5yZW5kZXJUZXh0dXJlKCk7XG4gICAgICB0aW1lcygxMDAsKGkpPT57XG4gICAgICAgIHRoaXMuZHJvcHMucHVzaChcbiAgICAgICAgICB0aGlzLmNyZWF0ZURyb3Aoe1xuICAgICAgICAgICAgeDpyYW5kb20odGhpcy53aWR0aCksXG4gICAgICAgICAgICB5OnJhbmRvbSh0aGlzLmhlaWdodCksXG4gICAgICAgICAgICByOnJhbmRvbShtaW5SLG1heFIsKG4pPT57XG4gICAgICAgICAgICAgIHJldHVybiBuKm4qbjtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfSk7XG4gIH0sXG4gIGRyYXdEcm9wKGN0eCxkcm9wLG5vcm1hbEJsZW5kPWZhbHNlKXtcblxuICAgIGlmKHRoaXMuZHJvcHNHZngubGVuZ3RoPjApe1xuICAgICAgbGV0IHg9ZHJvcC54O1xuICAgICAgbGV0IHk9ZHJvcC55O1xuICAgICAgbGV0IHI9ZHJvcC5yO1xuICAgICAgbGV0IHNwcmVhZFg9ZHJvcC5zcHJlYWRYO1xuICAgICAgbGV0IHNwcmVhZFk9ZHJvcC5zcHJlYWRZO1xuXG4gICAgICBsZXQgc2NhbGVYPTE7XG4gICAgICBsZXQgc2NhbGVZPTEuNTtcblxuICAgICAgbGV0IGQ9TWF0aC5tYXgoMCxNYXRoLm1pbigxLCgoci1taW5SKS8oZGVsdGFSKSkqMC45KSk7XG4gICAgICBkKj0xLygoKGRyb3Auc3ByZWFkWCtkcm9wLnNwcmVhZFkpKjAuNSkrMSk7XG5cbiAgICAgIGN0eC5nbG9iYWxBbHBoYT0xO1xuICAgICAgY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1ub3JtYWxCbGVuZD9cIm5vcm1hbFwiOlwibm9ybWFsXCI7XG5cbiAgICAgIGQ9TWF0aC5mbG9vcihkKih0aGlzLmRyb3BzR2Z4Lmxlbmd0aC0xKSk7XG4gICAgICBjdHguZHJhd0ltYWdlKFxuICAgICAgICB0aGlzLmRyb3BzR2Z4W2RdLFxuICAgICAgICB4LShyKnNjYWxlWCooc3ByZWFkWCsxKSksXG4gICAgICAgIHktKHIqc2NhbGVZKihzcHJlYWRZKzEpKSxcbiAgICAgICAgcioyKnNjYWxlWCooc3ByZWFkWCsxKSxcbiAgICAgICAgcioyKnNjYWxlWSooc3ByZWFkWSsxKVxuICAgICAgKTtcblxuICAgIH1cbiAgfSxcbiAgcGFpbnQoeCx5LHI9MzApe1xuICAgIGxldCBjdHg9dGhpcy50ZXh0dXJlQ3R4O1xuICAgIGN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249XCJkZXN0aW5hdGlvbi1vdXRcIjtcbiAgICBjdHguZHJhd0ltYWdlKFxuICAgICAgdGhpcy5wYWludEdmeCxcbiAgICAgICh4LXIpKnRoaXMudGV4dHVyZVBpeGVsRGVuc2l0eSxcbiAgICAgICh5LXIpKnRoaXMudGV4dHVyZVBpeGVsRGVuc2l0eSxcbiAgICAgIChyKjIpKnRoaXMudGV4dHVyZVBpeGVsRGVuc2l0eSxcbiAgICAgIChyKjIpKnRoaXMudGV4dHVyZVBpeGVsRGVuc2l0eSoxLjVcbiAgICApXG4gIH0sXG4gIGNsZWFyQ2FudmFzKCl7XG4gICAgdGhpcy5jdHguY2xlYXJSZWN0KDAsMCx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KTtcbiAgfSxcbiAgY3JlYXRlRHJvcChvcHRpb25zKXtcbiAgICBpZih0aGlzLmRyb3BzLmxlbmd0aCA+PSBtYXhEcm9wcykgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKERyb3ApLG9wdGlvbnMpO1xuICB9LFxuICB1cGRhdGVSYWluKCl7XG4gICAgbGV0IHJhaW5Ecm9wcz1bXTtcbiAgICBpZih0aGlzLnJhaW5pbmcpe1xuICAgICAgbGV0IGxpbWl0PTM7XG4gICAgICBsZXQgY291bnQ9MDtcbiAgICAgIHdoaWxlKGNoYW5jZSgwLjMpICYmIGNvdW50PGxpbWl0KXtcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgLy8gbGV0IHI9KG1pblIqMC41KSsoTWF0aC5wb3coTWF0aC5yYW5kb20oKSwzKSooZGVsdGFSKSk7XG4gICAgICAgIGxldCByPXJhbmRvbShtaW5SLG1heFIsKG4pPT57XG4gICAgICAgICAgcmV0dXJuIE1hdGgucG93KG4sMyk7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgcmFpbkRyb3A9dGhpcy5jcmVhdGVEcm9wKHtcbiAgICAgICAgICB4OnJhbmRvbSh0aGlzLndpZHRoKSxcbiAgICAgICAgICB5OnJhbmRvbSh0aGlzLmhlaWdodCktMTAwLFxuICAgICAgICAgIHI6cixcbiAgICAgICAgICBtb21lbnR1bToxKygoci1taW5SKSowLjMpK3JhbmRvbSgyKSxcbiAgICAgICAgICBzcHJlYWRYOjEuNSxcbiAgICAgICAgICBzcHJlYWRZOjEuNSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmKHJhaW5Ecm9wIT1udWxsKXtcbiAgICAgICAgICByYWluRHJvcHMucHVzaChyYWluRHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJhaW5Ecm9wcztcbiAgfSxcbiAgY2xlYXJEcm9wcygpe1xuICAgIHRoaXMuZHJvcHMuZm9yRWFjaCgoZHJvcCk9PntcbiAgICAgIHNldFRpbWVvdXQoKCk9PntcbiAgICAgICAgZHJvcC5zaHJpbms9MC4xKyhNYXRoLnJhbmRvbSgpKjAuNSk7XG4gICAgICB9LE1hdGgucmFuZG9tKCkqMTIwMClcbiAgICB9KVxuICB9LFxuICB1cGRhdGVUZXh0dXJlKCl7XG4gICAgdGhpcy5jdHguZHJhd0ltYWdlKHRoaXMudGV4dHVyZSwwLDAsdGhpcy53aWR0aCx0aGlzLmhlaWdodCk7XG4gICAgaWYodGhpcy5yYWluaW5nKXtcbiAgICAgIHRpbWVzKDUwLChpKT0+e1xuICAgICAgICB0aGlzLmRyYXdUZXh0dXJlRHJvcChcbiAgICAgICAgICByYW5kb20odGhpcy53aWR0aCksXG4gICAgICAgICAgcmFuZG9tKHRoaXMuaGVpZ2h0KSxcbiAgICAgICAgICByYW5kb20oMS41LDQpXG4gICAgICAgIClcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgdXBkYXRlRHJvcHModGltZVNjYWxlKXtcbiAgICBsZXQgbmV3RHJvcHM9W107XG5cbiAgICBsZXQgcmFpbkRyb3BzPXRoaXMudXBkYXRlUmFpbigpO1xuICAgIG5ld0Ryb3BzPW5ld0Ryb3BzLmNvbmNhdChyYWluRHJvcHMpO1xuXG4gICAgdGhpcy5kcm9wcy5zb3J0KChhLGIpPT57XG4gICAgICBsZXQgdmE9KGEueSp0aGlzLndpZHRoKSthLng7XG4gICAgICBsZXQgdmI9KGIueSp0aGlzLndpZHRoKStiLng7XG4gICAgICByZXR1cm4gdmE+dmI/MTp2YT09dmI/MDotMTtcbiAgICB9KTtcblxuICAgIHRoaXMuZHJvcHMuZm9yRWFjaChmdW5jdGlvbihkcm9wLGkpe1xuICAgICAgaWYoIWRyb3Aua2lsbGVkKXtcbiAgICAgICAgLy8gdXBkYXRlIGdyYXZpdHlcbiAgICAgICAgaWYoY2hhbmNlKChkcm9wLnItbWluUikgKiAoMC4xL2RlbHRhUikgKiB0aW1lU2NhbGUpKXtcbiAgICAgICAgICBkcm9wLm1vbWVudHVtICs9IHJhbmRvbSgoZHJvcC5yL21heFIpKjQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNsZWFuIHNtYWxsIGRyb3BzXG4gICAgICAgIGlmKGRyb3Aucjw9bWluUiAmJiBjaGFuY2UoMC4wNSp0aW1lU2NhbGUpKXtcbiAgICAgICAgICBkcm9wLnNocmluays9MC4wMTtcbiAgICAgICAgfVxuICAgICAgICAvL3VwZGF0ZSBzaHJpbmthZ2VcbiAgICAgICAgZHJvcC5yIC09IGRyb3Auc2hyaW5rKnRpbWVTY2FsZTtcbiAgICAgICAgaWYoZHJvcC5yPD0wKSBkcm9wLmtpbGxlZD10cnVlO1xuXG4gICAgICAgIC8vIHVwZGF0ZSB0cmFpbHNcbiAgICAgICAgZHJvcC5sYXN0U3Bhd24rPWRyb3AubW9tZW50dW0qdGltZVNjYWxlO1xuICAgICAgICBpZihkcm9wLmxhc3RTcGF3bj5kcm9wLm5leHRTcGF3bil7XG4gICAgICAgICAgbGV0IHRyYWlsRHJvcD10aGlzLmNyZWF0ZURyb3Aoe1xuICAgICAgICAgICAgeDpkcm9wLngrKHJhbmRvbSgtZHJvcC5yLGRyb3AucikqMC4xKSxcbiAgICAgICAgICAgIHk6ZHJvcC55LShkcm9wLnIqMC4xKSxcbiAgICAgICAgICAgIHI6ZHJvcC5yKnJhbmRvbSgwLjIsMC41KSxcbiAgICAgICAgICAgIHNwcmVhZFk6ZHJvcC5tb21lbnR1bSowLjEsXG4gICAgICAgICAgICBwYXJlbnQ6ZHJvcCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmKHRyYWlsRHJvcCE9bnVsbCl7XG4gICAgICAgICAgICBuZXdEcm9wcy5wdXNoKHRyYWlsRHJvcCk7XG5cbiAgICAgICAgICAgIGRyb3Aucio9TWF0aC5wb3coMC45Nyx0aW1lU2NhbGUpO1xuICAgICAgICAgICAgZHJvcC5sYXN0U3Bhd249MDtcbiAgICAgICAgICAgIGRyb3AubmV4dFNwYXduPXJhbmRvbShtaW5SLG1heFIpLShkcm9wLm1vbWVudHVtKjIpKyhtYXhSLWRyb3Aucik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9ub3JtYWxpemUgc3ByZWFkXG4gICAgICAgIGRyb3Auc3ByZWFkWCo9TWF0aC5wb3coMC40LHRpbWVTY2FsZSk7XG4gICAgICAgIGRyb3Auc3ByZWFkWSo9TWF0aC5wb3coMC43LHRpbWVTY2FsZSk7XG5cbiAgICAgICAgLy91cGRhdGUgcG9zaXRpb25cbiAgICAgICAgbGV0IG1vdmVkPWRyb3AubW9tZW50dW0+MDtcbiAgICAgICAgaWYobW92ZWQgJiYgIWRyb3Aua2lsbGVkKXtcbiAgICAgICAgICBkcm9wLnkrPWRyb3AubW9tZW50dW0qdGltZVNjYWxlO1xuICAgICAgICAgIGRyb3AueCs9ZHJvcC5tb21lbnR1bVgqdGltZVNjYWxlO1xuICAgICAgICAgIGlmKGRyb3AueT50aGlzLmhlaWdodCtkcm9wLnIpe1xuICAgICAgICAgICAgZHJvcC5raWxsZWQ9dHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb2xsaXNpb25cbiAgICAgICAgbGV0IGNoZWNrQ29sbGlzaW9uPShtb3ZlZCB8fCBkcm9wLmlzTmV3KSAmJiAhZHJvcC5raWxsZWQ7XG4gICAgICAgIGRyb3AuaXNOZXc9ZmFsc2U7XG5cbiAgICAgICAgaWYoY2hlY2tDb2xsaXNpb24pe1xuICAgICAgICAgIHRoaXMuZHJvcHMuc2xpY2UoaSsxLGkrNzApLmZvckVhY2goKGRyb3AyKT0+e1xuICAgICAgICAgICAgLy9iYXNpYyBjaGVja1xuICAgICAgICAgICAgaWYoXG4gICAgICAgICAgICAgIGRyb3AgIT0gZHJvcDIgJiZcbiAgICAgICAgICAgICAgZHJvcC5yID4gZHJvcDIuciAmJlxuICAgICAgICAgICAgICBkcm9wLnBhcmVudCAhPSBkcm9wMiAmJlxuICAgICAgICAgICAgICBkcm9wMi5wYXJlbnQgIT0gZHJvcCAmJlxuICAgICAgICAgICAgICAhZHJvcDIua2lsbGVkXG4gICAgICAgICAgICApe1xuICAgICAgICAgICAgICBsZXQgZHg9ZHJvcDIueC1kcm9wLng7XG4gICAgICAgICAgICAgIGxldCBkeT1kcm9wMi55LWRyb3AueTtcbiAgICAgICAgICAgICAgdmFyIGQ9TWF0aC5zcXJ0KChkeCpkeCkrKGR5KmR5KSk7XG4gICAgICAgICAgICAgIC8vaWYgaXQncyB3aXRoaW4gYWNjZXB0YWJsZSBkaXN0YW5jZVxuICAgICAgICAgICAgICBpZihkPChkcm9wLnIrZHJvcDIucikqKDAuNjUrKGRyb3AubW9tZW50dW0qMC4wMSkpKXtcbiAgICAgICAgICAgICAgICBsZXQgcGk9TWF0aC5QSTtcbiAgICAgICAgICAgICAgICBsZXQgcjE9ZHJvcC5yO1xuICAgICAgICAgICAgICAgIGxldCByMj1kcm9wMi5yO1xuICAgICAgICAgICAgICAgIGxldCBhMT1waSoocjEqcjEpO1xuICAgICAgICAgICAgICAgIGxldCBhMj1waSoocjIqcjIpO1xuICAgICAgICAgICAgICAgIGxldCB0YXJnZXRSPU1hdGguc3FydCgoYTErKGEyKjAuOCkpL3BpKTtcbiAgICAgICAgICAgICAgICBpZih0YXJnZXRSPm1heFIpe1xuICAgICAgICAgICAgICAgICAgdGFyZ2V0Uj1tYXhSO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkcm9wLnI9dGFyZ2V0UjtcbiAgICAgICAgICAgICAgICBkcm9wLm1vbWVudHVtWCs9ZHgqMC4xO1xuICAgICAgICAgICAgICAgIGRyb3Auc3ByZWFkWD0wO1xuICAgICAgICAgICAgICAgIGRyb3Auc3ByZWFkWT0wO1xuICAgICAgICAgICAgICAgIGRyb3AyLmtpbGxlZD10cnVlO1xuICAgICAgICAgICAgICAgIGRyb3AubW9tZW50dW09TWF0aC5tYXgoZHJvcDIubW9tZW50dW0sTWF0aC5taW4oNDAsZHJvcC5tb21lbnR1bSsodGFyZ2V0UiowLjA0KSsxKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vc2xvd2Rvd24gbW9tZW50dW1cbiAgICAgICAgZHJvcC5tb21lbnR1bS09TWF0aC5tYXgoMSwobWluUiowLjUpLWRyb3AubW9tZW50dW0pKjAuMSp0aW1lU2NhbGU7XG4gICAgICAgIGlmKGRyb3AubW9tZW50dW08MCkgZHJvcC5tb21lbnR1bT0wO1xuICAgICAgICBkcm9wLm1vbWVudHVtWCo9TWF0aC5wb3coMC43LHRpbWVTY2FsZSk7XG5cblxuICAgICAgICBpZighZHJvcC5raWxsZWQpe1xuICAgICAgICAgIG5ld0Ryb3BzLnB1c2goZHJvcCk7XG4gICAgICAgICAgaWYobW92ZWQpIHRoaXMucGFpbnQoZHJvcC54LGRyb3AueSxkcm9wLnIqMC40NSk7XG4gICAgICAgICAgdGhpcy5kcmF3RHJvcCh0aGlzLmN0eCxkcm9wKTtcbiAgICAgICAgfVxuXG4gICAgICB9XG4gICAgfSx0aGlzKTtcblxuICAgIHRoaXMuZHJvcHMgPSBuZXdEcm9wcztcbiAgfSxcbiAgdXBkYXRlKCl7XG4gICAgdGhpcy5jbGVhckNhbnZhcygpO1xuXG4gICAgdGhpcy51cGRhdGVUZXh0dXJlKCk7XG5cbiAgICBsZXQgbm93PURhdGUubm93KCk7XG4gICAgaWYodGhpcy5sYXN0UmVuZGVyPT1udWxsKSB0aGlzLmxhc3RSZW5kZXI9bm93O1xuICAgIGxldCBkZWx0YVQ9bm93LXRoaXMubGFzdFJlbmRlcjtcbiAgICBsZXQgdGltZVNjYWxlPWRlbHRhVC8oKDEvNjApKjEwMDApO1xuICAgIHRoaXMubGFzdFJlbmRlcj1ub3c7XG5cbiAgICB0aGlzLnVwZGF0ZURyb3BzKHRpbWVTY2FsZSk7XG5cbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy51cGRhdGUuYmluZCh0aGlzKSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUmFpbmRyb3BzO1xuIiwiZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbShmcm9tPW51bGwsdG89bnVsbCxpbnRlcnBvbGF0aW9uPW51bGwpe1xuICBpZihmcm9tPT1udWxsKXtcbiAgICBmcm9tPTA7XG4gICAgdG89MTtcbiAgfWVsc2UgaWYoZnJvbSE9bnVsbCAmJiB0bz09bnVsbCl7XG4gICAgdG89ZnJvbTtcbiAgICBmcm9tPTA7XG4gIH1cbiAgY29uc3QgZGVsdGE9dG8tZnJvbTtcblxuICBpZihpbnRlcnBvbGF0aW9uPT1udWxsKXtcbiAgICBpbnRlcnBvbGF0aW9uPShuKT0+e1xuICAgICAgcmV0dXJuIG47XG4gICAgfVxuICB9XG4gIHJldHVybiBmcm9tKyhpbnRlcnBvbGF0aW9uKE1hdGgucmFuZG9tKCkpKmRlbHRhKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjaGFuY2UoYyl7XG4gIHJldHVybiByYW5kb20oKTw9Yztcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRpbWVzKG4sZil7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgZi5jYWxsKHRoaXMsaSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIFdlYkdMIGZyb20gXCIuL3dlYmdsXCI7XG5pbXBvcnQgR0wgZnJvbSBcIi4vZ2wtb2JqXCI7XG5pbXBvcnQgbG9hZEltYWdlcyBmcm9tIFwiLi9pbWFnZS1sb2FkZXJcIjtcbmxldCByZXF1aXJlU2hhZGVyU2NyaXB0ID0gcmVxdWlyZShcImdsc2xpZnlcIik7XG5cbmxldCB2ZXJ0ZXhTaGFkZXIgPSByZXF1aXJlU2hhZGVyU2NyaXB0KCcuL3NoYWRlcnMvc2ltcGxlLnZlcnQnKTtcbmxldCBmcmFnU2hhZGVyV2F0ZXIgPSByZXF1aXJlU2hhZGVyU2NyaXB0KCcuL3NoYWRlcnMvd2F0ZXIuZnJhZycpO1xubGV0IGJsdXJTaGFkZXIgPSByZXF1aXJlU2hhZGVyU2NyaXB0KCcuL3NoYWRlcnMvZmFzdC1ibHVyLmZyYWcnKTtcblxuZnVuY3Rpb24gV2ViR0xMaXF1aWQoY2FudmFzLGNhbnZhc0xpcXVpZCxpbWFnZVNoaW5lLGltYWdlQmcsaW1hZ2VCZ1Rocm91Z2gpe1xuXG4gIHRoaXMuY2FudmFzPWNhbnZhcztcbiAgdGhpcy5jYW52YXNMaXF1aWQ9Y2FudmFzTGlxdWlkO1xuICB0aGlzLmltYWdlU2hpbmU9aW1hZ2VTaGluZTtcbiAgdGhpcy5pbWFnZUJnPWltYWdlQmc7XG4gIHRoaXMuaW1hZ2VCZ1Rocm91Z2g9aW1hZ2VCZ1Rocm91Z2g7XG4gIHRoaXMuaW5pdCgpO1xufVxuXG5XZWJHTExpcXVpZC5wcm90b3R5cGU9e1xuICBjYW52YXM6bnVsbCxcbiAgZ2w6bnVsbCxcbiAgY2FudmFzTGlxdWlkOm51bGwsXG4gIHdpZHRoOjAsXG4gIGhlaWdodDowLFxuICBpbWFnZVNoaW5lOlwiXCIsXG4gIGltYWdlQmc6XCJcIixcbiAgaW1hZ2VCZ1Rocm91Z2g6XCJcIixcbiAgdGV4dHVyZXM6bnVsbCxcbiAgcHJvZ3JhbVdhdGVyOm51bGwsXG4gIHByb2dyYW1CbHVyWDpudWxsLFxuICBwcm9ncmFtQmx1clk6bnVsbCxcbiAgaW5pdCgpe1xuICAgIHRoaXMud2lkdGg9dGhpcy5jYW52YXMud2lkdGg7XG4gICAgdGhpcy5oZWlnaHQ9dGhpcy5jYW52YXMuaGVpZ2h0O1xuICAgIHRoaXMuZ2w9bmV3IEdMKHRoaXMuY2FudmFzLCB7YWxwaGE6ZmFsc2V9LHZlcnRleFNoYWRlcixmcmFnU2hhZGVyV2F0ZXIpO1xuICAgIGxldCBnbD10aGlzLmdsO1xuICAgIHRoaXMucHJvZ3JhbVdhdGVyPWdsLnByb2dyYW07XG5cbiAgICBnbC5jcmVhdGVVbmlmb3JtKFwiMmZcIixcInJlc29sdXRpb25cIix0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KTtcbiAgICBnbC5jcmVhdGVUZXh0dXJlKG51bGwsMCk7XG5cbiAgICB0aGlzLnRleHR1cmVzPVtcbiAgICAgIHtuYW1lOidzaGluZScsIGltZzp0aGlzLmltYWdlU2hpbmV9LFxuICAgICAge25hbWU6J3RleHR1cmUnLCBpbWc6dGhpcy5pbWFnZUJnfSxcbiAgICAgIHtuYW1lOid0ZXh0dXJlQmx1cicsIGltZzp0aGlzLmltYWdlQmdUaHJvdWdofVxuICAgIF07XG5cbiAgICB0aGlzLnRleHR1cmVzLmZvckVhY2goKHRleHR1cmUsaSk9PntcbiAgICAgIGdsLmNyZWF0ZVRleHR1cmUodGV4dHVyZS5pbWcsaSsxKTtcbiAgICAgIGdsLmNyZWF0ZVVuaWZvcm0oXCIxaVwiLHRleHR1cmUubmFtZSxpKzEpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5wcm9ncmFtQmx1clk9Z2wuY3JlYXRlUHJvZ3JhbSh2ZXJ0ZXhTaGFkZXIsYmx1clNoYWRlcik7XG4gICAgZ2wudXNlUHJvZ3JhbSh0aGlzLnByb2dyYW1CbHVyWSk7XG5cbiAgICBnbC5jcmVhdGVVbmlmb3JtKFwiMmZcIixcInJlc29sdXRpb25cIix0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KTtcbiAgICBnbC5jcmVhdGVVbmlmb3JtKFwiMmZcIixcInBpeGVsXCIsMS90aGlzLndpZHRoLDEvdGhpcy5oZWlnaHQpO1xuICAgIGdsLmNyZWF0ZVVuaWZvcm0oXCIyZlwiLFwiZGVsdGFcIiwwLDEpO1xuXG4gICAgdGhpcy5wcm9ncmFtQmx1clg9Z2wuY3JlYXRlUHJvZ3JhbSh2ZXJ0ZXhTaGFkZXIsYmx1clNoYWRlcik7XG4gICAgZ2wudXNlUHJvZ3JhbSh0aGlzLnByb2dyYW1CbHVyWCk7XG5cbiAgICBnbC5jcmVhdGVVbmlmb3JtKFwiMmZcIixcInJlc29sdXRpb25cIix0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KTtcbiAgICBnbC5jcmVhdGVVbmlmb3JtKFwiMmZcIixcInBpeGVsXCIsMS90aGlzLndpZHRoLDEvdGhpcy5oZWlnaHQpO1xuICAgIGdsLmNyZWF0ZVVuaWZvcm0oXCIyZlwiLFwiZGVsdGFcIiwxLDApO1xuXG4gICAgdGhpcy5kcmF3KCk7XG4gIH0sXG4gIGRyYXcoKXtcbiAgICB0aGlzLmdsLnVzZVByb2dyYW0odGhpcy5wcm9ncmFtV2F0ZXIpO1xuICAgIHRoaXMudXBkYXRlVGV4dHVyZSgpO1xuICAgIHRoaXMuZ2wuZHJhdygpO1xuXG4gICAgLy8gdGhpcy5nbC51c2VQcm9ncmFtKHRoaXMucHJvZ3JhbUJsdXJYKTtcbiAgICAvLyB0aGlzLmdsLnVwZGF0ZVRleHR1cmUodGhpcy5jYW52YXMpO1xuICAgIC8vIHRoaXMuZ2wuZHJhdygpO1xuICAgIC8vXG4gICAgLy8gdGhpcy5nbC51c2VQcm9ncmFtKHRoaXMucHJvZ3JhbUJsdXJZKTtcbiAgICAvLyB0aGlzLmdsLnVwZGF0ZVRleHR1cmUodGhpcy5jYW52YXMpO1xuICAgIC8vIHRoaXMuZ2wuZHJhdygpO1xuXG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuZHJhdy5iaW5kKHRoaXMpKTtcbiAgfSxcbiAgdXBkYXRlVGV4dHVyZXMoKXtcbiAgICB0aGlzLnRleHR1cmVzLmZvckVhY2goKHRleHR1cmUsaSk9PntcbiAgICAgIHRoaXMuZ2wuYWN0aXZlVGV4dHVyZShpKzEpO1xuICAgICAgdGhpcy5nbC51cGRhdGVUZXh0dXJlKHRleHR1cmUuaW1nKTtcbiAgICB9KVxuICB9LFxuICB1cGRhdGVUZXh0dXJlKCl7XG4gICAgdGhpcy5nbC5hY3RpdmVUZXh0dXJlKDApO1xuICAgIHRoaXMuZ2wudXBkYXRlVGV4dHVyZSh0aGlzLmNhbnZhc0xpcXVpZCk7XG4gIH0sXG4gIHJlc2l6ZSgpe1xuXG4gIH0sXG4gIGdldCBvdmVybGF5VGV4dHVyZSgpe1xuXG4gIH0sXG4gIHNldCBvdmVybGF5VGV4dHVyZSh2KXtcblxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFdlYkdMTGlxdWlkO1xuIiwiZXhwb3J0IGZ1bmN0aW9uIGdldENvbnRleHQoY2FudmFzLCBvcHRpb25zPXt9KSB7XG4gIGxldCBjb250ZXh0cyA9IFtcIndlYmdsXCIsIFwiZXhwZXJpbWVudGFsLXdlYmdsXCJdO1xuICBsZXQgY29udGV4dCA9IG51bGw7XG5cbiAgY29udGV4dHMuc29tZShuYW1lPT57XG4gICAgdHJ5e1xuICAgICAgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KG5hbWUsb3B0aW9ucyk7XG4gICAgfWNhdGNoKGUpe307XG4gICAgcmV0dXJuIGNvbnRleHQhPW51bGw7XG4gIH0pO1xuXG4gIHJldHVybiBjb250ZXh0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHJvZ3JhbShnbCx2ZXJ0ZXhTY3JpcHQsZnJhZ1NjcmlwdCl7XG4gIGxldCB2ZXJ0ZXhTaGFkZXIgPSBjcmVhdGVTaGFkZXIoZ2wsIHZlcnRleFNjcmlwdCwgZ2wuVkVSVEVYX1NIQURFUik7XG4gIGxldCBmcmFnU2hhZGVyID0gY3JlYXRlU2hhZGVyKGdsLCBmcmFnU2NyaXB0LCBnbC5GUkFHTUVOVF9TSEFERVIpO1xuXG4gIGxldCBwcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpO1xuICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgdmVydGV4U2hhZGVyKTtcbiAgZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIGZyYWdTaGFkZXIpO1xuXG4gIGdsLmxpbmtQcm9ncmFtKHByb2dyYW0pO1xuXG4gIGxldCBsaW5rZWQgPSBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dyYW0sIGdsLkxJTktfU1RBVFVTKTtcbiAgaWYgKCFsaW5rZWQpIHtcbiAgICAgIHZhciBsYXN0RXJyb3IgPSBnbC5nZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtKTtcbiAgICAgIGVycm9yKFwiRXJyb3IgaW4gcHJvZ3JhbSBsaW5raW5nOiBcIiArIGxhc3RFcnJvcik7XG4gICAgICBnbC5kZWxldGVQcm9ncmFtKHByb2dyYW0pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgcG9zaXRpb25Mb2NhdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIFwiYV9wb3NpdGlvblwiKTtcbiAgdmFyIHRleENvb3JkTG9jYXRpb24gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCBcImFfdGV4Q29vcmRcIik7XG5cbiAgdmFyIHRleENvb3JkQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB0ZXhDb29yZEJ1ZmZlcik7XG4gIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KFtcbiAgICAgIDAuMCwgIDAuMCxcbiAgICAgIDEuMCwgIDAuMCxcbiAgICAgIDAuMCwgIDEuMCxcbiAgICAgIDAuMCwgIDEuMCxcbiAgICAgIDEuMCwgIDAuMCxcbiAgICAgIDEuMCwgIDEuMFxuICBdKSwgZ2wuU1RBVElDX0RSQVcpO1xuICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0ZXhDb29yZExvY2F0aW9uKTtcbiAgZ2wudmVydGV4QXR0cmliUG9pbnRlcih0ZXhDb29yZExvY2F0aW9uLCAyLCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApO1xuXG4gIC8vIENyZWF0ZSBhIGJ1ZmZlciBmb3IgdGhlIHBvc2l0aW9uIG9mIHRoZSByZWN0YW5nbGUgY29ybmVycy5cbiAgdmFyIGJ1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgYnVmZmVyKTtcbiAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkocG9zaXRpb25Mb2NhdGlvbik7XG4gIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIocG9zaXRpb25Mb2NhdGlvbiwgMiwgZ2wuRkxPQVQsIGZhbHNlLCAwLCAwKTtcblxuICByZXR1cm4gcHJvZ3JhbTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNoYWRlcihnbCxzY3JpcHQsdHlwZSl7XG4gIGxldCBzaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIodHlwZSk7XG4gIGdsLnNoYWRlclNvdXJjZShzaGFkZXIsc2NyaXB0KTtcbiAgZ2wuY29tcGlsZVNoYWRlcihzaGFkZXIpO1xuXG4gIGxldCBjb21waWxlZCA9IGdsLmdldFNoYWRlclBhcmFtZXRlcihzaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKTtcblxuICBpZiAoIWNvbXBpbGVkKSB7XG4gICAgbGV0IGxhc3RFcnJvciA9IGdsLmdldFNoYWRlckluZm9Mb2coc2hhZGVyKTtcbiAgICBlcnJvcihcIkVycm9yIGNvbXBpbGluZyBzaGFkZXIgJ1wiICsgc2hhZGVyICsgXCInOlwiICsgbGFzdEVycm9yKTtcbiAgICBnbC5kZWxldGVTaGFkZXIoc2hhZGVyKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gc2hhZGVyO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRleHR1cmUoZ2wsc291cmNlLGkpe1xuICB2YXIgdGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgYWN0aXZlVGV4dHVyZShnbCxpKTtcbiAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSk7XG5cbiAgLy8gU2V0IHRoZSBwYXJhbWV0ZXJzIHNvIHdlIGNhbiByZW5kZXIgYW55IHNpemUgaW1hZ2UuXG4gIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLkNMQU1QX1RPX0VER0UpO1xuICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTtcbiAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLkxJTkVBUik7XG4gIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5MSU5FQVIpO1xuXG4gIHVwZGF0ZVRleHR1cmUoZ2wsc291cmNlKTtcblxuICByZXR1cm4gdGV4dHVyZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVVbmlmb3JtKGdsLHByb2dyYW0sdHlwZSxuYW1lLC4uLmFyZ3Mpe1xuICBsZXQgbG9jYXRpb249Z2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sXCJ1X1wiK25hbWUpO1xuICBnbFtcInVuaWZvcm1cIit0eXBlXShsb2NhdGlvbiwuLi5hcmdzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhY3RpdmVUZXh0dXJlKGdsLGkpe1xuICBnbC5hY3RpdmVUZXh0dXJlKGdsW1wiVEVYVFVSRVwiK2ldKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVUZXh0dXJlKGdsLHNvdXJjZSl7XG4gIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgc291cmNlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzZXRSZWN0YW5nbGUoZ2wsIHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcbiAgdmFyIHgxID0geDtcbiAgdmFyIHgyID0geCArIHdpZHRoO1xuICB2YXIgeTEgPSB5O1xuICB2YXIgeTIgPSB5ICsgaGVpZ2h0O1xuICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheShbXG4gICAgIHgxLCB5MSxcbiAgICAgeDIsIHkxLFxuICAgICB4MSwgeTIsXG4gICAgIHgxLCB5MixcbiAgICAgeDIsIHkxLFxuICAgICB4MiwgeTJdKSwgZ2wuU1RBVElDX0RSQVcpO1xufVxuXG5mdW5jdGlvbiBlcnJvcihtc2cpe1xuICBjb25zb2xlLmVycm9yKG1zZyk7XG59XG4iXX0=

CSS代码(demo.css):

@font-face{font-weight:normal;font-style:normal;font-family:'codropsicons';src:url('../fonts/codropsicons/codropsicons.eot');src:url('../fonts/codropsicons/codropsicons.eot?#iefix') format('embedded-opentype'),url('../fonts/codropsicons/codropsicons.woff') format('woff'),url('../fonts/codropsicons/codropsicons.ttf') format('truetype'),url('../fonts/codropsicons/codropsicons.svg#codropsicons') format('svg');}
*,*:after,*:before{-webkit-box-sizing:border-box;box-sizing:border-box;}
.clearfix:before,.clearfix:after{display:table;content:'';}
.clearfix:after{clear:both;}
body{font-family:"Avenir Next",Avenir,'Helvetica Neue','Lato','Segoe UI',Helvetica,Arial,sans-serif;color:#252445;background:#aaa;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;}
a{outline:none;color:#fff;text-decoration:none;}
a:hover,a:focus{color:#252445;}
.demo-2 a{color:#333;}
.demo-2 a:hover,.demo-2 a:focus{color:#444C75;}
/* Header */
.codrops-header{padding:2.5em 2em 0;position:relative;width:100%;top:0;left:0;z-index:100;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-wrap:wrap;flex-wrap:wrap;}
.demo-1 .codrops-header{position:absolute;}
.codrops-header h1{margin:0 auto 0 0;letter-spacing:-1px;font-weight:bold;font-size:1.65em;line-height:1;display:inline-block;}
.info{width:100%;}
/* Top Navigation Style */
.codrops-links{position:relative;display:inline-block;text-align:center;white-space:nowrap;margin:0 1em 0 0;}
.codrops-links::after{position:absolute;top:50%;left:50%;width:1px;height:110%;background:#252445;content:'';-webkit-transform:translateY(-50%) rotate3d(0,0,1,22.5deg);transform:translateY(-50%) rotate3d(0,0,1,22.5deg);}
.codrops-icon{display:inline-block;margin:0.5em;padding:0em 0;width:1.5em;text-decoration:none;}
.codrops-icon span{display:none;}
.codrops-icon:before{margin:0 5px;text-transform:none;font-weight:normal;font-style:normal;font-variant:normal;font-family:'codropsicons';line-height:1;speak:none;-webkit-font-smoothing:antialiased;}
.codrops-icon--drop:before{content:"\e001";color:#488bce;}
.codrops-icon--prev:before{content:"\e004";}
/* Demo links */
.codrops-demos a{display:inline-block;font-weight:bold;color:#488bce;}
.codrops-demos a:not(:last-child){margin-right:1em;}
.codrops-demos a.current-demo{color:#252445;}
.image-preload{position:absolute;left:-9999px;}
.nosupport{display:none;margin:0 auto;font-size:1.25em;padding:1em;position:fixed;bottom:0;width:100vw;text-align:center;background:#a74e71;z-index:1000;}
.no-webgl .nosupport{display:block;}
@media screen and (max-width:50em){.codrops-header{padding:1.5em;text-align:center;display:block;font-size:0.75em;}
.codrops-links{display:block;margin:0 0 1em;}
.codrops-demos{width:100%;font-size:120%;margin:1em 0 0 0;}
}

CSS代码(style1.css):

@font-face{font-family:'icomoon';src:url('../fonts/meteocons/icomoon.eot?26rom9');src:url('../fonts/meteocons/icomoon.eot?26rom9#iefix') format('embedded-opentype'),url('../fonts/meteocons/icomoon.ttf?26rom9') format('truetype'),url('../fonts/meteocons/icomoon.woff?26rom9') format('woff'),url('../fonts/meteocons/icomoon.svg?26rom9#icomoon') format('svg');font-weight:normal;font-style:normal;}
.icon{font-family:'icomoon';speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;/* Better Font Rendering =========== */
-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;}
.icon--radioactive:before{content:"\e905";}
.icon--sun:before{content:"\e900";}
.icon--drizzle:before{content:"\e902";}
.icon--rainy:before{content:"\e903";}
.icon--storm:before{content:"\e906";}
.slideshow{position:relative;height:100vh;width:100vw;background:url(../img/city.jpg) no-repeat center top;background-size:cover;overflow:hidden;}
.slideshow::before{content:'';position:absolute;left:0;top:0;width:100%;height:100%;background:rgba(255,255,255,0.2);}
.slide{position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;padding:35vh 0 0 0;pointer-events:none;line-height:1;font-family:"Roboto",sans-serif;}
.slide--current{pointer-events:auto;}
.slideshow__nav{text-align:center;width:100%;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:center;justify-content:center;-webkit-align-items:center;align-items:center;position:absolute;bottom:28vh;}
.nav-item{display:block;padding:1em;color:#252445;-webkit-transition:color 0.3s;transition:color 0.3s;}
.nav-item:hover,.nav-item:focus,.nav-item--current{color:#fff;}
.nav-item .icon{font-size:2em;}
.nav-item span{display:block;margin:0.25em 0 0 0;font-weight:700;}
/* Content */
.slide__element{opacity:0;color:#252445;-webkit-transform:translate3d(0,50px,0);transform:translate3d(0,50px,0);-webkit-transition:-webkit-transform 0.3s,opacity 0.3s;transition:transform 0.3s,opacity 0.3s;}
.slide--current .slide__element{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}
.slide__element--temp{font-size:8em;font-weight:700;margin:0 0 0.1em;}
.slide__element--temp small{font-size:0.25em;}
.slide__element--info{font-size:2em;}
.slide__element--date{font-size:1em;font-weight:700;margin:0 0 1em;}
@media screen and (max-height:39em){.slideshow{font-size:75%;}
.slide{padding-top:35vh;}
.slideshow__nav{bottom:6em;}
}

CSS代码(style2.css):

.content{width:300px;margin:0 auto;position:relative;}
.device{width:100%;position:absolute;z-index:10;}
.app{background:#f2f2f2;color:#000;width:261px;height:463px;position:absolute;top:74px;left:20px;padding:1em;text-align:center;overflow:hidden;}
.app-content{position:absolute;top:0;left:0;bottom:0;right:0;padding:1em;}
.app__button-menu{background:none;border:none;padding:0;color:#333;font-size:1.15em;float:left;}
.app__title{font-size:5em;letter-spacing:-5px;margin:2.35em 0 0 0;line-height:1;}
.app__info{color:#797979;padding:0 1em;margin:0;}
.app__info--small{font-size:0.65em;font-weight:bold;color:#aaa;}
.app__button{border:2px solid #333;padding:0.6em 1.75em;margin:4em 0 1em;text-transform:uppercase;color:#333;font-size:0.75em;font-weight:bold;background:none;}

CSS代码(style3.css):

.videobg{position:fixed;right:0;bottom:0;min-width:100%;min-height:100%;width:auto;height:auto;pointer-events:none;}
.container{height:100vh;overflow:hidden;position:relative;background:rgba(146,137,183,0.5);}
.logo-img{position:absolute;left:50%;margin:-134px 0 0 -200px;width:400px;top:50%;}
附件:下载该文件资源,减少时间成本(增值服务)
留言
该资源可下载
File Source
.rar
2.99 MB
html5特效
最新结算
jquery虚拟键盘中文打字效果js代码
类型: .rar 金额: CNY 2.31¥ 状态: 待结算 详细>
jquery虚拟键盘中文打字效果js代码
类型: .rar 金额: CNY 0.29¥ 状态: 待结算 详细>
HTML5实现CSS滤镜图片切换特效代码
类型: .rar 金额: CNY 2.31¥ 状态: 待结算 详细>
jQuery头像裁剪插件cropbox js代码
类型: .rar 金额: CNY 0.29¥ 状态: 待结算 详细>
jQuery头像裁剪插件cropbox js代码
类型: .rar 金额: CNY 2.31¥ 状态: 待结算 详细>
CSS3制作3D图片立方体旋转特效
类型: .rar 金额: CNY 2.31¥ 状态: 待结算 详细>
CSS3制作3D图片立方体旋转特效
类型: .rar 金额: CNY 0.29¥ 状态: 待结算 详细>
CSS3制作3D图片立方体旋转特效
类型: .rar 金额: CNY 2.31¥ 状态: 待结算 详细>
CSS3制作3D图片立方体旋转特效
类型: .rar 金额: CNY 0.29¥ 状态: 待结算 详细>
jQuery+css3实现信封效果
类型: .rar 金额: CNY 0.29¥ 状态: 待结算 详细>
我们力求给您提供有用的文章,再此基础上,会附加营收资源,不做任何广告,让平台可以更好发展 若您发现您的权利被侵害,或使用了您的版权,请发邮件联系 sunlifel@foxmail.com ggbig觉得 : 不提供源码的文章不是好文章
合作伙伴
联系我们
  • QQ:21499807
  • 邮箱:sunlifel@foxmail.com
  • QQ扫一扫加QQ
    QQ扫一扫
Copyright 2023-2024 ggbig.com·皖ICP备2023004211号-1
打赏文章